@brggroup/share-lib 0.1.49 → 0.1.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +89 -89
  2. package/fesm2022/brggroup-share-lib.mjs +424 -330
  3. package/fesm2022/brggroup-share-lib.mjs.map +1 -1
  4. package/lib/ADMIN/component/permission/resource-permission/resource-permission.component.d.ts +0 -1
  5. package/lib/ADMIN/component/permission/resource-permission/resource-permission.component.d.ts.map +1 -1
  6. package/lib/ADMIN/component/permission/role-permission/role-permission.component.d.ts +0 -3
  7. package/lib/ADMIN/component/permission/role-permission/role-permission.component.d.ts.map +1 -1
  8. package/lib/auth/auth-abac.d.ts.map +1 -1
  9. package/lib/auth/has-permission.directive.d.ts +6 -2
  10. package/lib/auth/has-permission.directive.d.ts.map +1 -1
  11. package/lib/auth/{can-action.pipe.d.ts → has-permission.pipe.d.ts} +6 -5
  12. package/lib/auth/has-permission.pipe.d.ts.map +1 -0
  13. package/lib/components/base.component.d.ts +13 -5
  14. package/lib/components/base.component.d.ts.map +1 -1
  15. package/lib/components/extend-checkbox/extend-checkbox.d.ts +2 -1
  16. package/lib/components/extend-checkbox/extend-checkbox.d.ts.map +1 -1
  17. package/lib/components/extend-table/extend-table.component.d.ts +9 -0
  18. package/lib/components/extend-table/extend-table.component.d.ts.map +1 -1
  19. package/lib/components/layout/layout-user/layout-user.d.ts.map +1 -1
  20. package/lib/components/layout/layout-user/notification/notification-center.component.d.ts +15 -0
  21. package/lib/components/layout/layout-user/notification/notification-center.component.d.ts.map +1 -0
  22. package/lib/components/layout/layout-user/notification/notification.service.d.ts +26 -0
  23. package/lib/components/layout/layout-user/notification/notification.service.d.ts.map +1 -0
  24. package/lib/components/layout/layout.component.d.ts +1 -2
  25. package/lib/components/layout/layout.component.d.ts.map +1 -1
  26. package/lib/components/login/login.component.d.ts +1 -3
  27. package/lib/components/login/login.component.d.ts.map +1 -1
  28. package/lib/model.d.ts +1 -0
  29. package/lib/model.d.ts.map +1 -1
  30. package/lib/services/api-service/common.service.d.ts +3 -1
  31. package/lib/services/api-service/common.service.d.ts.map +1 -1
  32. package/lib/services/noti.service.d.ts.map +1 -1
  33. package/package.json +1 -1
  34. package/public-api.d.ts +1 -2
  35. package/public-api.d.ts.map +1 -1
  36. package/lib/auth/can-action.pipe.d.ts.map +0 -1
  37. package/lib/auth/has-permission.d.ts +0 -12
  38. package/lib/auth/has-permission.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"brggroup-share-lib.mjs","sources":["../../../projects/share/src/lib/a-translate-key.ts","../../../projects/share/src/lib/app-global.ts","../../../projects/share/src/lib/app-storeage.ts","../../../projects/share/src/lib/services/api-service/http.service.ts","../../../projects/share/src/lib/services/device-service.ts","../../../projects/share/src/lib/services/custom-notification.service.ts","../../../projects/share/src/lib/services/noti.service.ts","../../../projects/share/src/lib/services/api-service/common.service.ts","../../../projects/share/src/lib/auth/token.storage.ts","../../../projects/share/src/lib/auth/auth.service.ts","../../../projects/share/src/lib/auth/auth-abac.ts","../../../projects/share/src/lib/auth/permission.service.ts","../../../projects/share/src/lib/auth/auth.guard.ts","../../../projects/share/src/lib/services/loading.service.ts","../../../projects/share/src/lib/auth/auth.interceptor.ts","../../../projects/share/src/lib/auth/unsaved-changes.guard.ts","../../../projects/share/src/lib/auth/session-manager.service.ts","../../../projects/share/src/lib/services/custom-modal.service.ts","../../../projects/share/src/lib/components/base.component.ts","../../../projects/share/src/lib/components/base.guard-change.ts","../../../projects/share/src/lib/components/base.overlay.component.ts","../../../projects/share/src/lib/components/breadcrumb/breadcrumb.ts","../../../projects/share/src/lib/components/breadcrumb/breadcrumb.html","../../../projects/share/src/lib/components/dashboard-widget/animated/animated-digit.component.ts","../../../projects/share/src/lib/components/dashboard-widget/animated/animated-digit.component.html","../../../projects/share/src/lib/components/dashboard-widget/bar-graph/bar-graph.component.ts","../../../projects/share/src/lib/components/dashboard-widget/bar-graph/bar-graph.component.html","../../../projects/share/src/lib/components/dashboard-widget/dashcard/dashcard.component.ts","../../../projects/share/src/lib/components/dashboard-widget/dashcard/dashcard.component.html","../../../projects/share/src/lib/components/dashboard-widget/doughnut-graph/doughnut-graph.component.ts","../../../projects/share/src/lib/components/dashboard-widget/doughnut-graph/doughnut-graph.component.html","../../../projects/share/src/lib/components/dashboard-widget/line-graph/line-graph.component.ts","../../../projects/share/src/lib/components/dashboard-widget/line-graph/line-graph.component.html","../../../projects/share/src/lib/components/extend-checkbox/extend-checkbox.ts","../../../projects/share/src/lib/components/extend-checkbox/extend-checkbox.html","../../../projects/share/src/lib/helper/date.helper.ts","../../../projects/share/src/lib/directive/date-input-parser.directive.ts","../../../projects/share/src/lib/components/extend-date-picker/extend-date-picker.ts","../../../projects/share/src/lib/components/extend-date-picker/extend-date-picker.html","../../../projects/share/src/lib/components/extend-date-range-picker/extend-date-range-picker.ts","../../../projects/share/src/lib/components/extend-date-range-picker/extend-date-range-picker.html","../../../projects/share/src/lib/components/extend-input-number/extend-input-number.ts","../../../projects/share/src/lib/components/extend-input-number/extend-input-number.html","../../../projects/share/src/lib/components/extend-input/extend-input.ts","../../../projects/share/src/lib/components/extend-input/extend-input.html","../../../projects/share/src/lib/components/extend-select/extend-select.ts","../../../projects/share/src/lib/components/extend-select/extend-select.html","../../../projects/share/src/lib/components/extend-textarea/extend-textarea.ts","../../../projects/share/src/lib/components/extend-textarea/extend-textarea.html","../../../projects/share/src/lib/pipe/highlight.pipe.ts","../../../projects/share/src/lib/services/dic-domain.service.ts","../../../projects/share/src/lib/pipe/dic-domain.pipe.ts","../../../projects/share/src/lib/model.ts","../../../projects/share/src/lib/components/read-more/read-more.component.ts","../../../projects/share/src/lib/components/read-more/read-more.component.html","../../../projects/share/src/lib/components/extend-table/extend-table.component.ts","../../../projects/share/src/lib/components/extend-table/extend-table.component.html","../../../projects/share/src/lib/components/extend-table/extend-pagination.component.ts","../../../projects/share/src/lib/components/extend-table/extend-pagination.component.html","../../../projects/share/src/lib/components/no-permission/no-permission.ts","../../../projects/share/src/lib/components/pdf-viewer/pdf-viewer.ts","../../../projects/share/src/lib/components/pdf-viewer/pdf-viewer.html","../../../projects/share/src/lib/components/spinner/spinner.ts","../../../projects/share/src/lib/components/height.ts","../../../projects/share/src/lib/components/width.ts","../../../projects/share/src/lib/components/box.ts","../../../projects/share/src/lib/components/wf-editor/minimap.ts","../../../projects/share/src/lib/directive/auto-focus.directive.ts","../../../projects/share/src/lib/icon.ts","../../../projects/share/src/lib/components/wf-editor/workflow-editor.component.ts","../../../projects/share/src/lib/components/wf-editor/workflow-editor.component.html","../../../projects/share/src/lib/components/search/expandable-search/expandable-search.component.ts","../../../projects/share/src/lib/components/search/expandable-search/expandable-search.component.html","../../../projects/share/src/lib/components/custom-noti/custom-noti.component.ts","../../../projects/share/src/lib/ADMIN/component/permission/permission.service.ts","../../../projects/share/src/lib/ADMIN/service/role.service.ts","../../../projects/share/src/lib/ADMIN/service/menu.service.ts","../../../projects/share/src/lib/ADMIN/component/permission/role-menu/role-menu.ts","../../../projects/share/src/lib/ADMIN/component/permission/role-menu/role-menu.html","../../../projects/share/src/lib/ADMIN/service/user.service.ts","../../../projects/share/src/lib/ADMIN/component/permission/user-role/user-role.ts","../../../projects/share/src/lib/ADMIN/component/permission/user-role/user-role.html","../../../projects/share/src/lib/ADMIN/component/permission/role-permission/role-permission.component.ts","../../../projects/share/src/lib/ADMIN/component/permission/role-permission/role-permission.component.html","../../../projects/share/src/lib/ADMIN/component/permission/resource-permission/resource-permission.component.ts","../../../projects/share/src/lib/ADMIN/component/permission/resource-permission/resource-permission.component.html","../../../projects/share/src/lib/ADMIN/component/permission/permission.component.ts","../../../projects/share/src/lib/ADMIN/component/permission/permission.component.html","../../../projects/share/src/lib/auth/can-action.pipe.ts","../../../projects/share/src/lib/auth/has-permission.ts","../../../projects/share/src/lib/auth/has-permission.directive.ts","../../../projects/share/src/lib/directive/null-if-empty.directive.ts","../../../projects/share/src/lib/directive/number-only.directive.ts","../../../projects/share/src/lib/directive/uppercase-each-word.directive.ts","../../../projects/share/src/lib/directive/uppercase-first-letter.directive.ts","../../../projects/share/src/lib/directive/uppercase.directive.ts","../../../projects/share/src/lib/pipe/limit-words.pipe.ts","../../../projects/share/src/lib/helper/download.helper.ts","../../../projects/share/src/lib/helper/xlsx.helper.ts","../../../projects/share/src/lib/services/router-monitor.service.ts","../../../projects/share/src/lib/services/theme.service.ts","../../../projects/share/src/lib/services/vsc.service.ts","../../../projects/share/src/lib/directive/img-hide-if-error.directive.ts","../../../projects/share/src/lib/components/fade-animations.ts","../../../projects/share/src/lib/services/setting.service.ts","../../../projects/share/src/lib/components/layout/layout-user/layout-user.ts","../../../projects/share/src/lib/components/layout/layout-user/layout-user.html","../../../projects/share/src/lib/services/file.service.ts","../../../projects/share/src/lib/services/signalr.service.ts","../../../projects/share/src/lib/components/layout/layout.component.ts","../../../projects/share/src/lib/components/layout/layout.component.html","../../../projects/share/src/lib/services/org.service.ts","../../../projects/share/src/lib/components/login/login.component.ts","../../../projects/share/src/lib/components/login/login.component.html","../../../projects/share/src/brggroup-share-lib.ts"],"sourcesContent":["export enum TranslateKey {\r\n ACTION = 'ACTION',\r\n ADD = 'ADD',\r\n AGREE = 'AGREE',\r\n BACK = 'BACK',\r\n CANCEL = 'CANCEL',\r\n CLOSE = 'CLOSE',\r\n CONFIRM = 'CONFIRM',\r\n CONFIRM_DELETE = 'CONFIRM_DELETE',\r\n COMPLETE = 'COMPLETE',\r\n DELETE = 'DELETE',\r\n DELETE_SUCCESS = 'DELETE_SUCCESS',\r\n EDIT = 'EDIT',\r\n ERROR = 'ERROR',\r\n EXPORT = 'EXPORT',\r\n HIDDEN = 'HIDDEN',\r\n IMPORT = 'IMPORT',\r\n INFO = 'INFO',\r\n LOGIN = 'LOGIN',\r\n LOGOUT = 'LOGOUT',\r\n NO_CONNECT_TO_SERVER = 'NO_CONNECT_TO_SERVER',\r\n OK = 'OK',\r\n PASSWORD = 'PASSWORD',\r\n REQUIRED = 'REQUIRED',\r\n REQUIRED_FIELD = 'REQUIRED_FIELD',\r\n REFEESH = 'REFEESH',\r\n RESET = 'RESET',\r\n RESET_PASSWORD = 'RESET_PASSWORD',\r\n SAVE = 'SAVE',\r\n SEARCH = 'SEARCH',\r\n SHOW = 'SHOW',\r\n SUCCESS = 'SUCCESS',\r\n SAVE_SUCCESS = 'SAVE_SUCCESS',\r\n SETTING = 'SETTING',\r\n PROFILE = 'PROFILE',\r\n USERNAME = 'USERNAME',\r\n UPDATE = 'UPDATE',\r\n WARNING = 'WARNING',\r\n YES = 'YES',\r\n DOWNLOAD_TEMPLATE = 'DOWNLOAD_TEMPLATE',\r\n WARNING_CHECK_DATA = 'WARNING_CHECK_DATA',\r\n}\r\n","export class AppGlobals {\r\n public static apiEndpoint: string;\r\n public static versionCheck: string;\r\n\r\n public static MENU_TYPE: 'side-menu' | 'toolbar-menu' = 'toolbar-menu';\r\n public static pageSizeOptions = [10, 20, 50, 100];\r\n\r\n public static filterSet: any = {};\r\n public static selectedIdSet: any = {};\r\n\r\n public static clearFillter() {\r\n this.filterSet = {};\r\n }\r\n\r\n public static getFilter(key: any) {\r\n return this.filterSet[key];\r\n }\r\n\r\n public static setFilter(key: any, filter: any) {\r\n this.filterSet[key] = filter;\r\n }\r\n\r\n public static getSelectedId(key: any) {\r\n return this.selectedIdSet[key];\r\n }\r\n\r\n public static setSelectedId(key: any, value: any) {\r\n this.selectedIdSet[key] = value;\r\n }\r\n\r\n public static setLang(lang: string) {\r\n localStorage.setItem('LANGUAGE', lang);\r\n }\r\n\r\n public static getLang(): string {\r\n if (!localStorage.getItem('LANGUAGE')) {\r\n localStorage.setItem('LANGUAGE', 'vn');\r\n }\r\n return localStorage.getItem('LANGUAGE') || '';\r\n }\r\n\r\n public static getOrgId() {\r\n return localStorage.getItem('orgid');\r\n }\r\n\r\n public static getOrgCode() {\r\n return localStorage.getItem('orgcode');\r\n }\r\n\r\n public static getOrgName() {\r\n return localStorage.getItem('orgname');\r\n }\r\n\r\n public static getUserName() {\r\n return localStorage.getItem('username');\r\n }\r\n\r\n public static getUserFullName() {\r\n return localStorage.getItem('fullname');\r\n }\r\n}\r\n","import { inject } from \"@angular/core\";\r\nimport { TranslateService } from \"@ngx-translate/core\";\r\n\r\nexport class AppStorage {\r\n \r\n static get tokenStorage() {\r\n return localStorage;\r\n // return sessionStorage;\r\n }\r\n\r\n static get localStoreage() {\r\n return localStorage;\r\n }\r\n\r\n static get sessionStoreage() {\r\n return sessionStorage;\r\n }\r\n\r\n static getLang(): string {\r\n return AppStorage.localStoreage.getItem('LANGUAGE') || 'vn';\r\n }\r\n\r\n static setLang(lang: string) {\r\n AppStorage.localStoreage.setItem('LANGUAGE', lang || 'vn');\r\n }\r\n}","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { inject } from '@angular/core';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { RespondData } from '../../model';\r\n\r\nexport class HTTPService {\r\n httpClient = inject(HttpClient);\r\n\r\n get(url: string, noLoadingMark?: boolean): Promise<RespondData> {\r\n const options = {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'application/json; charset=utf-8',\r\n 'No-Loading-Mark': noLoadingMark ? '1' : '0',\r\n }),\r\n };\r\n\r\n return firstValueFrom(this.httpClient.get<RespondData>(url, options));\r\n }\r\n\r\n getParams(url: string, params: HttpParams, noLoadingMark?: boolean): Promise<RespondData> {\r\n const options = {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'application/json; charset=utf-8',\r\n 'No-Loading-Mark': noLoadingMark ? '1' : '0',\r\n }),\r\n params: params,\r\n };\r\n\r\n return firstValueFrom(this.httpClient.get<RespondData>(url, options));\r\n }\r\n\r\n post(url: string, noLoadingMark?: boolean): Promise<RespondData> {\r\n const options = {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'application/json; charset=utf-8',\r\n 'No-Loading-Mark': noLoadingMark ? '1' : '0',\r\n }),\r\n };\r\n\r\n return firstValueFrom(this.httpClient.post<RespondData>(url, null, options));\r\n }\r\n\r\n postParams(url: string, params: HttpParams, noLoadingMark?: boolean): Promise<RespondData> {\r\n const options = {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'application/json; charset=utf-8',\r\n 'No-Loading-Mark': noLoadingMark ? '1' : '0',\r\n }),\r\n params: params,\r\n };\r\n\r\n return firstValueFrom(this.httpClient.post<RespondData>(url, null, options));\r\n }\r\n\r\n postData(url: string, body: any, noLoadingMark?: boolean): Promise<RespondData> {\r\n const options = {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'application/json; charset=utf-8',\r\n 'No-Loading-Mark': noLoadingMark ? '1' : '0',\r\n }),\r\n };\r\n\r\n return firstValueFrom(this.httpClient.post<RespondData>(url, body, options));\r\n }\r\n\r\n postDataWithParams(url: string, body: any, params?: HttpParams, noLoadingMark?: boolean): Promise<RespondData> {\r\n const options = {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'application/json; charset=utf-8',\r\n 'No-Loading-Mark': noLoadingMark ? '1' : '0',\r\n }),\r\n params: params,\r\n };\r\n\r\n return firstValueFrom(this.httpClient.post<RespondData>(url, body, options));\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { fromEvent, map, Observable, startWith } from 'rxjs';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DeviceService {\r\n isMobile$(): Observable<boolean> {\r\n return fromEvent(window, 'resize').pipe(\r\n startWith(null), // emit lần đầu\r\n map(() => window.innerWidth <= 768),\r\n // map(() => window.innerWidth <= 500),\r\n );\r\n }\r\n\r\n innerWidth$(): Observable<number> {\r\n return fromEvent(window, 'resize').pipe(\r\n startWith(null),\r\n map(() => window.innerWidth),\r\n );\r\n }\r\n\r\n get isMobile() {\r\n return window.innerWidth <= 500;\r\n }\r\n}\r\n","import { Injectable, TemplateRef } from '@angular/core';\r\nimport { NzNotificationService, NzNotificationPlacement } from 'ng-zorro-antd/notification';\r\n\r\nexport interface NotiOptions {\r\n duration?: number;\r\n placement?: NzNotificationPlacement;\r\n showDetail?: boolean;\r\n onDetail?: () => void;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class CustomNotiService {\r\n public static defaultDuration = 3000;\r\n public static defaultPlacement: NzNotificationPlacement = 'topRight';\r\n\r\n private globalTemplate!: TemplateRef<any>;\r\n\r\n constructor(private notification: NzNotificationService) {}\r\n\r\n registerTemplate(tpl: TemplateRef<any>): void {\r\n this.globalTemplate = tpl;\r\n }\r\n\r\n success(title: string, content?: string, options?: NotiOptions): void {\r\n this.show('success', title, content, options);\r\n }\r\n\r\n warning(title: string, content?: string, options?: NotiOptions): void {\r\n this.show('warning', title, content, options);\r\n }\r\n\r\n error(title: string, content?: string, options?: NotiOptions): void {\r\n this.show('error', title, content, options);\r\n }\r\n\r\n private show(type: 'success' | 'warning' | 'error', title: string, content?: string, options?: NotiOptions): void {\r\n if (!this.globalTemplate) {\r\n console.error('AppNotificationService: Template chưa được đăng ký!');\r\n return;\r\n }\r\n\r\n const config = this.getConfigByType(type);\r\n const finalDuration = options?.duration ?? CustomNotiService.defaultDuration;\r\n const finalPlacement = options?.placement ?? CustomNotiService.defaultPlacement;\r\n\r\n const notiRef = this.notification.template(this.globalTemplate, {\r\n nzDuration: finalDuration,\r\n nzPlacement: finalPlacement,\r\n nzClass: 'notification-with-progress',\r\n nzData: {\r\n title,\r\n description: content,\r\n duration: finalDuration,\r\n icon: config.icon,\r\n color: config.color,\r\n\r\n showDetail: options?.showDetail || false,\r\n onDetailClick: () => {\r\n if (options?.onDetail) {\r\n options.onDetail();\r\n }\r\n // đóng popup sau khi bấm \"Chi tiết\"\r\n this.notification.remove(notiRef.messageId);\r\n },\r\n },\r\n });\r\n }\r\n\r\n private getConfigByType(type: string): { icon: string; color: string } {\r\n switch (type) {\r\n case 'success':\r\n return { icon: 'check-circle', color: '#52c41a' };\r\n case 'warning':\r\n return { icon: 'exclamation-circle', color: '#faad14' };\r\n case 'error':\r\n return { icon: 'close-circle', color: '#ff4d4f' };\r\n default:\r\n return { icon: 'info-circle', color: '#1890ff' };\r\n }\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { NzModalService } from 'ng-zorro-antd/modal';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { TranslateKey } from '../a-translate-key';\r\nimport { DeviceService } from './device-service';\r\nimport { CustomNotiService } from './custom-notification.service';\r\n\r\nfunction escapeHtml(str: string) {\r\n return str.replace(/</g, '&lt;').replace(/>/g, '&gt;');\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class NotiService {\r\n modal = inject(NzModalService);\r\n // notification = inject(NzNotificationService);\r\n notification = inject(CustomNotiService);\r\n translate = inject(TranslateService);\r\n device = inject(DeviceService);\r\n\r\n async success(title?: string, content: string = '', showPopup: boolean = false): Promise<void> {\r\n if (showPopup) {\r\n return new Promise<void>((resolve) => {\r\n const modalRef = this.modal.success({\r\n nzTitle: title ?? this.translate.instant(TranslateKey.SUCCESS),\r\n nzContent: content,\r\n nzOnOk: () => resolve(),\r\n });\r\n });\r\n } else {\r\n const notiRef = this.notification.success(title ?? this.translate.instant(TranslateKey.SUCCESS), content);\r\n }\r\n }\r\n\r\n async warning(title: string, content: string = '', showPopup: boolean = false): Promise<void> {\r\n if (showPopup) {\r\n return new Promise<void>((resolve) => {\r\n const modalRef = this.modal.warning({\r\n nzTitle: title,\r\n nzContent: content,\r\n nzOnOk: () => resolve(),\r\n });\r\n });\r\n } else {\r\n const notiRef = this.notification.warning(title, content);\r\n }\r\n }\r\n\r\n async error(title: string, content: string = '', showPopup: boolean = false): Promise<void> {\r\n if (showPopup) {\r\n return new Promise<void>((resolve) => {\r\n const modalRef = this.modal.error({\r\n nzTitle: title,\r\n nzContent: content,\r\n nzOnOk: () => resolve(),\r\n });\r\n });\r\n } else {\r\n const notiRef = this.notification.error(title, content);\r\n }\r\n }\r\n\r\n handleError(err: any): void {\r\n if (err?.status == 0) {\r\n // this.notification.error('', this.translate.instant('NO_CONNECT_TO_SERVER'), { nzDuration: 0 });\r\n\r\n this.modal.error({\r\n nzTitle: 'Lỗi phát sinh',\r\n nzContent: this.translate.instant('NO_CONNECT_TO_SERVER'),\r\n nzWidth: this.modalWidth,\r\n nzOkText: 'Đóng',\r\n });\r\n\r\n return;\r\n }\r\n\r\n let _data: any = null;\r\n\r\n if (err?.error instanceof ArrayBuffer) {\r\n const message = new TextDecoder('utf-8').decode(new Uint8Array(err.error));\r\n try {\r\n _data = JSON.parse(message);\r\n } catch (error) {}\r\n } else if (err?.error instanceof Blob) {\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n try {\r\n const text = reader.result as string;\r\n _data = JSON.parse(text);\r\n this.handleError(_data);\r\n } catch (e) {\r\n // this.notification.error('', this.translate.instant('UNKNOWN_ERROR'), { nzDuration: 0 });\r\n\r\n this.modal.error({\r\n nzTitle: 'Lỗi phát sinh',\r\n nzContent: this.translate.instant('UNKNOWN_ERROR'),\r\n nzWidth: this.modalWidth,\r\n nzOkText: 'Đóng',\r\n });\r\n }\r\n };\r\n\r\n reader.onerror = () => {\r\n // this.notification.error('', this.translate.instant('UNKNOWN_ERROR'), { nzDuration: 0 });\r\n\r\n this.modal.error({\r\n nzTitle: 'Lỗi phát sinh',\r\n nzContent: this.translate.instant('UNKNOWN_ERROR'),\r\n nzWidth: this.modalWidth,\r\n nzOkText: 'Đóng',\r\n });\r\n };\r\n reader.readAsText(err.error);\r\n return;\r\n } else if (err?.error && typeof err.error === 'object') {\r\n _data = err.error;\r\n } else {\r\n _data = err;\r\n }\r\n\r\n let errorMsg = err?.message || 'An unexpected error occurred.';\r\n\r\n if (err?.name == 'EmptyError' && err?.message == 'no elements in sequence') {\r\n return;\r\n }\r\n\r\n if (_data?.ErrorMessage) {\r\n let hasMsgTag = false;\r\n let isMatchFirstMsg = false;\r\n\r\n let isMatch = _data.ErrorMessage?.match(/System.Data.SqlClient.SqlException \\(0x80131904\\): <msg>(.*?)<\\/msg>/);\r\n isMatchFirstMsg = isMatch ? true : false;\r\n\r\n if (isMatchFirstMsg) {\r\n const matches = [..._data.ErrorMessage?.matchAll(/<msg>(.*?)<\\/msg>/g)];\r\n const messages = matches.map((m) => m[1]);\r\n if (messages.length > 0) {\r\n errorMsg = messages.join('\\n');\r\n hasMsgTag = true;\r\n } else {\r\n errorMsg = _data.ErrorMessage;\r\n }\r\n } else {\r\n errorMsg = _data.ErrorMessage;\r\n }\r\n }\r\n\r\n this.notification.error('Lỗi phát sinh', errorMsg, {\r\n showDetail: !!_data?.Data,\r\n onDetail: () => {\r\n this.modal.error({\r\n nzTitle: 'Chi tiết lỗi',\r\n nzContent: escapeHtml(JSON.stringify(_data, null, 2)),\r\n nzWidth: this.device.isMobile ? '90vw' : '60vw',\r\n nzDraggable: true,\r\n nzCentered: true,\r\n nzOkText: 'Đóng',\r\n });\r\n },\r\n });\r\n }\r\n\r\n get modalWidth() {\r\n return this.device.isMobile ? '80vw' : '40vw';\r\n }\r\n}\r\n","import { ESPModel, ExportExcelModel, ExportPdfDocxlModel } from '../../model';\r\nimport { HTTPService } from './http.service';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { AppGlobals } from '../../app-global';\r\n\r\nexport enum ENUM_ResponseType {\r\n ARRAYBUFFER = 'arraybuffer',\r\n BLOB = 'blob',\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class CommonService extends HTTPService {\r\n ESP(obj: ESPModel) {\r\n const params = new HttpParams().append('SPN', obj.SPN);\r\n return this.postDataWithParams(AppGlobals.apiEndpoint + '/api/Common/ESP', obj, params);\r\n }\r\n\r\n ExportExcel(data: ExportExcelModel) {\r\n return firstValueFrom(\r\n this.httpClient.post(AppGlobals.apiEndpoint + '/api/Common/ExportExcel', data, {\r\n responseType: ENUM_ResponseType.BLOB,\r\n observe: 'response',\r\n }),\r\n );\r\n }\r\n\r\n ExportPdf(data: ExportPdfDocxlModel) {\r\n return this.postData(AppGlobals.apiEndpoint + '/api/Common/ExportPdf', data);\r\n }\r\n\r\n ExportDocx(data: ExportPdfDocxlModel) {\r\n return this.postData(AppGlobals.apiEndpoint + '/api/Common/ExportDocx', data);\r\n }\r\n\r\n ExportHTML(data: ExportExcelModel) {\r\n return this.postData(AppGlobals.apiEndpoint + '/api/Common/ExportHTML', data);\r\n }\r\n}\r\n","import { jwtDecode } from 'jwt-decode';\r\nimport { RespondData } from '../model';\r\nimport { AppStorage } from '../app-storeage';\r\n\r\nexport class TokenStorage {\r\n public static readonly JWT_TOKEN = 'JWT_TOKEN';\r\n public static readonly JWT_RFT_TOKEN = 'JWT_RFT_TOKEN';\r\n public static readonly USER_NAME = 'username';\r\n public static readonly FULL_NAME = 'fullname';\r\n public static readonly USER_MENU = 'usermenu';\r\n public static readonly ORG_ID = 'orgid';\r\n public static readonly ORG_CODE = 'orgcode';\r\n public static readonly ORG_NAME = 'orgname';\r\n\r\n public static saveToken(tokenRes: RespondData) {\r\n AppStorage.tokenStorage.setItem(this.JWT_TOKEN, tokenRes.Data.Token);\r\n AppStorage.tokenStorage.setItem(this.JWT_RFT_TOKEN, tokenRes.Data.RefreshToken);\r\n TokenStorage.saveTokenInfo(tokenRes.Data.Token);\r\n }\r\n\r\n public static saveTokenRft(token: string) {\r\n AppStorage.tokenStorage.setItem(this.JWT_TOKEN, token);\r\n TokenStorage.saveTokenInfo(token);\r\n }\r\n\r\n private static saveTokenInfo(token: string) {\r\n const userInfo: any = jwtDecode(token);\r\n\r\n AppStorage.tokenStorage.setItem(this.USER_NAME, userInfo[this.USER_NAME]);\r\n AppStorage.tokenStorage.setItem(this.FULL_NAME, userInfo[this.FULL_NAME]);\r\n AppStorage.tokenStorage.setItem(this.ORG_ID, userInfo[this.ORG_ID]);\r\n AppStorage.tokenStorage.setItem(this.ORG_CODE, userInfo[this.ORG_CODE]);\r\n AppStorage.tokenStorage.setItem(this.ORG_NAME, userInfo[this.ORG_NAME]);\r\n }\r\n\r\n public static saveUserMenu(menus: any[]) {\r\n AppStorage.tokenStorage.setItem(this.USER_MENU, JSON.stringify(menus));\r\n }\r\n\r\n public static getUserMenu(): any[] {\r\n return JSON.parse(AppStorage.tokenStorage.getItem(this.USER_MENU) || '[]');\r\n }\r\n\r\n public static getUsername() {\r\n return AppStorage.tokenStorage.getItem(this.USER_NAME);\r\n }\r\n\r\n public static getUserFullname() {\r\n return AppStorage.tokenStorage.getItem(this.FULL_NAME);\r\n }\r\n\r\n public static getOrgId() {\r\n return AppStorage.tokenStorage.getItem(this.ORG_ID);\r\n }\r\n\r\n public static getOrgCode() {\r\n return AppStorage.tokenStorage.getItem(this.ORG_CODE);\r\n }\r\n\r\n public static getOrgName() {\r\n return AppStorage.tokenStorage.getItem(this.ORG_NAME);\r\n }\r\n\r\n public static getToken() {\r\n return AppStorage.tokenStorage.getItem(this.JWT_TOKEN);\r\n }\r\n\r\n public static getRftToken() {\r\n return AppStorage.tokenStorage.getItem(this.JWT_RFT_TOKEN);\r\n }\r\n\r\n public static isLoggedIn() {\r\n return AppStorage.tokenStorage.getItem(this.JWT_TOKEN) != null;\r\n }\r\n\r\n public static clearToken() {\r\n console.log('-- clearToken --');\r\n AppStorage.tokenStorage.removeItem(this.JWT_TOKEN);\r\n AppStorage.tokenStorage.removeItem(this.JWT_RFT_TOKEN);\r\n AppStorage.tokenStorage.removeItem(this.USER_NAME);\r\n AppStorage.tokenStorage.removeItem(this.FULL_NAME);\r\n AppStorage.tokenStorage.removeItem(this.USER_MENU);\r\n AppStorage.tokenStorage.removeItem(this.ORG_ID);\r\n AppStorage.tokenStorage.removeItem(this.ORG_CODE);\r\n AppStorage.tokenStorage.removeItem(this.ORG_NAME);\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { Router } from '@angular/router';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { firstValueFrom, interval } from 'rxjs';\r\n\r\nimport { HTTPService } from '../services/api-service/http.service';\r\nimport { NotiService } from '../services/noti.service';\r\nimport { CommonService } from '../services/api-service/common.service';\r\nimport { TokenStorage } from './token.storage';\r\n\r\nimport { App_Org, ESPModel, RespondData } from '../model';\r\nimport { AppGlobals } from '../app-global';\r\nimport { SessionManagerService } from './session-manager.service';\r\n\r\nexport const URLs = {\r\n login: '/api/Auth/Login',\r\n register: '/api/Auth/Register',\r\n pingAuth: '/api/Auth/PingAuth',\r\n changePassword: '/api/Auth/ChangePassword',\r\n setPass: '/api/Auth/SetPass',\r\n changeOrgLogin: '/api/Auth/changeOrgLogin',\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthService extends HTTPService {\r\n notiService = inject(NotiService);\r\n cms = inject(CommonService);\r\n router = inject(Router);\r\n translate = inject(TranslateService);\r\n\r\n /* ----------------------------------------\r\n TOKEN\r\n ---------------------------------------- */\r\n\r\n getToken() {\r\n return TokenStorage.getToken();\r\n }\r\n\r\n async refreshToken(): Promise<RespondData | null> {\r\n const refreshToken = TokenStorage.getRftToken();\r\n if (!refreshToken) return null;\r\n\r\n const body = { rft: refreshToken };\r\n\r\n try {\r\n const res = await this.sendRftToken(body);\r\n\r\n if (res?.IsSuccess) {\r\n TokenStorage.saveTokenRft(res.Data);\r\n return res;\r\n }\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n async sendRftToken(body: any): Promise<RespondData> {\r\n return firstValueFrom(\r\n this.httpClient.post<RespondData>(AppGlobals.apiEndpoint + '/api/Auth/RefreshToken', body, {\r\n headers: new HttpHeaders().set('Content-Type', 'application/json'),\r\n }),\r\n );\r\n }\r\n\r\n /* ----------------------------------------\r\n LOGIN\r\n ---------------------------------------- */\r\n\r\n async _signIn(username: string, password: string, orgid: string, returnUrl: string): Promise<boolean> {\r\n try {\r\n const body = {\r\n UserName: username,\r\n Password: password,\r\n OrgId: orgid,\r\n };\r\n\r\n const res = await this.sendSignIn(body);\r\n\r\n if (!res.IsSuccess) {\r\n this.notiService.error(this.translate.instant(res.ErrorMessage));\r\n return false;\r\n }\r\n\r\n this.notiService.success('Đăng nhập thành công');\r\n\r\n TokenStorage.saveToken(res);\r\n\r\n if (returnUrl) {\r\n this.router.navigateByUrl(returnUrl);\r\n }\r\n\r\n return true;\r\n } catch (err) {\r\n this.notiService.handleError(err);\r\n return false;\r\n }\r\n }\r\n\r\n async sendSignIn(body: any): Promise<RespondData> {\r\n return firstValueFrom(\r\n this.httpClient.post<RespondData>(AppGlobals.apiEndpoint + URLs.login, body, {\r\n headers: new HttpHeaders().set('Content-Type', 'application/json'),\r\n }),\r\n );\r\n }\r\n\r\n /* ----------------------------------------\r\n LOGOUT\r\n ---------------------------------------- */\r\n\r\n _signOut() {\r\n TokenStorage.clearToken();\r\n\r\n const currentUrl = this.router.routerState.snapshot.url;\r\n\r\n // this.router.navigate(['/login'], {\r\n // queryParams: { returnUrl: currentUrl || '/' },\r\n // });\r\n\r\n this.router.navigate(['/login']);\r\n }\r\n\r\n /* ----------------------------------------\r\n AUTH CHECK\r\n ---------------------------------------- */\r\n\r\n async pingAuth(): Promise<boolean> {\r\n try {\r\n const res = await this.get(AppGlobals.apiEndpoint + URLs.pingAuth, true);\r\n\r\n return res?.IsSuccess;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /* ----------------------------------------\r\n MENU\r\n ---------------------------------------- */\r\n\r\n getUserMenu(headerMenuId: string) {\r\n let data: ESPModel = {\r\n SPN: `App_User_getUserMenu`,\r\n Params: [headerMenuId],\r\n };\r\n\r\n return this.cms.ESP(data);\r\n }\r\n\r\n getUserHeaderMenu() {\r\n let data: ESPModel = {\r\n SPN: `App_User_getUserHeaderMenu`,\r\n };\r\n\r\n return this.cms.ESP(data);\r\n }\r\n\r\n async checkUserMenu(url: string): Promise<boolean> {\r\n try {\r\n const ret = await this.cms.ESP({\r\n SPN: `App_User_checkUserMenu`,\r\n Params: [url],\r\n });\r\n\r\n return ret.IsSuccess && ret.Data == '1';\r\n } catch (error) {\r\n this.notiService.handleError(error);\r\n return true;\r\n }\r\n }\r\n\r\n /* ----------------------------------------\r\n PASSWORD\r\n ---------------------------------------- */\r\n\r\n changePassword(data: any) {\r\n return this.postData(AppGlobals.apiEndpoint + URLs.changePassword, data);\r\n }\r\n\r\n setPass(data: any) {\r\n return this.postData(AppGlobals.apiEndpoint + URLs.setPass, data);\r\n }\r\n\r\n /* ----------------------------------------\r\n REGISTER\r\n ---------------------------------------- */\r\n\r\n async signUp(d: any) {\r\n try {\r\n const res = await this.sendSignUp(d);\r\n\r\n if (!res.IsSuccess) {\r\n this.notiService.error(res.ErrorMessage);\r\n return;\r\n }\r\n\r\n this.notiService.success('Đăng ký thành công');\r\n\r\n this.router.navigateByUrl('/login');\r\n } catch (err) {\r\n console.error(err);\r\n this.notiService.handleError(err);\r\n }\r\n }\r\n\r\n async sendSignUp(d: any): Promise<RespondData> {\r\n return this.postData(AppGlobals.apiEndpoint + URLs.register, d);\r\n }\r\n\r\n /* ----------------------------------------\r\n CHANGE ORG\r\n ---------------------------------------- */\r\n\r\n async changeOrg(org: App_Org): Promise<boolean> {\r\n try {\r\n const res = await this.sendChangeOrg(org.App_Org_Id);\r\n\r\n if (!res?.IsSuccess) {\r\n this.notiService.error(this.translate.instant(res.ErrorMessage));\r\n return false;\r\n }\r\n\r\n TokenStorage.saveTokenRft(res.Data);\r\n\r\n return true;\r\n } catch (err) {\r\n console.error('changeOrg error:', err);\r\n return false;\r\n }\r\n }\r\n\r\n async sendChangeOrg(App_Org_Id: any): Promise<RespondData> {\r\n let params = new HttpParams().append('App_Org_Id', App_Org_Id);\r\n\r\n return this.postParams(AppGlobals.apiEndpoint + URLs.changeOrgLogin, params);\r\n }\r\n\r\n static pingInterVal: any;\r\n startPingAuth(intervalTime?: number) {\r\n if (!AuthService.pingInterVal) {\r\n if (!intervalTime || intervalTime < 5 * 60 * 1000) {\r\n intervalTime = 5 * 60 * 1000;\r\n }\r\n AuthService.pingInterVal = setInterval(() => {\r\n if (TokenStorage.getToken()) {\r\n this.pingAuth();\r\n }\r\n }, intervalTime);\r\n }\r\n }\r\n}\r\n","// import { C_Project } from 'app/QLDAXD/model/C_Project.model';\r\n\r\nimport { InjectionToken } from '@angular/core';\r\n\r\nexport interface CurrentUser {\r\n id: string;\r\n username: string;\r\n roles: string[]; // Ví dụ: ['Admin', 'QuanLyKhuVuc_1']\r\n permissions: string[]; // Ví dụ: ['todos:read_all', 'todos:update_own']\r\n}\r\n\r\nexport interface TodoData {\r\n id: string;\r\n createdByUserId: string;\r\n isCompleted: boolean;\r\n}\r\n\r\nexport interface ResourceMap {\r\n // project: C_Project;\r\n // todos: TodoData;\r\n // menu: App_Menu;\r\n // org: App_Org;\r\n}\r\n\r\nexport type AbacRuleFn<T> = (user: CurrentUser, data: T) => boolean;\r\nexport const ABAC_RULES_TOKEN = new InjectionToken<Record<string, AbacRuleFn<any>>>('ABAC_RULES_TOKEN');\r\n\r\n/**\r\n * 1. HÀM KIỂM TRA THEO QUYỀN VÀ THUỘC TÍNH (DÙNG CHO PHẦN LỚN NGHIỆP VỤ)\r\n */\r\nexport function checkPermission<TResource extends keyof ResourceMap>(\r\n user: CurrentUser | null | undefined,\r\n rules: Record<string, AbacRuleFn<any>>,\r\n resource: TResource,\r\n action: 'read' | 'create' | 'update' | 'delete' | string,\r\n data?: ResourceMap[TResource],\r\n): boolean {\r\n if (!user) return false;\r\n\r\n const SYSTEM_ROLES = ['Admin', 'SuperAdmin'];\r\n if (user.roles && user.roles.some((role) => SYSTEM_ROLES.includes(role))) return true;\r\n\r\n if (!user.permissions || user.permissions.length === 0) return false;\r\n\r\n const prefix = `${String(resource)}:${action}`;\r\n const matchedPermissions = user.permissions.filter((p) => p.startsWith(prefix));\r\n\r\n if (matchedPermissions.length === 0) return false;\r\n\r\n return matchedPermissions.some((permCode) => {\r\n const ruleFn = rules[permCode];\r\n\r\n // NẾU DEVELOPER QUÊN KHAI BÁO LUẬT TRONG APP_PERMISSION_RULES\r\n if (!ruleFn) {\r\n // Xử lý an toàn: Các mã quyền chứa '_own' bắt buộc phải có luật kiểm tra dữ liệu.\r\n // Nếu không có luật -> CHẶN NGAY LẬP TỨC (Fail-Closed).\r\n if (permCode.includes('_own')) {\r\n console.error(\r\n `[Security Warning]: Thiếu khai báo rule cho quyền \"${permCode}\" trong APP_PERMISSION_RULES. Hệ thống tự động từ chối truy cập để đảm bảo an toàn.`,\r\n );\r\n return false;\r\n }\r\n\r\n // Với các quyền toàn cục như '_all', 'create', 'export' -> Bỏ qua, cho phép hiển thị\r\n return true;\r\n }\r\n\r\n // NẾU ĐÃ CÓ KHAI BÁO LUẬT\r\n if (data !== undefined) {\r\n return ruleFn(user, data); // Chạy luật check theo dữ liệu (VD: user.id === org.CreatedUser)\r\n }\r\n\r\n // Trường hợp kiểm tra quyền chung nhưng lại có luật (Hiếm gặp)\r\n return true;\r\n });\r\n}\r\n/**\r\n * 2. HÀM TIỆN ÍCH CHỈ CHECK THEO ROLE (DÙNG ĐỂ RENDER UI ĐẶC THÙ)\r\n * Sử dụng khi bạn cần: *ngIf=\"hasRole('KiemToan')\"\r\n */\r\nexport function checkRole(user: CurrentUser | null | undefined, expectedRole: string): boolean {\r\n if (!user || !user.roles) return false;\r\n return user.roles.includes(expectedRole);\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { ABAC_RULES_TOKEN, CurrentUser, ResourceMap, checkPermission, checkRole } from './auth-abac';\r\nimport { ESPModel } from '../model';\r\nimport { CommonService } from '../services/api-service/common.service';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class PermissionService {\r\n cms = inject(CommonService);\r\n\r\n private currentUser$ = new BehaviorSubject<CurrentUser | null>(null);\r\n\r\n // Hứng luật từ App. Nếu App không truyền thì lấy object rỗng {}\r\n private readonly appRules = inject(ABAC_RULES_TOKEN, { optional: true }) || {};\r\n\r\n setCurrentUser(user: CurrentUser) {\r\n this.currentUser$.next(user);\r\n }\r\n\r\n async getUserPermission(): Promise<boolean> {\r\n // 1. Caching: Đã có data rồi thì thôi không gọi nữa\r\n if (this.currentUser$.value) return true;\r\n\r\n try {\r\n let data: ESPModel = {\r\n SPN: 'Permission_getUserPermission',\r\n };\r\n\r\n let ret = await this.cms.ESP(data);\r\n\r\n if (ret && ret.IsSuccess && ret.Data) {\r\n // 2. Xử lý an toàn các mảng chuỗi (Split, Trim, Filter)\r\n const parseStringToArray = (str: string | null | undefined): string[] => {\r\n if (!str) return [];\r\n return str\r\n .split(',')\r\n .map((item) => item.trim()) // Xóa khoảng trắng thừa\r\n .filter((item) => item.length > 0); // Bỏ các phần tử rỗng\r\n };\r\n\r\n let user: CurrentUser = {\r\n id: ret.Data.userid || '',\r\n username: ret.Data.username || '',\r\n roles: parseStringToArray(ret.Data.roles),\r\n permissions: parseStringToArray(ret.Data.permissions),\r\n };\r\n\r\n this.setCurrentUser(user);\r\n return true;\r\n } else {\r\n console.warn('Không lấy được thông tin quyền của User');\r\n return false;\r\n }\r\n } catch (error) {\r\n console.error('Lỗi API khi lấy quyền User:', error);\r\n return false; // Trả về false để Guard biết luồng bị lỗi\r\n }\r\n }\r\n\r\n hasAccess<TResource extends keyof ResourceMap>(\r\n resource: TResource,\r\n action: 'read' | 'create' | 'update' | 'delete' | string,\r\n data?: ResourceMap[TResource],\r\n ): boolean {\r\n const currentUser = this.currentUser$.value;\r\n if (!currentUser) return false;\r\n\r\n // Truyền appRules vào cho hàm check\r\n return checkPermission(currentUser, this.appRules, resource, action, data);\r\n }\r\n\r\n hasRole(expectedRole: string): boolean {\r\n return checkRole(this.currentUser$.value, expectedRole);\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';\r\nimport { AuthService } from './auth.service';\r\nimport { TokenStorage } from './token.storage';\r\nimport { PermissionService } from './permission.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthGuard implements CanActivate {\r\n router = inject(Router);\r\n authService = inject(AuthService);\r\n permissionService = inject(PermissionService);\r\n\r\n async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {\r\n // return true;\r\n\r\n if (await this.authService.pingAuth()) {\r\n this.permissionService.getUserPermission();\r\n return true;\r\n }\r\n\r\n TokenStorage.clearToken();\r\n\r\n if (state.url != '/') {\r\n if (!state.url.startsWith('/login')) {\r\n this.router.navigate(['/login'], { queryParams: { returnUrl: state.url } });\r\n } else {\r\n this.router.navigate([state.url]);\r\n }\r\n } else {\r\n this.router.navigate(['/login']);\r\n }\r\n return false;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable, of } from 'rxjs';\r\nimport { delay, switchMap, distinctUntilChanged } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class LoadingService {\r\n private static loadingStack: any[] = [];\r\n private loadingSubject = new BehaviorSubject<boolean>(false);\r\n\r\n private update() {\r\n const isLoading = LoadingService.loadingStack.length > 0;\r\n this.loadingSubject.next(isLoading);\r\n }\r\n\r\n loadingUp() {\r\n LoadingService.loadingStack.push(1);\r\n this.update();\r\n }\r\n\r\n loadingDown() {\r\n LoadingService.loadingStack.pop();\r\n this.update();\r\n }\r\n\r\n /** Trả về observable loading có delay khi bật để tránh chớp nháy */\r\n get loading$(): Observable<boolean> {\r\n return this.loadingSubject.asObservable().pipe(\r\n switchMap((loading) => {\r\n return of(loading);\r\n }),\r\n distinctUntilChanged(),\r\n );\r\n }\r\n\r\n /** Nếu chỉ cần giá trị hiện tại boolean (ít dùng hơn) */\r\n get isLoading(): boolean {\r\n return LoadingService.loadingStack.length > 0;\r\n }\r\n}\r\n","import { HttpHandlerFn, HttpRequest } from '@angular/common/http';\r\nimport { inject } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { TokenStorage } from './token.storage';\r\nimport { BehaviorSubject, catchError, filter, finalize, from, of, switchMap, take, throwError } from 'rxjs';\r\nimport { LoadingService } from '../services/loading.service';\r\nimport { AuthService } from './auth.service';\r\nimport { RespondData } from '../model';\r\nimport { TranslateService } from '@ngx-translate/core';\r\n\r\nlet initialReturnUrl: string | null = null;\r\nlet isRefreshing = false;\r\nconst refreshTokenSubject = new BehaviorSubject<string | null>(null);\r\n\r\nexport function authInterceptor(req: HttpRequest<unknown>, next: HttpHandlerFn) {\r\n const router = inject(Router);\r\n const loadingService = inject(LoadingService);\r\n const authService = inject(AuthService);\r\n const translate = inject(TranslateService);\r\n\r\n const authToken = TokenStorage.getToken();\r\n const noLoadingMark = req.headers.get('No-Loading-Mark');\r\n\r\n if (noLoadingMark !== '1') loadingService.loadingUp();\r\n\r\n // Convert dates\r\n if (!(req.body instanceof FormData)) {\r\n const newBody = convertDatesInBody(req.body);\r\n if (req.body !== newBody) {\r\n req = req.clone({ body: newBody });\r\n }\r\n }\r\n\r\n // Add token\r\n if (authToken) {\r\n req = req.clone({\r\n setHeaders: { Authorization: `Bearer ${authToken}` },\r\n });\r\n }\r\n\r\n return next(req).pipe(\r\n catchError((error) => {\r\n if (error.status === 401) {\r\n return handle401(req, next, router, authService, translate);\r\n }\r\n return throwError(() => error);\r\n }),\r\n finalize(() => {\r\n if (noLoadingMark !== '1') loadingService.loadingDown();\r\n }),\r\n );\r\n}\r\n\r\n//\r\n// ⭐ REFRESH TOKEN HANDLER\r\n//\r\nfunction handle401(\r\n req: HttpRequest<any>,\r\n next: HttpHandlerFn,\r\n router: Router,\r\n authService: AuthService,\r\n translate: TranslateService,\r\n) {\r\n if (!isRefreshing) {\r\n isRefreshing = true;\r\n refreshTokenSubject.next(null);\r\n\r\n return from(authService.refreshToken()).pipe(\r\n switchMap((resAny: any) => {\r\n const res = resAny as RespondData;\r\n isRefreshing = false;\r\n\r\n if (!res?.IsSuccess) {\r\n const currentUrl = router.routerState.snapshot.url;\r\n\r\n if (!initialReturnUrl && !currentUrl.startsWith('/login')) {\r\n initialReturnUrl = currentUrl;\r\n }\r\n\r\n router.navigate(['/login'], {\r\n queryParams: { returnUrl: initialReturnUrl || '/' },\r\n });\r\n\r\n refreshTokenSubject.error(translate.instant('Refresh token failed'));\r\n\r\n return throwError(() => new Error(translate.instant('Refresh token failed')));\r\n }\r\n\r\n // Phát token mới cho các request đang chờ\r\n refreshTokenSubject.next(TokenStorage.getToken());\r\n\r\n // Retry request\r\n return next(\r\n req.clone({\r\n setHeaders: { Authorization: `Bearer ${TokenStorage.getToken()}` },\r\n }),\r\n );\r\n }),\r\n catchError((err) => {\r\n isRefreshing = false;\r\n TokenStorage.clearToken();\r\n const currentUrl = router.routerState.snapshot.url;\r\n\r\n if (!initialReturnUrl && !currentUrl.startsWith('/login')) {\r\n initialReturnUrl = currentUrl;\r\n }\r\n\r\n router.navigate(['/login'], {\r\n queryParams: { returnUrl: initialReturnUrl || '/' },\r\n });\r\n\r\n return throwError(() => err);\r\n }),\r\n );\r\n } else {\r\n // Nếu đang refresh → chờ token mới rồi retry\r\n return refreshTokenSubject.pipe(\r\n take(1),\r\n switchMap((token) =>\r\n next(\r\n req.clone({\r\n setHeaders: { Authorization: `Bearer ${token}` },\r\n }),\r\n ),\r\n ),\r\n catchError((err) => throwError(() => err)),\r\n );\r\n }\r\n}\r\n\r\nfunction convertDatesInBody(obj: any): any {\r\n if (obj instanceof Date) {\r\n return formatDate(obj);\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(convertDatesInBody);\r\n }\r\n\r\n if (typeof obj === 'object' && obj !== null) {\r\n const newObj: any = {};\r\n for (const key of Object.keys(obj)) {\r\n const value = obj[key];\r\n\r\n if (value instanceof Date) {\r\n newObj[key] = formatDate(value);\r\n } else if (typeof value === 'string' && isIsoDate(value)) {\r\n newObj[key] = formatDate(new Date(value));\r\n } else if (typeof value === 'object') {\r\n newObj[key] = convertDatesInBody(value);\r\n } else {\r\n newObj[key] = value;\r\n }\r\n }\r\n return newObj;\r\n }\r\n\r\n return obj;\r\n}\r\n\r\nfunction isIsoDate(str: string): boolean {\r\n // ISO string with optional time and timezone\r\n return /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[\\+\\-]\\d{2}:\\d{2})?$/.test(str);\r\n}\r\n\r\nfunction formatDate(date: Date): string {\r\n const pad = (n: number) => n.toString().padStart(2, '0');\r\n return (\r\n `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ` +\r\n `${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`\r\n );\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { CanDeactivate } from '@angular/router';\r\n\r\nexport interface CanComponentDeactivate {\r\n canDeactivate: () => boolean | Promise<boolean>;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class UnsavedChangesGuard implements CanDeactivate<CanComponentDeactivate> {\r\n canDeactivate(component: CanComponentDeactivate): boolean | Promise<boolean> {\r\n return component.canDeactivate ? component.canDeactivate() : true;\r\n }\r\n}\r\n","import { inject, Injectable, NgZone } from '@angular/core';\r\nimport { AuthService } from './auth.service';\r\n\r\ninterface SessionHandlers {\r\n refreshToken: () => Promise<any>;\r\n logout: () => void;\r\n getToken: () => string | null;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SessionManagerService {\r\n public zone = inject(NgZone);\r\n public authService = inject(AuthService);\r\n\r\n private idleTimer: any;\r\n private refreshTimer: any;\r\n private heartbeatTimer: any;\r\n\r\n public static IDLE_MIN = 15;\r\n private readonly REFRESH_BEFORE = 120;\r\n\r\n private get IDLE_TIME() {\r\n return (SessionManagerService.IDLE_MIN || 0) * 60 * 1000;\r\n }\r\n\r\n private readonly LEADER_KEY = 'APP_SESSION_LEADER';\r\n private readonly HEARTBEAT_KEY = 'APP_SESSION_HEARTBEAT';\r\n private readonly ACTIVITY_KEY = 'APP_LAST_ACTIVITY';\r\n\r\n private readonly SESSION_EVENT = 'APP_SESSION_EVENT';\r\n private readonly LOGIN_EVENT = 'APP_LOGIN_EVENT';\r\n private readonly LOGOUT_EVENT = 'APP_LOGOUT_EVENT';\r\n private readonly ACTIVITY_EVENT = 'APP_ACTIVITY_EVENT';\r\n private readonly TOKEN_REFRESH_EVENT = 'APP_TOKEN_REFRESH_EVENT';\r\n\r\n private tabId = Date.now() + Math.random();\r\n\r\n private isLeader = false;\r\n private refreshLock = false;\r\n\r\n private channel: BroadcastChannel | null = null;\r\n\r\n /* -------------------------------- START -------------------------------- */\r\n\r\n start() {\r\n console.log('SessionManagerService > start > IDLE_TIME: ' + SessionManagerService.IDLE_MIN + ' mins');\r\n\r\n if ('BroadcastChannel' in window) {\r\n this.channel = new BroadcastChannel('APP_SESSION');\r\n this.listenChannel();\r\n }\r\n\r\n if (this.IDLE_TIME <= 0) return;\r\n\r\n this.listenActivity();\r\n this.updateActivity();\r\n this.resetIdle();\r\n\r\n this.electLeader();\r\n }\r\n\r\n // stop() {\r\n // clearTimeout(this.idleTimer);\r\n // clearTimeout(this.refreshTimer);\r\n // clearInterval(this.heartbeatTimer);\r\n // }\r\n\r\n async login(username: string, password: string, orgid: string, returnUrl: string) {\r\n var ret = await this.authService._signIn(username, password, orgid, returnUrl);\r\n if (ret) {\r\n console.log('SessionManagerService > broadcast LOGIN');\r\n this.broadcast(this.LOGIN_EVENT);\r\n }\r\n }\r\n\r\n logout() {\r\n this.authService._signOut();\r\n this.broadcast(this.LOGOUT_EVENT);\r\n }\r\n\r\n /* -------------------------------- ACTIVITY -------------------------------- */\r\n\r\n private listenActivity() {\r\n const events = ['mousemove', 'keydown', 'click', 'scroll'];\r\n\r\n events.forEach((e) => {\r\n window.addEventListener(e, this.onActivity, true);\r\n });\r\n }\r\n\r\n private onActivity = this.debounce(() => {\r\n this.updateActivity();\r\n this.resetIdle();\r\n\r\n this.broadcast(this.ACTIVITY_EVENT);\r\n }, 1000);\r\n\r\n private updateActivity() {\r\n localStorage.setItem(this.ACTIVITY_KEY, Date.now().toString());\r\n }\r\n\r\n /* -------------------------------- IDLE -------------------------------- */\r\n\r\n private resetIdle() {\r\n clearTimeout(this.idleTimer);\r\n\r\n const last = Number(localStorage.getItem(this.ACTIVITY_KEY) || Date.now());\r\n const remain = this.IDLE_TIME - (Date.now() - last);\r\n\r\n if (remain <= 0) {\r\n this.authService._signOut();\r\n return;\r\n }\r\n\r\n this.zone.runOutsideAngular(() => {\r\n this.idleTimer = setTimeout(() => {\r\n this.zone.run(() => this.authService._signOut());\r\n }, remain);\r\n });\r\n }\r\n\r\n /* -------------------------------- LEADER -------------------------------- */\r\n\r\n private electLeader() {\r\n const leader = localStorage.getItem(this.LEADER_KEY);\r\n\r\n if (!leader) {\r\n this.becomeLeader();\r\n return;\r\n }\r\n\r\n this.checkLeaderHeartbeat();\r\n }\r\n\r\n private becomeLeader() {\r\n this.isLeader = true;\r\n\r\n localStorage.setItem(this.LEADER_KEY, '' + this.tabId);\r\n\r\n this.startHeartbeat();\r\n this.scheduleRefresh();\r\n }\r\n\r\n private startHeartbeat() {\r\n this.heartbeatTimer = setInterval(() => {\r\n localStorage.setItem(this.HEARTBEAT_KEY, Date.now().toString());\r\n }, 2000);\r\n }\r\n\r\n private checkLeaderHeartbeat() {\r\n setTimeout(() => {\r\n const beat = Number(localStorage.getItem(this.HEARTBEAT_KEY) || 0);\r\n\r\n if (Date.now() - beat > 5000) {\r\n this.becomeLeader();\r\n }\r\n }, 3000);\r\n }\r\n\r\n /* -------------------------------- REFRESH TOKEN -------------------------------- */\r\n\r\n private scheduleRefresh() {\r\n if (!this.isLeader) return;\r\n\r\n clearTimeout(this.refreshTimer);\r\n\r\n const token = this.authService.getToken();\r\n\r\n if (!token) return;\r\n\r\n const exp = this.parseJwt(token).exp * 1000;\r\n\r\n const delay = exp - Date.now() - this.REFRESH_BEFORE * 1000;\r\n\r\n if (delay <= 0) {\r\n this.refreshToken();\r\n return;\r\n }\r\n\r\n this.refreshTimer = setTimeout(() => {\r\n this.refreshToken();\r\n }, delay);\r\n }\r\n\r\n private async refreshToken() {\r\n if (!this.isLeader || this.refreshLock) return;\r\n\r\n this.refreshLock = true;\r\n\r\n try {\r\n const res = await this.authService.refreshToken();\r\n\r\n if (res?.IsSuccess) {\r\n this.broadcast(this.TOKEN_REFRESH_EVENT);\r\n\r\n this.scheduleRefresh();\r\n } else {\r\n this.logout();\r\n }\r\n } catch {\r\n this.logout();\r\n } finally {\r\n this.refreshLock = false;\r\n }\r\n }\r\n\r\n /* -------------------------------- CHANNEL -------------------------------- */\r\n\r\n private listenChannel() {\r\n console.log('SessionManagerService > listenChannel:', this.channel);\r\n\r\n if (!this.channel) return;\r\n\r\n this.channel.onmessage = (msg) => {\r\n const type = msg.data?.type;\r\n\r\n if (type === this.ACTIVITY_EVENT) {\r\n this.resetIdle();\r\n }\r\n\r\n if (type === this.LOGOUT_EVENT) {\r\n location.reload();\r\n }\r\n\r\n if (type === this.LOGIN_EVENT) {\r\n location.reload();\r\n }\r\n\r\n if (type === this.TOKEN_REFRESH_EVENT) {\r\n this.scheduleRefresh();\r\n }\r\n };\r\n }\r\n\r\n private broadcast(type: string) {\r\n if (this.channel) {\r\n this.channel.postMessage({ type });\r\n } else {\r\n localStorage.setItem(this.SESSION_EVENT, JSON.stringify({ type, t: Date.now() }));\r\n }\r\n }\r\n\r\n /* -------------------------------- UTILS -------------------------------- */\r\n\r\n private debounce(fn: Function, delay: number) {\r\n let timer: any;\r\n\r\n return () => {\r\n clearTimeout(timer);\r\n\r\n timer = setTimeout(() => fn(), delay);\r\n };\r\n }\r\n\r\n private parseJwt(token: string) {\r\n const payload = token.split('.')[1];\r\n\r\n return JSON.parse(atob(payload));\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { NzModalService, NzModalRef, ModalOptions } from 'ng-zorro-antd/modal';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class CustomModalService {\r\n constructor(private modal: NzModalService) {}\r\n\r\n create<T, D = any>(options: ModalOptions<T, D>): NzModalRef<T, D> {\r\n const defaultOptions: Partial<ModalOptions<T, D>> = {\r\n nzMaskClosable: false,\r\n nzCentered: true,\r\n nzBodyStyle: {\r\n 'max-height': 'calc(100vh - 180px)',\r\n overflow: 'auto',\r\n },\r\n };\r\n\r\n const mergedOptions: ModalOptions<T, D> = {\r\n ...defaultOptions,\r\n ...options,\r\n nzStyle: {\r\n ...defaultOptions.nzStyle,\r\n ...options.nzStyle,\r\n },\r\n };\r\n\r\n return this.modal.create(mergedOptions);\r\n }\r\n\r\n confirm(options: ModalOptions): NzModalRef {\r\n return this.modal.confirm(options);\r\n }\r\n\r\n info(options: ModalOptions): NzModalRef {\r\n return this.modal.info(options);\r\n }\r\n\r\n success(options: ModalOptions): NzModalRef {\r\n return this.modal.success(options);\r\n }\r\n\r\n warning(options: ModalOptions): NzModalRef {\r\n return this.modal.warning(options);\r\n }\r\n\r\n error(options: ModalOptions): NzModalRef {\r\n return this.modal.error(options);\r\n }\r\n}\r\n","import { Component, inject, OnDestroy, OnInit } from '@angular/core';\r\nimport { NotiService } from '../services/noti.service';\r\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { TranslateKey } from '../a-translate-key';\r\nimport { filter, Subscription } from 'rxjs';\r\nimport { CustomModalService } from '../services/custom-modal.service';\r\nimport { Location } from '@angular/common';\r\nimport { AppGlobals } from '../app-global';\r\n\r\n@Component({ template: '' })\r\nexport class BaseComponent {\r\n protected AppGlobals = AppGlobals;\r\n\r\n protected TranslateKey = TranslateKey;\r\n\r\n protected route = inject(ActivatedRoute);\r\n protected router = inject(Router);\r\n protected location = inject(Location);\r\n\r\n protected notiService = inject(NotiService);\r\n protected translate = inject(TranslateService);\r\n protected modal = inject(CustomModalService);\r\n\r\n private routeSub?: Subscription;\r\n\r\n backURL = '';\r\n\r\n /**\r\n * Khi dùng onRouteChange nhớ dùng unSubRouteChange\r\n */\r\n protected onRouteChange(callback: (url: string) => void): void {\r\n this.routeSub = this.router.events\r\n .pipe(filter((e): e is NavigationEnd => e instanceof NavigationEnd))\r\n .subscribe((e: NavigationEnd) => {\r\n callback(e.urlAfterRedirects);\r\n });\r\n }\r\n\r\n protected unSubRouteChange(): void {\r\n this.routeSub?.unsubscribe();\r\n }\r\n\r\n protected goback() {\r\n if (this.backURL) {\r\n this.goto(this.backURL);\r\n } else {\r\n this.location.back();\r\n }\r\n }\r\n\r\n protected goto(url?: string, isNewTab = false) {\r\n if (!url) return;\r\n\r\n if (isNewTab) {\r\n window.open(url, '_blank');\r\n } else {\r\n if (url.startsWith('/')) {\r\n this.router.navigateByUrl(url);\r\n } else {\r\n this.router.navigate([url], { relativeTo: this.route });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * /:id\r\n */\r\n protected getUrlParam(paramName: string) {\r\n const paramValue = this.route.snapshot.params[paramName];\r\n\r\n // bằng 0 thì trả về null vì chuyển primary key từ bigint sang string, code cũ đang truyền vào 0\r\n if (paramValue == '0' || paramValue == 'new' || paramValue == 'them-moi') {\r\n return null;\r\n }\r\n return paramValue;\r\n }\r\n\r\n /**\r\n * ?id=xxx\r\n */\r\n protected getUrlQueryParam(queryParamName: string) {\r\n const queryParamValue = this.route.snapshot.queryParamMap.get(queryParamName);\r\n return queryParamValue;\r\n }\r\n\r\n /**\r\n * Routes data\r\n */\r\n protected getUrlData(key: string) {\r\n return this.route.snapshot.data[key];\r\n }\r\n\r\n protected setQueryParam(name: string, value: string) {\r\n this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams: {\r\n [name]: value,\r\n },\r\n queryParamsHandling: 'merge',\r\n });\r\n }\r\n\r\n protected get url() {\r\n return this.router.url;\r\n }\r\n\r\n protected get urlPath() {\r\n return this.router.url.split('?')[0];\r\n }\r\n\r\n protected handleError(err: any) {\r\n this.notiService.handleError(err);\r\n }\r\n\r\n protected touchControls(formData: FormGroup) {\r\n Object.values(formData.controls).forEach((control) => {\r\n if (control.invalid) {\r\n control.markAsDirty();\r\n control.updateValueAndValidity({ onlySelf: true });\r\n }\r\n });\r\n\r\n formData.updateValueAndValidity();\r\n\r\n this.logFormErrors(formData);\r\n }\r\n\r\n protected untouchControls(formData: FormGroup) {\r\n formData.markAsPristine();\r\n formData.markAsUntouched();\r\n formData.updateValueAndValidity();\r\n }\r\n\r\n private logFormErrors(form: FormGroup, parentKey: string = '') {\r\n Object.keys(form.controls).forEach((key) => {\r\n const control = form.get(key);\r\n const fieldPath = parentKey ? `${parentKey}.${key}` : key;\r\n\r\n if (control instanceof FormGroup) {\r\n this.logFormErrors(control, fieldPath);\r\n } else {\r\n if (control?.errors) {\r\n console.log(`Control: ${fieldPath}`, control.errors);\r\n }\r\n }\r\n });\r\n }\r\n\r\n protected confirm(title: string, content: string = ''): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n this.modal.confirm({\r\n // nzCentered: true,\r\n nzTitle: title,\r\n nzContent: content,\r\n nzOkText: this.translate.instant(this.TranslateKey.AGREE),\r\n nzOkType: 'primary',\r\n nzOkDanger: true,\r\n nzClosable: false,\r\n nzOnOk: () => resolve(true),\r\n nzAutofocus: 'ok',\r\n nzCancelText: this.translate.instant(this.TranslateKey.CANCEL),\r\n nzOnCancel: () => resolve(false),\r\n });\r\n });\r\n }\r\n\r\n protected backToTop() {\r\n // go to top\r\n window.scrollTo({\r\n top: 0,\r\n behavior: 'smooth',\r\n });\r\n\r\n const content = document.querySelector('nz-content');\r\n if (content) {\r\n content.scrollTo({\r\n top: 0,\r\n behavior: 'smooth',\r\n });\r\n }\r\n }\r\n}\r\n","import { Component, HostListener } from '@angular/core';\r\nimport { BaseComponent } from './base.component';\r\nimport { CanComponentDeactivate } from '../auth/unsaved-changes.guard';\r\nimport { FormGroup } from '@angular/forms';\r\n\r\n@Component({\r\n template: '',\r\n})\r\nexport class BaseGuardChangeComponent extends BaseComponent implements CanComponentDeactivate {\r\n private lstFormData: FormGroup[] = [];\r\n\r\n addTrackDirty(formData: FormGroup) {\r\n this.lstFormData.push(formData);\r\n }\r\n\r\n hasUnsavedChanges = false;\r\n markAsUnsaved() {\r\n this.hasUnsavedChanges = true;\r\n }\r\n\r\n @HostListener('window:beforeunload', ['$event'])\r\n unloadNotification($event: any) {\r\n if (this.lstFormData?.some((x) => x.dirty) || this.hasUnsavedChanges) {\r\n $event.preventDefault();\r\n $event.returnValue = true; // Chrome requires this line\r\n }\r\n }\r\n\r\n async canDeactivate(): Promise<boolean> {\r\n if (this.lstFormData?.some((x) => x.dirty) || this.hasUnsavedChanges) {\r\n console.log('hasUnsavedChanges', this.hasUnsavedChanges);\r\n\r\n // ---- XỬ LÝ LOG CỤ THỂ FIELD DIRTY ----\r\n const dirtyDetails = this.lstFormData\r\n ?.map((form, index) => {\r\n if (!form.dirty) return null; // Bỏ qua form không bị thay đổi\r\n\r\n // Lọc ra các key (tên field) có trạng thái dirty = true\r\n const dirtyFields = Object.keys(form.controls).filter((key) => form.controls[key].dirty);\r\n\r\n return {\r\n formIndex: index, // Vị trí của form trong mảng lstFormData\r\n fields: dirtyFields,\r\n };\r\n })\r\n .filter(Boolean); // Loại bỏ các giá trị null\r\n\r\n console.log('fields dirty:', dirtyDetails);\r\n // --------------------------------------\r\n\r\n return await this.confirm('Dữ liệu chưa được lưu. Bạn có chắc chắn muốn rời khỏi trang?');\r\n }\r\n return true;\r\n }\r\n\r\n clearChange() {\r\n this.lstFormData?.forEach((x) => {\r\n x?.markAsPristine();\r\n x?.markAsUntouched();\r\n x?.updateValueAndValidity();\r\n });\r\n this.hasUnsavedChanges = false;\r\n }\r\n}\r\n","import { ElementRef, inject, TemplateRef, ViewContainerRef } from '@angular/core';\r\nimport { OverlayRef, Overlay } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { fromEvent } from 'rxjs';\r\nimport { filter, takeUntil } from 'rxjs/operators';\r\nimport { BaseComponent } from './base.component';\r\nimport { NzButtonComponent } from 'ng-zorro-antd/button';\r\n\r\nexport class BaseOverlayComponent extends BaseComponent {\r\n // custom dropdow\r\n inputWidth: number = 0;\r\n triggerSpan = 500;\r\n private overlayRef!: OverlayRef;\r\n\r\n overlay = inject(Overlay);\r\n vcr = inject(ViewContainerRef);\r\n\r\n openOverlay(originEl: any, target: TemplateRef<any>, width = 0) {\r\n const origin: HTMLElement = originEl?.elementRef?.nativeElement ?? originEl?.nativeElement ?? originEl;\r\n\r\n this.updateInputWidth(origin);\r\n\r\n if (this.overlayRef) {\r\n this.overlayRef.detach(); // Đóng nếu đã mở\r\n }\r\n\r\n width = width > origin.offsetWidth ? width : origin.offsetWidth; // 👈 Lấy chiều rộng của input\r\n\r\n const positionStrategy = this.overlay\r\n .position()\r\n .flexibleConnectedTo(origin)\r\n .withPositions([\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n offsetY: 5,\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n offsetY: -5,\r\n },\r\n ])\r\n .withDefaultOffsetY(5);\r\n\r\n this.overlayRef = this.overlay.create({\r\n positionStrategy,\r\n hasBackdrop: false,\r\n backdropClass: 'cdk-overlay-transparent-backdrop',\r\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\r\n width, // 👈 Gán chiều rộng cho overlay\r\n });\r\n\r\n this.overlayRef.backdropClick().subscribe(() => {\r\n this.overlayRef.detach();\r\n });\r\n\r\n const portal = new TemplatePortal(target, this.vcr);\r\n this.overlayRef.attach(portal);\r\n\r\n const overlayElement = this.overlayRef.overlayElement;\r\n\r\n // hasBackdrop: false, thêm cái này để đóng khi click ra ngoài\r\n fromEvent<MouseEvent>(document, 'click')\r\n .pipe(\r\n filter((event) => {\r\n const clickTarget = event.target as HTMLElement;\r\n\r\n return (\r\n this.overlayRef &&\r\n !overlayElement.contains(clickTarget) && // click không nằm trong overlay\r\n !origin.contains(clickTarget) && // và cũng không phải click vào input gốc\r\n !clickTarget.closest('.ant-select-dropdown') &&\r\n !clickTarget.closest('.ant-select-item') &&\r\n !clickTarget.closest('.ant-select-item-option-content') &&\r\n !clickTarget.closest('.no-close-custom-dropdow')\r\n );\r\n }),\r\n takeUntil(this.overlayRef.detachments()), // tự huỷ khi overlay bị đóng\r\n )\r\n .subscribe(() => {\r\n this.overlayRef?.detach();\r\n });\r\n }\r\n\r\n updateInputWidth(inputEl: HTMLElement) {\r\n this.inputWidth = inputEl?.offsetWidth || 0;\r\n }\r\n // END custom dropdow\r\n}\r\n","import { Component } from '@angular/core';\r\nimport { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { BaseComponent } from '../base.component';\r\n\r\ninterface IBreadcrumb {\r\n Name: string;\r\n URL?: string;\r\n Click?: Function;\r\n}\r\n\r\n@Component({\r\n selector: 'app-breadcrumb',\r\n templateUrl: './breadcrumb.html',\r\n imports: [NzBreadCrumbModule, NzIconModule],\r\n})\r\nexport class Breadcrumb extends BaseComponent {\r\n Breadcrumb = Breadcrumb;\r\n\r\n private static _lstBreadcrumb: IBreadcrumb[] = [];\r\n public static get lstBreadcrumb() {\r\n return Breadcrumb._lstBreadcrumb;\r\n }\r\n public static set lstBreadcrumb(val: IBreadcrumb[]) {\r\n setTimeout(() => {\r\n Breadcrumb._lstBreadcrumb = val;\r\n }, 0);\r\n }\r\n\r\n public static clear() {\r\n Breadcrumb.lstBreadcrumb = [];\r\n }\r\n\r\n gohome() {\r\n this.goto('');\r\n }\r\n\r\n onclick(item: IBreadcrumb) {\r\n if (item.URL) {\r\n this.goto(item.URL);\r\n } else if (item.Click) {\r\n item.Click();\r\n }\r\n }\r\n}\r\n","<nz-breadcrumb>\r\n <nz-breadcrumb-item (click)=\"gohome()\">\r\n <nz-icon nzType=\"home\" nzTheme=\"outline\" />\r\n </nz-breadcrumb-item>\r\n @for (item of Breadcrumb.lstBreadcrumb; track $index) {\r\n <nz-breadcrumb-item (click)=\"onclick(item)\">{{ item.Name }}</nz-breadcrumb-item>\r\n }\r\n</nz-breadcrumb>\r\n","import { Component, ElementRef, Input, AfterViewInit, ViewChild, OnChanges, SimpleChanges } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'animated-digit',\r\n templateUrl: 'animated-digit.component.html',\r\n styleUrls: ['animated-digit.component.scss'],\r\n})\r\nexport class AnimatedDigitComponent implements AfterViewInit, OnChanges {\r\n @Input() duration: number = 0;\r\n @Input() digit: number = 0;\r\n @Input() steps: number = 0;\r\n @ViewChild('animatedDigit') animatedDigit!: ElementRef;\r\n\r\n private currentValue: number = 0;\r\n\r\n animateCount() {\r\n if (!this.duration) {\r\n this.duration = 1000;\r\n }\r\n\r\n if (typeof this.digit === 'number') {\r\n this.counterFunc(this.currentValue, this.digit, this.duration, this.animatedDigit);\r\n }\r\n }\r\n\r\n counterFunc(startValue: number, endValue: number, durationMs: number, element: ElementRef) {\r\n if (!this.steps) {\r\n this.steps = 12;\r\n }\r\n\r\n const stepCount = Math.abs(durationMs / this.steps);\r\n const valueIncrement = (endValue - startValue) / stepCount;\r\n const sinValueIncrement = Math.PI / stepCount;\r\n\r\n let currentSinValue = 0;\r\n\r\n function step() {\r\n currentSinValue += sinValueIncrement;\r\n startValue += valueIncrement * Math.sin(currentSinValue) ** 2 * 2;\r\n if (element) element.nativeElement.textContent = Math.abs(Math.floor(startValue));\r\n\r\n if (currentSinValue < Math.PI) {\r\n window.requestAnimationFrame(step);\r\n }\r\n }\r\n\r\n step();\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (this.digit) {\r\n this.animateCount();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['digit']) {\r\n this.animateCount();\r\n setTimeout(() => {\r\n this.currentValue = this.digit;\r\n }, this.duration);\r\n }\r\n }\r\n}\r\n","<span #animatedDigit class=\"animated-digit\">\r\n <span>{{digit}}</span>\r\n</span>","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, OnDestroy, OnInit } from '@angular/core';\r\nimport { Chart, registerables } from 'chart.js';\r\n\r\n@Component({\r\n selector: 'cdk-bar-graph',\r\n templateUrl: './bar-graph.component.html',\r\n styleUrls: ['./bar-graph.component.scss'],\r\n imports: [CommonModule],\r\n})\r\nexport class BarGraphComponent implements OnInit, OnDestroy {\r\n @Input() height: number = 0;\r\n @Input() id: string = '';\r\n\r\n chart?: Chart;\r\n\r\n constructor() {\r\n Chart.register(...registerables);\r\n }\r\n\r\n ngOnInit() {\r\n setTimeout(() => {\r\n this.createBarGraph();\r\n }, 500);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.chart) {\r\n this.chart.destroy();\r\n }\r\n }\r\n\r\n createBarGraph() {\r\n if (!this.id) {\r\n return;\r\n }\r\n\r\n this.chart = new Chart(this.id, {\r\n type: 'bar',\r\n data: {\r\n labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug'],\r\n datasets: [\r\n {\r\n backgroundColor: 'rgba(92, 107, 192, .7)',\r\n borderColor: 'rgba(92, 107, 192, .7)',\r\n data: [70, 88, 77, 93, 82, 100, 70, 67, 78, 99],\r\n label: 'Dataset',\r\n },\r\n {\r\n backgroundColor: 'rgba(66, 165, 245, .7)',\r\n borderColor: 'rgba(69, 39, 160, .7)',\r\n data: [80, 88, 67, 95, 76, 60, 67, 95, 95, 66],\r\n label: 'Dataset',\r\n },\r\n {\r\n backgroundColor: 'rgba(38, 166, 154, .7)',\r\n borderColor: 'rgba(69, 39, 160, .7)',\r\n data: [60, 88, 70, 67, 27, 83, 78, 88, 95, 60],\r\n label: 'Dataset',\r\n },\r\n {\r\n backgroundColor: 'rgba(102, 187, 106, .7)',\r\n borderColor: 'rgba(255, 99, 132)',\r\n data: [75, 55, 55, 95, 66, 88, 70, 78, 77, 100],\r\n label: 'Dataset',\r\n },\r\n ],\r\n },\r\n options: {\r\n elements: {\r\n line: {\r\n tension: 0.000001,\r\n },\r\n },\r\n maintainAspectRatio: false,\r\n plugins: {\r\n filler: {\r\n propagate: false,\r\n },\r\n },\r\n },\r\n });\r\n }\r\n}\r\n","<div class=\"dash-bar-graph-holder mat-elevation-z4\" [ngStyle]=\"{ height: height + 'px' }\">\r\n <canvas [id]=\"id\"></canvas>\r\n</div>\r\n","import { Component, OnInit, Input } from '@angular/core';\r\nimport { AnimatedDigitComponent } from '../animated/animated-digit.component';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\n\r\n@Component({\r\n selector: 'cdk-dashcard',\r\n templateUrl: './dashcard.component.html',\r\n styleUrls: ['./dashcard.component.scss'],\r\n imports: [NzGridModule, NzIconModule, AnimatedDigitComponent],\r\n})\r\nexport class DashcardComponent implements OnInit {\r\n @Input() dashData: any;\r\n\r\n constructor() {}\r\n\r\n ngOnInit() {}\r\n}\r\n","<div nz-row class=\"dashcard mat-elevation-z2\" style=\"height: 100%\">\r\n <div nz-col [nzSpan]=\"8\" class=\"text-center\" [style.background]=\"dashData?.colorLight\">\r\n <nz-icon class=\"mat-icon\" style=\"padding-top: 50px\" [nzType]=\"dashData?.icon\" nzTheme=\"outline\" />\r\n </div>\r\n <div nz-col [nzSpan]=\"16\" [style.background]=\"dashData?.colorDark\">\r\n <div class=\"text-center animated-digit\">\r\n <animated-digit [digit]=\"dashData?.number\"></animated-digit>\r\n </div>\r\n <p\r\n class=\"text-center mat-body-1 border-top text-bold\"\r\n style=\"font-size: 16px; margin-bottom: 8px; padding-top: 3px\"\r\n >\r\n {{ dashData?.title }}\r\n </p>\r\n </div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, OnDestroy, OnInit } from '@angular/core';\r\nimport { Chart, registerables } from 'chart.js';\r\n\r\n@Component({\r\n selector: 'cdk-doughnut-graph',\r\n templateUrl: './doughnut-graph.component.html',\r\n styleUrls: ['./doughnut-graph.component.scss'],\r\n imports: [CommonModule],\r\n})\r\nexport class DoughnutGraphComponent implements OnInit, OnDestroy {\r\n @Input() height: number = 0;\r\n @Input() id: string = '';\r\n\r\n chart?: Chart;\r\n\r\n constructor() {\r\n Chart.register(...registerables);\r\n }\r\n\r\n ngOnInit() {\r\n setTimeout(() => {\r\n this.createDoughnutGraph();\r\n }, 500);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.chart) {\r\n this.chart.destroy();\r\n }\r\n }\r\n\r\n randomNumber(min = 0, max = 0) {\r\n if (min == 0 || max == 0) return Math.round(Math.random() * 100);\r\n else return Math.random() * (max - min) + min;\r\n }\r\n\r\n createDoughnutGraph() {\r\n if (!this.id) {\r\n return;\r\n }\r\n\r\n this.chart = new Chart(this.id, {\r\n type: 'doughnut',\r\n data: {\r\n labels: ['Data '],\r\n datasets: [\r\n {\r\n data: [this.randomNumber(), this.randomNumber(), this.randomNumber(), this.randomNumber()],\r\n backgroundColor: [\r\n 'rgba(255, 99, 132,.7)',\r\n 'rgba(92, 107, 192,.7)',\r\n 'rgba(66, 165, 245,.7)',\r\n 'rgba(38, 166, 154,.7)',\r\n 'rgba(102, 187, 106,.7)',\r\n ],\r\n },\r\n ],\r\n },\r\n options: {\r\n elements: {\r\n line: {\r\n tension: 0.000001,\r\n },\r\n },\r\n\r\n maintainAspectRatio: false,\r\n responsive: true,\r\n plugins: {\r\n filler: {\r\n propagate: false,\r\n },\r\n },\r\n },\r\n });\r\n }\r\n}\r\n","<div class=\"doughnut-graph-graph-holder mat-elevation-z4 \" [ngStyle]=\"{'height': height + 'px'}\">\r\n <canvas [id]=\"id\"></canvas>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, OnDestroy, OnInit } from '@angular/core';\r\nimport { Chart, registerables } from 'chart.js';\r\n\r\n@Component({\r\n selector: 'cdk-line-graph',\r\n templateUrl: './line-graph.component.html',\r\n styleUrls: ['./line-graph.component.scss'],\r\n imports: [CommonModule],\r\n})\r\nexport class LineGraphComponent implements OnInit, OnDestroy {\r\n @Input() height: number = 0;\r\n @Input() id: string = '';\r\n\r\n chart?: Chart;\r\n\r\n constructor() {\r\n Chart.register(...registerables);\r\n }\r\n\r\n ngOnInit() {\r\n setTimeout(() => {\r\n this.createLineChart();\r\n }, 500);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.chart) {\r\n this.chart.destroy();\r\n }\r\n }\r\n\r\n createLineChart() {\r\n if (!this.id) {\r\n return;\r\n }\r\n\r\n this.chart = new Chart(this.id, {\r\n type: 'line',\r\n data: {\r\n labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct'],\r\n datasets: [\r\n {\r\n backgroundColor: 'rgba(92, 107, 192, 0.36)',\r\n borderColor: 'rgba(92, 107, 192,.5)',\r\n data: [76.97, 88.91, 99.31, 122.19, 130.85, 140.91, 150.36, 142.66, 150.36, 142.66],\r\n label: 'Dataset',\r\n fill: 'start',\r\n },\r\n ],\r\n },\r\n options: {\r\n elements: {\r\n line: {\r\n tension: 0.000001,\r\n },\r\n },\r\n\r\n maintainAspectRatio: false,\r\n plugins: {\r\n filler: {\r\n propagate: false,\r\n },\r\n },\r\n },\r\n });\r\n }\r\n}\r\n","<div class=\"line-graph-holder mat-elevation-z4 \" [ngStyle]=\"{'height': height + 'px'}\">\r\n <canvas [id]=\"id\"></canvas>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { NzCheckboxModule } from 'ng-zorro-antd/checkbox';\r\nimport { NzFormModule } from 'ng-zorro-antd/form';\r\n\r\n@Component({\r\n selector: 'extend-checkbox',\r\n templateUrl: './extend-checkbox.html',\r\n imports: [CommonModule, FormsModule, ReactiveFormsModule, NzFormModule, NzCheckboxModule],\r\n})\r\nexport class ExtendCheckbox implements OnInit {\r\n @Input() label = '';\r\n\r\n /**\r\n * default = 8\r\n */\r\n @Input() labelSpan = 8;\r\n @Input() labelFlex: string | number | null = null;\r\n\r\n @Input() disabled = false;\r\n\r\n @Input() formData!: FormGroup;\r\n @Input() controlName!: string;\r\n\r\n /**\r\n * default: boolean\r\n */\r\n @Input() valueType: 'boolean' | 'number' | 'string' = 'boolean';\r\n\r\n @Input()\r\n get _ngModel() {\r\n if (this.valueType == 'boolean') {\r\n return this.checked;\r\n }\r\n if (this.valueType == 'number') {\r\n return this.checked ? 1 : 0;\r\n }\r\n if (this.valueType == 'string') {\r\n return this.checked ? 'Y' : 'N';\r\n }\r\n }\r\n set _ngModel(val: any) {\r\n if (this.controlName) {\r\n if (this.valueType == 'boolean') {\r\n this.formData.controls[this.controlName].valueChanges.subscribe((x) => {\r\n this.checked = x;\r\n });\r\n } else if (this.valueType == 'number') {\r\n this.formData.controls[this.controlName].valueChanges.subscribe((x) => {\r\n this.checked = x == 1;\r\n });\r\n } else {\r\n this.formData.controls[this.controlName].valueChanges.subscribe((x) => {\r\n this.checked = x == 'Y';\r\n });\r\n }\r\n } else {\r\n this.checked = val ? true : false;\r\n }\r\n }\r\n @Output() _ngModelChange = new EventEmitter();\r\n\r\n checked = false;\r\n\r\n ngOnInit(): void {\r\n if (this.controlName && this.formData?.controls[this.controlName]) {\r\n if (this.valueType === 'boolean') {\r\n this.checked = this.formData.controls[this.controlName].getRawValue();\r\n console.log(this.checked);\r\n } else if (this.valueType === 'number') {\r\n this.checked = this.formData.controls[this.controlName].getRawValue() === 1;\r\n } else {\r\n this.checked = this.formData.controls[this.controlName].getRawValue() === 'Y';\r\n }\r\n\r\n this.formData.controls[this.controlName].valueChanges.subscribe((x) => {\r\n if (this.valueType === 'boolean') {\r\n this.checked = x;\r\n } else if (this.valueType === 'number') {\r\n this.checked = x === 1;\r\n } else {\r\n this.checked = x === 'Y';\r\n }\r\n });\r\n }\r\n }\r\n\r\n onCheckChange(event: boolean) {\r\n if (this.controlName) {\r\n if (this.valueType == 'boolean') {\r\n this.formData.controls[this.controlName].setValue(event);\r\n } else if (this.valueType == 'number') {\r\n this.formData.controls[this.controlName].setValue(event ? 1 : 0);\r\n } else if (this.valueType == 'string') {\r\n this.formData.controls[this.controlName].setValue(event ? 'Y' : 'N');\r\n }\r\n } else {\r\n if (this.valueType == 'boolean') {\r\n this._ngModelChange.emit(event);\r\n } else if (this.valueType == 'number') {\r\n this._ngModelChange.emit(event ? 1 : 0);\r\n } else if (this.valueType == 'string') {\r\n this._ngModelChange.emit(event ? 'Y' : 'N');\r\n }\r\n }\r\n }\r\n}\r\n","@if (label) {\r\n <div nz-row>\r\n <div nz-col [nzSpan]=\"!labelFlex ? labelSpan : null\" [nzFlex]=\"labelFlex\"></div>\r\n <div nz-col nzFlex=\"auto\">\r\n <label\r\n style=\"position: relative; top: 5px\"\r\n nz-checkbox\r\n [nzDisabled]=\"disabled\"\r\n [(nzChecked)]=\"checked\"\r\n (nzCheckedChange)=\"onCheckChange($event)\"\r\n >\r\n {{ label }}\r\n </label>\r\n </div>\r\n </div>\r\n} @else {\r\n <label\r\n nz-checkbox\r\n [nzDisabled]=\"disabled\"\r\n [(nzChecked)]=\"checked\"\r\n (nzCheckedChange)=\"onCheckChange($event)\"\r\n style=\"width: 16px\"\r\n >\r\n {{ label }}\r\n </label>\r\n}\r\n","export class DateTimeHelper {\r\n static lstDay = Array.from({ length: 31 }, (_, i) => i + 1);\r\n static lstMonth = Array.from({ length: 12 }, (_, i) => i + 1);\r\n\r\n private static fromYear = new Date().getFullYear() - 10;\r\n private static toYear = new Date().getFullYear();\r\n static lstYear = Array.from(\r\n { length: DateTimeHelper.toYear - DateTimeHelper.fromYear },\r\n (_, i) => DateTimeHelper.toYear - i,\r\n );\r\n\r\n /**\r\n * Lấy ngày giờ hiện tại dưới dạng chuỗi \"YYYY-MM-DD HH:mm:ss\"\r\n * @return {string}\r\n */\r\n static now(): string {\r\n const now = new Date();\r\n return `${now.getFullYear()}-${this.pad(now.getMonth() + 1)}-${this.pad(now.getDate())} ${this.pad(now.getHours())}:${this.pad(now.getMinutes())}:${this.pad(now.getSeconds())}`;\r\n }\r\n\r\n /**\r\n * Lấy ngày hôm nay dưới dạng chuỗi \"YYYY-MM-DD HH:mm:ss\"\r\n * @return {string}\r\n */\r\n static today(): string {\r\n const now = new Date();\r\n return `${now.getFullYear()}-${this.pad(now.getMonth() + 1)}-${this.pad(now.getDate())} 00:00:00`;\r\n }\r\n\r\n /**\r\n * Tạo ngày từ năm, tháng, ngày (có kiểm tra hợp lệ, không bị lệch múi giờ).\r\n * @param {number} year Năm\r\n * @param {number} month Tháng (1-12)\r\n * @param {number} day Ngày (1-31)\r\n * @param {boolean} isEndOfDay Nếu true, trả về 23:59:59, ngược lại 00:00:00\r\n * @return {string | null} Chuỗi ngày định dạng \"YYYY-MM-DD HH:mm:ss\" hoặc null nếu ngày không hợp lệ\r\n */\r\n static createDate(year: number, month: number, day: number, isEndOfDay: boolean = false): string | null {\r\n if (!this.isValidDate(year, month, day)) {\r\n return null;\r\n }\r\n\r\n const hour = isEndOfDay ? 23 : 0;\r\n const minute = isEndOfDay ? 59 : 0;\r\n const second = isEndOfDay ? 59 : 0;\r\n return `${year}-${this.pad(month)}-${this.pad(day)} ${this.pad(hour)}:${this.pad(minute)}:${this.pad(second)}`;\r\n }\r\n\r\n /**\r\n * Kiểm tra xem ngày có hợp lệ không.\r\n * @param {number} year Năm\r\n * @param {number} month Tháng (1-12)\r\n * @param {number} day Ngày (1-31)\r\n * @return {boolean} True nếu ngày hợp lệ, ngược lại False.\r\n */\r\n public static isValidDate(year: number, month: number, day: number): boolean {\r\n if (month < 1 || month > 12) return false;\r\n if (day < 1) return false;\r\n\r\n const lastDay = new Date(year, month, 0).getDate(); // Lấy ngày cuối tháng\r\n return day <= lastDay;\r\n }\r\n\r\n /**\r\n * Hàm hỗ trợ: Định dạng số thành 2 chữ số (01, 02, ..., 09)\r\n * @param {number} n The second number.\r\n * @return {string} The sum of the two numbers.\r\n */\r\n private static pad(n: number): string {\r\n return n.toString().padStart(2, '0');\r\n }\r\n\r\n public static parser(dateStr: string) {\r\n if (!dateStr) return '';\r\n\r\n dateStr = dateStr.trim();\r\n let timeStr = '00:00'; // Mặc định giờ/phút nếu người dùng không nhập\r\n let datePart = dateStr;\r\n\r\n // 1. Tách phần Giờ và phần Ngày nếu chuỗi có chứa khoảng trắng\r\n if (dateStr.includes(' ')) {\r\n const splitBySpace = dateStr.split(' ');\r\n\r\n // Tìm xem phần nào chứa ':' (giờ) và phần nào chứa '/' (ngày) hoặc số\r\n const hasTime = splitBySpace.find((s) => s.includes(':'));\r\n const hasDate = splitBySpace.find((s) => !s.includes(':'));\r\n\r\n if (hasTime) timeStr = hasTime;\r\n if (hasDate) datePart = hasDate;\r\n }\r\n\r\n // 2. Xử lý DatePart (Logic cũ của bạn)\r\n if (!datePart.includes('/')) {\r\n datePart = this.formatNumberToDate(datePart);\r\n }\r\n\r\n const parts = datePart.split('/');\r\n const current = new Date();\r\n let normalizedValue = '';\r\n\r\n if (parts.length === 1 && /^\\d{1,2}$/.test(parts[0])) {\r\n // Chỉ có ngày -> ghép tháng/năm hiện tại\r\n normalizedValue = `${parts[0].padStart(2, '0')}/${(current.getMonth() + 1).toString().padStart(2, '0')}/${current.getFullYear()}`;\r\n } else if (parts.length === 2 && /^\\d{1,2}$/.test(parts[0]) && /^\\d{1,2}$/.test(parts[1])) {\r\n // Có ngày + tháng -> ghép năm hiện tại\r\n normalizedValue = `${parts[0].padStart(2, '0')}/${parts[1].padStart(2, '0')}/${current.getFullYear()}`;\r\n } else {\r\n // Đã đủ 3 phần\r\n normalizedValue = datePart;\r\n }\r\n\r\n // 3. Xử lý TimePart & Parse thành Date\r\n if (normalizedValue) {\r\n const dateParts = normalizedValue.split('/');\r\n const day = +dateParts[0];\r\n const month = +dateParts[1];\r\n const year = +dateParts[2];\r\n\r\n let hours = 0;\r\n let minutes = 0;\r\n\r\n if (timeStr.includes(':')) {\r\n const timeParts = timeStr.split(':');\r\n hours = +timeParts[0] || 0;\r\n minutes = +timeParts[1] || 0;\r\n }\r\n\r\n // Giả định DateTimeHelper.isValidDate của bạn vẫn chỉ check valid ngày/tháng/năm\r\n if (DateTimeHelper.isValidDate(year, month, day)) {\r\n // Lưu ý: Nếu DateTimeHelper.createDate của bạn chưa hỗ trợ truyền hours/minutes,\r\n // bạn có thể trả về trực tiếp new Date() như sau:\r\n return new Date(year, month - 1, day, hours, minutes);\r\n\r\n // Hoặc nếu bạn nâng cấp hàm createDate:\r\n // return DateTimeHelper.createDate(year, month, day, hours, minutes);\r\n }\r\n }\r\n\r\n return '';\r\n }\r\n\r\n // dd/mm/yyyy\r\n private static formatNumberToDate(input: string): string {\r\n // Lấy tối đa 8 ký tự\r\n input = input.replace(/\\D/g, '').substring(0, 8);\r\n\r\n const day = input.substring(0, 2);\r\n const month = input.substring(2, 4);\r\n const year = input.substring(4, 8);\r\n\r\n let result = '';\r\n\r\n if (day) {\r\n result += day;\r\n if (month) result += '/';\r\n }\r\n\r\n if (month) {\r\n result += month;\r\n if (year) result += '/';\r\n }\r\n\r\n if (year) {\r\n result += year;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n static firstDayOfMonth(date: Date = new Date()): Date {\r\n return new Date(date.getFullYear(), date.getMonth(), 1);\r\n }\r\n\r\n static lastDayOfMonth(date: Date = new Date()): Date {\r\n return new Date(date.getFullYear(), date.getMonth() + 1, 0);\r\n }\r\n\r\n static firstDayOfNextMonth(date: Date = new Date()): Date {\r\n return new Date(date.getFullYear(), date.getMonth() + 1, 1);\r\n }\r\n\r\n static compare(date1?: any, date2?: any): boolean {\r\n if (!date1 || !date2) return false;\r\n\r\n if (typeof date1 === 'string') date1 = date1.replaceAll('-', '/');\r\n if (typeof date2 === 'string') date2 = date2.replaceAll('-', '/');\r\n\r\n const d1 = new Date(date1);\r\n const d2 = new Date(date2);\r\n\r\n if (isNaN(d1.getTime()) || isNaN(d2.getTime())) {\r\n return false;\r\n }\r\n\r\n return d1.getTime() === d2.getTime();\r\n }\r\n\r\n /**\r\n * date1 - date2\r\n * @param date1\r\n * @param date2\r\n * @param unit\r\n * @returns\r\n */\r\n static dateDiff(date1?: any, date2?: any, unit: 'day' | 'hour' | 'minute' | 'second' = 'day'): number {\r\n // 1. Kiểm tra tham số đầu vào\r\n if (!date1 || !date2) {\r\n return NaN;\r\n }\r\n\r\n const d1 = new Date(date1);\r\n const d2 = new Date(date2);\r\n\r\n if (isNaN(d1.getTime()) || isNaN(d2.getTime())) {\r\n throw new Error('Tham số ngày không hợp lệ (Invalid Date)');\r\n }\r\n\r\n // 2. Tính chênh lệch mili-giây mặc định (date1 - date2)\r\n let diffMs = d1.getTime() - d2.getTime();\r\n\r\n // 3. Xử lý chuẩn hóa riêng cho \"ngày\" để tránh sai lệch múi giờ\r\n if (unit === 'day') {\r\n const utc1 = Date.UTC(d1.getFullYear(), d1.getMonth(), d1.getDate());\r\n const utc2 = Date.UTC(d2.getFullYear(), d2.getMonth(), d2.getDate());\r\n diffMs = utc1 - utc2;\r\n }\r\n\r\n // 4. Các hằng số quy đổi từ mili-giây\r\n const MS_PER_SECOND = 1000;\r\n const MS_PER_MINUTE = MS_PER_SECOND * 60;\r\n const MS_PER_HOUR = MS_PER_MINUTE * 60;\r\n const MS_PER_DAY = MS_PER_HOUR * 24;\r\n\r\n // 5. Tính toán và trả về kết quả dựa trên unit\r\n // Sử dụng Math.trunc() thay vì Math.floor() để giữ đúng phần nguyên trong trường hợp kết quả âm\r\n switch (unit) {\r\n case 'day':\r\n return Math.trunc(diffMs / MS_PER_DAY);\r\n case 'hour':\r\n return Math.trunc(diffMs / MS_PER_HOUR);\r\n case 'minute':\r\n return Math.trunc(diffMs / MS_PER_MINUTE);\r\n case 'second':\r\n return Math.trunc(diffMs / MS_PER_SECOND);\r\n default:\r\n throw new Error(\"Đơn vị tính không hợp lệ. Vui lòng dùng 'day', 'hour', 'minute', hoặc 'second'.\");\r\n }\r\n }\r\n\r\n static lstDate(from: Date, to: Date) {\r\n if (!from || !to) {\r\n return [];\r\n }\r\n\r\n const lstNgay: Date[] = [];\r\n\r\n const startDate = new Date(from);\r\n const endDate = new Date(to);\r\n\r\n startDate.setHours(0, 0, 0, 0);\r\n endDate.setHours(0, 0, 0, 0);\r\n\r\n const currentDate = new Date(startDate);\r\n\r\n while (currentDate <= endDate) {\r\n lstNgay.push(new Date(currentDate));\r\n currentDate.setDate(currentDate.getDate() + 1);\r\n }\r\n\r\n return lstNgay;\r\n }\r\n}\r\n","import { Directive, HostListener, Input, AfterViewInit, OnDestroy, ElementRef, Optional, Self } from '@angular/core';\r\nimport { NgControl } from '@angular/forms';\r\nimport { parse, isValid } from 'date-fns';\r\nimport { DateTimeHelper } from '../helper/date.helper';\r\n\r\n/**\r\n * Dùng cho nz-date-picker\r\n */\r\n@Directive({\r\n selector: 'nz-date-picker',\r\n})\r\nexport class DateInputParserDirective implements AfterViewInit, OnDestroy {\r\n @Input('nzFormat') format = 'dd/MM/yyyy';\r\n\r\n private inputElement: HTMLInputElement | null = null;\r\n private blurHandler = this.tryParseAndSet.bind(this);\r\n\r\n constructor(\r\n private el: ElementRef<HTMLElement>,\r\n @Optional() @Self() private ngControl: NgControl,\r\n ) {}\r\n\r\n ngAfterViewInit() {\r\n this.inputElement = this.el.nativeElement.querySelector('input');\r\n if (this.inputElement) {\r\n this.inputElement.addEventListener('blur', this.blurHandler);\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.inputElement) {\r\n this.inputElement.removeEventListener('blur', this.blurHandler);\r\n }\r\n }\r\n\r\n @HostListener('keyup.enter')\r\n onEnter() {\r\n this.tryParseAndSet();\r\n this.inputElement?.blur();\r\n }\r\n\r\n private tryParseAndSet() {\r\n if (!this.inputElement) return;\r\n\r\n const rawValue = this.inputElement.value.trim();\r\n if (!rawValue) return;\r\n\r\n // 1. Cố gắng parse bằng date-fns với format truyền vào (ví dụ: 'HH:mm dd/MM/yyyy')\r\n const parsedDate = parse(rawValue, this.format, new Date());\r\n\r\n if (isValid(parsedDate)) {\r\n // Nếu parse thành công theo format -> set value\r\n this.ngControl?.control?.setValue(parsedDate);\r\n } else {\r\n // 2. (Tùy chọn) Fallback lại hàm parser cũ nếu người dùng nhập sai format\r\n // nhưng helper của bạn có khả năng \"đoán\" được\r\n const fallbackParsed = DateTimeHelper.parser(rawValue);\r\n if (fallbackParsed) {\r\n this.ngControl?.control?.setValue(fallbackParsed);\r\n }\r\n }\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { NzDatePickerModule } from 'ng-zorro-antd/date-picker';\r\nimport { NzFormModule } from 'ng-zorro-antd/form';\r\nimport { NzSelectModeType, NzSelectSizeType } from 'ng-zorro-antd/select';\r\nimport { DateInputParserDirective } from '../../directive/date-input-parser.directive';\r\n\r\n@Component({\r\n selector: 'extend-date-picker',\r\n templateUrl: './extend-date-picker.html',\r\n styleUrl: './extend-date-picker.scss',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n NzFormModule,\r\n NzDatePickerModule,\r\n TranslateModule,\r\n DateInputParserDirective,\r\n ],\r\n})\r\nexport class ExtendDatePicker {\r\n @Input() dateFormat = 'dd/MM/yyyy';\r\n @Input() label = '';\r\n @Input() placeHolder = '';\r\n @Input() labelAlign: 'left' | 'right' = 'left';\r\n @Input() floatingLabel = true;\r\n @Input() showTime = false;\r\n\r\n /**\r\n * default = 8\r\n */\r\n @Input() labelSpan = 8;\r\n @Input() labelFlex: string | number | null = null;\r\n @Input() inputFlex: string | number | null = null;\r\n\r\n @Input() disabled = false;\r\n @Input() required = false;\r\n @Input() isSubmited = false;\r\n @Input() noBottom = false;\r\n @Input() selectModeType: NzSelectModeType = 'default';\r\n\r\n @Input() inputWidth = '';\r\n @Input() inputHeight = '';\r\n @Input() borderBottomOnly = false;\r\n @Input() displayInline = false;\r\n @Input() size: NzSelectSizeType = 'default';\r\n @Input() minDate?: Date;\r\n @Input() maxDate?: Date;\r\n\r\n @Input() lstItem: any[] = [];\r\n @Input() displayField: string = '';\r\n @Input() valueField: string = '';\r\n\r\n @Input() formData!: FormGroup;\r\n @Input() controlName!: string;\r\n\r\n @Input() _ngModel: any = null;\r\n @Output() _ngModelChange = new EventEmitter();\r\n\r\n onChange = (_: any) => {};\r\n onTouched = () => {};\r\n\r\n writeValue(obj: any): void {\r\n this._ngModel = obj;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n ngOnInit(): void {}\r\n\r\n onNgModelChange(val: any) {\r\n this._ngModel = val;\r\n this.onChange(val); // Gửi ngược ra form\r\n this.onTouched();\r\n this._ngModelChange.emit(val);\r\n }\r\n\r\n disabledDate = (current: Date): boolean => {\r\n if (!current) return false;\r\n\r\n const min = this.minDate ? new Date(this.minDate) : null;\r\n const max = this.maxDate ? new Date(this.maxDate) : null;\r\n\r\n if (min && current < new Date(min.setHours(0, 0, 0, 0))) return true;\r\n if (max && current > new Date(max.setHours(23, 59, 59, 999))) return true;\r\n\r\n return false;\r\n };\r\n\r\n get errorMessage(): string {\r\n const value = this._ngModel ? new Date(this._ngModel) : null;\r\n\r\n if (!this.isTouched && !value) {\r\n return '';\r\n }\r\n\r\n if (this.required && !value) {\r\n return 'Trường yêu cầu nhập';\r\n }\r\n\r\n if (this.minDate && value && new Date(value) < new Date(this.minDate)) {\r\n return `Ngày không được nhỏ hơn ${this.formatDate(this.minDate)}`;\r\n }\r\n\r\n if (this.maxDate && value && new Date(value) > new Date(this.maxDate)) {\r\n return `Ngày không được lớn hơn ${this.formatDate(this.maxDate)}`;\r\n }\r\n\r\n if (this.isTouched && this.inputErrorMessage) {\r\n return this.inputErrorMessage;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private formatDate(date: Date): string {\r\n const d = new Date(date);\r\n const day = String(d.getDate()).padStart(2, '0');\r\n const month = String(d.getMonth() + 1).padStart(2, '0');\r\n const year = d.getFullYear();\r\n\r\n switch (this.dateFormat) {\r\n case 'dd/MM/yyyy':\r\n return `${day}/${month}/${year}`;\r\n case 'MM/dd/yyyy':\r\n return `${month}/${day}/${year}`;\r\n default:\r\n return d.toLocaleDateString();\r\n }\r\n }\r\n\r\n onBlur() {\r\n this.isTouched = true;\r\n }\r\n\r\n @Input() isTouched: boolean = false;\r\n @Input() inputErrorMessage: string = '';\r\n\r\n @Input() errorMessages: { [key: string]: string } = {\r\n required: 'Trường yêu cầu nhập',\r\n invalidDate: 'Ngày không hợp lệ',\r\n };\r\n\r\n // Gom chung logic kiểm tra lỗi vào customValidateStatus\r\n get customValidateStatus(): string {\r\n // 1. Không hiển thị lỗi nếu chưa thao tác (blur) và form chưa được submit\r\n if (!this.isTouched && !this.isSubmited) {\r\n return '';\r\n }\r\n\r\n // 2. Ưu tiên lỗi truyền trực tiếp từ bên ngoài vào\r\n if (this.inputErrorMessage) {\r\n return this.inputErrorMessage;\r\n }\r\n\r\n // 3. Kiểm tra rỗng -> Map lỗi 'required'\r\n const isEmpty =\r\n this._ngModel === null ||\r\n this._ngModel === undefined ||\r\n this._ngModel === '' ||\r\n (Array.isArray(this._ngModel) && this._ngModel.length === 0);\r\n\r\n if (isEmpty) {\r\n return this.required ? this.errorMessages['required'] || 'Trường yêu cầu nhập' : '';\r\n }\r\n\r\n // 4. Kiểm tra ngày không hợp lệ (Invalid Date) -> Map lỗi 'invalidDate'\r\n let isInvalidDate = false;\r\n if (Array.isArray(this._ngModel)) {\r\n // Trường hợp Range Picker (Mảng)\r\n isInvalidDate = this._ngModel.some((date) => !date || isNaN(new Date(date).getTime()));\r\n } else {\r\n // Trường hợp Date Picker thường\r\n isInvalidDate = isNaN(new Date(this._ngModel).getTime());\r\n }\r\n\r\n if (isInvalidDate) {\r\n return this.errorMessages['invalidDate'] || 'Ngày không hợp lệ';\r\n }\r\n\r\n // 5. Kiểm tra Min Date / Max Date\r\n if (!Array.isArray(this._ngModel)) {\r\n const value = new Date(this._ngModel);\r\n\r\n if (this.minDate && value < new Date(new Date(this.minDate).setHours(0, 0, 0, 0))) {\r\n // Tận dụng errorMessages nếu bạn muốn truyền từ ngoài, nếu không dùng default\r\n return this.errorMessages['minDate'] || `Ngày không được nhỏ hơn ${this.formatDate(this.minDate)}`;\r\n }\r\n\r\n if (this.maxDate && value > new Date(new Date(this.maxDate).setHours(23, 59, 59, 999))) {\r\n // Tận dụng errorMessages nếu bạn muốn truyền từ ngoài, nếu không dùng default\r\n return this.errorMessages['maxDate'] || `Ngày không được lớn hơn ${this.formatDate(this.maxDate)}`;\r\n }\r\n }\r\n\r\n // Nếu vượt qua mọi cửa kiểm tra thì hợp lệ\r\n return '';\r\n }\r\n}\r\n","<div\r\n class=\"extend-date-picker-wrapper\"\r\n [ngClass]=\"[floatingLabel && label ? 'floating-label' : '']\"\r\n [ngStyle]=\"{ display: displayInline ? 'inline' : null }\"\r\n>\r\n @if (controlName) {\r\n <div [formGroup]=\"formData\">\r\n <nz-form-item>\r\n @if (label) {\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n [nzFor]=\"controlName\"\r\n nzNoColon\r\n nzLabelWrap\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n }\r\n <nz-form-control\r\n [nzSpan]=\"label ? (floatingLabel || labelFlex ? null : 24 - labelSpan) : null\"\r\n [nzFlex]=\"inputFlex\"\r\n [ngClass]=\"{ 'full-width': floatingLabel || !label }\"\r\n [nzErrorTip]=\"customValidateStatus\"\r\n [nzValidateStatus]=\"customValidateStatus ? 'error' : ''\"\r\n >\r\n <nz-date-picker\r\n class=\"full-width\"\r\n [nzPlaceHolder]=\"placeHolder || ' '\"\r\n [nzFormat]=\"dateFormat\"\r\n [nzSize]=\"size\"\r\n [formControlName]=\"controlName\"\r\n [nzDisabledDate]=\"disabledDate\"\r\n [nzShowTime]=\"showTime\"\r\n [ngStyle]=\"{\r\n width: inputWidth,\r\n height: inputHeight,\r\n }\"\r\n [ngClass]=\"{\r\n 'border-bottom-only': borderBottomOnly,\r\n }\"\r\n ></nz-date-picker>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n } @else {\r\n <nz-form-item>\r\n @if (label) {\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n nzNoColon\r\n nzLabelWrap\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n }\r\n <nz-form-control\r\n [nzSpan]=\"label ? (floatingLabel || labelFlex ? null : 24 - labelSpan) : null\"\r\n [nzFlex]=\"inputFlex\"\r\n [ngClass]=\"{ 'full-width': floatingLabel || !label }\"\r\n [nzErrorTip]=\"customValidateStatus\"\r\n [nzValidateStatus]=\"customValidateStatus ? 'error' : ''\"\r\n >\r\n <nz-date-picker\r\n class=\"full-width\"\r\n [nzPlaceHolder]=\"placeHolder || ' '\"\r\n [nzFormat]=\"dateFormat\"\r\n [nzSize]=\"size\"\r\n [disabled]=\"disabled\"\r\n [nzDisabledDate]=\"disabledDate\"\r\n [nzShowTime]=\"showTime\"\r\n [ngStyle]=\"{\r\n width: inputWidth,\r\n height: inputHeight,\r\n }\"\r\n [ngClass]=\"{\r\n 'border-bottom-only': borderBottomOnly,\r\n }\"\r\n [(ngModel)]=\"_ngModel\"\r\n (ngModelChange)=\"onNgModelChange($event)\"\r\n (blur)=\"onBlur()\"\r\n ></nz-date-picker>\r\n </nz-form-control>\r\n </nz-form-item>\r\n }\r\n</div>\r\n\r\n<ng-template #dynamicErrorTemplate let-control>\r\n <ng-container *ngFor=\"let error of errorMessages | keyvalue\">\r\n <ng-container *ngIf=\"control.hasError(error.key)\">\r\n {{ error.value }}\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { NzDatePickerModule } from 'ng-zorro-antd/date-picker';\r\nimport { NzFormModule } from 'ng-zorro-antd/form';\r\nimport { NzSelectModeType, NzSelectSizeType } from 'ng-zorro-antd/select';\r\nimport { endOfMonth, endOfWeek, startOfMonth, startOfWeek, subMonths, subWeeks } from 'date-fns';\r\n\r\n@Component({\r\n selector: 'extend-date-range-picker',\r\n templateUrl: './extend-date-range-picker.html',\r\n imports: [CommonModule, FormsModule, ReactiveFormsModule, NzFormModule, NzDatePickerModule, TranslateModule],\r\n})\r\nexport class ExtendDateRangePicker implements OnInit {\r\n @Input() dateFormat = 'dd/MM/yyyy';\r\n @Input() layOutType: 'horizontal' | 'vertical' = 'horizontal';\r\n @Input() label = '';\r\n @Input() placeHolder = '';\r\n @Input() labelAlign: 'left' | 'right' = 'left';\r\n\r\n /**\r\n * default = 8\r\n */\r\n @Input() labelSpan = 8;\r\n @Input() labelFlex: string | number | null = null;\r\n\r\n @Input() disabled = false;\r\n @Input() required = false;\r\n @Input() noBottom = false;\r\n @Input() selectModeType: NzSelectModeType = 'default';\r\n\r\n @Input() inputWidth = '';\r\n @Input() inputHeight = '';\r\n @Input() borderBottomOnly = false;\r\n @Input() displayInline = false;\r\n @Input() size: NzSelectSizeType = 'default';\r\n\r\n @Input() lstItem: any[] = [];\r\n @Input() displayField: string = '';\r\n @Input() valueField: string = '';\r\n\r\n @Input() formData!: FormGroup;\r\n @Input() controlName!: string;\r\n\r\n @Input() date1: Date | null = null;\r\n @Output() date1Change = new EventEmitter();\r\n\r\n @Input() date2: Date | null = null;\r\n @Output() date2Change = new EventEmitter();\r\n\r\n _ngModel: Date[] | undefined;\r\n\r\n today = new Date();\r\n\r\n ranges = {\r\n 'Tuần này': [startOfWeek(this.today, { weekStartsOn: 1 }), endOfWeek(this.today, { weekStartsOn: 1 })],\r\n 'Tuần trước': [\r\n startOfWeek(subWeeks(this.today, 1), { weekStartsOn: 1 }),\r\n endOfWeek(subWeeks(this.today, 1), { weekStartsOn: 1 }),\r\n ],\r\n 'Tháng này': [startOfMonth(this.today), endOfMonth(this.today)],\r\n 'Tháng trước': [startOfMonth(subMonths(this.today, 1)), endOfMonth(subMonths(this.today, 1))],\r\n };\r\n\r\n ngOnInit(): void {\r\n this._ngModel = this.date1 && this.date2 ? [this.date1, this.date2] : undefined;\r\n }\r\n\r\n ngModelChange(value: Date[] | undefined) {\r\n this._ngModel = value;\r\n\r\n if (value && value.length === 2) {\r\n this.date1 = value[0];\r\n this.date2 = value[1];\r\n } else {\r\n this.date1 = null;\r\n this.date2 = null;\r\n }\r\n\r\n this.date1Change.emit(this.date1);\r\n this.date2Change.emit(this.date2);\r\n }\r\n}\r\n","<div class=\"extend-wrapper\" [ngStyle]=\"{ display: displayInline ? 'inline' : null }\">\r\n @if (controlName) {\r\n <!-- <div [formGroup]=\"formData\">\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzSpan]=\"layOutType == 'horizontal' ? labelSpan : null\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n [nzFor]=\"controlName\"\r\n nzNoColon\r\n nzLabelWrap\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n <nz-form-control\r\n [nzSpan]=\"layOutType == 'horizontal' ? inputSpan : null\"\r\n [ngClass]=\"{ 'full-width': layOutType == 'vertical' }\"\r\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\r\n >\r\n <nz-date-picker\r\n class=\"full-width\"\r\n [nzPlaceHolder]=\"placeHolder || ' '\"\r\n [nzFormat]=\"dateFormat\"\r\n [nzSize]=\"size\"\r\n [formControlName]=\"controlName\"\r\n [ngStyle]=\"{\r\n width: inputWidth,\r\n height: inputHeight,\r\n }\"\r\n [ngClass]=\"{\r\n 'border-bottom-only': borderBottomOnly,\r\n }\"\r\n ></nz-date-picker>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div> -->\r\n } @else {\r\n @if (label) {\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzSpan]=\"layOutType == 'horizontal' && !labelFlex ? labelSpan : null\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n [nzFor]=\"controlName\"\r\n nzNoColon\r\n nzLabelWrap\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n <nz-range-picker\r\n [nzSize]=\"size\"\r\n [nzFormat]=\"dateFormat\"\r\n [nzPlaceHolder]=\"['Từ ngày', 'đến ngày']\"\r\n [nzRanges]=\"ranges\"\r\n [ngModel]=\"_ngModel\"\r\n (ngModelChange)=\"ngModelChange($event)\"\r\n ></nz-range-picker>\r\n </nz-form-item>\r\n } @else {\r\n <nz-range-picker\r\n [nzSize]=\"size\"\r\n [nzFormat]=\"dateFormat\"\r\n [nzPlaceHolder]=\"['Từ ngày', 'đến ngày']\"\r\n [ngModel]=\"_ngModel\"\r\n (ngModelChange)=\"ngModelChange($event)\"\r\n ></nz-range-picker>\r\n }\r\n }\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';\r\nimport { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { NzDatePickerModule } from 'ng-zorro-antd/date-picker';\r\nimport { NzFormModule } from 'ng-zorro-antd/form';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzInputNumberComponent, NzInputNumberModule } from 'ng-zorro-antd/input-number';\r\nimport { NzSelectModeType, NzSelectSizeType } from 'ng-zorro-antd/select';\r\n\r\n@Component({\r\n selector: 'extend-input-number',\r\n templateUrl: './extend-input-number.html',\r\n styleUrl: './extend-input-number.scss',\r\n imports: [CommonModule, FormsModule, ReactiveFormsModule, TranslateModule, NzFormModule, NzInputNumberModule],\r\n})\r\nexport class ExtendInputNumber {\r\n @Input() label = '';\r\n @Input() placeHolder: 'off' | '' = '';\r\n @Input() labelAlign: 'left' | 'right' = 'left';\r\n @Input() floatingLabel = true;\r\n @Input() hiddenUpDown = false;\r\n\r\n /**\r\n * default = 8\r\n */\r\n @Input() labelSpan = 8;\r\n @Input() labelFlex: string | number | null = null;\r\n @Input() inputFlex: string | number | null = null;\r\n\r\n @Input() disabled = false;\r\n @Input() required = false;\r\n @Input() noBottom = false;\r\n @Input() size: NzSelectSizeType = 'default';\r\n\r\n @Input() min: number | null = null;\r\n @Input() max: number | null = null;\r\n @Input() precision: number = 0;\r\n\r\n @Input() inputWidth = '';\r\n @Input() inputHeight = '';\r\n @Input() borderBottomOnly = false;\r\n @Input() displayInline = false;\r\n\r\n @Input() isSubmited = false;\r\n\r\n /** separatorType: 'comma' (,) | 'dot' (.) */\r\n @Input() separatorType?: 'comma' | 'dot' | 'blank';\r\n /** defaultSeparatorType: 'comma' (,) | 'dot' (.) */\r\n static defaultSeparatorType: 'comma' | 'dot' = 'dot';\r\n\r\n @Input() formData!: FormGroup;\r\n @Input() controlName!: string;\r\n\r\n @Input() _ngModel: any = null;\r\n @Output() _ngModelChange = new EventEmitter();\r\n\r\n @ViewChild('inputnumber') inputnumber!: NzInputNumberComponent;\r\n\r\n ngOnInit(): void {}\r\n\r\n _onNgModelChange() {\r\n this._ngModelChange.emit(this._ngModel);\r\n }\r\n\r\n @ViewChild('inputElement') inputElement!: ElementRef;\r\n\r\n focus(): void {\r\n this.inputElement?.nativeElement?.focus();\r\n }\r\n\r\n formatterNumber = (value: number): string => {\r\n if (value == null || isNaN(value)) return '';\r\n\r\n if (!this.getSeparatorType()) {\r\n return value.toString();\r\n }\r\n const parts = `${value}`.split('.');\r\n const integerPart = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, this.getSeparatorType() === 'comma' ? ',' : '.');\r\n return parts.length > 1\r\n ? `${integerPart}${this.getSeparatorType() === 'comma' ? '.' : ','}${parts[1]}`\r\n : integerPart;\r\n };\r\n\r\n parserNumber = (value: string): number => {\r\n if (!value) return 0;\r\n\r\n if (!this.getSeparatorType()) {\r\n return parseFloat(value);\r\n }\r\n\r\n // Bỏ ký tự phân cách hàng nghìn\r\n const cleaned = value\r\n .replace(new RegExp(`\\\\${this.getSeparatorType() === 'comma' ? ',' : '.'}`, 'g'), '')\r\n .replace(this.getSeparatorType() === 'comma' ? '.' : ',', '.');\r\n\r\n // Kiểm tra toàn bộ chuỗi có phải là số hợp lệ hay không\r\n if (!/^-?\\d+(\\.\\d+)?$/.test(cleaned)) return NaN;\r\n\r\n const parsed = parseFloat(cleaned);\r\n\r\n // Ép chạy formatter lại\r\n setTimeout(() => {\r\n this.inputnumber.writeValue(parsed);\r\n this._ngModelChange.emit(parsed);\r\n if (this.formData && this.controlName) {\r\n this.formData.controls[this.controlName].setValue(parsed);\r\n }\r\n });\r\n\r\n return parsed;\r\n };\r\n\r\n getSeparatorType() {\r\n if (this.separatorType == 'blank') {\r\n return '';\r\n }\r\n if (this.separatorType) {\r\n return this.separatorType;\r\n }\r\n return ExtendInputNumber.defaultSeparatorType;\r\n }\r\n\r\n get isInvalidNgModel(): boolean {\r\n if (!this.required) return false;\r\n\r\n // Kiểm tra rỗng cho cả trường hợp chuỗi, null, undefined và mảng (multiple)\r\n const isEmpty =\r\n this._ngModel === null ||\r\n this._ngModel === undefined ||\r\n this._ngModel === '' ||\r\n (Array.isArray(this._ngModel) && this._ngModel.length === 0);\r\n\r\n return isEmpty;\r\n }\r\n\r\n get customValidateStatus(): string {\r\n // Sẽ báo đỏ nếu field trống VÀ (component cha đã ấn submit)\r\n if (this.isInvalidNgModel && this.isSubmited) {\r\n return 'error';\r\n }\r\n return '';\r\n }\r\n}\r\n","<div\r\n class=\"extend-input-number-wrapper\"\r\n [ngClass]=\"[floatingLabel && label ? 'floating-label' : '', hiddenUpDown ? 'hidden-up-down' : '']\"\r\n [ngStyle]=\"{ display: displayInline ? 'inline' : null }\"\r\n>\r\n @if (controlName) {\r\n <div [formGroup]=\"formData\">\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n [nzFor]=\"controlName\"\r\n nzNoColon\r\n nzLabelWrap\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n <nz-form-control\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\r\n [nzFlex]=\"inputFlex\"\r\n [ngClass]=\"{ 'full-width': floatingLabel }\"\r\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\r\n >\r\n <nz-input-number\r\n #inputnumber\r\n class=\"full-width\"\r\n [nzSize]=\"size\"\r\n [nzPlaceHolder]=\"placeHolder\"\r\n [nzFormatter]=\"formatterNumber\"\r\n [nzParser]=\"parserNumber\"\r\n [nzPrecision]=\"precision\"\r\n [formControlName]=\"controlName\"\r\n />\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n } @else {\r\n @if (label) {\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n [nzFor]=\"controlName\"\r\n nzNoColon\r\n nzLabelWrap\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n <nz-form-control\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\r\n [nzFlex]=\"inputFlex\"\r\n [ngClass]=\"{ 'full-width': floatingLabel }\"\r\n [nzValidateStatus]=\"customValidateStatus\"\r\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\r\n >\r\n @if (min != null && max != null) {\r\n <nz-input-number\r\n #inputnumber\r\n class=\"full-width\"\r\n [nzSize]=\"size\"\r\n [nzMin]=\"min\"\r\n [nzMax]=\"max\"\r\n [nzPlaceHolder]=\"placeHolder\"\r\n [nzFormatter]=\"formatterNumber\"\r\n [nzParser]=\"parserNumber\"\r\n [nzPrecision]=\"precision\"\r\n [nzDisabled]=\"disabled\"\r\n [ngModel]=\"_ngModel\"\r\n (ngModelChange)=\"_onNgModelChange()\"\r\n />\r\n } @else if (min != null) {\r\n <nz-input-number\r\n #inputnumber\r\n class=\"full-width\"\r\n [nzSize]=\"size\"\r\n [nzMin]=\"min\"\r\n [nzPlaceHolder]=\"placeHolder\"\r\n [nzFormatter]=\"formatterNumber\"\r\n [nzParser]=\"parserNumber\"\r\n [nzPrecision]=\"precision\"\r\n [nzDisabled]=\"disabled\"\r\n [ngModel]=\"_ngModel\"\r\n (ngModelChange)=\"_onNgModelChange()\"\r\n />\r\n } @else if (max != null) {\r\n <nz-input-number\r\n #inputnumber\r\n class=\"full-width\"\r\n [nzSize]=\"size\"\r\n [nzMax]=\"max\"\r\n [nzPlaceHolder]=\"placeHolder\"\r\n [nzFormatter]=\"formatterNumber\"\r\n [nzParser]=\"parserNumber\"\r\n [nzPrecision]=\"precision\"\r\n [nzDisabled]=\"disabled\"\r\n [ngModel]=\"_ngModel\"\r\n (ngModelChange)=\"_onNgModelChange()\"\r\n />\r\n } @else {\r\n <nz-input-number\r\n #inputnumber\r\n class=\"full-width\"\r\n [nzSize]=\"size\"\r\n [nzPlaceHolder]=\"placeHolder\"\r\n [nzFormatter]=\"formatterNumber\"\r\n [nzParser]=\"parserNumber\"\r\n [nzPrecision]=\"precision\"\r\n [nzDisabled]=\"disabled\"\r\n [ngModel]=\"_ngModel\"\r\n (ngModelChange)=\"_onNgModelChange()\"\r\n />\r\n }\r\n </nz-form-control>\r\n </nz-form-item>\r\n } @else {\r\n @if (min != null && max != null) {\r\n <nz-input-number\r\n #inputnumber\r\n class=\"full-width\"\r\n [nzSize]=\"size\"\r\n [nzMin]=\"min\"\r\n [nzMax]=\"max\"\r\n [nzPlaceHolder]=\"placeHolder\"\r\n [nzFormatter]=\"formatterNumber\"\r\n [nzParser]=\"parserNumber\"\r\n [nzPrecision]=\"precision\"\r\n [nzDisabled]=\"disabled\"\r\n [ngModel]=\"_ngModel\"\r\n (ngModelChange)=\"_onNgModelChange()\"\r\n />\r\n } @else if (min != null) {\r\n <nz-input-number\r\n #inputnumber\r\n class=\"full-width\"\r\n [nzSize]=\"size\"\r\n [nzMin]=\"min\"\r\n [nzPlaceHolder]=\"placeHolder\"\r\n [nzFormatter]=\"formatterNumber\"\r\n [nzParser]=\"parserNumber\"\r\n [nzPrecision]=\"precision\"\r\n [nzDisabled]=\"disabled\"\r\n [ngModel]=\"_ngModel\"\r\n (ngModelChange)=\"_onNgModelChange()\"\r\n />\r\n } @else if (max != null) {\r\n <nz-input-number\r\n #inputnumber\r\n class=\"full-width\"\r\n [nzSize]=\"size\"\r\n [nzMax]=\"max\"\r\n [nzPlaceHolder]=\"placeHolder\"\r\n [nzFormatter]=\"formatterNumber\"\r\n [nzParser]=\"parserNumber\"\r\n [nzPrecision]=\"precision\"\r\n [nzDisabled]=\"disabled\"\r\n [ngModel]=\"_ngModel\"\r\n (ngModelChange)=\"_onNgModelChange()\"\r\n />\r\n } @else {\r\n <nz-input-number\r\n #inputnumber\r\n class=\"full-width\"\r\n [nzSize]=\"size\"\r\n [nzPlaceHolder]=\"placeHolder\"\r\n [nzFormatter]=\"formatterNumber\"\r\n [nzParser]=\"parserNumber\"\r\n [nzPrecision]=\"precision\"\r\n [nzDisabled]=\"disabled\"\r\n [ngModel]=\"_ngModel\"\r\n (ngModelChange)=\"_onNgModelChange()\"\r\n [ngStyle]=\"{\r\n width: inputWidth,\r\n height: inputHeight,\r\n border: borderBottomOnly ? 'none' : '',\r\n 'border-bottom': borderBottomOnly ? '1px dashed' : '',\r\n }\"\r\n />\r\n }\r\n }\r\n }\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n Output,\r\n SimpleChanges,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { NzFormModule } from 'ng-zorro-antd/form';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzSelectModeType, NzSelectSizeType } from 'ng-zorro-antd/select';\r\n\r\n@Component({\r\n selector: 'extend-input',\r\n templateUrl: './extend-input.html',\r\n styleUrl: './extend-input.scss',\r\n imports: [CommonModule, FormsModule, ReactiveFormsModule, TranslateModule, NzFormModule, NzInputModule, NzIconModule],\r\n})\r\nexport class ExtendInput implements AfterViewInit, OnChanges {\r\n @Input() label = '';\r\n @Input() floatingLabel = true;\r\n @Input() placeHolder = '';\r\n @Input() labelAlign: 'left' | 'right' = 'left';\r\n @Input() inputClass = '';\r\n\r\n /**\r\n * default = 8\r\n */\r\n @Input() labelSpan = 8;\r\n @Input() labelFlex: string | number | null = null;\r\n @Input() inputFlex: string | number | null = null;\r\n\r\n @Input() allowClear = false;\r\n @Input()\r\n get disabled() {\r\n return this._disabled;\r\n }\r\n set disabled(val: boolean) {\r\n this._disabled = val;\r\n\r\n if (this.formData && this.controlName) {\r\n const control = this.formData.controls[this.controlName];\r\n\r\n if (this._disabled) {\r\n control.disable({ emitEvent: false });\r\n } else {\r\n control.enable({ emitEvent: false }); // <-- bỏ disable\r\n }\r\n }\r\n }\r\n @Input() readOnly = false;\r\n @Input() required = false;\r\n @Input() noBottom = false;\r\n @Input() selectModeType: NzSelectModeType = 'default';\r\n @Input() autocomplete: 'off' | '' = '';\r\n @Input() autofocus = false;\r\n\r\n @Input() inputWidth = '';\r\n @Input() inputHeight = '';\r\n @Input() borderBottomOnly = false;\r\n @Input() displayInline = false;\r\n @Input() size: NzSelectSizeType = 'default';\r\n\r\n @Input() lstItem: any[] = [];\r\n\r\n /**\r\n * Dùng trong word page\r\n */\r\n @Input() displayField: string = '';\r\n @Input() valueField: string = '';\r\n\r\n @Input() formData!: FormGroup;\r\n @Input() controlName!: string;\r\n\r\n @Input() _ngModel: any = null;\r\n @Output() _ngModelChange = new EventEmitter();\r\n\r\n @Output() onclickClearIcon = new EventEmitter();\r\n\r\n @Output() onenter = new EventEmitter();\r\n\r\n @ViewChild('inputElement') inputElement!: ElementRef<HTMLInputElement>;\r\n\r\n @Input() isSubmited = false;\r\n\r\n private _disabled = false;\r\n\r\n ngAfterViewInit(): void {\r\n this.tryFocus();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['autofocus']?.currentValue === true) {\r\n // chờ DOM render xong (tránh lỗi khi *ngIf)\r\n setTimeout(() => this.tryFocus());\r\n }\r\n }\r\n\r\n private tryFocus(): void {\r\n if (this.autofocus && this.inputElement?.nativeElement) {\r\n this.inputElement.nativeElement.focus();\r\n }\r\n }\r\n\r\n _onNgModelChange() {\r\n this._ngModelChange.emit(this._ngModel);\r\n }\r\n\r\n focus(): void {\r\n this.inputElement?.nativeElement?.select();\r\n }\r\n\r\n get isInvalidNgModel(): boolean {\r\n if (!this.required) return false;\r\n\r\n // Kiểm tra rỗng cho cả trường hợp chuỗi, null, undefined và mảng (multiple)\r\n const isEmpty =\r\n this._ngModel === null ||\r\n this._ngModel === undefined ||\r\n this._ngModel === '' ||\r\n (Array.isArray(this._ngModel) && this._ngModel.length === 0);\r\n\r\n return isEmpty;\r\n }\r\n\r\n get customValidateStatus(): string {\r\n // Sẽ báo đỏ nếu field trống VÀ (component cha đã ấn submit)\r\n if (this.isInvalidNgModel && this.isSubmited) {\r\n return 'error';\r\n }\r\n return '';\r\n }\r\n}\r\n","<div\r\n class=\"extend-input-wrapper\"\r\n [ngClass]=\"[floatingLabel && label ? 'floating-label' : '']\"\r\n [ngStyle]=\"{ display: displayInline ? 'inline' : null }\"\r\n>\r\n @if (controlName) {\r\n <div [formGroup]=\"formData\">\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n [nzFor]=\"controlName\"\r\n nzNoColon\r\n nzLabelWrap\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n <nz-form-control\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\r\n [nzFlex]=\"inputFlex\"\r\n [ngClass]=\"{ 'full-width': floatingLabel }\"\r\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\r\n >\r\n <input\r\n #inputElement\r\n nz-input\r\n [nzSize]=\"size\"\r\n [id]=\"controlName\"\r\n [name]=\"controlName\"\r\n [formControlName]=\"controlName\"\r\n [autocomplete]=\"autocomplete\"\r\n [placeholder]=\"placeHolder\"\r\n [ngClass]=\"inputClass\"\r\n (keyup.enter)=\"onenter.emit()\"\r\n />\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n } @else {\r\n @if (label) {\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n [nzFor]=\"controlName\"\r\n nzNoColon\r\n nzLabelWrap\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n <nz-form-control\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\r\n [nzFlex]=\"inputFlex\"\r\n [ngClass]=\"{ 'full-width': floatingLabel }\"\r\n [nzValidateStatus]=\"customValidateStatus\"\r\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\r\n >\r\n <nz-input-group [nzSize]=\"size\" [nzSuffix]=\"allowClear ? clearIcon : undefined\">\r\n <input\r\n #inputElement\r\n nz-input\r\n [nzSize]=\"size\"\r\n [id]=\"controlName\"\r\n [name]=\"controlName\"\r\n [(ngModel)]=\"_ngModel\"\r\n [autocomplete]=\"autocomplete\"\r\n (ngModelChange)=\"_onNgModelChange()\"\r\n [disabled]=\"disabled\"\r\n [readOnly]=\"readOnly\"\r\n [placeholder]=\"placeHolder\"\r\n [ngClass]=\"inputClass\"\r\n (keyup.enter)=\"onenter.emit()\"\r\n />\r\n </nz-input-group>\r\n </nz-form-control>\r\n </nz-form-item>\r\n } @else {\r\n <input\r\n #inputElement\r\n nz-input\r\n [nzSize]=\"size\"\r\n [ngStyle]=\"{\r\n width: inputWidth,\r\n height: inputHeight,\r\n }\"\r\n [id]=\"controlName\"\r\n [name]=\"controlName\"\r\n [(ngModel)]=\"_ngModel\"\r\n (ngModelChange)=\"_onNgModelChange()\"\r\n [autocomplete]=\"autocomplete\"\r\n [disabled]=\"disabled\"\r\n [readOnly]=\"readOnly\"\r\n [placeholder]=\"placeHolder\"\r\n [ngClass]=\"inputClass + ' ' + (borderBottomOnly ? 'border-bottom-only' : '')\"\r\n (keyup.enter)=\"onenter.emit()\"\r\n />\r\n }\r\n }\r\n</div>\r\n\r\n<ng-template #clearIcon>\r\n <i\r\n nz-icon\r\n nzType=\"close-circle\"\r\n nzTheme=\"twotone\"\r\n nzTwotoneColor=\"#999\"\r\n *ngIf=\"_ngModel\"\r\n (click)=\"_ngModel = null; _onNgModelChange(); onclickClearIcon.emit()\"\r\n style=\"cursor: pointer\"\r\n ></i>\r\n</ng-template>\r\n","import { Component, EventEmitter, HostBinding, Input, Output } from '@angular/core';\r\nimport { NzSelectModule, NzSelectSizeType } from 'ng-zorro-antd/select';\r\nimport { FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { NzFormModule } from 'ng-zorro-antd/form';\r\n\r\n@Component({\r\n selector: 'extend-select',\r\n templateUrl: './extend-select.html',\r\n styleUrl: './extend-select.scss',\r\n imports: [CommonModule, FormsModule, ReactiveFormsModule, TranslateModule, NzFormModule, NzSelectModule],\r\n})\r\nexport class ExtendSelectComponent {\r\n @Input() label = '';\r\n @Input() floatingLabel = true;\r\n @Input() placeHolder = '';\r\n @Input() labelAlign: 'left' | 'right' = 'left';\r\n @Input() dropdownMatchSelectWidth = true;\r\n\r\n /**\r\n * default = 8\r\n */\r\n @Input() labelSpan = 8;\r\n @Input() labelFlex: string | number | null = null;\r\n\r\n @Input()\r\n get disabled() {\r\n return this._disabled;\r\n }\r\n set disabled(val: boolean) {\r\n this._disabled = val;\r\n\r\n if (this.formData && this.controlName) {\r\n const control = this.formData.controls[this.controlName];\r\n\r\n if (this._disabled) {\r\n control.disable({ emitEvent: false });\r\n } else {\r\n control.enable({ emitEvent: false }); // <-- bỏ disable\r\n }\r\n }\r\n }\r\n @Input() required = false;\r\n @Input() noBottom = false;\r\n @Input() multiple = false;\r\n @Input() showSelectAll = false;\r\n @Input() maxTagCount = 10;\r\n\r\n @Input() inputWidth = '';\r\n @Input() inputHeight = '';\r\n @Input() borderBottomOnly = false;\r\n\r\n /**\r\n *\r\n */\r\n @Input() displayInline = false;\r\n @Input() size: NzSelectSizeType = 'default';\r\n\r\n @Input() lstItem: any[] = [];\r\n @Input() displayField: string = '';\r\n @Input() displayFields: string[] = [];\r\n\r\n /**\r\n * Không có thì value sẽ là cả object\r\n */\r\n @Input() valueField: string = '';\r\n\r\n @Input() formData!: FormGroup;\r\n @Input() controlName!: string;\r\n\r\n @Input() _ngModel: any = null;\r\n @Output() _ngModelChange = new EventEmitter();\r\n\r\n @Output() itemChange = new EventEmitter();\r\n\r\n @Output() onFocus = new EventEmitter();\r\n\r\n @Input() isSubmited = false;\r\n\r\n @HostBinding('style.--custom-select-height')\r\n get cssHeight() {\r\n return this.inputHeight ? +this.inputHeight.replaceAll('px', '') - 1 + 'px' : null;\r\n }\r\n\r\n private _disabled = false;\r\n\r\n ngOnInit(): void {\r\n if (this.formData && this.controlName) {\r\n this.formData.controls[this.controlName].valueChanges.subscribe((val) => {\r\n this._ngModelChange.emit(val);\r\n this.itemChange.emit(this.lstItem.find((x) => x[this.valueField] == val));\r\n });\r\n\r\n if (this.required) {\r\n this.formData.controls[this.controlName].setValidators(Validators.required);\r\n }\r\n\r\n if (this.disabled) {\r\n this.formData.controls[this.controlName].disable();\r\n }\r\n }\r\n }\r\n\r\n getDisplay(item: any): string {\r\n if (this.displayField) {\r\n return item[this.displayField];\r\n }\r\n\r\n if (this.displayFields?.length) {\r\n const display = this.displayFields\r\n .map((field) => item[field])\r\n .filter((x) => x)\r\n .join(' - ');\r\n return display;\r\n }\r\n\r\n return item;\r\n }\r\n\r\n onSelectChange(val: any) {\r\n if (val instanceof Array && val.find((x) => x == '__all__')) {\r\n const allIds = this.lstItem.map((x) => (this.valueField ? x[this.valueField] : x));\r\n val = allIds;\r\n }\r\n\r\n this._ngModel = val;\r\n this._ngModelChange.emit(val);\r\n\r\n if (this.valueField) {\r\n this.itemChange.emit(this.lstItem.find((x) => x[this.valueField] == val));\r\n }\r\n }\r\n\r\n get isInvalidNgModel(): boolean {\r\n if (!this.required) return false;\r\n\r\n // Kiểm tra rỗng cho cả trường hợp chuỗi, null, undefined và mảng (multiple)\r\n const isEmpty =\r\n this._ngModel === null ||\r\n this._ngModel === undefined ||\r\n this._ngModel === '' ||\r\n (Array.isArray(this._ngModel) && this._ngModel.length === 0);\r\n\r\n return isEmpty;\r\n }\r\n\r\n get customValidateStatus(): string {\r\n // Sẽ báo đỏ nếu field trống VÀ (component cha đã ấn submit)\r\n if (this.isInvalidNgModel && this.isSubmited) {\r\n return 'error';\r\n }\r\n return '';\r\n }\r\n}\r\n","<div\r\n class=\"extend-select-wrapper\"\r\n [ngClass]=\"[floatingLabel && label ? 'floating-label' : '']\"\r\n [ngStyle]=\"{ display: displayInline ? 'inline' : null }\"\r\n>\r\n @if (!multiple) {\r\n @if (controlName) {\r\n <div [formGroup]=\"formData\">\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n nzNoColon\r\n [nzLabelWrap]=\"floatingLabel ? false : true\"\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n <nz-form-control\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\r\n [ngClass]=\"{ 'full-width': floatingLabel }\"\r\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\r\n >\r\n <nz-select\r\n nzShowSearch\r\n nzAllowClear\r\n [nzSize]=\"size\"\r\n [nzAllowClear]=\"true\"\r\n [nzShowSearch]=\"true\"\r\n [nzPlaceHolder]=\"placeHolder\"\r\n [nzDropdownMatchSelectWidth]=\"dropdownMatchSelectWidth\"\r\n [formControlName]=\"controlName\"\r\n (nzFocus)=\"onFocus.emit()\"\r\n >\r\n @if (showSelectAll) {\r\n <nz-option [nzLabel]=\"'-- Chọn tất cả --'\" [nzValue]=\"'__all__'\"></nz-option>\r\n }\r\n @for (item of lstItem; track $index) {\r\n <nz-option [nzLabel]=\"getDisplay(item)\" [nzValue]=\"valueField ? item[valueField] : item\"></nz-option>\r\n }\r\n </nz-select>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n } @else {\r\n @if (label) {\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n nzNoColon\r\n [nzLabelWrap]=\"floatingLabel ? false : true\"\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n <nz-form-control\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\r\n [ngClass]=\"{ 'full-width': floatingLabel }\"\r\n [nzValidateStatus]=\"customValidateStatus\"\r\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\r\n >\r\n <nz-select\r\n nzShowSearch\r\n nzAllowClear\r\n [nzSize]=\"size\"\r\n [nzAllowClear]=\"true\"\r\n [nzShowSearch]=\"true\"\r\n [nzPlaceHolder]=\"placeHolder\"\r\n [nzDropdownMatchSelectWidth]=\"dropdownMatchSelectWidth\"\r\n [ngModel]=\"_ngModel\"\r\n [disabled]=\"disabled\"\r\n (ngModelChange)=\"onSelectChange($event)\"\r\n (nzFocus)=\"onFocus.emit()\"\r\n >\r\n @if (showSelectAll) {\r\n <nz-option [nzLabel]=\"'-- Chọn tất cả --'\" [nzValue]=\"'__all__'\"></nz-option>\r\n }\r\n @for (item of lstItem; track $index) {\r\n <nz-option [nzLabel]=\"getDisplay(item)\" [nzValue]=\"valueField ? item[valueField] : item\"></nz-option>\r\n }\r\n </nz-select>\r\n </nz-form-control>\r\n </nz-form-item>\r\n } @else {\r\n <nz-select\r\n class=\"full-width\"\r\n nzShowSearch\r\n nzAllowClear\r\n [nzSize]=\"size\"\r\n [nzPlaceHolder]=\"placeHolder\"\r\n [nzDropdownMatchSelectWidth]=\"dropdownMatchSelectWidth\"\r\n [ngModel]=\"_ngModel\"\r\n (ngModelChange)=\"onSelectChange($event)\"\r\n (nzFocus)=\"onFocus.emit()\"\r\n [disabled]=\"disabled\"\r\n [ngStyle]=\"{\r\n width: inputWidth,\r\n height: inputHeight,\r\n }\"\r\n [ngClass]=\"{\r\n 'border-bottom-only': borderBottomOnly,\r\n 'custom-height-select': inputHeight ? true : false,\r\n }\"\r\n >\r\n @if (showSelectAll) {\r\n <nz-option [nzLabel]=\"'-- Chọn tất cả --'\" [nzValue]=\"'__all__'\"></nz-option>\r\n }\r\n @for (item of lstItem; track $index) {\r\n <nz-option [nzLabel]=\"getDisplay(item)\" [nzValue]=\"valueField ? item[valueField] : item\"></nz-option>\r\n }\r\n </nz-select>\r\n }\r\n }\r\n } @else {\r\n @if (controlName) {\r\n <div [formGroup]=\"formData\">\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n nzNoColon\r\n [nzLabelWrap]=\"floatingLabel ? false : true\"\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n <nz-form-control\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\r\n [ngClass]=\"{ 'full-width': floatingLabel }\"\r\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\r\n >\r\n <nz-select\r\n nzShowSearch\r\n nzAllowClear\r\n [nzSize]=\"size\"\r\n [nzMode]=\"'multiple'\"\r\n [nzMaxMultipleCount]=\"lstItem.length\"\r\n [nzMaxTagCount]=\"maxTagCount\"\r\n [nzAllowClear]=\"true\"\r\n [nzShowSearch]=\"true\"\r\n [nzPlaceHolder]=\"placeHolder\"\r\n [nzDropdownMatchSelectWidth]=\"dropdownMatchSelectWidth\"\r\n [formControlName]=\"controlName\"\r\n (nzFocus)=\"onFocus.emit()\"\r\n >\r\n @if (showSelectAll) {\r\n <nz-option [nzLabel]=\"'-- Chọn tất cả --'\" [nzValue]=\"'__all__'\"></nz-option>\r\n }\r\n @for (item of lstItem; track $index) {\r\n <nz-option [nzLabel]=\"getDisplay(item)\" [nzValue]=\"valueField ? item[valueField] : item\"></nz-option>\r\n }\r\n </nz-select>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n } @else {\r\n @if (label) {\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n nzNoColon\r\n [nzLabelWrap]=\"floatingLabel ? false : true\"\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n <nz-form-control\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\r\n [ngClass]=\"{ 'full-width': floatingLabel }\"\r\n [nzValidateStatus]=\"customValidateStatus\"\r\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\r\n >\r\n <nz-select\r\n nzShowSearch\r\n nzAllowClear\r\n [nzSize]=\"size\"\r\n [nzMode]=\"'multiple'\"\r\n [nzMaxMultipleCount]=\"lstItem.length\"\r\n [nzMaxTagCount]=\"maxTagCount\"\r\n [nzAllowClear]=\"true\"\r\n [nzShowSearch]=\"true\"\r\n [nzPlaceHolder]=\"placeHolder\"\r\n [nzDropdownMatchSelectWidth]=\"dropdownMatchSelectWidth\"\r\n [ngModel]=\"_ngModel\"\r\n [disabled]=\"disabled\"\r\n (ngModelChange)=\"onSelectChange($event)\"\r\n (nzFocus)=\"onFocus.emit()\"\r\n >\r\n @if (showSelectAll) {\r\n <nz-option [nzLabel]=\"'-- Chọn tất cả --'\" [nzValue]=\"'__all__'\"></nz-option>\r\n }\r\n @for (item of lstItem; track $index) {\r\n <nz-option [nzLabel]=\"getDisplay(item)\" [nzValue]=\"valueField ? item[valueField] : item\"></nz-option>\r\n }\r\n </nz-select>\r\n </nz-form-control>\r\n </nz-form-item>\r\n } @else {\r\n <nz-select\r\n class=\"full-width\"\r\n nzShowSearch\r\n nzAllowClear\r\n [nzSize]=\"size\"\r\n [nzPlaceHolder]=\"placeHolder\"\r\n [nzMode]=\"'multiple'\"\r\n [nzMaxMultipleCount]=\"lstItem.length\"\r\n [nzMaxTagCount]=\"maxTagCount\"\r\n [nzDropdownMatchSelectWidth]=\"dropdownMatchSelectWidth\"\r\n [ngModel]=\"_ngModel\"\r\n [disabled]=\"disabled\"\r\n (ngModelChange)=\"onSelectChange($event)\"\r\n (nzFocus)=\"onFocus.emit()\"\r\n >\r\n @if (showSelectAll) {\r\n <nz-option [nzLabel]=\"'-- Chọn tất cả --'\" [nzValue]=\"'__all__'\"></nz-option>\r\n }\r\n @for (item of lstItem; track $index) {\r\n <nz-option [nzLabel]=\"getDisplay(item)\" [nzValue]=\"valueField ? item[valueField] : item\"></nz-option>\r\n }\r\n </nz-select>\r\n }\r\n }\r\n }\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { NzDatePickerModule } from 'ng-zorro-antd/date-picker';\r\nimport { NzFormModule } from 'ng-zorro-antd/form';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzSelectModeType, NzSelectSizeType } from 'ng-zorro-antd/select';\r\n\r\n@Component({\r\n selector: 'extend-textarea',\r\n templateUrl: './extend-textarea.html',\r\n styleUrl: './extend-textarea.scss',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n NzFormModule,\r\n NzDatePickerModule,\r\n TranslateModule,\r\n NzInputModule,\r\n ],\r\n})\r\nexport class ExtendTextArea implements AfterViewInit {\r\n @Input() label = '';\r\n @Input() placeHolder = '';\r\n @Input() labelAlign: 'left' | 'right' = 'left';\r\n @Input() floatingLabel = true;\r\n @Input() displayInline = false;\r\n\r\n /**\r\n * default = 8\r\n */\r\n @Input() labelSpan = 8;\r\n @Input() labelFlex: string | number | null = null;\r\n @Input() inputFlex: string | number | null = null;\r\n\r\n @Input() disabled = false;\r\n @Input() required = false;\r\n @Input() noBottom = false;\r\n @Input() selectModeType: NzSelectModeType = 'default';\r\n @Input() inputClass = '';\r\n @Input() size: NzSelectSizeType = 'default';\r\n\r\n @Input() isSubmited = false;\r\n\r\n @Input() minRows = 3;\r\n @Input() maxRows = 5;\r\n\r\n @Input() lstItem: any[] = [];\r\n @Input() displayField: string = '';\r\n @Input() valueField: string = '';\r\n\r\n @Input() formData!: FormGroup;\r\n @Input() controlName!: string;\r\n\r\n @Input() _ngModel: any = null;\r\n @Output() _ngModelChange = new EventEmitter();\r\n\r\n // Thêm các Input cho việc xử lý lỗi\r\n @Input() isTouched: boolean = false;\r\n @Input() inputErrorMessage: string = '';\r\n\r\n @Input() errorMessages: { [key: string]: string } = {\r\n required: 'Trường yêu cầu nhập',\r\n };\r\n\r\n ngAfterViewInit(): void {}\r\n\r\n onChange() {\r\n this._ngModelChange.emit(this._ngModel);\r\n }\r\n\r\n // Bắt sự kiện blur (người dùng chạm vào ô textarea rồi trỏ ra ngoài)\r\n onBlur() {\r\n this.isTouched = true;\r\n }\r\n\r\n // Gom chung logic hiển thị lỗi cho ngModel\r\n get customValidateStatus(): string {\r\n // 1. Nếu chưa thao tác và chưa ấn submit form thì không hiện lỗi\r\n if (!this.isTouched && !this.isSubmited) {\r\n return '';\r\n }\r\n\r\n // 2. Ưu tiên lỗi ép từ bên ngoài vào (nếu có)\r\n if (this.inputErrorMessage) {\r\n return this.inputErrorMessage;\r\n }\r\n\r\n // 3. Kiểm tra rỗng\r\n // Dùng String(...).trim() để tránh trường hợp người dùng nhập toàn dấu cách (space)\r\n const isEmpty =\r\n this._ngModel === null ||\r\n this._ngModel === undefined ||\r\n String(this._ngModel).trim() === '' ||\r\n (Array.isArray(this._ngModel) && this._ngModel.length === 0);\r\n\r\n if (isEmpty) {\r\n return this.required ? this.errorMessages['required'] || 'Trường yêu cầu nhập' : '';\r\n }\r\n\r\n // Nếu hợp lệ\r\n return '';\r\n }\r\n}\r\n","<div\r\n class=\"extend-textarea-wrapper\"\r\n [ngClass]=\"[floatingLabel && label ? 'floating-label' : '']\"\r\n [ngStyle]=\"{ display: displayInline ? 'inline' : null }\"\r\n>\r\n @if (controlName) {\r\n <div [formGroup]=\"formData\">\r\n <nz-form-item>\r\n @if (label) {\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n [nzFor]=\"controlName\"\r\n nzNoColon\r\n nzLabelWrap\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n }\r\n <nz-form-control\r\n [nzSpan]=\"label ? (floatingLabel || labelFlex ? null : 24 - labelSpan) : null\"\r\n [nzFlex]=\"inputFlex\"\r\n [ngClass]=\"{ 'full-width': floatingLabel || !label }\"\r\n [nzErrorTip]=\"dynamicErrorTemplate\"\r\n >\r\n <textarea\r\n nz-input\r\n [nzAutosize]=\"{ minRows: minRows || 3, maxRows: maxRows || 5 }\"\r\n [formControlName]=\"controlName\"\r\n [ngClass]=\"inputClass\"\r\n [nzSize]=\"size\"\r\n ></textarea>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <ng-template #dynamicErrorTemplate let-control>\r\n <ng-container *ngFor=\"let error of errorMessages | keyvalue\">\r\n <ng-container *ngIf=\"control.hasError(error.key)\">\r\n {{ error.value }}\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n } @else {\r\n <nz-form-item>\r\n @if (label) {\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n nzNoColon\r\n nzLabelWrap\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n }\r\n <nz-form-control\r\n [nzSpan]=\"label ? (floatingLabel || labelFlex ? null : 24 - labelSpan) : null\"\r\n [nzFlex]=\"inputFlex\"\r\n [ngClass]=\"{ 'full-width': floatingLabel || !label }\"\r\n [nzErrorTip]=\"customValidateStatus\"\r\n [nzValidateStatus]=\"customValidateStatus ? 'error' : ''\"\r\n >\r\n <textarea\r\n nz-input\r\n [nzAutosize]=\"{ minRows: minRows || 3, maxRows: maxRows || 5 }\"\r\n [(ngModel)]=\"_ngModel\"\r\n (ngModelChange)=\"onChange()\"\r\n (blur)=\"onBlur()\"\r\n [disabled]=\"disabled\"\r\n [ngClass]=\"inputClass\"\r\n [nzSize]=\"size\"\r\n ></textarea>\r\n </nz-form-control>\r\n </nz-form-item>\r\n }\r\n</div>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'highlight',\r\n})\r\nexport class HighlightPipe implements PipeTransform {\r\n transform(value: string | null, search: string): any {\r\n // if (!search || search.length < 3 || !value) return value;\r\n if (!search || !value) return value;\r\n\r\n const pattern = search.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\r\n const regex = new RegExp(pattern, 'gi');\r\n\r\n return value.toString().replace(regex, (match) => `<span class=\"highlight\">${match}</span>`);\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { CommonService } from './api-service/common.service';\r\nimport { HTTPService } from './api-service/http.service';\r\n\r\nexport const URLs = {\r\n getById: '/api/App_Dic_Domain/GetById',\r\n getAll: '/api/App_Dic_Domain/GetAll',\r\n getList: '/api/App_Dic_Domain/GetList',\r\n getPaging: '/api/App_Dic_Domain/GetPaging',\r\n addOrEdit: '/api/App_Dic_Domain/AddOrEdit',\r\n delete: '/api/App_Dic_Domain/Delete',\r\n};\r\n\r\nclass App_Dic_Domain {\r\n // #region properties\r\n App_Dic_Domain_Id: string;\r\n App_Org_Id: string;\r\n IsActive: boolean;\r\n CreatedDate: Date;\r\n CreatedUser: string;\r\n UpdatedDate: Date;\r\n UpdatedUser: string;\r\n DomainCode: string;\r\n ItemCode: string;\r\n ItemValue: string;\r\n OrderValue: number;\r\n Description: string;\r\n ChildDomainCode: string;\r\n ParentItemCode: string;\r\n // #endregion properties\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.App_Dic_Domain_Id = obj.App_Dic_Domain_Id || '';\r\n this.App_Org_Id = obj.App_Org_Id || '';\r\n this.App_Org_Id = obj.App_Org_Id || '';\r\n this.IsActive = obj.IsActive || false;\r\n this.CreatedDate = obj.CreatedDate || null;\r\n this.CreatedUser = obj.CreatedUser || '';\r\n this.UpdatedDate = obj.UpdatedDate || null;\r\n this.UpdatedUser = obj.UpdatedUser || '';\r\n this.DomainCode = obj.DomainCode || '';\r\n this.ItemCode = obj.ItemCode || '';\r\n this.ItemValue = obj.ItemValue || '';\r\n this.OrderValue = obj.OrderValue || null;\r\n this.Description = obj.Description || '';\r\n this.ChildDomainCode = obj.ChildDomainCode || '';\r\n this.ParentItemCode = obj.ParentItemCode || '';\r\n }\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DicDomainService extends HTTPService {\r\n cms = inject(CommonService);\r\n\r\n async getByDomain(DomainCode: string): Promise<App_Dic_Domain[]> {\r\n // 1. Nếu đã có dữ liệu trong cache → dùng ngay\r\n const cached = DicDomainService.dataCache.get(DomainCode);\r\n if (cached && cached.length) {\r\n return cached;\r\n }\r\n\r\n // 2. Nếu đang load dữ liệu này → trả về Promise cũ\r\n const loading = DicDomainService.loadingCache.get(DomainCode);\r\n if (loading) {\r\n return loading;\r\n }\r\n\r\n // 3. Nếu chưa load thì bắt đầu load và lưu Promise\r\n const loadPromise = this.loadDomainFromServer(DomainCode);\r\n DicDomainService.loadingCache.set(DomainCode, loadPromise);\r\n\r\n try {\r\n const result = await loadPromise;\r\n DicDomainService.dataCache.set(DomainCode, result);\r\n DicDomainService.loadingCache.delete(DomainCode);\r\n return result;\r\n } catch (err) {\r\n // Nếu lỗi → xoá promise để lần sau gọi lại\r\n DicDomainService.loadingCache.delete(DomainCode);\r\n throw err;\r\n }\r\n }\r\n\r\n clearCache() {\r\n DicDomainService.dataCache = new Map<string, App_Dic_Domain[]>();\r\n DicDomainService.loadingCache = new Map<string, Promise<App_Dic_Domain[]>>();\r\n }\r\n\r\n // Map cache: DomainCode → dữ liệu\r\n private static dataCache = new Map<string, App_Dic_Domain[]>();\r\n\r\n // Map load state: DomainCode → Promise đang tải\r\n private static loadingCache = new Map<string, Promise<App_Dic_Domain[]>>();\r\n\r\n private async loadDomainFromServer(DomainCode: string): Promise<App_Dic_Domain[]> {\r\n const ret = await this.cms.ESP({\r\n SPN: 'App_Dic_Domain_getByDomain',\r\n Params: [DomainCode],\r\n });\r\n return ret.Data || [];\r\n }\r\n}\r\n","import { inject, Pipe, PipeTransform } from '@angular/core';\r\nimport { DicDomainService } from '../services/dic-domain.service';\r\n\r\n@Pipe({\r\n name: 'dicDomain',\r\n})\r\nexport class DicDomainPipe implements PipeTransform {\r\n service = inject(DicDomainService);\r\n\r\n async transform(value: string, domainCode: string): Promise<string> {\r\n if (!value) return '';\r\n\r\n const lstDD = await this.service.getByDomain(domainCode);\r\n\r\n return lstDD.find((x) => x.ItemCode == value)?.ItemValue || value;\r\n }\r\n}\r\n","import { AppGlobals } from './app-global';\r\n\r\nexport interface ApiEndpoint {\r\n apiEndpoint: string;\r\n versionCheck: string;\r\n idleTimeInMinutes: number;\r\n}\r\n\r\nexport interface RespondData {\r\n IsSuccess: boolean;\r\n ErrorMessage: string;\r\n Data: any;\r\n}\r\n\r\nexport interface ESPModel {\r\n SPN: string;\r\n Params?: any[];\r\n}\r\n\r\nexport interface ExportExcelModel extends ESPModel {\r\n FileCode?: string;\r\n TemplateName?: string;\r\n OpenXML?: boolean;\r\n}\r\n\r\nexport interface ExportPdfDocxlModel extends ESPModel {\r\n FileCode?: string;\r\n TemplateName?: string;\r\n}\r\n\r\nexport class PagingModel {\r\n PageIndex: number = 0;\r\n PageSize: number = AppGlobals.pageSizeOptions[1];\r\n}\r\n\r\nexport class GridFilter extends PagingModel {\r\n Keyword: string | null = null;\r\n OrderOption: OrderOption = new OrderOption();\r\n\r\n IsShowMore = false;\r\n}\r\n\r\nexport class OrderOption {\r\n FieldName: string | null = null;\r\n Direction: string | null = null;\r\n}\r\n\r\nexport class PagingData<T = any> {\r\n LstHeader: TableHeader[] = [];\r\n LstItem: T[] = [];\r\n TotalCount = 0;\r\n\r\n constructor(\r\n obj?: any,\r\n private TypeConstructor?: new (data?: any) => T,\r\n ) {\r\n obj = obj ?? {};\r\n\r\n this.LstHeader = obj.LstHeader || [];\r\n this.TotalCount = obj.TotalCount || 0;\r\n\r\n if (Array.isArray(obj.LstItem) && this.TypeConstructor) {\r\n this.LstItem = obj.LstItem.map((item: any) => new this.TypeConstructor!(item));\r\n } else {\r\n this.LstItem = obj.LstItem || [];\r\n }\r\n }\r\n}\r\n\r\nexport class TableHeader {\r\n Code: string = '';\r\n Name: string = '';\r\n Class: string = '';\r\n Type: string = '';\r\n Width: string = '';\r\n MinWidth: string = '';\r\n ShowSort: boolean = false;\r\n SortOrder: 'ascend' | 'descend' = 'ascend';\r\n DomainCode: string = '';\r\n MaxLines: number | null = null;\r\n}\r\n\r\nexport class CheckModel {\r\n ConfirmMessage: string = '';\r\n ConfirmContent: string = '';\r\n ErrorMessage: string = '';\r\n ErrorContent: string = '';\r\n}\r\n\r\nexport class App_Org {\r\n // #region properties\r\n App_Org_Id?: string;\r\n CreatedDate?: Date;\r\n CreatedUser?: string;\r\n UpdatedDate?: Date;\r\n UpdatedUser?: string;\r\n IsActive?: boolean;\r\n Code?: string;\r\n Name?: string;\r\n NameEn?: string;\r\n Type?: string;\r\n Address?: string;\r\n Description?: string;\r\n ParentId?: string;\r\n OrderValue?: number;\r\n // #endregion properties\r\n\r\n TreeNodeName?: string;\r\n LstUserId?: string;\r\n}\r\n","import { AfterViewInit, Component, ElementRef, Input, ViewChild, OnDestroy } from '@angular/core';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\n\r\n@Component({\r\n selector: 'read-more',\r\n templateUrl: './read-more.component.html',\r\n styleUrls: ['./read-more.component.scss'],\r\n imports: [NzIconModule],\r\n})\r\nexport class ReadMoreProComponent implements AfterViewInit, OnDestroy {\r\n @Input() text = '';\r\n @Input() lines = 2;\r\n\r\n @ViewChild('content') content!: ElementRef<HTMLDivElement>;\r\n\r\n expanded = false;\r\n overflow = false;\r\n maxHeight = '0px';\r\n\r\n private ro!: ResizeObserver;\r\n\r\n ngAfterViewInit() {\r\n this.calculateHeight();\r\n\r\n this.ro = new ResizeObserver(() => {\r\n this.calculateHeight();\r\n });\r\n\r\n this.ro.observe(this.content.nativeElement);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.ro?.disconnect();\r\n }\r\n\r\n toggle() {\r\n this.expanded = !this.expanded;\r\n this.calculateHeight();\r\n }\r\n\r\n private calculateHeight() {\r\n const el = this.content.nativeElement;\r\n\r\n const style = getComputedStyle(el);\r\n const lineHeight = parseFloat(style.lineHeight);\r\n\r\n const collapsedHeight = lineHeight * this.lines;\r\n const fullHeight = el.scrollHeight;\r\n\r\n this.overflow = fullHeight > collapsedHeight + 2;\r\n\r\n this.maxHeight = this.expanded ? fullHeight + 'px' : collapsedHeight + 'px';\r\n }\r\n}\r\n","<div class=\"wrapper\">\r\n <div\r\n #content\r\n class=\"content\"\r\n [class.clamp]=\"!expanded && overflow\"\r\n [style.-webkit-line-clamp]=\"!expanded && overflow ? lines : 'none'\"\r\n [style.maxHeight]=\"maxHeight\"\r\n [innerHTML]=\"text\"\r\n ></div>\r\n\r\n @if (overflow) {\r\n <div class=\"toggle-container\" [class.expanded]=\"expanded\">\r\n <span class=\"toggle text-italic\" (click)=\"toggle()\">\r\n {{ expanded ? \"Thu gọn\" : \"Xem thêm\" }}\r\n <nz-icon [nzType]=\"expanded ? 'up' : 'down'\" nzTheme=\"outline\" />\r\n </span>\r\n </div>\r\n }\r\n</div>\r\n","import { Component, Input, Output, EventEmitter, TemplateRef } from '@angular/core';\r\nimport { CommonModule, NgTemplateOutlet } from '@angular/common';\r\nimport { NzTableModule } from 'ng-zorro-antd/table';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { BaseComponent } from '../base.component';\r\nimport { HighlightPipe } from '../../pipe/highlight.pipe';\r\nimport { DicDomainPipe } from '../../pipe/dic-domain.pipe';\r\nimport { GridFilter, PagingData } from '../../../lib/model';\r\nimport { ReadMoreProComponent } from '../../components/read-more/read-more.component';\r\n\r\n@Component({\r\n selector: 'extend-table',\r\n templateUrl: './extend-table.component.html',\r\n styleUrl: './extend-table.component.scss',\r\n imports: [\r\n CommonModule,\r\n NzTableModule,\r\n NzIconModule,\r\n NzButtonModule,\r\n NgTemplateOutlet,\r\n HighlightPipe,\r\n DicDomainPipe,\r\n ReadMoreProComponent,\r\n ],\r\n})\r\nexport class ExtendTableComponent extends BaseComponent {\r\n @Input() data: PagingData = new PagingData();\r\n @Input() filter = new GridFilter();\r\n @Input() isLoading = false;\r\n @Input() idKey = '';\r\n @Input() detailKey = '';\r\n @Input() selectedIdKey?: string;\r\n @Input() scroll?: {\r\n x?: string | null;\r\n y?: string | null;\r\n };\r\n\r\n @Input() actionTemplate?: TemplateRef<{ $implicit: any; index: number }>;\r\n\r\n @Output() filterChange = new EventEmitter<GridFilter>();\r\n @Output() ondblclickrow = new EventEmitter();\r\n\r\n onSortChange(fieldName: string, direction: string | null): void {\r\n this.filter.OrderOption.FieldName = fieldName;\r\n this.filter.OrderOption.Direction = direction || '';\r\n this.filterChange.emit(this.filter);\r\n }\r\n\r\n onPageIndexChange(pageIndex: number): void {\r\n this.filter.PageIndex = pageIndex;\r\n this.filterChange.emit(this.filter);\r\n }\r\n\r\n onPageSizeChange(pageSize: number): void {\r\n this.filter.PageSize = pageSize;\r\n this.filter.PageIndex = 0;\r\n this.filterChange.emit(this.filter);\r\n }\r\n}\r\n","<nz-table\r\n class=\"extend-table\"\r\n [nzData]=\"data.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzLoading]=\"isLoading\"\r\n [nzFrontPagination]=\"false\"\r\n [nzShowPagination]=\"false\"\r\n [nzTotal]=\"data.TotalCount || 0\"\r\n [(nzPageIndex)]=\"filter.PageIndex\"\r\n [(nzPageSize)]=\"filter.PageSize\"\r\n [nzScroll]=\"scroll || {}\"\r\n (nzPageIndexChange)=\"onPageIndexChange($event)\"\r\n (nzPageSizeChange)=\"onPageSizeChange($event)\"\r\n>\r\n <thead>\r\n <tr>\r\n @for (item of data.LstHeader; track $index) {\r\n <th\r\n [nzWidth]=\"item.Width\"\r\n [nzShowSort]=\"item.ShowSort\"\r\n [nzSortOrder]=\"item.SortOrder\"\r\n (nzSortOrderChange)=\"onSortChange(item.Code, $event)\"\r\n >\r\n {{ item.Name }}\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of data.LstItem; track $index; let i = $index) {\r\n <tr\r\n tabindex=\"0\"\r\n class=\"selectable-row\"\r\n [ngClass]=\"selectedIdKey && row[idKey] == selectedIdKey ? 'selected-row' : ''\"\r\n (dblclick)=\"ondblclickrow.emit(row)\"\r\n >\r\n @for (col of data.LstHeader; track $index) {\r\n @if (col.Code === \"NO\") {\r\n <td [class]=\"col.Class\">\r\n {{ i + 1 + filter.PageIndex * filter.PageSize }}\r\n </td>\r\n } @else if (col.Code === \"ACTION\") {\r\n <td [class]=\"col.Class\">\r\n @if (actionTemplate) {\r\n <ng-container *ngTemplateOutlet=\"actionTemplate; context: { $implicit: row, index: i }\"> </ng-container>\r\n }\r\n </td>\r\n } @else if (col.Type === \"CHECKBOX\") {\r\n <td [class]=\"col.Class\">\r\n @if (row[col.Code]) {\r\n <nz-icon nzType=\"check-circle\" nzTheme=\"outline\" class=\"color-primary\" />\r\n }\r\n <!-- @else {\r\n <nz-icon nzType=\"close\" nzTheme=\"outline\" class=\"color-warn\" />\r\n } -->\r\n </td>\r\n } @else if (col.Code == detailKey) {\r\n <td [class]=\"col.Class\">\r\n <span\r\n class=\"link-detail\"\r\n (click)=\"goto(row[idKey])\"\r\n [innerHTML]=\"row[col.Code] | highlight: filter.Keyword || ''\"\r\n ></span>\r\n </td>\r\n } @else {\r\n @if (col.DomainCode) {\r\n <td\r\n [class]=\"col.Class\"\r\n [innerHTML]=\"row[col.Code] | dicDomain: col.DomainCode | async | highlight: filter.Keyword || ''\"\r\n ></td>\r\n } @else if (col.MaxLines) {\r\n <td>\r\n <read-more [text]=\"row[col.Code]\" [lines]=\"col.MaxLines\"></read-more>\r\n </td>\r\n } @else {\r\n <td [class]=\"col.Class\" [innerHTML]=\"row[col.Code] | highlight: filter.Keyword || ''\"></td>\r\n }\r\n }\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n</nz-table>\r\n","import { DecimalPipe } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { NzPaginationModule } from 'ng-zorro-antd/pagination';\r\nimport { GridFilter } from '../../model';\r\nimport { AppGlobals } from '../../app-global';\r\n\r\n@Component({\r\n selector: 'extend-pagination',\r\n templateUrl: './extend-pagination.component.html',\r\n imports: [NzPaginationModule, DecimalPipe],\r\n})\r\nexport class ExtendPaginationComponent {\r\n @Input() totalCount = 0;\r\n @Input() filter = new GridFilter();\r\n\r\n @Output() onQueryParamsChange = new EventEmitter();\r\n\r\n AppGlobals = AppGlobals;\r\n}\r\n","<nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"totalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange.emit({ PageIndex: $event - 1, PageSize: filter.PageSize })\"\r\n (nzPageSizeChange)=\"onQueryParamsChange.emit({ PageIndex: filter.PageIndex, PageSize: $event })\"\r\n>\r\n</nz-pagination>\r\n\r\n<ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n</ng-template>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\n\r\n@Component({\r\n template: `\r\n <h2>Không có quyền truy cập</h2>\r\n <p *ngIf=\"message\">{{ message }}</p>\r\n <p *ngIf=\"deniedUrl\">\r\n Bạn đã cố gắng truy cập: <strong>{{ deniedUrl }}</strong>\r\n </p>\r\n `,\r\n imports: [CommonModule],\r\n})\r\nexport class NoPermission {\r\n deniedUrl: string | null = null;\r\n message: string | null = null;\r\n\r\n constructor(private router: Router) {}\r\n\r\n ngOnInit(): void {\r\n const state = history.state;\r\n\r\n this.deniedUrl = state?.deniedUrl || null;\r\n this.message = state?.message || null;\r\n\r\n console.log('Lấy từ history.state:', state);\r\n }\r\n}\r\n","import { Component, inject, Input, OnInit } from '@angular/core';\r\nimport { NZ_MODAL_DATA } from 'ng-zorro-antd/modal';\r\nimport { NgxExtendedPdfViewerModule } from 'ngx-extended-pdf-viewer';\r\n\r\n@Component({\r\n selector: 'pdf-viewer',\r\n templateUrl: './pdf-viewer.html',\r\n imports: [NgxExtendedPdfViewerModule],\r\n})\r\nexport class PdfViewerComponent implements OnInit {\r\n // data = inject(NZ_MODAL_DATA);\r\n\r\n @Input() dataType: 'base64' | 'bytes' | null = null;\r\n @Input() pdfData: any;\r\n\r\n @Input() showPrintButton = false;\r\n @Input() showDownloadButton = false;\r\n\r\n /** Legal values: undefined, 'auto', 'page-actual', 'page-fit', 'page-width', or '50' (or any other percentage) */\r\n @Input() zoom: string | number | undefined;\r\n @Input() height: string = '75vh';\r\n\r\n ngOnInit(): void {\r\n // this.dataType = this.data.dataType;\r\n // this.pdfData = this.data.pdfData;\r\n // this.showPrintButton = this.data.showPrintButton;\r\n }\r\n\r\n print() {\r\n if (this.dataType == 'base64') {\r\n const byteCharacters = atob(this.pdfData);\r\n const byteNumbers = new Array(byteCharacters.length).fill(0).map((_, i) => byteCharacters.charCodeAt(i));\r\n const byteArray = new Uint8Array(byteNumbers);\r\n const blob = new Blob([byteArray], { type: 'application/pdf' });\r\n\r\n const blobUrl = window.URL.createObjectURL(blob);\r\n const iframe = document.createElement('iframe');\r\n iframe.style.display = 'none';\r\n iframe.src = blobUrl;\r\n document.body.appendChild(iframe);\r\n iframe.contentWindow?.print();\r\n } else if (this.dataType == 'bytes') {\r\n const blob = new Blob([this.pdfData], { type: 'application/pdf' });\r\n\r\n const blobUrl = window.URL.createObjectURL(blob);\r\n const iframe = document.createElement('iframe');\r\n iframe.style.display = 'none';\r\n iframe.src = blobUrl;\r\n document.body.appendChild(iframe);\r\n iframe.contentWindow?.print();\r\n }\r\n }\r\n}\r\n","@if (dataType == \"base64\") {\r\n <ngx-extended-pdf-viewer\r\n [height]=\"height\"\r\n [zoom]=\"zoom || 100\"\r\n [base64Src]=\"this.pdfData\"\r\n [showPrintButton]=\"showPrintButton\"\r\n [showDownloadButton]=\"showDownloadButton\"\r\n [showOpenFileButton]=\"false\"\r\n [showBookModeButton]=\"false\"\r\n [showDrawEditor]=\"false\"\r\n [showTextEditor]=\"false\"\r\n [showDrawEditor]=\"false\"\r\n [showFreeFloatingBar]=\"false\"\r\n [showHighlightEditor]=\"false\"\r\n [showHandToolButton]=\"false\"\r\n [showPresentationModeButton]=\"false\"\r\n [showStampEditor]=\"false\"\r\n ></ngx-extended-pdf-viewer>\r\n}\r\n\r\n@if (dataType == \"bytes\") {\r\n <ngx-extended-pdf-viewer\r\n [height]=\"height\"\r\n [zoom]=\"zoom || 100\"\r\n [src]=\"this.pdfData\"\r\n [showPrintButton]=\"showPrintButton\"\r\n [showDownloadButton]=\"showDownloadButton\"\r\n [showOpenFileButton]=\"false\"\r\n [showBookModeButton]=\"false\"\r\n [showDrawEditor]=\"false\"\r\n [showTextEditor]=\"false\"\r\n [showDrawEditor]=\"false\"\r\n [showFreeFloatingBar]=\"false\"\r\n [showHighlightEditor]=\"false\"\r\n [showHandToolButton]=\"false\"\r\n [showPresentationModeButton]=\"false\"\r\n [showStampEditor]=\"false\"\r\n ></ngx-extended-pdf-viewer>\r\n}\r\n","import { animate, style, transition, trigger } from '@angular/animations';\r\nimport { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\r\nimport { Subscription } from 'rxjs';\r\nimport { LoadingService } from '../../services/loading.service';\r\n\r\n// global-spinner.component.ts\r\n@Component({\r\n selector: 'app-global-spinner',\r\n template: `\r\n @if (visible) {\r\n <div class=\"global-spinner\" [@fadeInOut]>\r\n <nz-spin [nzSpinning]=\"true\" style=\"position: relative; bottom: var(--app-header-height);\"></nz-spin>\r\n </div>\r\n }\r\n `,\r\n styles: [\r\n `\r\n .global-spinner {\r\n position: fixed;\r\n z-index: 1200; /* Lớn hơn z-index của modal (usually ~1000) */\r\n top: var(--app-header-height);\r\n left: 0px;\r\n width: 100vw;\r\n height: 100vh;\r\n background-color: rgba(255, 255, 255, 0.8); /* Optional overlay */\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n }\r\n `,\r\n ],\r\n animations: [\r\n trigger('fadeInOut', [\r\n transition(':enter', [style({ opacity: 0 }), animate('250ms ease-in', style({ opacity: 1 }))]),\r\n transition(':leave', [animate('250ms ease-out', style({ opacity: 0 }))]),\r\n ]),\r\n ],\r\n\r\n imports: [NzSpinModule],\r\n})\r\nexport class GlobalSpinnerComponent implements OnInit, OnDestroy {\r\n visible = false;\r\n private sub!: Subscription;\r\n\r\n constructor(public loadingService: LoadingService) {}\r\n\r\n ngOnInit() {\r\n this.sub = this.loadingService.loading$.subscribe((v) => {\r\n setTimeout(() => {\r\n this.visible = v;\r\n });\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.sub.unsubscribe();\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'height',\r\n template: `<div [ngStyle]=\"{ height: height + 'px' }\"></div>`,\r\n imports: [CommonModule],\r\n})\r\nexport class Height {\r\n @Input() height: number = 0;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'width',\r\n template: `<div style=\"display: inline\" [ngStyle]=\"{ 'padding-left': width + 'px' }\"></div>`,\r\n imports: [CommonModule],\r\n})\r\nexport class Width {\r\n @Input() width: number = 0;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'box',\r\n template: `<div\r\n [ngStyle]=\"{\r\n height: height + 'px',\r\n 'padding-left': width + 'px',\r\n display: display ? display : width && height ? 'block' : height ? 'block' : width ? 'inline' : display,\r\n }\"\r\n ></div>`,\r\n imports: [CommonModule],\r\n})\r\nexport class Box {\r\n @Input() display: 'block' | 'inline' | '' = '';\r\n @Input() width: number = 0;\r\n @Input() height: number = 0;\r\n}\r\n","export const createMinimap = ($mapSource: any) => {\r\n // console.log('begin createMinimap');\r\n\r\n for (var $child of document.getElementsByClassName('minimap')) {\r\n $child.remove();\r\n }\r\n\r\n var x: any, y: any, l: any, t: any, w: any, h: any;\r\n var $window = window;\r\n var $body = document.getElementsByTagName('body')[0];\r\n var $minimap = document.createElement('div');\r\n $minimap.classList.add('minimap');\r\n $body.append($minimap);\r\n\r\n var minimapWidth = $minimap.clientWidth;\r\n var minimapHeight = $minimap.clientHeight;\r\n var $viewport = document.createElement('div');\r\n $viewport.classList.add('minimap-viewport');\r\n $minimap.append($viewport);\r\n\r\n const synchronize = () => {\r\n var dims = [$mapSource.clientWidth, $mapSource.clientHeight];\r\n var scroll = [$mapSource.scrollLeft, $mapSource.scrollTop];\r\n\r\n var scaleX = minimapWidth / $mapSource.scrollWidth;\r\n var scaleY = minimapHeight / $mapSource.scrollHeight;\r\n\r\n var lW = dims[0] * scaleX;\r\n var lH = dims[1] * scaleY;\r\n var lX = scroll[0] * scaleX;\r\n var lY = scroll[1] * scaleY;\r\n\r\n w = Math.round(lW);\r\n h = Math.round(lH);\r\n l = Math.round(lX);\r\n t = Math.round(lY);\r\n //set the mini viewport dimesions\r\n redraw();\r\n };\r\n\r\n const redraw = () => {\r\n $viewport.style.width = `${Math.round(w)}px`;\r\n $viewport.style.height = `${Math.round(h)}px`;\r\n $viewport.style.left = `${Math.round(l)}px`;\r\n $viewport.style.top = `${Math.round(t)}px`;\r\n };\r\n\r\n const init = () => {\r\n // console.log('minimap init');\r\n\r\n for (var $child of $mapSource.getElementsByClassName('workflow-node')) {\r\n if ($child.classList.contains('workflow-node-start') || $child.classList.contains('workflow-node-end')) {\r\n var mini = document.createElement('div');\r\n mini.classList.add('minimap-node-round');\r\n if ($child.classList.contains('workflow-node-start')) {\r\n mini.classList.add('minimap-node-round-start');\r\n }\r\n if ($child.classList.contains('workflow-node-end')) {\r\n mini.classList.add('minimap-node-round-end');\r\n }\r\n $minimap.append(mini);\r\n\r\n var ratioX = minimapWidth / $mapSource.scrollWidth;\r\n var ratioY = minimapHeight / $mapSource.scrollHeight;\r\n\r\n var xM = ($child.offsetLeft + $mapSource.offsetLeft) * ratioX;\r\n var yM = ($child.offsetTop + $mapSource.offsetTop) * ratioY;\r\n\r\n mini.style.width = `5px`;\r\n mini.style.height = `5px`;\r\n mini.style.left = `${Math.round(xM)}px`;\r\n mini.style.top = `${Math.round(yM)}px`;\r\n } else {\r\n var mini = document.createElement('div');\r\n mini.classList.add('minimap-node');\r\n $minimap.append(mini);\r\n var ratioX = minimapWidth / $mapSource.scrollWidth;\r\n var ratioY = minimapHeight / $mapSource.scrollHeight;\r\n\r\n var wM = $child.clientWidth * ratioX;\r\n var hM = $child.clientHeight * ratioY;\r\n var xM = ($child.offsetLeft + $mapSource.offsetLeft) * ratioX;\r\n var yM = ($child.offsetTop + $mapSource.offsetTop) * ratioY;\r\n\r\n mini.style.width = `${Math.round(wM)}px`;\r\n mini.style.height = `${Math.round(hM)}px`;\r\n mini.style.left = `${Math.round(xM)}px`;\r\n mini.style.top = `${Math.round(yM)}px`;\r\n }\r\n }\r\n };\r\n\r\n const down = (e: any) => {\r\n var moveEvent: any, upEvent: any;\r\n\r\n x = Math.round($minimap.offsetLeft + l + w / 2);\r\n y = Math.round($minimap.offsetTop + t + h / 2);\r\n\r\n move(e);\r\n\r\n if (e.type === 'touchstart') {\r\n moveEvent = 'touchmove';\r\n upEvent = 'touchend';\r\n } else {\r\n moveEvent = 'mousemove';\r\n upEvent = 'mouseup';\r\n }\r\n\r\n const up = () => {\r\n $window.removeEventListener(moveEvent, move);\r\n };\r\n\r\n $window.addEventListener(moveEvent, move);\r\n $window.addEventListener(upEvent, up, { once: true });\r\n };\r\n\r\n const move = (e: any) => {\r\n e.preventDefault();\r\n\r\n if (e.type.match(/touch/)) {\r\n if (e.touches.length > 1) {\r\n return;\r\n }\r\n var event = e.touches[0];\r\n } else {\r\n var event = e;\r\n }\r\n\r\n var dx = event.clientX - x;\r\n var dy = event.clientY - y;\r\n if (l + dx < 0) {\r\n dx = -l;\r\n }\r\n if (t + dy < 0) {\r\n dy = -t;\r\n }\r\n if (l + w + dx > minimapWidth) {\r\n dx = minimapWidth - l - w;\r\n }\r\n if (t + h + dy > minimapHeight) {\r\n dy = minimapHeight - t - h;\r\n }\r\n\r\n x += dx;\r\n y += dy;\r\n\r\n l += dx;\r\n t += dy;\r\n\r\n var coefX = minimapWidth / $mapSource.scrollWidth;\r\n var coefY = minimapHeight / $mapSource.scrollHeight;\r\n var left = l / coefX;\r\n var top = t / coefY;\r\n\r\n $mapSource.scrollLeft = Math.round(left);\r\n $mapSource.scrollTop = Math.round(top);\r\n\r\n redraw();\r\n };\r\n\r\n synchronize();\r\n\r\n // $minimap.addEventListener('mousedown', down);\r\n // $minimap.addEventListener('touchstart', down);\r\n\r\n init();\r\n\r\n return this;\r\n};\r\n\r\nexport const deleteMinimap = () => {\r\n var minimap = document.getElementsByClassName('minimap')[0];\r\n if (minimap) {\r\n minimap.remove();\r\n }\r\n};\r\n","import { Directive, ElementRef, Input, Renderer2, OnChanges, SimpleChanges, OnInit } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[appAutoFocus]'\r\n})\r\nexport class AutoFocusDirective implements OnChanges {\r\n\r\n @Input() appAutoFocus: boolean = false;\r\n\r\n constructor(private el: ElementRef, private renderer: Renderer2) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['appAutoFocus'] && this.appAutoFocus) {\r\n setTimeout(() => this.el.nativeElement.focus(), 0);\r\n }\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\n\r\n@Component({\r\n selector: 'h3-icon',\r\n template: ` <h3 nz-col><nz-icon nzType=\"send\" nzTheme=\"outline\" />&nbsp;<ng-content></ng-content></h3> `,\r\n imports: [NzIconModule],\r\n})\r\nexport class H3Icon {}\r\n\r\n@Component({\r\n selector: 'icon-add',\r\n template: `\r\n <nz-icon\r\n nzType=\"plus\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer\"\r\n [ngStyle]=\"{ 'font-size.px': size }\"\r\n (click)=\"$event.stopPropagation(); click.emit()\"\r\n ></nz-icon>\r\n `,\r\n imports: [CommonModule, NzIconModule],\r\n})\r\nexport class IconAdd {\r\n @Output() click = new EventEmitter();\r\n\r\n /**\r\n * default = 16\r\n */\r\n @Input() size = 16;\r\n}\r\n\r\n@Component({\r\n selector: 'icon-edit',\r\n template: `\r\n <nz-icon\r\n nzType=\"edit\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer\"\r\n [ngStyle]=\"{ 'font-size.px': size }\"\r\n (click)=\"$event.stopPropagation(); click.emit()\"\r\n ></nz-icon>\r\n `,\r\n imports: [CommonModule, NzIconModule],\r\n})\r\nexport class IconEdit {\r\n @Output() click = new EventEmitter();\r\n\r\n /**\r\n * default = 16\r\n */\r\n @Input() size = 16;\r\n}\r\n\r\n@Component({\r\n selector: 'icon-save',\r\n template: `\r\n <nz-icon\r\n nzType=\"save\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer\"\r\n [ngStyle]=\"{ 'font-size.px': size }\"\r\n (click)=\"$event.stopPropagation(); click.emit()\"\r\n ></nz-icon>\r\n `,\r\n imports: [CommonModule, NzIconModule],\r\n})\r\nexport class IconSave {\r\n @Output() click = new EventEmitter();\r\n\r\n /**\r\n * default = 16\r\n */\r\n @Input() size = 16;\r\n}\r\n\r\n@Component({\r\n selector: 'icon-delete',\r\n template: `\r\n <nz-icon\r\n nzType=\"delete\"\r\n nzTheme=\"outline\"\r\n class=\"color-warn cursor-pointer\"\r\n [ngStyle]=\"{ 'font-size.px': size }\"\r\n (click)=\"$event.stopPropagation(); click.emit()\"\r\n ></nz-icon>\r\n `,\r\n imports: [CommonModule, NzIconModule],\r\n})\r\nexport class IconDelete {\r\n @Output() click = new EventEmitter();\r\n\r\n /**\r\n * default = 16\r\n */\r\n @Input() size = 16;\r\n}\r\n\r\n@Component({\r\n selector: 'icon-view',\r\n template: `\r\n <nz-icon\r\n nzType=\"eye\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer\"\r\n [ngStyle]=\"{ 'font-size.px': size }\"\r\n (click)=\"$event.stopPropagation(); click.emit()\"\r\n ></nz-icon>\r\n `,\r\n imports: [CommonModule, NzIconModule],\r\n})\r\nexport class IconView {\r\n @Output() click = new EventEmitter();\r\n\r\n /**\r\n * default = 16\r\n */\r\n @Input() size = 16;\r\n}\r\n\r\n@Component({\r\n selector: 'icon-search',\r\n template: `\r\n <nz-icon\r\n nzType=\"search\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer\"\r\n [ngStyle]=\"{ 'font-size.px': size }\"\r\n (click)=\"$event.stopPropagation(); click.emit()\"\r\n ></nz-icon>\r\n `,\r\n imports: [CommonModule, NzIconModule],\r\n})\r\nexport class IconSearch {\r\n @Output() click = new EventEmitter();\r\n\r\n /**\r\n * default = 16\r\n */\r\n @Input() size = 16;\r\n}\r\n","import {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostListener,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzDrawerModule } from 'ng-zorro-antd/drawer';\r\nimport { NzTagModule } from 'ng-zorro-antd/tag';\r\nimport { NzRadioModule } from 'ng-zorro-antd/radio';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzToolTipModule } from 'ng-zorro-antd/tooltip';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { NzFlexModule } from 'ng-zorro-antd/flex';\r\nimport { NzTableModule } from 'ng-zorro-antd/table';\r\nimport { NzDividerModule } from 'ng-zorro-antd/divider';\r\n\r\nimport { BaseComponent } from '../base.component';\r\nimport { Box } from '../box';\r\nimport { ExtendInput } from '../extend-input/extend-input';\r\nimport { ExtendSelectComponent } from '../extend-select/extend-select';\r\nimport { ExtendCheckbox } from '../extend-checkbox/extend-checkbox';\r\nimport { ExtendTextArea } from '../extend-textarea/extend-textarea';\r\nimport { ExtendInputNumber } from '../extend-input-number/extend-input-number';\r\nimport { createMinimap, deleteMinimap } from './minimap';\r\nimport { NzAutocompleteModule } from 'ng-zorro-antd/auto-complete';\r\nimport { AutoFocusDirective } from '../../directive/auto-focus.directive';\r\nimport { IconAdd, IconDelete } from '../../icon';\r\nimport {\r\n NzModalComponent,\r\n NzModalContentDirective,\r\n NzModalTitleDirective,\r\n NzModalFooterDirective,\r\n} from 'ng-zorro-antd/modal';\r\n\r\n// import {\r\n// Box,\r\n// ExtendInput,\r\n// ExtendSelectComponent,\r\n// ExtendCheckbox,\r\n// ExtendTextArea,\r\n// ExtendInputNumber,\r\n// BaseComponent,\r\n// AutoFocusDirective,\r\n// } from '@brggroup/share-lib';\r\n\r\n//#region modal\r\nclass WF_Template {\r\n WF_Template_Id: number;\r\n App_Org_Id: string;\r\n CreatedDate: Date;\r\n CreatedUser: string;\r\n UpdatedDate: Date;\r\n UpdatedUser: string;\r\n IsActive: boolean;\r\n Code: string;\r\n Name: string;\r\n DocType: string;\r\n Description: string;\r\n TemplatePrint: string;\r\n ApplyTo: string;\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.WF_Template_Id = obj.WF_Template_Id || null;\r\n this.App_Org_Id = obj.App_Org_Id || '';\r\n this.CreatedDate = obj.CreatedDate || null;\r\n this.CreatedUser = obj.CreatedUser || '';\r\n this.UpdatedDate = obj.UpdatedDate || null;\r\n this.UpdatedUser = obj.UpdatedUser || '';\r\n this.IsActive = obj.IsActive || null;\r\n this.Code = obj.Code || '';\r\n this.Name = obj.Name || '';\r\n this.DocType = obj.DocType || '';\r\n this.Description = obj.Description || '';\r\n this.TemplatePrint = obj.TemplatePrint || '';\r\n this.ApplyTo = obj.ApplyTo || '';\r\n }\r\n}\r\n\r\nclass WF_TemplateStage {\r\n WF_TemplateStage_Id: number;\r\n App_Org_Id: string;\r\n CreatedDate: Date;\r\n CreatedUser: string;\r\n UpdatedDate: Date;\r\n UpdatedUser: string;\r\n IsActive: boolean;\r\n WF_Template_Id: number;\r\n Code: string;\r\n Name: string;\r\n StageType: '_start_' | 'start' | 'node' | 'end' | '_end_';\r\n SeqValue: number;\r\n NumberDay: number;\r\n LimitValue: number;\r\n IsRequireUser: boolean;\r\n\r\n IsTempId: boolean;\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.WF_TemplateStage_Id = obj.WF_TemplateStage_Id || null;\r\n this.App_Org_Id = obj.App_Org_Id || '';\r\n this.CreatedDate = obj.CreatedDate || null;\r\n this.CreatedUser = obj.CreatedUser || '';\r\n this.UpdatedDate = obj.UpdatedDate || null;\r\n this.UpdatedUser = obj.UpdatedUser || '';\r\n this.IsActive = obj.IsActive || null;\r\n this.WF_Template_Id = obj.WF_Template_Id || null;\r\n this.Code = obj.Code || '';\r\n this.Name = obj.Name || '';\r\n this.StageType = obj.StageType?.toLowerCase() || '';\r\n this.SeqValue = obj.SeqValue || null;\r\n this.NumberDay = obj.NumberDay || null;\r\n this.LimitValue = obj.LimitValue || null;\r\n this.IsRequireUser = obj.IsRequireUser || false;\r\n this.IsTempId = obj.IsTempId || false;\r\n }\r\n}\r\n\r\nclass WF_TemplateStageAction {\r\n WF_TemplateStageAction_Id: number;\r\n App_Org_Id: string;\r\n CreatedDate: Date;\r\n CreatedUser: string;\r\n UpdatedDate: Date;\r\n UpdatedUser: string;\r\n IsActive: boolean;\r\n WF_Template_Id: number;\r\n WF_TemplateStage_Id: number;\r\n ActionType: string;\r\n ActionStatus: string;\r\n ActionText: string;\r\n StageStatus: string;\r\n AllowNote: boolean;\r\n AllowEmail: boolean;\r\n WF_EmailTemplate: string;\r\n To_WF_TemplateStage_Id: number;\r\n To_StageStatus: string;\r\n WF_TransitionsRule_Id: number;\r\n DocProcessStatus: string;\r\n\r\n lstRoleId: string;\r\n _lstRoleId: string[];\r\n\r\n lstEmailActionId: string;\r\n _lstEmailActionId: number[];\r\n\r\n IsTempId: boolean;\r\n\r\n actionRule: ActionRule;\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.WF_TemplateStageAction_Id = obj.WF_TemplateStageAction_Id || null;\r\n this.App_Org_Id = obj.App_Org_Id || '';\r\n this.CreatedDate = obj.CreatedDate || null;\r\n this.CreatedUser = obj.CreatedUser || '';\r\n this.UpdatedDate = obj.UpdatedDate || null;\r\n this.UpdatedUser = obj.UpdatedUser || '';\r\n this.IsActive = obj.IsActive || null;\r\n this.WF_Template_Id = obj.WF_Template_Id || null;\r\n this.WF_TemplateStage_Id = obj.WF_TemplateStage_Id || null;\r\n this.ActionType = obj.ActionType || '';\r\n this.ActionStatus = obj.ActionStatus || '';\r\n this.ActionText = obj.ActionText || '';\r\n this.StageStatus = obj.StageStatus || '';\r\n this.AllowNote = obj.AllowNote || null;\r\n this.AllowEmail = obj.AllowEmail || null;\r\n this.WF_EmailTemplate = obj.WF_EmailTemplate || '';\r\n this.To_WF_TemplateStage_Id = obj.To_WF_TemplateStage_Id || null;\r\n this.To_StageStatus = obj.To_StageStatus || '';\r\n this.WF_TransitionsRule_Id = obj.WF_TransitionsRule_Id || null;\r\n this.DocProcessStatus = obj.DocProcessStatus || '';\r\n\r\n this.lstRoleId = obj.lstRoleId;\r\n this._lstRoleId = this.lstRoleId ? this.lstRoleId.split(',') : [];\r\n\r\n this.lstEmailActionId = obj.lstEmailActionId;\r\n this._lstEmailActionId = this.lstEmailActionId\r\n ? this.lstEmailActionId\r\n .split(',')\r\n .map((x) => Number(x.trim()))\r\n .filter((x) => !isNaN(x))\r\n : [];\r\n\r\n this.IsTempId = obj.IsTempId || false;\r\n this.actionRule = new ActionRule(obj.actionRule);\r\n }\r\n}\r\n\r\nexport class WF_TemplateActionRef {\r\n WF_TemplateActionRef_Id: number;\r\n App_Org_Id: string;\r\n CreatedDate: Date;\r\n CreatedUser: string;\r\n UpdatedDate: Date;\r\n UpdatedUser: string;\r\n IsActive: boolean;\r\n WF_Template: number;\r\n WF_TemplateStage: number;\r\n WF_TemplateStageAction_Id: number;\r\n To_WF_TemplateStageAction_Id: number;\r\n TemplateMail: string;\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.WF_TemplateActionRef_Id = obj.WF_TemplateActionRef_Id || null;\r\n this.App_Org_Id = obj.App_Org_Id || '';\r\n this.CreatedDate = obj.CreatedDate || null;\r\n this.CreatedUser = obj.CreatedUser || '';\r\n this.UpdatedDate = obj.UpdatedDate || null;\r\n this.UpdatedUser = obj.UpdatedUser || '';\r\n this.IsActive = obj.IsActive || null;\r\n this.WF_Template = obj.WF_Template || null;\r\n this.WF_TemplateStage = obj.WF_TemplateStage || null;\r\n this.WF_TemplateStageAction_Id = obj.WF_TemplateStageAction_Id || null;\r\n this.To_WF_TemplateStageAction_Id = obj.To_WF_TemplateStageAction_Id || null;\r\n this.TemplateMail = obj.TemplateMail || '';\r\n }\r\n}\r\n\r\nexport class Workflow extends WF_Template {\r\n lstTemplateType: { Code: string; Name: string }[];\r\n lstTemplatePrint: { Code: string; Name: string }[];\r\n lstStageStatus: { Code: string; Name?: string }[];\r\n lstProcessStatus: { Code: string; Name?: string }[];\r\n lstActionType: { Code: string; Name?: string }[];\r\n lstActionStatus: { Code: string; Name?: string }[];\r\n lstApplyTo: { Code: string; Name: string }[];\r\n\r\n editingActionStatus?: { Code: string; Name?: string };\r\n\r\n editorOption: WorkflowEditorOption = new WorkflowEditorOption();\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n super(obj);\r\n\r\n this.lstTemplateType = obj.lstTemplateType || [];\r\n this.lstTemplatePrint = obj.lstTemplatePrint || [];\r\n this.lstStageStatus = obj.lstStageStatus || [];\r\n this.lstProcessStatus = obj.lstProcessStatus || [];\r\n this.lstActionType = obj.lstActionType || [];\r\n this.lstActionStatus = obj.lstActionStatus || [];\r\n this.lstApplyTo = obj.lstApplyTo || [];\r\n\r\n this.editorOption = new WorkflowEditorOption(obj.editorOption);\r\n }\r\n}\r\n\r\nexport class WorkflowEditorOption {\r\n panX: number;\r\n panY: number;\r\n AllowbackInUse: boolean;\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.panX = obj.panX || 0;\r\n this.panY = obj.panY || 0;\r\n\r\n this.AllowbackInUse = obj.AllowbackInUse || false;\r\n }\r\n}\r\n\r\n/**\r\n * STAGE\r\n */\r\nexport class WorkflowStage extends WF_TemplateStage {\r\n editorOption: WorkflowStageEditorOption = new WorkflowStageEditorOption();\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n super(obj);\r\n\r\n this.editorOption = new WorkflowStageEditorOption(obj.editorOption);\r\n }\r\n}\r\n\r\nexport class WorkflowStageEditorOption {\r\n x: number;\r\n y: number;\r\n isReverse: boolean;\r\n drawerPosition: string;\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.x = obj.x || 0;\r\n this.y = obj.y || 0;\r\n this.isReverse = obj.isReverse || false;\r\n this.drawerPosition = obj.drawerPosition || '';\r\n }\r\n}\r\n\r\n/**\r\n * Action\r\n */\r\nexport class WorkflowAction extends WF_TemplateStageAction {\r\n FromSide: 'left' | 'right';\r\n ToSide: 'left' | 'right';\r\n allowBack: boolean; // true = 2 đầu, false/undefined = 1 đầu\r\n labelBack: string;\r\n\r\n isBackAction: boolean;\r\n\r\n editorOption: WorkflowActionEditorOption;\r\n\r\n getFromStageCode(lstStage: WorkflowStage[]): string {\r\n if (!lstStage || !lstStage.length) return '';\r\n return lstStage.find((x) => x.WF_TemplateStage_Id == this.WF_TemplateStage_Id)?.Code || '';\r\n }\r\n getFromStageName(lstStage: WorkflowStage[]): string {\r\n if (!lstStage || !lstStage.length) return '';\r\n return lstStage.find((x) => x.WF_TemplateStage_Id == this.WF_TemplateStage_Id)?.Name || '';\r\n }\r\n getToStageCode(lstStage: WorkflowStage[]): string {\r\n if (!lstStage || !lstStage.length) return '';\r\n return lstStage.find((x) => x.WF_TemplateStage_Id == this.To_WF_TemplateStage_Id)?.Code || '';\r\n }\r\n getToStageName(lstStage: WorkflowStage[]): string {\r\n if (!lstStage || !lstStage.length) return '';\r\n return lstStage.find((x) => x.WF_TemplateStage_Id == this.To_WF_TemplateStage_Id)?.Name || '';\r\n }\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n super(obj);\r\n\r\n this.To_StageStatus = obj.To_StageStatus || '';\r\n this.FromSide = obj.FromSide || '';\r\n this.ToSide = obj.ToSide || '';\r\n this.allowBack = obj.allowBack || false;\r\n this.labelBack = obj.labelBack || '';\r\n this.isBackAction = obj.isBackAction || false;\r\n this.editorOption = new WorkflowActionEditorOption(obj.editorOption);\r\n }\r\n}\r\n\r\nexport class WorkflowActionRef extends WF_TemplateActionRef {}\r\n\r\nexport class WorkflowActionEditorOption {\r\n points: Point[];\r\n drawerPosition: string;\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.drawerPosition = obj.drawerPosition || '';\r\n\r\n this.points = [];\r\n if (obj.points) {\r\n obj.points.forEach((p: any) => {\r\n this.points = [...this.points, { x: p.x, y: p.y }];\r\n });\r\n }\r\n }\r\n}\r\n\r\ninterface Rect {\r\n x: number;\r\n y: number;\r\n w: number;\r\n h: number;\r\n}\r\n\r\ninterface Point {\r\n x: number;\r\n y: number;\r\n}\r\n\r\ninterface DeleteNodeAction {\r\n type: 'delete-node';\r\n node: WorkflowStage;\r\n nodeIndex: number;\r\n edges: WorkflowAction[];\r\n}\r\n\r\nexport class WF_TransitionRule {\r\n WF_TransitionRule_Id: number;\r\n App_Org_Id: string;\r\n CreatedDate: Date;\r\n CreatedUser: string;\r\n UpdatedDate: Date;\r\n UpdatedUser: string;\r\n IsActive: boolean;\r\n Code: string;\r\n Name: string;\r\n Note: string;\r\n\r\n lstLine: ActionRuleLine[];\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.WF_TransitionRule_Id = obj.WF_TransitionRule_Id || null;\r\n this.App_Org_Id = obj.App_Org_Id || '';\r\n this.CreatedDate = obj.CreatedDate || null;\r\n this.CreatedUser = obj.CreatedUser || '';\r\n this.UpdatedDate = obj.UpdatedDate || null;\r\n this.UpdatedUser = obj.UpdatedUser || '';\r\n this.IsActive = this.WF_TransitionRule_Id ? obj.IsActive || false : true;\r\n this.Code = obj.Code || '';\r\n this.Name = obj.Name || '';\r\n this.Note = obj.Note || '';\r\n\r\n this.lstLine = [];\r\n if (obj.lstLine && obj.lstLine.length) {\r\n obj.lstLine.forEach((x: any) => {\r\n this.lstLine.push(new ActionRuleLine(x));\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport class WF_TransitionRuleLine {\r\n WF_TransitionRuleLine_Id: number;\r\n App_Org_Id: string;\r\n CreatedDate: Date;\r\n CreatedUser: string;\r\n UpdatedDate: Date;\r\n UpdatedUser: string;\r\n IsActive: boolean;\r\n WF_TransitionRule_Id: number;\r\n WF_Template_Id: number;\r\n WF_TemplateStage_Id: number;\r\n WF_TemplateStageAction_Id: number;\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.WF_TransitionRuleLine_Id = obj.WF_TransitionRuleLine_Id || null;\r\n this.App_Org_Id = obj.App_Org_Id || '';\r\n this.CreatedDate = obj.CreatedDate || null;\r\n this.CreatedUser = obj.CreatedUser || '';\r\n this.UpdatedDate = obj.UpdatedDate || null;\r\n this.UpdatedUser = obj.UpdatedUser || '';\r\n this.IsActive = obj.IsActive || null;\r\n this.WF_TransitionRule_Id = obj.WF_TransitionRule_Id || null;\r\n this.WF_Template_Id = obj.WF_Template_Id || null;\r\n this.WF_TemplateStage_Id = obj.WF_TemplateStage_Id || null;\r\n this.WF_TemplateStageAction_Id = obj.WF_TemplateStageAction_Id || null;\r\n }\r\n}\r\n\r\nexport class ActionRule extends WF_TransitionRule {}\r\n\r\nexport class ActionRuleLine extends WF_TransitionRuleLine {}\r\n\r\n//#endregion modal\r\n\r\n@Component({\r\n selector: 'app-workflow-editor',\r\n templateUrl: './workflow-editor.component.html',\r\n styleUrls: ['./workflow-editor.component.scss'],\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n NzCardModule,\r\n NzDrawerModule,\r\n NzTagModule,\r\n NzRadioModule,\r\n NzIconModule,\r\n Box,\r\n NzButtonModule,\r\n NzToolTipModule,\r\n ExtendInput,\r\n ExtendSelectComponent,\r\n ExtendCheckbox,\r\n ExtendTextArea,\r\n NzInputModule,\r\n NzGridModule,\r\n NzFlexModule,\r\n ExtendInputNumber,\r\n NzTableModule,\r\n NzDividerModule,\r\n AutoFocusDirective,\r\n NzAutocompleteModule,\r\n IconDelete,\r\n NzModalComponent,\r\n NzModalContentDirective,\r\n NzModalTitleDirective,\r\n IconAdd,\r\n NzModalFooterDirective,\r\n ],\r\n})\r\nexport class WorkflowEditorComponent extends BaseComponent implements OnInit, AfterViewInit, OnDestroy {\r\n //#region NGHIỆP VỤ\r\n @Input() lstOrg: { App_Org_Id: string; Code: string; Name: string }[] = [];\r\n @Input() lstRole: { App_Role_Id: string; Code: string; Name: string }[] = [];\r\n @Input() lstEmailTemplate: { App_MailTemplate_Id: string; Code: string; Name: string }[] = [];\r\n\r\n ready = false;\r\n\r\n template: Workflow = new Workflow();\r\n lstStage: WorkflowStage[] = [];\r\n lstAction: WorkflowAction[] = [];\r\n lstActionRef: WorkflowActionRef[] = [];\r\n\r\n get lstActionOfCurrentStage() {\r\n if (this.selectedStage && this.selectedStage.WF_TemplateStage_Id) {\r\n return this.lstAction.filter((x) => x.WF_TemplateStage_Id == this.selectedStage!.WF_TemplateStage_Id);\r\n }\r\n return [];\r\n }\r\n\r\n get getLstStage() {\r\n return this.lstStage.sort((a, b) => a.SeqValue - b.SeqValue);\r\n }\r\n\r\n get lstEmailAction() {\r\n if (this.lstAction && this.lstAction.length) {\r\n const res = this.lstAction.map((x) => ({\r\n ID: x.WF_TemplateStageAction_Id,\r\n Name: `[${x.getFromStageCode(this.lstStage)}]${x.getFromStageName(this.lstStage) ? ' ' : ''}${x.getFromStageName(this.lstStage)} > [${x.ActionStatus}]${x.ActionText ? ' ' : ''}${x.ActionText}`,\r\n }));\r\n return res;\r\n }\r\n return [];\r\n }\r\n\r\n emailActionText(WF_TemplateStageAction_Id: number) {\r\n const x = this.lstAction.find((x) => x.WF_TemplateStageAction_Id == WF_TemplateStageAction_Id);\r\n return x\r\n ? `[${x.getFromStageCode(this.lstStage)}]${x.getFromStageName(this.lstStage) ? ' ' : ''}${x.getFromStageName(this.lstStage)} > [${x.ActionStatus}]${x.ActionText ? ' ' : ''}${x.ActionText}`\r\n : '';\r\n }\r\n\r\n get getlstStage() {\r\n if (this.lstStage) {\r\n return this.lstStage.sort((a, b) => (a.SeqValue || 0) - (b.SeqValue || 0));\r\n }\r\n return [];\r\n }\r\n\r\n @Output('onSave') onSave = new EventEmitter();\r\n @Output('onDeleteStage') onDeleteStage = new EventEmitter();\r\n @Output('onDeleteAction') onDeleteAction = new EventEmitter();\r\n @Output('onDeleteRule') onDeleteRule = new EventEmitter();\r\n @Output('onDeleteRuleLine') onDeleteRuleLine = new EventEmitter();\r\n //#endregion\r\n\r\n //#region wf editor\r\n Math = Math;\r\n\r\n drawTemplateVisibel = false;\r\n settingVisible = false;\r\n infoVisible = false;\r\n wfcSetting: { ShowGrid: boolean } = { ShowGrid: true };\r\n\r\n selectedStage?: WorkflowStage;\r\n hoverStage?: WorkflowStage;\r\n selectedAction?: WorkflowAction;\r\n selectedBackAction?: WorkflowAction;\r\n hoverAction?: WorkflowAction;\r\n\r\n // vẽ đường liên kết mới\r\n connectingFrom?: {\r\n node: WorkflowStage;\r\n side: 'left' | 'right';\r\n };\r\n connectingPoints: Point[] = [];\r\n previewX = 0;\r\n previewY = 0;\r\n\r\n /** điểm đang chọn để di chuyển */\r\n draggingPoint?: Point;\r\n\r\n /** đang kéo chọn nhiều node */\r\n isSelecting = false;\r\n /** điểm bắt đầu kéo */\r\n selectStart?: { x: number; y: number };\r\n /** điểm kết thúc kéo */\r\n selectEnd?: { x: number; y: number };\r\n\r\n draggingGroup = false;\r\n dragStartMouse?: { x: number; y: number };\r\n dragStartPositions = new Map<number, { x: number; y: number }>();\r\n dragStartEdgePoints = new Map<WorkflowAction, { x: number; y: number }[]>();\r\n\r\n /** list các điểm đang được chọn */\r\n lstSelectedStageId = new Set<number>();\r\n\r\n // SNAP point\r\n gridSize = 20; // 10 / 20 / 25 tuỳ thích\r\n snapToGrid = true;\r\n\r\n // ===== drag node =====\r\n draggingNode?: WorkflowStage;\r\n isDragging = false;\r\n dragStartX = 0;\r\n dragStartY = 0;\r\n offsetX = 0;\r\n offsetY = 0;\r\n\r\n KEY_MOVE_STEP = 5; // px\r\n KEY_MOVE_STEP_BIG = 20; // Shift + arrow\r\n\r\n // pan: dịch chuyển cả canvas\r\n isPanning = false;\r\n panStart?: { x: number; y: number };\r\n // panX = 0;\r\n // panY = 0;\r\n // panX = -5000;\r\n // panY = -5000;\r\n\r\n isMoveMode = true;\r\n\r\n @ViewChild('canvas', { static: true }) canvasRef!: ElementRef<HTMLDivElement>;\r\n @ViewChild('svg', { static: true }) svgRef!: ElementRef<SVGSVGElement>;\r\n\r\n get normalEdges() {\r\n return this.lstAction.filter((e) => e !== this.hoverAction && !e.isBackAction);\r\n }\r\n\r\n get hoverEdges() {\r\n if (this.hoverAction && !this.hoverAction.isBackAction) {\r\n return [this.hoverAction];\r\n }\r\n\r\n if (this.selectedAction && !this.selectedAction.isBackAction) {\r\n return [this.selectedAction];\r\n }\r\n\r\n return [];\r\n }\r\n\r\n axisLock: 'x' | 'y' | null = null;\r\n\r\n @HostListener('window:keydown', ['$event'])\r\n onKeyDown(e: KeyboardEvent) {\r\n // bỏ qua nếu đang gõ input\r\n const target = e.target as HTMLElement;\r\n if (['INPUT', 'TEXTAREA'].includes(target.tagName)) return;\r\n\r\n if (e.key === 'Escape') {\r\n this.cancelConnecting();\r\n }\r\n\r\n if (e.ctrlKey && e.key === 's') {\r\n console.log('ctrl s');\r\n\r\n e.preventDefault();\r\n if (this.ready) {\r\n this.save();\r\n }\r\n }\r\n\r\n if (e.ctrlKey && e.key === 'z') {\r\n console.log('ctrl z');\r\n\r\n e.preventDefault();\r\n this.undo();\r\n }\r\n\r\n if (e.ctrlKey && (e.key === 'y' || (e.shiftKey && e.key === 'Z'))) {\r\n console.log('ctrl y');\r\n\r\n e.preventDefault();\r\n this.redo();\r\n }\r\n\r\n if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].indexOf(e.key) >= 0) {\r\n let dx = 0;\r\n let dy = 0;\r\n\r\n const step = e.shiftKey ? this.KEY_MOVE_STEP_BIG : this.KEY_MOVE_STEP;\r\n\r\n switch (e.key) {\r\n case 'ArrowLeft':\r\n dx = -step;\r\n break;\r\n case 'ArrowRight':\r\n dx = step;\r\n break;\r\n case 'ArrowUp':\r\n dy = -step;\r\n break;\r\n case 'ArrowDown':\r\n dy = step;\r\n break;\r\n default:\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n\r\n this.moveSelectedNodesBy(dx, dy);\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.afterInput();\r\n }\r\n\r\n ngAfterViewInit() {}\r\n\r\n ngOnDestroy(): void {\r\n deleteMinimap();\r\n }\r\n\r\n clear() {\r\n this.template = new Workflow();\r\n this.afterInput();\r\n }\r\n\r\n afterInput() {\r\n this.template = new Workflow(this.template);\r\n\r\n if (!this.lstStage || !this.lstStage.length) {\r\n this.lstStage = [\r\n new WorkflowStage({\r\n WF_TemplateStage_Id: Date.now() + 1,\r\n IsTempId: true,\r\n Code: '_start_',\r\n Name: 'Start',\r\n StageType: '_start_',\r\n SeqValue: 1,\r\n editorOption: {\r\n x: 120,\r\n y: 120,\r\n },\r\n }),\r\n new WorkflowStage({\r\n WF_TemplateStage_Id: Date.now() + 2,\r\n IsTempId: true,\r\n Code: '_end_',\r\n Name: 'End',\r\n StageType: '_end_',\r\n SeqValue: 999,\r\n editorOption: {\r\n x: 120,\r\n y: 300,\r\n isReverseLabel: true,\r\n },\r\n }),\r\n ];\r\n } else {\r\n let lstStage: WorkflowStage[] = [];\r\n this.lstStage.forEach((x) => {\r\n lstStage.push(new WorkflowStage(x));\r\n });\r\n\r\n this.lstStage = [...lstStage];\r\n }\r\n\r\n if (!this.lstAction || !this.lstAction.length) {\r\n this.lstAction = [];\r\n } else {\r\n let lstAction: WorkflowAction[] = [];\r\n this.lstAction.forEach((x) => {\r\n lstAction.push(new WorkflowAction(x));\r\n });\r\n\r\n this.lstAction = [...lstAction];\r\n }\r\n\r\n this.ready = true;\r\n\r\n console.log('WorkflowEditorComponent afterInput');\r\n console.log('template', this.template);\r\n console.log('lstStage', this.lstStage);\r\n console.log('lstAction', this.lstAction);\r\n console.log('lstActionRef', this.lstActionRef);\r\n\r\n this.updateMiniMap();\r\n }\r\n\r\n onclickaction(action: WorkflowAction) {\r\n this.hoverAction = action;\r\n // console.log('onclickaction', action);\r\n }\r\n\r\n updateMiniMap() {\r\n // console.log('updateMiniMap');\r\n\r\n setTimeout(() => {\r\n if (document.getElementsByClassName('canvas-content')[0]) {\r\n createMinimap(document.getElementsByClassName('canvas-content')[0]);\r\n }\r\n }, 100);\r\n }\r\n\r\n moveSelectedNodesBy(dx: number, dy: number) {\r\n if (this.lstSelectedStageId.size === 0) return;\r\n\r\n // ⭐ UNDO SNAPSHOT\r\n this.pushUndo({\r\n type: 'move-nodes',\r\n before: this.cloneNodePositions(this.lstSelectedStageId),\r\n });\r\n\r\n for (const n of this.lstStage) {\r\n if (!this.lstSelectedStageId.has(n.WF_TemplateStage_Id)) continue;\r\n\r\n n.editorOption.x = this.clamp(n.editorOption.x + dx, 0, this.getCanvasWidth() - this.NODE_WIDTH);\r\n\r\n n.editorOption.y = this.clamp(n.editorOption.y + dy, 0, this.getCanvasHeight() - this.NODE_HEIGHT);\r\n }\r\n }\r\n\r\n save() {\r\n this.ready = false;\r\n this.onSave.emit({\r\n template: this.template,\r\n lstStage: this.lstStage,\r\n lstAction: this.lstAction,\r\n lstActionRef: this.lstActionRef,\r\n });\r\n }\r\n\r\n addStage() {\r\n console.log('addStage');\r\n\r\n const id = Date.now();\r\n const code = 'New_Stage';\r\n\r\n // tìm vị trí trống (đơn giản & hiệu quả)\r\n const baseX = 300 - this.template.editorOption.panX;\r\n const baseY = 120 - this.template.editorOption.panY;\r\n\r\n const GAP_X = 200;\r\n const GAP_Y = 120;\r\n\r\n let x = baseX;\r\n let y = baseY;\r\n\r\n while (this.isPositionOccupied(x, y)) {\r\n y += GAP_Y;\r\n }\r\n\r\n const stage = new WorkflowStage();\r\n stage.WF_TemplateStage_Id = id;\r\n stage.IsTempId = true;\r\n stage.Code = code;\r\n stage.Name = 'New Stage';\r\n stage.editorOption.x = x;\r\n stage.editorOption.y = y;\r\n stage.StageType = 'node';\r\n stage.SeqValue = (this.lstStage.length + 1) * 10;\r\n\r\n this.lstStage.push(stage);\r\n this.lstStage = this.lstStage.sort((a, b) => a.SeqValue - b.SeqValue);\r\n // this.selectedStage = node;\r\n this.hoverStage = stage;\r\n\r\n this.updateMiniMap();\r\n }\r\n\r\n isConnectingFrom(node: WorkflowStage) {\r\n return this.connectingFrom?.node.WF_TemplateStage_Id === node.WF_TemplateStage_Id;\r\n }\r\n\r\n isDraggingFrom(node: WorkflowStage) {\r\n return this.draggingNode?.WF_TemplateStage_Id === node.WF_TemplateStage_Id;\r\n }\r\n\r\n isSelectedNode(node: WorkflowStage) {\r\n return this.selectedStage?.WF_TemplateStage_Id === node.WF_TemplateStage_Id;\r\n }\r\n\r\n cancelConnecting() {\r\n if (this.connectingFrom) {\r\n this.connectingFrom = undefined;\r\n this.previewX = 0;\r\n this.previewY = 0;\r\n\r\n this.connectingPoints = [];\r\n }\r\n }\r\n\r\n //#region NGHIỆP VỤ\r\n onselectedRoleEmail(action: WorkflowAction) {\r\n action.lstRoleId = action._lstRoleId ? action._lstRoleId.join(',') : '';\r\n action.lstEmailActionId = action._lstEmailActionId ? action._lstEmailActionId.join(',') : '';\r\n console.log('onselectedRoleEmail', action);\r\n\r\n this.lstActionRef = this.lstActionRef.filter(\r\n (x) => x.WF_TemplateStageAction_Id != action.WF_TemplateStageAction_Id,\r\n );\r\n\r\n for (let i = 0; i < action._lstEmailActionId.length; i++) {\r\n const actionId = action._lstEmailActionId[i];\r\n const newActionRef = new WorkflowActionRef();\r\n newActionRef.WF_TemplateStage = action.WF_TemplateStage_Id;\r\n newActionRef.WF_TemplateStageAction_Id = action.WF_TemplateStageAction_Id;\r\n newActionRef.To_WF_TemplateStageAction_Id = actionId;\r\n this.lstActionRef.push(newActionRef);\r\n }\r\n\r\n console.log('this.lstActionRef', this.lstActionRef);\r\n }\r\n\r\n lstActionRefOf(action: WorkflowAction) {\r\n return this.lstActionRef.filter((x) => x.WF_TemplateStageAction_Id == action.WF_TemplateStageAction_Id) || [];\r\n }\r\n\r\n addAction() {\r\n if (!this.selectedStage) return;\r\n\r\n const action = new WorkflowAction();\r\n action.IsTempId = true;\r\n action.WF_TemplateStageAction_Id = Date.now();\r\n action.WF_TemplateStage_Id = this.selectedStage.WF_TemplateStage_Id;\r\n action.FromSide = 'right';\r\n\r\n this.lstAction = this.lstAction ? [...this.lstAction, action] : [action];\r\n }\r\n\r\n onchangeAllowBack(action: WorkflowAction) {\r\n console.log('onchangeAllowBack', action);\r\n\r\n const stage = this.lstStage.find((x) => x.WF_TemplateStage_Id == action.To_WF_TemplateStage_Id);\r\n if (!stage) {\r\n this.notiService.error('Stage not found');\r\n return;\r\n }\r\n\r\n if (action.allowBack) {\r\n const newAction = new WorkflowAction();\r\n newAction.WF_TemplateStage_Id = action.To_WF_TemplateStage_Id;\r\n newAction.FromSide = 'right';\r\n newAction.To_WF_TemplateStage_Id = action.WF_TemplateStage_Id;\r\n newAction.ToSide = 'left';\r\n newAction.isBackAction = true;\r\n\r\n console.log('newAction', newAction);\r\n\r\n this.lstAction = [...this.lstAction, newAction];\r\n\r\n this.selectedBackAction = newAction;\r\n } else {\r\n action.labelBack = '';\r\n\r\n const backAction = this.lstAction.find(\r\n (x) =>\r\n x.WF_TemplateStage_Id == action.To_WF_TemplateStage_Id &&\r\n x.To_WF_TemplateStage_Id == action.WF_TemplateStage_Id &&\r\n x.isBackAction,\r\n );\r\n\r\n console.log('remove action', backAction);\r\n\r\n if (!backAction) {\r\n this.notiService.error('Action not found');\r\n } else {\r\n this.lstAction = [...this.lstAction.filter((x) => x != backAction)];\r\n this.selectedBackAction = undefined;\r\n }\r\n }\r\n }\r\n\r\n onchangeLabelBack(action: WorkflowAction) {\r\n const backAction = this.lstAction.find(\r\n (x) =>\r\n x.WF_TemplateStage_Id == action.To_WF_TemplateStage_Id &&\r\n x.To_WF_TemplateStage_Id == action.WF_TemplateStage_Id &&\r\n x.isBackAction,\r\n );\r\n\r\n if (!backAction) {\r\n this.notiService.error('Action not found');\r\n } else {\r\n backAction.ActionText = action.labelBack || '';\r\n }\r\n }\r\n\r\n onchangeActionText(action: WorkflowAction) {\r\n if (action.isBackAction) {\r\n const goAction = this.lstAction.find(\r\n (x) =>\r\n x.WF_TemplateStage_Id == action.To_WF_TemplateStage_Id &&\r\n x.To_WF_TemplateStage_Id == action.WF_TemplateStage_Id &&\r\n !x.isBackAction,\r\n );\r\n\r\n if (!goAction) {\r\n this.notiService.error('Action not found');\r\n } else {\r\n goAction.labelBack = action.ActionText || '';\r\n }\r\n }\r\n }\r\n\r\n onchangeNextStage(action: WorkflowAction) {\r\n console.log('onchangeNextStage', action);\r\n }\r\n\r\n async deleteStage() {\r\n console.log('deleteStage', this.selectedStage);\r\n\r\n if (!this.selectedStage) return;\r\n\r\n if (!(await this.confirm(`Xoá stage?`, `${this.selectedStage.Code} - ${this.selectedStage.Name}`))) return;\r\n\r\n const node = this.selectedStage;\r\n\r\n // 🔹 snapshot edges liên quan\r\n const relatedEdges = this.lstAction.filter(\r\n (e) =>\r\n e.WF_TemplateStage_Id === node.WF_TemplateStage_Id || e.To_WF_TemplateStage_Id === node.WF_TemplateStage_Id,\r\n );\r\n\r\n // 🔹 snapshot vị trí node trong mảng\r\n const nodeIndex = this.lstStage.findIndex((n) => n.WF_TemplateStage_Id === node.WF_TemplateStage_Id);\r\n\r\n // bỏ undo khi xóa node vì bắn event ra ngoài để xóa db\r\n // // ⭐ PUSH UNDO\r\n // this.pushUndo({\r\n // type: 'delete-node',\r\n // node: { ...node }, // clone\r\n // nodeIndex,\r\n // edges: relatedEdges.map((e) => ({ ...e })),\r\n // });\r\n\r\n // ❌ xoá edges\r\n this.lstAction = this.lstAction.filter(\r\n (e) =>\r\n e.WF_TemplateStage_Id !== node.WF_TemplateStage_Id && e.To_WF_TemplateStage_Id !== node.WF_TemplateStage_Id,\r\n );\r\n\r\n // ❌ xoá node\r\n this.lstStage.splice(nodeIndex, 1);\r\n\r\n this.onDeleteStage.emit(node);\r\n this.selectedStage = undefined;\r\n }\r\n\r\n async deleteAction(action: WorkflowAction) {\r\n console.log('deleteAction', action);\r\n\r\n if (!(await this.confirm(`Delete action ???`))) return;\r\n\r\n const stage = this.lstStage.find((x) => x.WF_TemplateStage_Id == action.WF_TemplateStage_Id);\r\n\r\n if (!stage) return;\r\n\r\n this.lstAction = this.lstAction.filter((x) => x != action);\r\n\r\n this.onDeleteAction.emit(action);\r\n\r\n this.selectedAction = undefined;\r\n this.hoverAction = undefined;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Action type\r\n\r\n inputStageStatusVisible = false;\r\n inputStageStatusCode = '';\r\n inputStageStatusName = '';\r\n @ViewChild('inputStageStatusElement', { static: false }) inputStageStatusElement?: ElementRef;\r\n\r\n checkRemoveableStageStatus(tag: any) {\r\n if (\r\n this.lstAction.find((x) => x.StageStatus === tag.Code) ||\r\n this.lstAction.find((x) => x.To_StageStatus === tag.Code)\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n handleCloseStageStatus(removedTag: any): void {\r\n this.template.lstStageStatus = this.template.lstStageStatus.filter((tag) => tag !== removedTag);\r\n }\r\n\r\n showInputStageStatus(): void {\r\n this.inputStageStatusVisible = true;\r\n setTimeout(() => {\r\n this.inputStageStatusElement?.nativeElement.focus();\r\n }, 10);\r\n }\r\n\r\n handleInputStageStatusConfirm(): void {\r\n if (this.inputStageStatusCode && !this.template.lstStageStatus?.find((x) => x.Code === this.inputValue)) {\r\n this.template.lstStageStatus = this.template.lstStageStatus\r\n ? [...this.template.lstStageStatus, { Code: this.inputStageStatusCode, Name: this.inputStageStatusName }]\r\n : [{ Code: this.inputStageStatusCode, Name: this.inputStageStatusName }];\r\n }\r\n this.inputStageStatusCode = '';\r\n this.inputStageStatusName = '';\r\n this.inputStageStatusVisible = false;\r\n }\r\n //#endregion\r\n\r\n //#region Action type\r\n\r\n sliceTagName(tag: string): string {\r\n // const isLongTag = tag.length > 20;\r\n // return isLongTag ? `${tag.slice(0, 20)}...` : tag;\r\n return tag;\r\n }\r\n\r\n inputActionTypeVisible = false;\r\n inputActionTypeCode = '';\r\n inputActionTypeName = '';\r\n @ViewChild('inputActionTypeElement', { static: false }) inputActionTypeElement?: ElementRef;\r\n\r\n checkRemoveableActionType(tag: any) {\r\n if (this.lstAction.find((x) => x.ActionType === tag.Code)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n handleCloseActionType(removedTag: {}): void {\r\n this.template.lstActionType = this.template.lstActionType.filter((tag) => tag !== removedTag);\r\n }\r\n\r\n showInputActionType(): void {\r\n this.inputActionTypeVisible = true;\r\n setTimeout(() => {\r\n console.log(this.inputActionTypeElement);\r\n\r\n this.inputActionTypeElement?.nativeElement.focus();\r\n }, 10);\r\n }\r\n\r\n handleInputActionTypeConfirm(): void {\r\n if (this.inputActionTypeCode && !this.template.lstActionType?.find((x) => x.Code === this.inputValue)) {\r\n this.template.lstActionType = this.template.lstActionType\r\n ? [...this.template.lstActionType, { Code: this.inputActionTypeCode, Name: this.inputActionTypeName }]\r\n : [{ Code: this.inputActionTypeCode, Name: this.inputActionTypeName }];\r\n }\r\n this.inputActionTypeCode = '';\r\n this.inputActionTypeName = '';\r\n this.inputActionTypeVisible = false;\r\n }\r\n //#endregion\r\n\r\n //#region Action role\r\n inputActionRoleValue = '';\r\n\r\n handleCloseActionRole(removedTag: {}): void {\r\n this.template.lstActionStatus = this.template.lstActionStatus.filter((tag) => tag !== removedTag);\r\n }\r\n //#endregion\r\n\r\n //#region Action status\r\n inputVisible = false;\r\n inputValue = '';\r\n @ViewChild('inputElement', { static: false }) inputElement?: ElementRef;\r\n\r\n checkRemoveableActionStatus(ActionStatus: string) {\r\n if (this.lstAction.find((x) => x.ActionStatus === ActionStatus)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n handleClose(ActionStatus: string): void {\r\n this.template.lstActionStatus = this.template.lstActionStatus.filter((tag) => tag.Code !== ActionStatus);\r\n this.lstActionStatusFiltered = [...this.template.lstActionStatus];\r\n }\r\n\r\n showInput(): void {\r\n this.inputVisible = true;\r\n setTimeout(() => {\r\n console.log(this.inputElement);\r\n this.inputElement?.nativeElement.focus();\r\n }, 10);\r\n }\r\n\r\n handleInputConfirm(): void {\r\n if (this.inputValue && !this.template.lstActionStatus?.find((x) => x.Code === this.inputValue)) {\r\n this.template.lstActionStatus = this.template.lstActionStatus\r\n ? [...this.template.lstActionStatus, { Code: this.inputValue }]\r\n : [{ Code: this.inputValue }];\r\n }\r\n this.inputValue = '';\r\n this.inputVisible = false;\r\n }\r\n //#endregion\r\n\r\n //#region Canvas action\r\n onMouseDownCanvas(event: MouseEvent) {\r\n console.log('onMouseDownCanvas > event.button', event.button);\r\n\r\n if (event.button !== 0) return; // button === 0 : chuột trái\r\n\r\n // click vào canvas trống\r\n if ((event.target as HTMLElement).closest('.workflow-node')) return;\r\n\r\n this.hoverStage = undefined;\r\n\r\n // 🖐 SPACE + drag → pan\r\n if (this.isMoveMode) {\r\n this.isPanning = true;\r\n this.panStart = {\r\n x: event.clientX,\r\n y: event.clientY,\r\n };\r\n\r\n this.canvasRef?.nativeElement.classList.add('panning');\r\n return;\r\n }\r\n\r\n const p = this.getSvgPoint(event, true);\r\n\r\n this.isSelecting = true;\r\n this.selectStart = p;\r\n this.selectEnd = p;\r\n\r\n this.lstSelectedStageId.clear();\r\n }\r\n\r\n onMouseMoveCanvas(event: MouseEvent) {\r\n if (this.isPanning && this.panStart) {\r\n const dx = event.clientX - this.panStart.x;\r\n const dy = event.clientY - this.panStart.y;\r\n\r\n this.template.editorOption.panX += dx;\r\n this.template.editorOption.panY += dy;\r\n\r\n this.panStart = {\r\n x: event.clientX,\r\n y: event.clientY,\r\n };\r\n\r\n return;\r\n }\r\n\r\n const p = this.getSvgPoint(event);\r\n\r\n const dx = Math.abs(event.clientX - this.dragStartX);\r\n const dy = Math.abs(event.clientY - this.dragStartY);\r\n\r\n if (dx > 4 || dy > 4) {\r\n this.isDragging = true;\r\n }\r\n\r\n // 1️⃣ đang kéo vùng chọn\r\n if (this.isSelecting && this.selectStart) {\r\n const p1 = this.getSvgPoint(event, true);\r\n this.selectEnd = p1;\r\n this.updateSelection();\r\n return;\r\n }\r\n\r\n // 2️⃣ đang kéo nhiều node\r\n if (this.draggingGroup && this.dragStartMouse) {\r\n let dx = p.x - this.dragStartMouse.x;\r\n let dy = p.y - this.dragStartMouse.y;\r\n\r\n // ⭐ xác định trục lock\r\n if (event.shiftKey && !this.axisLock) {\r\n this.axisLock = Math.abs(dx) > Math.abs(dy) ? 'x' : 'y';\r\n }\r\n\r\n if (event.shiftKey && this.axisLock === 'x') {\r\n dy = 0;\r\n }\r\n\r\n if (event.shiftKey && this.axisLock === 'y') {\r\n dx = 0;\r\n }\r\n\r\n const snap = this.snapPoint(\r\n {\r\n x: this.dragStartMouse.x + dx,\r\n y: this.dragStartMouse.y + dy,\r\n },\r\n event,\r\n );\r\n\r\n const sdx = snap.x - this.dragStartMouse.x;\r\n const sdy = snap.y - this.dragStartMouse.y;\r\n\r\n // for (const n of this.lstStage) {\r\n // if (!this.lstSelectedStageCode.has(n.Code)) continue;\r\n\r\n // const start = this.dragStartPositions.get(n.Code)!;\r\n // n.x = start.x + sdx;\r\n // n.y = start.y + sdy;\r\n // }\r\n\r\n const nodeW = this.NODE_WIDTH;\r\n const nodeH = this.NODE_HEIGHT;\r\n\r\n // tìm biên group\r\n let minX = Infinity;\r\n let minY = Infinity;\r\n let maxX = -Infinity;\r\n let maxY = -Infinity;\r\n\r\n for (const n of this.lstStage) {\r\n if (!this.lstSelectedStageId.has(n.WF_TemplateStage_Id)) continue;\r\n\r\n const start = this.dragStartPositions.get(n.WF_TemplateStage_Id)!;\r\n\r\n minX = Math.min(minX, start.x);\r\n minY = Math.min(minY, start.y);\r\n maxX = Math.max(maxX, start.x + nodeW);\r\n maxY = Math.max(maxY, start.y + nodeH);\r\n }\r\n\r\n // clamp delta\r\n const clampedDx = this.clamp(sdx, -minX, this.getCanvasWidth() - maxX);\r\n\r\n const clampedDy = this.clamp(sdy, -minY, this.getCanvasHeight() - maxY);\r\n\r\n // 🔹 move nodes\r\n for (const n of this.lstStage) {\r\n if (!this.lstSelectedStageId.has(n.WF_TemplateStage_Id)) continue;\r\n\r\n const start = this.dragStartPositions.get(n.WF_TemplateStage_Id)!;\r\n n.editorOption.x = start.x + clampedDx;\r\n n.editorOption.y = start.y + clampedDy;\r\n }\r\n\r\n // 🔹 move edge points\r\n for (const [edge, startPoints] of this.dragStartEdgePoints.entries()) {\r\n if (!edge.editorOption.points) continue;\r\n\r\n edge.editorOption.points.forEach((pt, i) => {\r\n pt.x = startPoints[i].x + dx;\r\n pt.y = startPoints[i].y + dy;\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n // 4️⃣ đang kéo 1 node\r\n if (this.draggingNode) {\r\n const dx = p.x;\r\n const dy = p.y;\r\n\r\n // ⭐ xác định trục khi giữ Shift\r\n if (event.shiftKey && !this.axisLock) {\r\n if (Math.abs(dx) > Math.abs(dy)) {\r\n this.axisLock = 'x';\r\n } else {\r\n this.axisLock = 'y';\r\n }\r\n }\r\n\r\n let rawX = p.x - this.offsetX;\r\n let rawY = p.y - this.offsetY;\r\n\r\n // ⭐ khoá trục\r\n if (event.shiftKey && this.axisLock === 'x') {\r\n rawY = this.draggingNode.editorOption.y;\r\n }\r\n\r\n if (event.shiftKey && this.axisLock === 'y') {\r\n rawX = this.draggingNode.editorOption.x;\r\n }\r\n\r\n const snap = this.snapPoint({ x: rawX, y: rawY }, event);\r\n\r\n // this.draggingNode.x = snap.x;\r\n // this.draggingNode.y = snap.y;\r\n\r\n const nodeW = this.NODE_WIDTH;\r\n const nodeH = this.NODE_HEIGHT;\r\n\r\n this.draggingNode.editorOption.x = this.clamp(snap.x, 0, this.getCanvasWidth() - nodeW);\r\n\r\n this.draggingNode.editorOption.y = this.clamp(snap.y, 0, this.getCanvasHeight() - nodeH);\r\n\r\n return;\r\n }\r\n\r\n // 3️⃣ đang kéo waypoint\r\n if (this.draggingPoint) {\r\n const p1 = this.getSvgPoint(event, true);\r\n const snap = this.snapPoint(p1, event);\r\n // this.draggingPoint.x = snap.x;\r\n // this.draggingPoint.y = snap.y;\r\n\r\n this.draggingPoint.x = this.clamp(snap.x, 0, this.getCanvasWidth());\r\n\r\n this.draggingPoint.y = this.clamp(snap.y, 0, this.getCanvasHeight());\r\n\r\n return;\r\n }\r\n\r\n // 5️⃣ đang kéo connection preview\r\n if (this.connectingFrom) {\r\n const p = this.getSvgPoint(event, true);\r\n this.previewX = p.x;\r\n this.previewY = p.y;\r\n }\r\n }\r\n\r\n onMouseUpCanvas(event?: MouseEvent) {\r\n this.isSelecting = false;\r\n this.draggingGroup = false;\r\n this.draggingNode = undefined;\r\n this.draggingPoint = undefined;\r\n this.isPanning = false;\r\n\r\n setTimeout(() => {\r\n this.isDragging = false;\r\n this.updateMiniMap();\r\n });\r\n }\r\n\r\n onClickCanvas(e: MouseEvent) {\r\n console.log('onClickCanvas ', e.offsetX, e.offsetY);\r\n\r\n if (!this.connectingFrom) return;\r\n\r\n this.connectingPoints.push({\r\n x: e.offsetX,\r\n y: e.offsetY,\r\n });\r\n\r\n console.log(this.connectingPoints);\r\n }\r\n //#endregion\r\n\r\n //#region NODE action\r\n\r\n onMouseDownNode(event: MouseEvent, node: WorkflowStage) {\r\n console.log('onMouseDownNode ', node);\r\n console.log('onMouseDownNode ', event);\r\n\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n if ((event.target as HTMLDivElement).classList.contains('connector')) {\r\n return;\r\n }\r\n\r\n this.axisLock = null;\r\n\r\n const p = this.getSvgPoint(event);\r\n\r\n // CASE 1️⃣: node nằm trong selection → kéo cả group\r\n if (this.lstSelectedStageId.has(node.WF_TemplateStage_Id)) {\r\n /* =============================\r\n * UNDO SNAPSHOT (GROUP)\r\n * ============================= */\r\n this.pushUndo({\r\n type: 'move-nodes',\r\n before: this.cloneNodePositions(this.lstSelectedStageId),\r\n });\r\n\r\n this.draggingGroup = true;\r\n this.dragStartMouse = p;\r\n\r\n // 🔹 snapshot node positions\r\n this.dragStartPositions.clear();\r\n for (const n of this.lstStage) {\r\n if (this.lstSelectedStageId.has(n.WF_TemplateStage_Id)) {\r\n this.dragStartPositions.set(n.WF_TemplateStage_Id, { x: n.editorOption.x, y: n.editorOption.y });\r\n }\r\n }\r\n\r\n // 🔹 snapshot edge points\r\n this.dragStartEdgePoints = new Map<WorkflowAction, { x: number; y: number }[]>();\r\n\r\n for (const e of this.lstAction) {\r\n if (!e.editorOption.points?.length) continue;\r\n\r\n if (\r\n this.lstSelectedStageId.has(e.WF_TemplateStage_Id) ||\r\n this.lstSelectedStageId.has(e.To_WF_TemplateStage_Id)\r\n ) {\r\n this.dragStartEdgePoints.set(\r\n e,\r\n e.editorOption.points.map((p) => ({ x: p.x, y: p.y })),\r\n );\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n // CASE 2️⃣: node chưa được chọn → kéo node đơn\r\n this.lstSelectedStageId.clear();\r\n this.hoverStage = undefined;\r\n // this.selectedNodeIds.add(node.id);\r\n\r\n /* =============================\r\n * UNDO SNAPSHOT (1 NODE)\r\n * ============================= */\r\n this.pushUndo({\r\n type: 'move-nodes',\r\n before: this.cloneNodePositions(new Set([node.WF_TemplateStage_Id])),\r\n });\r\n\r\n this.draggingNode = node;\r\n this.dragStartX = event.clientX;\r\n this.dragStartY = event.clientY;\r\n this.offsetX = event.clientX - node.editorOption.x;\r\n this.offsetY = event.clientY - node.editorOption.y;\r\n this.isDragging = false;\r\n }\r\n\r\n onClickStage(node: WorkflowStage) {\r\n console.log('onClickStage ', node);\r\n\r\n this.hoverStage = undefined;\r\n this.selectedStage = undefined;\r\n\r\n if (this.isDragging) return;\r\n\r\n if (this.connectingFrom) {\r\n if (this.connectingFrom.node.WF_TemplateStage_Id !== node.WF_TemplateStage_Id) {\r\n const existed = this.lstAction.some(\r\n (e) =>\r\n e.WF_TemplateStage_Id === this.connectingFrom!.node.WF_TemplateStage_Id &&\r\n e.To_WF_TemplateStage_Id === node.WF_TemplateStage_Id,\r\n );\r\n\r\n if (!existed) {\r\n const newAction = new WorkflowAction();\r\n newAction.WF_TemplateStage_Id = this.connectingFrom.node.WF_TemplateStage_Id;\r\n newAction.FromSide = this.connectingFrom.side;\r\n newAction.To_WF_TemplateStage_Id = node.WF_TemplateStage_Id;\r\n newAction.ToSide = 'left';\r\n\r\n // ⭐ NẾU CÓ WAYPOINT → MANUAL ROUTE\r\n if (this.connectingPoints.length > 0) {\r\n newAction.editorOption.points = [...this.connectingPoints];\r\n }\r\n\r\n this.lstAction.push(newAction);\r\n\r\n console.log('from action', this.connectingFrom.node);\r\n console.log('to action', node);\r\n console.log('newAction', newAction);\r\n }\r\n }\r\n\r\n this.cancelConnecting();\r\n\r\n return;\r\n }\r\n\r\n if (this.isDragging) return;\r\n if (this.lstSelectedStageId.size) return;\r\n // if (node.id == 'start' || node.id == 'end') return;\r\n\r\n this.hoverStage = node;\r\n this.selectedStage = node;\r\n }\r\n //#endregion\r\n\r\n //#region EDGE action\r\n onMouseEnterEdge(e: WorkflowAction) {\r\n // console.log('onMouseEnterEdge', e);\r\n if (this.connectingFrom) return;\r\n this.hoverAction = e;\r\n this.connectingPoints = e.editorOption.points || [];\r\n }\r\n\r\n onMouseLeaveEdge(e: WorkflowAction) {\r\n // console.log('onEdgeLeave', e);\r\n if (this.connectingFrom) return;\r\n this.hoverAction = undefined;\r\n this.connectingPoints = [];\r\n }\r\n\r\n private edgeClickTimer: any = null;\r\n private CLICK_DELAY = 250;\r\n\r\n onClickEdge(edge: WorkflowAction, event: MouseEvent, doAction = false) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n if (this.edgeClickTimer) {\r\n // 👉 DBL CLICK\r\n clearTimeout(this.edgeClickTimer);\r\n this.edgeClickTimer = null;\r\n\r\n this.onDoubleClickEdge(event, edge);\r\n return;\r\n }\r\n\r\n if (doAction) {\r\n this.selectedAction = edge;\r\n this.selectedBackAction = this.lstAction.find(\r\n (x) =>\r\n x.isBackAction == true &&\r\n x.WF_TemplateStage_Id == this.selectedAction?.To_WF_TemplateStage_Id &&\r\n x.To_WF_TemplateStage_Id == this.selectedAction?.WF_TemplateStage_Id,\r\n );\r\n } else {\r\n // 👉 SINGLE CLICK (chờ xem có dbl không)\r\n this.edgeClickTimer = setTimeout(() => {\r\n this.edgeClickTimer = null;\r\n console.log('onClickEdge', edge);\r\n\r\n this.onClickEdge(edge, event, true);\r\n }, this.CLICK_DELAY);\r\n }\r\n }\r\n\r\n onDoubleClickEdge(event: MouseEvent, edge: WorkflowAction) {\r\n console.log('onDoubleClickEdge', edge);\r\n\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n const p = this.getSvgPoint(event, true);\r\n\r\n // Nếu edge chưa có manual points → convert auto → manual\r\n if (!edge.editorOption.points || edge.editorOption.points.length === 0) {\r\n edge.editorOption.points = [];\r\n }\r\n\r\n const insertIndex = this.findInsertIndex(edge, p);\r\n\r\n edge.editorOption.points.splice(insertIndex, 0, {\r\n x: p.x,\r\n y: p.y,\r\n });\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Connector action\r\n onClickConnector(event: MouseEvent, node: WorkflowStage, side: 'left' | 'right') {\r\n console.log('onClickConnector', side, node);\r\n\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n const p = this.getSvgPoint(event, true);\r\n this.previewX = p.x;\r\n this.previewY = p.y;\r\n\r\n /* =============================\r\n * CLICK OUT (RIGHT) → BẮT ĐẦU\r\n * ============================= */\r\n if (side === 'right') {\r\n if (this.connectingFrom) return;\r\n\r\n this.connectingFrom = {\r\n node: node,\r\n side: side,\r\n };\r\n this.connectingPoints = []; // ⭐ reset waypoint\r\n return;\r\n }\r\n\r\n /* =============================\r\n * CLICK IN (LEFT) → KẾT THÚC\r\n * ============================= */\r\n if (side === 'left' && this.connectingFrom) {\r\n if (this.connectingFrom.node.WF_TemplateStage_Id !== node.WF_TemplateStage_Id) {\r\n const existed = this.lstAction.some(\r\n (e) =>\r\n e.WF_TemplateStage_Id === this.connectingFrom!.node.WF_TemplateStage_Id &&\r\n e.To_WF_TemplateStage_Id === node.WF_TemplateStage_Id,\r\n );\r\n\r\n if (!existed) {\r\n const newAction = new WorkflowAction();\r\n newAction.WF_TemplateStage_Id = this.connectingFrom.node.WF_TemplateStage_Id;\r\n newAction.FromSide = this.connectingFrom.side;\r\n newAction.To_WF_TemplateStage_Id = node.WF_TemplateStage_Id;\r\n newAction.ToSide = 'left';\r\n\r\n // ⭐ NẾU CÓ WAYPOINT → MANUAL ROUTE\r\n if (this.connectingPoints.length > 0) {\r\n newAction.editorOption.points = [...this.connectingPoints];\r\n }\r\n\r\n this.lstAction.push(newAction);\r\n }\r\n }\r\n\r\n this.cancelConnecting();\r\n }\r\n }\r\n //#endregion\r\n\r\n //#region Point action\r\n onmousedownPoint(event: MouseEvent, p: Point) {\r\n console.log('onmousedownPoint', p);\r\n\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n if (!this.draggingPoint) {\r\n this.draggingPoint = p;\r\n } else {\r\n this.draggingPoint = undefined;\r\n }\r\n }\r\n\r\n onRightClickPoint(event: MouseEvent, edge: WorkflowAction, index: number) {\r\n console.log('onRightClickPoint', edge, index);\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (!edge.editorOption.points) return;\r\n\r\n edge.editorOption.points.splice(index, 1);\r\n }\r\n //#endregion\r\n\r\n //#region UNDO REDU\r\n undoStack: any[] = [];\r\n redoStack: any[] = [];\r\n\r\n cloneNodePositions(nodeIds: Set<number>) {\r\n const map = new Map<number, { x: number; y: number }>();\r\n for (const n of this.lstStage) {\r\n if (nodeIds.has(n.WF_TemplateStage_Id)) {\r\n map.set(n.WF_TemplateStage_Id, { x: n.editorOption.x, y: n.editorOption.y });\r\n }\r\n }\r\n return map;\r\n }\r\n\r\n pushAlignUndo() {\r\n this.pushUndo({\r\n type: 'move-nodes',\r\n before: this.cloneNodePositions(this.lstSelectedStageId),\r\n });\r\n }\r\n\r\n pushUndo(action: any) {\r\n this.undoStack.push(action);\r\n this.redoStack = [];\r\n }\r\n\r\n undo() {\r\n const action = this.undoStack.pop();\r\n if (!action) return;\r\n\r\n switch (action.type) {\r\n case 'move-nodes':\r\n this.undoMoveNodes(action);\r\n break;\r\n\r\n case 'delete-node': {\r\n // 🔙 restore node\r\n this.lstStage.splice(action.nodeIndex, 0, action.node);\r\n\r\n // 🔙 restore edges\r\n this.lstAction.push(...action.edges);\r\n\r\n // redo snapshot\r\n this.redoStack.push(action);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n undoMoveNodes(action: any) {\r\n const after = this.cloneNodePositions(new Set(action.before.keys()));\r\n\r\n this.redoStack.push({\r\n type: 'move-nodes',\r\n before: after,\r\n });\r\n\r\n // restore\r\n action.before.forEach((pos: any, id: any) => {\r\n const node = this.lstStage.find((n) => n.WF_TemplateStage_Id === id);\r\n if (node) {\r\n node.editorOption.x = pos.x;\r\n node.editorOption.y = pos.y;\r\n }\r\n });\r\n }\r\n\r\n redo() {\r\n const action = this.redoStack.pop();\r\n if (!action) return;\r\n\r\n switch (action.type) {\r\n case 'move-nodes':\r\n this.redoMoveNodes(action);\r\n break;\r\n\r\n case 'delete-node': {\r\n const nodeId = action.node.id;\r\n\r\n // redo = xoá lại\r\n this.lstAction = this.lstAction.filter(\r\n (e) => e.WF_TemplateStage_Id !== nodeId && e.To_WF_TemplateStage_Id !== nodeId,\r\n );\r\n\r\n const idx = this.lstStage.findIndex((n) => n.WF_TemplateStage_Id === nodeId);\r\n if (idx >= 0) this.lstStage.splice(idx, 1);\r\n\r\n this.undoStack.push(action);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n redoMoveNodes(action: any) {\r\n const after = this.cloneNodePositions(new Set(action.before.keys()));\r\n\r\n this.undoStack.push({\r\n type: 'move-nodes',\r\n before: after,\r\n });\r\n\r\n action.before.forEach((pos: any, id: any) => {\r\n const node = this.lstStage.find((n) => n.WF_TemplateStage_Id === id);\r\n if (node) {\r\n node.editorOption.x = pos.x;\r\n node.editorOption.y = pos.y;\r\n }\r\n });\r\n }\r\n\r\n //#endregion\r\n\r\n NODE_WIDTH = 160;\r\n NODE_HEIGHT = 80;\r\n\r\n //#region ALIGN\r\n\r\n getSelectedNodes(): WorkflowStage[] {\r\n return this.lstStage.filter((n) => this.lstSelectedStageId.has(n.WF_TemplateStage_Id));\r\n }\r\n\r\n alignLeft() {\r\n if (this.lstSelectedStageId.size < 2) return;\r\n\r\n this.pushAlignUndo();\r\n\r\n const nodes = this.getSelectedNodes();\r\n const minX = Math.min(...nodes.map((n) => n.editorOption.x));\r\n nodes.forEach((n) => (n.editorOption.x = minX));\r\n }\r\n\r\n alignCenter() {\r\n if (this.lstSelectedStageId.size < 2) return;\r\n\r\n this.pushAlignUndo();\r\n\r\n const nodes = this.getSelectedNodes();\r\n const centers = nodes.map((n) => n.editorOption.x + this.NODE_WIDTH / 2);\r\n const centerX = centers.reduce((a, b) => a + b) / centers.length;\r\n\r\n nodes.forEach((n) => {\r\n n.editorOption.x = centerX - this.NODE_WIDTH / 2;\r\n });\r\n }\r\n\r\n alignRight() {\r\n if (this.lstSelectedStageId.size < 2) return;\r\n\r\n this.pushAlignUndo();\r\n\r\n const nodes = this.getSelectedNodes();\r\n const maxX = Math.max(...nodes.map((n) => n.editorOption.x + this.NODE_WIDTH));\r\n nodes.forEach((n) => (n.editorOption.x = maxX - this.NODE_WIDTH));\r\n }\r\n\r\n alignTop() {\r\n if (this.lstSelectedStageId.size < 2) return;\r\n\r\n this.pushAlignUndo();\r\n\r\n const nodes = this.getSelectedNodes();\r\n const minY = Math.min(...nodes.map((n) => n.editorOption.y));\r\n nodes.forEach((n) => (n.editorOption.y = minY));\r\n }\r\n\r\n alignMiddle() {\r\n if (this.lstSelectedStageId.size < 2) return;\r\n\r\n this.pushAlignUndo();\r\n\r\n const nodes = this.getSelectedNodes();\r\n const centers = nodes.map((n) => n.editorOption.y + this.NODE_HEIGHT / 2);\r\n const centerY = centers.reduce((a, b) => a + b) / centers.length;\r\n\r\n nodes.forEach((n) => {\r\n n.editorOption.y = centerY - this.NODE_HEIGHT / 2;\r\n });\r\n }\r\n\r\n alignBottom() {\r\n if (this.lstSelectedStageId.size < 2) return;\r\n\r\n this.pushAlignUndo();\r\n\r\n const nodes = this.getSelectedNodes();\r\n const maxY = Math.max(...nodes.map((n) => n.editorOption.y + this.NODE_HEIGHT));\r\n nodes.forEach((n) => (n.editorOption.y = maxY - this.NODE_HEIGHT));\r\n }\r\n\r\n distributeHorizontal() {\r\n if (this.lstSelectedStageId.size < 3) return;\r\n\r\n this.pushAlignUndo();\r\n\r\n const nodes = this.getSelectedNodes().sort((a, b) => a.editorOption.x - b.editorOption.x);\r\n\r\n const first = nodes[0];\r\n const last = nodes[nodes.length - 1];\r\n\r\n const totalWidth = nodes.reduce((s, n) => s + this.NODE_WIDTH, 0);\r\n const space = (last.editorOption.x - first.editorOption.x - totalWidth + this.NODE_WIDTH) / (nodes.length - 1);\r\n\r\n let x = first.editorOption.x;\r\n\r\n nodes.forEach((n, i) => {\r\n if (i === 0 || i === nodes.length - 1) {\r\n x = n.editorOption.x + this.NODE_WIDTH + space;\r\n return;\r\n }\r\n n.editorOption.x = x;\r\n x += this.NODE_WIDTH + space;\r\n });\r\n }\r\n\r\n distributeVertical() {\r\n if (this.lstSelectedStageId.size < 3) return;\r\n\r\n this.pushAlignUndo();\r\n\r\n const nodes = this.getSelectedNodes().sort((a, b) => a.editorOption.y - b.editorOption.y);\r\n\r\n const first = nodes[0];\r\n const last = nodes[nodes.length - 1];\r\n\r\n const totalHeight = nodes.reduce((s, n) => s + this.NODE_HEIGHT, 0);\r\n const space = (last.editorOption.y - first.editorOption.y - totalHeight + this.NODE_HEIGHT) / (nodes.length - 1);\r\n\r\n let y = first.editorOption.y;\r\n\r\n nodes.forEach((n, i) => {\r\n if (i === 0 || i === nodes.length - 1) {\r\n y = n.editorOption.y + this.NODE_HEIGHT + space;\r\n return;\r\n }\r\n n.editorOption.y = y;\r\n y += this.NODE_HEIGHT + space;\r\n });\r\n }\r\n\r\n //#endregion\r\n\r\n //#region zoom\r\n zoom = 1;\r\n minZoom = 0.5;\r\n maxZoom = 2;\r\n zoomStep = 0.1;\r\n\r\n get svgTransform(): string {\r\n const cx = this.getCanvasWidth() / 2;\r\n const cy = this.getCanvasHeight() / 2;\r\n\r\n return `\r\n translate(${cx} ${cy})\r\n scale(${this.zoom})\r\n translate(${-cx} ${-cy})\r\n `;\r\n }\r\n\r\n zoomIn() {\r\n this.zoom = Math.min(this.zoom + this.zoomStep, this.maxZoom);\r\n }\r\n\r\n zoomOut() {\r\n this.zoom = Math.max(this.zoom - this.zoomStep, this.minZoom);\r\n }\r\n //#endregion\r\n\r\n //#region HELPER\r\n\r\n isEdgeReversed(edge: WorkflowAction): boolean {\r\n const x = this.lstStage.find((x) => x.WF_TemplateStage_Id == edge.WF_TemplateStage_Id);\r\n const y = this.lstStage.find((x) => x.WF_TemplateStage_Id == edge.To_WF_TemplateStage_Id);\r\n\r\n if (!x || !y) return false;\r\n\r\n const from = this.getNodeCenter(x, 'right');\r\n const to = this.getNodeCenter(y, 'left');\r\n\r\n return to.x < from.x;\r\n }\r\n\r\n getEdgeLabelPosition(edge: WorkflowAction) {\r\n // Ưu tiên waypoint giữa nếu có\r\n if (edge.editorOption.points && edge.editorOption.points.length > 0) {\r\n const mid = edge.editorOption.points[Math.floor(edge.editorOption.points.length / 2)];\r\n return { x: mid.x, y: mid.y };\r\n }\r\n\r\n // fallback: giữa from → to\r\n const x = this.lstStage.find((x) => x.WF_TemplateStage_Id == edge.WF_TemplateStage_Id);\r\n const y = this.lstStage.find((x) => x.WF_TemplateStage_Id == edge.To_WF_TemplateStage_Id);\r\n\r\n if (!x || !y) return { x: 0, y: 0 };\r\n\r\n const from = this.getNodeCenter(x, 'right');\r\n const to = this.getNodeCenter(y, 'left');\r\n\r\n return {\r\n x: (from.x + to.x) / 2,\r\n y: (from.y + to.y) / 2,\r\n };\r\n }\r\n\r\n getNodeCenter(node: WorkflowStage, side: 'left' | 'right' | 'top' | 'bottom' = 'right') {\r\n // const width = node.width ?? 160; // ⭐ đúng với card của bạn\r\n // const height = node.height ?? 80;\r\n\r\n const width = 160;\r\n const height = 80;\r\n\r\n switch (side) {\r\n case 'left':\r\n return {\r\n x: node.editorOption.x,\r\n y: node.editorOption.y + height / 2,\r\n };\r\n\r\n case 'right':\r\n return {\r\n x: node.editorOption.x + width,\r\n y: node.editorOption.y + height / 2,\r\n };\r\n\r\n case 'top':\r\n return {\r\n x: node.editorOption.x + width / 2,\r\n y: node.editorOption.y,\r\n };\r\n\r\n case 'bottom':\r\n return {\r\n x: node.editorOption.x + width / 2,\r\n y: node.editorOption.y + height,\r\n };\r\n }\r\n }\r\n\r\n clamp(value: number, min: number, max: number) {\r\n return Math.max(min, Math.min(max, value));\r\n }\r\n\r\n findInsertIndex(edge: WorkflowAction, p: { x: number; y: number }): number {\r\n const points = this.getEdgeFullPoints(edge);\r\n\r\n if (!points) return 0;\r\n\r\n let minDist = Infinity;\r\n let index = 0;\r\n\r\n for (let i = 0; i < points.length - 1; i++) {\r\n const d = this.pointToSegmentDistance(p, points[i], points[i + 1]);\r\n\r\n if (d < minDist) {\r\n minDist = d;\r\n index = i;\r\n }\r\n }\r\n\r\n // index tương ứng với vị trí trong edge.points\r\n return Math.max(0, index);\r\n }\r\n\r\n getEdgeFullPoints(edge: WorkflowAction) {\r\n if (!edge.WF_TemplateStage_Id || !edge.To_WF_TemplateStage_Id) return null;\r\n\r\n const from = this.getNode(edge.WF_TemplateStage_Id);\r\n const to = this.getNode(edge.To_WF_TemplateStage_Id);\r\n\r\n if (!from || !to) return null;\r\n\r\n return [\r\n { x: from.editorOption.x + 160, y: from.editorOption.y + 40 },\r\n ...(edge.editorOption.points || []),\r\n { x: to.editorOption.x, y: to.editorOption.y + 40 },\r\n ];\r\n }\r\n\r\n pointToSegmentDistance(p: any, a: any, b: any): number {\r\n const dx = b.x - a.x;\r\n const dy = b.y - a.y;\r\n\r\n if (dx === 0 && dy === 0) {\r\n return Math.hypot(p.x - a.x, p.y - a.y);\r\n }\r\n\r\n const t = ((p.x - a.x) * dx + (p.y - a.y) * dy) / (dx * dx + dy * dy);\r\n\r\n const clamped = Math.max(0, Math.min(1, t));\r\n\r\n const proj = {\r\n x: a.x + clamped * dx,\r\n y: a.y + clamped * dy,\r\n };\r\n\r\n return Math.hypot(p.x - proj.x, p.y - proj.y);\r\n }\r\n\r\n isPositionOccupied(x: number, y: number): boolean {\r\n return this.lstStage.some((n) => Math.abs(n.editorOption?.x - x) < 160 && Math.abs(n.editorOption?.y - y) < 80);\r\n }\r\n\r\n getCanvasWidth(): number {\r\n // return 3000;\r\n\r\n const PADDING = 300;\r\n const CANVAS_MIN_WIDTH = 2000;\r\n\r\n const maxX = Math.max(\r\n ...this.lstStage.map((n) => (n.StageType == '_end_' ? n.editorOption?.x || 0 : n.editorOption?.x || 0 + 160)), // 160 = node width\r\n CANVAS_MIN_WIDTH,\r\n );\r\n\r\n return maxX + PADDING;\r\n }\r\n\r\n getCanvasHeight(): number {\r\n // return 2000;\r\n\r\n const PADDING = 200;\r\n const CANVAS_MIN_HEIGHT = 1500;\r\n\r\n const maxY = Math.max(...this.lstStage.map((n) => n.editorOption?.y || 0 + 80), CANVAS_MIN_HEIGHT);\r\n\r\n return maxY + PADDING;\r\n }\r\n\r\n /* =============================\r\n * CONVERT MOUSE → SVG COORD\r\n * ============================= */\r\n getSvgPoint(event: MouseEvent, preview = false): { x: number; y: number } {\r\n const svg = this.svgRef.nativeElement as SVGSVGElement;\r\n const pt = svg.createSVGPoint();\r\n\r\n pt.x = event.clientX;\r\n pt.y = event.clientY;\r\n\r\n const result = pt.matrixTransform(svg.getScreenCTM()!.inverse());\r\n\r\n if (preview) {\r\n return { x: result.x, y: result.y };\r\n } else {\r\n return { x: event.clientX, y: event.clientY };\r\n }\r\n }\r\n\r\n updateSelection() {\r\n if (!this.selectStart || !this.selectEnd) return;\r\n\r\n const x1 = Math.min(this.selectStart.x, this.selectEnd.x);\r\n const y1 = Math.min(this.selectStart.y, this.selectEnd.y);\r\n const x2 = Math.max(this.selectStart.x, this.selectEnd.x);\r\n const y2 = Math.max(this.selectStart.y, this.selectEnd.y);\r\n\r\n this.lstSelectedStageId.clear();\r\n\r\n for (const n of this.lstStage) {\r\n const nx1 = n.editorOption.x;\r\n const ny1 = n.editorOption.y;\r\n const nx2 = n.editorOption.x + 160;\r\n const ny2 = n.editorOption.y + 80;\r\n\r\n const intersect = nx2 >= x1 && nx1 <= x2 && ny2 >= y1 && ny1 <= y2;\r\n\r\n if (intersect) {\r\n this.lstSelectedStageId.add(n.WF_TemplateStage_Id);\r\n }\r\n }\r\n }\r\n\r\n snapPoint(p: { x: number; y: number }, event?: MouseEvent) {\r\n if (!this.snapToGrid || event?.altKey) return p;\r\n if (!this.snapToGrid) return p;\r\n\r\n return {\r\n x: this.snap(p.x),\r\n y: this.snap(p.y),\r\n };\r\n }\r\n\r\n snap(value: number): number {\r\n return Math.round(value / this.gridSize) * this.gridSize;\r\n }\r\n\r\n getNode(id: number) {\r\n return this.lstStage.find((n) => n.WF_TemplateStage_Id === id);\r\n }\r\n //#endregion\r\n\r\n //#region BUILD PATH\r\n buildPath(edge: WorkflowAction): string {\r\n if (!edge.WF_TemplateStage_Id || !edge.To_WF_TemplateStage_Id) return '';\r\n\r\n const from = this.getNode(edge.WF_TemplateStage_Id);\r\n const to = this.getNode(edge.To_WF_TemplateStage_Id);\r\n\r\n if (!from || !to) return '';\r\n\r\n const start = {\r\n x: from.editorOption.x + (from.StageType == '_start_' ? 5 : from.editorOption.isReverse ? 0 : 160),\r\n y: from.editorOption.y + 40,\r\n };\r\n\r\n const end = {\r\n x: to.editorOption.x + (to.StageType == '_end_' ? 5 : to.editorOption.isReverse ? 160 : 0),\r\n y: to.editorOption.y + 40,\r\n };\r\n\r\n if (edge.editorOption.points && edge.editorOption.points.length) {\r\n return this.buildPathThroughPoints([start, ...edge.editorOption.points, end]);\r\n }\r\n\r\n // return this.buildRoutedPath({ node: from, side: edge.fromSide }, to.x, to.y + 40);\r\n return this.buildStragePath(start.x, start.y, end.x, end.y);\r\n }\r\n\r\n buildPreviewPath(): string {\r\n if (!this.connectingFrom) return '';\r\n\r\n const start = {\r\n x:\r\n this.connectingFrom.node.editorOption.x +\r\n (this.connectingFrom.node.StageType == '_start_'\r\n ? 5\r\n : this.connectingFrom.node.editorOption.isReverse\r\n ? 0\r\n : 160),\r\n y: this.connectingFrom.node.editorOption.y + 40,\r\n };\r\n\r\n const end = {\r\n x: this.previewX,\r\n y: this.previewY,\r\n };\r\n\r\n // ⭐ ĐÃ CÓ WAYPOINT → MANUAL PREVIEW\r\n if (this.connectingPoints.length > 0) {\r\n return this.buildPathThroughPoints([start, ...this.connectingPoints, end], 0);\r\n }\r\n\r\n // ⭐ CHƯA CÓ WAYPOINT → AUTO PREVIEW\r\n // return this.buildRoutedPath(this.connectingFrom, end.x, end.y, 0);\r\n return this.buildStragePath(start.x, start.y, end.x, end.y, 0);\r\n }\r\n\r\n buildStragePath(fromX: number, fromY: number, toX: number, toY: number, ARROW_GAP = 12): string {\r\n const x1 = fromX;\r\n const y1 = fromY;\r\n\r\n const x2 = toX;\r\n const y2 = toY;\r\n\r\n /* =============================\r\n * 1. VECTOR GỐC\r\n * ============================= */\r\n const dx = x2 - x1;\r\n const dy = y2 - y1;\r\n const len = Math.sqrt(dx * dx + dy * dy) || 1;\r\n\r\n /* =============================\r\n * 2. SHRINK START & END\r\n * ============================= */\r\n const sx = x1 + (dx / len) * ARROW_GAP;\r\n const sy = y1 + (dy / len) * ARROW_GAP;\r\n\r\n const ex = x2 - (dx / len) * ARROW_GAP;\r\n const ey = y2 - (dy / len) * ARROW_GAP;\r\n\r\n /* =============================\r\n * 3. PATH THẲNG\r\n * ============================= */\r\n return `\r\n M ${sx} ${sy}\r\n L ${ex} ${ey}\r\n `;\r\n }\r\n\r\n buildRoutedPath(\r\n from: {\r\n node: WorkflowStage;\r\n side: 'left' | 'right';\r\n },\r\n toX: number,\r\n toY: number,\r\n ARROW_GAP = 12,\r\n ): string {\r\n const x1 = from.node.editorOption.isReverse ? from.node.editorOption.x : from.node.editorOption.x + 160;\r\n const y1 = from.node.editorOption.y + 40;\r\n\r\n const x2 = toX;\r\n const y2 = toY;\r\n\r\n // const ARROW_GAP = 12;\r\n\r\n /* =============================\r\n * 1. VECTOR GỐC\r\n * ============================= */\r\n const dx = x2 - x1;\r\n const dy = y2 - y1;\r\n const len = Math.sqrt(dx * dx + dy * dy) || 1;\r\n\r\n const ux = dx / len;\r\n const uy = dy / len;\r\n\r\n /* =============================\r\n * 2. START / END (CÁCH CONNECTOR ĐỀU)\r\n * ============================= */\r\n let sx = x1 + ux * ARROW_GAP;\r\n let sy = y1 + uy * ARROW_GAP;\r\n\r\n let ex = x2 - ux * ARROW_GAP;\r\n let ey = y2 - uy * ARROW_GAP;\r\n\r\n /* =============================\r\n * 3. KIỂM TRA BỊ CHẮN KHÔNG\r\n * ============================= */\r\n const blocked = this.isBlockedPoint(from, x2, y2);\r\n\r\n /* =============================\r\n * 4. ĐỘ CONG CƠ BẢN\r\n * ============================= */\r\n const dist = Math.sqrt((ex - sx) * (ex - sx) + (ey - sy) * (ey - sy));\r\n\r\n const BASE_CURVE = Math.max(30, Math.min(80, dist / 2));\r\n\r\n /* =============================\r\n * 5. KHÔNG BỊ CHẮN → CONG TRỰC TIẾP\r\n * ============================= */\r\n if (!blocked) {\r\n let c1x: number, c1y: number;\r\n let c2x: number, c2y: number;\r\n\r\n if (Math.abs(dy) < Math.abs(dx)) {\r\n // thiên ngang\r\n c1x = sx + BASE_CURVE;\r\n c1y = sy;\r\n c2x = ex - BASE_CURVE;\r\n c2y = ey;\r\n } else {\r\n // thiên dọc\r\n const dir = ey > sy ? 1 : -1;\r\n c1x = sx;\r\n c1y = sy + dir * BASE_CURVE;\r\n c2x = ex;\r\n c2y = ey - dir * BASE_CURVE;\r\n }\r\n\r\n return `\r\n M ${sx} ${sy}\r\n C ${c1x} ${c1y},\r\n ${c2x} ${c2y},\r\n ${ex} ${ey}\r\n `;\r\n }\r\n\r\n /* =============================\r\n * 6. BỊ CHẮN → ROUTE NÉ (S-CURVE)\r\n * ============================= */\r\n const routeY = this.findBestRouteY(from, ex, ey);\r\n const midX = (sx + ex) / 2;\r\n\r\n const CURVE = 40;\r\n\r\n return `\r\n M ${sx} ${sy}\r\n C ${sx + CURVE} ${sy},\r\n ${sx + CURVE} ${routeY},\r\n ${midX} ${routeY}\r\n S ${ex - CURVE} ${routeY},\r\n ${ex} ${ey}\r\n `;\r\n }\r\n\r\n buildPathThroughPoints(\r\n points: { x: number; y: number }[],\r\n ARROW_GAP = 12,\r\n tension = 0.1, // ⭐ 0.1 → rất thẳng, 0.5 → cong hơn\r\n ): string {\r\n if (points.length < 2) return '';\r\n\r\n const start = this.shrinkPoint(points[0], points[1], ARROW_GAP);\r\n const end = this.shrinkPoint(points[points.length - 1], points[points.length - 2], ARROW_GAP);\r\n\r\n const pts = [start, ...points.slice(1, -1), end];\r\n\r\n let d = `M ${pts[0].x} ${pts[0].y}`;\r\n\r\n for (let i = 0; i < pts.length - 1; i++) {\r\n const p0 = pts[i - 1] || pts[i];\r\n const p1 = pts[i];\r\n const p2 = pts[i + 1];\r\n const p3 = pts[i + 2] || p2;\r\n\r\n const c1x = p1.x + (p2.x - p0.x) * tension;\r\n const c1y = p1.y + (p2.y - p0.y) * tension;\r\n\r\n const c2x = p2.x - (p3.x - p1.x) * tension;\r\n const c2y = p2.y - (p3.y - p1.y) * tension;\r\n\r\n d += ` C ${c1x} ${c1y}, ${c2x} ${c2y}, ${p2.x} ${p2.y}`;\r\n }\r\n\r\n return d;\r\n }\r\n\r\n shrinkPoint(from: { x: number; y: number }, to: { x: number; y: number }, gap: number) {\r\n const dx = to.x - from.x;\r\n const dy = to.y - from.y;\r\n const len = Math.sqrt(dx * dx + dy * dy) || 1;\r\n\r\n return {\r\n x: from.x + (dx / len) * gap,\r\n y: from.y + (dy / len) * gap,\r\n };\r\n }\r\n\r\n isBlockedPoint(\r\n from: {\r\n node: WorkflowStage;\r\n side: 'left' | 'right';\r\n },\r\n x2: number,\r\n y2: number,\r\n ): boolean {\r\n const x1 = from.node.editorOption.isReverse ? from.node.editorOption.x + 160 : from.node.editorOption.x;\r\n const y1 = from.node.editorOption.y + 40;\r\n\r\n return this.lstStage.some((n) => {\r\n if (n.WF_TemplateStage_Id === from.node.WF_TemplateStage_Id) return false;\r\n\r\n // node phải nằm giữa theo trục X\r\n if (!this.isNodeBetweenX(x1, x2, n)) return false;\r\n\r\n // line phải cắt node theo trục Y\r\n return this.doesLineCrossNodeY(y1, n);\r\n });\r\n }\r\n\r\n findBestRouteY(\r\n from: {\r\n node: WorkflowStage;\r\n side: 'left' | 'right';\r\n },\r\n toX: number,\r\n toY: number,\r\n ): number {\r\n const baseY = from.node.editorOption.y + 40;\r\n\r\n const OFFSETS = [0, 80, -80, 160, -160, 240, -240];\r\n\r\n for (const offset of OFFSETS) {\r\n const routeY = baseY + offset;\r\n\r\n if (this.isLaneClear(from, toX, routeY)) {\r\n return routeY;\r\n }\r\n }\r\n\r\n // fallback: dùng lane xa nhất\r\n return baseY + OFFSETS[OFFSETS.length - 1];\r\n }\r\n\r\n isNodeBetweenX(fromX: number, toX: number, node: WorkflowStage): boolean {\r\n const nx1 = node.editorOption.x;\r\n const nx2 = node.editorOption.x + 160;\r\n\r\n const minX = Math.min(fromX, toX);\r\n const maxX = Math.max(fromX, toX);\r\n\r\n return nx2 > minX && nx1 < maxX;\r\n }\r\n\r\n doesLineCrossNodeY(\r\n y: number,\r\n node: WorkflowStage,\r\n tolerance = 6, // rất quan trọng\r\n ): boolean {\r\n const top = node.editorOption.y;\r\n const bottom = node.editorOption.y + 80;\r\n\r\n return y > top + tolerance && y < bottom - tolerance;\r\n }\r\n\r\n isLaneClear(\r\n from: {\r\n node: WorkflowStage;\r\n side: 'left' | 'right';\r\n },\r\n toX: number,\r\n routeY: number,\r\n ): boolean {\r\n const x1 = from.node.editorOption.x;\r\n const y1 = from.node.editorOption.y + 40;\r\n const x2 = toX;\r\n const y2 = routeY;\r\n\r\n return !this.lstStage.some((n) => {\r\n if (n.WF_TemplateStage_Id === from.node.WF_TemplateStage_Id) return false;\r\n\r\n // node phải nằm giữa theo trục X\r\n if (!this.isNodeBetweenX(x1, x2, n)) return false;\r\n\r\n // lane Y cắt node\r\n return this.doesLineCrossNodeY(routeY, n);\r\n });\r\n }\r\n //#endregion\r\n\r\n compareFun = (o1: { Code: string; Name?: string } | string, o2: { Code: string; Name?: string }): boolean => {\r\n if (o1) {\r\n return typeof o1 === 'string' ? o1 === o2.Code : o1.Code === o2.Code;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n lstActionStatusFiltered: { Code: string; Name?: string }[] = [];\r\n nzAutocompletechange(val: string, lstActionStatus: { Code: string; Name?: string }[]) {\r\n this.lstActionStatusFiltered = lstActionStatus\r\n .filter((x) => x.Code.includes(val))\r\n .sort((a, b) => a.Code.localeCompare(b.Code));\r\n }\r\n\r\n onenterAotu(ActionStatus: string) {\r\n if (!ActionStatus.trim()) return;\r\n if (ActionStatus && !this.template.lstActionStatus.find((x) => x.Code == ActionStatus)) {\r\n this.template.lstActionStatus = [...this.template.lstActionStatus, { Code: ActionStatus }];\r\n }\r\n }\r\n\r\n //#region action rule\r\n\r\n actionRuleModalVisible = false;\r\n\r\n lstAllTemplate: Workflow[] = [];\r\n lstAllStage: WorkflowStage[] = [];\r\n lstAllAction: WorkflowAction[] = [];\r\n\r\n lstTemplateForRule(item: ActionRuleLine) {\r\n if (this.hoverAction) {\r\n return this.lstAllTemplate.filter(\r\n (x) =>\r\n x.WF_Template_Id == item.WF_Template_Id ||\r\n !this.hoverAction!.actionRule.lstLine.find((y) => y.WF_Template_Id == x.WF_Template_Id),\r\n );\r\n }\r\n return this.lstAllTemplate;\r\n }\r\n\r\n lstStageForRule(WF_Template_Id: number): WorkflowStage[] {\r\n return this.lstAllStage.filter((x) => x.WF_Template_Id == WF_Template_Id);\r\n }\r\n\r\n lstActionForRule(WF_TemplateStage_Id: number): WorkflowAction[] {\r\n return this.lstAllAction.filter((x) => x.WF_TemplateStage_Id == WF_TemplateStage_Id);\r\n }\r\n\r\n addActionRuleLine() {\r\n if (this.hoverAction) {\r\n const newone = new ActionRuleLine();\r\n newone.IsActive = true;\r\n this.hoverAction.actionRule.lstLine = [...this.hoverAction.actionRule.lstLine, newone];\r\n }\r\n }\r\n\r\n async deleteActionRuleLine(actionRule: ActionRule, line: ActionRuleLine) {\r\n if (await this.confirm('Delete Rule Line???')) {\r\n if (!line.WF_TransitionRuleLine_Id) {\r\n actionRule.lstLine = actionRule.lstLine.filter((x) => x != line);\r\n } else {\r\n this.onDeleteRuleLine.emit(line.WF_TransitionRuleLine_Id);\r\n actionRule.lstLine = actionRule.lstLine.filter((x) => x != line);\r\n }\r\n }\r\n }\r\n\r\n async deleteActionRule(action: WorkflowAction) {\r\n console.log(action);\r\n\r\n if (await this.confirm('Delete Rule???')) {\r\n this.onDeleteRule.emit({\r\n WF_TemplateStageAction_Id: action.WF_TemplateStageAction_Id,\r\n WF_TransitionsRule_Id: action.WF_TransitionsRule_Id,\r\n });\r\n }\r\n }\r\n\r\n //#endregion action rule\r\n}\r\n","<div\r\n #canvasRef\r\n class=\"workflow-canvas\"\r\n [class.connecting]=\"!!connectingFrom\"\r\n [class.dragging-point]=\"!!draggingPoint\"\r\n [style.width.px]=\"getCanvasWidth()\"\r\n [style.height.px]=\"getCanvasHeight()\"\r\n (mousedown)=\"onMouseDownCanvas($event)\"\r\n (mousemove)=\"onMouseMoveCanvas($event)\"\r\n (mouseup)=\"onMouseUpCanvas($event)\"\r\n (click)=\"onClickCanvas($event)\"\r\n>\r\n <!-- \r\n\r\n [style.width.px]=\"getCanvasWidth()\"\r\n [style.height.px]=\"getCanvasHeight()\" \r\n\r\n [style.width.px]=\"CANVAS_WIDTH\"\r\n [style.height.px]=\"CANVAS_HEIGHT\"\r\n\r\n style=\"width: 100%; height: calc(100vh - 120px)\"\r\n \r\n -->\r\n\r\n <div class=\"toolbar\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\">\r\n <button nz-button nzSize=\"small\" nz-tooltip=\"Editor setting\" (click)=\"settingVisible = true\">\r\n <nz-icon nzType=\"setting\"></nz-icon>\r\n </button>\r\n\r\n <button nz-button nzSize=\"small\" nz-tooltip=\"Infomation\" (click)=\"infoVisible = true\">\r\n <nz-icon nzType=\"info-circle\"></nz-icon>\r\n </button>\r\n\r\n <box [width]=\"1\"></box>\r\n <span class=\"divider\"></span>\r\n <box [width]=\"1\"></box>\r\n\r\n <button nz-button nzSize=\"small\" nz-tooltip=\"Template setting\" (click)=\"drawTemplateVisibel = true\">\r\n <nz-icon nzType=\"setting\"></nz-icon> T\r\n </button>\r\n\r\n <box [width]=\"1\"></box>\r\n <span class=\"divider\"></span>\r\n <box [width]=\"1\"></box>\r\n\r\n <button nz-button nzSize=\"small\" nzDanger [nzLoading]=\"!ready\" nz-tooltip=\"Save (Ctrl + S)\" (click)=\"save()\">\r\n <nz-icon nzType=\"save\"></nz-icon>\r\n </button>\r\n <button nz-button nzSize=\"small\" nz-tooltip=\"Add stage\" (click)=\"addStage()\">\r\n <nz-icon nzType=\"plus\" class=\"color-primary\"></nz-icon>\r\n </button>\r\n\r\n <box [width]=\"1\"></box>\r\n <span class=\"divider\"></span>\r\n <box [width]=\"1\"></box>\r\n\r\n <button\r\n nz-button\r\n nzSize=\"small\"\r\n [nzType]=\"isMoveMode ? 'primary' : 'default'\"\r\n nz-tooltip=\"Move mode\"\r\n (click)=\"isMoveMode = true\"\r\n >\r\n <nz-icon><img src=\"/assets/icon/hand-palm.png\" width=\"19\" height=\"19\" /></nz-icon>\r\n </button>\r\n <button\r\n nz-button\r\n nzSize=\"small\"\r\n [nzType]=\"!isMoveMode ? 'primary' : 'default'\"\r\n nz-tooltip=\"Select mode\"\r\n (click)=\"isMoveMode = false\"\r\n >\r\n <nz-icon><img src=\"/assets/icon/cursor.png\" width=\"19\" height=\"19\" /></nz-icon>\r\n </button>\r\n\r\n <box [width]=\"1\"></box>\r\n <span class=\"divider\"></span>\r\n <box [width]=\"1\"></box>\r\n\r\n <!-- UNDO / REDO -->\r\n <button\r\n nz-button\r\n nzSize=\"small\"\r\n nzType=\"default\"\r\n [disabled]=\"undoStack.length === 0\"\r\n nz-tooltip=\"Undo\"\r\n (click)=\"undo()\"\r\n >\r\n <nz-icon nzType=\"undo\"></nz-icon>\r\n </button>\r\n\r\n <button\r\n nz-button\r\n nzSize=\"small\"\r\n nzType=\"default\"\r\n [disabled]=\"redoStack.length === 0\"\r\n nz-tooltip=\"Redo\"\r\n (click)=\"redo()\"\r\n >\r\n <nz-icon nzType=\"redo\"></nz-icon>\r\n </button>\r\n\r\n <box [width]=\"1\"></box>\r\n <span class=\"divider\"></span>\r\n <box [width]=\"1\"></box>\r\n\r\n <!-- ALIGN -->\r\n <button nz-button nzSize=\"small\" [disabled]=\"lstSelectedStageId.size < 2\" (click)=\"alignLeft()\">⟸</button>\r\n <button nz-button nzSize=\"small\" [disabled]=\"lstSelectedStageId.size < 2\" (click)=\"alignCenter()\">≡</button>\r\n <button nz-button nzSize=\"small\" [disabled]=\"lstSelectedStageId.size < 2\" (click)=\"alignRight()\">⟹</button>\r\n\r\n <span class=\"divider\"></span>\r\n\r\n <button nz-button nzSize=\"small\" [disabled]=\"lstSelectedStageId.size < 2\" (click)=\"alignTop()\">⇑</button>\r\n <button nz-button nzSize=\"small\" [disabled]=\"lstSelectedStageId.size < 2\" (click)=\"alignMiddle()\">═</button>\r\n <button nz-button nzSize=\"small\" [disabled]=\"lstSelectedStageId.size < 2\" (click)=\"alignBottom()\">⇓</button>\r\n\r\n <span class=\"divider\"></span>\r\n\r\n <!-- DISTRIBUTE -->\r\n <button nz-button nzSize=\"small\" [disabled]=\"lstSelectedStageId.size < 3\" (click)=\"distributeHorizontal()\">\r\n ⇄\r\n </button>\r\n <button nz-button nzSize=\"small\" [disabled]=\"lstSelectedStageId.size < 3\" (click)=\"distributeVertical()\">⇅</button>\r\n </div>\r\n\r\n <div\r\n class=\"canvas-content\"\r\n [class.panning]=\"isMoveMode\"\r\n [style.transform]=\"'translate(' + template.editorOption.panX + 'px,' + template.editorOption.panY + 'px)'\"\r\n >\r\n <!-- GRID -->\r\n <div *ngIf=\"wfcSetting.ShowGrid\" class=\"grid-layer\"></div>\r\n\r\n <!-- <div class=\"zoom-toolbar\">\r\n <button nz-button nzSize=\"small\" (click)=\"zoomOut()\">−</button>\r\n <span>{{ zoom * 100 | number: \"1.0-0\" }}%</span>\r\n <button nz-button nzSize=\"small\" (click)=\"zoomIn()\">+</button>\r\n </div> -->\r\n\r\n <!-- SVG EDGES -->\r\n <svg #svg class=\"edges-layer\" width=\"100%\" height=\"100%\" preserveAspectRatio=\"none\">\r\n <g [attr.transform]=\"svgTransform\">\r\n <!-- DEFS -->\r\n <defs>\r\n <!-- glow effect -->\r\n <filter id=\"edge-glow\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\">\r\n <feGaussianBlur stdDeviation=\"2\" result=\"blur\" />\r\n <feMerge>\r\n <feMergeNode in=\"blur\" />\r\n <feMergeNode in=\"SourceGraphic\" />\r\n </feMerge>\r\n </filter>\r\n\r\n <!-- arrow markers -->\r\n <marker\r\n id=\"arrow-blue\"\r\n markerWidth=\"10\"\r\n markerHeight=\"10\"\r\n refX=\"10\"\r\n refY=\"5\"\r\n orient=\"auto\"\r\n markerUnits=\"strokeWidth\"\r\n >\r\n <path class=\"blue\" d=\"M0,0 L10,5 L0,10\"></path>\r\n </marker>\r\n\r\n <marker\r\n id=\"arrow-red\"\r\n markerWidth=\"10\"\r\n markerHeight=\"10\"\r\n refX=\"10\"\r\n refY=\"5\"\r\n orient=\"auto\"\r\n markerUnits=\"strokeWidth\"\r\n >\r\n <path class=\"red\" d=\"M0,0 L10,5 L0,10\"></path>\r\n </marker>\r\n\r\n <marker\r\n id=\"arrow-blue-start\"\r\n markerWidth=\"10\"\r\n markerHeight=\"10\"\r\n viewBox=\"0 0 10 10\"\r\n refX=\"0\"\r\n refY=\"5\"\r\n orient=\"auto\"\r\n markerUnits=\"strokeWidth\"\r\n >\r\n <path class=\"blue\" d=\"M10,0 L0,5 L10,10\"></path>\r\n </marker>\r\n\r\n <marker\r\n id=\"arrow-red-start\"\r\n markerWidth=\"10\"\r\n markerHeight=\"10\"\r\n viewBox=\"0 0 10 10\"\r\n refX=\"0\"\r\n refY=\"5\"\r\n orient=\"auto\"\r\n markerUnits=\"strokeWidth\"\r\n >\r\n <path class=\"red\" d=\"M10,0 L0,5 L10,10\"></path>\r\n </marker>\r\n </defs>\r\n\r\n <!-- EDGES BÌNH THƯỜNG -->\r\n <ng-container *ngFor=\"let e of normalEdges; let i = index\">\r\n <path\r\n class=\"edge\"\r\n [attr.id]=\"'edge-path-' + i\"\r\n [attr.d]=\"buildPath(e)\"\r\n marker-end=\"url(#arrow-blue)\"\r\n [attr.marker-start]=\"e.allowBack ? 'url(#arrow-blue-start)' : ''\"\r\n ></path>\r\n\r\n <path\r\n class=\"edge-hit\"\r\n [attr.d]=\"buildPath(e)\"\r\n (mouseenter)=\"onMouseEnterEdge(e)\"\r\n (mouseleave)=\"onMouseLeaveEdge(e)\"\r\n (click)=\"onClickEdge(e, $event)\"\r\n ></path>\r\n\r\n <!-- LABEL -->\r\n <!-- text bám theo line -->\r\n <!-- \r\n <text *ngIf=\"e.ActionText\" class=\"edge-label\" dy=\"-6\">\r\n <textPath [attr.href]=\"'#edge-path-' + i\" startOffset=\"50%\" text-anchor=\"middle\">\r\n {{ e.ActionText }}\r\n </textPath>\r\n </text> \r\n \r\n <text *ngIf=\"e.allowBack && e.labelBack\" class=\"edge-label\" dy=\"14\">\r\n <textPath [attr.href]=\"'#edge-path-' + i\" startOffset=\"50%\" text-anchor=\"middle\">\r\n {{ e.labelBack }}\r\n </textPath>\r\n </text>\r\n -->\r\n\r\n <!-- text thẳng nằm ngang -->\r\n <text\r\n *ngIf=\"e.ActionText\"\r\n class=\"edge-label\"\r\n [attr.x]=\"getEdgeLabelPosition(e).x\"\r\n [attr.y]=\"getEdgeLabelPosition(e).y - 8\"\r\n [attr.text-anchor]=\"'middle'\"\r\n >\r\n {{ e.ActionText }}\r\n </text>\r\n\r\n <text\r\n *ngIf=\"e.allowBack && e.labelBack\"\r\n class=\"edge-label\"\r\n [attr.x]=\"getEdgeLabelPosition(e).x\"\r\n [attr.y]=\"getEdgeLabelPosition(e).y + 14\"\r\n [attr.text-anchor]=\"'middle'\"\r\n >\r\n {{ e.labelBack }}\r\n </text>\r\n </ng-container>\r\n\r\n <!-- EDGE ĐANG HOVER (LUÔN TRÊN CÙNG) -->\r\n <ng-container *ngFor=\"let e of hoverEdges; let i = index\">\r\n <path\r\n class=\"edge red\"\r\n [attr.id]=\"'edge-path-hover-' + i\"\r\n [attr.d]=\"buildPath(e)\"\r\n marker-end=\"url(#arrow-red)\"\r\n [attr.marker-start]=\"e.allowBack ? 'url(#arrow-red-start)' : ''\"\r\n ></path>\r\n\r\n <path\r\n class=\"edge-hit\"\r\n [attr.d]=\"buildPath(e)\"\r\n (mouseleave)=\"onMouseLeaveEdge(e)\"\r\n (click)=\"onClickEdge(e, $event)\"\r\n ></path>\r\n\r\n <!-- LABEL -->\r\n <!-- <text *ngIf=\"e.ActionText\" class=\"edge-label\" dy=\"-6\">\r\n <textPath [attr.href]=\"'#edge-path-hover-' + i\" startOffset=\"50%\" text-anchor=\"middle\">\r\n {{ e.ActionText }}\r\n </textPath>\r\n </text>\r\n\r\n <text *ngIf=\"e.allowBack && e.labelBack\" class=\"edge-label\" dy=\"14\">\r\n <textPath [attr.href]=\"'#edge-path-hover-' + i\" startOffset=\"50%\" text-anchor=\"middle\">\r\n {{ e.labelBack }}\r\n </textPath>\r\n </text> -->\r\n\r\n <text\r\n *ngIf=\"e.ActionText\"\r\n class=\"edge-label\"\r\n [attr.x]=\"getEdgeLabelPosition(e).x\"\r\n [attr.y]=\"getEdgeLabelPosition(e).y - 8\"\r\n [attr.text-anchor]=\"'middle'\"\r\n >\r\n {{ e.ActionText }}\r\n </text>\r\n\r\n <text\r\n *ngIf=\"e.allowBack && e.labelBack\"\r\n class=\"edge-label\"\r\n [attr.x]=\"getEdgeLabelPosition(e).x\"\r\n [attr.y]=\"getEdgeLabelPosition(e).y + 14\"\r\n [attr.text-anchor]=\"'middle'\"\r\n >\r\n {{ e.labelBack }}\r\n </text>\r\n </ng-container>\r\n\r\n <!-- preview -->\r\n <path\r\n *ngIf=\"connectingFrom\"\r\n class=\"edge\"\r\n [attr.d]=\"buildPreviewPath()\"\r\n stroke-dasharray=\"5,5\"\r\n marker-end=\"url(#arrow-blue)\"\r\n ></path>\r\n </g>\r\n </svg>\r\n\r\n <div\r\n *ngIf=\"isSelecting && selectStart && selectEnd\"\r\n class=\"selection-box\"\r\n [style.left.px]=\"Math.min(selectStart.x, selectEnd.x)\"\r\n [style.top.px]=\"Math.min(selectStart.y, selectEnd.y)\"\r\n [style.width.px]=\"Math.abs(selectEnd.x - selectStart.x)\"\r\n [style.height.px]=\"Math.abs(selectEnd.y - selectStart.y)\"\r\n ></div>\r\n\r\n <!-- lstStage -->\r\n @for (n of lstStage; track $index) {\r\n <!-- START NODE -->\r\n @if (n.StageType === \"_start_\") {\r\n <nz-card\r\n class=\"workflow-node workflow-node-start\"\r\n [attr.data-id]=\"n.Code\"\r\n [class.selected]=\"n == selectedStage || n == hoverStage || lstSelectedStageId.has(n.WF_TemplateStage_Id)\"\r\n [style.left.px]=\"n.editorOption.x\"\r\n [style.top.px]=\"n.editorOption.y\"\r\n [class.connecting-source]=\"isConnectingFrom(n) || isDraggingFrom(n) || isSelectedNode(n)\"\r\n nzSize=\"small\"\r\n (mousedown)=\"onMouseDownNode($event, n)\"\r\n (click)=\"$event.stopPropagation(); onClickStage(n)\"\r\n >\r\n <nz-tag [nzColor]=\"'green'\"> START </nz-tag>\r\n\r\n @if (!n.editorOption.isReverse) {\r\n <!-- connector RIGHT: output -->\r\n <div class=\"connector connector-right connector-start\" (click)=\"onClickConnector($event, n, 'right')\"></div>\r\n } @else {\r\n <div\r\n class=\"connector connector-right connector-start reverse\"\r\n (click)=\"onClickConnector($event, n, 'right')\"\r\n ></div>\r\n }\r\n </nz-card>\r\n }\r\n <!-- END NODE -->\r\n @else if (n.StageType === \"_end_\") {\r\n <nz-card\r\n class=\"workflow-node workflow-node-end\"\r\n [attr.data-id]=\"n.Code\"\r\n [class.selected]=\"n == selectedStage || n == hoverStage || lstSelectedStageId.has(n.WF_TemplateStage_Id)\"\r\n [style.left.px]=\"n.editorOption.x\"\r\n [style.top.px]=\"n.editorOption.y\"\r\n [class.connecting-source]=\"isConnectingFrom(n) || isDraggingFrom(n) || isSelectedNode(n)\"\r\n nzSize=\"small\"\r\n (mousedown)=\"onMouseDownNode($event, n)\"\r\n (click)=\"$event.stopPropagation(); onClickStage(n)\"\r\n >\r\n <nz-tag [nzColor]=\"'red'\"> END </nz-tag>\r\n\r\n @if (!n.editorOption.isReverse) {\r\n <!-- connector LEFT: input -->\r\n <div class=\"connector connector-left connector-end\" (click)=\"onClickConnector($event, n, 'left')\"></div>\r\n } @else {\r\n <div\r\n class=\"connector connector-left connector-end reverse\"\r\n (click)=\"onClickConnector($event, n, 'left')\"\r\n ></div>\r\n }\r\n </nz-card>\r\n } @else {\r\n <nz-card\r\n class=\"workflow-node\"\r\n [attr.data-id]=\"n.Code\"\r\n [class.selected]=\"n == selectedStage || n == hoverStage || lstSelectedStageId.has(n.WF_TemplateStage_Id)\"\r\n [style.left.px]=\"n.editorOption.x\"\r\n [style.top.px]=\"n.editorOption.y\"\r\n [class.connecting-source]=\"isConnectingFrom(n) || isDraggingFrom(n) || isSelectedNode(n)\"\r\n nzSize=\"small\"\r\n (mousedown)=\"onMouseDownNode($event, n)\"\r\n (click)=\"$event.stopPropagation(); onClickStage(n)\"\r\n >\r\n <div class=\"title\">{{ n.Code }}</div>\r\n\r\n <div>{{ n.Name }}</div>\r\n\r\n @if (!n.editorOption.isReverse) {\r\n <!-- connector RIGHT: output -->\r\n <div class=\"connector connector-right\" (click)=\"onClickConnector($event, n, 'right')\"></div>\r\n\r\n <!-- connector LEFT: input -->\r\n <div class=\"connector connector-left\" (click)=\"onClickConnector($event, n, 'left')\"></div>\r\n } @else {\r\n <div class=\"connector connector-right reverse\" (click)=\"onClickConnector($event, n, 'right')\"></div>\r\n <div class=\"connector connector-left reverse\" (click)=\"onClickConnector($event, n, 'left')\"></div>\r\n }\r\n </nz-card>\r\n }\r\n }\r\n\r\n <!-- POINTS -->\r\n @for (p of connectingPoints; track $index) {\r\n @if (p != draggingPoint) {\r\n <div\r\n class=\"waypoint\"\r\n [style.left.px]=\"p.x\"\r\n [style.top.px]=\"p.y\"\r\n (mousedown)=\"onmousedownPoint($event, p)\"\r\n (contextmenu)=\"onRightClickPoint($event, hoverAction!, $index)\"\r\n ></div>\r\n } @else {\r\n <div\r\n class=\"waypoint dragging\"\r\n [style.left.px]=\"p.x\"\r\n [style.top.px]=\"p.y\"\r\n (mousedown)=\"onmousedownPoint($event, p)\"\r\n ></div>\r\n }\r\n }\r\n </div>\r\n</div>\r\n\r\n<!-- drawer TEMPLATE -->\r\n<nz-drawer\r\n [nzTitle]=\"drawTemplateTitle\"\r\n nzPlacement=\"right\"\r\n [nzWidth]=\"500\"\r\n [nzClosable]=\"false\"\r\n [nzVisible]=\"drawTemplateVisibel\"\r\n [nzFooter]=\"footerTplTemplate\"\r\n (nzOnClose)=\"drawTemplateVisibel = false\"\r\n>\r\n <ng-template #drawTemplateTitle> <nz-icon nzType=\"setting\"></nz-icon> &nbsp; Template </ng-template>\r\n <ng-container *nzDrawerContent>\r\n <extend-select\r\n [label]=\"'Org'\"\r\n [lstItem]=\"lstOrg\"\r\n [valueField]=\"'App_Org_Id'\"\r\n [displayFields]=\"['Name', 'Code']\"\r\n [(_ngModel)]=\"template.App_Org_Id\"\r\n ></extend-select>\r\n <extend-input [label]=\"'Code'\" [(_ngModel)]=\"template.Code\"></extend-input>\r\n <extend-input [label]=\"'Name'\" [(_ngModel)]=\"template.Name\"></extend-input>\r\n <extend-select\r\n [label]=\"'Type'\"\r\n [lstItem]=\"template.lstTemplateType\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"template.DocType\"\r\n ></extend-select>\r\n <extend-textarea [label]=\"'Desscription'\" [(_ngModel)]=\"template.Description\"></extend-textarea>\r\n <extend-select\r\n [label]=\"'Print template'\"\r\n [lstItem]=\"template.lstTemplatePrint\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"template.TemplatePrint\"\r\n ></extend-select>\r\n <extend-select\r\n [label]=\"'Apply to'\"\r\n [lstItem]=\"template.lstApplyTo\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"template.ApplyTo\"\r\n ></extend-select>\r\n\r\n <extend-checkbox [label]=\"'Active'\" [(_ngModel)]=\"template.IsActive\"></extend-checkbox>\r\n <extend-checkbox [label]=\"'Use Allow back'\" [(_ngModel)]=\"template.editorOption.AllowbackInUse\"></extend-checkbox>\r\n\r\n <h3 nz-col><nz-icon nzType=\"send\" nzTheme=\"outline\" />&nbsp;Stage</h3>\r\n\r\n <div nz-row [nzGutter]=\"[0, 5]\">\r\n @for (tag of getLstStage; track tag) {\r\n <div nz-col>\r\n <nz-tag (click)=\"hoverStage = tag\">\r\n {{ sliceTagName(tag.Code + (tag.Name ? \" - \" + tag.Name : \"\")) }}\r\n </nz-tag>\r\n </div>\r\n }\r\n </div>\r\n\r\n <box [height]=\"16\"></box>\r\n\r\n <h3 nz-col><nz-icon nzType=\"send\" nzTheme=\"outline\" />&nbsp;Stage status</h3>\r\n\r\n <div nz-row [nzGutter]=\"[0, 5]\">\r\n @for (tag of template.lstStageStatus; track tag) {\r\n <div nz-col>\r\n <nz-tag\r\n [nzMode]=\"checkRemoveableStageStatus(tag) ? 'closeable' : 'default'\"\r\n (nzOnClose)=\"handleCloseStageStatus(tag)\"\r\n >\r\n {{ sliceTagName(tag.Code + (tag.Name ? \" - \" + tag.Name : \"\")) }}\r\n </nz-tag>\r\n </div>\r\n }\r\n\r\n <div nz-col>\r\n @if (!inputStageStatusVisible) {\r\n <nz-tag class=\"editable-tag\" nzNoAnimation (click)=\"showInputStageStatus()\">\r\n <nz-icon nzType=\"plus\" />\r\n New Action type\r\n </nz-tag>\r\n } @else {\r\n <input\r\n #inputStageStatusElement\r\n nz-input\r\n nzSize=\"small\"\r\n type=\"text\"\r\n style=\"width: 150px\"\r\n placeholder=\"Code\"\r\n [(ngModel)]=\"inputStageStatusCode\"\r\n (keydown.enter)=\"inputStageStatusNameElement.select()\"\r\n />\r\n <input\r\n #inputStageStatusNameElement\r\n nz-input\r\n nzSize=\"small\"\r\n type=\"text\"\r\n style=\"width: 150px\"\r\n placeholder=\"Name\"\r\n [(ngModel)]=\"inputStageStatusName\"\r\n (blur)=\"handleInputStageStatusConfirm()\"\r\n (keydown.enter)=\"handleInputStageStatusConfirm()\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n\r\n <box [height]=\"16\"></box>\r\n\r\n <h3 nz-col><nz-icon nzType=\"send\" nzTheme=\"outline\" />&nbsp;Action type</h3>\r\n\r\n <div nz-row [nzGutter]=\"[0, 5]\">\r\n @for (tag of template.lstActionType; track tag) {\r\n <div nz-col>\r\n <nz-tag\r\n [nzMode]=\"checkRemoveableActionType(tag) ? 'closeable' : 'default'\"\r\n (nzOnClose)=\"handleCloseActionType(tag)\"\r\n >\r\n {{ sliceTagName(tag.Code + (tag.Name ? \" - \" + tag.Name : \"\")) }}\r\n </nz-tag>\r\n </div>\r\n }\r\n\r\n <div nz-col>\r\n @if (!inputActionTypeVisible) {\r\n <nz-tag class=\"editable-tag\" nzNoAnimation (click)=\"showInputActionType()\">\r\n <nz-icon nzType=\"plus\" />\r\n New Action type\r\n </nz-tag>\r\n } @else {\r\n <input\r\n #inputActionTypeElement\r\n nz-input\r\n nzSize=\"small\"\r\n type=\"text\"\r\n style=\"width: 150px\"\r\n placeholder=\"Code\"\r\n [(ngModel)]=\"inputActionTypeCode\"\r\n (keydown.enter)=\"inputActionTypeNameElement.select()\"\r\n />\r\n <input\r\n #inputActionTypeNameElement\r\n nz-input\r\n nzSize=\"small\"\r\n type=\"text\"\r\n style=\"width: 150px\"\r\n placeholder=\"Name\"\r\n [(ngModel)]=\"inputActionTypeName\"\r\n (blur)=\"handleInputActionTypeConfirm()\"\r\n (keydown.enter)=\"handleInputActionTypeConfirm()\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n\r\n <box [height]=\"16\"></box>\r\n\r\n <h3 nz-col><nz-icon nzType=\"send\" nzTheme=\"outline\" />&nbsp;Action status</h3>\r\n\r\n <div nz-row [nzGutter]=\"[0, 5]\">\r\n @for (tag of template.lstActionStatus; track tag) {\r\n <div nz-col>\r\n @if (template.editingActionStatus != tag) {\r\n <nz-tag\r\n [nzMode]=\"checkRemoveableActionStatus(tag.Code) ? 'closeable' : 'default'\"\r\n (nzOnClose)=\"handleClose(tag.Code)\"\r\n (click)=\"template.editingActionStatus = checkRemoveableActionStatus(tag.Code) ? tag : undefined\"\r\n >\r\n {{ sliceTagName(tag.Code + (tag.Name ? \" - \" + tag.Name : \"\")) }}\r\n </nz-tag>\r\n } @else {\r\n <input\r\n nz-input\r\n nzSize=\"small\"\r\n type=\"text\"\r\n style=\"width: 150px\"\r\n [appAutoFocus]=\"true\"\r\n [(ngModel)]=\"tag.Code\"\r\n (blur)=\"template.editingActionStatus = undefined\"\r\n (keydown.enter)=\"template.editingActionStatus = undefined\"\r\n />&nbsp;&nbsp;\r\n }\r\n </div>\r\n }\r\n\r\n <div nz-col>\r\n @if (!inputVisible) {\r\n <nz-tag class=\"editable-tag\" nzNoAnimation (click)=\"showInput()\">\r\n <nz-icon nzType=\"plus\" />\r\n New Action status\r\n </nz-tag>\r\n } @else {\r\n <input\r\n #inputElement\r\n nz-input\r\n nzSize=\"small\"\r\n type=\"text\"\r\n style=\"width: 150px\"\r\n placeholder=\"+ New Action status\"\r\n [(ngModel)]=\"inputValue\"\r\n (blur)=\"handleInputConfirm()\"\r\n (keydown.enter)=\"handleInputConfirm()\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #footerTplTemplate>\r\n <div nz-flex [nzGap]=\"6\" [nzJustify]=\"'end'\">\r\n <button nz-button nzDanger [nzLoading]=\"!ready\" (click)=\"save()\">Save</button>\r\n <button nz-button (click)=\"drawTemplateVisibel = false\">Close</button>\r\n </div>\r\n </ng-template>\r\n</nz-drawer>\r\n\r\n<!-- drawer STAGE -->\r\n<nz-drawer\r\n [nzTitle]=\"drawerTitleStage\"\r\n [nzPlacement]=\"selectedStage?.editorOption?.drawerPosition == 'left' ? 'left' : 'right'\"\r\n [nzVisible]=\"!!selectedStage\"\r\n [nzWidth]=\"'calc(50vw)'\"\r\n [nzClosable]=\"false\"\r\n [nzFooter]=\"footerTplNode\"\r\n (nzOnClose)=\"selectedStage = undefined\"\r\n>\r\n <ng-template #drawerTitleStage>\r\n <div nz-row nzJustify=\"space-between\">\r\n @if (selectedStage && selectedStage.editorOption) {\r\n @if (selectedStage.editorOption.drawerPosition == \"left\") {\r\n <button\r\n nz-button\r\n nzSize=\"small\"\r\n nz-tooltip=\"To the right\"\r\n (click)=\"selectedStage.editorOption.drawerPosition = 'right'\"\r\n >\r\n <nz-icon nzType=\"double-right\"></nz-icon>\r\n </button>\r\n STAGE\r\n } @else {\r\n STAGE\r\n <button\r\n nz-button\r\n nzSize=\"small\"\r\n nz-tooltip=\"To the left\"\r\n (click)=\"selectedStage.editorOption.drawerPosition = 'left'\"\r\n >\r\n <nz-icon nzType=\"double-left\"></nz-icon>\r\n </button>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n <ng-container *nzDrawerContent>\r\n <ng-container *ngIf=\"selectedStage\">\r\n <nz-radio-group [(ngModel)]=\"selectedStage.StageType\">\r\n <label nz-radio nzValue=\"_start_\">UI start</label>\r\n <label nz-radio nzValue=\"_end_\">UI end</label>\r\n <label nz-radio nzValue=\"start\">START</label>\r\n <label nz-radio nzValue=\"node\">NODE</label>\r\n <label nz-radio nzValue=\"end\">END</label>\r\n </nz-radio-group>\r\n\r\n <box [height]=\"16\"></box>\r\n\r\n <div nz-row [nzGutter]=\"32\" class=\"form-item-no-bottom\">\r\n <extend-input\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Code'\"\r\n [floatingLabel]=\"true\"\r\n [required]=\"true\"\r\n [(_ngModel)]=\"selectedStage.Code\"\r\n ></extend-input>\r\n\r\n <extend-input\r\n nz-col\r\n [nzSpan]=\"16\"\r\n [label]=\"'Name'\"\r\n [floatingLabel]=\"true\"\r\n [required]=\"true\"\r\n [(_ngModel)]=\"selectedStage.Name\"\r\n ></extend-input>\r\n </div>\r\n\r\n <div nz-row [nzGutter]=\"32\" class=\"form-item-no-bottom\">\r\n <extend-input-number\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Sequence'\"\r\n [floatingLabel]=\"true\"\r\n [(_ngModel)]=\"selectedStage.SeqValue\"\r\n ></extend-input-number>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"16\"\r\n [label]=\"'Org implement'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"lstOrg\"\r\n [valueField]=\"'App_Org_Id'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"selectedStage.App_Org_Id\"\r\n ></extend-select>\r\n </div>\r\n\r\n <div nz-row [nzGutter]=\"32\" class=\"form-item-no-bottom\">\r\n <extend-input-number\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Number Day'\"\r\n [floatingLabel]=\"true\"\r\n [precision]=\"1\"\r\n [(_ngModel)]=\"selectedStage.NumberDay\"\r\n ></extend-input-number>\r\n </div>\r\n\r\n @if (selectedStage.editorOption) {\r\n @if ([\"start\", \"node\", \"end\"].includes(selectedStage.StageType.toLowerCase())) {\r\n <extend-checkbox\r\n [label]=\"'Reverse'\"\r\n [labelSpan]=\"0\"\r\n [(_ngModel)]=\"selectedStage.editorOption.isReverse\"\r\n ></extend-checkbox>\r\n }\r\n\r\n <extend-checkbox\r\n [label]=\"'Require user action'\"\r\n [labelSpan]=\"0\"\r\n [(_ngModel)]=\"selectedStage.IsRequireUser\"\r\n ></extend-checkbox>\r\n }\r\n\r\n <box [height]=\"16\"></box>\r\n\r\n <div nz-row [nzGutter]=\"16\">\r\n <h3 nz-col><nz-icon nzType=\"send\" nzTheme=\"outline\" />&nbsp;List Action</h3>\r\n <div nz-col>\r\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"addAction()\">\r\n <nz-icon nzType=\"plus\"></nz-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <nz-table nzSize=\"small\" [nzData]=\"lstActionOfCurrentStage\" [nzShowPagination]=\"false\" [nzNoResult]=\"'&nbsp;'\">\r\n <thead>\r\n <tr [hidden]=\"true\">\r\n <th nzWidth=\"40px\"></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (action of lstActionOfCurrentStage; track $index) {\r\n <tr [class.text-bold]=\"action == hoverAction\" (click)=\"onclickaction(action)\">\r\n <td style=\"border-bottom: solid 1px orange\">\r\n ({{ $index + 1 }})\r\n <nz-icon\r\n nzType=\"delete\"\r\n nzTheme=\"outline\"\r\n class=\"color-warn cursor-pointer icon-size-16\"\r\n (click)=\"$event.stopPropagation(); deleteAction(action)\"\r\n ></nz-icon>\r\n </td>\r\n <td style=\"border-bottom: solid 1px orange\">\r\n <div nz-row [nzGutter]=\"16\" class=\"form-item-no-bottom\">\r\n <div nz-col [nzSpan]=\"8\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"24\" style=\"height: 32px\">Action status</nz-form-label>\r\n <nz-form-control [nzSpan]=\"24\">\r\n <nz-input-group class=\"full-width\">\r\n <input\r\n nz-input\r\n [(ngModel)]=\"action.ActionStatus\"\r\n [nzAutocomplete]=\"auto\"\r\n (ngModelChange)=\"nzAutocompletechange($event, template.lstActionStatus)\"\r\n (click)=\"lstActionStatusFiltered = template.lstActionStatus\"\r\n (keyup.enter)=\"onenterAotu(action.ActionStatus)\"\r\n (blur)=\"onenterAotu(action.ActionStatus)\"\r\n />\r\n <nz-autocomplete #auto [compareWith]=\"compareFun\">\r\n @for (option of lstActionStatusFiltered; track $index) {\r\n <nz-auto-option [nzValue]=\"option.Code\" [nzLabel]=\"option.Code\">\r\n {{ option.Code }}\r\n <icon-delete\r\n *ngIf=\"checkRemoveableActionStatus(option.Code)\"\r\n style=\"float: right\"\r\n [size]=\"12\"\r\n (click)=\"handleClose(option.Code)\"\r\n ></icon-delete>\r\n </nz-auto-option>\r\n }\r\n </nz-autocomplete>\r\n </nz-input-group>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n\r\n <extend-input\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Action text'\"\r\n [floatingLabel]=\"true\"\r\n [(_ngModel)]=\"action.ActionText\"\r\n (_ngModelChange)=\"onchangeActionText(action)\"\r\n ></extend-input>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Action type'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstActionType\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"action.ActionType\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Stage status'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstStageStatus\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"action.StageStatus\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Next stage'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"getlstStage\"\r\n [valueField]=\"'WF_TemplateStage_Id'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"action.To_WF_TemplateStage_Id\"\r\n (_ngModelChange)=\"onchangeNextStage(action)\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Next stage status'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstStageStatus\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"action.To_StageStatus\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Process status'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstProcessStatus\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"action.DocProcessStatus\"\r\n ></extend-select>\r\n </div>\r\n <box [height]=\"8\"></box>\r\n <div nz-row>Role</div>\r\n <div nz-row>\r\n <extend-select\r\n nz-col\r\n nzSpan=\"24\"\r\n [size]=\"'small'\"\r\n [lstItem]=\"lstRole\"\r\n [valueField]=\"'App_Role_Id'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [multiple]=\"true\"\r\n [(_ngModel)]=\"action._lstRoleId\"\r\n (_ngModelChange)=\"onselectedRoleEmail(action)\"\r\n ></extend-select>\r\n </div>\r\n <box [height]=\"8\"></box>\r\n <div nz-row>Email action</div>\r\n <div nz-row>\r\n <extend-select\r\n nz-col\r\n nzSpan=\"24\"\r\n [size]=\"'small'\"\r\n [lstItem]=\"lstEmailAction\"\r\n [valueField]=\"'ID'\"\r\n [displayField]=\"'Name'\"\r\n [multiple]=\"true\"\r\n [(_ngModel)]=\"action._lstEmailActionId\"\r\n (_ngModelChange)=\"onselectedRoleEmail(action)\"\r\n ></extend-select>\r\n </div>\r\n <box [height]=\"8\"></box>\r\n <div *ngIf=\"action._lstEmailActionId && action._lstEmailActionId.length\" nz-row>Email template</div>\r\n <div *ngIf=\"action._lstEmailActionId && action._lstEmailActionId.length\" nz-row>\r\n <div nz-col nzSpan=\"1\"></div>\r\n <div nz-col nzSpan=\"23\" class=\"form-item-no-bottom\" style=\"font-weight: normal\">\r\n @for (actionRef of lstActionRefOf(action); track $index) {\r\n <div nz-row>\r\n <extend-select\r\n nz-col\r\n nzSpan=\"24\"\r\n [labelSpan]=\"12\"\r\n [size]=\"'small'\"\r\n [label]=\"emailActionText(actionRef.To_WF_TemplateStageAction_Id)\"\r\n [lstItem]=\"lstEmailTemplate\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"actionRef.TemplateMail\"\r\n ></extend-select>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <box [height]=\"8\"></box>\r\n <div nz-row [nzGutter]=\"8\">\r\n Action rule\r\n <button nz-button nzType=\"text\" nzSize=\"small\" (click)=\"actionRuleModalVisible = true\">\r\n <nz-icon nzType=\"export\" nzTheme=\"outline\" class=\"color-primary\" />\r\n </button>\r\n <button\r\n *ngIf=\"action.WF_TransitionsRule_Id\"\r\n nz-button\r\n nzType=\"text\"\r\n nzSize=\"small\"\r\n (click)=\"deleteActionRule(action)\"\r\n >\r\n <nz-icon nzType=\"delete\" nzTheme=\"outline\" class=\"color-warn\" />\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n\r\n <box [height]=\"16\"></box>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #footerTplNode>\r\n <div\r\n nz-flex\r\n [nzGap]=\"6\"\r\n [nzJustify]=\"\r\n selectedStage && selectedStage.editorOption && selectedStage.editorOption.drawerPosition == 'left'\r\n ? 'start'\r\n : 'end'\r\n \"\r\n >\r\n <button nz-button nzDanger nzDanger [nzLoading]=\"!ready\" (click)=\"save()\">Save</button>\r\n <button nz-button (click)=\"selectedStage = undefined\">Close</button>\r\n <button\r\n *ngIf=\"selectedStage && ['START', 'END'].indexOf(selectedStage.StageType) < 0\"\r\n nz-button\r\n nzDanger\r\n (click)=\"deleteStage()\"\r\n >\r\n Delete\r\n </button>\r\n </div>\r\n </ng-template>\r\n</nz-drawer>\r\n\r\n<!-- drawer ACTION -->\r\n<nz-drawer\r\n [nzTitle]=\"drawerTitleAction\"\r\n nzTitle=\"ACTION\"\r\n [nzPlacement]=\"selectedAction?.editorOption?.drawerPosition == 'left' ? 'left' : 'right'\"\r\n [nzClosable]=\"false\"\r\n [nzWidth]=\"750\"\r\n [nzVisible]=\"!!selectedAction\"\r\n [nzFooter]=\"footerTplAction\"\r\n (nzOnClose)=\"selectedAction = undefined\"\r\n>\r\n <ng-template #drawerTitleAction>\r\n <div nz-row nzJustify=\"space-between\">\r\n @if (selectedAction && selectedAction.editorOption) {\r\n @if (selectedAction.editorOption.drawerPosition == \"left\") {\r\n <button\r\n nz-button\r\n nzSize=\"small\"\r\n nz-tooltip=\"To the right\"\r\n (click)=\"selectedAction.editorOption.drawerPosition = 'right'\"\r\n >\r\n <nz-icon nzType=\"double-right\"></nz-icon>\r\n </button>\r\n ACTION\r\n } @else {\r\n ACTION\r\n <button\r\n nz-button\r\n nzSize=\"small\"\r\n nz-tooltip=\"To the left\"\r\n (click)=\"selectedAction.editorOption.drawerPosition = 'left'\"\r\n >\r\n <nz-icon nzType=\"double-left\"></nz-icon>\r\n </button>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n <ng-container *nzDrawerContent>\r\n <ng-container *ngIf=\"selectedAction\">\r\n <div>\r\n <strong\r\n >{{ selectedAction.getFromStageCode(lstStage) }} -> {{ selectedAction.getToStageCode(lstStage) }}</strong\r\n >\r\n </div>\r\n <div>{{ selectedAction.getFromStageName(lstStage) }} -> {{ selectedAction.getToStageName(lstStage) }}</div>\r\n\r\n <box [height]=\"16\"></box>\r\n\r\n <div nz-row [nzGutter]=\"16\" class=\"form-item-no-bottom\">\r\n <div nz-col [nzSpan]=\"8\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"24\" style=\"height: 32px\">Action status</nz-form-label>\r\n <nz-form-control [nzSpan]=\"24\">\r\n <nz-input-group class=\"full-width\">\r\n <input\r\n nz-input\r\n [(ngModel)]=\"selectedAction.ActionStatus\"\r\n [nzAutocomplete]=\"auto\"\r\n (ngModelChange)=\"nzAutocompletechange($event, template.lstActionStatus)\"\r\n (click)=\"lstActionStatusFiltered = template.lstActionStatus\"\r\n (keyup.enter)=\"onenterAotu(selectedAction.ActionStatus)\"\r\n (blur)=\"onenterAotu(selectedAction.ActionStatus)\"\r\n />\r\n <nz-autocomplete #auto [compareWith]=\"compareFun\">\r\n @for (option of lstActionStatusFiltered; track $index) {\r\n <nz-auto-option [nzValue]=\"option.Code\" [nzLabel]=\"option.Code\">\r\n {{ option.Code }}\r\n <icon-delete\r\n *ngIf=\"checkRemoveableActionStatus(option.Code)\"\r\n style=\"float: right\"\r\n [size]=\"12\"\r\n (click)=\"handleClose(option.Code)\"\r\n ></icon-delete>\r\n </nz-auto-option>\r\n }\r\n </nz-autocomplete>\r\n </nz-input-group>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n\r\n <extend-input\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Action text'\"\r\n [floatingLabel]=\"true\"\r\n [(_ngModel)]=\"selectedAction.ActionText\"\r\n (_ngModelChange)=\"onchangeActionText(selectedAction)\"\r\n ></extend-input>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Action type'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstActionType\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"selectedAction.ActionType\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Stage status'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstStageStatus\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"selectedAction.StageStatus\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Next stage'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"lstStage\"\r\n [valueField]=\"'WF_TemplateStage_Id'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"selectedAction.To_WF_TemplateStage_Id\"\r\n (_ngModelChange)=\"onchangeNextStage(selectedAction)\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Next stage status'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstStageStatus\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"selectedAction.To_StageStatus\"\r\n ></extend-select>\r\n </div>\r\n\r\n <!-- <box [height]=\"16\"></box> -->\r\n <nz-divider></nz-divider>\r\n\r\n @if (template.editorOption.AllowbackInUse) {\r\n <extend-checkbox\r\n [label]=\"'Allow back'\"\r\n [labelSpan]=\"0\"\r\n [(_ngModel)]=\"selectedAction.allowBack\"\r\n (_ngModelChange)=\"onchangeAllowBack(selectedAction)\"\r\n ></extend-checkbox>\r\n }\r\n\r\n <box [height]=\"16\"></box>\r\n\r\n @if (selectedAction.allowBack) {\r\n <div>\r\n <strong\r\n >{{ selectedAction.getToStageCode(lstStage) }} -> {{ selectedAction.getFromStageCode(lstStage) }}</strong\r\n >\r\n </div>\r\n <div>{{ selectedAction.getToStageName(lstStage) }} -> {{ selectedAction.getFromStageName(lstStage) }}</div>\r\n\r\n @if (selectedBackAction) {\r\n <div nz-row [nzGutter]=\"16\" class=\"form-item-no-bottom\">\r\n <div nz-col [nzSpan]=\"8\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"24\" style=\"height: 32px\">Action status</nz-form-label>\r\n <nz-form-control [nzSpan]=\"24\">\r\n <nz-input-group class=\"full-width\">\r\n <input\r\n nz-input\r\n [(ngModel)]=\"selectedBackAction.ActionStatus\"\r\n [nzAutocomplete]=\"auto\"\r\n (ngModelChange)=\"nzAutocompletechange($event, template.lstActionStatus)\"\r\n (click)=\"lstActionStatusFiltered = template.lstActionStatus\"\r\n (keyup.enter)=\"onenterAotu(selectedBackAction.ActionStatus)\"\r\n (blur)=\"onenterAotu(selectedBackAction.ActionStatus)\"\r\n />\r\n <nz-autocomplete #auto [compareWith]=\"compareFun\">\r\n @for (option of lstActionStatusFiltered; track $index) {\r\n <nz-auto-option [nzValue]=\"option.Code\" [nzLabel]=\"option.Code\">\r\n {{ option.Code }}\r\n <icon-delete\r\n *ngIf=\"checkRemoveableActionStatus(option.Code)\"\r\n style=\"float: right\"\r\n [size]=\"12\"\r\n (click)=\"handleClose(option.Code)\"\r\n ></icon-delete>\r\n </nz-auto-option>\r\n }\r\n </nz-autocomplete>\r\n </nz-input-group>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n\r\n <extend-input\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Action text'\"\r\n [floatingLabel]=\"true\"\r\n [(_ngModel)]=\"selectedBackAction.ActionText\"\r\n (_ngModelChange)=\"onchangeActionText(selectedBackAction)\"\r\n ></extend-input>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Action type'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstActionType\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"selectedBackAction.ActionType\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Stage status'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstStageStatus\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"selectedBackAction.StageStatus\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Next stage'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"lstStage\"\r\n [valueField]=\"'WF_TemplateStage_Id'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"selectedBackAction.To_WF_TemplateStage_Id\"\r\n (_ngModelChange)=\"onchangeNextStage(selectedBackAction)\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Next stage status'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstStageStatus\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"selectedBackAction.To_StageStatus\"\r\n ></extend-select>\r\n </div>\r\n }\r\n }\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #footerTplAction>\r\n <div\r\n nz-flex\r\n [nzGap]=\"6\"\r\n [nzJustify]=\"selectedAction && selectedAction.editorOption.drawerPosition == 'left' ? 'start' : 'end'\"\r\n >\r\n <button nz-button nzDanger nzDanger [nzLoading]=\"!ready\" (click)=\"save()\">Save</button>\r\n <button nz-button nzDanger (click)=\"deleteAction(selectedAction!)\">Delete</button>\r\n <button nz-button (click)=\"selectedAction = undefined\">Close</button>\r\n </div>\r\n </ng-template>\r\n</nz-drawer>\r\n\r\n<!-- setting editor -->\r\n<nz-drawer\r\n [nzTitle]=\"drawSettingTitle\"\r\n nzPlacement=\"right\"\r\n [nzClosable]=\"false\"\r\n [nzVisible]=\"settingVisible\"\r\n (nzOnClose)=\"settingVisible = false\"\r\n>\r\n <ng-template #drawSettingTitle> <nz-icon nzType=\"setting\"></nz-icon> &nbsp; Editor </ng-template>\r\n <ng-container *nzDrawerContent>\r\n <div class=\"form-item-no-bottom\">\r\n <extend-checkbox [label]=\"'Show grid'\" [labelSpan]=\"0\" [(_ngModel)]=\"wfcSetting.ShowGrid\"></extend-checkbox>\r\n\r\n <box [height]=\"16\"></box>\r\n </div>\r\n </ng-container>\r\n</nz-drawer>\r\n\r\n<!-- editor infomation -->\r\n<nz-drawer\r\n [nzTitle]=\"drawInfoTitle\"\r\n nzPlacement=\"right\"\r\n [nzClosable]=\"false\"\r\n [nzVisible]=\"infoVisible\"\r\n (nzOnClose)=\"infoVisible = false\"\r\n>\r\n <ng-template #drawInfoTitle> <nz-icon nzType=\"info-circle\"></nz-icon> &nbsp; Infomation </ng-template>\r\n <ng-container *nzDrawerContent>\r\n <p>1. Các thành phần: Stage or Node (stag, node quy trình), Action or Connector (đường nối giữa các stage)</p>\r\n <p>2. Save để load các thông tin: Stage status, Action type</p>\r\n <p>\r\n 3. Nối 2 node (tạo connector tương đương tạo action):\r\n <br />- Click chấm cam từ Node nguồn đến chấm xanh của Node đích (hoặc click vào Node đích), có thể click thành\r\n nhiều điểm để tạo đường nối cong<br />- Khi hover connector chuyển sang mầu đỏ có thể click đúp để thêm một điểm\r\n của connector<br />- Khi hover lên điểm của connector có thể di chuyển điểm đó bằng cách nhấn giữ chuột và kéo thả\r\n đến vị trí mới<br />- Chuột phải vào điểm nối connector để xoá điểm đó\r\n </p>\r\n </ng-container>\r\n</nz-drawer>\r\n\r\n<!-- action rule modal -->\r\n<nz-modal\r\n [(nzVisible)]=\"actionRuleModalVisible\"\r\n [nzMaskClosable]=\"false\"\r\n [nzClosable]=\"false\"\r\n [nzKeyboard]=\"true\"\r\n [nzWidth]=\"'50vw'\"\r\n>\r\n <ng-container *nzModalTitle>\r\n ACTION RULE: [{{ selectedStage?.Code }}] {{ selectedStage?.Name }} > [{{ hoverAction?.ActionStatus }}]\r\n {{ hoverAction?.ActionText }}\r\n </ng-container>\r\n <ng-container *nzModalContent>\r\n @if (hoverAction && hoverAction.actionRule) {\r\n <div nz-row [nzGutter]=\"32\">\r\n <extend-input nz-col nzSpan=\"12\" [label]=\"'Code'\" [(_ngModel)]=\"hoverAction.actionRule.Code\"></extend-input>\r\n <extend-input nz-col nzSpan=\"12\" [label]=\"'Name'\" [(_ngModel)]=\"hoverAction.actionRule.Name\"></extend-input>\r\n <extend-input nz-col nzSpan=\"12\" [label]=\"'Note'\" [(_ngModel)]=\"hoverAction.actionRule.Note\"></extend-input>\r\n <extend-checkbox\r\n nz-col\r\n nzSpan=\"12\"\r\n [label]=\"'IsActive'\"\r\n [(_ngModel)]=\"hoverAction.actionRule.IsActive\"\r\n ></extend-checkbox>\r\n </div>\r\n <div nz-row [nzGutter]=\"16\">\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table nzSize=\"small\" [nzData]=\"hoverAction.actionRule.lstLine\" [nzShowPagination]=\"false\">\r\n <thead>\r\n <tr>\r\n <th [nzWidth]=\"'50px'\"><icon-add (click)=\"addActionRuleLine()\"></icon-add></th>\r\n <th [nzWidth]=\"'25%'\">Template</th>\r\n <th [nzWidth]=\"'25%'\">Template stage</th>\r\n <th [nzWidth]=\"'25%'\">Template action</th>\r\n <th [nzWidth]=\"'50px'\">IsActive</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (item of hoverAction.actionRule.lstLine; track $index) {\r\n <tr>\r\n <td><icon-delete (click)=\"deleteActionRuleLine(hoverAction.actionRule, item)\"></icon-delete></td>\r\n <td>\r\n <extend-select\r\n #xxx\r\n [size]=\"'small'\"\r\n [lstItem]=\"lstTemplateForRule(item)\"\r\n [valueField]=\"'WF_Template_Id'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"item.WF_Template_Id\"\r\n (_ngModelChange)=\"item.WF_TemplateStage_Id = 0; item.WF_TemplateStageAction_Id = 0\"\r\n ></extend-select>\r\n </td>\r\n <td>\r\n <extend-select\r\n #yyy\r\n [size]=\"'small'\"\r\n [lstItem]=\"lstStageForRule(xxx._ngModel)\"\r\n [valueField]=\"'WF_TemplateStage_Id'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"item.WF_TemplateStage_Id\"\r\n (_ngModelChange)=\"item.WF_TemplateStageAction_Id = 0\"\r\n ></extend-select>\r\n </td>\r\n <td>\r\n <extend-select\r\n [size]=\"'small'\"\r\n [lstItem]=\"lstActionForRule(yyy._ngModel)\"\r\n [valueField]=\"'WF_TemplateStageAction_Id'\"\r\n [displayFields]=\"['ActionStatus', 'ActionText']\"\r\n [(_ngModel)]=\"item.WF_TemplateStageAction_Id\"\r\n ></extend-select>\r\n </td>\r\n <td class=\"text-center\">\r\n <extend-checkbox [(_ngModel)]=\"item.IsActive\"></extend-checkbox>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n }\r\n </ng-container>\r\n <ng-container *nzModalFooter>\r\n <button nz-button nzType=\"primary\" (click)=\"actionRuleModalVisible = false\">OK</button>\r\n </ng-container>\r\n</nz-modal>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, ViewChild, Input, Output, EventEmitter } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\n\r\n@Component({\r\n selector: 'expandable-search',\r\n templateUrl: './expandable-search.component.html',\r\n styleUrls: ['./expandable-search.component.scss'],\r\n imports: [CommonModule, FormsModule, NzIconModule],\r\n})\r\nexport class ExpandableSearchComponent {\r\n @ViewChild('searchInput') searchInputRef!: ElementRef<HTMLInputElement>;\r\n\r\n isExpanded = false;\r\n @Input() searchValue: string | null = null;\r\n @Output() searchValueChange = new EventEmitter();\r\n\r\n @Output() onSearch = new EventEmitter();\r\n\r\n // Biến lưu trữ bộ đếm thời gian để có thể hủy nó khi cần\r\n blurTimeout: any;\r\n\r\n toggleSearch(): void {\r\n // Hủy ngay lệnh tự động đóng (nếu có) để tránh xung đột\r\n if (this.blurTimeout) {\r\n clearTimeout(this.blurTimeout);\r\n }\r\n\r\n if (!this.isExpanded) {\r\n this.isExpanded = true;\r\n setTimeout(() => this.searchInputRef.nativeElement.focus(), 150);\r\n } else if (!this.searchValue) {\r\n this.isExpanded = false;\r\n } else {\r\n this.performSearch();\r\n }\r\n }\r\n\r\n clearSearch(event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.searchValue = '';\r\n this.searchInputRef.nativeElement.focus();\r\n this.performSearch();\r\n }\r\n\r\n // Bắt thêm sự kiện focus: Khi người dùng nhấp lại vào input thì không được đóng nó\r\n onFocus(): void {\r\n if (this.blurTimeout) {\r\n clearTimeout(this.blurTimeout);\r\n }\r\n }\r\n\r\n onBlur(): void {\r\n // Lưu lại bộ đếm để kiểm soát\r\n this.blurTimeout = setTimeout(() => {\r\n if (!this.searchValue?.trim()) {\r\n this.isExpanded = false;\r\n }\r\n }, 200); // Mình tăng lên 200ms để hoạt động an toàn hơn\r\n }\r\n\r\n performSearch(): void {\r\n this.searchValueChange.emit(this.searchValue);\r\n this.onSearch.emit(this.searchValue);\r\n }\r\n}\r\n","<div class=\"nz-search-wrapper\" [class.expanded]=\"isExpanded\">\r\n <input\r\n #searchInput\r\n type=\"text\"\r\n class=\"custom-search-input\"\r\n [(ngModel)]=\"searchValue\"\r\n placeholder=\"Nhập điều kiện tìm kiếm...\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n (keyup.enter)=\"performSearch()\"\r\n />\r\n\r\n <span class=\"suffix-wrap\" (mousedown)=\"$event.preventDefault()\" (click)=\"toggleSearch()\">\r\n <i\r\n nz-icon\r\n nzType=\"close-circle\"\r\n nzTheme=\"fill\"\r\n class=\"suffix-icon delete\"\r\n [class.show]=\"isExpanded && searchValue\"\r\n (click)=\"clearSearch($event)\"\r\n ></i>\r\n\r\n <i\r\n nz-icon\r\n nzType=\"search\"\r\n nzTheme=\"outline\"\r\n class=\"suffix-icon search\"\r\n [class.show]=\"!isExpanded || !searchValue\"\r\n ></i>\r\n </span>\r\n</div>\r\n","import { Component, inject, OnInit, TemplateRef, ViewChild } from '@angular/core';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { CustomNotiService } from '../../services/custom-notification.service';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'custom-noti',\r\n imports: [CommonModule, NzIconModule],\r\n template: `\r\n <ng-template #globalNotiTemplate let-data=\"data\">\r\n <div class=\"custom-notification-wrapper\">\r\n <div class=\"notification-content\">\r\n <i nz-icon [nzType]=\"data.icon\" nzTheme=\"twotone\" [nzTwotoneColor]=\"data.color\" class=\"noti-icon\"></i>\r\n\r\n <div class=\"noti-text\">\r\n <div class=\"noti-title\">{{ data.title }}</div>\r\n <div class=\"noti-desc\">{{ data.description }}</div>\r\n\r\n <div class=\"noti-action\" *ngIf=\"data.showDetail\">\r\n <a class=\"detail-link\" (click)=\"data.onDetailClick()\">Chi tiết</a>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"progress-bar-container\">\r\n <div\r\n class=\"progress-bar\"\r\n [style.background-color]=\"data.color\"\r\n [style.animation-duration.ms]=\"data.duration\"\r\n ></div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n `,\r\n styleUrl: './custom-noti.component.scss',\r\n})\r\nexport class CustomNotiComponent implements OnInit {\r\n customNotiService = inject(CustomNotiService);\r\n\r\n @ViewChild('globalNotiTemplate', { static: true }) notiTemplate!: TemplateRef<any>;\r\n\r\n ngOnInit() {\r\n this.customNotiService.registerTemplate(this.notiTemplate);\r\n }\r\n}\r\n","import { HttpParams } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { HTTPService } from '../../../services/api-service/http.service';\r\nimport { CommonService } from '../../../services/api-service/common.service';\r\nimport { AppGlobals } from '../../../app-global';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class PermissionService extends HTTPService {\r\n cms = inject(CommonService);\r\n\r\n updateUserRoleRef(data: any) {\r\n return this.cms.ESP({\r\n SPN: 'Permission_updateUserRoleRef',\r\n Params: [data],\r\n });\r\n }\r\n\r\n getUserRoleRef() {\r\n return this.cms.ESP({\r\n SPN: 'Permission_getUserRoleRef',\r\n });\r\n }\r\n\r\n updateRoleMenuRef(data: any) {\r\n return this.cms.ESP({\r\n SPN: 'Permission_updateRoleMenuRef',\r\n Params: [data],\r\n });\r\n }\r\n\r\n getRoleMenuRef() {\r\n return this.cms.ESP({\r\n SPN: 'Permission_getRoleMenuRef',\r\n });\r\n }\r\n\r\n getRoleMenuRefStr(RoleId: string) {\r\n return this.cms.ESP({\r\n SPN: 'Permission_getRoleMenuRefStr',\r\n Params: [RoleId],\r\n });\r\n }\r\n\r\n getUserRoleRefStr(RoleId: string) {\r\n return this.cms.ESP({\r\n SPN: 'Permission_getUserRoleRefStr',\r\n Params: [RoleId],\r\n });\r\n }\r\n\r\n getUserForRole(RoleId: string) {\r\n return this.cms.ESP({\r\n SPN: 'Permission_getUserForRole',\r\n Params: [RoleId],\r\n });\r\n }\r\n\r\n createPermission(obj: any) {\r\n return this.postData(AppGlobals.apiEndpoint + '/api/App_Permission/AddOrEdit', obj);\r\n }\r\n\r\n createLstPermission(bulkPayload: any) {\r\n return this.postData(AppGlobals.apiEndpoint + '/api/App_Permission/AddOrEditLst', bulkPayload);\r\n }\r\n\r\n deletePermission(id: any) {\r\n const p = new HttpParams().append('id', id);\r\n return this.postParams(AppGlobals.apiEndpoint + '/api/App_Permission/delete', p);\r\n }\r\n\r\n getResourcePermission(searchText: string) {\r\n return this.cms.ESP({\r\n SPN: 'Permission_getResourcePermission',\r\n Params: [searchText],\r\n });\r\n }\r\n\r\n getPermissionGroupByCode() {\r\n return this.cms.ESP({\r\n SPN: 'Permission_getPermissionGroupByCode',\r\n });\r\n }\r\n\r\n addRoleResourcePermissionRef(roleId: string, permissionCodes: string) {\r\n let pr = new HttpParams().append('roleId', roleId).append('permissionCodes', permissionCodes);\r\n return this.postParams(AppGlobals.apiEndpoint + '/api/App_Permission/addRoleResourcePermissionRef', pr);\r\n }\r\n\r\n getRolePermissions(roleId: string) {\r\n return this.cms.ESP({\r\n SPN: 'Permission_getRolePermissions',\r\n Params: [roleId],\r\n });\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { HttpParams } from '@angular/common/http';\r\nimport { HTTPService } from '../../services/api-service/http.service';\r\nimport { CommonService } from '../../services/api-service/common.service';\r\nimport { RespondData } from '../../model';\r\nimport { AppGlobals } from '../../app-global';\r\n\r\nexport const URLs = {\r\n getById: '/api/App_Role/GetById',\r\n getAll: '/api/App_Role/GetAll',\r\n getList: '/api/App_Role/GetList',\r\n getPaging: '/api/App_Role/GetPaging',\r\n addOrEdit: '/api/App_Role/AddOrEdit',\r\n delete: '/api/App_Role/Delete',\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class RoleService extends HTTPService {\r\n commonService = inject(CommonService);\r\n\r\n getById(id: any): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Role_getById',\r\n Params: [id],\r\n });\r\n }\r\n\r\n getAll(): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Role_getAll',\r\n });\r\n }\r\n\r\n getList(filter: any): Promise<RespondData> {\r\n return this.postData(AppGlobals.apiEndpoint + URLs.getList, filter);\r\n }\r\n\r\n getPaging(filter: any): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Role_getPaging',\r\n Params: [filter],\r\n });\r\n }\r\n\r\n addOrEdit(obj: any): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Role_addOrEdit',\r\n Params: [obj],\r\n });\r\n }\r\n\r\n delete(id: any): Promise<RespondData> {\r\n const params = new HttpParams().append('id', id);\r\n return this.postParams(AppGlobals.apiEndpoint + URLs.delete, params);\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { HttpParams } from '@angular/common/http';\r\nimport { HTTPService } from '../../services/api-service/http.service';\r\nimport { CommonService } from '../../services/api-service/common.service';\r\nimport { RespondData } from '../../model';\r\nimport { AppGlobals } from '../../app-global';\r\n\r\nexport const URLs = {\r\n getById: '/api/App_Menu/GetById',\r\n getAll: '/api/App_Menu/GetAll',\r\n getList: '/api/App_Menu/GetList',\r\n getPaging: '/api/App_Menu/GetPaging',\r\n addOrEdit: '/api/App_Menu/AddOrEdit',\r\n delete: '/api/App_Menu/Delete',\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class MenuService extends HTTPService {\r\n commonService = inject(CommonService);\r\n\r\n getById(id: any): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Menu_getById',\r\n Params: [id],\r\n });\r\n }\r\n\r\n getAll(): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Menu_getAll',\r\n });\r\n }\r\n\r\n getList(filter: any): Promise<RespondData> {\r\n return this.postData(AppGlobals.apiEndpoint + URLs.getList, filter);\r\n }\r\n\r\n getPaging(filter: any): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Menu_getPaging',\r\n Params: [filter],\r\n });\r\n }\r\n\r\n addOrEdit(obj: any): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Menu_addOrEdit',\r\n Params: [obj],\r\n });\r\n }\r\n\r\n delete(id: any): Promise<RespondData> {\r\n const params = new HttpParams().append('id', id);\r\n return this.postParams(AppGlobals.apiEndpoint + URLs.delete, params);\r\n }\r\n\r\n getTree() {\r\n return this.commonService.ESP({\r\n SPN: 'App_Menu_getTree',\r\n });\r\n }\r\n\r\n getRolesByMenuId(menuId: string): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Role_Menu_Ref_getByMenuId',\r\n Params: [menuId],\r\n });\r\n }\r\n\r\n addRolesToMenu(menuId: string | null, roleIds: string[]): Promise<RespondData> {\r\n if (!menuId) {\r\n return Promise.reject('Menu ID is required');\r\n }\r\n return this.commonService.ESP({\r\n SPN: 'App_Menu_addRolesToMenu',\r\n Params: [menuId, roleIds.join(',')],\r\n });\r\n }\r\n\r\n updateRoleMenuPermission(obj: any): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Menu_updateRoleMenuPermission',\r\n Params: [obj.App_Role_Menu_Ref_Id, obj.HasViewPermission, obj.HasEditPermission],\r\n });\r\n }\r\n\r\n deleteRoleFromMenu(refId: string): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Menu_deleteRoleFromMenu',\r\n Params: [refId],\r\n });\r\n }\r\n}\r\n","import { Component, inject, OnInit } from '@angular/core';\r\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\r\nimport { NzTableModule } from 'ng-zorro-antd/table';\r\nimport { NzCheckboxModule } from 'ng-zorro-antd/checkbox';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { NzFlexModule } from 'ng-zorro-antd/flex';\r\nimport { PermissionService } from '../permission.service';\r\nimport { App_Role_Menu_Ref } from '../permission.model';\r\nimport { BaseComponent } from '../../../../components/base.component';\r\nimport { RoleService } from '../../../service/role.service';\r\nimport { MenuService } from '../../../service/menu.service';\r\nimport { App_Role } from '../../../model/role.model';\r\nimport { App_Menu } from '../../../model/menu.model';\r\n\r\n@Component({\r\n selector: 'app-role-menu-permission',\r\n templateUrl: './role-menu.html',\r\n imports: [\r\n NzSpinModule,\r\n NzTableModule,\r\n FormsModule,\r\n NzCheckboxModule,\r\n TranslateModule,\r\n NzButtonModule,\r\n NzGridModule,\r\n NzFlexModule,\r\n ],\r\n})\r\nexport class RoleMenuPermission extends BaseComponent implements OnInit {\r\n roleService = inject(RoleService);\r\n menuService = inject(MenuService);\r\n permissionService = inject(PermissionService);\r\n\r\n lstRole: App_Role[] = [];\r\n lstMenu: App_Menu[] = [];\r\n lstRoleMenuRef: App_Role_Menu_Ref[] = [];\r\n\r\n // Mapping quyền: RoleId -> MenuId -> boolean\r\n roleMenuMap: { [roleId: string]: { [menuId: string]: boolean } } = {};\r\n\r\n // Quản lý trạng thái Checkbox của từng cột (Role) trên Thead\r\n roleColumnState: { [roleId: string]: { checked: boolean; indeterminate: boolean } } = {};\r\n\r\n ngOnInit(): void {\r\n this.getData();\r\n }\r\n\r\n getData() {\r\n Promise.all([this.roleService.getAll(), this.menuService.getAll(), this.permissionService.getRoleMenuRef()])\r\n .then(([roleRes, menuRes, roleMenuRefRes]) => {\r\n this.lstRole = roleRes.Data || [];\r\n this.lstMenu = menuRes.Data || [];\r\n this.lstRoleMenuRef = roleMenuRefRes.Data || [];\r\n\r\n this.initializeRoleMenuMap();\r\n })\r\n .catch((err) => this.handleError(err));\r\n }\r\n\r\n initializeRoleMenuMap() {\r\n this.roleMenuMap = {};\r\n\r\n // 1. Dùng Set để tra cứu O(1) thay vì dùng Array.find()\r\n const roleMenuSet = new Set(this.lstRoleMenuRef.map((x) => `${x.App_Role_Id}_${x.App_Menu_Id}`));\r\n\r\n this.lstRole.forEach((role) => {\r\n const roleId = role.App_Role_Id!;\r\n this.roleMenuMap[roleId] = {};\r\n\r\n this.lstMenu.forEach((menu) => {\r\n const menuId = menu.App_Menu_Id;\r\n // 2. Lookup siêu tốc bằng Set.has()\r\n this.roleMenuMap[roleId][menuId] = roleMenuSet.has(`${roleId}_${menuId}`);\r\n });\r\n\r\n // 3. Tính toán sẵn trạng thái Select All cho cột Role hiện tại\r\n this.updateRoleColumnState(roleId);\r\n });\r\n }\r\n\r\n // Cập nhật trạng thái Checked / Indeterminate cho cột Role\r\n updateRoleColumnState(roleId: string) {\r\n if (!this.lstMenu.length) {\r\n this.roleColumnState[roleId] = { checked: false, indeterminate: false };\r\n return;\r\n }\r\n\r\n let checkedCount = 0;\r\n this.lstMenu.forEach((menu) => {\r\n if (this.roleMenuMap[roleId][menu.App_Menu_Id]) {\r\n checkedCount++;\r\n }\r\n });\r\n\r\n this.roleColumnState[roleId] = {\r\n checked: checkedCount === this.lstMenu.length,\r\n indeterminate: checkedCount > 0 && checkedCount < this.lstMenu.length,\r\n };\r\n }\r\n\r\n // Khi click vào Checkbox All trên Thead\r\n toggleRolePermissions(roleId: string, checked: boolean) {\r\n this.lstMenu.forEach((menu) => {\r\n this.roleMenuMap[roleId][menu.App_Menu_Id] = checked;\r\n });\r\n // Tính lại trạng thái của cột này\r\n this.updateRoleColumnState(roleId);\r\n }\r\n\r\n // Khi click vào từng Checkbox lẻ trong Tbody\r\n onSinglePermissionChange(roleId: string) {\r\n this.updateRoleColumnState(roleId);\r\n }\r\n\r\n convertRoleMenuMapToArray() {\r\n const result: { RoleId: string; MenuId: string; IsChecked: boolean }[] = [];\r\n\r\n Object.keys(this.roleMenuMap).forEach((roleId) => {\r\n Object.keys(this.roleMenuMap[roleId]).forEach((menuId) => {\r\n result.push({\r\n RoleId: roleId,\r\n MenuId: menuId,\r\n IsChecked: this.roleMenuMap[roleId][menuId],\r\n });\r\n });\r\n });\r\n\r\n return result;\r\n }\r\n\r\n saveRoleMenuMap() {\r\n const payload = this.convertRoleMenuMapToArray();\r\n this.permissionService.updateRoleMenuRef(payload).then(\r\n () => this.notiService.success(this.translate.instant(this.TranslateKey.SAVE_SUCCESS)),\r\n (err) => this.handleError(err),\r\n );\r\n }\r\n}\r\n","<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\" nz-flex nzGap=\"small\">\r\n <button nz-button nzType=\"primary\" (click)=\"saveRoleMenuMap()\">{{ TranslateKey.SAVE | translate }}</button>\r\n <button nz-button nzType=\"primary\" (click)=\"getData()\">{{ TranslateKey.REFEESH | translate }}</button>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table [nzData]=\"lstMenu\" nzShowPagination=\"false\" [nzBordered]=\"true\" [nzSize]=\"'small'\">\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"200px\"></th>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <th style=\"text-align: center\">{{ role.Name }}</th>\r\n }\r\n </tr>\r\n <tr>\r\n <th nzWidth=\"200px\"></th>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <th style=\"text-align: center\">\r\n <label\r\n nz-checkbox\r\n [nzChecked]=\"roleColumnState[role.App_Role_Id!].checked\"\r\n [nzIndeterminate]=\"roleColumnState[role.App_Role_Id!].indeterminate\"\r\n (nzCheckedChange)=\"toggleRolePermissions(role.App_Role_Id!, $event)\"\r\n ></label>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (menu of lstMenu; track menu.App_Menu_Id) {\r\n <tr>\r\n <td>{{ menu.TreeNodeName }}</td>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <td class=\"text-center\">\r\n <label\r\n nz-checkbox\r\n [(ngModel)]=\"roleMenuMap[role.App_Role_Id!][menu.App_Menu_Id]\"\r\n (ngModelChange)=\"onSinglePermissionChange(role.App_Role_Id!)\"\r\n ></label>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n</div>\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { HttpParams } from '@angular/common/http';\r\nimport { HTTPService } from '../../services/api-service/http.service';\r\nimport { CommonService } from '../../services/api-service/common.service';\r\nimport { RespondData } from '../../model';\r\nimport { AppGlobals } from '../../app-global';\r\n\r\nexport const URLs = {\r\n getById: '/api/App_User/GetById',\r\n getByIdEx: '/api/App_User/GetByIdEx',\r\n getAll: '/api/App_User/GetAll',\r\n getList: '/api/App_User/GetList',\r\n getPaging: '/api/App_User/GetPaging',\r\n addOrEdit: '/api/App_User/AddOrEdit',\r\n delete: '/api/App_User/Delete',\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class UserService extends HTTPService {\r\n cms = inject(CommonService);\r\n\r\n getById(id: any): Promise<RespondData> {\r\n const params = new HttpParams().append('id', id);\r\n return this.postParams(AppGlobals.apiEndpoint + URLs.getById, params);\r\n }\r\n\r\n getByIdEx(id: any): Promise<RespondData> {\r\n return this.cms.ESP({\r\n SPN: 'App_User_getByIdEx',\r\n Params: [id],\r\n });\r\n }\r\n\r\n getAll(): Promise<RespondData> {\r\n return this.cms.ESP({\r\n SPN: 'App_User_getAll',\r\n });\r\n }\r\n\r\n getList(filter: any): Promise<RespondData> {\r\n return this.postData(AppGlobals.apiEndpoint + URLs.getList, filter);\r\n }\r\n\r\n getPaging(filter: any): Promise<RespondData> {\r\n return this.cms.ESP({\r\n SPN: 'App_User_getPaging',\r\n Params: [filter],\r\n });\r\n }\r\n\r\n addOrEdit(obj: any): Promise<RespondData> {\r\n return this.cms.ESP({\r\n SPN: 'App_User_addOrEdit',\r\n Params: [obj],\r\n });\r\n }\r\n\r\n delete(id: any): Promise<RespondData> {\r\n const params = new HttpParams().append('id', id);\r\n return this.postParams(AppGlobals.apiEndpoint + URLs.delete, params);\r\n }\r\n\r\n importUser(data: any) {\r\n return this.postData(`${AppGlobals.apiEndpoint}/api/App_User/ImportUser`, data);\r\n }\r\n\r\n checkImportUser(data: any) {\r\n return this.cms.ESP({\r\n SPN: 'App_User_checkImportUser',\r\n Params: [data],\r\n });\r\n }\r\n}\r\n","import { Component, inject, OnInit } from '@angular/core';\r\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\r\nimport { NzTableModule } from 'ng-zorro-antd/table';\r\nimport { NzCheckboxModule } from 'ng-zorro-antd/checkbox';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { PermissionService } from '../permission.service';\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { NzFlexModule } from 'ng-zorro-antd/flex';\r\nimport { BaseComponent } from '../../../../components/base.component';\r\nimport { RoleService } from '../../../service/role.service';\r\nimport { UserService } from '../../../service/user.service';\r\nimport { App_Role } from '../../../model/role.model';\r\nimport { App_User } from '../../../model/user.model';\r\nimport { App_User_Role_Ref } from '../permission.model';\r\n\r\n@Component({\r\n selector: 'app-user-role-permission',\r\n templateUrl: './user-role.html',\r\n imports: [\r\n NzSpinModule,\r\n NzTableModule,\r\n FormsModule,\r\n NzCheckboxModule,\r\n TranslateModule,\r\n NzButtonModule,\r\n NzGridModule,\r\n NzFlexModule,\r\n ],\r\n})\r\nexport class UserRolePermission extends BaseComponent implements OnInit {\r\n roleService = inject(RoleService);\r\n userService = inject(UserService);\r\n permissionService = inject(PermissionService);\r\n\r\n lstRole: App_Role[] = [];\r\n lstUser: App_User[] = [];\r\n lstUserRoleRef: App_User_Role_Ref[] = [];\r\n\r\n // Lưu trữ mapping quyền\r\n userRoleMap: { [userId: string]: { [roleId: string]: boolean } } = {};\r\n\r\n // Lưu trữ trạng thái Checkbox của cột \"Chọn tất cả\" cho từng User để tránh gọi hàm trong HTML\r\n userRowState: { [userId: string]: { checked: boolean; indeterminate: boolean } } = {};\r\n\r\n ngOnInit(): void {\r\n this.getData();\r\n }\r\n\r\n getData() {\r\n Promise.all([this.roleService.getAll(), this.userService.getAll(), this.permissionService.getUserRoleRef()])\r\n .then(([roleRes, userRes, roleMenuRefRes]) => {\r\n this.lstRole = roleRes.Data || [];\r\n this.lstUser = userRes.Data || [];\r\n this.lstUserRoleRef = roleMenuRefRes.Data || [];\r\n\r\n this.initializeRoleMenuMap();\r\n })\r\n .catch((err) => this.handleError(err));\r\n }\r\n\r\n initializeRoleMenuMap() {\r\n this.userRoleMap = {};\r\n\r\n // 1. Chuyển Array sang Set với khóa tổ hợp \"UserId_RoleId\" để tra cứu O(1)\r\n const userRoleSet = new Set(this.lstUserRoleRef.map((x) => `${x.App_User_Id}_${x.App_Role_Id}`));\r\n\r\n this.lstUser.forEach((user) => {\r\n const userId = user.App_User_Id!;\r\n this.userRoleMap[userId] = {};\r\n\r\n this.lstRole.forEach((role) => {\r\n const roleId = role.App_Role_Id!;\r\n // 2. Tra cứu siêu tốc bằng Set.has()\r\n this.userRoleMap[userId][roleId] = userRoleSet.has(`${userId}_${roleId}`);\r\n });\r\n\r\n // 3. Khởi tạo luôn trạng thái Checkbox tổng cho dòng này\r\n this.updateUserRowState(userId);\r\n });\r\n }\r\n\r\n // Hàm tính toán trạng thái Checked/Indeterminate và lưu vào Object\r\n updateUserRowState(userId: string) {\r\n if (!this.lstRole.length) {\r\n this.userRowState[userId] = { checked: false, indeterminate: false };\r\n return;\r\n }\r\n\r\n let checkedCount = 0;\r\n this.lstRole.forEach((role) => {\r\n if (this.userRoleMap[userId][role.App_Role_Id!]) {\r\n checkedCount++;\r\n }\r\n });\r\n\r\n this.userRowState[userId] = {\r\n checked: checkedCount === this.lstRole.length,\r\n indeterminate: checkedCount > 0 && checkedCount < this.lstRole.length,\r\n };\r\n }\r\n\r\n // Xử lý khi click vào Checkbox chọn tất cả của một dòng\r\n toggleUserPermissions(userId: string, checked: boolean) {\r\n this.lstRole.forEach((role) => {\r\n this.userRoleMap[userId][role.App_Role_Id!] = checked;\r\n });\r\n // Cập nhật lại state của dòng\r\n this.updateUserRowState(userId);\r\n }\r\n\r\n // Xử lý khi click vào Checkbox của từng quyền lẻ\r\n onSinglePermissionChange(userId: string) {\r\n this.updateUserRowState(userId);\r\n }\r\n\r\n convertUserRoleMapToArray() {\r\n const result: { UserId: string; RoleId: string; IsChecked: boolean }[] = [];\r\n\r\n Object.keys(this.userRoleMap).forEach((userId) => {\r\n Object.keys(this.userRoleMap[userId]).forEach((roleId) => {\r\n result.push({\r\n UserId: userId,\r\n RoleId: roleId,\r\n IsChecked: this.userRoleMap[userId][roleId],\r\n });\r\n });\r\n });\r\n\r\n return result;\r\n }\r\n\r\n saveUserRoleMap() {\r\n const payload = this.convertUserRoleMapToArray();\r\n this.permissionService.updateUserRoleRef(payload).then(\r\n () => this.notiService.success(this.translate.instant(this.TranslateKey.SAVE_SUCCESS)),\r\n (err) => this.handleError(err),\r\n );\r\n }\r\n}\r\n","<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\" nz-flex nzGap=\"small\">\r\n <button nz-button nzType=\"primary\" (click)=\"saveUserRoleMap()\">{{ TranslateKey.SAVE | translate }}</button>\r\n <button nz-button nzType=\"primary\" (click)=\"getData()\">{{ TranslateKey.REFEESH | translate }}</button>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table [nzData]=\"lstUser\" nzShowPagination=\"false\" [nzBordered]=\"true\" [nzSize]=\"'small'\">\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"200px\"></th>\r\n <th nzWidth=\"40px\"></th>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <th style=\"text-align: center\">{{ role.Name }}</th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (user of lstUser; track user.App_User_Id) {\r\n <tr>\r\n <td>{{ user.FullName }}</td>\r\n <td>\r\n <label\r\n nz-checkbox\r\n [nzChecked]=\"userRowState[user.App_User_Id!].checked\"\r\n [nzIndeterminate]=\"userRowState[user.App_User_Id!].indeterminate\"\r\n (nzCheckedChange)=\"toggleUserPermissions(user.App_User_Id!, $event)\"\r\n ></label>\r\n </td>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <td class=\"text-center\">\r\n <label\r\n nz-checkbox\r\n [(ngModel)]=\"userRoleMap[user.App_User_Id!][role.App_Role_Id!]\"\r\n (ngModelChange)=\"onSinglePermissionChange(user.App_User_Id!)\"\r\n ></label>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n</div>\r\n","import { Component, inject, OnInit } from '@angular/core';\r\nimport { ResourceGroupDto, SaveRolePermissionReq } from './role-permission.model';\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzDividerModule } from 'ng-zorro-antd/divider';\r\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { NzCheckboxModule } from 'ng-zorro-antd/checkbox';\r\nimport { PermissionService } from '../permission.service';\r\nimport { BaseComponent } from '../../../../components/base.component';\r\nimport { RoleService } from '../../../service/role.service';\r\nimport { App_Role } from '../../../model/role.model';\r\n\r\n@Component({\r\n selector: 'role-resource-permission',\r\n templateUrl: './role-permission.component.html',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n NzCardModule,\r\n NzSelectModule,\r\n NzButtonModule,\r\n NzDividerModule,\r\n NzSpinModule,\r\n NzGridModule,\r\n NzCheckboxModule,\r\n ],\r\n})\r\nexport class RolePermissionComponent extends BaseComponent implements OnInit {\r\n roleService = inject(RoleService);\r\n permissionService = inject(PermissionService);\r\n\r\n lstRole: App_Role[] = [];\r\n resourceGroups: ResourceGroupDto[] = [];\r\n\r\n selectedRoleId: string | null = null;\r\n\r\n // Lưu trữ danh sách PermissionCode đang được tích chọn cho Role hiện tại\r\n selectedPermissionCodes: Set<string> = new Set<string>();\r\n\r\n isLoading = false;\r\n isSaving = false;\r\n\r\n ngOnInit(): void {\r\n this.loadRoles();\r\n // this.loadAllResources(); // Load khung Matrix (danh mục Module & Actions)\r\n }\r\n\r\n // --- 1. Gọi API lấy danh sách Role động ---\r\n loadRoles(): void {\r\n this.roleService.getAll().then((res) => (this.lstRole = res.Data || []));\r\n }\r\n\r\n // --- 2. Gọi API lấy danh mục Resource và Permission (Ma trận tĩnh) ---\r\n loadAllResources(): void {\r\n this.permissionService.getPermissionGroupByCode().then(\r\n (res) => (this.resourceGroups = res.Data),\r\n (err) => this.handleError(err),\r\n );\r\n }\r\n\r\n // --- 3. Xử lý khi User đổi Role ---\r\n onRoleChange(roleId: string): void {\r\n if (!roleId) return;\r\n this.isLoading = true;\r\n\r\n // Xóa state cũ\r\n this.selectedPermissionCodes.clear();\r\n\r\n let activePermsFromDb: string[] = [];\r\n this.permissionService\r\n .getRolePermissions(roleId)\r\n .then(\r\n (res) => {\r\n activePermsFromDb = res.Data?.split(';') || [];\r\n this.selectedPermissionCodes = new Set(activePermsFromDb);\r\n },\r\n (err) => this.handleError(err),\r\n )\r\n .finally(() => (this.isLoading = false));\r\n\r\n this.loadAllResources();\r\n }\r\n\r\n // --- 4. Logic UI: Thao tác Check/Uncheck ---\r\n isPermissionChecked(code: string): boolean {\r\n return this.selectedPermissionCodes.has(code);\r\n }\r\n\r\n onCheckChange(code: string, isChecked: boolean): void {\r\n if (isChecked) {\r\n this.selectedPermissionCodes.add(code);\r\n } else {\r\n this.selectedPermissionCodes.delete(code);\r\n }\r\n }\r\n\r\n // --- 5. Lưu xuống DB ---\r\n savePermissions(): void {\r\n if (!this.selectedRoleId) return;\r\n\r\n this.isSaving = true;\r\n\r\n const payload: SaveRolePermissionReq = {\r\n roleId: this.selectedRoleId,\r\n // Chuyển Set về lại Array để gửi API\r\n permissionCodes: Array.from(this.selectedPermissionCodes),\r\n };\r\n\r\n this.permissionService\r\n .addRoleResourcePermissionRef(payload.roleId, payload.permissionCodes.join(';'))\r\n .then(\r\n (res) => this.notiService.success('Đã lưu cấu hình phân quyền thành công!'),\r\n (err) => this.handleError(err),\r\n )\r\n .finally(() => (this.isSaving = false));\r\n }\r\n}\r\n","<nz-card [nzBordered]=\"false\" nzTitle=\"Cấu hình Phân quyền Hệ thống\">\r\n <div class=\"header-action\" nz-row nzJustify=\"space-between\" nzAlign=\"middle\" style=\"margin-bottom: 24px\">\r\n <div nz-col>\r\n <span style=\"margin-right: 16px; font-weight: bold\">Chọn Nhóm quyền (Role):</span>\r\n <nz-select\r\n [(ngModel)]=\"selectedRoleId\"\r\n (ngModelChange)=\"onRoleChange($event)\"\r\n nzPlaceHolder=\"-- Vui lòng chọn Role --\"\r\n style=\"width: 300px\"\r\n >\r\n <nz-option *ngFor=\"let role of lstRole\" [nzValue]=\"role.App_Role_Id\" [nzLabel]=\"role.Name || ''\"></nz-option>\r\n </nz-select>\r\n </div>\r\n <div nz-col>\r\n <button\r\n nz-button\r\n nzType=\"primary\"\r\n (click)=\"savePermissions()\"\r\n [nzLoading]=\"isSaving\"\r\n [disabled]=\"!selectedRoleId\"\r\n >\r\n <i nz-icon nzType=\"save\"></i> Lưu cấu hình\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <nz-divider></nz-divider>\r\n\r\n <nz-spin [nzSpinning]=\"isLoading\">\r\n <div *ngIf=\"!selectedRoleId\" style=\"text-align: center; color: #999; padding: 40px 0\">\r\n Vui lòng chọn một Nhóm quyền để xem và cấu hình.\r\n </div>\r\n\r\n <div *ngIf=\"selectedRoleId\">\r\n <div *ngFor=\"let group of resourceGroups\" style=\"margin-bottom: 24px\">\r\n <h4 style=\"border-left: 4px solid #1890ff; padding-left: 8px; margin-bottom: 16px\">\r\n {{ group.ResourceName }}\r\n </h4>\r\n\r\n <nz-card [nzBordered]=\"true\" nzSize=\"small\">\r\n <nz-row [nzGutter]=\"[16, 16]\">\r\n <nz-col [nzSpan]=\"6\" *ngFor=\"let perm of group.permissions\">\r\n <label\r\n nz-checkbox\r\n [nzChecked]=\"isPermissionChecked(perm.PermissionCode)\"\r\n (nzCheckedChange)=\"onCheckChange(perm.PermissionCode, $event)\"\r\n >\r\n {{ perm.PermissionName }} <br />\r\n <small style=\"color: #888\">({{ perm.PermissionCode }})</small>\r\n </label>\r\n </nz-col>\r\n </nz-row>\r\n </nz-card>\r\n </div>\r\n </div>\r\n </nz-spin>\r\n</nz-card>\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzTableModule } from 'ng-zorro-antd/table';\r\nimport { NzTagModule } from 'ng-zorro-antd/tag';\r\nimport { NzDividerModule } from 'ng-zorro-antd/divider';\r\nimport { NzModalModule } from 'ng-zorro-antd/modal';\r\nimport { NzFormModule } from 'ng-zorro-antd/form';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\nimport { NzCheckboxModule } from 'ng-zorro-antd/checkbox';\r\nimport { NzAutocompleteModule } from 'ng-zorro-antd/auto-complete';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm';\r\nimport { NzFlexDirective } from 'ng-zorro-antd/flex';\r\nimport { PermissionService } from '../permission.service';\r\nimport { BaseComponent } from '../../../../components/base.component';\r\nimport { ExpandableSearchComponent } from '../../../../components/search/expandable-search/expandable-search.component';\r\n\r\nexport interface App_Permission {\r\n App_Permission_Id: string;\r\n ResourceCode: string;\r\n ResourceName: string;\r\n PermissionCode: string;\r\n PermissionName: string;\r\n Description: string;\r\n}\r\n\r\n@Component({\r\n selector: 'resource-permission',\r\n templateUrl: './resource-permission.component.html',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n NzCardModule,\r\n NzInputModule,\r\n NzTableModule,\r\n NzTagModule,\r\n NzDividerModule,\r\n NzModalModule,\r\n NzFormModule,\r\n NzButtonModule,\r\n NzSelectModule,\r\n NzCheckboxModule,\r\n NzAutocompleteModule,\r\n NzIconModule,\r\n ExpandableSearchComponent,\r\n NzPopconfirmModule,\r\n NzFlexDirective,\r\n ],\r\n})\r\nexport class PermissionManagerComponent extends BaseComponent implements OnInit {\r\n permissions: App_Permission[] = [];\r\n\r\n searchText = '';\r\n\r\n isModalVisible = false;\r\n isSaving = false;\r\n isEditMode = false;\r\n currentEditingId: string | null = null;\r\n permissionForm!: FormGroup;\r\n\r\n // danh sách các Action chuẩn của hệ thống\r\n actionOptions = [\r\n { value: 'create', label: '1. Tạo mới (create)' },\r\n\r\n { value: 'read_all', label: '2. Xem tất cả (read_all)' },\r\n { value: 'update_all', label: '3. Sửa tất cả (update_all)' },\r\n { value: 'delete_all', label: '4. Xóa tất cả (delete_all)' },\r\n\r\n { value: 'read_own', label: '5. Xem của mình (read_own)' },\r\n { value: 'update_own', label: '6. Sửa của mình (update_own)' },\r\n { value: 'delete_own', label: '7. Xóa của mình (delete_own)' },\r\n\r\n { value: 'export', label: '8. Xuất dữ liệu (export)' },\r\n ];\r\n\r\n filteredActionOptions = [...this.actionOptions];\r\n\r\n isBulkModalVisible = false;\r\n bulkForm!: FormGroup;\r\n\r\n bulkActionCheckboxes: Array<{ label: string; value: string; checked: boolean }> = [];\r\n\r\n constructor(\r\n private fb: FormBuilder,\r\n private permissionService: PermissionService,\r\n ) {\r\n super();\r\n this.initForm();\r\n this.initBulkForm();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.loadData();\r\n }\r\n\r\n initBulkForm(): void {\r\n this.bulkForm = this.fb.group({\r\n ResourceCode: ['', [Validators.required, Validators.pattern(/^[a-zA-Z0-9]+$/)]],\r\n ResourceName: ['', [Validators.required]],\r\n });\r\n }\r\n\r\n openBulkModal(): void {\r\n this.isBulkModalVisible = true;\r\n this.bulkForm.reset();\r\n\r\n this.bulkActionCheckboxes = this.actionOptions.map((opt) => ({\r\n label: opt.label,\r\n value: opt.value,\r\n checked: true,\r\n }));\r\n }\r\n\r\n closeBulkModal(): void {\r\n this.isBulkModalVisible = false;\r\n }\r\n\r\n saveBulkPermissions(): void {\r\n if (this.bulkForm.invalid) {\r\n Object.values(this.bulkForm.controls).forEach((control) => {\r\n control.markAsDirty();\r\n control.updateValueAndValidity({ onlySelf: true });\r\n });\r\n return;\r\n }\r\n\r\n const { ResourceCode, ResourceName } = this.bulkForm.value;\r\n\r\n const selectedActions = this.bulkActionCheckboxes.filter((x) => x.checked);\r\n\r\n if (selectedActions.length === 0) {\r\n this.notiService.warning('Vui lòng chọn ít nhất một hành động để tạo!');\r\n return;\r\n }\r\n\r\n const bulkPayload = selectedActions.map((action) => {\r\n return {\r\n ResourceCode: ResourceCode,\r\n ResourceName: ResourceName,\r\n PermissionCode: `${ResourceCode.toLowerCase().trim()}:${action.value}`,\r\n PermissionName: `${action.value} ${ResourceCode}`,\r\n Description: `Auto create for resource ${ResourceName}`,\r\n };\r\n });\r\n\r\n this.permissionService.createLstPermission(bulkPayload).then(\r\n (res) => {\r\n this.notiService.success(`Đã tạo thành công ${bulkPayload.length} mã quyền!`);\r\n this.isBulkModalVisible = false;\r\n this.loadData();\r\n },\r\n (err) => this.handleError(err),\r\n );\r\n }\r\n\r\n initForm(): void {\r\n this.permissionForm = this.fb.group({\r\n ResourceName: ['', [Validators.required]],\r\n ResourceCode: ['', [Validators.required]],\r\n actionSuffix: ['', [Validators.required]],\r\n PermissionCode: [{ value: '', disabled: true }],\r\n PermissionName: ['', [Validators.required]],\r\n Description: [''],\r\n });\r\n\r\n this.permissionForm.valueChanges.subscribe((val) => {\r\n const mod = val.ResourceCode || '';\r\n const act = val.actionSuffix || '';\r\n\r\n if (mod && act) {\r\n const generatedCode = `${mod.toLowerCase().trim()}:${act}`;\r\n this.permissionForm.get('PermissionCode')?.setValue(generatedCode, { emitEvent: false });\r\n } else {\r\n if (!this.isEditMode) {\r\n this.permissionForm.get('PermissionCode')?.setValue('', { emitEvent: false });\r\n }\r\n }\r\n });\r\n }\r\n\r\n loadData(): void {\r\n this.permissionService.getResourcePermission(this.searchText).then(\r\n (res) => (this.permissions = res.Data || []),\r\n (err) => this.handleError(err),\r\n );\r\n }\r\n\r\n openModal(data?: App_Permission): void {\r\n this.isModalVisible = true;\r\n if (data) {\r\n this.isEditMode = true;\r\n this.currentEditingId = data.App_Permission_Id;\r\n\r\n const codeParts = data.PermissionCode.split(':');\r\n const suffix = codeParts.length > 1 ? codeParts[1] : '';\r\n\r\n this.permissionForm.patchValue({\r\n ResourceName: data.ResourceName,\r\n ResourceCode: data.ResourceCode,\r\n actionSuffix: suffix,\r\n PermissionCode: data.PermissionCode,\r\n PermissionName: data.PermissionName,\r\n Description: data.Description,\r\n });\r\n\r\n this.permissionForm.get('ResourceCode')?.disable();\r\n this.permissionForm.get('actionSuffix')?.disable();\r\n } else {\r\n this.isEditMode = false;\r\n this.currentEditingId = null;\r\n this.permissionForm.reset();\r\n this.permissionForm.get('ResourceCode')?.enable();\r\n this.permissionForm.get('actionSuffix')?.enable();\r\n }\r\n }\r\n\r\n closeModal(): void {\r\n this.isModalVisible = false;\r\n this.permissionForm.reset();\r\n }\r\n\r\n savePermission(): void {\r\n if (this.permissionForm.invalid) {\r\n this.touchControls(this.permissionForm);\r\n return;\r\n }\r\n\r\n const formData = this.permissionForm.getRawValue();\r\n\r\n const payload = {\r\n App_Permission_Id: this.currentEditingId,\r\n ResourceName: formData.ResourceName,\r\n ResourceCode: formData.ResourceCode,\r\n PermissionCode: formData.PermissionCode,\r\n PermissionName: formData.PermissionName,\r\n Description: formData.Description,\r\n };\r\n\r\n this.permissionService.createPermission(payload).then(\r\n (res) => {\r\n this.notiService.success(`Đã tạo thành công mã quyền!`);\r\n this.isModalVisible = false;\r\n this.loadData();\r\n },\r\n (err) => this.handleError(err),\r\n );\r\n }\r\n\r\n async deletePermission(id: string): Promise<void> {\r\n await this.permissionService.deletePermission(id);\r\n this.notiService.success('Đã xóa mã quyền!');\r\n this.loadData();\r\n }\r\n}\r\n","<nz-card nzTitle=\"Quản lý Danh mục Mã quyền (App_Permission)\" [nzBordered]=\"false\">\r\n <div class=\"table-operations\" nz-row nzJustify=\"space-between\" style=\"margin-bottom: 16px\">\r\n <div nz-col>\r\n <expandable-search [(searchValue)]=\"searchText\" (onSearch)=\"loadData()\"></expandable-search>\r\n <button nz-button nzType=\"primary\" (click)=\"loadData()\" style=\"margin-right: 8px\">Tải lại</button>\r\n </div>\r\n <div nz-col>\r\n <button nz-button nzType=\"primary\" (click)=\"openBulkModal()\" style=\"margin-right: 8px\">\r\n <i nz-icon nzType=\"bolt\"></i> Tạo mới (default)\r\n </button>\r\n <button nz-button nzType=\"primary\" (click)=\"openModal()\"><i nz-icon nzType=\"plus\"></i> Thêm mới</button>\r\n </div>\r\n </div>\r\n\r\n <nz-table\r\n #basicTable\r\n [nzData]=\"permissions\"\r\n nzBordered\r\n nzSize=\"small\"\r\n nzShowPagination=\"true\"\r\n nzShowSizeChanger=\"true\"\r\n >\r\n <thead>\r\n <tr>\r\n <th>Resource</th>\r\n <th>Permission code</th>\r\n <th>Permission name</th>\r\n <th>Description</th>\r\n <th nzAlign=\"center\">Hành động</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of basicTable.data\">\r\n <td>\r\n <div nz-flex nzGap=\"small\">\r\n <span>{{ data.ResourceName }}</span\r\n ><nz-tag [nzColor]=\"'blue'\">{{ data.ResourceCode }}</nz-tag>\r\n </div>\r\n </td>\r\n <td>\r\n <strong>{{ data.PermissionCode }}</strong>\r\n </td>\r\n <td>{{ data.PermissionName }}</td>\r\n <td>{{ data.Description }}</td>\r\n <td nzAlign=\"center\">\r\n <a (click)=\"openModal(data)\"><i nz-icon nzType=\"edit\" nzTheme=\"outline\"></i></a>\r\n <nz-divider nzType=\"vertical\"></nz-divider>\r\n <a\r\n nz-popconfirm\r\n nzPopconfirmTitle=\"Xác nhận xóa?\"\r\n nzPopconfirmPlacement=\"left\"\r\n (nzOnConfirm)=\"deletePermission(data.App_Permission_Id)\"\r\n style=\"color: red\"\r\n >\r\n <i nz-icon nzType=\"delete\" nzTheme=\"outline\"></i>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n</nz-card>\r\n\r\n<nz-modal\r\n [(nzVisible)]=\"isBulkModalVisible\"\r\n nzTitle=\"Create Resource permission\"\r\n (nzOnCancel)=\"closeBulkModal()\"\r\n (nzOnOk)=\"saveBulkPermissions()\"\r\n [nzMaskClosable]=\"false\"\r\n nzWidth=\"750px\"\r\n>\r\n <ng-container *nzModalContent>\r\n <!-- <div style=\"margin-bottom: 16px; color: #666\">\r\n <i nz-icon nzType=\"info-circle\"></i> Hệ thống sẽ tự động sinh mã quyền và tên thao tác dựa trên Module bạn nhập.\r\n Bạn có thể bỏ tích các thao tác không cần thiết.\r\n </div> -->\r\n\r\n <form nz-form [formGroup]=\"bulkForm\" nzLayout=\"vertical\">\r\n <nz-row [nzGutter]=\"16\">\r\n <nz-col [nzSpan]=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzRequired>Resource Code</nz-form-label>\r\n <nz-form-control nzErrorTip=\"Vui lòng nhập mã Module viết liền!\">\r\n <input nz-input formControlName=\"ResourceCode\" placeholder=\"VD: Invoices, Products...\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n </nz-col>\r\n\r\n <nz-col [nzSpan]=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzRequired>Resource Name</nz-form-label>\r\n <nz-form-control nzErrorTip=\"Vui lòng nhập tên Module!\">\r\n <input nz-input formControlName=\"ResourceName\" placeholder=\"VD: Hóa đơn, Sản phẩm...\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n </nz-col>\r\n </nz-row>\r\n </form>\r\n\r\n <nz-divider nzText=\"Danh sách Thao tác\" nzOrientation=\"left\"></nz-divider>\r\n\r\n <nz-row [nzGutter]=\"[16, 16]\">\r\n @for (item of bulkActionCheckboxes; track $index) {\r\n <nz-col [nzSpan]=\"$index == 0 ? 24 : 8\">\r\n <label nz-checkbox [(ngModel)]=\"item.checked\" [ngModelOptions]=\"{ standalone: true }\">\r\n {{ item.label }}\r\n </label>\r\n </nz-col>\r\n }\r\n </nz-row>\r\n </ng-container>\r\n</nz-modal>\r\n\r\n<nz-modal\r\n [(nzVisible)]=\"isModalVisible\"\r\n [nzTitle]=\"isEditMode ? 'Update Resource permission' : 'Create Resource permission'\"\r\n (nzOnCancel)=\"closeModal()\"\r\n (nzOnOk)=\"savePermission()\"\r\n [nzOkLoading]=\"isSaving\"\r\n [nzMaskClosable]=\"false\"\r\n>\r\n <ng-container *nzModalContent>\r\n <form nz-form [formGroup]=\"permissionForm\" nzLayout=\"vertical\">\r\n <nz-row [nzGutter]=\"16\">\r\n <nz-col [nzSpan]=\"24\">\r\n <nz-form-item>\r\n <nz-form-label nzRequired>Resource name</nz-form-label>\r\n <nz-form-control nzErrorTip=\"Vui lòng nhập nhóm Resource name!\">\r\n <input nz-input formControlName=\"ResourceName\" placeholder=\"VD: Todos\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n </nz-col>\r\n\r\n <nz-col [nzSpan]=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzRequired>Resource code</nz-form-label>\r\n <nz-form-control nzErrorTip=\"Vui lòng nhập nhóm Resource Code!\">\r\n <input nz-input formControlName=\"ResourceCode\" placeholder=\"VD: todo\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n </nz-col>\r\n\r\n <nz-col [nzSpan]=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzRequired>Permission code</nz-form-label>\r\n <nz-form-control nzErrorTip=\"Vui lòng nhập Permission code!\">\r\n <input\r\n nz-input\r\n formControlName=\"actionSuffix\"\r\n placeholder=\"-- Chọn hoặc tự nhập --\"\r\n [nzAutocomplete]=\"auto\"\r\n />\r\n\r\n <nz-autocomplete #auto>\r\n <nz-auto-option *ngFor=\"let option of filteredActionOptions\" [nzValue]=\"option.value\">\r\n {{ option.label }}\r\n </nz-auto-option>\r\n </nz-autocomplete>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </nz-col>\r\n </nz-row>\r\n\r\n <nz-form-item>\r\n <nz-form-label>Mã quyền hệ thống (Tự động sinh)</nz-form-label>\r\n <nz-form-control>\r\n <input\r\n nz-input\r\n formControlName=\"PermissionCode\"\r\n style=\"background-color: #f5f5f5; color: #1890ff; font-weight: bold; font-family: monospace\"\r\n />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label nzRequired>Tên thao tác hiển thị</nz-form-label>\r\n <nz-form-control nzErrorTip=\"Vui lòng nhập tên thao tác!\">\r\n <input nz-input formControlName=\"PermissionName\" placeholder=\"VD: Xem công việc của mình\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n </form>\r\n </ng-container>\r\n</nz-modal>\r\n","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { NzTabsModule } from 'ng-zorro-antd/tabs';\r\nimport { RoleMenuPermission } from './role-menu/role-menu';\r\nimport { UserRolePermission } from './user-role/user-role';\r\nimport { RolePermissionComponent } from './role-permission/role-permission.component';\r\nimport { PermissionManagerComponent } from './resource-permission/resource-permission.component';\r\nimport { BaseComponent } from '../../../components/base.component';\r\nimport { Breadcrumb } from '../../../components/breadcrumb/breadcrumb';\r\n\r\n@Component({\r\n selector: 'app-permision',\r\n templateUrl: './permission.component.html',\r\n imports: [NzTabsModule, UserRolePermission, RoleMenuPermission, RolePermissionComponent, PermissionManagerComponent],\r\n})\r\nexport class PermissionComponent extends BaseComponent implements OnInit, OnDestroy {\r\n ngOnInit(): void {\r\n this.tab = +(this.getUrlQueryParam('tab') || 0);\r\n Breadcrumb.lstBreadcrumb = [\r\n {\r\n Name: 'Permission',\r\n },\r\n {\r\n Name: 'User - Role',\r\n },\r\n ];\r\n }\r\n\r\n ngOnDestroy(): void {\r\n Breadcrumb.lstBreadcrumb = [];\r\n }\r\n\r\n tab = 0;\r\n\r\n onSelectedIndexChange(tabIndex: number) {\r\n this.setQueryParam('tab', tabIndex + '');\r\n\r\n setTimeout(() => {\r\n if (tabIndex == 0) {\r\n Breadcrumb.lstBreadcrumb = [\r\n {\r\n Name: 'Permission',\r\n },\r\n {\r\n Name: 'User - Role',\r\n },\r\n ];\r\n } else if (tabIndex == 1) {\r\n Breadcrumb.lstBreadcrumb = [\r\n {\r\n Name: 'Permission',\r\n },\r\n {\r\n Name: 'Role - Menu',\r\n },\r\n ];\r\n } else if (tabIndex == 2) {\r\n Breadcrumb.lstBreadcrumb = [\r\n {\r\n Name: 'Permission',\r\n },\r\n {\r\n Name: 'Resource permission',\r\n },\r\n ];\r\n } else if (tabIndex == 3) {\r\n Breadcrumb.lstBreadcrumb = [\r\n {\r\n Name: 'Permission',\r\n },\r\n {\r\n Name: 'Role - Resource permission',\r\n },\r\n ];\r\n }\r\n }, 0);\r\n }\r\n}\r\n","<div class=\"panel\">\r\n <nz-tabset\r\n nzType=\"card\"\r\n [nzSize]=\"'small'\"\r\n [nzSelectedIndex]=\"tab\"\r\n (nzSelectedIndexChange)=\"onSelectedIndexChange($event)\"\r\n >\r\n <nz-tab nzTitle=\"User - Role\">\r\n <app-user-role-permission></app-user-role-permission>\r\n </nz-tab>\r\n <nz-tab nzTitle=\"Role - Menu\">\r\n <app-role-menu-permission></app-role-menu-permission>\r\n </nz-tab>\r\n <nz-tab nzTitle=\"Resource permission\">\r\n <resource-permission></resource-permission>\r\n </nz-tab>\r\n <nz-tab nzTitle=\"Role - Resource permission\">\r\n <role-resource-permission></role-resource-permission>\r\n </nz-tab>\r\n </nz-tabset>\r\n</div>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { PermissionService } from './permission.service';\r\nimport { ResourceMap } from './auth-abac';\r\n\r\n@Pipe({\r\n name: 'canAction',\r\n pure: true,\r\n standalone: true,\r\n})\r\nexport class CanActionPipe implements PipeTransform {\r\n constructor(private permissionService: PermissionService) {}\r\n\r\n /**\r\n * @param data Dữ liệu của bản ghi hiện tại (VD: object todo)\r\n * @param resource Tên resource (VD: 'todos')\r\n * @param action Hành động (VD: 'update', 'delete')\r\n */\r\n transform<TResource extends keyof ResourceMap>(\r\n data: ResourceMap[TResource] | undefined | null,\r\n resource: TResource,\r\n action: 'read' | 'create' | 'update' | 'delete',\r\n ): boolean {\r\n if (data === null) return false;\r\n\r\n // Chuyển việc thẩm định cho PermissionService xử lý\r\n return this.permissionService.hasAccess(resource, action, data);\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { PermissionService } from './permission.service';\r\nimport { ResourceMap } from './auth-abac';\r\n\r\n@Pipe({\r\n name: 'hasPermission',\r\n pure: true,\r\n standalone: true,\r\n})\r\nexport class HasPermissionPipe implements PipeTransform {\r\n constructor(private permissionService: PermissionService) {}\r\n\r\n // Lấy giá trị bên trái là Resource, tham số bên phải là Action\r\n transform<TResource extends keyof ResourceMap>(\r\n resource: TResource,\r\n action: 'read' | 'create' | 'update' | 'delete' | string,\r\n ): boolean {\r\n return this.permissionService.hasAccess(resource, action);\r\n }\r\n}\r\n","import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';\r\nimport { PermissionService } from './permission.service';\r\nimport { ResourceMap } from './auth-abac';\r\n\r\n@Directive({\r\n selector: '[hasPermission]',\r\n standalone: true,\r\n})\r\nexport class HasPermissionDirective {\r\n constructor(\r\n private templateRef: TemplateRef<any>,\r\n private viewContainer: ViewContainerRef,\r\n private permissionService: PermissionService,\r\n ) {}\r\n\r\n // Nhận vào một mảng chứa [resource, action]\r\n @Input('hasPermission') set checkPermission(params: [keyof ResourceMap, string]) {\r\n const [resource, action] = params;\r\n\r\n // Gọi hàm kiểm tra quyền\r\n const hasAccess = this.permissionService.hasAccess(resource, action as any);\r\n\r\n if (hasAccess) {\r\n // Nếu có quyền -> Hiển thị DOM\r\n this.viewContainer.createEmbeddedView(this.templateRef);\r\n } else {\r\n // Nếu không có quyền -> Xóa DOM\r\n this.viewContainer.clear();\r\n }\r\n }\r\n}\r\n","import { Directive, ElementRef, HostListener, Optional } from '@angular/core';\r\nimport { NgControl } from '@angular/forms';\r\n\r\n@Directive({\r\n selector: 'input',\r\n})\r\nexport class NullIfEmptyDirective {\r\n constructor(\r\n private el: ElementRef,\r\n @Optional() private ngControl: NgControl,\r\n ) {}\r\n\r\n @HostListener('input')\r\n onInput() {\r\n // const value = this.el.nativeElement.value;\r\n // const newValue = value.trim() === '' ? null : value;\r\n // this.ngControl?.control?.setValue(newValue, { emitEvent: false });\r\n }\r\n}\r\n","import { Directive, ElementRef, forwardRef, HostListener, Renderer2, AfterViewInit } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Directive({\r\n selector: '[numberOnly]',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => NumberOnlyDirective),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class NumberOnlyDirective implements ControlValueAccessor, AfterViewInit {\r\n private inputEl!: HTMLInputElement;\r\n\r\n onChange = (_: any) => {};\r\n onTouched = () => {};\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2,\r\n ) {}\r\n\r\n ngAfterViewInit() {\r\n const native = this.el.nativeElement;\r\n\r\n // nếu gắn trực tiếp vào input\r\n if (native.tagName === 'INPUT') {\r\n this.inputEl = native;\r\n } else {\r\n // nếu gắn vào cha → tìm input con đầu tiên\r\n this.inputEl = native.querySelector('input');\r\n }\r\n }\r\n\r\n @HostListener('input', ['$event.target'])\r\n onInput(target: any) {\r\n if (!this.inputEl || target !== this.inputEl) return;\r\n\r\n const formattedValue = this.formatValue(this.inputEl.value);\r\n this.renderer.setProperty(this.inputEl, 'value', formattedValue);\r\n this.onChange(formattedValue);\r\n }\r\n\r\n writeValue(value: any): void {\r\n if (!this.inputEl) return;\r\n\r\n const formattedValue = value ? this.formatValue(value) : '';\r\n this.renderer.setProperty(this.inputEl, 'value', formattedValue);\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n if (this.inputEl) {\r\n this.renderer.setProperty(this.inputEl, 'disabled', isDisabled);\r\n }\r\n }\r\n\r\n private formatValue(value: string): string {\r\n return value.replace(/\\D/g, '');\r\n }\r\n}\r\n","import { Directive, forwardRef, ElementRef, Renderer2 } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\r\n\r\n@Directive({\r\n selector: '[uppercaseFirstLetterEachWord]',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UpperCaseFirsLetterEachWordDirective),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class UpperCaseFirsLetterEachWordDirective implements ControlValueAccessor {\r\n private inputElement: HTMLInputElement | null = null;\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2,\r\n ) {}\r\n\r\n ngAfterViewInit() {\r\n setTimeout(() => {\r\n // Nếu gắn vào <input>, thì chính nó là input\r\n if (this.el.nativeElement.tagName.toLowerCase() === 'input') {\r\n this.inputElement = this.el.nativeElement;\r\n } else {\r\n // Nếu không, tìm input con bên trong\r\n this.inputElement = this.el.nativeElement.querySelector('input');\r\n }\r\n\r\n if (this.inputElement) {\r\n this.renderer.listen(this.inputElement, 'input', (event: any) => {\r\n const formatted = this.formatValue(event.target.value);\r\n this.renderer.setProperty(this.inputElement, 'value', formatted);\r\n this.onChange(formatted);\r\n });\r\n }\r\n\r\n if (this.pendingValue !== null) {\r\n this.renderer.setProperty(this.inputElement, 'value', this.pendingValue);\r\n this.pendingValue = null;\r\n }\r\n }, 0);\r\n }\r\n\r\n private pendingValue: any = null;\r\n\r\n writeValue(value: any): void {\r\n const formattedValue = value ? this.formatValue(value) : '';\r\n if (this.inputElement) {\r\n this.renderer.setProperty(this.inputElement, 'value', formattedValue);\r\n } else {\r\n this.pendingValue = formattedValue;\r\n }\r\n }\r\n\r\n onChange = (_: any) => {};\r\n onTouched = () => {};\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n if (this.inputElement) {\r\n this.renderer.setProperty(this.inputElement, 'disabled', isDisabled);\r\n }\r\n }\r\n\r\n private formatValue(value: string): string {\r\n return value\r\n .split(' ')\r\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\r\n .join(' ');\r\n }\r\n}\r\n","import { Directive, ElementRef, forwardRef, HostListener, Renderer2 } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Directive({\r\n selector: '[uppercaseFirstLetter]',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UppercaseFirstLetterDirective),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class UppercaseFirstLetterDirective {\r\n constructor(\r\n private el: ElementRef<HTMLElement>,\r\n private renderer: Renderer2,\r\n ) {}\r\n\r\n @HostListener('input', ['$event'])\r\n onInput(event: Event) {\r\n const target = event.target;\r\n\r\n if (!(target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement)) {\r\n return;\r\n }\r\n\r\n const formatted = this.formatValue(target.value);\r\n\r\n if (formatted !== target.value) {\r\n this.renderer.setProperty(target, 'value', formatted);\r\n }\r\n }\r\n\r\n private formatValue(value: string): string {\r\n if (!value) return value;\r\n\r\n return value.charAt(0).toUpperCase() + value.slice(1);\r\n }\r\n}\r\n","import { Directive, ElementRef, forwardRef, HostListener, Renderer2 } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\ntype TextControl = HTMLInputElement | HTMLTextAreaElement;\r\n\r\n@Directive({\r\n selector: '[uppercase]',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UppercaseDirective),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class UppercaseDirective implements ControlValueAccessor {\r\n onChange = (_: any) => {};\r\n onTouched = () => {};\r\n\r\n constructor(\r\n private el: ElementRef<TextControl>,\r\n private renderer: Renderer2,\r\n ) {}\r\n\r\n // ✅ strict safe\r\n @HostListener('input', ['$event'])\r\n onInput(event: Event) {\r\n const control = event.target as TextControl;\r\n\r\n const formatted = this.formatValue(control.value);\r\n\r\n // ✅ tránh update thừa\r\n if (formatted !== control.value) {\r\n this.renderer.setProperty(control, 'value', formatted);\r\n }\r\n\r\n this.onChange(formatted);\r\n }\r\n\r\n @HostListener('blur')\r\n onBlur() {\r\n this.onTouched();\r\n }\r\n\r\n writeValue(value: any): void {\r\n const formatted = value ? this.formatValue(value) : '';\r\n this.renderer.setProperty(this.el.nativeElement, 'value', formatted);\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.renderer.setProperty(this.el.nativeElement, 'disabled', isDisabled);\r\n }\r\n\r\n private formatValue(value: string): string {\r\n return value ? value.toUpperCase() : value;\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'limitWords',\r\n})\r\nexport class LimitWordsPipe implements PipeTransform {\r\n transform(value: string, limit: number = 3): string {\r\n if (!value) return '';\r\n const words = value.split(' ');\r\n return words.length <= limit ? value : words.slice(0, limit).join(' ') + '...';\r\n }\r\n}\r\n","export class DownloadHelper {\r\n public static downloadFileBlop(response: any) {\r\n const contentDisposition = response.headers.get('Content-Disposition');\r\n let filename = 'downloaded-file';\r\n\r\n if (contentDisposition) {\r\n const filenameStarMatch = contentDisposition.match(/filename\\*\\=UTF-8''(.+?)(;|$)/);\r\n const filenameMatch = contentDisposition.match(/filename=\"?([^\"]+)\"?/);\r\n\r\n if (filenameStarMatch?.[1]) {\r\n filename = decodeURIComponent(filenameStarMatch[1]);\r\n } else if (filenameMatch?.[1]) {\r\n filename = filenameMatch[1];\r\n }\r\n }\r\n\r\n const blob = new Blob([response.body!], { type: 'application/octet-stream' });\r\n\r\n if (blob.size <= 4) {\r\n console.log(blob.size);\r\n\r\n alert('Không có dữ liệu file');\r\n return;\r\n }\r\n\r\n const link = document.createElement('a');\r\n link.href = window.URL.createObjectURL(blob);\r\n link.download = filename;\r\n link.click();\r\n }\r\n\r\n public static downloadFile(data: any, filename: string) {\r\n const contentType = 'application/octet-stream';\r\n const blob = new Blob([data], { type: contentType });\r\n\r\n if (blob.size <= 4) {\r\n console.log(blob.size);\r\n alert('Không có dữ liệu file');\r\n return;\r\n }\r\n\r\n const link = document.createElement('a');\r\n link.href = window.URL.createObjectURL(blob);\r\n link.download = filename;\r\n link.click();\r\n }\r\n\r\n public static downloadFileBase64(base64Data: string, fileName: string) {\r\n // Chuyển đổi Base64 thành dữ liệu nhị phân\r\n const binaryString = window.atob(base64Data);\r\n const binaryLen = binaryString.length;\r\n const bytes = new Uint8Array(binaryLen);\r\n\r\n for (let i = 0; i < binaryLen; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n\r\n // Tạo một Blob từ dữ liệu nhị phân\r\n const blob = new Blob([bytes], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' });\r\n\r\n if (blob.size <= 4) {\r\n console.log(blob.size);\r\n alert('Không có dữ liệu file');\r\n return;\r\n }\r\n\r\n // Tạo một liên kết tạm thời để tải tệp về\r\n const link = document.createElement('a');\r\n link.href = window.URL.createObjectURL(blob);\r\n link.download = fileName;\r\n\r\n // Kích hoạt việc tải tệp\r\n document.body.appendChild(link);\r\n link.click();\r\n\r\n // Xóa liên kết sau khi tải\r\n document.body.removeChild(link);\r\n }\r\n}\r\n","import * as XLSX from 'xlsx';\r\n\r\nexport class XLSXHelper {\r\n public static readExcelFileToObjects(file: File, columnCount?: number, readAllSheets?: boolean): Promise<any> {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n\r\n reader.onload = (e: ProgressEvent<FileReader>) => {\r\n const data = new Uint8Array(e.target?.result as ArrayBuffer);\r\n const workbook = XLSX.read(data, { type: 'array' });\r\n\r\n const sheetNames = workbook.SheetNames;\r\n\r\n // Trả về nhiều sheet\r\n if (readAllSheets) {\r\n const sheetsdata: Record<string, any[]> = {};\r\n\r\n for (const sheetName of sheetNames) {\r\n const worksheet = workbook.Sheets[sheetName];\r\n const rawData: any[][] = XLSX.utils.sheet_to_json(worksheet, {\r\n header: 1,\r\n defval: '',\r\n });\r\n\r\n let rows = rawData.slice(1);\r\n\r\n while (rows.length > 0 && rows[rows.length - 1].every((cell) => cell === '' || cell == null)) {\r\n rows.pop();\r\n }\r\n\r\n const result = rows.map((row, index) => {\r\n const obj: any = {};\r\n const limit = columnCount ?? row.length;\r\n for (let i = 0; i < limit; i++) {\r\n obj[`col${i + 1}`] = row[i] ?? '';\r\n }\r\n obj.rowIndex = index + 2;\r\n return obj;\r\n });\r\n\r\n sheetsdata[sheetName] = result;\r\n }\r\n\r\n postMessage({\r\n sheets: sheetNames,\r\n sheetsdata,\r\n });\r\n\r\n resolve({\r\n sheets: sheetNames,\r\n sheetsdata,\r\n });\r\n }\r\n\r\n // Trả về sheet đầu tiên\r\n else {\r\n const sheetName = sheetNames[0];\r\n const worksheet = workbook.Sheets[sheetName];\r\n const rawData: any[][] = XLSX.utils.sheet_to_json(worksheet, {\r\n header: 1,\r\n defval: '',\r\n });\r\n\r\n let rows = rawData.slice(1);\r\n\r\n while (rows.length > 0 && rows[rows.length - 1].every((cell) => cell === '' || cell == null)) {\r\n rows.pop();\r\n }\r\n\r\n const result = rows.map((row, index) => {\r\n const obj: any = {};\r\n const limit = columnCount ?? row.length;\r\n for (let i = 0; i < limit; i++) {\r\n obj[`col${i + 1}`] = row[i] ?? '';\r\n }\r\n obj.rowIndex = index + 2;\r\n return obj;\r\n });\r\n\r\n resolve(result);\r\n }\r\n };\r\n\r\n reader.onerror = (error) => reject(error);\r\n reader.readAsArrayBuffer(file);\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router, NavigationEnd } from '@angular/router';\r\nimport { AuthService } from '../auth/auth.service';\r\nimport { NotiService } from './noti.service';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class RouteMonitorService {\r\n constructor(\r\n private router: Router,\r\n private authService: AuthService,\r\n private notiService: NotiService,\r\n ) {\r\n this.router.events.subscribe(async (event) => {\r\n if (event instanceof NavigationEnd) {\r\n const url = event.urlAfterRedirects;\r\n\r\n if (url == '/' || url.startsWith('/login') || url == '/no-permission') {\r\n return;\r\n }\r\n\r\n const hasMenu = await this.authService.checkUserMenu(url);\r\n if (!hasMenu) {\r\n this.notiService.error(`Không có quyền truy cập: ${url}`);\r\n this.router.navigate(['/no-permission'], {\r\n state: {\r\n deniedUrl: url,\r\n message: `Bạn không có quyền truy cập vào đường dẫn ${url}`,\r\n },\r\n });\r\n }\r\n }\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ThemeService {\r\n setHighContrast(enabled: boolean) {\r\n document.body.classList.toggle('high-contrast', enabled);\r\n localStorage.setItem('high-contrast', enabled ? '1' : '0');\r\n }\r\n\r\n isHighContrast(): boolean {\r\n return localStorage.getItem('high-contrast') == '1';\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { NzModalService } from 'ng-zorro-antd/modal';\r\nimport { HTTPService } from './api-service/http.service';\r\nimport { NotiService } from './noti.service';\r\nimport { AppGlobals } from '../app-global';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class VscService extends HTTPService {\r\n public static feClientVersion = '{{POST_BUILD_ENTERS_VERSION_HERE}}';\r\n public static feServerVersion: string;\r\n public static beVersion: {};\r\n public static dbVersion: string;\r\n public static jsReportTemplateVersion: string;\r\n\r\n private modal = inject(NzModalService);\r\n private notiService = inject(NotiService);\r\n private interval: any;\r\n private isShowingPopup = false;\r\n\r\n // 10 phút\r\n public initVersionCheck(frequency = 1000 * 60 * 10) {\r\n this.interval = setInterval(() => {\r\n if (!this.isShowingPopup) {\r\n this.checkVersion();\r\n }\r\n }, frequency);\r\n this.checkVersion();\r\n }\r\n\r\n public checkVersion(all = false) {\r\n this.checkFrontendVersion();\r\n if (all) {\r\n this.checkBackendVersion();\r\n }\r\n }\r\n\r\n public checkFrontendVersion() {\r\n if (this.isShowingPopup) {\r\n return;\r\n }\r\n\r\n console.log('current version: ', VscService.feClientVersion);\r\n this.get(AppGlobals.versionCheck + '?t=' + new Date().getTime(), true).then(\r\n async (response: any) => {\r\n VscService.feServerVersion = response.version;\r\n console.log('version check: ', VscService.feServerVersion);\r\n const hashChanged = this.hasVersionChanged(VscService.feClientVersion, VscService.feServerVersion);\r\n if (hashChanged) {\r\n this.isShowingPopup = true;\r\n const modalRef = this.modal.warning({\r\n nzTitle: 'Có phiên bản mới',\r\n nzContent: 'Vui lòng ấn \"Ctrl + F5\" để cập nhật',\r\n });\r\n }\r\n },\r\n (err) => {\r\n console.error(err, 'Could not get version');\r\n },\r\n );\r\n }\r\n\r\n private hasVersionChanged(currentVersion: string, newVersion: string) {\r\n if (!currentVersion || newVersion === currentVersion) {\r\n return false;\r\n }\r\n return currentVersion !== newVersion;\r\n }\r\n\r\n public clearInterval() {\r\n if (this.interval) {\r\n clearInterval(this.interval);\r\n }\r\n }\r\n\r\n private checkBackendVersion() {\r\n this.get(AppGlobals.apiEndpoint + '/version', true).then(\r\n (res) => {\r\n VscService.beVersion = res;\r\n },\r\n (err) => {\r\n console.error(err, 'Could not get backend version');\r\n VscService.beVersion = 'Could not get backend version';\r\n },\r\n );\r\n }\r\n}\r\n","import { Directive, HostListener } from '@angular/core';\r\n\r\n@Directive({\r\n selector: 'img[hideIfError]',\r\n})\r\nexport class HideIfErrorDirective {\r\n @HostListener('error', ['$event'])\r\n onError(e: any) {\r\n e.target.remove(); // xóa luôn khỏi DOM\r\n }\r\n}\r\n","import { trigger, transition, style, animate } from '@angular/animations';\r\n\r\nexport const fadeInOut = trigger('fadeInOut', [\r\n transition(':enter', [\r\n style({ opacity: 0, transform: 'translateY(-5px)' }),\r\n animate('150ms ease-out', style({ opacity: 1, transform: 'translateY(0)' })),\r\n ]),\r\n transition(':leave', [animate('150ms ease-in', style({ opacity: 0, transform: 'translateY(-5px)' }))]),\r\n]);\r\n\r\nexport const fadeSlide = trigger('fadeSlide', [\r\n transition(':enter', [\r\n style({\r\n height: 0,\r\n opacity: 0,\r\n overflow: 'hidden',\r\n transform: 'translateY(-5px)',\r\n }),\r\n animate(\r\n '250ms ease-out',\r\n style({\r\n height: '*',\r\n opacity: 1,\r\n transform: 'translateY(0)',\r\n }),\r\n ),\r\n ]),\r\n\r\n transition(':leave', [\r\n style({\r\n height: '*',\r\n opacity: 1,\r\n overflow: 'hidden',\r\n transform: 'translateY(0)',\r\n }),\r\n animate(\r\n '200ms ease-in',\r\n style({\r\n height: 0,\r\n opacity: 0,\r\n transform: 'translateY(-5px)',\r\n }),\r\n ),\r\n ]),\r\n]);\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { HttpParams } from '@angular/common/http';\r\nimport { HTTPService } from './api-service/http.service';\r\nimport { CommonService } from './api-service/common.service';\r\nimport { RespondData } from '../model';\r\nimport { AppGlobals } from '../app-global';\r\n\r\nexport const URLs = {\r\n getById: '/api/App_Setting/GetById',\r\n getAll: '/api/App_Setting/GetAll',\r\n getList: '/api/App_Setting/GetList',\r\n getPaging: '/api/App_Setting/GetPaging',\r\n addOrEdit: '/api/App_Setting/AddOrEdit',\r\n delete: '/api/App_Setting/Delete',\r\n getByCodeAnonymous: '/api/public/GetSettingByCode',\r\n GetAllConfig: '/api/App_Setting/GetAllConfig',\r\n ApplyConfig: '/api/Setting/ApplyConfig',\r\n GetDbInfo: '/api/App_Setting/GetDbInfo',\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SettingService extends HTTPService {\r\n commonService = inject(CommonService);\r\n\r\n getById(id: any): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Setting_getById',\r\n Params: [id],\r\n });\r\n }\r\n\r\n getAll(): Promise<RespondData> {\r\n return this.post(AppGlobals.apiEndpoint + URLs.getAll);\r\n }\r\n\r\n getList(filter: any): Promise<RespondData> {\r\n return this.postData(AppGlobals.apiEndpoint + URLs.getList, filter);\r\n }\r\n\r\n getPaging(filter: any): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Setting_getPaging',\r\n Params: [filter],\r\n });\r\n }\r\n\r\n addOrEdit(obj: any): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Setting_addOrEdit',\r\n Params: [obj],\r\n });\r\n }\r\n\r\n delete(id: any): Promise<RespondData> {\r\n const params = new HttpParams().append('id', id);\r\n return this.postParams(AppGlobals.apiEndpoint + URLs.delete, params);\r\n }\r\n\r\n getByCodeAnonymous(code: string) {\r\n const params = new HttpParams().append('Code', code);\r\n return this.getParams(AppGlobals.apiEndpoint + URLs.getByCodeAnonymous, params);\r\n }\r\n\r\n // getGroupByCodeAnonymous(code: string) {\r\n // const params = new HttpParams().append('Code', code);\r\n // return this.getParams(AppGlobals.apiEndpoint + URLs.getByCodeAnonymous, params);\r\n // }\r\n\r\n getAllConfig() {\r\n return this.post(AppGlobals.apiEndpoint + URLs.GetAllConfig);\r\n }\r\n\r\n applyConfig(config: any) {\r\n return this.postData(AppGlobals.apiEndpoint + URLs.ApplyConfig, config);\r\n }\r\n\r\n getDbInfo() {\r\n return this.post(AppGlobals.apiEndpoint + URLs.GetDbInfo);\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, inject, OnInit } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { NzBackTopModule } from 'ng-zorro-antd/back-top';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzDrawerModule } from 'ng-zorro-antd/drawer';\r\nimport { NzDropDownModule } from 'ng-zorro-antd/dropdown';\r\nimport { NzFlexModule } from 'ng-zorro-antd/flex';\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzLayoutModule } from 'ng-zorro-antd/layout';\r\nimport { NzSegmentedModule } from 'ng-zorro-antd/segmented';\r\nimport { NzTreeModule } from 'ng-zorro-antd/tree';\r\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\r\nimport { NzBadgeModule } from 'ng-zorro-antd/badge';\r\n\r\nimport { fadeInOut } from '../../fade-animations';\r\nimport { BaseComponent } from '../../base.component';\r\nimport { AuthService } from '../../../auth/auth.service';\r\nimport { SessionManagerService } from '../../../auth/session-manager.service';\r\nimport { CommonService } from '../../../services/api-service/common.service';\r\nimport { TokenStorage } from '../../../auth/token.storage';\r\nimport { App_Org } from '../../../model';\r\nimport { SettingService } from '../../../services/setting.service';\r\n\r\n@Component({\r\n selector: 'layout-user',\r\n templateUrl: './layout-user.html',\r\n imports: [\r\n CommonModule,\r\n TranslateModule,\r\n NzLayoutModule,\r\n NzIconModule,\r\n NzDropDownModule,\r\n NzGridModule,\r\n NzFlexModule,\r\n NzButtonModule,\r\n NzTreeModule,\r\n NzBackTopModule,\r\n NzDrawerModule,\r\n FormsModule,\r\n NzInputModule,\r\n NzTreeModule,\r\n NzSegmentedModule,\r\n NzBadgeModule,\r\n ],\r\n animations: [fadeInOut],\r\n})\r\nexport class LayoutUser extends BaseComponent implements OnInit {\r\n cms = inject(CommonService);\r\n authService = inject(AuthService);\r\n sessionManager = inject(SessionManagerService);\r\n breakpointObserver = inject(BreakpointObserver);\r\n settingService = inject(SettingService);\r\n\r\n TokenStorage = TokenStorage;\r\n\r\n isXSmall = false;\r\n\r\n lstOrg: App_Org[] = [];\r\n isOneUserMultiOrgs = false;\r\n\r\n ngOnInit(): void {\r\n this.breakpointObserver.observe([Breakpoints.XSmall, Breakpoints.Small]).subscribe((result) => {\r\n this.isXSmall = result.matches;\r\n });\r\n\r\n this.settingService.getByCodeAnonymous('ONE_USER_MULTI_ORGS').then(\r\n (res) => {\r\n if (res?.Data) {\r\n if (res.Data == '1') {\r\n this.isOneUserMultiOrgs = true;\r\n this.getLstOrg();\r\n }\r\n }\r\n },\r\n (err) => this.handleError(err),\r\n );\r\n }\r\n\r\n getLstOrg() {\r\n this.cms\r\n .ESP({\r\n SPN: 'App_User_getLstOrg',\r\n })\r\n .then(\r\n (res) => (this.lstOrg = res.Data),\r\n (err) => this.handleError(err),\r\n );\r\n }\r\n\r\n async changeOrg(org: App_Org) {\r\n if (await this.confirm(`Chuyển sang đơn vị: ${org.Name}`)) {\r\n this.authService.changeOrg(org).then(\r\n async (res) => {\r\n if (res) {\r\n await this.notiService.success(`Đã chuyển sang đơn vị: ${org.Name}`, '', true);\r\n window.location.reload();\r\n }\r\n },\r\n (err) => this.handleError(err),\r\n );\r\n }\r\n }\r\n\r\n gotoSetting() {\r\n this.goto('/admin/user_profile');\r\n }\r\n\r\n logout() {\r\n this.sessionManager.logout();\r\n }\r\n}\r\n","<nz-badge [nzSize]=\"'small'\" [nzCount]=\"0\">\r\n <button nz-button nzType=\"text\" nzSize=\"small\">\r\n <nz-icon nzType=\"bell\" nzTheme=\"outline\" style=\"color: #ffffff\" />\r\n </button>\r\n</nz-badge>\r\n\r\n<button\r\n *ngIf=\"!isXSmall && TokenStorage.getOrgName()\"\r\n [@fadeInOut]\r\n nz-button\r\n nzType=\"text\"\r\n nz-dropdown\r\n [nzDropdownMenu]=\"isOneUserMultiOrgs ? menuOrg : null\"\r\n [nzTrigger]=\"'click'\"\r\n style=\"height: var(--app-header-height); color: #ffffff\"\r\n>\r\n <nz-icon nzType=\"cluster\" nzTheme=\"outline\" />\r\n {{ TokenStorage.getOrgName() }}\r\n</button>\r\n\r\n<nz-dropdown-menu #menuOrg=\"nzDropdownMenu\">\r\n <ul nz-menu>\r\n @for (org of lstOrg; track $index) {\r\n <li *ngIf=\"$index > 0\" nz-menu-divider></li>\r\n <li nz-menu-item (click)=\"changeOrg(org)\">\r\n <nz-icon nzType=\"swap\" nzTheme=\"outline\" />&nbsp;&nbsp; {{ org.Name }}\r\n </li>\r\n }\r\n </ul>\r\n</nz-dropdown-menu>\r\n\r\n<button\r\n nz-button\r\n nzType=\"text\"\r\n nz-dropdown\r\n [nzDropdownMenu]=\"menuUser\"\r\n [nzTrigger]=\"'click'\"\r\n style=\"height: var(--app-header-height); color: #ffffff\"\r\n>\r\n <nz-icon nzType=\"user\" nzTheme=\"outline\" />\r\n {{ TokenStorage.getUserFullname() }}\r\n</button>\r\n\r\n<nz-dropdown-menu #menuUser=\"nzDropdownMenu\">\r\n <ul nz-menu>\r\n <li *ngIf=\"!(!isXSmall && TokenStorage.getOrgName())\" nz-menu-item>\r\n <nz-icon nzType=\"cluster\" nzTheme=\"outline\" />&nbsp;&nbsp; {{ TokenStorage.getOrgName() }}\r\n </li>\r\n <li *ngIf=\"!(!isXSmall && TokenStorage.getOrgName())\" nz-menu-divider></li>\r\n <li nz-menu-item (click)=\"gotoSetting()\">\r\n <nz-icon nzType=\"setting\" nzTheme=\"outline\" />&nbsp;&nbsp; {{ TranslateKey.SETTING | translate }}\r\n </li>\r\n <li nz-menu-divider></li>\r\n <li nz-menu-item (click)=\"logout()\">\r\n <nz-icon nzType=\"logout\" nzTheme=\"outline\" />&nbsp;&nbsp; {{ TranslateKey.LOGOUT | translate }}\r\n </li>\r\n </ul>\r\n</nz-dropdown-menu>\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { HttpParams } from '@angular/common/http';\r\nimport { firstValueFrom, Observable } from 'rxjs';\r\nimport { HTTPService } from './api-service/http.service';\r\nimport { CommonService, ENUM_ResponseType } from './api-service/common.service';\r\nimport { RespondData } from '../model';\r\nimport { AppGlobals } from '../app-global';\r\n\r\nexport const URLs = {\r\n getById: '/api/file/GetById',\r\n getAll: '/api/file/GetAll',\r\n getList: '/api/file/GetList',\r\n getPaging: '/api/file/GetPaging',\r\n addOrEdit: '/api/file/AddOrEdit',\r\n delete: '/api/file/Delete',\r\n addFileWithRef: '/api/file/addFileWithRef',\r\n moveFileToDisk: '/api/file/MoveFileToDisk',\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class FileService extends HTTPService {\r\n cms = inject(CommonService);\r\n\r\n getById(id: any): Promise<RespondData> {\r\n return this.cms.ESP({\r\n SPN: 'App_File_getByIdJson',\r\n Params: [id],\r\n });\r\n }\r\n\r\n getAll(): Promise<RespondData> {\r\n return this.post(AppGlobals.apiEndpoint + URLs.getAll);\r\n }\r\n\r\n getList(filter: any): Promise<RespondData> {\r\n return this.postData(AppGlobals.apiEndpoint + URLs.getList, filter);\r\n }\r\n\r\n getPaging(filter: any): Promise<RespondData> {\r\n return this.cms.ESP({\r\n SPN: 'App_File_getpaging',\r\n Params: [filter],\r\n });\r\n }\r\n\r\n addOrEdit(obj: any): Promise<RespondData> {\r\n return this.postData(AppGlobals.apiEndpoint + URLs.addOrEdit, obj);\r\n }\r\n\r\n delete(id: any): Promise<RespondData> {\r\n const params = new HttpParams().append('id', id);\r\n return this.postParams(AppGlobals.apiEndpoint + URLs.delete, params);\r\n }\r\n\r\n downloadFile(id: string) {\r\n const params = new HttpParams().append('id', id);\r\n return firstValueFrom(\r\n this.httpClient.post(\r\n `${AppGlobals.apiEndpoint}/api/file/downloadFile`,\r\n {},\r\n { responseType: ENUM_ResponseType.ARRAYBUFFER, params: params },\r\n ),\r\n );\r\n }\r\n\r\n downloadFileByCode(Code: string) {\r\n const params = new HttpParams().append('Code', Code);\r\n return firstValueFrom(\r\n this.httpClient.post(\r\n `${AppGlobals.apiEndpoint}/api/file/downloadFileByCode`,\r\n {},\r\n { responseType: ENUM_ResponseType.BLOB, observe: 'response', params: params },\r\n ),\r\n );\r\n }\r\n\r\n downloadFileBase64(id: string) {\r\n const params = new HttpParams().append('id', id);\r\n return this.postParams(`${AppGlobals.apiEndpoint}/api/file/DownloadFileBase64`, params);\r\n }\r\n\r\n downloadFileBase64ByCode(Code: string) {\r\n const params = new HttpParams().append('Code', Code);\r\n return this.postParams(`${AppGlobals.apiEndpoint}/api/file/DownloadFileBase64ByCode`, params);\r\n }\r\n\r\n getFileVersion(code: string): Observable<RespondData> {\r\n return this.httpClient.get(\r\n AppGlobals.apiEndpoint + '/api/file/fileversion?code=' + code,\r\n ) as Observable<RespondData>;\r\n }\r\n\r\n getFile(id: string): Observable<Blob> {\r\n return this.httpClient.get(AppGlobals.apiEndpoint + '/api/file/image?id=' + id, {\r\n responseType: ENUM_ResponseType.BLOB,\r\n });\r\n }\r\n\r\n getImage(id: string): Observable<Blob> {\r\n return this.httpClient.get(AppGlobals.apiEndpoint + '/api/file/image?id=' + id, {\r\n responseType: ENUM_ResponseType.BLOB,\r\n });\r\n }\r\n\r\n getAudio(id: string): Observable<Blob> {\r\n return this.httpClient.get(AppGlobals.apiEndpoint + '/api/file/get-audio?id=' + id, {\r\n responseType: ENUM_ResponseType.BLOB,\r\n });\r\n }\r\n\r\n getVideo(id: string): Observable<Blob> {\r\n return this.httpClient.get(AppGlobals.apiEndpoint + '/api/file/get-video?id=' + id, {\r\n responseType: ENUM_ResponseType.BLOB,\r\n });\r\n }\r\n\r\n addFileWithRef(obj: any) {\r\n return this.postData(AppGlobals.apiEndpoint + URLs.addFileWithRef, obj);\r\n }\r\n\r\n getAnhWithRef(Ref_Table: string, Ref_Id: string): Promise<RespondData> {\r\n return this.cms.ESP({\r\n SPN: 'App_File_getAnhWithRef',\r\n Params: [Ref_Table, Ref_Id],\r\n });\r\n }\r\n\r\n moveFileToDisk(obj: any) {\r\n return this.postData(AppGlobals.apiEndpoint + URLs.moveFileToDisk, obj);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport * as signalR from '@microsoft/signalr';\r\nimport { TokenStorage } from '../auth/token.storage';\r\nimport { AppGlobals } from '../app-global';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SignalRService {\r\n public static connection: signalR.HubConnection;\r\n\r\n public static sendRequestLoginStatus() {\r\n if (this.connection.state == signalR.HubConnectionState.Connected) {\r\n // console.log('Send RequestLoginStatus');\r\n this.connection\r\n .send('RequestLoginStatus')\r\n .then()\r\n .catch((err) => console.log(err));\r\n }\r\n }\r\n\r\n public static initNoti() {\r\n this.connection = SignalRService.getConnection();\r\n this.registerAction();\r\n }\r\n\r\n private static registerAction() {\r\n this.connection.on('BroadcastMessage', (msg: string) => {\r\n // console.log('SignalR on BroadcastMessage: ' + msg);\r\n });\r\n\r\n this.connection.on('RequestLoginStatus', (ConnectionId: string) => {\r\n // console.log('Received RequestLoginStatus ConnectionId: ' + ConnectionId);\r\n this.connection\r\n .send('ResponseLoginStatus', ConnectionId)\r\n .then()\r\n .catch((err) => console.log(err));\r\n });\r\n }\r\n\r\n public static getConnection() {\r\n const connection = new signalR.HubConnectionBuilder()\r\n .configureLogging(signalR.LogLevel.Error)\r\n .withUrl(AppGlobals.apiEndpoint + '/notify', { accessTokenFactory: () => TokenStorage.getToken() || '' })\r\n .withAutomaticReconnect()\r\n .build();\r\n\r\n connection.serverTimeoutInMilliseconds = 120 * 1000;\r\n\r\n connection\r\n .start()\r\n .then(() => {\r\n console.log('SignalR Connected! ConnectionId:', connection.connectionId);\r\n })\r\n .catch((err) => {\r\n return console.error(err.toString());\r\n });\r\n\r\n connection.onreconnecting((error) => {\r\n console.warn('SignalR Reconnecting...', error?.message);\r\n });\r\n\r\n connection.onreconnected((connectionId) => {\r\n console.log('SignalR Reconnected! New ConnectionId:', connectionId);\r\n });\r\n\r\n connection.onclose((err) => {\r\n console.log('SignalR Disconnected!');\r\n if (err) {\r\n console.error(err.toString());\r\n }\r\n });\r\n\r\n return connection;\r\n }\r\n\r\n public static disconnect() {\r\n if (this.connection) {\r\n this.connection.stop();\r\n }\r\n }\r\n}\r\n","import { Component, ElementRef, inject, OnDestroy, OnInit, ViewChild } from '@angular/core';\r\nimport { RouterLink, RouterOutlet } from '@angular/router';\r\nimport { NzLayoutModule } from 'ng-zorro-antd/layout';\r\nimport { Title } from '@angular/platform-browser';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzDropDownModule } from 'ng-zorro-antd/dropdown';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzFlexModule } from 'ng-zorro-antd/flex';\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\r\nimport { NzFormatEmitEvent, NzTreeModule, NzTreeNode } from 'ng-zorro-antd/tree';\r\nimport { NzBackTopModule } from 'ng-zorro-antd/back-top';\r\nimport { NzDrawerModule } from 'ng-zorro-antd/drawer';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzSegmentedModule } from 'ng-zorro-antd/segmented';\r\nimport { map, Subject, takeUntil } from 'rxjs';\r\nimport { Breadcrumb } from '../breadcrumb/breadcrumb';\r\nimport { GlobalSpinnerComponent } from '../spinner/spinner';\r\nimport { Box } from '../box';\r\nimport { LayoutUser } from './layout-user/layout-user';\r\nimport { IconDelete, IconSearch } from '../../icon';\r\nimport { HighlightPipe } from '../../pipe/highlight.pipe';\r\nimport { HideIfErrorDirective } from '../../directive/img-hide-if-error.directive';\r\nimport { BaseComponent } from '../base.component';\r\nimport { VscService } from '../../services/vsc.service';\r\nimport { AuthService } from '../../auth/auth.service';\r\nimport { SettingService } from '../../services/setting.service';\r\nimport { LoadingService } from '../../services/loading.service';\r\nimport { FileService } from '../../services/file.service';\r\nimport { TokenStorage } from '../../auth/token.storage';\r\nimport { fadeInOut } from '../fade-animations';\r\nimport { SignalRService } from '../../services/signalr.service';\r\nimport { DeviceService } from '../../services/device-service';\r\nimport { AppGlobals } from '../../app-global';\r\nimport { CustomNotiComponent } from '../custom-noti/custom-noti.component';\r\n\r\nclass App_Menu {\r\n // #region properties\r\n App_Menu_Id: string;\r\n App_Org_Id: string;\r\n IsActive: boolean;\r\n Name: string;\r\n TranslateKey: string;\r\n Url: string;\r\n Icon: string;\r\n OrderValue: number;\r\n ParentId: string;\r\n IsHidden: boolean;\r\n TreeNodeName: string;\r\n TreeNodeOrder: string;\r\n IsHeaderMenu: boolean;\r\n // #endregion properties\r\n\r\n Level: number;\r\n Open: boolean;\r\n SubMenu: App_Menu[] | undefined;\r\n ParentName: string;\r\n\r\n HasEditMenu: boolean; // for role menu ref\r\n AllSubHasEditMenu: boolean;\r\n SomeSubHasEditMenu: boolean;\r\n\r\n HasViewMenu: boolean; // for role menu ref\r\n AllSubHasViewMenu: boolean;\r\n SomeSubHasViewMenu: boolean;\r\n\r\n [key: string]: any;\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.App_Menu_Id = obj.App_Menu_Id || '';\r\n this.App_Org_Id = obj.App_Org_Id || '';\r\n this.IsActive = obj.IsActive || null;\r\n this.Name = obj.Name || '';\r\n this.TranslateKey = obj.TranslateKey || '';\r\n this.ParentId = obj.ParentId || '';\r\n this.Url = obj.Url || '';\r\n this.Icon = obj.Icon || '';\r\n this.OrderValue = obj.OrderValue || null;\r\n this.IsHidden = obj.IsHidden || false;\r\n this.TreeNodeOrder = obj.TreeNodeOrder || '';\r\n this.IsHeaderMenu = obj.IsHeaderMenu || false;\r\n\r\n this.TreeNodeName = obj.TreeNodeName;\r\n this.Level = obj.Level;\r\n this.Open = obj.Open;\r\n this.SubMenu = obj.SubMenu;\r\n this.ParentName = obj.ParentName;\r\n this.HasEditMenu = obj.HasEditMenu;\r\n this.AllSubHasEditMenu = obj.AllSubHasEditMenu;\r\n this.SomeSubHasEditMenu = obj.SomeSubHasEditMenu;\r\n this.HasViewMenu = obj.HasViewMenu;\r\n this.AllSubHasViewMenu = obj.AllSubHasViewMenu;\r\n this.SomeSubHasViewMenu = obj.SomeSubHasViewMenu;\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'layout',\r\n templateUrl: './layout.component.html',\r\n styleUrl: './layout.component.scss',\r\n imports: [\r\n CommonModule,\r\n RouterLink,\r\n RouterOutlet,\r\n TranslateModule,\r\n NzLayoutModule,\r\n NzIconModule,\r\n NzDropDownModule,\r\n NzGridModule,\r\n NzFlexModule,\r\n NzButtonModule,\r\n Breadcrumb,\r\n GlobalSpinnerComponent,\r\n NzTreeModule,\r\n NzBackTopModule,\r\n NzDrawerModule,\r\n FormsModule,\r\n NzInputModule,\r\n NzTreeModule,\r\n Box,\r\n NzSegmentedModule,\r\n LayoutUser,\r\n IconDelete,\r\n IconSearch,\r\n HighlightPipe,\r\n HideIfErrorDirective,\r\n CustomNotiComponent,\r\n ],\r\n animations: [fadeInOut],\r\n})\r\nexport class LayoutComponent extends BaseComponent implements OnInit, OnDestroy {\r\n vscService = inject(VscService);\r\n authService = inject(AuthService);\r\n settingService = inject(SettingService);\r\n titleService = inject(Title);\r\n loadingService = inject(LoadingService);\r\n fileService = inject(FileService);\r\n breakpointObserver = inject(BreakpointObserver);\r\n device = inject(DeviceService);\r\n\r\n TokenStorage = TokenStorage;\r\n\r\n MENU_TYPE = 0;\r\n HEADER_MENU_IN_USE = false;\r\n SYSTEM_NAME = '';\r\n SYSTEM_SUB_NAME_LEFT = '';\r\n SYSTEM_SUB_NAME_RIGHT = '';\r\n isCollapsed = false; // đóng mở menu, true là đóng\r\n isXSmall = false;\r\n\r\n nodes: NzTreeNode[] = [];\r\n selectedKeys: any[] = [];\r\n expandedKeys: any[] = [];\r\n\r\n lstMenu: App_Menu[] = [];\r\n // siderWidth = '256px'\r\n // siderWidth = '300px';\r\n get siderWidth(): string {\r\n // return this.isCollapsed ? '60px' : '300px';\r\n return this.isCollapsed ? '60px' : localStorage.getItem('side-width') || '300px';\r\n }\r\n\r\n get siderWidthStorage(): string {\r\n return localStorage.getItem('side-width') || '300px';\r\n }\r\n\r\n visibleMenuDrawer = false;\r\n\r\n searchValue = '';\r\n\r\n lstHeaderMenu: App_Menu[] = [];\r\n lstHeaderMenuDisplay: string[] = [];\r\n selectedHeaderMenuDisplay?: string;\r\n\r\n logoUrl$ = this.fileService\r\n .getFileVersion('LOGO')\r\n .pipe(map((res) => `${AppGlobals.apiEndpoint}/api/file/image?code=LOGO&v=${res || ''}`));\r\n\r\n private destroy$ = new Subject<void>();\r\n\r\n async ngOnInit(): Promise<void> {\r\n this.vscService.initVersionCheck();\r\n SignalRService.initNoti();\r\n\r\n this.authService.getUserHeaderMenu().then((res) => {\r\n this.lstHeaderMenu = res.Data || [];\r\n this.lstHeaderMenuDisplay = this.lstHeaderMenu.map(\r\n (x) =>\r\n `${x.TreeNodeOrder.split('.')\r\n .map((y) => +y)\r\n .join('.')}. ${x.Name}`,\r\n );\r\n\r\n this.selectedHeaderMenuDisplay = sessionStorage.getItem('HEADER_MENU_selected') || '';\r\n });\r\n\r\n await this.settingService.getByCodeAnonymous('MENU_TYPE').then((res) => {\r\n if (res?.Data) {\r\n this.MENU_TYPE = res.Data;\r\n }\r\n });\r\n\r\n this.getUserMenu(sessionStorage.getItem('HEADER_MENU_ID_selected') || '');\r\n\r\n this.settingService.getByCodeAnonymous('SYSTEM_NAME').then((res) => {\r\n if (res?.Data) {\r\n this.SYSTEM_NAME = res.Data;\r\n this.titleService.setTitle(this.SYSTEM_NAME);\r\n }\r\n });\r\n\r\n this.settingService.getByCodeAnonymous('SYSTEM_SUB_NAME_LEFT').then((res) => {\r\n if (res?.Data) {\r\n this.SYSTEM_SUB_NAME_LEFT = res.Data;\r\n }\r\n });\r\n\r\n this.settingService.getByCodeAnonymous('SYSTEM_SUB_NAME_RIGHT').then((res) => {\r\n if (res?.Data) {\r\n this.SYSTEM_SUB_NAME_RIGHT = res.Data;\r\n }\r\n });\r\n\r\n this.settingService.getByCodeAnonymous('SYSTEM_HEADER_MENU_IN_USE').then((res) => {\r\n if (res?.Data) {\r\n this.HEADER_MENU_IN_USE = res.Data ?? false;\r\n }\r\n });\r\n\r\n this.breakpointObserver.observe([Breakpoints.XSmall, Breakpoints.Small]).subscribe((result) => {\r\n this.isXSmall = result.matches;\r\n });\r\n\r\n this.onRouteChange((url) => {\r\n console.log('onRouteChange', url);\r\n this.selectNodeByUrl(url);\r\n });\r\n\r\n setTimeout(() => {\r\n this.isCollapsed = localStorage.getItem('MENU_isCollapsed') == '1' || this.device.isMobile;\r\n // if (this.isCollapsed) {\r\n // this.visibleMenuDrawer = true;\r\n // }\r\n }, 0);\r\n\r\n // this.device\r\n // .isMobile$()\r\n // .pipe(takeUntil(this.destroy$))\r\n // .subscribe((isMobile) => {\r\n // this.isCollapsed = isMobile;\r\n // });\r\n\r\n this.device\r\n .innerWidth$()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((innerWidth) => {\r\n this.isCollapsed = innerWidth <= 1280;\r\n });\r\n\r\n this.isCollapsed = localStorage.getItem('MENU_isCollapsed') == '1';\r\n }\r\n\r\n @ViewChild('divuser') divuser!: ElementRef<HTMLDivElement>;\r\n\r\n ngOnDestroy(): void {\r\n SignalRService.disconnect();\r\n this.unSubRouteChange();\r\n console.log('unSubRouteChange');\r\n }\r\n\r\n getUserMenu(headerMenuId = '') {\r\n this.authService.getUserMenu(headerMenuId).then((res) => {\r\n this.lstMenu = res.Data || [];\r\n this.nodes = this.buildNzTreeFromSubMenu(this.lstMenu);\r\n this.updateOpenMenus();\r\n this.selectNodeByUrl(this.router.url);\r\n });\r\n }\r\n\r\n updateOpenMenus() {\r\n if (this.isCollapsed) return;\r\n\r\n const currentUrl = this.router.url;\r\n\r\n this.lstMenu.forEach((lv1) => {\r\n if (lv1.SubMenu) {\r\n if (lv1.SubMenu.some((x) => currentUrl.includes(x.Url))) {\r\n lv1.Open = true;\r\n }\r\n\r\n lv1.SubMenu.forEach((lv2) => {\r\n if (lv2.SubMenu) {\r\n if (lv2.SubMenu.some((x) => currentUrl.includes(x.Url))) {\r\n lv2.Open = true;\r\n lv1.Open = true;\r\n }\r\n\r\n lv2.SubMenu.forEach((lv3) => {\r\n if (lv3.SubMenu) {\r\n if (lv3.SubMenu.some((x) => currentUrl.includes(x.Url))) {\r\n lv3.Open = true;\r\n lv2.Open = true;\r\n lv1.Open = true;\r\n }\r\n }\r\n });\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n nzEvent(event: NzFormatEmitEvent): void {\r\n const data = event.node?.origin;\r\n\r\n if (event.node) {\r\n event.node.isSelected = true;\r\n event.node.isExpanded = true;\r\n }\r\n\r\n if (data?.['url']) {\r\n this.goto(data?.['url']);\r\n } else {\r\n this.goto('/');\r\n }\r\n }\r\n\r\n buildNzTreeFromSubMenu(menus: App_Menu[], parentKey: string = ''): any[] {\r\n return menus.map((m) => {\r\n return {\r\n title: `${m.TreeNodeOrder.split('.')\r\n .map((x) => +x)\r\n .join('.')}. ${m.Name}`,\r\n no: `${m.TreeNodeOrder.split('.')\r\n .map((x) => +x)\r\n .join('.')}`,\r\n key: m.App_Menu_Id,\r\n // expanded: true,\r\n expanded: false,\r\n isLeaf: !m.SubMenu || m.SubMenu.length === 0,\r\n children: m.SubMenu ? this.buildNzTreeFromSubMenu(m.SubMenu, m.App_Menu_Id) : [],\r\n url: m.Url,\r\n parentKey: parentKey,\r\n };\r\n });\r\n }\r\n\r\n private selectNodeByUrl(url: string) {\r\n this.selectedKeys = [];\r\n this.expandedKeys = [];\r\n\r\n const traverse = (nodes: NzTreeNode[]) => {\r\n for (const node of nodes) {\r\n node.isSelected = false; // reset\r\n if ((node as any)['url'] && url.startsWith((node as any)['url'])) {\r\n this.selectedKeys = [node.key];\r\n this.expandParents(node);\r\n\r\n // Scroll node vào viewport\r\n setTimeout(() => {\r\n const el = document.querySelector('.ant-tree-node-selected') as HTMLElement;\r\n const sider = document.querySelector('.menu-sidebar') as HTMLElement; // chính là nz-sider\r\n\r\n if (el && sider) {\r\n const elRect = el.getBoundingClientRect();\r\n const siderRect = sider.getBoundingClientRect();\r\n\r\n const isAbove = elRect.top < siderRect.top;\r\n const isBelow = elRect.bottom > siderRect.bottom;\r\n\r\n if (isAbove || isBelow) {\r\n el.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }\r\n }, 500);\r\n }\r\n if (node.children && node.children.length > 0) {\r\n traverse(node.children as NzTreeNode[]);\r\n }\r\n }\r\n };\r\n traverse(this.nodes);\r\n }\r\n\r\n // expand tất cả cha của node để nó hiển thị\r\n private expandParents(node: NzTreeNode) {\r\n let parentKey = (node as any).parentKey;\r\n\r\n while (parentKey) {\r\n this.expandedKeys = [...this.expandedKeys, parentKey];\r\n\r\n // Tìm parent node theo parentKey\r\n const parentNode = this.findNodeByKey(this.nodes, parentKey);\r\n if (parentNode) {\r\n parentKey = (parentNode as any).parentKey; // tiếp tục lên cấp cha\r\n } else {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Hàm tìm node theo key trong toàn bộ tree\r\n private findNodeByKey(nodes: NzTreeNode[], key: string): NzTreeNode | null {\r\n for (const node of nodes) {\r\n if (node.key === key) {\r\n return node;\r\n }\r\n if (node.children && node.children.length > 0) {\r\n const found = this.findNodeByKey(node.children as NzTreeNode[], key);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n triggerCollapse() {\r\n this.isCollapsed = !this.isCollapsed;\r\n localStorage.setItem('MENU_isCollapsed', this.isCollapsed ? '1' : '0');\r\n }\r\n\r\n handleValueChangeHeaderMenu(e: any): void {\r\n const i = this.lstHeaderMenuDisplay.indexOf(e);\r\n const menu = this.lstHeaderMenu[i];\r\n\r\n sessionStorage.setItem('HEADER_MENU_selected', e);\r\n sessionStorage.setItem('HEADER_MENU_ID_selected', menu.App_Menu_Id);\r\n\r\n this.getUserMenu(menu.App_Menu_Id);\r\n if (menu.Url) {\r\n this.goto(menu.Url);\r\n } else {\r\n this.goto('/');\r\n }\r\n }\r\n}\r\n","<custom-noti></custom-noti>\r\n<app-global-spinner></app-global-spinner>\r\n<nz-layout class=\"app-layout\">\r\n <nz-header class=\"app-header\">\r\n <div nz-row nzAlign=\"middle\" class=\"header-content\">\r\n @if (isCollapsed) {\r\n <div @fadeInOut>\r\n &nbsp;\r\n <button nz-button nzType=\"text\" style=\"color: var(--theme-text-color)\" (click)=\"visibleMenuDrawer = true\">\r\n <nz-icon nzType=\"menu\" nzTheme=\"outline\" />\r\n </button>\r\n </div>\r\n }\r\n\r\n <div class=\"header-logo\" [style.width]=\"!isCollapsed ? siderWidthStorage : '100px'\">\r\n <div nz-flex nzJustify=\"center\" nzGap=\"small\">\r\n <img\r\n *ngIf=\"logoUrl$ | async as url\"\r\n [src]=\"url\"\r\n height=\"40px\"\r\n style=\"padding: 4px;\"\r\n hideIfError\r\n />\r\n @if (SYSTEM_NAME) {\r\n <h2 style=\"color: whitesmoke; margin-bottom: 0\">{{ SYSTEM_NAME }}</h2>\r\n } @else {\r\n -- o0o --\r\n }\r\n </div>\r\n </div>\r\n @if (!HEADER_MENU_IN_USE) {\r\n <box [width]=\"8\"></box>\r\n <app-breadcrumb [@fadeInOut] nz-col nzFlex=\"auto\" class=\"breadcrumb-header\"></app-breadcrumb>\r\n }\r\n <div *ngIf=\"HEADER_MENU_IN_USE\" nz-col nzFlex=\"auto\" class=\"header-menu\">\r\n <div style=\"overflow: auto\">\r\n <nz-segmented\r\n [nzOptions]=\"lstHeaderMenuDisplay\"\r\n [(ngModel)]=\"selectedHeaderMenuDisplay\"\r\n (nzValueChange)=\"handleValueChangeHeaderMenu($event)\"\r\n ></nz-segmented>\r\n </div>\r\n </div>\r\n <div #divuser>\r\n <layout-user></layout-user>\r\n </div>\r\n </div>\r\n </nz-header>\r\n <nz-layout class=\"body-layout\">\r\n <nz-sider\r\n class=\"menu-sidebar\"\r\n nzCollapsible\r\n [nzWidth]=\"siderWidth\"\r\n [nzCollapsedWidth]=\"0\"\r\n [(nzCollapsed)]=\"isCollapsed\"\r\n [nzTrigger]=\"null\"\r\n [nzTheme]=\"'dark'\"\r\n >\r\n <div class=\"menu-wapper\">\r\n @if (MENU_TYPE == 1) {\r\n <div class=\"nz-tree-wapper\">\r\n <nz-tree\r\n [nzData]=\"nodes\"\r\n [nzSearchValue]=\"searchValue\"\r\n [nzShowLine]=\"true\"\r\n [nzSelectedKeys]=\"selectedKeys\"\r\n [nzExpandedKeys]=\"expandedKeys\"\r\n (nzClick)=\"nzEvent($event)\"\r\n ></nz-tree>\r\n </div>\r\n } @else {\r\n <div class=\"nz-tree-wapper\">\r\n <ul nz-menu nzTheme=\"light\" nzMode=\"inline\" [nzInlineCollapsed]=\"isCollapsed\">\r\n @for (menuLv1 of lstMenu; track menuLv1.App_Menu_Id) {\r\n @if (menuLv1.SubMenu) {\r\n <ul nz-submenu [nzOpen]=\"menuLv1.Open\" [nzTitle]=\"menuLv1.Name\" [nzIcon]=\"menuLv1.Icon\">\r\n @for (menuLv2 of menuLv1.SubMenu; track menuLv2.App_Menu_Id) {\r\n @if (menuLv2.SubMenu) {\r\n <ul nz-submenu [nzOpen]=\"menuLv2.Open\" [nzTitle]=\"menuLv2.Name\" [nzIcon]=\"menuLv2.Icon\">\r\n @for (menuLv3 of menuLv2.SubMenu; track menuLv3.App_Menu_Id) {\r\n @if (menuLv3.SubMenu) {\r\n <ul nz-submenu [nzOpen]=\"menuLv3.Open\" [nzTitle]=\"menuLv3.Name\" [nzIcon]=\"menuLv3.Icon\">\r\n @for (menuLv4 of menuLv3.SubMenu; track menuLv4.App_Menu_Id) {\r\n @if (menuLv4.SubMenu) {\r\n <ul\r\n nz-submenu\r\n [nzOpen]=\"menuLv4.Open\"\r\n [nzTitle]=\"menuLv4.Name\"\r\n [nzIcon]=\"menuLv4.Icon\"\r\n >\r\n @for (menuLv5 of menuLv4.SubMenu; track menuLv5.App_Menu_Id) {}\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <a\r\n [routerLink]=\"menuLv4.Url\"\r\n [innerHTML]=\"menuLv4.Name | highlight: searchValue\"\r\n ></a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <a [routerLink]=\"menuLv3.Url\" [innerHTML]=\"menuLv3.Name | highlight: searchValue\"></a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <a [routerLink]=\"menuLv2.Url\" [innerHTML]=\"menuLv2.Name | highlight: searchValue\"></a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <a [routerLink]=\"menuLv1.Url\" [innerHTML]=\"menuLv1.Name | highlight: searchValue\"></a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n </div>\r\n }\r\n\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input nz-input placeholder=\"Tìm menu\" [(ngModel)]=\"searchValue\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <span class=\"suffix-wrap\">\r\n <icon-delete\r\n class=\"suffix-icon delete\"\r\n [class.show]=\"searchValue\"\r\n [size]=\"14\"\r\n (click)=\"searchValue = ''\"\r\n ></icon-delete>\r\n\r\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\r\n </span>\r\n </ng-template>\r\n </div>\r\n <div class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\r\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 0.8em; color: lightgray\">\r\n {{ SYSTEM_SUB_NAME_LEFT || \"-- o0o --\" }}\r\n\r\n <span style=\"float: right\" (click)=\"triggerCollapse()\">\r\n <nz-icon class=\"trigger\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" />\r\n </span>\r\n </div>\r\n </div>\r\n </nz-sider>\r\n <nz-layout class=\"main-layout\">\r\n <nz-content class=\"content\">\r\n <div class=\"inner-content\">\r\n @if (HEADER_MENU_IN_USE) {\r\n <app-breadcrumb [@fadeInOut] nz-col nzFlex=\"auto\"></app-breadcrumb>\r\n <box [height]=\"8\"></box>\r\n }\r\n <router-outlet></router-outlet>\r\n </div>\r\n <div nz-row class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\r\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 0.8em; color: lightgray\">\r\n {{ SYSTEM_SUB_NAME_RIGHT || \"-- o0o --\" }}\r\n </div>\r\n </div>\r\n <!-- <nz-back-top [nzTarget]=\"'.content'\" [nzVisibilityHeight]=\"500\"></nz-back-top> -->\r\n </nz-content>\r\n </nz-layout>\r\n </nz-layout>\r\n</nz-layout>\r\n\r\n<nz-drawer\r\n [nzWrapClassName]=\"'same-theme-color menu-drawer'\"\r\n [nzWidth]=\"350\"\r\n [nzClosable]=\"false\"\r\n [(nzVisible)]=\"visibleMenuDrawer\"\r\n [nzMaskClosable]=\"true\"\r\n nzPlacement=\"left\"\r\n nzTitle=\"\"\r\n (nzOnClose)=\"visibleMenuDrawer = false\"\r\n>\r\n <ng-container *nzDrawerContent>\r\n <div class=\"menu-wapper\">\r\n @if (MENU_TYPE == 1) {\r\n <div class=\"nz-tree-wapper in-drawer\">\r\n <nz-tree\r\n [nzData]=\"nodes\"\r\n [nzSearchValue]=\"searchValue\"\r\n [nzShowLine]=\"true\"\r\n [nzSelectedKeys]=\"selectedKeys\"\r\n [nzExpandedKeys]=\"expandedKeys\"\r\n (nzClick)=\"nzEvent($event)\"\r\n ></nz-tree>\r\n </div>\r\n } @else {\r\n <div class=\"nz-tree-wapper in-drawer\">\r\n <ul nz-menu nzTheme=\"light\" nzMode=\"inline\">\r\n @for (menuLv1 of lstMenu; track menuLv1.App_Menu_Id) {\r\n @if (menuLv1.SubMenu) {\r\n <ul nz-submenu [nzOpen]=\"menuLv1.Open\" [nzTitle]=\"menuLv1.Name\" [nzIcon]=\"menuLv1.Icon\">\r\n @for (menuLv2 of menuLv1.SubMenu; track menuLv2.App_Menu_Id) {\r\n @if (menuLv2.SubMenu) {\r\n <ul nz-submenu [nzOpen]=\"menuLv2.Open\" [nzTitle]=\"menuLv2.Name\" [nzIcon]=\"menuLv2.Icon\">\r\n @for (menuLv3 of menuLv2.SubMenu; track menuLv3.App_Menu_Id) {\r\n @if (menuLv3.SubMenu) {\r\n <ul nz-submenu [nzOpen]=\"menuLv3.Open\" [nzTitle]=\"menuLv3.Name\" [nzIcon]=\"menuLv3.Icon\">\r\n @for (menuLv4 of menuLv3.SubMenu; track menuLv4.App_Menu_Id) {\r\n @if (menuLv4.SubMenu) {\r\n <ul\r\n nz-submenu\r\n [nzOpen]=\"menuLv4.Open\"\r\n [nzTitle]=\"menuLv4.Name\"\r\n [nzIcon]=\"menuLv4.Icon\"\r\n >\r\n @for (menuLv5 of menuLv4.SubMenu; track menuLv5.App_Menu_Id) {}\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <a\r\n [routerLink]=\"menuLv4.Url\"\r\n [innerHTML]=\"menuLv4.Name | highlight: searchValue\"\r\n ></a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <a [routerLink]=\"menuLv3.Url\" [innerHTML]=\"menuLv3.Name | highlight: searchValue\"></a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <a [routerLink]=\"menuLv2.Url\" [innerHTML]=\"menuLv2.Name | highlight: searchValue\"></a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <a [routerLink]=\"menuLv1.Url\" [innerHTML]=\"menuLv1.Name | highlight: searchValue\"></a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n </div>\r\n }\r\n\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\" [nzAddOnAfter]=\"afterTemplate\">\r\n <input nz-input placeholder=\"Tìm menu\" [(ngModel)]=\"searchValue\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <span class=\"suffix-wrap\">\r\n <icon-delete\r\n class=\"suffix-icon delete\"\r\n [class.show]=\"searchValue\"\r\n [size]=\"14\"\r\n (click)=\"searchValue = ''\"\r\n ></icon-delete>\r\n\r\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\r\n </span>\r\n </ng-template>\r\n <ng-template #afterTemplate>\r\n <button nz-button (click)=\"triggerCollapse(); this.visibleMenuDrawer = false\">\r\n <nz-icon *ngIf=\"isCollapsed\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" />\r\n </button>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n</nz-drawer>\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { HttpParams } from '@angular/common/http';\r\nimport { HTTPService } from './api-service/http.service';\r\nimport { CommonService } from './api-service/common.service';\r\nimport { RespondData } from '../model';\r\nimport { AppGlobals } from '../app-global';\r\n\r\nexport const URLs = {\r\n getById: '/api/App_Org/GetById',\r\n getAll: '/api/App_Org/GetAll',\r\n getList: '/api/App_Org/GetList',\r\n getPaging: '/api/App_Org/GetPaging',\r\n addOrEdit: '/api/App_Org/AddOrEdit',\r\n delete: '/api/App_Org/Delete',\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class OrgService extends HTTPService {\r\n commonService = inject(CommonService);\r\n\r\n getById(id: any): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Org_getById',\r\n Params: [id],\r\n });\r\n }\r\n\r\n getAll(): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Org_getAll',\r\n });\r\n }\r\n\r\n getList(filter: any): Promise<RespondData> {\r\n return this.postData(AppGlobals.apiEndpoint + URLs.getList, filter);\r\n }\r\n\r\n getPaging(filter: any): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Org_getpaging',\r\n Params: [filter],\r\n });\r\n }\r\n\r\n addOrEdit(obj: any): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Org_addOrEdit',\r\n Params: [obj],\r\n });\r\n }\r\n\r\n delete(id: any): Promise<RespondData> {\r\n const params = new HttpParams().append('id', id);\r\n return this.postParams(AppGlobals.apiEndpoint + URLs.delete, params);\r\n }\r\n\r\n getAllForLogin(UserName: string) {\r\n const params = new HttpParams().append('UserName', UserName);\r\n return this.getParams(`${AppGlobals.apiEndpoint}/api/public/LstOrgForLogin`, params);\r\n }\r\n\r\n getUserInOrgStr(OrgId: string) {\r\n return this.commonService.ESP({\r\n SPN: 'App_Org_getUserInOrgStr',\r\n Params: [OrgId],\r\n });\r\n }\r\n\r\n getUsersInOrg(orgId: string): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Org_getUsersInOrg',\r\n Params: [orgId],\r\n });\r\n }\r\n\r\n addUsersToOrg(orgId: string | null, userIds: string[]): Promise<RespondData> {\r\n if (!orgId) {\r\n return Promise.reject('Org ID is required');\r\n }\r\n return this.commonService.ESP({\r\n SPN: 'App_Org_addUsersToOrg',\r\n Params: [orgId, userIds.join(',')],\r\n });\r\n }\r\n\r\n deleteUserFromOrg(orgId: string, userId: string): Promise<RespondData> {\r\n return this.commonService.ESP({\r\n SPN: 'App_Org_deleteUserFromOrg',\r\n Params: [orgId, userId],\r\n });\r\n }\r\n\r\n checkImportOrg(data: any) {\r\n return this.commonService.ESP({\r\n SPN: 'App_Org_checkImportOrg',\r\n Params: [data],\r\n });\r\n }\r\n\r\n importOrg(data: any) {\r\n return this.postData(`${AppGlobals.apiEndpoint}/api/Org/importOrg`, data);\r\n }\r\n}\r\n","import { Component, inject, OnInit } from '@angular/core';\r\nimport { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core'; // Import TranslateService\r\nimport { NzFormModule } from 'ng-zorro-antd/form';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzToolTipModule } from 'ng-zorro-antd/tooltip';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzSwitchModule } from 'ng-zorro-antd/switch';\r\nimport { NzFlexModule } from 'ng-zorro-antd/flex';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\nimport { debounceTime, distinctUntilChanged, map } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HideIfErrorDirective } from '../../directive/img-hide-if-error.directive';\r\nimport { BaseComponent } from '../base.component';\r\nimport { AuthService } from '../../auth/auth.service';\r\nimport { SessionManagerService } from '../../auth/session-manager.service';\r\nimport { SettingService } from '../../services/setting.service';\r\nimport { VscService } from '../../services/vsc.service';\r\nimport { LoadingService } from '../../services/loading.service';\r\nimport { FileService } from '../../services/file.service';\r\nimport { App_Org } from '../../model';\r\nimport { TokenStorage } from '../../auth/token.storage';\r\nimport { AppStorage } from '../../app-storeage';\r\nimport { OrgService } from '../../services/org.service';\r\nimport { AppGlobals } from '../../app-global';\r\n\r\n@Component({\r\n selector: 'login',\r\n templateUrl: './login.component.html',\r\n styleUrl: './login.component.scss',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslateModule,\r\n NzFormModule,\r\n NzInputModule,\r\n NzIconModule,\r\n NzToolTipModule,\r\n NzButtonModule,\r\n NzSwitchModule,\r\n NzFlexModule,\r\n NzSelectModule,\r\n HideIfErrorDirective,\r\n ],\r\n})\r\nexport class LoginComponent extends BaseComponent implements OnInit {\r\n fb = inject(FormBuilder);\r\n authService = inject(AuthService);\r\n sessionManager = inject(SessionManagerService);\r\n orgService = inject(OrgService);\r\n settingService = inject(SettingService);\r\n vscService = inject(VscService);\r\n loadingService = inject(LoadingService);\r\n fileService = inject(FileService);\r\n\r\n loginForm!: FormGroup;\r\n visible = false;\r\n passwordType: 'password' | 'text' = 'password';\r\n returnUrl = '';\r\n\r\n lstOrg: App_Org[] = [];\r\n\r\n isOneUserMultiOrgs = false;\r\n SYSTEM_NAME_LOGIN = '';\r\n\r\n async ngOnInit() {\r\n this.route.queryParams.subscribe((params) => (this.returnUrl = params['returnUrl'] || '/'));\r\n\r\n if (TokenStorage.getToken() && (await this.authService.pingAuth())) {\r\n this.goto(this.returnUrl);\r\n return;\r\n }\r\n\r\n this.loginForm = this.fb.group({\r\n username: [null, [Validators.required]],\r\n password: [null, [Validators.required]],\r\n orgid: [null],\r\n langSwitch: [AppStorage.getLang() === 'vn'],\r\n });\r\n\r\n this.settingService.getByCodeAnonymous('SYSTEM_NAME_LOGIN').then(\r\n (res) => {\r\n if (res?.Data) {\r\n this.SYSTEM_NAME_LOGIN = res.Data;\r\n }\r\n },\r\n (err) => this.handleError(err),\r\n );\r\n\r\n this.settingService.getByCodeAnonymous('ONE_USER_MULTI_ORGS').then(\r\n (res) => {\r\n if (res?.Data) {\r\n if (res.Data == '1') {\r\n this.isOneUserMultiOrgs = true;\r\n this.loginForm.get('orgid')?.setValidators([Validators.required]);\r\n this.getLstOrg();\r\n this.loginForm.controls['orgid']?.valueChanges.subscribe((x) =>\r\n localStorage.setItem('ORG_ID_SELECTED_BEFOR', x),\r\n );\r\n this.loginForm.controls['username']?.valueChanges\r\n .pipe(debounceTime(200), distinctUntilChanged())\r\n .subscribe((x) => this.getLstOrg());\r\n } else {\r\n this.loginForm.get('orgid')?.clearValidators();\r\n }\r\n }\r\n },\r\n (err) => this.handleError(err),\r\n );\r\n\r\n this.vscService.clearInterval();\r\n // this.sessionManager.stop();\r\n }\r\n\r\n getLstOrg() {\r\n const username = this.loginForm.controls['username'].value;\r\n\r\n this.orgService.getAllForLogin(username ?? '').then(\r\n (res) => {\r\n if (res.Data) {\r\n this.lstOrg = res.Data;\r\n let orgIdSelectedBefor = localStorage.getItem('ORG_ID_SELECTED_BEFOR');\r\n if (orgIdSelectedBefor && this.lstOrg.find((x) => x.App_Org_Id == orgIdSelectedBefor)) {\r\n this.loginForm.controls['orgid']?.setValue(orgIdSelectedBefor);\r\n }\r\n } else {\r\n this.lstOrg = [];\r\n }\r\n },\r\n (err) => this.handleError(err),\r\n );\r\n }\r\n\r\n dologin() {\r\n for (const i in this.loginForm.controls) {\r\n this.loginForm.controls[i].markAsDirty();\r\n this.loginForm.controls[i].updateValueAndValidity();\r\n }\r\n\r\n if (this.loginForm.valid) {\r\n this.sessionManager.login(\r\n this.loginForm.value.username,\r\n this.loginForm.value.password,\r\n this.loginForm.value.orgid,\r\n this.returnUrl,\r\n );\r\n }\r\n\r\n this.vscService.checkVersion();\r\n }\r\n\r\n changeLanguage(lang: boolean) {\r\n AppStorage.setLang(lang ? 'vn' : 'en');\r\n this.translate.use(lang ? 'vn' : 'en');\r\n }\r\n\r\n onFocusOrg() {\r\n // console.log(this.loginForm.value.username);\r\n // this.getLstOrg();\r\n }\r\n\r\n onImgError(e: Event) {\r\n (e.target as HTMLImageElement).style.display = 'none';\r\n }\r\n\r\n logoUrl$ = this.fileService\r\n .getFileVersion('LOGO_LOGIN')\r\n .pipe(map((res) => `${AppGlobals.apiEndpoint}/api/file/image?code=LOGO_LOGIN&v=${res || ''}`));\r\n\r\n bgUrl$ = this.fileService\r\n .getFileVersion('LOGIN_BACKGROUND')\r\n .pipe(map((res) => `${AppGlobals.apiEndpoint}/api/file/image?code=LOGIN_BACKGROUND&v=${res || ''}`));\r\n}\r\n","<div nz-row nzJustify=\"center\" class=\"login\">\r\n <div class=\"form-container\">\r\n <form nz-flex nzVertical=\"true\" nz-form [formGroup]=\"loginForm\" class=\"login-form\" (ngSubmit)=\"dologin()\">\r\n <div>\r\n <div style=\"text-align: center\">\r\n <img *ngIf=\"logoUrl$ | async as url\" width=\"150px\" [src]=\"url\" hideIfError />\r\n </div>\r\n <div class=\"form-field\" style=\"text-align: center; margin-bottom: 20px\">\r\n <h3 style=\"font-weight: bold; font-size: 20px\">{{ SYSTEM_NAME_LOGIN }}</h3>\r\n </div>\r\n </div>\r\n\r\n <div nz-row [nzJustify]=\"'center'\">\r\n <div nz-col nzSm=\"24\" nzMd=\"16\">\r\n <div nz-flex nzVertical=\"true\">\r\n <nz-form-item>\r\n <nz-form-control nzErrorTip=\"{{ 'REQUIRED' | translate }}\">\r\n <nz-input-group nzPrefixIcon=\"user\">\r\n <input type=\"text\" nz-input formControlName=\"username\" placeholder=\"{{ 'USERNAME' | translate }}\" />\r\n </nz-input-group>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-control nzErrorTip=\"{{ 'REQUIRED' | translate }}\">\r\n <nz-input-group\r\n nzPrefixIcon=\"lock\"\r\n [nzSuffix]=\"visible ? suffixTemplateHiddenPassword : suffixTemplateShowPassword\"\r\n >\r\n <input\r\n type=\"{{ passwordType }}\"\r\n nz-input\r\n formControlName=\"password\"\r\n placeholder=\"{{ 'PASSWORD' | translate }}\"\r\n />\r\n </nz-input-group>\r\n </nz-form-control>\r\n <ng-template #suffixTemplateShowPassword>\r\n <nz-icon\r\n nzType=\"eye\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'SHOW' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visible = !visible; passwordType = 'text'\"\r\n />\r\n </ng-template>\r\n <ng-template #suffixTemplateHiddenPassword>\r\n <nz-icon\r\n nzType=\"eye-invisible\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'HIDDEN' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visible = !visible; passwordType = 'password'\"\r\n />\r\n </ng-template>\r\n </nz-form-item>\r\n\r\n @if (isOneUserMultiOrgs) {\r\n <nz-form-item>\r\n <nz-form-control nzErrorTip=\"{{ 'REQUIRED' | translate }}\">\r\n <nz-input-group nzPrefixIcon=\"cluster\" nzHasFeedback=\"false\">\r\n <nz-select\r\n nzShowSearch\r\n nzAllowClear\r\n [nzBorderless]=\"true\"\r\n [nzSize]=\"'small'\"\r\n nzPlaceHolder=\"{{ 'ORG' | translate }}\"\r\n formControlName=\"orgid\"\r\n class=\"no-error-border\"\r\n (nzFocus)=\"onFocusOrg()\"\r\n >\r\n @for (item of lstOrg; track $index) {\r\n <nz-option [nzLabel]=\"item.TreeNodeName!\" [nzValue]=\"item.App_Org_Id\"></nz-option>\r\n }\r\n </nz-select>\r\n </nz-input-group>\r\n </nz-form-control>\r\n </nz-form-item>\r\n }\r\n\r\n <div nz-flex nzVertical=\"true\" nzGap=\"4px\">\r\n <button nz-button [nzType]=\"'primary'\" nzBlock [nzLoading]=\"loadingService.isLoading\">\r\n {{ \"LOGIN\" | translate }}\r\n </button>\r\n <!-- \r\n <nz-form-item nzJustify=\"end\">\r\n <nz-switch formControlName=\"langSwitch\" class=\"nz-switch-both-active-color\" nzCheckedChildren=\"VN\"\r\n nzUnCheckedChildren=\"EN\" (ngModelChange)=\"changeLanguage($event)\"></nz-switch>\r\n </nz-form-item> \r\n -->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n</div>\r\n\r\n<img *ngIf=\"bgUrl$ | async as url\" class=\"bg-image\" [src]=\"url\" hideIfError />\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["URLs","PermissionService","switchMap","i1","filter","i2","i3","i4","i5","i7","i6","i1.LoadingService","this","i8","i9","i10","i12","i13","i14","i15","i16","i11","i2.PermissionService","i17","i1.PermissionService","i2.AuthService","i3.NotiService","takeUntil","distinctUntilChanged"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAAY;AAAZ,CAAA,UAAY,YAAY,EAAA;AACtB,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,YAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,YAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,YAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,YAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,YAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,YAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC;AACjC,IAAA,YAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,YAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC;AACjC,IAAA,YAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,YAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,YAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,YAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,YAAA,CAAA,sBAAA,CAAA,GAAA,sBAA6C;AAC7C,IAAA,YAAA,CAAA,IAAA,CAAA,GAAA,IAAS;AACT,IAAA,YAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,YAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,YAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC;AACjC,IAAA,YAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,YAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,YAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC;AACjC,IAAA,YAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,YAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,YAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,YAAA,CAAA,cAAA,CAAA,GAAA,cAA6B;AAC7B,IAAA,YAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,YAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,YAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,YAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,YAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,YAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC;AACvC,IAAA,YAAA,CAAA,oBAAA,CAAA,GAAA,oBAAyC;AAC3C,CAAC,EAzCW,YAAY,KAAZ,YAAY,GAyCvB,EAAA,CAAA,CAAA;;MCzCY,UAAU,CAAA;IACd,OAAO,WAAW;IAClB,OAAO,YAAY;AAEnB,IAAA,OAAO,SAAS,GAAiC,cAAc;AAC/D,IAAA,OAAO,eAAe,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;AAE1C,IAAA,OAAO,SAAS,GAAQ,EAAE;AAC1B,IAAA,OAAO,aAAa,GAAQ,EAAE;AAE9B,IAAA,OAAO,YAAY,GAAA;AACxB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;;IAGd,OAAO,SAAS,CAAC,GAAQ,EAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;;AAGrB,IAAA,OAAO,SAAS,CAAC,GAAQ,EAAE,MAAW,EAAA;AAC3C,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM;;IAGvB,OAAO,aAAa,CAAC,GAAQ,EAAA;AAClC,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;;AAGzB,IAAA,OAAO,aAAa,CAAC,GAAQ,EAAE,KAAU,EAAA;AAC9C,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,KAAK;;IAG1B,OAAO,OAAO,CAAC,IAAY,EAAA;AAChC,QAAA,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC;;AAGjC,IAAA,OAAO,OAAO,GAAA;QACnB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;AACrC,YAAA,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC;;QAExC,OAAO,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE;;AAGxC,IAAA,OAAO,QAAQ,GAAA;AACpB,QAAA,OAAO,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC;;AAG/B,IAAA,OAAO,UAAU,GAAA;AACtB,QAAA,OAAO,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC;;AAGjC,IAAA,OAAO,UAAU,GAAA;AACtB,QAAA,OAAO,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC;;AAGjC,IAAA,OAAO,WAAW,GAAA;AACvB,QAAA,OAAO,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;;AAGlC,IAAA,OAAO,eAAe,GAAA;AAC3B,QAAA,OAAO,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;;;;MCvD9B,UAAU,CAAA;AAErB,IAAA,WAAW,YAAY,GAAA;AACrB,QAAA,OAAO,YAAY;;;AAIrB,IAAA,WAAW,aAAa,GAAA;AACtB,QAAA,OAAO,YAAY;;AAGrB,IAAA,WAAW,eAAe,GAAA;AACxB,QAAA,OAAO,cAAc;;AAGvB,IAAA,OAAO,OAAO,GAAA;QACZ,OAAO,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,IAAI;;IAG7D,OAAO,OAAO,CAAC,IAAY,EAAA;QACzB,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,IAAI,IAAI,CAAC;;AAE7D;;MCpBY,WAAW,CAAA;AACtB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAE/B,GAAG,CAAC,GAAW,EAAE,aAAuB,EAAA;AACtC,QAAA,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,IAAI,WAAW,CAAC;AACvB,gBAAA,cAAc,EAAE,iCAAiC;gBACjD,iBAAiB,EAAE,aAAa,GAAG,GAAG,GAAG,GAAG;aAC7C,CAAC;SACH;AAED,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAc,GAAG,EAAE,OAAO,CAAC,CAAC;;AAGvE,IAAA,SAAS,CAAC,GAAW,EAAE,MAAkB,EAAE,aAAuB,EAAA;AAChE,QAAA,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,IAAI,WAAW,CAAC;AACvB,gBAAA,cAAc,EAAE,iCAAiC;gBACjD,iBAAiB,EAAE,aAAa,GAAG,GAAG,GAAG,GAAG;aAC7C,CAAC;AACF,YAAA,MAAM,EAAE,MAAM;SACf;AAED,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAc,GAAG,EAAE,OAAO,CAAC,CAAC;;IAGvE,IAAI,CAAC,GAAW,EAAE,aAAuB,EAAA;AACvC,QAAA,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,IAAI,WAAW,CAAC;AACvB,gBAAA,cAAc,EAAE,iCAAiC;gBACjD,iBAAiB,EAAE,aAAa,GAAG,GAAG,GAAG,GAAG;aAC7C,CAAC;SACH;AAED,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAc,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;;AAG9E,IAAA,UAAU,CAAC,GAAW,EAAE,MAAkB,EAAE,aAAuB,EAAA;AACjE,QAAA,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,IAAI,WAAW,CAAC;AACvB,gBAAA,cAAc,EAAE,iCAAiC;gBACjD,iBAAiB,EAAE,aAAa,GAAG,GAAG,GAAG,GAAG;aAC7C,CAAC;AACF,YAAA,MAAM,EAAE,MAAM;SACf;AAED,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAc,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;;AAG9E,IAAA,QAAQ,CAAC,GAAW,EAAE,IAAS,EAAE,aAAuB,EAAA;AACtD,QAAA,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,IAAI,WAAW,CAAC;AACvB,gBAAA,cAAc,EAAE,iCAAiC;gBACjD,iBAAiB,EAAE,aAAa,GAAG,GAAG,GAAG,GAAG;aAC7C,CAAC;SACH;AAED,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAc,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;;AAG9E,IAAA,kBAAkB,CAAC,GAAW,EAAE,IAAS,EAAE,MAAmB,EAAE,aAAuB,EAAA;AACrF,QAAA,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,IAAI,WAAW,CAAC;AACvB,gBAAA,cAAc,EAAE,iCAAiC;gBACjD,iBAAiB,EAAE,aAAa,GAAG,GAAG,GAAG,GAAG;aAC7C,CAAC;AACF,YAAA,MAAM,EAAE,MAAM;SACf;AAED,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAc,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;;AAE/E;;MCxEY,aAAa,CAAA;IACxB,SAAS,GAAA;AACP,QAAA,OAAO,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CACrC,SAAS,CAAC,IAAI,CAAC;QACf,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC,CAEpC;;IAGH,WAAW,GAAA;QACT,OAAO,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CACrC,SAAS,CAAC,IAAI,CAAC,EACf,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAC7B;;AAGH,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,MAAM,CAAC,UAAU,IAAI,GAAG;;uGAjBtB,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAb,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cADA,MAAM,EAAA,CAAA;;2FACnB,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCUrB,iBAAiB,CAAA;AAMR,IAAA,YAAA;AALb,IAAA,OAAO,eAAe,GAAG,IAAI;AAC7B,IAAA,OAAO,gBAAgB,GAA4B,UAAU;AAE5D,IAAA,cAAc;AAEtB,IAAA,WAAA,CAAoB,YAAmC,EAAA;QAAnC,IAAY,CAAA,YAAA,GAAZ,YAAY;;AAEhC,IAAA,gBAAgB,CAAC,GAAqB,EAAA;AACpC,QAAA,IAAI,CAAC,cAAc,GAAG,GAAG;;AAG3B,IAAA,OAAO,CAAC,KAAa,EAAE,OAAgB,EAAE,OAAqB,EAAA;QAC5D,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC;;AAG/C,IAAA,OAAO,CAAC,KAAa,EAAE,OAAgB,EAAE,OAAqB,EAAA;QAC5D,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC;;AAG/C,IAAA,KAAK,CAAC,KAAa,EAAE,OAAgB,EAAE,OAAqB,EAAA;QAC1D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC;;AAGrC,IAAA,IAAI,CAAC,IAAqC,EAAE,KAAa,EAAE,OAAgB,EAAE,OAAqB,EAAA;AACxG,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACxB,YAAA,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC;YACpE;;QAGF,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QACzC,MAAM,aAAa,GAAG,OAAO,EAAE,QAAQ,IAAI,iBAAiB,CAAC,eAAe;QAC5E,MAAM,cAAc,GAAG,OAAO,EAAE,SAAS,IAAI,iBAAiB,CAAC,gBAAgB;QAE/E,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE;AAC9D,YAAA,UAAU,EAAE,aAAa;AACzB,YAAA,WAAW,EAAE,cAAc;AAC3B,YAAA,OAAO,EAAE,4BAA4B;AACrC,YAAA,MAAM,EAAE;gBACN,KAAK;AACL,gBAAA,WAAW,EAAE,OAAO;AACpB,gBAAA,QAAQ,EAAE,aAAa;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;AAEnB,gBAAA,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,KAAK;gBACxC,aAAa,EAAE,MAAK;AAClB,oBAAA,IAAI,OAAO,EAAE,QAAQ,EAAE;wBACrB,OAAO,CAAC,QAAQ,EAAE;;;oBAGpB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;iBAC5C;AACF,aAAA;AACF,SAAA,CAAC;;AAGI,IAAA,eAAe,CAAC,IAAY,EAAA;QAClC,QAAQ,IAAI;AACV,YAAA,KAAK,SAAS;gBACZ,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE;AACnD,YAAA,KAAK,SAAS;gBACZ,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,SAAS,EAAE;AACzD,YAAA,KAAK,OAAO;gBACV,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE;AACnD,YAAA;gBACE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE;;;uGAlE3C,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA;;2FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACLD,SAAS,UAAU,CAAC,GAAW,EAAA;AAC7B,IAAA,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;AACxD;MAKa,WAAW,CAAA;AACtB,IAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;;AAE9B,IAAA,YAAY,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACxC,IAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACpC,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;IAE9B,MAAM,OAAO,CAAC,KAAc,EAAE,OAAkB,GAAA,EAAE,EAAE,SAAA,GAAqB,KAAK,EAAA;QAC5E,IAAI,SAAS,EAAE;AACb,YAAA,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,KAAI;AACnC,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AAClC,oBAAA,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC;AAC9D,oBAAA,SAAS,EAAE,OAAO;AAClB,oBAAA,MAAM,EAAE,MAAM,OAAO,EAAE;AACxB,iBAAA,CAAC;AACJ,aAAC,CAAC;;aACG;YACL,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;;;IAI7G,MAAM,OAAO,CAAC,KAAa,EAAE,OAAkB,GAAA,EAAE,EAAE,SAAA,GAAqB,KAAK,EAAA;QAC3E,IAAI,SAAS,EAAE;AACb,YAAA,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,KAAI;AACnC,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AAClC,oBAAA,OAAO,EAAE,KAAK;AACd,oBAAA,SAAS,EAAE,OAAO;AAClB,oBAAA,MAAM,EAAE,MAAM,OAAO,EAAE;AACxB,iBAAA,CAAC;AACJ,aAAC,CAAC;;aACG;AACL,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;;;IAI7D,MAAM,KAAK,CAAC,KAAa,EAAE,OAAkB,GAAA,EAAE,EAAE,SAAA,GAAqB,KAAK,EAAA;QACzE,IAAI,SAAS,EAAE;AACb,YAAA,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,KAAI;AACnC,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AAChC,oBAAA,OAAO,EAAE,KAAK;AACd,oBAAA,SAAS,EAAE,OAAO;AAClB,oBAAA,MAAM,EAAE,MAAM,OAAO,EAAE;AACxB,iBAAA,CAAC;AACJ,aAAC,CAAC;;aACG;AACL,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC;;;AAI3D,IAAA,WAAW,CAAC,GAAQ,EAAA;AAClB,QAAA,IAAI,GAAG,EAAE,MAAM,IAAI,CAAC,EAAE;;AAGpB,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AACf,gBAAA,OAAO,EAAE,eAAe;gBACxB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,sBAAsB,CAAC;gBACzD,OAAO,EAAE,IAAI,CAAC,UAAU;AACxB,gBAAA,QAAQ,EAAE,MAAM;AACjB,aAAA,CAAC;YAEF;;QAGF,IAAI,KAAK,GAAQ,IAAI;AAErB,QAAA,IAAI,GAAG,EAAE,KAAK,YAAY,WAAW,EAAE;AACrC,YAAA,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC1E,YAAA,IAAI;AACF,gBAAA,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;;AAC3B,YAAA,OAAO,KAAK,EAAE;;AACX,aAAA,IAAI,GAAG,EAAE,KAAK,YAAY,IAAI,EAAE;AACrC,YAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;AAC/B,YAAA,MAAM,CAAC,MAAM,GAAG,MAAK;AACnB,gBAAA,IAAI;AACF,oBAAA,MAAM,IAAI,GAAG,MAAM,CAAC,MAAgB;AACpC,oBAAA,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AACxB,oBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;;gBACvB,OAAO,CAAC,EAAE;;AAGV,oBAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AACf,wBAAA,OAAO,EAAE,eAAe;wBACxB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC;wBAClD,OAAO,EAAE,IAAI,CAAC,UAAU;AACxB,wBAAA,QAAQ,EAAE,MAAM;AACjB,qBAAA,CAAC;;AAEN,aAAC;AAED,YAAA,MAAM,CAAC,OAAO,GAAG,MAAK;;AAGpB,gBAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AACf,oBAAA,OAAO,EAAE,eAAe;oBACxB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC;oBAClD,OAAO,EAAE,IAAI,CAAC,UAAU;AACxB,oBAAA,QAAQ,EAAE,MAAM;AACjB,iBAAA,CAAC;AACJ,aAAC;AACD,YAAA,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;YAC5B;;aACK,IAAI,GAAG,EAAE,KAAK,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE;AACtD,YAAA,KAAK,GAAG,GAAG,CAAC,KAAK;;aACZ;YACL,KAAK,GAAG,GAAG;;AAGb,QAAA,IAAI,QAAQ,GAAG,GAAG,EAAE,OAAO,IAAI,+BAA+B;AAE9D,QAAA,IAAI,GAAG,EAAE,IAAI,IAAI,YAAY,IAAI,GAAG,EAAE,OAAO,IAAI,yBAAyB,EAAE;YAC1E;;AAGF,QAAA,IAAI,KAAK,EAAE,YAAY,EAAE;YACvB,IAAI,SAAS,GAAG,KAAK;YACrB,IAAI,eAAe,GAAG,KAAK;YAE3B,IAAI,OAAO,GAAG,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,sEAAsE,CAAC;YAC/G,eAAe,GAAG,OAAO,GAAG,IAAI,GAAG,KAAK;YAExC,IAAI,eAAe,EAAE;AACnB,gBAAA,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,YAAY,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAC;AACvE,gBAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,gBAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACvB,oBAAA,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC9B,SAAS,GAAG,IAAI;;qBACX;AACL,oBAAA,QAAQ,GAAG,KAAK,CAAC,YAAY;;;iBAE1B;AACL,gBAAA,QAAQ,GAAG,KAAK,CAAC,YAAY;;;QAIjC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,eAAe,EAAE,QAAQ,EAAE;AACjD,YAAA,UAAU,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI;YACzB,QAAQ,EAAE,MAAK;AACb,gBAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AACf,oBAAA,OAAO,EAAE,cAAc;AACvB,oBAAA,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACrD,oBAAA,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,MAAM,GAAG,MAAM;AAC/C,oBAAA,WAAW,EAAE,IAAI;AACjB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,MAAM;AACjB,iBAAA,CAAC;aACH;AACF,SAAA,CAAC;;AAGJ,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,MAAM,GAAG,MAAM;;uGAtJpC,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAX,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA;;2FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ICNW;AAAZ,CAAA,UAAY,iBAAiB,EAAA;AAC3B,IAAA,iBAAA,CAAA,aAAA,CAAA,GAAA,aAA2B;AAC3B,IAAA,iBAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACf,CAAC,EAHW,iBAAiB,KAAjB,iBAAiB,GAG5B,EAAA,CAAA,CAAA;AAGK,MAAO,aAAc,SAAQ,WAAW,CAAA;AAC5C,IAAA,GAAG,CAAC,GAAa,EAAA;AACf,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC;AACtD,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,WAAW,GAAG,iBAAiB,EAAE,GAAG,EAAE,MAAM,CAAC;;AAGzF,IAAA,WAAW,CAAC,IAAsB,EAAA;AAChC,QAAA,OAAO,cAAc,CACnB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,GAAG,yBAAyB,EAAE,IAAI,EAAE;YAC7E,YAAY,EAAE,iBAAiB,CAAC,IAAI;AACpC,YAAA,OAAO,EAAE,UAAU;AACpB,SAAA,CAAC,CACH;;AAGH,IAAA,SAAS,CAAC,IAAyB,EAAA;AACjC,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAG,uBAAuB,EAAE,IAAI,CAAC;;AAG9E,IAAA,UAAU,CAAC,IAAyB,EAAA;AAClC,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAG,wBAAwB,EAAE,IAAI,CAAC;;AAG/E,IAAA,UAAU,CAAC,IAAsB,EAAA;AAC/B,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAG,wBAAwB,EAAE,IAAI,CAAC;;uGAxBpE,aAAa,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAb,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cADA,MAAM,EAAA,CAAA;;2FACnB,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCRrB,YAAY,CAAA;AAChB,IAAA,OAAgB,SAAS,GAAG,WAAW;AACvC,IAAA,OAAgB,aAAa,GAAG,eAAe;AAC/C,IAAA,OAAgB,SAAS,GAAG,UAAU;AACtC,IAAA,OAAgB,SAAS,GAAG,UAAU;AACtC,IAAA,OAAgB,SAAS,GAAG,UAAU;AACtC,IAAA,OAAgB,MAAM,GAAG,OAAO;AAChC,IAAA,OAAgB,QAAQ,GAAG,SAAS;AACpC,IAAA,OAAgB,QAAQ,GAAG,SAAS;IAEpC,OAAO,SAAS,CAAC,QAAqB,EAAA;AAC3C,QAAA,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AACpE,QAAA,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;QAC/E,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;;IAG1C,OAAO,YAAY,CAAC,KAAa,EAAA;QACtC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC;AACtD,QAAA,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC;;IAG3B,OAAO,aAAa,CAAC,KAAa,EAAA;AACxC,QAAA,MAAM,QAAQ,GAAQ,SAAS,CAAC,KAAK,CAAC;AAEtC,QAAA,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACzE,QAAA,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACzE,QAAA,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACnE,QAAA,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACvE,QAAA,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;;IAGlE,OAAO,YAAY,CAAC,KAAY,EAAA;AACrC,QAAA,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;;AAGjE,IAAA,OAAO,WAAW,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;;AAGrE,IAAA,OAAO,WAAW,GAAA;QACvB,OAAO,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;;AAGjD,IAAA,OAAO,eAAe,GAAA;QAC3B,OAAO,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;;AAGjD,IAAA,OAAO,QAAQ,GAAA;QACpB,OAAO,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;;AAG9C,IAAA,OAAO,UAAU,GAAA;QACtB,OAAO,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAGhD,IAAA,OAAO,UAAU,GAAA;QACtB,OAAO,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAGhD,IAAA,OAAO,QAAQ,GAAA;QACpB,OAAO,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;;AAGjD,IAAA,OAAO,WAAW,GAAA;QACvB,OAAO,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;;AAGrD,IAAA,OAAO,UAAU,GAAA;AACtB,QAAA,OAAO,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI;;AAGzD,IAAA,OAAO,UAAU,GAAA;AACtB,QAAA,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC/B,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;QAClD,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC;QACtD,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;QAClD,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;QAClD,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;QAClD,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/C,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;QACjD,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;;;;ACrExC,MAAAA,MAAI,GAAG;AAClB,IAAA,KAAK,EAAE,iBAAiB;AACxB,IAAA,QAAQ,EAAE,oBAAoB;AAC9B,IAAA,QAAQ,EAAE,oBAAoB;AAC9B,IAAA,cAAc,EAAE,0BAA0B;AAC1C,IAAA,OAAO,EAAE,mBAAmB;AAC5B,IAAA,cAAc,EAAE,0BAA0B;;AAMtC,MAAO,WAAY,SAAQ,WAAW,CAAA;AAC1C,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,IAAA,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC;AAC3B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAEpC;;AAE2C;IAE3C,QAAQ,GAAA;AACN,QAAA,OAAO,YAAY,CAAC,QAAQ,EAAE;;AAGhC,IAAA,MAAM,YAAY,GAAA;AAChB,QAAA,MAAM,YAAY,GAAG,YAAY,CAAC,WAAW,EAAE;AAC/C,QAAA,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO,IAAI;AAE9B,QAAA,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE;AAElC,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AAEzC,YAAA,IAAI,GAAG,EAAE,SAAS,EAAE;AAClB,gBAAA,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AACnC,gBAAA,OAAO,GAAG;;;QAEZ,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;;AAGpB,QAAA,OAAO,IAAI;;IAGb,MAAM,YAAY,CAAC,IAAS,EAAA;AAC1B,QAAA,OAAO,cAAc,CACnB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAc,UAAU,CAAC,WAAW,GAAG,wBAAwB,EAAE,IAAI,EAAE;YACzF,OAAO,EAAE,IAAI,WAAW,EAAE,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC;AACnE,SAAA,CAAC,CACH;;AAGH;;AAE2C;IAE3C,MAAM,OAAO,CAAC,QAAgB,EAAE,QAAgB,EAAE,KAAa,EAAE,SAAiB,EAAA;AAChF,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,GAAG;AACX,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,KAAK,EAAE,KAAK;aACb;YAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AAEvC,YAAA,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE;AAClB,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAChE,gBAAA,OAAO,KAAK;;AAGd,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,sBAAsB,CAAC;AAEhD,YAAA,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC;YAE3B,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC;;AAGtC,YAAA,OAAO,IAAI;;QACX,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC;AACjC,YAAA,OAAO,KAAK;;;IAIhB,MAAM,UAAU,CAAC,IAAS,EAAA;AACxB,QAAA,OAAO,cAAc,CACnB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAc,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,KAAK,EAAE,IAAI,EAAE;YAC3E,OAAO,EAAE,IAAI,WAAW,EAAE,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC;AACnE,SAAA,CAAC,CACH;;AAGH;;AAE2C;IAE3C,QAAQ,GAAA;QACN,YAAY,CAAC,UAAU,EAAE;QAEzB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG;;;;QAMvD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC;;AAGlC;;AAE2C;AAE3C,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;YAExE,OAAO,GAAG,EAAE,SAAS;;AACrB,QAAA,MAAM;AACN,YAAA,OAAO,KAAK;;;AAIhB;;AAE2C;AAE3C,IAAA,WAAW,CAAC,YAAoB,EAAA;AAC9B,QAAA,IAAI,IAAI,GAAa;AACnB,YAAA,GAAG,EAAE,CAAsB,oBAAA,CAAA;YAC3B,MAAM,EAAE,CAAC,YAAY,CAAC;SACvB;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;;IAG3B,iBAAiB,GAAA;AACf,QAAA,IAAI,IAAI,GAAa;AACnB,YAAA,GAAG,EAAE,CAA4B,0BAAA,CAAA;SAClC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;;IAG3B,MAAM,aAAa,CAAC,GAAW,EAAA;AAC7B,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7B,gBAAA,GAAG,EAAE,CAAwB,sBAAA,CAAA;gBAC7B,MAAM,EAAE,CAAC,GAAG,CAAC;AACd,aAAA,CAAC;YAEF,OAAO,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG;;QACvC,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC;AACnC,YAAA,OAAO,IAAI;;;AAIf;;AAE2C;AAE3C,IAAA,cAAc,CAAC,IAAS,EAAA;AACtB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,cAAc,EAAE,IAAI,CAAC;;AAG1E,IAAA,OAAO,CAAC,IAAS,EAAA;AACf,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,OAAO,EAAE,IAAI,CAAC;;AAGnE;;AAE2C;IAE3C,MAAM,MAAM,CAAC,CAAM,EAAA;AACjB,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAEpC,YAAA,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE;gBAClB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;gBACxC;;AAGF,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,oBAAoB,CAAC;AAE9C,YAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC;;QACnC,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;AAClB,YAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC;;;IAIrC,MAAM,UAAU,CAAC,CAAM,EAAA;AACrB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;;AAGjE;;AAE2C;IAE3C,MAAM,SAAS,CAAC,GAAY,EAAA;AAC1B,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC;AAEpD,YAAA,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE;AACnB,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAChE,gBAAA,OAAO,KAAK;;AAGd,YAAA,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAEnC,YAAA,OAAO,IAAI;;QACX,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,GAAG,CAAC;AACtC,YAAA,OAAO,KAAK;;;IAIhB,MAAM,aAAa,CAAC,UAAe,EAAA;AACjC,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC;AAE9D,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,cAAc,EAAE,MAAM,CAAC;;IAG9E,OAAO,YAAY;AACnB,IAAA,aAAa,CAAC,YAAqB,EAAA;AACjC,QAAA,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;YAC7B,IAAI,CAAC,YAAY,IAAI,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE;AACjD,gBAAA,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI;;AAE9B,YAAA,WAAW,CAAC,YAAY,GAAG,WAAW,CAAC,MAAK;AAC1C,gBAAA,IAAI,YAAY,CAAC,QAAQ,EAAE,EAAE;oBAC3B,IAAI,CAAC,QAAQ,EAAE;;aAElB,EAAE,YAAY,CAAC;;;uGAjOT,WAAW,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAX,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA;;2FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;AC1BD;MAyBa,gBAAgB,GAAG,IAAI,cAAc,CAAkC,kBAAkB;AAEtG;;AAEG;AACG,SAAU,eAAe,CAC7B,IAAoC,EACpC,KAAsC,EACtC,QAAmB,EACnB,MAAwD,EACxD,IAA6B,EAAA;AAE7B,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,KAAK;AAEvB,IAAA,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC;IAC5C,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAAE,QAAA,OAAO,IAAI;IAErF,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK;IAEpE,MAAM,MAAM,GAAG,CAAA,EAAG,MAAM,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE;IAC9C,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAE/E,IAAA,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK;AAEjD,IAAA,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAI;AAC1C,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC;;QAG9B,IAAI,CAAC,MAAM,EAAE;;;AAGX,YAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC7B,gBAAA,OAAO,CAAC,KAAK,CACX,sDAAsD,QAAQ,CAAA,mFAAA,CAAqF,CACpJ;AACD,gBAAA,OAAO,KAAK;;;AAId,YAAA,OAAO,IAAI;;;AAIb,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;YACtB,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;;;AAI5B,QAAA,OAAO,IAAI;AACb,KAAC,CAAC;AACJ;AACA;;;AAGG;AACa,SAAA,SAAS,CAAC,IAAoC,EAAE,YAAoB,EAAA;AAClF,IAAA,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,KAAK;IACtC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;AAC1C;;gCC5Ea,iBAAiB,CAAA;AAC5B,IAAA,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC;AAEnB,IAAA,YAAY,GAAG,IAAI,eAAe,CAAqB,IAAI,CAAC;;AAGnD,IAAA,QAAQ,GAAG,MAAM,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE;AAE9E,IAAA,cAAc,CAAC,IAAiB,EAAA;AAC9B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;AAG9B,IAAA,MAAM,iBAAiB,GAAA;;AAErB,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;AAExC,QAAA,IAAI;AACF,YAAA,IAAI,IAAI,GAAa;AACnB,gBAAA,GAAG,EAAE,8BAA8B;aACpC;YAED,IAAI,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YAElC,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE;;AAEpC,gBAAA,MAAM,kBAAkB,GAAG,CAAC,GAA8B,KAAc;AACtE,oBAAA,IAAI,CAAC,GAAG;AAAE,wBAAA,OAAO,EAAE;AACnB,oBAAA,OAAO;yBACJ,KAAK,CAAC,GAAG;AACT,yBAAA,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;AAC1B,yBAAA,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACvC,iBAAC;AAED,gBAAA,IAAI,IAAI,GAAgB;AACtB,oBAAA,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE;AACzB,oBAAA,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE;oBACjC,KAAK,EAAE,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;oBACzC,WAAW,EAAE,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;iBACtD;AAED,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AACzB,gBAAA,OAAO,IAAI;;iBACN;AACL,gBAAA,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC;AACvD,gBAAA,OAAO,KAAK;;;QAEd,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC;YACnD,OAAO,KAAK,CAAC;;;AAIjB,IAAA,SAAS,CACP,QAAmB,EACnB,MAAwD,EACxD,IAA6B,EAAA;AAE7B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;AAC3C,QAAA,IAAI,CAAC,WAAW;AAAE,YAAA,OAAO,KAAK;;AAG9B,QAAA,OAAO,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC;;AAG5E,IAAA,OAAO,CAAC,YAAoB,EAAA;QAC1B,OAAO,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC;;uGAjE9C,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cADJ,MAAM,EAAA,CAAA;;2FACnBC,mBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCGrB,SAAS,CAAA;AACpB,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,IAAA,iBAAiB,GAAG,MAAM,CAACA,mBAAiB,CAAC;AAE7C,IAAA,MAAM,WAAW,CAAC,KAA6B,EAAE,KAA0B,EAAA;;QAGzE,IAAI,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE;AACrC,YAAA,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,EAAE;AAC1C,YAAA,OAAO,IAAI;;QAGb,YAAY,CAAC,UAAU,EAAE;AAEzB,QAAA,IAAI,KAAK,CAAC,GAAG,IAAI,GAAG,EAAE;YACpB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;gBACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC;;iBACtE;gBACL,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;;;aAE9B;YACL,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC;;AAElC,QAAA,OAAO,KAAK;;uGAxBH,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAT,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,SAAS,cAFR,MAAM,EAAA,CAAA;;2FAEP,SAAS,EAAA,UAAA,EAAA,CAAA;kBAHrB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCDY,cAAc,CAAA;AACjB,IAAA,OAAO,YAAY,GAAU,EAAE;AAC/B,IAAA,cAAc,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;IAEpD,MAAM,GAAA;QACZ,MAAM,SAAS,GAAG,cAAc,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;AACxD,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;;IAGrC,SAAS,GAAA;AACP,QAAA,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,EAAE;;IAGf,WAAW,GAAA;AACT,QAAA,cAAc,CAAC,YAAY,CAAC,GAAG,EAAE;QACjC,IAAI,CAAC,MAAM,EAAE;;;AAIf,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC,IAAI,CAC5C,SAAS,CAAC,CAAC,OAAO,KAAI;AACpB,YAAA,OAAO,EAAE,CAAC,OAAO,CAAC;AACpB,SAAC,CAAC,EACF,oBAAoB,EAAE,CACvB;;;AAIH,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,cAAc,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;;uGA/BpC,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAd,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA;;2FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACID,IAAI,gBAAgB,GAAkB,IAAI;AAC1C,IAAI,YAAY,GAAG,KAAK;AACxB,MAAM,mBAAmB,GAAG,IAAI,eAAe,CAAgB,IAAI,CAAC;AAEpD,SAAA,eAAe,CAAC,GAAyB,EAAE,IAAmB,EAAA;AAC5E,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAC7B,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AAC7C,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACvC,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAE1C,IAAA,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,EAAE;IACzC,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAExD,IAAI,aAAa,KAAK,GAAG;QAAE,cAAc,CAAC,SAAS,EAAE;;IAGrD,IAAI,EAAE,GAAG,CAAC,IAAI,YAAY,QAAQ,CAAC,EAAE;QACnC,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5C,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE;YACxB,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;;;;IAKtC,IAAI,SAAS,EAAE;AACb,QAAA,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;AACd,YAAA,UAAU,EAAE,EAAE,aAAa,EAAE,CAAU,OAAA,EAAA,SAAS,EAAE,EAAE;AACrD,SAAA,CAAC;;AAGJ,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CACnB,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE;AACxB,YAAA,OAAO,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC;;AAE7D,QAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;AAChC,KAAC,CAAC,EACF,QAAQ,CAAC,MAAK;QACZ,IAAI,aAAa,KAAK,GAAG;YAAE,cAAc,CAAC,WAAW,EAAE;KACxD,CAAC,CACH;AACH;AAEA;AACA;AACA;AACA,SAAS,SAAS,CAChB,GAAqB,EACrB,IAAmB,EACnB,MAAc,EACd,WAAwB,EACxB,SAA2B,EAAA;IAE3B,IAAI,CAAC,YAAY,EAAE;QACjB,YAAY,GAAG,IAAI;AACnB,QAAA,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;AAE9B,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAC1CC,WAAS,CAAC,CAAC,MAAW,KAAI;YACxB,MAAM,GAAG,GAAG,MAAqB;YACjC,YAAY,GAAG,KAAK;AAEpB,YAAA,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE;gBACnB,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG;gBAElD,IAAI,CAAC,gBAAgB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;oBACzD,gBAAgB,GAAG,UAAU;;AAG/B,gBAAA,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,EAAE;AAC1B,oBAAA,WAAW,EAAE,EAAE,SAAS,EAAE,gBAAgB,IAAI,GAAG,EAAE;AACpD,iBAAA,CAAC;gBAEF,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAEpE,gBAAA,OAAO,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC;;;YAI/E,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;;AAGjD,YAAA,OAAO,IAAI,CACT,GAAG,CAAC,KAAK,CAAC;gBACR,UAAU,EAAE,EAAE,aAAa,EAAE,CAAA,OAAA,EAAU,YAAY,CAAC,QAAQ,EAAE,CAAA,CAAE,EAAE;AACnE,aAAA,CAAC,CACH;AACH,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,GAAG,KAAI;YACjB,YAAY,GAAG,KAAK;YACpB,YAAY,CAAC,UAAU,EAAE;YACzB,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG;YAElD,IAAI,CAAC,gBAAgB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;gBACzD,gBAAgB,GAAG,UAAU;;AAG/B,YAAA,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,EAAE;AAC1B,gBAAA,WAAW,EAAE,EAAE,SAAS,EAAE,gBAAgB,IAAI,GAAG,EAAE;AACpD,aAAA,CAAC;AAEF,YAAA,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC;SAC7B,CAAC,CACH;;SACI;;QAEL,OAAO,mBAAmB,CAAC,IAAI,CAC7B,IAAI,CAAC,CAAC,CAAC,EACPA,WAAS,CAAC,CAAC,KAAK,KACd,IAAI,CACF,GAAG,CAAC,KAAK,CAAC;AACR,YAAA,UAAU,EAAE,EAAE,aAAa,EAAE,CAAU,OAAA,EAAA,KAAK,EAAE,EAAE;AACjD,SAAA,CAAC,CACH,CACF,EACD,UAAU,CAAC,CAAC,GAAG,KAAK,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAC3C;;AAEL;AAEA,SAAS,kBAAkB,CAAC,GAAQ,EAAA;AAClC,IAAA,IAAI,GAAG,YAAY,IAAI,EAAE;AACvB,QAAA,OAAO,UAAU,CAAC,GAAG,CAAC;;AAGxB,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AACtB,QAAA,OAAO,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC;;IAGpC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE;QAC3C,MAAM,MAAM,GAAQ,EAAE;QACtB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AAClC,YAAA,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC;AAEtB,YAAA,IAAI,KAAK,YAAY,IAAI,EAAE;gBACzB,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;;iBAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE;AACxD,gBAAA,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;;AACpC,iBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBACpC,MAAM,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC;;iBAClC;AACL,gBAAA,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK;;;AAGvB,QAAA,OAAO,MAAM;;AAGf,IAAA,OAAO,GAAG;AACZ;AAEA,SAAS,SAAS,CAAC,GAAW,EAAA;;AAE5B,IAAA,OAAO,qEAAqE,CAAC,IAAI,CAAC,GAAG,CAAC;AACxF;AAEA,SAAS,UAAU,CAAC,IAAU,EAAA;AAC5B,IAAA,MAAM,GAAG,GAAG,CAAC,CAAS,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;IACxD,QACE,CAAG,EAAA,IAAI,CAAC,WAAW,EAAE,CAAI,CAAA,EAAA,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAG,CAAA,CAAA;QAC3E,CAAG,EAAA,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAI,CAAA,EAAA,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAE,CAAA;AAEjF;;MCjKa,mBAAmB,CAAA;AAC9B,IAAA,aAAa,CAAC,SAAiC,EAAA;AAC7C,QAAA,OAAO,SAAS,CAAC,aAAa,GAAG,SAAS,CAAC,aAAa,EAAE,GAAG,IAAI;;uGAFxD,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA;;2FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCGY,qBAAqB,CAAA;AACzB,IAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;AACrB,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AAEhC,IAAA,SAAS;AACT,IAAA,YAAY;AACZ,IAAA,cAAc;AAEf,IAAA,OAAO,QAAQ,GAAG,EAAE;IACV,cAAc,GAAG,GAAG;AAErC,IAAA,IAAY,SAAS,GAAA;QACnB,OAAO,CAAC,qBAAqB,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI;;IAGzC,UAAU,GAAG,oBAAoB;IACjC,aAAa,GAAG,uBAAuB;IACvC,YAAY,GAAG,mBAAmB;IAElC,aAAa,GAAG,mBAAmB;IACnC,WAAW,GAAG,iBAAiB;IAC/B,YAAY,GAAG,kBAAkB;IACjC,cAAc,GAAG,oBAAoB;IACrC,mBAAmB,GAAG,yBAAyB;IAExD,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;IAElC,QAAQ,GAAG,KAAK;IAChB,WAAW,GAAG,KAAK;IAEnB,OAAO,GAA4B,IAAI;;IAI/C,KAAK,GAAA;QACH,OAAO,CAAC,GAAG,CAAC,6CAA6C,GAAG,qBAAqB,CAAC,QAAQ,GAAG,OAAO,CAAC;AAErG,QAAA,IAAI,kBAAkB,IAAI,MAAM,EAAE;YAChC,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,aAAa,CAAC;YAClD,IAAI,CAAC,aAAa,EAAE;;AAGtB,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC;YAAE;QAEzB,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,SAAS,EAAE;QAEhB,IAAI,CAAC,WAAW,EAAE;;;;;;;IASpB,MAAM,KAAK,CAAC,QAAgB,EAAE,QAAgB,EAAE,KAAa,EAAE,SAAiB,EAAA;AAC9E,QAAA,IAAI,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC;QAC9E,IAAI,GAAG,EAAE;AACP,YAAA,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC;AACtD,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;;;IAIpC,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC;;;IAK3B,cAAc,GAAA;QACpB,MAAM,MAAM,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC;AAE1D,QAAA,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;YACnB,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;AACnD,SAAC,CAAC;;AAGI,IAAA,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAK;QACtC,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,SAAS,EAAE;AAEhB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC;KACpC,EAAE,IAAI,CAAC;IAEA,cAAc,GAAA;AACpB,QAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;;;IAKxD,SAAS,GAAA;AACf,QAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AAE5B,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;AAC1E,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnD,QAAA,IAAI,MAAM,IAAI,CAAC,EAAE;AACf,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;YAC3B;;AAGF,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;AAC/B,YAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAK;AAC/B,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;aACjD,EAAE,MAAM,CAAC;AACZ,SAAC,CAAC;;;IAKI,WAAW,GAAA;QACjB,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QAEpD,IAAI,CAAC,MAAM,EAAE;YACX,IAAI,CAAC,YAAY,EAAE;YACnB;;QAGF,IAAI,CAAC,oBAAoB,EAAE;;IAGrB,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AAEpB,QAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAEtD,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,eAAe,EAAE;;IAGhB,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,MAAK;AACrC,YAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;SAChE,EAAE,IAAI,CAAC;;IAGF,oBAAoB,GAAA;QAC1B,UAAU,CAAC,MAAK;AACd,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAElE,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE;gBAC5B,IAAI,CAAC,YAAY,EAAE;;SAEtB,EAAE,IAAI,CAAC;;;IAKF,eAAe,GAAA;QACrB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AAEpB,QAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;QAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;AAEzC,QAAA,IAAI,CAAC,KAAK;YAAE;AAEZ,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI;AAE3C,QAAA,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,GAAG,IAAI;AAE3D,QAAA,IAAI,KAAK,IAAI,CAAC,EAAE;YACd,IAAI,CAAC,YAAY,EAAE;YACnB;;AAGF,QAAA,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAK;YAClC,IAAI,CAAC,YAAY,EAAE;SACpB,EAAE,KAAK,CAAC;;AAGH,IAAA,MAAM,YAAY,GAAA;AACxB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW;YAAE;AAExC,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AAEvB,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;AAEjD,YAAA,IAAI,GAAG,EAAE,SAAS,EAAE;AAClB,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC;gBAExC,IAAI,CAAC,eAAe,EAAE;;iBACjB;gBACL,IAAI,CAAC,MAAM,EAAE;;;AAEf,QAAA,MAAM;YACN,IAAI,CAAC,MAAM,EAAE;;gBACL;AACR,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;;;;IAMpB,aAAa,GAAA;QACnB,OAAO,CAAC,GAAG,CAAC,wCAAwC,EAAE,IAAI,CAAC,OAAO,CAAC;QAEnE,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;QAEnB,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,GAAG,KAAI;AAC/B,YAAA,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI;AAE3B,YAAA,IAAI,IAAI,KAAK,IAAI,CAAC,cAAc,EAAE;gBAChC,IAAI,CAAC,SAAS,EAAE;;AAGlB,YAAA,IAAI,IAAI,KAAK,IAAI,CAAC,YAAY,EAAE;gBAC9B,QAAQ,CAAC,MAAM,EAAE;;AAGnB,YAAA,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE;gBAC7B,QAAQ,CAAC,MAAM,EAAE;;AAGnB,YAAA,IAAI,IAAI,KAAK,IAAI,CAAC,mBAAmB,EAAE;gBACrC,IAAI,CAAC,eAAe,EAAE;;AAE1B,SAAC;;AAGK,IAAA,SAAS,CAAC,IAAY,EAAA;AAC5B,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC;;aAC7B;YACL,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;;;;IAM7E,QAAQ,CAAC,EAAY,EAAE,KAAa,EAAA;AAC1C,QAAA,IAAI,KAAU;AAEd,QAAA,OAAO,MAAK;YACV,YAAY,CAAC,KAAK,CAAC;YAEnB,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC;AACvC,SAAC;;AAGK,IAAA,QAAQ,CAAC,KAAa,EAAA;QAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAEnC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;;uGAvPvB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAArB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cAFpB,MAAM,EAAA,CAAA;;2FAEP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCPY,kBAAkB,CAAA;AACT,IAAA,KAAA;AAApB,IAAA,WAAA,CAAoB,KAAqB,EAAA;QAArB,IAAK,CAAA,KAAA,GAAL,KAAK;;AAEzB,IAAA,MAAM,CAAa,OAA2B,EAAA;AAC5C,QAAA,MAAM,cAAc,GAAgC;AAClD,YAAA,cAAc,EAAE,KAAK;AACrB,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,WAAW,EAAE;AACX,gBAAA,YAAY,EAAE,qBAAqB;AACnC,gBAAA,QAAQ,EAAE,MAAM;AACjB,aAAA;SACF;AAED,QAAA,MAAM,aAAa,GAAuB;AACxC,YAAA,GAAG,cAAc;AACjB,YAAA,GAAG,OAAO;AACV,YAAA,OAAO,EAAE;gBACP,GAAG,cAAc,CAAC,OAAO;gBACzB,GAAG,OAAO,CAAC,OAAO;AACnB,aAAA;SACF;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC;;AAGzC,IAAA,OAAO,CAAC,OAAqB,EAAA;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;;AAGpC,IAAA,IAAI,CAAC,OAAqB,EAAA;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;;AAGjC,IAAA,OAAO,CAAC,OAAqB,EAAA;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;;AAGpC,IAAA,OAAO,CAAC,OAAqB,EAAA;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;;AAGpC,IAAA,KAAK,CAAC,OAAqB,EAAA;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;;uGA1CvB,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cADL,MAAM,EAAA,CAAA;;2FACnB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCSrB,aAAa,CAAA;IACd,UAAU,GAAG,UAAU;IAEvB,YAAY,GAAG,YAAY;AAE3B,IAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAE3B,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,IAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACpC,IAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAEpC,IAAA,QAAQ;IAEhB,OAAO,GAAG,EAAE;AAEZ;;AAEG;AACO,IAAA,aAAa,CAAC,QAA+B,EAAA;AACrD,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;AACzB,aAAA,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAyB,CAAC,YAAY,aAAa,CAAC;AAClE,aAAA,SAAS,CAAC,CAAC,CAAgB,KAAI;AAC9B,YAAA,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC;AAC/B,SAAC,CAAC;;IAGI,gBAAgB,GAAA;AACxB,QAAA,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE;;IAGpB,MAAM,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;;aAClB;AACL,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;;;AAId,IAAA,IAAI,CAAC,GAAY,EAAE,QAAQ,GAAG,KAAK,EAAA;AAC3C,QAAA,IAAI,CAAC,GAAG;YAAE;QAEV,IAAI,QAAQ,EAAE;AACZ,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;;aACrB;AACL,YAAA,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACvB,gBAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC;;iBACzB;AACL,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;;;AAK7D;;AAEG;AACO,IAAA,WAAW,CAAC,SAAiB,EAAA;AACrC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;;AAGxD,QAAA,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,IAAI,KAAK,IAAI,UAAU,IAAI,UAAU,EAAE;AACxE,YAAA,OAAO,IAAI;;AAEb,QAAA,OAAO,UAAU;;AAGnB;;AAEG;AACO,IAAA,gBAAgB,CAAC,cAAsB,EAAA;AAC/C,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC;AAC7E,QAAA,OAAO,eAAe;;AAGxB;;AAEG;AACO,IAAA,UAAU,CAAC,GAAW,EAAA;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;;IAG5B,aAAa,CAAC,IAAY,EAAE,KAAa,EAAA;AACjD,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE;YACvB,UAAU,EAAE,IAAI,CAAC,KAAK;AACtB,YAAA,WAAW,EAAE;gBACX,CAAC,IAAI,GAAG,KAAK;AACd,aAAA;AACD,YAAA,mBAAmB,EAAE,OAAO;AAC7B,SAAA,CAAC;;AAGJ,IAAA,IAAc,GAAG,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG;;AAGxB,IAAA,IAAc,OAAO,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAG5B,IAAA,WAAW,CAAC,GAAQ,EAAA;AAC5B,QAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC;;AAGzB,IAAA,aAAa,CAAC,QAAmB,EAAA;AACzC,QAAA,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;AACnD,YAAA,IAAI,OAAO,CAAC,OAAO,EAAE;gBACnB,OAAO,CAAC,WAAW,EAAE;gBACrB,OAAO,CAAC,sBAAsB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;AAEtD,SAAC,CAAC;QAEF,QAAQ,CAAC,sBAAsB,EAAE;AAEjC,QAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;;AAGpB,IAAA,eAAe,CAAC,QAAmB,EAAA;QAC3C,QAAQ,CAAC,cAAc,EAAE;QACzB,QAAQ,CAAC,eAAe,EAAE;QAC1B,QAAQ,CAAC,sBAAsB,EAAE;;AAG3B,IAAA,aAAa,CAAC,IAAe,EAAE,SAAA,GAAoB,EAAE,EAAA;AAC3D,QAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;YACzC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7B,YAAA,MAAM,SAAS,GAAG,SAAS,GAAG,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,GAAG,CAAE,CAAA,GAAG,GAAG;AAEzD,YAAA,IAAI,OAAO,YAAY,SAAS,EAAE;AAChC,gBAAA,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC;;iBACjC;AACL,gBAAA,IAAI,OAAO,EAAE,MAAM,EAAE;oBACnB,OAAO,CAAC,GAAG,CAAC,CAAY,SAAA,EAAA,SAAS,CAAE,CAAA,EAAE,OAAO,CAAC,MAAM,CAAC;;;AAG1D,SAAC,CAAC;;AAGM,IAAA,OAAO,CAAC,KAAa,EAAE,OAAA,GAAkB,EAAE,EAAA;AACnD,QAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC7B,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;;AAEjB,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,SAAS,EAAE,OAAO;AAClB,gBAAA,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACzD,gBAAA,QAAQ,EAAE,SAAS;AACnB,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;AAC3B,gBAAA,WAAW,EAAE,IAAI;AACjB,gBAAA,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;AAC9D,gBAAA,UAAU,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC;AACjC,aAAA,CAAC;AACJ,SAAC,CAAC;;IAGM,SAAS,GAAA;;QAEjB,MAAM,CAAC,QAAQ,CAAC;AACd,YAAA,GAAG,EAAE,CAAC;AACN,YAAA,QAAQ,EAAE,QAAQ;AACnB,SAAA,CAAC;QAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC;QACpD,IAAI,OAAO,EAAE;YACX,OAAO,CAAC,QAAQ,CAAC;AACf,gBAAA,GAAG,EAAE,CAAC;AACN,gBAAA,QAAQ,EAAE,QAAQ;AACnB,aAAA,CAAC;;;uGAxKK,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,wEADH,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FACZ,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB,SAAS;mBAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;;;ACHrB,MAAO,wBAAyB,SAAQ,aAAa,CAAA;IACjD,WAAW,GAAgB,EAAE;AAErC,IAAA,aAAa,CAAC,QAAmB,EAAA;AAC/B,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;;IAGjC,iBAAiB,GAAG,KAAK;IACzB,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;;AAI/B,IAAA,kBAAkB,CAAC,MAAW,EAAA;QAC5B,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,iBAAiB,EAAE;YACpE,MAAM,CAAC,cAAc,EAAE;AACvB,YAAA,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;;;AAI9B,IAAA,MAAM,aAAa,GAAA;QACjB,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,iBAAiB,EAAE;YACpE,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,iBAAiB,CAAC;;AAGxD,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC;AACxB,kBAAE,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;gBACpB,IAAI,CAAC,IAAI,CAAC,KAAK;oBAAE,OAAO,IAAI,CAAC;;gBAG7B,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;gBAExF,OAAO;oBACL,SAAS,EAAE,KAAK;AAChB,oBAAA,MAAM,EAAE,WAAW;iBACpB;AACH,aAAC;AACA,iBAAA,MAAM,CAAC,OAAO,CAAC,CAAC;AAEnB,YAAA,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC;;AAG1C,YAAA,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,8DAA8D,CAAC;;AAE3F,QAAA,OAAO,IAAI;;IAGb,WAAW,GAAA;QACT,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,KAAI;YAC9B,CAAC,EAAE,cAAc,EAAE;YACnB,CAAC,EAAE,eAAe,EAAE;YACpB,CAAC,EAAE,sBAAsB,EAAE;AAC7B,SAAC,CAAC;AACF,QAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;;uGArDrB,wBAAwB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,6KAFzB,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAED,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAHpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,EAAE;AACb,iBAAA;8BAcC,kBAAkB,EAAA,CAAA;sBADjB,YAAY;uBAAC,qBAAqB,EAAE,CAAC,QAAQ,CAAC;;;ACZ3C,MAAO,oBAAqB,SAAQ,aAAa,CAAA;;IAErD,UAAU,GAAW,CAAC;IACtB,WAAW,GAAG,GAAG;AACT,IAAA,UAAU;AAElB,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,IAAA,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAE9B,IAAA,WAAW,CAAC,QAAa,EAAE,MAAwB,EAAE,KAAK,GAAG,CAAC,EAAA;AAC5D,QAAA,MAAM,MAAM,GAAgB,QAAQ,EAAE,UAAU,EAAE,aAAa,IAAI,QAAQ,EAAE,aAAa,IAAI,QAAQ;AAEtG,QAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;AAE7B,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;;AAG3B,QAAA,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;AAEhE,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC3B,aAAA,QAAQ;aACR,mBAAmB,CAAC,MAAM;AAC1B,aAAA,aAAa,CAAC;AACb,YAAA;AACE,gBAAA,OAAO,EAAE,OAAO;AAChB,gBAAA,OAAO,EAAE,QAAQ;AACjB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,QAAQ,EAAE,KAAK;AACf,gBAAA,OAAO,EAAE,CAAC;AACX,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,OAAO;AAChB,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,CAAC,CAAC;AACZ,aAAA;SACF;aACA,kBAAkB,CAAC,CAAC,CAAC;QAExB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACpC,gBAAgB;AAChB,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,aAAa,EAAE,kCAAkC;YACjD,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE;AAC1D,YAAA,KAAK;AACN,SAAA,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,MAAK;AAC7C,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;AAC1B,SAAC,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC;AACnD,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;AAE9B,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc;;AAGrD,QAAA,SAAS,CAAa,QAAQ,EAAE,OAAO;AACpC,aAAA,IAAI,CACHC,QAAM,CAAC,CAAC,KAAK,KAAI;AACf,YAAA,MAAM,WAAW,GAAG,KAAK,CAAC,MAAqB;YAE/C,QACE,IAAI,CAAC,UAAU;AACf,gBAAA,CAAC,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC;AACrC,gBAAA,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;AAC7B,gBAAA,CAAC,WAAW,CAAC,OAAO,CAAC,sBAAsB,CAAC;AAC5C,gBAAA,CAAC,WAAW,CAAC,OAAO,CAAC,kBAAkB,CAAC;AACxC,gBAAA,CAAC,WAAW,CAAC,OAAO,CAAC,iCAAiC,CAAC;AACvD,gBAAA,CAAC,WAAW,CAAC,OAAO,CAAC,0BAA0B,CAAC;SAEnD,CAAC,EACF,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;aAEzC,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE;AAC3B,SAAC,CAAC;;AAGN,IAAA,gBAAgB,CAAC,OAAoB,EAAA;QACnC,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,WAAW,IAAI,CAAC;;AAG9C;;AC7EK,MAAO,UAAW,SAAQ,aAAa,CAAA;IAC3C,UAAU,GAAG,UAAU;AAEf,IAAA,OAAO,cAAc,GAAkB,EAAE;AAC1C,IAAA,WAAW,aAAa,GAAA;QAC7B,OAAO,UAAU,CAAC,cAAc;;IAE3B,WAAW,aAAa,CAAC,GAAkB,EAAA;QAChD,UAAU,CAAC,MAAK;AACd,YAAA,UAAU,CAAC,cAAc,GAAG,GAAG;SAChC,EAAE,CAAC,CAAC;;AAGA,IAAA,OAAO,KAAK,GAAA;AACjB,QAAA,UAAU,CAAC,aAAa,GAAG,EAAE;;IAG/B,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;;AAGf,IAAA,OAAO,CAAC,IAAiB,EAAA;AACvB,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;;AACd,aAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACrB,IAAI,CAAC,KAAK,EAAE;;;uGAzBL,UAAU,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,EChBvB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,wUAQA,EDMY,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,4XAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAE/B,UAAU,EAAA,UAAA,EAAA,CAAA;kBALtB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAEjB,OAAA,EAAA,CAAC,kBAAkB,EAAE,YAAY,CAAC,EAAA,QAAA,EAAA,wUAAA,EAAA;;;MEPhC,sBAAsB,CAAA;IACxB,QAAQ,GAAW,CAAC;IACpB,KAAK,GAAW,CAAC;IACjB,KAAK,GAAW,CAAC;AACE,IAAA,aAAa;IAEjC,YAAY,GAAW,CAAC;IAEhC,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;;AAGtB,QAAA,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE;AAClC,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC;;;AAItF,IAAA,WAAW,CAAC,UAAkB,EAAE,QAAgB,EAAE,UAAkB,EAAE,OAAmB,EAAA;AACvF,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACf,YAAA,IAAI,CAAC,KAAK,GAAG,EAAE;;AAGjB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC;QACnD,MAAM,cAAc,GAAG,CAAC,QAAQ,GAAG,UAAU,IAAI,SAAS;AAC1D,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,EAAE,GAAG,SAAS;QAE7C,IAAI,eAAe,GAAG,CAAC;AAEvB,QAAA,SAAS,IAAI,GAAA;YACX,eAAe,IAAI,iBAAiB;AACpC,YAAA,UAAU,IAAI,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;AACjE,YAAA,IAAI,OAAO;AAAE,gBAAA,OAAO,CAAC,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AAEjF,YAAA,IAAI,eAAe,GAAG,IAAI,CAAC,EAAE,EAAE;AAC7B,gBAAA,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC;;;AAItC,QAAA,IAAI,EAAE;;IAGR,eAAe,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,IAAI,CAAC,YAAY,EAAE;;;AAIvB,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YACpB,IAAI,CAAC,YAAY,EAAE;YACnB,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK;AAChC,aAAC,EAAE,IAAI,CAAC,QAAQ,CAAC;;;uGArDV,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,iRCPnC,uFAEO,EAAA,MAAA,EAAA,CAAA,kDAAA,CAAA,EAAA,CAAA;;2FDKM,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBALlC,SAAS;+BACE,gBAAgB,EAAA,QAAA,EAAA,uFAAA,EAAA,MAAA,EAAA,CAAA,kDAAA,CAAA,EAAA;8BAKjB,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBAC2B,aAAa,EAAA,CAAA;sBAAxC,SAAS;uBAAC,eAAe;;;MEDf,iBAAiB,CAAA;IACnB,MAAM,GAAW,CAAC;IAClB,EAAE,GAAW,EAAE;AAExB,IAAA,KAAK;AAEL,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC;;IAGlC,QAAQ,GAAA;QACN,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,cAAc,EAAE;SACtB,EAAE,GAAG,CAAC;;IAGT,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;;;IAIxB,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;YACZ;;QAGF,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE;AAC9B,YAAA,IAAI,EAAE,KAAK;AACX,YAAA,IAAI,EAAE;AACJ,gBAAA,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;AAChE,gBAAA,QAAQ,EAAE;AACR,oBAAA;AACE,wBAAA,eAAe,EAAE,wBAAwB;AACzC,wBAAA,WAAW,EAAE,wBAAwB;wBACrC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAC/C,wBAAA,KAAK,EAAE,SAAS;AACjB,qBAAA;AACD,oBAAA;AACE,wBAAA,eAAe,EAAE,wBAAwB;AACzC,wBAAA,WAAW,EAAE,uBAAuB;wBACpC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAC9C,wBAAA,KAAK,EAAE,SAAS;AACjB,qBAAA;AACD,oBAAA;AACE,wBAAA,eAAe,EAAE,wBAAwB;AACzC,wBAAA,WAAW,EAAE,uBAAuB;wBACpC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAC9C,wBAAA,KAAK,EAAE,SAAS;AACjB,qBAAA;AACD,oBAAA;AACE,wBAAA,eAAe,EAAE,yBAAyB;AAC1C,wBAAA,WAAW,EAAE,oBAAoB;wBACjC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;AAC/C,wBAAA,KAAK,EAAE,SAAS;AACjB,qBAAA;AACF,iBAAA;AACF,aAAA;AACD,YAAA,OAAO,EAAE;AACP,gBAAA,QAAQ,EAAE;AACR,oBAAA,IAAI,EAAE;AACJ,wBAAA,OAAO,EAAE,QAAQ;AAClB,qBAAA;AACF,iBAAA;AACD,gBAAA,mBAAmB,EAAE,KAAK;AAC1B,gBAAA,OAAO,EAAE;AACP,oBAAA,MAAM,EAAE;AACN,wBAAA,SAAS,EAAE,KAAK;AACjB,qBAAA;AACF,iBAAA;AACF,aAAA;AACF,SAAA,CAAC;;uGAvEO,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECV9B,iJAGA,EAAA,MAAA,EAAA,CAAA,sNAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDKY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEX,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;+BACE,eAAe,EAAA,OAAA,EAGhB,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,iJAAA,EAAA,MAAA,EAAA,CAAA,sNAAA,CAAA,EAAA;wDAGd,MAAM,EAAA,CAAA;sBAAd;gBACQ,EAAE,EAAA,CAAA;sBAAV;;;MEDU,iBAAiB,CAAA;AACnB,IAAA,QAAQ;AAEjB,IAAA,WAAA,GAAA;AAEA,IAAA,QAAQ;uGALG,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,0GCX9B,+tBAgBA,EAAA,MAAA,EAAA,CAAA,4dAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDPY,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,4NAAE,sBAAsB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEjD,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,WAGf,CAAC,YAAY,EAAE,YAAY,EAAE,sBAAsB,CAAC,EAAA,QAAA,EAAA,+tBAAA,EAAA,MAAA,EAAA,CAAA,4dAAA,CAAA,EAAA;wDAGpD,QAAQ,EAAA,CAAA;sBAAhB;;;MEFU,sBAAsB,CAAA;IACxB,MAAM,GAAW,CAAC;IAClB,EAAE,GAAW,EAAE;AAExB,IAAA,KAAK;AAEL,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC;;IAGlC,QAAQ,GAAA;QACN,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,mBAAmB,EAAE;SAC3B,EAAE,GAAG,CAAC;;IAGT,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;;;AAIxB,IAAA,YAAY,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAA;AAC3B,QAAA,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC;;AAC3D,YAAA,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG;;IAG/C,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;YACZ;;QAGF,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE;AAC9B,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,IAAI,EAAE;gBACJ,MAAM,EAAE,CAAC,OAAO,CAAC;AACjB,gBAAA,QAAQ,EAAE;AACR,oBAAA;wBACE,IAAI,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;AAC1F,wBAAA,eAAe,EAAE;4BACf,uBAAuB;4BACvB,uBAAuB;4BACvB,uBAAuB;4BACvB,uBAAuB;4BACvB,wBAAwB;AACzB,yBAAA;AACF,qBAAA;AACF,iBAAA;AACF,aAAA;AACD,YAAA,OAAO,EAAE;AACP,gBAAA,QAAQ,EAAE;AACR,oBAAA,IAAI,EAAE;AACJ,wBAAA,OAAO,EAAE,QAAQ;AAClB,qBAAA;AACF,iBAAA;AAED,gBAAA,mBAAmB,EAAE,KAAK;AAC1B,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,OAAO,EAAE;AACP,oBAAA,MAAM,EAAE;AACN,wBAAA,SAAS,EAAE,KAAK;AACjB,qBAAA;AACF,iBAAA;AACF,aAAA;AACF,SAAA,CAAC;;uGAhEO,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECVnC,wJAEM,EAAA,MAAA,EAAA,CAAA,4NAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDMM,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEX,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBANlC,SAAS;+BACE,oBAAoB,EAAA,OAAA,EAGrB,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,wJAAA,EAAA,MAAA,EAAA,CAAA,4NAAA,CAAA,EAAA;wDAGd,MAAM,EAAA,CAAA;sBAAd;gBACQ,EAAE,EAAA,CAAA;sBAAV;;;MEFU,kBAAkB,CAAA;IACpB,MAAM,GAAW,CAAC;IAClB,EAAE,GAAW,EAAE;AAExB,IAAA,KAAK;AAEL,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC;;IAGlC,QAAQ,GAAA;QACN,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,eAAe,EAAE;SACvB,EAAE,GAAG,CAAC;;IAGT,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;;;IAIxB,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;YACZ;;QAGF,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE;AAC9B,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,IAAI,EAAE;gBACJ,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;AAC9E,gBAAA,QAAQ,EAAE;AACR,oBAAA;AACE,wBAAA,eAAe,EAAE,0BAA0B;AAC3C,wBAAA,WAAW,EAAE,uBAAuB;wBACpC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;AACnF,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,IAAI,EAAE,OAAO;AACd,qBAAA;AACF,iBAAA;AACF,aAAA;AACD,YAAA,OAAO,EAAE;AACP,gBAAA,QAAQ,EAAE;AACR,oBAAA,IAAI,EAAE;AACJ,wBAAA,OAAO,EAAE,QAAQ;AAClB,qBAAA;AACF,iBAAA;AAED,gBAAA,mBAAmB,EAAE,KAAK;AAC1B,gBAAA,OAAO,EAAE;AACP,oBAAA,MAAM,EAAE;AACN,wBAAA,SAAS,EAAE,KAAK;AACjB,qBAAA;AACF,iBAAA;AACF,aAAA;AACF,SAAA,CAAC;;uGAvDO,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECV/B,6IAEM,EAAA,MAAA,EAAA,CAAA,kNAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDMM,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEX,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAN9B,SAAS;+BACE,gBAAgB,EAAA,OAAA,EAGjB,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,6IAAA,EAAA,MAAA,EAAA,CAAA,kNAAA,CAAA,EAAA;wDAGd,MAAM,EAAA,CAAA;sBAAd;gBACQ,EAAE,EAAA,CAAA;sBAAV;;;MEDU,cAAc,CAAA;IAChB,KAAK,GAAG,EAAE;AAEnB;;AAEG;IACM,SAAS,GAAG,CAAC;IACb,SAAS,GAA2B,IAAI;IAExC,QAAQ,GAAG,KAAK;AAEhB,IAAA,QAAQ;AACR,IAAA,WAAW;AAEpB;;AAEG;IACM,SAAS,GAAoC,SAAS;AAE/D,IAAA,IACI,QAAQ,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE;YAC/B,OAAO,IAAI,CAAC,OAAO;;AAErB,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAE;YAC9B,OAAO,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC;;AAE7B,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAE;YAC9B,OAAO,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,GAAG;;;IAGnC,IAAI,QAAQ,CAAC,GAAQ,EAAA;AACnB,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE;AAC/B,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;AACpE,oBAAA,IAAI,CAAC,OAAO,GAAG,CAAC;AAClB,iBAAC,CAAC;;AACG,iBAAA,IAAI,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAE;AACrC,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;AACpE,oBAAA,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC;AACvB,iBAAC,CAAC;;iBACG;AACL,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;AACpE,oBAAA,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,GAAG;AACzB,iBAAC,CAAC;;;aAEC;AACL,YAAA,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,IAAI,GAAG,KAAK;;;AAG3B,IAAA,cAAc,GAAG,IAAI,YAAY,EAAE;IAE7C,OAAO,GAAG,KAAK;IAEf,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;AACjE,YAAA,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;AAChC,gBAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE;AACrE,gBAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;;AACpB,iBAAA,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE;AACtC,gBAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC;;iBACtE;AACL,gBAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG;;AAG/E,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;AACpE,gBAAA,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;AAChC,oBAAA,IAAI,CAAC,OAAO,GAAG,CAAC;;AACX,qBAAA,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE;AACtC,oBAAA,IAAI,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC;;qBACjB;AACL,oBAAA,IAAI,CAAC,OAAO,GAAG,CAAC,KAAK,GAAG;;AAE5B,aAAC,CAAC;;;AAIN,IAAA,aAAa,CAAC,KAAc,EAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE;AAC/B,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;;AACnD,iBAAA,IAAI,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAE;gBACrC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;;AAC3D,iBAAA,IAAI,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAE;gBACrC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;;;aAEjE;AACL,YAAA,IAAI,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE;AAC/B,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;;AAC1B,iBAAA,IAAI,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAE;AACrC,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;;AAClC,iBAAA,IAAI,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAE;AACrC,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;;;;uGA5FtC,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECX3B,wrBA0BA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDjBY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAE7E,cAAc,EAAA,UAAA,EAAA,CAAA;kBAL1B,SAAS;+BACE,iBAAiB,EAAA,OAAA,EAElB,CAAC,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,YAAY,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAAA,wrBAAA,EAAA;8BAGhF,KAAK,EAAA,CAAA;sBAAb;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBAGG,QAAQ,EAAA,CAAA;sBADX;gBA+BS,cAAc,EAAA,CAAA;sBAAvB;;;ME7DU,cAAc,CAAA;IACzB,OAAO,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3D,OAAO,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAErD,OAAO,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;IAC/C,OAAO,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AAChD,IAAA,OAAO,OAAO,GAAG,KAAK,CAAC,IAAI,CACzB,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,EAC3D,CAAC,CAAC,EAAE,CAAC,KAAK,cAAc,CAAC,MAAM,GAAG,CAAC,CACpC;AAED;;;AAGG;AACH,IAAA,OAAO,GAAG,GAAA;AACR,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;QACtB,OAAO,CAAA,EAAG,GAAG,CAAC,WAAW,EAAE,CAAI,CAAA,EAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAI,CAAA,EAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAI,CAAA,EAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA,CAAE;;AAGlL;;;AAGG;AACH,IAAA,OAAO,KAAK,GAAA;AACV,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;AACtB,QAAA,OAAO,CAAG,EAAA,GAAG,CAAC,WAAW,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA,SAAA,CAAW;;AAGnG;;;;;;;AAOG;IACH,OAAO,UAAU,CAAC,IAAY,EAAE,KAAa,EAAE,GAAW,EAAE,UAAA,GAAsB,KAAK,EAAA;AACrF,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE;AACvC,YAAA,OAAO,IAAI;;QAGb,MAAM,IAAI,GAAG,UAAU,GAAG,EAAE,GAAG,CAAC;QAChC,MAAM,MAAM,GAAG,UAAU,GAAG,EAAE,GAAG,CAAC;QAClC,MAAM,MAAM,GAAG,UAAU,GAAG,EAAE,GAAG,CAAC;AAClC,QAAA,OAAO,GAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;;AAGhH;;;;;;AAMG;AACI,IAAA,OAAO,WAAW,CAAC,IAAY,EAAE,KAAa,EAAE,GAAW,EAAA;AAChE,QAAA,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE;AAAE,YAAA,OAAO,KAAK;QACzC,IAAI,GAAG,GAAG,CAAC;AAAE,YAAA,OAAO,KAAK;AAEzB,QAAA,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACnD,OAAO,GAAG,IAAI,OAAO;;AAGvB;;;;AAIG;IACK,OAAO,GAAG,CAAC,CAAS,EAAA;QAC1B,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;;IAG/B,OAAO,MAAM,CAAC,OAAe,EAAA;AAClC,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,EAAE;AAEvB,QAAA,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE;AACxB,QAAA,IAAI,OAAO,GAAG,OAAO,CAAC;QACtB,IAAI,QAAQ,GAAG,OAAO;;AAGtB,QAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACzB,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;;AAGvC,YAAA,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACzD,YAAA,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAE1D,YAAA,IAAI,OAAO;gBAAE,OAAO,GAAG,OAAO;AAC9B,YAAA,IAAI,OAAO;gBAAE,QAAQ,GAAG,OAAO;;;QAIjC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC3B,YAAA,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC;;QAG9C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;AACjC,QAAA,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE;QAC1B,IAAI,eAAe,GAAG,EAAE;AAExB,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;;AAEpD,YAAA,eAAe,GAAG,CAAG,EAAA,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAI,CAAA,EAAA,OAAO,CAAC,WAAW,EAAE,EAAE;;aAC5H,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;;AAEzF,YAAA,eAAe,GAAG,CAAA,EAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAI,CAAA,EAAA,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,CAAA,EAAI,OAAO,CAAC,WAAW,EAAE,EAAE;;aACjG;;YAEL,eAAe,GAAG,QAAQ;;;QAI5B,IAAI,eAAe,EAAE;YACnB,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC;AAC5C,YAAA,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACzB,YAAA,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3B,YAAA,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;YAE1B,IAAI,KAAK,GAAG,CAAC;YACb,IAAI,OAAO,GAAG,CAAC;AAEf,YAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBACzB,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;gBACpC,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC1B,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;;;YAI9B,IAAI,cAAc,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE;;;AAGhD,gBAAA,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC;;;;;AAOzD,QAAA,OAAO,EAAE;;;IAIH,OAAO,kBAAkB,CAAC,KAAa,EAAA;;AAE7C,QAAA,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;QAEhD,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;QAElC,IAAI,MAAM,GAAG,EAAE;QAEf,IAAI,GAAG,EAAE;YACP,MAAM,IAAI,GAAG;AACb,YAAA,IAAI,KAAK;gBAAE,MAAM,IAAI,GAAG;;QAG1B,IAAI,KAAK,EAAE;YACT,MAAM,IAAI,KAAK;AACf,YAAA,IAAI,IAAI;gBAAE,MAAM,IAAI,GAAG;;QAGzB,IAAI,IAAI,EAAE;YACR,MAAM,IAAI,IAAI;;AAGhB,QAAA,OAAO,MAAM;;AAGf,IAAA,OAAO,eAAe,CAAC,IAAa,GAAA,IAAI,IAAI,EAAE,EAAA;AAC5C,QAAA,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;;AAGzD,IAAA,OAAO,cAAc,CAAC,IAAa,GAAA,IAAI,IAAI,EAAE,EAAA;AAC3C,QAAA,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;;AAG7D,IAAA,OAAO,mBAAmB,CAAC,IAAa,GAAA,IAAI,IAAI,EAAE,EAAA;AAChD,QAAA,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;;AAG7D,IAAA,OAAO,OAAO,CAAC,KAAW,EAAE,KAAW,EAAA;AACrC,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK;QAElC,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;QACjE,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;AAEjE,QAAA,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;AAC1B,QAAA,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;AAE1B,QAAA,IAAI,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;AAC9C,YAAA,OAAO,KAAK;;QAGd,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE;;AAGtC;;;;;;AAMG;IACH,OAAO,QAAQ,CAAC,KAAW,EAAE,KAAW,EAAE,OAA6C,KAAK,EAAA;;AAE1F,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE;AACpB,YAAA,OAAO,GAAG;;AAGZ,QAAA,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;AAC1B,QAAA,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;AAE1B,QAAA,IAAI,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;AAC9C,YAAA,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC;;;QAI7D,IAAI,MAAM,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE;;AAGxC,QAAA,IAAI,IAAI,KAAK,KAAK,EAAE;YAClB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC;YACpE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC;AACpE,YAAA,MAAM,GAAG,IAAI,GAAG,IAAI;;;QAItB,MAAM,aAAa,GAAG,IAAI;AAC1B,QAAA,MAAM,aAAa,GAAG,aAAa,GAAG,EAAE;AACxC,QAAA,MAAM,WAAW,GAAG,aAAa,GAAG,EAAE;AACtC,QAAA,MAAM,UAAU,GAAG,WAAW,GAAG,EAAE;;;QAInC,QAAQ,IAAI;AACV,YAAA,KAAK,KAAK;gBACR,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC;AACxC,YAAA,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC;AACzC,YAAA,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC;AAC3C,YAAA,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC;AAC3C,YAAA;AACE,gBAAA,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC;;;AAIxG,IAAA,OAAO,OAAO,CAAC,IAAU,EAAE,EAAQ,EAAA;AACjC,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE;AAChB,YAAA,OAAO,EAAE;;QAGX,MAAM,OAAO,GAAW,EAAE;AAE1B,QAAA,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC;AAChC,QAAA,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;QAE5B,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAE5B,QAAA,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC;AAEvC,QAAA,OAAO,WAAW,IAAI,OAAO,EAAE;YAC7B,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;YACnC,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;;AAGhD,QAAA,OAAO,OAAO;;;;ACxQlB;;AAEG;MAIU,wBAAwB,CAAA;AAOzB,IAAA,EAAA;AACoB,IAAA,SAAA;IAPX,MAAM,GAAG,YAAY;IAEhC,YAAY,GAA4B,IAAI;IAC5C,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;IAEpD,WACU,CAAA,EAA2B,EACP,SAAoB,EAAA;QADxC,IAAE,CAAA,EAAA,GAAF,EAAE;QACkB,IAAS,CAAA,SAAA,GAAT,SAAS;;IAGvC,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC;AAChE,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC;;;IAIhE,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC;;;IAKnE,OAAO,GAAA;QACL,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE;;IAGnB,cAAc,GAAA;QACpB,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;QAExB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE;AAC/C,QAAA,IAAI,CAAC,QAAQ;YAAE;;AAGf,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;AAE3D,QAAA,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE;;YAEvB,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC;;aACxC;;;YAGL,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;YACtD,IAAI,cAAc,EAAE;gBAClB,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC;;;;uGA/C5C,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAF,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,IAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,aAAA,EAAA,WAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAHpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC3B,iBAAA;;0BASI;;0BAAY;yCAPI,MAAM,EAAA,CAAA;sBAAxB,KAAK;uBAAC,UAAU;gBAwBjB,OAAO,EAAA,CAAA;sBADN,YAAY;uBAAC,aAAa;;;MCZhB,gBAAgB,CAAA;IAClB,UAAU,GAAG,YAAY;IACzB,KAAK,GAAG,EAAE;IACV,WAAW,GAAG,EAAE;IAChB,UAAU,GAAqB,MAAM;IACrC,aAAa,GAAG,IAAI;IACpB,QAAQ,GAAG,KAAK;AAEzB;;AAEG;IACM,SAAS,GAAG,CAAC;IACb,SAAS,GAA2B,IAAI;IACxC,SAAS,GAA2B,IAAI;IAExC,QAAQ,GAAG,KAAK;IAChB,QAAQ,GAAG,KAAK;IAChB,UAAU,GAAG,KAAK;IAClB,QAAQ,GAAG,KAAK;IAChB,cAAc,GAAqB,SAAS;IAE5C,UAAU,GAAG,EAAE;IACf,WAAW,GAAG,EAAE;IAChB,gBAAgB,GAAG,KAAK;IACxB,aAAa,GAAG,KAAK;IACrB,IAAI,GAAqB,SAAS;AAClC,IAAA,OAAO;AACP,IAAA,OAAO;IAEP,OAAO,GAAU,EAAE;IACnB,YAAY,GAAW,EAAE;IACzB,UAAU,GAAW,EAAE;AAEvB,IAAA,QAAQ;AACR,IAAA,WAAW;IAEX,QAAQ,GAAQ,IAAI;AACnB,IAAA,cAAc,GAAG,IAAI,YAAY,EAAE;AAE7C,IAAA,QAAQ,GAAG,CAAC,CAAM,KAAI,GAAG;AACzB,IAAA,SAAS,GAAG,MAAK,GAAG;AAEpB,IAAA,UAAU,CAAC,GAAQ,EAAA;AACjB,QAAA,IAAI,CAAC,QAAQ,GAAG,GAAG;;AAGrB,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;;AAGpB,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;;AAGrB,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU;;AAG5B,IAAA,QAAQ;AAER,IAAA,eAAe,CAAC,GAAQ,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,GAAG;AACnB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;;AAG/B,IAAA,YAAY,GAAG,CAAC,OAAa,KAAa;AACxC,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,KAAK;AAE1B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI;AACxD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI;AAExD,QAAA,IAAI,GAAG,IAAI,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI;AACpE,QAAA,IAAI,GAAG,IAAI,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI;AAEzE,QAAA,OAAO,KAAK;AACd,KAAC;AAED,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI;QAE5D,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE;AAC7B,YAAA,OAAO,EAAE;;AAGX,QAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE;AAC3B,YAAA,OAAO,qBAAqB;;QAG9B,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YACrE,OAAO,CAAA,wBAAA,EAA2B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA,CAAE;;QAGnE,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YACrE,OAAO,CAAA,wBAAA,EAA2B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA,CAAE;;QAGnE,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC5C,OAAO,IAAI,CAAC,iBAAiB;;AAG/B,QAAA,OAAO,EAAE;;AAGH,IAAA,UAAU,CAAC,IAAU,EAAA;AAC3B,QAAA,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC;AACxB,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AAChD,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACvD,QAAA,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE;AAE5B,QAAA,QAAQ,IAAI,CAAC,UAAU;AACrB,YAAA,KAAK,YAAY;AACf,gBAAA,OAAO,GAAG,GAAG,CAAA,CAAA,EAAI,KAAK,CAAI,CAAA,EAAA,IAAI,EAAE;AAClC,YAAA,KAAK,YAAY;AACf,gBAAA,OAAO,GAAG,KAAK,CAAA,CAAA,EAAI,GAAG,CAAI,CAAA,EAAA,IAAI,EAAE;AAClC,YAAA;AACE,gBAAA,OAAO,CAAC,CAAC,kBAAkB,EAAE;;;IAInC,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;;IAGd,SAAS,GAAY,KAAK;IAC1B,iBAAiB,GAAW,EAAE;AAE9B,IAAA,aAAa,GAA8B;AAClD,QAAA,QAAQ,EAAE,qBAAqB;AAC/B,QAAA,WAAW,EAAE,mBAAmB;KACjC;;AAGD,IAAA,IAAI,oBAAoB,GAAA;;QAEtB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACvC,YAAA,OAAO,EAAE;;;AAIX,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,OAAO,IAAI,CAAC,iBAAiB;;;AAI/B,QAAA,MAAM,OAAO,GACX,IAAI,CAAC,QAAQ,KAAK,IAAI;YACtB,IAAI,CAAC,QAAQ,KAAK,SAAS;YAC3B,IAAI,CAAC,QAAQ,KAAK,EAAE;AACpB,aAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;QAE9D,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,qBAAqB,GAAG,EAAE;;;QAIrF,IAAI,aAAa,GAAG,KAAK;QACzB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;;YAEhC,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;;aACjF;;AAEL,YAAA,aAAa,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;;QAG1D,IAAI,aAAa,EAAE;YACjB,OAAO,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,mBAAmB;;;QAIjE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACjC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;AAErC,YAAA,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;;AAEjF,gBAAA,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAA,wBAAA,EAA2B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;;AAGpG,YAAA,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE;;AAEtF,gBAAA,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAA,wBAAA,EAA2B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;;;;AAKtG,QAAA,OAAO,EAAE;;uGA1LA,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,ECvB7B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,KAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,s6GAmGA,EDrFI,MAAA,EAAA,CAAA,0wCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,ufACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,EAAA,EAAA,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,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,cAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,cAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,gGAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,eAAA,EAAA,cAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,YAAA,EAAA,MAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,+BACf,wBAAwB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAGf,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAd5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAGrB,OAAA,EAAA;wBACP,YAAY;wBACZ,WAAW;wBACX,mBAAmB;wBACnB,YAAY;wBACZ,kBAAkB;wBAClB,eAAe;wBACf,wBAAwB;AACzB,qBAAA,EAAA,QAAA,EAAA,s6GAAA,EAAA,MAAA,EAAA,CAAA,0wCAAA,CAAA,EAAA;8BAGQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,cAAc,EAAA,CAAA;sBAAtB;gBAEQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,gBAAgB,EAAA,CAAA;sBAAxB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBAEQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,YAAY,EAAA,CAAA;sBAApB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBACS,cAAc,EAAA,CAAA;sBAAvB;gBAwFQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,iBAAiB,EAAA,CAAA;sBAAzB;gBAEQ,aAAa,EAAA,CAAA;sBAArB;;;MEzIU,qBAAqB,CAAA;IACvB,UAAU,GAAG,YAAY;IACzB,UAAU,GAA8B,YAAY;IACpD,KAAK,GAAG,EAAE;IACV,WAAW,GAAG,EAAE;IAChB,UAAU,GAAqB,MAAM;AAE9C;;AAEG;IACM,SAAS,GAAG,CAAC;IACb,SAAS,GAA2B,IAAI;IAExC,QAAQ,GAAG,KAAK;IAChB,QAAQ,GAAG,KAAK;IAChB,QAAQ,GAAG,KAAK;IAChB,cAAc,GAAqB,SAAS;IAE5C,UAAU,GAAG,EAAE;IACf,WAAW,GAAG,EAAE;IAChB,gBAAgB,GAAG,KAAK;IACxB,aAAa,GAAG,KAAK;IACrB,IAAI,GAAqB,SAAS;IAElC,OAAO,GAAU,EAAE;IACnB,YAAY,GAAW,EAAE;IACzB,UAAU,GAAW,EAAE;AAEvB,IAAA,QAAQ;AACR,IAAA,WAAW;IAEX,KAAK,GAAgB,IAAI;AACxB,IAAA,WAAW,GAAG,IAAI,YAAY,EAAE;IAEjC,KAAK,GAAgB,IAAI;AACxB,IAAA,WAAW,GAAG,IAAI,YAAY,EAAE;AAE1C,IAAA,QAAQ;AAER,IAAA,KAAK,GAAG,IAAI,IAAI,EAAE;AAElB,IAAA,MAAM,GAAG;QACP,UAAU,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;AACtG,QAAA,YAAY,EAAE;AACZ,YAAA,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;AACzD,YAAA,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;AACxD,SAAA;AACD,QAAA,WAAW,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/D,aAAa,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;KAC9F;IAED,QAAQ,GAAA;QACN,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,SAAS;;AAGjF,IAAA,aAAa,CAAC,KAAyB,EAAA;AACrC,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;QAErB,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAC/B,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;AACrB,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;;aAChB;AACL,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI;;QAGnB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QACjC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;uGAnExB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,ECdlC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,KAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,o6EAsEA,ED1DY,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,EAAE,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,cAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,o3BAAE,eAAe,EAAA,CAAA,EAAA,CAAA;;2FAEhG,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBALjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,EAE3B,OAAA,EAAA,CAAC,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,o6EAAA,EAAA;8BAGnG,UAAU,EAAA,CAAA;sBAAlB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,cAAc,EAAA,CAAA;sBAAtB;gBAEQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,gBAAgB,EAAA,CAAA;sBAAxB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBAEQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,YAAY,EAAA,CAAA;sBAApB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBAEQ,KAAK,EAAA,CAAA;sBAAb;gBACS,WAAW,EAAA,CAAA;sBAApB;gBAEQ,KAAK,EAAA,CAAA;sBAAb;gBACS,WAAW,EAAA,CAAA;sBAApB;;;MEjCU,iBAAiB,CAAA;IACnB,KAAK,GAAG,EAAE;IACV,WAAW,GAAe,EAAE;IAC5B,UAAU,GAAqB,MAAM;IACrC,aAAa,GAAG,IAAI;IACpB,YAAY,GAAG,KAAK;AAE7B;;AAEG;IACM,SAAS,GAAG,CAAC;IACb,SAAS,GAA2B,IAAI;IACxC,SAAS,GAA2B,IAAI;IAExC,QAAQ,GAAG,KAAK;IAChB,QAAQ,GAAG,KAAK;IAChB,QAAQ,GAAG,KAAK;IAChB,IAAI,GAAqB,SAAS;IAElC,GAAG,GAAkB,IAAI;IACzB,GAAG,GAAkB,IAAI;IACzB,SAAS,GAAW,CAAC;IAErB,UAAU,GAAG,EAAE;IACf,WAAW,GAAG,EAAE;IAChB,gBAAgB,GAAG,KAAK;IACxB,aAAa,GAAG,KAAK;IAErB,UAAU,GAAG,KAAK;;AAGlB,IAAA,aAAa;;AAEtB,IAAA,OAAO,oBAAoB,GAAoB,KAAK;AAE3C,IAAA,QAAQ;AACR,IAAA,WAAW;IAEX,QAAQ,GAAQ,IAAI;AACnB,IAAA,cAAc,GAAG,IAAI,YAAY,EAAE;AAEnB,IAAA,WAAW;AAErC,IAAA,QAAQ;IAER,gBAAgB,GAAA;QACd,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAGd,IAAA,YAAY;IAEvC,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE;;AAG3C,IAAA,eAAe,GAAG,CAAC,KAAa,KAAY;AAC1C,QAAA,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;AAE5C,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE;AAC5B,YAAA,OAAO,KAAK,CAAC,QAAQ,EAAE;;QAEzB,MAAM,KAAK,GAAG,CAAA,EAAG,KAAK,CAAA,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC;QACnC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,OAAO,GAAG,GAAG,GAAG,GAAG,CAAC;AAC9G,QAAA,OAAO,KAAK,CAAC,MAAM,GAAG;cAClB,GAAG,WAAW,CAAA,EAAG,IAAI,CAAC,gBAAgB,EAAE,KAAK,OAAO,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAE;cAC7E,WAAW;AACjB,KAAC;AAED,IAAA,YAAY,GAAG,CAAC,KAAa,KAAY;AACvC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,CAAC;AAEpB,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE;AAC5B,YAAA,OAAO,UAAU,CAAC,KAAK,CAAC;;;QAI1B,MAAM,OAAO,GAAG;aACb,OAAO,CAAC,IAAI,MAAM,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,gBAAgB,EAAE,KAAK,OAAO,GAAG,GAAG,GAAG,GAAG,CAAE,CAAA,EAAE,GAAG,CAAC,EAAE,EAAE;AACnF,aAAA,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,OAAO,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC;;AAGhE,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;AAAE,YAAA,OAAO,GAAG;AAEhD,QAAA,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC;;QAGlC,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC;AACnC,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;YAChC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE;AACrC,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;;AAE7D,SAAC,CAAC;AAEF,QAAA,OAAO,MAAM;AACf,KAAC;IAED,gBAAgB,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,aAAa,IAAI,OAAO,EAAE;AACjC,YAAA,OAAO,EAAE;;AAEX,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,OAAO,IAAI,CAAC,aAAa;;QAE3B,OAAO,iBAAiB,CAAC,oBAAoB;;AAG/C,IAAA,IAAI,gBAAgB,GAAA;QAClB,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,KAAK;;AAGhC,QAAA,MAAM,OAAO,GACX,IAAI,CAAC,QAAQ,KAAK,IAAI;YACtB,IAAI,CAAC,QAAQ,KAAK,SAAS;YAC3B,IAAI,CAAC,QAAQ,KAAK,EAAE;AACpB,aAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;AAE9D,QAAA,OAAO,OAAO;;AAGhB,IAAA,IAAI,oBAAoB,GAAA;;QAEtB,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,UAAU,EAAE;AAC5C,YAAA,OAAO,OAAO;;AAEhB,QAAA,OAAO,EAAE;;uGA7HA,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,EChB9B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,IAAA,EAAA,MAAA,EAAA,GAAA,EAAA,KAAA,EAAA,GAAA,EAAA,KAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,0jNAyLA,ED3KY,MAAA,EAAA,CAAA,s3CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,EAAA,EAAA,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,EAAE,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,0gCAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,eAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,EAAA,YAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEjG,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAGtB,OAAA,EAAA,CAAC,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,0jNAAA,EAAA,MAAA,EAAA,CAAA,s3CAAA,CAAA,EAAA;8BAGpG,KAAK,EAAA,CAAA;sBAAb;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,YAAY,EAAA,CAAA;sBAApB;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBAEQ,GAAG,EAAA,CAAA;sBAAX;gBACQ,GAAG,EAAA,CAAA;sBAAX;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBAEQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,gBAAgB,EAAA,CAAA;sBAAxB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBAEQ,UAAU,EAAA,CAAA;sBAAlB;gBAGQ,aAAa,EAAA,CAAA;sBAArB;gBAIQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBACS,cAAc,EAAA,CAAA;sBAAvB;gBAEyB,WAAW,EAAA,CAAA;sBAApC,SAAS;uBAAC,aAAa;gBAQG,YAAY,EAAA,CAAA;sBAAtC,SAAS;uBAAC,cAAc;;;MExCd,WAAW,CAAA;IACb,KAAK,GAAG,EAAE;IACV,aAAa,GAAG,IAAI;IACpB,WAAW,GAAG,EAAE;IAChB,UAAU,GAAqB,MAAM;IACrC,UAAU,GAAG,EAAE;AAExB;;AAEG;IACM,SAAS,GAAG,CAAC;IACb,SAAS,GAA2B,IAAI;IACxC,SAAS,GAA2B,IAAI;IAExC,UAAU,GAAG,KAAK;AAC3B,IAAA,IACI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,SAAS;;IAEvB,IAAI,QAAQ,CAAC,GAAY,EAAA;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,GAAG;QAEpB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE;AACrC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;AAExD,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE;gBAClB,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;;iBAChC;gBACL,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;;;;IAIlC,QAAQ,GAAG,KAAK;IAChB,QAAQ,GAAG,KAAK;IAChB,QAAQ,GAAG,KAAK;IAChB,cAAc,GAAqB,SAAS;IAC5C,YAAY,GAAe,EAAE;IAC7B,SAAS,GAAG,KAAK;IAEjB,UAAU,GAAG,EAAE;IACf,WAAW,GAAG,EAAE;IAChB,gBAAgB,GAAG,KAAK;IACxB,aAAa,GAAG,KAAK;IACrB,IAAI,GAAqB,SAAS;IAElC,OAAO,GAAU,EAAE;AAE5B;;AAEG;IACM,YAAY,GAAW,EAAE;IACzB,UAAU,GAAW,EAAE;AAEvB,IAAA,QAAQ;AACR,IAAA,WAAW;IAEX,QAAQ,GAAQ,IAAI;AACnB,IAAA,cAAc,GAAG,IAAI,YAAY,EAAE;AAEnC,IAAA,gBAAgB,GAAG,IAAI,YAAY,EAAE;AAErC,IAAA,OAAO,GAAG,IAAI,YAAY,EAAE;AAEX,IAAA,YAAY;IAE9B,UAAU,GAAG,KAAK;IAEnB,SAAS,GAAG,KAAK;IAEzB,eAAe,GAAA;QACb,IAAI,CAAC,QAAQ,EAAE;;AAGjB,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE,YAAY,KAAK,IAAI,EAAE;;YAE/C,UAAU,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;;;IAI7B,QAAQ,GAAA;QACd,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,EAAE,aAAa,EAAE;AACtD,YAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,EAAE;;;IAI3C,gBAAgB,GAAA;QACd,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;;IAGzC,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE;;AAG5C,IAAA,IAAI,gBAAgB,GAAA;QAClB,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,KAAK;;AAGhC,QAAA,MAAM,OAAO,GACX,IAAI,CAAC,QAAQ,KAAK,IAAI;YACtB,IAAI,CAAC,QAAQ,KAAK,SAAS;YAC3B,IAAI,CAAC,QAAQ,KAAK,EAAE;AACpB,aAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;AAE9D,QAAA,OAAO,OAAO;;AAGhB,IAAA,IAAI,oBAAoB,GAAA;;QAEtB,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,UAAU,EAAE;AAC5C,YAAA,OAAO,OAAO;;AAEhB,QAAA,OAAO,EAAE;;uGAhHA,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,ECzBxB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,aAAA,EAAA,eAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,q1HAmHA,ED5FY,MAAA,EAAA,CAAA,8sCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,2TAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,EAAA,EAAA,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,EAAE,eAAe,EAAE,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,cAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,cAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,6pBAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEzG,WAAW,EAAA,UAAA,EAAA,CAAA;kBANvB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAGf,OAAA,EAAA,CAAC,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,CAAC,EAAA,QAAA,EAAA,q1HAAA,EAAA,MAAA,EAAA,CAAA,8sCAAA,CAAA,EAAA;8BAG5G,KAAK,EAAA,CAAA;sBAAb;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBAEQ,UAAU,EAAA,CAAA;sBAAlB;gBAEG,QAAQ,EAAA,CAAA;sBADX;gBAiBQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,cAAc,EAAA,CAAA;sBAAtB;gBACQ,YAAY,EAAA,CAAA;sBAApB;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBAEQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,gBAAgB,EAAA,CAAA;sBAAxB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBAEQ,OAAO,EAAA,CAAA;sBAAf;gBAKQ,YAAY,EAAA,CAAA;sBAApB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBACS,cAAc,EAAA,CAAA;sBAAvB;gBAES,gBAAgB,EAAA,CAAA;sBAAzB;gBAES,OAAO,EAAA,CAAA;sBAAhB;gBAE0B,YAAY,EAAA,CAAA;sBAAtC,SAAS;uBAAC,cAAc;gBAEhB,UAAU,EAAA,CAAA;sBAAlB;;;ME7EU,qBAAqB,CAAA;IACvB,KAAK,GAAG,EAAE;IACV,aAAa,GAAG,IAAI;IACpB,WAAW,GAAG,EAAE;IAChB,UAAU,GAAqB,MAAM;IACrC,wBAAwB,GAAG,IAAI;AAExC;;AAEG;IACM,SAAS,GAAG,CAAC;IACb,SAAS,GAA2B,IAAI;AAEjD,IAAA,IACI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,SAAS;;IAEvB,IAAI,QAAQ,CAAC,GAAY,EAAA;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,GAAG;QAEpB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE;AACrC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;AAExD,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE;gBAClB,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;;iBAChC;gBACL,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;;;;IAIlC,QAAQ,GAAG,KAAK;IAChB,QAAQ,GAAG,KAAK;IAChB,QAAQ,GAAG,KAAK;IAChB,aAAa,GAAG,KAAK;IACrB,WAAW,GAAG,EAAE;IAEhB,UAAU,GAAG,EAAE;IACf,WAAW,GAAG,EAAE;IAChB,gBAAgB,GAAG,KAAK;AAEjC;;AAEG;IACM,aAAa,GAAG,KAAK;IACrB,IAAI,GAAqB,SAAS;IAElC,OAAO,GAAU,EAAE;IACnB,YAAY,GAAW,EAAE;IACzB,aAAa,GAAa,EAAE;AAErC;;AAEG;IACM,UAAU,GAAW,EAAE;AAEvB,IAAA,QAAQ;AACR,IAAA,WAAW;IAEX,QAAQ,GAAQ,IAAI;AACnB,IAAA,cAAc,GAAG,IAAI,YAAY,EAAE;AAEnC,IAAA,UAAU,GAAG,IAAI,YAAY,EAAE;AAE/B,IAAA,OAAO,GAAG,IAAI,YAAY,EAAE;IAE7B,UAAU,GAAG,KAAK;AAE3B,IAAA,IACI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI;;IAG5E,SAAS,GAAG,KAAK;IAEzB,QAAQ,GAAA;QACN,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE;AACrC,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,GAAG,KAAI;AACtE,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;AAC3E,aAAC,CAAC;AAEF,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC;;AAG7E,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE;;;;AAKxD,IAAA,UAAU,CAAC,IAAS,EAAA;AAClB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;;AAGhC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE;AAC9B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC;iBAClB,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC;AAC1B,iBAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;iBACf,IAAI,CAAC,KAAK,CAAC;AACd,YAAA,OAAO,OAAO;;AAGhB,QAAA,OAAO,IAAI;;AAGb,IAAA,cAAc,CAAC,GAAQ,EAAA;AACrB,QAAA,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,EAAE;AAC3D,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YAClF,GAAG,GAAG,MAAM;;AAGd,QAAA,IAAI,CAAC,QAAQ,GAAG,GAAG;AACnB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;AAE7B,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;;;AAI7E,IAAA,IAAI,gBAAgB,GAAA;QAClB,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,KAAK;;AAGhC,QAAA,MAAM,OAAO,GACX,IAAI,CAAC,QAAQ,KAAK,IAAI;YACtB,IAAI,CAAC,QAAQ,KAAK,SAAS;YAC3B,IAAI,CAAC,QAAQ,KAAK,EAAE;AACpB,aAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;AAE9D,QAAA,OAAO,OAAO;;AAGhB,IAAA,IAAI,oBAAoB,GAAA;;QAEtB,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,UAAU,EAAE;AAC5C,YAAA,OAAO,OAAO;;AAEhB,QAAA,OAAO,EAAE;;uGA3IA,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,ECblC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,aAAA,EAAA,eAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,aAAA,EAAA,eAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,cAAA,EAAA,aAAA,EAAA,eAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,8BAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,wtSAsOA,ED3NY,MAAA,EAAA,CAAA,svCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,EAAA,EAAA,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,EAAE,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,0gCAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,QAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,4BAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,aAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,WAAA,EAAA,aAAA,EAAA,wBAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAE5F,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAGhB,OAAA,EAAA,CAAC,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,CAAC,EAAA,QAAA,EAAA,wtSAAA,EAAA,MAAA,EAAA,CAAA,svCAAA,CAAA,EAAA;8BAG/F,KAAK,EAAA,CAAA;sBAAb;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,wBAAwB,EAAA,CAAA;sBAAhC;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBAGG,QAAQ,EAAA,CAAA;sBADX;gBAiBQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBAEQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,gBAAgB,EAAA,CAAA;sBAAxB;gBAKQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBAEQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,YAAY,EAAA,CAAA;sBAApB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBAKQ,UAAU,EAAA,CAAA;sBAAlB;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBACS,cAAc,EAAA,CAAA;sBAAvB;gBAES,UAAU,EAAA,CAAA;sBAAnB;gBAES,OAAO,EAAA,CAAA;sBAAhB;gBAEQ,UAAU,EAAA,CAAA;sBAAlB;gBAGG,SAAS,EAAA,CAAA;sBADZ,WAAW;uBAAC,8BAA8B;;;MEzDhC,cAAc,CAAA;IAChB,KAAK,GAAG,EAAE;IACV,WAAW,GAAG,EAAE;IAChB,UAAU,GAAqB,MAAM;IACrC,aAAa,GAAG,IAAI;IACpB,aAAa,GAAG,KAAK;AAE9B;;AAEG;IACM,SAAS,GAAG,CAAC;IACb,SAAS,GAA2B,IAAI;IACxC,SAAS,GAA2B,IAAI;IAExC,QAAQ,GAAG,KAAK;IAChB,QAAQ,GAAG,KAAK;IAChB,QAAQ,GAAG,KAAK;IAChB,cAAc,GAAqB,SAAS;IAC5C,UAAU,GAAG,EAAE;IACf,IAAI,GAAqB,SAAS;IAElC,UAAU,GAAG,KAAK;IAElB,OAAO,GAAG,CAAC;IACX,OAAO,GAAG,CAAC;IAEX,OAAO,GAAU,EAAE;IACnB,YAAY,GAAW,EAAE;IACzB,UAAU,GAAW,EAAE;AAEvB,IAAA,QAAQ;AACR,IAAA,WAAW;IAEX,QAAQ,GAAQ,IAAI;AACnB,IAAA,cAAc,GAAG,IAAI,YAAY,EAAE;;IAGpC,SAAS,GAAY,KAAK;IAC1B,iBAAiB,GAAW,EAAE;AAE9B,IAAA,aAAa,GAA8B;AAClD,QAAA,QAAQ,EAAE,qBAAqB;KAChC;AAED,IAAA,eAAe;IAEf,QAAQ,GAAA;QACN,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;;;IAIzC,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;;;AAIvB,IAAA,IAAI,oBAAoB,GAAA;;QAEtB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACvC,YAAA,OAAO,EAAE;;;AAIX,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,OAAO,IAAI,CAAC,iBAAiB;;;;AAK/B,QAAA,MAAM,OAAO,GACX,IAAI,CAAC,QAAQ,KAAK,IAAI;YACtB,IAAI,CAAC,QAAQ,KAAK,SAAS;YAC3B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;AACnC,aAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;QAE9D,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,qBAAqB,GAAG,EAAE;;;AAIrF,QAAA,OAAO,EAAE;;uGAhFA,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,cAAc,ECvB3B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,aAAA,EAAA,eAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,oxFAgFA,EDlEI,MAAA,EAAA,CAAA,4uCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,ufACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,EAAA,EAAA,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,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,cAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,cAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,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,EAAAC,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,eAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAGJ,cAAc,EAAA,UAAA,EAAA,CAAA;kBAd1B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAGlB,OAAA,EAAA;wBACP,YAAY;wBACZ,WAAW;wBACX,mBAAmB;wBACnB,YAAY;wBACZ,kBAAkB;wBAClB,eAAe;wBACf,aAAa;AACd,qBAAA,EAAA,QAAA,EAAA,oxFAAA,EAAA,MAAA,EAAA,CAAA,4uCAAA,CAAA,EAAA;8BAGQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,cAAc,EAAA,CAAA;sBAAtB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBAEQ,UAAU,EAAA,CAAA;sBAAlB;gBAEQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBAEQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,YAAY,EAAA,CAAA;sBAApB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBACS,cAAc,EAAA,CAAA;sBAAvB;gBAGQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,iBAAiB,EAAA,CAAA;sBAAzB;gBAEQ,aAAa,EAAA,CAAA;sBAArB;;;ME1DU,aAAa,CAAA;IACxB,SAAS,CAAC,KAAoB,EAAE,MAAc,EAAA;;AAE5C,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK;QAEnC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,qCAAqC,EAAE,MAAM,CAAC;QAC7E,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC;AAEvC,QAAA,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,KAAK,2BAA2B,KAAK,CAAA,OAAA,CAAS,CAAC;;uGARnF,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;qGAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA;;2FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBAHzB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,WAAW;AAClB,iBAAA;;;ACAM,MAAMR,MAAI,GAAG;AAClB,IAAA,OAAO,EAAE,6BAA6B;AACtC,IAAA,MAAM,EAAE,4BAA4B;AACpC,IAAA,OAAO,EAAE,6BAA6B;AACtC,IAAA,SAAS,EAAE,+BAA+B;AAC1C,IAAA,SAAS,EAAE,+BAA+B;AAC1C,IAAA,MAAM,EAAE,4BAA4B;CACrC;AAED,MAAM,cAAc,CAAA;;AAElB,IAAA,iBAAiB;AACjB,IAAA,UAAU;AACV,IAAA,QAAQ;AACR,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,UAAU;AACV,IAAA,QAAQ;AACR,IAAA,SAAS;AACT,IAAA,UAAU;AACV,IAAA,WAAW;AACX,IAAA,eAAe;AACf,IAAA,cAAc;;AAGd,IAAA,WAAA,CAAY,GAAS,EAAA;AACnB,QAAA,GAAG,GAAG,GAAG,IAAI,EAAE;QAEf,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC,iBAAiB,IAAI,EAAE;QACpD,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE;QACtC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE;QACtC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,KAAK;QACrC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,IAAI;QAC1C,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE;QACxC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,IAAI;QAC1C,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE;QACxC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE;QACtC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE;QAClC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,EAAE;QACpC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,IAAI;QACxC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE;QACxC,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC,eAAe,IAAI,EAAE;QAChD,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,IAAI,EAAE;;AAEjD;AAKK,MAAO,gBAAiB,SAAQ,WAAW,CAAA;AAC/C,IAAA,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC;IAE3B,MAAM,WAAW,CAAC,UAAkB,EAAA;;QAElC,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;AACzD,QAAA,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE;AAC3B,YAAA,OAAO,MAAM;;;QAIf,MAAM,OAAO,GAAG,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;QAC7D,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,OAAO;;;QAIhB,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC;QACzD,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC;AAE1D,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,WAAW;YAChC,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC;AAClD,YAAA,gBAAgB,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC;AAChD,YAAA,OAAO,MAAM;;QACb,OAAO,GAAG,EAAE;;AAEZ,YAAA,gBAAgB,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC;AAChD,YAAA,MAAM,GAAG;;;IAIb,UAAU,GAAA;AACR,QAAA,gBAAgB,CAAC,SAAS,GAAG,IAAI,GAAG,EAA4B;AAChE,QAAA,gBAAgB,CAAC,YAAY,GAAG,IAAI,GAAG,EAAqC;;;AAItE,IAAA,OAAO,SAAS,GAAG,IAAI,GAAG,EAA4B;;AAGtD,IAAA,OAAO,YAAY,GAAG,IAAI,GAAG,EAAqC;IAElE,MAAM,oBAAoB,CAAC,UAAkB,EAAA;QACnD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7B,YAAA,GAAG,EAAE,4BAA4B;YACjC,MAAM,EAAE,CAAC,UAAU,CAAC;AACrB,SAAA,CAAC;AACF,QAAA,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE;;uGAhDZ,gBAAgB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA;;2FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MChDY,aAAa,CAAA;AACxB,IAAA,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAElC,IAAA,MAAM,SAAS,CAAC,KAAa,EAAE,UAAkB,EAAA;AAC/C,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;QAErB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC;AAExD,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,SAAS,IAAI,KAAK;;uGARxD,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;qGAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA;;2FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBAHzB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,WAAW;AAClB,iBAAA;;;MCyBY,WAAW,CAAA;IACtB,SAAS,GAAW,CAAC;AACrB,IAAA,QAAQ,GAAW,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;AACjD;AAEK,MAAO,UAAW,SAAQ,WAAW,CAAA;IACzC,OAAO,GAAkB,IAAI;AAC7B,IAAA,WAAW,GAAgB,IAAI,WAAW,EAAE;IAE5C,UAAU,GAAG,KAAK;AACnB;MAEY,WAAW,CAAA;IACtB,SAAS,GAAkB,IAAI;IAC/B,SAAS,GAAkB,IAAI;AAChC;MAEY,UAAU,CAAA;AAOX,IAAA,eAAA;IANV,SAAS,GAAkB,EAAE;IAC7B,OAAO,GAAQ,EAAE;IACjB,UAAU,GAAG,CAAC;IAEd,WACE,CAAA,GAAS,EACD,eAAuC,EAAA;QAAvC,IAAe,CAAA,eAAA,GAAf,eAAe;AAEvB,QAAA,GAAG,GAAG,GAAG,IAAI,EAAE;QAEf,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,EAAE;QACpC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,CAAC;AAErC,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE;YACtD,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAS,KAAK,IAAI,IAAI,CAAC,eAAgB,CAAC,IAAI,CAAC,CAAC;;aACzE;YACL,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE;;;AAGrC;MAEY,WAAW,CAAA;IACtB,IAAI,GAAW,EAAE;IACjB,IAAI,GAAW,EAAE;IACjB,KAAK,GAAW,EAAE;IAClB,IAAI,GAAW,EAAE;IACjB,KAAK,GAAW,EAAE;IAClB,QAAQ,GAAW,EAAE;IACrB,QAAQ,GAAY,KAAK;IACzB,SAAS,GAAyB,QAAQ;IAC1C,UAAU,GAAW,EAAE;IACvB,QAAQ,GAAkB,IAAI;AAC/B;MAEY,UAAU,CAAA;IACrB,cAAc,GAAW,EAAE;IAC3B,cAAc,GAAW,EAAE;IAC3B,YAAY,GAAW,EAAE;IACzB,YAAY,GAAW,EAAE;AAC1B;MAEY,OAAO,CAAA;;AAElB,IAAA,UAAU;AACV,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,QAAQ;AACR,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,MAAM;AACN,IAAA,IAAI;AACJ,IAAA,OAAO;AACP,IAAA,WAAW;AACX,IAAA,QAAQ;AACR,IAAA,UAAU;;AAGV,IAAA,YAAY;AACZ,IAAA,SAAS;AACV;;MCpGY,oBAAoB,CAAA;IACtB,IAAI,GAAG,EAAE;IACT,KAAK,GAAG,CAAC;AAEI,IAAA,OAAO;IAE7B,QAAQ,GAAG,KAAK;IAChB,QAAQ,GAAG,KAAK;IAChB,SAAS,GAAG,KAAK;AAET,IAAA,EAAE;IAEV,eAAe,GAAA;QACb,IAAI,CAAC,eAAe,EAAE;AAEtB,QAAA,IAAI,CAAC,EAAE,GAAG,IAAI,cAAc,CAAC,MAAK;YAChC,IAAI,CAAC,eAAe,EAAE;AACxB,SAAC,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;;IAG7C,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE;;IAGvB,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ;QAC9B,IAAI,CAAC,eAAe,EAAE;;IAGhB,eAAe,GAAA;AACrB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa;AAErC,QAAA,MAAM,KAAK,GAAG,gBAAgB,CAAC,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC;AAE/C,QAAA,MAAM,eAAe,GAAG,UAAU,GAAG,IAAI,CAAC,KAAK;AAC/C,QAAA,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY;QAElC,IAAI,CAAC,QAAQ,GAAG,UAAU,GAAG,eAAe,GAAG,CAAC;AAEhD,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,UAAU,GAAG,IAAI,GAAG,eAAe,GAAG,IAAI;;uGA1ClE,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECTjC,goBAmBA,EAAA,MAAA,EAAA,CAAA,mYAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDZY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEX,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,SAAS;+BACE,WAAW,EAAA,OAAA,EAGZ,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,goBAAA,EAAA,MAAA,EAAA,CAAA,mYAAA,CAAA,EAAA;8BAGd,IAAI,EAAA,CAAA;sBAAZ;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBAEqB,OAAO,EAAA,CAAA;sBAA5B,SAAS;uBAAC,SAAS;;;AEahB,MAAO,oBAAqB,SAAQ,aAAa,CAAA;AAC5C,IAAA,IAAI,GAAe,IAAI,UAAU,EAAE;AACnC,IAAA,MAAM,GAAG,IAAI,UAAU,EAAE;IACzB,SAAS,GAAG,KAAK;IACjB,KAAK,GAAG,EAAE;IACV,SAAS,GAAG,EAAE;AACd,IAAA,aAAa;AACb,IAAA,MAAM;AAKN,IAAA,cAAc;AAEb,IAAA,YAAY,GAAG,IAAI,YAAY,EAAc;AAC7C,IAAA,aAAa,GAAG,IAAI,YAAY,EAAE;IAE5C,YAAY,CAAC,SAAiB,EAAE,SAAwB,EAAA;QACtD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,GAAG,SAAS;QAC7C,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,GAAG,SAAS,IAAI,EAAE;QACnD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;;AAGrC,IAAA,iBAAiB,CAAC,SAAiB,EAAA;AACjC,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,SAAS;QACjC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;;AAGrC,IAAA,gBAAgB,CAAC,QAAgB,EAAA;AAC/B,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ;AAC/B,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC;QACzB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;;uGA/B1B,oBAAoB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,EC1BjC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,WAAA,EAAA,KAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,MAAA,EAAA,QAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,olGAoFA,EDpEI,MAAA,EAAA,CAAA,khBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,8VACZ,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,aAAA,EAAA,cAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,YAAA,EAAA,SAAA,EAAA,eAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,yBAAA,EAAA,sBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,qHAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,mBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,gFAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,+GAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,cAAc,EAEd,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,8IAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,aAAa,EACb,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,aAAa,kDACb,oBAAoB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAGX,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAfhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAGf,OAAA,EAAA;wBACP,YAAY;wBACZ,aAAa;wBACb,YAAY;wBACZ,cAAc;wBACd,gBAAgB;wBAChB,aAAa;wBACb,aAAa;wBACb,oBAAoB;AACrB,qBAAA,EAAA,QAAA,EAAA,olGAAA,EAAA,MAAA,EAAA,CAAA,khBAAA,CAAA,EAAA;8BAGQ,IAAI,EAAA,CAAA;sBAAZ;gBACQ,MAAM,EAAA,CAAA;sBAAd;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,MAAM,EAAA,CAAA;sBAAd;gBAKQ,cAAc,EAAA,CAAA;sBAAtB;gBAES,YAAY,EAAA,CAAA;sBAArB;gBACS,aAAa,EAAA,CAAA;sBAAtB;;;ME9BU,yBAAyB,CAAA;IAC3B,UAAU,GAAG,CAAC;AACd,IAAA,MAAM,GAAG,IAAI,UAAU,EAAE;AAExB,IAAA,mBAAmB,GAAG,IAAI,YAAY,EAAE;IAElD,UAAU,GAAG,UAAU;uGANZ,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,ECXtC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,OAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,+qBAgBA,EDPY,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,wZAAE,WAAW,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,EAAA,CAAA;;2FAE9B,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBALrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAEpB,OAAA,EAAA,CAAC,kBAAkB,EAAE,WAAW,CAAC,EAAA,QAAA,EAAA,+qBAAA,EAAA;8BAGjC,UAAU,EAAA,CAAA;sBAAlB;gBACQ,MAAM,EAAA,CAAA;sBAAd;gBAES,mBAAmB,EAAA,CAAA;sBAA5B;;;MEDU,YAAY,CAAA;AAIH,IAAA,MAAA;IAHpB,SAAS,GAAkB,IAAI;IAC/B,OAAO,GAAkB,IAAI;AAE7B,IAAA,WAAA,CAAoB,MAAc,EAAA;QAAd,IAAM,CAAA,MAAA,GAAN,MAAM;;IAE1B,QAAQ,GAAA;AACN,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK;QAE3B,IAAI,CAAC,SAAS,GAAG,KAAK,EAAE,SAAS,IAAI,IAAI;QACzC,IAAI,CAAC,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,IAAI;AAErC,QAAA,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC;;uGAZlC,YAAY,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAJ,IAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,EATb,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;AAMT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEX,YAAY,EAAA,UAAA,EAAA,CAAA;kBAVxB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,CAAA;;;;;;AAMT,EAAA,CAAA;oBACD,OAAO,EAAE,CAAC,YAAY,CAAC;AACxB,iBAAA;;;MCJY,kBAAkB,CAAA;;IAGpB,QAAQ,GAA8B,IAAI;AAC1C,IAAA,OAAO;IAEP,eAAe,GAAG,KAAK;IACvB,kBAAkB,GAAG,KAAK;;AAG1B,IAAA,IAAI;IACJ,MAAM,GAAW,MAAM;IAEhC,QAAQ,GAAA;;;;;IAMR,KAAK,GAAA;AACH,QAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,EAAE;YAC7B,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AACzC,YAAA,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACxG,YAAA,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC;AAC7C,YAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;YAE/D,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;YAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC/C,YAAA,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAC7B,YAAA,MAAM,CAAC,GAAG,GAAG,OAAO;AACpB,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;AACjC,YAAA,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE;;AACxB,aAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,OAAO,EAAE;AACnC,YAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;YAElE,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;YAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC/C,YAAA,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAC7B,YAAA,MAAM,CAAC,GAAG,GAAG,OAAO;AACpB,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;AACjC,YAAA,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE;;;uGAxCtB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECT/B,mzCAuCA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDhCY,0BAA0B,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,6BAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,cAAA,EAAA,cAAA,EAAA,YAAA,EAAA,eAAA,EAAA,aAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,iCAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,KAAA,EAAA,WAAA,EAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,aAAA,EAAA,WAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,0BAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,yBAAA,EAAA,sBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,6BAAA,EAAA,gCAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,aAAA,EAAA,4BAAA,EAAA,0BAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,yBAAA,EAAA,0BAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,sBAAA,EAAA,aAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,YAAA,EAAA,SAAA,EAAA,SAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,uBAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,+BAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,yBAAA,EAAA,sBAAA,EAAA,+BAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,6BAAA,EAAA,wBAAA,EAAA,iBAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEzB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAL9B,SAAS;+BACE,YAAY,EAAA,OAAA,EAEb,CAAC,0BAA0B,CAAC,EAAA,QAAA,EAAA,mzCAAA,EAAA;8BAK5B,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBAEQ,eAAe,EAAA,CAAA;sBAAvB;gBACQ,kBAAkB,EAAA,CAAA;sBAA1B;gBAGQ,IAAI,EAAA,CAAA;sBAAZ;gBACQ,MAAM,EAAA,CAAA;sBAAd;;;AEdH;MAmCa,sBAAsB,CAAA;AAId,IAAA,cAAA;IAHnB,OAAO,GAAG,KAAK;AACP,IAAA,GAAG;AAEX,IAAA,WAAA,CAAmB,cAA8B,EAAA;QAA9B,IAAc,CAAA,cAAA,GAAd,cAAc;;IAEjC,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;YACtD,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,OAAO,GAAG,CAAC;AAClB,aAAC,CAAC;AACJ,SAAC,CAAC;;IAGJ,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE;;uGAfb,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAQ,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,EAhCvB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;AAMT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,2LAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAwBS,YAAY,EAPV,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA;YACV,OAAO,CAAC,WAAW,EAAE;gBACnB,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9F,gBAAA,UAAU,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aACzE,CAAC;AACH,SAAA,EAAA,CAAA;;2FAIU,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAlClC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EACpB,QAAA,EAAA,CAAA;;;;;;GAMT,EAiBW,UAAA,EAAA;wBACV,OAAO,CAAC,WAAW,EAAE;4BACnB,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9F,4BAAA,UAAU,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;yBACzE,CAAC;qBACH,EAEQ,OAAA,EAAA,CAAC,YAAY,CAAC,EAAA,MAAA,EAAA,CAAA,2LAAA,CAAA,EAAA;;;MC/BZ,MAAM,CAAA;IACR,MAAM,GAAW,CAAC;uGADhB,MAAM,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAN,MAAM,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAHP,CAAmD,iDAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnD,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEX,MAAM,EAAA,UAAA,EAAA,CAAA;kBALlB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,QAAQ,EAAE,CAAmD,iDAAA,CAAA;oBAC7D,OAAO,EAAE,CAAC,YAAY,CAAC;AACxB,iBAAA;8BAEU,MAAM,EAAA,CAAA;sBAAd;;;MCDU,KAAK,CAAA;IACP,KAAK,GAAW,CAAC;uGADf,KAAK,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAL,KAAK,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAHN,CAAkF,gFAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClF,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEX,KAAK,EAAA,UAAA,EAAA,CAAA;kBALjB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,OAAO;AACjB,oBAAA,QAAQ,EAAE,CAAkF,gFAAA,CAAA;oBAC5F,OAAO,EAAE,CAAC,YAAY,CAAC;AACxB,iBAAA;8BAEU,KAAK,EAAA,CAAA;sBAAb;;;MCKU,GAAG,CAAA;IACL,OAAO,GAA4B,EAAE;IACrC,KAAK,GAAW,CAAC;IACjB,MAAM,GAAW,CAAC;uGAHhB,GAAG,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAH,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,GAAG,EATJ,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,KAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;AAMF,SAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEX,GAAG,EAAA,UAAA,EAAA,CAAA;kBAXf,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,KAAK;AACf,oBAAA,QAAQ,EAAE,CAAA;;;;;;AAMF,SAAA,CAAA;oBACR,OAAO,EAAE,CAAC,YAAY,CAAC;AACxB,iBAAA;8BAEU,OAAO,EAAA,CAAA;sBAAf;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,MAAM,EAAA,CAAA;sBAAd;;;ACjBI,MAAM,aAAa,GAAG,CAAC,UAAe,KAAI;;IAG/C,KAAK,IAAI,MAAM,IAAI,QAAQ,CAAC,sBAAsB,CAAC,SAAS,CAAC,EAAE;QAC7D,MAAM,CAAC,MAAM,EAAE;;IAGjB,IAAI,CAAM,EAAE,CAAM,EAAE,CAAM,EAAE,CAAM,EAAE,CAAM,EAAE,CAAM;IAClD,IAAI,OAAO,GAAG,MAAM;IACpB,IAAI,KAAK,GAAG,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC5C,IAAA,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;AACjC,IAAA,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;AAEtB,IAAA,IAAI,YAAY,GAAG,QAAQ,CAAC,WAAW;AACvC,IAAA,IAAI,aAAa,GAAG,QAAQ,CAAC,YAAY;IACzC,IAAI,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC7C,IAAA,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAC3C,IAAA,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;IAE1B,MAAM,WAAW,GAAG,MAAK;QACvB,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,YAAY,CAAC;QAC5D,IAAI,MAAM,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC;AAE1D,QAAA,IAAI,MAAM,GAAG,YAAY,GAAG,UAAU,CAAC,WAAW;AAClD,QAAA,IAAI,MAAM,GAAG,aAAa,GAAG,UAAU,CAAC,YAAY;QAEpD,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM;QACzB,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM;QACzB,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM;QAC3B,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM;AAE3B,QAAA,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AAClB,QAAA,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AAClB,QAAA,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AAClB,QAAA,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;;AAElB,QAAA,MAAM,EAAE;AACV,KAAC;IAED,MAAM,MAAM,GAAG,MAAK;AAClB,QAAA,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;AAC5C,QAAA,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;AAC7C,QAAA,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;AAC3C,QAAA,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;AAC5C,KAAC;IAED,MAAM,IAAI,GAAG,MAAK;;QAGhB,KAAK,IAAI,MAAM,IAAI,UAAU,CAAC,sBAAsB,CAAC,eAAe,CAAC,EAAE;AACrE,YAAA,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE;gBACtG,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACxC,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC;gBACxC,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE;AACpD,oBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,0BAA0B,CAAC;;gBAEhD,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE;AAClD,oBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,wBAAwB,CAAC;;AAE9C,gBAAA,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;AAErB,gBAAA,IAAI,MAAM,GAAG,YAAY,GAAG,UAAU,CAAC,WAAW;AAClD,gBAAA,IAAI,MAAM,GAAG,aAAa,GAAG,UAAU,CAAC,YAAY;AAEpD,gBAAA,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,MAAM;AAC7D,gBAAA,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,IAAI,MAAM;AAE3D,gBAAA,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK;AACxB,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK;AACzB,gBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI;AACvC,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI;;iBACjC;gBACL,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACxC,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC;AAClC,gBAAA,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;AACrB,gBAAA,IAAI,MAAM,GAAG,YAAY,GAAG,UAAU,CAAC,WAAW;AAClD,gBAAA,IAAI,MAAM,GAAG,aAAa,GAAG,UAAU,CAAC,YAAY;AAEpD,gBAAA,IAAI,EAAE,GAAG,MAAM,CAAC,WAAW,GAAG,MAAM;AACpC,gBAAA,IAAI,EAAE,GAAG,MAAM,CAAC,YAAY,GAAG,MAAM;AACrC,gBAAA,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,MAAM;AAC7D,gBAAA,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,IAAI,MAAM;AAE3D,gBAAA,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI;AACxC,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI;AACzC,gBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI;AACvC,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI;;;AAG5C,KAAC;AAED,IAAA,MAAM,IAAI,GAAG,CAAC,CAAM,KAAI;QACtB,IAAI,SAAc,EAAE,OAAY;AAEhC,QAAA,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC/C,QAAA,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAE9C,IAAI,CAAC,CAAC,CAAC;AAEP,QAAA,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,EAAE;YAC3B,SAAS,GAAG,WAAW;YACvB,OAAO,GAAG,UAAU;;aACf;YACL,SAAS,GAAG,WAAW;YACvB,OAAO,GAAG,SAAS;;QAGrB,MAAM,EAAE,GAAG,MAAK;AACd,YAAA,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC;AAC9C,SAAC;AAED,QAAA,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC;AACzC,QAAA,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACvD,KAAC;AAED,IAAA,MAAM,IAAI,GAAG,CAAC,CAAM,KAAI;QACtB,CAAC,CAAC,cAAc,EAAE;QAElB,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;YACzB,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACxB;;YAEF,IAAI,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;;aACnB;YACL,IAAI,KAAK,GAAG,CAAC;;AAGf,QAAA,IAAI,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,CAAC;AAC1B,QAAA,IAAI,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,CAAC;AAC1B,QAAA,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;YACd,EAAE,GAAG,CAAC,CAAC;;AAET,QAAA,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;YACd,EAAE,GAAG,CAAC,CAAC;;QAET,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,YAAY,EAAE;AAC7B,YAAA,EAAE,GAAG,YAAY,GAAG,CAAC,GAAG,CAAC;;QAE3B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,aAAa,EAAE;AAC9B,YAAA,EAAE,GAAG,aAAa,GAAG,CAAC,GAAG,CAAC;;QAG5B,CAAC,IAAI,EAAE;QACP,CAAC,IAAI,EAAE;QAEP,CAAC,IAAI,EAAE;QACP,CAAC,IAAI,EAAE;AAEP,QAAA,IAAI,KAAK,GAAG,YAAY,GAAG,UAAU,CAAC,WAAW;AACjD,QAAA,IAAI,KAAK,GAAG,aAAa,GAAG,UAAU,CAAC,YAAY;AACnD,QAAA,IAAI,IAAI,GAAG,CAAC,GAAG,KAAK;AACpB,QAAA,IAAI,GAAG,GAAG,CAAC,GAAG,KAAK;QAEnB,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACxC,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAEtC,QAAA,MAAM,EAAE;AACV,KAAC;AAED,IAAA,WAAW,EAAE;;;AAKb,IAAA,IAAI,EAAE;AAEN,IAAA,OAAOS,IAAI;AACb,CAAC;AAEM,MAAM,aAAa,GAAG,MAAK;IAChC,IAAI,OAAO,GAAG,QAAQ,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3D,IAAI,OAAO,EAAE;QACX,OAAO,CAAC,MAAM,EAAE;;AAEpB,CAAC;;MC1KY,kBAAkB,CAAA;AAIT,IAAA,EAAA;AAAwB,IAAA,QAAA;IAFnC,YAAY,GAAY,KAAK;IAEtC,WAAoB,CAAA,EAAc,EAAU,QAAmB,EAAA;QAA3C,IAAE,CAAA,EAAA,GAAF,EAAE;QAAsB,IAAQ,CAAA,QAAA,GAAR,QAAQ;;AAEpD,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE;AAChD,YAAA,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;;;uGAR3C,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE;AACX,iBAAA;uGAGU,YAAY,EAAA,CAAA;sBAApB;;;MCEU,MAAM,CAAA;uGAAN,MAAM,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAN,MAAM,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAHP,CAA8F,4FAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAC9F,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAT,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEX,MAAM,EAAA,UAAA,EAAA,CAAA;kBALlB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,SAAS;AACnB,oBAAA,QAAQ,EAAE,CAA8F,4FAAA,CAAA;oBACxG,OAAO,EAAE,CAAC,YAAY,CAAC;AACxB,iBAAA;;MAgBY,OAAO,CAAA;AACR,IAAA,KAAK,GAAG,IAAI,YAAY,EAAE;AAEpC;;AAEG;IACM,IAAI,GAAG,EAAE;uGANP,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAP,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,OAAO,EAXR,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;GAQT,EACS,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,qHAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEzB,OAAO,EAAA,UAAA,EAAA,CAAA;kBAbnB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,UAAU;AACpB,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;AAQT,EAAA,CAAA;AACD,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;AACtC,iBAAA;8BAEW,KAAK,EAAA,CAAA;sBAAd;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;;MAgBU,QAAQ,CAAA;AACT,IAAA,KAAK,GAAG,IAAI,YAAY,EAAE;AAEpC;;AAEG;IACM,IAAI,GAAG,EAAE;uGANP,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,EAXT,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;GAQT,EACS,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,qHAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEzB,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAbpB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,WAAW;AACrB,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;AAQT,EAAA,CAAA;AACD,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;AACtC,iBAAA;8BAEW,KAAK,EAAA,CAAA;sBAAd;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;;MAgBU,QAAQ,CAAA;AACT,IAAA,KAAK,GAAG,IAAI,YAAY,EAAE;AAEpC;;AAEG;IACM,IAAI,GAAG,EAAE;uGANP,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,EAXT,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;GAQT,EACS,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,qHAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEzB,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAbpB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,WAAW;AACrB,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;AAQT,EAAA,CAAA;AACD,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;AACtC,iBAAA;8BAEW,KAAK,EAAA,CAAA;sBAAd;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;;MAgBU,UAAU,CAAA;AACX,IAAA,KAAK,GAAG,IAAI,YAAY,EAAE;AAEpC;;AAEG;IACM,IAAI,GAAG,EAAE;uGANP,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,EAXX,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;GAQT,EACS,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,qHAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEzB,UAAU,EAAA,UAAA,EAAA,CAAA;kBAbtB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;AAQT,EAAA,CAAA;AACD,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;AACtC,iBAAA;8BAEW,KAAK,EAAA,CAAA;sBAAd;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;;MAgBU,QAAQ,CAAA;AACT,IAAA,KAAK,GAAG,IAAI,YAAY,EAAE;AAEpC;;AAEG;IACM,IAAI,GAAG,EAAE;uGANP,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,EAXT,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;GAQT,EACS,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,qHAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEzB,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAbpB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,WAAW;AACrB,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;AAQT,EAAA,CAAA;AACD,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;AACtC,iBAAA;8BAEW,KAAK,EAAA,CAAA;sBAAd;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;;MAgBU,UAAU,CAAA;AACX,IAAA,KAAK,GAAG,IAAI,YAAY,EAAE;AAEpC;;AAEG;IACM,IAAI,GAAG,EAAE;uGANP,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,EAXX,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;GAQT,EACS,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,qHAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEzB,UAAU,EAAA,UAAA,EAAA,CAAA;kBAbtB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;AAQT,EAAA,CAAA;AACD,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;AACtC,iBAAA;8BAEW,KAAK,EAAA,CAAA;sBAAd;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;;;AC/FH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA,MAAM,WAAW,CAAA;AACf,IAAA,cAAc;AACd,IAAA,UAAU;AACV,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,QAAQ;AACR,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,OAAO;AACP,IAAA,WAAW;AACX,IAAA,aAAa;AACb,IAAA,OAAO;AAEP,IAAA,WAAA,CAAY,GAAS,EAAA;AACnB,QAAA,GAAG,GAAG,GAAG,IAAI,EAAE;QAEf,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,IAAI,IAAI;QAChD,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE;QACtC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,IAAI;QAC1C,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE;QACxC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,IAAI;QAC1C,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE;QACxC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,IAAI;QACpC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE;QAC1B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE;QAC1B,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE;QAChC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE;QACxC,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa,IAAI,EAAE;QAC5C,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE;;AAEnC;AAED,MAAM,gBAAgB,CAAA;AACpB,IAAA,mBAAmB;AACnB,IAAA,UAAU;AACV,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,QAAQ;AACR,IAAA,cAAc;AACd,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,SAAS;AACT,IAAA,QAAQ;AACR,IAAA,SAAS;AACT,IAAA,UAAU;AACV,IAAA,aAAa;AAEb,IAAA,QAAQ;AAER,IAAA,WAAA,CAAY,GAAS,EAAA;AACnB,QAAA,GAAG,GAAG,GAAG,IAAI,EAAE;QAEf,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC,mBAAmB,IAAI,IAAI;QAC1D,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE;QACtC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,IAAI;QAC1C,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE;QACxC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,IAAI;QAC1C,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE;QACxC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,IAAI;QACpC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,IAAI,IAAI;QAChD,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE;QAC1B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE;QAC1B,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE;QACnD,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,IAAI;QACpC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,IAAI;QACtC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,IAAI;QACxC,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa,IAAI,KAAK;QAC/C,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,KAAK;;AAExC;AAED,MAAM,sBAAsB,CAAA;AAC1B,IAAA,yBAAyB;AACzB,IAAA,UAAU;AACV,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,QAAQ;AACR,IAAA,cAAc;AACd,IAAA,mBAAmB;AACnB,IAAA,UAAU;AACV,IAAA,YAAY;AACZ,IAAA,UAAU;AACV,IAAA,WAAW;AACX,IAAA,SAAS;AACT,IAAA,UAAU;AACV,IAAA,gBAAgB;AAChB,IAAA,sBAAsB;AACtB,IAAA,cAAc;AACd,IAAA,qBAAqB;AACrB,IAAA,gBAAgB;AAEhB,IAAA,SAAS;AACT,IAAA,UAAU;AAEV,IAAA,gBAAgB;AAChB,IAAA,iBAAiB;AAEjB,IAAA,QAAQ;AAER,IAAA,UAAU;AAEV,IAAA,WAAA,CAAY,GAAS,EAAA;AACnB,QAAA,GAAG,GAAG,GAAG,IAAI,EAAE;QAEf,IAAI,CAAC,yBAAyB,GAAG,GAAG,CAAC,yBAAyB,IAAI,IAAI;QACtE,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE;QACtC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,IAAI;QAC1C,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE;QACxC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,IAAI;QAC1C,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE;QACxC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,IAAI;QACpC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,IAAI,IAAI;QAChD,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC,mBAAmB,IAAI,IAAI;QAC1D,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE;QACtC,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,IAAI,EAAE;QAC1C,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE;QACtC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE;QACxC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,IAAI;QACtC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,IAAI;QACxC,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,gBAAgB,IAAI,EAAE;QAClD,IAAI,CAAC,sBAAsB,GAAG,GAAG,CAAC,sBAAsB,IAAI,IAAI;QAChE,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,IAAI,EAAE;QAC9C,IAAI,CAAC,qBAAqB,GAAG,GAAG,CAAC,qBAAqB,IAAI,IAAI;QAC9D,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,gBAAgB,IAAI,EAAE;AAElD,QAAA,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS;QAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;AAEjE,QAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,gBAAgB;AAC5C,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;cAC1B,IAAI,CAAC;iBACF,KAAK,CAAC,GAAG;AACT,iBAAA,GAAG,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBAC3B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;cAC1B,EAAE;QAEN,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,KAAK;QACrC,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC;;AAEnD;MAEY,oBAAoB,CAAA;AAC/B,IAAA,uBAAuB;AACvB,IAAA,UAAU;AACV,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,QAAQ;AACR,IAAA,WAAW;AACX,IAAA,gBAAgB;AAChB,IAAA,yBAAyB;AACzB,IAAA,4BAA4B;AAC5B,IAAA,YAAY;AAEZ,IAAA,WAAA,CAAY,GAAS,EAAA;AACnB,QAAA,GAAG,GAAG,GAAG,IAAI,EAAE;QAEf,IAAI,CAAC,uBAAuB,GAAG,GAAG,CAAC,uBAAuB,IAAI,IAAI;QAClE,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE;QACtC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,IAAI;QAC1C,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE;QACxC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,IAAI;QAC1C,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE;QACxC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,IAAI;QACpC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,IAAI;QAC1C,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,gBAAgB,IAAI,IAAI;QACpD,IAAI,CAAC,yBAAyB,GAAG,GAAG,CAAC,yBAAyB,IAAI,IAAI;QACtE,IAAI,CAAC,4BAA4B,GAAG,GAAG,CAAC,4BAA4B,IAAI,IAAI;QAC5E,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,IAAI,EAAE;;AAE7C;AAEK,MAAO,QAAS,SAAQ,WAAW,CAAA;AACvC,IAAA,eAAe;AACf,IAAA,gBAAgB;AAChB,IAAA,cAAc;AACd,IAAA,gBAAgB;AAChB,IAAA,aAAa;AACb,IAAA,eAAe;AACf,IAAA,UAAU;AAEV,IAAA,mBAAmB;AAEnB,IAAA,YAAY,GAAyB,IAAI,oBAAoB,EAAE;AAE/D,IAAA,WAAA,CAAY,GAAS,EAAA;AACnB,QAAA,GAAG,GAAG,GAAG,IAAI,EAAE;QACf,KAAK,CAAC,GAAG,CAAC;QAEV,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC,eAAe,IAAI,EAAE;QAChD,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,gBAAgB,IAAI,EAAE;QAClD,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,IAAI,EAAE;QAC9C,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,gBAAgB,IAAI,EAAE;QAClD,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa,IAAI,EAAE;QAC5C,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC,eAAe,IAAI,EAAE;QAChD,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE;QAEtC,IAAI,CAAC,YAAY,GAAG,IAAI,oBAAoB,CAAC,GAAG,CAAC,YAAY,CAAC;;AAEjE;MAEY,oBAAoB,CAAA;AAC/B,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,cAAc;AAEd,IAAA,WAAA,CAAY,GAAS,EAAA;AACnB,QAAA,GAAG,GAAG,GAAG,IAAI,EAAE;QAEf,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC;QAEzB,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,IAAI,KAAK;;AAEpD;AAED;;AAEG;AACG,MAAO,aAAc,SAAQ,gBAAgB,CAAA;AACjD,IAAA,YAAY,GAA8B,IAAI,yBAAyB,EAAE;AAEzE,IAAA,WAAA,CAAY,GAAS,EAAA;AACnB,QAAA,GAAG,GAAG,GAAG,IAAI,EAAE;QAEf,KAAK,CAAC,GAAG,CAAC;QAEV,IAAI,CAAC,YAAY,GAAG,IAAI,yBAAyB,CAAC,GAAG,CAAC,YAAY,CAAC;;AAEtE;MAEY,yBAAyB,CAAA;AACpC,IAAA,CAAC;AACD,IAAA,CAAC;AACD,IAAA,SAAS;AACT,IAAA,cAAc;AAEd,IAAA,WAAA,CAAY,GAAS,EAAA;AACnB,QAAA,GAAG,GAAG,GAAG,IAAI,EAAE;QAEf,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,KAAK;QACvC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,IAAI,EAAE;;AAEjD;AAED;;AAEG;AACG,MAAO,cAAe,SAAQ,sBAAsB,CAAA;AACxD,IAAA,QAAQ;AACR,IAAA,MAAM;IACN,SAAS,CAAU;AACnB,IAAA,SAAS;AAET,IAAA,YAAY;AAEZ,IAAA,YAAY;AAEZ,IAAA,gBAAgB,CAAC,QAAyB,EAAA;AACxC,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;QAC5C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,CAAC,EAAE,IAAI,IAAI,EAAE;;AAE5F,IAAA,gBAAgB,CAAC,QAAyB,EAAA;AACxC,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;QAC5C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,CAAC,EAAE,IAAI,IAAI,EAAE;;AAE5F,IAAA,cAAc,CAAC,QAAyB,EAAA;AACtC,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;QAC5C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,IAAI,IAAI,EAAE;;AAE/F,IAAA,cAAc,CAAC,QAAyB,EAAA;AACtC,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;QAC5C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,IAAI,IAAI,EAAE;;AAG/F,IAAA,WAAA,CAAY,GAAS,EAAA;AACnB,QAAA,GAAG,GAAG,GAAG,IAAI,EAAE;QACf,KAAK,CAAC,GAAG,CAAC;QAEV,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,IAAI,EAAE;QAC9C,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE;QAClC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE;QAC9B,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,KAAK;QACvC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,EAAE;QACpC,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,IAAI,KAAK;QAC7C,IAAI,CAAC,YAAY,GAAG,IAAI,0BAA0B,CAAC,GAAG,CAAC,YAAY,CAAC;;AAEvE;AAEK,MAAO,iBAAkB,SAAQ,oBAAoB,CAAA;AAAG;MAEjD,0BAA0B,CAAA;AACrC,IAAA,MAAM;AACN,IAAA,cAAc;AAEd,IAAA,WAAA,CAAY,GAAS,EAAA;AACnB,QAAA,GAAG,GAAG,GAAG,IAAI,EAAE;QAEf,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,IAAI,EAAE;AAE9C,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE;AAChB,QAAA,IAAI,GAAG,CAAC,MAAM,EAAE;YACd,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAM,KAAI;gBAC5B,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACpD,aAAC,CAAC;;;AAGP;MAqBY,iBAAiB,CAAA;AAC5B,IAAA,oBAAoB;AACpB,IAAA,UAAU;AACV,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,QAAQ;AACR,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,IAAI;AAEJ,IAAA,OAAO;AAEP,IAAA,WAAA,CAAY,GAAS,EAAA;AACnB,QAAA,GAAG,GAAG,GAAG,IAAI,EAAE;QAEf,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC,oBAAoB,IAAI,IAAI;QAC5D,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE;QACtC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,IAAI;QAC1C,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE;QACxC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,IAAI;QAC1C,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE;AACxC,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC,QAAQ,IAAI,KAAK,GAAG,IAAI;QACxE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE;QAC1B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE;QAC1B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE;AAE1B,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE;QACjB,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE;YACrC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAM,KAAI;gBAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC;AAC1C,aAAC,CAAC;;;AAGP;MAEY,qBAAqB,CAAA;AAChC,IAAA,wBAAwB;AACxB,IAAA,UAAU;AACV,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,QAAQ;AACR,IAAA,oBAAoB;AACpB,IAAA,cAAc;AACd,IAAA,mBAAmB;AACnB,IAAA,yBAAyB;AAEzB,IAAA,WAAA,CAAY,GAAS,EAAA;AACnB,QAAA,GAAG,GAAG,GAAG,IAAI,EAAE;QAEf,IAAI,CAAC,wBAAwB,GAAG,GAAG,CAAC,wBAAwB,IAAI,IAAI;QACpE,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE;QACtC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,IAAI;QAC1C,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE;QACxC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,IAAI;QAC1C,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE;QACxC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,IAAI;QACpC,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC,oBAAoB,IAAI,IAAI;QAC5D,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,IAAI,IAAI;QAChD,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC,mBAAmB,IAAI,IAAI;QAC1D,IAAI,CAAC,yBAAyB,GAAG,GAAG,CAAC,yBAAyB,IAAI,IAAI;;AAEzE;AAEK,MAAO,UAAW,SAAQ,iBAAiB,CAAA;AAAG;AAE9C,MAAO,cAAe,SAAQ,qBAAqB,CAAA;AAAG;AAE5D;AAqCM,MAAO,uBAAwB,SAAQ,aAAa,CAAA;;IAE/C,MAAM,GAAyD,EAAE;IACjE,OAAO,GAA0D,EAAE;IACnE,gBAAgB,GAAkE,EAAE;IAE7F,KAAK,GAAG,KAAK;AAEb,IAAA,QAAQ,GAAa,IAAI,QAAQ,EAAE;IACnC,QAAQ,GAAoB,EAAE;IAC9B,SAAS,GAAqB,EAAE;IAChC,YAAY,GAAwB,EAAE;AAEtC,IAAA,IAAI,uBAAuB,GAAA;QACzB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE;YAChE,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,IAAI,IAAI,CAAC,aAAc,CAAC,mBAAmB,CAAC;;AAEvG,QAAA,OAAO,EAAE;;AAGX,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;;AAG9D,IAAA,IAAI,cAAc,GAAA;QAChB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;AAC3C,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;gBACrC,EAAE,EAAE,CAAC,CAAC,yBAAyB;gBAC/B,IAAI,EAAE,CAAI,CAAA,EAAA,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,EAAE,CAAA,EAAG,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA,IAAA,EAAO,CAAC,CAAC,YAAY,CAAA,CAAA,EAAI,CAAC,CAAC,UAAU,GAAG,GAAG,GAAG,EAAE,CAAG,EAAA,CAAC,CAAC,UAAU,CAAE,CAAA;AACjM,aAAA,CAAC,CAAC;AACH,YAAA,OAAO,GAAG;;AAEZ,QAAA,OAAO,EAAE;;AAGX,IAAA,eAAe,CAAC,yBAAiC,EAAA;AAC/C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,yBAAyB,IAAI,yBAAyB,CAAC;AAC9F,QAAA,OAAO;cACH,CAAI,CAAA,EAAA,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,EAAE,CAAA,EAAG,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA,IAAA,EAAO,CAAC,CAAC,YAAY,CAAA,CAAA,EAAI,CAAC,CAAC,UAAU,GAAG,GAAG,GAAG,EAAE,CAAG,EAAA,CAAC,CAAC,UAAU,CAAE;cAC1L,EAAE;;AAGR,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;;AAE5E,QAAA,OAAO,EAAE;;AAGO,IAAA,MAAM,GAAG,IAAI,YAAY,EAAE;AACpB,IAAA,aAAa,GAAG,IAAI,YAAY,EAAE;AACjC,IAAA,cAAc,GAAG,IAAI,YAAY,EAAE;AACrC,IAAA,YAAY,GAAG,IAAI,YAAY,EAAE;AAC7B,IAAA,gBAAgB,GAAG,IAAI,YAAY,EAAE;;;IAIjE,IAAI,GAAG,IAAI;IAEX,mBAAmB,GAAG,KAAK;IAC3B,cAAc,GAAG,KAAK;IACtB,WAAW,GAAG,KAAK;AACnB,IAAA,UAAU,GAA0B,EAAE,QAAQ,EAAE,IAAI,EAAE;AAEtD,IAAA,aAAa;AACb,IAAA,UAAU;AACV,IAAA,cAAc;AACd,IAAA,kBAAkB;AAClB,IAAA,WAAW;;AAGX,IAAA,cAAc;IAId,gBAAgB,GAAY,EAAE;IAC9B,QAAQ,GAAG,CAAC;IACZ,QAAQ,GAAG,CAAC;;AAGZ,IAAA,aAAa;;IAGb,WAAW,GAAG,KAAK;;AAEnB,IAAA,WAAW;;AAEX,IAAA,SAAS;IAET,aAAa,GAAG,KAAK;AACrB,IAAA,cAAc;AACd,IAAA,kBAAkB,GAAG,IAAI,GAAG,EAAoC;AAChE,IAAA,mBAAmB,GAAG,IAAI,GAAG,EAA8C;;AAG3E,IAAA,kBAAkB,GAAG,IAAI,GAAG,EAAU;;AAGtC,IAAA,QAAQ,GAAG,EAAE,CAAC;IACd,UAAU,GAAG,IAAI;;AAGjB,IAAA,YAAY;IACZ,UAAU,GAAG,KAAK;IAClB,UAAU,GAAG,CAAC;IACd,UAAU,GAAG,CAAC;IACd,OAAO,GAAG,CAAC;IACX,OAAO,GAAG,CAAC;AAEX,IAAA,aAAa,GAAG,CAAC,CAAC;AAClB,IAAA,iBAAiB,GAAG,EAAE,CAAC;;IAGvB,SAAS,GAAG,KAAK;AACjB,IAAA,QAAQ;;;;;IAMR,UAAU,GAAG,IAAI;AAEsB,IAAA,SAAS;AACZ,IAAA,MAAM;AAE1C,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC;;AAGhF,IAAA,IAAI,UAAU,GAAA;QACZ,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;AACtD,YAAA,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;;QAG3B,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;AAC5D,YAAA,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC;;AAG9B,QAAA,OAAO,EAAE;;IAGX,QAAQ,GAAqB,IAAI;AAGjC,IAAA,SAAS,CAAC,CAAgB,EAAA;;AAExB,QAAA,MAAM,MAAM,GAAG,CAAC,CAAC,MAAqB;QACtC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;YAAE;AAEpD,QAAA,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE;YACtB,IAAI,CAAC,gBAAgB,EAAE;;QAGzB,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE;AAC9B,YAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;YAErB,CAAC,CAAC,cAAc,EAAE;AAClB,YAAA,IAAI,IAAI,CAAC,KAAK,EAAE;gBACd,IAAI,CAAC,IAAI,EAAE;;;QAIf,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE;AAC9B,YAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;YAErB,CAAC,CAAC,cAAc,EAAE;YAClB,IAAI,CAAC,IAAI,EAAE;;QAGb,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,EAAE;AACjE,YAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;YAErB,CAAC,CAAC,cAAc,EAAE;YAClB,IAAI,CAAC,IAAI,EAAE;;AAGb,QAAA,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC3E,IAAI,EAAE,GAAG,CAAC;YACV,IAAI,EAAE,GAAG,CAAC;AAEV,YAAA,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,aAAa;AAErE,YAAA,QAAQ,CAAC,CAAC,GAAG;AACX,gBAAA,KAAK,WAAW;oBACd,EAAE,GAAG,CAAC,IAAI;oBACV;AACF,gBAAA,KAAK,YAAY;oBACf,EAAE,GAAG,IAAI;oBACT;AACF,gBAAA,KAAK,SAAS;oBACZ,EAAE,GAAG,CAAC,IAAI;oBACV;AACF,gBAAA,KAAK,WAAW;oBACd,EAAE,GAAG,IAAI;oBACT;AACF,gBAAA;oBACE;;YAGJ,CAAC,CAAC,cAAc,EAAE;AAElB,YAAA,IAAI,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAE,CAAC;;;IAIpC,QAAQ,GAAA;QACN,IAAI,CAAC,UAAU,EAAE;;AAGnB,IAAA,eAAe;IAEf,WAAW,GAAA;AACT,QAAA,aAAa,EAAE;;IAGjB,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,EAAE;QAC9B,IAAI,CAAC,UAAU,EAAE;;IAGnB,UAAU,GAAA;QACR,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;AAE3C,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YAC3C,IAAI,CAAC,QAAQ,GAAG;AACd,gBAAA,IAAI,aAAa,CAAC;AAChB,oBAAA,mBAAmB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC;AACnC,oBAAA,QAAQ,EAAE,IAAI;AACd,oBAAA,IAAI,EAAE,SAAS;AACf,oBAAA,IAAI,EAAE,OAAO;AACb,oBAAA,SAAS,EAAE,SAAS;AACpB,oBAAA,QAAQ,EAAE,CAAC;AACX,oBAAA,YAAY,EAAE;AACZ,wBAAA,CAAC,EAAE,GAAG;AACN,wBAAA,CAAC,EAAE,GAAG;AACP,qBAAA;iBACF,CAAC;AACF,gBAAA,IAAI,aAAa,CAAC;AAChB,oBAAA,mBAAmB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC;AACnC,oBAAA,QAAQ,EAAE,IAAI;AACd,oBAAA,IAAI,EAAE,OAAO;AACb,oBAAA,IAAI,EAAE,KAAK;AACX,oBAAA,SAAS,EAAE,OAAO;AAClB,oBAAA,QAAQ,EAAE,GAAG;AACb,oBAAA,YAAY,EAAE;AACZ,wBAAA,CAAC,EAAE,GAAG;AACN,wBAAA,CAAC,EAAE,GAAG;AACN,wBAAA,cAAc,EAAE,IAAI;AACrB,qBAAA;iBACF,CAAC;aACH;;aACI;YACL,IAAI,QAAQ,GAAoB,EAAE;YAClC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;gBAC1B,QAAQ,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;AACrC,aAAC,CAAC;AAEF,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC;;AAG/B,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;AAC7C,YAAA,IAAI,CAAC,SAAS,GAAG,EAAE;;aACd;YACL,IAAI,SAAS,GAAqB,EAAE;YACpC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;gBAC3B,SAAS,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC;AACvC,aAAC,CAAC;AAEF,YAAA,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,SAAS,CAAC;;AAGjC,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AAEjB,QAAA,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC;QAE9C,IAAI,CAAC,aAAa,EAAE;;AAGtB,IAAA,aAAa,CAAC,MAAsB,EAAA;AAClC,QAAA,IAAI,CAAC,WAAW,GAAG,MAAM;;;IAI3B,aAAa,GAAA;;QAGX,UAAU,CAAC,MAAK;YACd,IAAI,QAAQ,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE;gBACxD,aAAa,CAAC,QAAQ,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;;SAEtE,EAAE,GAAG,CAAC;;IAGT,mBAAmB,CAAC,EAAU,EAAE,EAAU,EAAA;AACxC,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC;YAAE;;QAGxC,IAAI,CAAC,QAAQ,CAAC;AACZ,YAAA,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,kBAAkB,CAAC;AACzD,SAAA,CAAC;AAEF,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC7B,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC;gBAAE;AAEzD,YAAA,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;AAEhG,YAAA,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;;;IAItG,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,YAAY,EAAE,IAAI,CAAC,YAAY;AAChC,SAAA,CAAC;;IAGJ,QAAQ,GAAA;AACN,QAAA,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;AAEvB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;QACrB,MAAM,IAAI,GAAG,WAAW;;QAGxB,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI;QACnD,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI;QAEnD,MAAM,KAAK,GAAG,GAAG;QACjB,MAAM,KAAK,GAAG,GAAG;QAEjB,IAAI,CAAC,GAAG,KAAK;QACb,IAAI,CAAC,GAAG,KAAK;QAEb,OAAO,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YACpC,CAAC,IAAI,KAAK;;AAGZ,QAAA,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE;AACjC,QAAA,KAAK,CAAC,mBAAmB,GAAG,EAAE;AAC9B,QAAA,KAAK,CAAC,QAAQ,GAAG,IAAI;AACrB,QAAA,KAAK,CAAC,IAAI,GAAG,IAAI;AACjB,QAAA,KAAK,CAAC,IAAI,GAAG,WAAW;AACxB,QAAA,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC;AACxB,QAAA,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC;AACxB,QAAA,KAAK,CAAC,SAAS,GAAG,MAAM;AACxB,QAAA,KAAK,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE;AAEhD,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;;AAErE,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;QAEvB,IAAI,CAAC,aAAa,EAAE;;AAGtB,IAAA,gBAAgB,CAAC,IAAmB,EAAA;QAClC,OAAO,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,mBAAmB,KAAK,IAAI,CAAC,mBAAmB;;AAGnF,IAAA,cAAc,CAAC,IAAmB,EAAA;QAChC,OAAO,IAAI,CAAC,YAAY,EAAE,mBAAmB,KAAK,IAAI,CAAC,mBAAmB;;AAG5E,IAAA,cAAc,CAAC,IAAmB,EAAA;QAChC,OAAO,IAAI,CAAC,aAAa,EAAE,mBAAmB,KAAK,IAAI,CAAC,mBAAmB;;IAG7E,gBAAgB,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,GAAG,SAAS;AAC/B,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;AACjB,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;AAEjB,YAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;;;;AAK9B,IAAA,mBAAmB,CAAC,MAAsB,EAAA;QACxC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE;QACvE,MAAM,CAAC,gBAAgB,GAAG,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE;AAC5F,QAAA,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,MAAM,CAAC;QAE1C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAC1C,CAAC,CAAC,KAAK,CAAC,CAAC,yBAAyB,IAAI,MAAM,CAAC,yBAAyB,CACvE;AAED,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC5C,YAAA,MAAM,YAAY,GAAG,IAAI,iBAAiB,EAAE;AAC5C,YAAA,YAAY,CAAC,gBAAgB,GAAG,MAAM,CAAC,mBAAmB;AAC1D,YAAA,YAAY,CAAC,yBAAyB,GAAG,MAAM,CAAC,yBAAyB;AACzE,YAAA,YAAY,CAAC,4BAA4B,GAAG,QAAQ;AACpD,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;;QAGtC,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,YAAY,CAAC;;AAGrD,IAAA,cAAc,CAAC,MAAsB,EAAA;QACnC,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,yBAAyB,IAAI,MAAM,CAAC,yBAAyB,CAAC,IAAI,EAAE;;IAG/G,SAAS,GAAA;QACP,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE;AAEzB,QAAA,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE;AACnC,QAAA,MAAM,CAAC,QAAQ,GAAG,IAAI;AACtB,QAAA,MAAM,CAAC,yBAAyB,GAAG,IAAI,CAAC,GAAG,EAAE;QAC7C,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC,aAAa,CAAC,mBAAmB;AACnE,QAAA,MAAM,CAAC,QAAQ,GAAG,OAAO;QAEzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;;AAG1E,IAAA,iBAAiB,CAAC,MAAsB,EAAA;AACtC,QAAA,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,MAAM,CAAC;QAExC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,IAAI,MAAM,CAAC,sBAAsB,CAAC;QAC/F,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,iBAAiB,CAAC;YACzC;;AAGF,QAAA,IAAI,MAAM,CAAC,SAAS,EAAE;AACpB,YAAA,MAAM,SAAS,GAAG,IAAI,cAAc,EAAE;AACtC,YAAA,SAAS,CAAC,mBAAmB,GAAG,MAAM,CAAC,sBAAsB;AAC7D,YAAA,SAAS,CAAC,QAAQ,GAAG,OAAO;AAC5B,YAAA,SAAS,CAAC,sBAAsB,GAAG,MAAM,CAAC,mBAAmB;AAC7D,YAAA,SAAS,CAAC,MAAM,GAAG,MAAM;AACzB,YAAA,SAAS,CAAC,YAAY,GAAG,IAAI;AAE7B,YAAA,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC;YAEnC,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC;AAE/C,YAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS;;aAC9B;AACL,YAAA,MAAM,CAAC,SAAS,GAAG,EAAE;AAErB,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACpC,CAAC,CAAC,KACA,CAAC,CAAC,mBAAmB,IAAI,MAAM,CAAC,sBAAsB;AACtD,gBAAA,CAAC,CAAC,sBAAsB,IAAI,MAAM,CAAC,mBAAmB;gBACtD,CAAC,CAAC,YAAY,CACjB;AAED,YAAA,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC;YAExC,IAAI,CAAC,UAAU,EAAE;AACf,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,kBAAkB,CAAC;;iBACrC;gBACL,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC;AACnE,gBAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS;;;;AAKzC,IAAA,iBAAiB,CAAC,MAAsB,EAAA;AACtC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACpC,CAAC,CAAC,KACA,CAAC,CAAC,mBAAmB,IAAI,MAAM,CAAC,sBAAsB;AACtD,YAAA,CAAC,CAAC,sBAAsB,IAAI,MAAM,CAAC,mBAAmB;YACtD,CAAC,CAAC,YAAY,CACjB;QAED,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,kBAAkB,CAAC;;aACrC;YACL,UAAU,CAAC,UAAU,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE;;;AAIlD,IAAA,kBAAkB,CAAC,MAAsB,EAAA;AACvC,QAAA,IAAI,MAAM,CAAC,YAAY,EAAE;AACvB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAClC,CAAC,CAAC,KACA,CAAC,CAAC,mBAAmB,IAAI,MAAM,CAAC,sBAAsB;AACtD,gBAAA,CAAC,CAAC,sBAAsB,IAAI,MAAM,CAAC,mBAAmB;AACtD,gBAAA,CAAC,CAAC,CAAC,YAAY,CAClB;YAED,IAAI,CAAC,QAAQ,EAAE;AACb,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,kBAAkB,CAAC;;iBACrC;gBACL,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE;;;;AAKlD,IAAA,iBAAiB,CAAC,MAAsB,EAAA;AACtC,QAAA,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,MAAM,CAAC;;AAG1C,IAAA,MAAM,WAAW,GAAA;QACf,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC;QAE9C,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE;QAEzB,IAAI,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,CAAY,UAAA,CAAA,EAAE,CAAG,EAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAA,GAAA,EAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAE,CAAA,CAAC,CAAC;YAAE;AAEpG,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa;;AAG/B,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CACxC,CAAC,CAAC,KACA,CAAC,CAAC,mBAAmB,KAAK,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAC,sBAAsB,KAAK,IAAI,CAAC,mBAAmB,CAC9G;;QAGD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,KAAK,IAAI,CAAC,mBAAmB,CAAC;;;;;;;;;;AAYpG,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CACpC,CAAC,CAAC,KACA,CAAC,CAAC,mBAAmB,KAAK,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAC,sBAAsB,KAAK,IAAI,CAAC,mBAAmB,CAC9G;;QAGD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;AAElC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,aAAa,GAAG,SAAS;;IAGhC,MAAM,YAAY,CAAC,MAAsB,EAAA;AACvC,QAAA,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC;QAEnC,IAAI,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,CAAmB,iBAAA,CAAA,CAAC,CAAC;YAAE;QAEhD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,IAAI,MAAM,CAAC,mBAAmB,CAAC;AAE5F,QAAA,IAAI,CAAC,KAAK;YAAE;AAEZ,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC;AAE1D,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;AAEhC,QAAA,IAAI,CAAC,cAAc,GAAG,SAAS;AAC/B,QAAA,IAAI,CAAC,WAAW,GAAG,SAAS;;;;IAO9B,uBAAuB,GAAG,KAAK;IAC/B,oBAAoB,GAAG,EAAE;IACzB,oBAAoB,GAAG,EAAE;AACgC,IAAA,uBAAuB;AAEhF,IAAA,0BAA0B,CAAC,GAAQ,EAAA;AACjC,QAAA,IACE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,KAAK,GAAG,CAAC,IAAI,CAAC;AACtD,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,cAAc,KAAK,GAAG,CAAC,IAAI,CAAC,EACzD;AACA,YAAA,OAAO,KAAK;;AAEd,QAAA,OAAO,IAAI;;AAGb,IAAA,sBAAsB,CAAC,UAAe,EAAA;QACpC,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,UAAU,CAAC;;IAGjG,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI;QACnC,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,uBAAuB,EAAE,aAAa,CAAC,KAAK,EAAE;SACpD,EAAE,EAAE,CAAC;;IAGR,6BAA6B,GAAA;QAC3B,IAAI,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,EAAE;YACvG,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC;kBACzC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE;AACxG,kBAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC;;AAE5E,QAAA,IAAI,CAAC,oBAAoB,GAAG,EAAE;AAC9B,QAAA,IAAI,CAAC,oBAAoB,GAAG,EAAE;AAC9B,QAAA,IAAI,CAAC,uBAAuB,GAAG,KAAK;;;;AAMtC,IAAA,YAAY,CAAC,GAAW,EAAA;;;AAGtB,QAAA,OAAO,GAAG;;IAGZ,sBAAsB,GAAG,KAAK;IAC9B,mBAAmB,GAAG,EAAE;IACxB,mBAAmB,GAAG,EAAE;AACgC,IAAA,sBAAsB;AAE9E,IAAA,yBAAyB,CAAC,GAAQ,EAAA;QAChC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE;AACzD,YAAA,OAAO,KAAK;;AAEd,QAAA,OAAO,IAAI;;AAGb,IAAA,qBAAqB,CAAC,UAAc,EAAA;QAClC,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,UAAU,CAAC;;IAG/F,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI;QAClC,UAAU,CAAC,MAAK;AACd,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC;AAExC,YAAA,IAAI,CAAC,sBAAsB,EAAE,aAAa,CAAC,KAAK,EAAE;SACnD,EAAE,EAAE,CAAC;;IAGR,4BAA4B,GAAA;QAC1B,IAAI,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,EAAE;YACrG,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC;kBACxC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,EAAE,IAAI,CAAC,mBAAmB,EAAE;AACrG,kBAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC;;AAE1E,QAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE;AAC7B,QAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE;AAC7B,QAAA,IAAI,CAAC,sBAAsB,GAAG,KAAK;;;;IAKrC,oBAAoB,GAAG,EAAE;AAEzB,IAAA,qBAAqB,CAAC,UAAc,EAAA;QAClC,IAAI,CAAC,QAAQ,CAAC,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,UAAU,CAAC;;;;IAKnG,YAAY,GAAG,KAAK;IACpB,UAAU,GAAG,EAAE;AAC+B,IAAA,YAAY;AAE1D,IAAA,2BAA2B,CAAC,YAAoB,EAAA;AAC9C,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,YAAY,CAAC,EAAE;AAC/D,YAAA,OAAO,KAAK;;AAEd,QAAA,OAAO,IAAI;;AAGb,IAAA,WAAW,CAAC,YAAoB,EAAA;QAC9B,IAAI,CAAC,QAAQ,CAAC,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC;QACxG,IAAI,CAAC,uBAAuB,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;;IAGnE,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QACxB,UAAU,CAAC,MAAK;AACd,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;AAC9B,YAAA,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,KAAK,EAAE;SACzC,EAAE,EAAE,CAAC;;IAGR,kBAAkB,GAAA;QAChB,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,EAAE;YAC9F,IAAI,CAAC,QAAQ,CAAC,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC;AAC5C,kBAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE;kBAC5D,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;;AAEjC,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AACpB,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;;;;AAK3B,IAAA,iBAAiB,CAAC,KAAiB,EAAA;QACjC,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,KAAK,CAAC,MAAM,CAAC;AAE7D,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO;;AAG/B,QAAA,IAAK,KAAK,CAAC,MAAsB,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAAE;AAE7D,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;;AAG3B,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;YACrB,IAAI,CAAC,QAAQ,GAAG;gBACd,CAAC,EAAE,KAAK,CAAC,OAAO;gBAChB,CAAC,EAAE,KAAK,CAAC,OAAO;aACjB;YAED,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;YACtD;;QAGF,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC;AAEvC,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC;AACpB,QAAA,IAAI,CAAC,SAAS,GAAG,CAAC;AAElB,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE;;AAGjC,IAAA,iBAAiB,CAAC,KAAiB,EAAA;QACjC,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE;YACnC,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE1C,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE;YACrC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE;YAErC,IAAI,CAAC,QAAQ,GAAG;gBACd,CAAC,EAAE,KAAK,CAAC,OAAO;gBAChB,CAAC,EAAE,KAAK,CAAC,OAAO;aACjB;YAED;;QAGF,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAEjC,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;AACpD,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;QAEpD,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;AACpB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;;;QAIxB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,EAAE;YACxC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC;AACxC,YAAA,IAAI,CAAC,SAAS,GAAG,EAAE;YACnB,IAAI,CAAC,eAAe,EAAE;YACtB;;;QAIF,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,cAAc,EAAE;YAC7C,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;YACpC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;;YAGpC,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBACpC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG;;YAGzD,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE;gBAC3C,EAAE,GAAG,CAAC;;YAGR,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE;gBAC3C,EAAE,GAAG,CAAC;;AAGR,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CACzB;AACE,gBAAA,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,EAAE;AAC7B,gBAAA,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,EAAE;aAC9B,EACD,KAAK,CACN;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;YAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;;;;;;;AAU1C,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU;AAC7B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW;;YAG9B,IAAI,IAAI,GAAG,QAAQ;YACnB,IAAI,IAAI,GAAG,QAAQ;AACnB,YAAA,IAAI,IAAI,GAAG,CAAC,QAAQ;AACpB,YAAA,IAAI,IAAI,GAAG,CAAC,QAAQ;AAEpB,YAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAC7B,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC;oBAAE;AAEzD,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAE;gBAEjE,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC9B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAC9B,gBAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC;AACtC,gBAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC;;;AAIxC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC;AAEtE,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC;;AAGvE,YAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAC7B,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC;oBAAE;AAEzD,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAE;gBACjE,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,SAAS;gBACtC,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,SAAS;;;AAIxC,YAAA,KAAK,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE;AACpE,gBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM;oBAAE;AAE/B,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,KAAI;oBACzC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;oBAC5B,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;AAC9B,iBAAC,CAAC;;YAGJ;;;AAIF,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;AACd,YAAA,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;;YAGd,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AACpC,gBAAA,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AAC/B,oBAAA,IAAI,CAAC,QAAQ,GAAG,GAAG;;qBACd;AACL,oBAAA,IAAI,CAAC,QAAQ,GAAG,GAAG;;;YAIvB,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO;YAC7B,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO;;YAG7B,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE;gBAC3C,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;;YAGzC,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE;gBAC3C,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;;AAGzC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC;;;AAKxD,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU;AAC7B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW;YAE9B,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,GAAG,KAAK,CAAC;YAEvF,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,KAAK,CAAC;YAExF;;;AAIF,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC;YACxC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC;;;YAItC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;YAEnE,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;YAEpE;;;AAIF,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC;AACvC,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;AACnB,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;;;AAIvB,IAAA,eAAe,CAAC,KAAkB,EAAA;AAChC,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,YAAY,GAAG,SAAS;AAC7B,QAAA,IAAI,CAAC,aAAa,GAAG,SAAS;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;QAEtB,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK;YACvB,IAAI,CAAC,aAAa,EAAE;AACtB,SAAC,CAAC;;AAGJ,IAAA,aAAa,CAAC,CAAa,EAAA;AACzB,QAAA,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;QAEnD,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE;AAE1B,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACzB,CAAC,EAAE,CAAC,CAAC,OAAO;YACZ,CAAC,EAAE,CAAC,CAAC,OAAO;AACb,SAAA,CAAC;AAEF,QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;;;;IAMpC,eAAe,CAAC,KAAiB,EAAE,IAAmB,EAAA;AACpD,QAAA,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC;AACrC,QAAA,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,KAAK,CAAC;QAEtC,KAAK,CAAC,eAAe,EAAE;QACvB,KAAK,CAAC,cAAc,EAAE;QAEtB,IAAK,KAAK,CAAC,MAAyB,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;YACpE;;AAGF,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;QAEpB,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;;QAGjC,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE;AACzD;;AAEmC;YACnC,IAAI,CAAC,QAAQ,CAAC;AACZ,gBAAA,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,kBAAkB,CAAC;AACzD,aAAA,CAAC;AAEF,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,YAAA,IAAI,CAAC,cAAc,GAAG,CAAC;;AAGvB,YAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE;AAC/B,YAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAC7B,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE;oBACtD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;;;;AAKpG,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,GAAG,EAA8C;AAEhF,YAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE;AAC9B,gBAAA,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM;oBAAE;gBAEpC,IACE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC;oBAClD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,EACrD;AACA,oBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAC1B,CAAC,EACD,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CACvD;;;YAIL;;;AAIF,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE;AAC/B,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;;AAG3B;;AAEmC;QACnC,IAAI,CAAC,QAAQ,CAAC;AACZ,YAAA,IAAI,EAAE,YAAY;AAClB,YAAA,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;AACrE,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO;AAC/B,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO;AAC/B,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;AAClD,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;AAClD,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;;AAGzB,IAAA,YAAY,CAAC,IAAmB,EAAA;AAC9B,QAAA,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC;AAElC,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;AAC3B,QAAA,IAAI,CAAC,aAAa,GAAG,SAAS;QAE9B,IAAI,IAAI,CAAC,UAAU;YAAE;AAErB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,mBAAmB,KAAK,IAAI,CAAC,mBAAmB,EAAE;gBAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACjC,CAAC,CAAC,KACA,CAAC,CAAC,mBAAmB,KAAK,IAAI,CAAC,cAAe,CAAC,IAAI,CAAC,mBAAmB;AACvE,oBAAA,CAAC,CAAC,sBAAsB,KAAK,IAAI,CAAC,mBAAmB,CACxD;gBAED,IAAI,CAAC,OAAO,EAAE;AACZ,oBAAA,MAAM,SAAS,GAAG,IAAI,cAAc,EAAE;oBACtC,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,mBAAmB;oBAC5E,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI;AAC7C,oBAAA,SAAS,CAAC,sBAAsB,GAAG,IAAI,CAAC,mBAAmB;AAC3D,oBAAA,SAAS,CAAC,MAAM,GAAG,MAAM;;oBAGzB,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;wBACpC,SAAS,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC;;AAG5D,oBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;oBAE9B,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AACpD,oBAAA,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC;AAC9B,oBAAA,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC;;;YAIvC,IAAI,CAAC,gBAAgB,EAAE;YAEvB;;QAGF,IAAI,IAAI,CAAC,UAAU;YAAE;AACrB,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI;YAAE;;AAGlC,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;;;;AAK3B,IAAA,gBAAgB,CAAC,CAAiB,EAAA;;QAEhC,IAAI,IAAI,CAAC,cAAc;YAAE;AACzB,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC;QACpB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,IAAI,EAAE;;AAGrD,IAAA,gBAAgB,CAAC,CAAiB,EAAA;;QAEhC,IAAI,IAAI,CAAC,cAAc;YAAE;AACzB,QAAA,IAAI,CAAC,WAAW,GAAG,SAAS;AAC5B,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;;IAGpB,cAAc,GAAQ,IAAI;IAC1B,WAAW,GAAG,GAAG;AAEzB,IAAA,WAAW,CAAC,IAAoB,EAAE,KAAiB,EAAE,QAAQ,GAAG,KAAK,EAAA;QACnE,KAAK,CAAC,eAAe,EAAE;QACvB,KAAK,CAAC,cAAc,EAAE;AAEtB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;;AAEvB,YAAA,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC;AACjC,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAE1B,YAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC;YACnC;;QAGF,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC3C,CAAC,CAAC,KACA,CAAC,CAAC,YAAY,IAAI,IAAI;AACtB,gBAAA,CAAC,CAAC,mBAAmB,IAAI,IAAI,CAAC,cAAc,EAAE,sBAAsB;gBACpE,CAAC,CAAC,sBAAsB,IAAI,IAAI,CAAC,cAAc,EAAE,mBAAmB,CACvE;;aACI;;AAEL,YAAA,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,MAAK;AACpC,gBAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,gBAAA,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC;gBAEhC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC;AACrC,aAAC,EAAE,IAAI,CAAC,WAAW,CAAC;;;IAIxB,iBAAiB,CAAC,KAAiB,EAAE,IAAoB,EAAA;AACvD,QAAA,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC;QAEtC,KAAK,CAAC,eAAe,EAAE;QACvB,KAAK,CAAC,cAAc,EAAE;QAEtB,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC;;AAGvC,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AACtE,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE;;QAG/B,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;QAEjD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE;YAC9C,CAAC,EAAE,CAAC,CAAC,CAAC;YACN,CAAC,EAAE,CAAC,CAAC,CAAC;AACP,SAAA,CAAC;;;;AAMJ,IAAA,gBAAgB,CAAC,KAAiB,EAAE,IAAmB,EAAE,IAAsB,EAAA;QAC7E,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,CAAC;QAE3C,KAAK,CAAC,eAAe,EAAE;QACvB,KAAK,CAAC,cAAc,EAAE;QAEtB,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC;AACvC,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;AACnB,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;AAEnB;;AAEmC;AACnC,QAAA,IAAI,IAAI,KAAK,OAAO,EAAE;YACpB,IAAI,IAAI,CAAC,cAAc;gBAAE;YAEzB,IAAI,CAAC,cAAc,GAAG;AACpB,gBAAA,IAAI,EAAE,IAAI;AACV,gBAAA,IAAI,EAAE,IAAI;aACX;AACD,YAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;YAC3B;;AAGF;;AAEmC;QACnC,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE;AAC1C,YAAA,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,mBAAmB,KAAK,IAAI,CAAC,mBAAmB,EAAE;gBAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACjC,CAAC,CAAC,KACA,CAAC,CAAC,mBAAmB,KAAK,IAAI,CAAC,cAAe,CAAC,IAAI,CAAC,mBAAmB;AACvE,oBAAA,CAAC,CAAC,sBAAsB,KAAK,IAAI,CAAC,mBAAmB,CACxD;gBAED,IAAI,CAAC,OAAO,EAAE;AACZ,oBAAA,MAAM,SAAS,GAAG,IAAI,cAAc,EAAE;oBACtC,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,mBAAmB;oBAC5E,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI;AAC7C,oBAAA,SAAS,CAAC,sBAAsB,GAAG,IAAI,CAAC,mBAAmB;AAC3D,oBAAA,SAAS,CAAC,MAAM,GAAG,MAAM;;oBAGzB,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;wBACpC,SAAS,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC;;AAG5D,oBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;;;YAIlC,IAAI,CAAC,gBAAgB,EAAE;;;;;IAM3B,gBAAgB,CAAC,KAAiB,EAAE,CAAQ,EAAA;AAC1C,QAAA,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAElC,KAAK,CAAC,eAAe,EAAE;QACvB,KAAK,CAAC,cAAc,EAAE;AAEtB,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACvB,YAAA,IAAI,CAAC,aAAa,GAAG,CAAC;;aACjB;AACL,YAAA,IAAI,CAAC,aAAa,GAAG,SAAS;;;AAIlC,IAAA,iBAAiB,CAAC,KAAiB,EAAE,IAAoB,EAAE,KAAa,EAAA;QACtE,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,KAAK,CAAC;QAE7C,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM;YAAE;QAE/B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;;;;IAK3C,SAAS,GAAU,EAAE;IACrB,SAAS,GAAU,EAAE;AAErB,IAAA,kBAAkB,CAAC,OAAoB,EAAA;AACrC,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoC;AACvD,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE;gBACtC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;;;AAGhF,QAAA,OAAO,GAAG;;IAGZ,aAAa,GAAA;QACX,IAAI,CAAC,QAAQ,CAAC;AACZ,YAAA,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,kBAAkB,CAAC;AACzD,SAAA,CAAC;;AAGJ,IAAA,QAAQ,CAAC,MAAW,EAAA;AAClB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;AAC3B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;;IAGrB,IAAI,GAAA;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;AACnC,QAAA,IAAI,CAAC,MAAM;YAAE;AAEb,QAAA,QAAQ,MAAM,CAAC,IAAI;AACjB,YAAA,KAAK,YAAY;AACf,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;gBAC1B;YAEF,KAAK,aAAa,EAAE;;AAElB,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC;;gBAGtD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;;AAGpC,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC3B;;;;AAKN,IAAA,aAAa,CAAC,MAAW,EAAA;AACvB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AAEpE,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAClB,YAAA,IAAI,EAAE,YAAY;AAClB,YAAA,MAAM,EAAE,KAAK;AACd,SAAA,CAAC;;QAGF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAO,KAAI;AAC1C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,KAAK,EAAE,CAAC;YACpE,IAAI,IAAI,EAAE;gBACR,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;gBAC3B,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;;AAE/B,SAAC,CAAC;;IAGJ,IAAI,GAAA;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;AACnC,QAAA,IAAI,CAAC,MAAM;YAAE;AAEb,QAAA,QAAQ,MAAM,CAAC,IAAI;AACjB,YAAA,KAAK,YAAY;AACf,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;gBAC1B;YAEF,KAAK,aAAa,EAAE;AAClB,gBAAA,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE;;gBAG7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CACpC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,KAAK,MAAM,IAAI,CAAC,CAAC,sBAAsB,KAAK,MAAM,CAC/E;AAED,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,KAAK,MAAM,CAAC;gBAC5E,IAAI,GAAG,IAAI,CAAC;oBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AAE1C,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC3B;;;;AAKN,IAAA,aAAa,CAAC,MAAW,EAAA;AACvB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AAEpE,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAClB,YAAA,IAAI,EAAE,YAAY;AAClB,YAAA,MAAM,EAAE,KAAK;AACd,SAAA,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAO,KAAI;AAC1C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,KAAK,EAAE,CAAC;YACpE,IAAI,IAAI,EAAE;gBACR,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;gBAC3B,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;;AAE/B,SAAC,CAAC;;;IAKJ,UAAU,GAAG,GAAG;IAChB,WAAW,GAAG,EAAE;;IAIhB,gBAAgB,GAAA;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;;IAGxF,SAAS,GAAA;AACP,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC;YAAE;QAEtC,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AAC5D,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;;IAGjD,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC;YAAE;QAEtC,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE;QACrC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM;AAEhE,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AAClB,YAAA,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC;AAClD,SAAC,CAAC;;IAGJ,UAAU,GAAA;AACR,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC;YAAE;QAEtC,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9E,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;;IAGnE,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC;YAAE;QAEtC,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AAC5D,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;;IAGjD,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC;YAAE;QAEtC,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE;QACrC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM;AAEhE,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AAClB,YAAA,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC;AACnD,SAAC,CAAC;;IAGJ,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC;YAAE;QAEtC,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/E,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;;IAGpE,oBAAoB,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC;YAAE;QAEtC,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;AAEzF,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAEpC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;AACjE,QAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AAE9G,QAAA,IAAI,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;QAE5B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACrB,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACrC,gBAAA,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,KAAK;gBAC9C;;AAEF,YAAA,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC;AACpB,YAAA,CAAC,IAAI,IAAI,CAAC,UAAU,GAAG,KAAK;AAC9B,SAAC,CAAC;;IAGJ,kBAAkB,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC;YAAE;QAEtC,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;AAEzF,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAEpC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AACnE,QAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AAEhH,QAAA,IAAI,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;QAE5B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACrB,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACrC,gBAAA,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,KAAK;gBAC/C;;AAEF,YAAA,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC;AACpB,YAAA,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG,KAAK;AAC/B,SAAC,CAAC;;;;IAMJ,IAAI,GAAG,CAAC;IACR,OAAO,GAAG,GAAG;IACb,OAAO,GAAG,CAAC;IACX,QAAQ,GAAG,GAAG;AAEd,IAAA,IAAI,YAAY,GAAA;QACd,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC;QACpC,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC;QAErC,OAAO,CAAA;AACK,cAAA,EAAA,EAAE,IAAI,EAAE,CAAA;AACZ,UAAA,EAAA,IAAI,CAAC,IAAI,CAAA;gBACL,CAAC,EAAE,CAAI,CAAA,EAAA,CAAC,EAAE,CAAA;GACvB;;IAGD,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC;;IAG/D,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC;;;;AAM/D,IAAA,cAAc,CAAC,IAAoB,EAAA;QACjC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,CAAC;QACtF,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,IAAI,IAAI,CAAC,sBAAsB,CAAC;AAEzF,QAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,KAAK;QAE1B,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,OAAO,CAAC;QAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC;AAExC,QAAA,OAAO,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;;AAGtB,IAAA,oBAAoB,CAAC,IAAoB,EAAA;;AAEvC,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACnE,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACrF,YAAA,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;;;QAI/B,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,CAAC;QACtF,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,IAAI,IAAI,CAAC,sBAAsB,CAAC;AAEzF,QAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QAEnC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,OAAO,CAAC;QAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC;QAExC,OAAO;YACL,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC;YACtB,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC;SACvB;;AAGH,IAAA,aAAa,CAAC,IAAmB,EAAE,IAAA,GAA4C,OAAO,EAAA;;;QAIpF,MAAM,KAAK,GAAG,GAAG;QACjB,MAAM,MAAM,GAAG,EAAE;QAEjB,QAAQ,IAAI;AACV,YAAA,KAAK,MAAM;gBACT,OAAO;AACL,oBAAA,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;oBACtB,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC;iBACpC;AAEH,YAAA,KAAK,OAAO;gBACV,OAAO;AACL,oBAAA,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,KAAK;oBAC9B,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC;iBACpC;AAEH,YAAA,KAAK,KAAK;gBACR,OAAO;oBACL,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;AAClC,oBAAA,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;iBACvB;AAEH,YAAA,KAAK,QAAQ;gBACX,OAAO;oBACL,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;AAClC,oBAAA,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,MAAM;iBAChC;;;AAIP,IAAA,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;;IAG5C,eAAe,CAAC,IAAoB,EAAE,CAA2B,EAAA;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAE3C,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,CAAC;QAErB,IAAI,OAAO,GAAG,QAAQ;QACtB,IAAI,KAAK,GAAG,CAAC;AAEb,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAElE,YAAA,IAAI,CAAC,GAAG,OAAO,EAAE;gBACf,OAAO,GAAG,CAAC;gBACX,KAAK,GAAG,CAAC;;;;QAKb,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC;;AAG3B,IAAA,iBAAiB,CAAC,IAAoB,EAAA;QACpC,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,sBAAsB;AAAE,YAAA,OAAO,IAAI;QAE1E,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC;QACnD,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC;AAEpD,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE;AAAE,YAAA,OAAO,IAAI;QAE7B,OAAO;AACL,YAAA,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,EAAE;YAC7D,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,EAAE,CAAC;AACnC,YAAA,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,EAAE;SACpD;;AAGH,IAAA,sBAAsB,CAAC,CAAM,EAAE,CAAM,EAAE,CAAM,EAAA;QAC3C,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAEpB,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;YACxB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAGzC,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAErE,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAE3C,QAAA,MAAM,IAAI,GAAG;AACX,YAAA,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,EAAE;AACrB,YAAA,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,EAAE;SACtB;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;;IAG/C,kBAAkB,CAAC,CAAS,EAAE,CAAS,EAAA;AACrC,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;;IAGjH,cAAc,GAAA;;QAGZ,MAAM,OAAO,GAAG,GAAG;QACnB,MAAM,gBAAgB,GAAG,IAAI;QAE7B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CACnB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,IAAI,OAAO,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;AAC7G,QAAA,gBAAgB,CACjB;QAED,OAAO,IAAI,GAAG,OAAO;;IAGvB,eAAe,GAAA;;QAGb,MAAM,OAAO,GAAG,GAAG;QACnB,MAAM,iBAAiB,GAAG,IAAI;AAE9B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,iBAAiB,CAAC;QAElG,OAAO,IAAI,GAAG,OAAO;;AAGvB;;AAEmC;AACnC,IAAA,WAAW,CAAC,KAAiB,EAAE,OAAO,GAAG,KAAK,EAAA;AAC5C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,aAA8B;AACtD,QAAA,MAAM,EAAE,GAAG,GAAG,CAAC,cAAc,EAAE;AAE/B,QAAA,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO;AACpB,QAAA,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO;AAEpB,QAAA,MAAM,MAAM,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,EAAG,CAAC,OAAO,EAAE,CAAC;QAEhE,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE;;aAC9B;AACL,YAAA,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE;;;IAIjD,eAAe,GAAA;QACb,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AAE1C,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACzD,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACzD,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACzD,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AAEzD,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE;AAE/B,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;AAC7B,YAAA,MAAM,GAAG,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;AAC5B,YAAA,MAAM,GAAG,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;YAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,GAAG;YAClC,MAAM,GAAG,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE;AAEjC,YAAA,MAAM,SAAS,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;YAElE,IAAI,SAAS,EAAE;gBACb,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC;;;;IAKxD,SAAS,CAAC,CAA2B,EAAE,KAAkB,EAAA;AACvD,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,EAAE,MAAM;AAAE,YAAA,OAAO,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,CAAC;QAE9B,OAAO;YACL,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;SAClB;;AAGH,IAAA,IAAI,CAAC,KAAa,EAAA;AAChB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ;;AAG1D,IAAA,OAAO,CAAC,EAAU,EAAA;AAChB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,KAAK,EAAE,CAAC;;;;AAKhE,IAAA,SAAS,CAAC,IAAoB,EAAA;QAC5B,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,sBAAsB;AAAE,YAAA,OAAO,EAAE;QAExE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC;QACnD,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC;AAEpD,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE;AAAE,YAAA,OAAO,EAAE;AAE3B,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,IAAI,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC;AAClG,YAAA,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE;SAC5B;AAED,QAAA,MAAM,GAAG,GAAG;AACV,YAAA,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC,SAAS,IAAI,OAAO,GAAG,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,GAAG,GAAG,GAAG,CAAC,CAAC;AAC1F,YAAA,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE;SAC1B;AAED,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE;AAC/D,YAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;;;QAI/E,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;;IAG7D,gBAAgB,GAAA;QACd,IAAI,CAAC,IAAI,CAAC,cAAc;AAAE,YAAA,OAAO,EAAE;AAEnC,QAAA,MAAM,KAAK,GAAG;YACZ,CAAC,EACC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;iBACtC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,IAAI;AACrC,sBAAE;sBACA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC;AACtC,0BAAE;0BACA,GAAG,CAAC;YACZ,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE;SAChD;AAED,QAAA,MAAM,GAAG,GAAG;YACV,CAAC,EAAE,IAAI,CAAC,QAAQ;YAChB,CAAC,EAAE,IAAI,CAAC,QAAQ;SACjB;;QAGD,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;AACpC,YAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;;;;QAK/E,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;;IAGhE,eAAe,CAAC,KAAa,EAAE,KAAa,EAAE,GAAW,EAAE,GAAW,EAAE,SAAS,GAAG,EAAE,EAAA;QACpF,MAAM,EAAE,GAAG,KAAK;QAChB,MAAM,EAAE,GAAG,KAAK;QAEhB,MAAM,EAAE,GAAG,GAAG;QACd,MAAM,EAAE,GAAG,GAAG;AAEd;;AAEmC;AACnC,QAAA,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE;AAClB,QAAA,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE;AAClB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;AAE7C;;AAEmC;QACnC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,SAAS;QACtC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,SAAS;QAEtC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,SAAS;QACtC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,SAAS;AAEtC;;AAEmC;QACnC,OAAO,CAAA;AACH,MAAA,EAAA,EAAE,IAAI,EAAE,CAAA;AACR,MAAA,EAAA,EAAE,IAAI,EAAE,CAAA;GACb;;IAGD,eAAe,CACb,IAGC,EACD,GAAW,EACX,GAAW,EACX,SAAS,GAAG,EAAE,EAAA;AAEd,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,GAAG;QACvG,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE;QAExC,MAAM,EAAE,GAAG,GAAG;QACd,MAAM,EAAE,GAAG,GAAG;;AAId;;AAEmC;AACnC,QAAA,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE;AAClB,QAAA,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE;AAClB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;AAE7C,QAAA,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG;AACnB,QAAA,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG;AAEnB;;AAEmC;AACnC,QAAA,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,SAAS;AAC5B,QAAA,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,SAAS;AAE5B,QAAA,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,SAAS;AAC5B,QAAA,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,SAAS;AAE5B;;AAEmC;AACnC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;AAEjD;;AAEmC;AACnC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;AAErE,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;AAEvD;;AAEmC;QACnC,IAAI,CAAC,OAAO,EAAE;YACZ,IAAI,GAAW,EAAE,GAAW;YAC5B,IAAI,GAAW,EAAE,GAAW;AAE5B,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;;AAE/B,gBAAA,GAAG,GAAG,EAAE,GAAG,UAAU;gBACrB,GAAG,GAAG,EAAE;AACR,gBAAA,GAAG,GAAG,EAAE,GAAG,UAAU;gBACrB,GAAG,GAAG,EAAE;;iBACH;;AAEL,gBAAA,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC5B,GAAG,GAAG,EAAE;AACR,gBAAA,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,UAAU;gBAC3B,GAAG,GAAG,EAAE;AACR,gBAAA,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,UAAU;;YAG7B,OAAO,CAAA;AACH,QAAA,EAAA,EAAE,IAAI,EAAE,CAAA;AACR,QAAA,EAAA,GAAG,IAAI,GAAG,CAAA;AACV,QAAA,EAAA,GAAG,IAAI,GAAG,CAAA;AACV,QAAA,EAAA,EAAE,IAAI,EAAE,CAAA;KACb;;AAGD;;AAEmC;AACnC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC;QAE1B,MAAM,KAAK,GAAG,EAAE;QAEhB,OAAO,CAAA;AACH,MAAA,EAAA,EAAE,IAAI,EAAE,CAAA;QACR,EAAE,GAAG,KAAK,CAAA,CAAA,EAAI,EAAE,CAAA;QAChB,EAAE,GAAG,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA;AACpB,MAAA,EAAA,IAAI,IAAI,MAAM,CAAA;QACd,EAAE,GAAG,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA;AACpB,MAAA,EAAA,EAAE,IAAI,EAAE,CAAA;GACb;;IAGD,sBAAsB,CACpB,MAAkC,EAClC,SAAS,GAAG,EAAE,EACd,OAAO,GAAG,GAAG,EAAA;AAEb,QAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;AAAE,YAAA,OAAO,EAAE;AAEhC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;QAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC;AAE7F,QAAA,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;AAEhD,QAAA,IAAI,CAAC,GAAG,CAAA,EAAA,EAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AAEnC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AACvC,YAAA,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AAC/B,YAAA,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;YACjB,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACrB,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;AAE3B,YAAA,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,OAAO;AAC1C,YAAA,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,OAAO;AAE1C,YAAA,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,OAAO;AAC1C,YAAA,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,OAAO;AAE1C,YAAA,CAAC,IAAI,CAAM,GAAA,EAAA,GAAG,IAAI,GAAG,CAAA,EAAA,EAAK,GAAG,CAAI,CAAA,EAAA,GAAG,CAAK,EAAA,EAAA,EAAE,CAAC,CAAC,CAAA,CAAA,EAAI,EAAE,CAAC,CAAC,EAAE;;AAGzD,QAAA,OAAO,CAAC;;AAGV,IAAA,WAAW,CAAC,IAA8B,EAAE,EAA4B,EAAE,GAAW,EAAA;QACnF,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACxB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACxB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;QAE7C,OAAO;YACL,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,GAAG;YAC5B,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,GAAG;SAC7B;;AAGH,IAAA,cAAc,CACZ,IAGC,EACD,EAAU,EACV,EAAU,EAAA;AAEV,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvG,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE;QAExC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAI;YAC9B,IAAI,CAAC,CAAC,mBAAmB,KAAK,IAAI,CAAC,IAAI,CAAC,mBAAmB;AAAE,gBAAA,OAAO,KAAK;;YAGzE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAAE,gBAAA,OAAO,KAAK;;YAGjD,OAAO,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC;AACvC,SAAC,CAAC;;AAGJ,IAAA,cAAc,CACZ,IAGC,EACD,GAAW,EACX,GAAW,EAAA;QAEX,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE;QAE3C,MAAM,OAAO,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;AAElD,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,YAAA,MAAM,MAAM,GAAG,KAAK,GAAG,MAAM;YAE7B,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE;AACvC,gBAAA,OAAO,MAAM;;;;QAKjB,OAAO,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;;AAG5C,IAAA,cAAc,CAAC,KAAa,EAAE,GAAW,EAAE,IAAmB,EAAA;AAC5D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,GAAG;QAErC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;AAEjC,QAAA,OAAO,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI;;AAGjC,IAAA,kBAAkB,CAChB,CAAS,EACT,IAAmB,EACnB,SAAS,GAAG,CAAC,EAAA;AAEb,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE;QAEvC,OAAO,CAAC,GAAG,GAAG,GAAG,SAAS,IAAI,CAAC,GAAG,MAAM,GAAG,SAAS;;AAGtD,IAAA,WAAW,CACT,IAGC,EACD,GAAW,EACX,MAAc,EAAA;QAEd,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE;QACxC,MAAM,EAAE,GAAG,GAAG;QACd,MAAM,EAAE,GAAG,MAAM;QAEjB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAI;YAC/B,IAAI,CAAC,CAAC,mBAAmB,KAAK,IAAI,CAAC,IAAI,CAAC,mBAAmB;AAAE,gBAAA,OAAO,KAAK;;YAGzE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAAE,gBAAA,OAAO,KAAK;;YAGjD,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3C,SAAC,CAAC;;;AAIJ,IAAA,UAAU,GAAG,CAAC,EAA4C,EAAE,EAAmC,KAAa;QAC1G,IAAI,EAAE,EAAE;YACN,OAAO,OAAO,EAAE,KAAK,QAAQ,GAAG,EAAE,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI;;aAC/D;AACL,YAAA,OAAO,KAAK;;AAEhB,KAAC;IAED,uBAAuB,GAAsC,EAAE;IAC/D,oBAAoB,CAAC,GAAW,EAAE,eAAkD,EAAA;QAClF,IAAI,CAAC,uBAAuB,GAAG;AAC5B,aAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;AAClC,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;;AAGjD,IAAA,WAAW,CAAC,YAAoB,EAAA;AAC9B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;YAAE;QAC1B,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,YAAY,CAAC,EAAE;AACtF,YAAA,IAAI,CAAC,QAAQ,CAAC,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;;;IAM9F,sBAAsB,GAAG,KAAK;IAE9B,cAAc,GAAe,EAAE;IAC/B,WAAW,GAAoB,EAAE;IACjC,YAAY,GAAqB,EAAE;AAEnC,IAAA,kBAAkB,CAAC,IAAoB,EAAA;AACrC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAC/B,CAAC,CAAC,KACA,CAAC,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc;gBACvC,CAAC,IAAI,CAAC,WAAY,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,cAAc,CAAC,CAC1F;;QAEH,OAAO,IAAI,CAAC,cAAc;;AAG5B,IAAA,eAAe,CAAC,cAAsB,EAAA;AACpC,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,cAAc,IAAI,cAAc,CAAC;;AAG3E,IAAA,gBAAgB,CAAC,mBAA2B,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,IAAI,mBAAmB,CAAC;;IAGtF,iBAAiB,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE;AACnC,YAAA,MAAM,CAAC,QAAQ,GAAG,IAAI;AACtB,YAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC;;;AAI1F,IAAA,MAAM,oBAAoB,CAAC,UAAsB,EAAE,IAAoB,EAAA;QACrE,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE;AAC7C,YAAA,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;AAClC,gBAAA,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;;iBAC3D;gBACL,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC;AACzD,gBAAA,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;;;;IAKtE,MAAM,gBAAgB,CAAC,MAAsB,EAAA;AAC3C,QAAA,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;QAEnB,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE;AACxC,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;gBACrB,yBAAyB,EAAE,MAAM,CAAC,yBAAyB;gBAC3D,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;AACpD,aAAA,CAAC;;;uGAhjEK,uBAAuB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,aAAA,EAAA,eAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,KAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,yBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,yBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,wBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtfpC,g8tDAi3CA,EAAA,MAAA,EAAA,CAAA,u7JAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDz5BI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,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,IAAA,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,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,aAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,WAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,aAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,eAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAG,EACH,QAAA,EAAA,KAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,8IAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2EAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,uBAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,0BAAA,EAAA,0BAAA,EAAA,2BAAA,EAAA,uBAAA,EAAA,6BAAA,EAAA,yBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,WAAW,EACX,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,eAAA,EAAA,aAAA,EAAA,YAAA,EAAA,YAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,YAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,MAAA,EAAA,SAAA,EAAA,cAAA,EAAA,YAAA,EAAA,UAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,kBAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,qBAAqB,EACrB,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,eAAA,EAAA,aAAA,EAAA,YAAA,EAAA,0BAAA,EAAA,WAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,eAAA,EAAA,aAAA,EAAA,YAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,MAAA,EAAA,SAAA,EAAA,cAAA,EAAA,eAAA,EAAA,YAAA,EAAA,UAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,YAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,cAAc,sMACd,cAAc,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,YAAA,EAAA,eAAA,EAAA,eAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,MAAA,EAAA,YAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,cAAA,EAAA,YAAA,EAAA,UAAA,EAAA,aAAA,EAAA,UAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,eAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,cAAA,EAAA,eAAA,EAAA,cAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,YAAA,EAAA,eAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,MAAA,EAAA,KAAA,EAAA,KAAA,EAAA,WAAA,EAAA,YAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,eAAA,EAAA,UAAA,EAAA,aAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,aAAA,EAAA,cAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,YAAA,EAAA,SAAA,EAAA,eAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,yBAAA,EAAA,sBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,gFAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,+GAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,eAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,4BAAA,EAAA,YAAA,EAAA,aAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,6BAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,8BAAA,EAAA,QAAA,EAAA,iDAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACV,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,YAAA,EAAA,aAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,eAAA,EAAA,YAAA,EAAA,aAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,SAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,UAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,EAAA,aAAA,EAAA,QAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,YAAA,EAAA,aAAA,EAAA,cAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,uBAAuB,EAAA,QAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,qBAAqB,EAAA,QAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAGb,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAnCnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAGtB,OAAA,EAAA;wBACP,YAAY;wBACZ,WAAW;wBACX,YAAY;wBACZ,cAAc;wBACd,WAAW;wBACX,aAAa;wBACb,YAAY;wBACZ,GAAG;wBACH,cAAc;wBACd,eAAe;wBACf,WAAW;wBACX,qBAAqB;wBACrB,cAAc;wBACd,cAAc;wBACd,aAAa;wBACb,YAAY;wBACZ,YAAY;wBACZ,iBAAiB;wBACjB,aAAa;wBACb,eAAe;wBACf,kBAAkB;wBAClB,oBAAoB;wBACpB,UAAU;wBACV,gBAAgB;wBAChB,uBAAuB;wBACvB,qBAAqB;wBACrB,OAAO;wBACP,sBAAsB;AACvB,qBAAA,EAAA,QAAA,EAAA,g8tDAAA,EAAA,MAAA,EAAA,CAAA,u7JAAA,CAAA,EAAA;8BAIQ,MAAM,EAAA,CAAA;sBAAd;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,gBAAgB,EAAA,CAAA;sBAAxB;gBA6CiB,MAAM,EAAA,CAAA;sBAAvB,MAAM;uBAAC,QAAQ;gBACS,aAAa,EAAA,CAAA;sBAArC,MAAM;uBAAC,eAAe;gBACG,cAAc,EAAA,CAAA;sBAAvC,MAAM;uBAAC,gBAAgB;gBACA,YAAY,EAAA,CAAA;sBAAnC,MAAM;uBAAC,cAAc;gBACM,gBAAgB,EAAA,CAAA;sBAA3C,MAAM;uBAAC,kBAAkB;gBAqEa,SAAS,EAAA,CAAA;sBAA/C,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;gBACD,MAAM,EAAA,CAAA;sBAAzC,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;gBAqBlC,SAAS,EAAA,CAAA;sBADR,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;gBAuae,uBAAuB,EAAA,CAAA;sBAA/E,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,yBAAyB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;gBA8CC,sBAAsB,EAAA,CAAA;sBAA7E,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,wBAAwB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;gBA6CR,YAAY,EAAA,CAAA;sBAAzD,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,cAAc,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;;;ME5nCjC,yBAAyB,CAAA;AACV,IAAA,cAAc;IAExC,UAAU,GAAG,KAAK;IACT,WAAW,GAAkB,IAAI;AAChC,IAAA,iBAAiB,GAAG,IAAI,YAAY,EAAE;AAEtC,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAE;;AAGvC,IAAA,WAAW;IAEX,YAAY,GAAA;;AAEV,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;;AAGhC,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,YAAA,UAAU,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC;;AAC3D,aAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AAC5B,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK;;aAClB;YACL,IAAI,CAAC,aAAa,EAAE;;;AAIxB,IAAA,WAAW,CAAC,KAAiB,EAAA;QAC3B,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AACrB,QAAA,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,KAAK,EAAE;QACzC,IAAI,CAAC,aAAa,EAAE;;;IAItB,OAAO,GAAA;AACL,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;;;IAIlC,MAAM,GAAA;;AAEJ,QAAA,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,MAAK;YACjC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE;AAC7B,gBAAA,IAAI,CAAC,UAAU,GAAG,KAAK;;AAE3B,SAAC,EAAE,GAAG,CAAC,CAAC;;IAGV,aAAa,GAAA;QACX,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QAC7C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;;uGArD3B,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,+SCXtC,m6BA+BA,EAAA,MAAA,EAAA,CAAA,m0CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDtBY,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,8mBAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAf,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEtC,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBANrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,WAGpB,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC,EAAA,QAAA,EAAA,m6BAAA,EAAA,MAAA,EAAA,CAAA,m0CAAA,CAAA,EAAA;8BAGxB,cAAc,EAAA,CAAA;sBAAvC,SAAS;uBAAC,aAAa;gBAGf,WAAW,EAAA,CAAA;sBAAnB;gBACS,iBAAiB,EAAA,CAAA;sBAA1B;gBAES,QAAQ,EAAA,CAAA;sBAAjB;;;MEkBU,mBAAmB,CAAA;AAC9B,IAAA,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAEM,IAAA,YAAY;IAE/D,QAAQ,GAAA;QACN,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC;;uGANjD,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,EA5BpB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBT,EA1BS,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,i0DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,oIAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FA6BzB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBA/B/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,WACd,CAAC,YAAY,EAAE,YAAY,CAAC,EAC3B,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;AAyBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,i0DAAA,CAAA,EAAA;8BAMkD,YAAY,EAAA,CAAA;sBAA9D,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,oBAAoB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;;AC9B7C,MAAO,iBAAkB,SAAQ,WAAW,CAAA;AAChD,IAAA,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC;AAE3B,IAAA,iBAAiB,CAAC,IAAS,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,GAAG,EAAE,8BAA8B;YACnC,MAAM,EAAE,CAAC,IAAI,CAAC;AACf,SAAA,CAAC;;IAGJ,cAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,GAAG,EAAE,2BAA2B;AACjC,SAAA,CAAC;;AAGJ,IAAA,iBAAiB,CAAC,IAAS,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,GAAG,EAAE,8BAA8B;YACnC,MAAM,EAAE,CAAC,IAAI,CAAC;AACf,SAAA,CAAC;;IAGJ,cAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,GAAG,EAAE,2BAA2B;AACjC,SAAA,CAAC;;AAGJ,IAAA,iBAAiB,CAAC,MAAc,EAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,GAAG,EAAE,8BAA8B;YACnC,MAAM,EAAE,CAAC,MAAM,CAAC;AACjB,SAAA,CAAC;;AAGJ,IAAA,iBAAiB,CAAC,MAAc,EAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,GAAG,EAAE,8BAA8B;YACnC,MAAM,EAAE,CAAC,MAAM,CAAC;AACjB,SAAA,CAAC;;AAGJ,IAAA,cAAc,CAAC,MAAc,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,GAAG,EAAE,2BAA2B;YAChC,MAAM,EAAE,CAAC,MAAM,CAAC;AACjB,SAAA,CAAC;;AAGJ,IAAA,gBAAgB,CAAC,GAAQ,EAAA;AACvB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAG,+BAA+B,EAAE,GAAG,CAAC;;AAGrF,IAAA,mBAAmB,CAAC,WAAgB,EAAA;AAClC,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAG,kCAAkC,EAAE,WAAW,CAAC;;AAGhG,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,MAAM,CAAC,GAAG,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;AAC3C,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,GAAG,4BAA4B,EAAE,CAAC,CAAC;;AAGlF,IAAA,qBAAqB,CAAC,UAAkB,EAAA;AACtC,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,GAAG,EAAE,kCAAkC;YACvC,MAAM,EAAE,CAAC,UAAU,CAAC;AACrB,SAAA,CAAC;;IAGJ,wBAAwB,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,GAAG,EAAE,qCAAqC;AAC3C,SAAA,CAAC;;IAGJ,4BAA4B,CAAC,MAAc,EAAE,eAAuB,EAAA;AAClE,QAAA,IAAI,EAAE,GAAG,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,iBAAiB,EAAE,eAAe,CAAC;AAC7F,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,GAAG,kDAAkD,EAAE,EAAE,CAAC;;AAGzG,IAAA,kBAAkB,CAAC,MAAc,EAAA;AAC/B,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,GAAG,EAAE,+BAA+B;YACpC,MAAM,EAAE,CAAC,MAAM,CAAC;AACjB,SAAA,CAAC;;uGArFO,iBAAiB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA;;2FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACDM,MAAML,MAAI,GAAG;AAClB,IAAA,OAAO,EAAE,uBAAuB;AAChC,IAAA,MAAM,EAAE,sBAAsB;AAC9B,IAAA,OAAO,EAAE,uBAAuB;AAChC,IAAA,SAAS,EAAE,yBAAyB;AACpC,IAAA,SAAS,EAAE,yBAAyB;AACpC,IAAA,MAAM,EAAE,sBAAsB;CAC/B;AAKK,MAAO,WAAY,SAAQ,WAAW,CAAA;AAC1C,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAErC,IAAA,OAAO,CAAC,EAAO,EAAA;AACb,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,kBAAkB;YACvB,MAAM,EAAE,CAAC,EAAE,CAAC;AACb,SAAA,CAAC;;IAGJ,MAAM,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,iBAAiB;AACvB,SAAA,CAAC;;AAGJ,IAAA,OAAO,CAAC,MAAW,EAAA;AACjB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,OAAO,EAAE,MAAM,CAAC;;AAGrE,IAAA,SAAS,CAAC,MAAW,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,oBAAoB;YACzB,MAAM,EAAE,CAAC,MAAM,CAAC;AACjB,SAAA,CAAC;;AAGJ,IAAA,SAAS,CAAC,GAAQ,EAAA;AAChB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,oBAAoB;YACzB,MAAM,EAAE,CAAC,GAAG,CAAC;AACd,SAAA,CAAC;;AAGJ,IAAA,MAAM,CAAC,EAAO,EAAA;AACZ,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;AAChD,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,MAAM,EAAE,MAAM,CAAC;;uGApC3D,WAAW,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAX,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA;;2FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACXM,MAAMA,MAAI,GAAG;AAClB,IAAA,OAAO,EAAE,uBAAuB;AAChC,IAAA,MAAM,EAAE,sBAAsB;AAC9B,IAAA,OAAO,EAAE,uBAAuB;AAChC,IAAA,SAAS,EAAE,yBAAyB;AACpC,IAAA,SAAS,EAAE,yBAAyB;AACpC,IAAA,MAAM,EAAE,sBAAsB;CAC/B;AAKK,MAAO,WAAY,SAAQ,WAAW,CAAA;AAC1C,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAErC,IAAA,OAAO,CAAC,EAAO,EAAA;AACb,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,kBAAkB;YACvB,MAAM,EAAE,CAAC,EAAE,CAAC;AACb,SAAA,CAAC;;IAGJ,MAAM,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,iBAAiB;AACvB,SAAA,CAAC;;AAGJ,IAAA,OAAO,CAAC,MAAW,EAAA;AACjB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,OAAO,EAAE,MAAM,CAAC;;AAGrE,IAAA,SAAS,CAAC,MAAW,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,oBAAoB;YACzB,MAAM,EAAE,CAAC,MAAM,CAAC;AACjB,SAAA,CAAC;;AAGJ,IAAA,SAAS,CAAC,GAAQ,EAAA;AAChB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,oBAAoB;YACzB,MAAM,EAAE,CAAC,GAAG,CAAC;AACd,SAAA,CAAC;;AAGJ,IAAA,MAAM,CAAC,EAAO,EAAA;AACZ,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;AAChD,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,MAAM,EAAE,MAAM,CAAC;;IAGtE,OAAO,GAAA;AACL,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,kBAAkB;AACxB,SAAA,CAAC;;AAGJ,IAAA,gBAAgB,CAAC,MAAc,EAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,+BAA+B;YACpC,MAAM,EAAE,CAAC,MAAM,CAAC;AACjB,SAAA,CAAC;;IAGJ,cAAc,CAAC,MAAqB,EAAE,OAAiB,EAAA;QACrD,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC;;AAE9C,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,yBAAyB;YAC9B,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpC,SAAA,CAAC;;AAGJ,IAAA,wBAAwB,CAAC,GAAQ,EAAA;AAC/B,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,mCAAmC;AACxC,YAAA,MAAM,EAAE,CAAC,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,CAAC;AACjF,SAAA,CAAC;;AAGJ,IAAA,kBAAkB,CAAC,KAAa,EAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,6BAA6B;YAClC,MAAM,EAAE,CAAC,KAAK,CAAC;AAChB,SAAA,CAAC;;uGAzEO,WAAW,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAX,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA;;2FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACaK,MAAO,kBAAmB,SAAQ,aAAa,CAAA;AACnD,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,IAAA,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAE7C,OAAO,GAAe,EAAE;IACxB,OAAO,GAAe,EAAE;IACxB,cAAc,GAAwB,EAAE;;IAGxC,WAAW,GAAwD,EAAE;;IAGrE,eAAe,GAAuE,EAAE;IAExF,QAAQ,GAAA;QACN,IAAI,CAAC,OAAO,EAAE;;IAGhB,OAAO,GAAA;QACL,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,CAAC;aACxG,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,KAAI;YAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE;YACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE;YACjC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC,IAAI,IAAI,EAAE;YAE/C,IAAI,CAAC,qBAAqB,EAAE;AAC9B,SAAC;AACA,aAAA,KAAK,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;;IAG1C,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;;QAGrB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA,EAAG,CAAC,CAAC,WAAW,CAAA,CAAA,EAAI,CAAC,CAAC,WAAW,CAAA,CAAE,CAAC,CAAC;QAEhG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAC5B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAY;AAChC,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE;YAE7B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAC5B,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW;;AAE/B,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAG,EAAA,MAAM,IAAI,MAAM,CAAA,CAAE,CAAC;AAC3E,aAAC,CAAC;;AAGF,YAAA,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC;AACpC,SAAC,CAAC;;;AAIJ,IAAA,qBAAqB,CAAC,MAAc,EAAA;AAClC,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;AACxB,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE;YACvE;;QAGF,IAAI,YAAY,GAAG,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAC5B,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;AAC9C,gBAAA,YAAY,EAAE;;AAElB,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG;AAC7B,YAAA,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM;YAC7C,aAAa,EAAE,YAAY,GAAG,CAAC,IAAI,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM;SACtE;;;IAIH,qBAAqB,CAAC,MAAc,EAAE,OAAgB,EAAA;QACpD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAC5B,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,OAAO;AACtD,SAAC,CAAC;;AAEF,QAAA,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC;;;AAIpC,IAAA,wBAAwB,CAAC,MAAc,EAAA;AACrC,QAAA,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC;;IAGpC,yBAAyB,GAAA;QACvB,MAAM,MAAM,GAA6D,EAAE;AAE3E,QAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;AAC/C,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;gBACvD,MAAM,CAAC,IAAI,CAAC;AACV,oBAAA,MAAM,EAAE,MAAM;AACd,oBAAA,MAAM,EAAE,MAAM;oBACd,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;AAC5C,iBAAA,CAAC;AACJ,aAAC,CAAC;AACJ,SAAC,CAAC;AAEF,QAAA,OAAO,MAAM;;IAGf,eAAe,GAAA;AACb,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,yBAAyB,EAAE;QAChD,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,CACpD,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,EACtF,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAC/B;;uGA3GQ,kBAAkB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,2GC/B/B,m5DA+CA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1BI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,aAAA,EAAA,cAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,YAAA,EAAA,SAAA,EAAA,eAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,yBAAA,EAAA,sBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,gFAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,+GAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,gBAAgB,0QAChB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,8IAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2EAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,qbACZ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAGH,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAd9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,EAE3B,OAAA,EAAA;wBACP,YAAY;wBACZ,aAAa;wBACb,WAAW;wBACX,gBAAgB;wBAChB,eAAe;wBACf,cAAc;wBACd,YAAY;wBACZ,YAAY;AACb,qBAAA,EAAA,QAAA,EAAA,m5DAAA,EAAA;;;AEtBI,MAAMV,MAAI,GAAG;AAClB,IAAA,OAAO,EAAE,uBAAuB;AAChC,IAAA,SAAS,EAAE,yBAAyB;AACpC,IAAA,MAAM,EAAE,sBAAsB;AAC9B,IAAA,OAAO,EAAE,uBAAuB;AAChC,IAAA,SAAS,EAAE,yBAAyB;AACpC,IAAA,SAAS,EAAE,yBAAyB;AACpC,IAAA,MAAM,EAAE,sBAAsB;CAC/B;AAKK,MAAO,WAAY,SAAQ,WAAW,CAAA;AAC1C,IAAA,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC;AAE3B,IAAA,OAAO,CAAC,EAAO,EAAA;AACb,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;AAChD,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,OAAO,EAAE,MAAM,CAAC;;AAGvE,IAAA,SAAS,CAAC,EAAO,EAAA;AACf,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,GAAG,EAAE,oBAAoB;YACzB,MAAM,EAAE,CAAC,EAAE,CAAC;AACb,SAAA,CAAC;;IAGJ,MAAM,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,GAAG,EAAE,iBAAiB;AACvB,SAAA,CAAC;;AAGJ,IAAA,OAAO,CAAC,MAAW,EAAA;AACjB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,OAAO,EAAE,MAAM,CAAC;;AAGrE,IAAA,SAAS,CAAC,MAAW,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,GAAG,EAAE,oBAAoB;YACzB,MAAM,EAAE,CAAC,MAAM,CAAC;AACjB,SAAA,CAAC;;AAGJ,IAAA,SAAS,CAAC,GAAQ,EAAA;AAChB,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,GAAG,EAAE,oBAAoB;YACzB,MAAM,EAAE,CAAC,GAAG,CAAC;AACd,SAAA,CAAC;;AAGJ,IAAA,MAAM,CAAC,EAAO,EAAA;AACZ,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;AAChD,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,MAAM,EAAE,MAAM,CAAC;;AAGtE,IAAA,UAAU,CAAC,IAAS,EAAA;AAClB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAG,EAAA,UAAU,CAAC,WAAW,CAA0B,wBAAA,CAAA,EAAE,IAAI,CAAC;;AAGjF,IAAA,eAAe,CAAC,IAAS,EAAA;AACvB,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,GAAG,EAAE,0BAA0B;YAC/B,MAAM,EAAE,CAAC,IAAI,CAAC;AACf,SAAA,CAAC;;uGApDO,WAAW,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAX,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA;;2FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACYK,MAAO,kBAAmB,SAAQ,aAAa,CAAA;AACnD,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,IAAA,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAE7C,OAAO,GAAe,EAAE;IACxB,OAAO,GAAe,EAAE;IACxB,cAAc,GAAwB,EAAE;;IAGxC,WAAW,GAAwD,EAAE;;IAGrE,YAAY,GAAuE,EAAE;IAErF,QAAQ,GAAA;QACN,IAAI,CAAC,OAAO,EAAE;;IAGhB,OAAO,GAAA;QACL,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,CAAC;aACxG,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,KAAI;YAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE;YACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE;YACjC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC,IAAI,IAAI,EAAE;YAE/C,IAAI,CAAC,qBAAqB,EAAE;AAC9B,SAAC;AACA,aAAA,KAAK,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;;IAG1C,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;;QAGrB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA,EAAG,CAAC,CAAC,WAAW,CAAA,CAAA,EAAI,CAAC,CAAC,WAAW,CAAA,CAAE,CAAC,CAAC;QAEhG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAC5B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAY;AAChC,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE;YAE7B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAC5B,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAY;;AAEhC,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAG,EAAA,MAAM,IAAI,MAAM,CAAA,CAAE,CAAC;AAC3E,aAAC,CAAC;;AAGF,YAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;AACjC,SAAC,CAAC;;;AAIJ,IAAA,kBAAkB,CAAC,MAAc,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;AACxB,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE;YACpE;;QAGF,IAAI,YAAY,GAAG,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAC5B,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAY,CAAC,EAAE;AAC/C,gBAAA,YAAY,EAAE;;AAElB,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG;AAC1B,YAAA,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM;YAC7C,aAAa,EAAE,YAAY,GAAG,CAAC,IAAI,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM;SACtE;;;IAIH,qBAAqB,CAAC,MAAc,EAAE,OAAgB,EAAA;QACpD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAC5B,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAY,CAAC,GAAG,OAAO;AACvD,SAAC,CAAC;;AAEF,QAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;;;AAIjC,IAAA,wBAAwB,CAAC,MAAc,EAAA;AACrC,QAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;;IAGjC,yBAAyB,GAAA;QACvB,MAAM,MAAM,GAA6D,EAAE;AAE3E,QAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;AAC/C,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;gBACvD,MAAM,CAAC,IAAI,CAAC;AACV,oBAAA,MAAM,EAAE,MAAM;AACd,oBAAA,MAAM,EAAE,MAAM;oBACd,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;AAC5C,iBAAA,CAAC;AACJ,aAAC,CAAC;AACJ,SAAC,CAAC;AAEF,QAAA,OAAO,MAAM;;IAGf,eAAe,GAAA;AACb,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,yBAAyB,EAAE;QAChD,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,CACpD,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,EACtF,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAC/B;;uGA3GQ,kBAAkB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,2GC/B/B,8vDA2CA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDtBI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,aAAA,EAAA,cAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,YAAA,EAAA,SAAA,EAAA,eAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,yBAAA,EAAA,sBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,gFAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,+GAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,gBAAgB,0QAChB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,8IAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2EAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,qbACZ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAGH,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAd9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,EAE3B,OAAA,EAAA;wBACP,YAAY;wBACZ,aAAa;wBACb,WAAW;wBACX,gBAAgB;wBAChB,eAAe;wBACf,cAAc;wBACd,YAAY;wBACZ,YAAY;AACb,qBAAA,EAAA,QAAA,EAAA,8vDAAA,EAAA;;;AEEG,MAAO,uBAAwB,SAAQ,aAAa,CAAA;AACxD,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,IAAA,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAE7C,OAAO,GAAe,EAAE;IACxB,cAAc,GAAuB,EAAE;IAEvC,cAAc,GAAkB,IAAI;;AAGpC,IAAA,uBAAuB,GAAgB,IAAI,GAAG,EAAU;IAExD,SAAS,GAAG,KAAK;IACjB,QAAQ,GAAG,KAAK;IAEhB,QAAQ,GAAA;QACN,IAAI,CAAC,SAAS,EAAE;;;;IAKlB,SAAS,GAAA;QACP,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;;;IAI1E,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,EAAE,CAAC,IAAI,CACpD,CAAC,GAAG,MAAM,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,IAAI,CAAC,EACzC,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAC/B;;;AAIH,IAAA,YAAY,CAAC,MAAc,EAAA;AACzB,QAAA,IAAI,CAAC,MAAM;YAAE;AACb,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;;AAGrB,QAAA,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE;QAEpC,IAAI,iBAAiB,GAAa,EAAE;AACpC,QAAA,IAAI,CAAC;aACF,kBAAkB,CAAC,MAAM;AACzB,aAAA,IAAI,CACH,CAAC,GAAG,KAAI;YACN,iBAAiB,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE;YAC9C,IAAI,CAAC,uBAAuB,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC;AAC3D,SAAC,EACD,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AAE/B,aAAA,OAAO,CAAC,OAAO,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC;QAE1C,IAAI,CAAC,gBAAgB,EAAE;;;AAIzB,IAAA,mBAAmB,CAAC,IAAY,EAAA;QAC9B,OAAO,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC;;IAG/C,aAAa,CAAC,IAAY,EAAE,SAAkB,EAAA;QAC5C,IAAI,SAAS,EAAE;AACb,YAAA,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC;;aACjC;AACL,YAAA,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAI,CAAC;;;;IAK7C,eAAe,GAAA;QACb,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE;AAE1B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AAEpB,QAAA,MAAM,OAAO,GAA0B;YACrC,MAAM,EAAE,IAAI,CAAC,cAAc;;YAE3B,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC;SAC1D;AAED,QAAA,IAAI,CAAC;AACF,aAAA,4BAA4B,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;aAC9E,IAAI,CACH,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,wCAAwC,CAAC,EAC3E,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AAE/B,aAAA,OAAO,CAAC,OAAO,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC;;uGAvFhC,uBAAuB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,2GC/BpC,o0EAyDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDrCI,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAP,IAAA,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,IAAA,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,WAAW,8VACX,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,QAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,4BAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,aAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,WAAA,EAAA,aAAA,EAAA,wBAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,4rBACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,eAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,qbACZ,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAGP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAfnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,EAE3B,OAAA,EAAA;wBACP,YAAY;wBACZ,WAAW;wBACX,YAAY;wBACZ,cAAc;wBACd,cAAc;wBACd,eAAe;wBACf,YAAY;wBACZ,YAAY;wBACZ,gBAAgB;AACjB,qBAAA,EAAA,QAAA,EAAA,o0EAAA,EAAA;;;AEyBG,MAAO,0BAA2B,SAAQ,aAAa,CAAA;AAkCjD,IAAA,EAAA;AACA,IAAA,iBAAA;IAlCV,WAAW,GAAqB,EAAE;IAElC,UAAU,GAAG,EAAE;IAEf,cAAc,GAAG,KAAK;IACtB,QAAQ,GAAG,KAAK;IAChB,UAAU,GAAG,KAAK;IAClB,gBAAgB,GAAkB,IAAI;AACtC,IAAA,cAAc;;AAGd,IAAA,aAAa,GAAG;AACd,QAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,qBAAqB,EAAE;AAEjD,QAAA,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,0BAA0B,EAAE;AACxD,QAAA,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,4BAA4B,EAAE;AAC5D,QAAA,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,4BAA4B,EAAE;AAE5D,QAAA,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,4BAA4B,EAAE;AAC1D,QAAA,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,8BAA8B,EAAE;AAC9D,QAAA,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,8BAA8B,EAAE;AAE9D,QAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,0BAA0B,EAAE;KACvD;AAED,IAAA,qBAAqB,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;IAE/C,kBAAkB,GAAG,KAAK;AAC1B,IAAA,QAAQ;IAER,oBAAoB,GAA8D,EAAE;IAEpF,WACU,CAAA,EAAe,EACf,iBAAoC,EAAA;AAE5C,QAAA,KAAK,EAAE;QAHC,IAAE,CAAA,EAAA,GAAF,EAAE;QACF,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB;QAGzB,IAAI,CAAC,QAAQ,EAAE;QACf,IAAI,CAAC,YAAY,EAAE;;IAGrB,QAAQ,GAAA;QACN,IAAI,CAAC,QAAQ,EAAE;;IAGjB,YAAY,GAAA;QACV,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;AAC5B,YAAA,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC/E,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC1C,SAAA,CAAC;;IAGJ,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AAErB,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;YAC3D,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,KAAK,EAAE,GAAG,CAAC,KAAK;AAChB,YAAA,OAAO,EAAE,IAAI;AACd,SAAA,CAAC,CAAC;;IAGL,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;;IAGjC,mBAAmB,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;AACzB,YAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;gBACxD,OAAO,CAAC,WAAW,EAAE;gBACrB,OAAO,CAAC,sBAAsB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACpD,aAAC,CAAC;YACF;;QAGF,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK;AAE1D,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AAE1E,QAAA,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;AAChC,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,6CAA6C,CAAC;YACvE;;QAGF,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,KAAI;YACjD,OAAO;AACL,gBAAA,YAAY,EAAE,YAAY;AAC1B,gBAAA,YAAY,EAAE,YAAY;AAC1B,gBAAA,cAAc,EAAE,CAAA,EAAG,YAAY,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAA,CAAA,EAAI,MAAM,CAAC,KAAK,CAAE,CAAA;AACtE,gBAAA,cAAc,EAAE,CAAG,EAAA,MAAM,CAAC,KAAK,CAAA,CAAA,EAAI,YAAY,CAAE,CAAA;gBACjD,WAAW,EAAE,CAA4B,yBAAA,EAAA,YAAY,CAAE,CAAA;aACxD;AACH,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,IAAI,CAC1D,CAAC,GAAG,KAAI;YACN,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAqB,kBAAA,EAAA,WAAW,CAAC,MAAM,CAAY,UAAA,CAAA,CAAC;AAC7E,YAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;YAC/B,IAAI,CAAC,QAAQ,EAAE;AACjB,SAAC,EACD,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAC/B;;IAGH,QAAQ,GAAA;QACN,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;YAClC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACzC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACzC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACzC,cAAc,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC/C,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC3C,WAAW,EAAE,CAAC,EAAE,CAAC;AAClB,SAAA,CAAC;QAEF,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,GAAG,KAAI;AACjD,YAAA,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,IAAI,EAAE;AAClC,YAAA,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,IAAI,EAAE;AAElC,YAAA,IAAI,GAAG,IAAI,GAAG,EAAE;AACd,gBAAA,MAAM,aAAa,GAAG,CAAG,EAAA,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAI,CAAA,EAAA,GAAG,EAAE;AAC1D,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;;iBACnF;AACL,gBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpB,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;;;AAGnF,SAAC,CAAC;;IAGJ,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAChE,CAAC,GAAG,MAAM,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAC5C,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAC/B;;AAGH,IAAA,SAAS,CAAC,IAAqB,EAAA;AAC7B,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC1B,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,iBAAiB;YAE9C,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC;AAChD,YAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE;AAEvD,YAAA,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;gBAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;AAC/B,gBAAA,YAAY,EAAE,MAAM;gBACpB,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,WAAW,EAAE,IAAI,CAAC,WAAW;AAC9B,aAAA,CAAC;YAEF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE;YAClD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE;;aAC7C;AACL,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK;AACvB,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;YAC3B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE;YACjD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE;;;IAIrD,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;;IAG7B,cAAc,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;AAC/B,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC;YACvC;;QAGF,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE;AAElD,QAAA,MAAM,OAAO,GAAG;YACd,iBAAiB,EAAE,IAAI,CAAC,gBAAgB;YACxC,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,WAAW,EAAE,QAAQ,CAAC,WAAW;SAClC;AAED,QAAA,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,CACnD,CAAC,GAAG,KAAI;AACN,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA,2BAAA,CAA6B,CAAC;AACvD,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK;YAC3B,IAAI,CAAC,QAAQ,EAAE;AACjB,SAAC,EACD,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAC/B;;IAGH,MAAM,gBAAgB,CAAC,EAAU,EAAA;QAC/B,MAAM,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,CAAC;AACjD,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAC5C,IAAI,CAAC,QAAQ,EAAE;;uGA1MN,0BAA0B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAlB,EAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAmB,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA1B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,0BAA0B,sGCtDvC,o7OAsLA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDpJI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAhB,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,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,EACnB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,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,EAAA,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,YAAY,iQACZ,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,eAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,aAAA,EAAA,cAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,YAAA,EAAA,SAAA,EAAA,eAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,yBAAA,EAAA,sBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,gFAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,+GAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,eAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,ozBACb,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,WAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,cAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,cAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,cAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,8IAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2EAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,gBAAgB,EAChB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,oBAAoB,4sBACpB,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,yBAAyB,EACzB,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,4sBAClB,eAAe,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAGN,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAxBtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAEtB,OAAA,EAAA;wBACP,YAAY;wBACZ,WAAW;wBACX,mBAAmB;wBACnB,YAAY;wBACZ,aAAa;wBACb,aAAa;wBACb,WAAW;wBACX,eAAe;wBACf,aAAa;wBACb,YAAY;wBACZ,cAAc;wBACd,cAAc;wBACd,gBAAgB;wBAChB,oBAAoB;wBACpB,YAAY;wBACZ,yBAAyB;wBACzB,kBAAkB;wBAClB,eAAe;AAChB,qBAAA,EAAA,QAAA,EAAA,o7OAAA,EAAA;;;AEtCG,MAAO,mBAAoB,SAAQ,aAAa,CAAA;IACpD,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,UAAU,CAAC,aAAa,GAAG;AACzB,YAAA;AACE,gBAAA,IAAI,EAAE,YAAY;AACnB,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,aAAa;AACpB,aAAA;SACF;;IAGH,WAAW,GAAA;AACT,QAAA,UAAU,CAAC,aAAa,GAAG,EAAE;;IAG/B,GAAG,GAAG,CAAC;AAEP,IAAA,qBAAqB,CAAC,QAAgB,EAAA;QACpC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG,EAAE,CAAC;QAExC,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,QAAQ,IAAI,CAAC,EAAE;gBACjB,UAAU,CAAC,aAAa,GAAG;AACzB,oBAAA;AACE,wBAAA,IAAI,EAAE,YAAY;AACnB,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,aAAa;AACpB,qBAAA;iBACF;;AACI,iBAAA,IAAI,QAAQ,IAAI,CAAC,EAAE;gBACxB,UAAU,CAAC,aAAa,GAAG;AACzB,oBAAA;AACE,wBAAA,IAAI,EAAE,YAAY;AACnB,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,aAAa;AACpB,qBAAA;iBACF;;AACI,iBAAA,IAAI,QAAQ,IAAI,CAAC,EAAE;gBACxB,UAAU,CAAC,aAAa,GAAG;AACzB,oBAAA;AACE,wBAAA,IAAI,EAAE,YAAY;AACnB,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,qBAAqB;AAC5B,qBAAA;iBACF;;AACI,iBAAA,IAAI,QAAQ,IAAI,CAAC,EAAE;gBACxB,UAAU,CAAC,aAAa,GAAG;AACzB,oBAAA;AACE,wBAAA,IAAI,EAAE,YAAY;AACnB,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,4BAA4B;AACnC,qBAAA;iBACF;;SAEJ,EAAE,CAAC,CAAC;;uGA5DI,mBAAmB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECdhC,gtBAqBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDTY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAApB,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,eAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,eAAA,EAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,YAAA,EAAA,WAAA,EAAA,cAAA,EAAA,aAAA,EAAA,0BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,uBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,aAAA,EAAA,YAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,QAAA,EAAA,0BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,QAAA,EAAA,0BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,uBAAuB,EAAA,QAAA,EAAA,0BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,0BAA0B,EAAA,QAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,CAAA;;2FAExG,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAL/B,SAAS;+BACE,eAAe,EAAA,OAAA,EAEhB,CAAC,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,0BAA0B,CAAC,EAAA,QAAA,EAAA,gtBAAA,EAAA;;;MEHzG,aAAa,CAAA;AACJ,IAAA,iBAAA;AAApB,IAAA,WAAA,CAAoB,iBAAoC,EAAA;QAApC,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB;;AAErC;;;;AAIG;AACH,IAAA,SAAS,CACP,IAA+C,EAC/C,QAAmB,EACnB,MAA+C,EAAA;QAE/C,IAAI,IAAI,KAAK,IAAI;AAAE,YAAA,OAAO,KAAK;;AAG/B,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC;;uGAhBtD,aAAa,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAqB,mBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;qGAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA;;2FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBALzB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,WAAW;AACjB,oBAAA,IAAI,EAAE,IAAI;AACV,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;MCCY,iBAAiB,CAAA;AACR,IAAA,iBAAA;AAApB,IAAA,WAAA,CAAoB,iBAAoC,EAAA;QAApC,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB;;;IAGrC,SAAS,CACP,QAAmB,EACnB,MAAwD,EAAA;QAExD,OAAO,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;;uGARhD,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,mBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;qGAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,eAAA,EAAA,CAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAL7B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,eAAe;AACrB,oBAAA,IAAI,EAAE,IAAI;AACV,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;MCAY,sBAAsB,CAAA;AAEvB,IAAA,WAAA;AACA,IAAA,aAAA;AACA,IAAA,iBAAA;AAHV,IAAA,WAAA,CACU,WAA6B,EAC7B,aAA+B,EAC/B,iBAAoC,EAAA;QAFpC,IAAW,CAAA,WAAA,GAAX,WAAW;QACX,IAAa,CAAA,aAAA,GAAb,aAAa;QACb,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB;;;IAI3B,IAA4B,eAAe,CAAC,MAAmC,EAAA;AAC7E,QAAA,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,MAAM;;AAGjC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAa,CAAC;QAE3E,IAAI,SAAS,EAAE;;YAEb,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;;aAClD;;AAEL,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;;;uGAnBnB,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,mBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,eAAA,EAAA,CAAA,eAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAJlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;8IAS6B,eAAe,EAAA,CAAA;sBAA1C,KAAK;uBAAC,eAAe;;;MCVX,oBAAoB,CAAA;AAErB,IAAA,EAAA;AACY,IAAA,SAAA;IAFtB,WACU,CAAA,EAAc,EACF,SAAoB,EAAA;QADhC,IAAE,CAAA,EAAA,GAAF,EAAE;QACU,IAAS,CAAA,SAAA,GAAT,SAAS;;IAI/B,OAAO,GAAA;;;;;uGAPI,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAArB,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,OAAO;AAClB,iBAAA;;0BAII;yCAIH,OAAO,EAAA,CAAA;sBADN,YAAY;uBAAC,OAAO;;;MCCV,mBAAmB,CAAA;AAOpB,IAAA,EAAA;AACA,IAAA,QAAA;AAPF,IAAA,OAAO;AAEf,IAAA,QAAQ,GAAG,CAAC,CAAM,KAAI,GAAG;AACzB,IAAA,SAAS,GAAG,MAAK,GAAG;IAEpB,WACU,CAAA,EAAc,EACd,QAAmB,EAAA;QADnB,IAAE,CAAA,EAAA,GAAF,EAAE;QACF,IAAQ,CAAA,QAAA,GAAR,QAAQ;;IAGlB,eAAe,GAAA;AACb,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa;;AAGpC,QAAA,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE;AAC9B,YAAA,IAAI,CAAC,OAAO,GAAG,MAAM;;aAChB;;YAEL,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC;;;AAKhD,IAAA,OAAO,CAAC,MAAW,EAAA;QACjB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,KAAK,IAAI,CAAC,OAAO;YAAE;AAE9C,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;AAC3D,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC;AAChE,QAAA,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;;AAG/B,IAAA,UAAU,CAAC,KAAU,EAAA;QACnB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;AAEnB,QAAA,MAAM,cAAc,GAAG,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE;AAC3D,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC;;AAGlE,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;;AAGpB,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;;AAGrB,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC;;;AAI3D,IAAA,WAAW,CAAC,KAAa,EAAA;QAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;;uGAtDtB,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,EARnB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,SAAA,EAAA;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,mBAAmB,CAAC;AAClD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAEU,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAV/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,yBAAyB,CAAC;AAClD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA;AACF,iBAAA;uGAyBC,OAAO,EAAA,CAAA;sBADN,YAAY;uBAAC,OAAO,EAAE,CAAC,eAAe,CAAC;;;MCvB7B,oCAAoC,CAAA;AAIrC,IAAA,EAAA;AACA,IAAA,QAAA;IAJF,YAAY,GAA4B,IAAI;IAEpD,WACU,CAAA,EAAc,EACd,QAAmB,EAAA;QADnB,IAAE,CAAA,EAAA,GAAF,EAAE;QACF,IAAQ,CAAA,QAAA,GAAR,QAAQ;;IAGlB,eAAe,GAAA;QACb,UAAU,CAAC,MAAK;;AAEd,YAAA,IAAI,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE;gBAC3D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa;;iBACpC;;AAEL,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC;;AAGlE,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC,KAAU,KAAI;AAC9D,oBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;AACtD,oBAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,CAAC;AAChE,oBAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC1B,iBAAC,CAAC;;AAGJ,YAAA,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,EAAE;AAC9B,gBAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC;AACxE,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI;;SAE3B,EAAE,CAAC,CAAC;;IAGC,YAAY,GAAQ,IAAI;AAEhC,IAAA,UAAU,CAAC,KAAU,EAAA;AACnB,QAAA,MAAM,cAAc,GAAG,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE;AAC3D,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,cAAc,CAAC;;aAChE;AACL,YAAA,IAAI,CAAC,YAAY,GAAG,cAAc;;;AAItC,IAAA,QAAQ,GAAG,CAAC,CAAM,KAAI,GAAG;AACzB,IAAA,SAAS,GAAG,MAAK,GAAG;AACpB,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;;AAEpB,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;;AAGrB,IAAA,gBAAgB,CAAE,UAAmB,EAAA;AACnC,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,UAAU,CAAC;;;AAIhE,IAAA,WAAW,CAAC,KAAa,EAAA;AAC/B,QAAA,OAAO;aACJ,KAAK,CAAC,GAAG;aACT,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;aAC1D,IAAI,CAAC,GAAG,CAAC;;uGA/DH,oCAAoC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oCAAoC,EARpC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gCAAA,EAAA,SAAA,EAAA;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,oCAAoC,CAAC;AACnE,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAEU,oCAAoC,EAAA,UAAA,EAAA,CAAA;kBAVhD,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gCAAgC;AAC1C,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,0CAA0C,CAAC;AACnE,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA;AACF,iBAAA;;;MCCY,6BAA6B,CAAA;AAE9B,IAAA,EAAA;AACA,IAAA,QAAA;IAFV,WACU,CAAA,EAA2B,EAC3B,QAAmB,EAAA;QADnB,IAAE,CAAA,EAAA,GAAF,EAAE;QACF,IAAQ,CAAA,QAAA,GAAR,QAAQ;;AAIlB,IAAA,OAAO,CAAC,KAAY,EAAA;AAClB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;QAE3B,IAAI,EAAE,MAAM,YAAY,gBAAgB,IAAI,MAAM,YAAY,mBAAmB,CAAC,EAAE;YAClF;;QAGF,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;AAEhD,QAAA,IAAI,SAAS,KAAK,MAAM,CAAC,KAAK,EAAE;YAC9B,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC;;;AAIjD,IAAA,WAAW,CAAC,KAAa,EAAA;AAC/B,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK;AAExB,QAAA,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;;uGAxB5C,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA7B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,6BAA6B,EAR7B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,SAAA,EAAA;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,6BAA6B,CAAC;AAC5D,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAEU,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAVzC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;AAClC,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,mCAAmC,CAAC;AAC5D,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA;AACF,iBAAA;uGAQC,OAAO,EAAA,CAAA;sBADN,YAAY;uBAAC,OAAO,EAAE,CAAC,QAAQ,CAAC;;;MCJtB,kBAAkB,CAAA;AAKnB,IAAA,EAAA;AACA,IAAA,QAAA;AALV,IAAA,QAAQ,GAAG,CAAC,CAAM,KAAI,GAAG;AACzB,IAAA,SAAS,GAAG,MAAK,GAAG;IAEpB,WACU,CAAA,EAA2B,EAC3B,QAAmB,EAAA;QADnB,IAAE,CAAA,EAAA,GAAF,EAAE;QACF,IAAQ,CAAA,QAAA,GAAR,QAAQ;;;AAKlB,IAAA,OAAO,CAAC,KAAY,EAAA;AAClB,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,MAAqB;QAE3C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;;AAGjD,QAAA,IAAI,SAAS,KAAK,OAAO,CAAC,KAAK,EAAE;YAC/B,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC;;AAGxD,QAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;;IAI1B,MAAM,GAAA;QACJ,IAAI,CAAC,SAAS,EAAE;;AAGlB,IAAA,UAAU,CAAC,KAAU,EAAA;AACnB,QAAA,MAAM,SAAS,GAAG,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE;AACtD,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,SAAS,CAAC;;AAGtE,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;;AAGpB,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;;AAGrB,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,UAAU,CAAC;;AAGlE,IAAA,WAAW,CAAC,KAAa,EAAA;AAC/B,QAAA,OAAO,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,GAAG,KAAK;;uGA/CjC,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,EARlB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,EAAA,EAAA,SAAA,EAAA;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,kBAAkB,CAAC;AACjD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAEU,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAV9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,wBAAwB,CAAC;AACjD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA;AACF,iBAAA;uGAYC,OAAO,EAAA,CAAA;sBADN,YAAY;uBAAC,OAAO,EAAE,CAAC,QAAQ,CAAC;gBAejC,MAAM,EAAA,CAAA;sBADL,YAAY;uBAAC,MAAM;;;MClCT,cAAc,CAAA;AACzB,IAAA,SAAS,CAAC,KAAa,EAAE,KAAA,GAAgB,CAAC,EAAA;AACxC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;QACrB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;QAC9B,OAAO,KAAK,CAAC,MAAM,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK;;uGAJrE,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;qGAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,YAAY;AACnB,iBAAA;;;MCJY,cAAc,CAAA;IAClB,OAAO,gBAAgB,CAAC,QAAa,EAAA;QAC1C,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;QACtE,IAAI,QAAQ,GAAG,iBAAiB;QAEhC,IAAI,kBAAkB,EAAE;YACtB,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,KAAK,CAAC,+BAA+B,CAAC;YACnF,MAAM,aAAa,GAAG,kBAAkB,CAAC,KAAK,CAAC,sBAAsB,CAAC;AAEtE,YAAA,IAAI,iBAAiB,GAAG,CAAC,CAAC,EAAE;gBAC1B,QAAQ,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;;AAC9C,iBAAA,IAAI,aAAa,GAAG,CAAC,CAAC,EAAE;AAC7B,gBAAA,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC;;;AAI/B,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAK,CAAC,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;AAE7E,QAAA,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE;AAClB,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAEtB,KAAK,CAAC,uBAAuB,CAAC;YAC9B;;QAGF,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AAC5C,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;QACxB,IAAI,CAAC,KAAK,EAAE;;AAGP,IAAA,OAAO,YAAY,CAAC,IAAS,EAAE,QAAgB,EAAA;QACpD,MAAM,WAAW,GAAG,0BAA0B;AAC9C,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAEpD,QAAA,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE;AAClB,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YACtB,KAAK,CAAC,uBAAuB,CAAC;YAC9B;;QAGF,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AAC5C,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;QACxB,IAAI,CAAC,KAAK,EAAE;;AAGP,IAAA,OAAO,kBAAkB,CAAC,UAAkB,EAAE,QAAgB,EAAA;;QAEnE,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;AAC5C,QAAA,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM;AACrC,QAAA,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC;AAEvC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE;YAClC,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;;;AAIvC,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,yEAAyE,EAAE,CAAC;AAEnH,QAAA,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE;AAClB,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YACtB,KAAK,CAAC,uBAAuB,CAAC;YAC9B;;;QAIF,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AAC5C,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;;AAGxB,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE;;AAGZ,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;;AAElC;;MC5EY,UAAU,CAAA;AACd,IAAA,OAAO,sBAAsB,CAAC,IAAU,EAAE,WAAoB,EAAE,aAAuB,EAAA;QAC5F,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;AAE/B,YAAA,MAAM,CAAC,MAAM,GAAG,CAAC,CAA4B,KAAI;gBAC/C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,MAAqB,CAAC;AAC5D,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAEnD,gBAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU;;gBAGtC,IAAI,aAAa,EAAE;oBACjB,MAAM,UAAU,GAA0B,EAAE;AAE5C,oBAAA,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;wBAClC,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;wBAC5C,MAAM,OAAO,GAAY,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE;AAC3D,4BAAA,MAAM,EAAE,CAAC;AACT,4BAAA,MAAM,EAAE,EAAE;AACX,yBAAA,CAAC;wBAEF,IAAI,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAE3B,wBAAA,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE;4BAC5F,IAAI,CAAC,GAAG,EAAE;;wBAGZ,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,KAAI;4BACrC,MAAM,GAAG,GAAQ,EAAE;AACnB,4BAAA,MAAM,KAAK,GAAG,WAAW,IAAI,GAAG,CAAC,MAAM;AACvC,4BAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;AAC9B,gCAAA,GAAG,CAAC,CAAA,GAAA,EAAM,CAAC,GAAG,CAAC,CAAE,CAAA,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;;AAEnC,4BAAA,GAAG,CAAC,QAAQ,GAAG,KAAK,GAAG,CAAC;AACxB,4BAAA,OAAO,GAAG;AACZ,yBAAC,CAAC;AAEF,wBAAA,UAAU,CAAC,SAAS,CAAC,GAAG,MAAM;;AAGhC,oBAAA,WAAW,CAAC;AACV,wBAAA,MAAM,EAAE,UAAU;wBAClB,UAAU;AACX,qBAAA,CAAC;AAEF,oBAAA,OAAO,CAAC;AACN,wBAAA,MAAM,EAAE,UAAU;wBAClB,UAAU;AACX,qBAAA,CAAC;;;qBAIC;AACH,oBAAA,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC;oBAC/B,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;oBAC5C,MAAM,OAAO,GAAY,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE;AAC3D,wBAAA,MAAM,EAAE,CAAC;AACT,wBAAA,MAAM,EAAE,EAAE;AACX,qBAAA,CAAC;oBAEF,IAAI,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAE3B,oBAAA,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE;wBAC5F,IAAI,CAAC,GAAG,EAAE;;oBAGZ,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,KAAI;wBACrC,MAAM,GAAG,GAAQ,EAAE;AACnB,wBAAA,MAAM,KAAK,GAAG,WAAW,IAAI,GAAG,CAAC,MAAM;AACvC,wBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;AAC9B,4BAAA,GAAG,CAAC,CAAA,GAAA,EAAM,CAAC,GAAG,CAAC,CAAE,CAAA,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;;AAEnC,wBAAA,GAAG,CAAC,QAAQ,GAAG,KAAK,GAAG,CAAC;AACxB,wBAAA,OAAO,GAAG;AACZ,qBAAC,CAAC;oBAEF,OAAO,CAAC,MAAM,CAAC;;AAEnB,aAAC;AAED,YAAA,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC;AACzC,YAAA,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAChC,SAAC,CAAC;;AAEL;;MCjFY,mBAAmB,CAAA;AAEpB,IAAA,MAAA;AACA,IAAA,WAAA;AACA,IAAA,WAAA;AAHV,IAAA,WAAA,CACU,MAAc,EACd,WAAwB,EACxB,WAAwB,EAAA;QAFxB,IAAM,CAAA,MAAA,GAAN,MAAM;QACN,IAAW,CAAA,WAAA,GAAX,WAAW;QACX,IAAW,CAAA,WAAA,GAAX,WAAW;QAEnB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,KAAK,KAAI;AAC3C,YAAA,IAAI,KAAK,YAAY,aAAa,EAAE;AAClC,gBAAA,MAAM,GAAG,GAAG,KAAK,CAAC,iBAAiB;AAEnC,gBAAA,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,gBAAgB,EAAE;oBACrE;;gBAGF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC;gBACzD,IAAI,CAAC,OAAO,EAAE;oBACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAA4B,yBAAA,EAAA,GAAG,CAAE,CAAA,CAAC;oBACzD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CAAC,EAAE;AACvC,wBAAA,KAAK,EAAE;AACL,4BAAA,SAAS,EAAE,GAAG;4BACd,OAAO,EAAE,CAA6C,0CAAA,EAAA,GAAG,CAAE,CAAA;AAC5D,yBAAA;AACF,qBAAA,CAAC;;;AAGR,SAAC,CAAC;;uGAzBO,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAAsB,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cADN,MAAM,EAAA,CAAA;;2FACnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCFrB,YAAY,CAAA;AACvB,IAAA,eAAe,CAAC,OAAgB,EAAA;QAC9B,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC;AACxD,QAAA,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,GAAG,GAAG,GAAG,GAAG,CAAC;;IAG5D,cAAc,GAAA;QACZ,OAAO,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,GAAG;;uGAP1C,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cADC,MAAM,EAAA,CAAA;;2FACnB,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACO5B,MAAO,UAAW,SAAQ,WAAW,CAAA;AAClC,IAAA,OAAO,eAAe,GAAG,oCAAoC;IAC7D,OAAO,eAAe;IACtB,OAAO,SAAS;IAChB,OAAO,SAAS;IAChB,OAAO,uBAAuB;AAE7B,IAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,IAAA,QAAQ;IACR,cAAc,GAAG,KAAK;;AAGvB,IAAA,gBAAgB,CAAC,SAAS,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,EAAA;AAChD,QAAA,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,MAAK;AAC/B,YAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;gBACxB,IAAI,CAAC,YAAY,EAAE;;SAEtB,EAAE,SAAS,CAAC;QACb,IAAI,CAAC,YAAY,EAAE;;IAGd,YAAY,CAAC,GAAG,GAAG,KAAK,EAAA;QAC7B,IAAI,CAAC,oBAAoB,EAAE;QAC3B,IAAI,GAAG,EAAE;YACP,IAAI,CAAC,mBAAmB,EAAE;;;IAIvB,oBAAoB,GAAA;AACzB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB;;QAGF,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,UAAU,CAAC,eAAe,CAAC;QAC5D,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,GAAG,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,IAAI,CACzE,OAAO,QAAa,KAAI;AACtB,YAAA,UAAU,CAAC,eAAe,GAAG,QAAQ,CAAC,OAAO;YAC7C,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,UAAU,CAAC,eAAe,CAAC;AAC1D,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,eAAe,EAAE,UAAU,CAAC,eAAe,CAAC;YAClG,IAAI,WAAW,EAAE;AACf,gBAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AAClC,oBAAA,OAAO,EAAE,kBAAkB;AAC3B,oBAAA,SAAS,EAAE,qCAAqC;AACjD,iBAAA,CAAC;;AAEN,SAAC,EACD,CAAC,GAAG,KAAI;AACN,YAAA,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,uBAAuB,CAAC;AAC7C,SAAC,CACF;;IAGK,iBAAiB,CAAC,cAAsB,EAAE,UAAkB,EAAA;AAClE,QAAA,IAAI,CAAC,cAAc,IAAI,UAAU,KAAK,cAAc,EAAE;AACpD,YAAA,OAAO,KAAK;;QAEd,OAAO,cAAc,KAAK,UAAU;;IAG/B,aAAa,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;;;IAIxB,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,GAAG,UAAU,EAAE,IAAI,CAAC,CAAC,IAAI,CACtD,CAAC,GAAG,KAAI;AACN,YAAA,UAAU,CAAC,SAAS,GAAG,GAAG;AAC5B,SAAC,EACD,CAAC,GAAG,KAAI;AACN,YAAA,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,+BAA+B,CAAC;AACnD,YAAA,UAAU,CAAC,SAAS,GAAG,+BAA+B;AACxD,SAAC,CACF;;uGA5EQ,UAAU,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAV,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,cAFT,MAAM,EAAA,CAAA;;2FAEP,UAAU,EAAA,UAAA,EAAA,CAAA;kBAHtB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCHY,oBAAoB,CAAA;AAE/B,IAAA,OAAO,CAAC,CAAM,EAAA;AACZ,QAAA,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;;uGAHT,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC7B,iBAAA;8BAGC,OAAO,EAAA,CAAA;sBADN,YAAY;uBAAC,OAAO,EAAE,CAAC,QAAQ,CAAC;;;ACJ5B,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE;IAC5C,UAAU,CAAC,QAAQ,EAAE;QACnB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;AACpD,QAAA,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;KAC7E,CAAC;IACF,UAAU,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,CAAC;AACvG,CAAA,CAAC;AAEK,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE;IAC5C,UAAU,CAAC,QAAQ,EAAE;AACnB,QAAA,KAAK,CAAC;AACJ,YAAA,MAAM,EAAE,CAAC;AACT,YAAA,OAAO,EAAE,CAAC;AACV,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,SAAS,EAAE,kBAAkB;SAC9B,CAAC;AACF,QAAA,OAAO,CACL,gBAAgB,EAChB,KAAK,CAAC;AACJ,YAAA,MAAM,EAAE,GAAG;AACX,YAAA,OAAO,EAAE,CAAC;AACV,YAAA,SAAS,EAAE,eAAe;AAC3B,SAAA,CAAC,CACH;KACF,CAAC;IAEF,UAAU,CAAC,QAAQ,EAAE;AACnB,QAAA,KAAK,CAAC;AACJ,YAAA,MAAM,EAAE,GAAG;AACX,YAAA,OAAO,EAAE,CAAC;AACV,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,SAAS,EAAE,eAAe;SAC3B,CAAC;AACF,QAAA,OAAO,CACL,eAAe,EACf,KAAK,CAAC;AACJ,YAAA,MAAM,EAAE,CAAC;AACT,YAAA,OAAO,EAAE,CAAC;AACV,YAAA,SAAS,EAAE,kBAAkB;AAC9B,SAAA,CAAC,CACH;KACF,CAAC;AACH,CAAA,CAAC;;ACrCK,MAAM1B,MAAI,GAAG;AAClB,IAAA,OAAO,EAAE,0BAA0B;AACnC,IAAA,MAAM,EAAE,yBAAyB;AACjC,IAAA,OAAO,EAAE,0BAA0B;AACnC,IAAA,SAAS,EAAE,4BAA4B;AACvC,IAAA,SAAS,EAAE,4BAA4B;AACvC,IAAA,MAAM,EAAE,yBAAyB;AACjC,IAAA,kBAAkB,EAAE,8BAA8B;AAClD,IAAA,YAAY,EAAE,+BAA+B;AAC7C,IAAA,WAAW,EAAE,0BAA0B;AACvC,IAAA,SAAS,EAAE,4BAA4B;CACxC;AAKK,MAAO,cAAe,SAAQ,WAAW,CAAA;AAC7C,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAErC,IAAA,OAAO,CAAC,EAAO,EAAA;AACb,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,qBAAqB;YAC1B,MAAM,EAAE,CAAC,EAAE,CAAC;AACb,SAAA,CAAC;;IAGJ,MAAM,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,MAAM,CAAC;;AAGxD,IAAA,OAAO,CAAC,MAAW,EAAA;AACjB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,OAAO,EAAE,MAAM,CAAC;;AAGrE,IAAA,SAAS,CAAC,MAAW,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,uBAAuB;YAC5B,MAAM,EAAE,CAAC,MAAM,CAAC;AACjB,SAAA,CAAC;;AAGJ,IAAA,SAAS,CAAC,GAAQ,EAAA;AAChB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,uBAAuB;YAC5B,MAAM,EAAE,CAAC,GAAG,CAAC;AACd,SAAA,CAAC;;AAGJ,IAAA,MAAM,CAAC,EAAO,EAAA;AACZ,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;AAChD,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,MAAM,EAAE,MAAM,CAAC;;AAGtE,IAAA,kBAAkB,CAAC,IAAY,EAAA;AAC7B,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;AACpD,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC;;;;;;IAQjF,YAAY,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,YAAY,CAAC;;AAG9D,IAAA,WAAW,CAAC,MAAW,EAAA;AACrB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,WAAW,EAAE,MAAM,CAAC;;IAGzE,SAAS,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,SAAS,CAAC;;uGAxDhD,cAAc,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAd,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA;;2FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;AC4BK,MAAO,UAAW,SAAQ,aAAa,CAAA;AAC3C,IAAA,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC;AAC3B,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,IAAA,cAAc,GAAG,MAAM,CAAC,qBAAqB,CAAC;AAC9C,IAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC/C,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;IAEvC,YAAY,GAAG,YAAY;IAE3B,QAAQ,GAAG,KAAK;IAEhB,MAAM,GAAc,EAAE;IACtB,kBAAkB,GAAG,KAAK;IAE1B,QAAQ,GAAA;QACN,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;AAC5F,YAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO;AAChC,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAChE,CAAC,GAAG,KAAI;AACN,YAAA,IAAI,GAAG,EAAE,IAAI,EAAE;AACb,gBAAA,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE;AACnB,oBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;oBAC9B,IAAI,CAAC,SAAS,EAAE;;;AAGtB,SAAC,EACD,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAC/B;;IAGH,SAAS,GAAA;AACP,QAAA,IAAI,CAAC;AACF,aAAA,GAAG,CAAC;AACH,YAAA,GAAG,EAAE,oBAAoB;SAC1B;AACA,aAAA,IAAI,CACH,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,EACjC,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAC/B;;IAGL,MAAM,SAAS,CAAC,GAAY,EAAA;AAC1B,QAAA,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,CAAA,oBAAA,EAAuB,GAAG,CAAC,IAAI,CAAA,CAAE,CAAC,EAAE;AACzD,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAClC,OAAO,GAAG,KAAI;gBACZ,IAAI,GAAG,EAAE;AACP,oBAAA,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAA0B,uBAAA,EAAA,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC;AAC9E,oBAAA,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;;AAE5B,aAAC,EACD,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAC/B;;;IAIL,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC;;IAGlC,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;;uGA9DnB,UAAU,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,EClDvB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,mhEA0DA,ED3BI,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,oIACZ,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAK,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,gBAAgB,EAChB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,SAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,YAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,8BACZ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,8IAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,8BACd,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAEb,iBAAiB,EACjB,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,EAEH,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,cAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAC,SAAS,CAAC,EAAA,CAAA;;2FAEZ,UAAU,EAAA,UAAA,EAAA,CAAA;kBAvBtB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,EAEd,OAAA,EAAA;wBACP,YAAY;wBACZ,eAAe;wBACf,cAAc;wBACd,YAAY;wBACZ,gBAAgB;wBAChB,YAAY;wBACZ,YAAY;wBACZ,cAAc;wBACd,YAAY;wBACZ,eAAe;wBACf,cAAc;wBACd,WAAW;wBACX,aAAa;wBACb,YAAY;wBACZ,iBAAiB;wBACjB,aAAa;qBACd,EACW,UAAA,EAAA,CAAC,SAAS,CAAC,EAAA,QAAA,EAAA,mhEAAA,EAAA;;;AExClB,MAAMb,MAAI,GAAG;AAClB,IAAA,OAAO,EAAE,mBAAmB;AAC5B,IAAA,MAAM,EAAE,kBAAkB;AAC1B,IAAA,OAAO,EAAE,mBAAmB;AAC5B,IAAA,SAAS,EAAE,qBAAqB;AAChC,IAAA,SAAS,EAAE,qBAAqB;AAChC,IAAA,MAAM,EAAE,kBAAkB;AAC1B,IAAA,cAAc,EAAE,0BAA0B;AAC1C,IAAA,cAAc,EAAE,0BAA0B;CAC3C;AAKK,MAAO,WAAY,SAAQ,WAAW,CAAA;AAC1C,IAAA,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC;AAE3B,IAAA,OAAO,CAAC,EAAO,EAAA;AACb,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,GAAG,EAAE,sBAAsB;YAC3B,MAAM,EAAE,CAAC,EAAE,CAAC;AACb,SAAA,CAAC;;IAGJ,MAAM,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,MAAM,CAAC;;AAGxD,IAAA,OAAO,CAAC,MAAW,EAAA;AACjB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,OAAO,EAAE,MAAM,CAAC;;AAGrE,IAAA,SAAS,CAAC,MAAW,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,GAAG,EAAE,oBAAoB;YACzB,MAAM,EAAE,CAAC,MAAM,CAAC;AACjB,SAAA,CAAC;;AAGJ,IAAA,SAAS,CAAC,GAAQ,EAAA;AAChB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,SAAS,EAAE,GAAG,CAAC;;AAGpE,IAAA,MAAM,CAAC,EAAO,EAAA;AACZ,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;AAChD,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,MAAM,EAAE,MAAM,CAAC;;AAGtE,IAAA,YAAY,CAAC,EAAU,EAAA;AACrB,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;AAChD,QAAA,OAAO,cAAc,CACnB,IAAI,CAAC,UAAU,CAAC,IAAI,CAClB,CAAG,EAAA,UAAU,CAAC,WAAW,CAAwB,sBAAA,CAAA,EACjD,EAAE,EACF,EAAE,YAAY,EAAE,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,CAChE,CACF;;AAGH,IAAA,kBAAkB,CAAC,IAAY,EAAA;AAC7B,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;AACpD,QAAA,OAAO,cAAc,CACnB,IAAI,CAAC,UAAU,CAAC,IAAI,CAClB,CAAA,EAAG,UAAU,CAAC,WAAW,CAAA,4BAAA,CAA8B,EACvD,EAAE,EACF,EAAE,YAAY,EAAE,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAC9E,CACF;;AAGH,IAAA,kBAAkB,CAAC,EAAU,EAAA;AAC3B,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;AAChD,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,CAAG,EAAA,UAAU,CAAC,WAAW,CAA8B,4BAAA,CAAA,EAAE,MAAM,CAAC;;AAGzF,IAAA,wBAAwB,CAAC,IAAY,EAAA;AACnC,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;AACpD,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,CAAG,EAAA,UAAU,CAAC,WAAW,CAAoC,kCAAA,CAAA,EAAE,MAAM,CAAC;;AAG/F,IAAA,cAAc,CAAC,IAAY,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CACxB,UAAU,CAAC,WAAW,GAAG,6BAA6B,GAAG,IAAI,CACnC;;AAG9B,IAAA,OAAO,CAAC,EAAU,EAAA;AAChB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,GAAG,qBAAqB,GAAG,EAAE,EAAE;YAC9E,YAAY,EAAE,iBAAiB,CAAC,IAAI;AACrC,SAAA,CAAC;;AAGJ,IAAA,QAAQ,CAAC,EAAU,EAAA;AACjB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,GAAG,qBAAqB,GAAG,EAAE,EAAE;YAC9E,YAAY,EAAE,iBAAiB,CAAC,IAAI;AACrC,SAAA,CAAC;;AAGJ,IAAA,QAAQ,CAAC,EAAU,EAAA;AACjB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,GAAG,yBAAyB,GAAG,EAAE,EAAE;YAClF,YAAY,EAAE,iBAAiB,CAAC,IAAI;AACrC,SAAA,CAAC;;AAGJ,IAAA,QAAQ,CAAC,EAAU,EAAA;AACjB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,GAAG,yBAAyB,GAAG,EAAE,EAAE;YAClF,YAAY,EAAE,iBAAiB,CAAC,IAAI;AACrC,SAAA,CAAC;;AAGJ,IAAA,cAAc,CAAC,GAAQ,EAAA;AACrB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,cAAc,EAAE,GAAG,CAAC;;IAGzE,aAAa,CAAC,SAAiB,EAAE,MAAc,EAAA;AAC7C,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,GAAG,EAAE,wBAAwB;AAC7B,YAAA,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;AAC5B,SAAA,CAAC;;AAGJ,IAAA,cAAc,CAAC,GAAQ,EAAA;AACrB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAGA,MAAI,CAAC,cAAc,EAAE,GAAG,CAAC;;uGA5G9D,WAAW,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAX,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA;;2FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCbY,cAAc,CAAA;IAClB,OAAO,UAAU;AAEjB,IAAA,OAAO,sBAAsB,GAAA;AAClC,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,OAAO,CAAC,kBAAkB,CAAC,SAAS,EAAE;;AAEjE,YAAA,IAAI,CAAC;iBACF,IAAI,CAAC,oBAAoB;AACzB,iBAAA,IAAI;AACJ,iBAAA,KAAK,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;;AAIhC,IAAA,OAAO,QAAQ,GAAA;AACpB,QAAA,IAAI,CAAC,UAAU,GAAG,cAAc,CAAC,aAAa,EAAE;QAChD,IAAI,CAAC,cAAc,EAAE;;AAGf,IAAA,OAAO,cAAc,GAAA;QAC3B,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,GAAW,KAAI;;AAEvD,SAAC,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,YAAoB,KAAI;;AAEhE,YAAA,IAAI,CAAC;AACF,iBAAA,IAAI,CAAC,qBAAqB,EAAE,YAAY;AACxC,iBAAA,IAAI;AACJ,iBAAA,KAAK,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACrC,SAAC,CAAC;;AAGG,IAAA,OAAO,aAAa,GAAA;AACzB,QAAA,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,oBAAoB;AAChD,aAAA,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK;aACvC,OAAO,CAAC,UAAU,CAAC,WAAW,GAAG,SAAS,EAAE,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE;AACvG,aAAA,sBAAsB;AACtB,aAAA,KAAK,EAAE;AAEV,QAAA,UAAU,CAAC,2BAA2B,GAAG,GAAG,GAAG,IAAI;QAEnD;AACG,aAAA,KAAK;aACL,IAAI,CAAC,MAAK;YACT,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,UAAU,CAAC,YAAY,CAAC;AAC1E,SAAC;AACA,aAAA,KAAK,CAAC,CAAC,GAAG,KAAI;YACb,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;AACtC,SAAC,CAAC;AAEJ,QAAA,UAAU,CAAC,cAAc,CAAC,CAAC,KAAK,KAAI;YAClC,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,EAAE,OAAO,CAAC;AACzD,SAAC,CAAC;AAEF,QAAA,UAAU,CAAC,aAAa,CAAC,CAAC,YAAY,KAAI;AACxC,YAAA,OAAO,CAAC,GAAG,CAAC,wCAAwC,EAAE,YAAY,CAAC;AACrE,SAAC,CAAC;AAEF,QAAA,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AACzB,YAAA,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;YACpC,IAAI,GAAG,EAAE;gBACP,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;;AAEjC,SAAC,CAAC;AAEF,QAAA,OAAO,UAAU;;AAGZ,IAAA,OAAO,UAAU,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;;;uGAtEf,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAd,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA;;2FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACgCD,MAAM,QAAQ,CAAA;;AAEZ,IAAA,WAAW;AACX,IAAA,UAAU;AACV,IAAA,QAAQ;AACR,IAAA,IAAI;AACJ,IAAA,YAAY;AACZ,IAAA,GAAG;AACH,IAAA,IAAI;AACJ,IAAA,UAAU;AACV,IAAA,QAAQ;AACR,IAAA,QAAQ;AACR,IAAA,YAAY;AACZ,IAAA,aAAa;AACb,IAAA,YAAY;;AAGZ,IAAA,KAAK;AACL,IAAA,IAAI;AACJ,IAAA,OAAO;AACP,IAAA,UAAU;IAEV,WAAW,CAAU;AACrB,IAAA,iBAAiB;AACjB,IAAA,kBAAkB;IAElB,WAAW,CAAU;AACrB,IAAA,iBAAiB;AACjB,IAAA,kBAAkB;AAIlB,IAAA,WAAA,CAAY,GAAS,EAAA;AACnB,QAAA,GAAG,GAAG,GAAG,IAAI,EAAE;QAEf,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE;QACxC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE;QACtC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,IAAI;QACpC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE;QAC1B,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,IAAI,EAAE;QAC1C,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE;QAClC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE;QACxB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE;QAC1B,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,IAAI;QACxC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,KAAK;QACrC,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa,IAAI,EAAE;QAC5C,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,IAAI,KAAK;AAE7C,QAAA,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY;AACpC,QAAA,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK;AACtB,QAAA,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI;AACpB,QAAA,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO;AAC1B,QAAA,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU;AAChC,QAAA,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW;AAClC,QAAA,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC,iBAAiB;AAC9C,QAAA,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC,kBAAkB;AAChD,QAAA,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW;AAClC,QAAA,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC,iBAAiB;AAC9C,QAAA,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC,kBAAkB;;AAEnD;AAoCK,MAAO,eAAgB,SAAQ,aAAa,CAAA;AAChD,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC;AAC5B,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,IAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC/C,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;IAE9B,YAAY,GAAG,YAAY;IAE3B,SAAS,GAAG,CAAC;IACb,kBAAkB,GAAG,KAAK;IAC1B,WAAW,GAAG,EAAE;IAChB,oBAAoB,GAAG,EAAE;IACzB,qBAAqB,GAAG,EAAE;AAC1B,IAAA,WAAW,GAAG,KAAK,CAAC;IACpB,QAAQ,GAAG,KAAK;IAEhB,KAAK,GAAiB,EAAE;IACxB,YAAY,GAAU,EAAE;IACxB,YAAY,GAAU,EAAE;IAExB,OAAO,GAAe,EAAE;;;AAGxB,IAAA,IAAI,UAAU,GAAA;;AAEZ,QAAA,OAAO,IAAI,CAAC,WAAW,GAAG,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,OAAO;;AAGlF,IAAA,IAAI,iBAAiB,GAAA;QACnB,OAAO,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,OAAO;;IAGtD,iBAAiB,GAAG,KAAK;IAEzB,WAAW,GAAG,EAAE;IAEhB,aAAa,GAAe,EAAE;IAC9B,oBAAoB,GAAa,EAAE;AACnC,IAAA,yBAAyB;IAEzB,QAAQ,GAAG,IAAI,CAAC;SACb,cAAc,CAAC,MAAM;AACrB,SAAA,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA,EAAG,UAAU,CAAC,WAAW,+BAA+B,GAAG,IAAI,EAAE,CAAE,CAAA,CAAC,CAAC;AAElF,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAEtC,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE;QAClC,cAAc,CAAC,QAAQ,EAAE;QAEzB,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI;YAChD,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE;YACnC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAChD,CAAC,CAAC,KACA,GAAG,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG;iBACzB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;iBACb,IAAI,CAAC,GAAG,CAAC,CAAA,EAAA,EAAK,CAAC,CAAC,IAAI,CAAE,CAAA,CAC5B;YAED,IAAI,CAAC,yBAAyB,GAAG,cAAc,CAAC,OAAO,CAAC,sBAAsB,CAAC,IAAI,EAAE;AACvF,SAAC,CAAC;AAEF,QAAA,MAAM,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI;AACrE,YAAA,IAAI,GAAG,EAAE,IAAI,EAAE;AACb,gBAAA,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,IAAI;;AAE7B,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,yBAAyB,CAAC,IAAI,EAAE,CAAC;AAEzE,QAAA,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI;AACjE,YAAA,IAAI,GAAG,EAAE,IAAI,EAAE;AACb,gBAAA,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,IAAI;gBAC3B,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;;AAEhD,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI;AAC1E,YAAA,IAAI,GAAG,EAAE,IAAI,EAAE;AACb,gBAAA,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC,IAAI;;AAExC,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI;AAC3E,YAAA,IAAI,GAAG,EAAE,IAAI,EAAE;AACb,gBAAA,IAAI,CAAC,qBAAqB,GAAG,GAAG,CAAC,IAAI;;AAEzC,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI;AAC/E,YAAA,IAAI,GAAG,EAAE,IAAI,EAAE;gBACb,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC,IAAI,IAAI,KAAK;;AAE/C,SAAC,CAAC;QAEF,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;AAC5F,YAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO;AAChC,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,KAAI;AACzB,YAAA,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC;AACjC,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;AAC3B,SAAC,CAAC;QAEF,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ;;;;SAI3F,EAAE,CAAC,CAAC;;;;;;;AASL,QAAA,IAAI,CAAC;AACF,aAAA,WAAW;AACX,aAAA,IAAI,CAAC2B,WAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC7B,aAAA,SAAS,CAAC,CAAC,UAAU,KAAI;AACxB,YAAA,IAAI,CAAC,WAAW,GAAG,UAAU,IAAI,IAAI;AACvC,SAAC,CAAC;QAEJ,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,GAAG;;AAG9C,IAAA,OAAO;IAE7B,WAAW,GAAA;QACT,cAAc,CAAC,UAAU,EAAE;QAC3B,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;;IAGjC,WAAW,CAAC,YAAY,GAAG,EAAE,EAAA;AAC3B,QAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI;YACtD,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE;YAC7B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;YACtD,IAAI,CAAC,eAAe,EAAE;YACtB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AACvC,SAAC,CAAC;;IAGJ,eAAe,GAAA;QACb,IAAI,IAAI,CAAC,WAAW;YAAE;AAEtB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG;QAElC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AAC3B,YAAA,IAAI,GAAG,CAAC,OAAO,EAAE;gBACf,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;AACvD,oBAAA,GAAG,CAAC,IAAI,GAAG,IAAI;;gBAGjB,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AAC1B,oBAAA,IAAI,GAAG,CAAC,OAAO,EAAE;wBACf,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;AACvD,4BAAA,GAAG,CAAC,IAAI,GAAG,IAAI;AACf,4BAAA,GAAG,CAAC,IAAI,GAAG,IAAI;;wBAGjB,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AAC1B,4BAAA,IAAI,GAAG,CAAC,OAAO,EAAE;gCACf,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;AACvD,oCAAA,GAAG,CAAC,IAAI,GAAG,IAAI;AACf,oCAAA,GAAG,CAAC,IAAI,GAAG,IAAI;AACf,oCAAA,GAAG,CAAC,IAAI,GAAG,IAAI;;;AAGrB,yBAAC,CAAC;;AAEN,iBAAC,CAAC;;AAEN,SAAC,CAAC;;AAGJ,IAAA,OAAO,CAAC,KAAwB,EAAA;AAC9B,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,MAAM;AAE/B,QAAA,IAAI,KAAK,CAAC,IAAI,EAAE;AACd,YAAA,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI;AAC5B,YAAA,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI;;AAG9B,QAAA,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE;YACjB,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;;aACnB;AACL,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;;;AAIlB,IAAA,sBAAsB,CAAC,KAAiB,EAAE,SAAA,GAAoB,EAAE,EAAA;AAC9D,QAAA,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;YACrB,OAAO;gBACL,KAAK,EAAE,GAAG,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG;qBAChC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACb,qBAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAE,CAAA;gBACzB,EAAE,EAAE,GAAG,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG;qBAC7B,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;qBACb,IAAI,CAAC,GAAG,CAAC,CAAE,CAAA;gBACd,GAAG,EAAE,CAAC,CAAC,WAAW;;AAElB,gBAAA,QAAQ,EAAE,KAAK;AACf,gBAAA,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;gBAC5C,QAAQ,EAAE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE;gBAChF,GAAG,EAAE,CAAC,CAAC,GAAG;AACV,gBAAA,SAAS,EAAE,SAAS;aACrB;AACH,SAAC,CAAC;;AAGI,IAAA,eAAe,CAAC,GAAW,EAAA;AACjC,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;AACtB,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;AAEtB,QAAA,MAAM,QAAQ,GAAG,CAAC,KAAmB,KAAI;AACvC,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,gBAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;AACxB,gBAAA,IAAK,IAAY,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,UAAU,CAAE,IAAY,CAAC,KAAK,CAAC,CAAC,EAAE;oBAChE,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;AAC9B,oBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;;oBAGxB,UAAU,CAAC,MAAK;wBACd,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,yBAAyB,CAAgB;wBAC3E,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,eAAe,CAAgB,CAAC;AAErE,wBAAA,IAAI,EAAE,IAAI,KAAK,EAAE;AACf,4BAAA,MAAM,MAAM,GAAG,EAAE,CAAC,qBAAqB,EAAE;AACzC,4BAAA,MAAM,SAAS,GAAG,KAAK,CAAC,qBAAqB,EAAE;4BAE/C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG;4BAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM;AAEhD,4BAAA,IAAI,OAAO,IAAI,OAAO,EAAE;AACtB,gCAAA,EAAE,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;;;qBAG/D,EAAE,GAAG,CAAC;;AAET,gBAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7C,oBAAA,QAAQ,CAAC,IAAI,CAAC,QAAwB,CAAC;;;AAG7C,SAAC;AACD,QAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;;;AAId,IAAA,aAAa,CAAC,IAAgB,EAAA;AACpC,QAAA,IAAI,SAAS,GAAI,IAAY,CAAC,SAAS;QAEvC,OAAO,SAAS,EAAE;YAChB,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC;;AAGrD,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC;YAC5D,IAAI,UAAU,EAAE;AACd,gBAAA,SAAS,GAAI,UAAkB,CAAC,SAAS,CAAC;;iBACrC;gBACL;;;;;IAME,aAAa,CAAC,KAAmB,EAAE,GAAW,EAAA;AACpD,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE;AACpB,gBAAA,OAAO,IAAI;;AAEb,YAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7C,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAwB,EAAE,GAAG,CAAC;gBACpE,IAAI,KAAK,EAAE;AACT,oBAAA,OAAO,KAAK;;;;AAIlB,QAAA,OAAO,IAAI;;IAGb,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW;AACpC,QAAA,YAAY,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,GAAG,CAAC;;AAGxE,IAAA,2BAA2B,CAAC,CAAM,EAAA;QAChC,MAAM,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AAElC,QAAA,cAAc,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;QACjD,cAAc,CAAC,OAAO,CAAC,yBAAyB,EAAE,IAAI,CAAC,WAAW,CAAC;AAEnE,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;AAClC,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;;aACd;AACL,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;;;uGA/SP,eAAe,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvI5B,8rYAkRA,EAAA,MAAA,EAAA,CAAA,42FAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDxKI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAxB,IAAA,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,IAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,UAAU,EACV,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,YAAY,EACZ,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,kmBACd,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,SAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,eAAA,EAAA,SAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,8IAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2EAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,UAAU,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACV,sBAAsB,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACtB,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,aAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,YAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,sBAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,YAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,cAAA,EAAA,eAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,aAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,WAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,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,aAAa,EAEb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,eAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,cAAA,EAAA,eAAA,EAAA,cAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uCAAA,EAAA,QAAA,EAAA,oDAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAG,EACH,QAAA,EAAA,KAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAiB,EACjB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,WAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,UAAU,wDACV,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACV,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACV,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,mBAAmB,EAAA,QAAA,EAAA,aAAA,EAAA,CAAA,EAAA,UAAA,EAET,CAAC,SAAS,CAAC,EAAA,CAAA;;2FAEZ,eAAe,EAAA,UAAA,EAAA,CAAA;kBAlC3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,QAAQ,EAGT,OAAA,EAAA;wBACP,YAAY;wBACZ,UAAU;wBACV,YAAY;wBACZ,eAAe;wBACf,cAAc;wBACd,YAAY;wBACZ,gBAAgB;wBAChB,YAAY;wBACZ,YAAY;wBACZ,cAAc;wBACd,UAAU;wBACV,sBAAsB;wBACtB,YAAY;wBACZ,eAAe;wBACf,cAAc;wBACd,WAAW;wBACX,aAAa;wBACb,YAAY;wBACZ,GAAG;wBACH,iBAAiB;wBACjB,UAAU;wBACV,UAAU;wBACV,UAAU;wBACV,aAAa;wBACb,oBAAoB;wBACpB,mBAAmB;qBACpB,EACW,UAAA,EAAA,CAAC,SAAS,CAAC,EAAA,QAAA,EAAA,8rYAAA,EAAA,MAAA,EAAA,CAAA,42FAAA,CAAA,EAAA;8BAsID,OAAO,EAAA,CAAA;sBAA5B,SAAS;uBAAC,SAAS;;;AEpQf,MAAM,IAAI,GAAG;AAClB,IAAA,OAAO,EAAE,sBAAsB;AAC/B,IAAA,MAAM,EAAE,qBAAqB;AAC7B,IAAA,OAAO,EAAE,sBAAsB;AAC/B,IAAA,SAAS,EAAE,wBAAwB;AACnC,IAAA,SAAS,EAAE,wBAAwB;AACnC,IAAA,MAAM,EAAE,qBAAqB;CAC9B;AAKK,MAAO,UAAW,SAAQ,WAAW,CAAA;AACzC,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAErC,IAAA,OAAO,CAAC,EAAO,EAAA;AACb,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,iBAAiB;YACtB,MAAM,EAAE,CAAC,EAAE,CAAC;AACb,SAAA,CAAC;;IAGJ,MAAM,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,gBAAgB;AACtB,SAAA,CAAC;;AAGJ,IAAA,OAAO,CAAC,MAAW,EAAA;AACjB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;;AAGrE,IAAA,SAAS,CAAC,MAAW,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,mBAAmB;YACxB,MAAM,EAAE,CAAC,MAAM,CAAC;AACjB,SAAA,CAAC;;AAGJ,IAAA,SAAS,CAAC,GAAQ,EAAA;AAChB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,mBAAmB;YACxB,MAAM,EAAE,CAAC,GAAG,CAAC;AACd,SAAA,CAAC;;AAGJ,IAAA,MAAM,CAAC,EAAO,EAAA;AACZ,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;AAChD,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;;AAGtE,IAAA,cAAc,CAAC,QAAgB,EAAA;AAC7B,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC;AAC5D,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,CAAG,EAAA,UAAU,CAAC,WAAW,CAA4B,0BAAA,CAAA,EAAE,MAAM,CAAC;;AAGtF,IAAA,eAAe,CAAC,KAAa,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,yBAAyB;YAC9B,MAAM,EAAE,CAAC,KAAK,CAAC;AAChB,SAAA,CAAC;;AAGJ,IAAA,aAAa,CAAC,KAAa,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,uBAAuB;YAC5B,MAAM,EAAE,CAAC,KAAK,CAAC;AAChB,SAAA,CAAC;;IAGJ,aAAa,CAAC,KAAoB,EAAE,OAAiB,EAAA;QACnD,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC;;AAE7C,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,uBAAuB;YAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnC,SAAA,CAAC;;IAGJ,iBAAiB,CAAC,KAAa,EAAE,MAAc,EAAA;AAC7C,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,2BAA2B;AAChC,YAAA,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;AACxB,SAAA,CAAC;;AAGJ,IAAA,cAAc,CAAC,IAAS,EAAA;AACtB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC5B,YAAA,GAAG,EAAE,wBAAwB;YAC7B,MAAM,EAAE,CAAC,IAAI,CAAC;AACf,SAAA,CAAC;;AAGJ,IAAA,SAAS,CAAC,IAAS,EAAA;AACjB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAG,EAAA,UAAU,CAAC,WAAW,CAAoB,kBAAA,CAAA,EAAE,IAAI,CAAC;;uGAnFhE,UAAU,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAV,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,cAFT,MAAM,EAAA,CAAA;;2FAEP,UAAU,EAAA,UAAA,EAAA,CAAA;kBAHtB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;AC6BK,MAAO,cAAe,SAAQ,aAAa,CAAA;AAC/C,IAAA,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;AACxB,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,IAAA,cAAc,GAAG,MAAM,CAAC,qBAAqB,CAAC;AAC9C,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AAEjC,IAAA,SAAS;IACT,OAAO,GAAG,KAAK;IACf,YAAY,GAAwB,UAAU;IAC9C,SAAS,GAAG,EAAE;IAEd,MAAM,GAAc,EAAE;IAEtB,kBAAkB,GAAG,KAAK;IAC1B,iBAAiB,GAAG,EAAE;AAEtB,IAAA,MAAM,QAAQ,GAAA;QACZ,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,MAAM,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC;AAE3F,QAAA,IAAI,YAAY,CAAC,QAAQ,EAAE,KAAK,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,EAAE;AAClE,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YACzB;;QAGF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;YAC7B,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACvC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACvC,KAAK,EAAE,CAAC,IAAI,CAAC;YACb,UAAU,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC;AAC5C,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAC9D,CAAC,GAAG,KAAI;AACN,YAAA,IAAI,GAAG,EAAE,IAAI,EAAE;AACb,gBAAA,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC,IAAI;;AAErC,SAAC,EACD,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAC/B;AAED,QAAA,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAChE,CAAC,GAAG,KAAI;AACN,YAAA,IAAI,GAAG,EAAE,IAAI,EAAE;AACb,gBAAA,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE;AACnB,oBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAC9B,oBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;oBACjE,IAAI,CAAC,SAAS,EAAE;oBAChB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,KACzD,YAAY,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC,CACjD;oBACD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;yBAClC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAEW,sBAAoB,EAAE;yBAC9C,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;;qBAChC;oBACL,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE;;;AAGpD,SAAC,EACD,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAC/B;AAED,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE;;;IAIjC,SAAS,GAAA;AACP,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,KAAK;AAE1D,QAAA,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,CACjD,CAAC,GAAG,KAAI;AACN,YAAA,IAAI,GAAG,CAAC,IAAI,EAAE;AACZ,gBAAA,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI;gBACtB,IAAI,kBAAkB,GAAG,YAAY,CAAC,OAAO,CAAC,uBAAuB,CAAC;gBACtE,IAAI,kBAAkB,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,IAAI,kBAAkB,CAAC,EAAE;AACrF,oBAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC;;;iBAE3D;AACL,gBAAA,IAAI,CAAC,MAAM,GAAG,EAAE;;AAEpB,SAAC,EACD,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAC/B;;IAGH,OAAO,GAAA;QACL,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE;YACvC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;YACxC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,sBAAsB,EAAE;;AAGrD,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AACxB,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CACvB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAC7B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAC7B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAC1B,IAAI,CAAC,SAAS,CACf;;AAGH,QAAA,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE;;AAGhC,IAAA,cAAc,CAAC,IAAa,EAAA;AAC1B,QAAA,UAAU,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACtC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;;IAGxC,UAAU,GAAA;;;;AAKV,IAAA,UAAU,CAAC,CAAQ,EAAA;QAChB,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;;IAGvD,QAAQ,GAAG,IAAI,CAAC;SACb,cAAc,CAAC,YAAY;AAC3B,SAAA,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA,EAAG,UAAU,CAAC,WAAW,qCAAqC,GAAG,IAAI,EAAE,CAAE,CAAA,CAAC,CAAC;IAEhG,MAAM,GAAG,IAAI,CAAC;SACX,cAAc,CAAC,kBAAkB;AACjC,SAAA,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA,EAAG,UAAU,CAAC,WAAW,2CAA2C,GAAG,IAAI,EAAE,CAAE,CAAA,CAAC,CAAC;uGA9H3F,cAAc,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,OAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/C3B,k/IAqGA,EAAA,MAAA,EAAA,CAAA,6eAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDrEI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAzB,IAAA,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,IAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,EAAA,EAAA,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,MAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,WAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,cAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,cAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,eAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,cAAA,EAAA,eAAA,EAAA,cAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uCAAA,EAAA,QAAA,EAAA,oDAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,GAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,uBAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,0BAAA,EAAA,0BAAA,EAAA,2BAAA,EAAA,uBAAA,EAAA,6BAAA,EAAA,yBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,8IAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2EAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,QAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,4BAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,aAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,WAAA,EAAA,aAAA,EAAA,wBAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,CAAA;;2FAGX,cAAc,EAAA,UAAA,EAAA,CAAA;kBApB1B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,OAAO,EAGR,OAAA,EAAA;wBACP,YAAY;wBACZ,WAAW;wBACX,mBAAmB;wBACnB,eAAe;wBACf,YAAY;wBACZ,aAAa;wBACb,YAAY;wBACZ,eAAe;wBACf,cAAc;wBACd,cAAc;wBACd,YAAY;wBACZ,cAAc;wBACd,oBAAoB;AACrB,qBAAA,EAAA,QAAA,EAAA,k/IAAA,EAAA,MAAA,EAAA,CAAA,6eAAA,CAAA,EAAA;;;AE7CH;;AAEG;;;;"}
1
+ {"version":3,"file":"brggroup-share-lib.mjs","sources":["../../../projects/share/src/lib/a-translate-key.ts","../../../projects/share/src/lib/app-global.ts","../../../projects/share/src/lib/app-storeage.ts","../../../projects/share/src/lib/services/api-service/http.service.ts","../../../projects/share/src/lib/services/device-service.ts","../../../projects/share/src/lib/services/custom-notification.service.ts","../../../projects/share/src/lib/services/noti.service.ts","../../../projects/share/src/lib/services/api-service/common.service.ts","../../../projects/share/src/lib/auth/token.storage.ts","../../../projects/share/src/lib/auth/auth.service.ts","../../../projects/share/src/lib/auth/auth-abac.ts","../../../projects/share/src/lib/auth/permission.service.ts","../../../projects/share/src/lib/auth/auth.guard.ts","../../../projects/share/src/lib/services/loading.service.ts","../../../projects/share/src/lib/auth/auth.interceptor.ts","../../../projects/share/src/lib/auth/unsaved-changes.guard.ts","../../../projects/share/src/lib/auth/session-manager.service.ts","../../../projects/share/src/lib/services/custom-modal.service.ts","../../../projects/share/src/lib/components/base.component.ts","../../../projects/share/src/lib/components/base.guard-change.ts","../../../projects/share/src/lib/components/base.overlay.component.ts","../../../projects/share/src/lib/components/breadcrumb/breadcrumb.ts","../../../projects/share/src/lib/components/breadcrumb/breadcrumb.html","../../../projects/share/src/lib/components/dashboard-widget/animated/animated-digit.component.ts","../../../projects/share/src/lib/components/dashboard-widget/animated/animated-digit.component.html","../../../projects/share/src/lib/components/dashboard-widget/bar-graph/bar-graph.component.ts","../../../projects/share/src/lib/components/dashboard-widget/bar-graph/bar-graph.component.html","../../../projects/share/src/lib/components/dashboard-widget/dashcard/dashcard.component.ts","../../../projects/share/src/lib/components/dashboard-widget/dashcard/dashcard.component.html","../../../projects/share/src/lib/components/dashboard-widget/doughnut-graph/doughnut-graph.component.ts","../../../projects/share/src/lib/components/dashboard-widget/doughnut-graph/doughnut-graph.component.html","../../../projects/share/src/lib/components/dashboard-widget/line-graph/line-graph.component.ts","../../../projects/share/src/lib/components/dashboard-widget/line-graph/line-graph.component.html","../../../projects/share/src/lib/components/extend-checkbox/extend-checkbox.ts","../../../projects/share/src/lib/components/extend-checkbox/extend-checkbox.html","../../../projects/share/src/lib/helper/date.helper.ts","../../../projects/share/src/lib/directive/date-input-parser.directive.ts","../../../projects/share/src/lib/components/extend-date-picker/extend-date-picker.ts","../../../projects/share/src/lib/components/extend-date-picker/extend-date-picker.html","../../../projects/share/src/lib/components/extend-date-range-picker/extend-date-range-picker.ts","../../../projects/share/src/lib/components/extend-date-range-picker/extend-date-range-picker.html","../../../projects/share/src/lib/components/extend-input-number/extend-input-number.ts","../../../projects/share/src/lib/components/extend-input-number/extend-input-number.html","../../../projects/share/src/lib/components/extend-input/extend-input.ts","../../../projects/share/src/lib/components/extend-input/extend-input.html","../../../projects/share/src/lib/components/extend-select/extend-select.ts","../../../projects/share/src/lib/components/extend-select/extend-select.html","../../../projects/share/src/lib/components/extend-textarea/extend-textarea.ts","../../../projects/share/src/lib/components/extend-textarea/extend-textarea.html","../../../projects/share/src/lib/pipe/highlight.pipe.ts","../../../projects/share/src/lib/services/dic-domain.service.ts","../../../projects/share/src/lib/pipe/dic-domain.pipe.ts","../../../projects/share/src/lib/model.ts","../../../projects/share/src/lib/components/read-more/read-more.component.ts","../../../projects/share/src/lib/components/read-more/read-more.component.html","../../../projects/share/src/lib/components/extend-table/extend-table.component.ts","../../../projects/share/src/lib/components/extend-table/extend-table.component.html","../../../projects/share/src/lib/components/extend-table/extend-pagination.component.ts","../../../projects/share/src/lib/components/extend-table/extend-pagination.component.html","../../../projects/share/src/lib/components/no-permission/no-permission.ts","../../../projects/share/src/lib/components/pdf-viewer/pdf-viewer.ts","../../../projects/share/src/lib/components/pdf-viewer/pdf-viewer.html","../../../projects/share/src/lib/components/spinner/spinner.ts","../../../projects/share/src/lib/components/height.ts","../../../projects/share/src/lib/components/width.ts","../../../projects/share/src/lib/components/box.ts","../../../projects/share/src/lib/components/wf-editor/minimap.ts","../../../projects/share/src/lib/directive/auto-focus.directive.ts","../../../projects/share/src/lib/icon.ts","../../../projects/share/src/lib/components/wf-editor/workflow-editor.component.ts","../../../projects/share/src/lib/components/wf-editor/workflow-editor.component.html","../../../projects/share/src/lib/components/search/expandable-search/expandable-search.component.ts","../../../projects/share/src/lib/components/search/expandable-search/expandable-search.component.html","../../../projects/share/src/lib/components/custom-noti/custom-noti.component.ts","../../../projects/share/src/lib/ADMIN/component/permission/permission.service.ts","../../../projects/share/src/lib/ADMIN/service/role.service.ts","../../../projects/share/src/lib/ADMIN/service/menu.service.ts","../../../projects/share/src/lib/ADMIN/component/permission/role-menu/role-menu.ts","../../../projects/share/src/lib/ADMIN/component/permission/role-menu/role-menu.html","../../../projects/share/src/lib/ADMIN/service/user.service.ts","../../../projects/share/src/lib/ADMIN/component/permission/user-role/user-role.ts","../../../projects/share/src/lib/ADMIN/component/permission/user-role/user-role.html","../../../projects/share/src/lib/ADMIN/component/permission/role-permission/role-permission.component.ts","../../../projects/share/src/lib/ADMIN/component/permission/role-permission/role-permission.component.html","../../../projects/share/src/lib/ADMIN/component/permission/resource-permission/resource-permission.component.ts","../../../projects/share/src/lib/ADMIN/component/permission/resource-permission/resource-permission.component.html","../../../projects/share/src/lib/ADMIN/component/permission/permission.component.ts","../../../projects/share/src/lib/ADMIN/component/permission/permission.component.html","../../../projects/share/src/lib/auth/has-permission.pipe.ts","../../../projects/share/src/lib/auth/has-permission.directive.ts","../../../projects/share/src/lib/directive/null-if-empty.directive.ts","../../../projects/share/src/lib/directive/number-only.directive.ts","../../../projects/share/src/lib/directive/uppercase-each-word.directive.ts","../../../projects/share/src/lib/directive/uppercase-first-letter.directive.ts","../../../projects/share/src/lib/directive/uppercase.directive.ts","../../../projects/share/src/lib/pipe/limit-words.pipe.ts","../../../projects/share/src/lib/helper/download.helper.ts","../../../projects/share/src/lib/helper/xlsx.helper.ts","../../../projects/share/src/lib/services/router-monitor.service.ts","../../../projects/share/src/lib/services/theme.service.ts","../../../projects/share/src/lib/services/vsc.service.ts","../../../projects/share/src/lib/directive/img-hide-if-error.directive.ts","../../../projects/share/src/lib/components/fade-animations.ts","../../../projects/share/src/lib/services/setting.service.ts","../../../projects/share/src/lib/components/layout/layout-user/notification/notification.service.ts","../../../projects/share/src/lib/components/layout/layout-user/notification/notification-center.component.ts","../../../projects/share/src/lib/components/layout/layout-user/notification/notification-center.component.html","../../../projects/share/src/lib/components/layout/layout-user/layout-user.ts","../../../projects/share/src/lib/components/layout/layout-user/layout-user.html","../../../projects/share/src/lib/services/file.service.ts","../../../projects/share/src/lib/services/signalr.service.ts","../../../projects/share/src/lib/components/layout/layout.component.ts","../../../projects/share/src/lib/components/layout/layout.component.html","../../../projects/share/src/lib/services/org.service.ts","../../../projects/share/src/lib/components/login/login.component.ts","../../../projects/share/src/lib/components/login/login.component.html","../../../projects/share/src/brggroup-share-lib.ts"],"sourcesContent":["export enum TranslateKey {\n ACTION = 'ACTION',\n ADD = 'ADD',\n AGREE = 'AGREE',\n BACK = 'BACK',\n CANCEL = 'CANCEL',\n CLOSE = 'CLOSE',\n CONFIRM = 'CONFIRM',\n CONFIRM_DELETE = 'CONFIRM_DELETE',\n COMPLETE = 'COMPLETE',\n DELETE = 'DELETE',\n DELETE_SUCCESS = 'DELETE_SUCCESS',\n EDIT = 'EDIT',\n ERROR = 'ERROR',\n EXPORT = 'EXPORT',\n HIDDEN = 'HIDDEN',\n IMPORT = 'IMPORT',\n INFO = 'INFO',\n LOGIN = 'LOGIN',\n LOGOUT = 'LOGOUT',\n NO_CONNECT_TO_SERVER = 'NO_CONNECT_TO_SERVER',\n OK = 'OK',\n PASSWORD = 'PASSWORD',\n REQUIRED = 'REQUIRED',\n REQUIRED_FIELD = 'REQUIRED_FIELD',\n REFEESH = 'REFEESH',\n RESET = 'RESET',\n RESET_PASSWORD = 'RESET_PASSWORD',\n SAVE = 'SAVE',\n SEARCH = 'SEARCH',\n SHOW = 'SHOW',\n SUCCESS = 'SUCCESS',\n SAVE_SUCCESS = 'SAVE_SUCCESS',\n SETTING = 'SETTING',\n PROFILE = 'PROFILE',\n USERNAME = 'USERNAME',\n UPDATE = 'UPDATE',\n WARNING = 'WARNING',\n YES = 'YES',\n DOWNLOAD_TEMPLATE = 'DOWNLOAD_TEMPLATE',\n WARNING_CHECK_DATA = 'WARNING_CHECK_DATA',\n}\n","export class AppGlobals {\n public static apiEndpoint: string;\n public static versionCheck: string;\n\n public static MENU_TYPE: 'side-menu' | 'toolbar-menu' = 'toolbar-menu';\n public static pageSizeOptions = [10, 20, 50, 100];\n\n public static filterSet: any = {};\n public static selectedIdSet: any = {};\n\n public static clearFillter() {\n this.filterSet = {};\n }\n\n public static getFilter(key: any) {\n return this.filterSet[key];\n }\n\n public static setFilter(key: any, filter: any) {\n this.filterSet[key] = filter;\n }\n\n public static getSelectedId(key: any) {\n return this.selectedIdSet[key];\n }\n\n public static setSelectedId(key: any, value: any) {\n this.selectedIdSet[key] = value;\n }\n\n public static setLang(lang: string) {\n localStorage.setItem('LANGUAGE', lang);\n }\n\n public static getLang(): string {\n if (!localStorage.getItem('LANGUAGE')) {\n localStorage.setItem('LANGUAGE', 'vn');\n }\n return localStorage.getItem('LANGUAGE') || '';\n }\n\n public static getOrgId() {\n return localStorage.getItem('orgid');\n }\n\n public static getOrgCode() {\n return localStorage.getItem('orgcode');\n }\n\n public static getOrgName() {\n return localStorage.getItem('orgname');\n }\n\n public static getUserName() {\n return localStorage.getItem('username');\n }\n\n public static getUserFullName() {\n return localStorage.getItem('fullname');\n }\n}\n","import { inject } from \"@angular/core\";\nimport { TranslateService } from \"@ngx-translate/core\";\n\nexport class AppStorage {\n \n static get tokenStorage() {\n return localStorage;\n // return sessionStorage;\n }\n\n static get localStoreage() {\n return localStorage;\n }\n\n static get sessionStoreage() {\n return sessionStorage;\n }\n\n static getLang(): string {\n return AppStorage.localStoreage.getItem('LANGUAGE') || 'vn';\n }\n\n static setLang(lang: string) {\n AppStorage.localStoreage.setItem('LANGUAGE', lang || 'vn');\n }\n}","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { RespondData } from '../../model';\n\nexport class HTTPService {\n httpClient = inject(HttpClient);\n\n get(url: string, noLoadingMark?: boolean): Promise<RespondData> {\n const options = {\n headers: new HttpHeaders({\n 'Content-Type': 'application/json; charset=utf-8',\n 'No-Loading-Mark': noLoadingMark ? '1' : '0',\n }),\n };\n\n return firstValueFrom(this.httpClient.get<RespondData>(url, options));\n }\n\n getParams(url: string, params: HttpParams, noLoadingMark?: boolean): Promise<RespondData> {\n const options = {\n headers: new HttpHeaders({\n 'Content-Type': 'application/json; charset=utf-8',\n 'No-Loading-Mark': noLoadingMark ? '1' : '0',\n }),\n params: params,\n };\n\n return firstValueFrom(this.httpClient.get<RespondData>(url, options));\n }\n\n post(url: string, noLoadingMark?: boolean): Promise<RespondData> {\n const options = {\n headers: new HttpHeaders({\n 'Content-Type': 'application/json; charset=utf-8',\n 'No-Loading-Mark': noLoadingMark ? '1' : '0',\n }),\n };\n\n return firstValueFrom(this.httpClient.post<RespondData>(url, null, options));\n }\n\n postParams(url: string, params: HttpParams, noLoadingMark?: boolean): Promise<RespondData> {\n const options = {\n headers: new HttpHeaders({\n 'Content-Type': 'application/json; charset=utf-8',\n 'No-Loading-Mark': noLoadingMark ? '1' : '0',\n }),\n params: params,\n };\n\n return firstValueFrom(this.httpClient.post<RespondData>(url, null, options));\n }\n\n postData(url: string, body: any, noLoadingMark?: boolean): Promise<RespondData> {\n const options = {\n headers: new HttpHeaders({\n 'Content-Type': 'application/json; charset=utf-8',\n 'No-Loading-Mark': noLoadingMark ? '1' : '0',\n }),\n };\n\n return firstValueFrom(this.httpClient.post<RespondData>(url, body, options));\n }\n\n postDataWithParams(url: string, body: any, params?: HttpParams, noLoadingMark?: boolean): Promise<RespondData> {\n const options = {\n headers: new HttpHeaders({\n 'Content-Type': 'application/json; charset=utf-8',\n 'No-Loading-Mark': noLoadingMark ? '1' : '0',\n }),\n params: params,\n };\n\n return firstValueFrom(this.httpClient.post<RespondData>(url, body, options));\n }\n}\n","import { Injectable } from '@angular/core';\nimport { fromEvent, map, Observable, startWith } from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class DeviceService {\n isMobile$(): Observable<boolean> {\n return fromEvent(window, 'resize').pipe(\n startWith(null), // emit lần đầu\n map(() => window.innerWidth <= 768),\n // map(() => window.innerWidth <= 500),\n );\n }\n\n innerWidth$(): Observable<number> {\n return fromEvent(window, 'resize').pipe(\n startWith(null),\n map(() => window.innerWidth),\n );\n }\n\n get isMobile() {\n return window.innerWidth <= 500;\n }\n}\n","import { Injectable, TemplateRef } from '@angular/core';\nimport { NzNotificationService, NzNotificationPlacement } from 'ng-zorro-antd/notification';\n\nexport interface NotiOptions {\n duration?: number;\n placement?: NzNotificationPlacement;\n showDetail?: boolean;\n onDetail?: () => void;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CustomNotiService {\n public static defaultDuration = 3000;\n public static defaultPlacement: NzNotificationPlacement = 'topRight';\n\n private globalTemplate!: TemplateRef<any>;\n\n constructor(private notification: NzNotificationService) {}\n\n registerTemplate(tpl: TemplateRef<any>): void {\n this.globalTemplate = tpl;\n }\n\n success(title: string, content?: string, options?: NotiOptions): void {\n this.show('success', title, content, options);\n }\n\n warning(title: string, content?: string, options?: NotiOptions): void {\n this.show('warning', title, content, options);\n }\n\n error(title: string, content?: string, options?: NotiOptions): void {\n this.show('error', title, content, options);\n }\n\n private show(type: 'success' | 'warning' | 'error', title: string, content?: string, options?: NotiOptions): void {\n if (!this.globalTemplate) {\n console.error('AppNotificationService: Template chưa được đăng ký!');\n return;\n }\n\n const config = this.getConfigByType(type);\n const finalDuration = options?.duration ?? CustomNotiService.defaultDuration;\n const finalPlacement = options?.placement ?? CustomNotiService.defaultPlacement;\n\n const notiRef = this.notification.template(this.globalTemplate, {\n nzDuration: finalDuration,\n nzPlacement: finalPlacement,\n nzClass: 'notification-with-progress',\n nzData: {\n title,\n description: content,\n duration: finalDuration,\n icon: config.icon,\n color: config.color,\n\n showDetail: options?.showDetail || false,\n onDetailClick: () => {\n if (options?.onDetail) {\n options.onDetail();\n }\n // đóng popup sau khi bấm \"Chi tiết\"\n this.notification.remove(notiRef.messageId);\n },\n },\n });\n }\n\n private getConfigByType(type: string): { icon: string; color: string } {\n switch (type) {\n case 'success':\n return { icon: 'check-circle', color: '#52c41a' };\n case 'warning':\n return { icon: 'exclamation-circle', color: '#faad14' };\n case 'error':\n return { icon: 'close-circle', color: '#ff4d4f' };\n default:\n return { icon: 'info-circle', color: '#1890ff' };\n }\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { NzModalService } from 'ng-zorro-antd/modal';\nimport { TranslateService } from '@ngx-translate/core';\nimport { TranslateKey } from '../a-translate-key';\nimport { DeviceService } from './device-service';\nimport { CustomNotiService } from './custom-notification.service';\n\nfunction escapeHtml(str: string) {\n return str.replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NotiService {\n modal = inject(NzModalService);\n // notification = inject(NzNotificationService);\n notification = inject(CustomNotiService);\n translate = inject(TranslateService);\n device = inject(DeviceService);\n\n async success(title?: string, content: string = '', showPopup: boolean = false): Promise<void> {\n if (showPopup) {\n return new Promise<void>((resolve) => {\n const modalRef = this.modal.success({\n nzTitle: title ?? this.translate.instant(TranslateKey.SUCCESS),\n nzContent: content,\n nzOnOk: () => resolve(),\n });\n });\n } else {\n const notiRef = this.notification.success(title ?? this.translate.instant(TranslateKey.SUCCESS), content);\n }\n }\n\n async warning(title: string, content: string = '', showPopup: boolean = false): Promise<void> {\n if (showPopup) {\n return new Promise<void>((resolve) => {\n const modalRef = this.modal.warning({\n nzTitle: title,\n nzContent: content,\n nzOnOk: () => resolve(),\n });\n });\n } else {\n const notiRef = this.notification.warning(title, content);\n }\n }\n\n async error(title: string, content: string = '', showPopup: boolean = false): Promise<void> {\n if (showPopup) {\n return new Promise<void>((resolve) => {\n const modalRef = this.modal.error({\n nzTitle: title,\n nzContent: content,\n nzOnOk: () => resolve(),\n });\n });\n } else {\n const notiRef = this.notification.error(title, content);\n }\n }\n\n handleError(err: any): void {\n if (err?.status == 0) {\n this.notification.error(this.translate.instant('NO_CONNECT_TO_SERVER'), '', { duration: 0 });\n\n return;\n }\n\n let _data: any = null;\n\n if (err?.error instanceof ArrayBuffer) {\n const message = new TextDecoder('utf-8').decode(new Uint8Array(err.error));\n try {\n _data = JSON.parse(message);\n } catch (error) {}\n } else if (err?.error instanceof Blob) {\n const reader = new FileReader();\n reader.onload = () => {\n try {\n const text = reader.result as string;\n _data = JSON.parse(text);\n this.handleError(_data);\n } catch (e) {\n this.notification.error(this.translate.instant('UNKNOWN_ERROR'), '', { duration: 0 });\n }\n };\n\n reader.onerror = () => {\n this.notification.error(this.translate.instant('UNKNOWN_ERROR'), '', { duration: 0 });\n };\n reader.readAsText(err.error);\n return;\n } else if (err?.error && typeof err.error === 'object') {\n _data = err.error;\n } else {\n _data = err;\n }\n\n let errorMsg = err?.message || 'An unexpected error occurred.';\n\n if (err?.name == 'EmptyError' && err?.message == 'no elements in sequence') {\n return;\n }\n\n if (_data?.ErrorMessage) {\n let hasMsgTag = false;\n let isMatchFirstMsg = false;\n\n let isMatch = _data.ErrorMessage?.match(/System.Data.SqlClient.SqlException \\(0x80131904\\): <msg>(.*?)<\\/msg>/);\n isMatchFirstMsg = isMatch ? true : false;\n\n if (isMatchFirstMsg) {\n const matches = [..._data.ErrorMessage?.matchAll(/<msg>(.*?)<\\/msg>/g)];\n const messages = matches.map((m) => m[1]);\n if (messages.length > 0) {\n errorMsg = messages.join('\\n');\n hasMsgTag = true;\n } else {\n errorMsg = _data.ErrorMessage;\n }\n } else {\n errorMsg = _data.ErrorMessage;\n }\n }\n\n this.notification.error('Lỗi phát sinh', errorMsg, {\n showDetail: !!_data?.Data,\n onDetail: () => {\n this.modal.error({\n nzTitle: 'Chi tiết lỗi',\n nzContent: escapeHtml(JSON.stringify(_data, null, 2)),\n nzWidth: this.device.isMobile ? '90vw' : '60vw',\n nzDraggable: true,\n nzCentered: true,\n nzOkText: 'Đóng',\n });\n },\n });\n }\n\n get modalWidth() {\n return this.device.isMobile ? '80vw' : '40vw';\n }\n}\n","import { ESPModel, ExportExcelModel, ExportPdfDocxlModel } from '../../model';\nimport { HTTPService } from './http.service';\nimport { firstValueFrom } from 'rxjs';\nimport { HttpParams } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { AppGlobals } from '../../app-global';\n\nexport enum ENUM_ResponseType {\n ARRAYBUFFER = 'arraybuffer',\n BLOB = 'blob',\n}\n\n@Injectable({ providedIn: 'root' })\nexport class CommonService extends HTTPService {\n ESP(obj: ESPModel, options?: { noLoadingMark: boolean }) {\n const params = new HttpParams().append('SPN', obj.SPN);\n return this.postDataWithParams(AppGlobals.apiEndpoint + '/api/Common/ESP', obj, params, options?.noLoadingMark);\n }\n\n ExportExcel(data: ExportExcelModel) {\n return firstValueFrom(\n this.httpClient.post(AppGlobals.apiEndpoint + '/api/Common/ExportExcel', data, {\n responseType: ENUM_ResponseType.BLOB,\n observe: 'response',\n }),\n );\n }\n\n ExportPdf(data: ExportPdfDocxlModel) {\n return this.postData(AppGlobals.apiEndpoint + '/api/Common/ExportPdf', data);\n }\n\n ExportDocx(data: ExportPdfDocxlModel) {\n return this.postData(AppGlobals.apiEndpoint + '/api/Common/ExportDocx', data);\n }\n\n ExportHTML(data: ExportExcelModel) {\n return this.postData(AppGlobals.apiEndpoint + '/api/Common/ExportHTML', data);\n }\n}\n","import { jwtDecode } from 'jwt-decode';\nimport { RespondData } from '../model';\nimport { AppStorage } from '../app-storeage';\n\nexport class TokenStorage {\n public static readonly JWT_TOKEN = 'JWT_TOKEN';\n public static readonly JWT_RFT_TOKEN = 'JWT_RFT_TOKEN';\n public static readonly USER_NAME = 'username';\n public static readonly FULL_NAME = 'fullname';\n public static readonly USER_MENU = 'usermenu';\n public static readonly ORG_ID = 'orgid';\n public static readonly ORG_CODE = 'orgcode';\n public static readonly ORG_NAME = 'orgname';\n\n public static saveToken(tokenRes: RespondData) {\n AppStorage.tokenStorage.setItem(this.JWT_TOKEN, tokenRes.Data.Token);\n AppStorage.tokenStorage.setItem(this.JWT_RFT_TOKEN, tokenRes.Data.RefreshToken);\n TokenStorage.saveTokenInfo(tokenRes.Data.Token);\n }\n\n public static saveTokenRft(token: string) {\n AppStorage.tokenStorage.setItem(this.JWT_TOKEN, token);\n TokenStorage.saveTokenInfo(token);\n }\n\n private static saveTokenInfo(token: string) {\n const userInfo: any = jwtDecode(token);\n\n AppStorage.tokenStorage.setItem(this.USER_NAME, userInfo[this.USER_NAME]);\n AppStorage.tokenStorage.setItem(this.FULL_NAME, userInfo[this.FULL_NAME]);\n AppStorage.tokenStorage.setItem(this.ORG_ID, userInfo[this.ORG_ID]);\n AppStorage.tokenStorage.setItem(this.ORG_CODE, userInfo[this.ORG_CODE]);\n AppStorage.tokenStorage.setItem(this.ORG_NAME, userInfo[this.ORG_NAME]);\n }\n\n public static saveUserMenu(menus: any[]) {\n AppStorage.tokenStorage.setItem(this.USER_MENU, JSON.stringify(menus));\n }\n\n public static getUserMenu(): any[] {\n return JSON.parse(AppStorage.tokenStorage.getItem(this.USER_MENU) || '[]');\n }\n\n public static getUsername() {\n return AppStorage.tokenStorage.getItem(this.USER_NAME);\n }\n\n public static getUserFullname() {\n return AppStorage.tokenStorage.getItem(this.FULL_NAME);\n }\n\n public static getOrgId() {\n return AppStorage.tokenStorage.getItem(this.ORG_ID);\n }\n\n public static getOrgCode() {\n return AppStorage.tokenStorage.getItem(this.ORG_CODE);\n }\n\n public static getOrgName() {\n return AppStorage.tokenStorage.getItem(this.ORG_NAME);\n }\n\n public static getToken() {\n return AppStorage.tokenStorage.getItem(this.JWT_TOKEN);\n }\n\n public static getRftToken() {\n return AppStorage.tokenStorage.getItem(this.JWT_RFT_TOKEN);\n }\n\n public static isLoggedIn() {\n return AppStorage.tokenStorage.getItem(this.JWT_TOKEN) != null;\n }\n\n public static clearToken() {\n console.log('-- clearToken --');\n AppStorage.tokenStorage.removeItem(this.JWT_TOKEN);\n AppStorage.tokenStorage.removeItem(this.JWT_RFT_TOKEN);\n AppStorage.tokenStorage.removeItem(this.USER_NAME);\n AppStorage.tokenStorage.removeItem(this.FULL_NAME);\n AppStorage.tokenStorage.removeItem(this.USER_MENU);\n AppStorage.tokenStorage.removeItem(this.ORG_ID);\n AppStorage.tokenStorage.removeItem(this.ORG_CODE);\n AppStorage.tokenStorage.removeItem(this.ORG_NAME);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { firstValueFrom, interval } from 'rxjs';\n\nimport { HTTPService } from '../services/api-service/http.service';\nimport { NotiService } from '../services/noti.service';\nimport { CommonService } from '../services/api-service/common.service';\nimport { TokenStorage } from './token.storage';\n\nimport { App_Org, ESPModel, RespondData } from '../model';\nimport { AppGlobals } from '../app-global';\nimport { SessionManagerService } from './session-manager.service';\n\nexport const URLs = {\n login: '/api/Auth/Login',\n register: '/api/Auth/Register',\n pingAuth: '/api/Auth/PingAuth',\n changePassword: '/api/Auth/ChangePassword',\n setPass: '/api/Auth/SetPass',\n changeOrgLogin: '/api/Auth/changeOrgLogin',\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthService extends HTTPService {\n notiService = inject(NotiService);\n cms = inject(CommonService);\n router = inject(Router);\n translate = inject(TranslateService);\n\n /* ----------------------------------------\n TOKEN\n ---------------------------------------- */\n\n getToken() {\n return TokenStorage.getToken();\n }\n\n async refreshToken(): Promise<RespondData | null> {\n const refreshToken = TokenStorage.getRftToken();\n if (!refreshToken) return null;\n\n const body = { rft: refreshToken };\n\n try {\n const res = await this.sendRftToken(body);\n\n if (res?.IsSuccess) {\n TokenStorage.saveTokenRft(res.Data);\n return res;\n }\n } catch (err) {\n console.error(err);\n }\n\n return null;\n }\n\n async sendRftToken(body: any): Promise<RespondData> {\n return firstValueFrom(\n this.httpClient.post<RespondData>(AppGlobals.apiEndpoint + '/api/Auth/RefreshToken', body, {\n headers: new HttpHeaders().set('Content-Type', 'application/json'),\n }),\n );\n }\n\n /* ----------------------------------------\n LOGIN\n ---------------------------------------- */\n\n async _signIn(username: string, password: string, orgid: string, returnUrl: string): Promise<boolean> {\n try {\n const body = {\n UserName: username,\n Password: password,\n OrgId: orgid,\n };\n\n const res = await this.sendSignIn(body);\n\n if (!res.IsSuccess) {\n this.notiService.error(this.translate.instant(res.ErrorMessage));\n return false;\n }\n\n this.notiService.success('Đăng nhập thành công');\n\n TokenStorage.saveToken(res);\n\n if (returnUrl) {\n this.router.navigateByUrl(returnUrl);\n }\n\n return true;\n } catch (err) {\n this.notiService.handleError(err);\n return false;\n }\n }\n\n async sendSignIn(body: any): Promise<RespondData> {\n return firstValueFrom(\n this.httpClient.post<RespondData>(AppGlobals.apiEndpoint + URLs.login, body, {\n headers: new HttpHeaders().set('Content-Type', 'application/json').set('No-Loading-Mark', '1'),\n }),\n );\n }\n\n /* ----------------------------------------\n LOGOUT\n ---------------------------------------- */\n\n _signOut() {\n TokenStorage.clearToken();\n\n const currentUrl = this.router.routerState.snapshot.url;\n\n // this.router.navigate(['/login'], {\n // queryParams: { returnUrl: currentUrl || '/' },\n // });\n\n this.router.navigate(['/login']);\n }\n\n /* ----------------------------------------\n AUTH CHECK\n ---------------------------------------- */\n\n async pingAuth(): Promise<boolean> {\n try {\n const res = await this.get(AppGlobals.apiEndpoint + URLs.pingAuth, true);\n\n return res?.IsSuccess;\n } catch {\n return false;\n }\n }\n\n /* ----------------------------------------\n MENU\n ---------------------------------------- */\n\n getUserMenu(headerMenuId: string) {\n let data: ESPModel = {\n SPN: `App_User_getUserMenu`,\n Params: [headerMenuId],\n };\n\n return this.cms.ESP(data);\n }\n\n getUserHeaderMenu() {\n let data: ESPModel = {\n SPN: `App_User_getUserHeaderMenu`,\n };\n\n return this.cms.ESP(data);\n }\n\n async checkUserMenu(url: string): Promise<boolean> {\n try {\n const ret = await this.cms.ESP({\n SPN: `App_User_checkUserMenu`,\n Params: [url],\n });\n\n return ret.IsSuccess && ret.Data == '1';\n } catch (error) {\n this.notiService.handleError(error);\n return true;\n }\n }\n\n /* ----------------------------------------\n PASSWORD\n ---------------------------------------- */\n\n changePassword(data: any) {\n return this.postData(AppGlobals.apiEndpoint + URLs.changePassword, data);\n }\n\n setPass(data: any) {\n return this.postData(AppGlobals.apiEndpoint + URLs.setPass, data);\n }\n\n /* ----------------------------------------\n REGISTER\n ---------------------------------------- */\n\n async signUp(d: any) {\n try {\n const res = await this.sendSignUp(d);\n\n if (!res.IsSuccess) {\n this.notiService.error(res.ErrorMessage);\n return;\n }\n\n this.notiService.success('Đăng ký thành công');\n\n this.router.navigateByUrl('/login');\n } catch (err) {\n console.error(err);\n this.notiService.handleError(err);\n }\n }\n\n async sendSignUp(d: any): Promise<RespondData> {\n return this.postData(AppGlobals.apiEndpoint + URLs.register, d);\n }\n\n /* ----------------------------------------\n CHANGE ORG\n ---------------------------------------- */\n\n async changeOrg(org: App_Org): Promise<boolean> {\n try {\n const res = await this.sendChangeOrg(org.App_Org_Id);\n\n if (!res?.IsSuccess) {\n this.notiService.error(this.translate.instant(res.ErrorMessage));\n return false;\n }\n\n TokenStorage.saveTokenRft(res.Data);\n\n return true;\n } catch (err) {\n console.error('changeOrg error:', err);\n return false;\n }\n }\n\n async sendChangeOrg(App_Org_Id: any): Promise<RespondData> {\n let params = new HttpParams().append('App_Org_Id', App_Org_Id);\n\n return this.postParams(AppGlobals.apiEndpoint + URLs.changeOrgLogin, params);\n }\n\n static pingInterVal: any;\n startPingAuth(intervalTime?: number) {\n if (!AuthService.pingInterVal) {\n if (!intervalTime || intervalTime < 5 * 60 * 1000) {\n intervalTime = 5 * 60 * 1000;\n }\n AuthService.pingInterVal = setInterval(() => {\n if (TokenStorage.getToken()) {\n this.pingAuth();\n }\n }, intervalTime);\n }\n }\n}\n","// import { C_Project } from 'app/QLDAXD/model/C_Project.model';\n\nimport { InjectionToken } from '@angular/core';\n\nexport interface CurrentUser {\n id: string;\n username: string;\n roles: string[]; // Ví dụ: ['Admin', 'QuanLyKhuVuc_1']\n permissions: string[]; // Ví dụ: ['todos:read_all', 'todos:update_own']\n}\n\nexport interface TodoData {\n id: string;\n createdByUserId: string;\n isCompleted: boolean;\n}\n\nexport interface ResourceMap {\n // project: C_Project;\n // todos: TodoData;\n // menu: App_Menu;\n // org: App_Org;\n}\n\nexport type AbacRuleFn<T> = (user: CurrentUser, data: T) => boolean;\nexport const ABAC_RULES_TOKEN = new InjectionToken<Record<string, AbacRuleFn<any>>>('ABAC_RULES_TOKEN');\n\n/**\n * 1. HÀM KIỂM TRA THEO QUYỀN VÀ THUỘC TÍNH (DÙNG CHO PHẦN LỚN NGHIỆP VỤ)\n */\nexport function checkPermission<TResource extends keyof ResourceMap>(\n user: CurrentUser | null | undefined,\n rules: Record<string, AbacRuleFn<any>>,\n resource: TResource,\n action: 'read' | 'create' | 'update' | 'delete' | string,\n data?: ResourceMap[TResource],\n): boolean {\n if (!user) return false;\n\n const SYSTEM_ROLES = ['Admin', 'SuperAdmin'];\n if (user.roles && user.roles.some((role) => SYSTEM_ROLES.includes(role))) return true;\n\n if (!user.permissions || user.permissions.length === 0) return false;\n\n const prefix = `${String(resource)}:${action}`;\n const matchedPermissions = user.permissions.filter((p) => p.startsWith(prefix));\n\n if (matchedPermissions.length === 0) return false;\n\n return matchedPermissions.some((permCode) => {\n const ruleFn = rules[permCode];\n\n // NẾU DEVELOPER QUÊN KHAI BÁO LUẬT TRONG APP_PERMISSION_RULES\n if (!ruleFn) {\n // Xử lý an toàn: Các mã quyền chứa '_own' bắt buộc phải có luật kiểm tra dữ liệu.\n // Nếu không có luật -> CHẶN NGAY LẬP TỨC (Fail-Closed).\n if (permCode.includes('_own')) {\n console.error(\n `[Security Warning]: Thiếu khai báo rule cho quyền \"${permCode}\" trong APP_PERMISSION_RULES. Hệ thống tự động từ chối truy cập để đảm bảo an toàn.`,\n );\n return false;\n }\n\n // Với các quyền toàn cục như '_all', 'create', 'export' -> Bỏ qua, cho phép hiển thị\n return true;\n }\n\n // NẾU ĐÃ CÓ KHAI BÁO LUẬT\n if (data !== undefined) {\n return ruleFn(user, data); // Chạy luật check theo dữ liệu (VD: user.id === org.CreatedUser)\n }\n\n // Trường hợp kiểm tra quyền chung nhưng lại có luật (Hiếm gặp)\n return true;\n });\n}\n\n/**\n * 2. HÀM TIỆN ÍCH CHỈ CHECK THEO ROLE (DÙNG ĐỂ RENDER UI ĐẶC THÙ)\n * Sử dụng khi bạn cần: *ngIf=\"hasRole('KiemToan')\"\n */\nexport function checkRole(user: CurrentUser | null | undefined, expectedRole: string): boolean {\n if (!user || !user.roles) return false;\n return user.roles.includes(expectedRole);\n}\n","import { inject, Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { ABAC_RULES_TOKEN, CurrentUser, ResourceMap, checkPermission, checkRole } from './auth-abac';\nimport { ESPModel } from '../model';\nimport { CommonService } from '../services/api-service/common.service';\n\n@Injectable({ providedIn: 'root' })\nexport class PermissionService {\n cms = inject(CommonService);\n\n private currentUser$ = new BehaviorSubject<CurrentUser | null>(null);\n\n // Hứng luật từ App. Nếu App không truyền thì lấy object rỗng {}\n private readonly appRules = inject(ABAC_RULES_TOKEN, { optional: true }) || {};\n\n setCurrentUser(user: CurrentUser) {\n this.currentUser$.next(user);\n }\n\n async getUserPermission(): Promise<boolean> {\n // 1. Caching: Đã có data rồi thì thôi không gọi nữa\n if (this.currentUser$.value) return true;\n\n try {\n let data: ESPModel = {\n SPN: 'Permission_getUserPermission',\n };\n\n let ret = await this.cms.ESP(data);\n\n if (ret && ret.IsSuccess && ret.Data) {\n // 2. Xử lý an toàn các mảng chuỗi (Split, Trim, Filter)\n const parseStringToArray = (str: string | null | undefined): string[] => {\n if (!str) return [];\n return str\n .split(',')\n .map((item) => item.trim()) // Xóa khoảng trắng thừa\n .filter((item) => item.length > 0); // Bỏ các phần tử rỗng\n };\n\n let user: CurrentUser = {\n id: ret.Data.userid || '',\n username: ret.Data.username || '',\n roles: parseStringToArray(ret.Data.roles),\n permissions: parseStringToArray(ret.Data.permissions),\n };\n\n this.setCurrentUser(user);\n return true;\n } else {\n console.warn('Không lấy được thông tin quyền của User');\n return false;\n }\n } catch (error) {\n console.error('Lỗi API khi lấy quyền User:', error);\n return false; // Trả về false để Guard biết luồng bị lỗi\n }\n }\n\n hasAccess<TResource extends keyof ResourceMap>(\n resource: TResource,\n action: 'read' | 'create' | 'update' | 'delete' | string,\n data?: ResourceMap[TResource],\n ): boolean {\n const currentUser = this.currentUser$.value;\n if (!currentUser) return false;\n\n // Truyền appRules vào cho hàm check\n return checkPermission(currentUser, this.appRules, resource, action, data);\n }\n\n hasRole(expectedRole: string): boolean {\n return checkRole(this.currentUser$.value, expectedRole);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';\nimport { AuthService } from './auth.service';\nimport { TokenStorage } from './token.storage';\nimport { PermissionService } from './permission.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthGuard implements CanActivate {\n router = inject(Router);\n authService = inject(AuthService);\n permissionService = inject(PermissionService);\n\n async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {\n // return true;\n\n if (await this.authService.pingAuth()) {\n this.permissionService.getUserPermission();\n return true;\n }\n\n TokenStorage.clearToken();\n\n if (state.url != '/') {\n if (!state.url.startsWith('/login')) {\n this.router.navigate(['/login'], { queryParams: { returnUrl: state.url } });\n } else {\n this.router.navigate([state.url]);\n }\n } else {\n this.router.navigate(['/login']);\n }\n return false;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, of } from 'rxjs';\nimport { delay, switchMap, distinctUntilChanged } from 'rxjs/operators';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class LoadingService {\n private static loadingStack: any[] = [];\n private loadingSubject = new BehaviorSubject<boolean>(false);\n\n private update() {\n const isLoading = LoadingService.loadingStack.length > 0;\n this.loadingSubject.next(isLoading);\n }\n\n loadingUp() {\n LoadingService.loadingStack.push(1);\n this.update();\n }\n\n loadingDown() {\n LoadingService.loadingStack.pop();\n this.update();\n }\n\n /** Trả về observable loading có delay khi bật để tránh chớp nháy */\n get loading$(): Observable<boolean> {\n return this.loadingSubject.asObservable().pipe(\n switchMap((loading) => {\n return of(loading);\n }),\n distinctUntilChanged(),\n );\n }\n\n /** Nếu chỉ cần giá trị hiện tại boolean (ít dùng hơn) */\n get isLoading(): boolean {\n return LoadingService.loadingStack.length > 0;\n }\n}\n","import { HttpHandlerFn, HttpRequest } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TokenStorage } from './token.storage';\nimport { BehaviorSubject, catchError, filter, finalize, from, of, switchMap, take, throwError } from 'rxjs';\nimport { LoadingService } from '../services/loading.service';\nimport { AuthService } from './auth.service';\nimport { RespondData } from '../model';\nimport { TranslateService } from '@ngx-translate/core';\n\nlet initialReturnUrl: string | null = null;\nlet isRefreshing = false;\nconst refreshTokenSubject = new BehaviorSubject<string | null>(null);\n\nexport function authInterceptor(req: HttpRequest<unknown>, next: HttpHandlerFn) {\n const router = inject(Router);\n const loadingService = inject(LoadingService);\n const authService = inject(AuthService);\n const translate = inject(TranslateService);\n\n const authToken = TokenStorage.getToken();\n const noLoadingMark = req.headers.get('No-Loading-Mark');\n\n if (noLoadingMark !== '1') loadingService.loadingUp();\n\n // Convert dates\n if (!(req.body instanceof FormData)) {\n const newBody = convertDatesInBody(req.body);\n if (req.body !== newBody) {\n req = req.clone({ body: newBody });\n }\n }\n\n // Add token\n if (authToken) {\n req = req.clone({\n setHeaders: { Authorization: `Bearer ${authToken}` },\n });\n }\n\n return next(req).pipe(\n catchError((error) => {\n if (error.status === 401) {\n return handle401(req, next, router, authService, translate);\n }\n return throwError(() => error);\n }),\n finalize(() => {\n if (noLoadingMark !== '1') loadingService.loadingDown();\n }),\n );\n}\n\n//\n// ⭐ REFRESH TOKEN HANDLER\n//\nfunction handle401(\n req: HttpRequest<any>,\n next: HttpHandlerFn,\n router: Router,\n authService: AuthService,\n translate: TranslateService,\n) {\n if (!isRefreshing) {\n isRefreshing = true;\n refreshTokenSubject.next(null);\n\n return from(authService.refreshToken()).pipe(\n switchMap((resAny: any) => {\n const res = resAny as RespondData;\n isRefreshing = false;\n\n if (!res?.IsSuccess) {\n const currentUrl = router.routerState.snapshot.url;\n\n if (!initialReturnUrl && !currentUrl.startsWith('/login')) {\n initialReturnUrl = currentUrl;\n }\n\n router.navigate(['/login'], {\n queryParams: { returnUrl: initialReturnUrl || '/' },\n });\n\n refreshTokenSubject.error(translate.instant('Refresh token failed'));\n\n return throwError(() => new Error(translate.instant('Refresh token failed')));\n }\n\n // Phát token mới cho các request đang chờ\n refreshTokenSubject.next(TokenStorage.getToken());\n\n // Retry request\n return next(\n req.clone({\n setHeaders: { Authorization: `Bearer ${TokenStorage.getToken()}` },\n }),\n );\n }),\n catchError((err) => {\n isRefreshing = false;\n TokenStorage.clearToken();\n const currentUrl = router.routerState.snapshot.url;\n\n if (!initialReturnUrl && !currentUrl.startsWith('/login')) {\n initialReturnUrl = currentUrl;\n }\n\n router.navigate(['/login'], {\n queryParams: { returnUrl: initialReturnUrl || '/' },\n });\n\n return throwError(() => err);\n }),\n );\n } else {\n // Nếu đang refresh → chờ token mới rồi retry\n return refreshTokenSubject.pipe(\n take(1),\n switchMap((token) =>\n next(\n req.clone({\n setHeaders: { Authorization: `Bearer ${token}` },\n }),\n ),\n ),\n catchError((err) => throwError(() => err)),\n );\n }\n}\n\nfunction convertDatesInBody(obj: any): any {\n if (obj instanceof Date) {\n return formatDate(obj);\n }\n\n if (Array.isArray(obj)) {\n return obj.map(convertDatesInBody);\n }\n\n if (typeof obj === 'object' && obj !== null) {\n const newObj: any = {};\n for (const key of Object.keys(obj)) {\n const value = obj[key];\n\n if (value instanceof Date) {\n newObj[key] = formatDate(value);\n } else if (typeof value === 'string' && isIsoDate(value)) {\n newObj[key] = formatDate(new Date(value));\n } else if (typeof value === 'object') {\n newObj[key] = convertDatesInBody(value);\n } else {\n newObj[key] = value;\n }\n }\n return newObj;\n }\n\n return obj;\n}\n\nfunction isIsoDate(str: string): boolean {\n // ISO string with optional time and timezone\n return /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[\\+\\-]\\d{2}:\\d{2})?$/.test(str);\n}\n\nfunction formatDate(date: Date): string {\n const pad = (n: number) => n.toString().padStart(2, '0');\n return (\n `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ` +\n `${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`\n );\n}\n","import { Injectable } from '@angular/core';\nimport { CanDeactivate } from '@angular/router';\n\nexport interface CanComponentDeactivate {\n canDeactivate: () => boolean | Promise<boolean>;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UnsavedChangesGuard implements CanDeactivate<CanComponentDeactivate> {\n canDeactivate(component: CanComponentDeactivate): boolean | Promise<boolean> {\n return component.canDeactivate ? component.canDeactivate() : true;\n }\n}\n","import { inject, Injectable, NgZone } from '@angular/core';\nimport { AuthService } from './auth.service';\n\ninterface SessionHandlers {\n refreshToken: () => Promise<any>;\n logout: () => void;\n getToken: () => string | null;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SessionManagerService {\n public zone = inject(NgZone);\n public authService = inject(AuthService);\n\n private idleTimer: any;\n private refreshTimer: any;\n private heartbeatTimer: any;\n\n public static IDLE_MIN = 15;\n private readonly REFRESH_BEFORE = 120;\n\n private get IDLE_TIME() {\n return (SessionManagerService.IDLE_MIN || 0) * 60 * 1000;\n }\n\n private readonly LEADER_KEY = 'APP_SESSION_LEADER';\n private readonly HEARTBEAT_KEY = 'APP_SESSION_HEARTBEAT';\n private readonly ACTIVITY_KEY = 'APP_LAST_ACTIVITY';\n\n private readonly SESSION_EVENT = 'APP_SESSION_EVENT';\n private readonly LOGIN_EVENT = 'APP_LOGIN_EVENT';\n private readonly LOGOUT_EVENT = 'APP_LOGOUT_EVENT';\n private readonly ACTIVITY_EVENT = 'APP_ACTIVITY_EVENT';\n private readonly TOKEN_REFRESH_EVENT = 'APP_TOKEN_REFRESH_EVENT';\n\n private tabId = Date.now() + Math.random();\n\n private isLeader = false;\n private refreshLock = false;\n\n private channel: BroadcastChannel | null = null;\n\n /* -------------------------------- START -------------------------------- */\n\n start() {\n console.log('SessionManagerService > start > IDLE_TIME: ' + SessionManagerService.IDLE_MIN + ' mins');\n\n if ('BroadcastChannel' in window) {\n this.channel = new BroadcastChannel('APP_SESSION');\n this.listenChannel();\n }\n\n if (this.IDLE_TIME <= 0) return;\n\n this.listenActivity();\n this.updateActivity();\n this.resetIdle();\n\n this.electLeader();\n }\n\n // stop() {\n // clearTimeout(this.idleTimer);\n // clearTimeout(this.refreshTimer);\n // clearInterval(this.heartbeatTimer);\n // }\n\n async login(username: string, password: string, orgid: string, returnUrl: string) {\n var ret = await this.authService._signIn(username, password, orgid, returnUrl);\n if (ret) {\n console.log('SessionManagerService > broadcast LOGIN');\n this.broadcast(this.LOGIN_EVENT);\n }\n }\n\n logout() {\n this.authService._signOut();\n this.broadcast(this.LOGOUT_EVENT);\n }\n\n /* -------------------------------- ACTIVITY -------------------------------- */\n\n private listenActivity() {\n const events = ['mousemove', 'keydown', 'click', 'scroll'];\n\n events.forEach((e) => {\n window.addEventListener(e, this.onActivity, true);\n });\n }\n\n private onActivity = this.debounce(() => {\n this.updateActivity();\n this.resetIdle();\n\n this.broadcast(this.ACTIVITY_EVENT);\n }, 1000);\n\n private updateActivity() {\n localStorage.setItem(this.ACTIVITY_KEY, Date.now().toString());\n }\n\n /* -------------------------------- IDLE -------------------------------- */\n\n private resetIdle() {\n clearTimeout(this.idleTimer);\n\n const last = Number(localStorage.getItem(this.ACTIVITY_KEY) || Date.now());\n const remain = this.IDLE_TIME - (Date.now() - last);\n\n if (remain <= 0) {\n this.authService._signOut();\n return;\n }\n\n this.zone.runOutsideAngular(() => {\n this.idleTimer = setTimeout(() => {\n this.zone.run(() => this.authService._signOut());\n }, remain);\n });\n }\n\n /* -------------------------------- LEADER -------------------------------- */\n\n private electLeader() {\n const leader = localStorage.getItem(this.LEADER_KEY);\n\n if (!leader) {\n this.becomeLeader();\n return;\n }\n\n this.checkLeaderHeartbeat();\n }\n\n private becomeLeader() {\n this.isLeader = true;\n\n localStorage.setItem(this.LEADER_KEY, '' + this.tabId);\n\n this.startHeartbeat();\n this.scheduleRefresh();\n }\n\n private startHeartbeat() {\n this.heartbeatTimer = setInterval(() => {\n localStorage.setItem(this.HEARTBEAT_KEY, Date.now().toString());\n }, 2000);\n }\n\n private checkLeaderHeartbeat() {\n setTimeout(() => {\n const beat = Number(localStorage.getItem(this.HEARTBEAT_KEY) || 0);\n\n if (Date.now() - beat > 5000) {\n this.becomeLeader();\n }\n }, 3000);\n }\n\n /* -------------------------------- REFRESH TOKEN -------------------------------- */\n\n private scheduleRefresh() {\n if (!this.isLeader) return;\n\n clearTimeout(this.refreshTimer);\n\n const token = this.authService.getToken();\n\n if (!token) return;\n\n const exp = this.parseJwt(token).exp * 1000;\n\n const delay = exp - Date.now() - this.REFRESH_BEFORE * 1000;\n\n if (delay <= 0) {\n this.refreshToken();\n return;\n }\n\n this.refreshTimer = setTimeout(() => {\n this.refreshToken();\n }, delay);\n }\n\n private async refreshToken() {\n if (!this.isLeader || this.refreshLock) return;\n\n this.refreshLock = true;\n\n try {\n const res = await this.authService.refreshToken();\n\n if (res?.IsSuccess) {\n this.broadcast(this.TOKEN_REFRESH_EVENT);\n\n this.scheduleRefresh();\n } else {\n this.logout();\n }\n } catch {\n this.logout();\n } finally {\n this.refreshLock = false;\n }\n }\n\n /* -------------------------------- CHANNEL -------------------------------- */\n\n private listenChannel() {\n console.log('SessionManagerService > listenChannel:', this.channel);\n\n if (!this.channel) return;\n\n this.channel.onmessage = (msg) => {\n const type = msg.data?.type;\n\n if (type === this.ACTIVITY_EVENT) {\n this.resetIdle();\n }\n\n if (type === this.LOGOUT_EVENT) {\n location.reload();\n }\n\n if (type === this.LOGIN_EVENT) {\n location.reload();\n }\n\n if (type === this.TOKEN_REFRESH_EVENT) {\n this.scheduleRefresh();\n }\n };\n }\n\n private broadcast(type: string) {\n if (this.channel) {\n this.channel.postMessage({ type });\n } else {\n localStorage.setItem(this.SESSION_EVENT, JSON.stringify({ type, t: Date.now() }));\n }\n }\n\n /* -------------------------------- UTILS -------------------------------- */\n\n private debounce(fn: Function, delay: number) {\n let timer: any;\n\n return () => {\n clearTimeout(timer);\n\n timer = setTimeout(() => fn(), delay);\n };\n }\n\n private parseJwt(token: string) {\n const payload = token.split('.')[1];\n\n return JSON.parse(atob(payload));\n }\n}\n","import { Injectable } from '@angular/core';\nimport { NzModalService, NzModalRef, ModalOptions } from 'ng-zorro-antd/modal';\n\n@Injectable({ providedIn: 'root' })\nexport class CustomModalService {\n constructor(private modal: NzModalService) {}\n\n create<T, D = any>(options: ModalOptions<T, D>): NzModalRef<T, D> {\n const defaultOptions: Partial<ModalOptions<T, D>> = {\n nzMaskClosable: false,\n nzCentered: true,\n nzBodyStyle: {\n 'max-height': 'calc(100vh - 180px)',\n overflow: 'auto',\n },\n };\n\n const mergedOptions: ModalOptions<T, D> = {\n ...defaultOptions,\n ...options,\n nzStyle: {\n ...defaultOptions.nzStyle,\n ...options.nzStyle,\n },\n };\n\n return this.modal.create(mergedOptions);\n }\n\n confirm(options: ModalOptions): NzModalRef {\n return this.modal.confirm(options);\n }\n\n info(options: ModalOptions): NzModalRef {\n return this.modal.info(options);\n }\n\n success(options: ModalOptions): NzModalRef {\n return this.modal.success(options);\n }\n\n warning(options: ModalOptions): NzModalRef {\n return this.modal.warning(options);\n }\n\n error(options: ModalOptions): NzModalRef {\n return this.modal.error(options);\n }\n}\n","import { Component, DestroyRef, inject } from '@angular/core';\nimport { NotiService } from '../services/noti.service';\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { FormGroup } from '@angular/forms';\nimport { TranslateKey } from '../a-translate-key';\nimport { filter, map, Observable } from 'rxjs';\nimport { CustomModalService } from '../services/custom-modal.service';\nimport { Location } from '@angular/common';\nimport { AppGlobals } from '../app-global';\n\n@Component({ template: '' })\nexport class BaseComponent {\n protected AppGlobals = AppGlobals;\n\n protected TranslateKey = TranslateKey;\n\n protected route = inject(ActivatedRoute);\n protected router = inject(Router);\n protected location = inject(Location);\n\n protected notiService = inject(NotiService);\n protected translate = inject(TranslateService);\n protected modal = inject(CustomModalService);\n protected backURL = '';\n\n protected selectedId: any;\n protected isLoading = false;\n protected isSaving = false;\n\n protected destroyRef = inject(DestroyRef);\n\n /**\n * import { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n * this.routeChange$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((url) => {});\n */\n protected get routeChange$(): Observable<string> {\n return this.router.events.pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n map((e: NavigationEnd) => e.urlAfterRedirects),\n );\n }\n\n protected goback() {\n if (this.backURL) {\n this.goto(this.backURL);\n } else {\n this.location.back();\n }\n }\n\n protected goto(url?: string, isNewTab = false) {\n if (!url) return;\n\n if (isNewTab) {\n window.open(url, '_blank');\n } else {\n if (url.startsWith('/')) {\n this.router.navigateByUrl(url);\n } else {\n this.router.navigate([url], { relativeTo: this.route });\n }\n }\n }\n\n /**\n * /:id\n */\n protected getUrlParam(paramName: string) {\n const paramValue = this.route.snapshot.params[paramName];\n\n // bằng 0 thì trả về null vì chuyển primary key từ bigint sang string, code cũ đang truyền vào 0\n if (paramValue == '0' || paramValue == 'new' || paramValue == 'them-moi') {\n return null;\n }\n return paramValue;\n }\n\n /**\n * ?id=xxx\n */\n protected getUrlQueryParam(queryParamName: string) {\n const queryParamValue = this.route.snapshot.queryParamMap.get(queryParamName);\n return queryParamValue;\n }\n\n /**\n * Routes data\n */\n protected getUrlData(key: string) {\n return this.route.snapshot.data[key];\n }\n\n protected setQueryParam(name: string, value: string) {\n this.router.navigate([], {\n relativeTo: this.route,\n queryParams: {\n [name]: value,\n },\n queryParamsHandling: 'merge',\n });\n }\n\n protected get url() {\n return this.router.url;\n }\n\n protected get urlPath() {\n return this.router.url.split('?')[0];\n }\n\n protected success(title?: string, content: string = '', showPopup: boolean = false) {\n this.notiService.success(title, content, showPopup);\n }\n\n protected warning(title: string, content: string = '', showPopup: boolean = false) {\n this.notiService.warning(title, content, showPopup);\n }\n\n protected error(title: string, content: string = '', showPopup: boolean = false) {\n this.notiService.error(title, content, showPopup);\n }\n\n protected handleError(err: any) {\n this.notiService.handleError(err);\n }\n\n protected touchControls(formData: FormGroup) {\n Object.values(formData.controls).forEach((control) => {\n if (control.invalid) {\n control.markAsDirty();\n control.updateValueAndValidity({ onlySelf: true });\n }\n });\n\n formData.updateValueAndValidity();\n\n this.logFormErrors(formData);\n }\n\n protected untouchControls(formData: FormGroup) {\n formData.markAsPristine();\n formData.markAsUntouched();\n formData.updateValueAndValidity();\n }\n\n private logFormErrors(form: FormGroup, parentKey: string = '') {\n Object.keys(form.controls).forEach((key) => {\n const control = form.get(key);\n const fieldPath = parentKey ? `${parentKey}.${key}` : key;\n\n if (control instanceof FormGroup) {\n this.logFormErrors(control, fieldPath);\n } else {\n if (control?.errors) {\n console.log(`Control: ${fieldPath}`, control.errors);\n }\n }\n });\n }\n\n protected confirm(title: string, content: string = ''): Promise<boolean> {\n return new Promise((resolve) => {\n this.modal.confirm({\n // nzCentered: true,\n nzTitle: title,\n nzContent: content,\n nzOkText: this.translate.instant(this.TranslateKey.AGREE),\n nzOkType: 'primary',\n nzOkDanger: true,\n nzClosable: false,\n nzOnOk: () => resolve(true),\n nzAutofocus: 'ok',\n nzCancelText: this.translate.instant(this.TranslateKey.CANCEL),\n nzOnCancel: () => resolve(false),\n });\n });\n }\n\n protected backToTop() {\n // go to top\n window.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n\n const content = document.querySelector('nz-content');\n if (content) {\n content.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n }\n }\n}\n","import { Component, HostListener } from '@angular/core';\nimport { BaseComponent } from './base.component';\nimport { CanComponentDeactivate } from '../auth/unsaved-changes.guard';\nimport { FormGroup } from '@angular/forms';\n\n@Component({\n template: '',\n})\nexport class BaseGuardChangeComponent extends BaseComponent implements CanComponentDeactivate {\n private lstFormData: FormGroup[] = [];\n\n addTrackDirty(formData: FormGroup) {\n this.lstFormData.push(formData);\n }\n\n hasUnsavedChanges = false;\n markAsUnsaved() {\n this.hasUnsavedChanges = true;\n }\n\n @HostListener('window:beforeunload', ['$event'])\n unloadNotification($event: any) {\n if (this.lstFormData?.some((x) => x.dirty) || this.hasUnsavedChanges) {\n $event.preventDefault();\n $event.returnValue = true; // Chrome requires this line\n }\n }\n\n async canDeactivate(): Promise<boolean> {\n if (this.lstFormData?.some((x) => x.dirty) || this.hasUnsavedChanges) {\n console.log('hasUnsavedChanges', this.hasUnsavedChanges);\n\n // ---- XỬ LÝ LOG CỤ THỂ FIELD DIRTY ----\n const dirtyDetails = this.lstFormData\n ?.map((form, index) => {\n if (!form.dirty) return null; // Bỏ qua form không bị thay đổi\n\n // Lọc ra các key (tên field) có trạng thái dirty = true\n const dirtyFields = Object.keys(form.controls).filter((key) => form.controls[key].dirty);\n\n return {\n formIndex: index, // Vị trí của form trong mảng lstFormData\n fields: dirtyFields,\n };\n })\n .filter(Boolean); // Loại bỏ các giá trị null\n\n console.log('fields dirty:', dirtyDetails);\n // --------------------------------------\n\n return await this.confirm('Dữ liệu chưa được lưu!', 'Bạn có chắc chắn muốn rời khỏi trang?');\n }\n return true;\n }\n\n clearChange() {\n this.lstFormData?.forEach((x) => {\n x?.markAsPristine();\n x?.markAsUntouched();\n x?.updateValueAndValidity();\n });\n this.hasUnsavedChanges = false;\n }\n}\n","import { ElementRef, inject, TemplateRef, ViewContainerRef } from '@angular/core';\nimport { OverlayRef, Overlay } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { fromEvent } from 'rxjs';\nimport { filter, takeUntil } from 'rxjs/operators';\nimport { BaseComponent } from './base.component';\nimport { NzButtonComponent } from 'ng-zorro-antd/button';\n\nexport class BaseOverlayComponent extends BaseComponent {\n // custom dropdow\n inputWidth: number = 0;\n triggerSpan = 500;\n private overlayRef!: OverlayRef;\n\n overlay = inject(Overlay);\n vcr = inject(ViewContainerRef);\n\n openOverlay(originEl: any, target: TemplateRef<any>, width = 0) {\n const origin: HTMLElement = originEl?.elementRef?.nativeElement ?? originEl?.nativeElement ?? originEl;\n\n this.updateInputWidth(origin);\n\n if (this.overlayRef) {\n this.overlayRef.detach(); // Đóng nếu đã mở\n }\n\n width = width > origin.offsetWidth ? width : origin.offsetWidth; // 👈 Lấy chiều rộng của input\n\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(origin)\n .withPositions([\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetY: 5,\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n offsetY: -5,\n },\n ])\n .withDefaultOffsetY(5);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n hasBackdrop: false,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n width, // 👈 Gán chiều rộng cho overlay\n });\n\n this.overlayRef.backdropClick().subscribe(() => {\n this.overlayRef.detach();\n });\n\n const portal = new TemplatePortal(target, this.vcr);\n this.overlayRef.attach(portal);\n\n const overlayElement = this.overlayRef.overlayElement;\n\n // hasBackdrop: false, thêm cái này để đóng khi click ra ngoài\n fromEvent<MouseEvent>(document, 'click')\n .pipe(\n filter((event) => {\n const clickTarget = event.target as HTMLElement;\n\n return (\n this.overlayRef &&\n !overlayElement.contains(clickTarget) && // click không nằm trong overlay\n !origin.contains(clickTarget) && // và cũng không phải click vào input gốc\n !clickTarget.closest('.ant-select-dropdown') &&\n !clickTarget.closest('.ant-select-item') &&\n !clickTarget.closest('.ant-select-item-option-content') &&\n !clickTarget.closest('.no-close-custom-dropdow')\n );\n }),\n takeUntil(this.overlayRef.detachments()), // tự huỷ khi overlay bị đóng\n )\n .subscribe(() => {\n this.overlayRef?.detach();\n });\n }\n\n updateInputWidth(inputEl: HTMLElement) {\n this.inputWidth = inputEl?.offsetWidth || 0;\n }\n // END custom dropdow\n}\n","import { Component } from '@angular/core';\nimport { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\nimport { BaseComponent } from '../base.component';\n\ninterface IBreadcrumb {\n Name: string;\n URL?: string;\n Click?: Function;\n}\n\n@Component({\n selector: 'app-breadcrumb',\n templateUrl: './breadcrumb.html',\n imports: [NzBreadCrumbModule, NzIconModule],\n})\nexport class Breadcrumb extends BaseComponent {\n Breadcrumb = Breadcrumb;\n\n private static _lstBreadcrumb: IBreadcrumb[] = [];\n public static get lstBreadcrumb() {\n return Breadcrumb._lstBreadcrumb;\n }\n public static set lstBreadcrumb(val: IBreadcrumb[]) {\n setTimeout(() => {\n Breadcrumb._lstBreadcrumb = val;\n }, 0);\n }\n\n public static clear() {\n Breadcrumb.lstBreadcrumb = [];\n }\n\n gohome() {\n this.goto('');\n }\n\n onclick(item: IBreadcrumb) {\n if (item.URL) {\n this.goto(item.URL);\n } else if (item.Click) {\n item.Click();\n }\n }\n}\n","<nz-breadcrumb>\n <nz-breadcrumb-item (click)=\"gohome()\">\n <nz-icon nzType=\"home\" nzTheme=\"outline\" />\n </nz-breadcrumb-item>\n @for (item of Breadcrumb.lstBreadcrumb; track $index) {\n <nz-breadcrumb-item (click)=\"onclick(item)\">{{ item.Name }}</nz-breadcrumb-item>\n }\n</nz-breadcrumb>\n","import { Component, ElementRef, Input, AfterViewInit, ViewChild, OnChanges, SimpleChanges } from '@angular/core';\n\n@Component({\n selector: 'animated-digit',\n templateUrl: 'animated-digit.component.html',\n styleUrls: ['animated-digit.component.scss'],\n})\nexport class AnimatedDigitComponent implements AfterViewInit, OnChanges {\n @Input() duration: number = 0;\n @Input() digit: number = 0;\n @Input() steps: number = 0;\n @ViewChild('animatedDigit') animatedDigit!: ElementRef;\n\n private currentValue: number = 0;\n\n animateCount() {\n if (!this.duration) {\n this.duration = 1000;\n }\n\n if (typeof this.digit === 'number') {\n this.counterFunc(this.currentValue, this.digit, this.duration, this.animatedDigit);\n }\n }\n\n counterFunc(startValue: number, endValue: number, durationMs: number, element: ElementRef) {\n if (!this.steps) {\n this.steps = 12;\n }\n\n const stepCount = Math.abs(durationMs / this.steps);\n const valueIncrement = (endValue - startValue) / stepCount;\n const sinValueIncrement = Math.PI / stepCount;\n\n let currentSinValue = 0;\n\n function step() {\n currentSinValue += sinValueIncrement;\n startValue += valueIncrement * Math.sin(currentSinValue) ** 2 * 2;\n if (element) element.nativeElement.textContent = Math.abs(Math.floor(startValue));\n\n if (currentSinValue < Math.PI) {\n window.requestAnimationFrame(step);\n }\n }\n\n step();\n }\n\n ngAfterViewInit() {\n if (this.digit) {\n this.animateCount();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['digit']) {\n this.animateCount();\n setTimeout(() => {\n this.currentValue = this.digit;\n }, this.duration);\n }\n }\n}\n","<span #animatedDigit class=\"animated-digit\">\n <span>{{digit}}</span>\n</span>","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { Chart, registerables } from 'chart.js';\n\n@Component({\n selector: 'cdk-bar-graph',\n templateUrl: './bar-graph.component.html',\n styleUrls: ['./bar-graph.component.scss'],\n imports: [CommonModule],\n})\nexport class BarGraphComponent implements OnInit, OnDestroy {\n @Input() height: number = 0;\n @Input() id: string = '';\n\n chart?: Chart;\n\n constructor() {\n Chart.register(...registerables);\n }\n\n ngOnInit() {\n setTimeout(() => {\n this.createBarGraph();\n }, 500);\n }\n\n ngOnDestroy(): void {\n if (this.chart) {\n this.chart.destroy();\n }\n }\n\n createBarGraph() {\n if (!this.id) {\n return;\n }\n\n this.chart = new Chart(this.id, {\n type: 'bar',\n data: {\n labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug'],\n datasets: [\n {\n backgroundColor: 'rgba(92, 107, 192, .7)',\n borderColor: 'rgba(92, 107, 192, .7)',\n data: [70, 88, 77, 93, 82, 100, 70, 67, 78, 99],\n label: 'Dataset',\n },\n {\n backgroundColor: 'rgba(66, 165, 245, .7)',\n borderColor: 'rgba(69, 39, 160, .7)',\n data: [80, 88, 67, 95, 76, 60, 67, 95, 95, 66],\n label: 'Dataset',\n },\n {\n backgroundColor: 'rgba(38, 166, 154, .7)',\n borderColor: 'rgba(69, 39, 160, .7)',\n data: [60, 88, 70, 67, 27, 83, 78, 88, 95, 60],\n label: 'Dataset',\n },\n {\n backgroundColor: 'rgba(102, 187, 106, .7)',\n borderColor: 'rgba(255, 99, 132)',\n data: [75, 55, 55, 95, 66, 88, 70, 78, 77, 100],\n label: 'Dataset',\n },\n ],\n },\n options: {\n elements: {\n line: {\n tension: 0.000001,\n },\n },\n maintainAspectRatio: false,\n plugins: {\n filler: {\n propagate: false,\n },\n },\n },\n });\n }\n}\n","<div class=\"dash-bar-graph-holder mat-elevation-z4\" [ngStyle]=\"{ height: height + 'px' }\">\n <canvas [id]=\"id\"></canvas>\n</div>\n","import { Component, OnInit, Input } from '@angular/core';\nimport { AnimatedDigitComponent } from '../animated/animated-digit.component';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\nimport { NzGridModule } from 'ng-zorro-antd/grid';\n\n@Component({\n selector: 'cdk-dashcard',\n templateUrl: './dashcard.component.html',\n styleUrls: ['./dashcard.component.scss'],\n imports: [NzGridModule, NzIconModule, AnimatedDigitComponent],\n})\nexport class DashcardComponent implements OnInit {\n @Input() dashData: any;\n\n constructor() {}\n\n ngOnInit() {}\n}\n","<div nz-row class=\"dashcard mat-elevation-z2\" style=\"height: 100%\">\n <div nz-col [nzSpan]=\"8\" class=\"text-center\" [style.background]=\"dashData?.colorLight\">\n <nz-icon class=\"mat-icon\" style=\"padding-top: 50px\" [nzType]=\"dashData?.icon\" nzTheme=\"outline\" />\n </div>\n <div nz-col [nzSpan]=\"16\" [style.background]=\"dashData?.colorDark\">\n <div class=\"text-center animated-digit\">\n <animated-digit [digit]=\"dashData?.number\"></animated-digit>\n </div>\n <p\n class=\"text-center mat-body-1 border-top text-bold\"\n style=\"font-size: 16px; margin-bottom: 8px; padding-top: 3px\"\n >\n {{ dashData?.title }}\n </p>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { Chart, registerables } from 'chart.js';\n\n@Component({\n selector: 'cdk-doughnut-graph',\n templateUrl: './doughnut-graph.component.html',\n styleUrls: ['./doughnut-graph.component.scss'],\n imports: [CommonModule],\n})\nexport class DoughnutGraphComponent implements OnInit, OnDestroy {\n @Input() height: number = 0;\n @Input() id: string = '';\n\n chart?: Chart;\n\n constructor() {\n Chart.register(...registerables);\n }\n\n ngOnInit() {\n setTimeout(() => {\n this.createDoughnutGraph();\n }, 500);\n }\n\n ngOnDestroy(): void {\n if (this.chart) {\n this.chart.destroy();\n }\n }\n\n randomNumber(min = 0, max = 0) {\n if (min == 0 || max == 0) return Math.round(Math.random() * 100);\n else return Math.random() * (max - min) + min;\n }\n\n createDoughnutGraph() {\n if (!this.id) {\n return;\n }\n\n this.chart = new Chart(this.id, {\n type: 'doughnut',\n data: {\n labels: ['Data '],\n datasets: [\n {\n data: [this.randomNumber(), this.randomNumber(), this.randomNumber(), this.randomNumber()],\n backgroundColor: [\n 'rgba(255, 99, 132,.7)',\n 'rgba(92, 107, 192,.7)',\n 'rgba(66, 165, 245,.7)',\n 'rgba(38, 166, 154,.7)',\n 'rgba(102, 187, 106,.7)',\n ],\n },\n ],\n },\n options: {\n elements: {\n line: {\n tension: 0.000001,\n },\n },\n\n maintainAspectRatio: false,\n responsive: true,\n plugins: {\n filler: {\n propagate: false,\n },\n },\n },\n });\n }\n}\n","<div class=\"doughnut-graph-graph-holder mat-elevation-z4 \" [ngStyle]=\"{'height': height + 'px'}\">\n <canvas [id]=\"id\"></canvas>\n</div>","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { Chart, registerables } from 'chart.js';\n\n@Component({\n selector: 'cdk-line-graph',\n templateUrl: './line-graph.component.html',\n styleUrls: ['./line-graph.component.scss'],\n imports: [CommonModule],\n})\nexport class LineGraphComponent implements OnInit, OnDestroy {\n @Input() height: number = 0;\n @Input() id: string = '';\n\n chart?: Chart;\n\n constructor() {\n Chart.register(...registerables);\n }\n\n ngOnInit() {\n setTimeout(() => {\n this.createLineChart();\n }, 500);\n }\n\n ngOnDestroy(): void {\n if (this.chart) {\n this.chart.destroy();\n }\n }\n\n createLineChart() {\n if (!this.id) {\n return;\n }\n\n this.chart = new Chart(this.id, {\n type: 'line',\n data: {\n labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct'],\n datasets: [\n {\n backgroundColor: 'rgba(92, 107, 192, 0.36)',\n borderColor: 'rgba(92, 107, 192,.5)',\n data: [76.97, 88.91, 99.31, 122.19, 130.85, 140.91, 150.36, 142.66, 150.36, 142.66],\n label: 'Dataset',\n fill: 'start',\n },\n ],\n },\n options: {\n elements: {\n line: {\n tension: 0.000001,\n },\n },\n\n maintainAspectRatio: false,\n plugins: {\n filler: {\n propagate: false,\n },\n },\n },\n });\n }\n}\n","<div class=\"line-graph-holder mat-elevation-z4 \" [ngStyle]=\"{'height': height + 'px'}\">\n <canvas [id]=\"id\"></canvas>\n</div>","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NzCheckboxModule } from 'ng-zorro-antd/checkbox';\nimport { NzFormModule } from 'ng-zorro-antd/form';\n\n@Component({\n selector: 'extend-checkbox',\n templateUrl: './extend-checkbox.html',\n imports: [CommonModule, FormsModule, ReactiveFormsModule, NzFormModule, NzCheckboxModule],\n})\nexport class ExtendCheckbox implements OnInit {\n @Input() label = '';\n\n /**\n * default = 8\n */\n @Input() labelSpan = 8;\n @Input() labelFlex: string | number | null = null;\n @Input() paddingTop: string = '0px';\n\n @Input() disabled = false;\n\n @Input() formData!: FormGroup;\n @Input() controlName!: string;\n\n /**\n * default: boolean\n */\n @Input() valueType: 'boolean' | 'number' | 'string' = 'boolean';\n\n @Input()\n get _ngModel() {\n if (this.valueType == 'boolean') {\n return this.checked;\n }\n if (this.valueType == 'number') {\n return this.checked ? 1 : 0;\n }\n if (this.valueType == 'string') {\n return this.checked ? 'Y' : 'N';\n }\n }\n set _ngModel(val: any) {\n if (this.controlName) {\n if (this.valueType == 'boolean') {\n this.formData.controls[this.controlName].valueChanges.subscribe((x) => {\n this.checked = x;\n });\n } else if (this.valueType == 'number') {\n this.formData.controls[this.controlName].valueChanges.subscribe((x) => {\n this.checked = x == 1;\n });\n } else {\n this.formData.controls[this.controlName].valueChanges.subscribe((x) => {\n this.checked = x == 'Y';\n });\n }\n } else {\n this.checked = val ? true : false;\n }\n }\n @Output() _ngModelChange = new EventEmitter();\n\n checked = false;\n\n ngOnInit(): void {\n if (this.controlName && this.formData?.controls[this.controlName]) {\n if (this.valueType === 'boolean') {\n this.checked = this.formData.controls[this.controlName].getRawValue();\n console.log(this.checked);\n } else if (this.valueType === 'number') {\n this.checked = this.formData.controls[this.controlName].getRawValue() === 1;\n } else {\n this.checked = this.formData.controls[this.controlName].getRawValue() === 'Y';\n }\n\n this.formData.controls[this.controlName].valueChanges.subscribe((x) => {\n if (this.valueType === 'boolean') {\n this.checked = x;\n } else if (this.valueType === 'number') {\n this.checked = x === 1;\n } else {\n this.checked = x === 'Y';\n }\n });\n }\n }\n\n onCheckChange(event: boolean) {\n if (this.controlName) {\n if (this.valueType == 'boolean') {\n this.formData.controls[this.controlName].setValue(event);\n } else if (this.valueType == 'number') {\n this.formData.controls[this.controlName].setValue(event ? 1 : 0);\n } else if (this.valueType == 'string') {\n this.formData.controls[this.controlName].setValue(event ? 'Y' : 'N');\n }\n } else {\n if (this.valueType == 'boolean') {\n this._ngModelChange.emit(event);\n } else if (this.valueType == 'number') {\n this._ngModelChange.emit(event ? 1 : 0);\n } else if (this.valueType == 'string') {\n this._ngModelChange.emit(event ? 'Y' : 'N');\n }\n }\n }\n}\n","@if (label) {\n <div nz-row>\n <div nz-col [nzSpan]=\"!labelFlex ? labelSpan : null\" [nzFlex]=\"labelFlex\"></div>\n <div nz-col nzFlex=\"auto\" [ngStyle]=\"{ 'padding-top': paddingTop }\">\n <label\n style=\"position: relative; top: 5px\"\n nz-checkbox\n [nzDisabled]=\"disabled\"\n [(nzChecked)]=\"checked\"\n (nzCheckedChange)=\"onCheckChange($event)\"\n >\n {{ label }}\n </label>\n </div>\n </div>\n} @else {\n <label\n nz-checkbox\n [nzDisabled]=\"disabled\"\n [(nzChecked)]=\"checked\"\n (nzCheckedChange)=\"onCheckChange($event)\"\n style=\"width: 16px\"\n >\n {{ label }}\n </label>\n}\n","export class DateTimeHelper {\n static lstDay = Array.from({ length: 31 }, (_, i) => i + 1);\n static lstMonth = Array.from({ length: 12 }, (_, i) => i + 1);\n\n private static fromYear = new Date().getFullYear() - 10;\n private static toYear = new Date().getFullYear();\n static lstYear = Array.from(\n { length: DateTimeHelper.toYear - DateTimeHelper.fromYear },\n (_, i) => DateTimeHelper.toYear - i,\n );\n\n /**\n * Lấy ngày giờ hiện tại dưới dạng chuỗi \"YYYY-MM-DD HH:mm:ss\"\n * @return {string}\n */\n static now(): string {\n const now = new Date();\n return `${now.getFullYear()}-${this.pad(now.getMonth() + 1)}-${this.pad(now.getDate())} ${this.pad(now.getHours())}:${this.pad(now.getMinutes())}:${this.pad(now.getSeconds())}`;\n }\n\n /**\n * Lấy ngày hôm nay dưới dạng chuỗi \"YYYY-MM-DD HH:mm:ss\"\n * @return {string}\n */\n static today(): string {\n const now = new Date();\n return `${now.getFullYear()}-${this.pad(now.getMonth() + 1)}-${this.pad(now.getDate())} 00:00:00`;\n }\n\n /**\n * Tạo ngày từ năm, tháng, ngày (có kiểm tra hợp lệ, không bị lệch múi giờ).\n * @param {number} year Năm\n * @param {number} month Tháng (1-12)\n * @param {number} day Ngày (1-31)\n * @param {boolean} isEndOfDay Nếu true, trả về 23:59:59, ngược lại 00:00:00\n * @return {string | null} Chuỗi ngày định dạng \"YYYY-MM-DD HH:mm:ss\" hoặc null nếu ngày không hợp lệ\n */\n static createDate(year: number, month: number, day: number, isEndOfDay: boolean = false): string | null {\n if (!this.isValidDate(year, month, day)) {\n return null;\n }\n\n const hour = isEndOfDay ? 23 : 0;\n const minute = isEndOfDay ? 59 : 0;\n const second = isEndOfDay ? 59 : 0;\n return `${year}-${this.pad(month)}-${this.pad(day)} ${this.pad(hour)}:${this.pad(minute)}:${this.pad(second)}`;\n }\n\n /**\n * Kiểm tra xem ngày có hợp lệ không.\n * @param {number} year Năm\n * @param {number} month Tháng (1-12)\n * @param {number} day Ngày (1-31)\n * @return {boolean} True nếu ngày hợp lệ, ngược lại False.\n */\n public static isValidDate(year: number, month: number, day: number): boolean {\n if (month < 1 || month > 12) return false;\n if (day < 1) return false;\n\n const lastDay = new Date(year, month, 0).getDate(); // Lấy ngày cuối tháng\n return day <= lastDay;\n }\n\n /**\n * Hàm hỗ trợ: Định dạng số thành 2 chữ số (01, 02, ..., 09)\n * @param {number} n The second number.\n * @return {string} The sum of the two numbers.\n */\n private static pad(n: number): string {\n return n.toString().padStart(2, '0');\n }\n\n public static parser(dateStr: string) {\n if (!dateStr) return '';\n\n dateStr = dateStr.trim();\n let timeStr = '00:00'; // Mặc định giờ/phút nếu người dùng không nhập\n let datePart = dateStr;\n\n // 1. Tách phần Giờ và phần Ngày nếu chuỗi có chứa khoảng trắng\n if (dateStr.includes(' ')) {\n const splitBySpace = dateStr.split(' ');\n\n // Tìm xem phần nào chứa ':' (giờ) và phần nào chứa '/' (ngày) hoặc số\n const hasTime = splitBySpace.find((s) => s.includes(':'));\n const hasDate = splitBySpace.find((s) => !s.includes(':'));\n\n if (hasTime) timeStr = hasTime;\n if (hasDate) datePart = hasDate;\n }\n\n // 2. Xử lý DatePart (Logic cũ của bạn)\n if (!datePart.includes('/')) {\n datePart = this.formatNumberToDate(datePart);\n }\n\n const parts = datePart.split('/');\n const current = new Date();\n let normalizedValue = '';\n\n if (parts.length === 1 && /^\\d{1,2}$/.test(parts[0])) {\n // Chỉ có ngày -> ghép tháng/năm hiện tại\n normalizedValue = `${parts[0].padStart(2, '0')}/${(current.getMonth() + 1).toString().padStart(2, '0')}/${current.getFullYear()}`;\n } else if (parts.length === 2 && /^\\d{1,2}$/.test(parts[0]) && /^\\d{1,2}$/.test(parts[1])) {\n // Có ngày + tháng -> ghép năm hiện tại\n normalizedValue = `${parts[0].padStart(2, '0')}/${parts[1].padStart(2, '0')}/${current.getFullYear()}`;\n } else {\n // Đã đủ 3 phần\n normalizedValue = datePart;\n }\n\n // 3. Xử lý TimePart & Parse thành Date\n if (normalizedValue) {\n const dateParts = normalizedValue.split('/');\n const day = +dateParts[0];\n const month = +dateParts[1];\n const year = +dateParts[2];\n\n let hours = 0;\n let minutes = 0;\n\n if (timeStr.includes(':')) {\n const timeParts = timeStr.split(':');\n hours = +timeParts[0] || 0;\n minutes = +timeParts[1] || 0;\n }\n\n // Giả định DateTimeHelper.isValidDate của bạn vẫn chỉ check valid ngày/tháng/năm\n if (DateTimeHelper.isValidDate(year, month, day)) {\n // Lưu ý: Nếu DateTimeHelper.createDate của bạn chưa hỗ trợ truyền hours/minutes,\n // bạn có thể trả về trực tiếp new Date() như sau:\n return new Date(year, month - 1, day, hours, minutes);\n\n // Hoặc nếu bạn nâng cấp hàm createDate:\n // return DateTimeHelper.createDate(year, month, day, hours, minutes);\n }\n }\n\n return '';\n }\n\n // dd/mm/yyyy\n private static formatNumberToDate(input: string): string {\n // Lấy tối đa 8 ký tự\n input = input.replace(/\\D/g, '').substring(0, 8);\n\n const day = input.substring(0, 2);\n const month = input.substring(2, 4);\n const year = input.substring(4, 8);\n\n let result = '';\n\n if (day) {\n result += day;\n if (month) result += '/';\n }\n\n if (month) {\n result += month;\n if (year) result += '/';\n }\n\n if (year) {\n result += year;\n }\n\n return result;\n }\n\n static firstDayOfMonth(date: Date = new Date()): Date {\n return new Date(date.getFullYear(), date.getMonth(), 1);\n }\n\n static lastDayOfMonth(date: Date = new Date()): Date {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0);\n }\n\n static firstDayOfNextMonth(date: Date = new Date()): Date {\n return new Date(date.getFullYear(), date.getMonth() + 1, 1);\n }\n\n static compare(date1?: any, date2?: any): boolean {\n if (!date1 || !date2) return false;\n\n if (typeof date1 === 'string') date1 = date1.replaceAll('-', '/');\n if (typeof date2 === 'string') date2 = date2.replaceAll('-', '/');\n\n const d1 = new Date(date1);\n const d2 = new Date(date2);\n\n if (isNaN(d1.getTime()) || isNaN(d2.getTime())) {\n return false;\n }\n\n return d1.getTime() === d2.getTime();\n }\n\n /**\n * date1 - date2\n * @param date1\n * @param date2\n * @param unit\n * @returns\n */\n static dateDiff(date1?: any, date2?: any, unit: 'day' | 'hour' | 'minute' | 'second' = 'day'): number {\n // 1. Kiểm tra tham số đầu vào\n if (!date1 || !date2) {\n return NaN;\n }\n\n const d1 = new Date(date1);\n const d2 = new Date(date2);\n\n if (isNaN(d1.getTime()) || isNaN(d2.getTime())) {\n throw new Error('Tham số ngày không hợp lệ (Invalid Date)');\n }\n\n // 2. Tính chênh lệch mili-giây mặc định (date1 - date2)\n let diffMs = d1.getTime() - d2.getTime();\n\n // 3. Xử lý chuẩn hóa riêng cho \"ngày\" để tránh sai lệch múi giờ\n if (unit === 'day') {\n const utc1 = Date.UTC(d1.getFullYear(), d1.getMonth(), d1.getDate());\n const utc2 = Date.UTC(d2.getFullYear(), d2.getMonth(), d2.getDate());\n diffMs = utc1 - utc2;\n }\n\n // 4. Các hằng số quy đổi từ mili-giây\n const MS_PER_SECOND = 1000;\n const MS_PER_MINUTE = MS_PER_SECOND * 60;\n const MS_PER_HOUR = MS_PER_MINUTE * 60;\n const MS_PER_DAY = MS_PER_HOUR * 24;\n\n // 5. Tính toán và trả về kết quả dựa trên unit\n // Sử dụng Math.trunc() thay vì Math.floor() để giữ đúng phần nguyên trong trường hợp kết quả âm\n switch (unit) {\n case 'day':\n return Math.trunc(diffMs / MS_PER_DAY);\n case 'hour':\n return Math.trunc(diffMs / MS_PER_HOUR);\n case 'minute':\n return Math.trunc(diffMs / MS_PER_MINUTE);\n case 'second':\n return Math.trunc(diffMs / MS_PER_SECOND);\n default:\n throw new Error(\"Đơn vị tính không hợp lệ. Vui lòng dùng 'day', 'hour', 'minute', hoặc 'second'.\");\n }\n }\n\n static lstDate(from: Date, to: Date) {\n if (!from || !to) {\n return [];\n }\n\n const lstNgay: Date[] = [];\n\n const startDate = new Date(from);\n const endDate = new Date(to);\n\n startDate.setHours(0, 0, 0, 0);\n endDate.setHours(0, 0, 0, 0);\n\n const currentDate = new Date(startDate);\n\n while (currentDate <= endDate) {\n lstNgay.push(new Date(currentDate));\n currentDate.setDate(currentDate.getDate() + 1);\n }\n\n return lstNgay;\n }\n}\n","import { Directive, HostListener, Input, AfterViewInit, OnDestroy, ElementRef, Optional, Self } from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { parse, isValid } from 'date-fns';\nimport { DateTimeHelper } from '../helper/date.helper';\n\n/**\n * Dùng cho nz-date-picker\n */\n@Directive({\n selector: 'nz-date-picker',\n})\nexport class DateInputParserDirective implements AfterViewInit, OnDestroy {\n @Input('nzFormat') format = 'dd/MM/yyyy';\n\n private inputElement: HTMLInputElement | null = null;\n private blurHandler = this.tryParseAndSet.bind(this);\n\n constructor(\n private el: ElementRef<HTMLElement>,\n @Optional() @Self() private ngControl: NgControl,\n ) {}\n\n ngAfterViewInit() {\n this.inputElement = this.el.nativeElement.querySelector('input');\n if (this.inputElement) {\n this.inputElement.addEventListener('blur', this.blurHandler);\n }\n }\n\n ngOnDestroy() {\n if (this.inputElement) {\n this.inputElement.removeEventListener('blur', this.blurHandler);\n }\n }\n\n @HostListener('keyup.enter')\n onEnter() {\n this.tryParseAndSet();\n this.inputElement?.blur();\n }\n\n private tryParseAndSet() {\n if (!this.inputElement) return;\n\n const rawValue = this.inputElement.value.trim();\n if (!rawValue) return;\n\n // 1. Cố gắng parse bằng date-fns với format truyền vào (ví dụ: 'HH:mm dd/MM/yyyy')\n const parsedDate = parse(rawValue, this.format, new Date());\n\n if (isValid(parsedDate)) {\n // Nếu parse thành công theo format -> set value\n this.ngControl?.control?.setValue(parsedDate);\n } else {\n // 2. (Tùy chọn) Fallback lại hàm parser cũ nếu người dùng nhập sai format\n // nhưng helper của bạn có khả năng \"đoán\" được\n const fallbackParsed = DateTimeHelper.parser(rawValue);\n if (fallbackParsed) {\n this.ngControl?.control?.setValue(fallbackParsed);\n }\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { NzDatePickerModule } from 'ng-zorro-antd/date-picker';\nimport { NzFormModule } from 'ng-zorro-antd/form';\nimport { NzSelectModeType, NzSelectSizeType } from 'ng-zorro-antd/select';\nimport { DateInputParserDirective } from '../../directive/date-input-parser.directive';\n\n@Component({\n selector: 'extend-date-picker',\n templateUrl: './extend-date-picker.html',\n styleUrl: './extend-date-picker.scss',\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NzFormModule,\n NzDatePickerModule,\n TranslateModule,\n DateInputParserDirective,\n ],\n})\nexport class ExtendDatePicker {\n @Input() dateFormat = 'dd/MM/yyyy';\n @Input() label = '';\n @Input() placeHolder = '';\n @Input() labelAlign: 'left' | 'right' = 'left';\n @Input() floatingLabel = true;\n @Input() showTime = false;\n\n /**\n * default = 8\n */\n @Input() labelSpan = 8;\n @Input() labelFlex: string | number | null = null;\n @Input() inputFlex: string | number | null = null;\n\n @Input() disabled = false;\n @Input() required = false;\n @Input() isSubmited = false;\n @Input() noBottom = false;\n @Input() selectModeType: NzSelectModeType = 'default';\n\n @Input() inputWidth = '';\n @Input() inputHeight = '';\n @Input() borderBottomOnly = false;\n @Input() displayInline = false;\n @Input() size: NzSelectSizeType = 'default';\n @Input() minDate?: Date;\n @Input() maxDate?: Date;\n\n @Input() lstItem: any[] = [];\n @Input() displayField: string = '';\n @Input() valueField: string = '';\n\n @Input() formData!: FormGroup;\n @Input() controlName!: string;\n\n @Input() _ngModel: any = null;\n @Output() _ngModelChange = new EventEmitter();\n\n onChange = (_: any) => {};\n onTouched = () => {};\n\n writeValue(obj: any): void {\n this._ngModel = obj;\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 this.disabled = isDisabled;\n }\n\n ngOnInit(): void {}\n\n onNgModelChange(val: any) {\n this._ngModel = val;\n this.onChange(val); // Gửi ngược ra form\n this.onTouched();\n this._ngModelChange.emit(val);\n }\n\n disabledDate = (current: Date): boolean => {\n if (!current) return false;\n\n const min = this.minDate ? new Date(this.minDate) : null;\n const max = this.maxDate ? new Date(this.maxDate) : null;\n\n if (min && current < new Date(min.setHours(0, 0, 0, 0))) return true;\n if (max && current > new Date(max.setHours(23, 59, 59, 999))) return true;\n\n return false;\n };\n\n get errorMessage(): string {\n const value = this._ngModel ? new Date(this._ngModel) : null;\n\n if (!this.isTouched && !value) {\n return '';\n }\n\n if (this.required && !value) {\n return 'Trường yêu cầu nhập';\n }\n\n if (this.minDate && value && new Date(value) < new Date(this.minDate)) {\n return `Ngày không được nhỏ hơn ${this.formatDate(this.minDate)}`;\n }\n\n if (this.maxDate && value && new Date(value) > new Date(this.maxDate)) {\n return `Ngày không được lớn hơn ${this.formatDate(this.maxDate)}`;\n }\n\n if (this.isTouched && this.inputErrorMessage) {\n return this.inputErrorMessage;\n }\n\n return '';\n }\n\n private formatDate(date: Date): string {\n const d = new Date(date);\n const day = String(d.getDate()).padStart(2, '0');\n const month = String(d.getMonth() + 1).padStart(2, '0');\n const year = d.getFullYear();\n\n switch (this.dateFormat) {\n case 'dd/MM/yyyy':\n return `${day}/${month}/${year}`;\n case 'MM/dd/yyyy':\n return `${month}/${day}/${year}`;\n default:\n return d.toLocaleDateString();\n }\n }\n\n onBlur() {\n this.isTouched = true;\n }\n\n @Input() isTouched: boolean = false;\n @Input() inputErrorMessage: string = '';\n\n @Input() errorMessages: { [key: string]: string } = {\n required: 'Trường yêu cầu nhập',\n invalidDate: 'Ngày không hợp lệ',\n };\n\n // Gom chung logic kiểm tra lỗi vào customValidateStatus\n get customValidateStatus(): string {\n // 1. Không hiển thị lỗi nếu chưa thao tác (blur) và form chưa được submit\n if (!this.isTouched && !this.isSubmited) {\n return '';\n }\n\n // 2. Ưu tiên lỗi truyền trực tiếp từ bên ngoài vào\n if (this.inputErrorMessage) {\n return this.inputErrorMessage;\n }\n\n // 3. Kiểm tra rỗng -> Map lỗi 'required'\n const isEmpty =\n this._ngModel === null ||\n this._ngModel === undefined ||\n this._ngModel === '' ||\n (Array.isArray(this._ngModel) && this._ngModel.length === 0);\n\n if (isEmpty) {\n return this.required ? this.errorMessages['required'] || 'Trường yêu cầu nhập' : '';\n }\n\n // 4. Kiểm tra ngày không hợp lệ (Invalid Date) -> Map lỗi 'invalidDate'\n let isInvalidDate = false;\n if (Array.isArray(this._ngModel)) {\n // Trường hợp Range Picker (Mảng)\n isInvalidDate = this._ngModel.some((date) => !date || isNaN(new Date(date).getTime()));\n } else {\n // Trường hợp Date Picker thường\n isInvalidDate = isNaN(new Date(this._ngModel).getTime());\n }\n\n if (isInvalidDate) {\n return this.errorMessages['invalidDate'] || 'Ngày không hợp lệ';\n }\n\n // 5. Kiểm tra Min Date / Max Date\n if (!Array.isArray(this._ngModel)) {\n const value = new Date(this._ngModel);\n\n if (this.minDate && value < new Date(new Date(this.minDate).setHours(0, 0, 0, 0))) {\n // Tận dụng errorMessages nếu bạn muốn truyền từ ngoài, nếu không dùng default\n return this.errorMessages['minDate'] || `Ngày không được nhỏ hơn ${this.formatDate(this.minDate)}`;\n }\n\n if (this.maxDate && value > new Date(new Date(this.maxDate).setHours(23, 59, 59, 999))) {\n // Tận dụng errorMessages nếu bạn muốn truyền từ ngoài, nếu không dùng default\n return this.errorMessages['maxDate'] || `Ngày không được lớn hơn ${this.formatDate(this.maxDate)}`;\n }\n }\n\n // Nếu vượt qua mọi cửa kiểm tra thì hợp lệ\n return '';\n }\n}\n","<div\n class=\"extend-date-picker-wrapper\"\n [ngClass]=\"[floatingLabel && label ? 'floating-label' : '']\"\n [ngStyle]=\"{ display: displayInline ? 'inline' : null }\"\n>\n @if (controlName) {\n <div [formGroup]=\"formData\">\n <nz-form-item>\n @if (label) {\n <nz-form-label\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\n [nzFlex]=\"labelFlex\"\n [nzLabelAlign]=\"labelAlign\"\n [nzRequired]=\"required\"\n [nzFor]=\"controlName\"\n nzNoColon\n nzLabelWrap\n >\n {{ label }}\n </nz-form-label>\n }\n <nz-form-control\n [nzSpan]=\"label ? (floatingLabel || labelFlex ? null : 24 - labelSpan) : null\"\n [nzFlex]=\"inputFlex\"\n [ngClass]=\"{ 'full-width': floatingLabel || !label }\"\n [nzErrorTip]=\"customValidateStatus\"\n [nzValidateStatus]=\"customValidateStatus ? 'error' : ''\"\n >\n <nz-date-picker\n class=\"full-width\"\n [nzPlaceHolder]=\"placeHolder || ' '\"\n [nzFormat]=\"dateFormat\"\n [nzSize]=\"size\"\n [formControlName]=\"controlName\"\n [nzDisabledDate]=\"disabledDate\"\n [nzShowTime]=\"showTime\"\n [ngStyle]=\"{\n width: inputWidth,\n height: inputHeight,\n }\"\n [ngClass]=\"{\n 'border-bottom-only': borderBottomOnly,\n }\"\n ></nz-date-picker>\n </nz-form-control>\n </nz-form-item>\n </div>\n } @else {\n <nz-form-item>\n @if (label) {\n <nz-form-label\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\n [nzFlex]=\"labelFlex\"\n [nzLabelAlign]=\"labelAlign\"\n [nzRequired]=\"required\"\n nzNoColon\n nzLabelWrap\n >\n {{ label }}\n </nz-form-label>\n }\n <nz-form-control\n [nzSpan]=\"label ? (floatingLabel || labelFlex ? null : 24 - labelSpan) : null\"\n [nzFlex]=\"inputFlex\"\n [ngClass]=\"{ 'full-width': floatingLabel || !label }\"\n [nzErrorTip]=\"customValidateStatus\"\n [nzValidateStatus]=\"customValidateStatus ? 'error' : ''\"\n >\n <nz-date-picker\n class=\"full-width\"\n [nzPlaceHolder]=\"placeHolder || ' '\"\n [nzFormat]=\"dateFormat\"\n [nzSize]=\"size\"\n [disabled]=\"disabled\"\n [nzDisabledDate]=\"disabledDate\"\n [nzShowTime]=\"showTime\"\n [ngStyle]=\"{\n width: inputWidth,\n height: inputHeight,\n }\"\n [ngClass]=\"{\n 'border-bottom-only': borderBottomOnly,\n }\"\n [(ngModel)]=\"_ngModel\"\n (ngModelChange)=\"onNgModelChange($event)\"\n (blur)=\"onBlur()\"\n ></nz-date-picker>\n </nz-form-control>\n </nz-form-item>\n }\n</div>\n\n<ng-template #dynamicErrorTemplate let-control>\n <ng-container *ngFor=\"let error of errorMessages | keyvalue\">\n <ng-container *ngIf=\"control.hasError(error.key)\">\n {{ error.value }}\n </ng-container>\n </ng-container>\n</ng-template>\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { NzDatePickerModule } from 'ng-zorro-antd/date-picker';\nimport { NzFormModule } from 'ng-zorro-antd/form';\nimport { NzSelectModeType, NzSelectSizeType } from 'ng-zorro-antd/select';\nimport { endOfMonth, endOfWeek, startOfMonth, startOfWeek, subMonths, subWeeks } from 'date-fns';\n\n@Component({\n selector: 'extend-date-range-picker',\n templateUrl: './extend-date-range-picker.html',\n imports: [CommonModule, FormsModule, ReactiveFormsModule, NzFormModule, NzDatePickerModule, TranslateModule],\n})\nexport class ExtendDateRangePicker implements OnInit {\n @Input() dateFormat = 'dd/MM/yyyy';\n @Input() layOutType: 'horizontal' | 'vertical' = 'horizontal';\n @Input() label = '';\n @Input() placeHolder = '';\n @Input() labelAlign: 'left' | 'right' = 'left';\n\n /**\n * default = 8\n */\n @Input() labelSpan = 8;\n @Input() labelFlex: string | number | null = null;\n\n @Input() disabled = false;\n @Input() required = false;\n @Input() noBottom = false;\n @Input() selectModeType: NzSelectModeType = 'default';\n\n @Input() inputWidth = '';\n @Input() inputHeight = '';\n @Input() borderBottomOnly = false;\n @Input() displayInline = false;\n @Input() size: NzSelectSizeType = 'default';\n\n @Input() lstItem: any[] = [];\n @Input() displayField: string = '';\n @Input() valueField: string = '';\n\n @Input() formData!: FormGroup;\n @Input() controlName!: string;\n\n @Input() date1: Date | null = null;\n @Output() date1Change = new EventEmitter();\n\n @Input() date2: Date | null = null;\n @Output() date2Change = new EventEmitter();\n\n _ngModel: Date[] | undefined;\n\n today = new Date();\n\n ranges = {\n 'Tuần này': [startOfWeek(this.today, { weekStartsOn: 1 }), endOfWeek(this.today, { weekStartsOn: 1 })],\n 'Tuần trước': [\n startOfWeek(subWeeks(this.today, 1), { weekStartsOn: 1 }),\n endOfWeek(subWeeks(this.today, 1), { weekStartsOn: 1 }),\n ],\n 'Tháng này': [startOfMonth(this.today), endOfMonth(this.today)],\n 'Tháng trước': [startOfMonth(subMonths(this.today, 1)), endOfMonth(subMonths(this.today, 1))],\n };\n\n ngOnInit(): void {\n this._ngModel = this.date1 && this.date2 ? [this.date1, this.date2] : undefined;\n }\n\n ngModelChange(value: Date[] | undefined) {\n this._ngModel = value;\n\n if (value && value.length === 2) {\n this.date1 = value[0];\n this.date2 = value[1];\n } else {\n this.date1 = null;\n this.date2 = null;\n }\n\n this.date1Change.emit(this.date1);\n this.date2Change.emit(this.date2);\n }\n}\n","<div class=\"extend-wrapper\" [ngStyle]=\"{ display: displayInline ? 'inline' : null }\">\n @if (controlName) {\n <!-- <div [formGroup]=\"formData\">\n <nz-form-item>\n <nz-form-label\n [nzSpan]=\"layOutType == 'horizontal' ? labelSpan : null\"\n [nzLabelAlign]=\"labelAlign\"\n [nzRequired]=\"required\"\n [nzFor]=\"controlName\"\n nzNoColon\n nzLabelWrap\n >\n {{ label }}\n </nz-form-label>\n <nz-form-control\n [nzSpan]=\"layOutType == 'horizontal' ? inputSpan : null\"\n [ngClass]=\"{ 'full-width': layOutType == 'vertical' }\"\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\n >\n <nz-date-picker\n class=\"full-width\"\n [nzPlaceHolder]=\"placeHolder || ' '\"\n [nzFormat]=\"dateFormat\"\n [nzSize]=\"size\"\n [formControlName]=\"controlName\"\n [ngStyle]=\"{\n width: inputWidth,\n height: inputHeight,\n }\"\n [ngClass]=\"{\n 'border-bottom-only': borderBottomOnly,\n }\"\n ></nz-date-picker>\n </nz-form-control>\n </nz-form-item>\n </div> -->\n } @else {\n @if (label) {\n <nz-form-item>\n <nz-form-label\n [nzSpan]=\"layOutType == 'horizontal' && !labelFlex ? labelSpan : null\"\n [nzFlex]=\"labelFlex\"\n [nzLabelAlign]=\"labelAlign\"\n [nzRequired]=\"required\"\n [nzFor]=\"controlName\"\n nzNoColon\n nzLabelWrap\n >\n {{ label }}\n </nz-form-label>\n <nz-range-picker\n [nzSize]=\"size\"\n [nzFormat]=\"dateFormat\"\n [nzPlaceHolder]=\"['Từ ngày', 'đến ngày']\"\n [nzRanges]=\"ranges\"\n [ngModel]=\"_ngModel\"\n (ngModelChange)=\"ngModelChange($event)\"\n ></nz-range-picker>\n </nz-form-item>\n } @else {\n <nz-range-picker\n [nzSize]=\"size\"\n [nzFormat]=\"dateFormat\"\n [nzPlaceHolder]=\"['Từ ngày', 'đến ngày']\"\n [ngModel]=\"_ngModel\"\n (ngModelChange)=\"ngModelChange($event)\"\n ></nz-range-picker>\n }\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';\nimport { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { NzDatePickerModule } from 'ng-zorro-antd/date-picker';\nimport { NzFormModule } from 'ng-zorro-antd/form';\nimport { NzInputModule } from 'ng-zorro-antd/input';\nimport { NzInputNumberComponent, NzInputNumberModule } from 'ng-zorro-antd/input-number';\nimport { NzSelectModeType, NzSelectSizeType } from 'ng-zorro-antd/select';\n\n@Component({\n selector: 'extend-input-number',\n templateUrl: './extend-input-number.html',\n styleUrl: './extend-input-number.scss',\n imports: [CommonModule, FormsModule, ReactiveFormsModule, TranslateModule, NzFormModule, NzInputNumberModule],\n})\nexport class ExtendInputNumber {\n @Input() label = '';\n @Input() placeHolder: 'off' | '' = '';\n @Input() labelAlign: 'left' | 'right' = 'left';\n @Input() floatingLabel = true;\n @Input() hiddenUpDown = false;\n\n /**\n * default = 8\n */\n @Input() labelSpan = 8;\n @Input() labelFlex: string | number | null = null;\n @Input() inputFlex: string | number | null = null;\n\n @Input() disabled = false;\n @Input() required = false;\n @Input() noBottom = false;\n @Input() size: NzSelectSizeType = 'default';\n\n @Input() min: number | null = null;\n @Input() max: number | null = null;\n @Input() precision: number = 0;\n\n @Input() inputWidth = '';\n @Input() inputHeight = '';\n @Input() borderBottomOnly = false;\n @Input() displayInline = false;\n\n @Input() isSubmited = false;\n\n /** separatorType: 'comma' (,) | 'dot' (.) */\n @Input() separatorType?: 'comma' | 'dot' | 'blank';\n /** defaultSeparatorType: 'comma' (,) | 'dot' (.) */\n static defaultSeparatorType: 'comma' | 'dot' = 'dot';\n\n @Input() formData!: FormGroup;\n @Input() controlName!: string;\n\n @Input() _ngModel: any = null;\n @Output() _ngModelChange = new EventEmitter();\n\n @ViewChild('inputnumber') inputnumber!: NzInputNumberComponent;\n\n ngOnInit(): void {}\n\n _onNgModelChange() {\n this._ngModelChange.emit(this._ngModel);\n }\n\n @ViewChild('inputElement') inputElement!: ElementRef;\n\n focus(): void {\n this.inputElement?.nativeElement?.focus();\n }\n\n formatterNumber = (value: number): string => {\n if (value == null || isNaN(value)) return '';\n\n if (!this.getSeparatorType()) {\n return value.toString();\n }\n const parts = `${value}`.split('.');\n const integerPart = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, this.getSeparatorType() === 'comma' ? ',' : '.');\n return parts.length > 1\n ? `${integerPart}${this.getSeparatorType() === 'comma' ? '.' : ','}${parts[1]}`\n : integerPart;\n };\n\n parserNumber = (value: string): number => {\n if (!value) return 0;\n\n if (!this.getSeparatorType()) {\n return parseFloat(value);\n }\n\n // Bỏ ký tự phân cách hàng nghìn\n const cleaned = value\n .replace(new RegExp(`\\\\${this.getSeparatorType() === 'comma' ? ',' : '.'}`, 'g'), '')\n .replace(this.getSeparatorType() === 'comma' ? '.' : ',', '.');\n\n // Kiểm tra toàn bộ chuỗi có phải là số hợp lệ hay không\n if (!/^-?\\d+(\\.\\d+)?$/.test(cleaned)) return NaN;\n\n const parsed = parseFloat(cleaned);\n\n // Ép chạy formatter lại\n setTimeout(() => {\n this.inputnumber.writeValue(parsed);\n this._ngModelChange.emit(parsed);\n if (this.formData && this.controlName) {\n this.formData.controls[this.controlName].setValue(parsed);\n }\n });\n\n return parsed;\n };\n\n getSeparatorType() {\n if (this.separatorType == 'blank') {\n return '';\n }\n if (this.separatorType) {\n return this.separatorType;\n }\n return ExtendInputNumber.defaultSeparatorType;\n }\n\n get isInvalidNgModel(): boolean {\n if (!this.required) return false;\n\n // Kiểm tra rỗng cho cả trường hợp chuỗi, null, undefined và mảng (multiple)\n const isEmpty =\n this._ngModel === null ||\n this._ngModel === undefined ||\n this._ngModel === '' ||\n (Array.isArray(this._ngModel) && this._ngModel.length === 0);\n\n return isEmpty;\n }\n\n get customValidateStatus(): string {\n // Sẽ báo đỏ nếu field trống VÀ (component cha đã ấn submit)\n if (this.isInvalidNgModel && this.isSubmited) {\n return 'error';\n }\n return '';\n }\n}\n","<div\n class=\"extend-input-number-wrapper\"\n [ngClass]=\"[floatingLabel && label ? 'floating-label' : '', hiddenUpDown ? 'hidden-up-down' : '']\"\n [ngStyle]=\"{ display: displayInline ? 'inline' : null }\"\n>\n @if (controlName) {\n <div [formGroup]=\"formData\">\n <nz-form-item>\n <nz-form-label\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\n [nzFlex]=\"labelFlex\"\n [nzLabelAlign]=\"labelAlign\"\n [nzRequired]=\"required\"\n [nzFor]=\"controlName\"\n nzNoColon\n nzLabelWrap\n >\n {{ label }}\n </nz-form-label>\n <nz-form-control\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\n [nzFlex]=\"inputFlex\"\n [ngClass]=\"{ 'full-width': floatingLabel }\"\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\n >\n <nz-input-number\n #inputnumber\n class=\"full-width\"\n [nzSize]=\"size\"\n [nzPlaceHolder]=\"placeHolder\"\n [nzFormatter]=\"formatterNumber\"\n [nzParser]=\"parserNumber\"\n [nzPrecision]=\"precision\"\n [formControlName]=\"controlName\"\n />\n </nz-form-control>\n </nz-form-item>\n </div>\n } @else {\n @if (label) {\n <nz-form-item>\n <nz-form-label\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\n [nzFlex]=\"labelFlex\"\n [nzLabelAlign]=\"labelAlign\"\n [nzRequired]=\"required\"\n [nzFor]=\"controlName\"\n nzNoColon\n nzLabelWrap\n >\n {{ label }}\n </nz-form-label>\n <nz-form-control\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\n [nzFlex]=\"inputFlex\"\n [ngClass]=\"{ 'full-width': floatingLabel }\"\n [nzValidateStatus]=\"customValidateStatus\"\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\n >\n @if (min != null && max != null) {\n <nz-input-number\n #inputnumber\n class=\"full-width\"\n [nzSize]=\"size\"\n [nzMin]=\"min\"\n [nzMax]=\"max\"\n [nzPlaceHolder]=\"placeHolder\"\n [nzFormatter]=\"formatterNumber\"\n [nzParser]=\"parserNumber\"\n [nzPrecision]=\"precision\"\n [nzDisabled]=\"disabled\"\n [ngModel]=\"_ngModel\"\n (ngModelChange)=\"_onNgModelChange()\"\n />\n } @else if (min != null) {\n <nz-input-number\n #inputnumber\n class=\"full-width\"\n [nzSize]=\"size\"\n [nzMin]=\"min\"\n [nzPlaceHolder]=\"placeHolder\"\n [nzFormatter]=\"formatterNumber\"\n [nzParser]=\"parserNumber\"\n [nzPrecision]=\"precision\"\n [nzDisabled]=\"disabled\"\n [ngModel]=\"_ngModel\"\n (ngModelChange)=\"_onNgModelChange()\"\n />\n } @else if (max != null) {\n <nz-input-number\n #inputnumber\n class=\"full-width\"\n [nzSize]=\"size\"\n [nzMax]=\"max\"\n [nzPlaceHolder]=\"placeHolder\"\n [nzFormatter]=\"formatterNumber\"\n [nzParser]=\"parserNumber\"\n [nzPrecision]=\"precision\"\n [nzDisabled]=\"disabled\"\n [ngModel]=\"_ngModel\"\n (ngModelChange)=\"_onNgModelChange()\"\n />\n } @else {\n <nz-input-number\n #inputnumber\n class=\"full-width\"\n [nzSize]=\"size\"\n [nzPlaceHolder]=\"placeHolder\"\n [nzFormatter]=\"formatterNumber\"\n [nzParser]=\"parserNumber\"\n [nzPrecision]=\"precision\"\n [nzDisabled]=\"disabled\"\n [ngModel]=\"_ngModel\"\n (ngModelChange)=\"_onNgModelChange()\"\n />\n }\n </nz-form-control>\n </nz-form-item>\n } @else {\n @if (min != null && max != null) {\n <nz-input-number\n #inputnumber\n class=\"full-width\"\n [nzSize]=\"size\"\n [nzMin]=\"min\"\n [nzMax]=\"max\"\n [nzPlaceHolder]=\"placeHolder\"\n [nzFormatter]=\"formatterNumber\"\n [nzParser]=\"parserNumber\"\n [nzPrecision]=\"precision\"\n [nzDisabled]=\"disabled\"\n [ngModel]=\"_ngModel\"\n (ngModelChange)=\"_onNgModelChange()\"\n />\n } @else if (min != null) {\n <nz-input-number\n #inputnumber\n class=\"full-width\"\n [nzSize]=\"size\"\n [nzMin]=\"min\"\n [nzPlaceHolder]=\"placeHolder\"\n [nzFormatter]=\"formatterNumber\"\n [nzParser]=\"parserNumber\"\n [nzPrecision]=\"precision\"\n [nzDisabled]=\"disabled\"\n [ngModel]=\"_ngModel\"\n (ngModelChange)=\"_onNgModelChange()\"\n />\n } @else if (max != null) {\n <nz-input-number\n #inputnumber\n class=\"full-width\"\n [nzSize]=\"size\"\n [nzMax]=\"max\"\n [nzPlaceHolder]=\"placeHolder\"\n [nzFormatter]=\"formatterNumber\"\n [nzParser]=\"parserNumber\"\n [nzPrecision]=\"precision\"\n [nzDisabled]=\"disabled\"\n [ngModel]=\"_ngModel\"\n (ngModelChange)=\"_onNgModelChange()\"\n />\n } @else {\n <nz-input-number\n #inputnumber\n class=\"full-width\"\n [nzSize]=\"size\"\n [nzPlaceHolder]=\"placeHolder\"\n [nzFormatter]=\"formatterNumber\"\n [nzParser]=\"parserNumber\"\n [nzPrecision]=\"precision\"\n [nzDisabled]=\"disabled\"\n [ngModel]=\"_ngModel\"\n (ngModelChange)=\"_onNgModelChange()\"\n [ngStyle]=\"{\n width: inputWidth,\n height: inputHeight,\n border: borderBottomOnly ? 'none' : '',\n 'border-bottom': borderBottomOnly ? '1px dashed' : '',\n }\"\n />\n }\n }\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { NzFormModule } from 'ng-zorro-antd/form';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\nimport { NzInputModule } from 'ng-zorro-antd/input';\nimport { NzSelectModeType, NzSelectSizeType } from 'ng-zorro-antd/select';\n\n@Component({\n selector: 'extend-input',\n templateUrl: './extend-input.html',\n styleUrl: './extend-input.scss',\n imports: [CommonModule, FormsModule, ReactiveFormsModule, TranslateModule, NzFormModule, NzInputModule, NzIconModule],\n})\nexport class ExtendInput implements AfterViewInit, OnChanges {\n @Input() label = '';\n @Input() floatingLabel = true;\n @Input() placeHolder = '';\n @Input() labelAlign: 'left' | 'right' = 'left';\n @Input() inputClass = '';\n\n /**\n * default = 8\n */\n @Input() labelSpan = 8;\n @Input() labelFlex: string | number | null = null;\n @Input() inputFlex: string | number | null = null;\n\n @Input() allowClear = false;\n @Input()\n get disabled() {\n return this._disabled;\n }\n set disabled(val: boolean) {\n this._disabled = val;\n\n if (this.formData && this.controlName) {\n const control = this.formData.controls[this.controlName];\n\n if (this._disabled) {\n control.disable({ emitEvent: false });\n } else {\n control.enable({ emitEvent: false }); // <-- bỏ disable\n }\n }\n }\n @Input() readOnly = false;\n @Input() required = false;\n @Input() noBottom = false;\n @Input() selectModeType: NzSelectModeType = 'default';\n @Input() autocomplete: 'off' | '' = '';\n @Input() autofocus = false;\n\n @Input() inputWidth = '';\n @Input() inputHeight = '';\n @Input() borderBottomOnly = false;\n @Input() displayInline = false;\n @Input() size: NzSelectSizeType = 'default';\n\n @Input() lstItem: any[] = [];\n\n /**\n * Dùng trong word page\n */\n @Input() displayField: string = '';\n @Input() valueField: string = '';\n\n @Input() formData!: FormGroup;\n @Input() controlName!: string;\n\n @Input() _ngModel: any = null;\n @Output() _ngModelChange = new EventEmitter();\n\n @Output() onclickClearIcon = new EventEmitter();\n\n @Output() onenter = new EventEmitter();\n\n @ViewChild('inputElement') inputElement!: ElementRef<HTMLInputElement>;\n\n @Input() isSubmited = false;\n\n private _disabled = false;\n\n ngAfterViewInit(): void {\n this.tryFocus();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['autofocus']?.currentValue === true) {\n // chờ DOM render xong (tránh lỗi khi *ngIf)\n setTimeout(() => this.tryFocus());\n }\n }\n\n private tryFocus(): void {\n if (this.autofocus && this.inputElement?.nativeElement) {\n this.inputElement.nativeElement.focus();\n }\n }\n\n _onNgModelChange() {\n this._ngModelChange.emit(this._ngModel);\n }\n\n focus(): void {\n this.inputElement?.nativeElement?.select();\n }\n\n get isInvalidNgModel(): boolean {\n if (!this.required) return false;\n\n // Kiểm tra rỗng cho cả trường hợp chuỗi, null, undefined và mảng (multiple)\n const isEmpty =\n this._ngModel === null ||\n this._ngModel === undefined ||\n this._ngModel === '' ||\n (Array.isArray(this._ngModel) && this._ngModel.length === 0);\n\n return isEmpty;\n }\n\n get customValidateStatus(): string {\n // Sẽ báo đỏ nếu field trống VÀ (component cha đã ấn submit)\n if (this.isInvalidNgModel && this.isSubmited) {\n return 'error';\n }\n return '';\n }\n}\n","<div\n class=\"extend-input-wrapper\"\n [ngClass]=\"[floatingLabel && label ? 'floating-label' : '']\"\n [ngStyle]=\"{ display: displayInline ? 'inline' : null }\"\n>\n @if (controlName) {\n <div [formGroup]=\"formData\">\n <nz-form-item>\n <nz-form-label\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\n [nzFlex]=\"labelFlex\"\n [nzLabelAlign]=\"labelAlign\"\n [nzRequired]=\"required\"\n [nzFor]=\"controlName\"\n nzNoColon\n nzLabelWrap\n >\n {{ label }}\n </nz-form-label>\n <nz-form-control\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\n [nzFlex]=\"inputFlex\"\n [ngClass]=\"{ 'full-width': floatingLabel }\"\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\n >\n <input\n #inputElement\n nz-input\n [nzSize]=\"size\"\n [id]=\"controlName\"\n [name]=\"controlName\"\n [formControlName]=\"controlName\"\n [autocomplete]=\"autocomplete\"\n [placeholder]=\"placeHolder\"\n [ngClass]=\"inputClass\"\n (keyup.enter)=\"onenter.emit()\"\n />\n </nz-form-control>\n </nz-form-item>\n </div>\n } @else {\n @if (label) {\n <nz-form-item>\n <nz-form-label\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\n [nzFlex]=\"labelFlex\"\n [nzLabelAlign]=\"labelAlign\"\n [nzRequired]=\"required\"\n [nzFor]=\"controlName\"\n nzNoColon\n nzLabelWrap\n >\n {{ label }}\n </nz-form-label>\n <nz-form-control\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\n [nzFlex]=\"inputFlex\"\n [ngClass]=\"{ 'full-width': floatingLabel }\"\n [nzValidateStatus]=\"customValidateStatus\"\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\n >\n <nz-input-group [nzSize]=\"size\" [nzSuffix]=\"allowClear ? clearIcon : undefined\">\n <input\n #inputElement\n nz-input\n [nzSize]=\"size\"\n [id]=\"controlName\"\n [name]=\"controlName\"\n [(ngModel)]=\"_ngModel\"\n [autocomplete]=\"autocomplete\"\n (ngModelChange)=\"_onNgModelChange()\"\n [disabled]=\"disabled\"\n [readOnly]=\"readOnly\"\n [placeholder]=\"placeHolder\"\n [ngClass]=\"inputClass\"\n (keyup.enter)=\"onenter.emit()\"\n />\n </nz-input-group>\n </nz-form-control>\n </nz-form-item>\n } @else {\n <input\n #inputElement\n nz-input\n [nzSize]=\"size\"\n [ngStyle]=\"{\n width: inputWidth,\n height: inputHeight,\n }\"\n [id]=\"controlName\"\n [name]=\"controlName\"\n [(ngModel)]=\"_ngModel\"\n (ngModelChange)=\"_onNgModelChange()\"\n [autocomplete]=\"autocomplete\"\n [disabled]=\"disabled\"\n [readOnly]=\"readOnly\"\n [placeholder]=\"placeHolder\"\n [ngClass]=\"inputClass + ' ' + (borderBottomOnly ? 'border-bottom-only' : '')\"\n (keyup.enter)=\"onenter.emit()\"\n />\n }\n }\n</div>\n\n<ng-template #clearIcon>\n <i\n nz-icon\n nzType=\"close-circle\"\n nzTheme=\"twotone\"\n nzTwotoneColor=\"#999\"\n *ngIf=\"_ngModel\"\n (click)=\"_ngModel = null; _onNgModelChange(); onclickClearIcon.emit()\"\n style=\"cursor: pointer\"\n ></i>\n</ng-template>\n","import { Component, EventEmitter, HostBinding, Input, Output } from '@angular/core';\nimport { NzSelectModule, NzSelectSizeType } from 'ng-zorro-antd/select';\nimport { FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { NzFormModule } from 'ng-zorro-antd/form';\n\n@Component({\n selector: 'extend-select',\n templateUrl: './extend-select.html',\n styleUrl: './extend-select.scss',\n imports: [CommonModule, FormsModule, ReactiveFormsModule, TranslateModule, NzFormModule, NzSelectModule],\n})\nexport class ExtendSelectComponent {\n @Input() label = '';\n @Input() floatingLabel = true;\n @Input() placeHolder = '';\n @Input() labelAlign: 'left' | 'right' = 'left';\n @Input() dropdownMatchSelectWidth = true;\n\n /**\n * default = 8\n */\n @Input() labelSpan = 8;\n @Input() labelFlex: string | number | null = null;\n\n @Input()\n get disabled() {\n return this._disabled;\n }\n set disabled(val: boolean) {\n this._disabled = val;\n\n if (this.formData && this.controlName) {\n const control = this.formData.controls[this.controlName];\n\n if (this._disabled) {\n control.disable({ emitEvent: false });\n } else {\n control.enable({ emitEvent: false }); // <-- bỏ disable\n }\n }\n }\n @Input() required = false;\n @Input() noBottom = false;\n @Input() multiple = false;\n @Input() showSelectAll = false;\n @Input() maxTagCount = 10;\n\n @Input() inputWidth = '';\n @Input() inputHeight = '';\n @Input() borderBottomOnly = false;\n\n /**\n *\n */\n @Input() displayInline = false;\n @Input() size: NzSelectSizeType = 'default';\n\n @Input() lstItem: any[] = [];\n @Input() displayField: string = '';\n @Input() displayFields: string[] = [];\n\n /**\n * Không có thì value sẽ là cả object\n */\n @Input() valueField: string = '';\n\n @Input() formData!: FormGroup;\n @Input() controlName!: string;\n\n @Input() _ngModel: any = null;\n @Output() _ngModelChange = new EventEmitter();\n\n @Output() itemChange = new EventEmitter();\n\n @Output() onFocus = new EventEmitter();\n\n @Input() isSubmited = false;\n\n @HostBinding('style.--custom-select-height')\n get cssHeight() {\n return this.inputHeight ? +this.inputHeight.replaceAll('px', '') - 1 + 'px' : null;\n }\n\n private _disabled = false;\n\n ngOnInit(): void {\n if (this.formData && this.controlName) {\n this.formData.controls[this.controlName].valueChanges.subscribe((val) => {\n this._ngModelChange.emit(val);\n this.itemChange.emit(this.lstItem.find((x) => x[this.valueField] == val));\n });\n\n if (this.required) {\n this.formData.controls[this.controlName].setValidators(Validators.required);\n }\n\n if (this.disabled) {\n this.formData.controls[this.controlName].disable();\n }\n }\n }\n\n getDisplay(item: any): string {\n if (this.displayField) {\n return item[this.displayField];\n }\n\n if (this.displayFields?.length) {\n const display = this.displayFields\n .map((field) => item[field])\n .filter((x) => x)\n .join(' - ');\n return display;\n }\n\n return item;\n }\n\n onSelectChange(val: any) {\n if (val instanceof Array && val.find((x) => x == '__all__')) {\n const allIds = this.lstItem.map((x) => (this.valueField ? x[this.valueField] : x));\n val = allIds;\n }\n\n this._ngModel = val;\n this._ngModelChange.emit(val);\n\n if (this.valueField) {\n this.itemChange.emit(this.lstItem.find((x) => x[this.valueField] == val));\n }\n }\n\n get isInvalidNgModel(): boolean {\n if (!this.required) return false;\n\n // Kiểm tra rỗng cho cả trường hợp chuỗi, null, undefined và mảng (multiple)\n const isEmpty =\n this._ngModel === null ||\n this._ngModel === undefined ||\n this._ngModel === '' ||\n (Array.isArray(this._ngModel) && this._ngModel.length === 0);\n\n return isEmpty;\n }\n\n get customValidateStatus(): string {\n // Sẽ báo đỏ nếu field trống VÀ (component cha đã ấn submit)\n if (this.isInvalidNgModel && this.isSubmited) {\n return 'error';\n }\n return '';\n }\n}\n","<div\n class=\"extend-select-wrapper\"\n [ngClass]=\"[floatingLabel && label ? 'floating-label' : '']\"\n [ngStyle]=\"{ display: displayInline ? 'inline' : null }\"\n>\n @if (!multiple) {\n @if (controlName) {\n <div [formGroup]=\"formData\">\n <nz-form-item>\n <nz-form-label\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\n [nzFlex]=\"labelFlex\"\n [nzLabelAlign]=\"labelAlign\"\n [nzRequired]=\"required\"\n nzNoColon\n [nzLabelWrap]=\"floatingLabel ? false : true\"\n >\n {{ label }}\n </nz-form-label>\n <nz-form-control\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\n [ngClass]=\"{ 'full-width': floatingLabel }\"\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\n >\n <nz-select\n nzShowSearch\n nzAllowClear\n [nzSize]=\"size\"\n [nzAllowClear]=\"true\"\n [nzShowSearch]=\"true\"\n [nzPlaceHolder]=\"placeHolder\"\n [nzDropdownMatchSelectWidth]=\"dropdownMatchSelectWidth\"\n [formControlName]=\"controlName\"\n (nzFocus)=\"onFocus.emit()\"\n >\n @if (showSelectAll) {\n <nz-option [nzLabel]=\"'-- Chọn tất cả --'\" [nzValue]=\"'__all__'\"></nz-option>\n }\n @for (item of lstItem; track $index) {\n <nz-option [nzLabel]=\"getDisplay(item)\" [nzValue]=\"valueField ? item[valueField] : item\"></nz-option>\n }\n </nz-select>\n </nz-form-control>\n </nz-form-item>\n </div>\n } @else {\n @if (label) {\n <nz-form-item>\n <nz-form-label\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\n [nzFlex]=\"labelFlex\"\n [nzLabelAlign]=\"labelAlign\"\n [nzRequired]=\"required\"\n nzNoColon\n [nzLabelWrap]=\"floatingLabel ? false : true\"\n >\n {{ label }}\n </nz-form-label>\n <nz-form-control\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\n [ngClass]=\"{ 'full-width': floatingLabel }\"\n [nzValidateStatus]=\"customValidateStatus\"\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\n >\n <nz-select\n nzShowSearch\n nzAllowClear\n [nzSize]=\"size\"\n [nzAllowClear]=\"true\"\n [nzShowSearch]=\"true\"\n [nzPlaceHolder]=\"placeHolder\"\n [nzDropdownMatchSelectWidth]=\"dropdownMatchSelectWidth\"\n [ngModel]=\"_ngModel\"\n [disabled]=\"disabled\"\n (ngModelChange)=\"onSelectChange($event)\"\n (nzFocus)=\"onFocus.emit()\"\n >\n @if (showSelectAll) {\n <nz-option [nzLabel]=\"'-- Chọn tất cả --'\" [nzValue]=\"'__all__'\"></nz-option>\n }\n @for (item of lstItem; track $index) {\n <nz-option [nzLabel]=\"getDisplay(item)\" [nzValue]=\"valueField ? item[valueField] : item\"></nz-option>\n }\n </nz-select>\n </nz-form-control>\n </nz-form-item>\n } @else {\n <nz-select\n class=\"full-width\"\n nzShowSearch\n nzAllowClear\n [nzSize]=\"size\"\n [nzPlaceHolder]=\"placeHolder\"\n [nzDropdownMatchSelectWidth]=\"dropdownMatchSelectWidth\"\n [ngModel]=\"_ngModel\"\n (ngModelChange)=\"onSelectChange($event)\"\n (nzFocus)=\"onFocus.emit()\"\n [disabled]=\"disabled\"\n [ngStyle]=\"{\n width: inputWidth,\n height: inputHeight,\n }\"\n [ngClass]=\"{\n 'border-bottom-only': borderBottomOnly,\n 'custom-height-select': inputHeight ? true : false,\n }\"\n >\n @if (showSelectAll) {\n <nz-option [nzLabel]=\"'-- Chọn tất cả --'\" [nzValue]=\"'__all__'\"></nz-option>\n }\n @for (item of lstItem; track $index) {\n <nz-option [nzLabel]=\"getDisplay(item)\" [nzValue]=\"valueField ? item[valueField] : item\"></nz-option>\n }\n </nz-select>\n }\n }\n } @else {\n @if (controlName) {\n <div [formGroup]=\"formData\">\n <nz-form-item>\n <nz-form-label\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\n [nzFlex]=\"labelFlex\"\n [nzLabelAlign]=\"labelAlign\"\n [nzRequired]=\"required\"\n nzNoColon\n [nzLabelWrap]=\"floatingLabel ? false : true\"\n >\n {{ label }}\n </nz-form-label>\n <nz-form-control\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\n [ngClass]=\"{ 'full-width': floatingLabel }\"\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\n >\n <nz-select\n nzShowSearch\n nzAllowClear\n [nzSize]=\"size\"\n [nzMode]=\"'multiple'\"\n [nzMaxMultipleCount]=\"lstItem.length\"\n [nzMaxTagCount]=\"maxTagCount\"\n [nzAllowClear]=\"true\"\n [nzShowSearch]=\"true\"\n [nzPlaceHolder]=\"placeHolder\"\n [nzDropdownMatchSelectWidth]=\"dropdownMatchSelectWidth\"\n [formControlName]=\"controlName\"\n (nzFocus)=\"onFocus.emit()\"\n >\n @if (showSelectAll) {\n <nz-option [nzLabel]=\"'-- Chọn tất cả --'\" [nzValue]=\"'__all__'\"></nz-option>\n }\n @for (item of lstItem; track $index) {\n <nz-option [nzLabel]=\"getDisplay(item)\" [nzValue]=\"valueField ? item[valueField] : item\"></nz-option>\n }\n </nz-select>\n </nz-form-control>\n </nz-form-item>\n </div>\n } @else {\n @if (label) {\n <nz-form-item>\n <nz-form-label\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\n [nzFlex]=\"labelFlex\"\n [nzLabelAlign]=\"labelAlign\"\n [nzRequired]=\"required\"\n nzNoColon\n [nzLabelWrap]=\"floatingLabel ? false : true\"\n >\n {{ label }}\n </nz-form-label>\n <nz-form-control\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\n [ngClass]=\"{ 'full-width': floatingLabel }\"\n [nzValidateStatus]=\"customValidateStatus\"\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\n >\n <nz-select\n nzShowSearch\n nzAllowClear\n [nzSize]=\"size\"\n [nzMode]=\"'multiple'\"\n [nzMaxMultipleCount]=\"lstItem.length\"\n [nzMaxTagCount]=\"maxTagCount\"\n [nzAllowClear]=\"true\"\n [nzShowSearch]=\"true\"\n [nzPlaceHolder]=\"placeHolder\"\n [nzDropdownMatchSelectWidth]=\"dropdownMatchSelectWidth\"\n [ngModel]=\"_ngModel\"\n [disabled]=\"disabled\"\n (ngModelChange)=\"onSelectChange($event)\"\n (nzFocus)=\"onFocus.emit()\"\n >\n @if (showSelectAll) {\n <nz-option [nzLabel]=\"'-- Chọn tất cả --'\" [nzValue]=\"'__all__'\"></nz-option>\n }\n @for (item of lstItem; track $index) {\n <nz-option [nzLabel]=\"getDisplay(item)\" [nzValue]=\"valueField ? item[valueField] : item\"></nz-option>\n }\n </nz-select>\n </nz-form-control>\n </nz-form-item>\n } @else {\n <nz-select\n class=\"full-width\"\n nzShowSearch\n nzAllowClear\n [nzSize]=\"size\"\n [nzPlaceHolder]=\"placeHolder\"\n [nzMode]=\"'multiple'\"\n [nzMaxMultipleCount]=\"lstItem.length\"\n [nzMaxTagCount]=\"maxTagCount\"\n [nzDropdownMatchSelectWidth]=\"dropdownMatchSelectWidth\"\n [ngModel]=\"_ngModel\"\n [disabled]=\"disabled\"\n (ngModelChange)=\"onSelectChange($event)\"\n (nzFocus)=\"onFocus.emit()\"\n >\n @if (showSelectAll) {\n <nz-option [nzLabel]=\"'-- Chọn tất cả --'\" [nzValue]=\"'__all__'\"></nz-option>\n }\n @for (item of lstItem; track $index) {\n <nz-option [nzLabel]=\"getDisplay(item)\" [nzValue]=\"valueField ? item[valueField] : item\"></nz-option>\n }\n </nz-select>\n }\n }\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport { AfterViewInit, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { NzDatePickerModule } from 'ng-zorro-antd/date-picker';\nimport { NzFormModule } from 'ng-zorro-antd/form';\nimport { NzInputModule } from 'ng-zorro-antd/input';\nimport { NzSelectModeType, NzSelectSizeType } from 'ng-zorro-antd/select';\n\n@Component({\n selector: 'extend-textarea',\n templateUrl: './extend-textarea.html',\n styleUrl: './extend-textarea.scss',\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NzFormModule,\n NzDatePickerModule,\n TranslateModule,\n NzInputModule,\n ],\n})\nexport class ExtendTextArea implements AfterViewInit {\n @Input() label = '';\n @Input() placeHolder = '';\n @Input() labelAlign: 'left' | 'right' = 'left';\n @Input() floatingLabel = true;\n @Input() displayInline = false;\n\n /**\n * default = 8\n */\n @Input() labelSpan = 8;\n @Input() labelFlex: string | number | null = null;\n @Input() inputFlex: string | number | null = null;\n\n @Input() disabled = false;\n @Input() required = false;\n @Input() noBottom = false;\n @Input() selectModeType: NzSelectModeType = 'default';\n @Input() inputClass = '';\n @Input() size: NzSelectSizeType = 'default';\n\n @Input() isSubmited = false;\n\n @Input() minRows = 3;\n @Input() maxRows = 5;\n\n @Input() lstItem: any[] = [];\n @Input() displayField: string = '';\n @Input() valueField: string = '';\n\n @Input() formData!: FormGroup;\n @Input() controlName!: string;\n\n @Input() _ngModel: any = null;\n @Output() _ngModelChange = new EventEmitter();\n\n // Thêm các Input cho việc xử lý lỗi\n @Input() isTouched: boolean = false;\n @Input() inputErrorMessage: string = '';\n\n @Input() errorMessages: { [key: string]: string } = {\n required: 'Trường yêu cầu nhập',\n };\n\n ngAfterViewInit(): void {}\n\n onChange() {\n this._ngModelChange.emit(this._ngModel);\n }\n\n // Bắt sự kiện blur (người dùng chạm vào ô textarea rồi trỏ ra ngoài)\n onBlur() {\n this.isTouched = true;\n }\n\n // Gom chung logic hiển thị lỗi cho ngModel\n get customValidateStatus(): string {\n // 1. Nếu chưa thao tác và chưa ấn submit form thì không hiện lỗi\n if (!this.isTouched && !this.isSubmited) {\n return '';\n }\n\n // 2. Ưu tiên lỗi ép từ bên ngoài vào (nếu có)\n if (this.inputErrorMessage) {\n return this.inputErrorMessage;\n }\n\n // 3. Kiểm tra rỗng\n // Dùng String(...).trim() để tránh trường hợp người dùng nhập toàn dấu cách (space)\n const isEmpty =\n this._ngModel === null ||\n this._ngModel === undefined ||\n String(this._ngModel).trim() === '' ||\n (Array.isArray(this._ngModel) && this._ngModel.length === 0);\n\n if (isEmpty) {\n return this.required ? this.errorMessages['required'] || 'Trường yêu cầu nhập' : '';\n }\n\n // Nếu hợp lệ\n return '';\n }\n}\n","<div\n class=\"extend-textarea-wrapper\"\n [ngClass]=\"[floatingLabel && label ? 'floating-label' : '']\"\n [ngStyle]=\"{ display: displayInline ? 'inline' : null }\"\n>\n @if (controlName) {\n <div [formGroup]=\"formData\">\n <nz-form-item>\n @if (label) {\n <nz-form-label\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\n [nzFlex]=\"labelFlex\"\n [nzLabelAlign]=\"labelAlign\"\n [nzRequired]=\"required\"\n [nzFor]=\"controlName\"\n nzNoColon\n nzLabelWrap\n >\n {{ label }}\n </nz-form-label>\n }\n <nz-form-control\n [nzSpan]=\"label ? (floatingLabel || labelFlex ? null : 24 - labelSpan) : null\"\n [nzFlex]=\"inputFlex\"\n [ngClass]=\"{ 'full-width': floatingLabel || !label }\"\n [nzErrorTip]=\"dynamicErrorTemplate\"\n >\n <textarea\n nz-input\n [nzAutosize]=\"{ minRows: minRows || 3, maxRows: maxRows || 5 }\"\n [formControlName]=\"controlName\"\n [ngClass]=\"inputClass\"\n [nzSize]=\"size\"\n ></textarea>\n </nz-form-control>\n </nz-form-item>\n\n <ng-template #dynamicErrorTemplate let-control>\n <ng-container *ngFor=\"let error of errorMessages | keyvalue\">\n <ng-container *ngIf=\"control.hasError(error.key)\">\n {{ error.value }}\n </ng-container>\n </ng-container>\n </ng-template>\n </div>\n } @else {\n <nz-form-item>\n @if (label) {\n <nz-form-label\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\n [nzFlex]=\"labelFlex\"\n [nzLabelAlign]=\"labelAlign\"\n [nzRequired]=\"required\"\n nzNoColon\n nzLabelWrap\n >\n {{ label }}\n </nz-form-label>\n }\n <nz-form-control\n [nzSpan]=\"label ? (floatingLabel || labelFlex ? null : 24 - labelSpan) : null\"\n [nzFlex]=\"inputFlex\"\n [ngClass]=\"{ 'full-width': floatingLabel || !label }\"\n [nzErrorTip]=\"customValidateStatus\"\n [nzValidateStatus]=\"customValidateStatus ? 'error' : ''\"\n >\n <textarea\n nz-input\n [nzAutosize]=\"{ minRows: minRows || 3, maxRows: maxRows || 5 }\"\n [(ngModel)]=\"_ngModel\"\n (ngModelChange)=\"onChange()\"\n (blur)=\"onBlur()\"\n [disabled]=\"disabled\"\n [ngClass]=\"inputClass\"\n [nzSize]=\"size\"\n ></textarea>\n </nz-form-control>\n </nz-form-item>\n }\n</div>\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'highlight',\n})\nexport class HighlightPipe implements PipeTransform {\n transform(value: string | null, search: string): any {\n // if (!search || search.length < 3 || !value) return value;\n if (!search || !value) return value;\n\n const pattern = search.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\n const regex = new RegExp(pattern, 'gi');\n\n return value.toString().replace(regex, (match) => `<span class=\"highlight\">${match}</span>`);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { CommonService } from './api-service/common.service';\nimport { HTTPService } from './api-service/http.service';\n\nexport const URLs = {\n getById: '/api/App_Dic_Domain/GetById',\n getAll: '/api/App_Dic_Domain/GetAll',\n getList: '/api/App_Dic_Domain/GetList',\n getPaging: '/api/App_Dic_Domain/GetPaging',\n addOrEdit: '/api/App_Dic_Domain/AddOrEdit',\n delete: '/api/App_Dic_Domain/Delete',\n};\n\nclass App_Dic_Domain {\n // #region properties\n App_Dic_Domain_Id: string;\n App_Org_Id: string;\n IsActive: boolean;\n CreatedDate: Date;\n CreatedUser: string;\n UpdatedDate: Date;\n UpdatedUser: string;\n DomainCode: string;\n ItemCode: string;\n ItemValue: string;\n OrderValue: number;\n Description: string;\n ChildDomainCode: string;\n ParentItemCode: string;\n // #endregion properties\n\n constructor(obj?: any) {\n obj = obj || {};\n\n this.App_Dic_Domain_Id = obj.App_Dic_Domain_Id || '';\n this.App_Org_Id = obj.App_Org_Id || '';\n this.App_Org_Id = obj.App_Org_Id || '';\n this.IsActive = obj.IsActive || false;\n this.CreatedDate = obj.CreatedDate || null;\n this.CreatedUser = obj.CreatedUser || '';\n this.UpdatedDate = obj.UpdatedDate || null;\n this.UpdatedUser = obj.UpdatedUser || '';\n this.DomainCode = obj.DomainCode || '';\n this.ItemCode = obj.ItemCode || '';\n this.ItemValue = obj.ItemValue || '';\n this.OrderValue = obj.OrderValue || null;\n this.Description = obj.Description || '';\n this.ChildDomainCode = obj.ChildDomainCode || '';\n this.ParentItemCode = obj.ParentItemCode || '';\n }\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DicDomainService extends HTTPService {\n cms = inject(CommonService);\n\n async getByDomain(DomainCode: string): Promise<App_Dic_Domain[]> {\n // 1. Nếu đã có dữ liệu trong cache → dùng ngay\n const cached = DicDomainService.dataCache.get(DomainCode);\n if (cached && cached.length) {\n return cached;\n }\n\n // 2. Nếu đang load dữ liệu này → trả về Promise cũ\n const loading = DicDomainService.loadingCache.get(DomainCode);\n if (loading) {\n return loading;\n }\n\n // 3. Nếu chưa load thì bắt đầu load và lưu Promise\n const loadPromise = this.loadDomainFromServer(DomainCode);\n DicDomainService.loadingCache.set(DomainCode, loadPromise);\n\n try {\n const result = await loadPromise;\n DicDomainService.dataCache.set(DomainCode, result);\n DicDomainService.loadingCache.delete(DomainCode);\n return result;\n } catch (err) {\n // Nếu lỗi → xoá promise để lần sau gọi lại\n DicDomainService.loadingCache.delete(DomainCode);\n throw err;\n }\n }\n\n clearCache() {\n DicDomainService.dataCache = new Map<string, App_Dic_Domain[]>();\n DicDomainService.loadingCache = new Map<string, Promise<App_Dic_Domain[]>>();\n }\n\n // Map cache: DomainCode → dữ liệu\n private static dataCache = new Map<string, App_Dic_Domain[]>();\n\n // Map load state: DomainCode → Promise đang tải\n private static loadingCache = new Map<string, Promise<App_Dic_Domain[]>>();\n\n private async loadDomainFromServer(DomainCode: string): Promise<App_Dic_Domain[]> {\n const ret = await this.cms.ESP({\n SPN: 'App_Dic_Domain_getByDomain',\n Params: [DomainCode],\n });\n return ret.Data || [];\n }\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { DicDomainService } from '../services/dic-domain.service';\n\n@Pipe({\n name: 'dicDomain',\n})\nexport class DicDomainPipe implements PipeTransform {\n service = inject(DicDomainService);\n\n async transform(value: string, domainCode: string): Promise<string> {\n if (!value) return '';\n\n const lstDD = await this.service.getByDomain(domainCode);\n\n return lstDD.find((x) => x.ItemCode == value)?.ItemValue || value;\n }\n}\n","import { AppGlobals } from './app-global';\n\nexport interface ApiEndpoint {\n apiEndpoint: string;\n versionCheck: string;\n idleTimeInMinutes: number;\n}\n\nexport interface RespondData {\n IsSuccess: boolean;\n ErrorMessage: string;\n Data: any;\n}\n\nexport interface ESPModel {\n SPN: string;\n Params?: any[];\n}\n\nexport interface ExportExcelModel extends ESPModel {\n FileCode?: string;\n TemplateName?: string;\n OpenXML?: boolean;\n}\n\nexport interface ExportPdfDocxlModel extends ESPModel {\n FileCode?: string;\n TemplateName?: string;\n}\n\nexport class PagingModel {\n PageIndex: number = 0;\n PageSize: number = AppGlobals.pageSizeOptions[1];\n}\n\nexport class GridFilter extends PagingModel {\n Keyword: string | null = null;\n OrderOption: OrderOption = new OrderOption();\n\n IsShowMore = false;\n}\n\nexport class OrderOption {\n FieldName: string | null = null;\n Direction: string | null = null;\n}\n\nexport class PagingData<T = any> {\n LstHeader: TableHeader[] = [];\n LstItem: T[] = [];\n TotalCount = 0;\n\n constructor(\n obj?: any,\n private TypeConstructor?: new (data?: any) => T,\n ) {\n obj = obj ?? {};\n\n this.LstHeader = obj.LstHeader || [];\n this.TotalCount = obj.TotalCount || 0;\n\n if (Array.isArray(obj.LstItem) && this.TypeConstructor) {\n this.LstItem = obj.LstItem.map((item: any) => new this.TypeConstructor!(item));\n } else {\n this.LstItem = obj.LstItem || [];\n }\n }\n}\n\nexport class TableHeader {\n Code: string = '';\n Name: string = '';\n Class: string = '';\n Type: string = '';\n Width: string = '';\n MinWidth: string = '';\n ShowSort: boolean = false;\n SortOrder: 'ascend' | 'descend' = 'ascend';\n Fixed: 'left' | 'right' | '' = '';\n DomainCode: string = '';\n MaxLines: number | null = null;\n}\n\nexport class CheckModel {\n ConfirmMessage: string = '';\n ConfirmContent: string = '';\n ErrorMessage: string = '';\n ErrorContent: string = '';\n}\n\nexport class App_Org {\n // #region properties\n App_Org_Id?: string;\n CreatedDate?: Date;\n CreatedUser?: string;\n UpdatedDate?: Date;\n UpdatedUser?: string;\n IsActive?: boolean;\n Code?: string;\n Name?: string;\n NameEn?: string;\n Type?: string;\n Address?: string;\n Description?: string;\n ParentId?: string;\n OrderValue?: number;\n // #endregion properties\n\n TreeNodeName?: string;\n LstUserId?: string;\n}\n","import { AfterViewInit, Component, ElementRef, Input, ViewChild, OnDestroy } from '@angular/core';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\n\n@Component({\n selector: 'read-more',\n templateUrl: './read-more.component.html',\n styleUrls: ['./read-more.component.scss'],\n imports: [NzIconModule],\n})\nexport class ReadMoreProComponent implements AfterViewInit, OnDestroy {\n @Input() text = '';\n @Input() lines = 2;\n\n @ViewChild('content') content!: ElementRef<HTMLDivElement>;\n\n expanded = false;\n overflow = false;\n maxHeight = '0px';\n\n private ro!: ResizeObserver;\n\n ngAfterViewInit() {\n this.calculateHeight();\n\n this.ro = new ResizeObserver(() => {\n this.calculateHeight();\n });\n\n this.ro.observe(this.content.nativeElement);\n }\n\n ngOnDestroy() {\n this.ro?.disconnect();\n }\n\n toggle() {\n this.expanded = !this.expanded;\n this.calculateHeight();\n }\n\n private calculateHeight() {\n const el = this.content.nativeElement;\n\n const style = getComputedStyle(el);\n const lineHeight = parseFloat(style.lineHeight);\n\n const collapsedHeight = lineHeight * this.lines;\n const fullHeight = el.scrollHeight;\n\n this.overflow = fullHeight > collapsedHeight + 2;\n\n this.maxHeight = this.expanded ? fullHeight + 'px' : collapsedHeight + 'px';\n }\n}\n","<div class=\"wrapper\">\n <div\n #content\n class=\"content\"\n [class.clamp]=\"!expanded && overflow\"\n [style.-webkit-line-clamp]=\"!expanded && overflow ? lines : 'none'\"\n [style.maxHeight]=\"maxHeight\"\n [innerHTML]=\"text\"\n ></div>\n\n @if (overflow) {\n <div class=\"toggle-container\" [class.expanded]=\"expanded\">\n <span class=\"toggle text-italic\" (click)=\"toggle()\">\n {{ expanded ? \"Thu gọn\" : \"Xem thêm\" }}\n <nz-icon [nzType]=\"expanded ? 'up' : 'down'\" nzTheme=\"outline\" />\n </span>\n </div>\n }\n</div>\n","import { Component, Input, Output, EventEmitter, TemplateRef } from '@angular/core';\nimport { CommonModule, NgTemplateOutlet } from '@angular/common';\nimport { NzTableModule } from 'ng-zorro-antd/table';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\nimport { NzButtonModule } from 'ng-zorro-antd/button';\nimport { BaseComponent } from '../base.component';\nimport { HighlightPipe } from '../../pipe/highlight.pipe';\nimport { DicDomainPipe } from '../../pipe/dic-domain.pipe';\nimport { GridFilter, PagingData } from '../../../lib/model';\nimport { ReadMoreProComponent } from '../../components/read-more/read-more.component';\n\n@Component({\n selector: 'extend-table',\n templateUrl: './extend-table.component.html',\n styleUrl: './extend-table.component.scss',\n imports: [\n CommonModule,\n NzTableModule,\n NzIconModule,\n NzButtonModule,\n NgTemplateOutlet,\n HighlightPipe,\n DicDomainPipe,\n ReadMoreProComponent,\n ],\n})\nexport class ExtendTableComponent extends BaseComponent {\n @Input() data: PagingData = new PagingData();\n @Input() filter = new GridFilter();\n @Input() override isLoading = false;\n\n /**\n * Khoá chính\n */\n @Input() idKey = '';\n\n /**\n * Cột chữ xanh click vào detail\n */\n @Input() detailKey = '';\n\n /**\n * Giá trị khoá chính đang được chọn. Dòng sẽ tô đậm text và đổi mầu\n */\n @Input() selectedIdKey?: string;\n @Input() scroll?: {\n x?: string | null;\n y?: string | null;\n };\n\n @Input() actionTemplate?: TemplateRef<{ $implicit: any; index: number }>;\n\n @Output() filterChange = new EventEmitter<GridFilter>();\n @Output() ondblclickrow = new EventEmitter();\n\n onSortChange(fieldName: string, direction: string | null): void {\n this.filter.OrderOption.FieldName = fieldName;\n this.filter.OrderOption.Direction = direction || '';\n this.filterChange.emit(this.filter);\n }\n\n onPageIndexChange(pageIndex: number): void {\n this.filter.PageIndex = pageIndex;\n this.filterChange.emit(this.filter);\n }\n\n onPageSizeChange(pageSize: number): void {\n this.filter.PageSize = pageSize;\n this.filter.PageIndex = 0;\n this.filterChange.emit(this.filter);\n }\n}\n","<nz-table\n class=\"extend-table\"\n [nzData]=\"data.LstItem || []\"\n [nzBordered]=\"true\"\n [nzSize]=\"'small'\"\n [nzLoading]=\"isLoading\"\n [nzFrontPagination]=\"false\"\n [nzShowPagination]=\"false\"\n [nzTotal]=\"data.TotalCount || 0\"\n [(nzPageIndex)]=\"filter.PageIndex\"\n [(nzPageSize)]=\"filter.PageSize\"\n [nzScroll]=\"scroll || {}\"\n (nzPageIndexChange)=\"onPageIndexChange($event)\"\n (nzPageSizeChange)=\"onPageSizeChange($event)\"\n>\n <thead>\n <tr>\n @for (header of data.LstHeader; track $index) {\n <th\n [nzWidth]=\"header.Width\"\n [nzShowSort]=\"header.ShowSort\"\n [nzSortOrder]=\"header.SortOrder\"\n [nzLeft]=\"header.Fixed == 'left'\"\n [nzRight]=\"header.Fixed == 'right'\"\n (nzSortOrderChange)=\"onSortChange(header.Code, $event)\"\n >\n {{ header.Name }}\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (item of data.LstItem; track $index; let i = $index) {\n <tr\n tabindex=\"0\"\n class=\"selectable-row\"\n [ngClass]=\"selectedIdKey && item[idKey] == selectedIdKey ? 'selected-row' : ''\"\n (dblclick)=\"ondblclickrow.emit(item)\"\n >\n @for (header of data.LstHeader; track $index) {\n @if (header.Code === \"NO\") {\n <td [class]=\"header.Class\" [nzLeft]=\"header.Fixed == 'left'\" [nzRight]=\"header.Fixed == 'right'\">\n {{ i + 1 + filter.PageIndex * filter.PageSize }}\n </td>\n } @else if (header.Code === \"ACTION\") {\n <td [class]=\"header.Class\" [nzLeft]=\"header.Fixed == 'left'\" [nzRight]=\"header.Fixed == 'right'\">\n @if (actionTemplate) {\n <ng-container *ngTemplateOutlet=\"actionTemplate; context: { $implicit: item, index: i }\">\n </ng-container>\n }\n </td>\n } @else if (header.Type === \"CHECKBOX\") {\n <td [class]=\"header.Class\" [nzLeft]=\"header.Fixed == 'left'\" [nzRight]=\"header.Fixed == 'right'\">\n @if (item[header.Code]) {\n <nz-icon nzType=\"check-circle\" nzTheme=\"outline\" class=\"color-primary\" />\n }\n <!-- @else {\n <nz-icon nzType=\"close\" nzTheme=\"outline\" class=\"color-warn\" />\n } -->\n </td>\n } @else if (header.Code == detailKey) {\n <td [class]=\"header.Class\" [nzLeft]=\"header.Fixed == 'left'\" [nzRight]=\"header.Fixed == 'right'\">\n <span\n class=\"link-detail\"\n (click)=\"goto(item[idKey])\"\n [innerHTML]=\"item[header.Code] | highlight: filter.Keyword || ''\"\n ></span>\n </td>\n } @else {\n @if (header.DomainCode) {\n <td\n [class]=\"header.Class\"\n [innerHTML]=\"item[header.Code] | dicDomain: header.DomainCode | async | highlight: filter.Keyword || ''\"\n [nzLeft]=\"header.Fixed == 'left'\"\n [nzRight]=\"header.Fixed == 'right'\"\n ></td>\n } @else if (header.MaxLines) {\n <td [nzLeft]=\"header.Fixed == 'left'\" [nzRight]=\"header.Fixed == 'right'\">\n <read-more [text]=\"item[header.Code]\" [lines]=\"header.MaxLines\"></read-more>\n </td>\n } @else {\n <td\n [nzLeft]=\"header.Fixed == 'left'\"\n [nzRight]=\"header.Fixed == 'right'\"\n [class]=\"header.Class\"\n [innerHTML]=\"item[header.Code] | highlight: filter.Keyword || ''\"\n ></td>\n }\n }\n }\n </tr>\n }\n </tbody>\n</nz-table>\n","import { DecimalPipe } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { NzPaginationModule } from 'ng-zorro-antd/pagination';\nimport { GridFilter } from '../../model';\nimport { AppGlobals } from '../../app-global';\n\n@Component({\n selector: 'extend-pagination',\n templateUrl: './extend-pagination.component.html',\n imports: [NzPaginationModule, DecimalPipe],\n})\nexport class ExtendPaginationComponent {\n @Input() totalCount = 0;\n @Input() filter = new GridFilter();\n\n @Output() onQueryParamsChange = new EventEmitter();\n\n AppGlobals = AppGlobals;\n}\n","<nz-pagination\n [nzSize]=\"'small'\"\n [nzPageIndex]=\"filter.PageIndex + 1\"\n [nzPageSize]=\"filter.PageSize\"\n [nzTotal]=\"totalCount || 0\"\n [nzShowSizeChanger]=\"true\"\n [nzShowTotal]=\"showTotalTpl\"\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\n (nzPageIndexChange)=\"onQueryParamsChange.emit({ PageIndex: $event - 1, PageSize: filter.PageSize })\"\n (nzPageSizeChange)=\"onQueryParamsChange.emit({ PageIndex: filter.PageIndex, PageSize: $event })\"\n>\n</nz-pagination>\n\n<ng-template #showTotalTpl let-total let-range=\"range\">\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\n</ng-template>\n","import { CommonModule } from '@angular/common';\nimport { Component } from '@angular/core';\nimport { Router } from '@angular/router';\n\n@Component({\n template: `\n <h2>Không có quyền truy cập</h2>\n <p *ngIf=\"message\">{{ message }}</p>\n <p *ngIf=\"deniedUrl\">\n Bạn đã cố gắng truy cập: <strong>{{ deniedUrl }}</strong>\n </p>\n `,\n imports: [CommonModule],\n})\nexport class NoPermission {\n deniedUrl: string | null = null;\n message: string | null = null;\n\n constructor(private router: Router) {}\n\n ngOnInit(): void {\n const state = history.state;\n\n this.deniedUrl = state?.deniedUrl || null;\n this.message = state?.message || null;\n\n console.log('Lấy từ history.state:', state);\n }\n}\n","import { Component, inject, Input, OnInit } from '@angular/core';\nimport { NZ_MODAL_DATA } from 'ng-zorro-antd/modal';\nimport { NgxExtendedPdfViewerModule } from 'ngx-extended-pdf-viewer';\n\n@Component({\n selector: 'pdf-viewer',\n templateUrl: './pdf-viewer.html',\n imports: [NgxExtendedPdfViewerModule],\n})\nexport class PdfViewerComponent implements OnInit {\n // data = inject(NZ_MODAL_DATA);\n\n @Input() dataType: 'base64' | 'bytes' | null = null;\n @Input() pdfData: any;\n\n @Input() showPrintButton = false;\n @Input() showDownloadButton = false;\n\n /** Legal values: undefined, 'auto', 'page-actual', 'page-fit', 'page-width', or '50' (or any other percentage) */\n @Input() zoom: string | number | undefined;\n @Input() height: string = '75vh';\n\n ngOnInit(): void {\n // this.dataType = this.data.dataType;\n // this.pdfData = this.data.pdfData;\n // this.showPrintButton = this.data.showPrintButton;\n }\n\n print() {\n if (this.dataType == 'base64') {\n const byteCharacters = atob(this.pdfData);\n const byteNumbers = new Array(byteCharacters.length).fill(0).map((_, i) => byteCharacters.charCodeAt(i));\n const byteArray = new Uint8Array(byteNumbers);\n const blob = new Blob([byteArray], { type: 'application/pdf' });\n\n const blobUrl = window.URL.createObjectURL(blob);\n const iframe = document.createElement('iframe');\n iframe.style.display = 'none';\n iframe.src = blobUrl;\n document.body.appendChild(iframe);\n iframe.contentWindow?.print();\n } else if (this.dataType == 'bytes') {\n const blob = new Blob([this.pdfData], { type: 'application/pdf' });\n\n const blobUrl = window.URL.createObjectURL(blob);\n const iframe = document.createElement('iframe');\n iframe.style.display = 'none';\n iframe.src = blobUrl;\n document.body.appendChild(iframe);\n iframe.contentWindow?.print();\n }\n }\n}\n","@if (dataType == \"base64\") {\n <ngx-extended-pdf-viewer\n [height]=\"height\"\n [zoom]=\"zoom || 100\"\n [base64Src]=\"this.pdfData\"\n [showPrintButton]=\"showPrintButton\"\n [showDownloadButton]=\"showDownloadButton\"\n [showOpenFileButton]=\"false\"\n [showBookModeButton]=\"false\"\n [showDrawEditor]=\"false\"\n [showTextEditor]=\"false\"\n [showDrawEditor]=\"false\"\n [showFreeFloatingBar]=\"false\"\n [showHighlightEditor]=\"false\"\n [showHandToolButton]=\"false\"\n [showPresentationModeButton]=\"false\"\n [showStampEditor]=\"false\"\n ></ngx-extended-pdf-viewer>\n}\n\n@if (dataType == \"bytes\") {\n <ngx-extended-pdf-viewer\n [height]=\"height\"\n [zoom]=\"zoom || 100\"\n [src]=\"this.pdfData\"\n [showPrintButton]=\"showPrintButton\"\n [showDownloadButton]=\"showDownloadButton\"\n [showOpenFileButton]=\"false\"\n [showBookModeButton]=\"false\"\n [showDrawEditor]=\"false\"\n [showTextEditor]=\"false\"\n [showDrawEditor]=\"false\"\n [showFreeFloatingBar]=\"false\"\n [showHighlightEditor]=\"false\"\n [showHandToolButton]=\"false\"\n [showPresentationModeButton]=\"false\"\n [showStampEditor]=\"false\"\n ></ngx-extended-pdf-viewer>\n}\n","import { animate, style, transition, trigger } from '@angular/animations';\nimport { Component, OnDestroy, OnInit } from '@angular/core';\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\nimport { Subscription } from 'rxjs';\nimport { LoadingService } from '../../services/loading.service';\n\n// global-spinner.component.ts\n@Component({\n selector: 'app-global-spinner',\n template: `\n @if (visible) {\n <div class=\"global-spinner\" [@fadeInOut]>\n <nz-spin [nzSpinning]=\"true\" style=\"position: relative; bottom: var(--app-header-height);\"></nz-spin>\n </div>\n }\n `,\n styles: [\n `\n .global-spinner {\n position: fixed;\n z-index: 1200; /* Lớn hơn z-index của modal (usually ~1000) */\n top: var(--app-header-height);\n left: 0px;\n width: 100vw;\n height: 100vh;\n background-color: rgba(255, 255, 255, 0.8); /* Optional overlay */\n display: flex;\n align-items: center;\n justify-content: center;\n }\n `,\n ],\n animations: [\n trigger('fadeInOut', [\n transition(':enter', [style({ opacity: 0 }), animate('250ms ease-in', style({ opacity: 1 }))]),\n transition(':leave', [animate('250ms ease-out', style({ opacity: 0 }))]),\n ]),\n ],\n\n imports: [NzSpinModule],\n})\nexport class GlobalSpinnerComponent implements OnInit, OnDestroy {\n visible = false;\n private sub!: Subscription;\n\n constructor(public loadingService: LoadingService) {}\n\n ngOnInit() {\n this.sub = this.loadingService.loading$.subscribe((v) => {\n setTimeout(() => {\n this.visible = v;\n });\n });\n }\n\n ngOnDestroy() {\n this.sub.unsubscribe();\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'height',\n template: `<div [ngStyle]=\"{ height: height + 'px' }\"></div>`,\n imports: [CommonModule],\n})\nexport class Height {\n @Input() height: number = 0;\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'width',\n template: `<div style=\"display: inline\" [ngStyle]=\"{ 'padding-left': width + 'px' }\"></div>`,\n imports: [CommonModule],\n})\nexport class Width {\n @Input() width: number = 0;\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'box',\n template: `<div\n [ngStyle]=\"{\n height: height + 'px',\n 'padding-left': width + 'px',\n display: display ? display : width && height ? 'block' : height ? 'block' : width ? 'inline' : display,\n }\"\n ></div>`,\n imports: [CommonModule],\n})\nexport class Box {\n @Input() display: 'block' | 'inline' | '' = '';\n @Input() width: number = 0;\n @Input() height: number = 0;\n}\n","export const createMinimap = ($mapSource: any) => {\n // console.log('begin createMinimap');\n\n for (var $child of document.getElementsByClassName('minimap')) {\n $child.remove();\n }\n\n var x: any, y: any, l: any, t: any, w: any, h: any;\n var $window = window;\n var $body = document.getElementsByTagName('body')[0];\n var $minimap = document.createElement('div');\n $minimap.classList.add('minimap');\n $body.append($minimap);\n\n var minimapWidth = $minimap.clientWidth;\n var minimapHeight = $minimap.clientHeight;\n var $viewport = document.createElement('div');\n $viewport.classList.add('minimap-viewport');\n $minimap.append($viewport);\n\n const synchronize = () => {\n var dims = [$mapSource.clientWidth, $mapSource.clientHeight];\n var scroll = [$mapSource.scrollLeft, $mapSource.scrollTop];\n\n var scaleX = minimapWidth / $mapSource.scrollWidth;\n var scaleY = minimapHeight / $mapSource.scrollHeight;\n\n var lW = dims[0] * scaleX;\n var lH = dims[1] * scaleY;\n var lX = scroll[0] * scaleX;\n var lY = scroll[1] * scaleY;\n\n w = Math.round(lW);\n h = Math.round(lH);\n l = Math.round(lX);\n t = Math.round(lY);\n //set the mini viewport dimesions\n redraw();\n };\n\n const redraw = () => {\n $viewport.style.width = `${Math.round(w)}px`;\n $viewport.style.height = `${Math.round(h)}px`;\n $viewport.style.left = `${Math.round(l)}px`;\n $viewport.style.top = `${Math.round(t)}px`;\n };\n\n const init = () => {\n // console.log('minimap init');\n\n for (var $child of $mapSource.getElementsByClassName('workflow-node')) {\n if ($child.classList.contains('workflow-node-start') || $child.classList.contains('workflow-node-end')) {\n var mini = document.createElement('div');\n mini.classList.add('minimap-node-round');\n if ($child.classList.contains('workflow-node-start')) {\n mini.classList.add('minimap-node-round-start');\n }\n if ($child.classList.contains('workflow-node-end')) {\n mini.classList.add('minimap-node-round-end');\n }\n $minimap.append(mini);\n\n var ratioX = minimapWidth / $mapSource.scrollWidth;\n var ratioY = minimapHeight / $mapSource.scrollHeight;\n\n var xM = ($child.offsetLeft + $mapSource.offsetLeft) * ratioX;\n var yM = ($child.offsetTop + $mapSource.offsetTop) * ratioY;\n\n mini.style.width = `5px`;\n mini.style.height = `5px`;\n mini.style.left = `${Math.round(xM)}px`;\n mini.style.top = `${Math.round(yM)}px`;\n } else {\n var mini = document.createElement('div');\n mini.classList.add('minimap-node');\n $minimap.append(mini);\n var ratioX = minimapWidth / $mapSource.scrollWidth;\n var ratioY = minimapHeight / $mapSource.scrollHeight;\n\n var wM = $child.clientWidth * ratioX;\n var hM = $child.clientHeight * ratioY;\n var xM = ($child.offsetLeft + $mapSource.offsetLeft) * ratioX;\n var yM = ($child.offsetTop + $mapSource.offsetTop) * ratioY;\n\n mini.style.width = `${Math.round(wM)}px`;\n mini.style.height = `${Math.round(hM)}px`;\n mini.style.left = `${Math.round(xM)}px`;\n mini.style.top = `${Math.round(yM)}px`;\n }\n }\n };\n\n const down = (e: any) => {\n var moveEvent: any, upEvent: any;\n\n x = Math.round($minimap.offsetLeft + l + w / 2);\n y = Math.round($minimap.offsetTop + t + h / 2);\n\n move(e);\n\n if (e.type === 'touchstart') {\n moveEvent = 'touchmove';\n upEvent = 'touchend';\n } else {\n moveEvent = 'mousemove';\n upEvent = 'mouseup';\n }\n\n const up = () => {\n $window.removeEventListener(moveEvent, move);\n };\n\n $window.addEventListener(moveEvent, move);\n $window.addEventListener(upEvent, up, { once: true });\n };\n\n const move = (e: any) => {\n e.preventDefault();\n\n if (e.type.match(/touch/)) {\n if (e.touches.length > 1) {\n return;\n }\n var event = e.touches[0];\n } else {\n var event = e;\n }\n\n var dx = event.clientX - x;\n var dy = event.clientY - y;\n if (l + dx < 0) {\n dx = -l;\n }\n if (t + dy < 0) {\n dy = -t;\n }\n if (l + w + dx > minimapWidth) {\n dx = minimapWidth - l - w;\n }\n if (t + h + dy > minimapHeight) {\n dy = minimapHeight - t - h;\n }\n\n x += dx;\n y += dy;\n\n l += dx;\n t += dy;\n\n var coefX = minimapWidth / $mapSource.scrollWidth;\n var coefY = minimapHeight / $mapSource.scrollHeight;\n var left = l / coefX;\n var top = t / coefY;\n\n $mapSource.scrollLeft = Math.round(left);\n $mapSource.scrollTop = Math.round(top);\n\n redraw();\n };\n\n synchronize();\n\n // $minimap.addEventListener('mousedown', down);\n // $minimap.addEventListener('touchstart', down);\n\n init();\n\n return this;\n};\n\nexport const deleteMinimap = () => {\n var minimap = document.getElementsByClassName('minimap')[0];\n if (minimap) {\n minimap.remove();\n }\n};\n","import { Directive, ElementRef, Input, Renderer2, OnChanges, SimpleChanges, OnInit } from '@angular/core';\n\n@Directive({\n selector: '[appAutoFocus]'\n})\nexport class AutoFocusDirective implements OnChanges {\n\n @Input() appAutoFocus: boolean = false;\n\n constructor(private el: ElementRef, private renderer: Renderer2) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['appAutoFocus'] && this.appAutoFocus) {\n setTimeout(() => this.el.nativeElement.focus(), 0);\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\n\n@Component({\n selector: 'h3-icon',\n template: ` <h3 nz-col><nz-icon nzType=\"send\" nzTheme=\"outline\" />&nbsp;<ng-content></ng-content></h3> `,\n imports: [NzIconModule],\n})\nexport class H3Icon {}\n\n@Component({\n selector: 'icon-add',\n template: `\n <nz-icon\n nzType=\"plus\"\n nzTheme=\"outline\"\n class=\"color-primary cursor-pointer\"\n [ngStyle]=\"{ 'font-size.px': size }\"\n (click)=\"$event.stopPropagation(); click.emit()\"\n ></nz-icon>\n `,\n imports: [CommonModule, NzIconModule],\n})\nexport class IconAdd {\n @Output() click = new EventEmitter();\n\n /**\n * default = 16\n */\n @Input() size = 16;\n}\n\n@Component({\n selector: 'icon-edit',\n template: `\n <nz-icon\n nzType=\"edit\"\n nzTheme=\"outline\"\n class=\"color-primary cursor-pointer\"\n [ngStyle]=\"{ 'font-size.px': size }\"\n (click)=\"$event.stopPropagation(); click.emit()\"\n ></nz-icon>\n `,\n imports: [CommonModule, NzIconModule],\n})\nexport class IconEdit {\n @Output() click = new EventEmitter();\n\n /**\n * default = 16\n */\n @Input() size = 16;\n}\n\n@Component({\n selector: 'icon-save',\n template: `\n <nz-icon\n nzType=\"save\"\n nzTheme=\"outline\"\n class=\"color-primary cursor-pointer\"\n [ngStyle]=\"{ 'font-size.px': size }\"\n (click)=\"$event.stopPropagation(); click.emit()\"\n ></nz-icon>\n `,\n imports: [CommonModule, NzIconModule],\n})\nexport class IconSave {\n @Output() click = new EventEmitter();\n\n /**\n * default = 16\n */\n @Input() size = 16;\n}\n\n@Component({\n selector: 'icon-delete',\n template: `\n <nz-icon\n nzType=\"delete\"\n nzTheme=\"outline\"\n class=\"color-warn cursor-pointer\"\n [ngStyle]=\"{ 'font-size.px': size }\"\n (click)=\"$event.stopPropagation(); click.emit()\"\n ></nz-icon>\n `,\n imports: [CommonModule, NzIconModule],\n})\nexport class IconDelete {\n @Output() click = new EventEmitter();\n\n /**\n * default = 16\n */\n @Input() size = 16;\n}\n\n@Component({\n selector: 'icon-view',\n template: `\n <nz-icon\n nzType=\"eye\"\n nzTheme=\"outline\"\n class=\"color-primary cursor-pointer\"\n [ngStyle]=\"{ 'font-size.px': size }\"\n (click)=\"$event.stopPropagation(); click.emit()\"\n ></nz-icon>\n `,\n imports: [CommonModule, NzIconModule],\n})\nexport class IconView {\n @Output() click = new EventEmitter();\n\n /**\n * default = 16\n */\n @Input() size = 16;\n}\n\n@Component({\n selector: 'icon-search',\n template: `\n <nz-icon\n nzType=\"search\"\n nzTheme=\"outline\"\n class=\"color-primary cursor-pointer\"\n [ngStyle]=\"{ 'font-size.px': size }\"\n (click)=\"$event.stopPropagation(); click.emit()\"\n ></nz-icon>\n `,\n imports: [CommonModule, NzIconModule],\n})\nexport class IconSearch {\n @Output() click = new EventEmitter();\n\n /**\n * default = 16\n */\n @Input() size = 16;\n}\n","import {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostListener,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzDrawerModule } from 'ng-zorro-antd/drawer';\r\nimport { NzTagModule } from 'ng-zorro-antd/tag';\r\nimport { NzRadioModule } from 'ng-zorro-antd/radio';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzToolTipModule } from 'ng-zorro-antd/tooltip';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { NzFlexModule } from 'ng-zorro-antd/flex';\r\nimport { NzTableModule } from 'ng-zorro-antd/table';\r\nimport { NzDividerModule } from 'ng-zorro-antd/divider';\r\n\r\nimport { BaseComponent } from '../base.component';\r\nimport { Box } from '../box';\r\nimport { ExtendInput } from '../extend-input/extend-input';\r\nimport { ExtendSelectComponent } from '../extend-select/extend-select';\r\nimport { ExtendCheckbox } from '../extend-checkbox/extend-checkbox';\r\nimport { ExtendTextArea } from '../extend-textarea/extend-textarea';\r\nimport { ExtendInputNumber } from '../extend-input-number/extend-input-number';\r\nimport { createMinimap, deleteMinimap } from './minimap';\r\nimport { NzAutocompleteModule } from 'ng-zorro-antd/auto-complete';\r\nimport { AutoFocusDirective } from '../../directive/auto-focus.directive';\r\nimport { IconAdd, IconDelete } from '../../icon';\r\nimport {\r\n NzModalComponent,\r\n NzModalContentDirective,\r\n NzModalTitleDirective,\r\n NzModalFooterDirective,\r\n} from 'ng-zorro-antd/modal';\r\n\r\n// import {\r\n// Box,\r\n// ExtendInput,\r\n// ExtendSelectComponent,\r\n// ExtendCheckbox,\r\n// ExtendTextArea,\r\n// ExtendInputNumber,\r\n// BaseComponent,\r\n// AutoFocusDirective,\r\n// } from '@brggroup/share-lib';\r\n\r\n//#region modal\r\nclass WF_Template {\r\n WF_Template_Id: number;\r\n App_Org_Id: string;\r\n CreatedDate: Date;\r\n CreatedUser: string;\r\n UpdatedDate: Date;\r\n UpdatedUser: string;\r\n IsActive: boolean;\r\n Code: string;\r\n Name: string;\r\n DocType: string;\r\n Description: string;\r\n TemplatePrint: string;\r\n ApplyTo: string;\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.WF_Template_Id = obj.WF_Template_Id || null;\r\n this.App_Org_Id = obj.App_Org_Id || '';\r\n this.CreatedDate = obj.CreatedDate || null;\r\n this.CreatedUser = obj.CreatedUser || '';\r\n this.UpdatedDate = obj.UpdatedDate || null;\r\n this.UpdatedUser = obj.UpdatedUser || '';\r\n this.IsActive = obj.IsActive || null;\r\n this.Code = obj.Code || '';\r\n this.Name = obj.Name || '';\r\n this.DocType = obj.DocType || '';\r\n this.Description = obj.Description || '';\r\n this.TemplatePrint = obj.TemplatePrint || '';\r\n this.ApplyTo = obj.ApplyTo || '';\r\n }\r\n}\r\n\r\nclass WF_TemplateStage {\r\n WF_TemplateStage_Id: number;\r\n App_Org_Id: string;\r\n CreatedDate: Date;\r\n CreatedUser: string;\r\n UpdatedDate: Date;\r\n UpdatedUser: string;\r\n IsActive: boolean;\r\n WF_Template_Id: number;\r\n Code: string;\r\n Name: string;\r\n StageType: '_start_' | 'start' | 'node' | 'end' | '_end_';\r\n SeqValue: number;\r\n NumberDay: number;\r\n LimitValue: number;\r\n IsRequireUser: boolean;\r\n\r\n IsTempId: boolean;\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.WF_TemplateStage_Id = obj.WF_TemplateStage_Id || null;\r\n this.App_Org_Id = obj.App_Org_Id || '';\r\n this.CreatedDate = obj.CreatedDate || null;\r\n this.CreatedUser = obj.CreatedUser || '';\r\n this.UpdatedDate = obj.UpdatedDate || null;\r\n this.UpdatedUser = obj.UpdatedUser || '';\r\n this.IsActive = obj.IsActive || null;\r\n this.WF_Template_Id = obj.WF_Template_Id || null;\r\n this.Code = obj.Code || '';\r\n this.Name = obj.Name || '';\r\n this.StageType = obj.StageType?.toLowerCase() || '';\r\n this.SeqValue = obj.SeqValue || null;\r\n this.NumberDay = obj.NumberDay || null;\r\n this.LimitValue = obj.LimitValue || null;\r\n this.IsRequireUser = obj.IsRequireUser || false;\r\n this.IsTempId = obj.IsTempId || false;\r\n }\r\n}\r\n\r\nclass WF_TemplateStageAction {\r\n WF_TemplateStageAction_Id: number;\r\n App_Org_Id: string;\r\n CreatedDate: Date;\r\n CreatedUser: string;\r\n UpdatedDate: Date;\r\n UpdatedUser: string;\r\n IsActive: boolean;\r\n WF_Template_Id: number;\r\n WF_TemplateStage_Id: number;\r\n ActionType: string;\r\n ActionStatus: string;\r\n ActionText: string;\r\n StageStatus: string;\r\n AllowNote: boolean;\r\n AllowEmail: boolean;\r\n WF_EmailTemplate: string;\r\n To_WF_TemplateStage_Id: number;\r\n To_StageStatus: string;\r\n WF_TransitionsRule_Id: number;\r\n DocProcessStatus: string;\r\n\r\n lstRoleId: string;\r\n _lstRoleId: string[];\r\n\r\n lstEmailActionId: string;\r\n _lstEmailActionId: number[];\r\n\r\n IsTempId: boolean;\r\n\r\n actionRule: ActionRule;\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.WF_TemplateStageAction_Id = obj.WF_TemplateStageAction_Id || null;\r\n this.App_Org_Id = obj.App_Org_Id || '';\r\n this.CreatedDate = obj.CreatedDate || null;\r\n this.CreatedUser = obj.CreatedUser || '';\r\n this.UpdatedDate = obj.UpdatedDate || null;\r\n this.UpdatedUser = obj.UpdatedUser || '';\r\n this.IsActive = obj.IsActive || null;\r\n this.WF_Template_Id = obj.WF_Template_Id || null;\r\n this.WF_TemplateStage_Id = obj.WF_TemplateStage_Id || null;\r\n this.ActionType = obj.ActionType || '';\r\n this.ActionStatus = obj.ActionStatus || '';\r\n this.ActionText = obj.ActionText || '';\r\n this.StageStatus = obj.StageStatus || '';\r\n this.AllowNote = obj.AllowNote || null;\r\n this.AllowEmail = obj.AllowEmail || null;\r\n this.WF_EmailTemplate = obj.WF_EmailTemplate || '';\r\n this.To_WF_TemplateStage_Id = obj.To_WF_TemplateStage_Id || null;\r\n this.To_StageStatus = obj.To_StageStatus || '';\r\n this.WF_TransitionsRule_Id = obj.WF_TransitionsRule_Id || null;\r\n this.DocProcessStatus = obj.DocProcessStatus || '';\r\n\r\n this.lstRoleId = obj.lstRoleId;\r\n this._lstRoleId = this.lstRoleId ? this.lstRoleId.split(',') : [];\r\n\r\n this.lstEmailActionId = obj.lstEmailActionId;\r\n this._lstEmailActionId = this.lstEmailActionId\r\n ? this.lstEmailActionId\r\n .split(',')\r\n .map((x) => Number(x.trim()))\r\n .filter((x) => !isNaN(x))\r\n : [];\r\n\r\n this.IsTempId = obj.IsTempId || false;\r\n this.actionRule = new ActionRule(obj.actionRule);\r\n }\r\n}\r\n\r\nexport class WF_TemplateActionRef {\r\n WF_TemplateActionRef_Id: number;\r\n App_Org_Id: string;\r\n CreatedDate: Date;\r\n CreatedUser: string;\r\n UpdatedDate: Date;\r\n UpdatedUser: string;\r\n IsActive: boolean;\r\n WF_Template: number;\r\n WF_TemplateStage: number;\r\n WF_TemplateStageAction_Id: number;\r\n To_WF_TemplateStageAction_Id: number;\r\n TemplateMail: string;\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.WF_TemplateActionRef_Id = obj.WF_TemplateActionRef_Id || null;\r\n this.App_Org_Id = obj.App_Org_Id || '';\r\n this.CreatedDate = obj.CreatedDate || null;\r\n this.CreatedUser = obj.CreatedUser || '';\r\n this.UpdatedDate = obj.UpdatedDate || null;\r\n this.UpdatedUser = obj.UpdatedUser || '';\r\n this.IsActive = obj.IsActive || null;\r\n this.WF_Template = obj.WF_Template || null;\r\n this.WF_TemplateStage = obj.WF_TemplateStage || null;\r\n this.WF_TemplateStageAction_Id = obj.WF_TemplateStageAction_Id || null;\r\n this.To_WF_TemplateStageAction_Id = obj.To_WF_TemplateStageAction_Id || null;\r\n this.TemplateMail = obj.TemplateMail || '';\r\n }\r\n}\r\n\r\nexport class Workflow extends WF_Template {\r\n lstTemplateType: { Code: string; Name: string }[];\r\n lstTemplatePrint: { Code: string; Name: string }[];\r\n lstStageStatus: { Code: string; Name?: string }[];\r\n lstProcessStatus: { Code: string; Name?: string }[];\r\n lstActionType: { Code: string; Name?: string }[];\r\n lstActionStatus: { Code: string; Name?: string }[];\r\n lstApplyTo: { Code: string; Name: string }[];\r\n\r\n editingActionStatus?: { Code: string; Name?: string };\r\n\r\n editorOption: WorkflowEditorOption = new WorkflowEditorOption();\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n super(obj);\r\n\r\n this.lstTemplateType = obj.lstTemplateType || [];\r\n this.lstTemplatePrint = obj.lstTemplatePrint || [];\r\n this.lstStageStatus = obj.lstStageStatus || [];\r\n this.lstProcessStatus = obj.lstProcessStatus || [];\r\n this.lstActionType = obj.lstActionType || [];\r\n this.lstActionStatus = obj.lstActionStatus || [];\r\n this.lstApplyTo = obj.lstApplyTo || [];\r\n\r\n this.editorOption = new WorkflowEditorOption(obj.editorOption);\r\n }\r\n}\r\n\r\nexport class WorkflowEditorOption {\r\n panX: number;\r\n panY: number;\r\n AllowbackInUse: boolean;\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.panX = obj.panX || 0;\r\n this.panY = obj.panY || 0;\r\n\r\n this.AllowbackInUse = obj.AllowbackInUse || false;\r\n }\r\n}\r\n\r\n/**\r\n * STAGE\r\n */\r\nexport class WorkflowStage extends WF_TemplateStage {\r\n editorOption: WorkflowStageEditorOption = new WorkflowStageEditorOption();\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n super(obj);\r\n\r\n this.editorOption = new WorkflowStageEditorOption(obj.editorOption);\r\n }\r\n}\r\n\r\nexport class WorkflowStageEditorOption {\r\n x: number;\r\n y: number;\r\n isReverse: boolean;\r\n drawerPosition: string;\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.x = obj.x || 0;\r\n this.y = obj.y || 0;\r\n this.isReverse = obj.isReverse || false;\r\n this.drawerPosition = obj.drawerPosition || '';\r\n }\r\n}\r\n\r\n/**\r\n * Action\r\n */\r\nexport class WorkflowAction extends WF_TemplateStageAction {\r\n FromSide: 'left' | 'right';\r\n ToSide: 'left' | 'right';\r\n allowBack: boolean; // true = 2 đầu, false/undefined = 1 đầu\r\n labelBack: string;\r\n\r\n isBackAction: boolean;\r\n\r\n editorOption: WorkflowActionEditorOption;\r\n\r\n getFromStageCode(lstStage: WorkflowStage[]): string {\r\n if (!lstStage || !lstStage.length) return '';\r\n return lstStage.find((x) => x.WF_TemplateStage_Id == this.WF_TemplateStage_Id)?.Code || '';\r\n }\r\n getFromStageName(lstStage: WorkflowStage[]): string {\r\n if (!lstStage || !lstStage.length) return '';\r\n return lstStage.find((x) => x.WF_TemplateStage_Id == this.WF_TemplateStage_Id)?.Name || '';\r\n }\r\n getToStageCode(lstStage: WorkflowStage[]): string {\r\n if (!lstStage || !lstStage.length) return '';\r\n return lstStage.find((x) => x.WF_TemplateStage_Id == this.To_WF_TemplateStage_Id)?.Code || '';\r\n }\r\n getToStageName(lstStage: WorkflowStage[]): string {\r\n if (!lstStage || !lstStage.length) return '';\r\n return lstStage.find((x) => x.WF_TemplateStage_Id == this.To_WF_TemplateStage_Id)?.Name || '';\r\n }\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n super(obj);\r\n\r\n this.To_StageStatus = obj.To_StageStatus || '';\r\n this.FromSide = obj.FromSide || '';\r\n this.ToSide = obj.ToSide || '';\r\n this.allowBack = obj.allowBack || false;\r\n this.labelBack = obj.labelBack || '';\r\n this.isBackAction = obj.isBackAction || false;\r\n this.editorOption = new WorkflowActionEditorOption(obj.editorOption);\r\n }\r\n}\r\n\r\nexport class WorkflowActionRef extends WF_TemplateActionRef {}\r\n\r\nexport class WorkflowActionEditorOption {\r\n points: Point[];\r\n drawerPosition: string;\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.drawerPosition = obj.drawerPosition || '';\r\n\r\n this.points = [];\r\n if (obj.points) {\r\n obj.points.forEach((p: any) => {\r\n this.points = [...this.points, { x: p.x, y: p.y }];\r\n });\r\n }\r\n }\r\n}\r\n\r\ninterface Rect {\r\n x: number;\r\n y: number;\r\n w: number;\r\n h: number;\r\n}\r\n\r\ninterface Point {\r\n x: number;\r\n y: number;\r\n}\r\n\r\ninterface DeleteNodeAction {\r\n type: 'delete-node';\r\n node: WorkflowStage;\r\n nodeIndex: number;\r\n edges: WorkflowAction[];\r\n}\r\n\r\nexport class WF_TransitionRule {\r\n WF_TransitionRule_Id: number;\r\n App_Org_Id: string;\r\n CreatedDate: Date;\r\n CreatedUser: string;\r\n UpdatedDate: Date;\r\n UpdatedUser: string;\r\n IsActive: boolean;\r\n Code: string;\r\n Name: string;\r\n Note: string;\r\n\r\n lstLine: ActionRuleLine[];\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.WF_TransitionRule_Id = obj.WF_TransitionRule_Id || null;\r\n this.App_Org_Id = obj.App_Org_Id || '';\r\n this.CreatedDate = obj.CreatedDate || null;\r\n this.CreatedUser = obj.CreatedUser || '';\r\n this.UpdatedDate = obj.UpdatedDate || null;\r\n this.UpdatedUser = obj.UpdatedUser || '';\r\n this.IsActive = this.WF_TransitionRule_Id ? obj.IsActive || false : true;\r\n this.Code = obj.Code || '';\r\n this.Name = obj.Name || '';\r\n this.Note = obj.Note || '';\r\n\r\n this.lstLine = [];\r\n if (obj.lstLine && obj.lstLine.length) {\r\n obj.lstLine.forEach((x: any) => {\r\n this.lstLine.push(new ActionRuleLine(x));\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport class WF_TransitionRuleLine {\r\n WF_TransitionRuleLine_Id: number;\r\n App_Org_Id: string;\r\n CreatedDate: Date;\r\n CreatedUser: string;\r\n UpdatedDate: Date;\r\n UpdatedUser: string;\r\n IsActive: boolean;\r\n WF_TransitionRule_Id: number;\r\n WF_Template_Id: number;\r\n WF_TemplateStage_Id: number;\r\n WF_TemplateStageAction_Id: number;\r\n\r\n constructor(obj?: any) {\r\n obj = obj || {};\r\n\r\n this.WF_TransitionRuleLine_Id = obj.WF_TransitionRuleLine_Id || null;\r\n this.App_Org_Id = obj.App_Org_Id || '';\r\n this.CreatedDate = obj.CreatedDate || null;\r\n this.CreatedUser = obj.CreatedUser || '';\r\n this.UpdatedDate = obj.UpdatedDate || null;\r\n this.UpdatedUser = obj.UpdatedUser || '';\r\n this.IsActive = obj.IsActive || null;\r\n this.WF_TransitionRule_Id = obj.WF_TransitionRule_Id || null;\r\n this.WF_Template_Id = obj.WF_Template_Id || null;\r\n this.WF_TemplateStage_Id = obj.WF_TemplateStage_Id || null;\r\n this.WF_TemplateStageAction_Id = obj.WF_TemplateStageAction_Id || null;\r\n }\r\n}\r\n\r\nexport class ActionRule extends WF_TransitionRule {}\r\n\r\nexport class ActionRuleLine extends WF_TransitionRuleLine {}\r\n\r\n//#endregion modal\r\n\r\n@Component({\r\n selector: 'app-workflow-editor',\r\n templateUrl: './workflow-editor.component.html',\r\n styleUrls: ['./workflow-editor.component.scss'],\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n NzCardModule,\r\n NzDrawerModule,\r\n NzTagModule,\r\n NzRadioModule,\r\n NzIconModule,\r\n Box,\r\n NzButtonModule,\r\n NzToolTipModule,\r\n ExtendInput,\r\n ExtendSelectComponent,\r\n ExtendCheckbox,\r\n ExtendTextArea,\r\n NzInputModule,\r\n NzGridModule,\r\n NzFlexModule,\r\n ExtendInputNumber,\r\n NzTableModule,\r\n NzDividerModule,\r\n AutoFocusDirective,\r\n NzAutocompleteModule,\r\n IconDelete,\r\n NzModalComponent,\r\n NzModalContentDirective,\r\n NzModalTitleDirective,\r\n IconAdd,\r\n NzModalFooterDirective,\r\n ],\r\n})\r\nexport class WorkflowEditorComponent extends BaseComponent implements OnInit, AfterViewInit, OnDestroy {\r\n //#region NGHIỆP VỤ\r\n @Input() lstOrg: { App_Org_Id: string; Code: string; Name: string }[] = [];\r\n @Input() lstRole: { App_Role_Id: string; Code: string; Name: string }[] = [];\r\n @Input() lstEmailTemplate: { App_MailTemplate_Id: string; Code: string; Name: string }[] = [];\r\n\r\n ready = false;\r\n\r\n template: Workflow = new Workflow();\r\n lstStage: WorkflowStage[] = [];\r\n lstAction: WorkflowAction[] = [];\r\n lstActionRef: WorkflowActionRef[] = [];\r\n\r\n get lstActionOfCurrentStage() {\r\n if (this.selectedStage && this.selectedStage.WF_TemplateStage_Id) {\r\n return this.lstAction.filter((x) => x.WF_TemplateStage_Id == this.selectedStage!.WF_TemplateStage_Id);\r\n }\r\n return [];\r\n }\r\n\r\n get getLstStage() {\r\n return this.lstStage.sort((a, b) => a.SeqValue - b.SeqValue);\r\n }\r\n\r\n get lstEmailAction() {\r\n if (this.lstAction && this.lstAction.length) {\r\n const res = this.lstAction.map((x) => ({\r\n ID: x.WF_TemplateStageAction_Id,\r\n Name: `[${x.getFromStageCode(this.lstStage)}]${x.getFromStageName(this.lstStage) ? ' ' : ''}${x.getFromStageName(this.lstStage)} > [${x.ActionStatus}]${x.ActionText ? ' ' : ''}${x.ActionText}`,\r\n }));\r\n return res;\r\n }\r\n return [];\r\n }\r\n\r\n emailActionText(WF_TemplateStageAction_Id: number) {\r\n const x = this.lstAction.find((x) => x.WF_TemplateStageAction_Id == WF_TemplateStageAction_Id);\r\n return x\r\n ? `[${x.getFromStageCode(this.lstStage)}]${x.getFromStageName(this.lstStage) ? ' ' : ''}${x.getFromStageName(this.lstStage)} > [${x.ActionStatus}]${x.ActionText ? ' ' : ''}${x.ActionText}`\r\n : '';\r\n }\r\n\r\n get getlstStage() {\r\n if (this.lstStage) {\r\n return this.lstStage.sort((a, b) => (a.SeqValue || 0) - (b.SeqValue || 0));\r\n }\r\n return [];\r\n }\r\n\r\n @Output('onSave') onSave = new EventEmitter();\r\n @Output('onDeleteStage') onDeleteStage = new EventEmitter();\r\n @Output('onDeleteAction') onDeleteAction = new EventEmitter();\r\n @Output('onDeleteRule') onDeleteRule = new EventEmitter();\r\n @Output('onDeleteRuleLine') onDeleteRuleLine = new EventEmitter();\r\n //#endregion\r\n\r\n //#region wf editor\r\n Math = Math;\r\n\r\n drawTemplateVisibel = false;\r\n settingVisible = false;\r\n infoVisible = false;\r\n wfcSetting: { ShowGrid: boolean } = { ShowGrid: true };\r\n\r\n selectedStage?: WorkflowStage;\r\n hoverStage?: WorkflowStage;\r\n selectedAction?: WorkflowAction;\r\n selectedBackAction?: WorkflowAction;\r\n hoverAction?: WorkflowAction;\r\n\r\n // vẽ đường liên kết mới\r\n connectingFrom?: {\r\n node: WorkflowStage;\r\n side: 'left' | 'right';\r\n };\r\n connectingPoints: Point[] = [];\r\n previewX = 0;\r\n previewY = 0;\r\n\r\n /** điểm đang chọn để di chuyển */\r\n draggingPoint?: Point;\r\n\r\n /** đang kéo chọn nhiều node */\r\n isSelecting = false;\r\n /** điểm bắt đầu kéo */\r\n selectStart?: { x: number; y: number };\r\n /** điểm kết thúc kéo */\r\n selectEnd?: { x: number; y: number };\r\n\r\n draggingGroup = false;\r\n dragStartMouse?: { x: number; y: number };\r\n dragStartPositions = new Map<number, { x: number; y: number }>();\r\n dragStartEdgePoints = new Map<WorkflowAction, { x: number; y: number }[]>();\r\n\r\n /** list các điểm đang được chọn */\r\n lstSelectedStageId = new Set<number>();\r\n\r\n // SNAP point\r\n gridSize = 20; // 10 / 20 / 25 tuỳ thích\r\n snapToGrid = true;\r\n\r\n // ===== drag node =====\r\n draggingNode?: WorkflowStage;\r\n isDragging = false;\r\n dragStartX = 0;\r\n dragStartY = 0;\r\n offsetX = 0;\r\n offsetY = 0;\r\n\r\n KEY_MOVE_STEP = 5; // px\r\n KEY_MOVE_STEP_BIG = 20; // Shift + arrow\r\n\r\n // pan: dịch chuyển cả canvas\r\n isPanning = false;\r\n panStart?: { x: number; y: number };\r\n // panX = 0;\r\n // panY = 0;\r\n // panX = -5000;\r\n // panY = -5000;\r\n\r\n isMoveMode = true;\r\n\r\n @ViewChild('canvas', { static: true }) canvasRef!: ElementRef<HTMLDivElement>;\r\n @ViewChild('svg', { static: true }) svgRef!: ElementRef<SVGSVGElement>;\r\n\r\n get normalEdges() {\r\n return this.lstAction.filter((e) => e !== this.hoverAction && !e.isBackAction);\r\n }\r\n\r\n get hoverEdges() {\r\n if (this.hoverAction && !this.hoverAction.isBackAction) {\r\n return [this.hoverAction];\r\n }\r\n\r\n if (this.selectedAction && !this.selectedAction.isBackAction) {\r\n return [this.selectedAction];\r\n }\r\n\r\n return [];\r\n }\r\n\r\n axisLock: 'x' | 'y' | null = null;\r\n\r\n @HostListener('window:keydown', ['$event'])\r\n onKeyDown(e: KeyboardEvent) {\r\n // bỏ qua nếu đang gõ input\r\n const target = e.target as HTMLElement;\r\n if (['INPUT', 'TEXTAREA'].includes(target.tagName)) return;\r\n\r\n if (e.key === 'Escape') {\r\n this.cancelConnecting();\r\n }\r\n\r\n if (e.ctrlKey && e.key === 's') {\r\n console.log('ctrl s');\r\n\r\n e.preventDefault();\r\n if (this.ready) {\r\n this.save();\r\n }\r\n }\r\n\r\n if (e.ctrlKey && e.key === 'z') {\r\n console.log('ctrl z');\r\n\r\n e.preventDefault();\r\n this.undo();\r\n }\r\n\r\n if (e.ctrlKey && (e.key === 'y' || (e.shiftKey && e.key === 'Z'))) {\r\n console.log('ctrl y');\r\n\r\n e.preventDefault();\r\n this.redo();\r\n }\r\n\r\n if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].indexOf(e.key) >= 0) {\r\n let dx = 0;\r\n let dy = 0;\r\n\r\n const step = e.shiftKey ? this.KEY_MOVE_STEP_BIG : this.KEY_MOVE_STEP;\r\n\r\n switch (e.key) {\r\n case 'ArrowLeft':\r\n dx = -step;\r\n break;\r\n case 'ArrowRight':\r\n dx = step;\r\n break;\r\n case 'ArrowUp':\r\n dy = -step;\r\n break;\r\n case 'ArrowDown':\r\n dy = step;\r\n break;\r\n default:\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n\r\n this.moveSelectedNodesBy(dx, dy);\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.afterInput();\r\n }\r\n\r\n ngAfterViewInit() {}\r\n\r\n ngOnDestroy(): void {\r\n deleteMinimap();\r\n }\r\n\r\n clear() {\r\n this.template = new Workflow();\r\n this.afterInput();\r\n }\r\n\r\n afterInput() {\r\n this.template = new Workflow(this.template);\r\n\r\n if (!this.lstStage || !this.lstStage.length) {\r\n this.lstStage = [\r\n new WorkflowStage({\r\n WF_TemplateStage_Id: Date.now() + 1,\r\n IsTempId: true,\r\n Code: '_start_',\r\n Name: 'Start',\r\n StageType: '_start_',\r\n SeqValue: 1,\r\n editorOption: {\r\n x: 120,\r\n y: 120,\r\n },\r\n }),\r\n new WorkflowStage({\r\n WF_TemplateStage_Id: Date.now() + 2,\r\n IsTempId: true,\r\n Code: '_end_',\r\n Name: 'End',\r\n StageType: '_end_',\r\n SeqValue: 999,\r\n editorOption: {\r\n x: 120,\r\n y: 300,\r\n isReverseLabel: true,\r\n },\r\n }),\r\n ];\r\n } else {\r\n let lstStage: WorkflowStage[] = [];\r\n this.lstStage.forEach((x) => {\r\n lstStage.push(new WorkflowStage(x));\r\n });\r\n\r\n this.lstStage = [...lstStage];\r\n }\r\n\r\n if (!this.lstAction || !this.lstAction.length) {\r\n this.lstAction = [];\r\n } else {\r\n let lstAction: WorkflowAction[] = [];\r\n this.lstAction.forEach((x) => {\r\n lstAction.push(new WorkflowAction(x));\r\n });\r\n\r\n this.lstAction = [...lstAction];\r\n }\r\n\r\n this.ready = true;\r\n\r\n console.log('WorkflowEditorComponent afterInput');\r\n console.log('template', this.template);\r\n console.log('lstStage', this.lstStage);\r\n console.log('lstAction', this.lstAction);\r\n console.log('lstActionRef', this.lstActionRef);\r\n\r\n this.updateMiniMap();\r\n }\r\n\r\n onclickaction(action: WorkflowAction) {\r\n this.hoverAction = action;\r\n // console.log('onclickaction', action);\r\n }\r\n\r\n updateMiniMap() {\r\n // console.log('updateMiniMap');\r\n\r\n setTimeout(() => {\r\n if (document.getElementsByClassName('canvas-content')[0]) {\r\n createMinimap(document.getElementsByClassName('canvas-content')[0]);\r\n }\r\n }, 100);\r\n }\r\n\r\n moveSelectedNodesBy(dx: number, dy: number) {\r\n if (this.lstSelectedStageId.size === 0) return;\r\n\r\n // ⭐ UNDO SNAPSHOT\r\n this.pushUndo({\r\n type: 'move-nodes',\r\n before: this.cloneNodePositions(this.lstSelectedStageId),\r\n });\r\n\r\n for (const n of this.lstStage) {\r\n if (!this.lstSelectedStageId.has(n.WF_TemplateStage_Id)) continue;\r\n\r\n n.editorOption.x = this.clamp(n.editorOption.x + dx, 0, this.getCanvasWidth() - this.NODE_WIDTH);\r\n\r\n n.editorOption.y = this.clamp(n.editorOption.y + dy, 0, this.getCanvasHeight() - this.NODE_HEIGHT);\r\n }\r\n }\r\n\r\n save() {\r\n this.ready = false;\r\n this.onSave.emit({\r\n template: this.template,\r\n lstStage: this.lstStage,\r\n lstAction: this.lstAction,\r\n lstActionRef: this.lstActionRef,\r\n });\r\n }\r\n\r\n addStage() {\r\n console.log('addStage');\r\n\r\n const id = Date.now();\r\n const code = 'New_Stage';\r\n\r\n // tìm vị trí trống (đơn giản & hiệu quả)\r\n const baseX = 300 - this.template.editorOption.panX;\r\n const baseY = 120 - this.template.editorOption.panY;\r\n\r\n const GAP_X = 200;\r\n const GAP_Y = 120;\r\n\r\n let x = baseX;\r\n let y = baseY;\r\n\r\n while (this.isPositionOccupied(x, y)) {\r\n y += GAP_Y;\r\n }\r\n\r\n const stage = new WorkflowStage();\r\n stage.WF_TemplateStage_Id = id;\r\n stage.IsTempId = true;\r\n stage.Code = code;\r\n stage.Name = 'New Stage';\r\n stage.editorOption.x = x;\r\n stage.editorOption.y = y;\r\n stage.StageType = 'node';\r\n stage.SeqValue = (this.lstStage.length + 1) * 10;\r\n\r\n this.lstStage.push(stage);\r\n this.lstStage = this.lstStage.sort((a, b) => a.SeqValue - b.SeqValue);\r\n // this.selectedStage = node;\r\n this.hoverStage = stage;\r\n\r\n this.updateMiniMap();\r\n }\r\n\r\n isConnectingFrom(node: WorkflowStage) {\r\n return this.connectingFrom?.node.WF_TemplateStage_Id === node.WF_TemplateStage_Id;\r\n }\r\n\r\n isDraggingFrom(node: WorkflowStage) {\r\n return this.draggingNode?.WF_TemplateStage_Id === node.WF_TemplateStage_Id;\r\n }\r\n\r\n isSelectedNode(node: WorkflowStage) {\r\n return this.selectedStage?.WF_TemplateStage_Id === node.WF_TemplateStage_Id;\r\n }\r\n\r\n cancelConnecting() {\r\n if (this.connectingFrom) {\r\n this.connectingFrom = undefined;\r\n this.previewX = 0;\r\n this.previewY = 0;\r\n\r\n this.connectingPoints = [];\r\n }\r\n }\r\n\r\n //#region NGHIỆP VỤ\r\n onselectedRoleEmail(action: WorkflowAction) {\r\n action.lstRoleId = action._lstRoleId ? action._lstRoleId.join(',') : '';\r\n action.lstEmailActionId = action._lstEmailActionId ? action._lstEmailActionId.join(',') : '';\r\n console.log('onselectedRoleEmail', action);\r\n\r\n this.lstActionRef = this.lstActionRef.filter(\r\n (x) => x.WF_TemplateStageAction_Id != action.WF_TemplateStageAction_Id,\r\n );\r\n\r\n for (let i = 0; i < action._lstEmailActionId.length; i++) {\r\n const actionId = action._lstEmailActionId[i];\r\n const newActionRef = new WorkflowActionRef();\r\n newActionRef.WF_TemplateStage = action.WF_TemplateStage_Id;\r\n newActionRef.WF_TemplateStageAction_Id = action.WF_TemplateStageAction_Id;\r\n newActionRef.To_WF_TemplateStageAction_Id = actionId;\r\n this.lstActionRef.push(newActionRef);\r\n }\r\n\r\n console.log('this.lstActionRef', this.lstActionRef);\r\n }\r\n\r\n lstActionRefOf(action: WorkflowAction) {\r\n return this.lstActionRef.filter((x) => x.WF_TemplateStageAction_Id == action.WF_TemplateStageAction_Id) || [];\r\n }\r\n\r\n addAction() {\r\n if (!this.selectedStage) return;\r\n\r\n const action = new WorkflowAction();\r\n action.IsTempId = true;\r\n action.WF_TemplateStageAction_Id = Date.now();\r\n action.WF_TemplateStage_Id = this.selectedStage.WF_TemplateStage_Id;\r\n action.FromSide = 'right';\r\n\r\n this.lstAction = this.lstAction ? [...this.lstAction, action] : [action];\r\n }\r\n\r\n onchangeAllowBack(action: WorkflowAction) {\r\n console.log('onchangeAllowBack', action);\r\n\r\n const stage = this.lstStage.find((x) => x.WF_TemplateStage_Id == action.To_WF_TemplateStage_Id);\r\n if (!stage) {\r\n this.notiService.error('Stage not found');\r\n return;\r\n }\r\n\r\n if (action.allowBack) {\r\n const newAction = new WorkflowAction();\r\n newAction.WF_TemplateStage_Id = action.To_WF_TemplateStage_Id;\r\n newAction.FromSide = 'right';\r\n newAction.To_WF_TemplateStage_Id = action.WF_TemplateStage_Id;\r\n newAction.ToSide = 'left';\r\n newAction.isBackAction = true;\r\n\r\n console.log('newAction', newAction);\r\n\r\n this.lstAction = [...this.lstAction, newAction];\r\n\r\n this.selectedBackAction = newAction;\r\n } else {\r\n action.labelBack = '';\r\n\r\n const backAction = this.lstAction.find(\r\n (x) =>\r\n x.WF_TemplateStage_Id == action.To_WF_TemplateStage_Id &&\r\n x.To_WF_TemplateStage_Id == action.WF_TemplateStage_Id &&\r\n x.isBackAction,\r\n );\r\n\r\n console.log('remove action', backAction);\r\n\r\n if (!backAction) {\r\n this.notiService.error('Action not found');\r\n } else {\r\n this.lstAction = [...this.lstAction.filter((x) => x != backAction)];\r\n this.selectedBackAction = undefined;\r\n }\r\n }\r\n }\r\n\r\n onchangeLabelBack(action: WorkflowAction) {\r\n const backAction = this.lstAction.find(\r\n (x) =>\r\n x.WF_TemplateStage_Id == action.To_WF_TemplateStage_Id &&\r\n x.To_WF_TemplateStage_Id == action.WF_TemplateStage_Id &&\r\n x.isBackAction,\r\n );\r\n\r\n if (!backAction) {\r\n this.notiService.error('Action not found');\r\n } else {\r\n backAction.ActionText = action.labelBack || '';\r\n }\r\n }\r\n\r\n onchangeActionText(action: WorkflowAction) {\r\n if (action.isBackAction) {\r\n const goAction = this.lstAction.find(\r\n (x) =>\r\n x.WF_TemplateStage_Id == action.To_WF_TemplateStage_Id &&\r\n x.To_WF_TemplateStage_Id == action.WF_TemplateStage_Id &&\r\n !x.isBackAction,\r\n );\r\n\r\n if (!goAction) {\r\n this.notiService.error('Action not found');\r\n } else {\r\n goAction.labelBack = action.ActionText || '';\r\n }\r\n }\r\n }\r\n\r\n onchangeNextStage(action: WorkflowAction) {\r\n console.log('onchangeNextStage', action);\r\n }\r\n\r\n async deleteStage() {\r\n console.log('deleteStage', this.selectedStage);\r\n\r\n if (!this.selectedStage) return;\r\n\r\n if (!(await this.confirm(`Xoá stage?`, `${this.selectedStage.Code} - ${this.selectedStage.Name}`))) return;\r\n\r\n const node = this.selectedStage;\r\n\r\n // 🔹 snapshot edges liên quan\r\n const relatedEdges = this.lstAction.filter(\r\n (e) =>\r\n e.WF_TemplateStage_Id === node.WF_TemplateStage_Id || e.To_WF_TemplateStage_Id === node.WF_TemplateStage_Id,\r\n );\r\n\r\n // 🔹 snapshot vị trí node trong mảng\r\n const nodeIndex = this.lstStage.findIndex((n) => n.WF_TemplateStage_Id === node.WF_TemplateStage_Id);\r\n\r\n // bỏ undo khi xóa node vì bắn event ra ngoài để xóa db\r\n // // ⭐ PUSH UNDO\r\n // this.pushUndo({\r\n // type: 'delete-node',\r\n // node: { ...node }, // clone\r\n // nodeIndex,\r\n // edges: relatedEdges.map((e) => ({ ...e })),\r\n // });\r\n\r\n // ❌ xoá edges\r\n this.lstAction = this.lstAction.filter(\r\n (e) =>\r\n e.WF_TemplateStage_Id !== node.WF_TemplateStage_Id && e.To_WF_TemplateStage_Id !== node.WF_TemplateStage_Id,\r\n );\r\n\r\n // ❌ xoá node\r\n this.lstStage.splice(nodeIndex, 1);\r\n\r\n this.onDeleteStage.emit(node);\r\n this.selectedStage = undefined;\r\n }\r\n\r\n async deleteAction(action: WorkflowAction) {\r\n console.log('deleteAction', action);\r\n\r\n if (!(await this.confirm(`Delete action ???`))) return;\r\n\r\n const stage = this.lstStage.find((x) => x.WF_TemplateStage_Id == action.WF_TemplateStage_Id);\r\n\r\n if (!stage) return;\r\n\r\n this.lstAction = this.lstAction.filter((x) => x != action);\r\n\r\n this.onDeleteAction.emit(action);\r\n\r\n this.selectedAction = undefined;\r\n this.hoverAction = undefined;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Action type\r\n\r\n inputStageStatusVisible = false;\r\n inputStageStatusCode = '';\r\n inputStageStatusName = '';\r\n @ViewChild('inputStageStatusElement', { static: false }) inputStageStatusElement?: ElementRef;\r\n\r\n checkRemoveableStageStatus(tag: any) {\r\n if (\r\n this.lstAction.find((x) => x.StageStatus === tag.Code) ||\r\n this.lstAction.find((x) => x.To_StageStatus === tag.Code)\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n handleCloseStageStatus(removedTag: any): void {\r\n this.template.lstStageStatus = this.template.lstStageStatus.filter((tag) => tag !== removedTag);\r\n }\r\n\r\n showInputStageStatus(): void {\r\n this.inputStageStatusVisible = true;\r\n setTimeout(() => {\r\n this.inputStageStatusElement?.nativeElement.focus();\r\n }, 10);\r\n }\r\n\r\n handleInputStageStatusConfirm(): void {\r\n if (this.inputStageStatusCode && !this.template.lstStageStatus?.find((x) => x.Code === this.inputValue)) {\r\n this.template.lstStageStatus = this.template.lstStageStatus\r\n ? [...this.template.lstStageStatus, { Code: this.inputStageStatusCode, Name: this.inputStageStatusName }]\r\n : [{ Code: this.inputStageStatusCode, Name: this.inputStageStatusName }];\r\n }\r\n this.inputStageStatusCode = '';\r\n this.inputStageStatusName = '';\r\n this.inputStageStatusVisible = false;\r\n }\r\n //#endregion\r\n\r\n //#region Action type\r\n\r\n sliceTagName(tag: string): string {\r\n // const isLongTag = tag.length > 20;\r\n // return isLongTag ? `${tag.slice(0, 20)}...` : tag;\r\n return tag;\r\n }\r\n\r\n inputActionTypeVisible = false;\r\n inputActionTypeCode = '';\r\n inputActionTypeName = '';\r\n @ViewChild('inputActionTypeElement', { static: false }) inputActionTypeElement?: ElementRef;\r\n\r\n checkRemoveableActionType(tag: any) {\r\n if (this.lstAction.find((x) => x.ActionType === tag.Code)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n handleCloseActionType(removedTag: {}): void {\r\n this.template.lstActionType = this.template.lstActionType.filter((tag) => tag !== removedTag);\r\n }\r\n\r\n showInputActionType(): void {\r\n this.inputActionTypeVisible = true;\r\n setTimeout(() => {\r\n console.log(this.inputActionTypeElement);\r\n\r\n this.inputActionTypeElement?.nativeElement.focus();\r\n }, 10);\r\n }\r\n\r\n handleInputActionTypeConfirm(): void {\r\n if (this.inputActionTypeCode && !this.template.lstActionType?.find((x) => x.Code === this.inputValue)) {\r\n this.template.lstActionType = this.template.lstActionType\r\n ? [...this.template.lstActionType, { Code: this.inputActionTypeCode, Name: this.inputActionTypeName }]\r\n : [{ Code: this.inputActionTypeCode, Name: this.inputActionTypeName }];\r\n }\r\n this.inputActionTypeCode = '';\r\n this.inputActionTypeName = '';\r\n this.inputActionTypeVisible = false;\r\n }\r\n //#endregion\r\n\r\n //#region Action role\r\n inputActionRoleValue = '';\r\n\r\n handleCloseActionRole(removedTag: {}): void {\r\n this.template.lstActionStatus = this.template.lstActionStatus.filter((tag) => tag !== removedTag);\r\n }\r\n //#endregion\r\n\r\n //#region Action status\r\n inputVisible = false;\r\n inputValue = '';\r\n @ViewChild('inputElement', { static: false }) inputElement?: ElementRef;\r\n\r\n checkRemoveableActionStatus(ActionStatus: string) {\r\n if (this.lstAction.find((x) => x.ActionStatus === ActionStatus)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n handleClose(ActionStatus: string): void {\r\n this.template.lstActionStatus = this.template.lstActionStatus.filter((tag) => tag.Code !== ActionStatus);\r\n this.lstActionStatusFiltered = [...this.template.lstActionStatus];\r\n }\r\n\r\n showInput(): void {\r\n this.inputVisible = true;\r\n setTimeout(() => {\r\n console.log(this.inputElement);\r\n this.inputElement?.nativeElement.focus();\r\n }, 10);\r\n }\r\n\r\n handleInputConfirm(): void {\r\n if (this.inputValue && !this.template.lstActionStatus?.find((x) => x.Code === this.inputValue)) {\r\n this.template.lstActionStatus = this.template.lstActionStatus\r\n ? [...this.template.lstActionStatus, { Code: this.inputValue }]\r\n : [{ Code: this.inputValue }];\r\n }\r\n this.inputValue = '';\r\n this.inputVisible = false;\r\n }\r\n //#endregion\r\n\r\n //#region Canvas action\r\n onMouseDownCanvas(event: MouseEvent) {\r\n console.log('onMouseDownCanvas > event.button', event.button);\r\n\r\n if (event.button !== 0) return; // button === 0 : chuột trái\r\n\r\n // click vào canvas trống\r\n if ((event.target as HTMLElement).closest('.workflow-node')) return;\r\n\r\n this.hoverStage = undefined;\r\n\r\n // 🖐 SPACE + drag → pan\r\n if (this.isMoveMode) {\r\n this.isPanning = true;\r\n this.panStart = {\r\n x: event.clientX,\r\n y: event.clientY,\r\n };\r\n\r\n this.canvasRef?.nativeElement.classList.add('panning');\r\n return;\r\n }\r\n\r\n const p = this.getSvgPoint(event, true);\r\n\r\n this.isSelecting = true;\r\n this.selectStart = p;\r\n this.selectEnd = p;\r\n\r\n this.lstSelectedStageId.clear();\r\n }\r\n\r\n onMouseMoveCanvas(event: MouseEvent) {\r\n if (this.isPanning && this.panStart) {\r\n const dx = event.clientX - this.panStart.x;\r\n const dy = event.clientY - this.panStart.y;\r\n\r\n this.template.editorOption.panX += dx;\r\n this.template.editorOption.panY += dy;\r\n\r\n this.panStart = {\r\n x: event.clientX,\r\n y: event.clientY,\r\n };\r\n\r\n return;\r\n }\r\n\r\n const p = this.getSvgPoint(event);\r\n\r\n const dx = Math.abs(event.clientX - this.dragStartX);\r\n const dy = Math.abs(event.clientY - this.dragStartY);\r\n\r\n if (dx > 4 || dy > 4) {\r\n this.isDragging = true;\r\n }\r\n\r\n // 1️⃣ đang kéo vùng chọn\r\n if (this.isSelecting && this.selectStart) {\r\n const p1 = this.getSvgPoint(event, true);\r\n this.selectEnd = p1;\r\n this.updateSelection();\r\n return;\r\n }\r\n\r\n // 2️⃣ đang kéo nhiều node\r\n if (this.draggingGroup && this.dragStartMouse) {\r\n let dx = p.x - this.dragStartMouse.x;\r\n let dy = p.y - this.dragStartMouse.y;\r\n\r\n // ⭐ xác định trục lock\r\n if (event.shiftKey && !this.axisLock) {\r\n this.axisLock = Math.abs(dx) > Math.abs(dy) ? 'x' : 'y';\r\n }\r\n\r\n if (event.shiftKey && this.axisLock === 'x') {\r\n dy = 0;\r\n }\r\n\r\n if (event.shiftKey && this.axisLock === 'y') {\r\n dx = 0;\r\n }\r\n\r\n const snap = this.snapPoint(\r\n {\r\n x: this.dragStartMouse.x + dx,\r\n y: this.dragStartMouse.y + dy,\r\n },\r\n event,\r\n );\r\n\r\n const sdx = snap.x - this.dragStartMouse.x;\r\n const sdy = snap.y - this.dragStartMouse.y;\r\n\r\n // for (const n of this.lstStage) {\r\n // if (!this.lstSelectedStageCode.has(n.Code)) continue;\r\n\r\n // const start = this.dragStartPositions.get(n.Code)!;\r\n // n.x = start.x + sdx;\r\n // n.y = start.y + sdy;\r\n // }\r\n\r\n const nodeW = this.NODE_WIDTH;\r\n const nodeH = this.NODE_HEIGHT;\r\n\r\n // tìm biên group\r\n let minX = Infinity;\r\n let minY = Infinity;\r\n let maxX = -Infinity;\r\n let maxY = -Infinity;\r\n\r\n for (const n of this.lstStage) {\r\n if (!this.lstSelectedStageId.has(n.WF_TemplateStage_Id)) continue;\r\n\r\n const start = this.dragStartPositions.get(n.WF_TemplateStage_Id)!;\r\n\r\n minX = Math.min(minX, start.x);\r\n minY = Math.min(minY, start.y);\r\n maxX = Math.max(maxX, start.x + nodeW);\r\n maxY = Math.max(maxY, start.y + nodeH);\r\n }\r\n\r\n // clamp delta\r\n const clampedDx = this.clamp(sdx, -minX, this.getCanvasWidth() - maxX);\r\n\r\n const clampedDy = this.clamp(sdy, -minY, this.getCanvasHeight() - maxY);\r\n\r\n // 🔹 move nodes\r\n for (const n of this.lstStage) {\r\n if (!this.lstSelectedStageId.has(n.WF_TemplateStage_Id)) continue;\r\n\r\n const start = this.dragStartPositions.get(n.WF_TemplateStage_Id)!;\r\n n.editorOption.x = start.x + clampedDx;\r\n n.editorOption.y = start.y + clampedDy;\r\n }\r\n\r\n // 🔹 move edge points\r\n for (const [edge, startPoints] of this.dragStartEdgePoints.entries()) {\r\n if (!edge.editorOption.points) continue;\r\n\r\n edge.editorOption.points.forEach((pt, i) => {\r\n pt.x = startPoints[i].x + dx;\r\n pt.y = startPoints[i].y + dy;\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n // 4️⃣ đang kéo 1 node\r\n if (this.draggingNode) {\r\n const dx = p.x;\r\n const dy = p.y;\r\n\r\n // ⭐ xác định trục khi giữ Shift\r\n if (event.shiftKey && !this.axisLock) {\r\n if (Math.abs(dx) > Math.abs(dy)) {\r\n this.axisLock = 'x';\r\n } else {\r\n this.axisLock = 'y';\r\n }\r\n }\r\n\r\n let rawX = p.x - this.offsetX;\r\n let rawY = p.y - this.offsetY;\r\n\r\n // ⭐ khoá trục\r\n if (event.shiftKey && this.axisLock === 'x') {\r\n rawY = this.draggingNode.editorOption.y;\r\n }\r\n\r\n if (event.shiftKey && this.axisLock === 'y') {\r\n rawX = this.draggingNode.editorOption.x;\r\n }\r\n\r\n const snap = this.snapPoint({ x: rawX, y: rawY }, event);\r\n\r\n // this.draggingNode.x = snap.x;\r\n // this.draggingNode.y = snap.y;\r\n\r\n const nodeW = this.NODE_WIDTH;\r\n const nodeH = this.NODE_HEIGHT;\r\n\r\n this.draggingNode.editorOption.x = this.clamp(snap.x, 0, this.getCanvasWidth() - nodeW);\r\n\r\n this.draggingNode.editorOption.y = this.clamp(snap.y, 0, this.getCanvasHeight() - nodeH);\r\n\r\n return;\r\n }\r\n\r\n // 3️⃣ đang kéo waypoint\r\n if (this.draggingPoint) {\r\n const p1 = this.getSvgPoint(event, true);\r\n const snap = this.snapPoint(p1, event);\r\n // this.draggingPoint.x = snap.x;\r\n // this.draggingPoint.y = snap.y;\r\n\r\n this.draggingPoint.x = this.clamp(snap.x, 0, this.getCanvasWidth());\r\n\r\n this.draggingPoint.y = this.clamp(snap.y, 0, this.getCanvasHeight());\r\n\r\n return;\r\n }\r\n\r\n // 5️⃣ đang kéo connection preview\r\n if (this.connectingFrom) {\r\n const p = this.getSvgPoint(event, true);\r\n this.previewX = p.x;\r\n this.previewY = p.y;\r\n }\r\n }\r\n\r\n onMouseUpCanvas(event?: MouseEvent) {\r\n this.isSelecting = false;\r\n this.draggingGroup = false;\r\n this.draggingNode = undefined;\r\n this.draggingPoint = undefined;\r\n this.isPanning = false;\r\n\r\n setTimeout(() => {\r\n this.isDragging = false;\r\n this.updateMiniMap();\r\n });\r\n }\r\n\r\n onClickCanvas(e: MouseEvent) {\r\n console.log('onClickCanvas ', e.offsetX, e.offsetY);\r\n\r\n if (!this.connectingFrom) return;\r\n\r\n this.connectingPoints.push({\r\n x: e.offsetX,\r\n y: e.offsetY,\r\n });\r\n\r\n console.log(this.connectingPoints);\r\n }\r\n //#endregion\r\n\r\n //#region NODE action\r\n\r\n onMouseDownNode(event: MouseEvent, node: WorkflowStage) {\r\n console.log('onMouseDownNode ', node);\r\n console.log('onMouseDownNode ', event);\r\n\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n if ((event.target as HTMLDivElement).classList.contains('connector')) {\r\n return;\r\n }\r\n\r\n this.axisLock = null;\r\n\r\n const p = this.getSvgPoint(event);\r\n\r\n // CASE 1️⃣: node nằm trong selection → kéo cả group\r\n if (this.lstSelectedStageId.has(node.WF_TemplateStage_Id)) {\r\n /* =============================\r\n * UNDO SNAPSHOT (GROUP)\r\n * ============================= */\r\n this.pushUndo({\r\n type: 'move-nodes',\r\n before: this.cloneNodePositions(this.lstSelectedStageId),\r\n });\r\n\r\n this.draggingGroup = true;\r\n this.dragStartMouse = p;\r\n\r\n // 🔹 snapshot node positions\r\n this.dragStartPositions.clear();\r\n for (const n of this.lstStage) {\r\n if (this.lstSelectedStageId.has(n.WF_TemplateStage_Id)) {\r\n this.dragStartPositions.set(n.WF_TemplateStage_Id, { x: n.editorOption.x, y: n.editorOption.y });\r\n }\r\n }\r\n\r\n // 🔹 snapshot edge points\r\n this.dragStartEdgePoints = new Map<WorkflowAction, { x: number; y: number }[]>();\r\n\r\n for (const e of this.lstAction) {\r\n if (!e.editorOption.points?.length) continue;\r\n\r\n if (\r\n this.lstSelectedStageId.has(e.WF_TemplateStage_Id) ||\r\n this.lstSelectedStageId.has(e.To_WF_TemplateStage_Id)\r\n ) {\r\n this.dragStartEdgePoints.set(\r\n e,\r\n e.editorOption.points.map((p) => ({ x: p.x, y: p.y })),\r\n );\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n // CASE 2️⃣: node chưa được chọn → kéo node đơn\r\n this.lstSelectedStageId.clear();\r\n this.hoverStage = undefined;\r\n // this.selectedNodeIds.add(node.id);\r\n\r\n /* =============================\r\n * UNDO SNAPSHOT (1 NODE)\r\n * ============================= */\r\n this.pushUndo({\r\n type: 'move-nodes',\r\n before: this.cloneNodePositions(new Set([node.WF_TemplateStage_Id])),\r\n });\r\n\r\n this.draggingNode = node;\r\n this.dragStartX = event.clientX;\r\n this.dragStartY = event.clientY;\r\n this.offsetX = event.clientX - node.editorOption.x;\r\n this.offsetY = event.clientY - node.editorOption.y;\r\n this.isDragging = false;\r\n }\r\n\r\n onClickStage(node: WorkflowStage) {\r\n console.log('onClickStage ', node);\r\n\r\n this.hoverStage = undefined;\r\n this.selectedStage = undefined;\r\n\r\n if (this.isDragging) return;\r\n\r\n if (this.connectingFrom) {\r\n if (this.connectingFrom.node.WF_TemplateStage_Id !== node.WF_TemplateStage_Id) {\r\n const existed = this.lstAction.some(\r\n (e) =>\r\n e.WF_TemplateStage_Id === this.connectingFrom!.node.WF_TemplateStage_Id &&\r\n e.To_WF_TemplateStage_Id === node.WF_TemplateStage_Id,\r\n );\r\n\r\n if (!existed) {\r\n const newAction = new WorkflowAction();\r\n newAction.WF_TemplateStage_Id = this.connectingFrom.node.WF_TemplateStage_Id;\r\n newAction.FromSide = this.connectingFrom.side;\r\n newAction.To_WF_TemplateStage_Id = node.WF_TemplateStage_Id;\r\n newAction.ToSide = 'left';\r\n\r\n // ⭐ NẾU CÓ WAYPOINT → MANUAL ROUTE\r\n if (this.connectingPoints.length > 0) {\r\n newAction.editorOption.points = [...this.connectingPoints];\r\n }\r\n\r\n this.lstAction.push(newAction);\r\n\r\n console.log('from action', this.connectingFrom.node);\r\n console.log('to action', node);\r\n console.log('newAction', newAction);\r\n }\r\n }\r\n\r\n this.cancelConnecting();\r\n\r\n return;\r\n }\r\n\r\n if (this.isDragging) return;\r\n if (this.lstSelectedStageId.size) return;\r\n // if (node.id == 'start' || node.id == 'end') return;\r\n\r\n this.hoverStage = node;\r\n this.selectedStage = node;\r\n }\r\n //#endregion\r\n\r\n //#region EDGE action\r\n onMouseEnterEdge(e: WorkflowAction) {\r\n // console.log('onMouseEnterEdge', e);\r\n if (this.connectingFrom) return;\r\n this.hoverAction = e;\r\n this.connectingPoints = e.editorOption.points || [];\r\n }\r\n\r\n onMouseLeaveEdge(e: WorkflowAction) {\r\n // console.log('onEdgeLeave', e);\r\n if (this.connectingFrom) return;\r\n this.hoverAction = undefined;\r\n this.connectingPoints = [];\r\n }\r\n\r\n private edgeClickTimer: any = null;\r\n private CLICK_DELAY = 250;\r\n\r\n onClickEdge(edge: WorkflowAction, event: MouseEvent, doAction = false) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n if (this.edgeClickTimer) {\r\n // 👉 DBL CLICK\r\n clearTimeout(this.edgeClickTimer);\r\n this.edgeClickTimer = null;\r\n\r\n this.onDoubleClickEdge(event, edge);\r\n return;\r\n }\r\n\r\n if (doAction) {\r\n this.selectedAction = edge;\r\n this.selectedBackAction = this.lstAction.find(\r\n (x) =>\r\n x.isBackAction == true &&\r\n x.WF_TemplateStage_Id == this.selectedAction?.To_WF_TemplateStage_Id &&\r\n x.To_WF_TemplateStage_Id == this.selectedAction?.WF_TemplateStage_Id,\r\n );\r\n } else {\r\n // 👉 SINGLE CLICK (chờ xem có dbl không)\r\n this.edgeClickTimer = setTimeout(() => {\r\n this.edgeClickTimer = null;\r\n console.log('onClickEdge', edge);\r\n\r\n this.onClickEdge(edge, event, true);\r\n }, this.CLICK_DELAY);\r\n }\r\n }\r\n\r\n onDoubleClickEdge(event: MouseEvent, edge: WorkflowAction) {\r\n console.log('onDoubleClickEdge', edge);\r\n\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n const p = this.getSvgPoint(event, true);\r\n\r\n // Nếu edge chưa có manual points → convert auto → manual\r\n if (!edge.editorOption.points || edge.editorOption.points.length === 0) {\r\n edge.editorOption.points = [];\r\n }\r\n\r\n const insertIndex = this.findInsertIndex(edge, p);\r\n\r\n edge.editorOption.points.splice(insertIndex, 0, {\r\n x: p.x,\r\n y: p.y,\r\n });\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Connector action\r\n onClickConnector(event: MouseEvent, node: WorkflowStage, side: 'left' | 'right') {\r\n console.log('onClickConnector', side, node);\r\n\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n const p = this.getSvgPoint(event, true);\r\n this.previewX = p.x;\r\n this.previewY = p.y;\r\n\r\n /* =============================\r\n * CLICK OUT (RIGHT) → BẮT ĐẦU\r\n * ============================= */\r\n if (side === 'right') {\r\n if (this.connectingFrom) return;\r\n\r\n this.connectingFrom = {\r\n node: node,\r\n side: side,\r\n };\r\n this.connectingPoints = []; // ⭐ reset waypoint\r\n return;\r\n }\r\n\r\n /* =============================\r\n * CLICK IN (LEFT) → KẾT THÚC\r\n * ============================= */\r\n if (side === 'left' && this.connectingFrom) {\r\n if (this.connectingFrom.node.WF_TemplateStage_Id !== node.WF_TemplateStage_Id) {\r\n const existed = this.lstAction.some(\r\n (e) =>\r\n e.WF_TemplateStage_Id === this.connectingFrom!.node.WF_TemplateStage_Id &&\r\n e.To_WF_TemplateStage_Id === node.WF_TemplateStage_Id,\r\n );\r\n\r\n if (!existed) {\r\n const newAction = new WorkflowAction();\r\n newAction.WF_TemplateStage_Id = this.connectingFrom.node.WF_TemplateStage_Id;\r\n newAction.FromSide = this.connectingFrom.side;\r\n newAction.To_WF_TemplateStage_Id = node.WF_TemplateStage_Id;\r\n newAction.ToSide = 'left';\r\n\r\n // ⭐ NẾU CÓ WAYPOINT → MANUAL ROUTE\r\n if (this.connectingPoints.length > 0) {\r\n newAction.editorOption.points = [...this.connectingPoints];\r\n }\r\n\r\n this.lstAction.push(newAction);\r\n }\r\n }\r\n\r\n this.cancelConnecting();\r\n }\r\n }\r\n //#endregion\r\n\r\n //#region Point action\r\n onmousedownPoint(event: MouseEvent, p: Point) {\r\n console.log('onmousedownPoint', p);\r\n\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n if (!this.draggingPoint) {\r\n this.draggingPoint = p;\r\n } else {\r\n this.draggingPoint = undefined;\r\n }\r\n }\r\n\r\n onRightClickPoint(event: MouseEvent, edge: WorkflowAction, index: number) {\r\n console.log('onRightClickPoint', edge, index);\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (!edge.editorOption.points) return;\r\n\r\n edge.editorOption.points.splice(index, 1);\r\n }\r\n //#endregion\r\n\r\n //#region UNDO REDU\r\n undoStack: any[] = [];\r\n redoStack: any[] = [];\r\n\r\n cloneNodePositions(nodeIds: Set<number>) {\r\n const map = new Map<number, { x: number; y: number }>();\r\n for (const n of this.lstStage) {\r\n if (nodeIds.has(n.WF_TemplateStage_Id)) {\r\n map.set(n.WF_TemplateStage_Id, { x: n.editorOption.x, y: n.editorOption.y });\r\n }\r\n }\r\n return map;\r\n }\r\n\r\n pushAlignUndo() {\r\n this.pushUndo({\r\n type: 'move-nodes',\r\n before: this.cloneNodePositions(this.lstSelectedStageId),\r\n });\r\n }\r\n\r\n pushUndo(action: any) {\r\n this.undoStack.push(action);\r\n this.redoStack = [];\r\n }\r\n\r\n undo() {\r\n const action = this.undoStack.pop();\r\n if (!action) return;\r\n\r\n switch (action.type) {\r\n case 'move-nodes':\r\n this.undoMoveNodes(action);\r\n break;\r\n\r\n case 'delete-node': {\r\n // 🔙 restore node\r\n this.lstStage.splice(action.nodeIndex, 0, action.node);\r\n\r\n // 🔙 restore edges\r\n this.lstAction.push(...action.edges);\r\n\r\n // redo snapshot\r\n this.redoStack.push(action);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n undoMoveNodes(action: any) {\r\n const after = this.cloneNodePositions(new Set(action.before.keys()));\r\n\r\n this.redoStack.push({\r\n type: 'move-nodes',\r\n before: after,\r\n });\r\n\r\n // restore\r\n action.before.forEach((pos: any, id: any) => {\r\n const node = this.lstStage.find((n) => n.WF_TemplateStage_Id === id);\r\n if (node) {\r\n node.editorOption.x = pos.x;\r\n node.editorOption.y = pos.y;\r\n }\r\n });\r\n }\r\n\r\n redo() {\r\n const action = this.redoStack.pop();\r\n if (!action) return;\r\n\r\n switch (action.type) {\r\n case 'move-nodes':\r\n this.redoMoveNodes(action);\r\n break;\r\n\r\n case 'delete-node': {\r\n const nodeId = action.node.id;\r\n\r\n // redo = xoá lại\r\n this.lstAction = this.lstAction.filter(\r\n (e) => e.WF_TemplateStage_Id !== nodeId && e.To_WF_TemplateStage_Id !== nodeId,\r\n );\r\n\r\n const idx = this.lstStage.findIndex((n) => n.WF_TemplateStage_Id === nodeId);\r\n if (idx >= 0) this.lstStage.splice(idx, 1);\r\n\r\n this.undoStack.push(action);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n redoMoveNodes(action: any) {\r\n const after = this.cloneNodePositions(new Set(action.before.keys()));\r\n\r\n this.undoStack.push({\r\n type: 'move-nodes',\r\n before: after,\r\n });\r\n\r\n action.before.forEach((pos: any, id: any) => {\r\n const node = this.lstStage.find((n) => n.WF_TemplateStage_Id === id);\r\n if (node) {\r\n node.editorOption.x = pos.x;\r\n node.editorOption.y = pos.y;\r\n }\r\n });\r\n }\r\n\r\n //#endregion\r\n\r\n NODE_WIDTH = 160;\r\n NODE_HEIGHT = 80;\r\n\r\n //#region ALIGN\r\n\r\n getSelectedNodes(): WorkflowStage[] {\r\n return this.lstStage.filter((n) => this.lstSelectedStageId.has(n.WF_TemplateStage_Id));\r\n }\r\n\r\n alignLeft() {\r\n if (this.lstSelectedStageId.size < 2) return;\r\n\r\n this.pushAlignUndo();\r\n\r\n const nodes = this.getSelectedNodes();\r\n const minX = Math.min(...nodes.map((n) => n.editorOption.x));\r\n nodes.forEach((n) => (n.editorOption.x = minX));\r\n }\r\n\r\n alignCenter() {\r\n if (this.lstSelectedStageId.size < 2) return;\r\n\r\n this.pushAlignUndo();\r\n\r\n const nodes = this.getSelectedNodes();\r\n const centers = nodes.map((n) => n.editorOption.x + this.NODE_WIDTH / 2);\r\n const centerX = centers.reduce((a, b) => a + b) / centers.length;\r\n\r\n nodes.forEach((n) => {\r\n n.editorOption.x = centerX - this.NODE_WIDTH / 2;\r\n });\r\n }\r\n\r\n alignRight() {\r\n if (this.lstSelectedStageId.size < 2) return;\r\n\r\n this.pushAlignUndo();\r\n\r\n const nodes = this.getSelectedNodes();\r\n const maxX = Math.max(...nodes.map((n) => n.editorOption.x + this.NODE_WIDTH));\r\n nodes.forEach((n) => (n.editorOption.x = maxX - this.NODE_WIDTH));\r\n }\r\n\r\n alignTop() {\r\n if (this.lstSelectedStageId.size < 2) return;\r\n\r\n this.pushAlignUndo();\r\n\r\n const nodes = this.getSelectedNodes();\r\n const minY = Math.min(...nodes.map((n) => n.editorOption.y));\r\n nodes.forEach((n) => (n.editorOption.y = minY));\r\n }\r\n\r\n alignMiddle() {\r\n if (this.lstSelectedStageId.size < 2) return;\r\n\r\n this.pushAlignUndo();\r\n\r\n const nodes = this.getSelectedNodes();\r\n const centers = nodes.map((n) => n.editorOption.y + this.NODE_HEIGHT / 2);\r\n const centerY = centers.reduce((a, b) => a + b) / centers.length;\r\n\r\n nodes.forEach((n) => {\r\n n.editorOption.y = centerY - this.NODE_HEIGHT / 2;\r\n });\r\n }\r\n\r\n alignBottom() {\r\n if (this.lstSelectedStageId.size < 2) return;\r\n\r\n this.pushAlignUndo();\r\n\r\n const nodes = this.getSelectedNodes();\r\n const maxY = Math.max(...nodes.map((n) => n.editorOption.y + this.NODE_HEIGHT));\r\n nodes.forEach((n) => (n.editorOption.y = maxY - this.NODE_HEIGHT));\r\n }\r\n\r\n distributeHorizontal() {\r\n if (this.lstSelectedStageId.size < 3) return;\r\n\r\n this.pushAlignUndo();\r\n\r\n const nodes = this.getSelectedNodes().sort((a, b) => a.editorOption.x - b.editorOption.x);\r\n\r\n const first = nodes[0];\r\n const last = nodes[nodes.length - 1];\r\n\r\n const totalWidth = nodes.reduce((s, n) => s + this.NODE_WIDTH, 0);\r\n const space = (last.editorOption.x - first.editorOption.x - totalWidth + this.NODE_WIDTH) / (nodes.length - 1);\r\n\r\n let x = first.editorOption.x;\r\n\r\n nodes.forEach((n, i) => {\r\n if (i === 0 || i === nodes.length - 1) {\r\n x = n.editorOption.x + this.NODE_WIDTH + space;\r\n return;\r\n }\r\n n.editorOption.x = x;\r\n x += this.NODE_WIDTH + space;\r\n });\r\n }\r\n\r\n distributeVertical() {\r\n if (this.lstSelectedStageId.size < 3) return;\r\n\r\n this.pushAlignUndo();\r\n\r\n const nodes = this.getSelectedNodes().sort((a, b) => a.editorOption.y - b.editorOption.y);\r\n\r\n const first = nodes[0];\r\n const last = nodes[nodes.length - 1];\r\n\r\n const totalHeight = nodes.reduce((s, n) => s + this.NODE_HEIGHT, 0);\r\n const space = (last.editorOption.y - first.editorOption.y - totalHeight + this.NODE_HEIGHT) / (nodes.length - 1);\r\n\r\n let y = first.editorOption.y;\r\n\r\n nodes.forEach((n, i) => {\r\n if (i === 0 || i === nodes.length - 1) {\r\n y = n.editorOption.y + this.NODE_HEIGHT + space;\r\n return;\r\n }\r\n n.editorOption.y = y;\r\n y += this.NODE_HEIGHT + space;\r\n });\r\n }\r\n\r\n //#endregion\r\n\r\n //#region zoom\r\n zoom = 1;\r\n minZoom = 0.5;\r\n maxZoom = 2;\r\n zoomStep = 0.1;\r\n\r\n get svgTransform(): string {\r\n const cx = this.getCanvasWidth() / 2;\r\n const cy = this.getCanvasHeight() / 2;\r\n\r\n return `\r\n translate(${cx} ${cy})\r\n scale(${this.zoom})\r\n translate(${-cx} ${-cy})\r\n `;\r\n }\r\n\r\n zoomIn() {\r\n this.zoom = Math.min(this.zoom + this.zoomStep, this.maxZoom);\r\n }\r\n\r\n zoomOut() {\r\n this.zoom = Math.max(this.zoom - this.zoomStep, this.minZoom);\r\n }\r\n //#endregion\r\n\r\n //#region HELPER\r\n\r\n isEdgeReversed(edge: WorkflowAction): boolean {\r\n const x = this.lstStage.find((x) => x.WF_TemplateStage_Id == edge.WF_TemplateStage_Id);\r\n const y = this.lstStage.find((x) => x.WF_TemplateStage_Id == edge.To_WF_TemplateStage_Id);\r\n\r\n if (!x || !y) return false;\r\n\r\n const from = this.getNodeCenter(x, 'right');\r\n const to = this.getNodeCenter(y, 'left');\r\n\r\n return to.x < from.x;\r\n }\r\n\r\n getEdgeLabelPosition(edge: WorkflowAction) {\r\n // Ưu tiên waypoint giữa nếu có\r\n if (edge.editorOption.points && edge.editorOption.points.length > 0) {\r\n const mid = edge.editorOption.points[Math.floor(edge.editorOption.points.length / 2)];\r\n return { x: mid.x, y: mid.y };\r\n }\r\n\r\n // fallback: giữa from → to\r\n const x = this.lstStage.find((x) => x.WF_TemplateStage_Id == edge.WF_TemplateStage_Id);\r\n const y = this.lstStage.find((x) => x.WF_TemplateStage_Id == edge.To_WF_TemplateStage_Id);\r\n\r\n if (!x || !y) return { x: 0, y: 0 };\r\n\r\n const from = this.getNodeCenter(x, 'right');\r\n const to = this.getNodeCenter(y, 'left');\r\n\r\n return {\r\n x: (from.x + to.x) / 2,\r\n y: (from.y + to.y) / 2,\r\n };\r\n }\r\n\r\n getNodeCenter(node: WorkflowStage, side: 'left' | 'right' | 'top' | 'bottom' = 'right') {\r\n // const width = node.width ?? 160; // ⭐ đúng với card của bạn\r\n // const height = node.height ?? 80;\r\n\r\n const width = 160;\r\n const height = 80;\r\n\r\n switch (side) {\r\n case 'left':\r\n return {\r\n x: node.editorOption.x,\r\n y: node.editorOption.y + height / 2,\r\n };\r\n\r\n case 'right':\r\n return {\r\n x: node.editorOption.x + width,\r\n y: node.editorOption.y + height / 2,\r\n };\r\n\r\n case 'top':\r\n return {\r\n x: node.editorOption.x + width / 2,\r\n y: node.editorOption.y,\r\n };\r\n\r\n case 'bottom':\r\n return {\r\n x: node.editorOption.x + width / 2,\r\n y: node.editorOption.y + height,\r\n };\r\n }\r\n }\r\n\r\n clamp(value: number, min: number, max: number) {\r\n return Math.max(min, Math.min(max, value));\r\n }\r\n\r\n findInsertIndex(edge: WorkflowAction, p: { x: number; y: number }): number {\r\n const points = this.getEdgeFullPoints(edge);\r\n\r\n if (!points) return 0;\r\n\r\n let minDist = Infinity;\r\n let index = 0;\r\n\r\n for (let i = 0; i < points.length - 1; i++) {\r\n const d = this.pointToSegmentDistance(p, points[i], points[i + 1]);\r\n\r\n if (d < minDist) {\r\n minDist = d;\r\n index = i;\r\n }\r\n }\r\n\r\n // index tương ứng với vị trí trong edge.points\r\n return Math.max(0, index);\r\n }\r\n\r\n getEdgeFullPoints(edge: WorkflowAction) {\r\n if (!edge.WF_TemplateStage_Id || !edge.To_WF_TemplateStage_Id) return null;\r\n\r\n const from = this.getNode(edge.WF_TemplateStage_Id);\r\n const to = this.getNode(edge.To_WF_TemplateStage_Id);\r\n\r\n if (!from || !to) return null;\r\n\r\n return [\r\n { x: from.editorOption.x + 160, y: from.editorOption.y + 40 },\r\n ...(edge.editorOption.points || []),\r\n { x: to.editorOption.x, y: to.editorOption.y + 40 },\r\n ];\r\n }\r\n\r\n pointToSegmentDistance(p: any, a: any, b: any): number {\r\n const dx = b.x - a.x;\r\n const dy = b.y - a.y;\r\n\r\n if (dx === 0 && dy === 0) {\r\n return Math.hypot(p.x - a.x, p.y - a.y);\r\n }\r\n\r\n const t = ((p.x - a.x) * dx + (p.y - a.y) * dy) / (dx * dx + dy * dy);\r\n\r\n const clamped = Math.max(0, Math.min(1, t));\r\n\r\n const proj = {\r\n x: a.x + clamped * dx,\r\n y: a.y + clamped * dy,\r\n };\r\n\r\n return Math.hypot(p.x - proj.x, p.y - proj.y);\r\n }\r\n\r\n isPositionOccupied(x: number, y: number): boolean {\r\n return this.lstStage.some((n) => Math.abs(n.editorOption?.x - x) < 160 && Math.abs(n.editorOption?.y - y) < 80);\r\n }\r\n\r\n getCanvasWidth(): number {\r\n // return 3000;\r\n\r\n const PADDING = 300;\r\n const CANVAS_MIN_WIDTH = 2000;\r\n\r\n const maxX = Math.max(\r\n ...this.lstStage.map((n) => (n.StageType == '_end_' ? n.editorOption?.x || 0 : n.editorOption?.x || 0 + 160)), // 160 = node width\r\n CANVAS_MIN_WIDTH,\r\n );\r\n\r\n return maxX + PADDING;\r\n }\r\n\r\n getCanvasHeight(): number {\r\n // return 2000;\r\n\r\n const PADDING = 200;\r\n const CANVAS_MIN_HEIGHT = 1500;\r\n\r\n const maxY = Math.max(...this.lstStage.map((n) => n.editorOption?.y || 0 + 80), CANVAS_MIN_HEIGHT);\r\n\r\n return maxY + PADDING;\r\n }\r\n\r\n /* =============================\r\n * CONVERT MOUSE → SVG COORD\r\n * ============================= */\r\n getSvgPoint(event: MouseEvent, preview = false): { x: number; y: number } {\r\n const svg = this.svgRef.nativeElement as SVGSVGElement;\r\n const pt = svg.createSVGPoint();\r\n\r\n pt.x = event.clientX;\r\n pt.y = event.clientY;\r\n\r\n const result = pt.matrixTransform(svg.getScreenCTM()!.inverse());\r\n\r\n if (preview) {\r\n return { x: result.x, y: result.y };\r\n } else {\r\n return { x: event.clientX, y: event.clientY };\r\n }\r\n }\r\n\r\n updateSelection() {\r\n if (!this.selectStart || !this.selectEnd) return;\r\n\r\n const x1 = Math.min(this.selectStart.x, this.selectEnd.x);\r\n const y1 = Math.min(this.selectStart.y, this.selectEnd.y);\r\n const x2 = Math.max(this.selectStart.x, this.selectEnd.x);\r\n const y2 = Math.max(this.selectStart.y, this.selectEnd.y);\r\n\r\n this.lstSelectedStageId.clear();\r\n\r\n for (const n of this.lstStage) {\r\n const nx1 = n.editorOption.x;\r\n const ny1 = n.editorOption.y;\r\n const nx2 = n.editorOption.x + 160;\r\n const ny2 = n.editorOption.y + 80;\r\n\r\n const intersect = nx2 >= x1 && nx1 <= x2 && ny2 >= y1 && ny1 <= y2;\r\n\r\n if (intersect) {\r\n this.lstSelectedStageId.add(n.WF_TemplateStage_Id);\r\n }\r\n }\r\n }\r\n\r\n snapPoint(p: { x: number; y: number }, event?: MouseEvent) {\r\n if (!this.snapToGrid || event?.altKey) return p;\r\n if (!this.snapToGrid) return p;\r\n\r\n return {\r\n x: this.snap(p.x),\r\n y: this.snap(p.y),\r\n };\r\n }\r\n\r\n snap(value: number): number {\r\n return Math.round(value / this.gridSize) * this.gridSize;\r\n }\r\n\r\n getNode(id: number) {\r\n return this.lstStage.find((n) => n.WF_TemplateStage_Id === id);\r\n }\r\n //#endregion\r\n\r\n //#region BUILD PATH\r\n buildPath(edge: WorkflowAction): string {\r\n if (!edge.WF_TemplateStage_Id || !edge.To_WF_TemplateStage_Id) return '';\r\n\r\n const from = this.getNode(edge.WF_TemplateStage_Id);\r\n const to = this.getNode(edge.To_WF_TemplateStage_Id);\r\n\r\n if (!from || !to) return '';\r\n\r\n const start = {\r\n x: from.editorOption.x + (from.StageType == '_start_' ? 5 : from.editorOption.isReverse ? 0 : 160),\r\n y: from.editorOption.y + 40,\r\n };\r\n\r\n const end = {\r\n x: to.editorOption.x + (to.StageType == '_end_' ? 5 : to.editorOption.isReverse ? 160 : 0),\r\n y: to.editorOption.y + 40,\r\n };\r\n\r\n if (edge.editorOption.points && edge.editorOption.points.length) {\r\n return this.buildPathThroughPoints([start, ...edge.editorOption.points, end]);\r\n }\r\n\r\n // return this.buildRoutedPath({ node: from, side: edge.fromSide }, to.x, to.y + 40);\r\n return this.buildStragePath(start.x, start.y, end.x, end.y);\r\n }\r\n\r\n buildPreviewPath(): string {\r\n if (!this.connectingFrom) return '';\r\n\r\n const start = {\r\n x:\r\n this.connectingFrom.node.editorOption.x +\r\n (this.connectingFrom.node.StageType == '_start_'\r\n ? 5\r\n : this.connectingFrom.node.editorOption.isReverse\r\n ? 0\r\n : 160),\r\n y: this.connectingFrom.node.editorOption.y + 40,\r\n };\r\n\r\n const end = {\r\n x: this.previewX,\r\n y: this.previewY,\r\n };\r\n\r\n // ⭐ ĐÃ CÓ WAYPOINT → MANUAL PREVIEW\r\n if (this.connectingPoints.length > 0) {\r\n return this.buildPathThroughPoints([start, ...this.connectingPoints, end], 0);\r\n }\r\n\r\n // ⭐ CHƯA CÓ WAYPOINT → AUTO PREVIEW\r\n // return this.buildRoutedPath(this.connectingFrom, end.x, end.y, 0);\r\n return this.buildStragePath(start.x, start.y, end.x, end.y, 0);\r\n }\r\n\r\n buildStragePath(fromX: number, fromY: number, toX: number, toY: number, ARROW_GAP = 12): string {\r\n const x1 = fromX;\r\n const y1 = fromY;\r\n\r\n const x2 = toX;\r\n const y2 = toY;\r\n\r\n /* =============================\r\n * 1. VECTOR GỐC\r\n * ============================= */\r\n const dx = x2 - x1;\r\n const dy = y2 - y1;\r\n const len = Math.sqrt(dx * dx + dy * dy) || 1;\r\n\r\n /* =============================\r\n * 2. SHRINK START & END\r\n * ============================= */\r\n const sx = x1 + (dx / len) * ARROW_GAP;\r\n const sy = y1 + (dy / len) * ARROW_GAP;\r\n\r\n const ex = x2 - (dx / len) * ARROW_GAP;\r\n const ey = y2 - (dy / len) * ARROW_GAP;\r\n\r\n /* =============================\r\n * 3. PATH THẲNG\r\n * ============================= */\r\n return `\r\n M ${sx} ${sy}\r\n L ${ex} ${ey}\r\n `;\r\n }\r\n\r\n buildRoutedPath(\r\n from: {\r\n node: WorkflowStage;\r\n side: 'left' | 'right';\r\n },\r\n toX: number,\r\n toY: number,\r\n ARROW_GAP = 12,\r\n ): string {\r\n const x1 = from.node.editorOption.isReverse ? from.node.editorOption.x : from.node.editorOption.x + 160;\r\n const y1 = from.node.editorOption.y + 40;\r\n\r\n const x2 = toX;\r\n const y2 = toY;\r\n\r\n // const ARROW_GAP = 12;\r\n\r\n /* =============================\r\n * 1. VECTOR GỐC\r\n * ============================= */\r\n const dx = x2 - x1;\r\n const dy = y2 - y1;\r\n const len = Math.sqrt(dx * dx + dy * dy) || 1;\r\n\r\n const ux = dx / len;\r\n const uy = dy / len;\r\n\r\n /* =============================\r\n * 2. START / END (CÁCH CONNECTOR ĐỀU)\r\n * ============================= */\r\n let sx = x1 + ux * ARROW_GAP;\r\n let sy = y1 + uy * ARROW_GAP;\r\n\r\n let ex = x2 - ux * ARROW_GAP;\r\n let ey = y2 - uy * ARROW_GAP;\r\n\r\n /* =============================\r\n * 3. KIỂM TRA BỊ CHẮN KHÔNG\r\n * ============================= */\r\n const blocked = this.isBlockedPoint(from, x2, y2);\r\n\r\n /* =============================\r\n * 4. ĐỘ CONG CƠ BẢN\r\n * ============================= */\r\n const dist = Math.sqrt((ex - sx) * (ex - sx) + (ey - sy) * (ey - sy));\r\n\r\n const BASE_CURVE = Math.max(30, Math.min(80, dist / 2));\r\n\r\n /* =============================\r\n * 5. KHÔNG BỊ CHẮN → CONG TRỰC TIẾP\r\n * ============================= */\r\n if (!blocked) {\r\n let c1x: number, c1y: number;\r\n let c2x: number, c2y: number;\r\n\r\n if (Math.abs(dy) < Math.abs(dx)) {\r\n // thiên ngang\r\n c1x = sx + BASE_CURVE;\r\n c1y = sy;\r\n c2x = ex - BASE_CURVE;\r\n c2y = ey;\r\n } else {\r\n // thiên dọc\r\n const dir = ey > sy ? 1 : -1;\r\n c1x = sx;\r\n c1y = sy + dir * BASE_CURVE;\r\n c2x = ex;\r\n c2y = ey - dir * BASE_CURVE;\r\n }\r\n\r\n return `\r\n M ${sx} ${sy}\r\n C ${c1x} ${c1y},\r\n ${c2x} ${c2y},\r\n ${ex} ${ey}\r\n `;\r\n }\r\n\r\n /* =============================\r\n * 6. BỊ CHẮN → ROUTE NÉ (S-CURVE)\r\n * ============================= */\r\n const routeY = this.findBestRouteY(from, ex, ey);\r\n const midX = (sx + ex) / 2;\r\n\r\n const CURVE = 40;\r\n\r\n return `\r\n M ${sx} ${sy}\r\n C ${sx + CURVE} ${sy},\r\n ${sx + CURVE} ${routeY},\r\n ${midX} ${routeY}\r\n S ${ex - CURVE} ${routeY},\r\n ${ex} ${ey}\r\n `;\r\n }\r\n\r\n buildPathThroughPoints(\r\n points: { x: number; y: number }[],\r\n ARROW_GAP = 12,\r\n tension = 0.1, // ⭐ 0.1 → rất thẳng, 0.5 → cong hơn\r\n ): string {\r\n if (points.length < 2) return '';\r\n\r\n const start = this.shrinkPoint(points[0], points[1], ARROW_GAP);\r\n const end = this.shrinkPoint(points[points.length - 1], points[points.length - 2], ARROW_GAP);\r\n\r\n const pts = [start, ...points.slice(1, -1), end];\r\n\r\n let d = `M ${pts[0].x} ${pts[0].y}`;\r\n\r\n for (let i = 0; i < pts.length - 1; i++) {\r\n const p0 = pts[i - 1] || pts[i];\r\n const p1 = pts[i];\r\n const p2 = pts[i + 1];\r\n const p3 = pts[i + 2] || p2;\r\n\r\n const c1x = p1.x + (p2.x - p0.x) * tension;\r\n const c1y = p1.y + (p2.y - p0.y) * tension;\r\n\r\n const c2x = p2.x - (p3.x - p1.x) * tension;\r\n const c2y = p2.y - (p3.y - p1.y) * tension;\r\n\r\n d += ` C ${c1x} ${c1y}, ${c2x} ${c2y}, ${p2.x} ${p2.y}`;\r\n }\r\n\r\n return d;\r\n }\r\n\r\n shrinkPoint(from: { x: number; y: number }, to: { x: number; y: number }, gap: number) {\r\n const dx = to.x - from.x;\r\n const dy = to.y - from.y;\r\n const len = Math.sqrt(dx * dx + dy * dy) || 1;\r\n\r\n return {\r\n x: from.x + (dx / len) * gap,\r\n y: from.y + (dy / len) * gap,\r\n };\r\n }\r\n\r\n isBlockedPoint(\r\n from: {\r\n node: WorkflowStage;\r\n side: 'left' | 'right';\r\n },\r\n x2: number,\r\n y2: number,\r\n ): boolean {\r\n const x1 = from.node.editorOption.isReverse ? from.node.editorOption.x + 160 : from.node.editorOption.x;\r\n const y1 = from.node.editorOption.y + 40;\r\n\r\n return this.lstStage.some((n) => {\r\n if (n.WF_TemplateStage_Id === from.node.WF_TemplateStage_Id) return false;\r\n\r\n // node phải nằm giữa theo trục X\r\n if (!this.isNodeBetweenX(x1, x2, n)) return false;\r\n\r\n // line phải cắt node theo trục Y\r\n return this.doesLineCrossNodeY(y1, n);\r\n });\r\n }\r\n\r\n findBestRouteY(\r\n from: {\r\n node: WorkflowStage;\r\n side: 'left' | 'right';\r\n },\r\n toX: number,\r\n toY: number,\r\n ): number {\r\n const baseY = from.node.editorOption.y + 40;\r\n\r\n const OFFSETS = [0, 80, -80, 160, -160, 240, -240];\r\n\r\n for (const offset of OFFSETS) {\r\n const routeY = baseY + offset;\r\n\r\n if (this.isLaneClear(from, toX, routeY)) {\r\n return routeY;\r\n }\r\n }\r\n\r\n // fallback: dùng lane xa nhất\r\n return baseY + OFFSETS[OFFSETS.length - 1];\r\n }\r\n\r\n isNodeBetweenX(fromX: number, toX: number, node: WorkflowStage): boolean {\r\n const nx1 = node.editorOption.x;\r\n const nx2 = node.editorOption.x + 160;\r\n\r\n const minX = Math.min(fromX, toX);\r\n const maxX = Math.max(fromX, toX);\r\n\r\n return nx2 > minX && nx1 < maxX;\r\n }\r\n\r\n doesLineCrossNodeY(\r\n y: number,\r\n node: WorkflowStage,\r\n tolerance = 6, // rất quan trọng\r\n ): boolean {\r\n const top = node.editorOption.y;\r\n const bottom = node.editorOption.y + 80;\r\n\r\n return y > top + tolerance && y < bottom - tolerance;\r\n }\r\n\r\n isLaneClear(\r\n from: {\r\n node: WorkflowStage;\r\n side: 'left' | 'right';\r\n },\r\n toX: number,\r\n routeY: number,\r\n ): boolean {\r\n const x1 = from.node.editorOption.x;\r\n const y1 = from.node.editorOption.y + 40;\r\n const x2 = toX;\r\n const y2 = routeY;\r\n\r\n return !this.lstStage.some((n) => {\r\n if (n.WF_TemplateStage_Id === from.node.WF_TemplateStage_Id) return false;\r\n\r\n // node phải nằm giữa theo trục X\r\n if (!this.isNodeBetweenX(x1, x2, n)) return false;\r\n\r\n // lane Y cắt node\r\n return this.doesLineCrossNodeY(routeY, n);\r\n });\r\n }\r\n //#endregion\r\n\r\n compareFun = (o1: { Code: string; Name?: string } | string, o2: { Code: string; Name?: string }): boolean => {\r\n if (o1) {\r\n return typeof o1 === 'string' ? o1 === o2.Code : o1.Code === o2.Code;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n lstActionStatusFiltered: { Code: string; Name?: string }[] = [];\r\n nzAutocompletechange(val: string, lstActionStatus: { Code: string; Name?: string }[]) {\r\n this.lstActionStatusFiltered = lstActionStatus\r\n .filter((x) => x.Code.includes(val))\r\n .sort((a, b) => a.Code.localeCompare(b.Code));\r\n }\r\n\r\n onenterAotu(ActionStatus: string) {\r\n if (!ActionStatus.trim()) return;\r\n if (ActionStatus && !this.template.lstActionStatus.find((x) => x.Code == ActionStatus)) {\r\n this.template.lstActionStatus = [...this.template.lstActionStatus, { Code: ActionStatus }];\r\n }\r\n }\r\n\r\n //#region action rule\r\n\r\n actionRuleModalVisible = false;\r\n\r\n lstAllTemplate: Workflow[] = [];\r\n lstAllStage: WorkflowStage[] = [];\r\n lstAllAction: WorkflowAction[] = [];\r\n\r\n lstTemplateForRule(item: ActionRuleLine) {\r\n if (this.hoverAction) {\r\n return this.lstAllTemplate.filter(\r\n (x) =>\r\n x.WF_Template_Id == item.WF_Template_Id ||\r\n !this.hoverAction!.actionRule.lstLine.find((y) => y.WF_Template_Id == x.WF_Template_Id),\r\n );\r\n }\r\n return this.lstAllTemplate;\r\n }\r\n\r\n lstStageForRule(WF_Template_Id: number): WorkflowStage[] {\r\n return this.lstAllStage.filter((x) => x.WF_Template_Id == WF_Template_Id);\r\n }\r\n\r\n lstActionForRule(WF_TemplateStage_Id: number): WorkflowAction[] {\r\n return this.lstAllAction.filter((x) => x.WF_TemplateStage_Id == WF_TemplateStage_Id);\r\n }\r\n\r\n addActionRuleLine() {\r\n if (this.hoverAction) {\r\n const newone = new ActionRuleLine();\r\n newone.IsActive = true;\r\n this.hoverAction.actionRule.lstLine = [...this.hoverAction.actionRule.lstLine, newone];\r\n }\r\n }\r\n\r\n async deleteActionRuleLine(actionRule: ActionRule, line: ActionRuleLine) {\r\n if (await this.confirm('Delete Rule Line???')) {\r\n if (!line.WF_TransitionRuleLine_Id) {\r\n actionRule.lstLine = actionRule.lstLine.filter((x) => x != line);\r\n } else {\r\n this.onDeleteRuleLine.emit(line.WF_TransitionRuleLine_Id);\r\n actionRule.lstLine = actionRule.lstLine.filter((x) => x != line);\r\n }\r\n }\r\n }\r\n\r\n async deleteActionRule(action: WorkflowAction) {\r\n console.log(action);\r\n\r\n if (await this.confirm('Delete Rule???')) {\r\n this.onDeleteRule.emit({\r\n WF_TemplateStageAction_Id: action.WF_TemplateStageAction_Id,\r\n WF_TransitionsRule_Id: action.WF_TransitionsRule_Id,\r\n });\r\n }\r\n }\r\n\r\n //#endregion action rule\r\n}\r\n","<div\r\n #canvasRef\r\n class=\"workflow-canvas\"\r\n [class.connecting]=\"!!connectingFrom\"\r\n [class.dragging-point]=\"!!draggingPoint\"\r\n [style.width.px]=\"getCanvasWidth()\"\r\n [style.height.px]=\"getCanvasHeight()\"\r\n (mousedown)=\"onMouseDownCanvas($event)\"\r\n (mousemove)=\"onMouseMoveCanvas($event)\"\r\n (mouseup)=\"onMouseUpCanvas($event)\"\r\n (click)=\"onClickCanvas($event)\"\r\n>\r\n <!-- \r\n\r\n [style.width.px]=\"getCanvasWidth()\"\r\n [style.height.px]=\"getCanvasHeight()\" \r\n\r\n [style.width.px]=\"CANVAS_WIDTH\"\r\n [style.height.px]=\"CANVAS_HEIGHT\"\r\n\r\n style=\"width: 100%; height: calc(100vh - 120px)\"\r\n \r\n -->\r\n\r\n <div class=\"toolbar\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\">\r\n <button nz-button nzSize=\"small\" nz-tooltip=\"Editor setting\" (click)=\"settingVisible = true\">\r\n <nz-icon nzType=\"setting\"></nz-icon>\r\n </button>\r\n\r\n <button nz-button nzSize=\"small\" nz-tooltip=\"Infomation\" (click)=\"infoVisible = true\">\r\n <nz-icon nzType=\"info-circle\"></nz-icon>\r\n </button>\r\n\r\n <box [width]=\"1\"></box>\r\n <span class=\"divider\"></span>\r\n <box [width]=\"1\"></box>\r\n\r\n <button nz-button nzSize=\"small\" nz-tooltip=\"Template setting\" (click)=\"drawTemplateVisibel = true\">\r\n <nz-icon nzType=\"setting\"></nz-icon> T\r\n </button>\r\n\r\n <box [width]=\"1\"></box>\r\n <span class=\"divider\"></span>\r\n <box [width]=\"1\"></box>\r\n\r\n <button nz-button nzSize=\"small\" nzDanger [nzLoading]=\"!ready\" nz-tooltip=\"Save (Ctrl + S)\" (click)=\"save()\">\r\n <nz-icon nzType=\"save\"></nz-icon>\r\n </button>\r\n <button nz-button nzSize=\"small\" nz-tooltip=\"Add stage\" (click)=\"addStage()\">\r\n <nz-icon nzType=\"plus\" class=\"color-primary\"></nz-icon>\r\n </button>\r\n\r\n <box [width]=\"1\"></box>\r\n <span class=\"divider\"></span>\r\n <box [width]=\"1\"></box>\r\n\r\n <button\r\n nz-button\r\n nzSize=\"small\"\r\n [nzType]=\"isMoveMode ? 'primary' : 'default'\"\r\n nz-tooltip=\"Move mode\"\r\n (click)=\"isMoveMode = true\"\r\n >\r\n <nz-icon><img src=\"/assets/icon/hand-palm.png\" width=\"19\" height=\"19\" /></nz-icon>\r\n </button>\r\n <button\r\n nz-button\r\n nzSize=\"small\"\r\n [nzType]=\"!isMoveMode ? 'primary' : 'default'\"\r\n nz-tooltip=\"Select mode\"\r\n (click)=\"isMoveMode = false\"\r\n >\r\n <nz-icon><img src=\"/assets/icon/cursor.png\" width=\"19\" height=\"19\" /></nz-icon>\r\n </button>\r\n\r\n <box [width]=\"1\"></box>\r\n <span class=\"divider\"></span>\r\n <box [width]=\"1\"></box>\r\n\r\n <!-- UNDO / REDO -->\r\n <button\r\n nz-button\r\n nzSize=\"small\"\r\n nzType=\"default\"\r\n [disabled]=\"undoStack.length === 0\"\r\n nz-tooltip=\"Undo\"\r\n (click)=\"undo()\"\r\n >\r\n <nz-icon nzType=\"undo\"></nz-icon>\r\n </button>\r\n\r\n <button\r\n nz-button\r\n nzSize=\"small\"\r\n nzType=\"default\"\r\n [disabled]=\"redoStack.length === 0\"\r\n nz-tooltip=\"Redo\"\r\n (click)=\"redo()\"\r\n >\r\n <nz-icon nzType=\"redo\"></nz-icon>\r\n </button>\r\n\r\n <box [width]=\"1\"></box>\r\n <span class=\"divider\"></span>\r\n <box [width]=\"1\"></box>\r\n\r\n <!-- ALIGN -->\r\n <button nz-button nzSize=\"small\" [disabled]=\"lstSelectedStageId.size < 2\" (click)=\"alignLeft()\">⟸</button>\r\n <button nz-button nzSize=\"small\" [disabled]=\"lstSelectedStageId.size < 2\" (click)=\"alignCenter()\">≡</button>\r\n <button nz-button nzSize=\"small\" [disabled]=\"lstSelectedStageId.size < 2\" (click)=\"alignRight()\">⟹</button>\r\n\r\n <span class=\"divider\"></span>\r\n\r\n <button nz-button nzSize=\"small\" [disabled]=\"lstSelectedStageId.size < 2\" (click)=\"alignTop()\">⇑</button>\r\n <button nz-button nzSize=\"small\" [disabled]=\"lstSelectedStageId.size < 2\" (click)=\"alignMiddle()\">═</button>\r\n <button nz-button nzSize=\"small\" [disabled]=\"lstSelectedStageId.size < 2\" (click)=\"alignBottom()\">⇓</button>\r\n\r\n <span class=\"divider\"></span>\r\n\r\n <!-- DISTRIBUTE -->\r\n <button nz-button nzSize=\"small\" [disabled]=\"lstSelectedStageId.size < 3\" (click)=\"distributeHorizontal()\">\r\n ⇄\r\n </button>\r\n <button nz-button nzSize=\"small\" [disabled]=\"lstSelectedStageId.size < 3\" (click)=\"distributeVertical()\">⇅</button>\r\n </div>\r\n\r\n <div\r\n class=\"canvas-content\"\r\n [class.panning]=\"isMoveMode\"\r\n [style.transform]=\"'translate(' + template.editorOption.panX + 'px,' + template.editorOption.panY + 'px)'\"\r\n >\r\n <!-- GRID -->\r\n <div *ngIf=\"wfcSetting.ShowGrid\" class=\"grid-layer\"></div>\r\n\r\n <!-- <div class=\"zoom-toolbar\">\r\n <button nz-button nzSize=\"small\" (click)=\"zoomOut()\">−</button>\r\n <span>{{ zoom * 100 | number: \"1.0-0\" }}%</span>\r\n <button nz-button nzSize=\"small\" (click)=\"zoomIn()\">+</button>\r\n </div> -->\r\n\r\n <!-- SVG EDGES -->\r\n <svg #svg class=\"edges-layer\" width=\"100%\" height=\"100%\" preserveAspectRatio=\"none\">\r\n <g [attr.transform]=\"svgTransform\">\r\n <!-- DEFS -->\r\n <defs>\r\n <!-- glow effect -->\r\n <filter id=\"edge-glow\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\">\r\n <feGaussianBlur stdDeviation=\"2\" result=\"blur\" />\r\n <feMerge>\r\n <feMergeNode in=\"blur\" />\r\n <feMergeNode in=\"SourceGraphic\" />\r\n </feMerge>\r\n </filter>\r\n\r\n <!-- arrow markers -->\r\n <marker\r\n id=\"arrow-blue\"\r\n markerWidth=\"10\"\r\n markerHeight=\"10\"\r\n refX=\"10\"\r\n refY=\"5\"\r\n orient=\"auto\"\r\n markerUnits=\"strokeWidth\"\r\n >\r\n <path class=\"blue\" d=\"M0,0 L10,5 L0,10\"></path>\r\n </marker>\r\n\r\n <marker\r\n id=\"arrow-red\"\r\n markerWidth=\"10\"\r\n markerHeight=\"10\"\r\n refX=\"10\"\r\n refY=\"5\"\r\n orient=\"auto\"\r\n markerUnits=\"strokeWidth\"\r\n >\r\n <path class=\"red\" d=\"M0,0 L10,5 L0,10\"></path>\r\n </marker>\r\n\r\n <marker\r\n id=\"arrow-blue-start\"\r\n markerWidth=\"10\"\r\n markerHeight=\"10\"\r\n viewBox=\"0 0 10 10\"\r\n refX=\"0\"\r\n refY=\"5\"\r\n orient=\"auto\"\r\n markerUnits=\"strokeWidth\"\r\n >\r\n <path class=\"blue\" d=\"M10,0 L0,5 L10,10\"></path>\r\n </marker>\r\n\r\n <marker\r\n id=\"arrow-red-start\"\r\n markerWidth=\"10\"\r\n markerHeight=\"10\"\r\n viewBox=\"0 0 10 10\"\r\n refX=\"0\"\r\n refY=\"5\"\r\n orient=\"auto\"\r\n markerUnits=\"strokeWidth\"\r\n >\r\n <path class=\"red\" d=\"M10,0 L0,5 L10,10\"></path>\r\n </marker>\r\n </defs>\r\n\r\n <!-- EDGES BÌNH THƯỜNG -->\r\n <ng-container *ngFor=\"let e of normalEdges; let i = index\">\r\n <path\r\n class=\"edge\"\r\n [attr.id]=\"'edge-path-' + i\"\r\n [attr.d]=\"buildPath(e)\"\r\n marker-end=\"url(#arrow-blue)\"\r\n [attr.marker-start]=\"e.allowBack ? 'url(#arrow-blue-start)' : ''\"\r\n ></path>\r\n\r\n <path\r\n class=\"edge-hit\"\r\n [attr.d]=\"buildPath(e)\"\r\n (mouseenter)=\"onMouseEnterEdge(e)\"\r\n (mouseleave)=\"onMouseLeaveEdge(e)\"\r\n (click)=\"onClickEdge(e, $event)\"\r\n ></path>\r\n\r\n <!-- LABEL -->\r\n <!-- text bám theo line -->\r\n <!-- \r\n <text *ngIf=\"e.ActionText\" class=\"edge-label\" dy=\"-6\">\r\n <textPath [attr.href]=\"'#edge-path-' + i\" startOffset=\"50%\" text-anchor=\"middle\">\r\n {{ e.ActionText }}\r\n </textPath>\r\n </text> \r\n \r\n <text *ngIf=\"e.allowBack && e.labelBack\" class=\"edge-label\" dy=\"14\">\r\n <textPath [attr.href]=\"'#edge-path-' + i\" startOffset=\"50%\" text-anchor=\"middle\">\r\n {{ e.labelBack }}\r\n </textPath>\r\n </text>\r\n -->\r\n\r\n <!-- text thẳng nằm ngang -->\r\n <text\r\n *ngIf=\"e.ActionText\"\r\n class=\"edge-label\"\r\n [attr.x]=\"getEdgeLabelPosition(e).x\"\r\n [attr.y]=\"getEdgeLabelPosition(e).y - 8\"\r\n [attr.text-anchor]=\"'middle'\"\r\n >\r\n {{ e.ActionText }}\r\n </text>\r\n\r\n <text\r\n *ngIf=\"e.allowBack && e.labelBack\"\r\n class=\"edge-label\"\r\n [attr.x]=\"getEdgeLabelPosition(e).x\"\r\n [attr.y]=\"getEdgeLabelPosition(e).y + 14\"\r\n [attr.text-anchor]=\"'middle'\"\r\n >\r\n {{ e.labelBack }}\r\n </text>\r\n </ng-container>\r\n\r\n <!-- EDGE ĐANG HOVER (LUÔN TRÊN CÙNG) -->\r\n <ng-container *ngFor=\"let e of hoverEdges; let i = index\">\r\n <path\r\n class=\"edge red\"\r\n [attr.id]=\"'edge-path-hover-' + i\"\r\n [attr.d]=\"buildPath(e)\"\r\n marker-end=\"url(#arrow-red)\"\r\n [attr.marker-start]=\"e.allowBack ? 'url(#arrow-red-start)' : ''\"\r\n ></path>\r\n\r\n <path\r\n class=\"edge-hit\"\r\n [attr.d]=\"buildPath(e)\"\r\n (mouseleave)=\"onMouseLeaveEdge(e)\"\r\n (click)=\"onClickEdge(e, $event)\"\r\n ></path>\r\n\r\n <!-- LABEL -->\r\n <!-- <text *ngIf=\"e.ActionText\" class=\"edge-label\" dy=\"-6\">\r\n <textPath [attr.href]=\"'#edge-path-hover-' + i\" startOffset=\"50%\" text-anchor=\"middle\">\r\n {{ e.ActionText }}\r\n </textPath>\r\n </text>\r\n\r\n <text *ngIf=\"e.allowBack && e.labelBack\" class=\"edge-label\" dy=\"14\">\r\n <textPath [attr.href]=\"'#edge-path-hover-' + i\" startOffset=\"50%\" text-anchor=\"middle\">\r\n {{ e.labelBack }}\r\n </textPath>\r\n </text> -->\r\n\r\n <text\r\n *ngIf=\"e.ActionText\"\r\n class=\"edge-label\"\r\n [attr.x]=\"getEdgeLabelPosition(e).x\"\r\n [attr.y]=\"getEdgeLabelPosition(e).y - 8\"\r\n [attr.text-anchor]=\"'middle'\"\r\n >\r\n {{ e.ActionText }}\r\n </text>\r\n\r\n <text\r\n *ngIf=\"e.allowBack && e.labelBack\"\r\n class=\"edge-label\"\r\n [attr.x]=\"getEdgeLabelPosition(e).x\"\r\n [attr.y]=\"getEdgeLabelPosition(e).y + 14\"\r\n [attr.text-anchor]=\"'middle'\"\r\n >\r\n {{ e.labelBack }}\r\n </text>\r\n </ng-container>\r\n\r\n <!-- preview -->\r\n <path\r\n *ngIf=\"connectingFrom\"\r\n class=\"edge\"\r\n [attr.d]=\"buildPreviewPath()\"\r\n stroke-dasharray=\"5,5\"\r\n marker-end=\"url(#arrow-blue)\"\r\n ></path>\r\n </g>\r\n </svg>\r\n\r\n <div\r\n *ngIf=\"isSelecting && selectStart && selectEnd\"\r\n class=\"selection-box\"\r\n [style.left.px]=\"Math.min(selectStart.x, selectEnd.x)\"\r\n [style.top.px]=\"Math.min(selectStart.y, selectEnd.y)\"\r\n [style.width.px]=\"Math.abs(selectEnd.x - selectStart.x)\"\r\n [style.height.px]=\"Math.abs(selectEnd.y - selectStart.y)\"\r\n ></div>\r\n\r\n <!-- lstStage -->\r\n @for (n of lstStage; track $index) {\r\n <!-- START NODE -->\r\n @if (n.StageType === \"_start_\") {\r\n <nz-card\r\n class=\"workflow-node workflow-node-start\"\r\n [attr.data-id]=\"n.Code\"\r\n [class.selected]=\"n == selectedStage || n == hoverStage || lstSelectedStageId.has(n.WF_TemplateStage_Id)\"\r\n [style.left.px]=\"n.editorOption.x\"\r\n [style.top.px]=\"n.editorOption.y\"\r\n [class.connecting-source]=\"isConnectingFrom(n) || isDraggingFrom(n) || isSelectedNode(n)\"\r\n nzSize=\"small\"\r\n (mousedown)=\"onMouseDownNode($event, n)\"\r\n (click)=\"$event.stopPropagation(); onClickStage(n)\"\r\n >\r\n <nz-tag [nzColor]=\"'green'\"> START </nz-tag>\r\n\r\n @if (!n.editorOption.isReverse) {\r\n <!-- connector RIGHT: output -->\r\n <div class=\"connector connector-right connector-start\" (click)=\"onClickConnector($event, n, 'right')\"></div>\r\n } @else {\r\n <div\r\n class=\"connector connector-right connector-start reverse\"\r\n (click)=\"onClickConnector($event, n, 'right')\"\r\n ></div>\r\n }\r\n </nz-card>\r\n }\r\n <!-- END NODE -->\r\n @else if (n.StageType === \"_end_\") {\r\n <nz-card\r\n class=\"workflow-node workflow-node-end\"\r\n [attr.data-id]=\"n.Code\"\r\n [class.selected]=\"n == selectedStage || n == hoverStage || lstSelectedStageId.has(n.WF_TemplateStage_Id)\"\r\n [style.left.px]=\"n.editorOption.x\"\r\n [style.top.px]=\"n.editorOption.y\"\r\n [class.connecting-source]=\"isConnectingFrom(n) || isDraggingFrom(n) || isSelectedNode(n)\"\r\n nzSize=\"small\"\r\n (mousedown)=\"onMouseDownNode($event, n)\"\r\n (click)=\"$event.stopPropagation(); onClickStage(n)\"\r\n >\r\n <nz-tag [nzColor]=\"'red'\"> END </nz-tag>\r\n\r\n @if (!n.editorOption.isReverse) {\r\n <!-- connector LEFT: input -->\r\n <div class=\"connector connector-left connector-end\" (click)=\"onClickConnector($event, n, 'left')\"></div>\r\n } @else {\r\n <div\r\n class=\"connector connector-left connector-end reverse\"\r\n (click)=\"onClickConnector($event, n, 'left')\"\r\n ></div>\r\n }\r\n </nz-card>\r\n } @else {\r\n <nz-card\r\n class=\"workflow-node\"\r\n [attr.data-id]=\"n.Code\"\r\n [class.selected]=\"n == selectedStage || n == hoverStage || lstSelectedStageId.has(n.WF_TemplateStage_Id)\"\r\n [style.left.px]=\"n.editorOption.x\"\r\n [style.top.px]=\"n.editorOption.y\"\r\n [class.connecting-source]=\"isConnectingFrom(n) || isDraggingFrom(n) || isSelectedNode(n)\"\r\n nzSize=\"small\"\r\n (mousedown)=\"onMouseDownNode($event, n)\"\r\n (click)=\"$event.stopPropagation(); onClickStage(n)\"\r\n >\r\n <div class=\"title\">{{ n.Code }}</div>\r\n\r\n <div>{{ n.Name }}</div>\r\n\r\n @if (!n.editorOption.isReverse) {\r\n <!-- connector RIGHT: output -->\r\n <div class=\"connector connector-right\" (click)=\"onClickConnector($event, n, 'right')\"></div>\r\n\r\n <!-- connector LEFT: input -->\r\n <div class=\"connector connector-left\" (click)=\"onClickConnector($event, n, 'left')\"></div>\r\n } @else {\r\n <div class=\"connector connector-right reverse\" (click)=\"onClickConnector($event, n, 'right')\"></div>\r\n <div class=\"connector connector-left reverse\" (click)=\"onClickConnector($event, n, 'left')\"></div>\r\n }\r\n </nz-card>\r\n }\r\n }\r\n\r\n <!-- POINTS -->\r\n @for (p of connectingPoints; track $index) {\r\n @if (p != draggingPoint) {\r\n <div\r\n class=\"waypoint\"\r\n [style.left.px]=\"p.x\"\r\n [style.top.px]=\"p.y\"\r\n (mousedown)=\"onmousedownPoint($event, p)\"\r\n (contextmenu)=\"onRightClickPoint($event, hoverAction!, $index)\"\r\n ></div>\r\n } @else {\r\n <div\r\n class=\"waypoint dragging\"\r\n [style.left.px]=\"p.x\"\r\n [style.top.px]=\"p.y\"\r\n (mousedown)=\"onmousedownPoint($event, p)\"\r\n ></div>\r\n }\r\n }\r\n </div>\r\n</div>\r\n\r\n<!-- drawer TEMPLATE -->\r\n<nz-drawer\r\n [nzTitle]=\"drawTemplateTitle\"\r\n nzPlacement=\"right\"\r\n [nzWidth]=\"500\"\r\n [nzClosable]=\"false\"\r\n [nzVisible]=\"drawTemplateVisibel\"\r\n [nzFooter]=\"footerTplTemplate\"\r\n (nzOnClose)=\"drawTemplateVisibel = false\"\r\n>\r\n <ng-template #drawTemplateTitle> <nz-icon nzType=\"setting\"></nz-icon> &nbsp; Template </ng-template>\r\n <ng-container *nzDrawerContent>\r\n <extend-select\r\n [label]=\"'Org'\"\r\n [lstItem]=\"lstOrg\"\r\n [valueField]=\"'App_Org_Id'\"\r\n [displayFields]=\"['Name', 'Code']\"\r\n [(_ngModel)]=\"template.App_Org_Id\"\r\n ></extend-select>\r\n <extend-input [label]=\"'Code'\" [(_ngModel)]=\"template.Code\"></extend-input>\r\n <extend-input [label]=\"'Name'\" [(_ngModel)]=\"template.Name\"></extend-input>\r\n <extend-select\r\n [label]=\"'Type'\"\r\n [lstItem]=\"template.lstTemplateType\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"template.DocType\"\r\n ></extend-select>\r\n <extend-textarea [label]=\"'Desscription'\" [(_ngModel)]=\"template.Description\"></extend-textarea>\r\n <extend-select\r\n [label]=\"'Print template'\"\r\n [lstItem]=\"template.lstTemplatePrint\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"template.TemplatePrint\"\r\n ></extend-select>\r\n <extend-select\r\n [label]=\"'Apply to'\"\r\n [lstItem]=\"template.lstApplyTo\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"template.ApplyTo\"\r\n ></extend-select>\r\n\r\n <extend-checkbox [label]=\"'Active'\" [(_ngModel)]=\"template.IsActive\"></extend-checkbox>\r\n <extend-checkbox [label]=\"'Use Allow back'\" [(_ngModel)]=\"template.editorOption.AllowbackInUse\"></extend-checkbox>\r\n\r\n <h3 nz-col><nz-icon nzType=\"send\" nzTheme=\"outline\" />&nbsp;Stage</h3>\r\n\r\n <div nz-row [nzGutter]=\"[0, 5]\">\r\n @for (tag of getLstStage; track tag) {\r\n <div nz-col>\r\n <nz-tag (click)=\"hoverStage = tag\">\r\n {{ sliceTagName(tag.Code + (tag.Name ? \" - \" + tag.Name : \"\")) }}\r\n </nz-tag>\r\n </div>\r\n }\r\n </div>\r\n\r\n <box [height]=\"16\"></box>\r\n\r\n <h3 nz-col><nz-icon nzType=\"send\" nzTheme=\"outline\" />&nbsp;Stage status</h3>\r\n\r\n <div nz-row [nzGutter]=\"[0, 5]\">\r\n @for (tag of template.lstStageStatus; track tag) {\r\n <div nz-col>\r\n <nz-tag\r\n [nzMode]=\"checkRemoveableStageStatus(tag) ? 'closeable' : 'default'\"\r\n (nzOnClose)=\"handleCloseStageStatus(tag)\"\r\n >\r\n {{ sliceTagName(tag.Code + (tag.Name ? \" - \" + tag.Name : \"\")) }}\r\n </nz-tag>\r\n </div>\r\n }\r\n\r\n <div nz-col>\r\n @if (!inputStageStatusVisible) {\r\n <nz-tag class=\"editable-tag\" nzNoAnimation (click)=\"showInputStageStatus()\">\r\n <nz-icon nzType=\"plus\" />\r\n New Action type\r\n </nz-tag>\r\n } @else {\r\n <input\r\n #inputStageStatusElement\r\n nz-input\r\n nzSize=\"small\"\r\n type=\"text\"\r\n style=\"width: 150px\"\r\n placeholder=\"Code\"\r\n [(ngModel)]=\"inputStageStatusCode\"\r\n (keydown.enter)=\"inputStageStatusNameElement.select()\"\r\n />\r\n <input\r\n #inputStageStatusNameElement\r\n nz-input\r\n nzSize=\"small\"\r\n type=\"text\"\r\n style=\"width: 150px\"\r\n placeholder=\"Name\"\r\n [(ngModel)]=\"inputStageStatusName\"\r\n (blur)=\"handleInputStageStatusConfirm()\"\r\n (keydown.enter)=\"handleInputStageStatusConfirm()\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n\r\n <box [height]=\"16\"></box>\r\n\r\n <h3 nz-col><nz-icon nzType=\"send\" nzTheme=\"outline\" />&nbsp;Action type</h3>\r\n\r\n <div nz-row [nzGutter]=\"[0, 5]\">\r\n @for (tag of template.lstActionType; track tag) {\r\n <div nz-col>\r\n <nz-tag\r\n [nzMode]=\"checkRemoveableActionType(tag) ? 'closeable' : 'default'\"\r\n (nzOnClose)=\"handleCloseActionType(tag)\"\r\n >\r\n {{ sliceTagName(tag.Code + (tag.Name ? \" - \" + tag.Name : \"\")) }}\r\n </nz-tag>\r\n </div>\r\n }\r\n\r\n <div nz-col>\r\n @if (!inputActionTypeVisible) {\r\n <nz-tag class=\"editable-tag\" nzNoAnimation (click)=\"showInputActionType()\">\r\n <nz-icon nzType=\"plus\" />\r\n New Action type\r\n </nz-tag>\r\n } @else {\r\n <input\r\n #inputActionTypeElement\r\n nz-input\r\n nzSize=\"small\"\r\n type=\"text\"\r\n style=\"width: 150px\"\r\n placeholder=\"Code\"\r\n [(ngModel)]=\"inputActionTypeCode\"\r\n (keydown.enter)=\"inputActionTypeNameElement.select()\"\r\n />\r\n <input\r\n #inputActionTypeNameElement\r\n nz-input\r\n nzSize=\"small\"\r\n type=\"text\"\r\n style=\"width: 150px\"\r\n placeholder=\"Name\"\r\n [(ngModel)]=\"inputActionTypeName\"\r\n (blur)=\"handleInputActionTypeConfirm()\"\r\n (keydown.enter)=\"handleInputActionTypeConfirm()\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n\r\n <box [height]=\"16\"></box>\r\n\r\n <h3 nz-col><nz-icon nzType=\"send\" nzTheme=\"outline\" />&nbsp;Action status</h3>\r\n\r\n <div nz-row [nzGutter]=\"[0, 5]\">\r\n @for (tag of template.lstActionStatus; track tag) {\r\n <div nz-col>\r\n @if (template.editingActionStatus != tag) {\r\n <nz-tag\r\n [nzMode]=\"checkRemoveableActionStatus(tag.Code) ? 'closeable' : 'default'\"\r\n (nzOnClose)=\"handleClose(tag.Code)\"\r\n (click)=\"template.editingActionStatus = checkRemoveableActionStatus(tag.Code) ? tag : undefined\"\r\n >\r\n {{ sliceTagName(tag.Code + (tag.Name ? \" - \" + tag.Name : \"\")) }}\r\n </nz-tag>\r\n } @else {\r\n <input\r\n nz-input\r\n nzSize=\"small\"\r\n type=\"text\"\r\n style=\"width: 150px\"\r\n [appAutoFocus]=\"true\"\r\n [(ngModel)]=\"tag.Code\"\r\n (blur)=\"template.editingActionStatus = undefined\"\r\n (keydown.enter)=\"template.editingActionStatus = undefined\"\r\n />&nbsp;&nbsp;\r\n }\r\n </div>\r\n }\r\n\r\n <div nz-col>\r\n @if (!inputVisible) {\r\n <nz-tag class=\"editable-tag\" nzNoAnimation (click)=\"showInput()\">\r\n <nz-icon nzType=\"plus\" />\r\n New Action status\r\n </nz-tag>\r\n } @else {\r\n <input\r\n #inputElement\r\n nz-input\r\n nzSize=\"small\"\r\n type=\"text\"\r\n style=\"width: 150px\"\r\n placeholder=\"+ New Action status\"\r\n [(ngModel)]=\"inputValue\"\r\n (blur)=\"handleInputConfirm()\"\r\n (keydown.enter)=\"handleInputConfirm()\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #footerTplTemplate>\r\n <div nz-flex [nzGap]=\"6\" [nzJustify]=\"'end'\">\r\n <button nz-button nzDanger [nzLoading]=\"!ready\" (click)=\"save()\">Save</button>\r\n <button nz-button (click)=\"drawTemplateVisibel = false\">Close</button>\r\n </div>\r\n </ng-template>\r\n</nz-drawer>\r\n\r\n<!-- drawer STAGE -->\r\n<nz-drawer\r\n [nzTitle]=\"drawerTitleStage\"\r\n [nzPlacement]=\"selectedStage?.editorOption?.drawerPosition == 'left' ? 'left' : 'right'\"\r\n [nzVisible]=\"!!selectedStage\"\r\n [nzWidth]=\"'calc(50vw)'\"\r\n [nzClosable]=\"false\"\r\n [nzFooter]=\"footerTplNode\"\r\n (nzOnClose)=\"selectedStage = undefined\"\r\n>\r\n <ng-template #drawerTitleStage>\r\n <div nz-row nzJustify=\"space-between\">\r\n @if (selectedStage && selectedStage.editorOption) {\r\n @if (selectedStage.editorOption.drawerPosition == \"left\") {\r\n <button\r\n nz-button\r\n nzSize=\"small\"\r\n nz-tooltip=\"To the right\"\r\n (click)=\"selectedStage.editorOption.drawerPosition = 'right'\"\r\n >\r\n <nz-icon nzType=\"double-right\"></nz-icon>\r\n </button>\r\n STAGE\r\n } @else {\r\n STAGE\r\n <button\r\n nz-button\r\n nzSize=\"small\"\r\n nz-tooltip=\"To the left\"\r\n (click)=\"selectedStage.editorOption.drawerPosition = 'left'\"\r\n >\r\n <nz-icon nzType=\"double-left\"></nz-icon>\r\n </button>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n <ng-container *nzDrawerContent>\r\n <ng-container *ngIf=\"selectedStage\">\r\n <nz-radio-group [(ngModel)]=\"selectedStage.StageType\">\r\n <label nz-radio nzValue=\"_start_\">UI start</label>\r\n <label nz-radio nzValue=\"_end_\">UI end</label>\r\n <label nz-radio nzValue=\"start\">START</label>\r\n <label nz-radio nzValue=\"node\">NODE</label>\r\n <label nz-radio nzValue=\"end\">END</label>\r\n </nz-radio-group>\r\n\r\n <box [height]=\"16\"></box>\r\n\r\n <div nz-row [nzGutter]=\"32\" class=\"form-item-no-bottom\">\r\n <extend-input\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Code'\"\r\n [floatingLabel]=\"true\"\r\n [required]=\"true\"\r\n [(_ngModel)]=\"selectedStage.Code\"\r\n ></extend-input>\r\n\r\n <extend-input\r\n nz-col\r\n [nzSpan]=\"16\"\r\n [label]=\"'Name'\"\r\n [floatingLabel]=\"true\"\r\n [required]=\"true\"\r\n [(_ngModel)]=\"selectedStage.Name\"\r\n ></extend-input>\r\n </div>\r\n\r\n <div nz-row [nzGutter]=\"32\" class=\"form-item-no-bottom\">\r\n <extend-input-number\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Sequence'\"\r\n [floatingLabel]=\"true\"\r\n [(_ngModel)]=\"selectedStage.SeqValue\"\r\n ></extend-input-number>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"16\"\r\n [label]=\"'Org implement'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"lstOrg\"\r\n [valueField]=\"'App_Org_Id'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"selectedStage.App_Org_Id\"\r\n ></extend-select>\r\n </div>\r\n\r\n <div nz-row [nzGutter]=\"32\" class=\"form-item-no-bottom\">\r\n <extend-input-number\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Number Day'\"\r\n [floatingLabel]=\"true\"\r\n [precision]=\"1\"\r\n [(_ngModel)]=\"selectedStage.NumberDay\"\r\n ></extend-input-number>\r\n </div>\r\n\r\n @if (selectedStage.editorOption) {\r\n @if ([\"start\", \"node\", \"end\"].includes(selectedStage.StageType.toLowerCase())) {\r\n <extend-checkbox\r\n [label]=\"'Reverse'\"\r\n [labelSpan]=\"0\"\r\n [(_ngModel)]=\"selectedStage.editorOption.isReverse\"\r\n ></extend-checkbox>\r\n }\r\n\r\n <extend-checkbox\r\n [label]=\"'Require user action'\"\r\n [labelSpan]=\"0\"\r\n [(_ngModel)]=\"selectedStage.IsRequireUser\"\r\n ></extend-checkbox>\r\n }\r\n\r\n <box [height]=\"16\"></box>\r\n\r\n <div nz-row [nzGutter]=\"16\">\r\n <h3 nz-col><nz-icon nzType=\"send\" nzTheme=\"outline\" />&nbsp;List Action</h3>\r\n <div nz-col>\r\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"addAction()\">\r\n <nz-icon nzType=\"plus\"></nz-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <nz-table nzSize=\"small\" [nzData]=\"lstActionOfCurrentStage\" [nzShowPagination]=\"false\" [nzNoResult]=\"'&nbsp;'\">\r\n <thead>\r\n <tr [hidden]=\"true\">\r\n <th nzWidth=\"40px\"></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (action of lstActionOfCurrentStage; track $index) {\r\n <tr [class.text-bold]=\"action == hoverAction\" (click)=\"onclickaction(action)\">\r\n <td style=\"border-bottom: solid 1px orange\">\r\n ({{ $index + 1 }})\r\n <nz-icon\r\n nzType=\"delete\"\r\n nzTheme=\"outline\"\r\n class=\"color-warn cursor-pointer icon-size-16\"\r\n (click)=\"$event.stopPropagation(); deleteAction(action)\"\r\n ></nz-icon>\r\n </td>\r\n <td style=\"border-bottom: solid 1px orange\">\r\n <div nz-row [nzGutter]=\"16\" class=\"form-item-no-bottom\">\r\n <div nz-col [nzSpan]=\"8\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"24\" style=\"height: 32px\">Action status</nz-form-label>\r\n <nz-form-control [nzSpan]=\"24\">\r\n <nz-input-group class=\"full-width\">\r\n <input\r\n nz-input\r\n [(ngModel)]=\"action.ActionStatus\"\r\n [nzAutocomplete]=\"auto\"\r\n (ngModelChange)=\"nzAutocompletechange($event, template.lstActionStatus)\"\r\n (click)=\"lstActionStatusFiltered = template.lstActionStatus\"\r\n (keyup.enter)=\"onenterAotu(action.ActionStatus)\"\r\n (blur)=\"onenterAotu(action.ActionStatus)\"\r\n />\r\n <nz-autocomplete #auto [compareWith]=\"compareFun\">\r\n @for (option of lstActionStatusFiltered; track $index) {\r\n <nz-auto-option [nzValue]=\"option.Code\" [nzLabel]=\"option.Code\">\r\n {{ option.Code }}\r\n <icon-delete\r\n *ngIf=\"checkRemoveableActionStatus(option.Code)\"\r\n style=\"float: right\"\r\n [size]=\"12\"\r\n (click)=\"handleClose(option.Code)\"\r\n ></icon-delete>\r\n </nz-auto-option>\r\n }\r\n </nz-autocomplete>\r\n </nz-input-group>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n\r\n <extend-input\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Action text'\"\r\n [floatingLabel]=\"true\"\r\n [(_ngModel)]=\"action.ActionText\"\r\n (_ngModelChange)=\"onchangeActionText(action)\"\r\n ></extend-input>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Action type'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstActionType\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"action.ActionType\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Stage status'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstStageStatus\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"action.StageStatus\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Next stage'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"getlstStage\"\r\n [valueField]=\"'WF_TemplateStage_Id'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"action.To_WF_TemplateStage_Id\"\r\n (_ngModelChange)=\"onchangeNextStage(action)\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Next stage status'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstStageStatus\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"action.To_StageStatus\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Process status'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstProcessStatus\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"action.DocProcessStatus\"\r\n ></extend-select>\r\n </div>\r\n <box [height]=\"8\"></box>\r\n <div nz-row>Role</div>\r\n <div nz-row>\r\n <extend-select\r\n nz-col\r\n nzSpan=\"24\"\r\n [size]=\"'small'\"\r\n [lstItem]=\"lstRole\"\r\n [valueField]=\"'App_Role_Id'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [multiple]=\"true\"\r\n [(_ngModel)]=\"action._lstRoleId\"\r\n (_ngModelChange)=\"onselectedRoleEmail(action)\"\r\n ></extend-select>\r\n </div>\r\n <box [height]=\"8\"></box>\r\n <div nz-row>Email action</div>\r\n <div nz-row>\r\n <extend-select\r\n nz-col\r\n nzSpan=\"24\"\r\n [size]=\"'small'\"\r\n [lstItem]=\"lstEmailAction\"\r\n [valueField]=\"'ID'\"\r\n [displayField]=\"'Name'\"\r\n [multiple]=\"true\"\r\n [(_ngModel)]=\"action._lstEmailActionId\"\r\n (_ngModelChange)=\"onselectedRoleEmail(action)\"\r\n ></extend-select>\r\n </div>\r\n <box [height]=\"8\"></box>\r\n <div *ngIf=\"action._lstEmailActionId && action._lstEmailActionId.length\" nz-row>Email template</div>\r\n <div *ngIf=\"action._lstEmailActionId && action._lstEmailActionId.length\" nz-row>\r\n <div nz-col nzSpan=\"1\"></div>\r\n <div nz-col nzSpan=\"23\" class=\"form-item-no-bottom\" style=\"font-weight: normal\">\r\n @for (actionRef of lstActionRefOf(action); track $index) {\r\n <div nz-row>\r\n <extend-select\r\n nz-col\r\n nzSpan=\"24\"\r\n [labelSpan]=\"12\"\r\n [size]=\"'small'\"\r\n [label]=\"emailActionText(actionRef.To_WF_TemplateStageAction_Id)\"\r\n [lstItem]=\"lstEmailTemplate\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"actionRef.TemplateMail\"\r\n ></extend-select>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <box [height]=\"8\"></box>\r\n <div nz-row [nzGutter]=\"8\">\r\n Action rule\r\n <button nz-button nzType=\"text\" nzSize=\"small\" (click)=\"actionRuleModalVisible = true\">\r\n <nz-icon nzType=\"export\" nzTheme=\"outline\" class=\"color-primary\" />\r\n </button>\r\n <button\r\n *ngIf=\"action.WF_TransitionsRule_Id\"\r\n nz-button\r\n nzType=\"text\"\r\n nzSize=\"small\"\r\n (click)=\"deleteActionRule(action)\"\r\n >\r\n <nz-icon nzType=\"delete\" nzTheme=\"outline\" class=\"color-warn\" />\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n\r\n <box [height]=\"16\"></box>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #footerTplNode>\r\n <div\r\n nz-flex\r\n [nzGap]=\"6\"\r\n [nzJustify]=\"\r\n selectedStage && selectedStage.editorOption && selectedStage.editorOption.drawerPosition == 'left'\r\n ? 'start'\r\n : 'end'\r\n \"\r\n >\r\n <button nz-button nzDanger nzDanger [nzLoading]=\"!ready\" (click)=\"save()\">Save</button>\r\n <button nz-button (click)=\"selectedStage = undefined\">Close</button>\r\n <button\r\n *ngIf=\"selectedStage && ['START', 'END'].indexOf(selectedStage.StageType) < 0\"\r\n nz-button\r\n nzDanger\r\n (click)=\"deleteStage()\"\r\n >\r\n Delete\r\n </button>\r\n </div>\r\n </ng-template>\r\n</nz-drawer>\r\n\r\n<!-- drawer ACTION -->\r\n<nz-drawer\r\n [nzTitle]=\"drawerTitleAction\"\r\n nzTitle=\"ACTION\"\r\n [nzPlacement]=\"selectedAction?.editorOption?.drawerPosition == 'left' ? 'left' : 'right'\"\r\n [nzClosable]=\"false\"\r\n [nzWidth]=\"750\"\r\n [nzVisible]=\"!!selectedAction\"\r\n [nzFooter]=\"footerTplAction\"\r\n (nzOnClose)=\"selectedAction = undefined\"\r\n>\r\n <ng-template #drawerTitleAction>\r\n <div nz-row nzJustify=\"space-between\">\r\n @if (selectedAction && selectedAction.editorOption) {\r\n @if (selectedAction.editorOption.drawerPosition == \"left\") {\r\n <button\r\n nz-button\r\n nzSize=\"small\"\r\n nz-tooltip=\"To the right\"\r\n (click)=\"selectedAction.editorOption.drawerPosition = 'right'\"\r\n >\r\n <nz-icon nzType=\"double-right\"></nz-icon>\r\n </button>\r\n ACTION\r\n } @else {\r\n ACTION\r\n <button\r\n nz-button\r\n nzSize=\"small\"\r\n nz-tooltip=\"To the left\"\r\n (click)=\"selectedAction.editorOption.drawerPosition = 'left'\"\r\n >\r\n <nz-icon nzType=\"double-left\"></nz-icon>\r\n </button>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n <ng-container *nzDrawerContent>\r\n <ng-container *ngIf=\"selectedAction\">\r\n <div>\r\n <strong\r\n >{{ selectedAction.getFromStageCode(lstStage) }} -> {{ selectedAction.getToStageCode(lstStage) }}</strong\r\n >\r\n </div>\r\n <div>{{ selectedAction.getFromStageName(lstStage) }} -> {{ selectedAction.getToStageName(lstStage) }}</div>\r\n\r\n <box [height]=\"16\"></box>\r\n\r\n <div nz-row [nzGutter]=\"16\" class=\"form-item-no-bottom\">\r\n <div nz-col [nzSpan]=\"8\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"24\" style=\"height: 32px\">Action status</nz-form-label>\r\n <nz-form-control [nzSpan]=\"24\">\r\n <nz-input-group class=\"full-width\">\r\n <input\r\n nz-input\r\n [(ngModel)]=\"selectedAction.ActionStatus\"\r\n [nzAutocomplete]=\"auto\"\r\n (ngModelChange)=\"nzAutocompletechange($event, template.lstActionStatus)\"\r\n (click)=\"lstActionStatusFiltered = template.lstActionStatus\"\r\n (keyup.enter)=\"onenterAotu(selectedAction.ActionStatus)\"\r\n (blur)=\"onenterAotu(selectedAction.ActionStatus)\"\r\n />\r\n <nz-autocomplete #auto [compareWith]=\"compareFun\">\r\n @for (option of lstActionStatusFiltered; track $index) {\r\n <nz-auto-option [nzValue]=\"option.Code\" [nzLabel]=\"option.Code\">\r\n {{ option.Code }}\r\n <icon-delete\r\n *ngIf=\"checkRemoveableActionStatus(option.Code)\"\r\n style=\"float: right\"\r\n [size]=\"12\"\r\n (click)=\"handleClose(option.Code)\"\r\n ></icon-delete>\r\n </nz-auto-option>\r\n }\r\n </nz-autocomplete>\r\n </nz-input-group>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n\r\n <extend-input\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Action text'\"\r\n [floatingLabel]=\"true\"\r\n [(_ngModel)]=\"selectedAction.ActionText\"\r\n (_ngModelChange)=\"onchangeActionText(selectedAction)\"\r\n ></extend-input>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Action type'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstActionType\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"selectedAction.ActionType\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Stage status'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstStageStatus\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"selectedAction.StageStatus\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Next stage'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"lstStage\"\r\n [valueField]=\"'WF_TemplateStage_Id'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"selectedAction.To_WF_TemplateStage_Id\"\r\n (_ngModelChange)=\"onchangeNextStage(selectedAction)\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Next stage status'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstStageStatus\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"selectedAction.To_StageStatus\"\r\n ></extend-select>\r\n </div>\r\n\r\n <!-- <box [height]=\"16\"></box> -->\r\n <nz-divider></nz-divider>\r\n\r\n @if (template.editorOption.AllowbackInUse) {\r\n <extend-checkbox\r\n [label]=\"'Allow back'\"\r\n [labelSpan]=\"0\"\r\n [(_ngModel)]=\"selectedAction.allowBack\"\r\n (_ngModelChange)=\"onchangeAllowBack(selectedAction)\"\r\n ></extend-checkbox>\r\n }\r\n\r\n <box [height]=\"16\"></box>\r\n\r\n @if (selectedAction.allowBack) {\r\n <div>\r\n <strong\r\n >{{ selectedAction.getToStageCode(lstStage) }} -> {{ selectedAction.getFromStageCode(lstStage) }}</strong\r\n >\r\n </div>\r\n <div>{{ selectedAction.getToStageName(lstStage) }} -> {{ selectedAction.getFromStageName(lstStage) }}</div>\r\n\r\n @if (selectedBackAction) {\r\n <div nz-row [nzGutter]=\"16\" class=\"form-item-no-bottom\">\r\n <div nz-col [nzSpan]=\"8\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"24\" style=\"height: 32px\">Action status</nz-form-label>\r\n <nz-form-control [nzSpan]=\"24\">\r\n <nz-input-group class=\"full-width\">\r\n <input\r\n nz-input\r\n [(ngModel)]=\"selectedBackAction.ActionStatus\"\r\n [nzAutocomplete]=\"auto\"\r\n (ngModelChange)=\"nzAutocompletechange($event, template.lstActionStatus)\"\r\n (click)=\"lstActionStatusFiltered = template.lstActionStatus\"\r\n (keyup.enter)=\"onenterAotu(selectedBackAction.ActionStatus)\"\r\n (blur)=\"onenterAotu(selectedBackAction.ActionStatus)\"\r\n />\r\n <nz-autocomplete #auto [compareWith]=\"compareFun\">\r\n @for (option of lstActionStatusFiltered; track $index) {\r\n <nz-auto-option [nzValue]=\"option.Code\" [nzLabel]=\"option.Code\">\r\n {{ option.Code }}\r\n <icon-delete\r\n *ngIf=\"checkRemoveableActionStatus(option.Code)\"\r\n style=\"float: right\"\r\n [size]=\"12\"\r\n (click)=\"handleClose(option.Code)\"\r\n ></icon-delete>\r\n </nz-auto-option>\r\n }\r\n </nz-autocomplete>\r\n </nz-input-group>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n\r\n <extend-input\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Action text'\"\r\n [floatingLabel]=\"true\"\r\n [(_ngModel)]=\"selectedBackAction.ActionText\"\r\n (_ngModelChange)=\"onchangeActionText(selectedBackAction)\"\r\n ></extend-input>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Action type'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstActionType\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"selectedBackAction.ActionType\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Stage status'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstStageStatus\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"selectedBackAction.StageStatus\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Next stage'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"lstStage\"\r\n [valueField]=\"'WF_TemplateStage_Id'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"selectedBackAction.To_WF_TemplateStage_Id\"\r\n (_ngModelChange)=\"onchangeNextStage(selectedBackAction)\"\r\n ></extend-select>\r\n\r\n <extend-select\r\n nz-col\r\n [nzSpan]=\"8\"\r\n [label]=\"'Next stage status'\"\r\n [floatingLabel]=\"true\"\r\n [lstItem]=\"template.lstStageStatus\"\r\n [valueField]=\"'Code'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"selectedBackAction.To_StageStatus\"\r\n ></extend-select>\r\n </div>\r\n }\r\n }\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #footerTplAction>\r\n <div\r\n nz-flex\r\n [nzGap]=\"6\"\r\n [nzJustify]=\"selectedAction && selectedAction.editorOption.drawerPosition == 'left' ? 'start' : 'end'\"\r\n >\r\n <button nz-button nzDanger nzDanger [nzLoading]=\"!ready\" (click)=\"save()\">Save</button>\r\n <button nz-button nzDanger (click)=\"deleteAction(selectedAction!)\">Delete</button>\r\n <button nz-button (click)=\"selectedAction = undefined\">Close</button>\r\n </div>\r\n </ng-template>\r\n</nz-drawer>\r\n\r\n<!-- setting editor -->\r\n<nz-drawer\r\n [nzTitle]=\"drawSettingTitle\"\r\n nzPlacement=\"right\"\r\n [nzClosable]=\"false\"\r\n [nzVisible]=\"settingVisible\"\r\n (nzOnClose)=\"settingVisible = false\"\r\n>\r\n <ng-template #drawSettingTitle> <nz-icon nzType=\"setting\"></nz-icon> &nbsp; Editor </ng-template>\r\n <ng-container *nzDrawerContent>\r\n <div class=\"form-item-no-bottom\">\r\n <extend-checkbox [label]=\"'Show grid'\" [labelSpan]=\"0\" [(_ngModel)]=\"wfcSetting.ShowGrid\"></extend-checkbox>\r\n\r\n <box [height]=\"16\"></box>\r\n </div>\r\n </ng-container>\r\n</nz-drawer>\r\n\r\n<!-- editor infomation -->\r\n<nz-drawer\r\n [nzTitle]=\"drawInfoTitle\"\r\n nzPlacement=\"right\"\r\n [nzClosable]=\"false\"\r\n [nzVisible]=\"infoVisible\"\r\n (nzOnClose)=\"infoVisible = false\"\r\n>\r\n <ng-template #drawInfoTitle> <nz-icon nzType=\"info-circle\"></nz-icon> &nbsp; Infomation </ng-template>\r\n <ng-container *nzDrawerContent>\r\n <p>1. Các thành phần: Stage or Node (stag, node quy trình), Action or Connector (đường nối giữa các stage)</p>\r\n <p>2. Save để load các thông tin: Stage status, Action type</p>\r\n <p>\r\n 3. Nối 2 node (tạo connector tương đương tạo action):\r\n <br />- Click chấm cam từ Node nguồn đến chấm xanh của Node đích (hoặc click vào Node đích), có thể click thành\r\n nhiều điểm để tạo đường nối cong<br />- Khi hover connector chuyển sang mầu đỏ có thể click đúp để thêm một điểm\r\n của connector<br />- Khi hover lên điểm của connector có thể di chuyển điểm đó bằng cách nhấn giữ chuột và kéo thả\r\n đến vị trí mới<br />- Chuột phải vào điểm nối connector để xoá điểm đó\r\n </p>\r\n </ng-container>\r\n</nz-drawer>\r\n\r\n<!-- action rule modal -->\r\n<nz-modal\r\n [(nzVisible)]=\"actionRuleModalVisible\"\r\n [nzMaskClosable]=\"false\"\r\n [nzClosable]=\"false\"\r\n [nzKeyboard]=\"true\"\r\n [nzWidth]=\"'50vw'\"\r\n>\r\n <ng-container *nzModalTitle>\r\n ACTION RULE: [{{ selectedStage?.Code }}] {{ selectedStage?.Name }} > [{{ hoverAction?.ActionStatus }}]\r\n {{ hoverAction?.ActionText }}\r\n </ng-container>\r\n <ng-container *nzModalContent>\r\n @if (hoverAction && hoverAction.actionRule) {\r\n <div nz-row [nzGutter]=\"32\">\r\n <extend-input nz-col nzSpan=\"12\" [label]=\"'Code'\" [(_ngModel)]=\"hoverAction.actionRule.Code\"></extend-input>\r\n <extend-input nz-col nzSpan=\"12\" [label]=\"'Name'\" [(_ngModel)]=\"hoverAction.actionRule.Name\"></extend-input>\r\n <extend-input nz-col nzSpan=\"12\" [label]=\"'Note'\" [(_ngModel)]=\"hoverAction.actionRule.Note\"></extend-input>\r\n <extend-checkbox\r\n nz-col\r\n nzSpan=\"12\"\r\n [label]=\"'IsActive'\"\r\n [(_ngModel)]=\"hoverAction.actionRule.IsActive\"\r\n ></extend-checkbox>\r\n </div>\r\n <div nz-row [nzGutter]=\"16\">\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table nzSize=\"small\" [nzData]=\"hoverAction.actionRule.lstLine\" [nzShowPagination]=\"false\">\r\n <thead>\r\n <tr>\r\n <th [nzWidth]=\"'50px'\"><icon-add (click)=\"addActionRuleLine()\"></icon-add></th>\r\n <th [nzWidth]=\"'25%'\">Template</th>\r\n <th [nzWidth]=\"'25%'\">Template stage</th>\r\n <th [nzWidth]=\"'25%'\">Template action</th>\r\n <th [nzWidth]=\"'50px'\">IsActive</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (item of hoverAction.actionRule.lstLine; track $index) {\r\n <tr>\r\n <td><icon-delete (click)=\"deleteActionRuleLine(hoverAction.actionRule, item)\"></icon-delete></td>\r\n <td>\r\n <extend-select\r\n #xxx\r\n [size]=\"'small'\"\r\n [lstItem]=\"lstTemplateForRule(item)\"\r\n [valueField]=\"'WF_Template_Id'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"item.WF_Template_Id\"\r\n (_ngModelChange)=\"item.WF_TemplateStage_Id = 0; item.WF_TemplateStageAction_Id = 0\"\r\n ></extend-select>\r\n </td>\r\n <td>\r\n <extend-select\r\n #yyy\r\n [size]=\"'small'\"\r\n [lstItem]=\"lstStageForRule(xxx._ngModel)\"\r\n [valueField]=\"'WF_TemplateStage_Id'\"\r\n [displayFields]=\"['Code', 'Name']\"\r\n [(_ngModel)]=\"item.WF_TemplateStage_Id\"\r\n (_ngModelChange)=\"item.WF_TemplateStageAction_Id = 0\"\r\n ></extend-select>\r\n </td>\r\n <td>\r\n <extend-select\r\n [size]=\"'small'\"\r\n [lstItem]=\"lstActionForRule(yyy._ngModel)\"\r\n [valueField]=\"'WF_TemplateStageAction_Id'\"\r\n [displayFields]=\"['ActionStatus', 'ActionText']\"\r\n [(_ngModel)]=\"item.WF_TemplateStageAction_Id\"\r\n ></extend-select>\r\n </td>\r\n <td class=\"text-center\">\r\n <extend-checkbox [(_ngModel)]=\"item.IsActive\"></extend-checkbox>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n }\r\n </ng-container>\r\n <ng-container *nzModalFooter>\r\n <button nz-button nzType=\"primary\" (click)=\"actionRuleModalVisible = false\">OK</button>\r\n </ng-container>\r\n</nz-modal>\r\n","import { CommonModule } from '@angular/common';\nimport { Component, ElementRef, ViewChild, Input, Output, EventEmitter } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\n\n@Component({\n selector: 'expandable-search',\n templateUrl: './expandable-search.component.html',\n styleUrls: ['./expandable-search.component.scss'],\n imports: [CommonModule, FormsModule, NzIconModule],\n})\nexport class ExpandableSearchComponent {\n @ViewChild('searchInput') searchInputRef!: ElementRef<HTMLInputElement>;\n\n isExpanded = false;\n @Input() searchValue: string | null = null;\n @Output() searchValueChange = new EventEmitter();\n\n @Output() onSearch = new EventEmitter();\n\n // Biến lưu trữ bộ đếm thời gian để có thể hủy nó khi cần\n blurTimeout: any;\n\n toggleSearch(): void {\n // Hủy ngay lệnh tự động đóng (nếu có) để tránh xung đột\n if (this.blurTimeout) {\n clearTimeout(this.blurTimeout);\n }\n\n if (!this.isExpanded) {\n this.isExpanded = true;\n setTimeout(() => this.searchInputRef.nativeElement.focus(), 150);\n } else if (!this.searchValue) {\n this.isExpanded = false;\n } else {\n this.performSearch();\n }\n }\n\n clearSearch(event: MouseEvent): void {\n event.stopPropagation();\n this.searchValue = '';\n this.searchInputRef.nativeElement.focus();\n this.performSearch();\n }\n\n // Bắt thêm sự kiện focus: Khi người dùng nhấp lại vào input thì không được đóng nó\n onFocus(): void {\n if (this.blurTimeout) {\n clearTimeout(this.blurTimeout);\n }\n }\n\n onBlur(): void {\n // Lưu lại bộ đếm để kiểm soát\n this.blurTimeout = setTimeout(() => {\n if (!this.searchValue?.trim()) {\n this.isExpanded = false;\n }\n }, 200); // Mình tăng lên 200ms để hoạt động an toàn hơn\n }\n\n performSearch(): void {\n this.searchValueChange.emit(this.searchValue);\n this.onSearch.emit(this.searchValue);\n }\n}\n","<div class=\"nz-search-wrapper\" [class.expanded]=\"isExpanded\">\n <input\n #searchInput\n type=\"text\"\n class=\"custom-search-input\"\n [(ngModel)]=\"searchValue\"\n placeholder=\"Nhập điều kiện tìm kiếm...\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keyup.enter)=\"performSearch()\"\n />\n\n <span class=\"suffix-wrap\" (mousedown)=\"$event.preventDefault()\" (click)=\"toggleSearch()\">\n <i\n nz-icon\n nzType=\"close-circle\"\n nzTheme=\"fill\"\n class=\"suffix-icon delete\"\n [class.show]=\"isExpanded && searchValue\"\n (click)=\"clearSearch($event)\"\n ></i>\n\n <i\n nz-icon\n nzType=\"search\"\n nzTheme=\"outline\"\n class=\"suffix-icon search\"\n [class.show]=\"!isExpanded || !searchValue\"\n ></i>\n </span>\n</div>\n","import { Component, inject, OnInit, TemplateRef, ViewChild } from '@angular/core';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\nimport { CustomNotiService } from '../../services/custom-notification.service';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'custom-noti',\n imports: [CommonModule, NzIconModule],\n template: `\n <ng-template #globalNotiTemplate let-data=\"data\">\n <div class=\"custom-notification-wrapper\">\n <div class=\"notification-content\">\n <i nz-icon [nzType]=\"data.icon\" nzTheme=\"twotone\" [nzTwotoneColor]=\"data.color\" class=\"noti-icon\"></i>\n\n <div class=\"noti-text\">\n <div class=\"noti-title\">{{ data.title }}</div>\n <div class=\"noti-desc\">{{ data.description }}</div>\n\n <div class=\"noti-action\" *ngIf=\"data.showDetail\">\n <a class=\"detail-link\" (click)=\"data.onDetailClick()\">Chi tiết</a>\n </div>\n </div>\n </div>\n\n <div class=\"progress-bar-container\">\n <div\n class=\"progress-bar\"\n [style.background-color]=\"data.color\"\n [style.animation-duration.ms]=\"data.duration\"\n ></div>\n </div>\n </div>\n </ng-template>\n `,\n styleUrl: './custom-noti.component.scss',\n})\nexport class CustomNotiComponent implements OnInit {\n customNotiService = inject(CustomNotiService);\n\n @ViewChild('globalNotiTemplate', { static: true }) notiTemplate!: TemplateRef<any>;\n\n ngOnInit() {\n this.customNotiService.registerTemplate(this.notiTemplate);\n }\n}\n","import { HttpParams } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { HTTPService } from '../../../services/api-service/http.service';\nimport { CommonService } from '../../../services/api-service/common.service';\nimport { AppGlobals } from '../../../app-global';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PermissionService extends HTTPService {\n cms = inject(CommonService);\n\n updateUserRoleRef(data: any) {\n return this.cms.ESP({\n SPN: 'Permission_updateUserRoleRef',\n Params: [data],\n });\n }\n\n getUserRoleRef() {\n return this.cms.ESP({\n SPN: 'Permission_getUserRoleRef',\n });\n }\n\n updateRoleMenuRef(data: any) {\n return this.cms.ESP({\n SPN: 'Permission_updateRoleMenuRef',\n Params: [data],\n });\n }\n\n getRoleMenuRef() {\n return this.cms.ESP({\n SPN: 'Permission_getRoleMenuRef',\n });\n }\n\n getRoleMenuRefStr(RoleId: string) {\n return this.cms.ESP({\n SPN: 'Permission_getRoleMenuRefStr',\n Params: [RoleId],\n });\n }\n\n getUserRoleRefStr(RoleId: string) {\n return this.cms.ESP({\n SPN: 'Permission_getUserRoleRefStr',\n Params: [RoleId],\n });\n }\n\n getUserForRole(RoleId: string) {\n return this.cms.ESP({\n SPN: 'Permission_getUserForRole',\n Params: [RoleId],\n });\n }\n\n createPermission(obj: any) {\n return this.postData(AppGlobals.apiEndpoint + '/api/App_Permission/AddOrEdit', obj);\n }\n\n createLstPermission(bulkPayload: any) {\n return this.postData(AppGlobals.apiEndpoint + '/api/App_Permission/AddOrEditLst', bulkPayload);\n }\n\n deletePermission(id: any) {\n const p = new HttpParams().append('id', id);\n return this.postParams(AppGlobals.apiEndpoint + '/api/App_Permission/delete', p);\n }\n\n getResourcePermission(searchText: string) {\n return this.cms.ESP({\n SPN: 'Permission_getResourcePermission',\n Params: [searchText],\n });\n }\n\n getPermissionGroupByCode() {\n return this.cms.ESP({\n SPN: 'Permission_getPermissionGroupByCode',\n });\n }\n\n addRoleResourcePermissionRef(roleId: string, permissionCodes: string) {\n let pr = new HttpParams().append('roleId', roleId).append('permissionCodes', permissionCodes);\n return this.postParams(AppGlobals.apiEndpoint + '/api/App_Permission/addRoleResourcePermissionRef', pr);\n }\n\n getRolePermissions(roleId: string) {\n return this.cms.ESP({\n SPN: 'Permission_getRolePermissions',\n Params: [roleId],\n });\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpParams } from '@angular/common/http';\nimport { HTTPService } from '../../services/api-service/http.service';\nimport { CommonService } from '../../services/api-service/common.service';\nimport { RespondData } from '../../model';\nimport { AppGlobals } from '../../app-global';\n\nexport const URLs = {\n getById: '/api/App_Role/GetById',\n getAll: '/api/App_Role/GetAll',\n getList: '/api/App_Role/GetList',\n getPaging: '/api/App_Role/GetPaging',\n addOrEdit: '/api/App_Role/AddOrEdit',\n delete: '/api/App_Role/Delete',\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class RoleService extends HTTPService {\n commonService = inject(CommonService);\n\n getById(id: any): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Role_getById',\n Params: [id],\n });\n }\n\n getAll(): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Role_getAll',\n });\n }\n\n getList(filter: any): Promise<RespondData> {\n return this.postData(AppGlobals.apiEndpoint + URLs.getList, filter);\n }\n\n getPaging(filter: any): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Role_getPaging',\n Params: [filter],\n });\n }\n\n addOrEdit(obj: any): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Role_addOrEdit',\n Params: [obj],\n });\n }\n\n delete(id: any): Promise<RespondData> {\n const params = new HttpParams().append('id', id);\n return this.postParams(AppGlobals.apiEndpoint + URLs.delete, params);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpParams } from '@angular/common/http';\nimport { HTTPService } from '../../services/api-service/http.service';\nimport { CommonService } from '../../services/api-service/common.service';\nimport { RespondData } from '../../model';\nimport { AppGlobals } from '../../app-global';\n\nexport const URLs = {\n getById: '/api/App_Menu/GetById',\n getAll: '/api/App_Menu/GetAll',\n getList: '/api/App_Menu/GetList',\n getPaging: '/api/App_Menu/GetPaging',\n addOrEdit: '/api/App_Menu/AddOrEdit',\n delete: '/api/App_Menu/Delete',\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class MenuService extends HTTPService {\n commonService = inject(CommonService);\n\n getById(id: any): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Menu_getById',\n Params: [id],\n });\n }\n\n getAll(): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Menu_getAll',\n });\n }\n\n getList(filter: any): Promise<RespondData> {\n return this.postData(AppGlobals.apiEndpoint + URLs.getList, filter);\n }\n\n getPaging(filter: any): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Menu_getPaging',\n Params: [filter],\n });\n }\n\n addOrEdit(obj: any): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Menu_addOrEdit',\n Params: [obj],\n });\n }\n\n delete(id: any): Promise<RespondData> {\n const params = new HttpParams().append('id', id);\n return this.postParams(AppGlobals.apiEndpoint + URLs.delete, params);\n }\n\n getTree() {\n return this.commonService.ESP({\n SPN: 'App_Menu_getTree',\n });\n }\n\n getRolesByMenuId(menuId: string): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Role_Menu_Ref_getByMenuId',\n Params: [menuId],\n });\n }\n\n addRolesToMenu(menuId: string | null, roleIds: string[]): Promise<RespondData> {\n if (!menuId) {\n return Promise.reject('Menu ID is required');\n }\n return this.commonService.ESP({\n SPN: 'App_Menu_addRolesToMenu',\n Params: [menuId, roleIds.join(',')],\n });\n }\n\n updateRoleMenuPermission(obj: any): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Menu_updateRoleMenuPermission',\n Params: [obj.App_Role_Menu_Ref_Id, obj.HasViewPermission, obj.HasEditPermission],\n });\n }\n\n deleteRoleFromMenu(refId: string): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Menu_deleteRoleFromMenu',\n Params: [refId],\n });\n }\n}\n","import { Component, inject, OnInit } from '@angular/core';\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\nimport { NzTableModule } from 'ng-zorro-antd/table';\nimport { NzCheckboxModule } from 'ng-zorro-antd/checkbox';\nimport { FormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { NzButtonModule } from 'ng-zorro-antd/button';\nimport { NzGridModule } from 'ng-zorro-antd/grid';\nimport { NzFlexModule } from 'ng-zorro-antd/flex';\nimport { PermissionService } from '../permission.service';\nimport { App_Role_Menu_Ref } from '../permission.model';\nimport { BaseComponent } from '../../../../components/base.component';\nimport { RoleService } from '../../../service/role.service';\nimport { MenuService } from '../../../service/menu.service';\nimport { App_Role } from '../../../model/role.model';\nimport { App_Menu } from '../../../model/menu.model';\n\n@Component({\n selector: 'app-role-menu-permission',\n templateUrl: './role-menu.html',\n imports: [\n NzSpinModule,\n NzTableModule,\n FormsModule,\n NzCheckboxModule,\n TranslateModule,\n NzButtonModule,\n NzGridModule,\n NzFlexModule,\n ],\n})\nexport class RoleMenuPermission extends BaseComponent implements OnInit {\n roleService = inject(RoleService);\n menuService = inject(MenuService);\n permissionService = inject(PermissionService);\n\n lstRole: App_Role[] = [];\n lstMenu: App_Menu[] = [];\n lstRoleMenuRef: App_Role_Menu_Ref[] = [];\n\n // Mapping quyền: RoleId -> MenuId -> boolean\n roleMenuMap: { [roleId: string]: { [menuId: string]: boolean } } = {};\n\n // Quản lý trạng thái Checkbox của từng cột (Role) trên Thead\n roleColumnState: { [roleId: string]: { checked: boolean; indeterminate: boolean } } = {};\n\n ngOnInit(): void {\n this.getData();\n }\n\n getData() {\n Promise.all([this.roleService.getAll(), this.menuService.getAll(), this.permissionService.getRoleMenuRef()])\n .then(([roleRes, menuRes, roleMenuRefRes]) => {\n this.lstRole = roleRes.Data || [];\n this.lstMenu = menuRes.Data || [];\n this.lstRoleMenuRef = roleMenuRefRes.Data || [];\n\n this.initializeRoleMenuMap();\n })\n .catch((err) => this.handleError(err));\n }\n\n initializeRoleMenuMap() {\n this.roleMenuMap = {};\n\n // 1. Dùng Set để tra cứu O(1) thay vì dùng Array.find()\n const roleMenuSet = new Set(this.lstRoleMenuRef.map((x) => `${x.App_Role_Id}_${x.App_Menu_Id}`));\n\n this.lstRole.forEach((role) => {\n const roleId = role.App_Role_Id!;\n this.roleMenuMap[roleId] = {};\n\n this.lstMenu.forEach((menu) => {\n const menuId = menu.App_Menu_Id;\n // 2. Lookup siêu tốc bằng Set.has()\n this.roleMenuMap[roleId][menuId] = roleMenuSet.has(`${roleId}_${menuId}`);\n });\n\n // 3. Tính toán sẵn trạng thái Select All cho cột Role hiện tại\n this.updateRoleColumnState(roleId);\n });\n }\n\n // Cập nhật trạng thái Checked / Indeterminate cho cột Role\n updateRoleColumnState(roleId: string) {\n if (!this.lstMenu.length) {\n this.roleColumnState[roleId] = { checked: false, indeterminate: false };\n return;\n }\n\n let checkedCount = 0;\n this.lstMenu.forEach((menu) => {\n if (this.roleMenuMap[roleId][menu.App_Menu_Id]) {\n checkedCount++;\n }\n });\n\n this.roleColumnState[roleId] = {\n checked: checkedCount === this.lstMenu.length,\n indeterminate: checkedCount > 0 && checkedCount < this.lstMenu.length,\n };\n }\n\n // Khi click vào Checkbox All trên Thead\n toggleRolePermissions(roleId: string, checked: boolean) {\n this.lstMenu.forEach((menu) => {\n this.roleMenuMap[roleId][menu.App_Menu_Id] = checked;\n });\n // Tính lại trạng thái của cột này\n this.updateRoleColumnState(roleId);\n }\n\n // Khi click vào từng Checkbox lẻ trong Tbody\n onSinglePermissionChange(roleId: string) {\n this.updateRoleColumnState(roleId);\n }\n\n convertRoleMenuMapToArray() {\n const result: { RoleId: string; MenuId: string; IsChecked: boolean }[] = [];\n\n Object.keys(this.roleMenuMap).forEach((roleId) => {\n Object.keys(this.roleMenuMap[roleId]).forEach((menuId) => {\n result.push({\n RoleId: roleId,\n MenuId: menuId,\n IsChecked: this.roleMenuMap[roleId][menuId],\n });\n });\n });\n\n return result;\n }\n\n saveRoleMenuMap() {\n const payload = this.convertRoleMenuMapToArray();\n this.permissionService.updateRoleMenuRef(payload).then(\n () => this.notiService.success(this.translate.instant(this.TranslateKey.SAVE_SUCCESS)),\n (err) => this.handleError(err),\n );\n }\n}\n","<div nz-row [nzGutter]=\"[0, 8]\">\n <div nz-col nzSpan=\"24\" nz-flex nzGap=\"small\">\n <button nz-button nzType=\"primary\" (click)=\"saveRoleMenuMap()\">{{ TranslateKey.SAVE | translate }}</button>\n <button nz-button nzType=\"primary\" (click)=\"getData()\">{{ TranslateKey.REFEESH | translate }}</button>\n </div>\n <div nz-col nzSpan=\"24\">\n <nz-table [nzData]=\"lstMenu\" nzShowPagination=\"false\" [nzBordered]=\"true\" [nzSize]=\"'small'\">\n <thead>\n <tr>\n <th nzWidth=\"200px\"></th>\n @for (role of lstRole; track role.App_Role_Id) {\n <th style=\"text-align: center\">{{ role.Name }}</th>\n }\n </tr>\n <tr>\n <th nzWidth=\"200px\"></th>\n @for (role of lstRole; track role.App_Role_Id) {\n <th style=\"text-align: center\">\n <label\n nz-checkbox\n [nzChecked]=\"roleColumnState[role.App_Role_Id!].checked\"\n [nzIndeterminate]=\"roleColumnState[role.App_Role_Id!].indeterminate\"\n (nzCheckedChange)=\"toggleRolePermissions(role.App_Role_Id!, $event)\"\n ></label>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (menu of lstMenu; track menu.App_Menu_Id) {\n <tr>\n <td>{{ menu.TreeNodeName }}</td>\n @for (role of lstRole; track role.App_Role_Id) {\n <td class=\"text-center\">\n <label\n nz-checkbox\n [(ngModel)]=\"roleMenuMap[role.App_Role_Id!][menu.App_Menu_Id]\"\n (ngModelChange)=\"onSinglePermissionChange(role.App_Role_Id!)\"\n ></label>\n </td>\n }\n </tr>\n }\n </tbody>\n </nz-table>\n </div>\n</div>\n","import { inject, Injectable } from '@angular/core';\nimport { HttpParams } from '@angular/common/http';\nimport { HTTPService } from '../../services/api-service/http.service';\nimport { CommonService } from '../../services/api-service/common.service';\nimport { RespondData } from '../../model';\nimport { AppGlobals } from '../../app-global';\n\nexport const URLs = {\n getById: '/api/App_User/GetById',\n getByIdEx: '/api/App_User/GetByIdEx',\n getAll: '/api/App_User/GetAll',\n getList: '/api/App_User/GetList',\n getPaging: '/api/App_User/GetPaging',\n addOrEdit: '/api/App_User/AddOrEdit',\n delete: '/api/App_User/Delete',\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UserService extends HTTPService {\n cms = inject(CommonService);\n\n getById(id: any): Promise<RespondData> {\n const params = new HttpParams().append('id', id);\n return this.postParams(AppGlobals.apiEndpoint + URLs.getById, params);\n }\n\n getByIdEx(id: any): Promise<RespondData> {\n return this.cms.ESP({\n SPN: 'App_User_getByIdEx',\n Params: [id],\n });\n }\n\n getAll(): Promise<RespondData> {\n return this.cms.ESP({\n SPN: 'App_User_getAll',\n });\n }\n\n getList(filter: any): Promise<RespondData> {\n return this.postData(AppGlobals.apiEndpoint + URLs.getList, filter);\n }\n\n getPaging(filter: any): Promise<RespondData> {\n return this.cms.ESP({\n SPN: 'App_User_getPaging',\n Params: [filter],\n });\n }\n\n addOrEdit(obj: any): Promise<RespondData> {\n return this.cms.ESP({\n SPN: 'App_User_addOrEdit',\n Params: [obj],\n });\n }\n\n delete(id: any): Promise<RespondData> {\n const params = new HttpParams().append('id', id);\n return this.postParams(AppGlobals.apiEndpoint + URLs.delete, params);\n }\n\n importUser(data: any) {\n return this.postData(`${AppGlobals.apiEndpoint}/api/App_User/ImportUser`, data);\n }\n\n checkImportUser(data: any) {\n return this.cms.ESP({\n SPN: 'App_User_checkImportUser',\n Params: [data],\n });\n }\n}\n","import { Component, inject, OnInit } from '@angular/core';\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\nimport { NzTableModule } from 'ng-zorro-antd/table';\nimport { NzCheckboxModule } from 'ng-zorro-antd/checkbox';\nimport { FormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { NzButtonModule } from 'ng-zorro-antd/button';\nimport { PermissionService } from '../permission.service';\nimport { NzGridModule } from 'ng-zorro-antd/grid';\nimport { NzFlexModule } from 'ng-zorro-antd/flex';\nimport { BaseComponent } from '../../../../components/base.component';\nimport { RoleService } from '../../../service/role.service';\nimport { UserService } from '../../../service/user.service';\nimport { App_Role } from '../../../model/role.model';\nimport { App_User } from '../../../model/user.model';\nimport { App_User_Role_Ref } from '../permission.model';\n\n@Component({\n selector: 'app-user-role-permission',\n templateUrl: './user-role.html',\n imports: [\n NzSpinModule,\n NzTableModule,\n FormsModule,\n NzCheckboxModule,\n TranslateModule,\n NzButtonModule,\n NzGridModule,\n NzFlexModule,\n ],\n})\nexport class UserRolePermission extends BaseComponent implements OnInit {\n roleService = inject(RoleService);\n userService = inject(UserService);\n permissionService = inject(PermissionService);\n\n lstRole: App_Role[] = [];\n lstUser: App_User[] = [];\n lstUserRoleRef: App_User_Role_Ref[] = [];\n\n // Lưu trữ mapping quyền\n userRoleMap: { [userId: string]: { [roleId: string]: boolean } } = {};\n\n // Lưu trữ trạng thái Checkbox của cột \"Chọn tất cả\" cho từng User để tránh gọi hàm trong HTML\n userRowState: { [userId: string]: { checked: boolean; indeterminate: boolean } } = {};\n\n ngOnInit(): void {\n this.getData();\n }\n\n getData() {\n Promise.all([this.roleService.getAll(), this.userService.getAll(), this.permissionService.getUserRoleRef()])\n .then(([roleRes, userRes, roleMenuRefRes]) => {\n this.lstRole = roleRes.Data || [];\n this.lstUser = userRes.Data || [];\n this.lstUserRoleRef = roleMenuRefRes.Data || [];\n\n this.initializeRoleMenuMap();\n })\n .catch((err) => this.handleError(err));\n }\n\n initializeRoleMenuMap() {\n this.userRoleMap = {};\n\n // 1. Chuyển Array sang Set với khóa tổ hợp \"UserId_RoleId\" để tra cứu O(1)\n const userRoleSet = new Set(this.lstUserRoleRef.map((x) => `${x.App_User_Id}_${x.App_Role_Id}`));\n\n this.lstUser.forEach((user) => {\n const userId = user.App_User_Id!;\n this.userRoleMap[userId] = {};\n\n this.lstRole.forEach((role) => {\n const roleId = role.App_Role_Id!;\n // 2. Tra cứu siêu tốc bằng Set.has()\n this.userRoleMap[userId][roleId] = userRoleSet.has(`${userId}_${roleId}`);\n });\n\n // 3. Khởi tạo luôn trạng thái Checkbox tổng cho dòng này\n this.updateUserRowState(userId);\n });\n }\n\n // Hàm tính toán trạng thái Checked/Indeterminate và lưu vào Object\n updateUserRowState(userId: string) {\n if (!this.lstRole.length) {\n this.userRowState[userId] = { checked: false, indeterminate: false };\n return;\n }\n\n let checkedCount = 0;\n this.lstRole.forEach((role) => {\n if (this.userRoleMap[userId][role.App_Role_Id!]) {\n checkedCount++;\n }\n });\n\n this.userRowState[userId] = {\n checked: checkedCount === this.lstRole.length,\n indeterminate: checkedCount > 0 && checkedCount < this.lstRole.length,\n };\n }\n\n // Xử lý khi click vào Checkbox chọn tất cả của một dòng\n toggleUserPermissions(userId: string, checked: boolean) {\n this.lstRole.forEach((role) => {\n this.userRoleMap[userId][role.App_Role_Id!] = checked;\n });\n // Cập nhật lại state của dòng\n this.updateUserRowState(userId);\n }\n\n // Xử lý khi click vào Checkbox của từng quyền lẻ\n onSinglePermissionChange(userId: string) {\n this.updateUserRowState(userId);\n }\n\n convertUserRoleMapToArray() {\n const result: { UserId: string; RoleId: string; IsChecked: boolean }[] = [];\n\n Object.keys(this.userRoleMap).forEach((userId) => {\n Object.keys(this.userRoleMap[userId]).forEach((roleId) => {\n result.push({\n UserId: userId,\n RoleId: roleId,\n IsChecked: this.userRoleMap[userId][roleId],\n });\n });\n });\n\n return result;\n }\n\n saveUserRoleMap() {\n const payload = this.convertUserRoleMapToArray();\n this.permissionService.updateUserRoleRef(payload).then(\n () => this.notiService.success(this.translate.instant(this.TranslateKey.SAVE_SUCCESS)),\n (err) => this.handleError(err),\n );\n }\n}\n","<div nz-row [nzGutter]=\"[0, 8]\">\n <div nz-col nzSpan=\"24\" nz-flex nzGap=\"small\">\n <button nz-button nzType=\"primary\" (click)=\"saveUserRoleMap()\">{{ TranslateKey.SAVE | translate }}</button>\n <button nz-button nzType=\"primary\" (click)=\"getData()\">{{ TranslateKey.REFEESH | translate }}</button>\n </div>\n <div nz-col nzSpan=\"24\">\n <nz-table [nzData]=\"lstUser\" nzShowPagination=\"false\" [nzBordered]=\"true\" [nzSize]=\"'small'\">\n <thead>\n <tr>\n <th nzWidth=\"200px\"></th>\n <th nzWidth=\"40px\"></th>\n @for (role of lstRole; track role.App_Role_Id) {\n <th style=\"text-align: center\">{{ role.Name }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (user of lstUser; track user.App_User_Id) {\n <tr>\n <td>{{ user.FullName }}</td>\n <td>\n <label\n nz-checkbox\n [nzChecked]=\"userRowState[user.App_User_Id!].checked\"\n [nzIndeterminate]=\"userRowState[user.App_User_Id!].indeterminate\"\n (nzCheckedChange)=\"toggleUserPermissions(user.App_User_Id!, $event)\"\n ></label>\n </td>\n @for (role of lstRole; track role.App_Role_Id) {\n <td class=\"text-center\">\n <label\n nz-checkbox\n [(ngModel)]=\"userRoleMap[user.App_User_Id!][role.App_Role_Id!]\"\n (ngModelChange)=\"onSinglePermissionChange(user.App_User_Id!)\"\n ></label>\n </td>\n }\n </tr>\n }\n </tbody>\n </nz-table>\n </div>\n</div>\n","import { Component, inject, OnInit } from '@angular/core';\nimport { ResourceGroupDto, SaveRolePermissionReq } from './role-permission.model';\nimport { NzCardModule } from 'ng-zorro-antd/card';\nimport { NzSelectModule } from 'ng-zorro-antd/select';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { NzButtonModule } from 'ng-zorro-antd/button';\nimport { NzDividerModule } from 'ng-zorro-antd/divider';\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\nimport { NzGridModule } from 'ng-zorro-antd/grid';\nimport { NzCheckboxModule } from 'ng-zorro-antd/checkbox';\nimport { PermissionService } from '../permission.service';\nimport { BaseComponent } from '../../../../components/base.component';\nimport { RoleService } from '../../../service/role.service';\nimport { App_Role } from '../../../model/role.model';\n\n@Component({\n selector: 'role-resource-permission',\n templateUrl: './role-permission.component.html',\n imports: [\n CommonModule,\n FormsModule,\n NzCardModule,\n NzSelectModule,\n NzButtonModule,\n NzDividerModule,\n NzSpinModule,\n NzGridModule,\n NzCheckboxModule,\n ],\n})\nexport class RolePermissionComponent extends BaseComponent implements OnInit {\n roleService = inject(RoleService);\n permissionService = inject(PermissionService);\n\n lstRole: App_Role[] = [];\n resourceGroups: ResourceGroupDto[] = [];\n\n // Lưu trữ danh sách PermissionCode đang được tích chọn cho Role hiện tại\n selectedPermissionCodes: Set<string> = new Set<string>();\n\n ngOnInit(): void {\n this.loadRoles();\n // this.loadAllResources(); // Load khung Matrix (danh mục Module & Actions)\n }\n\n // --- 1. Gọi API lấy danh sách Role động ---\n loadRoles(): void {\n this.roleService.getAll().then((res) => (this.lstRole = res.Data || []));\n }\n\n // --- 2. Gọi API lấy danh mục Resource và Permission (Ma trận tĩnh) ---\n loadAllResources(): void {\n this.permissionService.getPermissionGroupByCode().then(\n (res) => (this.resourceGroups = res.Data),\n (err) => this.handleError(err),\n );\n }\n\n // --- 3. Xử lý khi User đổi Role ---\n onRoleChange(roleId: string): void {\n if (!roleId) return;\n this.isLoading = true;\n\n // Xóa state cũ\n this.selectedPermissionCodes.clear();\n\n let activePermsFromDb: string[] = [];\n this.permissionService\n .getRolePermissions(roleId)\n .then(\n (res) => {\n activePermsFromDb = res.Data?.split(';') || [];\n this.selectedPermissionCodes = new Set(activePermsFromDb);\n },\n (err) => this.handleError(err),\n )\n .finally(() => (this.isLoading = false));\n\n this.loadAllResources();\n }\n\n // --- 4. Logic UI: Thao tác Check/Uncheck ---\n isPermissionChecked(code: string): boolean {\n return this.selectedPermissionCodes.has(code);\n }\n\n onCheckChange(code: string, isChecked: boolean): void {\n if (isChecked) {\n this.selectedPermissionCodes.add(code);\n } else {\n this.selectedPermissionCodes.delete(code);\n }\n }\n\n // --- 5. Lưu xuống DB ---\n savePermissions(): void {\n if (!this.selectedId) return;\n\n this.isSaving = true;\n\n const payload: SaveRolePermissionReq = {\n roleId: this.selectedId + '',\n // Chuyển Set về lại Array để gửi API\n permissionCodes: Array.from(this.selectedPermissionCodes),\n };\n\n this.permissionService\n .addRoleResourcePermissionRef(payload.roleId, payload.permissionCodes.join(';'))\n .then(\n (res) => this.notiService.success('Đã lưu cấu hình phân quyền thành công!'),\n (err) => this.handleError(err),\n )\n .finally(() => (this.isSaving = false));\n }\n}\n","<nz-card [nzBordered]=\"false\" nzTitle=\"Cấu hình Phân quyền Hệ thống\">\n <div class=\"header-action\" nz-row nzJustify=\"space-between\" nzAlign=\"middle\" style=\"margin-bottom: 24px\">\n <div nz-col>\n <span style=\"margin-right: 16px; font-weight: bold\">Chọn Nhóm quyền (Role):</span>\n <nz-select\n [(ngModel)]=\"selectedId\"\n (ngModelChange)=\"onRoleChange($event)\"\n nzPlaceHolder=\"-- Vui lòng chọn Role --\"\n style=\"width: 300px\"\n >\n <nz-option *ngFor=\"let role of lstRole\" [nzValue]=\"role.App_Role_Id\" [nzLabel]=\"role.Name || ''\"></nz-option>\n </nz-select>\n </div>\n <div nz-col>\n <button nz-button nzType=\"primary\" (click)=\"savePermissions()\" [nzLoading]=\"isSaving\" [disabled]=\"!selectedId\">\n <i nz-icon nzType=\"save\"></i> Lưu cấu hình\n </button>\n </div>\n </div>\n\n <nz-divider></nz-divider>\n\n <nz-spin [nzSpinning]=\"isLoading\">\n <div *ngIf=\"!selectedId\" style=\"text-align: center; color: #999; padding: 40px 0\">\n Vui lòng chọn một Nhóm quyền để xem và cấu hình.\n </div>\n\n <div *ngIf=\"selectedId\">\n <div *ngFor=\"let group of resourceGroups\" style=\"margin-bottom: 24px\">\n <h4 style=\"border-left: 4px solid #1890ff; padding-left: 8px; margin-bottom: 16px\">\n {{ group.ResourceName }}\n </h4>\n\n <nz-card [nzBordered]=\"true\" nzSize=\"small\">\n <nz-row [nzGutter]=\"[16, 16]\">\n <nz-col [nzSpan]=\"6\" *ngFor=\"let perm of group.permissions\">\n <label\n nz-checkbox\n [nzChecked]=\"isPermissionChecked(perm.PermissionCode)\"\n (nzCheckedChange)=\"onCheckChange(perm.PermissionCode, $event)\"\n >\n {{ perm.PermissionName }} <br />\n <small style=\"color: #888\">({{ perm.PermissionCode }})</small>\n </label>\n </nz-col>\n </nz-row>\n </nz-card>\n </div>\n </div>\n </nz-spin>\n</nz-card>\n","import { Component, OnInit } from '@angular/core';\nimport { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { NzCardModule } from 'ng-zorro-antd/card';\nimport { NzInputModule } from 'ng-zorro-antd/input';\nimport { NzTableModule } from 'ng-zorro-antd/table';\nimport { NzTagModule } from 'ng-zorro-antd/tag';\nimport { NzDividerModule } from 'ng-zorro-antd/divider';\nimport { NzModalModule } from 'ng-zorro-antd/modal';\nimport { NzFormModule } from 'ng-zorro-antd/form';\nimport { NzButtonModule } from 'ng-zorro-antd/button';\nimport { NzSelectModule } from 'ng-zorro-antd/select';\nimport { NzCheckboxModule } from 'ng-zorro-antd/checkbox';\nimport { NzAutocompleteModule } from 'ng-zorro-antd/auto-complete';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\nimport { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm';\nimport { NzFlexDirective } from 'ng-zorro-antd/flex';\nimport { PermissionService } from '../permission.service';\nimport { BaseComponent } from '../../../../components/base.component';\nimport { ExpandableSearchComponent } from '../../../../components/search/expandable-search/expandable-search.component';\n\nexport interface App_Permission {\n App_Permission_Id: string;\n ResourceCode: string;\n ResourceName: string;\n PermissionCode: string;\n PermissionName: string;\n Description: string;\n}\n\n@Component({\n selector: 'resource-permission',\n templateUrl: './resource-permission.component.html',\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NzCardModule,\n NzInputModule,\n NzTableModule,\n NzTagModule,\n NzDividerModule,\n NzModalModule,\n NzFormModule,\n NzButtonModule,\n NzSelectModule,\n NzCheckboxModule,\n NzAutocompleteModule,\n NzIconModule,\n ExpandableSearchComponent,\n NzPopconfirmModule,\n NzFlexDirective,\n ],\n})\nexport class PermissionManagerComponent extends BaseComponent implements OnInit {\n permissions: App_Permission[] = [];\n\n searchText = '';\n\n isModalVisible = false;\n isEditMode = false;\n currentEditingId: string | null = null;\n permissionForm!: FormGroup;\n\n // danh sách các Action chuẩn của hệ thống\n actionOptions = [\n { value: 'create', label: '1. Tạo mới (create)' },\n\n { value: 'read_all', label: '2. Xem tất cả (read_all)' },\n { value: 'update_all', label: '3. Sửa tất cả (update_all)' },\n { value: 'delete_all', label: '4. Xóa tất cả (delete_all)' },\n\n { value: 'read_own', label: '5. Xem của mình (read_own)' },\n { value: 'update_own', label: '6. Sửa của mình (update_own)' },\n { value: 'delete_own', label: '7. Xóa của mình (delete_own)' },\n\n { value: 'export', label: '8. Xuất dữ liệu (export)' },\n ];\n\n filteredActionOptions = [...this.actionOptions];\n\n isBulkModalVisible = false;\n bulkForm!: FormGroup;\n\n bulkActionCheckboxes: Array<{ label: string; value: string; checked: boolean }> = [];\n\n constructor(\n private fb: FormBuilder,\n private permissionService: PermissionService,\n ) {\n super();\n this.initForm();\n this.initBulkForm();\n }\n\n ngOnInit(): void {\n this.loadData();\n }\n\n initBulkForm(): void {\n this.bulkForm = this.fb.group({\n ResourceCode: ['', [Validators.required, Validators.pattern(/^[a-zA-Z0-9]+$/)]],\n ResourceName: ['', [Validators.required]],\n });\n }\n\n openBulkModal(): void {\n this.isBulkModalVisible = true;\n this.bulkForm.reset();\n\n this.bulkActionCheckboxes = this.actionOptions.map((opt) => ({\n label: opt.label,\n value: opt.value,\n checked: true,\n }));\n }\n\n closeBulkModal(): void {\n this.isBulkModalVisible = false;\n }\n\n saveBulkPermissions(): void {\n if (this.bulkForm.invalid) {\n Object.values(this.bulkForm.controls).forEach((control) => {\n control.markAsDirty();\n control.updateValueAndValidity({ onlySelf: true });\n });\n return;\n }\n\n const { ResourceCode, ResourceName } = this.bulkForm.value;\n\n const selectedActions = this.bulkActionCheckboxes.filter((x) => x.checked);\n\n if (selectedActions.length === 0) {\n this.notiService.warning('Vui lòng chọn ít nhất một hành động để tạo!');\n return;\n }\n\n const bulkPayload = selectedActions.map((action) => {\n return {\n ResourceCode: ResourceCode,\n ResourceName: ResourceName,\n PermissionCode: `${ResourceCode.toLowerCase().trim()}:${action.value}`,\n PermissionName: `${action.value} ${ResourceCode}`,\n Description: `Auto create for resource ${ResourceName}`,\n };\n });\n\n this.permissionService.createLstPermission(bulkPayload).then(\n (res) => {\n this.notiService.success(`Đã tạo thành công ${bulkPayload.length} mã quyền!`);\n this.isBulkModalVisible = false;\n this.loadData();\n },\n (err) => this.handleError(err),\n );\n }\n\n initForm(): void {\n this.permissionForm = this.fb.group({\n ResourceName: ['', [Validators.required]],\n ResourceCode: ['', [Validators.required]],\n actionSuffix: ['', [Validators.required]],\n PermissionCode: [{ value: '', disabled: true }],\n PermissionName: ['', [Validators.required]],\n Description: [''],\n });\n\n this.permissionForm.valueChanges.subscribe((val) => {\n const mod = val.ResourceCode || '';\n const act = val.actionSuffix || '';\n\n if (mod && act) {\n const generatedCode = `${mod.toLowerCase().trim()}:${act}`;\n this.permissionForm.get('PermissionCode')?.setValue(generatedCode, { emitEvent: false });\n } else {\n if (!this.isEditMode) {\n this.permissionForm.get('PermissionCode')?.setValue('', { emitEvent: false });\n }\n }\n });\n }\n\n loadData(): void {\n this.permissionService.getResourcePermission(this.searchText).then(\n (res) => (this.permissions = res.Data || []),\n (err) => this.handleError(err),\n );\n }\n\n openModal(data?: App_Permission): void {\n this.isModalVisible = true;\n if (data) {\n this.isEditMode = true;\n this.currentEditingId = data.App_Permission_Id;\n\n const codeParts = data.PermissionCode.split(':');\n const suffix = codeParts.length > 1 ? codeParts[1] : '';\n\n this.permissionForm.patchValue({\n ResourceName: data.ResourceName,\n ResourceCode: data.ResourceCode,\n actionSuffix: suffix,\n PermissionCode: data.PermissionCode,\n PermissionName: data.PermissionName,\n Description: data.Description,\n });\n\n this.permissionForm.get('ResourceCode')?.disable();\n this.permissionForm.get('actionSuffix')?.disable();\n } else {\n this.isEditMode = false;\n this.currentEditingId = null;\n this.permissionForm.reset();\n this.permissionForm.get('ResourceCode')?.enable();\n this.permissionForm.get('actionSuffix')?.enable();\n }\n }\n\n closeModal(): void {\n this.isModalVisible = false;\n this.permissionForm.reset();\n }\n\n savePermission(): void {\n if (this.permissionForm.invalid) {\n this.touchControls(this.permissionForm);\n return;\n }\n\n const formData = this.permissionForm.getRawValue();\n\n const payload = {\n App_Permission_Id: this.currentEditingId,\n ResourceName: formData.ResourceName,\n ResourceCode: formData.ResourceCode,\n PermissionCode: formData.PermissionCode,\n PermissionName: formData.PermissionName,\n Description: formData.Description,\n };\n\n this.permissionService.createPermission(payload).then(\n (res) => {\n this.notiService.success(`Đã tạo thành công mã quyền!`);\n this.isModalVisible = false;\n this.loadData();\n },\n (err) => this.handleError(err),\n );\n }\n\n async deletePermission(id: string): Promise<void> {\n await this.permissionService.deletePermission(id);\n this.notiService.success('Đã xóa mã quyền!');\n this.loadData();\n }\n}\n","<nz-card nzTitle=\"Quản lý Danh mục Mã quyền (App_Permission)\" [nzBordered]=\"false\">\n <div class=\"table-operations\" nz-row nzJustify=\"space-between\" style=\"margin-bottom: 16px\">\n <div nz-col>\n <expandable-search [(searchValue)]=\"searchText\" (onSearch)=\"loadData()\"></expandable-search>\n <button nz-button nzType=\"primary\" (click)=\"loadData()\" style=\"margin-right: 8px\">Tải lại</button>\n </div>\n <div nz-col>\n <button nz-button nzType=\"primary\" (click)=\"openBulkModal()\" style=\"margin-right: 8px\">\n <i nz-icon nzType=\"bolt\"></i> Tạo mới (default)\n </button>\n <button nz-button nzType=\"primary\" (click)=\"openModal()\"><i nz-icon nzType=\"plus\"></i> Thêm mới</button>\n </div>\n </div>\n\n <nz-table\n #basicTable\n [nzData]=\"permissions\"\n nzBordered\n nzSize=\"small\"\n nzShowPagination=\"true\"\n nzShowSizeChanger=\"true\"\n >\n <thead>\n <tr>\n <th>Resource</th>\n <th>Permission code</th>\n <th>Permission name</th>\n <th>Description</th>\n <th nzAlign=\"center\">Hành động</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let data of basicTable.data\">\n <td>\n <div nz-flex nzGap=\"small\">\n <span>{{ data.ResourceName }}</span\n ><nz-tag [nzColor]=\"'blue'\">{{ data.ResourceCode }}</nz-tag>\n </div>\n </td>\n <td>\n <strong>{{ data.PermissionCode }}</strong>\n </td>\n <td>{{ data.PermissionName }}</td>\n <td>{{ data.Description }}</td>\n <td nzAlign=\"center\">\n <a (click)=\"openModal(data)\"><i nz-icon nzType=\"edit\" nzTheme=\"outline\"></i></a>\n <nz-divider nzType=\"vertical\"></nz-divider>\n <a\n nz-popconfirm\n nzPopconfirmTitle=\"Xác nhận xóa?\"\n nzPopconfirmPlacement=\"left\"\n (nzOnConfirm)=\"deletePermission(data.App_Permission_Id)\"\n style=\"color: red\"\n >\n <i nz-icon nzType=\"delete\" nzTheme=\"outline\"></i>\n </a>\n </td>\n </tr>\n </tbody>\n </nz-table>\n</nz-card>\n\n<nz-modal\n [(nzVisible)]=\"isBulkModalVisible\"\n nzTitle=\"Create Resource permission\"\n (nzOnCancel)=\"closeBulkModal()\"\n (nzOnOk)=\"saveBulkPermissions()\"\n [nzMaskClosable]=\"false\"\n nzWidth=\"750px\"\n>\n <ng-container *nzModalContent>\n <!-- <div style=\"margin-bottom: 16px; color: #666\">\n <i nz-icon nzType=\"info-circle\"></i> Hệ thống sẽ tự động sinh mã quyền và tên thao tác dựa trên Module bạn nhập.\n Bạn có thể bỏ tích các thao tác không cần thiết.\n </div> -->\n\n <form nz-form [formGroup]=\"bulkForm\" nzLayout=\"vertical\">\n <nz-row [nzGutter]=\"16\">\n <nz-col [nzSpan]=\"12\">\n <nz-form-item>\n <nz-form-label nzRequired>Resource Code</nz-form-label>\n <nz-form-control nzErrorTip=\"Vui lòng nhập mã Module viết liền!\">\n <input nz-input formControlName=\"ResourceCode\" placeholder=\"VD: Invoices, Products...\" />\n </nz-form-control>\n </nz-form-item>\n </nz-col>\n\n <nz-col [nzSpan]=\"12\">\n <nz-form-item>\n <nz-form-label nzRequired>Resource Name</nz-form-label>\n <nz-form-control nzErrorTip=\"Vui lòng nhập tên Module!\">\n <input nz-input formControlName=\"ResourceName\" placeholder=\"VD: Hóa đơn, Sản phẩm...\" />\n </nz-form-control>\n </nz-form-item>\n </nz-col>\n </nz-row>\n </form>\n\n <nz-divider nzText=\"Danh sách Thao tác\" nzOrientation=\"left\"></nz-divider>\n\n <nz-row [nzGutter]=\"[16, 16]\">\n @for (item of bulkActionCheckboxes; track $index) {\n <nz-col [nzSpan]=\"$index == 0 ? 24 : 8\">\n <label nz-checkbox [(ngModel)]=\"item.checked\" [ngModelOptions]=\"{ standalone: true }\">\n {{ item.label }}\n </label>\n </nz-col>\n }\n </nz-row>\n </ng-container>\n</nz-modal>\n\n<nz-modal\n [(nzVisible)]=\"isModalVisible\"\n [nzTitle]=\"isEditMode ? 'Update Resource permission' : 'Create Resource permission'\"\n (nzOnCancel)=\"closeModal()\"\n (nzOnOk)=\"savePermission()\"\n [nzOkLoading]=\"isSaving\"\n [nzMaskClosable]=\"false\"\n>\n <ng-container *nzModalContent>\n <form nz-form [formGroup]=\"permissionForm\" nzLayout=\"vertical\">\n <nz-row [nzGutter]=\"16\">\n <nz-col [nzSpan]=\"24\">\n <nz-form-item>\n <nz-form-label nzRequired>Resource name</nz-form-label>\n <nz-form-control nzErrorTip=\"Vui lòng nhập nhóm Resource name!\">\n <input nz-input formControlName=\"ResourceName\" placeholder=\"VD: Todos\" />\n </nz-form-control>\n </nz-form-item>\n </nz-col>\n\n <nz-col [nzSpan]=\"12\">\n <nz-form-item>\n <nz-form-label nzRequired>Resource code</nz-form-label>\n <nz-form-control nzErrorTip=\"Vui lòng nhập nhóm Resource Code!\">\n <input nz-input formControlName=\"ResourceCode\" placeholder=\"VD: todo\" />\n </nz-form-control>\n </nz-form-item>\n </nz-col>\n\n <nz-col [nzSpan]=\"12\">\n <nz-form-item>\n <nz-form-label nzRequired>Permission code</nz-form-label>\n <nz-form-control nzErrorTip=\"Vui lòng nhập Permission code!\">\n <input\n nz-input\n formControlName=\"actionSuffix\"\n placeholder=\"-- Chọn hoặc tự nhập --\"\n [nzAutocomplete]=\"auto\"\n />\n\n <nz-autocomplete #auto>\n <nz-auto-option *ngFor=\"let option of filteredActionOptions\" [nzValue]=\"option.value\">\n {{ option.label }}\n </nz-auto-option>\n </nz-autocomplete>\n </nz-form-control>\n </nz-form-item>\n </nz-col>\n </nz-row>\n\n <nz-form-item>\n <nz-form-label>Mã quyền hệ thống (Tự động sinh)</nz-form-label>\n <nz-form-control>\n <input\n nz-input\n formControlName=\"PermissionCode\"\n style=\"background-color: #f5f5f5; color: #1890ff; font-weight: bold; font-family: monospace\"\n />\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-label nzRequired>Tên thao tác hiển thị</nz-form-label>\n <nz-form-control nzErrorTip=\"Vui lòng nhập tên thao tác!\">\n <input nz-input formControlName=\"PermissionName\" placeholder=\"VD: Xem công việc của mình\" />\n </nz-form-control>\n </nz-form-item>\n </form>\n </ng-container>\n</nz-modal>\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { NzTabsModule } from 'ng-zorro-antd/tabs';\nimport { RoleMenuPermission } from './role-menu/role-menu';\nimport { UserRolePermission } from './user-role/user-role';\nimport { RolePermissionComponent } from './role-permission/role-permission.component';\nimport { PermissionManagerComponent } from './resource-permission/resource-permission.component';\nimport { BaseComponent } from '../../../components/base.component';\nimport { Breadcrumb } from '../../../components/breadcrumb/breadcrumb';\n\n@Component({\n selector: 'app-permision',\n templateUrl: './permission.component.html',\n imports: [NzTabsModule, UserRolePermission, RoleMenuPermission, RolePermissionComponent, PermissionManagerComponent],\n})\nexport class PermissionComponent extends BaseComponent implements OnInit, OnDestroy {\n ngOnInit(): void {\n this.tab = +(this.getUrlQueryParam('tab') || 0);\n Breadcrumb.lstBreadcrumb = [\n {\n Name: 'Permission',\n },\n {\n Name: 'User - Role',\n },\n ];\n }\n\n ngOnDestroy(): void {\n Breadcrumb.lstBreadcrumb = [];\n }\n\n tab = 0;\n\n onSelectedIndexChange(tabIndex: number) {\n this.setQueryParam('tab', tabIndex + '');\n\n setTimeout(() => {\n if (tabIndex == 0) {\n Breadcrumb.lstBreadcrumb = [\n {\n Name: 'Permission',\n },\n {\n Name: 'User - Role',\n },\n ];\n } else if (tabIndex == 1) {\n Breadcrumb.lstBreadcrumb = [\n {\n Name: 'Permission',\n },\n {\n Name: 'Role - Menu',\n },\n ];\n } else if (tabIndex == 2) {\n Breadcrumb.lstBreadcrumb = [\n {\n Name: 'Permission',\n },\n {\n Name: 'Resource permission',\n },\n ];\n } else if (tabIndex == 3) {\n Breadcrumb.lstBreadcrumb = [\n {\n Name: 'Permission',\n },\n {\n Name: 'Role - Resource permission',\n },\n ];\n }\n }, 0);\n }\n}\n","<div class=\"panel\">\n <nz-tabset\n nzType=\"card\"\n [nzSize]=\"'small'\"\n [nzSelectedIndex]=\"tab\"\n (nzSelectedIndexChange)=\"onSelectedIndexChange($event)\"\n >\n <nz-tab nzTitle=\"User - Role\">\n <app-user-role-permission></app-user-role-permission>\n </nz-tab>\n <nz-tab nzTitle=\"Role - Menu\">\n <app-role-menu-permission></app-role-menu-permission>\n </nz-tab>\n <nz-tab nzTitle=\"Resource permission\">\n <resource-permission></resource-permission>\n </nz-tab>\n <nz-tab nzTitle=\"Role - Resource permission\">\n <role-resource-permission></role-resource-permission>\n </nz-tab>\n </nz-tabset>\n</div>\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { PermissionService } from './permission.service';\nimport { ResourceMap } from './auth-abac';\n\n@Pipe({\n name: 'hasPermission',\n pure: true,\n standalone: true,\n})\nexport class HasPermissionPipe implements PipeTransform {\n constructor(private permissionService: PermissionService) {}\n\n /**\n * @example *ngIf=\"row | hasPermission: 'org' : 'update'\"\n * @param data Dữ liệu của bản ghi hiện tại (VD: object todo)\n * @param resource Tên resource (VD: 'todos')\n * @param action Hành động (VD: 'update', 'delete')\n */\n transform<TResource extends keyof ResourceMap>(\n data: ResourceMap[TResource] | undefined | null,\n resource: TResource,\n action: 'read' | 'create' | 'update' | 'delete' | string,\n ): boolean {\n if (data === null) return false;\n\n // Chuyển việc thẩm định cho PermissionService xử lý\n return this.permissionService.hasAccess(resource, action, data);\n }\n}\n","import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';\nimport { PermissionService } from './permission.service';\nimport { ResourceMap } from './auth-abac';\n\n@Directive({\n selector: '[hasPermission]',\n standalone: true,\n})\nexport class HasPermissionDirective {\n // Biến cờ để kiểm tra xem view đã được tạo hay chưa, tránh bị render lại nhiều lần\n private hasView = false;\n\n /**\n * @example *hasPermission=\"'org:create'\"\n */\n constructor(\n private templateRef: TemplateRef<any>,\n private viewContainer: ViewContainerRef,\n private permissionService: PermissionService,\n ) {}\n\n // Nhận vào một chuỗi dạng 'resource:action', VD: 'org:create'\n @Input('hasPermission') set checkPermission(permissionString: string) {\n // 1. Validate đầu vào\n if (!permissionString || !permissionString.includes(':')) {\n console.warn(\n `[hasPermission] Format không hợp lệ: \"${permissionString}\". Vui lòng dùng format \"resource:action\"`,\n );\n this.clearView();\n return;\n }\n\n // 2. Tách chuỗi\n const [resource, action] = permissionString.split(':');\n\n // 3. Gọi hàm kiểm tra quyền.\n // Do split() trả về string, ta cần ép kiểu resource về keyof ResourceMap\n const hasAccess = this.permissionService.hasAccess(resource as keyof ResourceMap, action as any);\n\n // 4. Xử lý DOM\n if (hasAccess && !this.hasView) {\n // Nếu có quyền và chưa có view -> Tạo view\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.hasView = true;\n } else if (!hasAccess && this.hasView) {\n // Nếu không có quyền nhưng đang hiển thị view -> Xóa view\n this.clearView();\n }\n }\n\n private clearView() {\n this.viewContainer.clear();\n this.hasView = false;\n }\n}\n","import { Directive, ElementRef, HostListener, Optional } from '@angular/core';\nimport { NgControl } from '@angular/forms';\n\n@Directive({\n selector: 'input',\n})\nexport class NullIfEmptyDirective {\n constructor(\n private el: ElementRef,\n @Optional() private ngControl: NgControl,\n ) {}\n\n @HostListener('input')\n onInput() {\n // const value = this.el.nativeElement.value;\n // const newValue = value.trim() === '' ? null : value;\n // this.ngControl?.control?.setValue(newValue, { emitEvent: false });\n }\n}\n","import { Directive, ElementRef, forwardRef, HostListener, Renderer2, AfterViewInit } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Directive({\n selector: '[numberOnly]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NumberOnlyDirective),\n multi: true,\n },\n ],\n})\nexport class NumberOnlyDirective implements ControlValueAccessor, AfterViewInit {\n private inputEl!: HTMLInputElement;\n\n onChange = (_: any) => {};\n onTouched = () => {};\n\n constructor(\n private el: ElementRef,\n private renderer: Renderer2,\n ) {}\n\n ngAfterViewInit() {\n const native = this.el.nativeElement;\n\n // nếu gắn trực tiếp vào input\n if (native.tagName === 'INPUT') {\n this.inputEl = native;\n } else {\n // nếu gắn vào cha → tìm input con đầu tiên\n this.inputEl = native.querySelector('input');\n }\n }\n\n @HostListener('input', ['$event.target'])\n onInput(target: any) {\n if (!this.inputEl || target !== this.inputEl) return;\n\n const formattedValue = this.formatValue(this.inputEl.value);\n this.renderer.setProperty(this.inputEl, 'value', formattedValue);\n this.onChange(formattedValue);\n }\n\n writeValue(value: any): void {\n if (!this.inputEl) return;\n\n const formattedValue = value ? this.formatValue(value) : '';\n this.renderer.setProperty(this.inputEl, 'value', formattedValue);\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 (this.inputEl) {\n this.renderer.setProperty(this.inputEl, 'disabled', isDisabled);\n }\n }\n\n private formatValue(value: string): string {\n return value.replace(/\\D/g, '');\n }\n}\n","import { Directive, forwardRef, ElementRef, Renderer2 } from '@angular/core';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\n\n@Directive({\n selector: '[uppercaseFirstLetterEachWord]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => UpperCaseFirsLetterEachWordDirective),\n multi: true,\n },\n ],\n})\nexport class UpperCaseFirsLetterEachWordDirective implements ControlValueAccessor {\n private inputElement: HTMLInputElement | null = null;\n\n constructor(\n private el: ElementRef,\n private renderer: Renderer2,\n ) {}\n\n ngAfterViewInit() {\n setTimeout(() => {\n // Nếu gắn vào <input>, thì chính nó là input\n if (this.el.nativeElement.tagName.toLowerCase() === 'input') {\n this.inputElement = this.el.nativeElement;\n } else {\n // Nếu không, tìm input con bên trong\n this.inputElement = this.el.nativeElement.querySelector('input');\n }\n\n if (this.inputElement) {\n this.renderer.listen(this.inputElement, 'input', (event: any) => {\n const formatted = this.formatValue(event.target.value);\n this.renderer.setProperty(this.inputElement, 'value', formatted);\n this.onChange(formatted);\n });\n }\n\n if (this.pendingValue !== null) {\n this.renderer.setProperty(this.inputElement, 'value', this.pendingValue);\n this.pendingValue = null;\n }\n }, 0);\n }\n\n private pendingValue: any = null;\n\n writeValue(value: any): void {\n const formattedValue = value ? this.formatValue(value) : '';\n if (this.inputElement) {\n this.renderer.setProperty(this.inputElement, 'value', formattedValue);\n } else {\n this.pendingValue = formattedValue;\n }\n }\n\n onChange = (_: any) => {};\n onTouched = () => {};\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n if (this.inputElement) {\n this.renderer.setProperty(this.inputElement, 'disabled', isDisabled);\n }\n }\n\n private formatValue(value: string): string {\n return value\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n }\n}\n","import { Directive, ElementRef, forwardRef, HostListener, Renderer2 } from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Directive({\n selector: '[uppercaseFirstLetter]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => UppercaseFirstLetterDirective),\n multi: true,\n },\n ],\n})\nexport class UppercaseFirstLetterDirective {\n constructor(\n private el: ElementRef<HTMLElement>,\n private renderer: Renderer2,\n ) {}\n\n @HostListener('input', ['$event'])\n onInput(event: Event) {\n const target = event.target;\n\n if (!(target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement)) {\n return;\n }\n\n const formatted = this.formatValue(target.value);\n\n if (formatted !== target.value) {\n this.renderer.setProperty(target, 'value', formatted);\n }\n }\n\n private formatValue(value: string): string {\n if (!value) return value;\n\n return value.charAt(0).toUpperCase() + value.slice(1);\n }\n}\n","import { Directive, ElementRef, forwardRef, HostListener, Renderer2 } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\ntype TextControl = HTMLInputElement | HTMLTextAreaElement;\n\n@Directive({\n selector: '[uppercase]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => UppercaseDirective),\n multi: true,\n },\n ],\n})\nexport class UppercaseDirective implements ControlValueAccessor {\n onChange = (_: any) => {};\n onTouched = () => {};\n\n constructor(\n private el: ElementRef<TextControl>,\n private renderer: Renderer2,\n ) {}\n\n // ✅ strict safe\n @HostListener('input', ['$event'])\n onInput(event: Event) {\n const control = event.target as TextControl;\n\n const formatted = this.formatValue(control.value);\n\n // ✅ tránh update thừa\n if (formatted !== control.value) {\n this.renderer.setProperty(control, 'value', formatted);\n }\n\n this.onChange(formatted);\n }\n\n @HostListener('blur')\n onBlur() {\n this.onTouched();\n }\n\n writeValue(value: any): void {\n const formatted = value ? this.formatValue(value) : '';\n this.renderer.setProperty(this.el.nativeElement, 'value', formatted);\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 this.renderer.setProperty(this.el.nativeElement, 'disabled', isDisabled);\n }\n\n private formatValue(value: string): string {\n return value ? value.toUpperCase() : value;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'limitWords',\n})\nexport class LimitWordsPipe implements PipeTransform {\n transform(value: string, limit: number = 3): string {\n if (!value) return '';\n const words = value.split(' ');\n return words.length <= limit ? value : words.slice(0, limit).join(' ') + '...';\n }\n}\n","export class DownloadHelper {\n public static downloadFileBlop(response: any) {\n const contentDisposition = response.headers.get('Content-Disposition');\n let filename = 'downloaded-file';\n\n if (contentDisposition) {\n const filenameStarMatch = contentDisposition.match(/filename\\*\\=UTF-8''(.+?)(;|$)/);\n const filenameMatch = contentDisposition.match(/filename=\"?([^\"]+)\"?/);\n\n if (filenameStarMatch?.[1]) {\n filename = decodeURIComponent(filenameStarMatch[1]);\n } else if (filenameMatch?.[1]) {\n filename = filenameMatch[1];\n }\n }\n\n const blob = new Blob([response.body!], { type: 'application/octet-stream' });\n\n if (blob.size <= 4) {\n console.log(blob.size);\n\n alert('Không có dữ liệu file');\n return;\n }\n\n const link = document.createElement('a');\n link.href = window.URL.createObjectURL(blob);\n link.download = filename;\n link.click();\n }\n\n public static downloadFile(data: any, filename: string) {\n const contentType = 'application/octet-stream';\n const blob = new Blob([data], { type: contentType });\n\n if (blob.size <= 4) {\n console.log(blob.size);\n alert('Không có dữ liệu file');\n return;\n }\n\n const link = document.createElement('a');\n link.href = window.URL.createObjectURL(blob);\n link.download = filename;\n link.click();\n }\n\n public static downloadFileBase64(base64Data: string, fileName: string) {\n // Chuyển đổi Base64 thành dữ liệu nhị phân\n const binaryString = window.atob(base64Data);\n const binaryLen = binaryString.length;\n const bytes = new Uint8Array(binaryLen);\n\n for (let i = 0; i < binaryLen; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n // Tạo một Blob từ dữ liệu nhị phân\n const blob = new Blob([bytes], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' });\n\n if (blob.size <= 4) {\n console.log(blob.size);\n alert('Không có dữ liệu file');\n return;\n }\n\n // Tạo một liên kết tạm thời để tải tệp về\n const link = document.createElement('a');\n link.href = window.URL.createObjectURL(blob);\n link.download = fileName;\n\n // Kích hoạt việc tải tệp\n document.body.appendChild(link);\n link.click();\n\n // Xóa liên kết sau khi tải\n document.body.removeChild(link);\n }\n}\n","import * as XLSX from 'xlsx';\n\nexport class XLSXHelper {\n public static readExcelFileToObjects(file: File, columnCount?: number, readAllSheets?: boolean): Promise<any> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = (e: ProgressEvent<FileReader>) => {\n const data = new Uint8Array(e.target?.result as ArrayBuffer);\n const workbook = XLSX.read(data, { type: 'array' });\n\n const sheetNames = workbook.SheetNames;\n\n // Trả về nhiều sheet\n if (readAllSheets) {\n const sheetsdata: Record<string, any[]> = {};\n\n for (const sheetName of sheetNames) {\n const worksheet = workbook.Sheets[sheetName];\n const rawData: any[][] = XLSX.utils.sheet_to_json(worksheet, {\n header: 1,\n defval: '',\n });\n\n let rows = rawData.slice(1);\n\n while (rows.length > 0 && rows[rows.length - 1].every((cell) => cell === '' || cell == null)) {\n rows.pop();\n }\n\n const result = rows.map((row, index) => {\n const obj: any = {};\n const limit = columnCount ?? row.length;\n for (let i = 0; i < limit; i++) {\n obj[`col${i + 1}`] = row[i] ?? '';\n }\n obj.rowIndex = index + 2;\n return obj;\n });\n\n sheetsdata[sheetName] = result;\n }\n\n postMessage({\n sheets: sheetNames,\n sheetsdata,\n });\n\n resolve({\n sheets: sheetNames,\n sheetsdata,\n });\n }\n\n // Trả về sheet đầu tiên\n else {\n const sheetName = sheetNames[0];\n const worksheet = workbook.Sheets[sheetName];\n const rawData: any[][] = XLSX.utils.sheet_to_json(worksheet, {\n header: 1,\n defval: '',\n });\n\n let rows = rawData.slice(1);\n\n while (rows.length > 0 && rows[rows.length - 1].every((cell) => cell === '' || cell == null)) {\n rows.pop();\n }\n\n const result = rows.map((row, index) => {\n const obj: any = {};\n const limit = columnCount ?? row.length;\n for (let i = 0; i < limit; i++) {\n obj[`col${i + 1}`] = row[i] ?? '';\n }\n obj.rowIndex = index + 2;\n return obj;\n });\n\n resolve(result);\n }\n };\n\n reader.onerror = (error) => reject(error);\n reader.readAsArrayBuffer(file);\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Router, NavigationEnd } from '@angular/router';\nimport { AuthService } from '../auth/auth.service';\nimport { NotiService } from './noti.service';\n\n@Injectable({ providedIn: 'root' })\nexport class RouteMonitorService {\n constructor(\n private router: Router,\n private authService: AuthService,\n private notiService: NotiService,\n ) {\n this.router.events.subscribe(async (event) => {\n if (event instanceof NavigationEnd) {\n const url = event.urlAfterRedirects;\n\n if (url == '/' || url.startsWith('/login') || url == '/no-permission') {\n return;\n }\n\n const hasMenu = await this.authService.checkUserMenu(url);\n if (!hasMenu) {\n this.notiService.error(`Không có quyền truy cập: ${url}`);\n this.router.navigate(['/no-permission'], {\n state: {\n deniedUrl: url,\n message: `Bạn không có quyền truy cập vào đường dẫn ${url}`,\n },\n });\n }\n }\n });\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class ThemeService {\n setHighContrast(enabled: boolean) {\n document.body.classList.toggle('high-contrast', enabled);\n localStorage.setItem('high-contrast', enabled ? '1' : '0');\n }\n\n isHighContrast(): boolean {\n return localStorage.getItem('high-contrast') == '1';\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { NzModalService } from 'ng-zorro-antd/modal';\nimport { HTTPService } from './api-service/http.service';\nimport { NotiService } from './noti.service';\nimport { AppGlobals } from '../app-global';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class VscService extends HTTPService {\n public static feClientVersion = '{{POST_BUILD_ENTERS_VERSION_HERE}}';\n public static feServerVersion: string;\n public static beVersion: {};\n public static dbVersion: string;\n public static jsReportTemplateVersion: string;\n\n private modal = inject(NzModalService);\n private notiService = inject(NotiService);\n private interval: any;\n private isShowingPopup = false;\n\n // 10 phút\n public initVersionCheck(frequency = 1000 * 60 * 10) {\n this.interval = setInterval(() => {\n if (!this.isShowingPopup) {\n this.checkVersion();\n }\n }, frequency);\n this.checkVersion();\n }\n\n public checkVersion(all = false) {\n this.checkFrontendVersion();\n if (all) {\n this.checkBackendVersion();\n }\n }\n\n public checkFrontendVersion() {\n if (this.isShowingPopup) {\n return;\n }\n\n console.log('current version: ', VscService.feClientVersion);\n this.get(AppGlobals.versionCheck + '?t=' + new Date().getTime(), true).then(\n async (response: any) => {\n VscService.feServerVersion = response.version;\n console.log('version check: ', VscService.feServerVersion);\n const hashChanged = this.hasVersionChanged(VscService.feClientVersion, VscService.feServerVersion);\n if (hashChanged) {\n this.isShowingPopup = true;\n const modalRef = this.modal.warning({\n nzTitle: 'Có phiên bản mới',\n nzContent: 'Vui lòng ấn \"Ctrl + F5\" để cập nhật',\n });\n }\n },\n (err) => {\n console.error(err, 'Could not get version');\n },\n );\n }\n\n private hasVersionChanged(currentVersion: string, newVersion: string) {\n if (!currentVersion || newVersion === currentVersion) {\n return false;\n }\n return currentVersion !== newVersion;\n }\n\n public clearInterval() {\n if (this.interval) {\n clearInterval(this.interval);\n }\n }\n\n private checkBackendVersion() {\n this.get(AppGlobals.apiEndpoint + '/version', true).then(\n (res) => {\n VscService.beVersion = res;\n },\n (err) => {\n console.error(err, 'Could not get backend version');\n VscService.beVersion = 'Could not get backend version';\n },\n );\n }\n}\n","import { Directive, HostListener } from '@angular/core';\n\n@Directive({\n selector: 'img[hideIfError]',\n})\nexport class HideIfErrorDirective {\n @HostListener('error', ['$event'])\n onError(e: any) {\n e.target.remove(); // xóa luôn khỏi DOM\n }\n}\n","import { trigger, transition, style, animate } from '@angular/animations';\n\nexport const fadeInOut = trigger('fadeInOut', [\n transition(':enter', [\n style({ opacity: 0, transform: 'translateY(-5px)' }),\n animate('150ms ease-out', style({ opacity: 1, transform: 'translateY(0)' })),\n ]),\n transition(':leave', [animate('150ms ease-in', style({ opacity: 0, transform: 'translateY(-5px)' }))]),\n]);\n\nexport const fadeSlide = trigger('fadeSlide', [\n transition(':enter', [\n style({\n height: 0,\n opacity: 0,\n overflow: 'hidden',\n transform: 'translateY(-5px)',\n }),\n animate(\n '250ms ease-out',\n style({\n height: '*',\n opacity: 1,\n transform: 'translateY(0)',\n }),\n ),\n ]),\n\n transition(':leave', [\n style({\n height: '*',\n opacity: 1,\n overflow: 'hidden',\n transform: 'translateY(0)',\n }),\n animate(\n '200ms ease-in',\n style({\n height: 0,\n opacity: 0,\n transform: 'translateY(-5px)',\n }),\n ),\n ]),\n]);\n","import { inject, Injectable } from '@angular/core';\nimport { HttpParams } from '@angular/common/http';\nimport { HTTPService } from './api-service/http.service';\nimport { CommonService } from './api-service/common.service';\nimport { RespondData } from '../model';\nimport { AppGlobals } from '../app-global';\n\nexport const URLs = {\n getById: '/api/App_Setting/GetById',\n getAll: '/api/App_Setting/GetAll',\n getList: '/api/App_Setting/GetList',\n getPaging: '/api/App_Setting/GetPaging',\n addOrEdit: '/api/App_Setting/AddOrEdit',\n delete: '/api/App_Setting/Delete',\n getByCodeAnonymous: '/api/public/GetSettingByCode',\n GetAllConfig: '/api/App_Setting/GetAllConfig',\n ApplyConfig: '/api/Setting/ApplyConfig',\n GetDbInfo: '/api/App_Setting/GetDbInfo',\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SettingService extends HTTPService {\n commonService = inject(CommonService);\n\n getById(id: any): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Setting_getById',\n Params: [id],\n });\n }\n\n getAll(): Promise<RespondData> {\n return this.post(AppGlobals.apiEndpoint + URLs.getAll);\n }\n\n getList(filter: any): Promise<RespondData> {\n return this.postData(AppGlobals.apiEndpoint + URLs.getList, filter);\n }\n\n getPaging(filter: any): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Setting_getPaging',\n Params: [filter],\n });\n }\n\n addOrEdit(obj: any): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Setting_addOrEdit',\n Params: [obj],\n });\n }\n\n delete(id: any): Promise<RespondData> {\n const params = new HttpParams().append('id', id);\n return this.postParams(AppGlobals.apiEndpoint + URLs.delete, params);\n }\n\n getByCodeAnonymous(code: string) {\n const params = new HttpParams().append('Code', code);\n return this.getParams(AppGlobals.apiEndpoint + URLs.getByCodeAnonymous, params);\n }\n\n // getGroupByCodeAnonymous(code: string) {\n // const params = new HttpParams().append('Code', code);\n // return this.getParams(AppGlobals.apiEndpoint + URLs.getByCodeAnonymous, params);\n // }\n\n getAllConfig() {\n return this.post(AppGlobals.apiEndpoint + URLs.GetAllConfig);\n }\n\n applyConfig(config: any) {\n return this.postData(AppGlobals.apiEndpoint + URLs.ApplyConfig, config);\n }\n\n getDbInfo() {\n return this.post(AppGlobals.apiEndpoint + URLs.GetDbInfo);\n }\n}\n","// notification.service.ts\nimport { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\n\nexport interface NotificationItem {\n id: string;\n title: string;\n content: string;\n isRead: boolean;\n createdAt: Date;\n type: 'info' | 'success' | 'warning' | 'error';\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NotificationService {\n // Quản lý state bằng BehaviorSubject\n private notificationsSubject = new BehaviorSubject<NotificationItem[]>([]);\n private unreadCountSubject = new BehaviorSubject<number>(0);\n private isLoadingSubject = new BehaviorSubject<boolean>(false);\n\n // Expose ra cho Component subscribe bằng async pipe\n public notifications$ = this.notificationsSubject.asObservable();\n public unreadCount$ = this.unreadCountSubject.asObservable();\n public isLoading$ = this.isLoadingSubject.asObservable();\n\n constructor(private http: HttpClient) {}\n\n // Gọi API lấy thông báo lần đầu / phân trang\n loadNotifications(page: number = 1) {\n this.isLoadingSubject.next(true);\n // Giả lập gọi API HTTP\n this.http.get<any>(`/api/notifications?page=${page}`).subscribe({\n next: (res) => {\n const currentData = this.notificationsSubject.getValue();\n // Append dữ liệu mới vào dữ liệu cũ (cho Infinite Scroll)\n this.notificationsSubject.next([...currentData, ...res.data]);\n this.unreadCountSubject.next(res.unreadCount);\n this.isLoadingSubject.next(false);\n },\n error: () => this.isLoadingSubject.next(false),\n });\n }\n\n // Optimistic Update: Đánh dấu đã đọc trước khi API trả về để UX mượt\n markAsRead(id: string) {\n const currentNotis = this.notificationsSubject.getValue();\n const updatedNotis = currentNotis.map((noti) => (noti.id === id ? { ...noti, isRead: true } : noti));\n\n this.notificationsSubject.next(updatedNotis);\n this.unreadCountSubject.next(Math.max(0, this.unreadCountSubject.getValue() - 1));\n\n // Gọi API update background\n this.http.post(`/api/notifications/${id}/read`, {}).subscribe();\n }\n\n markAllAsRead() {\n // Tương tự markAsRead nhưng áp dụng cho toàn bộ danh sách\n }\n}\n","// notification-center.component.ts\nimport { Component, OnInit, ChangeDetectionStrategy } from '@angular/core';\nimport { NotificationService, NotificationItem } from './notification.service';\nimport { NzBadgeModule } from 'ng-zorro-antd/badge';\nimport { CommonModule } from '@angular/common';\nimport { NzPopoverModule } from 'ng-zorro-antd/popover';\nimport { NzSkeletonModule } from 'ng-zorro-antd/skeleton';\nimport { NzEmptyModule } from 'ng-zorro-antd/empty';\nimport { NzListModule } from 'ng-zorro-antd/list';\nimport { NzAvatarModule } from 'ng-zorro-antd/avatar';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\nimport { NzButtonModule } from 'ng-zorro-antd/button';\nimport { Box } from '../../../box';\n\n@Component({\n selector: 'app-notification-center',\n templateUrl: './notification-center.component.html',\n styleUrls: ['./notification-center.component.scss'],\n imports: [\n CommonModule,\n NzPopoverModule,\n NzBadgeModule,\n NzSkeletonModule,\n NzEmptyModule,\n NzListModule,\n NzAvatarModule,\n NzIconModule,\n NzButtonModule,\n Box,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NotificationCenterComponent implements OnInit {\n hasNoti = false;\n\n constructor(public notificationService: NotificationService) {}\n\n ngOnInit(): void {\n // Load trang đầu tiên khi khởi tạo\n this.notificationService.loadNotifications(1);\n }\n\n onNotificationClick(item: NotificationItem): void {\n if (!item.isRead) {\n this.notificationService.markAsRead(item.id);\n }\n // Logic điều hướng (Router.navigate) dựa vào loại thông báo...\n }\n\n onScrollDown(): void {\n // Logic gọi thêm dữ liệu khi cuộn xuống đáy (Infinite Scroll)\n // Có thể dùng thư viện ngx-infinite-scroll kết hợp với div danh sách\n }\n\n // Giúp Angular render lại DOM hiệu quả hơn thay vì render lại toàn bộ list\n trackById(index: number, item: NotificationItem): string {\n return item.id;\n }\n}\n","<div\n class=\"bell-trigger\"\n nz-popover\n [nzPopoverTitle]=\"notiTitle\"\n [nzPopoverContent]=\"notiContent\"\n nzPopoverTrigger=\"click\"\n nzPopoverPlacement=\"bottomCenter\"\n nzPopoverOverlayClassName=\"enterprise-noti-popover\"\n>\n <nz-badge [nzCount]=\"0\" [nzOverflowCount]=\"99\" nzSize=\"small\">\n <span nz-icon nzType=\"bell\" nzTheme=\"outline\" class=\"bell-icon\"></span>\n </nz-badge>\n</div>\n\n<ng-template #notiTitle>\n <div class=\"noti-header\">\n <span class=\"noti-title-text\">Thông báo</span>\n <a *ngIf=\"hasNoti\" class=\"noti-mark-read\">Đánh dấu đã đọc</a>\n </div>\n</ng-template>\n\n<ng-template #notiContent>\n <div class=\"noti-body\">\n @if (!hasNoti) {\n <box [height]=\"8\"></box>\n <nz-empty nzNotFoundContent=\"Không có Thông báo\"></nz-empty>\n } @else {\n <nz-list nzItemLayout=\"horizontal\" [nzSplit]=\"false\">\n <nz-list-item class=\"noti-item unread\">\n <nz-list-item-meta\n [nzAvatar]=\"avatarTemplate\"\n nzTitle=\"Hệ thống bảo trì\"\n nzDescription=\"Hệ thống sẽ bảo trì vào 12:00 đêm nay.\"\n ></nz-list-item-meta>\n </nz-list-item>\n\n <nz-list-item class=\"noti-item\">\n <nz-list-item-meta\n [nzAvatar]=\"avatarTemplate\"\n nzTitle=\"Báo cáo tuần đã sẵn sàng\"\n nzDescription=\"Nhấn vào để xem chi tiết báo cáo. Nhấn vào để xem chi tiết báo cáo.\"\n ></nz-list-item-meta>\n </nz-list-item>\n </nz-list>\n\n <ng-template #avatarTemplate>\n <nz-avatar nzIcon=\"info\" class=\"noti-avatar\"></nz-avatar>\n </ng-template>\n }\n </div>\n</ng-template>\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, OnInit } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { NzBackTopModule } from 'ng-zorro-antd/back-top';\nimport { NzButtonModule } from 'ng-zorro-antd/button';\nimport { NzDrawerModule } from 'ng-zorro-antd/drawer';\nimport { NzDropDownModule } from 'ng-zorro-antd/dropdown';\nimport { NzFlexModule } from 'ng-zorro-antd/flex';\nimport { NzGridModule } from 'ng-zorro-antd/grid';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\nimport { NzInputModule } from 'ng-zorro-antd/input';\nimport { NzLayoutModule } from 'ng-zorro-antd/layout';\nimport { NzSegmentedModule } from 'ng-zorro-antd/segmented';\nimport { NzTreeModule } from 'ng-zorro-antd/tree';\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\nimport { NzBadgeModule } from 'ng-zorro-antd/badge';\n\nimport { fadeInOut } from '../../fade-animations';\nimport { BaseComponent } from '../../base.component';\nimport { AuthService } from '../../../auth/auth.service';\nimport { SessionManagerService } from '../../../auth/session-manager.service';\nimport { CommonService } from '../../../services/api-service/common.service';\nimport { TokenStorage } from '../../../auth/token.storage';\nimport { App_Org } from '../../../model';\nimport { SettingService } from '../../../services/setting.service';\nimport { NotificationCenterComponent } from './notification/notification-center.component';\n\n@Component({\n selector: 'layout-user',\n templateUrl: './layout-user.html',\n styleUrl: './layout-user.scss',\n imports: [\n CommonModule,\n TranslateModule,\n NzLayoutModule,\n NzIconModule,\n NzDropDownModule,\n NzGridModule,\n NzFlexModule,\n NzButtonModule,\n NzTreeModule,\n NzBackTopModule,\n NzDrawerModule,\n FormsModule,\n NzInputModule,\n NzTreeModule,\n NzSegmentedModule,\n NzBadgeModule,\n NotificationCenterComponent,\n ],\n\n animations: [fadeInOut],\n})\nexport class LayoutUser extends BaseComponent implements OnInit {\n cms = inject(CommonService);\n authService = inject(AuthService);\n sessionManager = inject(SessionManagerService);\n breakpointObserver = inject(BreakpointObserver);\n settingService = inject(SettingService);\n\n TokenStorage = TokenStorage;\n\n isXSmall = false;\n\n lstOrg: App_Org[] = [];\n isOneUserMultiOrgs = false;\n\n ngOnInit(): void {\n this.breakpointObserver.observe([Breakpoints.XSmall, Breakpoints.Small]).subscribe((result) => {\n this.isXSmall = result.matches;\n });\n\n this.settingService.getByCodeAnonymous('ONE_USER_MULTI_ORGS').then(\n (res) => {\n if (res?.Data) {\n if (res.Data == '1') {\n this.isOneUserMultiOrgs = true;\n this.getLstOrg();\n }\n }\n },\n (err) => this.handleError(err),\n );\n }\n\n getLstOrg() {\n this.cms\n .ESP({\n SPN: 'App_User_getLstOrg',\n })\n .then(\n (res) => (this.lstOrg = res.Data),\n (err) => this.handleError(err),\n );\n }\n\n async changeOrg(org: App_Org) {\n if (await this.confirm(`Chuyển sang đơn vị: ${org.Name}`)) {\n this.authService.changeOrg(org).then(\n async (res) => {\n if (res) {\n await this.notiService.success(`Đã chuyển sang đơn vị: ${org.Name}`, '', true);\n window.location.reload();\n }\n },\n (err) => this.handleError(err),\n );\n }\n }\n\n gotoSetting() {\n this.goto('/admin/user_profile');\n }\n\n logout() {\n this.sessionManager.logout();\n }\n}\n","<app-notification-center></app-notification-center>\n\n<button\n *ngIf=\"!isXSmall && TokenStorage.getOrgName()\"\n class=\"org-info\"\n [@fadeInOut]\n nz-button\n nzType=\"text\"\n nz-dropdown\n [nzDropdownMenu]=\"isOneUserMultiOrgs ? menuOrg : null\"\n [nzTrigger]=\"'click'\"\n style=\"height: var(--app-header-height); color: #ffffff\"\n>\n <nz-icon nzType=\"cluster\" nzTheme=\"outline\" />\n {{ TokenStorage.getOrgName() }}\n</button>\n\n<nz-dropdown-menu #menuOrg=\"nzDropdownMenu\">\n <ul nz-menu>\n @for (org of lstOrg; track $index) {\n <li *ngIf=\"$index > 0\" nz-menu-divider></li>\n <li nz-menu-item (click)=\"changeOrg(org)\">\n <nz-icon nzType=\"swap\" nzTheme=\"outline\" />&nbsp;&nbsp; {{ org.Name }}\n </li>\n }\n </ul>\n</nz-dropdown-menu>\n\n<button\n class=\"user-info\"\n nz-button\n nzType=\"text\"\n nz-dropdown\n [nzDropdownMenu]=\"menuUser\"\n [nzTrigger]=\"'click'\"\n style=\"height: var(--app-header-height); color: #ffffff\"\n>\n <nz-icon nzType=\"user\" nzTheme=\"outline\" />\n {{ TokenStorage.getUserFullname() }}\n</button>\n\n<nz-dropdown-menu #menuUser=\"nzDropdownMenu\">\n <ul nz-menu>\n <li *ngIf=\"!(!isXSmall && TokenStorage.getOrgName())\" nz-menu-item>\n <nz-icon nzType=\"cluster\" nzTheme=\"outline\" />&nbsp;&nbsp; {{ TokenStorage.getOrgName() }}\n </li>\n <li *ngIf=\"!(!isXSmall && TokenStorage.getOrgName())\" nz-menu-divider></li>\n <li nz-menu-item (click)=\"gotoSetting()\">\n <nz-icon nzType=\"setting\" nzTheme=\"outline\" />&nbsp;&nbsp; {{ TranslateKey.SETTING | translate }}\n </li>\n <li nz-menu-divider></li>\n <li nz-menu-item (click)=\"logout()\">\n <nz-icon nzType=\"logout\" nzTheme=\"outline\" />&nbsp;&nbsp; {{ TranslateKey.LOGOUT | translate }}\n </li>\n </ul>\n</nz-dropdown-menu>\n","import { inject, Injectable } from '@angular/core';\nimport { HttpParams } from '@angular/common/http';\nimport { firstValueFrom, Observable } from 'rxjs';\nimport { HTTPService } from './api-service/http.service';\nimport { CommonService, ENUM_ResponseType } from './api-service/common.service';\nimport { RespondData } from '../model';\nimport { AppGlobals } from '../app-global';\n\nexport const URLs = {\n getById: '/api/file/GetById',\n getAll: '/api/file/GetAll',\n getList: '/api/file/GetList',\n getPaging: '/api/file/GetPaging',\n addOrEdit: '/api/file/AddOrEdit',\n delete: '/api/file/Delete',\n addFileWithRef: '/api/file/addFileWithRef',\n moveFileToDisk: '/api/file/MoveFileToDisk',\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FileService extends HTTPService {\n cms = inject(CommonService);\n\n getById(id: any): Promise<RespondData> {\n return this.cms.ESP({\n SPN: 'App_File_getByIdJson',\n Params: [id],\n });\n }\n\n getAll(): Promise<RespondData> {\n return this.post(AppGlobals.apiEndpoint + URLs.getAll);\n }\n\n getList(filter: any): Promise<RespondData> {\n return this.postData(AppGlobals.apiEndpoint + URLs.getList, filter);\n }\n\n getPaging(filter: any): Promise<RespondData> {\n return this.cms.ESP({\n SPN: 'App_File_getpaging',\n Params: [filter],\n });\n }\n\n addOrEdit(obj: any): Promise<RespondData> {\n return this.postData(AppGlobals.apiEndpoint + URLs.addOrEdit, obj);\n }\n\n delete(id: any): Promise<RespondData> {\n const params = new HttpParams().append('id', id);\n return this.postParams(AppGlobals.apiEndpoint + URLs.delete, params);\n }\n\n downloadFile(id: string) {\n const params = new HttpParams().append('id', id);\n return firstValueFrom(\n this.httpClient.post(\n `${AppGlobals.apiEndpoint}/api/file/downloadFile`,\n {},\n { responseType: ENUM_ResponseType.ARRAYBUFFER, params: params },\n ),\n );\n }\n\n downloadFileByCode(Code: string) {\n const params = new HttpParams().append('Code', Code);\n return firstValueFrom(\n this.httpClient.post(\n `${AppGlobals.apiEndpoint}/api/file/downloadFileByCode`,\n {},\n { responseType: ENUM_ResponseType.BLOB, observe: 'response', params: params },\n ),\n );\n }\n\n downloadFileBase64(id: string) {\n const params = new HttpParams().append('id', id);\n return this.postParams(`${AppGlobals.apiEndpoint}/api/file/DownloadFileBase64`, params);\n }\n\n downloadFileBase64ByCode(Code: string) {\n const params = new HttpParams().append('Code', Code);\n return this.postParams(`${AppGlobals.apiEndpoint}/api/file/DownloadFileBase64ByCode`, params);\n }\n\n getFileVersion(code: string): Observable<RespondData> {\n return this.httpClient.get(\n AppGlobals.apiEndpoint + '/api/file/fileversion?code=' + code,\n ) as Observable<RespondData>;\n }\n\n getFile(id: string): Observable<Blob> {\n return this.httpClient.get(AppGlobals.apiEndpoint + '/api/file/image?id=' + id, {\n responseType: ENUM_ResponseType.BLOB,\n });\n }\n\n getImage(id: string): Observable<Blob> {\n return this.httpClient.get(AppGlobals.apiEndpoint + '/api/file/image?id=' + id, {\n responseType: ENUM_ResponseType.BLOB,\n });\n }\n\n getAudio(id: string): Observable<Blob> {\n return this.httpClient.get(AppGlobals.apiEndpoint + '/api/file/get-audio?id=' + id, {\n responseType: ENUM_ResponseType.BLOB,\n });\n }\n\n getVideo(id: string): Observable<Blob> {\n return this.httpClient.get(AppGlobals.apiEndpoint + '/api/file/get-video?id=' + id, {\n responseType: ENUM_ResponseType.BLOB,\n });\n }\n\n addFileWithRef(obj: any) {\n return this.postData(AppGlobals.apiEndpoint + URLs.addFileWithRef, obj);\n }\n\n getAnhWithRef(Ref_Table: string, Ref_Id: string): Promise<RespondData> {\n return this.cms.ESP({\n SPN: 'App_File_getAnhWithRef',\n Params: [Ref_Table, Ref_Id],\n });\n }\n\n moveFileToDisk(obj: any) {\n return this.postData(AppGlobals.apiEndpoint + URLs.moveFileToDisk, obj);\n }\n}\n","import { Injectable } from '@angular/core';\nimport * as signalR from '@microsoft/signalr';\nimport { TokenStorage } from '../auth/token.storage';\nimport { AppGlobals } from '../app-global';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SignalRService {\n public static connection: signalR.HubConnection;\n\n public static sendRequestLoginStatus() {\n if (this.connection.state == signalR.HubConnectionState.Connected) {\n // console.log('Send RequestLoginStatus');\n this.connection\n .send('RequestLoginStatus')\n .then()\n .catch((err) => console.log(err));\n }\n }\n\n public static initNoti() {\n this.connection = SignalRService.getConnection();\n this.registerAction();\n }\n\n private static registerAction() {\n this.connection.on('BroadcastMessage', (msg: string) => {\n // console.log('SignalR on BroadcastMessage: ' + msg);\n });\n\n this.connection.on('RequestLoginStatus', (ConnectionId: string) => {\n // console.log('Received RequestLoginStatus ConnectionId: ' + ConnectionId);\n this.connection\n .send('ResponseLoginStatus', ConnectionId)\n .then()\n .catch((err) => console.log(err));\n });\n }\n\n public static getConnection() {\n const connection = new signalR.HubConnectionBuilder()\n .configureLogging(signalR.LogLevel.Error)\n .withUrl(AppGlobals.apiEndpoint + '/notify', { accessTokenFactory: () => TokenStorage.getToken() || '' })\n .withAutomaticReconnect()\n .build();\n\n connection.serverTimeoutInMilliseconds = 120 * 1000;\n\n connection\n .start()\n .then(() => {\n console.log('SignalR Connected! ConnectionId:', connection.connectionId);\n })\n .catch((err) => {\n return console.error(err.toString());\n });\n\n connection.onreconnecting((error) => {\n console.warn('SignalR Reconnecting...', error?.message);\n });\n\n connection.onreconnected((connectionId) => {\n console.log('SignalR Reconnected! New ConnectionId:', connectionId);\n });\n\n connection.onclose((err) => {\n console.log('SignalR Disconnected!');\n if (err) {\n console.error(err.toString());\n }\n });\n\n return connection;\n }\n\n public static disconnect() {\n if (this.connection) {\n this.connection.stop();\n }\n }\n}\n","import { Component, inject, OnDestroy, OnInit } from '@angular/core';\nimport { RouterLink, RouterOutlet } from '@angular/router';\nimport { NzLayoutModule } from 'ng-zorro-antd/layout';\nimport { Title } from '@angular/platform-browser';\nimport { CommonModule } from '@angular/common';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\nimport { NzDropDownModule } from 'ng-zorro-antd/dropdown';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { NzButtonModule } from 'ng-zorro-antd/button';\nimport { NzFlexModule } from 'ng-zorro-antd/flex';\nimport { NzGridModule } from 'ng-zorro-antd/grid';\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\nimport { NzFormatEmitEvent, NzTreeModule, NzTreeNode } from 'ng-zorro-antd/tree';\nimport { NzBackTopModule } from 'ng-zorro-antd/back-top';\nimport { NzDrawerModule } from 'ng-zorro-antd/drawer';\nimport { FormsModule } from '@angular/forms';\nimport { NzInputModule } from 'ng-zorro-antd/input';\nimport { NzSegmentedModule } from 'ng-zorro-antd/segmented';\nimport { map, Subject, takeUntil } from 'rxjs';\nimport { Breadcrumb } from '../breadcrumb/breadcrumb';\nimport { Box } from '../box';\nimport { LayoutUser } from './layout-user/layout-user';\nimport { IconDelete, IconSearch } from '../../icon';\nimport { HighlightPipe } from '../../pipe/highlight.pipe';\nimport { HideIfErrorDirective } from '../../directive/img-hide-if-error.directive';\nimport { BaseComponent } from '../base.component';\nimport { VscService } from '../../services/vsc.service';\nimport { AuthService } from '../../auth/auth.service';\nimport { SettingService } from '../../services/setting.service';\nimport { LoadingService } from '../../services/loading.service';\nimport { FileService } from '../../services/file.service';\nimport { TokenStorage } from '../../auth/token.storage';\nimport { fadeInOut } from '../fade-animations';\nimport { SignalRService } from '../../services/signalr.service';\nimport { DeviceService } from '../../services/device-service';\nimport { AppGlobals } from '../../app-global';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nclass App_Menu {\n // #region properties\n App_Menu_Id: string;\n App_Org_Id: string;\n IsActive: boolean;\n Name: string;\n TranslateKey: string;\n Url: string;\n Icon: string;\n OrderValue: number;\n ParentId: string;\n IsHidden: boolean;\n TreeNodeName: string;\n TreeNodeOrder: string;\n IsHeaderMenu: boolean;\n // #endregion properties\n\n Level: number;\n Open: boolean;\n SubMenu: App_Menu[] | undefined;\n ParentName: string;\n\n HasEditMenu: boolean; // for role menu ref\n AllSubHasEditMenu: boolean;\n SomeSubHasEditMenu: boolean;\n\n HasViewMenu: boolean; // for role menu ref\n AllSubHasViewMenu: boolean;\n SomeSubHasViewMenu: boolean;\n\n [key: string]: any;\n\n constructor(obj?: any) {\n obj = obj || {};\n\n this.App_Menu_Id = obj.App_Menu_Id || '';\n this.App_Org_Id = obj.App_Org_Id || '';\n this.IsActive = obj.IsActive || null;\n this.Name = obj.Name || '';\n this.TranslateKey = obj.TranslateKey || '';\n this.ParentId = obj.ParentId || '';\n this.Url = obj.Url || '';\n this.Icon = obj.Icon || '';\n this.OrderValue = obj.OrderValue || null;\n this.IsHidden = obj.IsHidden || false;\n this.TreeNodeOrder = obj.TreeNodeOrder || '';\n this.IsHeaderMenu = obj.IsHeaderMenu || false;\n\n this.TreeNodeName = obj.TreeNodeName;\n this.Level = obj.Level;\n this.Open = obj.Open;\n this.SubMenu = obj.SubMenu;\n this.ParentName = obj.ParentName;\n this.HasEditMenu = obj.HasEditMenu;\n this.AllSubHasEditMenu = obj.AllSubHasEditMenu;\n this.SomeSubHasEditMenu = obj.SomeSubHasEditMenu;\n this.HasViewMenu = obj.HasViewMenu;\n this.AllSubHasViewMenu = obj.AllSubHasViewMenu;\n this.SomeSubHasViewMenu = obj.SomeSubHasViewMenu;\n }\n}\n\n@Component({\n selector: 'layout',\n templateUrl: './layout.component.html',\n styleUrl: './layout.component.scss',\n imports: [\n CommonModule,\n RouterLink,\n RouterOutlet,\n TranslateModule,\n NzLayoutModule,\n NzIconModule,\n NzDropDownModule,\n NzGridModule,\n NzFlexModule,\n NzButtonModule,\n Breadcrumb,\n NzTreeModule,\n NzBackTopModule,\n NzDrawerModule,\n FormsModule,\n NzInputModule,\n NzTreeModule,\n Box,\n NzSegmentedModule,\n LayoutUser,\n IconDelete,\n IconSearch,\n HighlightPipe,\n HideIfErrorDirective,\n ],\n animations: [fadeInOut],\n})\nexport class LayoutComponent extends BaseComponent implements OnInit, OnDestroy {\n vscService = inject(VscService);\n authService = inject(AuthService);\n settingService = inject(SettingService);\n titleService = inject(Title);\n loadingService = inject(LoadingService);\n fileService = inject(FileService);\n breakpointObserver = inject(BreakpointObserver);\n device = inject(DeviceService);\n\n TokenStorage = TokenStorage;\n\n MENU_TYPE = 0;\n HEADER_MENU_IN_USE = false;\n SYSTEM_NAME = '';\n SYSTEM_SUB_NAME_LEFT = '';\n SYSTEM_SUB_NAME_RIGHT = '';\n isCollapsed = false; // đóng mở menu, true là đóng\n isXSmall = false;\n\n nodes: NzTreeNode[] = [];\n selectedKeys: any[] = [];\n expandedKeys: any[] = [];\n\n lstMenu: App_Menu[] = [];\n // siderWidth = '256px'\n // siderWidth = '300px';\n get siderWidth(): string {\n // return this.isCollapsed ? '60px' : '300px';\n return this.isCollapsed ? '60px' : localStorage.getItem('side-width') || '300px';\n }\n\n get siderWidthStorage(): string {\n return localStorage.getItem('side-width') || '300px';\n }\n\n visibleMenuDrawer = false;\n\n searchValue = '';\n\n lstHeaderMenu: App_Menu[] = [];\n lstHeaderMenuDisplay: string[] = [];\n selectedHeaderMenuDisplay?: string;\n\n logoUrl$ = this.fileService\n .getFileVersion('LOGO')\n .pipe(map((res) => `${AppGlobals.apiEndpoint}/api/file/image?code=LOGO&v=${res || ''}`));\n\n private destroy$ = new Subject<void>();\n\n async ngOnInit(): Promise<void> {\n this.vscService.initVersionCheck();\n SignalRService.initNoti();\n\n this.authService.getUserHeaderMenu().then((res) => {\n this.lstHeaderMenu = res.Data || [];\n this.lstHeaderMenuDisplay = this.lstHeaderMenu.map(\n (x) =>\n `${x.TreeNodeOrder.split('.')\n .map((y) => +y)\n .join('.')}. ${x.Name}`,\n );\n\n this.selectedHeaderMenuDisplay = sessionStorage.getItem('HEADER_MENU_selected') || '';\n });\n\n await this.settingService.getByCodeAnonymous('MENU_TYPE').then((res) => {\n if (res?.Data) {\n this.MENU_TYPE = res.Data;\n }\n });\n\n this.getUserMenu(sessionStorage.getItem('HEADER_MENU_ID_selected') || '');\n\n this.settingService.getByCodeAnonymous('SYSTEM_NAME').then((res) => {\n if (res?.Data) {\n this.SYSTEM_NAME = res.Data;\n this.titleService.setTitle(this.SYSTEM_NAME);\n }\n });\n\n this.settingService.getByCodeAnonymous('SYSTEM_SUB_NAME_LEFT').then((res) => {\n if (res?.Data) {\n this.SYSTEM_SUB_NAME_LEFT = res.Data;\n }\n });\n\n this.settingService.getByCodeAnonymous('SYSTEM_SUB_NAME_RIGHT').then((res) => {\n if (res?.Data) {\n this.SYSTEM_SUB_NAME_RIGHT = res.Data;\n }\n });\n\n this.settingService.getByCodeAnonymous('SYSTEM_HEADER_MENU_IN_USE').then((res) => {\n if (res?.Data) {\n this.HEADER_MENU_IN_USE = res.Data ?? false;\n }\n });\n\n this.breakpointObserver.observe([Breakpoints.XSmall, Breakpoints.Small]).subscribe((result) => {\n this.isXSmall = result.matches;\n });\n\n this.routeChange$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((url) => this.selectNodeByUrl(url));\n\n setTimeout(() => {\n this.isCollapsed = localStorage.getItem('MENU_isCollapsed') == '1' || this.device.isMobile;\n // if (this.isCollapsed) {\n // this.visibleMenuDrawer = true;\n // }\n }, 0);\n\n // this.device\n // .isMobile$()\n // .pipe(takeUntil(this.destroy$))\n // .subscribe((isMobile) => {\n // this.isCollapsed = isMobile;\n // });\n\n this.device\n .innerWidth$()\n .pipe(takeUntil(this.destroy$))\n .subscribe((innerWidth) => {\n this.isCollapsed = innerWidth <= 1280;\n });\n\n this.isCollapsed = localStorage.getItem('MENU_isCollapsed') == '1';\n }\n\n ngOnDestroy(): void {\n SignalRService.disconnect();\n }\n\n getUserMenu(headerMenuId = '') {\n this.authService.getUserMenu(headerMenuId).then((res) => {\n this.lstMenu = res.Data || [];\n this.nodes = this.buildNzTreeFromSubMenu(this.lstMenu);\n this.updateOpenMenus();\n this.selectNodeByUrl(this.router.url);\n });\n }\n\n updateOpenMenus() {\n if (this.isCollapsed) return;\n\n const currentUrl = this.router.url;\n\n this.lstMenu.forEach((lv1) => {\n if (lv1.SubMenu) {\n if (lv1.SubMenu.some((x) => currentUrl.includes(x.Url))) {\n lv1.Open = true;\n }\n\n lv1.SubMenu.forEach((lv2) => {\n if (lv2.SubMenu) {\n if (lv2.SubMenu.some((x) => currentUrl.includes(x.Url))) {\n lv2.Open = true;\n lv1.Open = true;\n }\n\n lv2.SubMenu.forEach((lv3) => {\n if (lv3.SubMenu) {\n if (lv3.SubMenu.some((x) => currentUrl.includes(x.Url))) {\n lv3.Open = true;\n lv2.Open = true;\n lv1.Open = true;\n }\n }\n });\n }\n });\n }\n });\n }\n\n nzEvent(event: NzFormatEmitEvent): void {\n const data = event.node?.origin;\n\n if (event.node) {\n event.node.isSelected = true;\n event.node.isExpanded = true;\n }\n\n if (data?.['url']) {\n this.goto(data?.['url']);\n } else {\n this.goto('/');\n }\n }\n\n buildNzTreeFromSubMenu(menus: App_Menu[], parentKey: string = ''): any[] {\n return menus.map((m) => {\n return {\n title: `${m.TreeNodeOrder.split('.')\n .map((x) => +x)\n .join('.')}. ${m.Name}`,\n no: `${m.TreeNodeOrder.split('.')\n .map((x) => +x)\n .join('.')}`,\n key: m.App_Menu_Id,\n // expanded: true,\n expanded: false,\n isLeaf: !m.SubMenu || m.SubMenu.length === 0,\n children: m.SubMenu ? this.buildNzTreeFromSubMenu(m.SubMenu, m.App_Menu_Id) : [],\n url: m.Url,\n parentKey: parentKey,\n };\n });\n }\n\n private selectNodeByUrl(url: string) {\n this.selectedKeys = [];\n this.expandedKeys = [];\n\n const traverse = (nodes: NzTreeNode[]) => {\n for (const node of nodes) {\n node.isSelected = false; // reset\n if ((node as any)['url'] && url.startsWith((node as any)['url'])) {\n this.selectedKeys = [node.key];\n this.expandParents(node);\n\n // Scroll node vào viewport\n setTimeout(() => {\n const el = document.querySelector('.ant-tree-node-selected') as HTMLElement;\n const sider = document.querySelector('.menu-sidebar') as HTMLElement; // chính là nz-sider\n\n if (el && sider) {\n const elRect = el.getBoundingClientRect();\n const siderRect = sider.getBoundingClientRect();\n\n const isAbove = elRect.top < siderRect.top;\n const isBelow = elRect.bottom > siderRect.bottom;\n\n if (isAbove || isBelow) {\n el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }\n }, 500);\n }\n if (node.children && node.children.length > 0) {\n traverse(node.children as NzTreeNode[]);\n }\n }\n };\n traverse(this.nodes);\n }\n\n // expand tất cả cha của node để nó hiển thị\n private expandParents(node: NzTreeNode) {\n let parentKey = (node as any).parentKey;\n\n while (parentKey) {\n this.expandedKeys = [...this.expandedKeys, parentKey];\n\n // Tìm parent node theo parentKey\n const parentNode = this.findNodeByKey(this.nodes, parentKey);\n if (parentNode) {\n parentKey = (parentNode as any).parentKey; // tiếp tục lên cấp cha\n } else {\n break;\n }\n }\n }\n\n // Hàm tìm node theo key trong toàn bộ tree\n private findNodeByKey(nodes: NzTreeNode[], key: string): NzTreeNode | null {\n for (const node of nodes) {\n if (node.key === key) {\n return node;\n }\n if (node.children && node.children.length > 0) {\n const found = this.findNodeByKey(node.children as NzTreeNode[], key);\n if (found) {\n return found;\n }\n }\n }\n return null;\n }\n\n triggerCollapse() {\n this.isCollapsed = !this.isCollapsed;\n localStorage.setItem('MENU_isCollapsed', this.isCollapsed ? '1' : '0');\n }\n\n handleValueChangeHeaderMenu(e: any): void {\n const i = this.lstHeaderMenuDisplay.indexOf(e);\n const menu = this.lstHeaderMenu[i];\n\n sessionStorage.setItem('HEADER_MENU_selected', e);\n sessionStorage.setItem('HEADER_MENU_ID_selected', menu.App_Menu_Id);\n\n this.getUserMenu(menu.App_Menu_Id);\n if (menu.Url) {\n this.goto(menu.Url);\n } else {\n this.goto('/');\n }\n }\n}\n","<nz-layout class=\"app-layout\">\n <nz-header class=\"app-header\">\n <div nz-row nzAlign=\"middle\" class=\"header-content\">\n @if (isCollapsed) {\n <div @fadeInOut>\n &nbsp;\n <button nz-button nzType=\"text\" style=\"color: var(--theme-text-color)\" (click)=\"visibleMenuDrawer = true\">\n <nz-icon nzType=\"menu\" nzTheme=\"outline\" />\n </button>\n </div>\n }\n\n <div class=\"header-logo\" [style.width]=\"!isCollapsed ? siderWidthStorage : '100px'\">\n <div nz-flex nzJustify=\"center\" nzGap=\"small\" style=\"line-height: var(--app-header-height)\">\n <img\n *ngIf=\"logoUrl$ | async as url\"\n [src]=\"url\"\n height=\"var(--app-header-height)\"\n style=\"padding: 4px\"\n hideIfError\n />\n @if (SYSTEM_NAME) {\n <h2 style=\"color: whitesmoke; margin-bottom: 0\">{{ SYSTEM_NAME }}</h2>\n } @else {\n -- o0o --\n }\n </div>\n </div>\n @if (!HEADER_MENU_IN_USE) {\n <box [width]=\"8\"></box>\n <app-breadcrumb [@fadeInOut] nz-col nzFlex=\"auto\" class=\"breadcrumb-header\"></app-breadcrumb>\n }\n <div *ngIf=\"HEADER_MENU_IN_USE\" nz-col nzFlex=\"auto\" class=\"header-menu\">\n <div style=\"overflow: auto\">\n <nz-segmented\n [nzOptions]=\"lstHeaderMenuDisplay\"\n [(ngModel)]=\"selectedHeaderMenuDisplay\"\n (nzValueChange)=\"handleValueChangeHeaderMenu($event)\"\n ></nz-segmented>\n </div>\n </div>\n <layout-user></layout-user>\n </div>\n </nz-header>\n <nz-layout class=\"body-layout\">\n <nz-sider\n class=\"menu-sidebar\"\n nzCollapsible\n [nzWidth]=\"siderWidth\"\n [nzCollapsedWidth]=\"0\"\n [(nzCollapsed)]=\"isCollapsed\"\n [nzTrigger]=\"null\"\n [nzTheme]=\"'dark'\"\n >\n <div class=\"menu-wapper\">\n @if (MENU_TYPE == 1) {\n <div class=\"nz-tree-wapper\">\n <nz-tree\n [nzData]=\"nodes\"\n [nzSearchValue]=\"searchValue\"\n [nzShowLine]=\"true\"\n [nzSelectedKeys]=\"selectedKeys\"\n [nzExpandedKeys]=\"expandedKeys\"\n (nzClick)=\"nzEvent($event)\"\n ></nz-tree>\n </div>\n } @else {\n <div class=\"nz-tree-wapper\">\n <ul nz-menu nzTheme=\"light\" nzMode=\"inline\" [nzInlineCollapsed]=\"isCollapsed\">\n @for (menuLv1 of lstMenu; track menuLv1.App_Menu_Id) {\n @if (menuLv1.SubMenu) {\n <ul nz-submenu [nzOpen]=\"menuLv1.Open\" [nzTitle]=\"menuLv1.Name\" [nzIcon]=\"menuLv1.Icon\">\n @for (menuLv2 of menuLv1.SubMenu; track menuLv2.App_Menu_Id) {\n @if (menuLv2.SubMenu) {\n <ul nz-submenu [nzOpen]=\"menuLv2.Open\" [nzTitle]=\"menuLv2.Name\" [nzIcon]=\"menuLv2.Icon\">\n @for (menuLv3 of menuLv2.SubMenu; track menuLv3.App_Menu_Id) {\n @if (menuLv3.SubMenu) {\n <ul nz-submenu [nzOpen]=\"menuLv3.Open\" [nzTitle]=\"menuLv3.Name\" [nzIcon]=\"menuLv3.Icon\">\n @for (menuLv4 of menuLv3.SubMenu; track menuLv4.App_Menu_Id) {\n @if (menuLv4.SubMenu) {\n <ul\n nz-submenu\n [nzOpen]=\"menuLv4.Open\"\n [nzTitle]=\"menuLv4.Name\"\n [nzIcon]=\"menuLv4.Icon\"\n >\n @for (menuLv5 of menuLv4.SubMenu; track menuLv5.App_Menu_Id) {}\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <a\n [routerLink]=\"menuLv4.Url\"\n [innerHTML]=\"menuLv4.Name | highlight: searchValue\"\n ></a>\n </li>\n }\n }\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <a [routerLink]=\"menuLv3.Url\" [innerHTML]=\"menuLv3.Name | highlight: searchValue\"></a>\n </li>\n }\n }\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <a [routerLink]=\"menuLv2.Url\" [innerHTML]=\"menuLv2.Name | highlight: searchValue\"></a>\n </li>\n }\n }\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <a [routerLink]=\"menuLv1.Url\" [innerHTML]=\"menuLv1.Name | highlight: searchValue\"></a>\n </li>\n }\n }\n </ul>\n </div>\n }\n\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input placeholder=\"Tìm menu\" [(ngModel)]=\"searchValue\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <span class=\"suffix-wrap\">\n <icon-delete\n class=\"suffix-icon delete\"\n [class.show]=\"searchValue\"\n [size]=\"14\"\n (click)=\"searchValue = ''\"\n ></icon-delete>\n\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\n </span>\n </ng-template>\n </div>\n <div class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 0.8em; color: lightgray\">\n {{ SYSTEM_SUB_NAME_LEFT || \"-- o0o --\" }}\n\n <span style=\"float: right\" (click)=\"triggerCollapse()\">\n <nz-icon class=\"trigger\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" />\n </span>\n </div>\n </div>\n </nz-sider>\n <nz-layout class=\"main-layout\">\n <nz-content class=\"content\">\n <div class=\"inner-content\">\n @if (HEADER_MENU_IN_USE) {\n <app-breadcrumb [@fadeInOut] nz-col nzFlex=\"auto\"></app-breadcrumb>\n <box [height]=\"8\"></box>\n }\n <router-outlet></router-outlet>\n </div>\n <div nz-row class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 0.8em; color: lightgray\">\n {{ SYSTEM_SUB_NAME_RIGHT || \"-- o0o --\" }}\n </div>\n </div>\n <!-- <nz-back-top [nzTarget]=\"'.content'\" [nzVisibilityHeight]=\"500\"></nz-back-top> -->\n </nz-content>\n </nz-layout>\n </nz-layout>\n</nz-layout>\n\n<nz-drawer\n [nzWrapClassName]=\"'same-theme-color menu-drawer'\"\n [nzWidth]=\"350\"\n [nzClosable]=\"false\"\n [(nzVisible)]=\"visibleMenuDrawer\"\n [nzMaskClosable]=\"true\"\n nzPlacement=\"left\"\n nzTitle=\"\"\n (nzOnClose)=\"visibleMenuDrawer = false\"\n>\n <ng-container *nzDrawerContent>\n <div class=\"menu-wapper\">\n @if (MENU_TYPE == 1) {\n <div class=\"nz-tree-wapper in-drawer\">\n <nz-tree\n [nzData]=\"nodes\"\n [nzSearchValue]=\"searchValue\"\n [nzShowLine]=\"true\"\n [nzSelectedKeys]=\"selectedKeys\"\n [nzExpandedKeys]=\"expandedKeys\"\n (nzClick)=\"nzEvent($event)\"\n ></nz-tree>\n </div>\n } @else {\n <div class=\"nz-tree-wapper in-drawer\">\n <ul nz-menu nzTheme=\"light\" nzMode=\"inline\">\n @for (menuLv1 of lstMenu; track menuLv1.App_Menu_Id) {\n @if (menuLv1.SubMenu) {\n <ul nz-submenu [nzOpen]=\"menuLv1.Open\" [nzTitle]=\"menuLv1.Name\" [nzIcon]=\"menuLv1.Icon\">\n @for (menuLv2 of menuLv1.SubMenu; track menuLv2.App_Menu_Id) {\n @if (menuLv2.SubMenu) {\n <ul nz-submenu [nzOpen]=\"menuLv2.Open\" [nzTitle]=\"menuLv2.Name\" [nzIcon]=\"menuLv2.Icon\">\n @for (menuLv3 of menuLv2.SubMenu; track menuLv3.App_Menu_Id) {\n @if (menuLv3.SubMenu) {\n <ul nz-submenu [nzOpen]=\"menuLv3.Open\" [nzTitle]=\"menuLv3.Name\" [nzIcon]=\"menuLv3.Icon\">\n @for (menuLv4 of menuLv3.SubMenu; track menuLv4.App_Menu_Id) {\n @if (menuLv4.SubMenu) {\n <ul\n nz-submenu\n [nzOpen]=\"menuLv4.Open\"\n [nzTitle]=\"menuLv4.Name\"\n [nzIcon]=\"menuLv4.Icon\"\n >\n @for (menuLv5 of menuLv4.SubMenu; track menuLv5.App_Menu_Id) {}\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <a\n [routerLink]=\"menuLv4.Url\"\n [innerHTML]=\"menuLv4.Name | highlight: searchValue\"\n ></a>\n </li>\n }\n }\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <a [routerLink]=\"menuLv3.Url\" [innerHTML]=\"menuLv3.Name | highlight: searchValue\"></a>\n </li>\n }\n }\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <a [routerLink]=\"menuLv2.Url\" [innerHTML]=\"menuLv2.Name | highlight: searchValue\"></a>\n </li>\n }\n }\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <a [routerLink]=\"menuLv1.Url\" [innerHTML]=\"menuLv1.Name | highlight: searchValue\"></a>\n </li>\n }\n }\n </ul>\n </div>\n }\n\n <nz-input-group [nzSuffix]=\"suffixTemplate\" [nzAddOnAfter]=\"afterTemplate\">\n <input nz-input placeholder=\"Tìm menu\" [(ngModel)]=\"searchValue\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <span class=\"suffix-wrap\">\n <icon-delete\n class=\"suffix-icon delete\"\n [class.show]=\"searchValue\"\n [size]=\"14\"\n (click)=\"searchValue = ''\"\n ></icon-delete>\n\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\n </span>\n </ng-template>\n <ng-template #afterTemplate>\n <button nz-button (click)=\"triggerCollapse(); this.visibleMenuDrawer = false\">\n <nz-icon *ngIf=\"isCollapsed\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" />\n </button>\n </ng-template>\n </div>\n </ng-container>\n</nz-drawer>\n","import { inject, Injectable } from '@angular/core';\nimport { HttpParams } from '@angular/common/http';\nimport { HTTPService } from './api-service/http.service';\nimport { CommonService } from './api-service/common.service';\nimport { RespondData } from '../model';\nimport { AppGlobals } from '../app-global';\n\nexport const URLs = {\n getById: '/api/App_Org/GetById',\n getAll: '/api/App_Org/GetAll',\n getList: '/api/App_Org/GetList',\n getPaging: '/api/App_Org/GetPaging',\n addOrEdit: '/api/App_Org/AddOrEdit',\n delete: '/api/App_Org/Delete',\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class OrgService extends HTTPService {\n commonService = inject(CommonService);\n\n getById(id: any): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Org_getById',\n Params: [id],\n });\n }\n\n getAll(): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Org_getAll',\n });\n }\n\n getList(filter: any): Promise<RespondData> {\n return this.postData(AppGlobals.apiEndpoint + URLs.getList, filter);\n }\n\n getPaging(filter: any): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Org_getpaging',\n Params: [filter],\n });\n }\n\n addOrEdit(obj: any): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Org_addOrEdit',\n Params: [obj],\n });\n }\n\n delete(id: any): Promise<RespondData> {\n const params = new HttpParams().append('id', id);\n return this.postParams(AppGlobals.apiEndpoint + URLs.delete, params);\n }\n\n getAllForLogin(UserName: string) {\n const params = new HttpParams().append('UserName', UserName);\n return this.getParams(`${AppGlobals.apiEndpoint}/api/public/LstOrgForLogin`, params);\n }\n\n getUserInOrgStr(OrgId: string) {\n return this.commonService.ESP({\n SPN: 'App_Org_getUserInOrgStr',\n Params: [OrgId],\n });\n }\n\n getUsersInOrg(orgId: string): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Org_getUsersInOrg',\n Params: [orgId],\n });\n }\n\n addUsersToOrg(orgId: string | null, userIds: string[]): Promise<RespondData> {\n if (!orgId) {\n return Promise.reject('Org ID is required');\n }\n return this.commonService.ESP({\n SPN: 'App_Org_addUsersToOrg',\n Params: [orgId, userIds.join(',')],\n });\n }\n\n deleteUserFromOrg(orgId: string, userId: string): Promise<RespondData> {\n return this.commonService.ESP({\n SPN: 'App_Org_deleteUserFromOrg',\n Params: [orgId, userId],\n });\n }\n\n checkImportOrg(data: any) {\n return this.commonService.ESP({\n SPN: 'App_Org_checkImportOrg',\n Params: [data],\n });\n }\n\n importOrg(data: any) {\n return this.postData(`${AppGlobals.apiEndpoint}/api/Org/importOrg`, data);\n }\n}\n","import { Component, inject, OnInit } from '@angular/core';\nimport { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core'; // Import TranslateService\nimport { NzFormModule } from 'ng-zorro-antd/form';\nimport { NzInputModule } from 'ng-zorro-antd/input';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\nimport { NzToolTipModule } from 'ng-zorro-antd/tooltip';\nimport { NzButtonModule } from 'ng-zorro-antd/button';\nimport { NzSwitchModule } from 'ng-zorro-antd/switch';\nimport { NzFlexModule } from 'ng-zorro-antd/flex';\nimport { NzSelectModule } from 'ng-zorro-antd/select';\nimport { debounceTime, distinctUntilChanged, map } from 'rxjs';\nimport { CommonModule } from '@angular/common';\nimport { HideIfErrorDirective } from '../../directive/img-hide-if-error.directive';\nimport { BaseComponent } from '../base.component';\nimport { AuthService } from '../../auth/auth.service';\nimport { SessionManagerService } from '../../auth/session-manager.service';\nimport { SettingService } from '../../services/setting.service';\nimport { VscService } from '../../services/vsc.service';\nimport { LoadingService } from '../../services/loading.service';\nimport { FileService } from '../../services/file.service';\nimport { App_Org } from '../../model';\nimport { TokenStorage } from '../../auth/token.storage';\nimport { AppStorage } from '../../app-storeage';\nimport { OrgService } from '../../services/org.service';\nimport { AppGlobals } from '../../app-global';\nimport { NzSpinComponent } from 'ng-zorro-antd/spin';\n\n@Component({\n selector: 'login',\n templateUrl: './login.component.html',\n styleUrl: './login.component.scss',\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n TranslateModule,\n NzFormModule,\n NzInputModule,\n NzIconModule,\n NzToolTipModule,\n NzButtonModule,\n NzSwitchModule,\n NzFlexModule,\n NzSelectModule,\n HideIfErrorDirective,\n NzSpinComponent,\n ],\n})\nexport class LoginComponent extends BaseComponent implements OnInit {\n fb = inject(FormBuilder);\n authService = inject(AuthService);\n sessionManager = inject(SessionManagerService);\n orgService = inject(OrgService);\n settingService = inject(SettingService);\n vscService = inject(VscService);\n fileService = inject(FileService);\n\n loginForm!: FormGroup;\n visible = false;\n passwordType: 'password' | 'text' = 'password';\n returnUrl = '';\n\n lstOrg: App_Org[] = [];\n\n isOneUserMultiOrgs = false;\n SYSTEM_NAME_LOGIN = '';\n\n async ngOnInit() {\n this.route.queryParams.subscribe((params) => (this.returnUrl = params['returnUrl'] || '/'));\n\n if (TokenStorage.getToken() && (await this.authService.pingAuth())) {\n this.goto(this.returnUrl);\n return;\n }\n\n this.loginForm = this.fb.group({\n username: [null, [Validators.required]],\n password: [null, [Validators.required]],\n orgid: [null],\n langSwitch: [AppStorage.getLang() === 'vn'],\n });\n\n this.settingService.getByCodeAnonymous('SYSTEM_NAME_LOGIN').then(\n (res) => {\n if (res?.Data) {\n this.SYSTEM_NAME_LOGIN = res.Data;\n }\n },\n (err) => this.handleError(err),\n );\n\n this.settingService.getByCodeAnonymous('ONE_USER_MULTI_ORGS').then(\n (res) => {\n if (res?.Data) {\n if (res.Data == '1') {\n this.isOneUserMultiOrgs = true;\n this.loginForm.get('orgid')?.setValidators([Validators.required]);\n this.getLstOrg();\n this.loginForm.controls['orgid']?.valueChanges.subscribe((x) =>\n localStorage.setItem('ORG_ID_SELECTED_BEFOR', x),\n );\n this.loginForm.controls['username']?.valueChanges\n .pipe(debounceTime(200), distinctUntilChanged())\n .subscribe((x) => this.getLstOrg());\n } else {\n this.loginForm.get('orgid')?.clearValidators();\n }\n }\n },\n (err) => this.handleError(err),\n );\n\n this.vscService.clearInterval();\n // this.sessionManager.stop();\n }\n\n getLstOrg() {\n const username = this.loginForm.controls['username'].value;\n\n this.orgService.getAllForLogin(username ?? '').then(\n (res) => {\n if (res.Data) {\n this.lstOrg = res.Data;\n let orgIdSelectedBefor = localStorage.getItem('ORG_ID_SELECTED_BEFOR');\n if (orgIdSelectedBefor && this.lstOrg.find((x) => x.App_Org_Id == orgIdSelectedBefor)) {\n this.loginForm.controls['orgid']?.setValue(orgIdSelectedBefor);\n }\n } else {\n this.lstOrg = [];\n }\n },\n (err) => this.handleError(err),\n );\n }\n\n async dologin() {\n for (const i in this.loginForm.controls) {\n this.loginForm.controls[i].markAsDirty();\n this.loginForm.controls[i].updateValueAndValidity();\n }\n\n if (this.loginForm.valid) {\n this.isLoading = true;\n await this.sessionManager.login(\n this.loginForm.value.username,\n this.loginForm.value.password,\n this.loginForm.value.orgid,\n this.returnUrl,\n );\n this.isLoading = false;\n }\n\n this.vscService.checkVersion();\n }\n\n changeLanguage(lang: boolean) {\n AppStorage.setLang(lang ? 'vn' : 'en');\n this.translate.use(lang ? 'vn' : 'en');\n }\n\n onFocusOrg() {\n // console.log(this.loginForm.value.username);\n // this.getLstOrg();\n }\n\n onImgError(e: Event) {\n (e.target as HTMLImageElement).style.display = 'none';\n }\n\n logoUrl$ = this.fileService\n .getFileVersion('LOGO_LOGIN')\n .pipe(map((res) => `${AppGlobals.apiEndpoint}/api/file/image?code=LOGO_LOGIN&v=${res || ''}`));\n\n bgUrl$ = this.fileService\n .getFileVersion('LOGIN_BACKGROUND')\n .pipe(map((res) => `${AppGlobals.apiEndpoint}/api/file/image?code=LOGIN_BACKGROUND&v=${res || ''}`));\n}\n","<nz-spin [nzSpinning]=\"isLoading\">\n <div nz-row nzJustify=\"center\" class=\"login\">\n <div class=\"form-container\">\n <form nz-flex nzVertical=\"true\" nz-form [formGroup]=\"loginForm\" class=\"login-form\" (ngSubmit)=\"dologin()\">\n <div>\n <div style=\"text-align: center\">\n <img *ngIf=\"logoUrl$ | async as url\" width=\"150px\" [src]=\"url\" hideIfError />\n </div>\n <div class=\"form-field\" style=\"text-align: center; margin-bottom: 20px\">\n <h3 style=\"font-weight: bold; font-size: 20px\">{{ SYSTEM_NAME_LOGIN }}</h3>\n </div>\n </div>\n\n <div nz-row [nzJustify]=\"'center'\">\n <div nz-col nzSm=\"24\" nzMd=\"16\">\n <div nz-flex nzVertical=\"true\">\n <nz-form-item>\n <nz-form-control nzErrorTip=\"{{ 'REQUIRED' | translate }}\">\n <nz-input-group nzPrefixIcon=\"user\">\n <input type=\"text\" nz-input formControlName=\"username\" placeholder=\"{{ 'USERNAME' | translate }}\" />\n </nz-input-group>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-control nzErrorTip=\"{{ 'REQUIRED' | translate }}\">\n <nz-input-group\n nzPrefixIcon=\"lock\"\n [nzSuffix]=\"visible ? suffixTemplateHiddenPassword : suffixTemplateShowPassword\"\n >\n <input\n type=\"{{ passwordType }}\"\n nz-input\n formControlName=\"password\"\n placeholder=\"{{ 'PASSWORD' | translate }}\"\n />\n </nz-input-group>\n </nz-form-control>\n <ng-template #suffixTemplateShowPassword>\n <nz-icon\n nzType=\"eye\"\n nzTheme=\"outline\"\n nz-tooltip\n nzTooltipTitle=\"{{ 'SHOW' | translate }}\"\n nzTooltipPlacement=\"right\"\n (click)=\"visible = !visible; passwordType = 'text'\"\n />\n </ng-template>\n <ng-template #suffixTemplateHiddenPassword>\n <nz-icon\n nzType=\"eye-invisible\"\n nzTheme=\"outline\"\n nz-tooltip\n nzTooltipTitle=\"{{ 'HIDDEN' | translate }}\"\n nzTooltipPlacement=\"right\"\n (click)=\"visible = !visible; passwordType = 'password'\"\n />\n </ng-template>\n </nz-form-item>\n\n @if (isOneUserMultiOrgs) {\n <nz-form-item>\n <nz-form-control nzErrorTip=\"{{ 'REQUIRED' | translate }}\">\n <nz-input-group nzPrefixIcon=\"cluster\" nzHasFeedback=\"false\">\n <nz-select\n nzShowSearch\n nzAllowClear\n [nzBorderless]=\"true\"\n [nzSize]=\"'small'\"\n nzPlaceHolder=\"{{ 'ORG' | translate }}\"\n formControlName=\"orgid\"\n class=\"no-error-border\"\n (nzFocus)=\"onFocusOrg()\"\n >\n @for (item of lstOrg; track $index) {\n <nz-option [nzLabel]=\"item.TreeNodeName!\" [nzValue]=\"item.App_Org_Id\"></nz-option>\n }\n </nz-select>\n </nz-input-group>\n </nz-form-control>\n </nz-form-item>\n }\n\n <div nz-flex nzVertical=\"true\" nzGap=\"4px\">\n <button nz-button [nzType]=\"'primary'\" nzBlock>\n {{ \"LOGIN\" | translate }}\n </button>\n <!-- \n <nz-form-item nzJustify=\"end\">\n <nz-switch formControlName=\"langSwitch\" class=\"nz-switch-both-active-color\" nzCheckedChildren=\"VN\"\n nzUnCheckedChildren=\"EN\" (ngModelChange)=\"changeLanguage($event)\"></nz-switch>\n </nz-form-item> \n --></div>\n </div>\n </div>\n </div>\n </form>\n </div>\n </div>\n</nz-spin>\n\n<img *ngIf=\"bgUrl$ | async as url\" class=\"bg-image\" [src]=\"url\" hideIfError />\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["URLs","PermissionService","switchMap","i1","filter","i2","i3","i4","i5","i7","i6","i1.LoadingService","this","i8","i9","i10","i12","i13","i14","i15","i16","i11","i2.PermissionService","i17","i1.PermissionService","i2.AuthService","i3.NotiService","i1.NotificationService","takeUntil","distinctUntilChanged"],"mappings":"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"}