{"version":3,"sources":["jsdelivr-header.js","/projects/ngx-bimplus-components/src/lib/ngx-bimplus-components.service.ts","/projects/ngx-bimplus-components/src/lib/ngx-bimplus-components.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-localized-widget/bimplus-localized-widget.component.ts","/projects/ngx-bimplus-components/src/lib/components/loading-spinner/loading-spinner.component.ts","/projects/ngx-bimplus-components/src/lib/components/loading-spinner/loading-spinner.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-sidenav-drawer-content/bimplus-sidenav-drawer-content.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-sidenav-drawer-content/bimplus-sidenav-drawer-content.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-buttons-row/bimplus-buttons-row.interface.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-connection-designer/bimplus-connection-designer.service.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-connection-designer/bimplus-connection-designer.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-connection-designer/bimplus-connection-designer.component.html","/projects/ngx-bimplus-components/src/lib/components/expansion-panel/expansion-panel.component.ts","/projects/ngx-bimplus-components/src/lib/components/expansion-panel/expansion-panel.component.html","/projects/ngx-bimplus-components/src/lib/components/expansion-panel-header/expansion-panel-header.component.ts","/projects/ngx-bimplus-components/src/lib/components/expansion-panel-header/expansion-panel-header.component.html","/projects/ngx-bimplus-components/src/lib/components/expansion-panel-header-actions/expansion-panel-header-actions.component.ts","/projects/ngx-bimplus-components/src/lib/components/expansion-panel-header-actions/expansion-panel-header-actions.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-text-message/bimplus-text-message.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-text-message/bimplus-text-message.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-scrollable-container/bimplus-scrollable-container.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-scrollable-container/bimplus-scrollable-container.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-connection-designer-results/bimplus-connection-designer-results.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-connection-designer-results/bimplus-connection-designer-results.component.html","/projects/ngx-bimplus-components/src/lib/utils/utils.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-contact/bimplus-contact.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-contact/bimplus-contact.component.html","/projects/ngx-bimplus-components/src/lib/services/resize-observer.service.ts","/projects/ngx-bimplus-components/src/lib/services/local-storage.service.ts","/projects/ngx-bimplus-components/src/lib/services/layout-manager.service.ts","/projects/ngx-bimplus-components/src/lib/directives/resizable.directive.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar/bimplus-floating-bar.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar/bimplus-floating-bar.component.html","/projects/ngx-bimplus-components/src/lib/directives/draggable.directive.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-dragger/bimplus-floating-bar-dragger.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-dragger/bimplus-floating-bar-dragger.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-header-content/bimplus-floating-bar-header-content.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-header-content/bimplus-floating-bar-header-content.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-hide-objects/bimplus-floating-bar-hide-objects.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-hide-objects/bimplus-floating-bar-hide-objects.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-isolation-objects/bimplus-floating-bar-isolation-objects.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-isolation-objects/bimplus-floating-bar-isolation-objects.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-body/bimplus-floating-bar-body.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-body/bimplus-floating-bar-body.component.html","/projects/ngx-bimplus-components/src/lib/components/project-models/project-models.component.ts","/projects/ngx-bimplus-components/src/lib/components/project-models/project-models.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-panel-toolbar/bimplus-panel-toolbar.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-panel-toolbar/bimplus-panel-toolbar.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-project-navigator/bimplus-floating-bar-project-navigator.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-floating-bar-project-navigator/bimplus-floating-bar-project-navigator.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-language-menu/bimplus-language-menu.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-language-menu/bimplus-language-menu.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-project-menu/bimplus-project-menu.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-project-menu/bimplus-project-menu.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-main-menu/bimplus-main-menu.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-main-menu/bimplus-main-menu.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-navbar/logo-state.enum.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-navbar/bimplus-navbar.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-navbar/bimplus-navbar.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-notify/bimplus-notify.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-notify/bimplus-notify.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-message/bimplus-overlay-message.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-message/bimplus-overlay-message.component.html","/projects/ngx-bimplus-components/src/lib/pipes/pxsuffix.pipe.ts","/projects/ngx-bimplus-components/src/lib/directives/x-draggable.directive.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-sidenav/bimplus-sidenav.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-sidenav/bimplus-sidenav.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-storage-info/bimplus-storage-info.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-storage-info/bimplus-storage-info.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/svg-generator.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/tool-hub-item/tool-hub-item.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/tool-hub-item/tool-hub-item.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/tool-hub-sub-item/tool-hub-sub-item.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/tool-hub-sub-item/tool-hub-sub-item.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/bimplus-tool-hub.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-tool-hub/bimplus-tool-hub.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-user-menu/bimplus-user-menu.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-user-menu/bimplus-user-menu.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-zoom/bimplus-zoom.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-zoom/bimplus-zoom.component.html","/projects/ngx-bimplus-components/src/lib/directives/click-outside/click-outside.directive.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-context-menu/bimplus-context-menu.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-context-menu/bimplus-context-menu.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-flat-tree/bimplus-flat-tree.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-flat-tree/bimplus-flat-tree.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/bimplus-object-navigator.interface.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/filter-criterium/filter-criterium.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/filter-criterium/filter-criterium.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-object-structure/bimplus-object-structure.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-object-structure/bimplus-object-structure.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-object-complex-properties/bimplus-object-complex-properties.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-object-complex-properties/bimplus-object-complex-properties.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-object-structure/bimplus-object-structure.interface.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-object-complex-properties/bimplus-object-complex-properties.interface.ts","/projects/ngx-bimplus-components/src/lib/pipes/format-value.pipe.ts","/projects/ngx-bimplus-components/src/lib/pipes/datetime.pipe.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/object-filter-result/object-filter-result.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/object-filter-result/object-filter-result.component.html","/projects/ngx-bimplus-components/src/lib/utils/filterString.ts","/projects/ngx-bimplus-components/src/lib/utils/filterStructureFetcher.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/bimplus-object-navigator.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-object-navigator/bimplus-object-navigator.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-tooltip-message/bimplus-tooltip-message.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-tooltip-message/bimplus-tooltip-message.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-touch-menu/bimplus-touch-menu.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-touch-menu/bimplus-touch-menu.component.html","/projects/ngx-bimplus-components/src/lib/services/language-strings.service.ts","/projects/ngx-bimplus-components/src/lib/services/cursors.service.ts","/projects/ngx-bimplus-components/src/lib/directives/component-draggable/componentsDraggable.directive.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.html","/projects/ngx-bimplus-components/src/lib/components/resizable-panel/resizable-panel.component.ts","/projects/ngx-bimplus-components/src/lib/components/resizable-panel/resizable-panel.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-link-tooltip-message/bimplus-link-tooltip-message.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-link-tooltip-message/bimplus-link-tooltip-message.component.html","/projects/ngx-bimplus-components/src/lib/components/object-properties-header/object-properties-header.component.ts","/projects/ngx-bimplus-components/src/lib/components/object-properties-header/object-properties-header.component.html","/projects/ngx-bimplus-components/src/lib/pipes/round.pipe.ts","/projects/ngx-bimplus-components/src/lib/pipes/get-attribute-value-as-string.pipe.ts","/projects/ngx-bimplus-components/src/lib/utils/objectProperties.ts","/projects/ngx-bimplus-components/src/lib/components/object-properties-group/object-property-value/object-property-value.component.ts","/projects/ngx-bimplus-components/src/lib/components/object-properties-group/object-property-value/object-property-value.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-input-checkbox/bimplus-input-checkbox.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-input-checkbox/bimplus-input-checkbox.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-input-number/bimplus-input-number.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-input-number/bimplus-input-number.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-input-combobox/bimplus-input-combobox.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-input-combobox/bimplus-input-combobox.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-input-date/bimplus-input-date.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-input-date/bimplus-input-date.component.html","/projects/ngx-bimplus-components/src/lib/components/object-properties-group/object-properties-group.component.ts","/projects/ngx-bimplus-components/src/lib/components/object-properties-group/object-properties-group.component.html","/projects/ngx-bimplus-components/src/lib/pipes/get-attribute-value.pipe.ts","/projects/ngx-bimplus-components/src/lib/validators/double.validator.ts","/projects/ngx-bimplus-components/src/lib/validators/integer.validator.ts","/projects/ngx-bimplus-components/src/lib/validators/guid.validator.ts","/projects/ngx-bimplus-components/src/lib/validators/double-enum.validator.ts","/projects/ngx-bimplus-components/src/lib/components/object-preview/object-preview.component.ts","/projects/ngx-bimplus-components/src/lib/components/object-preview/object-preview.component.html","/projects/ngx-bimplus-components/src/lib/validators/guid-enum.validator.ts","/projects/ngx-bimplus-components/src/lib/validators/string-enum.validator.ts","/projects/ngx-bimplus-components/src/lib/validators/string-combobox.validator.ts","/projects/ngx-bimplus-components/src/lib/components/object-properties/object-properties.service.ts","/projects/ngx-bimplus-components/src/lib/components/object-properties/object-properties.component.ts","/projects/ngx-bimplus-components/src/lib/components/object-properties/object-properties.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.html","/projects/ngx-bimplus-components/src/lib/services/decorators.service.ts","/projects/ngx-bimplus-components/src/lib/components/links-to-documents/links-to-documents.component.ts","/projects/ngx-bimplus-components/src/lib/components/links-to-documents/links-to-documents.component.html","/projects/ngx-bimplus-components/src/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.ts","/projects/ngx-bimplus-components/src/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.html","/projects/ngx-bimplus-components/src/lib/components/object-hyperlinks/object-hyperlinks.component.ts","/projects/ngx-bimplus-components/src/lib/components/object-hyperlinks/object-hyperlinks.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-error/bimplus-overlay-dialog-error.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-error/bimplus-overlay-dialog-error.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.interface.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-tabs-switcher/services/bimplus-tabs-switcher.service.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.html","/projects/ngx-bimplus-components/src/lib/pipes/bit-converter.pipe.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-attachments/bimplus-attachments.interface.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-attachments/bimplus-attachments.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-attachments/bimplus-attachments.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-attachments/services/bimplus-attachments.service.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-textarea/auto-resize-textarea.directive.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-textarea/bimplus-textarea.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-textarea/bimplus-textarea.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-comment/bimplus-comment.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-comment/bimplus-comment.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.service.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-status-bar/bimplus-status-bar.service.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.html","/projects/ngx-bimplus-components/src/lib/components/bimplus-status-bar/bimplus-status-bar.component.ts","/projects/ngx-bimplus-components/src/lib/components/bimplus-status-bar/bimplus-status-bar.component.html"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,0gGCDa,MAAA,UAAA,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA2B,KAAA,GAAA,OAAA,EAAA,gBAAA,YAAA,QAA3B,KAAA,MAAA,EAAA,uBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA2B,WAF1B,QAAM,E,iFAEP,GAA2B,WAAA,E,KAHvC,EAAW,KAAA,EACV,WAAY,aCSD,MAAA,UAAA,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA6B,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAA7B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAPC,aAAA,KAAA,SAAA,6BAAA,SAAA,EAAA,SAAA,+DAIX,SAAA,KAAA,OAAA,Q,iFAGU,GAA6B,WAAA,E,KAVzC,EACa,KAAA,EAAA,SAAA,6BAA4B,QAC7B,GACC,SAAA,qECYD,MAAA,GACX,WAAA,CAAmB,GAAA,KAAgB,iBAAhB,EAGnB,KAAA,kBAA4C,EAAO,MAcnD,KAAA,kBAAsD,EAAO,G,CAb7D,oBAAI,GACF,OAAO,KAAK,mB,CAEd,oBAAa,CAAiB,GAC5B,KAAK,kBAAkB,IAAI,GAC3B,KAAK,iBAAiB,IAAI,GAC1B,IACE,KAAK,iBAAiB,eAAe,KAAK,iBAAkB,KAAK,oB,CACjE,MAAO,GACP,QAAQ,MAAM,E,EAKlB,oBAAI,GACF,OAAO,KAAK,mB,CAEd,oBAAa,CAAiB,GAC5B,KAAK,kBAAkB,IAAI,GAC3B,KAAK,iBAAiB,IAAI,KAAK,kBAC/B,IACE,KAAK,iBAAiB,eAAe,KAAK,iBAAkB,E,CAC5D,MAAO,GACP,QAAQ,MAAM,E,8FA5BP,GAA+B,KAAA,EAAA,MAAA,EAAA,mBAAA,OAAA,EAAA,gBAAA,WAAA,QAA/B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GATA,aAAA,KAAA,SAAA,+BAAA,OAAA,CAAA,iBAAA,mBAAA,iBAAA,oBAAA,UAAA,CAAC,GACF,SAAA,EAAA,SAAA,mDAFA,SAAA,KAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GAAY,CAAA,KAAA,WAAA,KAAE,IAAe,cAAA,EAAA,kBAAA,WAAA,E,iFAU5B,GAA+B,WAAA,E,KAZ3C,EACW,KAAA,EAAA,SAAA,+BAA8B,QAC/B,CAAC,EAAc,GACb,UAAA,CAAC,GACF,SAAA,mDAMK,cAAA,EAAkB,cAUpB,eAAA,MAAA,KAAA,EAAA,mBAAA,eAAA,CAAA,iBAAgB,EAA5B,KAAA,IAcY,iBAAgB,EAA5B,KAAA,OC7BU,MAAA,GALb,WAAA,GAM0C,KAAiB,kBAAY,MAC7B,KAAmB,oBAAY,MAC/B,KAAe,gBAAY,MACnE,KAAA,YAAc,EAAmB,WACjC,KAAA,aAAe,EAAoB,WAEhB,KAAA,oBAAsB,GAAS,KAChD,MAAM,EAAe,KAAK,eAC1B,SAAU,UAAuB,IAAiB,UAAY,MAAM,QAAQ,IAAiB,QAAQ,EAAa,QAAQ,GAE7H,QAXY,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAuB,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAAvB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAuB,aAAA,KAAA,SAAA,sBAAA,OAAA,CAAA,kBAAA,CAAA,kBAAA,oBAAA,WAAA,oBAAA,SAAA,MAAA,WAAA,MAAA,kBACd,GAAgB,oBAAA,CAAA,kBAAA,sBAAA,WAAA,sBAAA,SAAA,MAAA,WAAA,MAAA,kBAChB,GACA,gBAAA,CAAA,kBAAA,kBAAA,WAAA,kBAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,GAAgB,YAAA,CAAA,kBAAA,cAAA,WAAA,cAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,MAAA,aAAA,CAAA,kBAAA,eAAA,WAAA,eAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,OAAA,SAAA,EAAA,SCbtC,2uBAuBM,OAAA,o5F,iFDbO,GAAuB,WAAA,E,KALnC,E,gBACW,sBAAqB,SAAA,2uBAAA,OAAA,q5FAKS,eAAA,CAAA,kBAAiB,E,KAAxD,E,MAAM,CAAE,UAAW,MACoB,oBAAmB,E,KAA1D,E,MAAM,CAAE,UAAW,MACoB,gBAAe,E,KAAtD,E,MAAM,CAAE,UAAW,SEDT,MAAA,GATb,WAAA,GAUE,KAAA,OAAS,EAAc,IACvB,KAAA,UAAY,EAAe,OAClB,KAAkB,mBAAW,EACvC,QAJY,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAoC,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAApC,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAoC,aAAA,KAAA,SAAA,qCAAA,OAAA,CAAA,OAAA,CAAA,kBAAA,SAAA,WAAA,SAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,MAAA,UAAA,CAAA,kBAAA,YAAA,WAAA,YAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,MAAA,mBAAA,CAAA,kBAAA,qBAAA,WAAA,qBAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,OAAA,SAAA,EAAA,SCZjD,smBAwBA,OAAA,6sCAAA,aAAA,EAAA,KAAA,YAAA,KDlBI,GAAuB,SAAA,sBAAA,OAAA,6FAAA,cAAA,EAAA,kBAAA,MAAA,E,iFAMd,GAAoC,WAAA,E,KAThD,EACW,KAAA,EAAA,SAAA,qCACD,QAAA,CACP,IAIa,cAAA,EAAkB,KAAI,SAAA,smBAAA,OAAA,itCAK5B,eAAA,CAAA,mBAAkB,EAA1B,KAAA,OEGI,MAAM,GAAoB,CAC/B,KAAM,OACN,KAAM,QCHF,MAAO,WAAmC,GAPhD,WAAA,G,oBAQqB,KAAiB,kBAAG,GAC7B,KAAU,WAAG,MACvB,KAAA,MAAQ,EAA8B,IACtC,KAAA,gBAAkB,EAAe,OAEvB,KAAA,YAAc,IAAI,EAClB,KAAA,cAAgB,IAAI,CA+B/B,CA7BW,QAAA,CAAS,EAAc,GAC/B,MAAM,EAAS,EAAM,OAAwC,MAE7D,GAAI,EAAO,CACT,KAAK,YAAY,KAAK,GAEtB,EAAa,MAAQ,E,EAIf,cAAA,CAAe,GACvB,GAAI,EAAK,UAAY,KAAK,aAAa,EAAK,UAAW,CAErD,EAAK,SAAS,KAAK,EAAK,IAAI,WAAW,IACrC,IAAK,EAAU,CACb,KAAK,cAAc,KAAK,CAAE,GAAI,EAAK,I,KAGvC,M,CAEF,GAAI,EAAK,SAAU,CACjB,M,CAEF,KAAK,cAAc,KAAK,CAAE,GAAI,EAAK,I,CAG3B,YAAA,CAAa,GACrB,cAAc,IAAU,UAAY,cAAe,C,QApC1C,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA0B,KAAA,KAAA,OAAA,EAAA,gBAAA,WAAA,QAA1B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GCjBb,aAAA,KAAA,SAAA,0BAAA,OAAA,CAAA,WAAA,CAAA,kBAAA,aAAA,WAAA,aAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,MAAA,CAAA,kBAAA,QAAA,WAAA,QAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,MAAA,gBAAA,CAAA,kBAAA,kBAAA,WAAA,kBAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,OAAA,QAAA,CAAA,YAAA,cAAA,cAAA,iBAAA,gBAAA,KAAA,SAAA,EAAA,SAAA,wvDDYY,OAAA,iwcAAA,aAAA,EAAA,KAAA,YAAA,KAAA,EAAgB,SAAA,qBAAA,OAAA,4EAAA,KAAA,OAAA,KAAE,EAAS,KAAA,UAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAK1B,GAA0B,WAAA,E,KAPtC,E,gBACW,0BAAyB,QAC1B,CAAC,EAAkB,GAAU,cAGvB,EAAkB,UAAS,SAAA,wvDAAA,OAAA,qwcAIhC,eAAA,CAAA,WAAU,EAAnB,KAAA,IAIS,YAAW,EAApB,KAAA,IACS,cAAa,EAAtB,KAAA,OEnBU,MAAA,GAKX,cAAI,CAAW,GACb,KAAK,YAAc,EACnB,KAAK,kBAAkB,KAAK,KAAK,Y,CAGnC,cAAI,GACF,OAAO,KAAK,W,CAGd,WAAA,GAbQ,KAAW,YAAW,EAE9B,KAAA,kBAAqC,IAAI,E,QAH9B,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAgC,KAAA,GAAA,OAAA,EAAA,gBAAA,YAAA,QAAhC,KAAA,MAAA,EAAA,uBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAgC,WAFnB,QAAM,E,iFAEnB,GAAgC,WAAA,E,KAF5C,E,MAAW,CAAE,WAAY,W,wBCyBpB,MAAO,WAA2C,GAGtD,WAAA,CACE,EACY,GAEZ,MAAM,GAFM,KAAyB,0BAAzB,EAJd,KAAc,eAAgC,GAC9C,KAAM,OAAgC,GA0BtC,KAAA,WAAqB,wBAGZ,KAAA,YAAiC,CACxC,CAAE,GAAI,IAAK,KAAM,2BAA4B,KAAM,SAAU,WAAY,GACzE,CAAE,GAAI,IAAK,KAAM,+BAAgC,KAAM,SAAU,WAAY,IAC7E,CAAE,GAAI,IAAK,KAAM,8BAA+B,KAAM,QAAS,WAAY,IAC3E,CAAE,GAAI,IAAK,KAAM,6BAA8B,KAAM,QAAS,WAAY,KAEnE,KAAiB,kBAAsB,KAEtC,KAAA,kBAAoB,IAAI,EAmB1B,KAAwB,yBAAY,KAUlC,KAAA,wBAA0B,IAAI,EA5DtC,EAA0B,kBAAkB,WAAW,IACrD,GAAI,IAAS,EAAG,CACd,KAAK,iB,KAKX,QAAA,GACE,KAAK,OAAO,KAAK,CACf,GAAI,OACF,MAAO,KAAK,iBAAiB,QAAQ,SACrC,QAAS,KAAK,iBAAiB,QAAQ,SACvC,SAAU,KACV,YAAa,YAEjB,KAAK,eAAiB,KAAK,M,CAkB7B,oBAAI,CAAiB,GACnB,KAAK,kBAAoB,EACzB,KAAK,kBAAkB,KAAK,KAAK,kB,CAGnC,oBAAI,GACF,OAAO,KAAK,iB,CAGN,kBAAA,CAAmB,EAAkB,GAC3C,MAAM,EAAU,KAAK,OAAO,MAAK,GAAO,EAAI,KAAO,IACnD,IAAK,EAAS,CACZ,M,CAEF,EAAQ,SAAW,C,CAIrB,2BACI,CAAwB,GAC1B,KAAK,yBAA2B,EAChC,KAAK,mBAAmB,QAAS,E,CAEnC,2BAAI,GACF,OAAO,KAAK,wB,CAKd,aAAA,CAAc,GACZ,GAAI,EAAO,KAAO,OAAQ,CACxB,KAAK,0BAA0B,WAAa,EAC5C,GAAI,KAAK,yBAA0B,CACjC,KAAK,wBAAwB,M,GAKnC,eAAA,GACE,KAAK,iBAAmB,I,QAhFf,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAkC,KAAA,EAAA,MAAA,EAAA,kBAAA,CAAA,MAAA,KAAA,OAAA,EAAA,gBAAA,WAAA,QAAlC,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAkC,aAAA,KAAA,SAAA,kCAAA,OAAA,CAAA,YAAA,cAAA,kBAAA,oBAAA,wBAAA,2BAAA,QAAA,CAAA,kBAAA,oBAAA,wBAAA,2BAAA,UALlC,CAAC,GAAiB,gBAAA,KAAA,SAAA,EAAA,SCvB/B,kkDDeI,OAAA,on2BAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,mBAAA,OAAA,6CAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,YAAA,KAAA,EAAA,gBAAA,SAAA,8CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,sDAAA,OAAA,+CAAA,QAAA,kBAAA,SAAA,cAAA,KAAA,WAAA,KAAA,GAAc,CAAA,KAAA,YAAA,KAAA,EAAA,kBAAA,SAAA,YAAA,OAAA,ovBAAA,QAAA,kGAAA,KAAA,YAAA,KAAA,EAAA,kBAAA,SAAA,YAAA,OAAA,uBAAA,KAAA,WAAA,KACd,GACA,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,KAAA,YAAA,KAAA,GACA,SAAA,qCAAA,OAAA,8CAAA,KAAA,YAAA,KAAA,GAA0B,SAAA,0BAAA,OAAA,yCAAA,QAAA,kCAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAQjB,GAAkC,WAAA,E,KAhB9C,EACW,KAAA,EAAA,SAAA,kCACD,QAAA,CACP,EACA,EACA,EACA,EACA,GACA,GACA,IACD,UACU,CAAC,GAGG,cAAA,EAAkB,UAAS,SAAA,kkDAAA,OAAA,wn2BAiCjC,eAAA,MAAA,KAAA,EAAA,kBAAA,CAAA,KAAA,KAAA,eAAA,CAAA,YAAW,EAAnB,KAAA,IAMQ,kBAAiB,EAAzB,KAAA,IAES,kBAAiB,EAA1B,KAAA,IAqBG,wBAAuB,EAD1B,KAAA,IASS,wBAAuB,EAAhC,KAAA,OEvFU,MAAA,GANb,WAAA,GAQE,KAAA,SAAW,EAAe,KAQ3B,CAJC,YAAA,GACE,KAAK,SAAS,QAAO,IAAU,G,QAPtB,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAuB,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,Q,4EAAvB,GAAuB,aAAA,KAAA,SAAA,sBAAA,OAAA,CAAA,SAAA,CAAA,kBAAA,WAAA,WAAA,WAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,OAAA,QAAA,CAAA,SAAA,kBAAA,SAAA,EAAA,SCTpC,kpBAkBA,OAAA,0+DAAA,aAAA,EAAA,KAAA,WAAA,KDbY,GAAY,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,yB,iFAIX,GAAuB,WAAA,E,KANnC,EACW,KAAA,EAAA,SAAA,sBAAqB,QACtB,CAAC,GAAa,SAAA,kpBAAA,OAAA,g/DEIZ,MAAA,GAPb,WAAA,GAQyD,KAAqB,sBAAY,IACzF,QAFY,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA6B,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAA7B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAA6B,aAAA,KAAA,SAAA,6BAAA,KAAA,CAAA,WAAA,yEAAA,SAAA,EAAA,SCT1C,gNAKU,OAAA,0MAAA,cAAA,EAAA,kBAAA,MAAA,E,iFDIG,GAA6B,WAAA,E,KAPzC,EACW,KAAA,EAAA,SAAA,6BACD,QAAA,GAGM,cAAA,EAAkB,KAAI,SAAA,gNAAA,OAAA,8MAGkB,eAAA,CAAA,sBAAqB,E,KAA3E,E,MAAY,+CEFF,MAAA,UAAA,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAoC,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAApC,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAoC,aAAA,KAAA,SAAA,qCAAA,SAAA,EAAA,SCRjD,gCACA,OAAA,Q,iFDOa,GAAoC,WAAA,E,KANhD,EACW,KAAA,EAAA,SAAA,qCAAoC,QACrC,GAAE,SAAA,sCEGA,MAAA,GALb,WAAA,GAME,KAAA,QAAU,EAA0B,UACrC,QAFY,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA2B,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAA3B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAA2B,aAAA,KAAA,SAAA,2BAAA,OAAA,CAAA,QAAA,CAAA,kBAAA,UAAA,WAAA,UAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,OAAA,SAAA,EAAA,SCPxC,wFAIC,OAAA,6T,iFDGY,GAA2B,WAAA,E,KALvC,E,gBACW,2BAA0B,SAAA,wFAAA,OAAA,gUEezB,MAAA,GAKX,WAAA,CAA6B,GAAA,KAAU,WAAV,EAFnB,KAA6B,8BAAW,wBAGhD,KAAK,SAAW,KAAK,WAAW,a,CAG1B,8BAAA,GAEN,MAAM,EAA0C,KAAK,UAAU,cAAc,KAAK,+BAClF,IAAK,EAAqB,CACxB,QAAQ,MAAM,iDACd,M,CAEF,KAAK,WAAa,IAAI,GAAU,E,CAGlC,eAAA,GACE,KAAK,gC,CAGC,qBAAA,GACN,IAAI,KAAK,SAAU,CACjB,M,CAEF,MAAM,EAAW,KAAK,SACtB,MAAM,EAAU,GAAU,cAAc,KAAK,+BAC7C,IAAK,EAAQ,CACX,M,CAGF,IAAK,KAAK,WAAY,CACpB,QAAQ,MAAM,iDACd,M,CAGF,KAAK,WAAW,a,CAGlB,kBAAA,GACE,KAAK,uB,6FA1CI,GAAmC,KAAA,EAAA,MAAA,EAAA,aAAA,OAAA,EAAA,gBAAA,WAAA,QAAnC,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAmC,aAAA,KAAA,SAAA,mCAAA,SAAA,EAAA,SClBhD,4EAGA,OAAA,ukGAAA,cAAA,EAAA,kBAAA,MAAA,E,iFDea,GAAmC,WAAA,E,KAR/C,EACW,KAAA,EAAA,SAAA,mCACD,QAAA,GAGM,cAAA,EAAkB,KAAI,SAAA,4EAAA,OAAA,2kG,2CEgBjC,MAAO,WAAkD,GAO7D,WAAA,CACE,EACY,GAEZ,MAAM,GAFM,KAAyB,0BAAzB,EANd,KAAc,eAAgC,GAErC,KAAY,aAAW,GA4BtB,KAAA,YAAc,IAAI,EAUnB,KAAA,oBAA8B,GAC9B,KAAA,mBAA6B,GAC7B,KAAA,iBAA4B,MAC5B,KAAA,oBAA+B,MAC/B,KAAA,QAAsC,KACrC,KAAA,4BAA8B,IAAI,EAClC,KAAA,2BAA6B,IAAI,EACjC,KAAA,uBAAyB,IAAI,EAC7B,KAAA,mBAAqB,IAAI,EACzB,KAAA,kBAAoB,IAAI,EACxB,KAAA,cAAgB,IAAI,EACpB,KAAA,yBAA2B,IAAI,EAC/B,KAAA,wBAA0B,IAAI,EAC9B,KAAA,oBAAsB,IAAI,EAC1B,KAAA,mBAAqB,IAAI,EACzB,KAAA,gBAAkB,IAAI,C,CA5ChC,QAAA,GACE,KAAK,eAAiB,CACpB,CACE,GAAI,OACF,MAAO,KAAK,iBAAiB,QAAQ,SACrC,QAAS,KAAK,iBAAiB,QAAQ,SACvC,SAAU,MACV,YAAa,W,CAKrB,WAAA,CAAY,GACV,MAAM,EAAiB,EAAQ,YAAY,aAC3C,GAAI,IAAmB,KAAM,CAC3B,KAAK,0BAA0B,WAAa,C,EAMhD,aAAA,CAAc,GACZ,GAAI,EAAO,KAAO,OAAQ,CACxB,KAAK,0BAA0B,WAAa,EAC5C,KAAK,YAAY,M,EAsBrB,YAAA,GACE,IAAI,EAAa,EACjB,IAAK,KAAK,QAAS,OAAO,EAC1B,IAAK,MAAM,KAAc,KAAK,QAAQ,WAAY,CAChD,GAAc,EAAW,QAAQ,M,CAEnC,OAAO,C,CAED,aAAA,CAAc,GACpB,IAAI,EAAU,KACd,GAAW,EAAO,QAAU,YAAc,YAC1C,GAAW,eAAiB,EAAO,WACnC,OAAO,C,CAED,WAAA,CAAY,GAClB,IAAK,EAAO,QAAS,CACnB,MAAO,E,CAGT,IAAI,EAAU,KACd,GAAW,YACX,GAAW,EAAO,QAClB,OAAO,C,CAGT,QAAA,CAAS,GACP,MAAO,GAAG,EAAO,OAAO,KAAK,cAAc,KAAU,KAAK,YAAY,I,QAtF7D,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAyC,KAAA,EAAA,MAAA,EAAA,kBAAA,CAAA,MAAA,KAAA,OAAA,EAAA,gBAAA,WAAA,QAAzC,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAyC,aAAA,KAAA,SAAA,0CAAA,OAAA,CAAA,aAAA,eAAA,oBAAA,sBAAA,mBAAA,qBAAA,iBAAA,mBAAA,oBAAA,sBAAA,QAAA,WAAA,QAAA,CAAA,YAAA,cAAA,4BAAA,8BAAA,2BAAA,6BAAA,uBAAA,yBAAA,mBAAA,qBAAA,kBAAA,oBAAA,cAAA,gBAAA,yBAAA,2BAAA,wBAAA,0BAAA,oBAAA,sBAAA,mBAAA,qBAAA,gBAAA,mBAAA,UALzC,CAAC,GC1Bd,gBAAA,KAAA,cAAA,KAAA,SAAA,EAAA,SAAA,+mLAsIA,OAAA,6h4BAAA,aAAA,EAAA,KAAA,WAAA,KDrHI,GACA,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,mBAAA,OAAA,6CAAA,KAAA,YAAA,KAAA,EAAA,KAAA,SAAA,SAAA,OAAA,iCAAA,KAAA,YAAA,KAAA,GAA0B,SAAA,0BAAA,OAAA,yCAAA,QAAA,kCAAA,KAAA,YAAA,KAC1B,GACA,SAAA,sBAAA,OAAA,aAAA,QAAA,qBAAA,KAAA,YAAA,KAAA,GACA,SAAA,+BAAA,KAAA,YAAA,KAAA,GAAoC,SAAA,uCAAA,KAAA,YAAA,KACpC,GAA2B,SAAA,2BAAA,OAAA,cAAA,KAAA,YAAA,KAC3B,GAAmC,SAAA,qCAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAO1B,GAAyC,WAAA,E,KAjBrD,EACW,KAAA,EAAA,SAAA,0CACD,QAAA,CACP,EACA,EACA,GACA,GACA,GACA,GACA,GACA,IACD,UACU,CAAC,GAGG,cAAA,EAAkB,UAAS,SAAA,+mLAAA,OAAA,ii4BAOjC,eAAA,MAAA,KAAA,EAAA,kBAAA,CAAA,KAAA,KAAA,eAAA,CAAA,aAAY,EAApB,KAAA,IA4BS,YAAW,EAApB,KAAA,IAUQ,oBAAmB,EAA3B,KAAA,IACQ,mBAAkB,EAA1B,KAAA,IACQ,iBAAgB,EAAxB,KAAA,IACQ,oBAAmB,EAA3B,KAAA,IACQ,QAAO,EAAf,KAAA,IACS,4BAA2B,EAApC,KAAA,IACS,2BAA0B,EAAnC,KAAA,IACS,uBAAsB,EAA/B,KAAA,IACS,mBAAkB,EAA3B,KAAA,IACS,kBAAiB,EAA1B,KAAA,IACS,cAAa,EAAtB,KAAA,IACS,yBAAwB,EAAjC,KAAA,IACS,wBAAuB,EAAhC,KAAA,IACS,oBAAmB,EAA5B,KAAA,IACS,mBAAkB,EAA3B,KAAA,IACS,gBAAe,EAAxB,KAAA,OErEG,SAAU,GAAU,EAAiB,EAAmB,EAAgB,MAC1E,IAAM,EAAY,CACd,QAAQ,MAAM,0EACd,M,CAGJ,MAAM,EAAW,YAAa,eAAkB,OAAO,UAAY,UAAa,OAAO,QACvF,GAAI,UAAkB,EAAQ,KAAe,WAAY,CACtD,EAAQ,GAAW,CAAC,OAAQ,G,CAG/B,MAAM,EAAW,EACjB,GAAI,KAAa,EAAS,CACtB,EAAQ,GAAW,KAAK,E,CAEhC,CCrBM,MAAO,WAAgC,GAC3C,WAAA,CAAY,GACV,MAAM,GAEE,KAAA,sBAAwB,IAAI,C,CAEtC,eAAA,GACE,GAAU,KAAM,wBAAyB,U,6FAPhC,GAAuB,KAAA,EAAA,MAAA,EAAA,mBAAA,OAAA,EAAA,gBAAA,WAAA,QAAvB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAuB,aAAA,KAAA,SAAA,sBAAA,QAAA,CAAA,sBAAA,yBAAA,UALvB,CAAC,GCTd,gBAAA,KAAA,SAAA,EAAA,SAAA,oQAQI,OAAA,o1CAAA,aAAA,EAAA,KAAA,WAAA,KDAQ,GAAY,CAAA,KAAA,WAAA,KAAE,GAAe,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAM5B,GAAuB,WAAA,E,KARnC,EACW,KAAA,EAAA,SAAA,sBACD,QAAA,CAAC,EAAc,GACb,UAAA,CAAC,GAGG,cAAA,EAAkB,UAAS,SAAA,oQAAA,OAAA,w1CAMhC,eAAA,MAAA,KAAA,EAAA,mBAAA,eAAA,CAAA,sBAAqB,EAA9B,KAAA,OEZU,MAAA,GAOX,WAAA,GALQ,KAAA,UAAkD,IAAI,GAAmC,WACzF,KAAA,iBAA4B,IAAI,QAAQ,EAAE,EAAE,EAAE,GAE/C,KAAA,eAAkD,KAAK,UAAU,c,CAIjE,OAAA,CAAQ,GACb,KAAK,UAAU,KAAK,GACpB,KAAK,iBAAmB,C,CAGnB,gBAAA,GACL,GAAI,KAAK,iBAAiB,OAAO,GAAK,KAAK,kBAAkB,QAAQ,EAAI,CACvE,MAAM,EAA8B,SAAS,cAAc,aAC3D,IAAI,EAAW,CACb,OAAO,KAAK,gB,CAEd,OAAO,EAAW,uB,CAEpB,OAAO,KAAK,gB,QAtBH,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAqB,KAAA,GAAA,OAAA,EAAA,gBAAA,YAAA,QAArB,KAAA,MAAA,EAAA,uBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAqB,WAFpB,QAAM,E,iFAEP,GAAqB,WAAA,E,KAHjC,EAAW,KAAA,EACV,WAAY,W,wBCED,MAAA,GAIX,WAAA,GAFQ,KAAA,eAAiB,IAAI,GAAwD,K,CAKrF,OAAA,CAAQ,EAAa,GACnB,IACE,aAAa,QAAQ,EAAK,GAC1B,KAAK,eAAe,KAAK,CAAE,MAAK,S,CAChC,MAAO,GACP,QAAQ,MAAM,+BAAgC,E,EAKlD,OAAA,CAAQ,GACN,IACE,OAAO,aAAa,QAAQ,E,CAC5B,MAAO,GACP,QAAQ,MAAM,kCAAmC,GACjD,OAAO,I,EAKX,UAAA,CAAW,GACT,IACE,aAAa,WAAW,GACxB,KAAK,eAAe,KAAK,CAAE,MAAK,MAAO,M,CACvC,MAAO,GACP,QAAQ,MAAM,mCAAoC,E,EAKtD,KAAA,GACE,IACE,aAAa,QACb,KAAK,eAAe,KAAK,K,CACzB,MAAO,GACP,QAAQ,MAAM,8BAA+B,E,EAKjD,SAAA,CAAU,EAAa,GACrB,KAAK,QAAQ,EAAK,KAAK,UAAU,G,CAInC,SAAA,CAAU,GACR,MAAM,EAAQ,KAAK,QAAQ,GAC3B,OAAO,EAAQ,KAAK,MAAM,GAAS,I,CAIrC,YAAA,GACE,OAAO,KAAK,eAAe,c,QA3DlB,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAmB,KAAA,GAAA,OAAA,EAAA,gBAAA,YAAA,QAAnB,KAAA,MAAA,EAAA,uBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAmB,WAFlB,QAAM,E,iFAEP,GAAmB,WAAA,E,KAH/B,EAAW,KAAA,EACV,WAAY,W,wBCgCD,MAAA,GAGX,WAAA,CAAoB,EACA,GADA,KAAqB,sBAArB,EACA,KAAmB,oBAAnB,EAFpB,KAAA,iBAAyD,IAAI,GAAqC,IAI1F,KAAe,gBAAuB,GAK9C,KAAM,OAAU,qB,CAHhB,mBAAI,GACF,OAAO,KAAK,e,CAQd,cAAA,CAAe,EAAgB,EAAW,EAA6B,EAAyB,EAAc,IAAK,EAAa,IAAI,EAAe,EAAG,EAAgB,GACpK,IAAI,GAAc,EAClB,GAAG,KAAK,gBAAgB,MAAK,CAAC,EAAK,KAC/B,MAAM,EAAS,EAAK,KAAO,EAC3B,GAAG,EAAO,CACR,EAAa,C,CAEf,OAAO,CAAM,IACZ,CACH,GAAG,GAAc,EAAE,CACjB,KAAK,gBAAgB,OAAO,EAAW,E,EAG3C,MAAM,EAA6B,CACjC,QAAQ,EACR,GAAG,EACH,SAAS,EACT,mBAAmB,EACnB,KAAK,EACL,IAAI,EACJ,MAAM,EACN,OAAO,EACP,YAAa,OAGf,KAAK,gBAAgB,KAAK,GAC1B,KAAK,iBAAiB,KAAK,KAAK,iBAChC,KAAK,YAAY,E,CAGnB,WAAA,CAAY,GACV,KAAK,sBAAsB,GAC3B,KAAK,0BAA0B,E,CAOjC,gBAAA,CAAiB,GACf,IAAI,EAAI,CACN,OAAO,I,CAET,MAAM,EAAc,KAAK,oBAAoB,QAAQ,KAAK,QAC1D,MAAO,EAAS,EAAc,KAAK,MAAM,GAAe,GACxD,MAAO,EAAQ,EAAI,GACnB,IAAI,EAAY,EAAO,GACvB,IAAI,EAAW,CACb,EAAY,CAAC,GAAG,EAAM,KAAK,EAAI,KAAK,IAAI,EAAI,IAAI,MAAM,EAAI,MAAM,OAAO,EAAI,O,CAE7E,OAAO,C,CAGT,qBAAA,CAAsB,GACpB,MAAM,EAAsC,KAAK,iBAAiB,GAClE,IAAI,EAAO,CACT,M,CAEF,MAAO,EAAgB,KAAK,qBAAqB,GACjD,MAAO,EAAkB,KAAK,uBAAuB,EAAI,IACzD,IAAI,IAAkB,EAAgB,CACpC,M,CAEF,EAAc,MAAM,KAAQ,EAAW,KAAI,KAC3C,EAAc,MAAM,IAAO,EAAU,IAAI,KACzC,GAAG,EAAO,OAAS,EAAO,MAAQ,EAAE,CAClC,EAAgB,MAAM,MAAQ,EAAO,MAAQ,I,CAE/C,GAAG,EAAO,QAAU,EAAO,OAAS,EAAE,CACpC,EAAgB,MAAM,OAAS,EAAO,OAAS,I,CAGjD,KAAK,cAAc,EAAI,GAAG,GAAG,UAAU,EAAE,EAAE,K,CAG7C,yBAAA,CAA0B,GACxB,KAAK,cAAc,EAAI,GAAG,GAAG,UAAU,EAAE,EAAE,K,CAM7C,OAAA,CAAQ,GACN,IAAI,EAAmC,KACvC,KAAK,gBAAgB,SAAQ,IAC3B,GAAG,EAAK,KAAO,EAAG,CAChB,EAAY,C,KAGhB,OAAO,C,CAMT,gBAAA,CAAiB,EAAuB,EAAY,EAAW,EAAa,GAC1E,MAAM,EAAQ,GAAK,GACnB,IAAK,EAAO,CACV,M,CAEF,IAAI,EAAS,KAAK,oBAAoB,UAAU,KAAK,QAErD,IAAK,EAAQ,CACX,EAAS,E,CAEX,GAAG,GAAK,YAAY,CAClB,IAAK,EAAO,GAAQ,CAClB,EAAO,GAAS,C,CAElB,EAAO,GAAO,KAAO,EACrB,EAAO,GAAO,IAAO,EAGrB,KAAK,oBAAoB,UAAU,KAAK,OAAQ,GAChD,M,CAGF,MAAM,EAAmC,CACvC,GAAI,EACJ,YAAa,MACb,KAAM,EACN,IAAK,EACL,MAAO,EACP,OAAQ,GAEV,EAAO,GAAS,EAChB,KAAK,oBAAoB,UAAU,KAAK,OAAO,E,CAGjD,mBAAA,CAAoB,GAClB,MAAM,EAA8B,KAAK,QAAQ,GACjD,GAAG,EAAK,CACN,OAAO,KAAK,qBAAqB,E,CAEnC,OAAO,I,CAGT,oBAAA,CAAqB,GACnB,IAAI,EACJ,GAAG,EAAK,SAAS,eAAe,WAAW,CACzC,EAAU,EAAK,SAAS,eAAe,WAAW,cAAc,EAAK,S,KAChE,CACL,EAAU,EAAK,SAAS,a,CAE1B,IAAI,EAAQ,CACV,QAAQ,MAAM,yCACd,OAAO,I,CAET,OAAO,C,CAGT,sBAAA,CAAuB,EAAuB,GAC5C,MAAM,EAAsB,EAAK,SAAS,eAAe,YAAc,EAAK,SAAS,cACrF,IAAI,EAAQ,CACV,QAAQ,MAAM,2CACd,OAAO,I,CAET,MAAM,EAAY,GAAY,GAAU,OAAS,EAAG,EAAS,EAAK,SAClE,MAAM,EAA0B,EAAW,EAAQ,cAAc,GAAY,EAC7E,IAAI,EAAO,CACT,QAAQ,MAAM,gDAAgD,2BAAiC,I,CAEjG,OAAO,C,CAIT,eAAA,CAAgB,EAAuB,EAA6B,GAClE,MAAM,EAAiC,KAAK,uBAAuB,EAAK,GACxE,IAAI,EAAY,CACd,QAAQ,MAAM,4CACd,OAAO,I,CAGT,MAAM,EAAsB,GAAoB,KAAK,sBAAsB,mBAC3E,IAAK,GAAe,GAAY,OAAO,GAAK,GAAY,QAAQ,EAAI,CAClE,QAAQ,IAAI,uC,CAEd,MAAO,EAA2B,EAAY,wBAC9C,IAAI,EAAY,CACd,QAAQ,MAAM,yC,CAEhB,OAAO,C,CAKT,aAAA,CAAc,EAAU,EAAgB,EAAmC,EAAc,EAAc,EAAqB,OAC1H,IAAI,EAAG,CACL,MAAO,CAAC,OAAO,EAAE,OAAO,E,CAE1B,MAAM,EAAK,KAAK,QAAQ,GACxB,IAAI,EAAG,CACL,MAAO,CAAC,OAAO,EAAE,OAAO,E,CAE1B,MAAM,EAAsB,GAAoB,KAAK,sBAAsB,mBAC3E,MAAM,EAA6B,KAAK,gBAAgB,EAAG,EAAS,GACpE,IAAI,EAAY,CACd,QAAQ,MAAM,sCACd,MAAO,CAAC,OAAO,EAAE,OAAO,E,CAG1B,IAAI,GAAa,QAAU,GAAa,OAAO,CAC7C,QAAQ,MAAM,qCACd,MAAO,CAAC,OAAO,EAAE,OAAO,E,CAG1B,IAAI,EAAW,KACf,GAAG,GAAY,MAAQ,GAAM,GAAY,OAAS,EAAE,CAClD,EAAW,K,CAEb,GAAG,EAAS,CACV,IAAI,EAAkB,KACtB,GAAG,KAAK,cAAc,EAAa,KAAgB,QAAU,EAAY,CACvE,EAAkB,K,CAIpB,MAAM,EAAiB,QAAQ,SAAS,GAGxC,KAAK,oBAAoB,EAAgB,EAAQ,GAEjD,GAAG,EAAiB,CAClB,GAAG,KAAK,cAAc,EAAgB,KAAgB,MAAO,CAC3D,MAAO,EAAgB,KAAK,mBAAmB,EAAgB,GAC/D,EAAS,EAAc,EAAI,EAAY,EACvC,EAAS,EAAc,EAAI,EAAY,EACvC,KAAK,oBAAoB,EAAgB,EAAQ,E,MAE9C,CACL,GAAI,KAAK,qBAAqB,EAAY,KAAoB,MAAO,CACnE,MAAM,EAAgB,KAAK,2BAA2B,EAAgB,GACtE,EAAS,EAAc,EAAI,EAAY,EACvC,EAAS,EAAc,EAAI,EAAY,EACvC,KAAK,oBAAoB,EAAgB,EAAQ,E,GAKvD,MAAM,EAAkB,KAAK,qBAAqB,GAClD,IAAI,EAAgB,CAClB,M,CAEF,MAAM,EAAgB,OAAO,iBAAiB,GAC9C,MAAM,EAAM,SAAS,EAAc,IAAK,IACxC,MAAM,EAAO,SAAS,EAAc,KAAM,IAC1C,EAAgB,MAAM,IAAO,EAAM,EAAU,KAC7C,EAAgB,MAAM,KAAQ,EAAO,EAAU,KAC/C,MAAO,CAAC,SAAO,S,CAKjB,aAAA,CAAc,EAAY,GACxB,IAAI,IAAO,EAAI,CACb,OAAO,K,CAET,OAAQ,EAAG,MAAQ,EAAG,MAAS,EAAG,KAAO,EAAG,KAAO,EAAG,OAAS,EAAG,OAAS,EAAG,QAAU,EAAG,M,CAM7F,oBAAA,CAAqB,EAAY,GAC/B,IAAI,IAAO,EAAI,CACb,OAAO,K,CAET,MAAO,EAAW,EAAG,MAAQ,EAAG,MAAS,EAAG,KAAO,EAAG,IACtD,MAAO,EAAW,EAAG,MAAQ,EAAG,MAAS,EAAG,KAAO,EAAG,IACtD,OAAO,GAAY,C,CAMrB,kBAAA,CAAmB,EAAY,GAC7B,IAAI,IAAO,EAAI,CACb,MAAO,CAAC,EAAE,EAAE,EAAE,E,CAEhB,MAAM,EAAK,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,GAE5B,GAAG,EAAG,KAAO,EAAG,KAAM,CACpB,EAAG,EAAI,EAAG,C,MACL,GAAG,EAAG,MAAQ,EAAG,MAAO,CAC7B,EAAG,EAAI,EAAG,MAAQ,EAAG,K,CAGvB,GAAG,EAAG,IAAM,EAAG,IAAK,CAClB,EAAG,EAAI,EAAG,C,MACL,GAAG,EAAG,OAAS,EAAG,OAAQ,CAC/B,EAAG,EAAI,EAAG,OAAS,EAAG,M,CAExB,OAAO,C,CAMT,0BAAA,CAA2B,EAAY,GACrC,IAAI,IAAO,EAAI,CACb,MAAQ,CAAC,EAAE,EAAE,EAAE,E,CAGjB,MAAO,EAAK,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,GAE7B,GAAG,EAAG,KAAO,EAAG,KAAM,CACpB,EAAG,EAAI,EAAG,C,CAGZ,GAAG,EAAG,IAAM,EAAG,IAAK,CAClB,EAAG,EAAI,EAAG,C,CAEZ,OAAO,C,CAMT,mBAAA,CAAoB,EAAc,EAAmB,GACnD,IAAI,EAAM,CACR,M,CAEF,EAAK,GAAK,EACV,EAAK,GAAK,EACV,OAAO,C,CAGT,eAAA,CAAgB,EAAe,EAAY,IACzC,MAAO,EAAY,KAAK,QAAQ,GAChC,IAAI,EAAU,CACZ,M,CAEF,EAAU,YAAc,EACxB,KAAK,iBAAiB,KAAK,KAAK,iBAChC,YAAW,KACT,KAAK,cAAc,EAAU,GAAG,GAAG,UAAU,EAAE,EAAE,KAAK,G,CAK1D,aAAA,CAAc,GACZ,KAAK,sBAAsB,E,CAO7B,qBAAA,CAAsB,GACpB,MAAM,EAA+B,KAAK,QAAQ,GAClD,IAAI,EAAK,CACP,M,CAEF,MAAM,EAAU,KAAK,qBAAqB,GAC1C,IAAI,EAAQ,CACV,M,CAEF,MAAM,EAAgB,OAAO,iBAAiB,GAC9C,MAAM,EAAM,SAAS,EAAc,IAAK,IACxC,MAAM,EAAO,SAAS,EAAc,KAAM,IAE1C,MAAM,EAAc,KAAK,gBAAgB,EAAK,UAAU,WACxD,KAAK,iBAAiB,EAAK,EAAK,EACV,GAAe,EAAY,MAAQ,EAAI,EAAY,MAAM,EACzD,GAAe,EAAY,OAAS,EAAI,EAAY,OAAO,E,6FA7XxE,GAAoB,KAAA,EAAA,MAAA,IAAA,CAAA,MAAA,KAAA,OAAA,EAAA,gBAAA,YAAA,QAApB,KAAA,MAAA,EAAA,uBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAoB,WAFnB,QAAM,E,iFAEP,GAAoB,WAAA,E,KAHhC,EAAW,KAAA,EACV,WAAY,W,2CCdD,MAAA,GAgCX,WAAA,CAAoB,EACA,EACA,GAFA,KAAU,WAAV,EACA,KAAoB,qBAApB,EACA,KAAqB,sBAArB,EAjCpB,KAAmB,oBAAG,EACtB,KAAmB,oBAAG,EACtB,KAAiB,kBAAsB,GACvC,KAAa,cAAS,KACtB,KAAa,cAAS,MAQtB,KAAiB,kBAAK,KAItB,KAAA,WAAa,IAAI,EAIjB,KAAA,aAA8B,CAC5B,CAAE,UAAY,aAAe,eAAiB,MAC9C,CAAE,UAAY,YAAe,eAAgB,KAC7C,CAAE,UAAY,aAAe,eAAgB,MAC7C,CAAE,UAAY,YAAe,eAAgB,KAC7C,CAAE,UAAY,aAAe,eAAgB,MAC7C,CAAE,UAAY,YAAe,eAAgB,KAC7C,CAAE,UAAY,aAAe,eAAgB,MAC7C,CAAE,UAAY,YAAe,eAAgB,MAO7C,KAAK,SAAW,EAAW,cAC3B,KAAK,qBAAuB,EAE5B,KAAK,YAAiB,IAEpB,EAAM,kBACN,GAAG,KAAK,cAAc,CACpB,M,CAEF,KAAK,cAAgB,KACrB,MAAM,EAAa,EAAqB,cAAgB,EAAqB,cAAe,GAC5F,MAAM,EAAU,EAAM,OAAS,aAAe,EAAU,IAAI,QAAW,EAAqB,QAC5F,MAAM,EAAU,EAAM,OAAS,aAAe,EAAU,IAAI,QAAW,EAAqB,QAC5F,KAAK,oBAAsB,EAC3B,KAAK,oBAAsB,EAC3B,KAAK,8BACL,KAAK,oBAAoB,EAAM,EAMjC,KAAK,iBAAoB,IACvB,EAAM,iBACN,EAAM,kBAGN,MAAM,EAAa,EAAqB,cAAiB,EAAqB,cAAe,GAC7F,MAAM,EAAU,EAAM,OAAS,YAAc,EAAU,IAAI,QAAW,EAAqB,QAC3F,MAAM,EAAU,EAAM,OAAS,YAAc,EAAU,IAAI,QAAW,EAAqB,QAI3F,MAAM,EAAQ,KAAK,aAAa,KAAK,SAAS,KAAK,oBAAqB,KAAK,oBAAoB,EAAQ,EAAS,KAAK,mBACvH,GAAG,EAAO,CACR,KAAK,oBAAsB,EAC3B,KAAK,oBAAsB,C,GAG/B,KAAK,iBAAmB,KAAK,YAAY,KAAK,MAC9C,KAAK,sBAAwB,KAAK,iBAAiB,KAAK,MACxD,KAAK,eAAiB,KAAK,UAAU,KAAK,MAC1C,KAAK,iBAAiB,KAAK,MAC3B,KAAK,YAAY,KAAK,S,CAExB,QAAA,GACE,KAAK,iBAAmB,KAAK,YAAY,KAAK,MAC9C,KAAK,sBAAwB,KAAK,iBAAiB,KAAK,MACxD,KAAK,eAAiB,KAAK,UAAU,KAAK,K,CAG5C,WAAA,GACE,KAAK,yB,CAGP,SAAA,GAEE,IAAI,KAAK,cAAc,CACrB,M,CAEF,KAAK,cAAgB,MACrB,KAAK,0BACL,KAAK,6BACL,GAAU,KAAM,aAAc,CAAC,U,CAejC,YAAA,CAAa,EAAe,GAC1B,IAAI,IAAU,EAAO,CACnB,OAAO,K,CAET,MAAM,EAAsB,EAAM,MAAQ,EAAM,MAC/B,EAAM,KAAO,EAAM,KACnB,EAAM,OAAS,EAAM,OACrB,EAAM,QAAU,EAAM,OAEvC,OAAO,C,CAKT,gBAAA,CAAiB,EAAc,EAAgB,EAAgB,GAC7D,IAAI,EAAM,CACR,M,CAGF,GAAG,CAAC,KAAK,IAAK,MAAM,SAAS,GAAiB,CAC5C,EAAK,GAAK,EACV,EAAU,GAAW,C,CAGvB,GAAG,CAAC,KAAK,IAAK,MAAM,SAAS,GAAiB,CAC5C,EAAK,GAAK,EACV,EAAU,GAAW,C,CAGvB,UAAG,IAAoB,WAAa,CAAC,IAAI,KAAK,SAAS,GAAiB,CACtE,EAAK,OAAS,C,CAGhB,UAAG,IAAoB,WAAa,CAAC,IAAI,KAAK,SAAS,GAAiB,CACtE,EAAK,QAAU,C,CAGjB,OAAO,C,CAGT,eAAA,CAAgB,EAAiB,GAC/B,KAAK,aAAa,EAAK,EAAY,MAAO,EAAY,OAAQ,EAAY,KAAK,EAAY,IAAK,K,CAMlG,YAAA,CAAc,EAAiB,EAAc,EAAc,EAAW,EAAY,GAChF,MAAM,EAAY,EAAM,EACxB,MAAM,EAAY,EAAM,EACxB,MAAM,EAAU,GAAO,KAAK,SAC5B,MAAM,EAAc,EAAQ,wBAE5B,MAAM,EAAW,KAAK,sBAAsB,mBAE5C,IAAI,EAAkB,KAEtB,EAAiB,GAAkB,KAInC,GAAG,KAAK,aAAa,EAAa,KAAc,MAAO,CACrD,EAAkB,K,CAGpB,KAAK,iBAAiB,EAAa,EAAW,EAAW,GAEzD,GAAI,GAAmB,KAAK,aAAa,EAAa,KAAc,MAAO,CACvE,OAAO,K,CAGX,MAAM,EAAgB,OAAO,iBAAiB,GAC9C,IAAI,EAAM,SAAS,EAAc,IAAK,IACtC,IAAI,EAAO,SAAS,EAAc,KAAM,IACxC,IAAI,EAAQ,SAAS,EAAc,MAAO,IAC1C,IAAI,EAAS,SAAS,EAAc,OAAQ,IAE5C,GAAG,CAAC,KAAK,IAAK,MAAM,SAAS,GAAiB,CAC3C,EAAO,EAAO,C,CAGjB,GAAG,CAAC,KAAK,IAAK,MAAM,SAAS,GAAiB,CAC5C,EAAM,EAAQ,C,CAGhB,IAAI,CAAC,IAAI,KAAK,SAAS,GAAiB,CACtC,EAAQ,EAAY,K,CAGtB,GAAI,EAAS,OAAS,EAAY,OAAQ,CACxC,KAAK,gBAAgB,EAAS,E,MAE3B,IAAI,CAAC,IAAI,KAAK,SAAS,GAAiB,CAC3C,EAAS,EAAY,M,CAIvB,EAAQ,MAAM,IAAS,EAAQ,KAC/B,EAAQ,MAAM,KAAS,EAAQ,KAC/B,EAAQ,MAAM,MAAS,EAAQ,KAC/B,EAAQ,MAAM,OAAU,EAAS,KAEjC,OAAO,I,CAUT,WAAA,CAAY,GACV,MAAM,EAAuB,KAC3B,IAAI,EAAuC,GAE3C,KAAK,aAAa,SAAS,IACzB,MAAM,EAAe,EAAQ,uBAAuB,EAAK,WACzD,GAAI,GAAa,OAAS,CAExB,MAAM,EAA2C,MAAM,KAAK,GAAa,KAAK,IAC5E,MAAM,EAAgB,EACtB,EAAc,eAAiB,EAAK,eACpC,OAAO,CAAa,IAItB,EAAoB,IAAI,KAAsB,E,KAIlD,KAAK,kBAAqB,IAAI,GAC9B,KAAK,4BAA4B,EAEnC,YAAW,KACT,GAAsB,G,CAO1B,0BAAA,GACE,KAAK,kBAAkB,SAAQ,IAC7B,EAAQ,iBAAiB,YAAa,KAAK,kBAC3C,EAAQ,iBAAiB,aAAc,KAAK,iBAAiB,G,CAMjE,2BAAA,GACE,SAAS,iBAAiB,UAAW,KAAK,gBAC1C,SAAS,iBAAiB,WAAY,KAAK,gBAC3C,SAAS,iBAAiB,YAAa,KAAK,uBAC5C,SAAS,iBAAiB,YAAa,KAAK,sB,CAM9C,4BAAA,GACE,SAAS,oBAAoB,YAAa,KAAK,uBAC/C,SAAS,oBAAoB,YAAa,KAAK,uBAC/C,SAAS,oBAAoB,UAAW,KAAK,gBAC7C,SAAS,oBAAoB,WAAY,KAAK,e,CAMhD,2BAAA,GACE,KAAK,kBAAkB,SAAQ,IAC7B,EAAQ,oBAAoB,YAAa,KAAK,kBAC9C,EAAQ,oBAAoB,aAAc,KAAK,kBAC/C,EAAQ,oBAAoB,YAAa,KAAK,uBAC9C,EAAQ,oBAAoB,YAAa,KAAK,uBAC9C,EAAQ,oBAAoB,UAAW,KAAK,gBAC5C,EAAQ,oBAAoB,WAAY,KAAK,eAAe,G,CAOhE,uBAAA,GACE,KAAK,8BACL,KAAK,8B,CAMP,mBAAA,CAAoB,GAClB,IAAK,EAAQ,CACX,M,CAIF,IAAI,EAAwB,KAC5B,MAAO,EAAmB,GAAO,OAEjC,GAAI,EAAmB,CACrB,MAAO,EAAY,KAAK,kBAAkB,MAAM,GAAQ,IAAS,IACjE,GAAI,GAAW,eAAgB,CAC7B,EAAiB,GAAW,c,EAIhC,KAAK,kBAAqB,C,QAnUjB,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAkB,KAAA,EAAA,MAAA,EAAA,YAAA,CAAA,MAAA,IAAA,CAAA,MAAA,KAAA,OAAA,EAAA,gBAAA,WAAA,Q,4EAAlB,GAAkB,aAAA,KAAA,SAAA,iBAAA,QAAA,CAAA,WAAA,cAAA,SAAA,GAAA,E,iFAAlB,GAAkB,WAAA,E,KAL9B,EAAU,KAAA,EACT,SAAU,iBACV,WAAY,SAoBZ,eAAA,MAAA,KAAA,EAAA,YAAA,CAAA,KAAA,IAAA,CAAA,KAAA,KAAA,eAAA,CAAA,WAAU,EADT,KAAA,OCfG,MAAO,WAAoC,GAE/C,WAAA,CAAY,EACQ,EACA,EACA,EACA,GAElB,MAAM,GALY,KAAoB,qBAApB,EACA,KAAO,QAAP,EACA,KAAG,IAAH,EACA,KAAqB,sBAArB,EAKX,KAAM,OAAY,MAElB,KAAS,UAAY,MAErB,KAAa,cAAY,MACzB,KAAY,aAAY,MACxB,KAAa,cAAW,GACxB,KAAS,UAAG,MACZ,KAAE,GAAY,GAEf,KAAA,aAAoC,KACpC,KAAc,eAAY,MAGlC,KAAW,YAAY,K,CAEvB,gBAAI,GACF,QAAS,KAAK,gBAAkB,KAAK,Y,CAGvC,QAAA,GAEE,KAAK,qBAAqB,iBAAiB,WAAW,IACpD,MAAM,EAAoB,EAAM,MAAM,GAA4B,EAAK,KAAO,KAAK,KACnF,KAAK,cAAiB,GAAmB,WAAY,G,CAIzD,WAAA,GAEE,GAAI,KAAK,aAAc,CACrB,KAAK,aAAa,a,EAItB,eAAA,GAGE,KAAK,aAAe,KAAK,sBAAsB,eAAe,WAAU,IACtE,KAAK,8BAA8B,EAAM,G,CAI7C,kBAAA,GACE,IAAK,KAAK,iBAAmB,KAAK,YAAa,CAC7C,KAAK,eAAiB,KAEtB,YAAW,KACT,KAAK,qBAAqB,cAAc,KAAK,GAAG,GAAG,UAAU,EAAE,EAAE,KAAK,G,EAK5E,6BAAA,CAA8B,GAC5B,KAAK,qBAAqB,cAAc,KAAK,GAAG,0BAA0B,EAAW,EAAE,EAAE,K,CAG3F,YAAA,GACE,KAAK,qBAAqB,sBAAsB,KAAK,G,CAGvD,SAAA,GACE,KAAK,qBAAqB,cAAc,KAAK,G,6FAzEpC,GAA2B,KAAA,EAAA,MAAA,EAAA,kBAAA,CAAA,MAAA,IAAA,CAAA,MAAA,EAAA,YAAA,CAAA,MAAA,EAAA,mBAAA,CAAA,MAAA,KAAA,OAAA,EAAA,gBAAA,WAAA,QAA3B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GCrBb,aAAA,KAAA,SAAA,2BAAA,OAAA,CAAA,OAAA,SAAA,UAAA,YAAA,cAAA,gBAAA,aAAA,eAAA,cAAA,gBAAA,UAAA,YAAA,GAAA,MAAA,gBAAA,KAAA,SAAA,EAAA,SAAA,85BDcI,OAAA,wgsBAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,YAAA,KAAA,GAAkB,SAAA,iBAAA,QAAA,oB,iFAMT,GAA2B,WAAA,E,KAVvC,EACW,KAAA,EAAA,SAAA,2BACD,QAAA,CACP,EACA,IACD,SAAA,85BAAA,OAAA,4gsBAgBQ,eAAA,MAAA,KAAA,EAAA,kBAAA,CAAA,KAAA,IAAA,CAAA,KAAA,EAAA,YAAA,CAAA,KAAA,EAAA,mBAAA,CAAA,KAAA,KAAA,eAAA,CAAA,OAAM,EAAd,KAAA,IAEQ,UAAS,EAAjB,KAAA,IAEQ,cAAa,EAArB,KAAA,IACQ,aAAY,EAApB,KAAA,IACQ,cAAa,EAArB,KAAA,IACQ,UAAS,EAAjB,KAAA,IACQ,GAAE,EAAV,KAAA,OEjCU,MAAA,GAJb,WAAA,GAME,KAAI,KAAG,EACP,KAAI,KAAG,EACP,KAAU,WAAG,MACb,KAAW,YAAG,MACd,KAAW,YAAG,MAGd,KAAA,SAAW,IAAI,EAGf,KAAA,QAAU,IAAI,EAGd,KAAA,QAAU,IAAI,CAiDf,CA9CC,WAAA,CAAY,GACV,IAAK,KAAK,aAAe,KAAK,YAAa,CACvC,M,CAGJ,MAAM,EAAU,EAAM,QAAU,KAAK,KACrC,MAAM,EAAU,EAAM,QAAU,KAAK,KAErC,IAAI,KAAK,WAAW,CAClB,GAAG,KAAK,IAAI,GAAU,GAAK,KAAK,IAAI,GAAU,EAAE,CAC9C,KAAK,WAAa,KAClB,KAAK,YAAc,I,KAChB,CACH,M,EAGJ,GAAU,KAAM,WAAY,CAAC,EAAO,IAEpC,KAAK,KAAO,EAAM,QAClB,KAAK,KAAO,EAAM,O,CAIpB,SAAA,GACE,GAAG,KAAK,YAAc,KAAK,YAAY,CACrC,GAAU,KAAM,UAAW,CAAC,U,CAE9B,KAAK,WAAa,MAClB,KAAK,YAAc,K,CAIrB,WAAA,CAAY,GACV,KAAK,YAAc,KACnB,KAAK,YAAc,MACnB,KAAK,KAAO,EAAM,QAClB,KAAK,KAAO,EAAM,O,CAIpB,YAAA,CAAa,GACX,IAAI,KAAK,YAAY,CACnB,GAAU,KAAM,UAAW,E,SA5DpB,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAkB,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,Q,4EAAlB,GAAkB,aAAA,KAAA,SAAA,iBAAA,QAAA,CAAA,SAAA,WAAA,QAAA,UAAA,QAAA,WAAA,KAAA,CAAA,UAAA,mFAAA,UAAA,sBAAA,MAAA,yBAAA,SAAA,GAAA,E,iFAAlB,GAAkB,WAAA,E,KAJ9B,EAAU,KAAA,EACT,SAAU,iBACV,WAAY,SAWZ,eAAA,CAAA,SAAQ,EADP,KAAA,IAID,QAAO,EADN,KAAA,IAID,QAAO,EADN,KAAA,IAID,YAAW,E,KADV,E,MAAa,qBAAsB,CAAC,aAwBrC,UAAS,E,KADR,E,MAAa,mBAAoB,CAAC,aAUnC,YAAW,E,KADV,E,MAAa,YAAa,CAAC,aAS5B,aAAY,E,KADX,E,MAAa,QAAS,CAAC,gBCnDb,MAAA,GACX,WAAA,CAAsB,GAAA,KAAoB,qBAApB,EAGb,KAAW,YAAY,MACvB,KAAQ,SAAU,GAG3B,KAAW,YAAW,c,CAGtB,SAAA,GACE,KAAK,qBAAqB,cAAc,KAAK,S,CAG/C,eAAA,CAAgB,GACd,MAAM,EAAU,EAAM,GACtB,MAAM,EAAU,EAAM,GACtB,KAAK,qBAAqB,cAAc,KAAK,SAAS,GAAG,UAAU,EAAQ,E,6FAlBlE,GAAkC,KAAA,EAAA,MAAA,KAAA,OAAA,EAAA,gBAAA,WAAA,QAAlC,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GCbb,aAAA,KAAA,SAAA,mCAAA,OAAA,CAAA,YAAA,cAAA,SAAA,YAAA,SAAA,EAAA,SAAA,uODOI,OAAA,wjtBAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GAAY,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,YAAA,KACZ,GAAkB,SAAA,iBAAA,QAAA,sC,iFAKT,GAAkC,WAAA,E,KAT9C,EACW,KAAA,EAAA,SAAA,mCACD,QAAA,CACP,EACA,IACD,SAAA,uOAAA,OAAA,4jtBAQQ,eAAA,MAAA,KAAA,KAAA,eAAA,CAAA,YAAW,EAAnB,KAAA,IACQ,SAAQ,EAAhB,KAAA,OEIG,MAAO,WAAiD,GAC5D,WAAA,CACE,EACiB,GACjB,MAAM,GADW,KAAoB,qBAApB,EASV,KAAW,YAAY,MACvB,KAAQ,SAAU,GACjB,KAAA,cAAgB,IAAI,EAC9B,KAAA,MAAQ,EAAyB,IAT/B,KAAK,qBAAqB,iBAAiB,WAAW,IACpD,MAAM,EAAoB,EAAM,MAAM,GAA4B,EAAK,KAAO,KAAK,WACnF,KAAK,cAAiB,GAAmB,WAAY,G,CASzD,YAAA,CAAa,GACX,OAAO,KAAK,QAAQ,MAAK,GAAK,EAAE,WAAa,G,CAG/C,aAAA,CAAc,GACZ,MAAM,EAAO,KAAK,aAAa,GAC/B,IAAK,GAAQ,GAAM,SAAU,CAC3B,M,CAEF,KAAK,cAAc,KAAK,E,CAE1B,SAAA,GACE,KAAK,qBAAqB,cAAc,KAAK,S,CAG/C,eAAA,CAAgB,GACd,MAAM,EAAU,EAAM,GACtB,MAAM,EAAU,EAAM,GACtB,KAAK,qBAAqB,cAAc,KAAK,SAAS,GAAG,UAAU,EAAQ,E,QAnClE,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAwC,KAAA,EAAA,MAAA,EAAA,kBAAA,CAAA,MAAA,KAAA,OAAA,EAAA,gBAAA,WAAA,QAAxC,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GANA,aAAA,KAAA,SAAA,0CAAA,OAAA,CAAA,YAAA,CAAA,kBAAA,cAAA,WAAA,cAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,SAAA,CAAA,kBAAA,WAAA,WAAA,WAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,MAAA,CAAA,kBAAA,QAAA,WAAA,QAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,OAAA,QAAA,CAAA,cAAA,iBAAA,UAAA,CACT,GACD,gBAAA,KAAA,SAAA,EAAA,SClBH,krBDYI,OAAA,kqnCAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,mBAAA,OAAA,6CAAA,KAAA,YAAA,KAAA,GACA,SAAA,iBAAA,QAAA,mCAAA,KAAA,WAAA,KAAA,GAAe,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,iB,iFAQN,GAAwC,WAAA,E,KAbpD,EACW,KAAA,EAAA,SAAA,0CACD,QAAA,CACP,EACA,GACA,GAES,UAAA,CACT,GACD,SAAA,krBAAA,OAAA,sqnCAgBQ,eAAA,MAAA,KAAA,EAAA,kBAAA,CAAA,KAAA,KAAA,eAAA,CAAA,YAAW,EAAnB,KAAA,IACQ,SAAQ,EAAhB,KAAA,IACS,cAAa,EAAtB,KAAA,OEhBG,MAAO,WAA+C,GAE1D,WAAA,CAAY,EACO,GAEjB,MAAM,GAFW,KAAoB,qBAApB,EAMV,KAAI,KAAW,GAEf,KAAW,YAAY,MACvB,KAAQ,SAAW,GAEnB,KAAK,MAAW,E,CAEzB,QAAA,GACE,KAAK,qBAAqB,iBAAiB,WAAW,IACpD,MAAM,EAAoB,EAAM,MAAM,GAA4B,EAAK,KAAO,KAAK,WACnF,KAAK,cAAiB,GAAmB,WAAY,G,CAIzD,aAAA,GACE,KAAK,qBAAqB,iBAAiB,KAAK,YAAY,KAAK,S,CAGnE,SAAA,GACE,KAAK,qBAAqB,cAAc,KAAK,S,CAG/C,eAAA,CAAgB,GACd,MAAM,EAAU,EAAM,GACtB,MAAM,EAAU,EAAM,GACtB,KAAK,qBAAqB,cAAc,KAAK,SAAS,GAAG,UAAU,EAAQ,E,QAlClE,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAqC,KAAA,EAAA,MAAA,EAAA,kBAAA,CAAA,MAAA,KAAA,OAAA,EAAA,gBAAA,WAAA,QAArC,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GANA,aAAA,KAAA,SAAA,uCAAA,OAAA,CAAA,KAAA,OAAA,YAAA,cAAA,SAAA,WAAA,MAAA,SAAA,KAAA,CAAA,WAAA,0CAAA,UAAA,CACT,GACD,gBAAA,KAAA,SAAA,EAAA,SChBH,oRDUI,OAAA,wgsBAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,YAAA,KAAA,GAAkB,SAAA,iBAAA,QAAA,mCAAA,KAAA,WAAA,KAClB,GAAe,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,iB,iFAQN,GAAqC,WAAA,E,KAbjD,EACW,KAAA,EAAA,SAAA,uCACD,QAAA,CACP,EACA,GACA,GAES,UAAA,CACT,GACD,SAAA,oRAAA,OAAA,4gsBAaQ,eAAA,MAAA,KAAA,EAAA,kBAAA,CAAA,KAAA,KAAA,eAAA,CAAA,KAAI,EAAZ,KAAA,IAEQ,YAAW,E,KADnB,E,MAAY,sB,CACZ,KAAA,IACQ,SAAQ,EAAhB,KAAA,IAEQ,MAAK,EAAb,KAAA,OEvBH,MAAM,GAAwB,IAC9B,MAAM,GAAuB,IAgBvB,MAAO,WAA+C,GAe1D,WAAA,CACE,EACA,EACiB,GAEjB,MAAM,GAFW,KAAO,QAAP,EAhBT,KAAA,cAAgB,IAAI,EACrB,KAAM,OAAY,KAClB,KAAS,UAAY,KAE9B,KAAA,MAAQ,EAAyB,IAIjC,KAAW,YAAG,kBACd,KAAI,KAAG,oBACP,KAAA,MAAgB,GAChB,KAAe,gBAAW,eAQxB,KAAK,qBAAuB,C,CAG9B,eAAA,GAEE,KAAK,qBAAqB,eAAe,KAAK,QAAQ,KAAK,YAAY,0BAA0B,KAAK,GAAsB,G,QA1BnH,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAsC,KAAA,EAAA,MAAA,EAAA,kBAAA,CAAA,MAAA,IAAA,CAAA,MAAA,EAAA,aAAA,OAAA,EAAA,gBAAA,WAAA,QAAtC,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GALA,aAAA,KAAA,SAAA,wCAAA,OAAA,CAAA,OAAA,CAAA,kBAAA,SAAA,WAAA,SAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,UAAA,CAAA,kBAAA,YAAA,WAAA,YAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,MAAA,CAAA,kBAAA,QAAA,WAAA,QAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,OAAA,QAAA,CAAA,cAAA,gBAAA,MAAA,eAAA,UAAA,CAAC,GAAiB,gBAAA,KAAA,SAAA,EAAA,SCvB/B,2kCDgBI,OAAA,wgsBAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,YAAA,KAAA,GAA2B,SAAA,2BAAA,OAAA,yFAAA,KAAA,YAAA,KAC3B,GAAkC,SAAA,mCAAA,OAAA,6BAAA,KAAA,YAAA,KAClC,GACA,SAAA,0CAAA,OAAA,mCAAA,QAAA,oBAAA,KAAA,YAAA,KAAA,GACA,SAAA,uCAAA,OAAA,4CAAA,KAAA,WAAA,KAAA,IAAe,cAAA,EAAA,kBAAA,WAAA,E,iFAON,GAAsC,WAAA,E,KAflD,EACW,KAAA,EAAA,SAAA,wCACD,QAAA,CACP,EACA,GACA,GACA,GACA,GACA,GACD,UACU,CAAC,GAGG,cAAA,EAAkB,UAAS,SAAA,2kCAAA,OAAA,4gsBAIhC,eAAA,MAAA,KAAA,EAAA,kBAAA,CAAA,KAAA,IAAA,CAAA,KAAA,EAAA,aAAA,eAAA,CAAA,cAAa,EAAtB,KAAA,IACQ,OAAM,EAAd,KAAA,IACQ,UAAS,EAAjB,KAAA,OEpBH,MAAM,GAAuB,IAC7B,MAAM,GAAuB,IAkBvB,MAAO,WAAoD,GAC/D,WAAA,CAAY,EACQ,EACA,EACA,GAClB,MAAM,GAHY,KAAoB,qBAApB,EACA,KAAO,QAAP,EACA,KAAG,IAAH,EAIZ,KAAc,eAAY,MAGxB,KAAA,cAAgB,IAAI,EAErB,KAAM,OAAY,KAClB,KAAS,UAAY,KAGrB,KAAK,MAA2B,GAEzC,KAAI,KAAG,yBACP,KAAA,MAAgB,GAChB,KAAe,gBAAW,oBAC1B,KAAW,YAAG,sB,CAEd,eAAA,GACE,KAAK,qBAAqB,eAAe,KAAK,QAAQ,KAAK,YAAY,0BAA0B,KAAK,GAAsB,G,CAG9H,kBAAA,GACE,IAAK,KAAK,eAAgB,CACxB,KAAK,eAAiB,KACtB,KAAK,IAAI,gBACT,YAAW,KACT,KAAK,qBAAqB,cAAc,KAAK,YAAY,0BAA0B,UAAU,EAAE,EAAE,KAAK,G,8FAjCjG,GAA2C,KAAA,EAAA,MAAA,EAAA,kBAAA,CAAA,MAAA,IAAA,CAAA,MAAA,EAAA,YAAA,CAAA,MAAA,EAAA,oBAAA,OAAA,EAAA,gBAAA,WAAA,QAA3C,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GANA,aAAA,KAAA,SAAA,6CAAA,OAAA,CAAA,OAAA,SAAA,UAAA,YAAA,MAAA,SAAA,QAAA,CAAA,cAAA,iBAAA,UAAA,CAAC,GAAiB,gBAAA,KAAA,SAAA,EAAA,SCzB/B,+kCDkBI,OAAA,wgsBAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,YAAA,KAAA,GAA2B,SAAA,2BAAA,OAAA,yFAAA,KAAA,YAAA,KAC3B,GAAkC,SAAA,mCAAA,OAAA,6BAAA,KAAA,YAAA,KAClC,GACA,SAAA,0CAAA,OAAA,mCAAA,QAAA,oBAAA,KAAA,YAAA,KAAA,GACA,SAAA,uCAAA,OAAA,4CAAA,KAAA,WAAA,KAAA,IAAe,cAAA,EAAA,kBAAA,WAAA,E,iFAQN,GAA2C,WAAA,E,KAhBvD,EACW,KAAA,EAAA,SAAA,6CACD,QAAA,CACP,EACA,GACA,GACA,GACA,GACA,GACD,UACU,CAAC,GAGG,cAAA,EAAkB,UAAS,SAAA,+kCAAA,OAAA,4gsBAchC,eAAA,MAAA,KAAA,EAAA,kBAAA,CAAA,KAAA,IAAA,CAAA,KAAA,EAAA,YAAA,CAAA,KAAA,EAAA,oBAAA,eAAA,CAAA,cAAa,EAAtB,KAAA,IAEQ,OAAM,EAAd,KAAA,IACQ,UAAS,EAAjB,KAAA,IAGQ,MAAK,EAAb,KAAA,OEhCG,MAAO,WAAwC,GACnD,WAAA,CAAY,EACQ,GAElB,MAAM,GAFY,KAAoB,qBAApB,EAKX,KAAW,YAAY,MACvB,KAAQ,SAAW,E,CAE5B,QAAA,GACE,KAAK,qBAAqB,iBAAiB,WAAW,IACpD,MAAM,EAAoB,EAAM,MAAM,GAA4B,EAAK,KAAO,KAAK,WACnF,KAAK,cAAiB,GAAmB,WAAY,G,QAb9C,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA+B,KAAA,EAAA,MAAA,EAAA,kBAAA,CAAA,MAAA,KAAA,OAAA,EAAA,gBAAA,WAAA,QAA/B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GChBb,aAAA,KAAA,SAAA,gCAAA,OAAA,CAAA,YAAA,cAAA,SAAA,YAAA,gBAAA,KAAA,SAAA,EAAA,SAAA,gJDUI,OAAA,KAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,WAAA,KAAA,KAAe,E,iFAKN,GAA+B,WAAA,E,KAT3C,EACW,KAAA,EAAA,SAAA,gCACD,QAAA,CACP,EACA,GACD,SAAA,oJAWQ,eAAA,MAAA,KAAA,EAAA,kBAAA,CAAA,KAAA,KAAA,eAAA,CAAA,YAAW,EAAnB,KAAA,IACQ,SAAQ,EAAhB,KAAA,OEFG,MAAO,WAA+B,GAC1C,WAAA,CAAY,GACV,MAAM,GAGC,KAAkB,mBAAW,aAC7B,KAAiB,kBAAW,aAE5B,KAAiB,kBAAY,MAEtC,KAAA,OAAS,EAA+B,IAE9B,KAAA,aAAe,IAAI,EACnB,KAAA,aAAe,IAAI,EAEnB,KAAA,qBAAuB,IAAI,EAC3B,KAAA,qBAAuB,IAAI,EAE3B,KAAA,wBAA0B,IAAI,EAC9B,KAAA,wBAA0B,IAAI,C,6FAnB7B,GAAsB,KAAA,EAAA,MAAA,EAAA,mBAAA,OAAA,EAAA,gBAAA,WAAA,QAAtB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAsB,aAAA,KAAA,SAAA,qBAAA,OAAA,CAAA,mBAAA,CAAA,kBAAA,qBAAA,WAAA,qBAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,kBAAA,CAAA,kBAAA,oBAAA,WAAA,oBAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,kBAAA,CAAA,kBAAA,oBAAA,WAAA,oBAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,OAAA,CAAA,kBAAA,SAAA,WAAA,SAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,OAAA,QAAA,CAAA,aAAA,eAAA,aAAA,eAAA,qBAAA,uBAAA,qBAAA,uBAAA,wBAAA,0BAAA,wBAAA,2BAAA,gBAAA,KAAA,SAAA,EAAA,SCtBnC,wyHA2GA,OAAA,itgBAAA,aAAA,EAAA,KAAA,WAAA,KD9FI,GAAY,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,mBAAA,OAAA,6CAAA,KAAA,YAAA,KACZ,GAAuB,SAAA,sBAAA,OAAA,aAAA,QAAA,qBAAA,KAAA,YAAA,KACvB,GAA6B,SAAA,+BAAA,KAAA,YAAA,KAC7B,GAAoC,SAAA,uCAAA,KAAA,WAAA,KACpC,GAAe,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,iB,iFAKN,GAAsB,WAAA,E,KAZlC,EACW,KAAA,EAAA,SAAA,qBACD,QAAA,CACP,EACA,GACA,GACA,GACA,GACD,SAAA,wyHAAA,OAAA,qtgBASQ,eAAA,MAAA,KAAA,EAAA,mBAAA,eAAA,CAAA,mBAAkB,EAA1B,KAAA,IACQ,kBAAiB,EAAzB,KAAA,IAEQ,kBAAiB,EAAzB,KAAA,IAIS,aAAY,EAArB,KAAA,IACS,aAAY,EAArB,KAAA,IAES,qBAAoB,EAA7B,KAAA,IACS,qBAAoB,EAA7B,KAAA,IAES,wBAAuB,EAAhC,KAAA,IACS,wBAAuB,EAAhC,KAAA,OEhCU,MAAA,GANb,WAAA,GAOW,KAAqB,sBAAY,KAC3C,QAFY,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA4B,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAA5B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAA4B,aAAA,KAAA,SAAA,4BAAA,OAAA,CAAA,sBAAA,yBAAA,SAAA,EAAA,SCTzC,oGAIA,OAAA,+QAAA,aAAA,EAAA,KAAA,WAAA,KDCY,GAAY,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,yB,iFAIX,GAA4B,WAAA,E,KANxC,EACW,KAAA,EAAA,SAAA,4BAA2B,QAC5B,CAAC,GAAa,SAAA,oGAAA,OAAA,mRAKd,eAAA,CAAA,sBAAqB,EAA7B,KAAA,OESH,MAAM,GAAwB,IAC9B,MAAM,GAAsB,GAoBtB,MAAO,WAAoD,GAC/D,WAAA,CAAY,EACO,EACA,EACA,GAEjB,MAAM,GAJW,KAAoB,qBAApB,EACA,KAAO,QAAP,EACA,KAAG,IAAH,EAIX,KAAc,eAAY,MAIzB,KAAA,OAAkB,MAClB,KAAW,YAAY,MACvB,KAAe,gBAAuB,UACtC,KAAS,UAAY,MACrB,KAAkB,mBAAuB,UAElD,KAAI,KAAG,4BACP,KAAK,MAAW,qBAChB,KAAW,YAAG,0BAEL,KAAK,MAA2B,GAE/B,KAAA,cAAgB,IAAI,EAGrB,KAAqB,sBAAY,MACjC,KAAiB,kBAAY,MAC7B,KAAA,QAAmC,CAAE,GAAI,GAAI,KAAM,GAAI,SAAU,GAAI,OAAQ,IAC5E,KAAA,aAAe,IAAI,EACnB,KAAA,aAAe,IAAI,EACnB,KAAA,qBAAuB,IAAI,EAC3B,KAAA,qBAAuB,IAAI,EAC3B,KAAA,wBAA0B,IAAI,EAC9B,KAAA,wBAA0B,IAAI,EAC9B,KAAA,YAAc,IAAI,EAC5B,KAAA,WAAa,EAAO,E,CAEpB,eAAA,GACE,KAAK,qBAAqB,eAAe,KAAK,QAAQ,KAAK,YAAY,0BAA0B,KAAK,GAAsB,IAE5H,KAAK,qBAAqB,iBAAiB,KAAK,GAAmB,KAAK,aAAa,UAAU,CAAC,KAAM,IACpG,MAAM,EAAoB,EAAM,MAAM,GAA4B,EAAK,KAAO,KAAK,cACnF,KAAK,cAAiB,GAAmB,WAAY,EACrD,SAAU,IAAM,QAAQ,IAAI,c,CAIhC,kBAAA,GAEE,IAAK,KAAK,eAAgB,CACxB,KAAK,eAAiB,KACtB,KAAK,IAAI,gBACT,YAAW,KACT,KAAK,qBAAqB,cAAc,KAAK,YAAY,0BAA0B,UAAU,EAAE,EAAE,KAAK,G,8FAvDjG,GAA2C,KAAA,EAAA,MAAA,EAAA,kBAAA,CAAA,MAAA,IAAA,CAAA,MAAA,EAAA,YAAA,CAAA,MAAA,EAAA,oBAAA,OAAA,EAAA,gBAAA,WAAA,QAA3C,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAA2C,aAAA,KAAA,SAAA,6CAAA,OAAA,CAAA,OAAA,SAAA,YAAA,cAAA,gBAAA,kBAAA,UAAA,YAAA,mBAAA,qBAAA,MAAA,QAAA,sBAAA,wBAAA,kBAAA,oBAAA,QAAA,WAAA,QAAA,CAAA,cAAA,gBAAA,aAAA,eAAA,aAAA,eAAA,qBAAA,uBAAA,qBAAA,uBAAA,wBAAA,0BAAA,wBAAA,0BAAA,YAAA,eAAA,UAL3C,CAAC,GAAiB,gBAAA,KAAA,SAAA,EAAA,SCnC/B,k8EDwBI,OAAA,8vwBAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,YAAA,KAAA,GACA,SAAA,2BAAA,OAAA,yFAAA,KAAA,YAAA,KAAA,GACA,SAAA,mCAAA,OAAA,6BAAA,KAAA,YAAA,KAAA,GAAwC,SAAA,0CAAA,OAAA,mCAAA,QAAA,oBAAA,KAAA,YAAA,KACxC,GAAqC,SAAA,uCAAA,OAAA,4CAAA,KAAA,YAAA,KACrC,GAA+B,SAAA,gCAAA,OAAA,6BAAA,KAAA,YAAA,KAC/B,GAA4B,SAAA,4BAAA,OAAA,4BAAA,KAAA,YAAA,KAC5B,GAAsB,SAAA,qBAAA,OAAA,wEAAA,QAAA,oIAAA,KAAA,WAAA,KACtB,GAAe,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,KAAA,YAAA,KACf,GAAmC,SAAA,qCAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAO1B,GAA2C,WAAA,E,KAnBvD,EACW,KAAA,EAAA,SAAA,6CACD,QAAA,CACP,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACA,IACD,UACU,CAAC,GAGG,cAAA,EAAkB,UAAS,SAAA,k8EAAA,OAAA,kwwBAcjC,eAAA,MAAA,KAAA,EAAA,kBAAA,CAAA,KAAA,IAAA,CAAA,KAAA,EAAA,YAAA,CAAA,KAAA,EAAA,oBAAA,eAAA,CAAA,OAAM,EAAd,KAAA,IACQ,YAAW,EAAnB,KAAA,IACQ,gBAAe,EAAvB,KAAA,IACQ,UAAS,EAAjB,KAAA,IACQ,mBAAkB,EAA1B,KAAA,IAMQ,MAAK,EAAb,KAAA,IAES,cAAa,EAAtB,KAAA,IAGQ,sBAAqB,EAA7B,KAAA,IACQ,kBAAiB,EAAzB,KAAA,IACQ,QAAO,EAAf,KAAA,IACS,aAAY,EAArB,KAAA,IACS,aAAY,EAArB,KAAA,IACS,qBAAoB,EAA7B,KAAA,IACS,qBAAoB,EAA7B,KAAA,IACS,wBAAuB,EAAhC,KAAA,IACS,wBAAuB,EAAhC,KAAA,IACS,YAAW,EAApB,KAAA,OEjEU,MAAA,GAPb,WAAA,GASG,KAAA,eAAiB,CAChB,CAAE,OAAQ,KAAM,KAAM,WACtB,CAAE,OAAQ,KAAM,KAAM,WACtB,CAAE,OAAQ,KAAM,KAAM,gBACtB,CAAE,OAAQ,KAAM,KAAM,gBACtB,CAAE,OAAQ,KAAM,KAAM,WACtB,CAAE,OAAQ,KAAM,KAAM,YACtB,CAAE,OAAQ,KAAM,KAAM,YACtB,CAAE,OAAQ,KAAM,KAAM,WACtB,CAAE,OAAQ,KAAM,KAAM,UACtB,CAAE,OAAQ,KAAM,KAAM,WAGgB,KAAO,QAAa,MACnD,KAAgB,iBAAY,KACG,KAAQ,SAAa,MAC7D,KAAW,YAAa,MAEd,KAAA,wBAA0B,IAAI,CASzC,CAPC,eAAA,CAAiB,GACf,GAAU,KAAM,0BAA2B,E,CAG7C,aAAA,GACE,KAAK,aAAe,KAAK,W,QA3BhB,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA4B,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAA5B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAA4B,aAAA,KAAA,SAAA,4BAAA,OAAA,CAAA,QAAA,qBAenB,GAAgB,iBAAA,mBAAA,SAAA,uBAEhB,IC5BtB,QAAA,CAAA,wBAAA,2BAAA,SAAA,EAAA,SAAA,woCDMY,OAAA,0zHAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GAAY,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,mBAAA,OAAA,6CAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAKX,GAA4B,WAAA,E,KAPxC,EACW,KAAA,EAAA,SAAA,4BACD,QAAA,CAAC,GAGK,cAAA,EAAkB,UAAS,SAAA,woCAAA,OAAA,8zHAiBF,eAAA,CAAA,QAAO,E,KAA9C,E,MAAM,CAAE,UAAW,MACX,iBAAgB,EAAxB,KAAA,IACuC,SAAQ,E,KAA/C,E,MAAM,CAAE,UAAW,MAGV,wBAAuB,EAAhC,KAAA,OEXG,MAAO,WAAoC,GAC/C,WAAA,CAAY,GACV,MAAM,GAIC,KAAW,YAAW,GACtB,KAAe,gBAAW,GAC1B,KAAkB,mBAAW,GAC7B,KAAiB,kBAAW,GACG,KAAsB,uBAAY,MAClC,KAAc,eAAY,MAC1B,KAAiB,kBAAY,MAC7B,KAAuB,wBAAY,MACnC,KAAiB,kBAAY,MAE7B,KAAqB,sBAAY,KACjC,KAAa,cAAY,KACzB,KAAgB,iBAAY,KAC5B,KAAsB,uBAAY,KAClC,KAAgB,iBAAY,KAE5B,KAAW,YAAY,MACvB,KAAU,WAAY,MACtB,KAAO,QAAY,MACnB,KAAa,cAAY,MACzB,KAAuB,wBAAY,MAClE,KAAc,eAAc,GAsBrC,KAAA,aAA+B,CAC7B,CAAE,OAAQ,iBAAkB,GAAI,iBAAkB,KAAM,GAAI,MAAO,oBAAqB,OAAQ,2BAA4B,eAAgB,6BAA8B,cAAe,GAAI,kBAAmB,MAAO,eAAgB,MAAO,YAAa,IAC3P,CAAE,OAAQ,SAAU,GAAI,kBAAmB,KAAM,GAAI,MAAO,qBAAsB,OAAQ,kBAAmB,eAAgB,GAAI,cAAe,GAAI,kBAAmB,MAAO,eAAgB,MAAO,YAAa,IAClN,CAAE,OAAQ,YAAa,GAAI,qBAAsB,KAAM,GAAI,MAAO,wBAAyB,OAAQ,qBAAsB,eAAgB,GAAI,cAAe,GAAI,kBAAmB,MAAO,eAAgB,MAAO,YAAa,IAC9N,CAAE,OAAQ,kBAAmB,GAAI,2BAA4B,KAAM,GAAI,MAAO,+BAAgC,OAAQ,4BAA6B,eAAgB,GAAI,cAAe,GAAI,kBAAmB,MAAO,eAAgB,MAAO,YAAa,IACxP,CAAE,OAAQ,YAAa,GAAI,qBAAsB,KAAM,GAAI,MAAO,wBAAyB,OAAQ,aAAc,eAAgB,GAAI,cAAe,GAAI,kBAAmB,MAAO,eAAgB,MAAO,YAAa,I,CAzBxN,aAAI,GACF,OAAO,KAAK,gBAAkB,KAAK,gBAAkB,oE,CAEvD,mBAAI,GACF,MAAO,8GAA8G,KAAK,gBAAkB,KAAK,gBAAkB,uE,CAGrK,wBAAI,GACF,MAAO,CAAE,WAAc,GAAG,KAAK,kB,CAGjC,iBAAI,GACF,MAAO,CAAE,WAAc,OAAO,KAAK,a,CAgBrC,aAAI,GACF,OAAO,KAAK,aAAa,MAAK,CAAC,EAAG,IAAM,KAAK,eAAe,QAAQ,EAAE,IAAM,KAAK,eAAe,QAAQ,EAAE,K,CAM5G,SAAA,CAAU,GACR,GAAI,EAAM,CACR,MAAM,EAAM,GAAG,EAAK,OAAS,EAAK,OAAS,EAAK,YAEhD,OAAU,KAAyD,E,CAErE,OAAO,K,CAKT,WAAA,CAAY,GAEV,GAAI,EAAM,CACR,MAAM,EAAM,GAAG,EAAK,OAAS,EAAK,OAAS,EAAK,aAChD,QAAU,KAAyD,E,CAErE,OAAO,K,CAIT,uBAAA,CAAwB,EAAgB,GACtC,QAAQ,IAAI,EAAQ,E,CAMtB,gBAAA,CAAiB,EAAoB,EAAc,GACjD,GAAI,EAAO,CACT,EAAM,kBACN,EAAM,gB,CAER,QAAQ,IAAI,EAAM,EAAM,GAGxB,GAAI,GAAQ,OAAQ,CAClB,GAAI,KAAK,YAAY,GAAO,CAC1B,M,EAGJ,MAAM,EAAS,EAAK,OACpB,GAAU,KAAM,4BAA6B,CAAE,SAAQ,Q,CAGzD,qBAAA,CAAsB,GACpB,GAAI,EAAO,CACT,EAAM,kBACN,EAAM,gB,EAIV,0BAAA,CAA2B,EAAoB,GAC7C,MAAM,EAAiB,GAAG,KAAK,YAAY,GAAQ,WAAa,MAAM,EAAU,GAAK,oBACrF,OAAO,C,CAGT,0BAAA,CAA2B,GACzB,MAAM,EAAiB,GAAG,EAAK,SAAS,EAAK,SAAW,KAAK,kBAAoB,SAAW,MAAM,KAAK,YAAY,GAAQ,WAAa,KACxI,OAAO,C,6FA3HE,GAA2B,KAAA,EAAA,MAAA,EAAA,mBAAA,OAAA,EAAA,gBAAA,WAAA,QAA3B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAA2B,aAAA,KAAA,SAAA,2BAAA,OAAA,CAAA,YAAA,cAAA,gBAAA,kBAAA,mBAAA,qBAAA,kBAAA,oBAAA,uBAAA,mDAUlB,GAAgB,eAAA,mCAChB,GAAgB,kBAAA,yCAChB,GACA,wBAAA,qDAAA,GACA,kBAAA,yCAAA,GAAgB,sBAAA,iDAEhB,GAAgB,cAAA,iCAChB,GACA,iBAAA,uCAAA,GACA,uBAAA,mDAAA,GAAgB,iBAAA,uCAChB,GAAgB,YAAA,6BAEhB,GACA,WAAA,2BAAA,GAAgB,QAAA,qBAChB,GAAgB,cAAA,iCAChB,GACA,wBAAA,qDAAA,GA/BT,eAAA,kBAAA,UAAA,CAAC,GAAiB,gBAAA,KAAA,SAAA,EAAA,SCf/B,oyHDcY,OAAA,25qBAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GAAY,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,YAAA,KAAA,EAAA,iBAAA,SAAA,qBAAA,OAAA,4EAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,cAAA,KAAA,WAAA,KAAE,GAAe,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAM5B,GAA2B,WAAA,E,KARvC,EACW,KAAA,EAAA,SAAA,2BACD,QAAA,CAAC,EAAc,GACb,UAAA,CAAC,GAGG,cAAA,EAAkB,UAAS,SAAA,oyHAAA,OAAA,+5qBAQjC,eAAA,MAAA,KAAA,EAAA,mBAAA,eAAA,CAAA,YAAW,EAAnB,KAAA,IACQ,gBAAe,EAAvB,KAAA,IACQ,mBAAkB,EAA1B,KAAA,IACQ,kBAAiB,EAAzB,KAAA,IACuC,uBAAsB,E,KAA7D,E,MAAM,CAAE,UAAW,MACoB,eAAc,E,KAArD,E,MAAM,CAAE,UAAW,MACoB,kBAAiB,E,KAAxD,E,MAAM,CAAE,UAAW,MACoB,wBAAuB,E,KAA9D,E,MAAM,CAAE,UAAW,MACoB,kBAAiB,E,KAAxD,E,MAAM,CAAE,UAAW,MAEoB,sBAAqB,E,KAA5D,E,MAAM,CAAE,UAAW,MACoB,cAAa,E,KAApD,E,MAAM,CAAE,UAAW,MACoB,iBAAgB,E,KAAvD,E,MAAM,CAAE,UAAW,MACoB,uBAAsB,E,KAA7D,E,MAAM,CAAE,UAAW,MACoB,iBAAgB,E,KAAvD,E,MAAM,CAAE,UAAW,MAEoB,YAAW,E,KAAlD,E,MAAM,CAAE,UAAW,MACoB,WAAU,E,KAAjD,E,MAAM,CAAE,UAAW,MACoB,QAAO,E,KAA9C,E,MAAM,CAAE,UAAW,MACoB,cAAa,E,KAApD,E,MAAM,CAAE,UAAW,MACoB,wBAAuB,E,KAA9D,E,MAAM,CAAE,UAAW,MACX,eAAc,EAAtB,KAAA,OEvCH,MAAM,GAAiB,CACrB,2BAA4B,0BAC5B,4BAA6B,2BAC7B,iBAAkB,iBAClB,kBAAmB,kBACnB,qBAAsB,qBACtB,4BAA6B,2BAC7B,qBAAsB,qBACtB,2BAA4B,2BAC5B,sBAAuB,qBACvB,wBAAyB,uBACzB,oBAAqB,oBACrB,6BAA8B,4BAC9B,YAAa,cACb,mBAAoB,kBACpB,gBAAiB,gBACjB,yBAA0B,uBAC1B,2BAA4B,0BAiBxB,MAAO,WAAiC,GAC5C,WAAA,CAAY,GACV,MAAM,GAGgC,KAAU,WAAa,MACvB,KAAO,QAAa,MACpB,KAAS,UAAa,MACtB,KAAK,MAAa,MAClB,KAAO,QAAa,MACpB,KAAoB,qBAAa,MACjC,KAAuB,wBAAa,MACnE,KAAW,YAAY,GACvB,KAAe,gBAAY,GAC3B,KAAkB,mBAAY,GAC9B,KAAiB,kBAAY,GACE,KAAsB,uBAAa,MACnC,KAAc,eAAa,MAC3B,KAAiB,kBAAa,MAC9B,KAAuB,wBAAa,MACpC,KAAiB,kBAAa,MAC7D,KAAgB,iBAAY,GAC5B,KAAc,eAAY,GACK,KAAW,YAAa,MACxB,KAAW,YAAa,MACxB,KAAqB,sBAAa,MAClC,KAAyB,0BAAa,MACtC,KAAuB,wBAAa,MACpC,KAAkB,mBAAa,MAC/B,KAAmB,oBAAa,MAChC,KAAmB,oBAAa,MAChC,KAAqB,sBAAa,MAClC,KAAgB,iBAAa,MAC7B,KAAmB,oBAAa,MAChC,KAAuB,wBAAa,MACpC,KAAY,aAAa,MACzB,KAAc,eAAa,MAC3B,KAAkB,mBAAa,KAC/B,KAAyB,0BAAa,KACtC,KAAqB,sBAAa,KAClC,KAAa,cAAa,KAC1B,KAAgB,iBAAa,KAC7B,KAAsB,uBAAa,KACnC,KAAgB,iBAAa,KAC7B,KAAkB,mBAAa,KAC/B,KAAoB,qBAAa,KACjC,KAAe,gBAAa,KAC5B,KAAkB,mBAAa,KAC/B,KAAsB,uBAAa,KACnC,KAAW,YAAa,KACxB,KAAa,cAAa,KAC1B,KAA+B,gCAAa,KAC5C,KAAkB,mBAAa,KAC/B,KAAkB,mBAAa,MAC/B,KAAoB,qBAAa,MAChE,KAAY,aAAc,GAC1B,KAAS,UAAc,GACvB,KAAc,eAAc,GAE3B,KAAA,uBAAyB,IAAI,EAC7B,KAAA,8BAAgC,IAAI,EA2G9C,KAAA,YAA2B,CAAE,OAAO,cAAe,GAAG,yBAAyB,KAAK,GAAI,MAAO,qBAAsB,OAAQ,4BAA6B,eAAgB,4BAA4B,cAAc,GAAG,kBAAmB,KAAM,eAAiB,MAAM,YAAa,IAEpR,KAAW,YAAG,CAAC,KAAK,OAAO,OAAO,KAAK,SAAS,KAAK,UAAU,KAAK,SAAS,MAG7E,KAAA,SAA2B,CACzB,CAAE,OAAO,iBAAkB,GAAI,GAAe,iBAAkB,KAAK,GAAI,MAAO,oBAAqB,OAAQ,4BAA6B,eAAgB,4BAA6B,cAAc,6BAA6B,kBAAmB,MAAM,eAAiB,MAAM,YAAa,IAC/R,CAAE,OAAO,SAAU,GAAI,GAAe,kBAAmB,KAAK,GAAG,MAAO,qBAAsB,OAAQ,aAAc,eAAgB,aAAa,cAAc,GAAG,kBAAmB,MAAM,eAAiB,MAAM,YAAa,IAC/N,CAAE,OAAO,YAAa,GAAI,GAAe,qBAAsB,KAAK,GAAG,MAAO,wBAAyB,OAAQ,SAAU,eAAgB,SAAS,cAAc,GAAG,kBAAmB,MAAM,eAAiB,MAAM,YAAa,IAChO,CAAE,OAAO,kBAAmB,GAAI,GAAe,4BAA6B,KAAK,GAAG,MAAO,+BAAgC,OAAQ,YAAa,eAAgB,YAAY,cAAc,GAAG,kBAAmB,MAAM,eAAiB,MAAM,YAAa,IAC1P,CAAE,OAAO,YAAa,GAAI,GAAe,qBAAsB,KAAK,GAAG,MAAO,wBAAyB,OAAQ,aAAc,eAAgB,aAAa,cAAc,GAAG,kBAAmB,MAAM,eAAiB,MAAM,YAAa,IACxO,CAAE,OAAO,GAAG,GAAI,GAAe,2BAA4B,KAAK,UAAW,MAAO,0BAA2B,OAAQ,GAAG,eAAe,GAAG,cAAc,GAAG,kBAAmB,MAAM,eAAiB,MAAM,YAAa,IAExN,CAAE,OAAO,cAAe,GAAI,GAAe,sBAAuB,KAAK,GAAG,MAAO,2BAA4B,OAAQ,eAAgB,eAAgB,eAAgB,cAAc,GAAG,kBAAmB,MAAM,eAAiB,MAAM,YAAa,2BACnP,CAAE,OAAO,cAAe,GAAI,GAAe,wBAAyB,KAAK,GAAG,MAAO,2BAA4B,OAAQ,eAAgB,eAAgB,eAAgB,cAAc,GAAG,kBAAmB,MAAM,eAAiB,MAAM,YAAa,2BACrP,CAAE,OAAO,WAAY,GAAI,GAAe,oBAAqB,KAAK,GAAG,MAAO,uBAAwB,OAAQ,WAAY,eAAgB,WAAY,cAAc,GAAG,kBAAmB,MAAO,eAAiB,MAAO,YAAa,2BACpO,CAAE,OAAO,gBAAiB,GAAI,GAAe,6BAA8B,KAAK,GAAG,MAAO,4BAA6B,OAAQ,gBAAiB,eAAgB,gBAAiB,cAAc,GAAG,kBAAmB,KAAM,eAAiB,MAAO,YAAa,2BAEhQ,CAAE,OAAO,GAAG,GAAI,GAAe,YAAa,KAAK,UAAW,MAAO,0BAA2B,OAAQ,GAAG,eAAe,GAAG,cAAc,GAAG,kBAAmB,MAAM,eAAiB,MAAM,YAAa,IAEzM,CAAE,OAAO,cAAe,GAAI,GAAe,2BAA4B,KAAK,GAAI,MAAO,2BAA4B,OAAQ,4BAA6B,eAAgB,4BAA6B,cAAc,GAAG,kBAAmB,KAAM,eAAiB,MAAM,YAAa,IACnR,CAAE,OAAO,kBAAmB,GAAI,GAAe,4BAA6B,KAAK,GAAG,MAAO,+BAAgC,OAAQ,0BAA2B,eAAgB,0BAA2B,cAAc,GAAG,kBAAmB,KAAM,eAAiB,MAAM,YAAa,KAGzR,KAAA,gBAAkC,CAChC,CAAE,OAAO,GAAG,GAAI,GAAe,YAAa,KAAK,UAAW,MAAO,0BAA0B,kBAAmB,MAAM,eAAiB,OACvI,CAAE,OAAO,SAAU,GAAI,GAAe,mBAAoB,KAAK,GAAI,MAAO,sBAAuB,OAAQ,UAAW,eAAgB,UAAW,cAAc,GAAI,kBAAmB,MAAO,eAAiB,MAAO,YAAa,IAChO,CACE,OAAO,cACP,GAAI,GAAe,yBACnB,MAAO,4BACP,OAAQ,iBACR,eAAgB,kBAElB,CACE,OAAO,gBACP,GAAI,GAAe,2BACnB,MAAO,8BACP,OAAQ,mBACR,eAAgB,oBAElB,CAAE,OAAO,OAAQ,GAAI,GAAe,gBAAiB,KAAK,GAAG,MAAO,mBAAoB,OAAQ,YAAa,eAAgB,YAAY,cAAc,GAAG,kBAAmB,MAAM,eAAiB,MAAM,YAAa,I,CAlJzN,WAAA,CAAY,GACV,GAAI,EAAQ,oBAAqB,CAC/B,KAAK,kBAAkB,IAAI,EAAQ,oBAAoB,a,EAI3D,QAAI,GACF,IAAI,EAAW,KAAK,SAAS,MAAK,CAAC,EAAG,IAAM,KAAK,UAAU,QAAQ,EAAE,IAAM,KAAK,UAAU,QAAQ,EAAE,MAGpG,IAAK,KAAK,gBAAiB,CACzB,EAAW,EAAS,QAAO,EAAG,QAAS,IAAO,GAAe,qB,CAI/D,GAAI,KAAK,oBAAqB,CAC5B,EAAW,EAAS,QAAO,EAAG,QAAS,IAAO,GAAe,4B,CAI/D,GAAI,KAAK,wBAAyB,CAChC,EAAW,EAAS,QAAO,EAAG,QAAS,IAAO,GAAe,6B,CAI/D,GAAG,KAAK,QAAS,CACf,EAAW,EAAS,QAAO,EAAG,QAC5B,IAAO,GAAe,6BACtB,IAAO,GAAe,sB,CAI1B,OAAO,C,CAGT,cAAI,GACF,IAAI,EAAa,KAAK,gBAAgB,QAAO,GAAQ,KAAK,cAAc,KAAU,KAAK,UAAU,KAGjG,GAAI,KAAK,sBAAwB,KAAK,QAAS,CAC7C,EAAa,EAAW,QAAO,EAAG,QAAS,IAAO,GAAe,a,CAInE,IAAK,KAAK,mBAAoB,CAC5B,OAAO,EAAW,QAAO,EAAG,QAAS,IAAO,GAAe,0B,CAI7D,OAAO,EAAW,QAAO,EAAG,QAAS,IAAO,GAAe,a,CAM7D,aAAA,CAAc,GAEZ,GAAI,EAAK,kBAAmB,CAC1B,MAAM,EAAM,GAAG,EAAK,mBACpB,QAAW,KAAuD,E,CAEpE,OAAO,I,CAKT,YAAA,CAAa,GAEX,GAAI,EAAK,cAAgB,0BAA2B,CAClD,OAAO,KAAK,cAAgB,E,CAE9B,OAAO,I,CAMT,SAAA,CAAU,GAER,GAAI,EAAM,CACR,MAAM,EAAM,GAAG,EAAK,OAAS,EAAK,OAAS,EAAK,YAChD,OAAU,KAAuD,E,CAEnE,OAAO,K,CAMT,WAAA,CAAY,GACV,MAAM,EAAM,GAAG,EAAK,iBACpB,QAAW,KAAuD,E,CAGpE,eAAA,CAAgB,EAAoB,EAAiB,EAAmB,EAAoB,GAC1F,MAAO,CACL,KAAM,EACN,OAAQ,EACR,SAAU,EACV,UAAW,EACX,SAAU,EACV,aAAc,KAAK,aAAa,SAAS,EAAK,I,CAgDlD,eAAA,GACE,GAAU,KAAM,gC,CAGlB,oBAAA,CAAqB,EAAmB,EAAY,GAClD,GAAI,EAAO,CACT,EAAM,kBACN,EAAM,gB,CAGR,GAAG,GAAQ,OAAQ,CACjB,GAAI,KAAK,YAAY,GAAM,CACzB,M,EAIJ,MAAM,EAAS,EAAK,OACpB,GAAU,KAAK,yBAA0B,CAAC,SAAO,KAAK,G,6FApO7C,GAAwB,KAAA,EAAA,MAAA,EAAA,mBAAA,OAAA,EAAA,gBAAA,WAAA,QAAxB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAwB,aAAA,KAAA,SAAA,wBAAA,OAAA,CAAA,WAAA,2BAKf,GACA,QAAA,qBAAA,GACA,UAAA,yBAAA,GAAgB,MAAA,iBAChB,GACA,QAAA,qBAAA,GAAgB,qBAAA,+CAChB,GAAgB,wBAAA,qDAChB,GAKA,YAAA,cAAA,gBAAA,kBAAA,mBAAA,qBAAA,kBAAA,oBAAA,uBAAA,mDAAA,GACA,eAAA,mCAAA,GAAgB,kBAAA,yCAChB,GAAgB,wBAAA,qDAChB,GAAgB,kBAAA,yCAChB,GAGA,iBAAA,mBAAA,eAAA,iBAAA,YAAA,6BAAA,GAAgB,YAAA,6BAChB,GAAgB,sBAAA,iDAChB,GACA,0BAAA,yDAAA,GACA,wBAAA,qDAAA,GACA,mBAAA,2CAAA,GAAgB,oBAAA,6CAChB,GAAgB,oBAAA,6CAChB,GACA,sBAAA,iDAAA,GAAgB,iBAAA,uCAChB,GAAgB,oBAAA,6CAChB,GAAgB,wBAAA,qDAChB,GAAgB,aAAA,+BAChB,GACA,eAAA,mCAAA,GAAgB,mBAAA,2CAChB,GAAgB,0BAAA,yDAChB,GACA,sBAAA,iDAAA,GACA,cAAA,iCAAA,GACA,iBAAA,uCAAA,GAAgB,uBAAA,mDAChB,GAAgB,iBAAA,uCAChB,GACA,mBAAA,2CAAA,GACA,qBAAA,+CAAA,GAAgB,gBAAA,qCAChB,GAAgB,mBAAA,2CAChB,GAAgB,uBAAA,mDAChB,GACA,YAAA,6BAAA,GAAgB,cAAA,iCAChB,GAAgB,gCAAA,qEAChB,GACA,mBAAA,2CAAA,GACA,mBAAA,2CAAA,GACA,qBAAA,+CAAA,GAAgB,aAAA,eAAA,UAAA,YAAA,eAAA,kBAAA,QAAA,CAAA,uBAAA,yBAAA,8BAAA,iCAAA,UA5DzB,CAAC,GCpCd,gBAAA,KAAA,cAAA,KAAA,SAAA,EAAA,SAAA,svIDmCY,OAAA,is2EAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GAAY,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,mBAAA,OAAA,6CAAA,KAAA,YAAA,KAAA,EAAA,iBAAA,SAAA,qBAAA,OAAA,4EAAA,KAAA,WAAA,KAAE,GAAe,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,KAAA,YAAA,KAAE,GAA2B,SAAA,2BAAA,OAAA,gYAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAOzD,GAAwB,WAAA,E,KATpC,EACW,KAAA,EAAA,SAAA,wBACD,QAAA,CAAC,EAAc,EAAiB,IAA4B,UAC1D,CAAC,GAGG,cAAA,EAAkB,UAAS,SAAA,svIAAA,OAAA,qs2EAQF,eAAA,MAAA,KAAA,EAAA,mBAAA,eAAA,CAAA,WAAU,E,KAAjD,E,MAAM,CAAE,UAAW,MACoB,QAAO,E,KAA9C,E,MAAM,CAAE,UAAW,MACoB,UAAS,E,KAAhD,E,MAAM,CAAE,UAAW,MACoB,MAAK,E,KAA5C,E,MAAM,CAAE,UAAW,MACoB,QAAO,E,KAA9C,E,MAAM,CAAE,UAAW,MACoB,qBAAoB,E,KAA3D,E,MAAM,CAAE,UAAW,MACoB,wBAAuB,E,KAA9D,E,MAAM,CAAE,UAAW,MACX,YAAW,EAAnB,KAAA,IACQ,gBAAe,EAAvB,KAAA,IACQ,mBAAkB,EAA1B,KAAA,IACQ,kBAAiB,EAAzB,KAAA,IACuC,uBAAsB,E,KAA7D,E,MAAM,CAAE,UAAW,MACoB,eAAc,E,KAArD,E,MAAM,CAAE,UAAW,MACoB,kBAAiB,E,KAAxD,E,MAAM,CAAE,UAAW,MACoB,wBAAuB,E,KAA9D,E,MAAM,CAAE,UAAW,MACoB,kBAAiB,E,KAAxD,E,MAAM,CAAE,UAAW,MACX,iBAAgB,EAAxB,KAAA,IACQ,eAAc,EAAtB,KAAA,IACuC,YAAW,E,KAAlD,E,MAAM,CAAE,UAAW,MACoB,YAAW,E,KAAlD,E,MAAM,CAAE,UAAW,MACoB,sBAAqB,E,KAA5D,E,MAAM,CAAE,UAAW,MACoB,0BAAyB,E,KAAhE,E,MAAM,CAAE,UAAW,MACoB,wBAAuB,E,KAA9D,E,MAAM,CAAE,UAAW,MACoB,mBAAkB,E,KAAzD,E,MAAM,CAAE,UAAW,MACoB,oBAAmB,E,KAA1D,E,MAAM,CAAE,UAAW,MACoB,oBAAmB,E,KAA1D,E,MAAM,CAAE,UAAW,MACoB,sBAAqB,E,KAA5D,E,MAAM,CAAE,UAAW,MACoB,iBAAgB,E,KAAvD,E,MAAM,CAAE,UAAW,MACoB,oBAAmB,E,KAA1D,E,MAAM,CAAE,UAAW,MACoB,wBAAuB,E,KAA9D,E,MAAM,CAAE,UAAW,MACoB,aAAY,E,KAAnD,E,MAAM,CAAE,UAAW,MACoB,eAAc,E,KAArD,E,MAAM,CAAE,UAAW,MACoB,mBAAkB,E,KAAzD,E,MAAM,CAAE,UAAW,MACoB,0BAAyB,E,KAAhE,E,MAAM,CAAE,UAAW,MACoB,sBAAqB,E,KAA5D,E,MAAM,CAAE,UAAW,MACoB,cAAa,E,KAApD,E,MAAM,CAAE,UAAW,MACoB,iBAAgB,E,KAAvD,E,MAAM,CAAE,UAAW,MACoB,uBAAsB,E,KAA7D,E,MAAM,CAAE,UAAW,MACoB,iBAAgB,E,KAAvD,E,MAAM,CAAE,UAAW,MACoB,mBAAkB,E,KAAzD,E,MAAM,CAAE,UAAW,MACoB,qBAAoB,E,KAA3D,E,MAAM,CAAE,UAAW,MACoB,gBAAe,E,KAAtD,E,MAAM,CAAE,UAAW,MACoB,mBAAkB,E,KAAzD,E,MAAM,CAAE,UAAW,MACoB,uBAAsB,E,KAA7D,E,MAAM,CAAE,UAAW,MACoB,YAAW,E,KAAlD,E,MAAM,CAAE,UAAW,MACoB,cAAa,E,KAApD,E,MAAM,CAAE,UAAW,MACoB,gCAA+B,E,KAAtE,E,MAAM,CAAE,UAAW,MACoB,mBAAkB,E,KAAzD,E,MAAM,CAAE,UAAW,MACoB,mBAAkB,E,KAAzD,E,MAAM,CAAE,UAAW,MACoB,qBAAoB,E,KAA3D,E,MAAM,CAAE,UAAW,MACX,aAAY,EAApB,KAAA,IACQ,UAAS,EAAjB,KAAA,IACQ,eAAc,EAAtB,KAAA,IAES,uBAAsB,EAA/B,KAAA,IACS,8BAA6B,EAAtC,KAAA,OEtGS,IAAA,IAAZ,SAAY,GACV,EAAA,iCACA,EAAA,uCACA,EAAA,6BACA,EAAA,mCACA,EAA2C,4CAC5C,EAND,CAAY,QAMX,KCOY,MAAA,GAPb,WAAA,GAQW,KAAW,YAAY,GACvB,KAAQ,SAAY,GACW,KAAK,MAAa,MAClB,KAAO,QAAa,MACnD,KAAc,eAAY,GACK,KAAmB,oBAAa,MAChC,KAAmB,oBAAa,MACxE,KAAA,UAAY,EAAiB,GAAU,eACvC,KAAmB,oBAAG,EAAM,MAAQ,CAAE,UAAW,IAET,KAAsB,uBAAa,MACnC,KAAkB,mBAAa,MAC/B,KAAmB,oBAAa,KAChC,KAAO,QAAa,MACpB,KAAyB,0BAAY,KACpE,KAAgB,iBAAY,KAC3B,KAAA,qBAAuB,IAAI,EAG9B,KAAS,UAAG,GAEA,KAAA,gBAAkB,GAAoB,KACvD,GAAI,KAAK,sBAAuB,CAC9B,OAAO,GAAU,gB,CAGnB,OAAO,KAAK,WAAW,GAqB1B,CAlBC,YAAA,GACE,GAAK,KAAK,oBAAsB,CAC9B,GAAU,KAAM,uBAAwB,O,EAI5C,YAAA,GACE,GAAI,KAAK,oBAAsB,GAAU,cAAe,CAEtD,GAAU,KAAM,uBAAwB,O,EAI5C,mBAAA,GACE,GAAK,KAAK,MAAQ,CAChB,GAAU,KAAM,uBAAwB,U,SA7CjC,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAsB,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,Q,4EAAtB,GAAsB,aAAA,KAAA,SAAA,qBAAA,OAAA,CAAA,YAAA,CAAA,kBAAA,cAAA,WAAA,cAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,SAAA,CAAA,kBAAA,WAAA,WAAA,WAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,MAAA,CAAA,kBAAA,QAAA,WAAA,QAAA,SAAA,MAAA,WAAA,MAAA,kBAGb,GACA,QAAA,CAAA,kBAAA,UAAA,WAAA,UAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,GAAgB,eAAA,CAAA,kBAAA,iBAAA,WAAA,iBAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,oBAAA,CAAA,kBAAA,sBAAA,WAAA,sBAAA,SAAA,MAAA,WAAA,MAAA,kBAEhB,GAAgB,oBAAA,CAAA,kBAAA,sBAAA,WAAA,sBAAA,SAAA,MAAA,WAAA,MAAA,kBAChB,GAAgB,UAAA,CAAA,kBAAA,YAAA,WAAA,YAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,MAAA,oBAAA,CAAA,kBAAA,sBAAA,WAAA,sBAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,MAAA,uBAAA,CAAA,kBAAA,yBAAA,WAAA,yBAAA,SAAA,MAAA,WAAA,MAAA,kBAIhB,GAAgB,mBAAA,CAAA,kBAAA,qBAAA,WAAA,qBAAA,SAAA,MAAA,WAAA,MAAA,kBAChB,GACA,oBAAA,CAAA,kBAAA,sBAAA,WAAA,sBAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,GACA,QAAA,CAAA,kBAAA,UAAA,WAAA,UAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,GACA,0BAAA,CAAA,kBAAA,4BAAA,WAAA,4BAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,GAAgB,iBAAA,CAAA,kBAAA,mBAAA,WAAA,mBAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,OAAA,QAAA,CAAA,qBAAA,wBAAA,SAAA,EAAA,SC5BtC,m9DAmDA,OAAA,k0wBAAA,aAAA,EAAA,KAAA,WAAA,KD3CY,GAAY,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,YAAA,KAAA,EAAA,KAAA,SAAA,SAAA,OAAA,iCAAA,KAAA,WAAA,KAAE,GAAe,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAK5B,GAAsB,WAAA,E,KAPlC,E,gBACW,qBAAoB,QACrB,CAAC,EAAc,GAAgB,cAGzB,EAAkB,UAAS,SAAA,m9DAAA,OAAA,s0wBAGjC,eAAA,CAAA,YAAW,EAAnB,KAAA,IACQ,SAAQ,EAAhB,KAAA,IACuC,MAAK,E,KAA5C,E,MAAM,CAAE,UAAW,MACoB,QAAO,E,KAA9C,E,MAAM,CAAE,UAAW,MACX,eAAc,EAAtB,KAAA,IACuC,oBAAmB,E,KAA1D,E,MAAM,CAAE,UAAW,MACoB,oBAAmB,E,KAA1D,E,MAAM,CAAE,UAAW,MAIoB,uBAAsB,E,KAA7D,E,MAAM,CAAE,UAAW,MACoB,mBAAkB,E,KAAzD,E,MAAM,CAAE,UAAW,MACoB,oBAAmB,E,KAA1D,E,MAAM,CAAE,UAAW,MACoB,QAAO,E,KAA9C,E,MAAM,CAAE,UAAW,MACoB,0BAAyB,E,KAAhE,E,MAAM,CAAE,UAAW,MACX,iBAAgB,EAAxB,KAAA,IACS,qBAAoB,EAA7B,KAAA,OEZH,MAAM,GAA0B,0BAwB1B,MAAO,WAA+B,GAC1C,WAAA,CAAY,GACV,MAAM,GAGR,KAAK,MAAG,MAeR,KAAa,cAAmB,GAKvB,KAAA,mBAA8B,IAKC,KAAkB,mBAAa,KAK9D,KAAoB,qBAAY,EAKhC,KAAsB,uBAAY,QAKlC,KAAQ,SAAY,GAiD7B,KAAW,YAAY,MACvB,KAAY,aAAY,MACxB,KAAgB,iBAAmB,GAEnC,KAAoB,qBAAmB,GAM7B,KAAA,2BAA6B,IAAI,EAKjC,KAAA,+BAAiC,IAAI,EAKrC,KAAA,2BAA6B,IAAI,C,CA3G3C,eACI,GACF,OAAO,KAAK,Y,CAGd,aACI,GACF,OAAO,I,CAiCT,WAAA,CAAY,GACV,GAAI,EAAQ,YAAa,CACvB,MAAM,EAAW,EAAQ,YAAY,aACrC,KAAK,eAAe,E,EAIxB,cAAA,CAAe,GACb,MAAM,EAAO,UAAoB,IAAa,SAC9C,IAAK,EAAM,CACT,KAAK,cAAgB,GACrB,KAAK,qBAAuB,GAC5B,KAAK,aAAe,MACpB,M,CAGF,MAAM,EAAU,KAAK,MAAM,GAC3B,KAAK,cAAgB,EAAQ,SAG7B,IAAI,EAAkB,KAAK,cAAc,QAAS,GAAQ,KAAK,iBAAiB,WAAY,GAAW,EAAO,KAAO,EAAI,KAAO,IAChI,EAAkB,EAAgB,QAAS,GAAS,KAAK,mBAAmB,KAG5E,EAAgB,UAAU,SAAU,IAClC,GAAK,KAAK,qBAAqB,WAAY,GAAS,EAAO,KAAO,EAAK,KAAO,EAAE,CAC9E,KAAK,qBAAqB,QAAQ,GAElC,GAAI,KAAK,mBAAqB,EAAI,CAChC,YAAW,KACT,KAAK,qBAAqB,EAAO,GAAI,MAAM,GAC1C,KAAK,mB,MAMd,KAAK,qBAAqB,OAAS,KAAK,qBAAqB,OAAS,KAAK,qBAAuB,KAAK,qBAAuB,KAAK,qBAAqB,OAGxJ,KAAK,iBAAoB,KAAK,cAC9B,KAAK,aAAe,KAAK,cAAc,QAAU,C,CA+BnD,QAAA,GACE,KAAK,eAAe,KAAK,S,CAM3B,aAAA,CAAe,EAAoB,EAAkB,GACnD,GAAI,EAAS,CACX,OAAO,KAAK,qBAAqB,EAAK,G,CAGxC,GAAI,EAAO,CACT,EAAM,kBACN,EAAM,gB,CAGR,GAAU,KAAM,6BAA8B,KAAK,UAAU,G,CAM/D,oBAAA,CAAsB,EAA2B,EAAe,MAC9D,IAAK,EAAO,CACV,M,CAGF,KAAK,qBAAuB,KAAK,qBAAqB,QAAS,GAAQ,EAAI,KAAO,IAClF,KAAK,oBAAoB,CAAC,IAC1B,GAAK,GAAgB,KAAK,qBAAqB,SAAW,EAAG,CAC3D,KAAK,aAAe,K,EAOxB,kBAAA,GACE,GAAU,KAAM,kCAChB,KAAK,8B,CAMP,cAAA,CAAgB,EAAoB,GAClC,EAAK,SAAW,EAChB,GAAU,KAAM,6BAA8B,KAAK,UAAU,G,CAM/D,aAAA,GACE,KAAK,aAAe,KAAK,YACzB,KAAK,aAAe,MACpB,KAAK,qBAAuB,E,CAG9B,kBAAA,CAAmB,GACjB,IAAI,GAAS,GAAG,CACd,OAAO,I,CAET,MAAM,EAAoB,OAAO,aAAa,QAAQ,IACtD,IAAI,EAAkB,CACpB,OAAO,I,CAET,OAAQ,EAAkB,SAAS,EAAQ,G,CAG7C,mBAAA,CAAoB,GAClB,IAAI,GAAe,EAAY,OAAQ,EAAE,CACvC,M,CAEF,IAAI,EAAoB,OAAO,aAAa,QAAQ,IACpD,IAAI,EAAkB,CACpB,EAAoB,E,CAEtB,EAAY,SAAS,IACnB,IAAI,GAAmB,SAAS,GAAM,CACpC,GAAoB,EAAK,G,KAG7B,OAAO,aAAa,QAAQ,GAAwB,E,CAGtD,4BAAA,GACE,OAAO,aAAa,WAAW,G,CAMjC,iBAAA,CAAmB,EAAoB,GACrC,IAAI,EAA0C,GAC9C,GAAK,EAAK,WAAa,EAAK,OAAS,EAAK,MAAO,CAC/C,EAAkB,MAAM,QAAQ,EAAK,OAAS,EAAK,MAAQ,CAAC,EAAK,K,CAEnE,OAAO,EAAgB,IAAU,E,6FA1NxB,GAAsB,KAAA,EAAA,MAAA,EAAA,mBAAA,OAAA,EAAA,gBAAA,WAAA,QAAtB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GA8BS,aAAA,KAAA,SAAA,qBAAA,OAAA,CAAA,mBAAA,qBAAA,mBAAA,2CAAA,GAnCT,qBAAA,uBAAA,uBAAA,yBAAA,SAAA,YAAA,QAAA,CAAA,2BAAA,6BAAA,+BAAA,iCAAA,2BAAA,8BAAA,KAAA,CAAA,WAAA,+EAAA,UAAA,CAAC,GCrCd,gBAAA,KAAA,cAAA,KAAA,SAAA,EAAA,SAAA,uqJDiCI,OAAA,izdAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,mBAAA,OAAA,6CAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,KAAA,YAAA,KAAA,GAAmC,SAAA,qCAAA,cAAA,EAAA,kBAAA,MAAA,E,iFAO1B,GAAsB,WAAA,E,KAZlC,EACW,KAAA,EAAA,SAAA,qBACD,QAAA,CACP,EACA,EACA,IACD,UACU,CAAC,GAGG,cAAA,EAAkB,KAAI,SAAA,uqJAAA,OAAA,qzdAUjC,eAAA,MAAA,KAAA,EAAA,mBAAA,eAAA,CAAA,YAAW,E,KADd,E,MAAY,wBAMT,UAAS,E,KADZ,E,MAAY,sBAaJ,mBAAkB,EAA1B,KAAA,IAKuC,mBAAkB,E,KAAzD,E,MAAM,CAAE,UAAW,MAKX,qBAAoB,EAA5B,KAAA,IAKQ,uBAAsB,EAA9B,KAAA,IAKQ,SAAQ,EAAhB,KAAA,IA2DS,2BAA0B,EAAnC,KAAA,IAKS,+BAA8B,EAAvC,KAAA,IAKS,2BAA0B,EAAnC,KAAA,OErJU,MAAA,GALb,WAAA,GAME,KAAA,MAAQ,EAAc,IACtB,KAAA,QAAU,EAAc,IAEd,KAAA,aAAe,IAAI,CAa9B,CAXC,WAAA,GACE,KAAK,aAAa,M,CAIpB,eAAA,CAAgB,GACd,GAAI,EAAM,MAAQ,UAAY,EAAM,MAAQ,MAAO,CACjD,KAAK,aAAa,M,SAbX,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA8B,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAA9B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAA8B,aAAA,KAAA,SAAA,8BAAA,OAAA,CAAA,MAAA,CAAA,kBAAA,QAAA,WAAA,QAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,MAAA,QAAA,CAAA,kBAAA,UAAA,WAAA,UAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,OAAA,QAAA,CAAA,aAAA,gBAAA,SAAA,EAAA,SCP3C,6lBA6BA,OAAA,0tE,iFDtBa,GAA8B,WAAA,E,KAL1C,E,gBACW,8BAA6B,SAAA,6lBAAA,OAAA,2tEAQ7B,eAAA,CAAA,aAAY,EAArB,KAAA,OELU,MAAA,GAEX,SAAA,CAAU,GACR,OAAO,EAAQ,I,QAHN,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAY,KAAA,GAAA,OAAA,EAAA,gBAAA,MAAA,Q,mFAAZ,GAAY,aAAA,KAAA,KAAA,c,iFAAZ,GAAY,WAAA,E,KAJxB,EAAK,KAAA,EACJ,KAAM,WACN,WAAY,WCGD,MAAA,GAJb,WAAA,GAME,KAAI,KAAG,EACP,KAAU,WAAG,MACb,KAAW,YAAG,MACd,KAAW,YAAG,MAGd,KAAA,SAAW,IAAI,EAGf,KAAA,QAAU,IAAI,CA4Cf,CAzCC,WAAA,CAAY,GACV,IAAK,KAAK,aAAe,KAAK,YAAa,CACvC,M,CAGJ,MAAM,EAAU,EAAM,QAAU,KAAK,KAErC,IAAI,KAAK,WAAW,CAClB,GAAG,KAAK,IAAI,GAAU,EAAE,CACtB,KAAK,WAAa,KAClB,KAAK,YAAc,I,KAChB,CACH,M,EAIJ,GAAU,KAAM,WAAY,GAE5B,KAAK,KAAO,EAAM,O,CAIpB,SAAA,GACE,KAAK,WAAa,MAClB,KAAK,YAAc,K,CAIrB,WAAA,CAAY,GACV,KAAK,YAAc,KACnB,KAAK,YAAc,MACnB,KAAK,KAAO,EAAM,O,CAIpB,YAAA,CAAa,GACX,IAAI,KAAK,YAAY,CACnB,GAAU,KAAM,UAAW,E,SAnDpB,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAmB,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,Q,4EAAnB,GAAmB,aAAA,KAAA,SAAA,eAAA,QAAA,CAAA,SAAA,WAAA,QAAA,WAAA,KAAA,CAAA,UAAA,mFAAA,UAAA,sBAAA,MAAA,yBAAA,SAAA,GAAA,E,iFAAnB,GAAmB,WAAA,E,KAJ/B,EAAU,KAAA,EACT,SAAU,eACV,WAAY,SAUZ,eAAA,CAAA,SAAQ,EADP,KAAA,IAID,QAAO,EADN,KAAA,IAID,YAAW,E,KADV,E,MAAa,qBAAsB,CAAC,aAuBrC,UAAS,E,KADR,E,MAAa,mBAAoB,CAAC,aAOnC,YAAW,E,KADV,E,MAAa,YAAa,CAAC,aAQ5B,aAAY,E,KADX,E,MAAa,QAAS,CAAC,gBC9BpB,MAAO,WAAgC,GAC3C,WAAA,CAAY,GACV,MAAM,GAIC,KAAA,WAAa,EAAe,IAC5B,KAAA,YAAc,EAAe,KAC7B,KAAA,eAAiB,EAAO,MAEvB,KAAA,kBAAoB,IAAI,EACxB,KAAA,cAAgB,IAAI,EACpB,KAAA,cAAgB,IAAI,EAE9B,KAAA,MAAQ,EAAqB,IAEZ,KAAA,sBAAwB,GAAO,KAC9C,GAAI,KAAK,QAAQ,OAAQ,CACvB,KAAK,cAAc,KAAK,QAAQ,GAAG,IAEnC,KAAK,sBAAsB,S,IAE5B,CAAE,cAAe,OACpB,KAAA,YAAc,EAAqB,IACnC,KAAA,WAAa,EAA0B,K,CAMvC,aAAA,CAAc,GACZ,KAAK,WAAW,IAAI,GACpB,MAAM,EAAY,KAAK,QAAQ,MAAK,GAAK,EAAE,IAAM,IACjD,IAAK,EAAW,CACd,M,CAGF,IAAK,KAAK,iBAAkB,CAC1B,KAAK,e,CAEP,GAAU,KAAM,oBAAqB,E,CAGvC,YAAA,CAAa,GACX,GAAU,KAAM,gBAAiB,E,CAGnC,YAAA,CAAa,GACX,GAAU,KAAM,gBAAiB,E,CAGnC,aAAA,GACE,KAAK,eAAe,QAAO,IAAU,G,CAGvC,cAAA,CAAe,GACb,MAAM,EAAS,EACf,KAAK,YAAY,QAAO,GAAU,EAAQ,G,6FAzDjC,GAAuB,KAAA,EAAA,MAAA,EAAA,mBAAA,OAAA,EAAA,gBAAA,WAAA,QAAvB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GALA,aAAA,KAAA,SAAA,sBAAA,OAAA,CAAA,MAAA,CAAA,kBAAA,QAAA,WAAA,QAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,MAAA,YAAA,CAAA,kBAAA,cAAA,WAAA,cAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,MAAA,WAAA,CAAA,kBAAA,aAAA,WAAA,aAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,OAAA,QAAA,CAAA,kBAAA,oBAAA,cAAA,gBAAA,cAAA,iBAAA,UAAA,CAAC,GCpBd,gBAAA,KAAA,SAAA,EAAA,SAAA,k0FDmBY,OAAA,qqFAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GAAc,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,OAAA,KAAA,GAAc,KAAA,aAAA,KAAA,YAAA,KAAA,GAAqB,SAAA,eAAA,QAAA,yBAAA,KAAA,WAAA,KAAA,GAAe,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAM/D,GAAuB,WAAA,E,KARnC,EACW,KAAA,EAAA,SAAA,sBAAqB,QACtB,CAAC,EAAc,GAAc,GAAqB,GAAgB,UAChE,CAAC,GAGG,cAAA,EAAkB,UAAS,SAAA,k0FAAA,OAAA,yqFAYhC,eAAA,MAAA,KAAA,EAAA,mBAAA,eAAA,CAAA,kBAAiB,EAA1B,KAAA,IACS,cAAa,EAAtB,KAAA,IACS,cAAa,EAAtB,KAAA,OEvBG,MAAO,WAAoC,GAC/C,WAAA,CAAY,GACV,MAAM,GAKR,KAAA,YAAc,EAAc,GAGlB,KAAA,0BAA4B,IAAI,C,CAK1C,YAAA,CAAc,GACZ,GAAU,KAAM,4BAA6B,E,6FAhBpC,GAA2B,KAAA,EAAA,MAAA,EAAA,mBAAA,OAAA,EAAA,gBAAA,WAAA,QAA3B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAA2B,aAAA,KAAA,SAAA,2BAAA,OAAA,CAAA,YAAA,CAAA,kBAAA,cAAA,WAAA,cAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,OAAA,QAAA,CAAA,0BAAA,6BAAA,UAL3B,CAAC,GAAiB,gBAAA,KAAA,SAAA,EAAA,SCT/B,6xBAuBM,OAAA,uxCAAA,aAAA,EAAA,KAAA,WAAA,KDfM,GAAY,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,WAAA,KAAE,GAAe,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAM5B,GAA2B,WAAA,E,KARvC,EACW,KAAA,EAAA,SAAA,2BACD,QAAA,CAAC,EAAc,GACb,UAAA,CAAC,GAGG,cAAA,EAAkB,UAAS,SAAA,6xBAAA,OAAA,2xCAYhC,eAAA,MAAA,KAAA,EAAA,mBAAA,eAAA,CAAA,0BAAyB,EAAlC,KAAA,OEtBH,MAAM,GAAmB,KAAK,GAAK,IACnC,MAAM,GAAe,EAAI,KAAK,GAGjB,MAAA,GASX,iBAAO,CAAW,EAAyB,EAAW,GACpD,MAAM,GAAW,EAAQ,IAAM,GAE/B,MAAO,CAAC,EAAO,GAAK,EAAI,KAAK,IAAI,GAAU,EAAO,GAAK,EAAI,KAAK,IAAI,G,CAgBtE,UAAO,CAAI,EAAyB,EAAgB,EAAe,EAAa,EAAe,EAAgB,GAE7G,MAAM,EAAS,EAAS,EACxB,MAAM,EAAgB,KAAK,IAAI,EAAM,GACrC,EAAS,KAAK,IAAI,EAAQ,EAAG,GAE7B,GAAI,KAAO,GAAU,KAAK,IAAM,EAAS,KAAW,KAAK,IAAI,EAAQ,GAAM,CACzE,EAAS,EAAgB,IAAM,EAAS,KAAK,E,CAI/C,MAAM,EAAU,EAAS,EACzB,MAAM,EAAc,EAAS,EAG7B,MAAM,EAAS,KAAK,WAAW,EAAQ,EAAa,GACpD,MAAM,EAAO,KAAK,WAAW,EAAQ,EAAa,GAElD,MAAM,EAAS,KAAK,WAAW,EAAQ,EAAS,GAChD,MAAM,EAAO,KAAK,WAAW,EAAQ,EAAS,GAE9C,MAAM,EAAW,KAAO,GAAU,GAAM,IACxC,MAAM,EAAW,KAAO,GAAU,GAAM,IAGxC,MAAM,EAAY,KAAK,WAAW,EAAQ,EAAQ,EAAQ,GAC1D,MAAM,EAAU,KAAK,WAAW,EAAQ,EAAQ,EAAM,GAEtD,MAAM,EAAY,KAAK,WAAW,EAAQ,EAAQ,EAAQ,GAC1D,MAAM,EAAU,KAAK,WAAW,EAAQ,EAAQ,EAAM,GAEtD,MAAM,EAAY,EAAgB,IAAM,EAAI,EAAW,EAAI,EAC3D,MAAM,EAAY,EAAgB,IAAM,EAAI,EAAW,EAAI,EAE3D,MAAM,EAAyB,IAAI,MAEjC,KAAM,EAAO,GAAK,GAAa,YAAa,EAAO,GAAK,GAAa,WAErE,KAAM,EAAS,GAAa,YAAa,EAAS,GAAa,WAAY,IAAK,IAAK,KAAM,EAAU,GAAK,GAAa,YAAa,EAAU,GAAK,GAAa,WAEhK,KAAM,EAAS,GAAa,YAAa,EAAS,GAAa,WAAY,KAAM,EAAY,GAAa,WAAY,KAAM,EAAQ,GAAK,GAAa,YAAa,EAAQ,GAAK,GAAa,WAE7L,KAAM,EAAS,GAAa,YAAa,EAAS,GAAa,WAAY,IAAK,IAAK,KAAM,EAAK,GAAK,GAAa,YAAa,EAAK,GAAK,GAAa,WAEtJ,KAAM,EAAK,GAAK,GAAa,YAAa,EAAK,GAAK,GAAa,WAEjE,KAAM,EAAS,GAAa,YAAa,EAAS,GAAa,WAAY,IAAK,IAAK,KAAM,EAAQ,GAAK,GAAa,YAAa,EAAQ,GAAK,GAAa,WAE5J,KAAM,EAAS,GAAa,YAAa,EAAS,GAAa,WAAY,KAAM,EAAY,GAAa,WAAY,KAAM,EAAU,GAAK,GAAa,YAAa,EAAU,GAAK,GAAa,WAEjM,KAAM,EAAS,GAAa,YAAa,EAAS,GAAa,WAAY,IAAK,IAAK,KAAM,EAAO,GAAK,GAAa,YAAa,EAAO,GAAK,GAAa,WAAY,KAGxK,OAAO,EAAO,KAAK,I,CAQrB,sBAAO,CAAgB,EAAmB,EAAwB,EAAuB,GAEvF,MAAM,EAAS,GAAgB,EAAY,GAAK,GAAK,EAAY,GACjE,MAAM,EAAc,GAAgB,EAAiB,GAAK,GAAK,EAAiB,GAChF,MAAM,EAAQ,EAAS,EAEvB,MAAM,EAAQ,KAAQ,EAAgB,EAAK,EAAgB,GAC3D,MAAM,EAAoB,EAAQ,KAAK,GAAM,IAC7C,MAAM,EAAQ,EAAS,KAAK,IAAI,GAAoB,EACpD,MAAM,EAAQ,EAAS,KAAK,IAAI,GAAoB,EACpD,MAAM,EAAS,EAAS,KAAK,IAAI,GAAoB,EACrD,MAAM,EAAS,EAAS,KAAK,IAAI,GAAoB,EAGrD,MAAO,CACL,OAAQ,EAAS,EACjB,YAAa,EAAc,EAC3B,MAAO,EACP,OAAQ,EAAS,GAAe,EAChC,gBAAiB,EAAS,GAAe,EACzC,MAAO,EAAQ,EACf,MAAO,EAAQ,EACf,OAAQ,EAAS,EACjB,OAAQ,EAAS,E,CAKrB,4BAAO,CAAsB,GAC3B,MAAM,EAAa,GACnB,OAAO,GAAa,IAClB,CAAC,EAAS,cAAc,GAAK,EAAY,EAAS,cAAc,GAAK,GACrE,EAAS,cAAgB,EACzB,EAAS,kBACT,EAAS,gBACT,EAAS,aACT,EACA,I,CAIJ,kCAAO,CAA4B,GACjC,MAAM,EAAa,GACnB,OAAO,GAAa,IAClB,CAAC,EAAS,cAAc,GAAK,EAAY,EAAS,cAAc,GAAK,GACpE,EAAS,cAAgB,EAAc,EACxC,EAAS,kBAAoB,GAC7B,EAAS,gBAAmB,GAC5B,EAAS,aAAe,EACxB,EACA,I,CAIJ,oCAAO,CAA8B,GACnC,MAAM,EAAa,GACnB,OAAO,GAAa,IAClB,CAAC,EAAS,eAAe,GAAK,EAAY,EAAS,eAAe,GAAK,GACtE,EAAuB,eAAI,EAC5B,EAAS,mBACT,EAAS,iBACT,EAAS,cACT,EACA,I,CAGJ,oBAAO,CAAc,GACnB,MAAO,OAAO,EAAM,SAAS,EAAM,O,CAGrC,2BAAO,CAAqB,GAC1B,MAAO,OAAO,EAAM,YAAY,EAAM,UAAU,EAAM,gBAAgB,EAAM,SAAS,EAAM,YAAY,EAAM,SAAS,EAAM,YAAY,EAAM,UAAU,EAAM,kBAAkB,EAAM,YAAY,EAAM,SAAS,EAAM,YAAY,EAAM,eAAe,EAAM,qBAAqB,EAAM,kBAAkB,EAAM,YAAY,EAAM,kBAAkB,EAAM,YAAY,EAAM,eAAe,EAAM,qBAAqB,EAAM,SAAS,EAAM,U,CAG9a,+BAAO,CAAyB,GAC9B,MAAO,KAAK,EAAM,UAAU,EAAM,YAAY,EAAM,SAAS,EAAM,WAAW,EAAM,UAAU,EAAM,gBAAgB,EAAM,UAAU,EAAM,YAAY,EAAM,UAAU,EAAM,YAAY,EAAM,UAAU,EAAM,U,CAGhN,kCAAO,CAA4B,GACjC,MAAO,KAAK,EAAa,UAAU,EAAa,YAAY,EAAa,SAAS,EAAa,WAAW,EAAa,UAAU,EAAa,gBAAgB,EAAa,UAAU,EAAa,YAAY,EAAa,UAAU,EAAa,YAAY,EAAa,UAAU,EAAa,U,ECrKzR,MAAA,GANb,WAAA,GAQE,KAAI,KAAwB,KAI5B,KAAM,OAAa,MAInB,KAAS,UAAa,KAEkB,KAAqB,sBAAY,IAC1E,QAbY,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAoB,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAApB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAoB,aAAA,KAAA,SAAA,oBAAA,OAAA,CAAA,KAAA,OAAA,OAAA,SAAA,UAAA,aAAA,KAAA,CAAA,WAAA,wHAAA,SAAA,EAAA,SCTjC,8RAOM,OAAA,q28CAAA,aAAA,EAAA,KAAA,WAAA,KDFM,GAAY,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,YAAA,KAAA,EAAA,KAAA,SAAA,SAAA,OAAA,oC,iFAIX,GAAoB,WAAA,E,KANhC,EACW,KAAA,EAAA,SAAA,oBAAmB,QACpB,CAAC,GAAa,SAAA,8RAAA,OAAA,y28CAMvB,eAAA,CAAA,KAAI,EADH,KAAA,IAKD,OAAM,E,KAFL,E,MAAY,iB,CACZ,KAAA,IAKD,UAAS,E,KAFR,E,MAAY,kB,CACZ,KAAA,IAGuC,sBAAqB,E,KAA5D,E,MAAY,gCEZF,MAAA,GANb,WAAA,GAOW,KAAI,KAA2B,KAIxC,KAAM,OAAa,MAInB,KAAS,UAAa,KAEkB,KAAqB,sBAAY,KAC5B,KAAwB,yBAAY,IAClF,QAbY,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAuB,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAAvB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAuB,aAAA,KAAA,SAAA,wBAAA,OAAA,CAAA,KAAA,OAAA,OAAA,SAAA,UAAA,aAAA,KAAA,CAAA,WAAA,uLAAA,SAAA,EAAA,SCTpC,+TAYA,OAAA,q28CAAA,aAAA,EAAA,KAAA,WAAA,KDPY,GAAY,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,YAAA,KAAA,EAAA,KAAA,SAAA,SAAA,OAAA,oC,iFAIX,GAAuB,WAAA,E,KANnC,EACW,KAAA,EAAA,SAAA,wBAAuB,QACxB,CAAC,GAAa,SAAA,+TAAA,OAAA,y28CAKd,eAAA,CAAA,KAAI,EAAZ,KAAA,IAID,OAAM,E,KAFL,E,MAAY,iB,CACZ,KAAA,IAKD,UAAS,E,KAFR,E,MAAY,kB,CACZ,KAAA,IAGuC,sBAAqB,E,KAA5D,E,MAAY,6BACgC,yBAAwB,E,KAApE,E,MAAY,qCEPf,SAAS,KACP,MAAM,EAAkC,CACtC,kBAAmB,GACnB,gBAAiB,IACjB,eAAgB,KAChB,UAAW,MACX,cAAe,CAAC,MAAO,MACvB,cAAe,KACf,aAAc,GACd,eAAgB,CAAC,GAAI,IACrB,cAAe,IACf,eAAgB,GAChB,mBAAoB,GACpB,iBAAkB,KAEpB,OAAO,CACT,CAqBA,SAAS,KACP,MAAM,EAA4B,CAEhC,CACE,SAAU,kBACV,UAAW,sBACX,KAAM,oCACN,QAAS,oCACT,gBAAiB,qCAInB,CACE,SAAU,uBACV,UAAW,4BACX,KAAM,yCACN,QAAS,yCACT,gBAAiB,0CAInB,CACE,SAAU,cACV,UAAW,iBACX,KAAM,+BACN,QAAS,+BACT,gBAAiB,gCAInB,CACE,SAAU,eACV,UAAW,kBACX,KAAM,kCACN,QAAS,kCACT,gBAAiB,mCAInB,CACE,SAAU,qBACV,UAAW,qBACX,KAAM,oCACN,QAAS,oCACT,gBAAiB,qCAInB,CACE,SAAU,cACV,UAAW,qBACX,KAAM,uCACN,QAAS,uCACT,gBAAiB,wCAInB,CACE,SAAU,qBACV,UAAW,yBACX,KAAM,sCACN,QAAS,sCACT,gBAAiB,uCAInB,CACE,SAAU,kBACV,UAAW,qBACX,KAAM,uCACN,QAAS,uCACT,gBAAiB,wCAInB,CACE,SAAU,wBACV,UAAW,4BACX,KAAM,yCACN,QAAS,yCACT,gBAAiB,0CAInB,CACE,UAAW,oBACX,SAAU,gBACV,KAAM,sCACN,QAAS,sCACT,gBAAiB,uCAInB,CACE,SAAU,eACV,UAAW,mBACX,KAAM,mCACN,QAAS,mCACT,gBAAiB,mCACjB,UAAW,mBACX,SAAU,CAER,CACE,SAAU,iBACV,KAAM,SACN,UAAW,qBACX,KAAM,kCACN,QAAS,kCACT,gBAAiB,kCACjB,YAAa,4BAGf,CACE,SAAU,eACV,KAAM,SACN,UAAW,mBACX,KAAM,gCACN,QAAS,gCACT,gBAAiB,gCACjB,YAAa,0BAGf,CACE,SAAU,gBACV,KAAM,SACN,UAAW,oBACX,KAAM,iCACN,QAAS,iCACT,gBAAiB,iCACjB,YAAa,2BAGf,CACE,SAAU,uBACV,KAAM,SACN,UAAW,2BACX,KAAM,wCACN,QAAS,wCACT,gBAAiB,wCACjB,YAAa,kCAGf,CACE,SAAU,6BACV,KAAM,YACN,UAAW,wDACX,KAAM,GACN,QAAS,GACT,gBAAiB,GACjB,YAAa,IAGf,CACE,SAAU,wBACV,KAAM,SACN,UAAW,yCACX,KAAM,+CACN,QAAS,+CACT,gBAAiB,+CACjB,YAAa,iCAOrB,EAAM,SAAQ,IAAU,EAAK,OAAS,MAAO,EAAK,SAAW,IAAI,IAEjE,OAAO,CACT,CAEA,MAAM,GAAwB,IAC9B,MAAM,GAAwB,IAexB,MAAO,WAAgC,GAC3C,WAAA,CAAY,EACQ,EACA,EACA,GAClB,MAAM,GAHY,KAAoB,qBAApB,EACA,KAAqB,sBAArB,EACA,KAAO,QAAP,EAmGoB,KAAU,WAAY,MACtB,KAAS,UAAY,MACrB,KAAQ,SAAY,KAClD,KAAA,YAAc,IAAI,EAClB,KAAA,eAAiB,IAAI,EAKvB,KAAW,YAAG,oBACd,KAAA,aAAoC,KAqKpC,KAAY,aAAY,MACxB,KAAW,YAA6B,QACxC,KAAM,OAAuB,QAC7B,KAAmB,oBAAuB,KAC1C,KAAe,gBAAiC,KAChD,KAAA,yBAA2B,KAO3B,KAAgB,iBAAkB,QA3RxC,KAAK,MAAQ,KACb,KAAK,gBAAkB,KACvB,KAAK,OAAS,KAAK,gCACnB,KAAK,cAAgB,KAAK,mCAC1B,KAAK,eAAiB,GAAa,sBAAsB,KAAK,iBAC9D,KAAK,qBAAuB,GAAa,4BAA4B,KAAK,iBAC1E,KAAK,uBAAyB,GAAa,8BAA8B,KAAK,gB,CAMhF,cAAI,GACF,OAAO,KAAK,W,CAEd,cAAa,CAAW,GACtB,KAAK,YAAc,EACnB,KAAK,cAAc,KAAK,Y,CAG1B,aAAA,CAAc,GACZ,IAAK,MAAM,KAAa,EAAY,CAClC,MAAM,EAAO,KAAK,OAAO,MAAK,GAAQ,EAAK,WAAa,EAAU,WAClE,GAAI,EAAM,CACR,GAAI,EAAU,QAAU,UAAW,CACjC,EAAK,OAAS,EAAU,M,CAE1B,GAAI,EAAU,WAAa,UAAW,CACpC,EAAK,SAAW,EAAU,Q,GAKhC,KAAK,wB,CAIP,SAAI,GACF,OAAO,KAAK,M,CAEd,SAAa,CAAM,GACjB,KAAK,OAAS,EAEd,MAAM,EAAiB,KAAK,QAAQ,OAAU,EAAI,KAAK,OAAO,OAAS,EACvE,MAAM,EAAY,UAAU,iBAAiB,MAC7C,GAAI,EAAW,CACb,MAAM,EAAY,EAAU,iBAAiB,gBAC7C,GAAI,SAAS,KAAe,EAAe,CACzC,EAAU,YAAY,eAAgB,EAAc,W,EAKxD,KAAK,cAAc,KAAK,Y,CAG1B,kBAAI,GACF,OAAO,KAAK,e,CAGd,eAAI,GACF,OAAO,KAAK,Y,CAEd,eACI,CAAY,GACd,KAAK,aAAe,C,CAGtB,2BAAI,GACF,OAAO,KAAK,wB,CAEd,2BACI,CAAwB,GAC1B,KAAK,yBAA2B,C,CAGlC,SAAI,GACF,OAAO,KAAK,M,CAGd,gBAAI,GACF,OAAO,KAAK,a,CAGd,iBAAI,GACF,OAAO,KAAK,c,CAGd,uBAAI,GACF,OAAO,KAAK,oB,CAGd,yBAAI,GACF,OAAO,KAAK,sB,CAed,QAAA,GACE,KAAK,qBAAqB,eAAe,KAAK,QAAQ,KAAK,YAAY,qBAAqB,KAAK,GAAsB,IACvH,KAAK,qBAAqB,iBAAiB,WAAU,IACnD,MAAM,EAAoB,EAAM,MAAK,GAAQ,EAAK,KAAO,KAAK,cAC9D,KAAK,YAAc,QAAQ,GAAmB,YAAY,G,CAK9D,eAAA,GAGE,KAAK,aAAe,KAAK,sBAAsB,eAAe,WAAU,IACtE,KAAK,8BAA8B,EAAM,G,CAOtC,aAAA,GACL,OAAO,GAAa,cAAc,KAAK,O,CAGlC,oBAAA,GACL,OAAO,GAAa,qBAAqB,KAAK,O,CAGzC,wBAAA,GACL,OAAO,GAAa,yBAAyB,KAAK,O,CAG7C,2BAAA,GACL,OAAO,GAAa,4BAA4B,KAAK,c,CAGhD,UAAA,GACL,KAAK,qBAAqB,iBAAiB,KAAK,YAAY,KAAK,aACjE,YAAW,KACT,KAAK,qBAAqB,cAAc,oBAAoB,KAAK,cAAc,UAAU,EAAE,EAAE,KAAK,G,CAItG,mBAAA,CAAoB,GAClB,OAAO,KAAK,OAAO,MAAK,GAAK,EAAE,WAAa,G,CAG9C,gBAAA,CAAiB,GACf,MAAM,EAAO,KAAK,oBAAoB,GACtC,IAAK,GAAQ,GAAM,SAAU,CAC3B,M,CAGF,KAAK,YAAY,KAAK,E,CAGxB,mBAAA,CAAoB,GAClB,IAAK,KAAK,gBAAiB,CACzB,M,CAGF,MAAM,EAAO,KAAK,gBAAgB,MAAK,GAAK,EAAE,WAAa,IAC3D,IAAK,EAAM,CACT,M,CAGF,KAAK,eAAe,KAAK,GACzB,KAAK,yB,CAGP,uBAAA,CAAwB,GACtB,MAAM,EAAO,KAAK,oBAAoB,GACtC,IAAK,GAAQ,EAAK,SAAU,CAC1B,M,CAGF,EAAK,QAAU,EAAK,OAEpB,KAAK,wB,CAGP,kBAAA,CAAmB,GACjB,MAAM,EAAO,KAAK,oBAAoB,GACtC,IAAK,GAAQ,EAAK,WAAa,EAAK,SAAU,CAC5C,M,CAGF,EAAK,QAAU,EAAK,OACpB,GAAI,EAAK,OAAQ,CACf,KAAK,oBAAsB,EAC3B,KAAK,gBAAkB,EAAK,Q,KACvB,CACL,KAAK,oBAAsB,KAC3B,KAAK,gBAAkB,I,EAI3B,sBAAA,CAAuB,GACrB,IAAK,KAAK,gBAAiB,CACzB,M,CAGF,MAAM,EAAO,KAAK,gBAAgB,MAAK,GAAK,EAAE,WAAa,IAC3D,IAAK,EAAM,CACT,M,CAGF,KAAK,yBAA2B,KAAK,wBAErC,EAAK,UAAY,KAAK,wBAA0B,yCAA2C,wCAC3F,EAAK,KAAO,KAAK,wBAA0B,+CAAiD,8CAC5F,EAAK,QAAU,KAAK,wBAA0B,+CAAiD,8CAC/F,EAAK,gBAAkB,KAAK,wBAA0B,+CAAiD,6C,CAGzG,uBAAA,GACE,GAAI,KAAK,oBAAqB,CAC5B,KAAK,oBAAoB,OAAS,MAClC,KAAK,oBAAsB,I,CAE7B,KAAK,gBAAkB,I,CAGzB,eAAA,CAAgB,EAAiB,GAC/B,MAAM,EAAQ,KAAK,iBAAiB,QAAQ,GAC5C,MAAM,EAAoB,KAAK,iBAAiB,OAEhD,GAAI,GAAS,IAAM,EAAS,CAC1B,KAAK,iBAAiB,OAAO,EAAO,E,CAGtC,GAAI,EAAQ,GAAK,EAAS,CACxB,KAAK,iBAAiB,KAAK,E,CAG7B,GAAI,EAAoB,GAAK,KAAK,iBAAiB,SAAW,EAAG,CAG/D,aAAY,KACV,GAAI,KAAK,iBAAiB,SAAW,EAAG,CACtC,KAAK,yB,IAEN,I,EAIC,WAAA,GACN,OAAO,KAAK,YAAc,0BAA0B,iB,CAGtD,WAAA,CAAY,GACV,MAAM,EAAU,EAAM,GACtB,MAAM,EAAU,EAAM,GACtB,KAAK,qBAAqB,cAAc,oBAAoB,KAAK,cAAc,UAAU,EAAQ,E,CAGnG,SAAA,GACE,KAAK,qBAAqB,cAAc,oB,CAsBlC,6BAAA,GACN,OAAO,GAAa,gBAAgB,KAAK,gBAAgB,UAAW,KAAK,gBAAgB,eAAgB,KAAK,OAAO,OAAQ,KAAK,W,CAG5H,gCAAA,GACN,OAAO,GAAa,gBAAgB,KAAK,gBAAgB,UAAW,KAAK,gBAAgB,eAAgB,GAAI,KAAK,W,CAG5G,6BAAA,CAA8B,GACpC,KAAK,qBAAqB,cAAc,KAAK,YAAY,KAAK,cAAc,EAAW,EAAE,EAAE,K,CAGrF,qBAAA,GACN,IAAI,MAAM,KAAQ,KAAK,MAAM,CAC3B,GAAG,EAAK,SAAW,KACjB,OAAO,I,CAGX,OAAO,K,CAGD,sBAAA,GACN,GAAG,KAAK,wBAAwB,CAC9B,KAAK,SAAW,I,KACb,CACH,KAAK,SAAW,K,SA/TT,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAuB,KAAA,EAAA,MAAA,EAAA,kBAAA,CAAA,MAAA,IAAA,CAAA,MAAA,IAAA,CAAA,MAAA,EAAA,aAAA,OAAA,EAAA,gBAAA,WAAA,QAAvB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAuB,aAAA,KAAA,SAAA,uBAAA,OAAA,CAAA,WAAA,aAAA,MAAA,QAAA,YAAA,6BAsEd,GAAgB,wBAAA,qDAQhB,GAAgB,WAAA,2BAyBhB,GACA,UAAA,yBAAA,GACA,SAAA,uBAAA,IA9GT,QAAA,CAAA,YAAA,cAAA,eAAA,kBAAA,UAAA,CAAC,GAAiB,gBAAA,KAAA,SAAA,EAAA,SCzO/B,ilJA4HA,OAAA,q28CAAA,aAAA,EAAA,KAAA,WAAA,KDuGI,GAAe,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,KAAA,WAAA,KACf,GAAY,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,mBAAA,OAAA,6CAAA,KAAA,YAAA,KAAA,EAAA,KAAA,SAAA,SAAA,OAAA,iCAAA,KAAA,YAAA,KACZ,GAAoB,SAAA,oBAAA,OAAA,gCAAA,KAAA,YAAA,KACpB,GAAuB,SAAA,wBAAA,OAAA,gCAAA,KAAA,YAAA,KACvB,GAAkB,SAAA,iBAAA,QAAA,mCAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAOT,GAAuB,WAAA,E,KAdnC,EACW,KAAA,EAAA,SAAA,uBACD,QAAA,CACP,EACA,EACA,GACA,GACA,IACD,UACU,CAAC,GAGG,cAAA,EAAkB,UAAS,SAAA,ilJAAA,OAAA,y28CAwB7B,eAAA,MAAA,KAAA,EAAA,kBAAA,CAAA,KAAA,IAAA,CAAA,KAAA,IAAA,CAAA,KAAA,EAAA,aAAA,eAAA,CAAA,WAAU,EAAtB,KAAA,IAyBY,MAAK,EAAjB,KAAA,IAwBG,YAAW,E,KADd,E,MAAM,CAAE,UAAW,MAShB,wBAAuB,E,KAD1B,E,MAAM,CAAE,UAAW,MAyBoB,WAAU,E,KAAjD,E,MAAM,CAAE,UAAW,MACoB,UAAS,E,KAAhD,E,MAAM,CAAE,UAAW,MACoB,SAAQ,E,KAA/C,E,MAAM,CAAE,UAAW,MACV,YAAW,EAApB,KAAA,IACS,eAAc,EAAvB,KAAA,OEpTG,MAAO,WAAiC,GAC5C,WAAA,CAAY,GACV,MAAM,GAGR,KAAA,eAA6B,CAC3B,CAAE,OAAQ,KAAM,KAAM,UAAW,MAAO,KACxC,CAAE,OAAQ,KAAM,KAAM,UAAW,MAAO,KACxC,CAAE,OAAQ,KAAM,KAAM,eAAgB,MAAO,KAC7C,CAAE,OAAQ,KAAM,KAAM,eAAgB,MAAO,WAC7C,CAAE,OAAQ,KAAM,KAAM,UAAW,MAAO,MACxC,CAAE,OAAQ,KAAM,KAAM,WAAY,MAAO,KACzC,CAAE,OAAQ,KAAM,KAAM,WAAY,MAAO,KACzC,CAAE,OAAQ,KAAM,KAAM,UAAW,MAAO,MACxC,CAAE,OAAQ,KAAM,KAAM,SAAU,MAAO,WACvC,CAAE,OAAQ,KAAM,KAAM,SAAU,MAAO,YAMzC,KAAW,YAAG,MACd,KAAoB,qBAAG,MAKiB,KAAsB,uBAAa,KACnC,KAA0B,2BAAa,MACvC,KAAgB,iBAAa,KAC7B,KAAc,eAAa,KAC3B,KAAY,aAAa,KACzB,KAAmB,oBAAa,KAChC,KAAc,eAAa,KAC3B,KAAiB,kBAAa,KAC9B,KAAsB,uBAAa,KACnC,KAAa,cAAa,KAC1B,KAAU,WAAa,MACvB,KAAO,QAAa,MACpB,KAAY,aAAa,MAKxD,KAAW,YAAY,GACvB,KAAQ,SAAY,eACpB,KAAY,aAAY,GACxB,KAAgB,iBAAY,yEAC5B,KAAc,eAAY,gDAC1B,KAAY,aAAY,oEAIvB,KAAA,uBAAyB,IAAI,EAC7B,KAAA,wBAA0B,IAAI,EAaxC,KAAA,eAA6B,CAC3B,CAAE,GAAG,sBAAuB,OAAO,kBAAmB,MAAO,wBAAyB,OAAQ,gBAAiB,KAAM,GAAI,WAAY,GAAI,UAAW,GAAI,YAAa,GAAI,IAAK,IAC9K,CAAE,GAAG,sBAAuB,OAAO,sBAAuB,WAAY,eAAgB,MAAO,WAAY,UAAW,mBAAoB,OAAQ,yBAA0B,KAAM,GAAI,IAAK,GAAI,YAAa,IAC1M,CAAE,GAAG,gBAAiB,OAAO,YAAa,MAAO,kBAAmB,OAAQ,aAAc,OAAI,GAAQ,OAAO,KAAK,UAAY,EAAG,EAAI,KAAM,IAAM,KAAK,iBAAkB,KAAM,GAAI,WAAY,GAAI,UAAW,GAAI,YAAa,IAC9N,CAAE,GAAG,cAAe,OAAO,UAAW,MAAO,eAAgB,OAAQ,WAAY,OAAI,GAAQ,OAAO,KAAK,UAAY,EAAG,EAAI,KAAM,IAAM,KAAK,eAAgB,YAAa,aAAc,KAAM,GAAI,WAAY,GAAI,UAAW,IAC7N,CAAE,GAAG,YAAa,OAAO,QAAS,MAAO,aAAc,OAAQ,SAAU,OAAI,GAAQ,OAAO,KAAK,UAAY,EAAG,EAAI,KAAM,IAAM,KAAK,aAAc,KAAM,GAAI,WAAY,GAAI,UAAW,GAAI,YAAa,IACzM,CAAE,GAAG,mBAAoB,OAAO,eAAgB,MAAO,qBAAsB,OAAQ,iBAAkB,KAAM,GAAI,WAAY,GAAI,UAAW,GAAI,YAAa,GAAI,IAAK,IACtK,CAAE,GAAG,mBAAoB,OAAO,UAAW,MAAO,iBAAkB,OAAQ,aAAc,KAAM,GAAI,WAAY,GAAI,IAAK,GAAI,UAAW,GAAI,YAAa,IACzJ,CAAE,GAAG,aAAc,OAAO,aAAc,MAAO,mBAAoB,OAAQ,eAAgB,KAAM,GAAI,WAAY,GAAI,IAAK,GAAI,UAAW,GAAI,YAAa,IAC1J,CAAE,GAAG,kBAAmB,KAAM,UAAW,OAAQ,GAAI,MAAO,GAAI,OAAQ,GAAI,WAAY,GAAI,IAAK,GAAI,UAAW,GAAI,YAAa,IACjI,CAAE,GAAG,SAAU,OAAO,SAAU,MAAO,eAAgB,OAAQ,UAAW,KAAM,GAAI,WAAY,GAAI,IAAK,GAAI,UAAW,GAAI,YAAa,I,CApB3I,WAAA,CAAY,GACV,GAAI,EAAQ,oBAAqB,CAC/B,KAAK,kBAAkB,IAAI,EAAQ,oBAAoB,a,EAwB3D,gBAAA,CAAkB,EAAgB,GAChC,IAAK,GAAQ,EAAK,OAAS,UAAW,CACpC,M,CAIF,GAAI,EAAK,SAAW,UAAW,CAC7B,KAAK,+B,KAEF,CACH,KAAK,qBAAuB,MAC5B,KAAK,YAAc,MACnB,GAAU,KAAM,yBAA0B,CAAE,QAAO,OAAQ,EAAK,OAAS,EAAK,OAAS,I,EAO3F,eAAA,CAAiB,GACf,KAAK,qBAAuB,MAC5B,KAAK,YAAc,MACnB,GAAU,KAAM,0BAA2B,E,CAM7C,aAAA,GACE,KAAK,aAAe,KAAK,YACzB,IAAI,KAAK,YAAa,CACpB,KAAK,qBAAuB,K,EAOhC,6BAAA,GACE,IAAI,KAAK,YAAa,CACpB,M,CAEF,KAAK,sBAAwB,KAAK,oB,CAMpC,SAAA,CAAU,GAER,GAAI,EAAM,CACR,OAAQ,KAAM,GAAG,EAAK,OAAS,EAAK,OAAS,EAAK,Y,CAGpD,OAAO,K,CAIT,SAAA,CAAU,GACR,IAAI,EAAU,GAAM,IACpB,MAAM,EAAa,KAAK,eAAe,MAAK,GAAO,EAAK,SAAW,KAAK,mBACxE,MAAM,EAAW,GAAY,MAC7B,MAAM,EAAmB,GAAS,WAAW,QAAU,EACvD,GAAI,GAAM,aAAe,EAAkB,CACzC,EAAU,EAAU,IACpB,GAAI,EAAkB,CACpB,EAAU,EAAU,KAAO,EAC3B,GAAI,GAAM,YAAa,CACrB,EAAU,EAAU,G,EAGxB,GAAI,GAAM,YAAa,CACrB,EAAU,EAAU,EAAK,W,EAG7B,OAAO,C,CAGT,aAAA,GACE,MAAM,EAAwB,KAAK,WAAa,KAAK,eAAe,MAAM,GAAG,GAAK,KAAK,eACvF,OAAO,EAAsB,KAAM,IAEjC,GAAI,KAAK,UAAU,IAAU,EAAK,aAAe,KAAM,EAAK,YAAiD,CAC3G,M,CAEF,OAAO,CAAI,G,CAIf,UAAA,CAAW,GACT,MAAO,iBAAmB,GAAM,OAAO,OAAO,GAAG,cAAgB,GAAM,OAAO,MAAM,E,6FA7K3E,GAAwB,KAAA,EAAA,MAAA,EAAA,mBAAA,OAAA,EAAA,gBAAA,WAAA,QAAxB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GA2BS,aAAA,KAAA,SAAA,wBAAA,OAAA,CAAA,uBAAA,mDAAA,GACA,2BAAA,2DAAA,GAAgB,iBAAA,uCAChB,GAAgB,eAAA,mCAChB,GAAgB,aAAA,+BAChB,GACA,oBAAA,6CAAA,GACA,eAAA,mCAAA,GAAgB,kBAAA,yCAChB,GAAgB,uBAAA,mDAChB,GAAgB,cAAA,iCAChB,GACA,WAAA,2BAAA,GACA,QAAA,qBAAA,GACA,aAAA,+BAAA,GAAgB,YAAA,cAAA,SAAA,WAAA,aAAA,eAAA,iBAAA,mBAAA,eAAA,iBAAA,aAAA,gBAAA,QAAA,CAAA,uBAAA,yBAAA,wBAAA,2BAAA,UA7CzB,CAAC,GC/Bd,gBAAA,KAAA,cAAA,KAAA,SAAA,EAAA,SAAA,gsGD8BY,OAAA,2glBAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GAAc,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,mBAAA,OAAA,6CAAA,KAAA,YAAA,KAAA,EAAA,KAAA,SAAA,SAAA,OAAA,iCAAA,KAAA,WAAA,KAAA,GAAe,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAO5B,GAAwB,WAAA,E,KATpC,EACW,KAAA,EAAA,SAAA,wBACD,QAAA,CAAC,EAAc,GACb,UAAA,CAAC,GAGG,cAAA,EAAkB,UAAS,SAAA,gsGAAA,OAAA,+glBA8BF,eAAA,MAAA,KAAA,EAAA,mBAAA,eAAA,CAAA,uBAAsB,E,KAA7D,E,MAAM,CAAE,UAAW,MACoB,2BAA0B,E,KAAjE,E,MAAM,CAAE,UAAW,MACoB,iBAAgB,E,KAAvD,E,MAAM,CAAE,UAAW,MACoB,eAAc,E,KAArD,E,MAAM,CAAE,UAAW,MACoB,aAAY,E,KAAnD,E,MAAM,CAAE,UAAW,MACoB,oBAAmB,E,KAA1D,E,MAAM,CAAE,UAAW,MACoB,eAAc,E,KAArD,E,MAAM,CAAE,UAAW,MACoB,kBAAiB,E,KAAxD,E,MAAM,CAAE,UAAW,MACoB,uBAAsB,E,KAA7D,E,MAAM,CAAE,UAAW,MACoB,cAAa,E,KAApD,E,MAAM,CAAE,UAAW,MACoB,WAAU,E,KAAjD,E,MAAM,CAAE,UAAW,MACoB,QAAO,E,KAA9C,E,MAAM,CAAE,UAAW,MACoB,aAAY,E,KAAnD,E,MAAM,CAAE,UAAW,MAKX,YAAW,EAAnB,KAAA,IACQ,SAAQ,EAAhB,KAAA,IACQ,aAAY,EAApB,KAAA,IACQ,iBAAgB,EAAxB,KAAA,IACQ,eAAc,EAAtB,KAAA,IACQ,aAAY,EAApB,KAAA,IAIS,uBAAsB,EAA/B,KAAA,IACS,wBAAuB,EAAhC,KAAA,OEhFU,MAAA,GAPb,WAAA,GAWE,KAAA,UAAY,CACV,CAAE,OAAQ,MAAO,KAAM,QACvB,CAAE,OAAQ,MAAO,KAAM,QACvB,CAAE,OAAQ,MAAO,KAAM,QACvB,CAAE,OAAQ,MAAO,KAAM,QACvB,CAAE,OAAQ,MAAO,KAAM,QACvB,CAAE,OAAQ,MAAO,KAAM,QACvB,CAAE,OAAQ,MAAO,KAAM,QACvB,CAAE,OAAQ,MAAO,KAAM,QACvB,CAAE,OAAQ,MAAO,KAAM,QACvB,CAAE,OAAQ,MAAO,KAAM,QACvB,CAAE,OAAQ,MAAO,KAAM,SAMzB,KAAW,YAAG,MAK0B,KAAO,QAAa,MAKnD,KAAY,aAAY,MAKvB,KAAA,oBAAsB,IAAI,CAyBrC,CApBC,WAAA,CAAa,GACX,GAAU,KAAM,sBAAuB,E,CAMzC,aAAA,GACE,KAAK,aAAe,KAAK,W,CAM3B,mBAAA,CAAqB,GACnB,MAAO,CACL,SAAY,KAAK,eAAiB,EAClC,CAAC,WAAa,GAAS,K,QA1DhB,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAoB,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAApB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GA0BS,aAAA,KAAA,SAAA,mBAAA,OAAA,CAAA,QAAA,qBAAA,GCrCtB,aAAA,gBAAA,QAAA,CAAA,oBAAA,uBAAA,SAAA,EAAA,SAAA,w4BDMY,OAAA,g0HAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GAAY,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,mBAAA,OAAA,6CAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAKX,GAAoB,WAAA,E,KAPhC,EACW,KAAA,EAAA,SAAA,mBACD,QAAA,CAAC,GAGK,cAAA,EAAkB,UAAS,SAAA,w4BAAA,OAAA,o0HA4BF,eAAA,CAAA,QAAO,E,KAA9C,E,MAAM,CAAE,UAAW,MAKX,aAAY,EAApB,KAAA,IAKS,oBAAmB,EAA5B,KAAA,OEzCU,MAAA,GAGX,WAAA,CAAoB,GAAA,KAAU,WAAV,EAFH,KAAA,aAAe,IAAI,C,CAK7B,OAAA,CAAQ,GACb,MAAM,EAAgB,KAAK,WAAW,cAAc,SAAS,GAC7D,IAAK,EAAe,CAClB,KAAK,aAAa,M,8FATX,GAAqB,KAAA,EAAA,MAAA,EAAA,aAAA,OAAA,EAAA,gBAAA,WAAA,QAArB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAqB,aAAA,KAAA,SAAA,oBAAA,QAAA,CAAA,aAAA,gBAAA,KAAA,CAAA,UAAA,6CAAA,SAAA,GAAA,E,iFAArB,GAAqB,WAAA,E,KAJjC,EAAU,KAAA,EACT,SAAU,oBACV,WAAY,SAGK,eAAA,MAAA,KAAA,EAAA,aAAA,eAAA,CAAA,aAAY,EAA5B,KAAA,IAKM,QAAO,E,KADb,E,MAAa,iBAAkB,CAAC,uBCgBtB,MAAA,GAeX,WAAA,CAA6B,GAAA,KAAE,GAAF,EAdnB,KAAA,gBAAkB,IAAI,EACQ,KAAS,UAAY,KACpD,KAAY,aAAY,GAEd,KAAA,cAAgB,EAAgB,OACzC,KAAK,MAAY,UACR,KAAS,UAAG,EAAmC,CAChE,MAAO,IACP,MAAO,MAIT,KAAA,MAAQ,EAAmD,IAGzD,KAAK,SAAW,KAAK,GAAG,cAAc,U,CAGxC,QAAI,GACF,OAAO,KAAK,K,CAEd,QAAa,CAAK,GAChB,KAAK,MAAQ,C,CAGL,aAAA,GACR,KAAK,+BACL,KAAK,cAAc,IAAI,M,CAGf,YAAA,CAAa,GACrB,KAAK,cAAc,IAAI,OAEvB,UAAU,EAAK,WAAa,WAAY,CACtC,GAAG,EAAK,WAAW,KAAK,OAAQ,CAC9B,M,CAEF,EAAK,SAAS,KAAK,OACnB,M,CAGF,GAAG,EAAK,SAAU,CAChB,M,CAEF,EAAK,SAAS,KAAK,M,CAGX,SAAA,CAAU,GAClB,IAAI,EAAK,SAAU,CACjB,OAAO,K,CAET,UAAU,EAAK,WAAa,WAAY,CACtC,OAAO,EAAK,WAAW,KAAK,M,CAE9B,OAAO,EAAK,Q,CAGJ,6BAAA,GACR,MAAM,EAAkB,KAAK,SAAS,cAAc,yBACpD,IAAI,EAAiB,CACnB,M,CAGF,MAAQ,MAAO,EAAM,IAAK,GAAS,EAAgB,wBACnD,KAAK,UAAU,IAAI,CAAE,OAAM,Q,CAGnB,4BAAA,GACR,IAAI,KAAK,UAAU,CACjB,M,CAGF,cAAc,KAAK,WACnB,KAAK,UAAY,S,CAGT,6BAAA,GACR,GAAG,KAAK,UAAU,CAChB,M,CAEF,KAAK,UAAa,aAAY,KAC5B,KAAK,+BAA+B,GACnC,G,CAGK,eAAA,CAAgB,GACxB,KAAK,cAAc,QAAO,IAAU,IACpC,KAAK,gCACL,KAAK,gCACL,GAAU,KAAM,mBAChB,EAAM,iB,6FA3FG,GAA2B,KAAA,EAAA,MAAA,EAAA,aAAA,OAAA,EAAA,gBAAA,WAAA,QAA3B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAES,aAAA,KAAA,SAAA,2BAAA,OAAA,CAAA,UAAA,CAAA,kBAAA,YAAA,WAAA,YAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,GAAgB,aAAA,CAAA,kBAAA,eAAA,WAAA,eAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,MAAA,CAAA,kBAAA,QAAA,WAAA,QAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,MAAA,KAAA,CAAA,kBAAA,OAAA,WAAA,OAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,OAAA,QAAA,CAAA,gBAAA,kBAAA,MAAA,eAAA,SAAA,EAAA,SC7BtC,k+CDmBI,OAAA,kjOAAA,aAAA,EAAA,KAAA,YAAA,KAAA,EACA,SAAA,YAAA,OAAA,cAAA,KAAA,YAAA,KAAA,GAAqB,SAAA,oBAAA,QAAA,mBAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAOZ,GAA2B,WAAA,E,KAXvC,EACW,KAAA,EAAA,SAAA,2BACD,QAAA,CACP,EACA,IAIa,cAAA,EAAkB,UAAS,SAAA,k+CAAA,OAAA,sjOAIhC,eAAA,MAAA,KAAA,EAAA,aAAA,eAAA,CAAA,gBAAe,EAAxB,KAAA,IACuC,UAAS,E,KAAhD,E,MAAM,CAAE,UAAW,MACX,aAAY,EAApB,KAAA,IAmBY,KAAI,EAAhB,KAAA,OEpBU,MAAA,GAaX,WAAA,CAA6B,GAAA,KAAE,GAAF,EAZpB,KAAmB,oBAAkB,KAC9C,KAAA,UAAY,EAA0B,WAC7B,KAAa,cAAY,SACM,KAAW,YAAY,MACvB,KAAmB,oBAAY,MAC/B,KAAgB,iBAAY,MAC5B,KAAgB,iBAAY,MAC5B,KAAY,aAAY,KACxB,KAAwB,yBAAY,KACpC,KAAiB,kBAAY,MAC5D,KAAc,eAAY,GAC1B,KAAY,aAA4C,KAEzB,KAAY,aAAW,MACvB,KAAY,aAAW,MAU/D,KAAA,mBAAqB,EAAmC,MAE9C,KAAA,cAAgB,IAAI,EACpB,KAAA,cAAgB,IAAI,EACpB,KAAA,cAAgB,IAAI,EAEtB,KAAc,eAAyC,UA0IvD,KAAA,aAAe,CAAC,EAAgB,KAC/B,CACL,WAAY,EAAK,WAAa,WAAa,EAAK,SAAS,OAAS,EAClE,eAAgB,EAAK,UAAU,OAC/B,KAAM,EAAK,KACX,GAAI,EAAK,GACT,MAAO,EACP,OAAQ,EAAK,OACb,SAAU,EAAK,SACf,WAAY,KACZ,WAAY,KACZ,gBAAiB,MACjB,gBAAiB,QAIX,KAAY,aAAG,IAAI,IAC3B,GAAQ,EAAK,QACb,GAAQ,EAAK,aAGL,KAAA,eAAiB,IAAI,GAC7B,KAAK,cACL,GAAQ,EAAK,QACb,GAAQ,EAAK,aACb,GAAQ,EAAK,WAGL,KAAA,YAAc,IAAI,GAAsB,KAAK,aAAc,KAAK,gBAChE,KAAa,cAAG,CAAC,EAAW,IAAmB,EAAK,U,CArL9D,YAAI,GACF,OAAO,KAAK,YAAY,I,CAG1B,YAAa,CAAS,GACpB,KAAK,oBAAsB,KAC3B,KAAK,YAAY,KAAO,C,CAW1B,QAAA,GACE,MAAM,EAAU,KAAK,GAAG,cACxB,GAAI,EAAS,CACV,EAAyD,YAAc,KAAK,SAAS,KAAK,MAC1F,EAAyD,eAAiB,KAAK,YAAY,KAAK,K,CAGnG,KAAK,eAAiB,IAAI,GAAyB,KAAK,aAAe,KAAK,qBAC5E,GAAG,KAAK,oBAAoB,CAC1B,KAAK,YAAY,KAAK,oB,EAInB,UAAA,GACL,KAAK,aAAa,W,CAGZ,QAAA,CAAS,EAAY,GAC3B,IAAI,MAAM,KAAQ,EAAO,CACvB,GAAG,EAAK,KAAO,EAAI,CACjB,OAAO,C,CAET,GAAG,EAAK,SAAU,CAChB,MAAM,EAAyB,KAAK,SAAS,EAAI,EAAK,UACtD,GAAG,EAAO,CACR,OAAO,C,GAIb,OAAO,I,CAGF,QAAA,CAAS,EAA6B,EAAyB,OACpE,UAAU,IAAO,SAAU,CACzB,OAAO,KAAK,SAAS,EAAI,KAAK,YAAY,K,CAE5C,GAAG,EAAe,CAChB,MAAM,EAAoB,KAAK,GAAG,cAAc,cAAc,aAAa,EAAG,QAC9E,OAAO,C,CAET,OAAO,KAAK,SAAS,EAAG,GAAI,KAAK,YAAY,K,CAGxC,WAAA,CAAY,EAAY,EAAqB,OAClD,MAAM,EAAO,KAAK,aAAa,UAAU,MAAK,GAAK,EAAE,KAAO,IAC5D,IAAI,EAAM,CACR,M,CAGF,IAAI,KAAK,eAAgB,CACvB,M,CAGF,GAAG,KAAK,qBAAuB,KAAK,eAAe,SAAS,OAAS,EAAG,CACtE,GAAG,KAAK,eAAe,SAAS,GAAG,SAAW,EAAK,OAAQ,CACzD,KAAK,eAAe,O,EAIxB,GAAG,KAAK,eAAe,WAAW,GAAO,CACvC,M,CAGF,KAAK,eAAe,OAAO,GAC3B,IAAI,KAAK,cAAgB,KAAK,sBAAwB,EAAW,CAC/D,GAAU,KAAM,gBAAiB,KAAK,eAAe,UACrD,M,CAGF,IAAI,KAAK,oBAAqB,CAC5B,KAAK,wBAAwB,E,CAG/B,GAAG,KAAK,yBAA0B,CAChC,KAAK,wBAAwB,E,CAG/B,IAAI,EAAU,CACZ,GAAU,KAAM,gBAAiB,KAAK,eAAe,S,EAKlD,eAAA,GACL,KAAK,gBAAgB,O,CAGhB,WAAA,CAAY,GACjB,MAAM,EAAO,KAAK,aAAa,UAAU,MAAK,GAAK,EAAE,KAAO,IAC5D,IAAI,EAAM,CACR,M,CAGF,KAAK,aAAa,OAAO,E,CAGpB,WAAA,CAAY,GACjB,MAAM,EAAO,KAAK,aAAa,UAAU,MAAK,GAAK,EAAE,KAAO,IAC5D,IAAI,EAAM,CACR,OAAO,K,CAGT,OAAO,KAAK,aAAa,WAAW,E,CAG/B,WAAA,CAAY,GACjB,IAAI,KAAK,eACP,OAEF,MAAM,EAAO,KAAK,aAAa,UAAU,MAAK,GAAK,EAAE,KAAO,IAC5D,IAAI,EAAM,CACR,OAAO,K,CAGT,OAAO,KAAK,gBAAgB,WAAW,E,CAGjC,WAAA,CAAY,GAClB,MAAM,EAAa,KAAK,MAAM,GAC9B,KAAK,YAAY,KAAO,GAAc,E,CAGhC,gBAAA,CAAiB,GACvB,KAAK,YAAY,EAAO,a,CAG1B,WAAA,CAAY,GACV,GAAG,EAAQ,gBAAkB,EAAQ,uBAAwB,CAC3D,KAAK,eAAiB,IAAI,GAAyB,KAAK,aAAe,KAAK,oB,CAE9E,GAAG,EAAQ,uBAAwB,CACjC,KAAK,iBAAiB,EAAQ,uB,EAkCxB,iBAAA,CAAkB,GAC1B,OAAO,EAAK,UAAY,WAAa,EAAK,UAAY,E,CAG9C,YAAA,CAAa,GACrB,IAAI,EAAK,WAAY,CACnB,OAAO,K,CAET,GAAG,EAAK,iBAAmB,UAAW,CACpC,OAAO,K,CAET,OAAO,EAAK,eAAiB,C,CAGrB,uBAAA,CAAwB,GAChC,IAAI,KAAK,eAAgB,CACvB,OAAO,K,CAGT,MAAM,EAA2C,KAAK,eAEtD,MAAM,EAAe,KAAK,aAAa,eAAe,GACtD,GAAG,EAAa,SAAW,EAAG,CAC5B,OAAO,I,CAET,MAAM,EAAmB,EAAa,OAAS,GAAK,EAAa,OAAO,GAC/D,EAAe,WAAW,KAEnC,OAAO,C,CAGC,6BAAA,CAA8B,GACtC,IAAI,KAAK,eAAgB,CACvB,OAAO,K,CAET,MAAM,EAA2C,KAAK,eAEtD,MAAM,EAAe,KAAK,aAAa,eAAe,GACtD,MAAM,EAAU,EAAa,MAAM,GAC1B,EAAe,WAAW,KAEnC,OAAO,IAAY,KAAK,wBAAwB,E,CAG1C,uBAAA,CAAwB,GAC9B,IAAI,KAAK,eAAgB,CACvB,M,CAGF,MAAM,EAAkB,KAAK,eAAe,WAAW,GACvD,GAAG,EAAiB,CAClB,KAAK,eAAe,UAAU,KAAK,aAAa,eAAe,G,KAE5D,CACH,KAAK,eAAe,YAAY,KAAK,aAAa,eAAe,G,EAI7D,uBAAA,CAAwB,GAC9B,IAAI,KAAK,eAAgB,CACvB,M,CAGF,IAAI,EAAY,EAAK,OACrB,IAAI,EAAc,KAAK,aAAa,UAAU,MAAK,GAAK,EAAE,KAAO,IACjE,MAAM,EAAa,CACjB,GAAG,KAAK,wBAAwB,GAAc,CAC5C,KAAK,eAAe,OAAO,E,KAEzB,CACF,KAAK,eAAe,SAAS,E,CAE/B,EAAY,EAAY,OACxB,EAAc,KAAK,aAAa,UAAU,MAAK,GAAK,EAAE,KAAO,G,EAIvD,WAAA,CAAY,EAAc,GAClC,IAAI,EAAM,CACR,M,CAGF,IAAI,KAAK,aAAc,CACrB,M,CAGF,IAAI,KAAK,eAAgB,CACvB,M,CAIF,MAAM,EAAe,GAAS,MAAQ,aAAiB,WACvD,GAAI,IAAiB,GAAO,QAAS,CACnC,KAAK,eAAe,O,CAGtB,GAAG,KAAK,qBAAuB,KAAK,eAAe,SAAS,OAAS,EAAG,CACtE,GAAG,KAAK,eAAe,SAAS,GAAG,SAAW,EAAK,OAAQ,CACzD,KAAK,eAAe,O,EAIxB,KAAK,eAAe,OAAO,GAC3B,IAAI,KAAK,cAAgB,KAAK,oBAAqB,CACjD,GAAU,KAAM,gBAAiB,KAAK,eAAe,UACrD,M,CAGF,IAAI,KAAK,oBAAqB,CAC5B,KAAK,wBAAwB,E,CAG/B,GAAG,KAAK,yBAA0B,CAChC,KAAK,wBAAwB,E,CAG/B,GAAU,KAAM,gBAAiB,KAAK,eAAe,S,CAG7C,WAAA,CAAY,GACpB,IAAI,KAAK,eAAgB,CACvB,OAAO,K,CAET,OAAO,KAAK,gBAAgB,WAAW,E,CAG/B,gBAAA,CAAkB,EAAY,GACtC,GAAI,EAAO,CACT,EAAM,kBACN,EAAM,gB,CAER,EAAK,YAAc,EAAK,WACxB,GAAG,EAAK,WAAW,CACjB,KAAK,aAAa,eAAe,GAAM,SAAQ,IAC7C,EAAE,WAAa,EAAK,UAAU,G,CAGlC,EAAK,gBAAkB,MACvB,KAAK,kBAAkB,EAAK,GAC5B,GAAU,KAAM,gBAAiB,CAAC,G,CAG1B,gBAAA,CAAiB,EAAa,GACtC,GAAI,EAAO,CACT,EAAM,kBACN,EAAM,gB,CAER,EAAK,YAAc,EAAK,WACxB,GAAG,EAAK,WAAW,CACjB,KAAK,aAAa,eAAe,GAAM,SAAQ,IAC7C,EAAE,WAAa,EAAK,UAAU,G,CAGlC,EAAK,gBAAkB,MACvB,KAAK,kBAAkB,EAAK,GAC5B,GAAU,KAAM,gBAAiB,CAAC,G,CAIpC,iBAAA,CAAkB,EAAc,GAC9B,IAAI,KAAK,cAAgB,IAAa,EAAE,CACtC,M,CAEF,IAAI,KAAK,cAAgB,IAAa,EAAE,CACtC,M,CAEF,IAAI,EAAK,OAAO,CACd,M,CAEF,IAAI,EAAS,EACb,MAAM,GAAU,EAAO,OAAO,CAC5B,MAAM,EAAa,KAAK,aAAa,UAAU,MAAK,GAAK,EAAE,KAAO,EAAO,SACzE,IAAI,EAAW,CACb,M,CAEF,IAAI,EAAU,EACd,IAAI,EAAY,EAChB,IAAI,EAAe,MACnB,KAAK,aAAa,eAAe,GAAY,SAAQ,IACnD,GAAG,IAAa,EAAI,EAAE,WAAY,EAAE,WAAW,CAC7C,G,KACK,CACL,G,CAEF,GAAG,IAAa,EAAI,EAAE,gBAAiB,EAAE,gBAAgB,CACvD,EAAe,I,CAEjB,GAAG,EAAU,GAAK,EAAY,EAAE,CAC9B,EAAe,I,KAGnB,GAAG,IAAa,EAAG,CACjB,EAAW,gBAAkB,EAC7B,EAAW,YAAc,C,KACpB,CACL,EAAW,gBAAkB,EAC7B,EAAW,YAAc,C,CAE3B,EAAS,C,EAGH,gBAAA,CAAiB,GACzB,OAAO,EAAK,e,CAGJ,gBAAA,CAAiB,GACzB,OAAO,EAAK,e,CAGJ,WAAA,CAAY,GACpB,OAAO,EAAK,U,CAEJ,WAAA,CAAY,GACpB,OAAO,EAAK,U,6FA5ZH,GAAwB,KAAA,EAAA,MAAA,EAAA,aAAA,OAAA,EAAA,gBAAA,WAAA,QAAxB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAIS,aAAA,KAAA,SAAA,wBAAA,OAAA,CAAA,oBAAA,CAAA,kBAAA,sBAAA,WAAA,sBAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,UAAA,CAAA,kBAAA,YAAA,WAAA,YAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,MAAA,cAAA,CAAA,kBAAA,gBAAA,WAAA,gBAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,YAAA,CAAA,kBAAA,cAAA,WAAA,cAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,GACA,oBAAA,CAAA,kBAAA,sBAAA,WAAA,sBAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,GACA,iBAAA,CAAA,kBAAA,mBAAA,WAAA,mBAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,GACA,iBAAA,CAAA,kBAAA,mBAAA,WAAA,mBAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,GACA,aAAA,CAAA,kBAAA,eAAA,WAAA,eAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,GACA,yBAAA,CAAA,kBAAA,2BAAA,WAAA,2BAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,GACA,kBAAA,CAAA,kBAAA,oBAAA,WAAA,oBAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,GAAgB,eAAA,CAAA,kBAAA,iBAAA,WAAA,iBAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,aAAA,CAAA,kBAAA,eAAA,WAAA,eAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,aAAA,CAAA,kBAAA,eAAA,WAAA,eAAA,SAAA,MAAA,WAAA,MAAA,kBAIhB,GAAgB,aAAA,CAAA,kBAAA,eAAA,WAAA,eAAA,SAAA,MAAA,WAAA,MAAA,kBAChB,GAAgB,SAAA,CAAA,kBAAA,WAAA,WAAA,WAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,mBAAA,CAAA,kBAAA,qBAAA,WAAA,qBAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,OAAA,QAAA,CAAA,cAAA,gBAAA,cAAA,gBAAA,cAAA,iBAAA,cAAA,KAAA,SAAA,EAAA,SC5CtC,g1KA+IA,OAAA,qyWAAA,aAAA,EAAA,KAAA,WAAA,KD7HY,IACR,CAAA,KAAA,YAAA,KAAA,GAAA,eAAA,SAAA,mBAAA,OAAA,uCAAA,KAAA,YAAA,KAAA,GAAA,mBAAA,SAAA,uBAAA,OAAA,oDAAA,KAAA,YAAA,KAAA,GAAA,kBAAA,SAAA,sBAAA,OAAA,iCAAA,KAAA,WAAA,KAAA,IACA,CAAA,KAAA,YAAA,KAAA,GAAA,cAAA,SAAA,0BAAA,SAAA,gBAAA,KAAA,WAAA,KAAA,IACA,CAAA,KAAA,WAAA,KAAA,IACA,CAAA,KAAA,YAAA,KAAA,GAAA,QAAA,SAAA,WAAA,OAAA,yFAAA,SAAA,cAAA,KAAA,YAAA,KAAA,GAAA,YAAA,SAAA,gBAAA,OAAA,8EAAA,QAAA,gCAAA,SAAA,kBAAA,KAAA,YAAA,KAAA,GACA,SAAA,2BAAA,OAAA,4CAAA,QAAA,oCAAA,KAAA,WAAA,KAAA,GAAY,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,YAAA,KAAA,EAAA,KAAA,SAAA,SAAA,OAAA,iCAAA,KAAA,YAAA,KAAA,EAAA,iBAAA,SAAA,qBAAA,OAAA,+E,iFAMH,GAAwB,WAAA,E,KAbpC,EACW,KAAA,EAAA,SAAA,wBAAuB,QACxB,CAAC,GACR,GACA,GACA,GACA,GACA,GACD,SAAA,g1KAAA,OAAA,yyWAMQ,eAAA,MAAA,KAAA,EAAA,aAAA,eAAA,CAAA,oBAAmB,EAA3B,KAAA,IAEQ,cAAa,EAArB,KAAA,IACuC,YAAW,E,KAAlD,E,MAAM,CAAE,UAAW,MACoB,oBAAmB,E,KAA1D,E,MAAM,CAAE,UAAW,MACoB,iBAAgB,E,KAAvD,E,MAAM,CAAE,UAAW,MACoB,iBAAgB,E,KAAvD,E,MAAM,CAAE,UAAW,MACoB,aAAY,E,KAAnD,E,MAAM,CAAE,UAAW,MACoB,yBAAwB,E,KAA/D,E,MAAM,CAAE,UAAW,MACoB,kBAAiB,E,KAAxD,E,MAAM,CAAE,UAAW,MACX,eAAc,EAAtB,KAAA,IACQ,aAAY,EAApB,KAAA,IAEuC,aAAY,E,KAAnD,E,MAAM,CAAE,UAAW,MACoB,aAAY,E,KAAnD,E,MAAM,CAAE,UAAW,MAMP,SAAQ,EAApB,KAAA,IAMS,cAAa,EAAtB,KAAA,IACS,cAAa,EAAtB,KAAA,IACS,cAAa,EAAtB,KAAA,OE5CS,IAAA,IAAZ,SAAY,GACV,IAAA,kBACA,IAAA,sDACA,IAAA,yCACD,EAJD,CAAY,QAIX,KAEM,MAAM,GAAoB,ECT3B,MAAO,WAAiC,GAE5C,WAAA,CAAa,GACX,MAAM,GAKR,KAAS,UAAqB,CAAE,KAAO,GAAI,UAAU,IAEP,KAAM,OAAW,EAErD,KAAA,gBAAkB,IAAI,C,CAIhC,aAAA,GACE,KAAK,gBAAgB,M,6FAjBZ,GAAwB,KAAA,EAAA,MAAA,EAAA,mBAAA,OAAA,EAAA,gBAAA,WAAA,QAAxB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAwB,aAAA,KAAA,SAAA,uBAAA,OAAA,CAAA,UAAA,YAAA,OAAA,UAAA,QAAA,CAAA,gBAAA,mBAAA,KAAA,CAAA,WAAA,wCAAA,gBAAA,KAAA,SAAA,EAAA,SCXrC,8VAWA,OAAA,kjBAAA,aAAA,EAAA,KAAA,WAAA,KDJY,KAAe,E,iFAId,GAAwB,WAAA,E,KANpC,EACW,KAAA,EAAA,SAAA,uBAAsB,QACvB,CAAC,GAAgB,SAAA,8VAAA,OAAA,sjBAY1B,eAAA,MAAA,KAAA,EAAA,mBAAA,eAAA,CAAA,UAAS,EADR,KAAA,IAG6C,OAAM,E,KAAnD,E,MAAY,yB,CAAyB,KAAA,IAE5B,gBAAe,EAAxB,KAAA,OEZU,MAAA,GANb,WAAA,GAOW,KAAY,aAAW,MACvB,KAAY,aAAW,MAEhC,KAAe,gBAAG,EAA2B,CAC3C,GAAK,GACL,KAAO,GACP,OAAQ,GACR,QAAS,KACT,OAAQ,OAG2B,KAAa,cAAoC,KAqB7E,KAAA,SAAW,GAAqB,KACvC,MAAM,EAAkB,KAAK,kBAC7B,IAAI,EAAgB,CAClB,MAAO,E,CAGT,MAAM,EAAO,KAAK,sCAAsC,GACxD,IAAI,EAAK,CACP,MAAO,E,CAGT,MAAO,CAAC,EAAK,IAkEL,KAAA,aAAe,IAAI,EACnB,KAAA,YAAe,IAAI,EACnB,KAAA,WAAe,IAAI,CAC9B,CAnGS,qCAAA,CAAsC,GAE5C,MAAM,EAAsB,CAC1B,KAAM,EAAK,KACX,GAAI,EAAK,GACT,OAAQ,EAAK,QAGf,GAAG,EAAK,SAAS,CACf,EAAS,SAAW,GACpB,IAAI,MAAM,KAAS,EAAK,SAAS,CAC/B,MAAM,EAAgB,KAAK,sCAAsC,GACjE,EAAS,SAAS,KAAK,E,EAI3B,OAAO,C,CAkBD,SAAA,CAAU,EAAW,GAC3B,GAAG,EAAK,IAAM,EAAG,CACf,OAAO,C,CAGT,GAAG,EAAK,SAAS,CACf,IAAI,MAAM,KAAS,EAAK,SAAS,CAC/B,MAAM,EAAM,KAAK,UAAU,EAAI,GAC/B,GAAG,EAAI,CACL,OAAO,C,GAKb,OAAO,I,CAGT,mBAAA,CAAoB,GAClB,GAAG,EAAM,SAAW,EAAE,CACpB,MAAM,EAAe,KAAK,UAAU,EAAM,GAAG,GAAI,KAAK,mBACtD,GAAG,EAAa,CACd,KAAK,aAAa,KAAK,E,GAK7B,kBAAA,CAAmB,GACjB,GAAG,EAAM,SAAW,EAAE,CACpB,MAAM,EAAc,KAAK,UAAU,EAAM,GAAG,GAAI,KAAK,mBACrD,GAAG,EAAY,CACb,MAAM,EAA+B,CACnC,KAAK,EAAY,KACjB,OAAQ,EAAY,OACpB,GAAI,EAAY,GAChB,QAAS,EAAM,GAAG,WAClB,OAAS,EAAM,GAAG,YAEpB,KAAK,YAAY,KAAK,E,GAK5B,iBAAA,CAAkB,GAChB,GAAG,EAAM,SAAW,EAAE,CACpB,MAAM,EAAa,KAAK,UAAU,EAAM,GAAG,GAAI,KAAK,mBACpD,GAAG,EAAW,CACZ,MAAM,EAA+B,CACnC,KAAK,EAAW,KAChB,OAAQ,EAAW,OACnB,GAAI,EAAW,GACf,QAAS,EAAM,GAAG,WAClB,OAAS,EAAM,GAAG,YAEpB,KAAK,WAAW,KAAK,E,GAK3B,UAAA,GACE,KAAK,eAAe,Y,QA3GX,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA+B,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAA/B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAYA,aAAA,KAAA,SAAA,+BAAA,OAAA,CAAA,aAAA,CAAA,kBAAA,eAAA,WAAA,eAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,aAAA,CAAA,kBAAA,eAAA,WAAA,eAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,gBAAA,CAAA,kBAAA,kBAAA,WAAA,kBAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,OAAA,QAAA,CAAA,aAAA,eAAA,YAAA,cAAA,WAAA,cAAA,YAAA,EAAA,aAAA,gBAAA,MAAA,KAAA,UAAA,GCvBb,YAAA,OAAA,SAAA,EAAA,SAAA,waAWA,OAAA,gOAAA,aAAA,EAAA,KAAA,YAAA,KDJY,GAAwB,SAAA,wBAAA,OAAA,0RAAA,QAAA,uD,iFAIvB,GAA+B,WAAA,E,KAN3C,EACW,KAAA,EAAA,SAAA,+BAA8B,QAC/B,CAAC,IAAyB,SAAA,waAAA,OAAA,oOAK1B,eAAA,CAAA,aAAY,EAApB,KAAA,IACQ,aAAY,EAApB,KAAA,IAUoC,cAAa,E,KAAjD,E,MAAU,MAkGD,aAAY,EAArB,KAAA,IACS,YAAW,EAApB,KAAA,IACS,WAAU,EAAnB,KAAA,OEhHU,MAAA,GANb,WAAA,GAOE,KAAiB,kBAAG,EAA6B,CAC/C,GAAI,GACJ,KAAM,GACN,OAAQ,KAG2B,KAAa,cAAoC,KAE7E,KAAA,SAAW,GAAqB,KACvC,MAAM,EAAoB,KAAK,oBAC/B,IAAI,EAAmB,CACrB,MAAO,E,CAGT,MAAM,EAAO,KAAK,sCAAsC,GACxD,IAAI,EAAM,CACR,MAAO,E,CAGT,MAAO,CAAC,EAAK,IAqDL,KAAA,aAAe,IAAI,CAC9B,CAnDS,qCAAA,CAAsC,GAE5C,MAAM,EAAsB,CAC1B,KAAM,EAAK,KACX,GAAI,EAAK,GACT,OAAQ,EAAK,QAGf,GAAG,EAAK,SAAS,CACf,EAAS,SAAW,GACpB,IAAI,MAAM,KAAS,EAAK,SAAS,CAC/B,MAAM,EAAgB,KAAK,sCAAsC,GACjE,EAAS,SAAS,KAAK,E,EAI3B,OAAO,C,CAID,SAAA,CAAU,EAAW,GAC3B,GAAG,EAAK,IAAM,EAAG,CACf,OAAO,C,CAGT,GAAG,EAAK,SAAS,CACf,IAAI,MAAM,KAAS,EAAK,SAAS,CAC/B,MAAM,EAAM,KAAK,UAAU,EAAI,GAC/B,GAAG,EAAI,CACL,OAAO,C,GAKb,OAAO,I,CAGT,mBAAA,CAAoB,GAClB,GAAG,EAAM,SAAW,EAAE,CACpB,MAAM,EAAe,KAAK,UAAU,EAAM,GAAG,GAAI,KAAK,qBACtD,GAAG,EAAa,CACd,KAAK,aAAa,KAAK,E,GAK7B,UAAA,GACE,KAAK,eAAe,Y,QAtEX,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAuC,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAAvC,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAOA,aAAA,KAAA,SAAA,wCAAA,OAAA,CAAA,kBAAA,CAAA,kBAAA,oBAAA,WAAA,oBAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,OAAA,QAAA,CAAA,aAAA,gBAAA,YAAA,EAAA,aAAA,gBAAA,MAAA,KAAA,UAAA,GClBb,YAAA,OAAA,SAAA,EAAA,SAAA,kQAOA,OAAA,yOAAA,aAAA,EAAA,KAAA,YAAA,KDAY,GAAwB,SAAA,wBAAA,OAAA,0RAAA,QAAA,uD,iFAIvB,GAAuC,WAAA,E,KANnD,EACW,KAAA,EAAA,SAAA,wCAAuC,QACxC,CAAC,IAAyB,SAAA,kQAAA,OAAA,6OAWE,eAAA,CAAA,cAAa,E,KAAjD,E,MAAU,MAkED,aAAY,EAArB,KAAA,OEzEU,MAAA,GACX,yBAAO,CAAmB,GACxB,MAAM,EAA6B,CACjC,GAAK,EAAS,GACd,KAAO,EAAS,KAAQ,GAAG,EAAS,QAAQ,EAAS,QAAU,EAAS,KACxE,OAAS,EAAS,OAClB,QAAU,KACV,OAAS,MAGX,GAAG,EAAS,SAAS,CACnB,EAAK,SAAW,GAChB,IAAI,MAAM,KAAS,EAAS,SAAS,CACnC,EAAK,SAAS,KAAK,GAA2B,mBAAmB,G,EAIrE,OAAO,C,ECnBE,MAAA,GACX,yBAAO,CAAmB,GACxB,MAAM,EAA+B,CACnC,GAAK,EAAS,GACd,KAAO,EAAS,KAAQ,EAAS,KAAO,EAAS,KACjD,OAAS,EAAS,QAGpB,GAAG,EAAS,SAAS,CACnB,EAAK,SAAW,GAChB,IAAI,MAAM,KAAS,EAAS,SAAS,CACnC,EAAK,SAAS,KAAK,GAA6B,mBAAmB,G,EAIvE,OAAO,C,EClBE,MAAA,GACX,SAAA,CAAU,GACR,GAAI,IAAU,MAAQ,IAAU,UAAW,CACzC,MAAO,Q,MACF,GAAI,IAAU,GAAI,CACvB,MAAO,S,MACF,UAAW,IAAU,UAAW,CACrC,OAAO,EAAQ,OAAS,O,CAE1B,OAAO,EAAM,U,QATJ,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAe,KAAA,GAAA,OAAA,EAAA,gBAAA,MAAA,Q,mFAAf,GAAe,aAAA,KAAA,KAAA,iB,iFAAf,GAAe,WAAA,E,KAJ3B,EAAK,KAAA,EACJ,KAAM,cACN,WAAY,WCGD,MAAA,GACX,SAAA,CAAU,EAAe,EAAiB,KAOxC,MAAM,EAAO,GAAO,GAAO,OAAO,GAClC,OAAO,C,QATE,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAY,KAAA,GAAA,OAAA,EAAA,gBAAA,MAAA,Q,mFAAZ,GAAY,aAAA,KAAA,KAAA,c,iFAAZ,GAAY,WAAA,E,KAJxB,EAAK,KAAA,EACJ,KAAM,WACN,WAAY,WCkBR,MAAO,WAAgD,GAE3D,WAAA,CACE,EACQ,EACA,GACR,MAAM,GAFE,KAAe,gBAAf,EACA,KAAY,aAAZ,EAuBV,KAAG,IAAsB,KAezB,KAAQ,SAAuB,UAEd,KAAA,kBAAoB,IAAI,GAAwB,IAEhD,KAAA,4BAA8B,IAAI,GAAwB,IAE3E,KAAqB,sBAAyC,GAE9D,KAAA,kBAAoB,GAEZ,KAAa,cAAW,GAQtB,KAAA,qBAAuB,IAAI,EAM7B,KAAe,gBAAsB,GAErC,KAAgB,iBAA+B,KAM/C,KAAkB,mBAAiC,I,CAlE3D,QAAA,GACE,KAAK,4BAA4B,UAAU,CACzC,KAAO,IACL,GAAI,EAAI,CACN,KAAK,wBAAwB,EAAI,KAAK,S,KAK5C,KAAK,kBAAkB,UAAU,CAC/B,KAAO,IACL,KAAK,4BAA4B,KAAK,GACtC,KAAK,iCAAiC,EAAI,KAAK,SAAS,G,CAS9D,gBACI,CAAa,GACf,KAAK,kBAAkB,KAAK,GAC5B,KAAK,uBAAuB,EAAI,KAAK,UAErC,KAAK,cAAgB,C,CAGvB,gBAAI,GACF,OAAO,KAAK,a,CAgBd,kBACI,CAAe,GACjB,KAAK,gBAAkB,EACvB,KAAK,kC,CAKP,kBAAI,GACF,OAAO,KAAK,e,CAOd,mBAAI,GACF,OAAO,KAAK,gB,CAKd,qBAAI,GACF,OAAO,KAAK,kB,CAGd,eAAA,CAAgB,GACd,EAAO,SAAW,EAAO,QACzB,GAAI,EAAO,UAAY,MAAO,CAC5B,EAAO,aAAe,K,CAGxB,KAAK,0CAA0C,E,CAGjD,oBAAA,CAAqB,GACnB,EAAO,cAAgB,EAAO,aAC9B,EAAO,QAAU,EAAO,aAExB,KAAK,0CAA0C,E,CAGjD,mBAAA,CAAoB,GAClB,IAAI,EAAY,OAAO,EAAO,YAE9B,GAAI,EAAO,aAAc,CACvB,GAAa,UAAU,KAAK,gBAAgB,UAAU,EAAO,Q,CAE/D,OAAO,C,CAGT,kBAAA,CAAmB,GAEjB,KAAK,eAAe,KAAK,CACvB,KAAM,EAAO,KACb,MAAO,EAAO,aAAe,EAAO,MAAQ,UAC5C,WAAY,EAAO,aAAe,KAAK,gBAAgB,EAAQ,MAAQ,UACvE,GAAI,EAAO,GACX,UAAW,KAAK,oBAAoB,I,CAIxC,qBAAA,CAAsB,EAAuC,GAE3D,KAAK,eAAe,GAAS,IACxB,KAAK,eAAe,GACvB,KAAM,EAAO,KACb,MAAO,EAAO,aAAe,EAAO,MAAQ,UAC5C,WAAY,EAAO,aAAe,KAAK,gBAAgB,EAAQ,MAAQ,UACvE,UAAW,KAAK,oBAAoB,G,CAKhC,cAAA,CAAe,EAAe,GACpC,MAAM,EAAa,KAAK,IAAI,GAAI,GAChC,OAAO,KAAK,MAAM,EAAQ,GAAc,C,CAG1C,iBAAA,CAAkB,GAGhB,GAAI,EAAU,QAAU,MAAQ,EAAU,QAAU,UAAW,CAC7D,OAAO,KAAK,iBAAiB,QAAQ,e,MAChC,GAAI,EAAU,QAAU,GAAI,CACjC,OAAO,KAAK,iBAAiB,QAAQ,e,CAEvC,OAAO,OAAO,EAAU,M,CAG1B,eAAA,CAAgB,EAA0C,EAA6B,OAGrF,GAAI,EAAU,QAAU,MAAQ,EAAU,QAAU,UAAW,CAC7D,OAAO,EAAoB,KAAK,iBAAiB,QAAQ,gBAAkB,K,CAG7E,GAAI,EAAU,QAAU,GAAI,CAC1B,OAAO,EAAoB,KAAK,iBAAiB,QAAQ,gBAAkB,I,CAG7E,GAAI,GAAW,UAAY,eAAiB,EAAU,WAAY,CAChE,MAAM,EAAiB,OAAO,EAAU,WAAW,OAAO,EAAU,SACpE,OAAO,C,CAIT,IAAK,GACH,EAAU,OAAS,UACnB,EAAU,gBACF,EAAe,QAAM,SAAU,CACvC,MAAM,EAAe,KAAK,eAAe,EAAU,MAAO,EAAU,SACpE,OAAO,OAAO,E,CAGhB,GAAI,GAAW,UAAY,WAAY,CACrC,OAAQ,EAAU,QAAU,EAAK,OAAS,O,CAI5C,GAAI,GAAW,OAAS,mBAAsB,EAAe,QAAM,SAAU,CAC3E,OAAO,KAAK,aAAa,UAAU,EAAU,M,CAG/C,OAAO,OAAO,EAAU,M,CAG1B,yCAAA,CAA0C,GACxC,MAAM,EAAQ,KAAK,eAAe,WAAU,GAAK,EAAE,KAAO,EAAO,KAEjE,GAAI,GAAS,EAAG,CACd,GAAI,EAAO,UAAY,OAAS,EAAO,eAAiB,MAAO,CAG7D,KAAK,eAAe,OAAO,EAAO,E,KAC7B,CAGL,KAAK,sBAAsB,EAAQ,E,CAErC,KAAK,qBAAqB,KAAK,KAAK,e,MAGjC,GAAI,KAAK,eAAe,OAAS,GAAmB,CAEvD,KAAK,mBAAmB,GACxB,KAAK,qBAAqB,KAAK,KAAK,e,EAIxC,iCAAA,CAAkC,GAChC,KAAK,kBAAkB,KAAK,EAAK,G,CAGnC,iCAAA,CAAkC,GAChC,KAAK,4BAA4B,KAAK,EAAK,G,CAGrC,uBAAA,CAAwB,EAAkB,GAChD,KAAK,sBAAsB,EAAU,IAAW,UAAU,CAMxD,KAAO,IAEL,KAAK,sBAAwB,KAAK,mCAAmC,GACrE,KAAK,kCAAkC,EAEzC,MAAO,KACL,KAAK,sBAAwB,EAAE,G,CAQ7B,kCAAA,CAAmC,GAEzC,MAAM,EAAoD,GAC1D,IAAI,EAAwB,KAC5B,GAAI,EAAe,yBAA0B,CAC3C,EAAwB,EAAe,wB,CAGzC,IAAK,EAAe,WAAY,CAC9B,OAAO,C,CAGT,MAAM,EAAe,EAAe,WACpC,IAAK,MAAO,EAAW,KAAkB,OAAO,QAAQ,GAAe,CAErE,MAAM,EAA+C,CACnD,KAAM,EACN,SAAU,MACV,WAAY,IAGd,GAAI,IAAwB,GAAY,CACtC,EAAS,KAAO,EAAsB,E,CAGxC,IAAK,EAAe,CAClB,Q,CAGF,IAAK,MAAM,KAAU,OAAO,OAAO,GAAgB,CAEjD,MAAM,EAA2C,CAC/C,GAAI,EAAO,GACX,KAAM,EAAO,KACb,YAAa,EAAO,YACpB,MAAO,EAAO,MACd,aAAc,EAAO,aACrB,KAAM,EAAO,KACb,QAAS,MACT,aAAc,MACd,MAAO,EAAO,OAIhB,GAAI,EAAO,QAAS,CAClB,EAAU,QAAU,EAAO,O,CAE7B,GAAI,EAAO,aAAc,CACvB,EAAU,aAAe,EAAO,Y,CAElC,GAAI,EAAO,KAAM,CACf,EAAU,KAAO,EAAO,I,CAE1B,GAAI,EAAO,QAAS,CAClB,EAAU,QAAU,EAAO,O,CAE7B,GAAI,EAAO,eAAgB,CACzB,EAAU,WAAa,EAAO,c,CAGhC,EAAS,WAAW,KAAK,E,CAG3B,EAAO,KAAK,E,CAGd,OAAO,C,CAGD,gCAAA,GACN,KAAK,sBAAsB,SAAQ,IACjC,EAAM,WAAW,SAAQ,IACvB,MAAM,EAAW,KAAK,gBAAgB,MAAK,GAAK,EAAE,IAAM,EAAO,KAC/D,GAAI,EAAU,CACZ,EAAO,QAAU,KACjB,EAAO,aAAe,EAAS,QAAU,S,KACpC,CACL,EAAO,QAAU,MACjB,EAAO,aAAe,K,IAExB,G,CAIE,qBAAA,CAAsB,EAAkB,GAC9C,IAAK,KAAK,IAAK,CACb,M,CAGF,OAAO,GAAK,KAAK,IAAI,QAAQ,IAAI,EAAU,EAAU,IAAK,UAAW,MAAO,W,CAGtE,oBAAA,CAAqB,EAAkB,GAC7C,IAAK,KAAK,IAAK,CACb,M,CAGF,OAAO,GAAK,KAAK,IAAI,QAAQ,YAAY,EAAU,EAAU,MAAO,MAAO,W,CAGrE,qCAAA,CAAsC,EAAkB,GAC9D,IAAK,KAAK,IAAK,CACb,M,CAGF,OAAO,GAAK,KAAK,IAAI,QAAQ,6BAA6B,EAAU,G,CAG9D,gCAAA,CAAiC,EAAkB,GACzD,KAAK,sCAAsC,EAAU,IAAW,UAAU,CACxE,KAAO,IACL,GAAI,EAAe,CACjB,MAAM,EAAe,GAA6B,mBAAmB,GACrE,GAAI,GAAc,UAAU,OAAQ,CAClC,KAAK,mBAAqB,C,KACrB,CACL,KAAK,mBAAqB,I,MAO5B,sBAAA,CAAuB,EAAkB,GAC/C,KAAK,qBAAqB,EAAU,IAAW,UAAU,CACvD,KAAO,IACL,GAAI,EAAe,CACjB,KAAK,iBAAmB,GAA2B,mBAAmB,E,YAzWnE,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAuC,KAAA,EAAA,MAAA,EAAA,kBAAA,CAAA,MAAA,IAAA,CAAA,MAAA,KAAA,OAAA,EAAA,gBAAA,WAAA,QAAvC,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAJA,aAAA,KAAA,SAAA,wCAAA,OAAA,CAAA,IAAA,MAAA,aAAA,eAAA,SAAA,WAAA,eAAA,kBAAA,QAAA,CAAA,qBAAA,wBAAA,UAAA,CAAC,GAAiB,ICnB/B,gBAAA,KAAA,SAAA,EAAA,SAAA,ssHDkBY,OAAA,q0GAAA,aAAA,EAAA,KAAA,YAAA,KAAA,GAA+B,SAAA,+BAAA,KAAA,YAAA,KAAA,GAAuB,SAAA,sBAAA,OAAA,aAAA,QAAA,qBAAA,KAAA,WAAA,KAAE,GAAiB,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,KAAA,YAAA,KAAA,GAA+B,SAAA,+BAAA,OAAA,kDAAA,QAAA,8CAAA,KAAA,YAAA,KAAE,GAAuC,SAAA,wCAAA,OAAA,sBAAA,QAAA,sB,iFAKhJ,GAAuC,WAAA,E,KAPnD,EACW,KAAA,EAAA,SAAA,wCAAuC,QACxC,CAAC,GAA+B,GAAyB,EAAiB,GAAiC,IAAwC,UACjJ,CAAC,GAAiB,IAAa,SAAA,ssHAAA,OAAA,y0GAgC1C,eAAA,MAAA,KAAA,EAAA,kBAAA,CAAA,KAAA,IAAA,CAAA,KAAA,KAAA,eAAA,CAAA,IAAG,EADF,KAAA,IAIG,aAAY,EADf,KAAA,IAaD,SAAQ,EADP,KAAA,IAcG,eAAc,EADjB,KAAA,IAMS,qBAAoB,EAA7B,KAAA,OElEU,MAAA,GATb,WAAA,GAYuC,KAAa,cAAoC,KActF,KAAA,sBAAwB,EAAe,OAQ9B,KAAwB,yBAAW,GACnC,KAAuB,wBAAW,GAMjC,KAAA,qBAAuB,IAAI,EAC3B,KAAA,kBAAoB,IAAI,EACxB,KAAA,iBAAmB,IAAI,EACvB,KAAA,cAAgB,IAAI,EA4CtB,KAAa,cAAgD,KAC7D,KAAS,UAAe,GACxB,KAAgB,iBAAoB,GACpC,KAAqB,sBAAyB,GAC9C,KAAgB,iBAAa,EAwGtC,CAtLC,gBACI,CAAa,GACf,KAAK,cAAgB,EACrB,KAAK,iB,CAGP,mBACI,CAAgB,GAClB,KAAK,iBAAmB,EACxB,KAAK,sB,CAOA,oBAAA,GACL,KAAK,sBAAsB,IAAI,M,CAMjC,YAAI,GACF,OAAO,KAAK,S,CAUd,eAAA,GACE,GAAI,KAAK,WAAa,KAAK,UAAU,OAAS,EAAG,CAC/C,KAAK,qBAAqB,KAAK,UAAU,G,EAI7C,mBAAA,CAAoB,GAClB,KAAK,qBAAqB,KAAK,EAAM,KAAI,GAAK,EAAE,K,CAGlD,oBAAA,CAAqB,GACnB,OAAO,KAAK,sBAAsB,E,CAGpC,oBAAA,CAAqB,GACnB,KAAK,kBAAkB,KAAK,EAAK,G,CAGnC,oBAAA,CAAqB,GACnB,KAAK,iBAAiB,KAAK,EAAK,G,CAGlC,oBAAA,CAAqB,GACnB,KAAK,cAAc,KAAK,EAAK,G,CAG/B,mBAAA,GACE,GAAI,KAAK,SAAS,SAAW,EAC3B,OAEF,KAAK,qBAAqB,KAAK,UAAU,G,CAG3C,iBAAA,GACE,KAAK,cAAgB,KACrB,KAAK,UAAY,E,CAaX,oBAAA,GAEN,MAAM,EAAoB,GAE1B,IAAK,MAAM,KAAM,KAAK,iBAAkB,CACtC,MAAM,EAAW,KAAK,iBAAiB,GACvC,GAAI,EAAU,CACZ,EAAM,KAAK,E,EAIf,KAAK,eAAe,kBAEpB,IAAK,MAAM,KAAQ,EAAO,CACxB,KAAK,eAAe,YAAY,EAAK,G,EAKjC,qBAAA,GACN,KAAK,sBAAwB,GAC7B,KAAK,cAAc,KAAK,SAAS,G,CAG3B,aAAA,CAAc,GACpB,GAAI,EAAK,UAAY,EAAK,WAAa,aACrC,OAAO,EAET,IAAI,EAAQ,EACZ,IAAK,EAAK,SACR,OAAO,EAET,IAAK,MAAM,KAAS,EAAK,SAAU,CACjC,IAAK,EACH,SAEF,GAAS,KAAK,cAAc,E,CAG9B,KAAK,sBAAsB,EAAK,IAAM,EACtC,OAAO,C,CAGD,eAAA,GACN,IAAK,KAAK,cAAe,CACvB,M,CAGF,KAAK,iBAAmB,GACxB,KAAK,UAAY,CAAC,KAAK,+BAA+B,KAAK,cAAc,UAAW,KAAK,mBACzF,KAAK,uB,CAGC,8BAAA,CAA+B,EAA4B,EAA2C,WAE5G,MAAM,EAAqB,CACzB,KAAM,EAAK,KACX,GAAI,EAAK,GACT,OAAQ,EAAK,QAGf,GAAI,EAAK,SAAU,CACjB,EAAS,SAAW,GACpB,IAAK,MAAM,KAAS,EAAK,SAAU,CACjC,MAAM,EAAgB,KAAK,+BAA+B,EAAO,GACjE,EAAS,SAAS,KAAK,E,EAI3B,IAAK,EAAS,OAAQ,CACpB,EAAS,SAAW,U,MACf,GAAI,EAAK,OAAS,YAAa,CACpC,EAAS,SAAW,e,KACf,CACL,EAAS,SAAW,Y,CAGtB,GAAI,EAAa,CACf,EAAY,EAAS,IAAM,C,CAG7B,OAAO,C,CAGD,oBAAA,CAAqB,GAC3B,GAAI,EAAK,SAAU,CACjB,IAAK,MAAM,KAAS,EAAK,SAAU,CACjC,GAAI,EAAM,UAAY,EAAM,WAAa,aAAc,CACrD,M,KACK,CACL,KAAK,qBAAqB,E,GAMhC,KAAK,eAAe,YAAY,EAAK,G,QAvL5B,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA2B,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAA3B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAGA,aAAA,KAAA,SAAA,2BAAA,OAAA,CAAA,aAAA,CAAA,kBAAA,eAAA,WAAA,eAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,gBAAA,CAAA,kBAAA,kBAAA,WAAA,kBAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,sBAAA,CAAA,kBAAA,wBAAA,WAAA,wBAAA,SAAA,KAAA,WAAA,MAAA,kBAAA,MAAA,yBAAA,CAAA,kBAAA,2BAAA,WAAA,2BAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,MAAA,wBAAA,CAAA,kBAAA,0BAAA,WAAA,0BAAA,SAAA,MAAA,WAAA,MAAA,kBAAA,OAAA,QAAA,CAAA,sBAAA,8BAAA,qBAAA,uBAAA,kBAAA,oBAAA,iBAAA,mBAAA,cAAA,iBAAA,YAAA,EAAA,aAAA,gBAAA,MAAA,KAAA,UAAA,GAAwB,YAAA,OAAA,SAAA,EAAA,SCrBrC,6xCDYI,OAAA,gtBAAA,aAAA,EAAA,KAAA,YAAA,KAAA,GACA,SAAA,wBAAA,OAAA,0RAAA,QAAA,oDAAA,KAAA,YAAA,KAAA,GAA8B,SAAA,8BAAA,OAAA,oBAAA,QAAA,sB,iFAKrB,GAA2B,WAAA,E,KATvC,EACW,KAAA,EAAA,SAAA,2BACD,QAAA,CACP,GACA,IACD,SAAA,6xCAAA,OAAA,otBAOoC,eAAA,CAAA,cAAa,E,KAAjD,E,MAAU,MAGP,aAAY,EADf,KAAA,IAOG,gBAAe,EADlB,KAAA,IAcQ,yBAAwB,EAAhC,KAAA,IACQ,wBAAuB,EAA/B,KAAA,IAMS,qBAAoB,EAA7B,KAAA,IACS,kBAAiB,EAA1B,KAAA,IACS,iBAAgB,EAAzB,KAAA,IACS,cAAa,EAAtB,KAAA,OEnDH,MAAM,GAAqB,8BAEd,MAAA,GAEX,WAAA,CAAY,EAAuB,GAAI,EAA4B,GAS3D,KAAa,cAAW,GACxB,KAAkB,mBAAW,EATnC,KAAK,cAAgB,EACrB,KAAK,mBAAqB,C,CAG5B,gBAAI,GACF,OAAO,KAAK,a,CAMd,kBAAA,CAAmB,GACjB,KAAK,cAAgB,MAAM,KAE3B,IAAK,MAAM,KAAa,EAAU,CAChC,KAAK,eAAiB,EAAU,S,CAGlC,OAAO,KAAK,a,CAGd,mCAAA,CAAoC,GAClC,MAAM,EAAyC,GAC/C,IAAK,MAAM,KAAa,EAAU,CAChC,GAAI,EAAU,IAAM,EAAU,KAC5B,EAAe,EAAU,IAAM,EAAU,I,CAG7C,OAAO,C,CAGT,gBAAA,CAAiB,EAAqD,WACpE,MAAM,EAA8B,GAEpC,IAAI,EAA8B,MAElC,MAAM,EAAQ,KAAK,cAAc,MAAM,OACvC,IAAK,MAAM,KAAQ,EAAO,CACxB,GAAI,EAAK,SAAW,EAAG,CACrB,Q,CAGF,GAAI,EAAK,SAAS,MAAwB,EAA6B,CACrE,EAA8B,KAC9B,Q,CAGF,EAAS,KAAK,KAAK,sBAAsB,EAAM,IAC/C,GAAI,EAAS,SAAW,KAAK,mBAAoB,CAC/C,K,EAIJ,OAAO,C,CAGD,qBAAA,CAAsB,EAAmB,EAAqD,WACpG,IAAI,EAAO,EACX,IAAI,EAAyB,UAE7B,MAAM,EAAoB,EAAU,QAAQ,KAC5C,MAAM,EAAqB,EAAU,QAAQ,KAE7C,GAAI,GAAqB,GAAK,GAAsB,GAAK,EAAqB,EAAmB,CAC/F,MAAM,EAAa,EAAU,MAAM,EAAoB,EAAG,GAC1D,EAAK,EACL,GAAI,GAAc,EAAgB,CAChC,MAAM,EAAiB,EAAe,GACtC,GAAI,EAAgB,CAClB,EAAO,C,QAGN,GAAI,EAAU,SAAS,KAAM,CAClC,MAAM,EAAW,EAAU,MAAM,KACjC,EAAO,EAAS,EAAS,OAAS,E,CAGpC,MAAO,CACL,KAAM,EACN,UAAW,MAAQ,EACnB,GAAI,E,ECpFG,MAAA,GAEX,8CAAO,CAAwC,EAAmB,EAA6B,EAAsC,GACnI,MAAM,GAAe,EAAO,GAC5B,IAAI,EAAW,EAAO,GAAK,EAAO,GAAK,GAEvC,IAAI,EAAuE,KAE3E,IAAK,EAAa,CAChB,EAAc,GAAK,EAAI,cAAc,sBAAsB,EAAW,KAAK,UAAU,KAAmB,KACtG,IAAU,IACR,IAAK,GAAc,GAAI,CACrB,MAAM,IAAI,MAAM,oC,CAElB,OAAO,GAAK,EAAI,cAAc,4BAA4B,EAAa,GAAI,EAAU,UAAW,WAAW,I,KAG1G,CACL,EAAc,GAAK,EAAI,cAAc,KAAK,KAAK,UAAU,GAAS,IAAY,KAC5E,IAAU,IACR,IAAK,GAAW,GAAI,CAClB,MAAM,IAAI,MAAM,2C,CAGlB,EAAW,EAAU,GAErB,OAAO,GAAK,EAAI,cAAc,sBAAsB,EAAW,KAAK,UAAU,IAAkB,IAElG,IAAU,IACR,IAAK,GAAc,GAAI,CACrB,MAAM,IAAI,MAAM,oC,CAElB,OAAO,GAAK,EAAI,cAAc,4BAA4B,EAAa,GAAI,EAAU,UAAW,YAAY,KAC1G,IAAK,IACH,EAAI,cAAc,OAAO,GACzB,OAAO,CAAY,IAEtB,I,CAIP,OAAO,C,ECDL,MAAO,WAAwC,GAEnD,WAAA,CAAY,GACV,MAAM,GAIgC,KAAkB,mBAAuC,KAGjG,KAAqB,sBAAY,MAGjC,KAAiB,kBAAkC,GAqBnD,KAAA,yBAA2B,IAAI,GAAoC,MACnE,KAAA,qBAAuB,IAAI,GAA6C,MAmBxE,KAAO,QAAyC,KAEhD,KAAc,eAAuB,GACrC,KAAqB,sBAAa,MAClC,KAAiB,kBAAW,GAG5B,KAAG,IAAuB,KAG1B,KAAS,UAAY,GAEkB,KAAgB,iBAAY,KAEnE,KAA4B,6BAAG,IAAI,GAA6C,GAA4B,MAG5G,KAAA,mCAAqC,IAAI,EAGzC,KAAgB,iBAAmB,KAGnC,KAAgB,iBAAwB,UAGxC,KAAe,gBAAc,GAG7B,KAAe,gBAAgC,KAO/C,KAAA,mCAAqC,IAAI,EAGzC,KAAA,gCAAkC,IAAI,EAGtC,KAAA,+BAAiC,IAAI,EAGrC,KAAA,4BAA8B,IAAI,EAGlC,KAAA,oBAAsB,IAAI,EAE1B,KAAA,4BAA8B,GAEvB,KAAgB,iBAAG,MAEnB,KAAuB,wBAAG,MAIzB,KAAa,cAAiD,KAC9D,KAAY,aAAuB,E,CAlG3C,eACI,CAAY,GACd,KAAK,aAAe,EACpB,GAAG,KAAK,aAAa,OAAQ,EAC3B,KAAK,iBAAmB,KAAK,aAAa,E,CAG9C,eAAI,GACF,OAAO,KAAK,Y,CAGd,oBAAI,CAAiB,GACnB,KAAK,yBAAyB,KAAK,E,CAGrC,oBAAI,GACF,OAAO,KAAK,yBAAyB,U,CAMvC,gBAAI,CAAa,GAGf,KAAK,sBAAwB,KAE7B,GAAG,IAAW,EAAO,GAAG,CACtB,KAAK,8BAA8B,E,CAGrC,KAAK,qBAAqB,KAAK,E,CAGjC,gBAAI,GACF,OAAO,KAAK,qBAAqB,U,CAmCnC,gBAAI,GACF,OAAO,KAAK,a,CA+Bd,QAAA,GAEE,KAAK,yBAAyB,UAAU,CACtC,KAAO,IACL,IAAI,KAAK,YAAc,KAAK,MAAQ,EAAE,CACpC,M,CAGF,GAAI,KAAK,cAAe,CAGtB,KAAK,wBAA0B,I,CAGjC,KAAK,aAAe,KAEpB,KAAK,wBAAwB,KAAK,UAAW,EAAE,KAAK,UAAU,CAC1D,KAAO,IACL,KAAK,QAAU,CAAC,KAAK,2BAA2B,EAAE,OAAQ,GAC1D,KAAK,aAAe,KAAK,QAAQ,GACjC,KAAK,4BAA4B,EAEnC,MAAO,IAAQ,MAAM,IAAI,MAAO,EAAI,GAEvC,IAGL,KAAK,qBAAqB,UAAU,CAClC,KAAO,IACL,IAAI,EACF,OAEF,KAAK,eAAiB,KAAK,kBAAkB,GAC7C,KAAK,4BAA4B,IAIrC,KAAK,6BAA6B,UAAU,CAC1C,KAAO,IACL,KAAK,mCAAmC,KAAK,EAAE,IAInD,GAAI,KAAK,YAAY,OAAS,EAAE,CAC9B,KAAK,iBAAmB,KAAK,YAAY,E,EAI7C,uBAAA,CAAwB,EAAoB,GAC1C,IAAI,KAAK,IAAI,CACX,M,CAEF,OAAO,GAAK,KAAK,IAAI,cAAc,IAAI,EAAQ,G,CAGjD,iBAAA,CAAkB,GAChB,MAAM,EAAe,IAAI,GAAa,EAAO,aAAc,KAAK,mBAChE,OAAO,EAAa,iBAAiB,EAAO,e,CAG9C,qBAAA,CAAsB,GACpB,KAAK,eAAe,OAAO,EAAO,GAClC,KAAK,eAAiB,IAAI,KAAK,gBAE/B,KAAK,sBAAwB,KAC7B,KAAK,8B,CAGP,8BAAA,CAA+B,GAC7B,MAAM,EAAa,KAAK,6BAA6B,aAAe,EACpE,KAAK,6BAA6B,KAAK,EAAa,GAA4B,KAAO,GACvF,KAAK,2BAA2B,E,CAGlC,mBAAA,GAGE,OAAO,KAAK,eAAe,SAAW,IAAO,KAAK,qB,CAGpD,WAAA,GACE,KAAK,0BAA0B,OAC/B,KAAK,6BAA6B,KAAK,GAA4B,MACnE,KAAK,cAAgB,KAErB,KAAK,wBAA0B,MAG/B,GAAG,KAAK,eAAiB,KAAK,aAAa,GAAG,CAC5C,KAAK,aAAa,cAAe,IAAI,IAAe,mBAAmB,KAAK,e,CAG9E,GAAG,KAAK,gBAAgB,CACtB,KAAK,4BAA4B,KAAK,a,EAI1C,kCAAA,CAAmC,GACjC,KAAK,mCAAmC,KAAK,E,CAG/C,qCAAA,CAAsC,GACpC,KAAK,gCAAgC,KAAK,E,CAG5C,oCAAA,CAAqC,GACnC,KAAK,+BAA+B,KAAK,E,CAG3C,iCAAA,CAAkC,GAChC,KAAK,4BAA4B,KAAK,E,CAGxC,yBAAA,CAA0B,GACxB,KAAK,oBAAoB,KAAK,E,CAGhC,wBAAA,GAEE,KAAK,sBAAwB,I,CAG/B,4BAAA,GAEE,GAAG,KAAK,cAAc,IAAM,KAAK,QAAQ,CAGvC,KAAK,QAAQ,GAAG,cAAe,IAAI,IAAe,mBAAmB,KAAK,gBAC1E,KAAK,QAAQ,GAAG,gBAAiB,IAAI,IAAe,oCAAoC,KAAK,gBAE7F,KAAK,qBAAqB,KAAK,KAAK,QAAQ,G,EAMxC,2BAAA,CAA4B,GAElC,IAAI,KAAK,MAAQ,KAAK,kBAAoB,EAAa,CACrD,M,CAGF,KAAK,gBAAgB,UAAY,KACjC,KAAK,gBAAgB,UAAU,UAAY,KAE3C,KAAK,iBAAmB,KAExB,GAAuB,wCAAwC,KAAK,UAAW,EAAc,KAAK,gBAAiB,KAAK,KAAK,UAAU,CACrI,KAAO,IACL,KAAK,cAAgB,EACrB,KAAK,iBAAmB,MAExB,KAAK,sBAAwB,KAAK,G,CAKhC,6BAAA,CAA8B,GACpC,MAAM,EAAe,uCACrB,EAAO,aAAe,OAAO,WAC7B,EAAO,eAAiB,GACxB,EAAO,eAAe,GAAgB,M,CAGhC,0BAAA,CAA2B,GAEjC,MAAM,EAAS,CACb,OAAQ,uCACR,SAAU,GACV,aAAc,EACd,KAAM,gBACN,aAAe,GACf,UAAW,MACX,oBAAqB,OAGvB,KAAK,8BAA8B,GACnC,OAAO,C,CAGD,0BAAA,GACN,GAAG,KAAK,cAAgB,KAAK,aAAa,GAAG,CAE3C,KAAK,a,KACA,CAEL,GAAI,KAAK,iBAAkB,CACzB,KAAK,+BAA+B,GAA4B,uB,KAC3D,CACL,KAAK,oBAAoB,mB,+FAlTpB,GAA+B,KAAA,EAAA,MAAA,EAAA,mBAAA,OAAA,EAAA,gBAAA,WAAA,QAA/B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAOA,aAAA,KAAA,SAAA,+BAAA,OAAA,CAAA,sBAAA,wBAAA,kBAAA,oBAAA,YAAA,cAAA,QAAA,UAAA,IAAA,MAAA,UAAA,YAAA,iBAAA,mBAAA,iBAAA,mBAAA,gBAAA,kBAAA,gBAAA,mBAAA,QAAA,CAAA,mCAAA,qCAAA,mCAAA,qCAAA,gCAAA,kCAAA,+BAAA,iCAAA,4BAAA,8BAAA,oBAAA,uBAAA,KAAA,CAAA,WAAA,oDAAA,YAAA,EAAA,aAAA,qBAAA,MAAA,KAAA,UAAA,GClDb,YAAA,OAAA,gBAAA,KAAA,SAAA,EAAA,SAAA,ijNDyBY,OAAA,82kBAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GACR,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,mBAAA,OAAA,6CAAA,KAAA,YAAA,KAAA,EAAA,KAAA,SAAA,SAAA,OAAA,iCAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,YAAA,KAAA,EAAA,gBAAA,SAAA,8CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,sDAAA,OAAA,+CAAA,QAAA,kBAAA,SAAA,cAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,YAAA,KAAA,EAAA,kBAAA,SAAA,YAAA,OAAA,ovBAAA,QAAA,kGAAA,KAAA,YAAA,KAAA,EAAA,kBAAA,SAAA,YAAA,OAAA,uBAAA,KAAA,YAAA,KAAA,GACA,SAAA,uBAAA,OAAA,uBAAA,QAAA,sBAAA,KAAA,YAAA,KAAA,GACA,SAAA,sBAAA,OAAA,aAAA,QAAA,qBAAA,KAAA,YAAA,KAAA,GACA,SAAA,+BAAA,KAAA,YAAA,KAAA,GACA,SAAA,uCAAA,KAAA,YAAA,KAAA,GACA,SAAA,qCAAA,OAAA,8CAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,KAAA,YAAA,KAAA,GACA,SAAA,wCAAA,OAAA,mDAAA,QAAA,2BAAA,KAAA,YAAA,KAAA,GACA,SAAA,2BAAA,OAAA,4CAAA,QAAA,oCAAA,KAAA,YAAA,KAAA,GACA,SAAA,2BAAA,OAAA,gHAAA,QAAA,gHAAA,KAAA,YAAA,KAAA,GAAmC,SAAA,qCAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAM1B,GAA+B,WAAA,E,KApB3C,EACW,KAAA,EAAA,SAAA,+BAA8B,QAC/B,CAAC,EACR,EACA,EACA,GACA,GACA,GACA,GACA,GACA,EACA,GACA,GACA,GACA,IAIa,cAAA,EAAkB,UAAS,SAAA,ijNAAA,OAAA,k3kBASF,eAAA,MAAA,KAAA,EAAA,mBAAA,eAAA,CAAA,mBAAkB,E,KAAzD,E,MAAU,MAGX,sBAAqB,EADpB,KAAA,IAID,kBAAiB,EADhB,KAAA,IAIG,YAAW,EADd,KAAA,IAuCD,QAAO,EADN,KAAA,IAQD,IAAG,EADF,KAAA,IAID,UAAS,EADR,KAAA,IAGsC,iBAAgB,E,KAAtD,E,MAAY,4BAKb,mCAAkC,EADjC,KAAA,IAID,iBAAgB,EADf,KAAA,IAID,iBAAgB,EADf,KAAA,IAID,gBAAe,EADd,KAAA,IAID,gBAAe,EADd,KAAA,IAQD,mCAAkC,EADjC,KAAA,IAID,gCAA+B,EAD9B,KAAA,IAID,+BAA8B,EAD7B,KAAA,IAID,4BAA2B,EAD1B,KAAA,IAID,oBAAmB,EADlB,KAAA,OE3HU,MAAA,GAEX,WAAA,CAAoB,GAAA,KAAE,GAAF,EASX,KAAA,gBAA0C,CACjD,KAAM,EACN,KAAM,GAGC,KAAW,YAAuB,GAElC,KAAiB,kBAAY,MAC5B,KAAA,wBAA0B,IAAK,EAW/B,KAAY,aAAW,EACvB,KAAa,cAAW,EA5BhC,KAAK,SAAW,KAAK,GAAG,cAAc,U,CAItC,WAAW,GACT,OAAO,KAAK,Q,CAaN,aAAA,GACR,KAAK,kBAAoB,MACzB,KAAK,wBAAwB,KAAK,KAAK,kB,CAUzC,iBAAI,GACF,OAAO,KAAK,qB,CAGd,iBAAa,CAAc,GACzB,KAAK,sBAAwB,EAC7B,IAAI,KAAK,sBAAuB,CAC9B,M,CAGF,KAAK,gBAAkB,IAAI,gBAAe,IACxC,IAAK,MAAM,KAAS,EAAS,CAC3B,MAAM,MAAE,EAAK,OAAE,GAAW,EAAM,YAChC,KAAK,aAAe,EACpB,KAAK,cAAgB,C,KAIzB,KAAK,gBAAgB,QAAQ,KAAK,sBAAsB,c,CAG1D,uCAAA,CAAwC,EAA2B,GACjE,OAAQ,EAAiB,EAAI,EAAiB,MAAQ,EAAgB,EAAI,EAAgB,MAAS,C,CAErG,uCAAA,CAAwC,EAA2B,GACjE,OAAQ,EAAiB,EAAI,EAAiB,OAAS,EAAgB,EAAI,EAAgB,OAAU,C,CAGvG,uBAAA,CAAwB,EAAiB,EAAmB,EAAiB,GAC3E,IAAI,KAAK,sBAAuB,CAC9B,M,CAEF,MAAM,EAAkB,KAAK,SAAS,cAAc,oBACpD,IAAI,EAAiB,CACnB,M,CAEF,MAAM,EAAoB,EAAgB,wBAC1C,MAAM,EAAmB,KAAK,sBAAsB,cAAc,wBAClE,GAAG,KAAK,IAAI,EAAkB,EAAI,EAAkB,MAAQ,EAAU,EAAiB,MAAQ,EAAG,CAChG,KAAK,gBAAgB,KAAO,KAAK,gBAAgB,KAAO,GAAW,EAAkB,EAAI,EAAkB,OAC3G,YAAW,KACT,KAAK,wBAAwB,EAAS,EAAU,EAAS,EAAS,GACjE,E,MACE,GAAG,GAAY,KAAK,IAAI,EAAkB,EAAI,EAAkB,OAAS,EAAU,EAAiB,KAAO,EAAG,CACnH,YAAW,KACT,KAAK,wBAAwB,EAAS,EAAU,EAAS,EAAS,GACjE,E,MACE,GAAG,KAAK,wCAAwC,EAAmB,GAAmB,CAC3F,KAAK,gBAAgB,KAAO,KAAK,gBAAgB,KAAO,EAAkB,OAC1E,YAAW,KACT,KAAK,wBAAwB,EAAS,EAAU,EAAS,KAAK,GAC7D,E,EAIP,uBAAA,CAAwB,EAAiB,EAAmB,EAAiB,GAC3E,IAAI,KAAK,sBAAuB,CAC9B,M,CAEF,MAAM,EAAkB,KAAK,SAAS,cAAc,oBACpD,IAAI,EAAiB,CACnB,M,CAEF,MAAM,EAAoB,EAAgB,wBAC1C,MAAM,EAAmB,KAAK,sBAAsB,cAAc,wBAClE,GAAG,KAAK,IAAI,EAAkB,EAAI,EAAkB,OAAS,EAAU,EAAiB,KAAO,EAAG,CAChG,KAAK,gBAAgB,KAAO,KAAK,gBAAgB,KAAO,GAAW,EAAkB,EAAI,EAAkB,QAC3G,YAAW,KACT,KAAK,wBAAwB,EAAS,EAAU,EAAS,EAAS,GACjE,E,MACE,GAAG,GAAY,KAAK,IAAI,EAAkB,EAAI,EAAkB,MAAQ,EAAU,EAAiB,MAAQ,EAAG,CACnH,YAAW,KACT,KAAK,wBAAwB,EAAS,EAAU,EAAS,EAAS,GACjE,E,MACE,GAAG,KAAK,wCAAwC,EAAmB,GAAmB,CAC3F,KAAK,gBAAgB,KAAO,KAAK,gBAAgB,KAAO,EAAkB,MAC1E,YAAW,KACT,KAAK,wBAAwB,EAAS,KAAM,EAAS,EAAS,GAC7D,E,EAIP,WAAA,CAAY,GACV,GAAI,EAAQ,qBAAsB,CAChC,IAAI,EAAQ,qBAAqB,aAAc,CAC7C,M,CAEF,YAAW,KACT,IAAI,KAAK,sBAAuB,CAC9B,M,CAEF,MAAM,EAAW,KAAK,gBAAgB,KACtC,MAAM,EAAW,KAAK,gBAAgB,KACtC,MAAM,EAAkB,KAAK,SAAS,cAAc,oBACpD,IAAI,EAAiB,CACnB,M,CAEF,MAAM,EAAoB,EAAgB,wBAC1C,MAAM,EAAmB,KAAK,sBAAsB,cAAc,wBAClE,GAAG,KAAK,wCAAwC,EAAmB,GAAmB,CACpF,KAAK,gBAAgB,KAAO,KAAK,gBAAgB,KAAO,EAAkB,MAC1E,YAAW,KACT,KAAK,wBAAwB,EAAU,KAAM,EAAU,MAAM,GAC5D,E,MACE,GAAG,KAAK,wCAAwC,EAAmB,GAAmB,CAC3F,KAAK,gBAAgB,KAAO,KAAK,gBAAgB,KAAO,EAAkB,OAC1E,YAAW,KACT,KAAK,wBAAwB,EAAU,MAAO,EAAU,KAAK,GAC5D,E,IAEJ,E,8FA/II,GAA8B,KAAA,EAAA,MAAA,EAAA,aAAA,OAAA,EAAA,gBAAA,WAAA,QAA9B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GCrBb,aAAA,KAAA,SAAA,8BAAA,OAAA,CAAA,gBAAA,kBAAA,YAAA,cAAA,kBAAA,oBAAA,cAAA,iBAAA,QAAA,CAAA,wBAAA,2BAAA,cAAA,KAAA,SAAA,EAAA,SAAA,i/CDeY,OAAA,yvFAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GAAc,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,mBAAA,OAAA,6CAAA,KAAA,YAAA,KAAA,EAAA,KAAA,SAAA,SAAA,OAAA,iCAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,cAAA,KAAA,YAAA,KAAA,GAAqB,SAAA,oBAAA,QAAA,mBAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAMlC,GAA8B,WAAA,E,KAR1C,E,gBACW,8BAA6B,QAC9B,CAAC,EAAc,IAAsB,cAG/B,EAAkB,UAAS,SAAA,i/CAAA,OAAA,6vFAcjC,eAAA,MAAA,KAAA,EAAA,aAAA,eAAA,CAAA,gBAAe,EAAvB,KAAA,IAKQ,YAAW,EAAnB,KAAA,IAEQ,kBAAiB,EAAzB,KAAA,IACS,wBAAuB,EAAhC,KAAA,IAkBY,cAAa,EAAzB,KAAA,OE3CG,MAAO,WAAkC,GAC7C,WAAA,CAAY,GACV,MAAM,GAMR,KAAA,eAAiB,CACf,CAAE,KAAK,QAAS,MAAO,0BAA2B,OAAQ,eAC1D,CAAE,KAAK,UAAW,MAAO,4BAA6B,OAAQ,kBAUhE,KAAW,YAAG,MAK0B,KAAO,QAAa,MAKnD,KAAY,aAAY,UAKvB,KAAA,yBAA2B,IAAI,C,CAtBzC,iBAAI,GACF,OAAO,KAAK,eAAe,MAAK,GAAQ,EAAK,MAAQ,KAAK,c,CAwB5D,WAAA,CAAY,GACV,GAAI,EAAQ,oBAAqB,CAC/B,KAAK,kBAAkB,IAAI,EAAQ,oBAAoB,a,EAO3D,gBAAA,CAAkB,GAChB,GAAU,KAAM,2BAA4B,E,CAM9C,aAAA,GACE,KAAK,aAAe,KAAK,W,6FAvDhB,GAAyB,KAAA,EAAA,MAAA,EAAA,mBAAA,OAAA,EAAA,gBAAA,WAAA,QAAzB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAyB,aAAA,KAAA,SAAA,yBAAA,OAAA,CAAA,QAAA,qBAyBhB,GAAgB,aAAA,gBAAA,QAAA,CAAA,yBAAA,4BAAA,UA/BzB,CAAC,GAAiB,gBAAA,KAAA,cAAA,KAAA,SAAA,EAAA,SCT/B,0oCAsCA,OAAA,60KAAA,aAAA,EAAA,KAAA,WAAA,KD9BY,GAAY,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,mBAAA,OAAA,6CAAA,KAAA,WAAA,KAAE,GAAe,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAO5B,GAAyB,WAAA,E,KATrC,EACW,KAAA,EAAA,SAAA,yBACD,QAAA,CAAC,EAAc,GACb,UAAA,CAAC,GAGG,cAAA,EAAkB,UAAS,SAAA,0oCAAA,OAAA,i1KA4BF,eAAA,MAAA,KAAA,EAAA,mBAAA,eAAA,CAAA,QAAO,E,KAA9C,E,MAAM,CAAE,UAAW,MAKX,aAAY,EAApB,KAAA,IAKS,yBAAwB,EAAjC,KAAA,OE3CU,MAAA,GAHb,WAAA,GASmB,KAAW,YAAW,KACvC,KAAgB,iBAAG,IAAI,GAAyB,KAAK,aACrD,KAAA,wBAA0B,IAAI,GAAkC,IAsDxD,KAAiB,kBAAY,SAEtC,CA7DC,oBAAI,CAAiB,GACnB,KAAK,kBAAoB,C,CAM3B,mBAAI,GACF,OAAO,KAAK,iBAAiB,U,CAG/B,0BAAI,CAAuB,GACzB,KAAK,wBAAwB,KAAK,E,CAGpC,0BAAI,GACF,OAAO,KAAK,wBAAwB,U,CAKtC,wBAAM,CAAmB,GACvB,KAAK,iBAAiB,KAAK,SACrB,KAAK,qBAAqB,E,CAGlC,uBAAA,CAAwB,GACtB,MAAM,EAAyB,GAC/B,IAAK,MAAO,EAAK,KAAU,OAAO,QAAQ,KAAK,wBAAyB,CACtE,UAAU,GAAS,UAAY,EAAU,MAAK,GAAG,IAAM,IAAK,CAC1D,EAAI,GAAO,C,EAIf,OAAO,C,CAGT,0BAAM,CAAqB,GACzB,MAAM,QAAa,MAAM,GAAG,KAAK,6BAA6B,UAC9D,MAAM,QAAiB,EAAK,OAE5B,GAAI,IAAS,KAAK,YAAa,CAC7B,MAAM,QAAqB,MAAM,GAAG,KAAK,qCACzC,MAAM,QAAyB,GAAc,UAC7C,MAAM,EAA0B,GAAoB,OAAO,KAAK,GAChE,GAAI,GAAyB,OAAQ,CACnC,IAAK,MAAM,KAAS,EAAyB,CAC3C,MAAM,EAAY,EAAwB,GAC1C,IAAK,EAAS,GAAY,CACxB,EAAS,GAAa,EAAiB,E,IAK/C,KAAK,wBAAwB,KAAK,E,QAzDzB,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAsB,KAAA,GAAA,OAAA,EAAA,gBAAA,YAAA,QAAtB,KAAA,MAAA,EAAA,uBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAsB,WAFrB,QAAM,E,iFAEP,GAAsB,WAAA,E,KAHlC,EAAW,KAAA,EACV,WAAY,aCHF,IAAA,IAAZ,SAAY,GACV,EAAA,sBACA,EAAA,qBACD,EAHD,CAAY,QAGX,KAMY,MAAA,GAJb,WAAA,GAOU,KAAc,eAAuB,IAkD9C,CA9CS,gBAAA,GACN,GAAI,KAAK,eAAgB,CACvB,OAAO,KAAK,c,KACP,CACL,OAAO,KAAK,0B,EAGR,wBAAA,GACN,MAAM,EAAwB,SAAS,eAAe,yBACtD,IAAK,EAAuB,CAC1B,QAAQ,IAAI,kC,CAEd,OAAO,C,CAGD,SAAA,CAAU,GAChB,KAAK,oBAAoB,UAAU,IAAI,E,CAGjC,YAAA,CAAa,GACnB,KAAK,oBAAoB,UAAU,OAAO,E,CAM5C,gBAAA,CAAiB,GACf,KAAK,eAAiB,C,CAGxB,cAAA,CAAe,GACb,GAAI,EAAM,CACR,KAAK,UAAU,GAAW,K,KACrB,CACL,KAAK,aAAa,GAAW,K,EAIjC,cAAA,CAAe,GACb,GAAI,EAAM,CACR,KAAK,UAAU,GAAW,K,KACrB,CACL,KAAK,aAAa,GAAW,K,SAjDtB,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAc,KAAA,GAAA,OAAA,EAAA,gBAAA,YAAA,QAAd,KAAA,MAAA,EAAA,uBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAc,WAHb,QAAM,E,iFAGP,GAAc,WAAA,E,KAJ1B,EAAW,KAAA,EACV,WAAY,aCFD,MAAA,GAQX,WAAA,CAAoB,EAAwB,GAAxB,KAAE,GAAF,EAAwB,KAAQ,SAAR,EANpC,KAAiB,kBAAG,MACpB,KAAW,YAAG,MAEtB,KAAM,OAAW,EACjB,KAAM,OAAW,EAGf,IAAK,KAAK,kBAAmB,OAC7B,KAAK,SAAS,SAAS,KAAK,GAAG,cAAe,SAAU,QACxD,KAAK,SAAS,SAAS,KAAK,GAAG,cAAe,YAAa,O,CAG7D,yBAAa,CAAsB,GACjC,MAAM,EAAU,KAAK,GAAG,cACxB,KAAK,kBAAoB,EACzB,GAAI,EAAW,CACb,KAAK,SAAS,SAAS,EAAS,SAAU,QAC1C,KAAK,SAAS,SAAS,EAAS,YAAa,O,KACxC,CACL,KAAK,SAAS,SAAS,EAAS,SAAU,SAC1C,KAAK,SAAS,SAAS,EAAS,YAAa,O,EAKjD,WAAA,CAAY,GACV,IAAK,KAAK,kBAAmB,OAC7B,KAAK,OAAS,EAAM,QACpB,KAAK,OAAS,EAAM,QACpB,KAAK,YAAc,KACnB,KAAK,SAAS,SAAS,KAAK,GAAG,cAAe,SAAU,YACxD,EAAM,gB,CAIR,SAAA,GACE,IAAK,KAAK,kBAAmB,OAC7B,GAAI,KAAK,YAAa,CACpB,KAAK,YAAc,MACnB,KAAK,SAAS,SAAS,KAAK,GAAG,cAAe,SAAU,O,EAK5D,WAAA,CAAY,GACV,IAAK,KAAK,kBAAmB,OAE7B,GAAI,KAAK,YAAa,CACpB,MAAM,EAAO,KAAK,OAAS,EAAM,QACjC,MAAM,EAAO,KAAK,OAAS,EAAM,QAEjC,KAAK,OAAS,EAAM,QACpB,KAAK,OAAS,EAAM,QAEpB,MAAM,EAAM,KAAK,GAAG,cAAc,UAAY,EAC9C,MAAM,EAAO,KAAK,GAAG,cAAc,WAAa,EAEhD,KAAK,SAAS,SAAS,KAAK,GAAG,cAAe,WAAY,YAC1D,KAAK,SAAS,SAAS,KAAK,GAAG,cAAe,OAAQ,GAAG,OACzD,KAAK,SAAS,SAAS,KAAK,GAAG,cAAe,MAAO,GAAG,M,EAO5D,YAAA,CAAa,GACX,IAAK,KAAK,kBAAmB,OAC7B,KAAK,OAAS,EAAM,cAAc,GAAG,MACrC,KAAK,OAAS,EAAM,cAAc,GAAG,MACrC,KAAK,YAAc,KACnB,KAAK,SAAS,SAAS,KAAK,GAAG,cAAe,SAAU,W,CAI1D,WAAA,CAAY,GACV,IAAK,KAAK,kBAAmB,OAE7B,GAAI,KAAK,YAAa,CACpB,MAAM,EAAO,KAAK,OAAS,EAAM,cAAc,GAAG,MAClD,MAAM,EAAO,KAAK,OAAS,EAAM,cAAc,GAAG,MAElD,KAAK,OAAS,EAAM,cAAc,GAAG,MACrC,KAAK,OAAS,EAAM,cAAc,GAAG,MAErC,MAAM,EAAM,KAAK,GAAG,cAAc,UAAY,EAC9C,MAAM,EAAO,KAAK,GAAG,cAAc,WAAa,EAEhD,KAAK,SAAS,SAAS,KAAK,GAAG,cAAe,WAAY,YAC1D,KAAK,SAAS,SAAS,KAAK,GAAG,cAAe,OAAQ,GAAG,OACzD,KAAK,SAAS,SAAS,KAAK,GAAG,cAAe,MAAO,GAAG,M,EAK5D,UAAA,GACE,IAAK,KAAK,kBAAmB,OAC7B,GAAI,KAAK,YAAa,CACpB,KAAK,YAAc,MACnB,KAAK,SAAS,SAAS,KAAK,GAAG,cAAe,SAAU,O,SArGjD,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA2B,KAAA,EAAA,MAAA,EAAA,YAAA,CAAA,MAAA,EAAA,YAAA,OAAA,EAAA,gBAAA,WAAA,Q,4EAA3B,GAA2B,aAAA,KAAA,SAAA,0BAAA,OAAA,CAAA,sBAAA,yBAAA,KAAA,CAAA,UAAA,CAAA,UAAA,kGAAA,WAAA,6GAAA,SAAA,GAAA,E,iFAA3B,GAA2B,WAAA,E,KAJvC,EAAU,KAAA,EACT,SAAU,0BACV,WAAY,SAgBC,eAAA,MAAA,KAAA,EAAA,YAAA,CAAA,KAAA,EAAA,YAAA,eAAA,CAAA,sBAAqB,EAAjC,KAAA,IAaD,YAAW,E,KADV,E,MAAa,YAAa,CAAC,aAW5B,UAAS,E,KADR,E,MAAa,sBAUd,YAAW,E,KADV,E,MAAa,qBAAsB,CAAC,aAuBrC,aAAY,E,KADX,E,MAAa,aAAc,CAAC,aAU7B,YAAW,E,KADV,E,MAAa,qBAAsB,CAAC,aAqBrC,WAAU,E,KADT,E,MAAa,oBAAqB,CAAC,gBCzFzB,MAAA,GAQX,WAAA,CAA6B,EAA+C,GAA/C,KAAa,cAAb,EAA+C,KAAK,MAAL,EAF5E,KAAK,MAAW,K,CAIhB,QAAA,GACE,KAAK,QAAU,KAAK,cAAc,O,CAGpC,OAAA,GACE,KAAK,cAAc,O,CAGrB,kBAAA,GACE,GAAI,KAAK,QAAS,CAChB,KAAK,MAAM,gBACX,KAAK,Y,EAIT,UAAA,GACE,GAAI,KAAK,QAAS,CAChB,KAAK,gBACL,KAAK,cACL,KAAK,Y,EAID,aAAA,GACN,MAAM,EAAQ,KAAK,SAAS,OAAS,KAAK,QAAQ,MAAM,OAAS,EAAI,KAAK,QAAQ,MAAQ,OAC1F,MAAM,EAAS,KAAK,SAAS,QAAU,KAAK,QAAQ,OAAO,OAAS,EAAI,KAAK,QAAQ,OAAS,OAC9F,KAAK,sBAAsB,cAAc,MAAM,MAAQ,EACvD,KAAK,sBAAsB,cAAc,MAAM,OAAS,C,CAGlD,WAAA,GACN,GAAI,KAAK,SAAS,WAAa,SAAU,CACvC,KAAK,oB,MACA,GAAI,KAAK,SAAS,WAAa,QAAS,CAC7C,KAAK,mB,EAIT,iBAAA,GACE,GAAI,KAAK,QAAS,CAChB,KAAK,sBAAsB,cAAc,MAAM,SAAW,QAC1D,MAAM,EAAM,KAAK,SAAS,iBAAiB,KAAO,IAAM,KAAK,MAC7D,MAAM,EAAS,KAAK,SAAS,iBAAiB,QAAU,IAAM,KAAK,MACnE,MAAM,EAAO,KAAK,SAAS,iBAAiB,MAAQ,IAAM,KAAK,MAC/D,MAAM,EAAQ,KAAK,SAAS,iBAAiB,OAAS,IAAM,KAAK,MAEjE,KAAK,sBAAsB,cAAc,MAAM,SAAW,WAC1D,KAAK,sBAAsB,cAAc,MAAM,IAAM,EACrD,KAAK,sBAAsB,cAAc,MAAM,KAAO,EACtD,KAAK,sBAAsB,cAAc,MAAM,OAAS,EACxD,KAAK,sBAAsB,cAAc,MAAM,MAAQ,EAEvD,KAAK,QAAQ,yBAA2B,KAAK,QAAQ,yBAA2B,KAAK,QAAQ,yBAA2B,MACxH,KAAK,QAAQ,oBAAsB,KAAK,QAAQ,0BAA4B,KAAK,QAAQ,oBAAsB,KAAK,QAAQ,oBAAsB,K,EAItJ,kBAAA,GACE,GAAI,KAAK,QAAS,CAChB,KAAK,sBAAsB,cAAc,UAAY,KAAK,sBAAsB,cAAc,UAAY,UAC1G,KAAK,QAAQ,UAAY,MACzB,KAAK,QAAQ,yBAA2B,KAAK,QAAQ,yBAA2B,KAAK,QAAQ,yBAA2B,KACxH,KAAK,QAAQ,oBAAsB,KAAK,QAAQ,0BAA4B,KAAK,QAAQ,oBAAsB,KAAK,QAAQ,oBAAsB,K,EAI9I,UAAA,GACN,GAAI,KAAK,SAAS,yBAA0B,CAC1C,KAAK,cAAc,cAAc,MAAM,gBAAkB,uC,EAI7D,UAAA,CAAW,GACT,GAAI,EAAM,MAAQ,UAAY,EAAM,MAAQ,MAAO,CACjD,GAAI,KAAK,SAAS,oBAAqB,CACrC,KAAK,cAAc,O,UArFd,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAsC,KAAA,EAAA,MAAA,IAAA,CAAA,MAAA,EAAA,oBAAA,OAAA,EAAA,gBAAA,WAAA,QAAtC,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GCbb,aAAA,KAAA,SAAA,6BAAA,YAAA,EAAA,aAAA,wBAAA,MAAA,KAAA,UAAA,uBAAA,YAAA,OAAA,aAAA,gBAAA,MAAA,KAAA,UAAA,kBAAA,YAAA,OAAA,SAAA,EAAA,SAAA,wcDQY,OAAA,saAAA,aAAA,EAAA,KAAA,YAAA,KAAA,GAA2B,SAAA,0BAAA,OAAA,4BAAA,KAAA,WAAA,KAAE,GAAY,CAAA,KAAA,YAAA,KAAA,EAAA,KAAA,SAAA,SAAA,OAAA,iCAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAKxC,GAAsC,WAAA,E,KAPlD,E,gBACW,6BAA4B,QAC7B,CAAC,GAA6B,GAAa,cAGrC,EAAkB,UAAS,SAAA,wcAAA,OAAA,0aAIT,eAAA,MAAA,KAAA,IAAA,CAAA,KAAA,EAAA,oBAAA,eAAA,CAAA,sBAAqB,E,KAArD,E,MAAU,wBACiB,cAAa,E,KAAxC,E,MAAU,sBERA,MAAA,GAWX,WAAA,CAA6B,EACV,GADU,KAAM,OAAN,EACV,KAAQ,SAAR,EARX,KAAa,cAAG,MAGP,KAAA,WAAa,IAAI,E,CAOlC,IAAA,CAAK,EAA8B,GACjC,GAAI,GAAM,QAAS,CACjB,KAAK,mBAAmB,GACxB,KAAK,oBAAoB,E,EAI7B,kBAAA,CAAmB,GACjB,IACE,KAAK,UAAY,GAAM,KACvB,KAAK,QAAU,EAAK,O,CACpB,MAAO,GACP,QAAQ,IAAI,8BAA+B,E,EAK/C,mBAAA,CAAoB,GAClB,KAAK,2BAA6B,EAAgB,EAAe,CAC/D,oBAAqB,KAAK,WAG5B,KAAK,cAAgB,EAAgB,GAAwC,CAC3E,oBAAqB,KAAK,SAC1B,iBAAkB,CAAC,CAAC,KAAK,2BAA2B,SAAS,kBAG/D,SAAS,KAAK,YAAY,KAAK,cAAc,SAAS,eAEtD,KAAK,OAAO,WAAW,KAAK,2BAA2B,UACvD,KAAK,OAAO,WAAW,KAAK,cAAc,UAC1C,KAAK,cAAgB,I,CAGvB,KAAA,CAAM,GACJ,GAAI,EAAY,CACd,KAAK,cAAc,E,KACd,CACL,KAAK,e,CAEP,KAAK,2BAA2B,SAAS,cAAc,SACvD,KAAK,cAAc,SAAS,cAAc,SAC1C,KAAK,cAAgB,K,CAGvB,aAAA,GACE,KAAK,UAAY,KACjB,KAAK,QAAU,S,CAGjB,cAAA,GACE,OAAO,KAAK,a,CAGd,aAAA,CAAc,GACZ,GAAI,KAAK,cAAe,CACtB,KAAK,WAAW,KAAK,E,EAIzB,aAAA,GACE,OAAO,KAAK,U,QA3EH,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAa,KAAA,EAAA,MAAA,EAAA,gBAAA,CAAA,MAAA,EAAA,sBAAA,OAAA,EAAA,gBAAA,YAAA,QAAb,KAAA,MAAA,EAAA,uBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAa,WAFZ,QAAM,E,iFAEP,GAAa,WAAA,E,KAHzB,EAAW,KAAA,EACV,WAAY,W,4ECoBD,MAAA,GAgBX,SACI,GACF,OAAO,KAAK,M,CAEd,SAAI,CAAM,GACR,KAAK,OAAS,C,CAGhB,WACI,GACF,OAAO,KAAK,Q,CAEd,WAAI,CAAQ,GACV,KAAK,SAAW,C,CAGlB,WAAA,CACmB,EACA,GADA,KAAa,cAAb,EACA,KAAgB,iBAAhB,EAjCX,KAAM,OAAW,GACjB,KAAQ,SAAW,GAER,KAAU,WAAgC,KAE1C,KAAA,QAAkC,CACnD,CACE,GAAI,4BACJ,MAAO,KAAK,iBAAiB,QAAQ,OACrC,QAAS,KAAK,iBAAiB,QAAQ,OACvC,SAAU,MACV,YAAa,YAwBf,KAAK,MAAQ,KAAK,cAAc,UAChC,KAAK,WAAa,KAAK,OAAO,YAAc,KAC5C,KAAK,OAAS,KAAK,OAAO,OAAS,GACnC,KAAK,SAAW,KAAK,OAAO,SAAW,E,CAGzC,KAAA,GACE,KAAK,cAAc,O,CAGrB,aAAA,CAAc,GACZ,GAAI,EAAM,MAAQ,UAAY,EAAM,MAAQ,MAAO,CACjD,KAAK,O,EAIT,sBAAA,GACE,KAAK,QAEL,KAAK,kB,CAIP,aAAA,CAAc,GACZ,GAAI,EAAM,MAAQ,UAAY,EAAM,MAAQ,MAAO,CACjD,KAAK,O,SA7DE,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAoC,KAAA,EAAA,MAAA,IAAA,CAAA,MAAA,EAAA,mBAAA,OAAA,EAAA,gBAAA,WAAA,QAApC,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GC1Bb,aAAA,KAAA,SAAA,qCAAA,OAAA,CAAA,MAAA,QAAA,QAAA,WAAA,KAAA,CAAA,UAAA,8CAAA,SAAA,EAAA,SAAA,k/BAiCA,OAAA,g6ZAAA,aAAA,EAAA,KAAA,WAAA,KDZY,GAAc,CAAA,KAAA,YAAA,KAAA,EAAA,iBAAA,SAAA,qBAAA,OAAA,4EAAA,KAAA,WAAA,KAAA,GAAiB,CAAA,KAAA,YAAA,KAAA,GAA0B,SAAA,0BAAA,OAAA,yCAAA,QAAA,kCAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAKxD,GAAoC,WAAA,E,KAPhD,E,gBACW,qCAAoC,QACrC,CAAC,EAAc,EAAiB,IAA2B,cAGrD,EAAkB,UAAS,SAAA,k/BAAA,OAAA,o6ZAmBtC,eAAA,MAAA,KAAA,IAAA,CAAA,KAAA,EAAA,mBAAA,eAAA,CAAA,MAAK,EADR,KAAA,IASG,QAAO,EADV,KAAA,IAmCD,cAAa,E,KADZ,E,MAAa,mBAAoB,CAAC,gBExExB,MAAA,GAPb,WAAA,GAQW,KAAQ,SAAqB,QAC7B,KAAkB,mBAAY,MAC9B,KAAkB,mBAAY,MAC9B,KAAQ,SAAwC,IAEhD,KAAY,aAAW,IAEvB,KAAA,UAA+D,IAAM,KAE9E,KAAA,YAAsB,KAAK,aAC3B,KAAc,eAAY,KAuB1B,KAAkB,mBAAG,KACnB,KAAK,uBAAuB,CA4B/B,CAlDC,QAAA,GACE,KAAK,YAAc,KAAK,aACxB,OAAO,iBAAiB,SAAU,KAAK,mB,CAGzC,WAAA,GACE,OAAO,oBAAoB,SAAU,KAAK,mB,CAG5C,qBAAA,GACE,MAAM,SAAkB,KAAK,WAAa,WAAa,KAAK,WAAa,KAAK,SAC9E,MAAM,SAAkB,KAAK,WAAa,WAAa,KAAK,WAAa,KAAK,SAE9E,GAAI,GAAY,KAAK,YAAc,EAAU,CAC3C,KAAK,YAAc,C,MACd,GAAI,GAAY,KAAK,YAAc,EAAU,CAClD,KAAK,YAAc,C,EASvB,aAAA,GACE,KAAK,gBAAkB,KAAK,eAC5B,IAAK,KAAK,eAAgB,CACxB,M,CAGF,KAAK,uB,CAGP,cAAA,CAAe,GACb,MAAM,EAAS,EAEf,IAAI,EAAW,KAAK,YACpB,GAAI,KAAK,WAAa,OAAQ,CAC5B,GAAY,C,MACP,GAAI,KAAK,WAAa,QAAS,CACpC,GAAY,C,CAGd,GAAI,KAAK,YAAY,KAAK,YAAa,KAAY,MAAO,CACxD,KAAK,YAAc,EAEnB,KAAK,uB,SA5DE,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAuB,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAAvB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAuB,aAAA,KAAA,SAAA,sBAAA,OAAA,CAAA,SAAA,WAAA,mBAAA,qBAAA,mBAAA,qBAAA,SAAA,WAAA,SAAA,WAAA,aAAA,eAAA,UAAA,aAAA,KAAA,CAAA,UAAA,0CAAA,SAAA,EAAA,SCZpC,quCA4CA,OAAA,+9FAAA,aAAA,EAAA,KAAA,WAAA,KDrCY,GAAc,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,YAAA,KAAA,GAAmB,SAAA,eAAA,QAAA,yBAAA,KAAA,OAAA,KAAE,GAAY,KAAA,aAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAK9C,GAAuB,WAAA,E,KAPnC,E,gBACW,sBAAqB,QACtB,CAAC,EAAc,GAAqB,IAAa,cAG3C,EAAkB,UAAS,SAAA,quCAAA,OAAA,m+FAGjC,eAAA,CAAA,SAAQ,EAAhB,KAAA,IACQ,mBAAkB,EAA1B,KAAA,IACQ,mBAAkB,EAA1B,KAAA,IACQ,SAAQ,EAAhB,KAAA,IACQ,SAAQ,EAAhB,KAAA,IACQ,aAAY,EAApB,KAAA,IAEQ,UAAS,EAAjB,KAAA,IA0BD,mBAAkB,E,KADjB,E,MAAa,sBEnCH,MAAA,GAPb,WAAA,GAWU,KAAoB,qBAAG,KACvB,KAAY,aAAG,GACf,KAAK,MAAG,GA2BhB,KAAa,cAAG,aAiCjB,CA1DC,QACI,GACF,OAAO,KAAK,K,CAEd,QAAI,CAAK,GACP,KAAK,MAAQ,C,CAGf,eACI,GACF,OAAO,KAAK,Y,CAEd,eAAI,CAAY,GACd,KAAK,aAAe,C,CAGtB,uBACI,GACF,OAAO,KAAK,oB,CAEd,uBAAI,CAAoB,GACtB,KAAK,qBAAuB,C,CAS9B,eAAA,GACE,KAAK,WAAW,KAAK,YAAY,c,CAGnC,UAAA,CAAW,GACT,GAAI,OAAO,aAAc,CACvB,MAAM,EAAY,OAAO,eACzB,MAAM,EAAQ,SAAS,cACvB,EAAM,mBAAmB,GACzB,GAAW,kBACX,GAAW,SAAS,E,KACf,CACL,QAAQ,IAAI,sD,EAIhB,KAAA,GACE,KAAK,W,CAIP,UAAA,GACE,GAAI,KAAK,aAAe,KAAK,oBAAqB,CAChD,UAAU,UAAU,UAAU,KAAK,YAAY,cAAc,WAAW,OAAO,IAC7E,QAAQ,MAAM,+BAAgC,EAAI,G,SA9D7C,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAkC,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAAlC,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAkC,aAAA,KAAA,SAAA,mCAAA,OAAA,CAAA,KAAA,OAAA,YAAA,cAAA,oBAAA,sBAAA,cAAA,gBAAA,QAAA,WAAA,KAAA,CAAA,UAAA,mDAAA,YAAA,EAAA,aAAA,cAAA,MAAA,KAAA,UAAA,gBAAA,YAAA,OAAA,SAAA,EAAA,SCV/C,ipBA8BO,OAAA,45DAAA,aAAA,EAAA,KAAA,WAAA,KDvBK,GAAY,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAGX,GAAkC,WAAA,E,KAP9C,EACW,KAAA,EAAA,SAAA,mCAGD,QAAA,CAAC,GACK,cAAA,EAAkB,UAAS,SAAA,ipBAAA,OAAA,g6DAIhB,eAAA,CAAA,YAAW,E,KAApC,E,MAAU,iBAOP,KAAI,EADP,KAAA,IASG,YAAW,EADd,KAAA,IASG,oBAAmB,EADtB,KAAA,IASD,cAAa,EADZ,KAAA,IAID,QAAO,EADN,KAAA,IAwBD,WAAU,E,KADT,E,MAAa,2BAA4B,CAAC,gBE/BvC,MAAO,WAAwC,GACnD,WAAA,CAAY,GACV,MAAM,GAGE,KAAA,eAAiB,IAAI,EAErB,KAAA,qBAAuB,IAAI,EAE5B,KAAe,gBAA0B,GAElD,KAAa,cAA0B,KACvC,KAAe,gBAAY,MAcnB,KAAA,UAA4B,CAClC,KAAM,GACN,YAAa,GACb,mBAAoB,MACpB,oBAAqB,OAiCvB,KAAS,UAAG,KACV,KAAK,gBAAkB,KAAK,C,CA/C9B,gBAAI,CAAa,GACf,KAAK,cAAgB,EACrB,GAAU,KAAM,iBAAkB,E,CAGpC,gBAAI,GACF,OAAO,KAAK,a,CAUd,YACI,GACF,OAAO,KAAK,S,CAEd,YAAI,CAAS,GACX,KAAK,UAAY,C,CAGnB,qBAAA,CAAsB,GACpB,GAAU,KAAM,uBAAwB,GACxC,EAAM,iB,CAGR,WAAA,CAAY,GACV,IAAK,EAAQ,mBAAoB,CAC/B,M,CAEF,MAAM,EAAyC,EAAQ,mBAAmB,cAC1E,MAAM,EAAwC,EAAQ,mBAAmB,aACzE,GAAG,GAAgB,EAAa,OAAS,EAAG,CAC1C,KAAK,aAAe,EAAa,EAAa,OAAS,E,CAEzD,QAAQ,IAAI,qBAAqB,QAAoB,I,CAGvD,QAAA,GACE,KAAK,gBAAkB,KACvB,KAAK,c,6FA5DI,GAA+B,KAAA,EAAA,MAAA,EAAA,mBAAA,OAAA,EAAA,gBAAA,WAAA,QAA/B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GANA,aAAA,KAAA,SAAA,+BAAA,OAAA,CAAA,gBAAA,kBAAA,WAAA,aAAA,SAAA,YAAA,QAAA,CAAA,eAAA,iBAAA,qBAAA,wBAAA,UAAA,CAAC,GAAiB,gBAAA,KAAA,cAAA,KAAA,SAAA,EAAA,SC/B/B,soCAkCA,OAAA,q2ZAAA,aAAA,EAAA,KAAA,WAAA,KDVI,GAAY,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,mBAAA,OAAA,6CAAA,KAAA,YAAA,KAAA,EAAA,KAAA,SAAA,SAAA,OAAA,iCAAA,KAAA,WAAA,KACZ,GACA,CAAA,KAAA,YAAA,KAAA,EAAA,gBAAA,SAAA,8CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,sDAAA,OAAA,+CAAA,QAAA,kBAAA,SAAA,cAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,YAAA,KAAA,EAAA,kBAAA,SAAA,YAAA,OAAA,ovBAAA,QAAA,kGAAA,KAAA,YAAA,KAAA,EAAA,kBAAA,SAAA,YAAA,OAAA,uBAAA,KAAA,WAAA,KAAA,GAAe,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,KAAA,YAAA,KACf,GAAkC,SAAA,mCAAA,OAAA,yEAAA,cAAA,EAAA,kBAAA,WAAA,E,iFASzB,GAA+B,WAAA,E,KAhB3C,EACW,KAAA,EAAA,SAAA,+BACD,QAAA,CACP,EACA,EACA,EACA,EACA,GACA,GACD,UACU,CAAC,GAGG,cAAA,EAAkB,UAAS,SAAA,soCAAA,OAAA,y2ZAQhC,eAAA,MAAA,KAAA,EAAA,mBAAA,eAAA,CAAA,eAAc,EAAvB,KAAA,IAES,qBAAoB,EAA7B,KAAA,IAEQ,gBAAe,EAAvB,KAAA,IAMD,WAAU,EADT,KAAA,IAoBG,SAAQ,EADX,KAAA,OEhEU,MAAA,GAEX,SAAA,CAAU,EAAe,GACvB,MAAM,EAAM,WAAW,GACvB,MAAM,EAAM,EAEZ,MAAM,EAAO,KAAK,IAAI,GAAI,GAE1B,MAAO,GAAK,KAAK,MAAM,EAAM,GAAQ,C,QAR5B,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAS,KAAA,GAAA,OAAA,EAAA,gBAAA,MAAA,Q,mFAAT,GAAS,aAAA,KAAA,KAAA,W,iFAAT,GAAS,WAAA,E,KAJrB,EAAK,KAAA,EACJ,KAAM,QACN,WAAY,WCOD,MAAA,GAEX,WAAA,GACE,MAAM,EAAS,OAAO,UAAU,SAChC,GAAO,OAAO,E,CAGhB,wBAAA,CAAyB,GACvB,OAAO,IAAI,IAAY,UAAU,EAAM,MAAO,EAAM,SAAW,E,CAGjE,mCAAA,CAAoC,GAClC,IAAI,EAAM,eAAgB,CACxB,MAAO,E,CAET,MAAM,EAAW,EAAM,eAAe,OAAO,EAAM,QACnD,GAAG,EAAS,CACV,MAAO,GAAG,G,CAEZ,MAAO,E,CAGT,0BAAA,CAA2B,GACzB,MAAM,EAAqB,GAAO,EAAM,OAAO,OAAO,KACtD,GAAG,EAAY,CACb,OAAO,C,CAET,MAAO,GAAG,EAAM,O,CAGlB,sBAAA,CAAuB,GACrB,MAAO,GAAG,EAAM,O,CAGlB,6BAAA,CAA8B,GAC5B,GAAG,EAAM,SAAW,iBAAiB,KAAK,EAAM,SAAU,CACxD,IAAI,EAAM,eAAgB,CACxB,MAAO,E,CAET,MAAM,EAAU,EAAM,eAAe,OAAO,EAAM,QAClD,GAAG,EAAS,CACV,MAAO,GAAG,G,CAEZ,MAAO,E,CAET,MAAO,GAAG,EAAM,O,CAGlB,iCAAA,CAAkC,GAChC,OAAO,KAAK,8BAA8B,E,CAG5C,qBAAA,CAAsB,GACpB,MAAO,GAAG,EAAM,O,CAGlB,gCAAA,CAAiC,GAC/B,OAAO,KAAK,8BAA8B,E,CAG5C,gBAAA,CAAiB,GACf,MAAO,GAAG,EAAM,O,CAGlB,2BAAA,CAA4B,GAC1B,OAAO,KAAK,8BAA8B,E,CAG5C,wBAAA,CAAyB,GACvB,GAAG,EAAM,SAAW,cAAc,KAAK,EAAM,SAAU,CACrD,MAAO,GAAG,EAAM,O,CAElB,MAAO,GAAG,EAAM,O,CAGlB,yBAAA,CAA0B,GACxB,GAAG,EAAM,QAAU,KACd,UAAU,KAAK,EAAM,OAAQ,CAC9B,MAAO,M,CAET,MAAO,O,CAGX,SAAA,CAAU,GACR,MAAM,EAAS,EAAM,MACrB,GAAI,KAAK,QAAQ,GAAS,CACxB,MAAO,E,CAGT,GAAI,KAAK,SAAS,GAAQ,CACxB,OAAO,KAAK,yBAAyB,E,CAGvC,GAAI,KAAK,oBAAoB,GAAQ,CACnC,OAAO,KAAK,oCAAoC,E,CAGlD,GAAI,KAAK,WAAW,GAAQ,CAC1B,OAAO,KAAK,2BAA2B,E,CAGzC,GAAI,KAAK,OAAO,GAAQ,CACtB,OAAO,KAAK,uBAAuB,E,CAGrC,GAAI,KAAK,kBAAkB,GAAQ,CACjC,OAAO,KAAK,kCAAkC,E,CAGhD,GAAI,KAAK,MAAM,GAAQ,CACrB,OAAO,KAAK,sBAAsB,E,CAGpC,GAAI,KAAK,iBAAiB,GAAQ,CAChC,OAAO,KAAK,iCAAiC,E,CAG/C,GAAI,KAAK,SAAS,GAAQ,CACxB,OAAO,KAAK,iBAAiB,E,CAG/B,GAAI,KAAK,oBAAoB,GAAQ,CACnC,OAAO,KAAK,4BAA4B,E,CAG1C,GAAI,KAAK,iBAAiB,GAAQ,CAChC,OAAO,KAAK,yBAAyB,E,CAGvC,GAAI,KAAK,kBAAkB,GAAQ,CACjC,OAAO,KAAK,0BAA0B,E,CAGxC,GAAI,KAAK,iBAAiB,GAAQ,CAChC,OAAO,KAAK,0BAA0B,E,CAGxC,OAAO,EAAM,K,CAGP,OAAA,CAAQ,GACd,OAAO,IAAU,WAAa,IAAU,MAAQ,IAAU,E,CAGpD,QAAA,CAAS,GACf,cAAc,EAAM,OAAS,UAAY,YAAY,KAAK,EAAM,QAAU,EAAM,O,CAG1E,mBAAA,CAAoB,GAC1B,cAAc,EAAM,OAAS,UAAY,YAAY,KAAK,EAAM,cACpD,EAAM,UAAY,UAAY,iBAAiB,KAAK,EAAM,Q,CAGhE,UAAA,CAAW,GACjB,cAAc,EAAM,OAAS,UAAY,cAAc,KAAK,EAAM,QAAU,EAAM,O,CAG5E,MAAA,CAAO,GACb,cAAc,EAAM,OAAS,UAAY,UAAU,KAAK,EAAM,QAAU,EAAM,O,CAGxE,iBAAA,CAAkB,GACxB,cAAc,EAAM,OAAS,UAAY,UAAU,KAAK,EAAM,cAClD,EAAM,UAAY,UAAY,iBAAiB,KAAK,EAAM,Q,CAGhE,KAAA,CAAM,GACZ,cAAc,EAAM,OAAS,UAAY,cAAc,KAAK,EAAM,QAAU,EAAM,O,CAG5E,gBAAA,CAAiB,GACvB,cAAc,EAAM,OAAS,UAAY,cAAc,KAAK,EAAM,cACtD,EAAM,UAAY,UAAY,iBAAiB,KAAK,EAAM,Q,CAGhE,QAAA,CAAS,GACf,cAAc,EAAM,OAAS,UAAY,YAAY,KAAK,EAAM,QAAU,EAAM,O,CAG1E,mBAAA,CAAoB,GAC1B,cAAc,EAAM,OAAS,UAAY,YAAY,KAAK,EAAM,cACpD,EAAM,UAAY,UAAY,iBAAiB,KAAK,EAAM,Q,CAGhE,gBAAA,CAAiB,GACvB,cAAc,EAAM,OAAS,UAAY,YAAY,KAAK,EAAM,cACpD,EAAM,UAAY,UAAY,cAAc,KAAK,EAAM,Q,CAG7D,iBAAA,CAAkB,GACxB,cAAc,EAAM,OAAS,UAAY,aAAa,KAAK,EAAM,cACrD,EAAM,UAAY,UAAY,cAAc,KAAK,EAAM,Q,CAG7D,gBAAA,CAAiB,GACvB,cAAc,EAAM,OAAS,UAAY,aAAa,KAAK,EAAM,QAAU,EAAM,O,QAnMxE,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAyB,KAAA,GAAA,OAAA,EAAA,gBAAA,MAAA,Q,mFAAzB,GAAyB,aAAA,KAAA,KAAA,+B,iFAAzB,GAAyB,WAAA,E,KAJrC,EAAK,KAAA,EACJ,KAAM,4BACN,WAAY,S,wBCPR,SAAU,GAA2B,GACzC,OAAO,EAAO,QAAU,WACnB,EAAO,QAAU,MACjB,EAAO,QAAU,IACjB,EAAO,QAAU,QACjB,EAAO,QAAU,MACjB,EAAO,QAAU,IACxB,CCCa,MAAA,GAMX,SAAa,CAAM,GACjB,KAAK,OAAO,IAAI,GAChB,GAAG,KAAK,OAAO,GAAQ,CACrB,KAAK,YAAY,IAAI,MACrB,KAAK,oBAAoB,IAAI,KAAK,mBAAmB,G,KAElD,CACH,KAAK,YAAY,IAAI,M,EAIzB,WAAa,CAAQ,GACnB,KAAK,SAAS,IAAI,E,CAGZ,MAAA,CAAO,GACb,IAAK,EAAK,CACR,OAAO,K,CAET,MAAM,EAAO,EAAI,OACjB,IAAI,iBAAiB,KAAK,KAAU,SAAS,KAAK,GAAO,CACvD,OAAO,K,CAGT,OAAO,GAAM,E,CAGP,kBAAA,CAAmB,GACzB,IAAI,KAAK,OAAO,GAAM,CACpB,MAAO,E,CAET,IAAI,EAAO,EAAI,OAEf,GAAI,IAAS,iBAAiB,KAAK,GAAO,CACxC,EAAO,WAAa,C,CAEtB,OAAO,C,CAGT,WAAA,GA5CU,KAAA,SAAW,EAAe,IAC1B,KAAA,OAAS,EAAe,IACxB,KAAA,YAAc,EAAgB,OAC9B,KAAA,oBAAsB,EAAe,G,QAJpC,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA4B,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAA5B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAA4B,aAAA,KAAA,SAAA,4BAAA,OAAA,CAAA,MAAA,QAAA,QAAA,WAAA,SAAA,EAAA,SCVzC,gQAQA,OAAA,wEAAA,cAAA,EAAA,kBAAA,WAAA,E,iFDEa,GAA4B,WAAA,E,KAPxC,EACW,KAAA,EAAA,SAAA,4BACE,WAAA,KAGG,cAAA,EAAkB,UAAS,SAAA,gQAAA,OAAA,4EAQ7B,eAAA,OAAA,eAAA,CAAA,MAAK,EAAjB,KAAA,IAWY,QAAO,EAAnB,KAAA,OENU,MAAA,GAjBb,WAAA,GAmBW,KAAW,YAAW,GACrB,KAAA,gBAAkB,IAAI,EAEtB,KAAA,iBAAmB,EAAgB,OAKnC,KAAA,YAAc,EAAgB,MAKxC,KAAK,MAAW,GAChB,KAAU,WAAY,MAGtB,KAAA,SAAY,IAAD,EAEX,KAAS,UAAG,MA0Cb,CAzDC,mBAA4C,CAAgB,GAC1D,KAAK,iBAAiB,IAAI,E,CAI5B,cAA4C,CAAW,GACrD,KAAK,YAAY,IAAI,E,CAYvB,UAAA,CAAW,GACT,KAAK,MAAQ,C,CAGf,gBAAA,CAAiB,GACf,KAAK,SAAW,C,CAGlB,iBAAA,CAAkB,GAChB,KAAK,UAAY,C,CAGnB,gBAAA,CAAiB,GACf,KAAK,WAAa,C,CAGpB,WAAA,CAAY,GACV,MAAM,EAAQ,EAAM,OACpB,KAAK,MAAQ,EAAM,MACnB,KAAK,SAAS,KAAK,M,CAGrB,UAAA,GACE,KAAK,W,CAIG,WAAA,CAAY,GACpB,KAAK,MAAQ,GACb,KAAK,aAAa,cAAc,QAChC,KAAK,SAAS,KAAK,M,CAGX,aAAA,CAAc,GACtB,GAAI,EAAM,MAAQ,QAAS,CACzB,M,CAEF,KAAK,gBAAgB,M,QA7DZ,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA8B,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAA9B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAMS,aAAA,KAAA,SAAA,+BAAA,OAAA,CAAA,YAAA,cAAA,gBAAA,qCAAA,GAKA,WAAA,2BAAA,IAnBT,QAAA,CAAA,gBAAA,mBAAA,UAAA,CACT,CACE,QAAS,EACT,YAAa,GAAW,IAAM,KAC9B,MAAO,OAEV,YAAA,EAAA,aAAA,eAAA,MAAA,KAAA,UAAA,kBAAA,YAAA,OAAA,SAAA,EAAA,SCnBH,4jBAyBA,OAAA,u4DAAA,aAAA,EAAA,KAAA,WAAA,KDlBI,GAAmB,CAAA,KAAA,WAAA,KACnB,IAAe,cAAA,EAAA,kBAAA,WAAA,E,iFAaN,GAA8B,WAAA,E,KAjB1C,EACW,KAAA,EAAA,SAAA,+BACD,QAAA,CACP,EACA,GAIa,cAAA,EAAkB,UACtB,UAAA,CACT,CACE,QAAS,EACT,YAAa,GAAW,IAAA,KACxB,MAAO,OAEV,SAAA,4jBAAA,OAAA,24DAG8C,eAAA,CAAA,aAAY,E,KAA1D,EAAU,KAAA,iBAAiB,CAAE,OAAQ,UAC7B,YAAW,EAAnB,KAAA,IACS,gBAAe,EAAxB,KAAA,IAG2C,gBAAe,E,KAA1D,E,MAAM,CAAE,UAAW,MAKwB,WAAU,E,KAArD,E,MAAM,CAAE,UAAW,SEDT,MAAA,GAjBb,WAAA,GAkBY,KAAA,gBAAkB,IAAI,EAEhC,KAAK,MAAY,MACjB,KAAU,WAAY,MAGtB,KAAA,SAAY,IAAD,EAEX,KAAS,UAAG,MAgCb,CA5BC,gBAAA,CAAiB,GACf,MAAM,EAAW,EAAM,OAA4B,QACnD,KAAK,MAAQ,EACb,KAAK,SAAS,GACd,KAAK,W,CAGP,UAAA,CAAW,GACT,KAAK,MAAQ,C,CAGf,gBAAA,CAAiB,GACf,KAAK,SAAW,C,CAGlB,iBAAA,CAAkB,GAChB,KAAK,UAAY,C,CAGnB,gBAAA,CAAiB,GACf,KAAK,WAAa,C,CAGpB,oBAAA,GACE,KAAK,OAAS,KAAK,MACnB,KAAK,SAAS,KAAK,OACnB,KAAK,W,QAvCI,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA6B,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAA7B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GARA,aAAA,KAAA,SAAA,6BAAA,QAAA,CAAA,gBAAA,mBAAA,UAAA,CACT,CACE,QAAS,EACT,YAAa,GAAW,IAAM,KAC9B,MAAO,OAEV,SAAA,EAAA,SC7BH,sRAcA,OAAA,wsEAAA,aAAA,EAAA,KAAA,WAAA,KDGI,GAAmB,CAAA,KAAA,WAAA,KACnB,IAAe,cAAA,EAAA,kBAAA,WAAA,E,iFAaN,GAA6B,WAAA,E,KAjBzC,EACW,KAAA,EAAA,SAAA,6BACD,QAAA,CACP,EACA,GAIa,cAAA,EAAkB,UACtB,UAAA,CACT,CACE,QAAS,EACT,YAAa,GAAW,IAAA,KACxB,MAAO,OAEV,SAAA,sRAAA,OAAA,4sEAGS,eAAA,CAAA,gBAAe,EAAxB,KAAA,OEXU,MAAA,GAjBb,WAAA,GAmBW,KAAW,YAAW,GACrB,KAAA,gBAAkB,IAAI,EAEtB,KAAA,YAAc,EAAgB,MAK/B,KAAQ,SAAW,GACnB,KAAQ,SAAW,GAE5B,KAAK,MAAW,EAChB,KAAU,WAAY,MAGtB,KAAA,SAAY,IAAD,EAEX,KAAS,UAAG,MAmCb,CAhDC,cAA4C,CAAW,GACrD,KAAK,YAAY,IAAI,E,CAevB,UAAA,CAAW,GACT,KAAK,MAAQ,C,CAGf,gBAAA,CAAiB,GACf,KAAK,SAAW,C,CAGlB,iBAAA,CAAkB,GAChB,KAAK,UAAY,C,CAGnB,gBAAA,CAAiB,GACf,KAAK,WAAa,C,CAGpB,WAAA,CAAY,GACV,MAAM,EAAQ,EAAM,OACpB,KAAK,MAAQ,SAAS,EAAM,OAC5B,KAAK,SAAS,KAAK,M,CAGrB,UAAA,GACE,KAAK,W,CAGG,aAAA,CAAc,GACtB,GAAI,EAAM,MAAQ,QAAS,CACzB,M,CAEF,KAAK,gBAAgB,M,QApDZ,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA2B,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,Q,4EAA3B,GAA2B,aAAA,KAAA,SAAA,2BAAA,OAAA,CAAA,YAAA,cAAA,WAAA,2BAMlB,GAdT,SAAA,WAAA,SAAA,YAAA,QAAA,CAAA,gBAAA,mBAAA,UAAA,CACT,CACE,QAAS,EACT,YAAa,GAAW,IAAM,KAC9B,MAAO,OAEV,YAAA,EAAA,aAAA,eAAA,MAAA,KAAA,UAAA,kBAAA,YAAA,OAAA,SAAA,EAAA,SCnBH,+YAkBA,OAAA,mtBAAA,aAAA,EAAA,KAAA,WAAA,KDXI,GAAmB,CAAA,KAAA,WAAA,KACnB,IAAe,cAAA,EAAA,kBAAA,WAAA,E,iFAaN,GAA2B,WAAA,E,KAjBvC,EACW,KAAA,EAAA,SAAA,2BACD,QAAA,CACP,EACA,GAIa,cAAA,EAAkB,UACtB,UAAA,CACT,CACE,QAAS,EACT,YAAa,GAAW,IAAA,KACxB,MAAO,OAEV,SAAA,+YAAA,OAAA,utBAG8C,eAAA,CAAA,aAAY,E,KAA1D,EAAU,KAAA,iBAAiB,CAAE,OAAQ,UAC7B,YAAW,EAAnB,KAAA,IACS,gBAAe,EAAxB,KAAA,IAG2C,WAAU,E,KAArD,E,MAAM,CAAE,UAAW,MAIX,SAAQ,EAAhB,KAAA,IACQ,SAAQ,EAAhB,KAAA,OEgBU,MAAA,GArBb,WAAA,GAuBW,KAAW,YAAW,GACrB,KAAA,gBAAkB,IAAI,EAEtB,KAAA,YAAc,EAAgB,MAKhC,KAAK,MAAW,OACd,KAAe,gBAA0B,GAuC3C,KAAc,eAAkB,KAmCxC,KAAA,mBAAqB,IAAI,GAAwC,MAGjE,KAAK,MAAW,GAChB,KAAU,WAAY,MAGtB,KAAA,SAAY,IAAD,EAEX,KAAS,UAAG,MAmCb,CA3HC,cAA4C,CAAW,GACrD,KAAK,YAAY,IAAI,E,CAKvB,kBAAa,CAAe,GAC1B,IAAI,EAAiB,CACnB,M,CAEF,GAAG,MAAM,QAAQ,GAAkB,CACjC,EAAgB,SAAQ,CAAC,EAAO,KAC9B,KAAK,gBAAgB,KAAK,CAAE,GAAI,EAAM,WAAY,KAAM,GAAQ,IAElE,KAAK,MAAQ,QACb,M,CAEF,OAAO,KAAK,GAAiB,SAAS,IACpC,UAAU,IAAQ,SAAU,CAC1B,KAAK,gBAAgB,KAAK,CAAE,GAAI,EAAK,KAAM,EAAgB,I,CAE7D,UAAU,IAAQ,SAAU,CAC1B,KAAK,gBAAgB,KAAK,CAAE,GAAI,EAAK,KAAM,EAAgB,OAAO,K,KAMhE,mBAAA,GACN,MAAM,EAAkC,KAAK,gBAAgB,MAAM,GAAY,EAAQ,KAAO,KAAK,iBACnG,IAAI,EAAI,CACN,M,CAEF,KAAK,WAAa,C,CAGpB,oBAAA,GACE,MAAM,EAAkC,KAAK,gBAAgB,MAAM,GAAY,EAAQ,OAAS,KAAK,iBACrG,IAAI,EAAI,CACN,M,CAEF,KAAK,WAAa,C,CAIpB,iBAAa,CAAc,GACzB,KAAK,eAAiB,EACtB,GAAG,KAAK,QAAU,OAAQ,CACxB,KAAK,sBACL,M,CAEF,GAAG,KAAK,QAAU,QAAS,CACzB,KAAK,sB,EAIT,QAAA,GACE,KAAK,mBAAmB,UAAU,CAChC,KAAO,IACL,GAAG,KAAK,QAAU,OAAQ,CACxB,KAAK,MAAQ,GAAO,IAAM,GAC1B,KAAK,SAAS,KAAK,M,CAErB,GAAG,KAAK,QAAU,QAAS,CACvB,KAAK,MAAQ,GAAO,MAAQ,GAC5B,KAAK,SAAS,KAAK,M,KAM7B,cAAI,CAAW,GACb,KAAK,mBAAmB,KAAK,E,CAG/B,cAAI,GACF,OAAO,KAAK,mBAAmB,U,CAejC,UAAA,CAAW,GACT,KAAK,MAAQ,C,CAGf,gBAAA,CAAiB,GACf,KAAK,SAAW,C,CAGlB,iBAAA,CAAkB,GAChB,KAAK,UAAY,C,CAGnB,gBAAA,CAAiB,GACf,KAAK,WAAa,C,CAGpB,WAAA,CAAY,GACV,MAAM,EAAQ,EAAM,OACpB,KAAK,MAAQ,EAAM,MACnB,KAAK,SAAS,KAAK,M,CAGrB,UAAA,GACE,KAAK,W,CAGG,aAAA,CAAc,GACtB,GAAI,EAAM,MAAQ,QAAS,CACzB,M,CAEF,KAAK,gBAAgB,M,QA/HZ,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA6B,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,Q,4EAA7B,GAA6B,aAAA,KAAA,SAAA,6BAAA,OAAA,CAAA,YAAA,cAAA,WAAA,2BAMpB,GAfT,eAAA,iBAAA,cAAA,iBAAA,QAAA,CAAA,gBAAA,mBAAA,UAAA,CACT,CACE,QAAS,EACT,YAAa,GAAW,IAAM,KAC9B,MAAO,OC3Cb,YAAA,EAAA,aAAA,eAAA,MAAA,KAAA,UAAA,kBAAA,YAAA,OAAA,SAAA,EAAA,SAAA,wcD8BI,OAAA,oyXAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,mBAAA,OAAA,6CAAA,KAAA,WAAA,KAAA,GAAW,CAAA,KAAA,YAAA,KAAA,EAAA,gBAAA,SAAA,8CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,sDAAA,OAAA,+CAAA,QAAA,kBAAA,SAAA,cAAA,KAAA,WAAA,KACX,GAAmB,CAAA,KAAA,WAAA,KACnB,GAAc,CAAA,KAAA,YAAA,KAAA,EAAA,kBAAA,SAAA,YAAA,OAAA,ovBAAA,QAAA,kGAAA,KAAA,YAAA,KAAA,EAAA,kBAAA,SAAA,YAAA,OAAA,uBAAA,KAAA,WAAA,KACd,IAAe,cAAA,EAAA,kBAAA,WAAA,E,iFAcN,GAA6B,WAAA,E,KArBzC,EACW,KAAA,EAAA,SAAA,6BACD,QAAA,CACP,EACA,EACA,EACA,EACA,GAIa,cAAA,EAAkB,UACtB,UAAA,CACT,CACE,QAAS,EACT,YAAa,GAAW,IAAA,KACxB,MAAO,OAEV,SAAA,wcAAA,OAAA,wyXAI8C,eAAA,CAAA,aAAY,E,KAA1D,EAAU,KAAA,iBAAiB,CAAE,OAAQ,UAC7B,YAAW,EAAnB,KAAA,IACS,gBAAe,EAAxB,KAAA,IAG2C,WAAU,E,KAArD,E,MAAM,CAAE,UAAW,MAMP,eAAc,EAA1B,KAAA,IAuCY,cAAa,EAAzB,KAAA,OE5EI,MAAM,GAAkB,CAC7B,MAAO,CACL,UAAW,KAEb,QAAS,CACP,UAAW,IACX,eAAgB,WAChB,cAAe,IACf,mBAAoB,aA6CX,MAAA,GAUX,mBAA4C,CAAgB,GAC1D,KAAK,iBAAiB,IAAI,E,CAI5B,cAA4C,CAAW,GACrD,KAAK,YAAY,IAAI,E,CAMvB,WAAA,GAnBA,KAAK,MAAW,GAChB,KAAA,UAAyB,IAAI,KAC7B,KAAU,WAAY,MAEZ,KAAA,gBAAkB,IAAI,EAEtB,KAAA,iBAAmB,EAAgB,OAKnC,KAAA,YAAc,EAAgB,MAK/B,KAAQ,SAAW,GACnB,KAAQ,SAAW,GAK5B,KAAA,SAAY,IAAD,EAEX,KAAS,UAAG,OAoBK,KAAQ,SAAG,mB,CAjB5B,UAAA,CAAW,GACT,KAAK,MAAQ,EACb,KAAK,UAAY,IAAI,KAAK,E,CAG5B,gBAAA,CAAiB,GACf,KAAK,SAAW,C,CAGlB,iBAAA,CAAkB,GAChB,KAAK,UAAY,C,CAGnB,gBAAA,CAAiB,GACf,KAAK,WAAa,C,CAIZ,kBAAA,GAEN,GAAI,SAAS,eAAe,KAAK,UAAW,CAC1C,M,CAIF,MAAM,EAAe,SAAS,cAAc,SAC5C,EAAa,GAAK,KAAK,SAEvB,EAAa,YAAc,q8GA6F3B,SAAS,KAAK,YAAY,E,CAE5B,QAAA,GACE,KAAK,qBACL,QAAQ,IAAI,qC,CAIJ,WAAA,CAAY,GACpB,KAAK,MAAQ,GACb,KAAK,UAAY,KACjB,KAAK,SAAS,KAAK,M,CAIX,eAAA,CAAgB,GACxB,QAAQ,IAAI,4C,CAGJ,aAAA,CAAc,GACtB,GAAI,EAAM,MAAQ,QAAS,CACzB,M,CAEF,KAAK,gBAAgB,M,CAGvB,aAAA,CAAc,GACZ,MAAM,EAAe,EAAM,MAE3B,GAAI,EAAc,CAChB,KAAK,MAAQ,EAAa,cAC1B,KAAK,SAAS,KAAK,OACnB,QAAQ,IAAI,uBAAwB,E,SAvL7B,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAyB,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAAzB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAUS,aAAA,KAAA,SAAA,yBAAA,OAAA,CAAA,gBAAA,qCAAA,GAKA,WAAA,2BAAA,GA3CT,SAAA,WAAA,SAAA,YAAA,QAAA,CAAA,gBAAA,mBAAA,UAAA,CACT,CACE,QAAS,EACT,YAAa,GAAW,IAAM,KAC9B,MAAO,MAET,CACE,QAAS,GACT,SAAU,GACV,KAAM,CAAC,GAAiB,GAAkB,KAE5C,CACE,QAAS,GACT,SAAU,IAEZ,CACE,QAAS,GACT,SAAU,UAAU,UAEtB,CACE,QAAS,GACT,SAAU,CACN,OAAQ,SAGf,YAAA,EAAA,aAAA,eAAA,MAAA,KAAA,UAAA,iBAAA,YAAA,OAAA,SAAA,EAAA,SCzEH,ugBASM,OAAA,+mEAAA,aAAA,EAAA,KAAA,WAAA,KD6BF,GAAY,CAAA,KAAA,WAAA,KACZ,GACA,CAAA,KAAA,YAAA,KAAA,EAAA,qBAAA,SAAA,iNAAA,KAAA,YAAA,KAAA,EAAA,gBAAA,SAAA,8CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,sDAAA,OAAA,+CAAA,QAAA,kBAAA,SAAA,cAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,WAAA,KAAA,IACA,CAAA,KAAA,YAAA,KAAA,GAAA,cAAA,SAAA,iBAAA,SAAA,oBAAA,KAAA,YAAA,KAAA,GAAA,mBAAA,SAAA,uBAAA,OAAA,oDAAA,SAAA,yBAAA,KAAA,YAAA,KAAA,GAAA,oBAAA,SAAA,wBAAA,OAAA,2DAAA,SAAA,0BAAA,KAAA,WAAA,KAAA,IACA,CAAA,KAAA,WAAA,KAAA,KAAmB,cAAA,EAAA,kBAAA,WAAA,E,iFAgCV,GAAyB,WAAA,E,KAzCrC,EACW,KAAA,EAAA,SAAA,yBACD,QAAA,CACP,EACA,EACA,EACA,EACA,GACA,GACA,IAIS,UAAA,CACT,CACE,QAAS,EACT,YAAa,GAAW,IAAA,KACxB,MAAO,MAET,CACE,QAAS,GACT,SAAU,GACV,KAAM,CAAC,GAAiB,GAAkB,KAE5C,CACE,QAAS,GACT,SAAU,IAEZ,CACE,QAAS,GACT,SAAU,UAAU,UAEtB,CACE,QAAS,GACT,SAAU,CACN,OAAQ,SAID,cAAA,EAAkB,UAAS,SAAA,ugBAAA,OAAA,mnEAGI,eAAA,OAAA,eAAA,CAAA,aAAY,E,KAAzD,EAAU,KAAA,gBAAgB,CAAE,OAAQ,UAM3B,gBAAe,EAAxB,KAAA,IAG2C,gBAAe,E,KAA1D,E,MAAM,CAAE,UAAW,MAKwB,WAAU,E,KAArD,E,MAAM,CAAE,UAAW,MAIX,SAAQ,EAAhB,KAAA,IACQ,SAAQ,EAAhB,KAAA,OEzDU,MAAA,GAGX,YAAa,CAAS,GACpB,KAAK,UAAU,IAAI,E,CAKX,4BAAA,CAA6B,GACrC,IAAI,KAAK,qBAAsB,CAC7B,OAAO,K,CAGT,MAAM,EAAS,KAAK,qBAAqB,IAAI,GAE7C,IAAI,EAAQ,CACV,OAAO,K,CAET,OAAO,I,CAGC,aAAA,CAAc,GACtB,IAAI,KAAK,qBAAsB,CAC7B,OAAO,K,CAET,MAAM,EAAS,KAAK,qBAAqB,IAAI,GAE7C,IAAI,EAAQ,CACV,OAAO,K,CAET,OAAO,GAAQ,K,CAIjB,mBAAa,CAAgB,GAC3B,KAAK,iBAAiB,IAAI,E,CAS5B,mBAAa,CAAgB,GAC3B,IAAI,EAAM,CACR,M,CAEF,KAAK,iBAAiB,IAAI,E,CAG5B,WAAA,GAnDU,KAAA,UAAY,EAAgB,OAiC5B,KAAA,iBAAmB,EAAgB,OAKnC,KAAgB,iBAAG,EAA6B,CACxD,KAAM,GACN,WAAY,GACZ,SAAU,O,CAYF,YAAA,CAAa,GACrB,OAAO,GAA2B,E,CAE1B,gBAAA,CAAiB,GACzB,cAAe,EAAO,OAAS,UAAY,aAAa,KAAK,EAAO,QAAW,EAAO,O,CAE9E,iBAAA,CAAkB,GAC1B,cAAe,EAAO,OAAS,UAAY,aAAa,KAAK,EAAO,eACxD,EAAO,UAAa,UAAY,cAAc,KAAK,EAAO,S,CAE9D,UAAA,CAAW,GACnB,cAAe,EAAO,OAAS,UAAY,YAAY,KAAK,EAAO,QAAW,EAAO,O,CAE7E,gBAAA,CAAiB,GACzB,cAAe,EAAO,OAAS,UAAY,YAAY,KAAK,EAAO,QAAW,EAAO,O,CAE7E,iBAAA,CAAkB,GAC1B,cAAe,EAAO,OAAS,UAAY,cAAc,KAAK,EAAO,QAAW,EAAO,O,CAE/E,cAAA,CAAe,GACvB,cAAe,EAAO,OAAS,UAAY,UAAU,KAAK,EAAO,QAAW,EAAO,O,CAE3E,oBAAA,CAAqB,GAC7B,cAAe,EAAO,OAAS,UAAY,YAAY,KAAK,EAAO,eACxD,EAAO,UAAY,UAAY,iBAAiB,KAAK,EAAO,S,CAE/D,kBAAA,CAAmB,GAC3B,cAAe,EAAO,OAAS,UAAY,UAAU,KAAK,EAAO,eACtD,EAAO,UAAY,UAAY,iBAAiB,KAAK,EAAO,S,CAE/D,qBAAA,CAAsB,GAC9B,cAAe,EAAO,OAAS,UAAY,cAAc,KAAK,EAAO,eAC1D,EAAO,UAAY,UAAY,iBAAiB,KAAK,EAAO,S,CAE/D,oBAAA,CAAqB,GAC7B,cAAe,EAAO,OAAS,UAAY,YAAY,KAAK,EAAO,eACxD,EAAO,UAAY,UAAY,iBAAiB,KAAK,EAAO,S,CAE/D,iBAAA,CAAkB,GAC1B,cAAe,EAAO,OAAS,UAAY,YAAY,KAAK,EAAO,eACxD,EAAO,UAAY,UAAY,cAAc,KAAK,EAAO,S,CAE5D,WAAA,CAAY,GACpB,cAAgB,EAAO,OAAS,UAAY,cAAc,KAAK,EAAO,QAAY,EAAO,O,QAjGhF,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA8B,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAA9B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GCvCb,aAAA,KAAA,SAAA,8BAAA,OAAA,CAAA,SAAA,WAAA,qBAAA,uBAAA,gBAAA,kBAAA,gBAAA,mBAAA,SAAA,EAAA,SAAA,kkLAiJA,OAAA,+7BAAA,aAAA,EAAA,KAAA,OAAA,KDzHI,GACA,KAAA,8BAAA,KAAA,YAAA,KAAA,GAA4B,SAAA,4BAAA,OAAA,sBAAA,KAAA,YAAA,KAC5B,GAA8B,SAAA,+BAAA,OAAA,+CAAA,QAAA,sBAAA,KAAA,YAAA,KAC9B,GACA,SAAA,6BAAA,QAAA,sBAAA,KAAA,YAAA,KAAA,GAA2B,SAAA,2BAAA,OAAA,mDAAA,QAAA,sBAAA,KAAA,YAAA,KAC3B,GAA6B,SAAA,6BAAA,OAAA,8DAAA,QAAA,sBAAA,KAAA,YAAA,KAC7B,GACA,SAAA,yBAAA,OAAA,uDAAA,QAAA,sBAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,YAAA,KAAA,EAAA,gBAAA,SAAA,8CAAA,KAAA,YAAA,KAAA,EAAA,qBAAA,SAAA,6FAAA,KAAA,YAAA,KAAA,EAAA,mBAAA,SAAA,cAAA,OAAA,cAAA,QAAA,aAAA,SAAA,aAAA,KAAA,YAAA,KAAA,EAAA,gBAAA,SAAA,oBAAA,OAAA,yCAAA,QAAA,oBAAA,KAAA,WAAA,KAAA,GAAY,CAAA,KAAA,OAAA,KAAA,EAAA,YAAA,KAAA,WAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAOH,GAA8B,WAAA,E,KAlB1C,EACW,KAAA,EAAA,SAAA,8BACD,QAAA,CACP,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACA,GAIa,cAAA,EAAkB,UAAS,SAAA,kkLAAA,OAAA,m8BAM7B,eAAA,OAAA,eAAA,CAAA,SAAQ,EAApB,KAAA,IAIQ,qBAAoB,EAA5B,KAAA,IA4BY,gBAAe,EAA3B,KAAA,IAUY,gBAAe,EAA3B,KAAA,OEzEU,MAAA,GAEX,WAAA,GACE,MAAM,EAAS,OAAO,UAAU,SAChC,GAAO,OAAO,E,CAGhB,gBAAA,CAAiB,GACf,OAAO,IAAI,IAAY,UAAU,EAAM,MAAO,EAAM,SAAW,E,CAGjE,2BAAA,CAA4B,GAC1B,OAAO,KAAK,iBAAiB,E,CAG/B,kBAAA,CAAmB,GACjB,OAAO,EAAM,K,CAGf,cAAA,CAAe,GACb,OAAO,EAAM,K,CAGf,yBAAA,CAA0B,GACxB,MAAO,GAAG,EAAM,O,CAGlB,aAAA,CAAc,GACZ,OAAO,EAAM,K,CAGf,wBAAA,CAAyB,GACvB,MAAO,GAAG,EAAM,O,CAGlB,gBAAA,CAAiB,GACf,OAAO,EAAM,K,CAGf,2BAAA,CAA4B,GAC1B,MAAO,GAAG,EAAM,O,CAGlB,wBAAA,CAAyB,GACvB,GAAG,EAAM,SAAW,cAAc,KAAK,EAAM,SAAU,CACrD,OAAO,EAAM,K,CAEf,MAAO,E,CAGT,0BAAA,CAA2B,GACzB,GAAG,EAAM,QAAU,KACd,UAAU,KAAK,EAAM,OAAQ,CAC9B,OAAO,I,CAET,OAAO,K,CAGX,yBAAA,CAA0B,GACxB,GAAG,EAAM,QAAU,KACd,UAAU,KAAK,EAAM,OAAQ,CAC9B,MAAO,M,CAET,MAAO,O,CAGX,SAAA,CAAU,GACR,MAAM,EAAS,EAAM,MACrB,GAAI,KAAK,QAAQ,GAAS,CACxB,MAAO,E,CAGT,GAAI,KAAK,SAAS,GAAQ,CACxB,OAAO,KAAK,iBAAiB,E,CAG/B,GAAI,KAAK,oBAAoB,GAAQ,CACnC,OAAO,KAAK,4BAA4B,E,CAG1C,GAAI,KAAK,WAAW,GAAQ,CAC1B,OAAO,KAAK,mBAAmB,E,CAGjC,GAAI,KAAK,OAAO,GAAQ,CACtB,OAAO,KAAK,eAAe,E,CAG7B,GAAI,KAAK,kBAAkB,GAAQ,CACjC,OAAO,KAAK,0BAA0B,E,CAGxC,GAAI,KAAK,MAAM,GAAQ,CACrB,OAAO,KAAK,cAAc,E,CAG5B,GAAI,KAAK,iBAAiB,GAAQ,CAChC,OAAO,KAAK,yBAAyB,E,CAGvC,GAAI,KAAK,SAAS,GAAQ,CACxB,OAAO,KAAK,iBAAiB,E,CAG/B,GAAI,KAAK,oBAAoB,GAAQ,CACnC,OAAO,KAAK,4BAA4B,E,CAG1C,GAAI,KAAK,iBAAiB,GAAQ,CAChC,OAAO,KAAK,yBAAyB,E,CAGvC,GAAI,KAAK,kBAAkB,GAAQ,CACjC,OAAO,KAAK,2BAA2B,E,CAGzC,GAAI,KAAK,iBAAiB,GAAQ,CAChC,OAAO,KAAK,0BAA0B,E,CAGxC,OAAO,EAAM,K,CAGP,OAAA,CAAQ,GACd,OAAO,IAAU,WAAa,IAAU,MAAQ,IAAU,E,CAGpD,QAAA,CAAS,GACf,cAAc,EAAM,OAAS,UAAY,YAAY,KAAK,EAAM,QAAU,EAAM,O,CAG1E,mBAAA,CAAoB,GAC1B,cAAc,EAAM,OAAS,UAAY,YAAY,KAAK,EAAM,cACpD,EAAM,UAAY,UAAY,iBAAiB,KAAK,EAAM,Q,CAGhE,UAAA,CAAW,GACjB,cAAc,EAAM,OAAS,UAAY,cAAc,KAAK,EAAM,QAAU,EAAM,O,CAG5E,MAAA,CAAO,GACb,cAAc,EAAM,OAAS,UAAY,UAAU,KAAK,EAAM,QAAU,EAAM,O,CAGxE,iBAAA,CAAkB,GACxB,cAAc,EAAM,OAAS,UAAY,UAAU,KAAK,EAAM,cAClD,EAAM,UAAY,UAAY,iBAAiB,KAAK,EAAM,Q,CAGhE,KAAA,CAAM,GACZ,cAAc,EAAM,OAAS,UAAY,cAAc,KAAK,EAAM,QAAU,EAAM,O,CAG5E,gBAAA,CAAiB,GACvB,cAAc,EAAM,OAAS,UAAY,cAAc,KAAK,EAAM,cACtD,EAAM,UAAY,UAAY,iBAAiB,KAAK,EAAM,Q,CAGhE,QAAA,CAAS,GACf,cAAc,EAAM,OAAS,UAAY,YAAY,KAAK,EAAM,QAAU,EAAM,O,CAG1E,mBAAA,CAAoB,GAC1B,cAAc,EAAM,OAAS,UAAY,YAAY,KAAK,EAAM,cACpD,EAAM,UAAY,UAAY,iBAAiB,KAAK,EAAM,Q,CAGhE,gBAAA,CAAiB,GACvB,cAAc,EAAM,OAAS,UAAY,YAAY,KAAK,EAAM,cACpD,EAAM,UAAY,UAAY,cAAc,KAAK,EAAM,Q,CAG7D,iBAAA,CAAkB,GACxB,cAAc,EAAM,OAAS,UAAY,aAAa,KAAK,EAAM,cACrD,EAAM,UAAY,UAAY,cAAc,KAAK,EAAM,Q,CAG7D,gBAAA,CAAiB,GACvB,cAAc,EAAM,OAAS,UAAY,aAAa,KAAK,EAAM,QAAU,EAAM,O,QAlLxE,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAiB,KAAA,GAAA,OAAA,EAAA,gBAAA,MAAA,Q,mFAAjB,GAAiB,aAAA,KAAA,KAAA,uB,iFAAjB,GAAiB,WAAA,E,KAJ7B,EAAK,KAAA,EACJ,KAAM,oBACN,WAAY,S,wBCPE,SAAA,GAAgB,EAAkB,GAChD,OAAQ,IACN,GAAG,EAAQ,QAAU,MAAQ,EAAQ,QAAU,WAAa,EAAQ,QAAU,GAAI,CAChF,OAAO,I,CAGT,MAAM,EAAQ,EAAQ,MACtB,MAAM,EAAgB,qCAAqC,KAAK,GAEhE,IAAI,EAAe,CACjB,MAAO,CAAE,cAAe,CAAE,MAAO,EAAO,QAAS,0BAA0B,M,CAG7E,GAAG,MAAM,WAAW,IAAS,CAC3B,MAAO,CAAE,cAAe,CAAE,MAAO,EAAO,QAAS,0BAA0B,M,CAG7E,GAAI,GAAY,WAAW,GAAS,WAAW,GAAW,CACxD,MAAO,CAAE,cAAe,CAAE,MAAO,EAAO,QAAS,0CAA0C,M,CAE7F,GAAI,GAAY,WAAW,GAAS,WAAW,GAAW,CACxD,MAAO,CAAE,cAAe,CAAE,MAAO,EAAO,QAAS,uCAAuC,M,CAG1F,OAAO,IAAI,CAEf,CC1BgB,SAAA,GAAiB,EAAkB,GACjD,OAAQ,IACN,MAAM,EAAQ,EAAQ,MACtB,GAAG,IAAU,MAAQ,IAAU,WAAa,IAAU,GAAI,CACxD,OAAO,I,CAET,MAAM,EAAiB,aAAa,KAAK,GAEzC,IAAI,EAAgB,CAClB,MAAO,CAAE,eAAgB,CAAE,MAAO,EAAO,QAAS,0BAA0B,M,CAG9E,GAAG,MAAM,SAAS,IAAS,CACzB,MAAO,CAAE,eAAgB,CAAE,MAAO,EAAO,QAAS,0BAA0B,M,CAG9E,GAAI,GAAY,SAAS,GAAS,SAAS,GAAW,CACpD,MAAO,CAAE,eAAgB,CAAE,MAAO,EAAO,QAAS,0CAA0C,M,CAE9F,GAAI,GAAY,SAAS,GAAS,SAAS,GAAW,CACpD,MAAO,CAAE,eAAgB,CAAE,MAAO,EAAO,QAAS,uCAAuC,M,CAG3F,OAAO,IAAI,CAEf,CCzBgB,SAAA,KACd,OAAQ,IACN,MAAM,EAAQ,EAAQ,MACtB,GAAG,IAAU,MAAQ,IAAU,WAAa,IAAU,GAAI,CACxD,OAAO,I,CAET,MAAM,EAAe,uDAAuD,KAAK,GAEjF,IAAI,EAAa,CACf,MAAO,CAAE,YAAa,CAAE,MAAO,EAAO,QAAS,wBAAwB,M,CAGzE,OAAO,IAAI,CAEf,CCdM,SAAU,GAAoB,GAClC,OAAQ,IACN,IAAI,EAAU,CACZ,OAAO,I,CAET,GAAG,MAAM,QAAQ,GAAW,CAC1B,OAAO,I,CAET,MAAM,EAAQ,EAAQ,MACtB,GAAG,IAAU,MAAQ,IAAU,WAAa,IAAU,GAAI,CACxD,OAAO,I,CAET,MAAM,EAAmB,OAAO,KAAK,GAAU,SAAS,GAExD,IAAI,EAAiB,CACnB,MAAO,CAAE,YAAa,CAAE,MAAO,EAAO,QAAS,kBAAkB,M,CAGnE,OAAO,IAAI,CAEf,CCGa,MAAA,GAYX,YACI,CAAS,GACX,KAAK,UAAY,EACjB,KAAK,mB,CAGP,YAAI,GACF,OAAO,KAAK,S,CAMd,eAAa,CAAY,GACvB,GAAG,KAAK,SAAS,CACf,KAAK,SAAS,iBAAiB,CAAC,GAAG,EAAM,GAAI,QAAQ,EAAM,S,EAG/D,cAAa,CAAW,GACtB,GAAG,KAAK,SAAS,CACf,KAAK,SAAS,wBAAwB,CAAC,GAAG,EAAM,GAAI,QAAQ,EAAM,Q,EAStE,WAAA,CAA6B,GAAA,KAAE,GAAF,EAxCrB,KAAc,eAA0B,KAChD,KAAQ,SAA+B,KACvC,KAAS,UAAG,KACZ,KAAa,cAAG,EAChB,KAAc,eAAG,EAKR,KAAG,IAAsB,KAY1B,KAAS,UAAuB,UAE/B,KAAQ,SAAuB,UAahC,KAAa,cAAkC,KAE/C,KAAqB,sBAAY,MAuEzC,KAAA,YAAyC,CACvC,OAAQ,CACN,cAAe,KACf,UAAW,EACX,KAAM,MAER,OAAQ,CACN,cAAe,KACf,UAAW,EACX,KAAM,KAER,MAAO,CACL,cAAe,KACf,UAAW,EACX,KAAM,KAER,OAAQ,CACN,cAAe,KACf,UAAW,EACX,KAAM,KAER,KAAM,CACJ,cAAe,KACf,UAAW,EACX,KAAM,MAER,OAAQ,CACN,cAAe,KACf,UAAW,EACX,KAAM,OAIV,KAAA,cAA2C,CACzC,OAAQ,CACN,cAAe,aACf,UAAW,EACX,KAAM,QAER,MAAO,CACL,cAAe,aACf,UAAW,EACX,KAAM,QAER,OAAQ,CACN,cAAe,aACf,UAAW,EACX,KAAM,SAIV,KAAA,iBAA8C,CAC5C,eAAgB,GAChB,kBAAmB,GACnB,mBAAoB,EACpB,mBAAoB,MACpB,eAAgB,KAChB,kBAAmB,MACnB,iBAAkB,IAClB,kBAAmB,IACnB,cAAe,CAAC,IAAK,KACrB,MAAO,CACL,GAAI,KAAK,YACT,KAAM,KAIV,KAAA,MAAQ,CACN,OAAQ,KAAK,YACb,SAAU,KAAK,eAzIf,GAAO,KACL,GAAI,KAAK,YAAa,CACpB,KAAK,sBAAsB,KAAK,Y,KAIpC,GAAO,KACL,GAAI,KAAK,WAAY,CACnB,KAAK,mBAAmB,KAAK,W,KAMnC,qBAAA,CAAsB,GACpB,QAAQ,IAAI,sDAAuD,E,CAErE,kBAAA,CAAmB,GACjB,QAAQ,IAAI,oDAAqD,E,CAGnE,eAAA,GACE,MAAM,EAAY,KAAK,GAAG,cAG1B,KAAK,eAAiB,IAAI,gBAAgB,IACxC,IAAK,MAAM,KAAS,EAAS,CAC3B,MAAM,EAAQ,GAAO,aAAa,MAElC,GAAI,GAAS,KAAK,cAAe,CAC/B,KAAK,cAAgB,EACrB,KAAK,wB,MAMX,KAAK,eAAe,QAAQ,GAC5B,KAAK,eAEL,KAAK,cAAgB,IAAI,GAAS,cAAc,KAAK,IAAmB,KAAK,UAE7E,KAAK,sBAAwB,KAE7B,KAAK,Y,CAGP,WAAA,GACE,KAAK,gBAAgB,aACrB,KAAK,UAAU,S,CAGjB,sBAAA,GACE,aAAa,KAAK,eAElB,KAAK,cAAgB,YAAW,KAC9B,MAAM,EAAQ,KAAK,yBAAyB,cAAc,YAC1D,MAAM,EAAS,KAAK,yBAAyB,cAAc,aAE3D,GAAI,GAAS,EAAQ,CACnB,KAAK,UAAU,gBAAgB,EAAO,GACtC,KAAK,UAAU,M,KACV,CACL,QAAQ,MAAM,wB,IAEf,E,CA2EL,0BAAA,GACE,IAAK,KAAK,SAAU,CAClB,M,CAGF,MAAM,EAAwB,CAC5B,MAAO,MACP,oBAAqB,MACrB,WAAY,MACZ,yBAA0B,MAC1B,cAAe,KAAK,GAAK,GAAQ,IACjC,eAAgB,KAAK,GAAK,GAAQ,IAClC,WAAY,IAAI,GAAM,MAAM,EAAK,EAAK,GACtC,kBAAmB,IAAI,GAAM,MAAM,GAAK,GAAK,KAE/C,KAAK,SAAS,2BAA2B,E,CAG3C,oBAAA,GACE,IAAK,KAAK,SAAU,CAClB,M,CAGF,MAAM,EAA0B,CAC9B,KAAM,UACN,kBAAmB,QACnB,eAAgB,GAAS,WAAW,8BACpC,iBAAkB,CAChB,MAAO,EACP,WAAY,CACV,CACE,OAAQ,EACR,MAAO,WAET,CACE,OAAQ,MACR,MAAO,WAET,CACE,OAAQ,MACR,MAAO,cAKf,KAAK,SAAS,cAAc,EAAwB,eAAgB,EAAwB,iB,CAG9F,cAAA,CAAe,EAA0B,MACvC,IAAK,KAAK,SAAU,CAClB,M,CAEF,KAAK,SAAS,kBAAkB,E,CAGlC,YAAA,GACE,KAAK,SAAW,IAAI,GAAS,WAAW,CACtC,SAAU,KAAK,iBACf,MAAO,KAAK,MAAM,OAClB,aAAc,GACd,QAAS,KACT,IAAK,KAAK,IACV,KAAM,gCACN,kBAAmB,GACnB,cAAe,MACf,iBAAkB,MAClB,mBAAoB,EACpB,gBAAiB,CACf,cAAe,CACb,SAAU,KACV,WAAY,SAKlB,KAAK,uBACL,KAAK,iBACL,KAAK,SAAS,OAEd,GAAI,KAAK,UAAU,WAAY,CAC7B,KAAK,SAAS,WAAW,GAAK,gCAC9B,MAAM,EAAgB,KAAK,GAAG,eAAe,YAAc,KAAK,GAAG,cACnE,GAAe,yBAAyB,oBAAoB,IAAI,cAAc,KAAK,SAAS,W,KACvF,CACL,QAAQ,MAAM,uC,EAIV,iBAAA,GACN,KAAK,Y,CAGC,UAAA,GACN,IAAK,KAAK,sBAAuB,CAC/B,M,CAGF,IAAK,KAAK,cAAe,CACvB,QAAQ,MAAM,gCACd,M,CAGF,QAAQ,IAAI,kBAAmB,KAAK,UAEpC,KAAK,UAAY,KAEjB,KAAK,UAAU,gBAEf,MAAM,EAAiB,KACvB,KAAK,cAAc,WAAW,KAAK,SAAoB,KAAK,SAAU,GAAgB,MAAK,KAEzF,KAAK,UAAU,mBACf,KAAK,UAAY,KAAK,G,6FAtSf,GAAsB,KAAA,EAAA,MAAA,EAAA,aAAA,OAAA,EAAA,gBAAA,WAAA,Q,4EAAtB,GAAsB,aAAA,KAAA,SAAA,qBAAA,OAAA,CAAA,IAAA,MAAA,SAAA,WAAA,SAAA,WAAA,YAAA,cAAA,WAAA,cAAA,YAAA,EAAA,aAAA,0BAAA,MAAA,KAAA,UAAA,qBAAA,YAAA,OAAA,SAAA,EAAA,SCzBnC,wLAMA,OAAA,24BAAA,aAAA,EAAA,KAAA,OAAA,KDaI,EAAa,KAAA,cAAA,cAAA,EAAA,kBAAA,MAAA,E,iFAMJ,GAAsB,WAAA,E,KATlC,EACW,KAAA,EAAA,SAAA,qBACD,QAAA,CACP,GAIa,cAAA,EAAkB,KAAI,SAAA,wLAAA,OAAA,+4BAUN,eAAA,MAAA,KAAA,EAAA,aAAA,eAAA,CAAA,wBAAuB,E,KAArD,E,MAAU,sBAEF,IAAG,EAAX,KAAA,IAGG,SAAQ,EADX,KAAA,IAYQ,SAAQ,EAAhB,KAAA,IACY,YAAW,EAAvB,KAAA,IAKY,WAAU,EAAtB,KAAA,OErDG,SAAU,GAAkB,GAChC,OAAQ,IACN,IAAI,EAAU,CACZ,OAAO,I,CAET,GAAG,MAAM,QAAQ,GAAW,CAC1B,OAAO,I,CAET,MAAM,EAAQ,EAAQ,MACtB,GAAG,IAAU,MAAQ,IAAU,WAAa,IAAU,GAAI,CACxD,OAAO,I,CAET,MAAM,EAAmB,OAAO,KAAK,GAAU,SAAS,GAExD,IAAI,EAAiB,CACnB,MAAO,CAAE,YAAa,CAAE,MAAO,EAAO,QAAS,kBAAkB,M,CAGnE,OAAO,IAAI,CAEf,CCpBM,SAAU,GAAoB,GAClC,OAAQ,IACN,IAAI,EAAU,CACZ,OAAO,I,CAET,GAAG,MAAM,QAAQ,GAAW,CAC1B,OAAO,I,CAET,MAAM,EAAQ,EAAQ,MACtB,GAAG,IAAU,MAAQ,IAAU,WAAa,IAAU,GAAI,CACxD,OAAO,I,CAET,MAAM,EAAmB,OAAO,KAAK,GAAU,SAAS,GAExD,IAAI,EAAiB,CACnB,MAAO,CAAE,YAAa,CAAE,MAAO,EAAO,QAAS,kBAAkB,M,CAGnE,OAAO,IAAI,CAEf,CCpBM,SAAU,GAAwB,GACtC,OAAQ,IACN,IAAI,EAAW,CACb,OAAO,I,CAET,IAAI,MAAM,QAAQ,GAAY,CAC5B,OAAO,I,CAGT,MAAM,EAAQ,EAAQ,MACtB,GAAG,IAAU,MAAQ,IAAU,WAAa,IAAU,GAAI,CACxD,OAAO,I,CAET,MAAM,EAAmB,EAAU,SAAS,GAE5C,IAAI,EAAiB,CACnB,MAAO,CAAE,YAAa,CAAE,MAAO,EAAO,QAAS,kBAAkB,M,CAGnE,OAAO,IAAI,CAEf,CChBa,MAAA,GAIX,WAAA,GAFA,KAAA,OAAoD,IAAI,GAA0C,K,CAIlG,cAAI,GACF,OAAO,KAAK,OAAO,K,CAGrB,UAAI,GACF,OAAO,KAAK,M,CAGd,QAAA,CAAS,GACP,KAAK,OAAO,KAAK,E,QAfR,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAuB,KAAA,GAAA,OAAA,EAAA,gBAAA,YAAA,QAAvB,KAAA,MAAA,EAAA,uBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAuB,WAFtB,QAAM,E,iFAEP,GAAuB,WAAA,E,KAHnC,EAAW,KAAA,EACV,WAAY,W,wBC+ER,MAAO,WACH,GAKE,0BAAA,CAA2B,GACnC,MAAM,EAAwB,KAAK,sBACnC,OAAO,EAAW,SAAS,E,CAG7B,WAAA,CAAY,EACS,EACA,EACA,GAEnB,MAAM,GAJa,KAAW,YAAX,EACA,KAAG,IAAH,EACA,KAAuB,wBAAvB,EAVX,KAAA,sBAAyB,IAAI,EAAU,IAevC,KAAA,UAAY,EAAgB,OAC9B,KAAgB,iBAA+B,KAM/C,KAAkB,mBAAiC,KAMlD,KAAG,IAAsB,KACzB,KAAQ,SAAuB,UAE9B,KAAA,iBAAmB,EAAgB,OAKrC,KAAa,cAAY,GAgBhB,KAAA,sBAAkD,IAAI,GAAyB,MAC7E,KAAA,kBAAkD,EAAO,CAAC,GAAG,GAAG,QAAQ,MAAM,OAAO,QACrF,KAAA,iBAAiD,EAAO,CAAC,GAAG,GAAG,QAAQ,MAAM,OAAO,QAEtF,KAAA,kBAAoB,IAAI,GAAyB,IACjD,KAAA,4BAA8B,IAAI,GAAyB,IAE5E,KAAc,eAAgC,GAC9C,KAAoB,qBAAgC,GACpD,KAAsB,uBAAgC,GAE5C,KAAA,wBAA0B,IAAI,EAkJ9B,KAAA,sBAAwB,EAA+B,IAmHzD,KAAiB,kBAAW,E,CAlTpC,mBAAI,GACF,OAAO,KAAK,gB,CAKd,qBAAI,GACF,OAAO,KAAK,kB,CAOd,mBAAa,CAAgB,GAC3B,KAAK,iBAAiB,IAAI,E,CAI5B,gBAAa,CAAa,GACxB,GAAG,KAAK,gBAAkB,EAAI,CAC5B,M,CAEF,KAAK,2BAEL,KAAK,kBAAkB,KAAK,GAC5B,KAAK,uBAAuB,EAAI,KAAK,UACrC,KAAK,cAAgB,C,CAGvB,gBAAI,GACF,OAAO,KAAK,a,CAgBd,mCAAA,GACE,KAAK,qBAAqB,KAAK,CAC7B,GAAI,kBACJ,MAAO,KAAK,iBAAiB,QAAQ,oBACrC,QAAS,KAAK,iBAAiB,QAAQ,oBACvC,UAAW,KAAK,mBAChB,YAAa,W,CAIjB,qCAAA,GACE,KAAK,uBAAuB,KAAK,CAC/B,GAAI,0BACJ,MAAO,KAAK,iBAAiB,QAAQ,SACrC,QAAS,KAAK,iBAAiB,QAAQ,SACvC,SAAU,KAAK,sBACf,YAAa,YAEf,KAAK,uBAAuB,KAAK,CAC/B,GAAI,4BACJ,MAAO,KAAK,iBAAiB,QAAQ,WACrC,QAAS,KAAK,iBAAiB,QAAQ,WACvC,SAAU,MACV,YAAa,a,CAIjB,QAAA,GACE,KAAK,sCACL,KAAK,wCAEL,KAAK,eAAiB,KAAK,qBAE3B,KAAK,qB,CAGP,mBAAA,GACE,KAAK,4BAA4B,UAAU,CACzC,KAAO,IACL,GAAI,EAAI,CACN,KAAK,wBAAwB,EAAI,KAAK,S,KAK5C,KAAK,kBAAkB,UAAU,CAC/B,KAAO,IACL,KAAK,4BAA4B,KAAK,GACtC,KAAK,iCAAiC,EAAI,KAAK,SAAS,G,CAK9D,iCAAA,CAAkC,GAChC,QAAQ,IAAI,GACZ,KAAK,kBAAkB,KAAK,EAAK,G,CAGnC,gCAAA,CAAiC,GAC/B,MAAM,EAAyB,CAC7B,GAAG,EAAK,GACR,QAAS,EAAK,QACd,OAAQ,EAAK,QACf,KAAK,kBAAkB,IAAI,E,CAG7B,+BAAA,CAAgC,GAC9B,MAAM,EAAyB,CAC7B,GAAG,EAAK,GACR,QAAS,EAAK,QACd,OAAQ,EAAK,QACf,KAAK,iBAAiB,IAAI,E,CAI5B,iCAAA,CAAkC,GAChC,QAAQ,IAAI,GACZ,KAAK,4BAA4B,KAAK,EAAK,G,CAGrC,oBAAA,CAAqB,EAAkB,GAC7C,IAAK,KAAK,IAAK,CACb,M,CAGF,IAAK,EAAU,CACb,M,CAGF,OAAO,GACL,KAAK,IAAI,QAAQ,YAAY,EAAU,EAAU,MAAO,MAAO,W,CAI3D,sBAAA,CACN,EACA,GAEA,KAAK,qBAAqB,EAAU,IAAW,UAAU,CACvD,KAAO,IACL,GAAI,EAAe,CACjB,KAAK,iBACH,GAA2B,mBAAmB,E,KAMhD,qCAAA,CACN,EACA,GAEA,IAAK,KAAK,IAAK,CACb,M,CAGF,IAAK,EAAU,CACb,M,CAGF,OAAO,GACL,KAAK,IAAI,QAAQ,6BAA6B,EAAU,G,CAIpD,gCAAA,CACN,EACA,GAEA,KAAK,sCAAsC,EAAU,IAAW,UAAU,CACxE,KAAO,IACL,GAAI,EAAe,CACjB,MAAM,EACJ,GAA6B,mBAAmB,GAClD,GAAI,GAAc,UAAU,OAAQ,CAClC,KAAK,mBAAqB,C,KACrB,CACL,KAAK,mBAAqB,I,MAS5B,qBAAA,CACN,EACA,GAEA,IAAK,KAAK,IAAK,CACb,M,CAGF,IAAK,EAAU,CACb,M,CAGF,OAAO,GACL,KAAK,IAAI,QAAQ,IAAI,EAAU,EAAU,IAAK,UAAW,MAAO,W,CAI5D,uBAAA,CACN,EACA,GAEA,KAAK,sBAAsB,EAAU,IAAW,UAAU,CAKxD,KAAO,IACL,KAAK,wBAAwB,SAAS,GACtC,KAAK,sBAAsB,IAAI,KAAK,mCAAmC,GAAgB,EAEzF,MAAO,KACL,KAAK,sBAAsB,IAAI,GAAG,G,CAMhC,QAAA,CAAS,GACf,MAAM,EAAoB,KAAK,iBAAiB,QAAQ,SACxD,MAAM,EAAe,EAAO,KAAO,EAAO,KAAO,GACjD,MAAM,EACJ,KAAK,iBAAiB,QAAQ,eAChC,MAAM,EAAsB,EAAO,YACnC,MAAM,EAAoB,KAAK,iBAAiB,QAAQ,SACxD,MAAM,EAAe,EAAO,GAC5B,GACE,IAAgB,MAChB,IAAgB,WAChB,IAAgB,GAChB,CACA,MAAO,GAAG,MAAc,MAAS,MAAc,G,CAEjD,MAAO,GAAG,MAAc,MAAS,MAAqB,MAAgB,MAAc,G,CAI9E,kCAAA,CAAmC,GACzC,MAAM,EAAsC,GAC5C,IAAI,EAAwB,KAC5B,GAAI,EAAe,yBAA0B,CAC3C,EAAwB,EAAe,wB,CAGzC,IAAK,EAAe,WAAY,CAC9B,OAAO,C,CAGT,MAAM,EAAe,EAAe,WACpC,IAAK,MAAO,EAAW,KAAkB,OAAO,QAAQ,GAAe,CACrE,MAAM,EAAiC,CACrC,KAAM,EACN,SAAU,MACV,WAAY,IAGd,GAAI,IAAwB,GAAY,CACtC,EAAS,KAAO,EAAsB,E,CAGxC,IAAK,EAAe,CAClB,Q,CAGF,IAAK,MAAM,KAAU,OAAO,OAAO,GAAgB,CACjD,MAAM,EAA6B,CACjC,GAAI,EAAO,GACX,KAAM,EAAO,KACb,YAAa,EAAO,YACpB,MAAO,EAAO,MACd,MAAO,EAAO,MACd,KAAM,EAAO,KACb,KAAM,EAAO,KACb,QAAS,EAAO,QAChB,QAAS,EAAO,QAChB,eAAgB,EAAO,eACvB,aAAc,EAAO,aACrB,QAAS,KAAK,SAAS,GACvB,SAAU,EAAO,SACjB,SAAU,EAAO,UAGnB,EAAS,WAAW,KAAK,E,CAE3B,EAAO,KAAK,E,CAGd,OAAO,C,CAGT,WAAA,GACE,KAAK,sBAAwB,IAAI,EAAU,G,CAI7C,WAAA,GACE,MAAM,EAAqB,IAAI,GAC/B,MAAM,EAAsC,GAC5C,KAAK,wBAAwB,SAAQ,IACnC,MAAM,EAAqD,GAC3D,EAAgB,WAAW,SAAQ,IACjC,UAAW,EAAU,OAAS,UAAY,aAAa,KAAK,EAAU,QAAW,EAAU,QAAS,CAClG,EAAY,EAAU,IAAM,KAAK,YAAY,QAC3C,EAAmB,UAAU,GAC3B,EAAU,aAAe,CAAC,EAAW,QAAQ,wBAA0B,IAE3E,M,CAEF,UAAW,EAAU,OAAS,UAAY,aAAa,KAAK,EAAU,eACvD,EAAU,UAAY,UAAY,cAAc,KAAK,EAAU,UAE9E,CACE,EAAY,EAAU,IAAM,KAAK,YAAY,QAC3C,EAAmB,UAAU,IAE/B,M,CAEF,UAAW,EAAU,OAAS,UAAY,YAAY,KAAK,EAAU,QAAW,EAAU,QAAS,CACjG,EAAY,EAAU,IAAM,KAAK,YAAY,QAC3C,EAAmB,UAAU,IAE/B,M,CAEF,UAAW,EAAU,OAAS,UAAY,YAAY,KAAK,EAAU,QAAW,EAAU,QAAS,CACjG,EAAY,EAAU,IAAM,KAAK,YAAY,QAC3C,EAAmB,UAAU,GAC3B,EAAU,aAAe,CAAC,GAAgB,EAAU,SAAU,EAAU,WAAa,IAEzF,M,CAEF,UAAW,EAAU,OAAS,UAAY,cAAc,KAAK,EAAU,QAAW,EAAU,QAAS,CACnG,EAAY,EAAU,IAAM,KAAK,YAAY,QAC3C,EAAmB,UAAU,GAC3B,EAAU,aAAe,CAAC,GAAiB,EAAU,SAAU,EAAU,WAAa,IAE1F,M,CAEF,UAAW,EAAU,OAAS,UAAY,UAAU,KAAK,EAAU,QAAW,EAAU,QAAS,CAC/F,EAAY,EAAU,IAAM,KAAK,YAAY,QAC3C,EAAmB,UAAU,GAC3B,EAAU,aAAe,CAAC,MAAmB,IAEjD,M,CAEF,UAAW,EAAU,OAAS,UAAY,YAAY,KAAK,EAAU,eACxD,EAAU,UAAY,UAAY,iBAAiB,KAAK,EAAU,UAC7E,CACA,EAAY,EAAU,IAAM,KAAK,YAAY,QAC3C,EAAmB,UAAU,GAC3B,EAAU,aAAe,CAAC,GAAoB,EAAU,iBAAmB,IAE/E,M,CAEF,UAAW,EAAU,OAAS,UAAY,UAAU,KAAK,EAAU,eACtD,EAAU,UAAY,UAAY,iBAAiB,KAAK,EAAU,UAC7E,CACA,EAAY,EAAU,IAAM,KAAK,YAAY,QAC3C,EAAmB,UAAU,GAC3B,EAAU,aAAe,CAAC,GAAkB,EAAU,iBAAmB,IAE7E,M,CAEF,UAAW,EAAU,OAAS,UAAY,cAAc,KAAK,EAAU,eAC1D,EAAU,UAAY,UAAY,iBAAiB,KAAK,EAAU,UAC7E,CACA,EAAY,EAAU,IAAM,KAAK,YAAY,QAC3C,EAAmB,UAAU,GAC3B,EAAU,aAAe,CAAC,GAAoB,EAAU,iBAAmB,IAE/E,M,CAEF,UAAW,EAAU,OAAS,UAAY,YAAY,KAAK,EAAU,eACxD,EAAU,UAAY,UAAY,iBAAiB,KAAK,EAAU,UAC7E,CACA,EAAY,EAAU,IAAM,KAAK,YAAY,QAC3C,EAAmB,UAAU,GAC3B,EAAU,aAAe,CAAC,GAAoB,EAAU,iBAAmB,IAE/E,M,CAEF,UAAW,EAAU,OAAS,UAAY,YAAY,KAAK,EAAU,eACxD,EAAU,UAAY,UAAY,cAAc,KAAK,EAAU,UAC1E,CACA,EAAY,EAAU,IAAM,KAAK,YAAY,QAC3C,EAAmB,UAAU,GAC3B,EAAU,aAAe,CAAC,GAAwB,EAAU,iBAAmB,IAEnF,M,CAEF,UAAW,EAAU,OAAS,UAAY,cAAc,KAAK,EAAU,QAAW,EAAU,QAAS,CACnG,EAAY,EAAU,IAAM,KAAK,YAAY,QAC3C,EAAmB,UAAU,GAC3B,EAAU,aAAe,GAAK,IAElC,M,KAGJ,EAAM,EAAgB,MAAQ,KAAK,YAAY,MAAM,EAAY,IAEnE,KAAK,sBAAwB,KAAK,YAAY,MAAM,GAEpD,KAAK,kBAAoB,KAAK,UAAU,KAAK,sBAAsB,OACnE,KAAK,sBAAsB,aAAa,UAAU,CAChD,KAAO,IACL,MAAM,EAAmB,KAAK,UAAU,KAAW,KAAK,kBACxD,KAAK,sBAAsB,OAAO,KAAK,sBAAsB,OAAS,GAAS,G,CAK7E,gBAAA,CAAiB,GACvB,MAAM,EAAqC,KAAK,wBAChD,IAAK,MAAM,KAAa,EAAY,CAClC,IAAK,MAAM,KAAQ,EAAU,WAAY,CACvC,GAAI,EAAK,KAAO,EAAM,CACpB,OAAO,EAAK,I,GAIlB,MAAO,E,CAGD,gBAAA,CAAiB,GACvB,MAAM,EAAqC,KAAK,wBAChD,IAAK,MAAM,KAAa,EAAY,CAClC,IAAK,MAAM,KAAQ,EAAU,WAAY,CACvC,GAAI,EAAK,KAAO,EAAM,CACpB,OAAO,EAAK,I,GAIlB,MAAO,E,CAGD,mBAAA,CAAoB,GAC1B,MAAM,EAAqC,KAAK,wBAChD,IAAK,MAAM,KAAa,EAAY,CAClC,IAAK,MAAM,KAAQ,EAAU,WAAY,CACvC,GAAI,EAAK,KAAO,EAAM,CACpB,OAAO,EAAK,O,GAIlB,MAAO,E,CAGD,sBAAA,CAAuB,GAC7B,MAAO,UAAU,KAAK,IAAU,OAAO,KAAK,E,CAGtC,qBAAA,CAAsB,GAC5B,OAAO,WAAW,E,CAGZ,oBAAA,CAAqB,EAAc,GACzC,MAAM,EAAqC,KAAK,wBAChD,IAAK,MAAM,KAAa,EAAY,CAClC,IAAK,MAAM,KAAQ,EAAU,WAAY,CACvC,GAAI,EAAK,KAAO,EAAM,CACpB,OAAO,IAAU,EAAK,K,GAI5B,OAAO,K,CAGD,eAAA,CAAgB,GACtB,MAAM,EAA0C,GAEhD,OAAO,KAAK,EAAU,UAAU,SAAQ,IACtC,MAAM,EAAU,EAAU,IAAI,GAE9B,GAAI,aAAmB,EAAa,CAElC,GAAI,EAAQ,MAAO,CACjB,MAAM,EAAmB,KAAK,iBAAiB,GAC/C,MAAM,EAAmB,KAAK,iBAAiB,GAE/C,GAAG,IAAa,GAAI,CAClB,MAAM,EAAY,CAChB,GAAI,EACJ,MAAO,EAAQ,OAEjB,EAAY,GAAO,C,KACd,CACL,GAAG,aAAa,KAAK,GAAW,CAC9B,MAAM,EAAgB,KAAK,uBAAuB,EAAQ,OAC1D,GAAG,KAAK,qBAAqB,EAAK,GAAO,CACvC,MAAM,EAAY,CAChB,GAAI,EACJ,MAAO,GAET,EAAY,GAAY,C,OAGvB,GAAG,YAAY,KAAK,GAAW,CAClC,MAAM,EAAe,KAAK,sBAAsB,EAAQ,OACxD,GAAG,KAAK,qBAAqB,EAAK,GAAO,CACvC,MAAM,EAAY,CAChB,GAAI,EACJ,MAAO,GAET,EAAY,GAAY,C,MAGvB,CACH,MAAM,EAAe,EAAQ,MAE7B,GAAG,KAAK,qBAAqB,EAAK,EAAQ,OAAQ,CAChD,MAAM,EAAY,CAChB,GAAI,EACJ,MAAO,GAET,EAAY,GAAY,C,UAK3B,GAAI,aAAmB,EAAW,CACvC,GAAG,EAAQ,MAAO,CAEhB,MAAM,EAAgB,KAAK,gBAAgB,GAC3C,GAAI,OAAO,KAAK,GAAe,OAAS,EAAG,CACzC,EAAY,GAAO,C,OAM3B,OAAO,C,CAGD,qBAAA,GACN,MAAM,EAAuC,GAC7C,EAAS,MAAQ,KAAK,kBAAkB,MACxC,EAAS,WAAa,KACtB,EAAS,cAAgB,KAAK,gBAAgB,KAAK,uBACnD,KAAK,qBAAqB,E,CAGpB,wBAAA,GACN,KAAK,UAAU,IAAI,OACnB,KAAK,cACL,KAAK,eAAiB,KAAK,oB,CAGnB,aAAA,CAAc,GACtB,GAAI,EAAO,KAAO,kBAAmB,CACnC,KAAK,UAAU,IAAI,MACnB,KAAK,cACL,QAAQ,IAAI,2BACZ,KAAK,eAAiB,KAAK,sB,CAG7B,GAAI,EAAO,KAAO,0BAA2B,CAC3C,KAAK,wBACL,KAAK,2BACL,QAAQ,IAAI,kC,CAGd,GAAI,EAAO,KAAO,4BAA6B,CAC7C,KAAK,2BACL,QAAQ,IAAI,iC,EAIhB,kBAAA,CAAmB,GACjB,OAAO,EAAqB,WAAW,MAAM,IACnC,GAA2B,I,CAI7B,oBAAA,CAAqB,GAC7B,MAAM,EAAmB,KAAK,4BAA4B,MAC1D,IAAK,IAAS,EAAkB,CAC9B,M,CAGF,IAAK,KAAK,IAAK,CACb,M,CAGF,GAAK,KAAK,IAAI,QAAQ,IAAI,EAAkB,KAAK,UAAU,KAAQ,UAAU,CAC3E,KAAO,IACL,KAAK,wBAAwB,EAAkB,KAAK,UACpD,KAAK,uBAAuB,EAAkB,KAAK,UACnD,KAAK,wBAAwB,KAAK,CAAE,GAAI,EAAkB,QAAS,EAAM,YAAW,G,6FA5mB/E,GAAyB,KAAA,EAAA,MAAA,EAAA,kBAAA,CAAA,MAAA,EAAA,aAAA,CAAA,MAAA,EAAA,mBAAA,CAAA,MAAA,KAAA,OAAA,EAAA,gBAAA,WAAA,QAAzB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAyB,aAAA,KAAA,SAAA,wBAAA,OAAA,CAAA,IAAA,MAAA,SAAA,WAAA,gBAAA,kBAAA,aAAA,gBAAA,QAAA,CAAA,wBAAA,2BAAA,gBAAA,KAAA,SAAA,EAAA,SCpFtC,ikGDmEI,OAAA,ghCAAA,aAAA,EAAA,KAAA,YAAA,KAAA,GAAuB,SAAA,sBAAA,OAAA,aAAA,QAAA,qBAAA,KAAA,YAAA,KACvB,GAA6B,SAAA,+BAAA,KAAA,WAAA,KAC7B,GACA,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,KAAA,YAAA,KAAA,GAA+B,SAAA,+BAAA,OAAA,kDAAA,QAAA,8CAAA,KAAA,YAAA,KAC/B,GAAuC,SAAA,wCAAA,OAAA,sBAAA,QAAA,mBAAA,KAAA,YAAA,KACvC,GACA,SAAA,0BAAA,OAAA,yCAAA,QAAA,kCAAA,KAAA,YAAA,KAAA,GACA,SAAA,qCAAA,KAAA,YAAA,KAAA,GAA8B,SAAA,8BAAA,OAAA,0EAAA,KAAA,YAAA,KAE9B,GAAsB,SAAA,qBAAA,OAAA,2DAAA,KAAA,WAAA,KACtB,GAAmB,CAAA,KAAA,YAAA,KAAA,EAAA,cAAA,SAAA,iDAAA,KAAA,YAAA,KAAA,EAAA,qBAAA,SAAA,6FAAA,KAAA,YAAA,KAAA,EAAA,mBAAA,SAAA,cAAA,OAAA,cAAA,QAAA,aAAA,SAAA,aAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAOV,GAAyB,WAAA,E,KApBrC,EACW,KAAA,EAAA,SAAA,wBACD,QAAA,CACP,GACA,GACA,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GAIa,cAAA,EAAkB,UAAS,SAAA,ikGAAA,OAAA,ohCAmCjC,eAAA,MAAA,KAAA,EAAA,kBAAA,CAAA,KAAA,EAAA,aAAA,CAAA,KAAA,EAAA,mBAAA,CAAA,KAAA,KAAA,eAAA,CAAA,IAAG,EAAX,KAAA,IACQ,SAAQ,EAAhB,KAAA,IAGY,gBAAe,EAA3B,KAAA,IAKY,aAAY,EAAxB,KAAA,IA0BS,wBAAuB,EAAhC,KAAA,OE9HU,MAAA,GAQX,SACI,GACF,OAAO,KAAK,M,CAEd,SAAI,CAAM,GACR,KAAK,OAAS,C,CAGhB,WACI,GACF,OAAO,KAAK,Q,CAEd,WAAI,CAAQ,GACV,KAAK,SAAW,C,CAGlB,WAAA,CACmB,EACA,GADA,KAAa,cAAb,EACA,KAAgB,iBAAhB,EAzBX,KAAM,OAAW,GACjB,KAAQ,SAAW,GAC3B,KAA2B,4BAAW,UACtC,KAA2B,4BAAW,UAE5B,KAAO,QAA2B,GAsB1C,MAAM,EAAO,KAAK,cAAc,UAEhC,GAAI,EAAM,CACR,KAAK,MAAQ,EAAK,OAAS,GAC3B,KAAK,QAAU,EAAK,SAAW,GAC/B,KAAK,4BAA8B,EAAK,6BAA+B,UACvE,KAAK,4BAA8B,EAAK,6BAA+B,UACvE,KAAK,eAAiB,EAAK,c,CAG7B,KAAK,mB,CAGP,iBAAA,GACE,KAAK,QAAU,CACb,CACE,GAAI,SACJ,MAAO,KAAK,iBAAiB,QAAQ,KAAK,6BAC1C,QAAS,KAAK,iBAAiB,QAAQ,KAAK,6BAC5C,SAAU,MACV,YAAa,WAEf,CACE,GAAI,SACJ,MAAO,KAAK,iBAAiB,QAAQ,KAAK,6BAC1C,QAAS,KAAK,iBAAiB,QAAQ,KAAK,6BAC5C,SAAU,MACV,YAAa,a,CAKnB,KAAA,GACE,KAAK,cAAc,QAClB,SAAS,eAA+B,M,CAG3C,aAAA,CAAc,GACZ,GAAI,EAAM,MAAQ,UAAY,EAAM,MAAQ,MAAO,CACjD,KAAK,cAAc,O,EAIvB,sBAAA,CAAuB,GACrB,KAAK,cAAc,QAEnB,GAAI,EAAO,KAAO,SAAU,CAC1B,KAAK,kB,EAKT,aAAA,CAAc,GACZ,GAAI,EAAM,MAAQ,UAAY,EAAM,MAAQ,MAAO,CACjD,KAAK,O,SAlFE,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAoC,KAAA,EAAA,MAAA,IAAA,CAAA,MAAA,EAAA,mBAAA,OAAA,EAAA,gBAAA,WAAA,QAApC,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GCzBb,aAAA,KAAA,SAAA,qCAAA,OAAA,CAAA,MAAA,QAAA,QAAA,WAAA,KAAA,CAAA,UAAA,8CAAA,SAAA,EAAA,SAAA,kiBDiBI,OAAA,wgEAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,YAAA,KAAA,GAA0B,SAAA,0BAAA,OAAA,yCAAA,QAAA,kCAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAOjB,GAAoC,WAAA,E,KAXhD,EACW,KAAA,EAAA,SAAA,qCACD,QAAA,CACP,EACA,IAIa,cAAA,EAAkB,UAAS,SAAA,kiBAAA,OAAA,4gEAYtC,eAAA,MAAA,KAAA,IAAA,CAAA,KAAA,EAAA,mBAAA,eAAA,CAAA,MAAK,EADR,KAAA,IASG,QAAO,EADV,KAAA,IAgED,cAAa,E,KADZ,E,MAAa,mBAAoB,CAAC,gBEnGxB,MAAA,GAEX,WAAA,GAAA,CAEA,GAAA,CAAI,KAAmB,GACrB,IAAI,EAAQ,EAEZ,OAAO,EAAO,QAAQ,aAAa,CAAC,EAAe,KACjD,MAAM,EAAiB,EAAgB,SAAS,EAAe,IAAM,EAAI,IACzE,MAAM,EAAS,EAAQ,GAEvB,GAAI,IAAW,KAAM,CACnB,MAAO,Q,CAET,GAAI,IAAW,UAAW,CACxB,MAAO,E,CAET,OAAO,EAAO,UAAU,G,CAM5B,YAAA,CAAa,EAAe,EAA2B,GAErD,MAAM,EAA+B,CACnC,GAAI,EAAK,GACT,KAAM,EAAK,KACX,SAAU,EAAK,SACf,KAAM,EAAK,KACX,KAAM,EAAK,KACX,cAAe,GACf,UAAW,GACX,UAAW,EACX,QAAS,EAAK,QACd,OAAQ,IAEV,MAAM,EAAe,EAAI,iBACzB,MAAM,EAAa,sCACnB,MAAM,EAAM,EAAI,gBAAgB,EAEhC,EAAO,KAAO,YAAY,EAAK,KAAO,KAAM,QAAQ,IACpD,EAAO,KAAO,GAAG,KAAK,IAAI,EAAK,EAAK,GAAI,EAAK,sBAAsB,IAA6C,wBAChH,GAAI,EAAK,SAAS,OAAS,GAAI,CAC7B,MAAM,EAAY,EAAK,SAAS,MAAM,KACtC,GAAI,EAAU,OAAS,EAAG,CACxB,EAAO,cAAgB,EAAU,MAAM,GAAI,GAAG,KAAK,KACnD,EAAO,UAAY,IAAM,EAAU,OAAO,E,KACrC,CACL,EAAO,cAAgB,EAAK,Q,MAEzB,CACL,EAAO,cAAgB,EAAK,Q,CAE9B,OAAO,C,QAtDE,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAiB,KAAA,GAAA,OAAA,EAAA,gBAAA,YAAA,QAAjB,KAAA,MAAA,EAAA,uBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAiB,WAFhB,QAAM,E,iFAEP,GAAiB,WAAA,E,KAH7B,EAAW,KAAA,EACV,WAAY,W,wBCcP,MAAM,GAAmC,OAEnC,MAAA,GAAsB,CAAC,EAA4B,EAAkB,KAEhF,MAAM,EAAe,EAAiB,KAAK,GACzC,GAAK,EAAI,QAAQ,mBAAmB,EAAU,KAAK,UAAU,CAAE,aAAc,QAI/E,OAAO,GAAS,GACf,KAEC,IAAU,IAAM,GAAK,EAAI,QAAQ,mBAAmB,MACrD,EAcG,MAAO,WAAkC,GAE7C,WAAA,CAAY,EACgB,EACA,EACA,EACA,GAE1B,MAAM,GALoB,KAAa,cAAb,EACA,KAAQ,SAAR,EACA,KAAE,GAAF,EACA,KAAU,WAAV,EAOpB,KAAa,cAAY,GACjC,KAAW,YAAG,MACd,KAAa,cAAY,KAEzB,KAAU,WAAU,MAGX,KAAuB,wBAAY,KAEJ,KAAQ,SAAG,MAEX,KAAgB,iBAAY,KAE5B,KAAkB,mBAAG,MAEpD,KAAA,aAAsB,GAE/B,KAAY,aAA4B,GAmB9B,KAAA,kBAAoB,IAAI,EACxB,KAAA,sBAAwB,IAAI,EAC7B,KAAuB,wBAAW,KAClC,KAAO,QAAoC,KAC3C,KAAA,iBAAuC,uBACvC,KAAG,IAAY,MAeP,KAAA,kBAAoB,IAAI,GAAyB,IAClE,KAAgB,iBAAY,EAC5B,KAAA,eAA8C,CAC5C,CACE,GAAI,gBACF,MAAO,KAAK,iBAAiB,QAAQ,iBACrC,QAAS,KAAK,iBAAiB,QAAQ,iBACvC,UAAW,KAAK,wBAChB,YAAa,YAwEnB,KAAiB,kBAAoB,KACrC,KAAQ,SAAW,MACnB,KAAsB,uBAAU,iBA9I9B,KAAK,kBAAoB,KAAK,GAAG,cAAc,U,CAuBjD,eACI,CAAY,GACd,KAAK,aAAe,EACpB,KAAK,qB,CAGP,eAAI,GACF,OAAO,KAAK,Y,CAGd,mBAAA,GACE,GAAG,KAAK,KAAO,KAAK,aAAa,CAC/B,KAAK,aAAe,KAAK,wBAAwB,KAAK,IAAI,KAAK,a,EAYnE,gBACI,CAAa,GACf,IAAI,EAAG,CACL,M,CAEF,KAAK,kBAAkB,KAAK,GAC5B,KAAK,cAAgB,C,CAGvB,gBAAI,GACF,OAAO,KAAK,a,CAed,QAAA,GACE,IAAK,KAAK,SAAU,CAClB,KAAK,kBAAkB,UAAU,CAC/B,KAAO,IACL,KAAK,+BAA+B,EAAG,G,EAM/C,WAAA,GACE,KAAK,YAAc,I,CAIb,oBAAA,CAAqB,GACzB,MAAM,EAAmB,CACvB,GAAI,EAAK,GACT,KAAM,EAAK,KACX,UAAW,EAAK,KAChB,IAAI,GACJ,UAAW,GACX,UAAW,GACX,KAAM,iBACN,kBAAkB,IAEtB,OAAO,C,CAGD,uBAAA,CAAwB,EAAgB,GAC9C,MAAM,EAAiB,EAAM,KAAK,GAAS,KAAK,WAAW,aAAa,EAAI,EAAK,CAAC,KAAK,kBAAkB,UACzG,EAAe,MAAK,CAAC,EAAE,KACrB,GAAG,EAAE,SAAS,cAAgB,EAAE,SAAS,cAAgB,OAAQ,EACjE,GAAG,EAAE,SAAS,cAAiB,EAAE,SAAS,cAAgB,OAAO,EACjE,OAAO,CAAC,IAEV,OAAO,C,CAGD,8BAAA,CAA+B,GAErC,KAAK,6BAA6B,IAAW,UAAU,CACrD,KAAO,IACL,GAAG,EAAc,CAEf,KAAK,iBAAmB,GAAe,OACvC,GAAG,KAAK,IAAI,CACV,MAAM,EAAS,KAAK,wBAAwB,KAAK,IAAI,GACrD,GAAG,EAAO,CACR,KAAK,aAAe,C,OAQxB,4BAAA,CAA6B,GACnC,IAAI,KAAK,IAAI,CACX,M,CAGF,IAAI,EAAU,CACZ,M,CAEF,OAAO,GAAK,KAAK,IAAI,QAAQ,mBAAmB,G,CAQlD,kBAAA,CAAmB,EAAS,MAC1B,IAAI,KAAK,iBAAiB,CACxB,M,CAEF,MAAM,EAAW,KAAK,cAAgB,KAAK,kBAAkB,cAAc,IAAM,KAAK,kBACrD,SAAS,eAAe,KAAK,kBAC9D,IAAK,EAAS,CACZ,M,CAEF,GAAG,KAAK,cAAc,CACpB,GAAG,EAAQ,cAAc,CACvB,KAAK,SAAS,SAAS,EAAQ,cAAc,UAAU,EAAO,QAAQ,O,MAEnE,CACL,KAAK,SAAS,SAAS,EAAQ,cAAc,UAAU,EAAO,QAAQ,O,CAIxE,KAAK,SAAW,C,CAIlB,+BAAA,GACE,KAAK,mBAAmB,M,CAG1B,QAAA,CAAS,EAAgB,GAEvB,MAAM,EAAmB,EAAI,QAAQ,IAAS,KAAK,YAAY,MAAK,GAAK,EAAE,KAAO,MAClF,IAAK,EAAiB,OAAQ,CAC5B,M,CAEF,GAAG,KAAK,WAAW,CACjB,QAAQ,IAAI,eACZ,M,CAGF,IAAI,KAAK,aAAa,CAGpB,MAAM,EAAc,EAAiB,KAAK,GACxC,GAAK,EAAI,QAAQ,IAAI,EAAG,EAAE,UAAU,UAAU,UAAU,cAG1D,GAAS,GAAa,UAAU,CAC9B,KAAO,IAEJ,GAAqC,SAAS,IAC7C,GAAG,GAAM,KAAO,KAAK,YAAY,MAAK,GAAc,GAAY,KAAO,EAAK,KAAI,CAC9E,KAAK,aAAa,KAAK,E,KAG3B,MAAM,EAAyB,KAAK,aAAa,KAAK,GAAS,KAAK,qBAAqB,KACzF,KAAK,sBAAsB,KAAK,EAAO,EAEzC,MAAQ,IACN,QAAQ,MAAM,kCAAmC,GACjD,KAAK,aAAa,EAAE,IAGxB,M,CAIF,KAAK,WAAa,KAClB,GAAoB,EAAkB,KAAK,aAAc,GACxD,UAAU,CACT,KAAO,IACL,KAAK,aAAe,KAAK,wBACvB,EACA,GAEF,KAAK,WAAa,MAClB,KAAK,kBAAkB,KAAK,EAAiB,EAE/C,MAAQ,IACN,QAAQ,MAAM,uCAAwC,GACtD,KAAK,WAAa,KAAK,G,CAM7B,oBAAA,CAAqB,GACnB,QAAQ,IAAI,wBACZ,KAAK,cAAgB,KAAK,mBAAqB,uBAC/C,MAAM,EAAa,IACjB,MAAM,SAAc,IAAW,SAAY,CAAC,GAAU,EACtD,MAAM,EAAiB,GAAO,EAAI,OAAS,EAC3C,IAAI,KAAK,YAAY,CACnB,KAAK,kCACL,GAAI,EAAgB,CAClB,KAAK,SAAS,EAAI,E,IAKxB,UAAW,IAAc,aAAgB,KAAK,UAAY,KAAK,IAAK,CAClE,M,CAGF,YAAW,KACT,MAAM,EAAc,OAAO,SAAS,KAAK,SAAS,aAClD,IAAI,EAAsC,GAC1C,EAAe,KAAK,KAAK,iBACzB,IAAK,EAAc,CACjB,EAAe,OAAO,aAAa,QAAQ,gBAC3C,IAAK,EAAiC,CACpC,M,EAGJ,MAAM,EAAa,IAAI,GAAU,eAAe,6BAChD,GAAW,aAEX,MAAM,EAA4B,GAElC,IAAK,EAAa,CAEhB,IAAI,EAAmB,OAAO,SAAS,SAAS,QAAQ,cAAe,KAEvE,EAAmB,EAAiB,QAAQ,gBAAiB,KAC7D,EAAQ,QAAU,KAAK,aAAe,KAAK,aAAc,OAAO,SAAS,OAAS,C,CAIpF,MAAM,EAAe,GAAU,eAC/B,GAAG,KAAK,iBAAiB,CACvB,MAAM,EAAoB,IAAI,EAAa,KAAK,iBAAkB,EAAc,EAAW,KAAK,IAAK,GACrG,IAAK,EAAmB,CACtB,M,CAEF,EAAkB,qBAAuB,EAEzC,GAAG,KAAK,QAAQ,CACd,GAAG,KAAK,cAAc,CACpB,EAAkB,eAAe,KAAK,kBAAkB,KAAK,QAAQ,SAAW,KAAK,QAAQ,G,KAC1F,CACH,EAAkB,KAAK,KAAK,QAAQ,SAAW,KAAK,QAAQ,G,EAGhE,KAAK,mBAAmB,K,IAE1B,I,CAIJ,qBAAA,CAAsB,EAAgB,EAAU,GAC9C,EAAO,kBACP,EAAO,iBACP,MAAM,EAAU,EAAI,QACpB,MAAM,EAAW,KAAK,kBAAkB,MACxC,GAAK,EAAI,QAAQ,qBAAqB,KAAK,aAAa,IAAK,KAC3D,IAAU,IAAM,GAAK,EAAQ,mBAAmB,OAChD,UAAU,CACV,KAAO,IACL,GAAG,KAAK,IAAI,CACV,KAAK,aAAe,KAAK,wBAAwB,KAAK,IAAI,GAE1D,MAAM,EAAyB,KAAK,cAAc,KAAK,GAAS,KAAK,qBAAqB,KAC1F,KAAK,sBAAsB,KAAK,E,GAGpC,MAAQ,IACN,QAAQ,MAAM,0CAA2C,EAAI,G,CAKnE,oBAAA,CAAqB,EAAiC,GACpD,IAAI,KAAK,IAAI,CACX,M,CAEF,IAAI,EAAY,CACd,M,CAEF,MAAM,EAAO,KAAK,IAClB,KAAK,cAAc,KAAK,GAAsC,CAC5D,QAAS,CACP,SAAU,SACV,gBAAiB,GACjB,oBAAqB,MACrB,yBAA0B,KAC1B,UAAW,MACV,KAAM,CACP,MAAO,KAAK,iBAAiB,QAAQ,0BACrC,QAAS,KAAK,iBAAiB,QAAQ,+CACvC,4BAA6B,UAC7B,eAAgB,KACd,KAAK,sBAAsB,EAAI,EAAW,GAAG,EAAO,I,CAO5D,aAAA,CAAc,GACZ,IAAI,KAAK,IAAI,CACX,M,CAEF,MAAM,EAAO,KAAK,IAClB,GAAG,EAAO,IAAM,gBAAgB,CAC9B,KAAK,qBAAqB,E,8FAnWnB,GAAyB,KAAA,EAAA,MAAA,EAAA,kBAAA,CAAA,MAAA,IAAA,CAAA,MAAA,EAAA,WAAA,CAAA,MAAA,EAAA,YAAA,CAAA,MAAA,KAAA,OAAA,EAAA,gBAAA,WAAA,QAAzB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAsBS,aAAA,KAAA,SAAA,yBAAA,OAAA,CAAA,IAAA,MAAA,wBAAA,0BAAA,SAAA,uBAAA,GAEA,iBAAA,uCAAA,GAEA,mBAAA,2CAAA,GCtEtB,aAAA,eAAA,YAAA,cAAA,wBAAA,0BAAA,QAAA,UAAA,iBAAA,mBAAA,IAAA,MAAA,aAAA,gBAAA,QAAA,CAAA,kBAAA,oBAAA,sBAAA,yBAAA,gBAAA,KAAA,SAAA,EAAA,SAAA,6zDDoCI,OAAA,glPAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,KAAA,YAAA,KAAA,GACA,SAAA,qCAAA,KAAA,YAAA,KAAA,GAA0B,SAAA,0BAAA,OAAA,yCAAA,QAAA,kCAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAMjB,GAAyB,WAAA,E,KAXrC,EACW,KAAA,EAAA,SAAA,yBACD,QAAA,CACP,EACA,GACA,IAIa,cAAA,EAAkB,UAAS,SAAA,6zDAAA,OAAA,olPAqBf,eAAA,MAAA,KAAA,EAAA,kBAAA,CAAA,KAAA,IAAA,CAAA,KAAA,EAAA,WAAA,CAAA,KAAA,EAAA,YAAA,CAAA,KAAA,KAAA,eAAA,CAAA,IAAG,E,KAA7B,E,MAAM,CAAE,SAAU,SACV,wBAAuB,EAA/B,KAAA,IAEuC,SAAQ,E,KAA/C,E,MAAM,CAAE,UAAW,MAEoB,iBAAgB,E,KAAvD,E,MAAM,CAAE,UAAW,MAEoB,mBAAkB,E,KAAzD,E,MAAM,CAAE,UAAW,MAEX,aAAY,EAApB,KAAA,IAKG,YAAW,EADd,KAAA,IAiBS,kBAAiB,EAA1B,KAAA,IACS,sBAAqB,EAA9B,KAAA,IACQ,wBAAuB,EAA/B,KAAA,IACQ,QAAO,EAAf,KAAA,IACQ,iBAAgB,EAAxB,KAAA,IACQ,IAAG,EAAX,KAAA,IAGG,aAAY,EADf,KAAA,OEvFG,MAAO,WAAsC,GACjD,WAAA,CAAY,GACV,MAAM,GAIC,KAAmB,oBAAY,KAE9B,KAAA,oBAAsB,IAAI,C,CAEpC,mBAAA,GACE,KAAK,oBAAoB,M,CAG3B,qBAAA,CAAsB,GACpB,GAAI,EAAO,MAAQ,SAAW,EAAO,MAAQ,IAAK,CAChD,EAAO,iBAEP,KAAK,qB,8FAlBE,GAA6B,KAAA,EAAA,MAAA,EAAA,mBAAA,OAAA,EAAA,gBAAA,WAAA,QAA7B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAA6B,aAAA,KAAA,SAAA,6BAAA,OAAA,CAAA,UAAA,YAAA,oBAAA,uBAAA,QAAA,CAAA,oBAAA,uBAAA,gBAAA,KAAA,SAAA,EAAA,SCb1C,ufAcA,OAAA,y5JAAA,aAAA,EAAA,KAAA,WAAA,KDNI,GAAe,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,iB,iFAKN,GAA6B,WAAA,E,KARzC,EACW,KAAA,EAAA,SAAA,6BACD,QAAA,CACP,GACD,SAAA,ufAAA,OAAA,65JASQ,eAAA,MAAA,KAAA,EAAA,mBAAA,eAAA,CAAA,UAAS,EAAjB,KAAA,IACQ,oBAAmB,EAA3B,KAAA,IAES,oBAAmB,EAA5B,KAAA,OEaG,MAAO,WAAkC,GAG7C,WAAA,CAAY,EAAqD,EAA+C,GAC9G,MAAM,GADyD,KAAa,cAAb,EAA+C,KAAW,YAAX,EAmBvG,KAAG,IAAsB,KAcjB,KAAA,kBAAoB,IAAI,GAAwB,IAChD,KAAA,4BAA8B,IAAI,GAAwB,IACnE,KAAa,cAAW,GAEhC,KAAc,eAAgC,GAErC,KAAmB,oBAAY,KAC/B,KAAmB,oBAAY,KAExC,KAAU,WAA4B,GAvCpC,KAAK,cAAgB,KAAK,YAAY,MAAM,CAC1C,KAAM,CAAC,GAAI,IACX,IAAK,CAAC,GACJ,CACE,EAAW,SACX,EAAW,QAAQ,YACnB,EAAW,QAAQ,mBAKzB,KAAK,cAAc,cAAc,WAAU,IACzC,KAAK,eAAe,GAAG,SAAW,IAAW,OAAO,G,CAMxD,gBACI,CAAa,GACf,KAAK,kBAAkB,KAAK,GAC5B,KAAK,eAAe,GAEpB,KAAK,cAAgB,C,CAGvB,gBAAI,GACF,OAAO,KAAK,a,CAcd,QAAA,GACE,KAAK,eAAe,KAClB,CACE,GAAI,gBACF,MAAO,KAAK,iBAAiB,QAAQ,kBACrC,QAAS,KAAK,iBAAiB,QAAQ,kBACvC,SAAU,KACV,YAAa,W,CAKrB,sBAAA,CAAuB,GACrB,GAAI,EAAO,KAAO,gBAAiB,CACjC,GAAI,KAAK,cAAc,MAAO,CAC5B,KAAK,aAAa,KAAK,cAAc,MAAM,QAAS,KAAK,cAAc,MAAM,OAAQ,KAAK,eAAe,MAAK,KAC5G,KAAK,eAAe,KAAK,eACzB,KAAK,cAAc,OAAO,G,GAM1B,cAAA,CAAe,GACrB,IAAK,KAAK,IACR,OAEF,KAAK,IAAI,QAAQ,cAAc,GAAU,MAAM,IAC7C,KAAK,WAAa,CAAQ,G,CAItB,YAAA,CAAa,EAAc,EAAa,GAC9C,IAAK,KAAK,IACR,OAAO,QAAQ,OAAO,IAAI,MAAM,sBAElC,IAAI,EAAuB,EAAI,OAE/B,IAAK,OAAO,kBAAkB,KAAK,GAAe,CAChD,EAAe,WAAa,C,CAG9B,IAAI,EAAgB,GAAM,QAAU,GAEpC,GAAI,IAAkB,GAAI,CACxB,EAAgB,C,CAGlB,EAAgB,GAAe,QAAQ,iBAAkB,IAEzD,MAAM,EAAO,KAAK,UAAU,CAC1B,KAAM,EACN,IAAK,EACL,SAAU,IAGZ,OAAO,KAAK,IAAI,QAAQ,cAAc,EAAU,E,CAGlD,kCAAA,CAAmC,GACjC,KAAK,cAAc,KAAK,GAAsC,CAC5D,QAAS,CACP,SAAU,SACV,gBAAiB,GACjB,oBAAqB,MACrB,yBAA0B,KAC1B,UAAW,MACV,KAAM,CACP,MAAO,KAAK,iBAAiB,QAAQ,wCACrC,QAAS,KAAK,iBAAiB,QAAQ,0CACvC,4BAA6B,UAC7B,eAAgB,KACd,KAAK,gBAAgB,EAAU,GAAG,I,CAMlC,eAAA,CAAgB,GACtB,IAAK,KAAK,IACR,OAEF,KAAK,IAAI,WAAW,OAAO,GAAI,MAAK,KAClC,KAAK,eAAe,KAAK,cAAc,G,QAlIhC,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAyB,KAAA,EAAA,MAAA,EAAA,kBAAA,CAAA,MAAA,IAAA,CAAA,MAAA,EAAA,cAAA,OAAA,EAAA,gBAAA,WAAA,QAAzB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GClCb,aAAA,KAAA,SAAA,wBAAA,OAAA,CAAA,IAAA,MAAA,aAAA,eAAA,oBAAA,sBAAA,oBAAA,uBAAA,gBAAA,KAAA,SAAA,EAAA,SAAA,0iCDsBI,OAAA,ojBAAA,aAAA,EAAA,KAAA,YAAA,KAAA,GAA0B,SAAA,0BAAA,OAAA,yCAAA,QAAA,kCAAA,KAAA,YAAA,KAC1B,GAAmC,SAAA,qCAAA,KAAA,YAAA,KACnC,GAA6B,SAAA,6BAAA,OAAA,oCAAA,QAAA,0BAAA,KAAA,YAAA,KAC7B,EACA,SAAA,mBAAA,OAAA,6CAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,YAAA,KAAA,EAAA,cAAA,SAAA,iDAAA,KAAA,YAAA,KAAA,EAAA,gBAAA,SAAA,8CAAA,KAAA,YAAA,KAAA,EAAA,qBAAA,SAAA,6FAAA,KAAA,YAAA,KAAA,EAAA,mBAAA,SAAA,cAAA,OAAA,cAAA,QAAA,aAAA,SAAA,aAAA,KAAA,YAAA,KAAA,EAAA,gBAAA,SAAA,oBAAA,OAAA,yCAAA,QAAA,oBAAA,KAAA,YAAA,KAAA,GAA8B,SAAA,+BAAA,OAAA,+CAAA,QAAA,sBAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAMrB,GAAyB,WAAA,E,KAfrC,EACW,KAAA,EAAA,SAAA,wBACD,QAAA,CACP,GACA,GACA,GACA,EACA,EACA,EACA,IAIa,cAAA,EAAkB,UAAS,SAAA,0iCAAA,OAAA,wjBAwBjC,eAAA,MAAA,KAAA,EAAA,kBAAA,CAAA,KAAA,IAAA,CAAA,KAAA,EAAA,cAAA,eAAA,CAAA,IAAG,EAAX,KAAA,IAGG,aAAY,EADf,KAAA,IAkBQ,oBAAmB,EAA3B,KAAA,IACQ,oBAAmB,EAA3B,KAAA,OE1DU,MAAA,GAgBX,SACI,GACF,OAAO,KAAK,M,CAEd,SAAI,CAAM,GACR,KAAK,OAAS,C,CAGhB,WACI,GACF,OAAO,KAAK,Q,CAEd,WAAI,CAAQ,GACV,KAAK,SAAW,C,CAGlB,WAAA,CACmB,EACA,GADA,KAAa,cAAb,EACA,KAAgB,iBAAhB,EAhCX,KAAM,OAAW,GACjB,KAAQ,SAAW,GAGR,KAAA,QAAkC,CACnD,CACE,GAAI,0BACJ,MAAO,KAAK,iBAAiB,QAAQ,OACrC,QAAS,KAAK,iBAAiB,QAAQ,OACvC,SAAU,MACV,YAAa,YAwBf,KAAK,MAAQ,KAAK,cAAc,UAChC,KAAK,OAAS,KAAK,OAAO,OAAS,GACnC,KAAK,SAAW,KAAK,OAAO,SAAW,E,CAGzC,KAAA,GACE,KAAK,cAAc,O,CAGrB,aAAA,CAAc,GACZ,GAAI,EAAM,MAAQ,UAAY,EAAM,MAAQ,MAAO,CACjD,KAAK,O,EAIT,sBAAA,GACE,KAAK,QAEL,KAAK,kB,CAIP,aAAA,CAAc,GACZ,GAAI,EAAM,MAAQ,UAAY,EAAM,MAAQ,MAAO,CACjD,KAAK,O,SA5DE,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAkC,KAAA,EAAA,MAAA,IAAA,CAAA,MAAA,EAAA,mBAAA,OAAA,EAAA,gBAAA,WAAA,QAAlC,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAkC,aAAA,KAAA,SAAA,mCAAA,OAAA,CAAA,MAAA,QAAA,QAAA,WAAA,KAAA,CAAA,UAAA,8CAAA,SAAA,EAAA,SCnB/C,ysBAyBA,OAAA,w5EAAA,aAAA,EAAA,KAAA,WAAA,KDXY,GAAc,CAAA,KAAA,WAAA,KAAA,GAAe,CAAA,KAAA,YAAA,KAAE,GAA0B,SAAA,0BAAA,OAAA,yCAAA,QAAA,kCAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAKxD,GAAkC,WAAA,E,KAP9C,E,gBACW,mCAAkC,QACnC,CAAC,EAAc,EAAiB,IAA2B,cAGrD,EAAkB,UAAS,SAAA,ysBAAA,OAAA,45EAmBtC,eAAA,MAAA,KAAA,IAAA,CAAA,KAAA,EAAA,mBAAA,eAAA,CAAA,MAAK,EADR,KAAA,IASG,QAAO,EADV,KAAA,IAkCD,cAAa,E,KADZ,E,MAAa,mBAAoB,CAAC,gBEjExB,MAAA,GAA4D,CACvE,CAAE,GAAI,oBAAqB,IAAK,CAAE,QAAS,YAAa,OAAQ,uBAAyB,MAAO,sBAChG,CAAE,GAAI,WAAY,IAAK,CAAE,QAAS,mBAAoB,OAAQ,yBAA2B,MAAO,aAChG,CAAE,GAAI,cAAe,IAAK,CAAE,QAAS,qBAAsB,OAAQ,2BAA6B,MAAO,gBACvG,CAAE,GAAI,aAAc,IAAK,CAAE,QAAS,gBAAiB,OAAQ,sBAAwB,MAAO,cAC5F,CAAE,GAAI,qBAAsB,IAAK,CAAE,QAAS,yBAA0B,OAAQ,+BAAiC,MAAO,wBAW3G,MAAA,GAA+B,IAAI,EAA0C,gCCtB7E,MAAA,GAYJ,YAAA,CAAa,GAClB,KAAK,UAAU,KAAK,E,CAGtB,WAAA,CAGmB,GAAA,KAAyB,0BAAzB,EAjBF,KAAA,oBAAsB,IAAI,GAEzC,IACc,KAAA,qBACd,KAAK,oBAAoB,eAGV,KAAA,UAAY,IAAI,GACjB,KAAA,WAAa,KAAK,UAAU,eAe1C,GAAI,KAAK,2BAA2B,4BAA6B,CAC/D,KAAK,oBAAoB,KACvB,KAAK,0BAA0B,4B,SA3B1B,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAkBD,KAAA,EAAA,MAAA,GAA4B,SAAA,OAAA,OAAA,EAAA,gBAAA,YAAA,Q,yFAlB3B,IAA0B,E,iFAA1B,GAA0B,WAAA,EADtC,KAAA,I,iDAkBI,KAAA,G,MACA,E,MAAO,UChBZ,MAAM,GAAoB,qBAQb,MAAA,GAIX,aAAa,CAAU,GACrB,IAAK,EAAO,CACV,M,CAGF,KAAK,2BAA2B,aAAa,E,CAmB/C,WAAA,CACqE,EAChD,GADgD,KAAyB,0BAAzB,EAChD,KAA0B,2BAA1B,EA5BZ,KAAY,aAAmB,GAS9B,KAAA,gBAAkB,IAAI,EAGb,KAAe,gBAAG,GAAS,KAAK,2BAA2B,YAE3D,KAAA,SAAW,GAAS,IAAM,KAAK,oBAAsB,KAAK,yBAAyB,KAEnF,KAAA,WAAa,EAAgB,OAE7B,KAAA,QAAU,GAAS,IACpC,KAAK,WAAa,KAAK,yBAAyB,IAAI,OAAS,KAAK,yBAAyB,IAAI,UAE9E,KAAA,YAAc,EAAgB,OAGhC,KAAa,cAAG,KAAK,2BAA2B,UAAU,KAAO,MAMhF,GAAI,KAAK,cAAe,CACtB,KAAK,WAAW,IAAI,K,EAKd,YAAA,GACR,KAAK,YAAY,IAAI,K,CAIb,YAAA,GACR,KAAK,YAAY,IAAI,M,CAGhB,QAAA,GAEL,IAAK,KAAK,eAAiB,KAAK,2BAA2B,UAAU,GAAI,CACvE,KAAK,WAAW,IAAI,KAAK,0BAA0B,UAAU,KAAO,KAAK,yBAAyB,G,EAS5F,QAAA,GACR,GAAI,KAAK,aAAc,CACrB,M,CAGF,KAAK,2BAA2B,aAAa,KAAK,yBAAyB,IAC3E,KAAK,gBAAgB,KAAK,KAAK,yBAAyB,G,QAjE/C,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GA6BW,KAAA,EAAA,MAAA,GAA4B,SAAA,OAAA,MAAA,KAAA,OAAA,EAAA,gBAAA,WAAA,QA7BvC,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GCfb,aAAA,KAAA,SAAA,kBAAA,OAAA,CAAA,yBAAA,2BAAA,aAAA,eAAA,UAAA,aAAA,QAAA,CAAA,gBAAA,mBAAA,KAAA,CAAA,UAAA,CAAA,WAAA,iBAAA,WAAA,mBAAA,SAAA,EAAA,SAAA,ymBDWY,OAAA,knrCAAA,aAAA,EAAA,KAAA,YAAA,KAAA,EAAS,SAAA,YAAA,OAAA,sBAAA,KAAA,WAAA,KAAA,GAAe,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,iB,iFAIvB,GAAmB,WAAA,E,KAN/B,EACW,KAAA,EAAA,SAAA,kBACD,QAAA,CAAC,EAAS,GAAgB,SAAA,ymBAAA,OAAA,snrC,iDAiChC,KAAA,G,MAAY,E,MAAO,OA5BK,CAAA,KAAA,KAAA,eAAA,CAAA,yBAAwB,E,KAAlD,E,MAAM,CAAE,SAAU,SACV,aAAY,EAApB,KAAA,IAEY,UAAS,EAArB,KAAA,IAOS,gBAAe,EAAxB,KAAA,IA2BS,aAAY,E,KADrB,E,MAAa,gBAMJ,aAAY,E,KADrB,E,MAAa,mBEzCH,MAAA,GASX,WAAA,CAEmB,GAAA,KAA0B,2BAA1B,EATT,KAAA,gBAAkB,IAAI,EAKb,KAAQ,SAAG,EAAO,EAAe,CAAE,SAAU,OAO9D,GAAI,KAAK,2BAA4B,CACnC,KAAK,oBAAsB,GAAS,KAAK,2BAA2B,qB,KAC/D,CACL,KAAK,oBAAsB,EAAmC,IAA+B,Y,SAjBtF,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA4B,KAAA,EAAA,MAAA,GAAA,SAAA,KAAA,SAAA,OAAA,OAAA,EAAA,gBAAA,WAAA,QAA5B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAA4B,aAAA,KAAA,SAAA,4BAAA,OAAA,CAAA,UAAA,aAAA,QAAA,CAAA,gBAAA,mBAAA,UAJ5B,CAAC,ICZd,SAAA,EAAA,SAAA,2hBAWM,OAAA,gHAAA,aAAA,EAAA,KAAA,YAAA,KDFM,GAAmB,SAAA,kBAAA,OAAA,wDAAA,QAAA,sBAAA,gBAAA,EAAA,wBAAA,OAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAOlB,GAA4B,WAAA,E,KATxC,EACW,KAAA,EAAA,SAAA,4BACD,QAAA,CAAC,IAAoB,UAGnB,CAAC,IAA2B,gBACtB,EAAwB,OAC1B,cAAA,EAAkB,UAAS,SAAA,2hBAAA,OAAA,oH,0CAYvC,KAAA,G,CAAY,KAAA,MATN,eAAA,CAAA,UAAS,EAAjB,KAAA,IACS,gBAAe,EAAxB,KAAA,OEfH,MAAM,GAAU,IAET,MAAM,GAAmB,CAC5B,GAAI,KACJ,GAAI,MACJ,GAAI,MAUF,MAAO,WAAyB,EAIzB,SAAA,CAAU,EAAgB,EAA0B,GAAiB,GAAI,EAAqB,QAAS,EAAe,IAC3H,IAAK,KAAK,SAAS,GAAQ,CACvB,MAAM,IAAI,MAAM,4C,CAEpB,MAAM,EAAO,KAAK,iBAAiB,EAAO,EAAe,GACzD,IAAI,EAAe,MAAM,UAAU,EAAM,GACzC,IAAiB,EAAM,WAEvB,MAAO,IAAI,KAAgB,I,CAGvB,gBAAA,CAAiB,EAAe,EAAgB,GACpD,OAAO,GACH,IAAK,KACD,OAAO,EAAQ,EACnB,IAAK,KACD,OAAO,GAAS,EAAO,GAC3B,IAAK,MACD,OAAO,GAAS,EAAO,EAAO,GAClC,QACI,OAAO,E,CAIX,QAAA,CAAS,GACb,cAAe,IAAU,WAAa,MAAM,E,QA7BvC,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAgB,KAAA,KAAA,OAAA,EAAA,gBAAA,MAAA,Q,mFAAhB,GAAgB,aAAA,KAAA,KAAA,kB,iFAAhB,GAAgB,WAAA,E,KAJ5B,EAAK,KAAA,EACJ,KAAM,eACN,WAAY,WCPD,MAAA,GACX,IAAI,EAAyC,8BASlC,MAAA,GAMX,WAAA,CAAY,GACV,KAAK,GAAK,EAAK,IAAM,GACrB,KAAK,SAAW,EAAK,UAAY,GACjC,KAAK,KAAO,EAAK,MAAQ,C,EAMP,MAAA,UACL,KAAA,WAAa,IAAI,GAAW,GAAI,CAExC,aAAO,CAAO,GACnB,KAAK,WAAa,IAAI,GAAW,GACjC,OAAO,I,CAGF,YAAO,CAAM,GAClB,KAAK,WAAW,GAAK,EACrB,OAAO,I,CAGF,kBAAO,CAAY,GACxB,KAAK,WAAW,SAAW,EAC3B,OAAO,I,CAGF,cAAO,CAAQ,GACpB,KAAK,WAAW,KAAO,EACvB,OAAO,I,CAGF,cAAO,CAAQ,GACpB,KAAK,WAAW,KAAO,EACvB,OAAO,I,CAGF,YAAO,GACZ,MAAM,EAAqB,gBAAgB,KAAK,YAChD,KAAK,WAAa,IAAI,GAAW,IAEjC,OAAO,C,EC7CX,MAAM,GAAqC,GAC3C,MAAM,GAAmC,GAQ5B,MAAA,GANb,WAAA,GAoBY,KAAA,iBAAmB,IAAI,EACvB,KAAA,cAAgB,IAAI,EAQb,KAAA,kBAAoB,EAA2B,WAE/C,KAAA,oBAAsB,EAAe,GAEnC,KAAA,mBAAqB,EAAgB,OAErC,KAAA,OAAS,EAAO,GAA4B,CAC7D,SAAU,OAIO,KAAQ,WAAK,KAAK,QAAQ,mBAG1B,KAAA,kBAAoB,GAAiB,KACtD,MAAM,EAAc,KAAK,oBACzB,MAAM,EAAsB,KAAK,sBACjC,MAAM,EAAqB,KAAK,qBAEhC,IAAK,EAAa,CAChB,OAAO,C,CAGT,GAAI,EAAoB,CACtB,OAAO,EAAc,E,CAGvB,OACE,EACA,GACC,GAAqC,GAAiC,GAgC5E,CA9EC,eAAa,CAAY,GACvB,IAAK,EAAO,CACV,M,CAGF,KAAK,kBAAkB,IAAI,E,CAK7B,QAAI,GACF,MAAO,IAAI,KAAK,WAAW,SAAS,MAAM,KAAK,IAAI,I,CAuC9C,eAAA,GACL,GAAI,KAAK,kBAAmB,CAC1B,KAAK,oBAAoB,KACtB,KAAK,kBAAkB,cAAc,aAExC,KAAK,6BACL,KAAK,qBAAsB,QAAQ,KAAK,kBAAkB,c,EAIvD,WAAA,GACL,KAAK,sBAAsB,UAAU,KAAK,kBAAkB,c,CAGtD,0BAAA,GACN,MAAM,EAAoC,CACxC,KAAM,KACN,WAAY,MACZ,UAAW,GAEb,MAAM,EAA0C,GAC9C,EAAQ,SAAQ,EAAG,mBAAkB,yBACnC,MAAM,EAAsB,EAAiB,QAAU,EAAmB,MAC1E,KAAK,mBAAmB,IAAI,EAAoB,IAGpD,KAAK,qBAAuB,IAAI,qBAAqB,EAAU,E,QAnFtD,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA8B,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAA9B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GC9Bb,aAAA,KAAA,SAAA,8BAAA,OAAA,CAAA,kBAAA,oBAAA,WAAA,aAAA,YAAA,eAAA,QAAA,CAAA,iBAAA,mBAAA,cAAA,iBAAA,YAAA,EAAA,aAAA,oBAAA,MAAA,KAAA,UAAA,sBAAA,YAAA,OAAA,aAAA,oBAAA,MAAA,KAAA,UAAA,sBAAA,YAAA,OAAA,SAAA,EAAA,SAAA,kkCD0BY,OAAA,syKAAA,aAAA,EAAA,KAAA,OAAA,KAAA,GAAgB,KAAA,iBAAA,KAAA,WAAA,KAAE,GAAe,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,iB,iFAIhC,GAA8B,WAAA,E,KAN1C,EACW,KAAA,EAAA,SAAA,8BACD,QAAA,CAAC,GAAkB,GAAgB,SAAA,kkCAAA,OAAA,0yKAOnC,eAAA,CAAA,kBAAiB,EAAzB,KAAA,IAC+B,kBAAiB,E,KAAhD,E,MAAU,uBACqB,kBAAiB,E,KAAhD,E,MAAU,uBACgB,WAAU,E,KAApC,E,MAAM,CAAE,SAAU,SACN,YAAW,EAAvB,KAAA,IAOS,iBAAgB,EAAzB,KAAA,IACS,cAAa,EAAtB,KAAA,OELG,MAAO,WACH,GAdV,WAAA,G,oBAiBW,KAAG,IAAuB,KAE1B,KAAW,YAAiB,GAGG,KAAQ,SAAG,MAGzC,KAAA,iBAAmB,IAAI,EACvB,KAAA,cAAgB,IAAI,EACpB,KAAA,cAAgB,IAAI,EAIX,KAAA,OAAS,EAAO,GAA4B,CAC7D,SAAU,OAGO,KAAA,QAAkC,CACnD,CACE,GAAI,iBACJ,MAAO,KAAK,iBAAiB,QAAQ,mBACrC,QAAS,KAAK,iBAAiB,QAAQ,mBACvC,SAAU,MACV,YAAa,UACb,KAAM,SAIS,KAAA,oBAAsB,EACvC,UAgDH,CAxCQ,IAAA,GACL,KAAK,UAAU,cAAc,O,CAGxB,eAAA,GACL,KAAK,uBACL,KAAK,eAAe,QAAQ,KAAK,kBAAkB,c,CAG9C,WAAA,GACL,KAAK,eAAe,UAAU,KAAK,kBAAkB,c,CAG7C,aAAA,CAAc,EAAuB,GAC7C,IAAI,EAAqB,GACzB,GAAG,aAAiB,SAAS,CAC3B,EAAa,MAAM,KAAK,E,MACnB,GAAG,aAAiB,MAAM,CAC/B,MAAM,EAAQ,EAAM,OACpB,GAAI,GAAO,MAAO,CAChB,EAAa,MAAM,KAAK,EAAM,M,EAGlC,IAAK,MAAM,KAAQ,EAAY,CAC7B,GAAI,aAAgB,KAAM,CACtB,KAAK,cAAc,KAAK,E,EAI9B,GAAI,EAAc,CAChB,EAAa,MAAQ,E,EAIjB,oBAAA,GACN,KAAK,eAAiB,IAAI,gBAAgB,IACxC,MAAM,MAAE,GAA2B,EAAQ,GAAG,YAC9C,KAAK,oBAAoB,IAAI,EAAM,G,QA/E5B,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAA2B,KAAA,KAAA,OAAA,EAAA,gBAAA,WAAA,Q,4EAA3B,GAA2B,aAAA,KAAA,SAAA,0BAAA,OAAA,CAAA,IAAA,MAAA,YAAA,cAAA,kBAAA,oBAAA,SAAA,uBASlB,IAAgB,QAAA,CAAA,iBAAA,mBAAA,cAAA,gBAAA,cAAA,iBAAA,YAAA,EAAA,aAAA,oBAAA,MAAA,KAAA,UAAA,sBAAA,YAAA,OAAA,aAAA,YAAA,MAAA,KAAA,UAAA,cAAA,YAAA,OAAA,gBAAA,KAAA,SAAA,EAAA,SCjDtC,8vEAyDA,OAAA,8oBAAA,aAAA,EAAA,KAAA,WAAA,KD3BI,GAAe,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,KAAA,YAAA,KACf,GAA0B,SAAA,0BAAA,OAAA,yCAAA,QAAA,kCAAA,KAAA,YAAA,KAC1B,GAA8B,SAAA,8BAAA,OAAA,iDAAA,QAAA,uCAAA,KAAA,YAAA,KAC9B,GAAmC,SAAA,qCAAA,gBAAA,EAAA,wBAAA,OAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAO1B,GAA2B,WAAA,E,KAbvC,EACW,KAAA,EAAA,SAAA,0BACD,QAAA,CACP,EACA,GACA,GACA,IACD,gBAGgB,EAAwB,OAC1B,cAAA,EAAkB,UAAS,SAAA,8vEAAA,OAAA,kpBAMjC,eAAA,CAAA,IAAG,EAAX,KAAA,IAEQ,YAAW,EAAnB,KAAA,IACQ,kBAAiB,EAAzB,KAAA,IAEuC,SAAQ,E,KAA/C,E,MAAM,CAAE,UAAW,MACY,kBAAiB,E,KAAhD,E,MAAU,uBACa,UAAS,E,KAAhC,E,MAAU,eACD,iBAAgB,EAAzB,KAAA,IACS,cAAa,EAAtB,KAAA,IACS,cAAa,EAAtB,KAAA,OE/CU,MAAA,GACJ,aAAA,CAAc,GACnB,IAAI,EACJ,GAAI,aAAiB,KAAM,CACzB,EAAa,GAAkB,QAAQ,GACpC,YAAY,EAAM,MAClB,O,KACE,CACL,EAAa,GAAkB,OAAO,GAAO,O,CAG/C,OAAO,C,CAGF,QAAA,CAAS,EAAc,GAC5B,MAAM,EAA4B,SAAS,cAAc,KACzD,EAAO,IAAM,sBACb,EAAO,OAAS,SAChB,EAAO,KAAO,EACd,EAAO,SAAW,EAClB,EAAO,O,QApBE,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAyB,KAAA,GAAA,OAAA,EAAA,gBAAA,YAAA,QAAzB,KAAA,MAAA,EAAA,uBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAyB,WADZ,QAAM,E,iFACnB,GAAyB,WAAA,E,KADrC,E,MAAW,CAAE,WAAY,aCM1B,MAAM,GAAmB,SACzB,MAAM,GAAmB,SASZ,MAAA,GAuBX,SACI,GACF,OAAO,KAAK,M,CAEd,SAAI,CAAM,GACR,KAAK,OAAS,C,CAGhB,WACI,GACF,OAAO,KAAK,Q,CAEd,WAAI,CAAQ,GACV,KAAK,SAAW,C,CAGlB,WAAA,CACmB,EACA,GADA,KAAa,cAAb,EACA,KAAgB,iBAAhB,EAvCX,KAAM,OAAW,GACjB,KAAQ,SAAW,GAGR,KAAA,QAAkC,CACnD,CACE,GAAI,GACJ,MAAO,KAAK,iBAAiB,QAAQ,WACrC,QAAS,KAAK,iBAAiB,QAAQ,WACvC,SAAU,MACV,YAAa,WAEf,CACE,GAAI,GACJ,MAAO,KAAK,iBAAiB,QAAQ,WACrC,QAAS,KAAK,iBAAiB,QAAQ,WACvC,SAAU,MACV,YAAa,cAwBf,KAAK,KAAO,KAAK,cAAc,UAC/B,GAAI,KAAK,KAAM,CACb,KAAK,OAAS,KAAK,KAAK,OAAS,GACjC,KAAK,SAAW,KAAK,KAAK,SAAW,GACrC,KAAK,eAAiB,KAAK,KAAK,c,EAIpC,KAAA,GACE,KAAK,cAAc,O,CAGrB,aAAA,CAAc,GACZ,GAAI,EAAM,MAAQ,UAAY,EAAM,MAAQ,MAAO,CACjD,KAAK,cAAc,O,EAIvB,sBAAA,CAAuB,GACrB,KAAK,cAAc,QAEnB,GAAI,EAAO,KAAO,GAAkB,CAClC,KAAK,kB,EAKT,aAAA,CAAc,GACZ,GAAI,EAAM,MAAQ,UAAY,EAAM,MAAQ,MAAO,CACjD,KAAK,O,SAxEE,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAmC,KAAA,EAAA,MAAA,IAAA,CAAA,MAAA,EAAA,mBAAA,OAAA,EAAA,gBAAA,WAAA,QAAnC,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GCtBb,aAAA,KAAA,SAAA,oCAAA,OAAA,CAAA,MAAA,QAAA,QAAA,WAAA,KAAA,CAAA,UAAA,8CAAA,SAAA,EAAA,SAAA,qtBDmBY,OAAA,kwEAAA,aAAA,EAAA,KAAA,WAAA,KAAA,GAAiB,CAAA,KAAA,YAAA,KAAA,GAA0B,SAAA,0BAAA,OAAA,yCAAA,QAAA,kCAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAG1C,GAAmC,WAAA,E,KAP/C,E,gBACW,oCAAmC,QAGpC,CAAC,EAAiB,IAA2B,cACvC,EAAkB,UAAS,SAAA,qtBAAA,OAAA,swEA0BtC,eAAA,MAAA,KAAA,IAAA,CAAA,KAAA,EAAA,mBAAA,eAAA,CAAA,MAAK,EADR,KAAA,IASG,QAAO,EADV,KAAA,IAuCD,cAAa,E,KADZ,E,MAAa,mBAAoB,CAAC,gBErFxB,MAAA,GAUX,qBACI,CAAkB,GACpB,KAAK,mBAAqB,EAAQ,EAAI,EAAQ,EAC9C,KAAK,YAAc,KAAK,YAAc,EAAQ,EAAQ,KAAK,YAC3D,KAAK,MAAM,KAAO,C,CAEpB,qBAAI,GACF,OAAO,KAAK,kB,CAGd,qBACI,CAAkB,GACpB,KAAK,mBAAqB,EAAQ,EAAI,EAAI,C,CAE5C,qBAAI,GACF,OAAO,KAAK,kB,CAGd,yBACI,CAAsB,GACxB,KAAK,uBAAyB,C,CAEhC,yBAAI,GACF,OAAO,KAAK,sB,CAGd,WAAA,CAAoB,GAAA,KAAE,GAAF,EAlCZ,KAAsB,uBAAG,MACzB,KAAkB,mBAAG,EACrB,KAAkB,mBAAG,EACrB,KAAW,YAAG,EACd,KAAY,aAAG,EAEf,KAAa,cAAG,EA6BtB,KAAK,MAAQ,KAAK,GAAG,a,CAIvB,OAAA,GACE,GAAI,KAAK,sBAAuB,CAC9B,KAAK,sBACL,KAAK,Y,EAID,mBAAA,GACN,MAAM,EAAQ,OAAO,iBAAiB,KAAK,MAAO,MAClD,MAAM,EAAa,EAAM,iBAAiB,eAC1C,IAAI,EAAgB,EACpB,GAAI,IAAe,SAAU,CAC3B,GAAiB,WAAW,EAAM,iBAAiB,eAAiB,IAAM,I,KACrE,CACL,EAAgB,WAAW,E,CAE7B,KAAK,cAAgB,KAAK,MAAM,E,CAG1B,UAAA,GACN,GAAI,KAAK,cAAgB,EAAG,CAC1B,KAAK,aAAe,KAAK,MAAM,Y,CAGjC,KAAK,MAAM,KAAO,KAAK,mBAEvB,MAAM,EAAO,KAAK,OACf,KAAK,MAAM,aAAe,KAAK,cAChC,KAAK,eAGP,MAAM,EAAY,KAAK,mBAAqB,EAE5C,KAAK,MAAM,KAAO,EAAY,KAAK,mBAC/B,KAAK,mBACL,C,6FA5EK,GAA2B,KAAA,EAAA,MAAA,EAAA,aAAA,OAAA,EAAA,gBAAA,WAAA,QAA3B,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAA2B,aAAA,KAAA,SAAA,0BAAA,OAAA,CAAA,kBAAA,oBAAA,kBAAA,oBAAA,sBAAA,yBAAA,KAAA,CAAA,UAAA,CAAA,MAAA,cAAA,SAAA,GAAA,E,iFAA3B,GAA2B,WAAA,E,KAJvC,EAAU,KAAA,EACT,SAAU,0BACV,WAAY,SAaR,eAAA,MAAA,KAAA,EAAA,aAAA,eAAA,CAAA,kBAAiB,EADpB,KAAA,IAWG,kBAAiB,EADpB,KAAA,IASG,sBAAqB,EADxB,KAAA,IAaD,QAAO,E,KADN,E,MAAa,cClCH,MAAA,GAkBX,QACI,CAAK,GACP,KAAK,MAAQ,C,CAEf,QAAI,GACF,OAAO,KAAK,K,CAGd,eACI,CAAY,GACd,KAAK,aAAe,C,CAEtB,eAAI,GACF,OAAO,KAAK,Y,CAGd,YACI,CAAS,GACX,KAAK,UAAY,C,CAEnB,YAAI,GACF,OAAO,KAAK,S,CAGd,YACI,CAAS,GACX,KAAK,UAAY,C,CAEnB,YAAI,GACF,OAAO,KAAK,S,CAGd,WACI,CAAQ,GACV,KAAK,SAAW,C,CAElB,WAAI,GACF,OAAO,KAAK,Q,CAGd,WACI,CAAQ,GACV,KAAK,SAAW,C,CAElB,WAAI,GACF,OAAO,KAAK,Q,CAGd,4BACI,CAAyB,GAC3B,KAAK,0BAA4B,C,CAEnC,4BAAI,GACF,OAAO,KAAK,yB,CAGd,cACI,CAAW,GACb,GAAI,EAAO,CACT,KAAK,gBAAgB,QACrB,KAAK,YAAc,K,KACd,CACL,KAAK,YAAc,C,EAGvB,cAAI,GACF,OAAO,KAAK,W,CAGd,QACI,CAAK,GACP,KAAK,MAAQ,C,CAEf,QAAI,GACF,OAAO,KAAK,K,CAGd,WAAA,GA7FA,KAAA,gBAAkB,IAAI,EAIZ,KAAA,oBAAsB,IAAI,EAE5B,KAAK,MAAG,GACR,KAAY,aAAG,GACf,KAAS,UAAG,MACZ,KAAS,UAAG,MACZ,KAAK,MAAG,EACR,KAAyB,0BAAG,MAC5B,KAAQ,SAAG,EACX,KAAQ,SAAG,EACX,KAAW,YAAG,K,CAiFtB,QAAA,GACE,KAAK,sBAAwB,KAAK,gBAAgB,aAAa,WAAU,IACvE,KAAK,oBAAoB,KAAK,EAAM,G,CAIxC,gBAAA,GACE,OAAO,KAAK,gBAAgB,K,CAG9B,SAAA,CAAU,GACR,MAAM,EAAgB,CAAC,IAAK,KAC5B,GAAI,EAAc,SAAS,EAAM,KAAM,CACrC,EAAM,iBACN,OAAO,K,CAET,OAAO,I,CAGT,WAAA,GACE,KAAK,uBAAuB,a,QArHnB,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAwB,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAAxB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAwB,aAAA,KAAA,SAAA,uBAAA,OAAA,CAAA,KAAA,OAAA,YAAA,cAAA,SAAA,WAAA,SAAA,WAAA,QAAA,UAAA,QAAA,UAAA,yBAAA,2BAAA,WAAA,aAAA,KAAA,QAAA,QAAA,CAAA,oBAAA,uBAAA,SAAA,EAAA,SCZrC,knBAuBA,OAAA,8vBAAA,aAAA,EAAA,KAAA,WAAA,KDbY,GAAqB,CAAA,KAAA,YAAA,KAAA,EAAA,qBAAA,SAAA,iNAAA,KAAA,YAAA,KAAA,EAAA,gBAAA,SAAA,8CAAA,KAAA,YAAA,KAAA,EAAA,kBAAA,SAAA,yIAAA,OAAA,eAAA,KAAA,YAAA,KAAA,EAAA,qBAAA,SAAA,gBAAA,OAAA,qCAAA,QAAA,kBAAA,SAAA,aAAA,KAAA,YAAA,KAAA,GAA6B,SAAA,0BAAA,OAAA,oEAAA,KAAA,WAAA,KAAA,GAAe,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,iB,iFAEhE,GAAwB,WAAA,E,KANpC,EACW,KAAA,EAAA,SAAA,uBAAsB,QAGvB,CAAC,EAAqB,GAA6B,GAAgB,SAAA,knBAAA,OAAA,kwBAQlE,eAAA,OAAA,eAAA,CAAA,oBAAmB,EAA5B,KAAA,IAaG,KAAI,EADP,KAAA,IASG,YAAW,EADd,KAAA,IASG,SAAQ,EADX,KAAA,IASG,SAAQ,EADX,KAAA,IASG,QAAO,EADV,KAAA,IASG,QAAO,EADV,KAAA,IASG,yBAAwB,EAD3B,KAAA,IASG,WAAU,EADb,KAAA,IAcG,KAAI,EADP,KAAA,OE3FH,MAAM,GAAmC,CACvC,2BAA4B,KAC5B,mBAAoB,MAWT,MAAA,GARb,WAAA,GAUY,KAAA,yBAA2B,IAAI,EAC/B,KAAA,cAAgB,IAAI,EAEtB,KAAQ,SAAuB,UAE9B,KAAG,IAAuB,KAG1B,KAAmB,oBAA2B,GAU/C,KAAK,MAAG,GAUR,KAAO,QAAG,QASV,KAAU,WAAG,GASb,KAAgB,iBAAG,KASnB,KAAY,aAAG,GASd,KAAU,WAAmC,GAG7C,KAAW,YAAwB,EAyB7C,CAlFC,WACI,CAAQ,GACV,KAAK,SAAW,C,CAElB,WAAI,GACF,OAAO,KAAK,Q,CAId,QACI,CAAK,GACP,MAAM,EAAiB,IAAI,KAAK,eAAe,UAAW,CAAE,UAAW,UAAW,OAAO,IAAI,KAAK,IAClG,KAAK,MAAQ,C,CAEf,QAAI,GACF,OAAO,KAAK,K,CAId,UACI,CAAO,GACT,KAAK,QAAU,C,CAEjB,UAAI,GACF,OAAO,KAAK,O,CAId,aACI,CAAU,GACZ,KAAK,WAAa,C,CAEpB,aAAI,GACF,OAAO,KAAK,U,CAId,mBACI,CAAgB,GAClB,KAAK,iBAAmB,C,CAE1B,mBAAI,GACF,OAAO,KAAK,gB,CAId,eACI,CAAY,GACd,KAAK,aAAe,C,CAEtB,eAAI,GACF,OAAO,KAAK,Y,CAQd,UAAA,CAAW,GACT,KAAK,yBAAyB,KAAK,E,CAGrC,KAAA,GACE,MAAM,EAA0B,CAAE,OAAQ,KAAK,OAAQ,KAAM,CAAE,UAAW,KAAK,YAC/E,KAAK,WAAW,E,CAGlB,UAAA,CAAW,GACT,GAAI,EAAM,MAAQ,UAAY,EAAM,MAAQ,MAAO,CACjD,KAAK,O,EAIT,UAAA,CAAW,GACT,MAAM,EAAS,OAAO,UAAU,SAChC,MAAM,EAAkB,IAAI,KAAK,GACjC,GAAI,EAAO,SAAS,MAAO,CACzB,OAAO,EAAW,EAAiB,UAAW,E,CAEhD,OAAO,EAAW,EAAiB,QAAS,E,QA5FnC,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAuB,KAAA,GAAA,OAAA,EAAA,gBAAA,WAAA,QAAvB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAuB,aAAA,KAAA,SAAA,sBAAA,OAAA,CAAA,IAAA,MAAA,oBAAA,sBAAA,QAAA,UAAA,KAAA,OAAA,OAAA,SAAA,UAAA,YAAA,gBAAA,kBAAA,YAAA,cAAA,WAAA,aAAA,YAAA,eAAA,QAAA,CAAA,yBAAA,2BAAA,cAAA,iBAAA,UAHvB,CAAC,CAAE,QAAS,GAA4B,SAAU,KClB/D,SAAA,EAAA,SAAA,05CA+CA,OAAA,goPAAA,aAAA,EAAA,KAAA,YAAA,KD9BY,EAAS,SAAA,mBAAA,OAAA,6CAAA,KAAA,OAAA,KAAA,EAAa,KAAA,cAAA,KAAA,YAAA,KAAE,GAA2B,SAAA,0BAAA,OAAA,qDAAA,QAAA,uDAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAIlD,GAAuB,WAAA,E,KARnC,EACW,KAAA,EAAA,SAAA,sBAAqB,QAGtB,CAAC,EAAS,EAAe,IAA4B,UACnD,CAAC,CAAE,QAAS,GAA4B,SAAU,KAAS,cACvD,EAAkB,UAAS,SAAA,05CAAA,OAAA,ooPAIhC,eAAA,CAAA,yBAAwB,EAAjC,KAAA,IACS,cAAa,EAAtB,KAAA,IAIQ,IAAG,EAAX,KAAA,IAGQ,oBAAmB,EAA3B,KAAA,IAGG,QAAO,EADV,KAAA,IAUG,KAAI,EADP,KAAA,IAWG,OAAM,EADT,KAAA,IAUG,UAAS,EADZ,KAAA,IAUG,gBAAe,EADlB,KAAA,IAUG,YAAW,EADd,KAAA,IAQQ,WAAU,EAAlB,KAAA,IAGQ,YAAW,EAAnB,KAAA,OEjFU,MAAA,GAKX,WAAA,CACmB,GAAA,KAAU,WAAV,EAHF,KAAA,0BAA4B,EAAO,G,CAO7C,aAAA,CAAc,GACnB,OAAO,GAAK,KAAK,IAAI,SAAS,OAAO,G,CAGhC,kBAAA,CAAmB,GACxB,MAAM,GAAE,EAAE,SAAE,GAAa,EACzB,IAAK,KAAK,IAAK,CACb,M,CAEF,MAAM,EAAM,KAAK,IACjB,MAAM,EAAO,GAAG,EAAI,8BAA8B,wBAAyB,EAAI,sCAC/E,KAAK,0BAA0B,SAAS,EAAM,E,CAGzC,YAAA,CACL,EACA,EACA,EACA,EACA,GAEA,OAAO,GAAK,KAAK,IAAI,QAAQ,YAAY,EAAc,IAAW,KAChE,IAAU,IACR,MAAQ,GAAI,GAAqB,EAGjC,MAAM,EAAW,EAAY,KAAI,IAC/B,MAAM,EAAqB,IAAI,SAC/B,EAAmB,OAAO,OAAQ,EAAW,MAC7C,EAAmB,OAAO,OAAQ,EAAW,UAC7C,EAAmB,OAAO,OAAQ,EAAW,KAAM,KAAK,YACxD,EAAmB,OAAO,OAAQ,EAAW,KAAM,MACnD,EAAmB,OAAO,WAAY,GACtC,OAAO,CAAkB,IAI3B,MAAM,EAAkB,EAAS,OAC7B,GAAS,EAAS,KAAI,GAAQ,GAAK,KAAK,IAAI,QAAQ,eAAe,EAAkB,EAAM,UAAW,QACtG,GAAG,IAEP,OAAO,EAAgB,KAAK,IAAI,IAAM,IAAkB,IAE1D,IAAU,GAED,EAAiB,OACpB,GAAoB,EAAkB,EAAkB,KAAK,KAAK,KAAK,IAAI,IAAM,KACjF,GAAG,KAET,IAAU,GAED,EAAW,OACd,KAAK,iBAAiB,EAAkB,GAAY,KAAK,IAAI,IAAM,KACnE,GAAG,KAET,GAAe,MACf,KACA,IAAW,IACT,QAAQ,MAAM,yBAA0B,GACxC,OAAO,GAAG,KAAK,I,CAIb,eAAA,CAAgB,GACtB,GAAG,EAAQ,iBAAmB,EAAQ,gBAAgB,OAAS,EAAG,CAChE,MAAM,EAAiB,EAAQ,gBAAgB,KAAK,GAAS,KAAK,WAAW,aAAa,KAAK,IAAK,EAAM,CAAC,EAAQ,OACnH,EAAQ,gBAAkB,C,EAItB,gBAAA,CAAiB,GACvB,EAAS,SAAS,IAChB,KAAK,gBAAgB,EAAQ,IAE/B,OAAO,C,CAGF,YAAA,CAAa,GAClB,OAAO,GAAK,KAAK,IAAI,QAAQ,YAAY,IAAW,KAClD,IAAK,IACH,IAAK,EAAU,CACb,MAAM,IAAI,MAAM,iC,CAGlB,OAAQ,KAAK,iBAAiB,EAAU,I,CAKvC,gBAAA,CACL,EACA,GAEA,MAAM,EACJ,GAEF,EAAW,SAAS,IAClB,IAAK,EAAG,CACN,M,CAEF,MAAM,EAAgB,KAAK,UAAU,CACnC,KAAM,EAAE,KACR,SAAU,EAAE,SACZ,IAAK,EAAE,MAET,MAAM,EAAU,KAAK,KAAK,QACvB,cAAc,EAAkB,GAChC,OAAO,IACN,QAAQ,IAAI,EAAI,IAEpB,EAAkB,KAAK,EAAQ,IAGjC,OAAO,GAAK,QAAQ,IAAI,G,6FA3Hf,GAAgC,KAAA,EAAA,MAAA,KAAA,OAAA,EAAA,gBAAA,YAAA,Q,yFAAhC,IAAgC,E,iFAAhC,GAAgC,WAAA,EAD5C,KAAA,I,iCCDY,MAAA,GAOX,WAAA,GALA,KAAc,eAAmC,IAAI,GAA+B,CAClF,MAAO,GACP,iBAAkB,O,CAKpB,oBAAI,GACF,OAAO,KAAK,eAAe,MAAM,gB,CAGnC,SAAI,GACF,OAAO,KAAK,eAAe,MAAM,K,CAGnC,iBAAI,GACF,OAAO,KAAK,eAAe,K,CAG7B,6BAAI,GACF,OAAO,KAAK,c,CAGd,gBAAA,CAAiB,GACf,KAAK,eAAe,KAAK,E,QA1BhB,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAuB,KAAA,GAAA,OAAA,EAAA,gBAAA,YAAA,QAAvB,KAAA,MAAA,EAAA,uBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAuB,WAFtB,QAAM,E,iFAEP,GAAuB,WAAA,E,KAHnC,EAAW,KAAA,EACV,WAAY,W,wBC0Bd,MAAM,GAAmC,CACvC,uBAAwB,MACxB,mBAAoB,MA8BhB,MAAO,WACH,GAoCR,gBACI,CAAa,GACf,KAAK,cAAgB,C,CAGvB,gBAAI,GACF,OAAO,KAAK,a,CAGd,UACI,CAAO,GACT,KAAK,QAAU,C,CAGjB,UAAI,GACF,OAAO,KAAK,O,CAGd,WAAA,CACmB,EACjB,EACiB,EACA,EACE,EACF,EACT,GAER,MAAM,GARW,KAAa,cAAb,EAEA,KAAQ,SAAR,EACA,KAAW,YAAX,EACE,KAAyB,0BAAzB,EACF,KAAgC,iCAAhC,EACT,KAAgB,iBAAhB,EAxDD,KAAO,QAAmC,KAC1C,KAAgB,iBAAW,uBAC3B,KAAG,IAAW,OACd,KAAmB,oBAA4B,GAC/C,KAAY,aAAW,GACb,KAAA,cAAgB,IAAI,GAA0C,IAC9D,KAAA,QAAU,EAAO,OACjB,KAAA,iBAAmB,EAAqB,IAC3D,KAAc,eAA2B,GACzC,KAAuB,wBAA2B,GAClD,KAAa,cAAkB,KAC/B,KAAa,cAAG,GAChB,KAAW,YAAG,GACd,KAAI,KAAG,GACP,KAAQ,SAAG,MACX,KAAkB,mBAAG,KACrB,KAAO,QAAG,EACV,KAAO,QAAG,GACV,KAAU,WAAG,MACb,KAAqB,sBAAG,KAAK,iBAAiB,QAAQ,YAGtD,KAAgB,iBAAa,GAE7B,KAAiB,kBAAY,MAE7B,KAAqB,sBAAoB,GAEjC,KAAa,cAAG,GAChB,KAAO,QAAG,GA+BhB,KAAK,cAAgB,KAAK,YAAY,MAAM,CAC1C,KAAM,CAAC,GAAI,IACX,IAAK,CACH,GACA,CACE,EAAW,SACX,EAAW,QAAQ,YACnB,EAAW,QAAQ,kB,CAM3B,sBAAA,GACE,QACE,KAAK,eACL,KAAK,kBAAkB,OAAS,GAChC,KAAK,cAAc,KAAK,eAAe,OAAS,GAChD,KAAK,oBAAoB,OAAS,E,CAItC,sBAAA,GACE,IAAK,KAAK,iBAAiB,GAAI,CAC7B,M,CAEF,KAAK,eAAe,GAAG,SAAW,KAAK,wB,CAGlC,QAAA,GACL,KAAK,iCAAiC,IAAM,KAAK,IACjD,KAAK,eACL,MAAM,EAAiC,CACrC,CACE,GAAI,SACJ,MAAO,KAAK,iBAAiB,QAAQ,gBACrC,QAAS,KAAK,iBAAiB,QAAQ,gBACvC,SAAU,KAAK,yBACf,YAAa,YAGjB,KAAK,YAAc,KAAK,iBAAiB,QACvC,4BAEF,KAAK,KAAO,KAAK,iBAAiB,QAAQ,WAC1C,KAAK,eAAiB,EAEtB,KAAK,wBAAwB,KAC3B,CACE,GAAI,mBACJ,MAAO,KAAK,iBAAiB,QAAQ,WACrC,QAAS,KAAK,iBAAiB,QAAQ,WACvC,SAAU,MACV,YAAa,WAEf,CACE,GAAI,gBACJ,MAAO,KAAK,iBAAiB,QAAQ,kBACrC,QAAS,KAAK,iBAAiB,QAAQ,kBACvC,SAAU,KACV,YAAa,YAIjB,KAAK,cAAc,cAAc,WAAW,IAC1C,KAAK,wBAAwB,GAAG,SAAW,IAAW,OAAO,G,CAGjE,WAAA,CAAY,GACV,GAAI,EAAQ,kBAAoB,EAAQ,gBAAgB,YAAa,CACnE,KAAK,cAAgB,GACrB,KAAK,c,EAIC,uBAAA,CAAwB,GAChC,MAAM,EAA2C,EAAe,KAAK,IACnE,EAAW,UAAY,aACvB,EAAW,UAAY,KAAK,iBAAiB,QAAQ,oBACrD,EAAW,kBAAoB,KAAK,iBAAiB,QAAQ,0BAC7D,OAAO,CAAU,IAEnB,MAAM,EAAwB,KAAK,sBAAsB,QAAQ,GAAe,GAAY,OAAS,cACrG,KAAK,sBAAwB,IAAI,KAA0B,GAC3D,KAAK,iBAAmB,EAAe,KAAK,GAAe,EAAW,KACtE,KAAK,wB,CAIG,eAAA,CAAgB,GACxB,MAAM,EAAa,KAAK,0BAA0B,cAAc,GAChE,KAAK,iBAAiB,QAAO,GAAW,IAAS,EAAa,KAC9D,KAAK,wB,CAGG,kBAAA,CAAmB,GAC3B,KAAK,iBAAiB,QAAO,GAAe,EAAY,QAAO,GAAK,IAAM,MAC1E,KAAK,wB,CAIG,eAAA,CAAgB,GACxB,KAAK,iCAAiC,mBAAmB,E,CAG3D,qBAAA,CAAsB,GACpB,KAAK,cAAgB,EACrB,KAAK,wB,CAGP,wBAAA,CAAyB,GACvB,GAAI,EAAM,SAAW,SAAU,CAC7B,MAAM,EAAO,EAAM,KACnB,KAAK,wBAAwB,EAAK,U,EAItC,iBAAA,CAAkB,GAChB,KAAK,cAAc,MAAM,E,CAG3B,uBAAA,CAAwB,GACtB,KAAK,cAAc,KAAK,GAAqC,CAC3D,QAAS,CACP,SAAU,SACV,gBAAiB,GACjB,oBAAqB,MACrB,yBAA0B,KAC1B,UAAW,MAEb,KAAM,CACJ,MAAO,KAAK,iBAAiB,QAC3B,sCAEF,QAAS,KAAK,iBAAiB,QAC7B,wCAEF,eAAgB,KACd,KAAK,cAAc,EAAU,I,CAMrC,UAAA,CAAW,GACT,IAAK,EAAM,CACT,OAAO,K,CAET,MAAM,EAAY,KAAK,SAAS,UAAU,EAAM,aAChD,IAAK,EAAW,CAEd,OAAO,K,CAET,GAAI,KAAK,gBAAkB,EAAW,CAEpC,OAAO,I,CAGT,KAAK,cAAgB,EACrB,OAAO,K,CAGT,sBAAA,CAAuB,GACrB,GAAI,EAAO,KAAO,SAAU,CAC1B,IAAK,KAAK,MAAQ,KAAK,aAAc,OACrC,KAAK,QAAQ,IAAI,MAEjB,MAAM,EAAO,CACX,KAAM,KAAK,cACX,SAAU,KAAK,cAEjB,MAAM,EAAW,KAAK,UAAU,GAChC,KAAK,iBAAiB,iBAAiB,CAAE,iBAAkB,KAAM,MAAO,KAAK,iBAAiB,QAAQ,2BACtG,KAAK,iCAAiC,aAAa,KAAK,aAAc,EAAU,KAAK,cAAc,KAAK,cAAe,KAAK,mBAAoB,KAAK,kBAClJ,KAAK,IAAU,IAAM,KAAK,iCAAiC,aAAa,KAAK,iBAC7E,UAAU,CACT,KAAO,GAAa,KAAK,cAAc,KAAK,GAC5C,SAAU,KACR,KAAK,iBAAiB,IAAI,IAC1B,KAAK,sBAAwB,GAC7B,KAAK,oBAAsB,GAC3B,KAAK,iBAAmB,GACxB,KAAK,cAAgB,KACrB,KAAK,WAAa,KAClB,KAAK,eAAe,GAAG,SAAW,KAClC,KAAK,QAAQ,IAAI,OACjB,KAAK,iBAAiB,iBAAiB,CAAE,iBAAkB,MAAO,MAAO,IAAK,G,EAMxF,+BAAA,CAAgC,GAC9B,GAAI,EAAO,KAAO,gBAAiB,CACjC,KAAK,wB,MACA,GAAI,EAAO,KAAO,mBAAoB,CAC3C,KAAK,cAAc,QACnB,KAAK,kBAAoB,K,EAI7B,sBAAA,GACE,IAAK,KAAK,cAAc,MAAO,CAC7B,M,CAGF,IAAI,EAAuB,KAAK,cAAc,MAAM,OAAO,OAC3D,IAAK,OAAO,kBAAkB,KAAK,GAAe,CAChD,EAAe,WAAa,C,CAE9B,IAAI,EAAgB,KAAK,cAAc,MAAM,SAAS,QAAU,GAChE,GAAI,IAAkB,GAAI,CACxB,EAAgB,C,CAElB,MAAM,EAAyB,CAC7B,GAAI,GACJ,KAAM,YACN,UAAW,EACX,KAAM,EACN,IAAK,EACL,UAAW,aACX,UAAW,KAAK,iBAAiB,QAAQ,cACzC,kBAAmB,KAAK,iBAAiB,QAAQ,sBAEnD,KAAK,sBAAsB,KAAK,GAChC,KAAK,cAAc,QACnB,KAAK,kBAAoB,MACzB,KAAK,wB,CAGP,aAAA,CAAc,GACZ,KAAK,iBAAiB,iBAAiB,CAAE,iBAAkB,KAAM,MAAO,KAAK,iBAAiB,QAAQ,2BACtG,KAAK,iCAAiC,cAAc,GACjD,WAAU,IAAM,KAAK,gB,CAG1B,uBAAA,GACE,KAAK,mBAAqB,KAAK,iB,CAGjC,wBAAA,CAAyB,GACvB,GAAI,EAAM,MAAQ,SAAW,EAAM,MAAQ,IAAK,CAC9C,KAAK,yB,EAIT,0BAAA,CAA2B,GACzB,KAAK,sBAAwB,KAAK,sBAAsB,QACrD,GAAgB,EAAY,KAAO,EAAK,KAE3C,GAAI,GAAM,OAAS,YAAa,CAC9B,KAAK,oBAAsB,KAAK,oBAAoB,QACjD,GAAmB,EAAe,KAAO,EAAK,KAEjD,KAAK,iBAAmB,KAAK,iBAAiB,QAAO,GAAM,IAAO,EAAK,I,CAEzE,KAAK,wB,CAGP,kCAAA,CACE,EACA,GAEA,GAAI,EAAM,MAAQ,SAAW,EAAM,MAAQ,IAAK,CAC9C,KAAK,2BAA2B,E,EAIpC,eAAA,CAAgB,GACd,OAAO,EAAK,QAAQ,KAAO,KAAK,M,CAGlC,WAAA,CAAY,GACV,OAAO,EAAK,QAAQ,YAAc,EAAK,QAAQ,YAAc,E,CAG/D,UAAA,CAAW,GACT,MAAM,EAAS,OAAO,UAAU,SAChC,GAAI,EAAO,SAAS,MAAO,CACzB,MAAM,EAAkB,IAAI,KAAK,GACjC,OAAO,EAAgB,WAAa,IAAM,EAAgB,UAAY,IAAM,EAAgB,a,CAE9F,OAAO,IAAI,KAAK,eAAe,UAAW,CAAE,UAAW,UAAW,OAAO,IAAI,KAAK,G,CAGpF,kBAAA,GACE,OAAO,KAAK,U,CAIN,YAAA,GACN,KAAK,iBAAiB,iBAAiB,CAAE,iBAAkB,KAAM,MAAO,KAAK,iBAAiB,QAAQ,4BACtG,KAAK,QAAQ,IAAI,MACjB,KAAK,iCACF,aAAa,KAAK,cAClB,UAAU,CACT,KAAM,IACJ,KAAK,cAAc,KAAK,EAAS,EAGnC,SAAU,KACR,KAAK,QAAQ,IAAI,OACjB,KAAK,iBAAiB,iBAAiB,CAAE,iBAAkB,MAAO,MAAO,IAAK,G,CAK9E,aAAA,CAAc,GACpB,OAAO,KAAK,sBACT,QAAO,GAAK,GAAG,OAAS,cACxB,KAAK,IAAC,IACF,EACH,c,CAIN,gCAAA,GACE,KAAK,wB,QA/XI,KAAA,KAAA,EAAA,oBAAA,WAAA,SAAA,QAAA,SAAA,SAAA,EAAA,KAAA,GAAkC,KAAA,EAAA,MAAA,IAAA,CAAA,MAAA,EAAA,kBAAA,CAAA,MAAA,EAAA,UAAA,CAAA,MAAA,EAAA,aAAA,CAAA,MAAA,IAAA,CAAA,MAAA,IAAA,CAAA,MAAA,KAAA,OAAA,EAAA,gBAAA,WAAA,QAAlC,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GATA,aAAA,KAAA,SAAA,mCAAA,OAAA,CAAA,IAAA,MAAA,QAAA,UAAA,iBAAA,mBAAA,IAAA,MAAA,oBAAA,sBAAA,aAAA,eAAA,aAAA,eAAA,OAAA,UAAA,UAAA,CACT,EACA,GACA,GACA,CAAE,QAAS,GAA4B,SAAU,KC1DrD,gBAAA,KAAA,cAAA,KAAA,SAAA,EAAA,SAAA,o7JDwCI,OAAA,4zXAAA,aAAA,EAAA,KAAA,YAAA,KAAA,EACA,SAAA,mBAAA,OAAA,6CAAA,KAAA,WAAA,KAAA,GACA,CAAA,KAAA,YAAA,KAAA,EAAA,QAAA,SAAA,YAAA,OAAA,sBAAA,KAAA,OAAA,KAAA,EAAA,UAAA,KAAA,UAAA,KAAA,YAAA,KAAA,GAAwB,SAAA,uBAAA,OAAA,gHAAA,QAAA,0BAAA,KAAA,YAAA,KACxB,GAAuB,SAAA,sBAAA,OAAA,+HAAA,QAAA,+CAAA,KAAA,YAAA,KACvB,GAA0B,SAAA,0BAAA,OAAA,yCAAA,QAAA,kCAAA,KAAA,WAAA,KAC1B,GACA,CAAA,KAAA,OAAA,KAAA,EAAA,cAAA,KAAA,cAAA,KAAA,YAAA,KAAA,GACA,SAAA,qCAAA,KAAA,YAAA,KAAA,GACA,SAAA,+BAAA,OAAA,+CAAA,QAAA,sBAAA,KAAA,YAAA,KAAA,GAA2B,SAAA,0BAAA,OAAA,qDAAA,QAAA,uDAAA,KAAA,YAAA,KAC3B,GAAyB,SAAA,yBAAA,OAAA,8LAAA,QAAA,gDAAA,KAAA,WAAA,KACzB,GAAW,CAAA,KAAA,YAAA,KAAA,EAAA,cAAA,SAAA,iDAAA,KAAA,YAAA,KAAA,EAAA,gBAAA,SAAA,8CAAA,KAAA,YAAA,KAAA,EAAA,qBAAA,SAAA,6FAAA,KAAA,WAAA,KACX,GAAmB,CAAA,KAAA,YAAA,KAAA,EAAA,mBAAA,SAAA,cAAA,OAAA,cAAA,QAAA,aAAA,SAAA,aAAA,KAAA,YAAA,KAAA,EAAA,gBAAA,SAAA,oBAAA,OAAA,yCAAA,QAAA,oBAAA,gBAAA,EAAA,wBAAA,OAAA,cAAA,EAAA,kBAAA,WAAA,E,iFAYV,GAAkC,WAAA,E,KA5B9C,EACW,KAAA,EAAA,SAAA,mCAGD,QAAA,CACP,EACA,EACA,GACA,GACA,GACA,EACA,GACA,GACA,GACA,GACA,EACA,EACA,GAES,UAAA,CACT,EACA,GACA,GACA,CAAE,QAAS,GAA4B,SAAU,KAClD,gBACgB,EAAwB,OAC1B,cAAA,EAAkB,UAAS,SAAA,o7JAAA,OAAA,g0XAOf,eAAA,MAAA,KAAA,IAAA,CAAA,KAAA,EAAA,kBAAA,CAAA,KAAA,EAAA,UAAA,CAAA,KAAA,EAAA,aAAA,CAAA,KAAA,IAAA,CAAA,KAAA,IAAA,CAAA,KAAA,KAAA,eAAA,CAAA,IAAG,E,KAA7B,E,MAAM,CAAE,SAAU,SACV,QAAO,EAAf,KAAA,IACQ,iBAAgB,EAAxB,KAAA,IACQ,IAAG,EAAX,KAAA,IACQ,oBAAmB,EAA3B,KAAA,IACQ,aAAY,EAApB,KAAA,IA4BG,aAAY,EADf,KAAA,IAUG,OAAM,EADT,KAAA,OEnGU,MAAA,GAGX,SAAI,GACF,OAAO,KAAK,M,CAGd,WAAA,CAAoB,GAAA,KAAgB,iBAAhB,EALZ,KAAM,OAAG,E,CAOjB,QAAA,GACE,KAAK,iBAAiB,0BAA0B,WAAW,IACzD,KAAK,OAAS,EAAK,KAAK,G,CAI5B,UAAA,GACE,KAAK,iBAAiB,iBAAiB,CACrC,MAAO,GACP,iBAAkB,O,CAItB,YAAA,CAAa,GACX,GAAI,EAAO,MAAQ,SAAW,EAAO,MAAQ,SAAU,CACrD,KAAK,Y,8FAxBE,GAAyB,KAAA,EAAA,MAAA,KAAA,OAAA,EAAA,gBAAA,WAAA,QAAzB,KAAA,KAAA,EAAA,sBAAA,WAAA,SAAA,QAAA,SAAA,KAAA,GAAyB,aAAA,KAAA,SAAA,yBAAA,SAAA,EAAA,SCVtC,6PAYM,OAAA,skIAAA,cAAA,EAAA,kBAAA,WAAA,E,iFDFO,GAAyB,WAAA,E,KANrC,EACW,KAAA,EAAA,SAAA,yBAAwB,cAGnB,EAAkB,UAAS,SAAA,6PAAA,OAAA,0kI","file":"/npm/ngx-bimplus-components@0.0.193/fesm2022/ngx-bimplus-components.mjs/+esm","sourceRoot":"","sourcesContent":["/**\n * Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.39.0.\n * Original file: /npm/ngx-bimplus-components@0.0.193/fesm2022/ngx-bimplus-components.mjs\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class NgxBimplusComponentsService {\r\n\r\n}\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\n    selector: 'lib-ngx-bimplus-components',\n    imports: [],\n    template: `\r\n    <p>\r\n      ngx-bimplus-components works!\r\n    </p>\r\n  `,\n    styles: ``\n})\r\nexport class NgxBimplusComponentsComponent {\r\n\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, ViewEncapsulation, Input, signal, WritableSignal } from '@angular/core';\r\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\r\nimport { LocalizedStrings } from './../../types/types'\r\n\r\n@Component({\r\n  selector: 'lib-bimplus-localized-widget',\r\n  imports: [CommonModule, TranslateModule],\r\n  providers: [TranslateService],\r\n  template: `\r\n  <p>\r\n    localized widget works!\r\n  </p>\r\n  `,\r\n  styles: [],\r\n  encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusLocalizedWidgetComponent {\r\n  constructor(public translateService: TranslateService) {\r\n  }\r\n\r\n  _selectedLanguage: WritableSignal<string> = signal('en');\r\n  get selectedLanguage(): string {\r\n    return this._selectedLanguage();\r\n  }\r\n  @Input() set selectedLanguage(value: string) {\r\n    this._selectedLanguage.set(value);\r\n    this.translateService.use(value);\r\n    try {\r\n      this.translateService.setTranslation(this.selectedLanguage, this._localizedStrings());\r\n    } catch (error) {\r\n      console.error(error);\r\n    }\r\n  }\r\n\r\n  _localizedStrings: WritableSignal<LocalizedStrings> = signal({} as LocalizedStrings);\r\n  get localizedStrings(): LocalizedStrings {\r\n    return this._localizedStrings();\r\n  }\r\n  @Input() set localizedStrings(value: LocalizedStrings) {\r\n    this._localizedStrings.set(value);\r\n    this.translateService.use(this.selectedLanguage);\r\n    try {\r\n      this.translateService.setTranslation(this.selectedLanguage, value);\r\n    } catch (error) {\r\n      console.error(error);\r\n    }\r\n  }\r\n}\r\n","import { Component, Input, booleanAttribute, computed, input } from '@angular/core';\n\ntype SpinnerTexts = string[] | null | undefined;\ntype SpinnerText = string | null | undefined;\n\n@Component({\n  selector: 'lib-loading-spinner',\n  templateUrl: './loading-spinner.component.html',\n  styleUrl: './loading-spinner.component.less'\n})\nexport class LoadingSpinnerComponent {\n  @Input({ transform: booleanAttribute }) spinnerSpinActive: boolean = false;\n  @Input({ transform: booleanAttribute }) spinnerHoverEnabled: boolean = false;\n  @Input({ transform: booleanAttribute }) spinnerDisabled: boolean = false;\n  spinnerText = input<SpinnerText>(undefined);\n  spinnerTexts = input<SpinnerTexts>(undefined);\n\n  protected readonly isSpinnerTextsArray = computed(() => {\n    const spinnerTexts = this.spinnerTexts();\n    return !!(spinnerTexts && typeof spinnerTexts === 'object' && Array.isArray(spinnerTexts) && Boolean(spinnerTexts.length))\n  });\n}\n","<div class=\"loading-spinner\">\n  <div class=\"spinner-conatiner\">\n    <div\n      class=\"spinner-icon\"\n      [class.spinner-spin-active]=\"spinnerSpinActive\"\n      [class.spinner-disabled]=\"spinnerDisabled\"\n      [class.hover-enabled]=\"spinnerHoverEnabled && !spinnerDisabled\"\n    ></div>\n    @if (spinnerText(); as spinnerText) {\n      <div class=\"spinner-text\" data-test=\"spinner-text\">\n        {{ spinnerText }}\n      </div>\n    }\n    @if (isSpinnerTextsArray()) {\n      <div class=\"spinner-texts\" data-test=\"spinner-texts\">\n        @for (_spinnerText of spinnerTexts(); track _spinnerText) {\n          <div class=\"spinner-text\">\n            {{ _spinnerText }}\n          </div>\n        }\n      </div>\n    }\n  </div>\n</div>","import { Component, input, Input, ViewEncapsulation } from '@angular/core';\r\nimport { LoadingSpinnerComponent } from '../loading-spinner/loading-spinner.component';\r\n\r\n@Component({\r\n  selector: 'lib-bimplus-sidenav-drawer-content',\r\n  imports: [\r\n    LoadingSpinnerComponent\r\n  ],\r\n  templateUrl: './bimplus-sidenav-drawer-content.component.html',\r\n  styleUrl: './bimplus-sidenav-drawer-content.component.less',\r\n  encapsulation: ViewEncapsulation.None\r\n})\r\nexport class BimplusSidenavDrawerContentComponent {\r\n  header = input<string>('');\r\n  isLoading = input<boolean>(false);\r\n  @Input() loadingSpinnerText: string = \"\"\r\n}\r\n","<div class=\"sidenav-drawer-content-layout\">\n  @if (header(); as header) {\n  <div class=\"sidenav-drawer-header\">\n    <div class=\"sidenav-drawer-header-title\">\n      <span>{{ header }}</span>\n    </div>\n  </div>\n  }\n\n  <div class=\"sidenav-drawer-content-offset\">\n    <ng-content></ng-content>\n  </div>\n  @if(isLoading()){\n  <div class=\"sidenav-drawer-loading-overlay\">\n    <lib-loading-spinner\n      [spinnerHoverEnabled]=\"false\"\n      [spinnerSpinActive]=\"true\"\n      [spinnerDisabled]=\"false\"\n      [spinnerText]=\"loadingSpinnerText\"\n    >\n    </lib-loading-spinner>\n  </div>\n  }\n</div>\n","import { Observable } from \"rxjs\";\n\nexport interface BimplusButtonRowItem {\n  id: string;\n  iconClass?: string;\n  icon?: string;\n  title?: string;\n  tooltip?: string;\n  disabled?: boolean | Observable<boolean>;\n  buttonStyle?: 'primary' | 'secondary';\n  buttonType?: 'text' | 'icon' | 'combined';\n  type?: typeof BimplusButtonType['FILE' | 'TEXT'];\n}\n\nexport interface BimplusButtonClickEvent {\n  id: string;\n}\n\nexport const BimplusButtonType = {\n  FILE: 'file',\n  TEXT: 'text'\n} as const;","import { Observable, take } from 'rxjs';\nimport { BimplusLocalizedWidgetComponent } from '../bimplus-localized-widget/bimplus-localized-widget.component';\nimport {\n  BimplusButtonRowItem,\n  BimplusButtonClickEvent,\n  BimplusButtonType,\n} from './bimplus-buttons-row.interface';\nimport { AsyncPipe, NgTemplateOutlet } from '@angular/common';\nimport { Component, ViewEncapsulation, EventEmitter, Output, Input, input } from '@angular/core';\n\n@Component({\n  selector: 'lib-bimplus-buttons-row',\n  imports: [NgTemplateOutlet, AsyncPipe],\n  templateUrl: './bimplus-buttons-row.component.html',\n  styleUrl: './bimplus-buttons-row.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusButtonsRowComponent extends BimplusLocalizedWidgetComponent {\n  protected readonly BimplusButtonType = BimplusButtonType;\n  @Input () isMultiple = false;\n  items = input<BimplusButtonRowItem[]>([]);\n  canUpdateObject = input<boolean>(false);\n\n  @Output() fileChanged = new EventEmitter<File[]>();\n  @Output() buttonClicked = new EventEmitter<BimplusButtonClickEvent>();\n\n  protected onChange(event: Event, inputElement: HTMLInputElement) {\n    const files = (event.target as unknown as { files: File[] }).files;    \n\n    if (files) {\n      this.fileChanged.emit(files);\n      // reset value to be able select same value again\n      inputElement.value = '';\n    }\n  }\n\n  protected _buttonClicked(item: BimplusButtonRowItem) {\n    if (item.disabled && this.isObservable(item.disabled)) {\n      // evaluate observable once\n      item.disabled.pipe(take(1)).subscribe((disabled) => {\n        if (!disabled) {\n          this.buttonClicked.emit({ id: item.id });\n        }\n      });\n      return;\n    }\n    if (item.disabled) {\n      return;\n    }\n    this.buttonClicked.emit({ id: item.id });\n  }\n\n  protected isObservable(value: Observable<boolean> | boolean): value is Observable<boolean> {\n    return typeof value === 'object' && 'subscribe' in value;\n  }\n}\n","<div class=\"button-row\">\n  @for(item of items(); track item.id; let last=$last; let first=$first;) {\n    @switch(item.type) {\n      @case (BimplusButtonType.FILE) {\n        <ng-container\n          *ngTemplateOutlet=\"fileButton; context: { $implicit: item, last, first }\"\n        ></ng-container>\n      } @default {\n        <ng-container\n          *ngTemplateOutlet=\"button; context: { $implicit: item, last, first }\"\n        ></ng-container>\n      }\n    }\n  }\n</div>\n\n<ng-template #fileButton let-item let-last=\"last\" let-first=\"first\">\n  <input\n    #fileInput\n    hidden\n    type=\"file\"\n    (change)=\"onChange($event, fileInput)\"\n    [id]=\"item.id\"\n    [attr.multiple]=\"isMultiple ? true : null\"\n  />\n  <ng-container\n    *ngTemplateOutlet=\"\n      button;\n      context: { $implicit: item, last, first, fileInput }\n    \"\n  ></ng-container>\n</ng-template>\n\n<ng-template\n  #button\n  let-item\n  let-last=\"last\"\n  let-first=\"first\"\n  let-fileInput=\"fileInput\"\n>\n  <button\n    data-test=\"button\"\n    [class.last]=\"last\"\n    [class.first]=\"first\"\n    [class.primary-button]=\"\n      item.buttonStyle === undefined || item.buttonStyle === 'primary'\n    \"\n    [class.secondary-button]=\"item.buttonStyle === 'secondary'\"\n    [class.text-button]=\"\n      item.buttonType === undefined || item.buttonType === 'text'\n    \"\n    [class.icon-button]=\"item.buttonType === 'icon'\"\n    [class.combined-button]=\"item.buttonType === 'combined'\"\n    [class.disabled]=\"item.disabled === true\"\n    (click)=\"fileInput ? fileInput.click() : _buttonClicked(item)\"\n    title=\"{{ item.tooltip }}\"\n    [disabled]=\"isObservable(item.disabled) ? !!(item.disabled | async) : !!item.disabled\"\n  >\n    {{ item.title }}\n  </button>\n</ng-template>\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\n\nexport class BimplusConnectionDesignerService {\n  private _activeStep: number = 0;\n\n  activeStepChange$: Subject<number> = new Subject<number>();\n\n  set activeStep(activeStep: number) {\n    this._activeStep = activeStep;\n    this.activeStepChange$.next(this._activeStep);\n  }\n\n  get activeStep(): number {\n    return this._activeStep;\n  }\n\n  constructor() { }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output, ViewEncapsulation, OnInit } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { NgSelectModule } from '@ng-select/ng-select';\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\nimport { BimplusConnectionDesignerService } from \"./bimplus-connection-designer.service\"\nimport { BimplusLocalizedWidgetComponent } from \"./../bimplus-localized-widget/bimplus-localized-widget.component\"\nimport { BimplusSidenavDrawerContentComponent } from '../bimplus-sidenav-drawer-content/bimplus-sidenav-drawer-content.component';\nimport { BimplusButtonsRowComponent } from \"../bimplus-buttons-row/bimplus-buttons-row.component\";\nimport { BimplusButtonRowItem, BimplusButtonClickEvent } from \"../bimplus-buttons-row/bimplus-buttons-row.interface\";\nimport { DesignCode } from './bimplus-connection-designer.interface';\n\n@Component({\n  selector: 'lib-bimplus-connection-designer',\n  imports: [\n    CommonModule,\n    FormsModule,\n    NgSelectModule,\n    TranslateModule,\n    BimplusSidenavDrawerContentComponent,\n    BimplusButtonsRowComponent,\n    BimplusSidenavDrawerContentComponent\n  ],\n  providers: [TranslateService],\n  templateUrl: './bimplus-connection-designer.component.html',\n  styleUrl: './bimplus-connection-designer.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusConnectionDesignerComponent extends BimplusLocalizedWidgetComponent implements OnInit {\n  buttonRowItems: Array<BimplusButtonRowItem> = [];\n  config: Array<BimplusButtonRowItem> = [];\n  constructor(\n    translateService: TranslateService\n    , protected connectionDesignerService: BimplusConnectionDesignerService\n  ) {\n    super(translateService);\n    connectionDesignerService.activeStepChange$.subscribe((step) => {\n      if (step === 0) {\n        this.resetDesignCode();\n      }\n    });\n  }\n\n  ngOnInit(): void {\n    this.config.push({\n      id: \"next\"\n      , title: this.translateService.instant('_Next')\n      , tooltip: this.translateService.instant('_Next')\n      , disabled: true\n      , buttonStyle: 'primary'\n    });\n    this.buttonRowItems = this.config;\n  }\n\n  // #region Design codes\n\n  chooseCode: string = \"_Choose_a_design_code\"; // Message for drop down list\n\n  // Design method codes defined in SDS2 (see WebSdk Connexis service for possible values)\n  @Input() designCodes: Array<DesignCode> = [\n    { id: \"0\", name: \"EN 1993-1-8 (Eurocode 3)\", code: \"EURO05\", codeNumber: 9 },\n    { id: \"1\", name: \"AISC 360-22 (16th Ed.): LRFD\", code: \"LRFD16\", codeNumber: 19 },\n    { id: \"2\", name: \"AISC 360-22 (16th Ed.): ASD\", code: \"ASD16\", codeNumber: 18 },\n    { id: \"3\", name: \"CSA S16:19 (CISC 12th Ed.)\", code: \"CSA12\", codeNumber: 17 },\n  ];\n  @Input() currentDesignCode: DesignCode | null = null;\n\n  @Output() designCodeChanged = new EventEmitter<DesignCode | null>();\n\n  set activeDesignCode(value: DesignCode | null) {\n    this.currentDesignCode = value;\n    this.designCodeChanged.emit(this.currentDesignCode);\n  }\n\n  get activeDesignCode(): DesignCode | null {\n    return this.currentDesignCode;\n  }\n\n  private _updateButtonState(buttonId: string, disabled: boolean) {\n    const _button = this.config.find(btn => btn.id === buttonId);\n    if (!_button) {\n      return;\n    }\n    _button.disabled = disabled;\n  }\n\n  private _calculationCanBeStarted: boolean = true;\n  @Input()\n  set calculationCanBeStarted(value: boolean) {\n    this._calculationCanBeStarted = value;\n    this._updateButtonState(\"next\", !value);\n  }\n  get calculationCanBeStarted() {\n    return this._calculationCanBeStarted;\n  }\n\n  @Output() startCalculationClicked = new EventEmitter<void>();\n\n  buttonClicked($event: BimplusButtonClickEvent) {\n    if ($event.id === \"next\") {\n      this.connectionDesignerService.activeStep = 1;\n      if (this._calculationCanBeStarted) {\n        this.startCalculationClicked.emit();\n      }\n    }\n  }\n\n  resetDesignCode() {\n    this.activeDesignCode = null;\n  }\n  // #endregion\n}\n","<lib-bimplus-sidenav-drawer-content\n  [header]=\"'_Connection_designer' | translate\"\n>\n  <div class=\"connection-designer-content\">\n    @if(connectionDesignerService.activeStep === 0) {\n       <div class=\"cross-button\">\n        <div class=\"cross\"\n        (click)=\"resetDesignCode()\"\n        (keypress)=\"resetDesignCode()\"\n        >\n      </div>\n      </div>\n      <div class=\"title\">\n        {{ \"_Select_the_code\" | translate }}\n      </div>\n      <div class=\"description\">\n        {{ \"_Activate_all_objects_to_make_a_connection\" | translate }}\n      </div>\n      <div class=\"note\">\n        {{ \"_Activate_all_objects_note\" | translate }}\n      </div>\n\n      @if(designCodes.length > 0){\n        <div class=\"design-codes\">\n          <ng-select\n            class=\"design-codes-dropdown\"\n            [(ngModel)]=\"activeDesignCode\"\n            [clearable]=\"false\"\n            [searchable]=\"false\"\n            [placeholder]=\"chooseCode | translate\"\n          >\n            <ng-option *ngFor=\"let code of designCodes\" [value]=\"code\">{{\n              code.name\n            }}</ng-option>\n          </ng-select>\n        </div>\n      } @else {\n        <div class=\"no-design-codes\">\n          {{ \"_No_design_codes_defined\" | translate }}\n        </div>\n      }\n\n      <lib-bimplus-buttons-row\n        [items]=\"buttonRowItems\"\n        (buttonClicked)=\"buttonClicked($event)\"\n      ></lib-bimplus-buttons-row>\n\n    } @else {\n      <ng-content select=\"lib-bimplus-connection-designer-results\"></ng-content>\n    }\n  </div>\n</lib-bimplus-sidenav-drawer-content>\n","import { CommonModule } from '@angular/common';\r\nimport { Component, model } from '@angular/core';\r\n\r\n@Component({\r\n  selector: 'lib-expansion-panel',\r\n  imports: [CommonModule],\r\n  templateUrl: './expansion-panel.component.html',\r\n  styleUrl: './expansion-panel.component.less'\r\n})\r\nexport class ExpansionPanelComponent {\r\n  // #region public fields\r\n  expanded = model<boolean>(true);\r\n  // #endregion public fields\r\n\r\n  // #region public methods\r\n  toggleExpand(){\r\n    this.expanded.update(value => !value);\r\n  }\r\n  // #endregion public methods\r\n}\r\n","<div class=\"expansion-panel\">\n    <div class=\"expansion-panel-header-row\">\n        <div \n            class=\"expansion-panel-expander-icon\" \n            data-test=\"expansion-panel\"\n            [ngClass]=\"expanded() ? 'open' : 'closed'\" \n            (click)=\"toggleExpand()\"\n            (keypress)=\"toggleExpand()\"\n        ></div>\n        <div class=\"expansion-panel-header-content\">\n            <ng-content select=\"lib-expansion-panel-header\"></ng-content>\n        </div>\n    </div>\n    <div class=\"expansion-panel-content-container\" [ngClass]=\"expanded() ? '' : 'collapsed'\">\n        <ng-content></ng-content>\n    </div>\n</div>\n\n","import { Component, HostBinding, ViewEncapsulation } from '@angular/core';\r\n\r\n@Component({\r\n  selector: 'lib-expansion-panel-header',\r\n  imports: [],\r\n  templateUrl: './expansion-panel-header.component.html',\r\n  styleUrl: './expansion-panel-header.component.less',\r\n  encapsulation: ViewEncapsulation.None\r\n})\r\nexport class ExpansionPanelHeaderComponent {\r\n  @HostBinding('class.expansion-panel-header-container') centerMenuButtonClass: boolean = true;\r\n}\r\n","    <div class=\"expansion-panel-header-title\">\r\n        <ng-content></ng-content>\r\n    </div>\r\n    <div>\r\n        <ng-content select=\"lib-expansion-panel-header-actions\"></ng-content>\r\n    </div>","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n  selector: 'lib-expansion-panel-header-actions',\r\n  imports: [],\r\n  templateUrl: './expansion-panel-header-actions.component.html',\r\n  styleUrl: './expansion-panel-header-actions.component.less'\r\n})\r\nexport class ExpansionPanelHeaderActionsComponent {\r\n\r\n}\r\n","<ng-content></ng-content>\r\n","import { Component, input } from '@angular/core';\n\n@Component({\n  selector: 'lib-bimplus-text-message',\n  templateUrl: './bimplus-text-message.component.html',\n  styleUrl: './bimplus-text-message.component.less'\n})\nexport class BimplusTextMessageComponent {\n  message = input<string | undefined>(undefined);\n}\n","@if(message(); as message) {\n  <div class=\"message\">\n    {{ message }}\n  </div>\n}","import {\n  Component\n  , ViewEncapsulation\n  , ElementRef\n  , AfterViewInit\n  , AfterViewChecked\n} from '@angular/core';\n\nimport SimpleBar from 'simplebar';\n\n@Component({\n  selector: 'lib-bimplus-scrollable-container',\n  imports: [],\n  templateUrl: './bimplus-scrollable-container.component.html',\n  styleUrl: './bimplus-scrollable-container.component.less',\n  encapsulation: ViewEncapsulation.None\n})\n\nexport class BimplusScrollableContainerComponent implements AfterViewInit, AfterViewChecked {\n  _simpleBar!: SimpleBar;\n  _element: HTMLElement;\n  protected _scrollableContainerClassName: string = '.scrollable-container';\n\n  constructor(private readonly elementRef: ElementRef){\n    this._element = this.elementRef.nativeElement;\n  }\n\n  private _initializationSimpleScrollBar(): void {\n    // init simple bar scrollbar\n    const scrollableContainer: HTMLElement | null = this._element?.querySelector(this._scrollableContainerClassName);\n    if (!scrollableContainer) {\n      console.error('No scrollable container found in the element.');\n      return;\n    }\n    this._simpleBar = new SimpleBar(scrollableContainer);\n  }\n\n  ngAfterViewInit(): void {\n    this._initializationSimpleScrollBar();\n  }\n\n  private _recalculateScrollbar(): void {\n    if(!this._element) {\n      return;\n    }\n    const _element = this._element;\n    const barElem = _element?.querySelector(this._scrollableContainerClassName);\n    if (!barElem){\n      return;\n    }\n\n    if (!this._simpleBar) {\n      console.error('No scrollable container found in the element.');\n      return;\n    }\n\n    this._simpleBar.recalculate();\n  }\n\n  ngAfterViewChecked(): void {\n    this._recalculateScrollbar();\n  }\n}\n","<div class=\"scrollable-container\">\n  <ng-content></ng-content>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output, ViewEncapsulation, OnInit, OnChanges, SimpleChanges } from '@angular/core';\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\nimport { BimplusLocalizedWidgetComponent } from \"../bimplus-localized-widget/bimplus-localized-widget.component\";\nimport { BimplusButtonsRowComponent } from \"../bimplus-buttons-row/bimplus-buttons-row.component\";\nimport { BimplusButtonRowItem, BimplusButtonClickEvent } from \"../bimplus-buttons-row/bimplus-buttons-row.interface\";\nimport { ConnexisResultsRoot, ConnexisResultList, ConnexisResult } from './bimplus-connection-designer-results.interface';\nimport { ExpansionPanelComponent } from '../expansion-panel/expansion-panel.component';\nimport { ExpansionPanelHeaderComponent } from '../expansion-panel-header/expansion-panel-header.component';\nimport { ExpansionPanelHeaderActionsComponent } from '../expansion-panel-header-actions/expansion-panel-header-actions.component';\nimport { BimplusConnectionDesignerService } from \"../bimplus-connection-designer/bimplus-connection-designer.service\";\nimport { BimplusTextMessageComponent } from \"../bimplus-text-message/bimplus-text-message.component\";\nimport { BimplusScrollableContainerComponent } from '../bimplus-scrollable-container/bimplus-scrollable-container.component'\n\n@Component({\n  selector: 'lib-bimplus-connection-designer-results',\n  imports: [\n    TranslateModule,\n    CommonModule,\n    BimplusButtonsRowComponent,\n    ExpansionPanelComponent,\n    ExpansionPanelHeaderComponent,\n    ExpansionPanelHeaderActionsComponent,\n    BimplusTextMessageComponent,\n    BimplusScrollableContainerComponent\n  ],\n  providers: [TranslateService],\n  templateUrl: './bimplus-connection-designer-results.component.html',\n  styleUrl: './bimplus-connection-designer-results.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusConnectionDesignerResultsComponent extends BimplusLocalizedWidgetComponent\n  implements OnInit, OnChanges {\n\n  buttonRowItems: Array<BimplusButtonRowItem> = [];\n\n  @Input() errorMessage: string = \"\";\n\n  constructor(\n    translateService: TranslateService\n    , protected connectionDesignerService: BimplusConnectionDesignerService\n  ) {\n    super(translateService)\n  }\n\n  ngOnInit(): void {\n    this.buttonRowItems = [\n      {\n        id: \"done\"\n        , title: this.translateService.instant('_Done')\n        , tooltip: this.translateService.instant('_Done')\n        , disabled: false\n        , buttonStyle: 'primary'\n      }\n    ];\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    const changedResults = changes['results']?.currentValue as ConnexisResultsRoot | null;\n    if (changedResults === null) {\n      this.connectionDesignerService.activeStep = 0;\n    }\n  }\n\n  @Output() doneClicked = new EventEmitter<void>();\n\n  buttonClicked($event: BimplusButtonClickEvent) {\n    if ($event.id === \"done\") {\n      this.connectionDesignerService.activeStep = 0;\n      this.doneClicked.emit();\n    }\n  }\n\n  // #region  Results\n  @Input() resultTreeRootTitle: string = \"\"; // Tooltip root node of tree\n  @Input() resultTreeRootName: string = \"\"; // Visible root node name of tree\n  @Input() expandedTreeRoot: boolean = false; // Root tree is expanded\n  @Input() expandedResultTrees: boolean = false; // failed and passed sub-tree expanded\n  @Input() results: ConnexisResultsRoot | null = null; // Root for all result lists (failed, passed)\n  @Output() toggleVisibilityResultsRoot = new EventEmitter<ConnexisResultsRoot>(); // root node\n  @Output() toggleVisibilityResultList = new EventEmitter<ConnexisResultList>(); // sub-nodes\n  @Output() toggleVisibilityResult = new EventEmitter<ConnexisResult>(); // children nodes\n  @Output() clickedResultsRoot = new EventEmitter<ConnexisResultsRoot>(); // root node\n  @Output() clickedResultList = new EventEmitter<ConnexisResultList>(); // sub-nodes\n  @Output() clickedResult = new EventEmitter<ConnexisResult>(); // children nodes\n  @Output() doubleClickedResultsRoot = new EventEmitter<ConnexisResultsRoot>(); // root node\n  @Output() doubleClickedResultList = new EventEmitter<ConnexisResultList>(); // sub-nodes\n  @Output() doubleClickedResult = new EventEmitter<ConnexisResult>(); // children nodes\n  @Output() mouseEnteredResult = new EventEmitter<ConnexisResult>(); // children nodes\n  @Output() mouseLeftResult = new EventEmitter<ConnexisResult>(); // children nodes\n\n  totalResults(): number {\n    let totalCount = 0;\n    if (!this.results) return totalCount;\n    for (const resultList of this.results.resultList) {\n      totalCount += resultList.results.length;\n    }\n    return totalCount\n  }\n  private statusMessage(result: ConnexisResult): string {\n    let message = \"\\n\";\n    message += result.isValid ? \"PASSED : \" : \"FAILED : \";\n    message += \"Unity Ratio \" + result.unityRatio;\n    return message;\n  }\n  private infoMessage(result: ConnexisResult): string {\n    if (!result.message) {\n      return \"\";\n    }\n\n    let message = \"\\n\";\n    message += \"Message: \";\n    message += result.message;\n    return message;\n  }\n\n  getTitle(result: ConnexisResult): string {\n    return `${result.name}${this.statusMessage(result)}${this.infoMessage(result)}`;\n  }\n  // #endregion\n}\n","<div class=\"connection-designer-content-result\">\n  <div class=\"title\">\n    {{ \"_Connection_Designer_results_title\" | translate }}\n  </div>\n  <div class=\"description\">\n    {{ \"_Connection_Designer_results_description\" | translate }}\n  </div>\n\n  @if(results !== null){\n    <lib-bimplus-scrollable-container>\n      <div class=\"scrollable-content-container\">\n        <lib-expansion-panel\n          class=\"project-navigator-model-panel\"\n          [expanded]=\"expandedTreeRoot\"\n        >\n          <lib-expansion-panel-header\n            [title]=\"resultTreeRootTitle ? resultTreeRootTitle : results.name + ' (' + totalResults() + ')'\"\n            (click)=\"clickedResultsRoot.emit(results)\"\n            (keypress)=\"clickedResultsRoot.emit(results)\"\n            (dblclick)=\"doubleClickedResultsRoot.emit(results)\"\n          >\n            <span class=\"project-navigator-root-node\">\n              {{ results.name }} ({{ totalResults() }})\n            </span>\n    \n            <lib-expansion-panel-header-actions>\n              <!-- toggle buttons should be removed for now see ALBP-24057 -->\n              <!-- <div\n                [attr.data-test]=\"'toggle_visibility_results'\"\n                class=\"ui-icon-checkbox-slider project-navigator-action-buttons\"\n                [ngClass]=\"{\n                  visible: results.isVisible,\n                  invisible: !results.isVisible,\n                  semivisible: results.isSemiVisible\n                }\"\n                [title]=\"'_Toggle visibility' | translate\"\n                (click)=\"toggleVisibilityResultsRoot.emit(results)\"\n              ></div> -->\n            </lib-expansion-panel-header-actions>\n          </lib-expansion-panel-header>\n    \n          <!-- Show all result lists as expansion panels -->\n          <!-- lib-bimplus-flat-tree can't be used for that at the moment -->\n          <div *ngFor=\"let resultList of results?.resultList\">\n            <lib-expansion-panel\n              class=\"project-navigator-model-panel\"\n              [expanded]=\"expandedResultTrees\"\n            >\n              <lib-expansion-panel-header>\n                <span\n                  class=\"project-navigator-model-node\"\n                  [ngClass]=\"{\n                    visible: resultList.isVisible\n                  }\"\n                  [style.color]=\"resultList.colorHexCode\"\n                  [title]=\"resultList.name + ' (' + resultList.results.length + ')'\"\n                  (click)=\"clickedResultList.emit(resultList)\"\n                  (keypress)=\"clickedResultList.emit(resultList)\"\n                  (dblclick)=\"doubleClickedResultList.emit(resultList)\"\n                >\n                  {{ resultList.name }} ({{ resultList.results.length }})\n                </span>\n    \n                <lib-expansion-panel-header-actions>\n                  <!-- toggle buttons should be removed for now see ALBP-24057 -->\n                  <!-- <div\n                    [attr.data-test]=\"'toggle_visibility_resultlist_' + resultList.id\"\n                    class=\"ui-icon-checkbox-slider project-navigator-action-buttons\"\n                    [ngClass]=\"{\n                      visible: resultList.isVisible,\n                      invisible: !resultList.isVisible,\n                      semivisible: resultList.isSemiVisible\n                    }\"\n                    [title]=\"'_Toggle visibility' | translate\"\n                    (click)=\"toggleVisibilityResultList.emit(resultList)\"\n                  ></div> -->\n                </lib-expansion-panel-header-actions>\n              </lib-expansion-panel-header>\n    \n              <!-- Content of panel -->\n              <div\n                class=\"project-navigator-layer-node\"\n                *ngFor=\"let result of resultList.results\"\n              >\n                <div\n                  class=\"project-navigator-layer-node-name\"\n                  [class.selected-node]=\"result.isSelected\"\n                  [attr.data-test]=\"'result' + result.id\"\n                  [ngClass]=\"{\n                    visible: result.isVisible\n                  }\"\n                  [title]=\"getTitle(result)\"\n                  (click)=\"clickedResult.emit(result)\"\n                  (keypress)=\"clickedResult.emit(result)\"                  \n                  (dblclick)=\"doubleClickedResult.emit(result)\"\n                  (mouseenter)=\"mouseEnteredResult.emit(result)\"\n                  (mouseleave)=\"mouseLeftResult.emit(result)\"\n                >\n                  {{ result.name }}\n                </div>\n    \n                <!-- toggle buttons should be removed for now see ALBP-24057 -->\n                <!-- <div\n                  [attr.data-test]=\"'toggle_visibility_result_' + result.id\"\n                  class=\"ui-icon-checkbox-slider project-navigator-action-buttons\"\n                  [ngClass]=\"{\n                    visible: result.isVisible,\n                    invisible: !result.isVisible\n                  }\"\n                  [title]=\"'_Toggle visibility' | translate\"\n                  (click)=\"toggleVisibilityResult.emit(result)\"\n                ></div> -->\n              </div>\n            </lib-expansion-panel>\n          </div>\n        </lib-expansion-panel>\n      </div>\n    </lib-bimplus-scrollable-container>\n\n  } @else {\n    <lib-bimplus-text-message\n      class=\"error-message\"\n      *ngIf=\"errorMessage\"\n      [message]=\"errorMessage\"\n    >\n    </lib-bimplus-text-message>\n  }\n\n  <lib-bimplus-buttons-row\n    [items]=\"buttonRowItems\"\n    (buttonClicked)=\"buttonClicked($event)\"\n  >\n  </lib-bimplus-buttons-row>\n</div>\n","// Define the type of the window.BimPlus object\nexport interface BimPlusObject {\n    [key: string]: (dataDetail: { detail: unknown }) => void;\n}\nexport interface Source {\n  [key: string]: { emit: (arg0: unknown) => void; };\n}\n\n\n/**--------------------------------------------------------------------------\n* fire event from component in two ways : \n  - fire custom event from component in standard recommended way via. this.eventName.emit function\n  \n  - call window.BimPlus.eventName function directly on window object (eventName is name\n    of the event we want to fire e.g. bimplusNavbarClicked so it will be window.BimPlus.bimplusNavbarClicked).\n    Function must be defined in app. where we are using our components.\n    This was implemented because MS Edge browser has problems with custom events and in some \n    situations(e.g. after file download) it stops handling custom events.\n    Disadvantage is that we can have only one event handler which is shared between the multiple components.\n--------------------------------------------------------------------------*/\nexport function fireEvent(source: unknown, eventName: string, data: unknown = null){\n    if ( !eventName ) {\n        console.error(\"ERROR: Missing event name in fireEvent function in Bimplus components!\");\n        return;\n    }\n    // Check if eventName exists on window.BimPlus and if it's a function\n    const bimPlus = ('BimPlus' in window) && typeof window.BimPlus === 'object' && (window.BimPlus as BimPlusObject);\n    if (bimPlus && typeof bimPlus[eventName] === 'function') {\n       bimPlus[eventName]({detail: data});\n    }\n\n    const _source = (source as Source);\n    if (eventName in _source) {\n        _source[eventName].emit(data);\n    }\n}","import { CommonModule } from '@angular/common';\nimport { Component, ViewEncapsulation, Output, EventEmitter } from '@angular/core';\nimport {TranslateService, TranslateModule} from '@ngx-translate/core';\nimport {BimplusLocalizedWidgetComponent} from \"./../bimplus-localized-widget/bimplus-localized-widget.component\"\nimport { fireEvent } from '../../utils/utils';\n\n@Component({\n  selector: 'lib-bimplus-contact',\n  imports: [CommonModule, TranslateModule],\n  providers: [TranslateService],\n  templateUrl: './bimplus-contact.component.html',\n  styleUrl: './bimplus-contact.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusContactComponent extends BimplusLocalizedWidgetComponent{\n  constructor(translateService: TranslateService){\n    super(translateService)\n  }\n  @Output() bimplusContactClicked = new EventEmitter<string>();\n\n  _contactClicked(){\n    fireEvent(this, \"bimplusContactClicked\", \"contact\");\n  }\n}\n","<a href=\"https://www.allplan.com/info/contact\" \n    class=\"bimplus-contact-link\"\n    rel=\"noopener\"\n    target=\"_blank\"\n    (click)=\"_contactClicked()\"\n    [title]=\"'_BimplusContactTitle' | translate\"\n>\n    <div class=\"bimplus-contact\"></div>\n</a>","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class ResizeObserverService {\n\n  private rectSize$: BehaviorSubject<DOMRect |undefined > = new BehaviorSubject<DOMRect|undefined>(undefined);\n  private internalRectSize :DOMRect = new DOMRect(1,1,1,1);\n  // Observable that components can subscribe to\n  public parentAppRect$: Observable<DOMRect | undefined> = this.rectSize$.asObservable();\n\n  constructor() { }\n\n  public setSize(newValue: DOMRect): void {\n    this.rectSize$.next(newValue);  \n    this.internalRectSize = newValue;    \n  }\n\n  public getParentAppRect ():DOMRect{\n    if( this.internalRectSize.width<=1 || this.internalRectSize?.height<=1 ) { // not set up with real data yet\n      const parentView:HTMLElement|null = document.querySelector('.mainView');\n      if(!parentView){\n        return this.internalRectSize;\n      }\n      return parentView.getBoundingClientRect();\n    }\n    return this.internalRectSize;\n  }  \n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class LocalStorageService {\n\n  private storageSubject = new BehaviorSubject<{ key: string, value: unknown } | null>(null);\n\n  constructor() { }\n\n  // Set a string value in localStorage\n  setItem(key: string, value: string): void {\n    try {\n      localStorage.setItem(key, value);\n      this.storageSubject.next({ key, value });\n    } catch (e) {\n      console.error('Error saving to localStorage', e);\n    }\n  }\n\n  // Get a string value from localStorage\n  getItem(key: string): string | null {\n    try {\n      return localStorage.getItem(key);\n    } catch (e) {\n      console.error('Error reading from localStorage', e);\n      return null;\n    }\n  }\n\n  // Remove an item from localStorage\n  removeItem(key: string): void {\n    try {\n      localStorage.removeItem(key);\n      this.storageSubject.next({ key, value: null });\n    } catch (e) {\n      console.error('Error removing from localStorage', e);\n    }\n  }\n\n  // Clear all items in localStorage\n  clear(): void {\n    try {\n      localStorage.clear();\n      this.storageSubject.next(null);\n    } catch (e) {\n      console.error('Error clearing localStorage', e);\n    }\n  }\n\n  // Set an object in localStorage\n  setObject(key: string, value: unknown): void {\n    this.setItem(key, JSON.stringify(value));\n  }\n\n  // Get an object from localStorage\n  getObject(key: string): unknown {\n    const value = this.getItem(key);\n    return value ? JSON.parse(value) : null;\n  }\n\n  // Watch for changes in localStorage\n  watchStorage(): Observable<{ key: string, value: unknown } | null> {\n    return this.storageSubject.asObservable();\n  }\n}\n","import { ElementRef,Injectable } from '@angular/core';\nimport { ResizeObserverService } from './resize-observer.service';\nimport { LocalStorageService }   from './local-storage.service';\nimport { BehaviorSubject } from 'rxjs';\n//import { ItemsList } from '@ng-select/ng-select/lib/items-list';\n//import { NotFoundError } from 'rxjs';\n\n\nexport interface LayoutManagerItem {\n  element:ElementRef;\n  id: string;\n  selector?:string;\n  isCollapsed:boolean;\n  rememberPosition?:boolean\n  left?: number;\n  top?:number;\n  width?:number;\n  height?:number;\n}\n\nexport interface LayoutManagerConfigItem {\n  id: string;\n  isCollapsed:boolean;  \n  left?: number;\n  top?:number;  \n  width?:number;\n  height?:number;\n}\n\n\ninterface LayoutManagerConfig {\n  [key:string]: LayoutManagerConfigItem\n}\n@Injectable({\n  providedIn: 'root'\n})\nexport class LayoutManagerService {\n\n  registeredItems$: BehaviorSubject<LayoutManagerItem[]> = new BehaviorSubject<LayoutManagerItem[]>([])\n  constructor(private resizeObserverService:ResizeObserverService,\n              private localStorageService :LocalStorageService \n  ) { }\n  private registeredItems:LayoutManagerItem[] = [];\n  \n  get RegisteredItems(): LayoutManagerItem[] {\n    return this.registeredItems;\n  }\n  CONFIG:string = 'layoutManagerConfig';\n\n  \n/**--------------------------------------------------------------------------\n  * register object. object must have unique id or elementId\n  --------------------------------------------------------------------------*/\n  registerObject(obj:ElementRef, id:string, selector:string | undefined, rememberPosition:boolean,left:number = 100, top:number = 100,width:number = 0, height:number = 0) {\n    let foundIndex = -1;\n    if(this.registeredItems.some((item,index) => {\n        const retval = item.id === id;\n        if(retval){\n          foundIndex = index;\n        }\n        return retval;\n      })){\n      if(foundIndex >= 0){\n        this.registeredItems.splice(foundIndex,1);\n      }      \n    }\n    const newItem: LayoutManagerItem = { \n      element:obj,\n      id:id,\n      selector:selector,\n      rememberPosition:!!rememberPosition,\n      left:left,\n      top:top,\n      width:width,\n      height:height,\n      isCollapsed: false    \n     };\n\n    this.registeredItems.push(newItem);\n    this.registeredItems$.next(this.registeredItems);\n    this._initObject(newItem);\n  }\n  \n  _initObject(obj:LayoutManagerItem){\n    this._adjustObjectByConfig(obj);\n    this._adjustObjectByWindowSize(obj);\n    \n  }\n  /**--------------------------------------------------------------------------\n  * get object configuration\n  * return {left, top, width, heigth}\n  --------------------------------------------------------------------------*/\n  _getObjectConfig(obj:LayoutManagerItem):LayoutManagerConfigItem|null {\n    if(!obj){\n      return null;\n    }\n    const configValue = this.localStorageService.getItem(this.CONFIG);\n    const  config = configValue ? JSON.parse(configValue) : {};\n    const  objId = obj.id ;\n    let configObj = config[objId];\n    if(!configObj) {\n      configObj = {id:objId,left:obj.left,top:obj.top,width:obj.width,height:obj.height};        \n    }\n    return configObj;\n  }\n\n  _adjustObjectByConfig(obj:LayoutManagerItem){\n    const config:LayoutManagerConfigItem|null = this._getObjectConfig(obj);\n    if(!config){\n      return;      \n    }\n    const  parentElement = this._getDomParentElement(obj);\n    const  internalElement = this._getDomInternalElement(obj,'');\n    if(!parentElement || !internalElement){\n      return;\n    }\n    parentElement.style.left = (config.left) + 'px';\n    parentElement.style.top = (config.top) + 'px';\n    if(config.width && config.width > 0){\n      internalElement.style.width = config.width + 'px';\n    }\n    if(config.height && config.height > 0){\n      internalElement.style.height = config.height + 'px';\n    }\n    \n    this.checkPosition(obj.id,\"\",undefined,0,0,true);    \n  }\n\n  _adjustObjectByWindowSize(obj:LayoutManagerItem){\n    this.checkPosition(obj.id,\"\",undefined,0,0,true);  \n  }\n  \n  /**--------------------------------------------------------------------------\n  * returns object  registered in the layout manager \n  --------------------------------------------------------------------------*/\n  getItem(id: string ):LayoutManagerItem|null {   \n    let foundItem:LayoutManagerItem|null = null;\n    this.registeredItems.forEach(item =>{\n      if(item.id === id){\n        foundItem = item;\n      }\n    });\n    return foundItem;\n  }\n\n  /**--------------------------------------------------------------------------\n  * set object configuration\n  --------------------------------------------------------------------------*/\n  _setObjectConfig(obj:LayoutManagerItem, left:number,top:number,width:number,height:number) {\n    const objId = obj?.id ;\n    if (!objId) {\n      return;\n    }\n    let config = this.localStorageService.getObject(this.CONFIG) as LayoutManagerConfig;\n    //let config = configValue && JSON.parse(configValue) as LayoutManagerConfig;\n    if (!config) {\n      config = {};\n    }\n    if(obj?.isCollapsed){  // do not overtake collapsed size\n      if (!config[objId]) {        \n        config[objId] = obj;\n      }\n      config[objId].left = left;\n      config[objId].top  = top;\n      //config[objId].width = width;\n      //config[objId].height = height ;\n      this.localStorageService.setObject(this.CONFIG, config);\n      return;\n    }\n\n    const newItem :LayoutManagerConfigItem = {\n      id: objId,\n      isCollapsed: false,\n      left: left,\n      top: top,\n      width: width,\n      height: height\n    };\n    config[objId] = newItem;\n    this.localStorageService.setObject(this.CONFIG,config);\n  }\n  \n  getDomParentElement(id:string ):HTMLElement|null {\n    const item:LayoutManagerItem|null = this.getItem(id);\n    if(item){\n      return this._getDomParentElement(item);\n    }\n    return null;\n  }\n\n  _getDomParentElement(item:LayoutManagerItem ):HTMLElement|null {\n    let element:HTMLElement;\n    if(item.element?.nativeElement?.shadowRoot){\n      element = item.element?.nativeElement?.shadowRoot.querySelector(item.selector);\n    } else {\n      element = item.element?.nativeElement; \n    }\n    if(!element){\n      console.error('_getDomParentElement: missing element');\n      return null;\n    }\n    return element;    \n  }\n\n  _getDomInternalElement(item:LayoutManagerItem,selector:string | undefined ):HTMLElement|null {\n    const element:HTMLElement = item.element?.nativeElement?.shadowRoot || item.element?.nativeElement;    \n    if(!element){\n      console.error('_getDomInternalElement: missing element');\n      return null;\n    }\n    const mySelector =selector && selector?.length > 0 ?selector:item.selector;   \n    const retval: HTMLElement|null= mySelector?element.querySelector(mySelector):element;\n    if(!retval){\n      console.error(`_getDomInternalElement: selection of element ${element}  failed with selector ${mySelector}`);\n    }\n    return retval;\n  }\n\n\n  _getElementRect(item:LayoutManagerItem,selector:string | undefined ,parentRectangle:DOMRect |undefined ):DOMRect | null{\n    const selectedObj : HTMLElement|null = this._getDomInternalElement(item,selector);\n    if(!selectedObj){\n      console.error('_getElementRect: missing selected object');\n      return null;\n    }\n\n    const parentRect:DOMRect =  parentRectangle ||  this.resizeObserverService.getParentAppRect();\n    if( !parentRect ||  parentRect?.width<=1 || parentRect?.height<=1 ) {\n      console.log('_getElementRect: missing parent rect');\n    }\n    const  elementRect:DOMRect|null = selectedObj.getBoundingClientRect();\n    if(!elementRect){\n      console.error('_getElementRect: missing bounding rect');\n    }\n    return elementRect;\n  }\n\n  // checks whether element or element with additional selection of subelement is placed within the give rectangle\n  // if not then calculates the offset to be moved to fit in\n  checkPosition(id:string,selector:string,parentRectangle:DOMRect|undefined ,deltaX:number,deltaY:number,forceCheck:boolean = false){\n    if(!id){\n      return {deltaX:0,deltaY:0};\n    }\n    const e1 = this.getItem(id);\n    if(!e1){\n      return {deltaX:0,deltaY:0};\n    }\n    const parentRect:DOMRect =  parentRectangle ||  this.resizeObserverService.getParentAppRect();\n    const elementRect:DOMRect | null = this._getElementRect(e1,selector,parentRect);\n    if(!elementRect){\n      console.error('checkPosition: missing elementRect');\n      return {deltaX:0,deltaY:0};\n    }\n    \n    if(!elementRect?.width || !elementRect?.height){\n      console.error('checkPosition:element rect empty ');\n      return {deltaX:0,deltaY:0};\n    } \n    \n    let checkAll = true;\n    if(parentRect?.width < 2  || parentRect?.height < 2){  // empty parent rect , (after init before first usefull info) nothing to check       \n      checkAll = false;      \n    } \n    if(checkAll){\n      let checkBoundaries = true;\n      if(this._isInsideRect(elementRect, parentRect) === false && !forceCheck) {\n        checkBoundaries = false;\n      }\n  \n      // copy of real element rectangle to perform calculation over before set to the real element\n      const elementDOMRect = DOMRect.fromRect(elementRect);\n\n      //set the element rectangle by deltas\n      this._translateRectangle(elementDOMRect, deltaX, deltaY);\n\n      if(checkBoundaries) {\n        if(this._isInsideRect(elementDOMRect, parentRect) === false) {\n          const  newElementPos = this.getAlignedPosition(elementDOMRect, parentRect);\n          deltaX = newElementPos.x - elementRect.x;\n          deltaY = newElementPos.y - elementRect.y;\n          this._translateRectangle(elementDOMRect, deltaX, deltaY);\n        }\n      } else {\n        if (this._isInsideLeftTopRect(parentRect, elementDOMRect) === false) {\n          const newElementPos = this._getAlignedLeftTopPosition(elementDOMRect, parentRect);\n          deltaX = newElementPos.x - elementRect.x;\n          deltaY = newElementPos.y - elementRect.y;\n          this._translateRectangle(elementDOMRect, deltaX, deltaY);\n        }\n      }\n    }\n\n    const selectedElement = this._getDomParentElement(e1);\n    if(!selectedElement){\n      return;\n    }\n    const computedStyle = window.getComputedStyle(selectedElement);\n    const top = parseInt(computedStyle.top, 10);\n    const left = parseInt(computedStyle.left, 10);\n    selectedElement.style.top = (top + deltaY) + 'px';\n    selectedElement.style.left = (left + deltaX) + 'px';\n    return {deltaX,deltaY};\n  }\n  /**--------------------------------------------------------------------------\n  * find if rectangle 1 is inside rectangle 2\n  --------------------------------------------------------------------------*/\n  _isInsideRect(r1:DOMRect, r2:DOMRect) {\n    if(!r1 || !r2) {\n      return false;\n    }\n    return  r2.left <= r1.left  && r2.top <= r1.top && r2.right >= r1.right && r2.bottom >= r1.bottom;\n  }\n\n  /**--------------------------------------------------------------------------\n  * find if rectangles do not overlap the left and top sides\n  --------------------------------------------------------------------------*/\n  _isInsideLeftTopRect(r1:DOMRect, r2:DOMRect) {\n    if(!r1 || !r2) {\n      return false;\n    }\n    const  r1Inside = r2.left <= r1.left  && r2.top <= r1.top;\n    const  r2Inside = r1.left <= r2.left  && r1.top <= r2.top;\n    return r1Inside || r2Inside;\n  }\n\n  /**--------------------------------------------------------------------------\n  * get position of r1 aligned with the r2 sides\n  --------------------------------------------------------------------------*/\n  getAlignedPosition(r1:DOMRect, r2:DOMRect) {\n    if(!r1 || !r2) {\n      return {x:0,y:0};\n    }\n    const to = { x: r1.x, y: r1.y };\n    //align left or right sides. preferably left\n    if(r1.left < r2.left) {\n      to.x = r2.x;\n    } else if(r1.right > r2.right) {\n      to.x = r2.right - r1.width;\n    }\n    //align top or bottom. preferably top\n    if(r1.top < r2.top) {\n      to.y = r2.y;\n    } else if(r1.bottom > r2.bottom) {\n      to.y = r2.bottom - r1.height;\n    }\n    return to;\n  }\n  \n  /**--------------------------------------------------------------------------\n  * get position of r1 aligned with the r2 left, top sides\n  --------------------------------------------------------------------------*/\n  _getAlignedLeftTopPosition(r1:DOMRect, r2:DOMRect) {\n    if(!r1 || !r2) {\n      return  {x:0,y:0};\n    }\n\n    const  to = { x: r1.x, y: r1.y };\n    //align left\n    if(r1.left < r2.left) {\n      to.x = r2.x;\n    }\n    //align top\n    if(r1.top < r2.top) {\n      to.y = r2.y;\n    }\n    return to;\n  }\n\n   /**--------------------------------------------------------------------------\n  * translate rectangle by x, y\n  --------------------------------------------------------------------------*/\n  _translateRectangle(rect:DOMRect, translateX:number, translateY:number) {\n    if(!rect) {\n      return;\n    }\n    rect.x += translateX;\n    rect.y += translateY;\n    return rect;\n  }\n  \n  updateCollapsed(value:boolean, id:string = ''):void{    \n    const  foundItem = this.getItem(id);\n    if(!foundItem){\n      return;\n    }\n    foundItem.isCollapsed = value;\n    this.registeredItems$.next(this.registeredItems);\n    setTimeout(()=>{      \n      this.checkPosition(foundItem.id,\"\",undefined,0,0,true);      \n    });\n }  \n\n\n  handleDragEnd(id:string){//},left:number,top:number){\n    this.finalizeObjectChanges(id);\n  }\n\n  /**--------------------------------------------------------------------------\n  * finalize object changes (position). object must be registered in the layout manager\n  * object: object to finalize  \n  --------------------------------------------------------------------------*/\n  finalizeObjectChanges(id:string):void {\n    const item:LayoutManagerItem|null  = this.getItem(id);\n    if(!item){\n      return;\n    }\n    const element = this._getDomParentElement(item);\n    if(!element){\n      return;\n    }\n    const computedStyle = window.getComputedStyle(element);  \n    const top = parseInt(computedStyle.top, 10);\n    const left = parseInt(computedStyle.left, 10);\n    \n    const elementRect = this._getElementRect(item,undefined,undefined);\n    this._setObjectConfig(item,left,top,\n                          elementRect && elementRect.width > 0 ? elementRect.width:0 ,\n                          elementRect && elementRect.height > 0 ? elementRect.height:0);\n  }\n}\n\n","//import { Directive, ElementRef , HostListener, Output, EventEmitter } from '@angular/core';\nimport { Directive, ElementRef , Output, EventEmitter , OnInit, OnDestroy} from '@angular/core';\nimport { LayoutManagerService } from '../services/layout-manager.service';\nimport { ResizeObserverService } from '../services/resize-observer.service';\nimport { fireEvent } from '../utils/utils';\n\ninterface ResizerItem {\n  'className' : string ,\n  'resizeStrategy' : string \n}\n\nexport interface ResizableElement extends HTMLElement{\n  resizeStrategy?: string;\n}\n\n@Directive({\n  selector: '[libResizable]',\n  standalone: true\n})\n\nexport class ResizableDirective  implements OnDestroy, OnInit{\n  resizeContactPointX = 0;\n  resizeContactPointY = 0;\n  resizableElements:ResizableElement[] = [];\n  resizeEnabled       = true;\n  resizeStarted       = false;\n  resizeStart     : (event: MouseEvent | TouchEvent) => void;\n  resizeInProgress: (event: MouseEvent | TouchEvent) => void;  \n  boundResizeStart: (event: MouseEvent | TouchEvent) => void;\n  boundResizeInProgress: (event: MouseEvent | TouchEvent) => void;\n  boundResizeEnd: (event: MouseEvent | TouchEvent) => void;\n   \n  _element:HTMLElement; \n  actResizeStrategy   = \"se\";\n  \n\n  @Output()\n  resizedEnd = new EventEmitter<MouseEvent>();\n\n\n  // list of resizers, resizers are specified by class name\n  resizersList:ResizerItem[] =  [ \n    { className : \"resizer-nw\" , resizeStrategy : \"nw\" },\n    { className : \"resizer-n\"  , resizeStrategy: \"n\"   },\n    { className : \"resizer-ne\" , resizeStrategy: \"ne\"  },\n    { className : \"resizer-e\"  , resizeStrategy: \"e\"   },\n    { className : \"resizer-se\" , resizeStrategy: \"se\"  },\n    { className : \"resizer-s\"  , resizeStrategy: \"s\"   },\n    { className : \"resizer-sw\" , resizeStrategy: \"sw\"  },\n    { className : \"resizer-w\"  , resizeStrategy: \"w\"   }\n  ];\n  \n  constructor(private elementRef: ElementRef,\n              private layoutManagerService: LayoutManagerService,\n              private resizeObserverService:ResizeObserverService) {              \n    \n    this._element = elementRef.nativeElement;\n    this.layoutManagerService = layoutManagerService;\n    \n    this.resizeStart =   (event:MouseEvent|TouchEvent) => {\n      //get mouse/finger X Y positions\n      event.stopPropagation();\n      if(this.resizeStarted){\n        return;\n      }\n      this.resizeStarted = true;\n      const touchList = (event as TouchEvent).targetTouches? (event as TouchEvent).targetTouches: [];\n      const clientX = event.type === 'touchstart' ? touchList[0]?.clientX : (event as MouseEvent).clientX;\n      const clientY = event.type === 'touchstart' ? touchList[0]?.clientY : (event as MouseEvent).clientY;\n      this.resizeContactPointX = clientX;\n      this.resizeContactPointY = clientY;\n      this.openDocumentListenersResize();      \n      this.setupResizeStrategy(event);\n    }\n    \n    /**--------------------------------------------------------------------------\n     * calcuates and sets the new position\n    --------------------------------------------------------------------------*/\n    this.resizeInProgress = (event:MouseEvent|TouchEvent) => {\n      event.preventDefault();\n      event.stopPropagation();\n\n      //get mouse/finger X Y positions\n      const touchList = (event as TouchEvent).targetTouches ? (event as TouchEvent).targetTouches: [];\n      const clientX = event.type === 'touchmove' ? touchList[0]?.clientX : (event as MouseEvent).clientX;\n      const clientY = event.type === 'touchmove' ? touchList[0]?.clientY : (event as MouseEvent).clientY;\n      //const clientX =  (event as MouseEvent).clientX;\n      //const clientY =  (event as MouseEvent).clientY;\n\n      const moved = this.resizeFromTo(this._element,this.resizeContactPointX, this.resizeContactPointY,clientX,clientY, this.actResizeStrategy);\n      if(moved) {\n        this.resizeContactPointX = clientX;\n        this.resizeContactPointY = clientY;\n      }\n    }\n    this.boundResizeStart = this.resizeStart.bind(this);\n    this.boundResizeInProgress = this.resizeInProgress.bind(this);\n    this.boundResizeEnd = this.resizeEnd.bind(this);\n    this.resizeInProgress.bind(this);\n    this.setResizers(this._element);        \n  }\n  ngOnInit(): void {\n    this.boundResizeStart = this.resizeStart.bind(this);\n    this.boundResizeInProgress = this.resizeInProgress.bind(this);\n    this.boundResizeEnd = this.resizeEnd.bind(this);\n  }\n\n  ngOnDestroy(): void {\n    this.closeAllListenersResize();    \n  }\n\n  resizeEnd(){   \n    //this.closeDocumentListenersResize();\n    if(!this.resizeStarted){\n      return;\n    }     \n    this.resizeStarted = false;\n    this.closeAllListenersResize(); \n    this.openElementListenersResize();\n    fireEvent(this, \"resizedEnd\", ['$event']);    \n  }\n  \n  // Unused function at the moment\n  // _getViewRect() {\n  //   const view = document.getElementById('#containerView');  // we should get here the parent object selector as input parameter\n  //   if(view){\n  //     return view.getBoundingClientRect();\n  //   }\n  //   return new DOMRect(0,0,0,0);\n  // }\n\n/**--------------------------------------------------------------------------\n  * find if rectangle 1 is inside rectangle 2\n  --------------------------------------------------------------------------*/\n  isInsideRect(rect1:DOMRect, rect2:DOMRect) {\n    if(!rect1 || !rect2) {\n      return false;\n    }\n    const rect1Inside:boolean = rect2.left <= rect1.left\n                  && rect2.top <= rect1.top \n                  && rect2.right >= rect1.right \n                  && rect2.bottom >= rect1.bottom;\n\n    return rect1Inside;\n  }\n    /**--------------------------------------------------------------------------\n  * resize rectangle by x, y\n  --------------------------------------------------------------------------*/\n  _resizeRectangle(rect:DOMRect, resizeX:number, resizeY:number, resizeStrategy:string) {\n    if(!rect) {\n      return;\n    }\n\n    if(['nw','w', 'sw'].includes(resizeStrategy)) {\n      rect.x += resizeX;\n      resizeX = resizeX * -1;\n    }\n\n    if(['nw','n', 'ne'].includes(resizeStrategy)) {\n      rect.y += resizeY;\n      resizeY = resizeY * -1;\n    }\n\n    if(typeof(resizeX) === 'number' && !['n','s'].includes(resizeStrategy)) {\n      rect.width += resizeX;\n    }\n\n    if(typeof(resizeY) === 'number' && !['w','e'].includes(resizeStrategy)) {\n      rect.height += resizeY;\n    }\n\n    return rect;\n  }\n\n  _maxHeightReset(obj:HTMLElement, elementRect:DOMRect) {    \n    this.resizeFromTo(obj, elementRect.right, elementRect.bottom, elementRect.left,elementRect.top, \"se\");\n  }\n\n  /*--------------------------------------------------------------------\n  * resize object from {x,y} to {x,y} based on resize strategy\n  --------------------------------------------------------------------------*/\n  resizeFromTo (obj:HTMLElement, fromX:number, fromY:number, toX:number,toY:number, resizeStrategy:string){\n    const posXDelta = toX - fromX;\n    const posYDelta = toY - fromY;\n    const element = obj ?? this._element;\n    const elementRect = element.getBoundingClientRect();\n    //const viewRect = this._getViewRect();\n    const viewRect = this.resizeObserverService.getParentAppRect();\n    \n    let checkBoundaries = true;\n\n    resizeStrategy = resizeStrategy || \"se\";\n\n    //if the object is outside the view rect because it's bigger, do not check boundaries,\n    //allow moving outside the view rect\n    if(this.isInsideRect(elementRect, viewRect) === false) {\n      checkBoundaries = false; \n    }\n\n    this._resizeRectangle(elementRect, posXDelta, posYDelta, resizeStrategy);\n\n    if (checkBoundaries && this.isInsideRect(elementRect, viewRect) === false) {\n        return false;\n    }\n    \n    const computedStyle = window.getComputedStyle(element);\n    let top = parseInt(computedStyle.top, 10);\n    let left = parseInt(computedStyle.left, 10);\n    let width = parseInt(computedStyle.width, 10);\n    let height = parseInt(computedStyle.height, 10);\n    \n    if(['nw','w', 'sw'].includes(resizeStrategy)) {\n       left = left + posXDelta;      \n    }\n\n    if(['nw','n', 'ne'].includes(resizeStrategy)) {\n      top = top  +  posYDelta;      \n    }\n\n    if(!['n','s'].includes(resizeStrategy)) {\n      width = elementRect.width;\n    }\n    \n    if( viewRect.height < elementRect.height ){\n      this._maxHeightReset(element, elementRect);\n    }\n    else if(!['w','e'].includes(resizeStrategy)) {\n      height = elementRect.height;\n    }\n\n    \n    element.style.top    = top   + 'px';\n    element.style.left   = left  + 'px';\n    element.style.width  = width + 'px';\n    element.style.height  = height + 'px';\n\n    return true;\n  }\n/**--------------------------------------------------------------------------\n   * resize start at the layout managaer\n   * open document listeners\n  --------------------------------------------------------------------------*/\n  \n    /**--------------------------------------------------------------------------\n   * set the elements used for resizing\n  --------------------------------------------------------------------------*/\n  setResizers(element:HTMLElement) {\n    const setResizableElements = () => {\n      let resizableElements:ResizableElement[] = [];\n      // get dom elements of all resizers\n      this.resizersList.forEach( item => {\n        const resizeElems =  element.getElementsByClassName(item.className);\n        if( resizeElems?.length ) {\n          // set resize strategy in each element so we know in which direction to resize\n          const decoratedResizeElems: ResizableElement[] = Array.from(resizeElems).map( elem => {\n            const resizableElem = elem as ResizableElement;\n            resizableElem.resizeStrategy = item.resizeStrategy;\n            return resizableElem;\n          });\n\n          // add it to list of all resizers\n          resizableElements = [...resizableElements, ...decoratedResizeElems];\n        }\n      });\n\n      this.resizableElements =  [...resizableElements];\n      this.openElementListenersResize();\n    }\n    setTimeout(()=>{\n      setResizableElements();\n    });\n  }\n\n  /**--------------------------------------------------------------------------\n  * open mousedown, touchstart listeners on all elements allowed for resizing\n  --------------------------------------------------------------------------*/\n  openElementListenersResize() {\n    this.resizableElements.forEach(element => {\n      element.addEventListener('mousedown', this.boundResizeStart);\n      element.addEventListener('touchstart', this.boundResizeStart);\n    });\n  }\n /**--------------------------------------------------------------------------\n   * open mouseup, touchend and mousemove, touchmove on document\n  --------------------------------------------------------------------------*/\n  openDocumentListenersResize() {\n    document.addEventListener('mouseup', this.boundResizeEnd);\n    document.addEventListener('touchend', this.boundResizeEnd);\n    document.addEventListener('mousemove', this.boundResizeInProgress);\n    document.addEventListener('touchmove', this.boundResizeInProgress);    \n  }\n \n  /**--------------------------------------------------------------------------\n  * close mouseup, touchend and mousemove, touchmove on document\n  --------------------------------------------------------------------------*/\n  closeDocumentListenersResize() {\n    document.removeEventListener('mousemove', this.boundResizeInProgress);\n    document.removeEventListener('touchmove', this.boundResizeInProgress);\n    document.removeEventListener('mouseup', this.boundResizeEnd);\n    document.removeEventListener('touchend', this.boundResizeEnd);\n  }\n\n/**--------------------------------------------------------------------------\n  * close mousedown, touchstart listeners on all elements allowed for resizing\n  --------------------------------------------------------------------------*/\n  closeElementListenersResize() {\n    this.resizableElements.forEach(element => {\n      element.removeEventListener('mousedown', this.boundResizeStart);\n      element.removeEventListener('touchstart', this.boundResizeStart);\n      element.removeEventListener('mousemove', this.boundResizeInProgress);\n      element.removeEventListener('touchmove', this.boundResizeInProgress);      \n      element.removeEventListener('mouseup', this.boundResizeEnd);\n      element.removeEventListener('touchend', this.boundResizeEnd);\n    });\n  }\n\n  /**--------------------------------------------------------------------------\n  * close all listeners\n  --------------------------------------------------------------------------*/\n  closeAllListenersResize() {\n    this.closeElementListenersResize();\n    this.closeDocumentListenersResize();\n  }\n\n /**--------------------------------------------------------------------------\n   * setup actual resize strategy\n  --------------------------------------------------------------------------*/\n  setupResizeStrategy(event: MouseEvent | TouchEvent) {\n    if( !event ) {\n      return;\n    }\n\n    // find on which element resize started so we know in which direction to resize\n    let resizeStrategy:string = \"se\";\n    const  resizeSourceElem = event?.target;\n\n    if( resizeSourceElem ) {\n      const  foundElem = this.resizableElements.find( item => item === resizeSourceElem );\n      if (foundElem?.resizeStrategy) {\n        resizeStrategy = foundElem?.resizeStrategy;\n      }\n    }\n\n    this.actResizeStrategy =  resizeStrategy;\n  }\n}\n","//import { Component, HostBinding, Input,Output,EventEmitter, ElementRef, AfterViewChecked,ChangeDetectorRef, OnInit, OnDestroy } from '@angular/core';\n//import { Component, Input,Output,EventEmitter, ElementRef, AfterViewChecked,ChangeDetectorRef, OnInit, OnDestroy, ChangeDetectionStrategy } from '@angular/core';\nimport { Component, Input, ElementRef, AfterViewChecked,ChangeDetectorRef, OnInit, OnDestroy,AfterViewInit} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Subscription } from 'rxjs';\nimport { BimplusLocalizedWidgetComponent } from \"./../bimplus-localized-widget/bimplus-localized-widget.component\"\nimport { ResizableDirective } from '../../directives/resizable.directive'\nimport { LayoutManagerItem, LayoutManagerService } from '../../services/layout-manager.service';\nimport { ResizeObserverService } from '../../services/resize-observer.service';\n\n@Component({\n  selector: 'lib-bimplus-floating-bar',\n  imports: [\n    CommonModule,\n    ResizableDirective\n  ],\n  templateUrl: './bimplus-floating-bar.component.html',\n  styleUrl: './bimplus-floating-bar.component.less'\n})\n\nexport class BimplusFloatingBarComponent extends BimplusLocalizedWidgetComponent  implements OnInit, OnDestroy, AfterViewChecked,AfterViewInit\n{\n  constructor(translateService: TranslateService,\n              private layoutManagerService: LayoutManagerService,\n              private element: ElementRef,\n              private cdr: ChangeDetectorRef,\n              private resizeObserverService:ResizeObserverService\n  ) { \n    super(translateService);\n  }\n\n  @Input() noBody: boolean = false;\n  \n  @Input() isFocused: boolean = false;\n\n  @Input() resizeEnabled: boolean = false;\n  @Input() autoCollapse: boolean = false;\n  @Input() focusSelector: string = '';\n  @Input() isVisible = false;  \n  @Input() id: string  = '';\n  \n  private subscription: Subscription | null = null;  // Initialize to null\n  private hasViewChecked: boolean = false;\n  \n  //@Input() isCollapsed: boolean = false;\n  isCollapsed: boolean = false;\n\n  get canNotResize(): boolean {\n    return !(this.resizeEnabled && !this.isCollapsed);\n  }\n\n  ngOnInit():void{\n    \n    this.layoutManagerService.registeredItems$.subscribe((items: LayoutManagerItem[]) => {\n      const layoutManagerItem = items.find((item: LayoutManagerItem) => item.id === this.id);  \n      this.isCollapsed = !!(layoutManagerItem?.isCollapsed);      \n    }) \n   \n  }\n  ngOnDestroy(): void {\n    // Unsubscribe to avoid memory leaks\n    if (this.subscription) {\n      this.subscription.unsubscribe();\n    }\n  }\n\n  ngAfterViewInit(){\n   // if the component wants to be registered in layout manager system\n   // Subscribe to the observable\n    this.subscription = this.resizeObserverService.parentAppRect$.subscribe(value => {\n      this.handleParentAppRectSizeChange(value);\n    });\n  }\n\n  ngAfterViewChecked() {\n    if (!this.hasViewChecked && !this.isCollapsed) {\n      this.hasViewChecked = true; // Set the flag to prevent repeated execution\n      //this.cdr.detectChanges(); // Trigger change detection    \n      setTimeout(()=>{\n        this.layoutManagerService.checkPosition(this.id,\"\",undefined,0,0,true);\n      });\n    }\n  }\n\n  handleParentAppRectSizeChange(parentRect:DOMRect | undefined):void{    \n    this.layoutManagerService.checkPosition(this.id,'.floating-panel.visible',parentRect,0,0,true);    \n  }\n  \n  onResizedEnd(){\n    this.layoutManagerService.finalizeObjectChanges(this.id);\n  }\n\n  onDragEnd(){\n    this.layoutManagerService.handleDragEnd(this.id);\n  }\n}\n\n","<div\n  class=\"floating-panel\"\n  [class.visible]=\"isVisible\"\n  [class.no-body]=\"noBody\"\n  [class.is-focused]=\"isFocused\"\n  [class.collapsed]=\"isCollapsed\"    \n  libResizable\n  (resizedEnd)=\"onResizedEnd()\"\n  (dragEnd)=\"onDragEnd()\"\n>\n  <ng-content select=\".floating-bar-header-logo\"></ng-content>\n  <ng-content select=\".floating-bar-header-content\"></ng-content>\n  <ng-content select=\".floating-bar-dragger\"></ng-content>\n  <ng-content select=\".floating-bar-body\"></ng-content>\n  <div \n  class=\"resizer-ne floating-panel__resizerNE\"\n  [class.resize-disabled]=\"canNotResize\">\n</div>\n<div \n  class=\"resizer-e floating-panel__resizerE\"\n  [class.resize-disabled]=\"canNotResize\">\n</div>\n<div \n  class=\"resizer-se floating-panel__resizerSE\"\n  [class.resize-disabled]=\"canNotResize\">\n</div>\n<div \n  class=\"resizer-s floating-panel__resizerS\"\n  [class.resize-disabled]=\"canNotResize\">\n</div>\n</div>\n\n","import { Directive, HostListener, Output, EventEmitter } from '@angular/core';\r\nimport { fireEvent } from '../utils/utils';\r\n\r\n@Directive({\r\n  selector: '[libDraggable]',\r\n  standalone: true\r\n})\r\nexport class DraggableDirective {\r\n\r\n  oldX = 0;\r\n  oldY = 0;\r\n  isDragging = false;\r\n  wasDragging = false;\r\n  isMouseDown = false;\r\n\r\n  @Output()\r\n  dragging = new EventEmitter<[number,number]>();\r\n\r\n  @Output()\r\n  dragEnd = new EventEmitter<MouseEvent>();\r\n\r\n  @Output()\r\n  clicked = new EventEmitter<MouseEvent>();\r\n\r\n  @HostListener('document:mousemove', ['$event'])\r\n  onMouseMove(event: MouseEvent) {\r\n    if (!this.isDragging && !this.isMouseDown) {\r\n        return;\r\n    }\r\n\r\n    const deltaX = (event.clientX - this.oldX);\r\n    const deltaY = (event.clientY - this.oldY);\r\n\r\n    if(!this.isDragging){\r\n      if(Math.abs(deltaX) > 2 || Math.abs(deltaY) > 2){\r\n        this.isDragging = true;\r\n        this.wasDragging = true;\r\n      }else{\r\n        return;\r\n      }\r\n    }\r\n    fireEvent(this, \"dragging\", [deltaX,deltaY]);\r\n\r\n    this.oldX = event.clientX;\r\n    this.oldY = event.clientY;\r\n  }\r\n\r\n  @HostListener('document:mouseup', ['$event'])\r\n  onMouseUp() {\r\n    if(this.isDragging || this.isMouseDown){\r\n      fireEvent(this, \"dragEnd\", ['$event']);\r\n    }\r\n    this.isDragging = false;\r\n    this.isMouseDown = false;    \r\n  }\r\n\r\n  @HostListener('mousedown', ['$event'])\r\n  onMouseDown(event: MouseEvent) {\r\n    this.isMouseDown = true;\r\n    this.wasDragging = false;\r\n    this.oldX = event.clientX;\r\n    this.oldY = event.clientY;    \r\n  }\r\n\r\n  @HostListener('click', ['$event'])\r\n  onMouseClick(event: MouseEvent) {\r\n    if(!this.wasDragging){\r\n      fireEvent(this, \"clicked\", event);\r\n    }\r\n  }\r\n\r\n}\r\n","import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\nimport { DraggableDirective } from '../../directives/draggable.directive';\nimport { LayoutManagerService } from '../../services/layout-manager.service';\n@Component({\n  selector: 'lib-bimplus-floating-bar-dragger',\n  imports: [\n    CommonModule,\n    DraggableDirective,\n  ],\n  templateUrl: './bimplus-floating-bar-dragger.component.html',\n  styleUrl: './bimplus-floating-bar-dragger.component.less'\n})\nexport class BimplusFloatingBarDraggerComponent {\n  constructor ( private layoutManagerService: LayoutManagerService){\n  }\n  // Define isCollapsed as a boolean property\n  @Input() isCollapsed: boolean = false;\n  @Input() parentId:string = '';\n  \n  // Define icon as a string property with a default value\n  draggerIcon: string = 'ui-icon-drag';\n  \n  \n  onDragEnd(){\n    this.layoutManagerService.handleDragEnd(this.parentId);\n  }\n  \n  dragBaseElement(event: [number, number]): void {\n    const deltaX1 = event[0];\n    const deltaY1 = event[1];        \n    this.layoutManagerService.checkPosition(this.parentId,\"\",undefined,deltaX1,deltaY1)        \n  }\n}\n","<div\n  class=\"floating-panel__dragger dragger\"\n  [ngClass] = \"isCollapsed ? 'collapsed' : ''\"\n  [className]=\"draggerIcon\"\n  libDraggable  \n  (dragEnd)=\"onDragEnd()\"\n  (dragging)=\"dragBaseElement($event)\"\n>\n</div>\n\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, input, Input, Output } from '@angular/core';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\n\nimport { BimplusLocalizedWidgetComponent } from \"./../bimplus-localized-widget/bimplus-localized-widget.component\"\nimport { FloatingBarItem } from '../bimplus-floating-bar/bimplus-floating-bar.interface';\nimport { DraggableDirective } from '../../directives/draggable.directive';\nimport { LayoutManagerService, LayoutManagerItem } from '../../services/layout-manager.service';\n\n@Component({\n  selector: 'lib-bimplus-floating-bar-header-content',\n  imports: [\n    CommonModule,\n    DraggableDirective,\n    TranslateModule,\n  ],\n  providers: [\n    TranslateService\n  ],\n  templateUrl: './bimplus-floating-bar-header-content.component.html',\n  styleUrl: './bimplus-floating-bar-header-content.component.less'\n})\nexport class BimplusFloatingBarHeaderContentComponent extends BimplusLocalizedWidgetComponent {\n  constructor(\n    translateService: TranslateService, \n    private readonly layoutManagerService:LayoutManagerService) {\n    super(translateService)\n    \n    this.layoutManagerService.registeredItems$.subscribe((items: LayoutManagerItem[]) => {\n      const layoutManagerItem = items.find((item: LayoutManagerItem) => item.id === this.parentId);  \n      this.isCollapsed = !!(layoutManagerItem?.isCollapsed);      \n    }) \n  }\n\n  @Input() isCollapsed: boolean = false;\n  @Input() parentId:string = '';\n  @Output() actionClicked = new EventEmitter<string>();\n  items = input<FloatingBarItem[]>([]);\n\n  findItemById(id: string): FloatingBarItem | undefined {\n    return this.items().find(x => x.buttonId === id);\n  }\n\n  onItemClicked(action: string) {\n    const item = this.findItemById(action);\n    if (!item || item?.disabled) {\n      return;\n    }\n    this.actionClicked.emit(action);\n  }\n  onDragEnd(){\n    this.layoutManagerService.handleDragEnd(this.parentId);\n  }\n  \n  dragBaseElement(event: [number, number]): void {\n    const deltaX1 = event[0];\n    const deltaY1 = event[1];        \n    this.layoutManagerService.checkPosition(this.parentId,\"\",undefined,deltaX1,deltaY1)        \n  }\n}\n","<div\n  class=\"floating-panel__header-content dragger\"\n  [ngClass]=\"isCollapsed ? 'hidden' : ''\"\n  libDraggable  \n  (dragEnd)=\"onDragEnd()\"\n  (dragging)=\"dragBaseElement($event)\"\n>\n  <div class=\"menu-content\">\n    <div *ngFor=\"let item of items()\">\n      <div\n        [attr.data-test]=\"'floating_bar_item_' + item.buttonId\"\n        class=\"fp-block-item fp-block-icon-item\"\n        [ngClass]=\"{\n          active: item.active\n        }\"\n        [className]=\"item.iconClass\"\n        [title]=\"item.title | translate\"\n        (click)=\"onItemClicked(item.buttonId)\"\n        (keypress)=\"onItemClicked(item.buttonId)\"        \n      ></div>\n    </div>\n  </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, HostBinding, OnInit } from '@angular/core';\nimport { DraggableDirective } from '../../directives/draggable.directive'\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { BimplusLocalizedWidgetComponent } from '../bimplus-localized-widget/bimplus-localized-widget.component';\nimport { LayoutManagerItem, LayoutManagerService } from '../../services/layout-manager.service';\n\n@Component({\n  selector: 'lib-bimplus-floating-bar-header-logo',\n  imports: [\n    CommonModule,\n    DraggableDirective,\n    TranslateModule,\n  ],\n  providers: [\n    TranslateService\n  ],\n  templateUrl: './bimplus-floating-bar-header-logo.component.html',\n  styleUrl: './bimplus-floating-bar-header-logo.component.less'\n})\nexport class BimplusFloatingBarHeaderLogoComponent  extends BimplusLocalizedWidgetComponent  implements OnInit\n{\n  constructor(translateService: TranslateService,\n    private readonly layoutManagerService: LayoutManagerService\n  ) { \n    super(translateService)\n\n  }\n\n  @Input() icon: string = \"\";\n  @HostBinding('class.isCollapsed')\n  @Input() isCollapsed: boolean = false;\n  @Input() parentId: string = '';\n\n  @Input() title: string = \"\";\n\n  ngOnInit(){\n    this.layoutManagerService.registeredItems$.subscribe((items: LayoutManagerItem[]) => {\n      const layoutManagerItem = items.find((item: LayoutManagerItem) => item.id === this.parentId);  \n      this.isCollapsed = !!(layoutManagerItem?.isCollapsed);      \n    })\n  }\n\n  onLogoClicked(){\n    this.layoutManagerService.updateCollapsed(!this.isCollapsed,this.parentId)\n  }\n  \n  onDragEnd(){\n    this.layoutManagerService.handleDragEnd(this.parentId);\n  }\n  \n  dragBaseElement(event: [number, number]): void {\n    const deltaX1 = event[0];\n    const deltaY1 = event[1];        \n    this.layoutManagerService.checkPosition(this.parentId,\"\",undefined,deltaX1,deltaY1)        \n  }\n}\n","<div\n  class=\"floating-panel__header-logo\"\n  [ngClass]=\"isCollapsed ? 'collapsed' : ''\"\n  [className]=\"icon\"\n  [title]=\"title | translate\"\n  libDraggable\n  (clicked)=\"onLogoClicked()\"  \n  (dragEnd)=\"onDragEnd()\"\n  (dragging)=\"dragBaseElement($event)\"\n></div>\n","import { Component, EventEmitter, Input, Output, ViewEncapsulation,ElementRef, AfterViewInit, model } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\nimport { BimplusLocalizedWidgetComponent } from \"./../bimplus-localized-widget/bimplus-localized-widget.component\"\nimport { BimplusFloatingBarComponent } from '../bimplus-floating-bar/bimplus-floating-bar.component';\nimport { BimplusFloatingBarDraggerComponent } from '../bimplus-floating-bar-dragger/bimplus-floating-bar-dragger.component';\nimport { BimplusFloatingBarHeaderContentComponent } from '../bimplus-floating-bar-header-content/bimplus-floating-bar-header-content.component';\nimport { BimplusFloatingBarHeaderLogoComponent } from '../bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component';\nimport { FloatingBarItem } from '../bimplus-floating-bar/bimplus-floating-bar.interface';\nimport { LayoutManagerService } from '../../services/layout-manager.service';\n\nconst DEFAULT_POSITION_LEFT = 355;\nconst DEFAULT_POSITION_TOP = 355;\n@Component({\n  selector: 'lib-bimplus-floating-bar-hide-objects',\n  imports: [\n    CommonModule,\n    BimplusFloatingBarComponent,\n    BimplusFloatingBarDraggerComponent,\n    BimplusFloatingBarHeaderContentComponent,\n    BimplusFloatingBarHeaderLogoComponent,\n    TranslateModule,\n  ],\n  providers: [TranslateService],\n  templateUrl: './bimplus-floating-bar-hide-objects.component.html',\n  styleUrl: './bimplus-floating-bar-hide-objects.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusFloatingBarHideObjectsComponent extends BimplusLocalizedWidgetComponent implements AfterViewInit {\n  \n  @Output() actionClicked = new EventEmitter<string>();\n  @Input() noBody: boolean = true;  \n  @Input() isFocused: boolean = true;\n\n  items = model<FloatingBarItem[]>([]);\n\n  protected layoutManagerService: LayoutManagerService;\n\n  componentId = 'hide-menu-fp-id'\n  icon = 'ui-icon-hide-menu';\n  title: string = \"\"; // no tooltip info on Logo icon\n  focusSelectorId: string = 'hide-menu-id';\n\n  constructor(\n    translateService: TranslateService,\n    layoutManagerService: LayoutManagerService,\n    private readonly element: ElementRef\n  ){    \n    super(translateService);\n    this.layoutManagerService = layoutManagerService;\n  }\n  \n  ngAfterViewInit() {\n    // Subscribe to the observable\n    this.layoutManagerService.registerObject(this.element,this.componentId,'.floating-panel.visible',true,DEFAULT_POSITION_LEFT,DEFAULT_POSITION_TOP);    \n  }    \n}\n","<lib-bimplus-floating-bar\n  id=\"hide-menu-fp-id\"\n  [id] = \"componentId\"\n  class=\"hide-menu\"\n  [noBody]=\"noBody\"\n  [isFocused]=\"isFocused\"\n  [resizeEnabled]=\"false\"\n  [focusSelector]=\"focusSelectorId\"\n  [isVisible]=\"true\"\n  [selectedLanguage]=\"selectedLanguage\"\n  [localizedStrings]=\"localizedStrings\"  \n>\n  <lib-bimplus-floating-bar-header-logo\n    class=\"floating-bar-header-logo\"\n    [parentId] = \"componentId\"\n    [icon]=\"icon\"\n    [selectedLanguage]=\"selectedLanguage\"\n    [localizedStrings]=\"localizedStrings\"\n  >\n  </lib-bimplus-floating-bar-header-logo>\n\n  <lib-bimplus-floating-bar-header-content\n    [selectedLanguage]=\"selectedLanguage\"\n    [localizedStrings]=\"localizedStrings\"\n    [parentId] = \"componentId\"\n    class=\"floating-bar-header-content\"\n    [items]=\"items()\"    \n    (actionClicked)=\"actionClicked.emit($event)\"\n  >\n  </lib-bimplus-floating-bar-header-content>\n\n  <lib-bimplus-floating-bar-dragger\n    class=\"floating-bar-dragger\"    \n    [parentId] = \"componentId\"\n  >\n  </lib-bimplus-floating-bar-dragger>\n</lib-bimplus-floating-bar>\n","import { Component, EventEmitter, Input, Output, ViewEncapsulation ,ElementRef, AfterViewChecked, ChangeDetectorRef, AfterViewInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\n\nimport { BimplusLocalizedWidgetComponent } from \"./../bimplus-localized-widget/bimplus-localized-widget.component\"\nimport { BimplusFloatingBarComponent } from '../bimplus-floating-bar/bimplus-floating-bar.component';\nimport { BimplusFloatingBarDraggerComponent } from '../bimplus-floating-bar-dragger/bimplus-floating-bar-dragger.component';\nimport { BimplusFloatingBarHeaderContentComponent } from '../bimplus-floating-bar-header-content/bimplus-floating-bar-header-content.component';\nimport { BimplusFloatingBarHeaderLogoComponent } from '../bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component';\nimport { FloatingBarItem } from '../bimplus-floating-bar/bimplus-floating-bar.interface';\nimport { LayoutManagerService} from '../../services/layout-manager.service';\n\nconst DEFAULT_POSITION_LEFT =355;\nconst DEFAULT_POSITION_TOP = 320;\n\n@Component({\n  selector: 'lib-bimplus-floating-bar-isolation-objects',\n  imports: [\n    CommonModule,\n    BimplusFloatingBarComponent,\n    BimplusFloatingBarDraggerComponent,\n    BimplusFloatingBarHeaderContentComponent,\n    BimplusFloatingBarHeaderLogoComponent,\n    TranslateModule,\n  ],\n  providers: [TranslateService],\n  templateUrl: './bimplus-floating-bar-isolation-objects.component.html',\n  styleUrl: './bimplus-floating-bar-isolation-objects.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\n\nexport class BimplusFloatingBarIsolationObjectsComponent extends BimplusLocalizedWidgetComponent implements AfterViewInit, AfterViewChecked{\n  constructor(translateService: TranslateService, \n              private layoutManagerService: LayoutManagerService,\n              private element: ElementRef,\n              private cdr: ChangeDetectorRef){    \n    super(translateService);    \n    \n  }\n  private hasViewChecked: boolean = false;\n\n  \n  @Output() actionClicked = new EventEmitter<string>();\n\n  @Input() noBody: boolean = true;\n  @Input() isFocused: boolean = true;\n\n  // Items for the header content sub component\n  @Input() items: Array<FloatingBarItem> = [];\n\n  icon = 'ui-icon-isolation-menu';\n  title: string = \"\"; // no tooltip info on Logo icon\n  focusSelectorId: string = 'isolation-menu-id';\n  componentId = 'isolation-menu-fp-id';\n  \n  ngAfterViewInit(){\n    this.layoutManagerService.registerObject(this.element,this.componentId,'.floating-panel.visible',true,DEFAULT_POSITION_LEFT,DEFAULT_POSITION_TOP,);    \n  }\n\n  ngAfterViewChecked() {\n    if (!this.hasViewChecked) {\n      this.hasViewChecked = true; // Set the flag to prevent repeated execution\n      this.cdr.detectChanges(); // Trigger change detection    \n      setTimeout(()=>{\n        this.layoutManagerService.checkPosition(this.componentId,'.floating-panel.visible',undefined,0,0,true);        \n      });\n    }\n  }\n}\n","<lib-bimplus-floating-bar\n  id=\"isolation-menu-fp-id\"\n  [id] = \"componentId\"\n  class=\"isolation-menu\"\n  [noBody]=\"noBody\"\n  [isFocused]=\"isFocused\"\n  [resizeEnabled]=\"false\"\n  [focusSelector]=\"focusSelectorId\"\n  [isVisible]=\"true\"\n  [selectedLanguage]=\"selectedLanguage\"\n  [localizedStrings]=\"localizedStrings\"\n>\n  <lib-bimplus-floating-bar-header-logo\n    class=\"floating-bar-header-logo\"\n    [parentId] = \"componentId\"\n    [icon]=\"icon\"\n    [selectedLanguage]=\"selectedLanguage\"\n    [localizedStrings]=\"localizedStrings\"\n    >\n  </lib-bimplus-floating-bar-header-logo>\n\n  <lib-bimplus-floating-bar-header-content\n    [selectedLanguage]=\"selectedLanguage\"\n    [localizedStrings]=\"localizedStrings\"\n    [parentId] = \"componentId\"    \n    class=\"floating-bar-header-content\"\n    [items]=\"items\"\n    (actionClicked)=\"actionClicked.emit($event)\"\n  >\n  </lib-bimplus-floating-bar-header-content>\n\n  <lib-bimplus-floating-bar-dragger\n    class=\"floating-bar-dragger\"\n    [parentId] = \"componentId\"\n  >\n  </lib-bimplus-floating-bar-dragger>\n</lib-bimplus-floating-bar>\n","import { CommonModule } from '@angular/common';\nimport { Component, Input,OnInit  } from '@angular/core';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\n\nimport { BimplusLocalizedWidgetComponent } from \"./../bimplus-localized-widget/bimplus-localized-widget.component\"\nimport { LayoutManagerItem, LayoutManagerService } from '../../services/layout-manager.service';\n\n@Component({\n  selector: 'lib-bimplus-floating-bar-body',\n  imports: [\n    CommonModule,\n    TranslateModule,\n  ],\n  templateUrl: './bimplus-floating-bar-body.component.html',\n  styleUrl: './bimplus-floating-bar-body.component.less'\n})\nexport class BimplusFloatingBarBodyComponent extends BimplusLocalizedWidgetComponent implements OnInit{\n  constructor(translateService: TranslateService,\n              private layoutManagerService: LayoutManagerService\n  ) {\n    super(translateService)\n  }\n\n  @Input() isCollapsed: boolean = false;\n  @Input() parentId: string = '';\n  \n  ngOnInit(){\n    this.layoutManagerService.registeredItems$.subscribe((items: LayoutManagerItem[]) => {\n      const layoutManagerItem = items.find((item: LayoutManagerItem) => item.id === this.parentId);  \n      this.isCollapsed = !!(layoutManagerItem?.isCollapsed);      \n    })\n  }\n}\n\n\n","<div\n  libDraggable\n  class=\"floating-panel__body\"\n  [ngClass]=\"isCollapsed ? 'hidden' : ''\"\n>\n  <ng-content></ng-content>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, input, Input, Output } from '@angular/core';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\n\nimport { BimplusLocalizedWidgetComponent } from \"./../bimplus-localized-widget/bimplus-localized-widget.component\"\nimport { ProjectNavigatorModel, ProjectNavigatorLayer } from './project-models.interface';\nimport { ExpansionPanelComponent } from '../expansion-panel/expansion-panel.component';\nimport { ExpansionPanelHeaderComponent } from '../expansion-panel-header/expansion-panel-header.component';\nimport { ExpansionPanelHeaderActionsComponent } from '../expansion-panel-header-actions/expansion-panel-header-actions.component';\n\n@Component({\n  selector: 'lib-project-models',\n  imports: [\n    CommonModule,\n    ExpansionPanelComponent,\n    ExpansionPanelHeaderComponent,\n    ExpansionPanelHeaderActionsComponent,\n    TranslateModule,\n  ],\n  templateUrl: './project-models.component.html',\n  styleUrl: './project-models.component.less'\n})\nexport class ProjectModelsComponent extends BimplusLocalizedWidgetComponent {\n  constructor(translateService: TranslateService) {\n    super(translateService)\n  }\n\n  @Input() modelTreeRootTitle: string = \"_Divisions\";\n  @Input() modelTreeRootName: string = \"_Divisions\";\n\n  @Input() expandedModelTree: boolean = false;\n\n  models = input<ProjectNavigatorModel[]>([]);\n\n  @Output() clickedModel = new EventEmitter<ProjectNavigatorModel>();\n  @Output() clickedLayer = new EventEmitter<ProjectNavigatorLayer>();\n\n  @Output() toggleOpacityOfModel = new EventEmitter<ProjectNavigatorModel>();\n  @Output() toggleOpacityOfLayer = new EventEmitter<ProjectNavigatorLayer>();\n\n  @Output() toggleVisibilityOfModel = new EventEmitter<ProjectNavigatorModel>();\n  @Output() toggleVisibilityOfLayer = new EventEmitter<ProjectNavigatorLayer>();\n}\n","<lib-expansion-panel\n  class=\"project-navigator-model-panel\"\n  [expanded]=\"expandedModelTree\"\n>\n  <lib-expansion-panel-header [title]=\"modelTreeRootTitle\">\n    <span class=\"project-navigator-root-node\">{{\n      modelTreeRootName | translate\n    }}</span>\n    <lib-expansion-panel-header-actions>\n      <!-- no action buttons for root -->\n    </lib-expansion-panel-header-actions>\n  </lib-expansion-panel-header>\n\n  <!-- Show all models also as expansion panels -->\n  <!-- lib-bimplus-flat-tree can't be used for that at the moment -->\n  @for(model of models(); track model) {\n    <lib-expansion-panel\n      class=\"project-navigator-model-panel\"\n      [expanded]=\"model.isExpanded\"\n    >\n      <lib-expansion-panel-header>\n        <span\n          class=\"project-navigator-model-node\"\n          [ngClass]=\"{\n            visible: model.isVisible\n          }\"\n          [title]=\"model.name + ' (Rev: ' + model.currentRevision + ')'\"\n          (click)=\"clickedModel.emit(model)\"\n          (keypress)=\"clickedModel.emit(model)\"\n          >\n          {{ model.name }}\n        </span>\n\n        <lib-expansion-panel-header-actions>\n          <div\n            [attr.data-test]=\"'toggle_opacity_model_' + model.id\"\n            class=\"ui-icon-transparency project-navigator-action-buttons\"\n            [ngClass]=\"{\n              opaque: model.isOpaque,\n              transparent: !model.isOpaque,\n              semiopaque: model.isSemiOpaque,\n            }\"\n            [title]=\"'_Toggle opacity' | translate\"\n            (click)=\"toggleOpacityOfModel.emit(model)\"\n            (keypress)=\"toggleOpacityOfModel.emit(model)\"\n          ></div>\n\n          <div\n            [attr.data-test]=\"'toggle_visibility_model_' + model.id\"\n            class=\"ui-icon-visibility project-navigator-action-buttons\"\n            [ngClass]=\"{\n              visible: model.isVisible,\n              invisible: !model.isVisible,\n              semivisible: model.isSemiVisible\n            }\"\n            [title]=\"'_Toggle visibility' | translate\"\n            (click)=\"toggleVisibilityOfModel.emit(model)\"\n            (keypress)=\"toggleVisibilityOfModel.emit(model)\"\n          ></div>\n        </lib-expansion-panel-header-actions>\n      </lib-expansion-panel-header>\n\n      <!-- Content of panel -->\n      <div\n        class=\"project-navigator-layer-node\"\n        *ngFor=\"let layer of model.layers\"\n      >\n        <div\n          class=\"project-navigator-layer-node-name\"\n          [attr.data-test]=\"'floating_bar_layer' + layer.id\"\n          [ngClass]=\"{\n            visible: layer.isVisible\n          }\"\n          [title]=\"layer.name | translate\"\n          (click)=\"clickedLayer.emit(layer)\"\n          (keypress)=\"clickedLayer.emit(layer)\"\n        >\n          {{ layer.name | translate }}\n        </div>\n\n        <div\n          [attr.data-test]=\"'toggle_opacity_layer_' + layer.id\"\n          class=\"ui-icon-transparency project-navigator-action-buttons\"\n          [ngClass]=\"{\n            opaque: layer.isOpaque,\n            transparent: !layer.isOpaque\n          }\"\n          [title]=\"'_Toggle opacity' | translate\"\n          (click)=\"toggleOpacityOfLayer.emit(layer)\"\n          (keypress)=\"toggleOpacityOfLayer.emit(layer)\"\n        ></div>\n\n        <div\n          [attr.data-test]=\"'toggle_visibility_layer_' + layer.id\"\n          class=\"ui-icon-visibility project-navigator-action-buttons\"\n          [ngClass]=\"{\n            visible: layer.isVisible,\n            invisible: !layer.isVisible\n          }\"\n          [title]=\"'_Toggle visibility' | translate\"\n          (click)=\"toggleVisibilityOfLayer.emit(layer)\"\n          (keypress)=\"toggleVisibilityOfLayer.emit(layer)\"\n        ></div>\n      </div>\n    </lib-expansion-panel>\n  }\n</lib-expansion-panel>\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n  selector: 'lib-bimplus-panel-toolbar',\n  imports: [CommonModule],\n  templateUrl: './bimplus-panel-toolbar.component.html',\n  styleUrl: './bimplus-panel-toolbar.component.less'\n})\nexport class BimplusPanelToolbarComponent {\n  @Input() isPanelToolbarVisible: boolean = false;\n}\n","<div class=\"panel-toolbar\"\n  [ngClass]=\"!isPanelToolbarVisible ? 'hidden' : ''\"\n>\n</div>\n","import { Component, EventEmitter, Input, Output, ViewEncapsulation, ElementRef,AfterViewChecked,AfterViewInit, ChangeDetectorRef, inject, DestroyRef  } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\n\nimport { BimplusLocalizedWidgetComponent } from \"./../bimplus-localized-widget/bimplus-localized-widget.component\"\nimport { BimplusFloatingBarComponent } from '../bimplus-floating-bar/bimplus-floating-bar.component';\nimport { BimplusFloatingBarDraggerComponent } from '../bimplus-floating-bar-dragger/bimplus-floating-bar-dragger.component';\nimport { BimplusFloatingBarHeaderContentComponent } from '../bimplus-floating-bar-header-content/bimplus-floating-bar-header-content.component';\nimport { BimplusFloatingBarHeaderLogoComponent } from '../bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component';\nimport { BimplusFloatingBarBodyComponent } from '../bimplus-floating-bar-body/bimplus-floating-bar-body.component';\nimport { FloatingBarItem } from '../bimplus-floating-bar/bimplus-floating-bar.interface';\nimport { ProjectNavigatorModel, ProjectNavigatorLayer, ProjectNavigatorProject } from '../project-models/project-models.interface';\nimport { ProjectModelsComponent } from '../project-models/project-models.component';\nimport { BimplusPanelToolbarComponent } from '../bimplus-panel-toolbar/bimplus-panel-toolbar.component';\nimport { BimplusScrollableContainerComponent } from '../bimplus-scrollable-container/bimplus-scrollable-container.component'\nimport { LayoutManagerItem, LayoutManagerService } from '../../services/layout-manager.service';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n\nconst DEFAULT_POSITION_LEFT = 355;\nconst DEFAULT_POSITION_TOP =20;\n@Component({\n  selector: 'lib-bimplus-floating-bar-project-navigator',\n  imports: [\n    CommonModule,\n    BimplusFloatingBarComponent,\n    BimplusFloatingBarDraggerComponent,\n    BimplusFloatingBarHeaderContentComponent,\n    BimplusFloatingBarHeaderLogoComponent,\n    BimplusFloatingBarBodyComponent,\n    BimplusPanelToolbarComponent,\n    ProjectModelsComponent,\n    TranslateModule,\n    BimplusScrollableContainerComponent\n  ],\n  providers: [TranslateService],\n  templateUrl: './bimplus-floating-bar-project-navigator.component.html',\n  styleUrl: './bimplus-floating-bar-project-navigator.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusFloatingBarProjectNavigatorComponent extends BimplusLocalizedWidgetComponent implements AfterViewInit, AfterViewChecked {\n  constructor(translateService: TranslateService,\n    private readonly layoutManagerService: LayoutManagerService,\n    private readonly element: ElementRef,\n    private readonly cdr: ChangeDetectorRef) \n  {\n    super(translateService);\n  }\n  private hasViewChecked: boolean = false;\n  \n\n  // General bar handling\n  @Input() noBody: boolean = false; // Project navigator has a body\n  @Input() isCollapsed: boolean = false;\n  @Input() noModelsMessage: string | undefined = undefined;\n  @Input() isLoading: boolean = false;\n  @Input() loadingDataMessage: string | undefined = undefined;\n  \n  icon = 'ui-icon-project-navigator';\n  title: string = '_Project_navigator';\n  componentId = 'project-navigator-fp-id';\n  // Header content (like IFC export button)\n  @Input() items: Array<FloatingBarItem> = [];\n\n  @Output() actionClicked = new EventEmitter<string>();\n\n  // Body content\n  @Input() isPanelToolbarVisible: boolean = false;\n  @Input() expandedModelTree: boolean = false;\n  @Input() project: ProjectNavigatorProject = { id: \"\", name: \"\", teamSlug: \"\", models: [] };\n  @Output() clickedModel = new EventEmitter<ProjectNavigatorModel>();\n  @Output() clickedLayer = new EventEmitter<ProjectNavigatorLayer>();\n  @Output() toggleOpacityOfModel = new EventEmitter<ProjectNavigatorModel>();\n  @Output() toggleOpacityOfLayer = new EventEmitter<ProjectNavigatorLayer>();\n  @Output() toggleVisibilityOfModel = new EventEmitter<ProjectNavigatorModel>();\n  @Output() toggleVisibilityOfLayer = new EventEmitter<ProjectNavigatorLayer>();\n  @Output() logoClicked = new EventEmitter<MouseEvent>();  \n  destroyRef = inject(DestroyRef)\n\n  ngAfterViewInit(){\n    this.layoutManagerService.registerObject(this.element,this.componentId,'.floating-panel.visible',true,DEFAULT_POSITION_LEFT,DEFAULT_POSITION_TOP);\n    \n    this.layoutManagerService.registeredItems$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe({next:(items: LayoutManagerItem[]) => {\n      const layoutManagerItem = items.find((item: LayoutManagerItem) => item.id === this.componentId);        \n      this.isCollapsed = !!(layoutManagerItem?.isCollapsed);      \n    },complete: () => console.log('completed')});\n  }\n  // #region General bar handling \n\n  ngAfterViewChecked() {\n    //if (!this.hasViewChecked && !this.isCollapsed) {\n    if (!this.hasViewChecked) {      \n      this.hasViewChecked = true; // Set the flag to prevent repeated execution\n      this.cdr.detectChanges(); // Trigger change detection    \n      setTimeout(()=>{\n        this.layoutManagerService.checkPosition(this.componentId,'.floating-panel.visible',undefined,0,0,true);\n      });\n    }\n  }\n  // #endregion\n}\n","<lib-bimplus-floating-bar\n  id=\"project-navigator-fp-id\"\n  [id] = \"componentId\"\n  class=\"project-navigator-fp floating-panel\"\n  [selectedLanguage]=\"selectedLanguage\"\n  [localizedStrings]=\"localizedStrings\"\n  [noBody]=\"noBody\"  \n  [resizeEnabled]=\"true\"\n  [isVisible]=\"true\"      \n>\n  <lib-bimplus-floating-bar-header-logo\n    class=\"floating-bar-header-logo\"\n    [parentId] = \"componentId\"\n    [selectedLanguage]=\"selectedLanguage\"\n    [localizedStrings]=\"localizedStrings\"\n    [icon]=\"icon\"\n    [title]=\"title\"    \n  >\n  </lib-bimplus-floating-bar-header-logo>\n\n  <lib-bimplus-floating-bar-header-content\n    class=\"floating-bar-header-content\"\n    [selectedLanguage]=\"selectedLanguage\"\n    [localizedStrings]=\"localizedStrings\"\n    [items]=\"items\"\n    (actionClicked)=\"actionClicked.emit($event)\"    \n    [parentId] = \"componentId\"\n  >\n  </lib-bimplus-floating-bar-header-content>\n\n  <lib-bimplus-floating-bar-dragger\n    class=\"floating-bar-dragger\"\n    [parentId] = \"componentId\"\n  >\n  </lib-bimplus-floating-bar-dragger>\n\n  <lib-bimplus-floating-bar-body\n    class=\"floating-bar-body\"\n    [parentId] = \"componentId\"\n  >\n    <lib-bimplus-panel-toolbar\n      [isPanelToolbarVisible]=\"isPanelToolbarVisible\"\n    ></lib-bimplus-panel-toolbar>\n\n    @if(isLoading && loadingDataMessage){\n        <span class=\"inline-message\" [innerHtml]=\"loadingDataMessage | translate\"></span>\n    }\n    @else{ \n    @if(project.models.length === 0 && noModelsMessage){\n      <span class=\"inline-message\" [innerHtml]=\"noModelsMessage | translate\"></span>\n    }@else{\n      <lib-bimplus-scrollable-container>\n        <lib-project-models\n          [selectedLanguage]=\"selectedLanguage\"\n          [localizedStrings]=\"localizedStrings\"\n          [models]=\"project.models\"\n          [modelTreeRootTitle]=\"project.name + ' - ' + project.teamSlug\"\n          [expandedModelTree]=\"expandedModelTree\"\n          (clickedModel)=\"clickedModel.emit($event)\"\n          (clickedLayer)=\"clickedLayer.emit($event)\"\n          (toggleOpacityOfModel)=\"toggleOpacityOfModel.emit($event)\"\n          (toggleOpacityOfLayer)=\"toggleOpacityOfLayer.emit($event)\"\n          (toggleVisibilityOfModel)=\"toggleVisibilityOfModel.emit($event)\"\n          (toggleVisibilityOfLayer)=\"toggleVisibilityOfLayer.emit($event)\"\n        >\n        </lib-project-models>\n      </lib-bimplus-scrollable-container>\n    }\n  }\n  </lib-bimplus-floating-bar-body>\n</lib-bimplus-floating-bar>\n","import { CommonModule } from '@angular/common';\r\nimport { Component, ViewEncapsulation, Input, Output, EventEmitter, booleanAttribute } from '@angular/core';\r\nimport { fireEvent } from '../../utils/utils';\r\n\r\n@Component({\r\n  selector: 'lib-bimplus-language-menu',\r\n  imports: [CommonModule],\r\n  templateUrl: './bimplus-language-menu.component.html',\r\n  styleUrl: './bimplus-language-menu.component.less',\r\n  encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusLanguageMenuComponent {\r\n\r\n   _languagesList = [\r\n    { symbol: \"cs\", text: \"Čeština\"},\r\n    { symbol: \"de\", text: \"Deutsch\"},\r\n    { symbol: \"en\", text: \"English (UK)\"},\r\n    { symbol: \"us\", text: \"English (US)\"},\r\n    { symbol: \"es\", text: \"Español\"},\r\n    { symbol: \"fr\", text: \"Français\"},\r\n    { symbol: \"it\", text: \"Italiano\"},\r\n    { symbol: \"ru\", text: \"Русский\"},\r\n    { symbol: \"ro\", text: \"Romana\"},\r\n    { symbol: \"tr\", text: \"Türkçe\"}\r\n  ];\r\n\r\n  @Input({ transform: booleanAttribute }) isTouch : boolean = false;\r\n  @Input() selectedLanguage : string = \"en\";\r\n  @Input({ transform: booleanAttribute }) expandUp : boolean = false;\r\n  _menuOpened : boolean = false;\r\n\r\n  @Output() bimplusLanguageSelected = new EventEmitter<string>();\r\n\r\n  _switchLanguage( language: string ){\r\n    fireEvent(this, \"bimplusLanguageSelected\", language);\r\n  }\r\n\r\n  _toggleOpened(){\r\n    this._menuOpened = !this._menuOpened;\r\n  }\r\n}\r\n","<div \r\n  class=\"bimcomp-overlay\"\r\n  [ngClass]=\"_menuOpened ? 'open' : ''\" \r\n  (click)=\"_toggleOpened()\"\r\n  (keypress)=\"_toggleOpened()\"\r\n  >\r\n</div>\r\n<div data-test=\"language-menu-dropdown\"\r\n  class=\"dropdown\" \r\n  [ngClass]=\"_menuOpened ? 'open' : ''\" [ngClass]=\"isTouch ? 'is-touch' : ''\" \r\n  (click)=\"_toggleOpened()\"\r\n  (keypress)=\"_toggleOpened()\"\r\n  >\r\n    <div class=\"dropdown-toggle\" >\r\n        <div class='main-icon icon-languages'></div>\r\n        <span class=\"caret\"></span>\r\n    </div>\r\n\r\n    <ul class= \"bimcomp-dropdown-menu\" [ngClass]=\"{'open':_menuOpened, 'expand-up':expandUp }\">\r\n        <li [attr.data-test]=\"'langmenu_item_' + languageItem.text\" \r\n            class=\"bimcomp-dropdown-menu-item\" \r\n            [ngClass]=\"selectedLanguage === languageItem.symbol ? 'selected' : ''\" \r\n            (click)=\"_switchLanguage(languageItem.symbol)\"\r\n            (keypress)=\"_switchLanguage(languageItem.symbol)\"\r\n            *ngFor=\"let languageItem of _languagesList\"\r\n            >\r\n            <span>{{languageItem.text}}</span>\r\n        </li>\r\n    </ul>\r\n</div>","import { CommonModule } from '@angular/common';\nimport { Component, ViewEncapsulation, Input, booleanAttribute } from '@angular/core';\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\nimport { BimplusLocalizedWidgetComponent } from \"./../bimplus-localized-widget/bimplus-localized-widget.component\"\nimport { fireEvent } from '../../utils/utils';\nimport { MenuListType } from '../../types/types';\n\nexport interface BimplusProjectMenuComponentAttribute {\n  [key: string]: unknown; // Add index signature allowing string indexing\n  //Other properties and methods...\n}\n\n@Component({\n  selector: 'lib-bimplus-project-menu',\n  imports: [CommonModule, TranslateModule],\n  providers: [TranslateService],\n  templateUrl: './bimplus-project-menu.component.html',\n  styleUrl: './bimplus-project-menu.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusProjectMenuComponent extends BimplusLocalizedWidgetComponent {\n  constructor(translateService: TranslateService) {\n    super(translateService)\n  }\n\n\n  @Input() projectName: string = \"\";\n  @Input() projectImageUrl: string = \"\";\n  @Input() projectExplorerUrl: string = \"\";\n  @Input() projectActiveItem: string = \"\";\n  @Input({ transform: booleanAttribute }) projectmembersDisabled: boolean = false;\n  @Input({ transform: booleanAttribute }) modelsDisabled: boolean = false;\n  @Input({ transform: booleanAttribute }) documentsDisabled: boolean = false;\n  @Input({ transform: booleanAttribute }) projectsettingsDisabled: boolean = false;\n  @Input({ transform: booleanAttribute }) processesDisabled: boolean = false;\n\n  @Input({ transform: booleanAttribute }) projectmembersVisible: boolean = true;\n  @Input({ transform: booleanAttribute }) modelsVisible: boolean = true;\n  @Input({ transform: booleanAttribute }) documentsVisible: boolean = true;\n  @Input({ transform: booleanAttribute }) projectsettingsVisible: boolean = true;\n  @Input({ transform: booleanAttribute }) processesVisible: boolean = true;\n\n  @Input({ transform: booleanAttribute }) isCollapsed: boolean = false;\n  @Input({ transform: booleanAttribute }) isMiniMode: boolean = false;\n  @Input({ transform: booleanAttribute }) isTouch: boolean = false;\n  @Input({ transform: booleanAttribute }) hideMenuIcons: boolean = false;\n  @Input({ transform: booleanAttribute }) showHorizontalMenuIcons: boolean = false;\n  @Input() menuItemsOrder : string[] = [];\n\n  get prjImgUrl() {\n    return this.projectImageUrl ? this.projectImageUrl : \"./assets/images/default/bimplus_Components_Project_Pic_Default.png\";\n  }\n  get backgroundValue() {\n    return `linear-gradient(rgba(245, 245, 245, 0.8),rgba(245, 245, 245, 0.5) 25%, 75%, rgba(245, 245, 245, 0.8)), url(${this.projectImageUrl ? this.projectImageUrl : './assets/images/default/bimplus_Components_Project_Pic_Default.png'})`;\n  }\n\n  get prjImageOverlayStyle() {\n    return { 'background': `${this.backgroundValue}` };\n  }\n\n  get prjImageStyle() {\n    return { 'background': `url(${this.prjImgUrl})` };\n  }\n\n  /**--------------------------------------------------------------------------\n  * List of menu items\n  * Note : action is used to identify action which should be executed\n  * and also it serves as info topic id\n  --------------------------------------------------------------------------*/\n  _menuPrjList: MenuListType[] = [\n    { action: \"projectmembers\", id: \"portalBimUsers\", type: \"\", class: \"bim-pm-icon-users\", textId: \"_Project_members_tooltip\", textIdDisabled: \"_Insufficient rights title\", disabledTitle: '', checkSubscription: false, devOrStageOnly: false, clickPolicy: \"\" },\n    { action: \"models\", id: \"portalBimModels\", type: \"\", class: \"bim-pm-icon-models\", textId: \"_Models_tooltip\", textIdDisabled: \"\", disabledTitle: '', checkSubscription: false, devOrStageOnly: false, clickPolicy: \"\" },\n    { action: \"documents\", id: \"portalBimDocuments\", type: \"\", class: \"bim-pm-icon-documents\", textId: \"_Documents_tooltip\", textIdDisabled: \"\", disabledTitle: '', checkSubscription: false, devOrStageOnly: false, clickPolicy: \"\" },\n    { action: \"projectsettings\", id: \"portalBimProjectSettings\", type: \"\", class: \"bim-pm-icon-project-settings\", textId: \"_Project_settings_tooltip\", textIdDisabled: \"\", disabledTitle: '', checkSubscription: false, devOrStageOnly: false, clickPolicy: \"\" },\n    { action: \"processes\", id: \"portalBimProcesses\", type: \"\", class: \"bim-pm-icon-processes\", textId: \"_Approvals\", textIdDisabled: \"\", disabledTitle: '', checkSubscription: false, devOrStageOnly: false, clickPolicy: \"\" }\n  ];\n\n  get menuItems() : MenuListType[] {\n    return this._menuPrjList.sort((a, b) => this.menuItemsOrder.indexOf(a.id) - this.menuItemsOrder.indexOf(b.id));\n  }\n\n  /**--------------------------------------------------------------------------\n  * check if app is subscribed/visible\n  --------------------------------------------------------------------------*/\n  _isHidden(item: MenuListType): boolean {\n    if (item) {\n      const key = `${item.action ? item.action : item.id}Visible`;\n\n      return !((this as unknown as BimplusProjectMenuComponentAttribute)[key]);\n    }\n    return false;\n  }\n  /**--------------------------------------------------------------------------\n    * check if app is subscribed/visible\n    --------------------------------------------------------------------------*/\n  _isDisabled(item: MenuListType): boolean {\n\n    if (item) {\n      const key = `${item.action ? item.action : item.id}Disabled`;\n      return !!(this as unknown as BimplusProjectMenuComponentAttribute)[key];\n    }\n    return false;\n  }\n\n\n  _projectMenuItemClicked(action: string, param: string) {\n    console.log(action, param);\n  }\n\n  /**--------------------------------------------------------------------------\n*  item clicked\n--------------------------------------------------------------------------*/\n  _menuItemClicked(item: MenuListType, type: string, event: Event) {\n    if (event) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n    console.log(item, type, event);\n\n\n    if (type != \"info\") {\n      if (this._isDisabled(item)) {\n        return;\n      }\n    }\n    const action = item.action;\n    fireEvent(this, \"bimplusProjectMenuClicked\", { action, type });\n  }\n\n  _menuItemIgnoreAction(event: Event) {\n    if (event) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n  }\n\n  _getPrjItemClassAttributes(item: MenuListType, isTouch: boolean) {\n    const retval: string = `${this._isDisabled(item) ? 'disabled' : ''} ${isTouch ? '' : 'hover-show-info'}`;\n    return retval;\n  }\n\n  _getPrjIconClassAttributes(item: MenuListType) {\n    const retval: string = `${item.class} ${item.action === this.projectActiveItem ? 'active' : ''} ${this._isDisabled(item) ? 'disabled' : ''}`;\n    return retval;\n  }\n}\n","<ng-template #prjList>\n@for(item of menuItems; track item.id){\n  @if (!_isHidden(item)){\n    <!--* prjList *-->\n    <div class=\"bim-pm-prj-item\"\n        [ngClass] = \"_getPrjItemClassAttributes(item,isTouch)\"\n        [title]=\"((_isDisabled(item) && item.textIdDisabled) ? item.textIdDisabled : item.textId) | translate\"\n        (dblclick)=\"_menuItemIgnoreAction($event)\"\n        (click)=\"_menuItemClicked(item, 'normal',$event)\"\n        (keypress)=\"_menuItemClicked(item, 'normal',$event)\"\n        >\n      <div\n        class=\"bim-pm-prj-icon\"\n        [ngClass] = \"_getPrjIconClassAttributes(item)\"\n      >\n      </div>\n      <div class=\"bim-pm-app-item-info bim-pm-icon bim-pm-icon-info\"\n        (click)=\"_menuItemClicked(item, 'info',$event)\"\n        (keypress)=\"_menuItemClicked(item, 'info',$event)\"\n      >\n      </div>\n    </div>\n  }\n}\n</ng-template>\n\n<ng-template #prjListThumbnail>\n@for(item of menuItems; track item.id){\n  @if (!_isHidden(item) && (isCollapsed || item.action !== 'processes' )){\n    <!--* prjList *-->\n    <div class=\"bim-pm-prj-item\"\n        [ngClass] = \"_getPrjItemClassAttributes(item,isTouch)\"\n        [title]=\"((_isDisabled(item) && item.textIdDisabled) ? item.textIdDisabled : item.textId) | translate\"\n        (dblclick)=\"_menuItemIgnoreAction($event)\"\n        (click)=\"_menuItemClicked(item, 'normal',$event)\"\n        (keypress)=\"_menuItemClicked(item, 'normal',$event)\"\n        >\n      <div\n        class=\"bim-pm-prj-icon\"\n        [ngClass] = \"_getPrjIconClassAttributes(item)\"\n      >\n      </div>\n      <div class=\"bim-pm-app-item-info bim-pm-icon bim-pm-icon-info\"\n        (click)=\"_menuItemClicked(item, 'info',$event)\"\n        (keypress)=\"_menuItemClicked(item, 'info',$event)\"\n      >\n      </div>\n    </div>\n  }\n}\n</ng-template>\n\n<div class=\"bim-pm-prj-container\"\n  [ngClass]=\"{ collapsed: isCollapsed, 'mini-mode': isMiniMode, 'is-touch': isTouch }\"\n >\n  @if (isMiniMode && !isCollapsed) {\n  <div class=\"bim-pm-prj-details-mini\">\n    <div class=\"bim-pm-prj-image-bkg-mini\"\n         [ngStyle]=\"prjImageOverlayStyle\">\n      <div class=\"bim-pm-prj-image-thumbnail\" [ngStyle]=\"prjImageStyle\"></div>\n    </div>\n    <div class=\"bim-pm-prj-name-mini\">\n      {{projectName}}\n    </div>\n  </div>\n  <div class=\"bim-pm-prj-items-horizontal\"\n        [ngClass]=\"showHorizontalMenuIcons ? '' : 'hidden'\">\n    <div class=\"bim-pm-prj-items-list\">\n      @if (showHorizontalMenuIcons) {\n        <ng-container *ngTemplateOutlet=\"prjList\">\n        </ng-container>\n      }\n    </div>\n  </div>\n  }\n  @else   {\n  <a href={{projectExplorerUrl}} class=\"bim-pm-prj-details\"\n       [ngStyle]=\"prjImageOverlayStyle\"\n       (dblclick)=\"_projectMenuItemClicked('prjimagedblclick','normal')\"\n       (click)=\"_projectMenuItemClicked('prjimageclick','normal')\"\n       [title]=\"'_ModelThumbnailTooltip' | translate\">\n\n    <div class=\"bim-pm-prj-image\"  [ngStyle]=\"prjImageStyle\">\n      <div class=\"bim-pm-prj-items-overlay\" [ngClass] = \"hideMenuIcons || showHorizontalMenuIcons ? 'hidden' : ''\">\n      </div>\n      <div\n        class=\"bim-pm-prj-items-list\"\n        [ngClass] = \"hideMenuIcons || showHorizontalMenuIcons  ? 'hidden' : ''\"\n        >\n        @if (!hideMenuIcons && !showHorizontalMenuIcons){\n          <ng-container *ngTemplateOutlet=\"prjListThumbnail\">\n          </ng-container>\n        }\n      </div>\n      <div class=\"bim-pm-prj-name\">\n        {{projectName}}\n      </div>\n    </div>\n  </a>\n  <div class=\"bim-pm-prj-items-horizontal\"\n        [ngClass] = \"showHorizontalMenuIcons ? '' : 'hidden'\">\n    <div class=\"bim-pm-prj-items-list\">\n      @if (showHorizontalMenuIcons) {\n        <ng-container *ngTemplateOutlet=\"prjList\">\n        </ng-container>\n      }\n    </div>\n  </div>\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, ViewEncapsulation, Input, Output, EventEmitter, booleanAttribute, OnChanges, SimpleChanges } from '@angular/core';\nimport {TranslateService, TranslateModule} from '@ngx-translate/core';\nimport {BimplusLocalizedWidgetComponent} from \"./../bimplus-localized-widget/bimplus-localized-widget.component\"\nimport { fireEvent } from '../../utils/utils';\nimport {BimplusProjectMenuComponent} from './../bimplus-project-menu/bimplus-project-menu.component';\nimport {MenuListType} from '../../types/types';\n\nconst MenuListTypeId = {\n  PORTAL_TEAM_MANAGEMENT_BTN: 'portalTeamManagementBtn',\n  PORTAL_PROPERTY_MANAGER_BTN: 'portalPropertyManagerBtn',\n  PORTAL_BIM_USERS: 'portalBimUsers',\n  PORTAL_BIM_MODELS: 'portalBimModels',\n  PORTAL_BIM_DOCUMENTS: 'portalBimDocuments',\n  PORTAL_BIM_PROJECT_SETTINGS: 'portalBimProjectSettings',\n  PORTAL_BIM_PROCESSES: 'portalBimProcesses',\n  DIVIDER_PROJECT_MANAGEMENT: 'dividerprojectmanagement',\n  PORTAL_BIM_VIEWER_BTN: 'portalBimViewerBtn',\n  PORTAL_CLOUD_VIEWER_BTN: 'portalCloudViewerBtn',\n  PORTAL_CONNEXIS_BTN: 'portalConnexisBtn',\n  PORTAL_BIM_AUTOCONVERTER_BTN: 'portalBimAutoconverterBtn',\n  DIVIDERAPPS: 'dividerapps',\n  PORTAL_ADD_INS_BTN: 'portalAddInsBtn',\n  PORTAL_SHOP_BTN: 'portalShopBtn',\n  PORTAL_GET_YOUR_TEAM_BTN: 'portalGetYourTeamBtn',\n  PORTAL_TRY_BIMPLUS_PRO_BTN: 'portalTryBimplusProBtn',\n} as const;\n\nexport interface BimplusMainMenuComponentAttribute  {\n  [key: string]: unknown; // Add index signature allowing string indexing\n   //Other properties and methods...\n}\n\n@Component({\n  selector: 'lib-bimplus-main-menu',\n  imports: [CommonModule, TranslateModule, BimplusProjectMenuComponent],\n  providers: [TranslateService],\n  templateUrl: './bimplus-main-menu.component.html',\n  styleUrl: './bimplus-main-menu.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\n\nexport class BimplusMainMenuComponent extends BimplusLocalizedWidgetComponent implements OnChanges {\n  constructor(translateService: TranslateService ){\n    super(translateService)\n  }\n\n  @Input({ transform: booleanAttribute }) isEmbedded : boolean = false;\n  @Input({ transform: booleanAttribute }) isTouch : boolean = false;\n  @Input({ transform: booleanAttribute }) isIpadApp : boolean = false;\n  @Input({ transform: booleanAttribute }) isDev : boolean = false;\n  @Input({ transform: booleanAttribute }) isStage : boolean = false;\n  @Input({ transform: booleanAttribute }) hideProjectMenuIcons : boolean = false;\n  @Input({ transform: booleanAttribute }) showHorizontalMenuIcons : boolean = false;\n  @Input() projectName : string = \"\";\n  @Input() projectImageUrl : string = \"\";\n  @Input() projectExplorerUrl : string = \"\";\n  @Input() projectActiveItem : string = \"\";\n  @Input({ transform: booleanAttribute }) projectmembersDisabled : boolean = false;\n  @Input({ transform: booleanAttribute }) modelsDisabled : boolean = false;\n  @Input({ transform: booleanAttribute }) documentsDisabled : boolean = false;\n  @Input({ transform: booleanAttribute }) projectsettingsDisabled : boolean = false;\n  @Input({ transform: booleanAttribute }) processesDisabled : boolean = false;\n  @Input() footerActiveItem : string = \"\";\n  @Input() menuActiveItem : string = \"\";\n  @Input({ transform: booleanAttribute }) isCollapsed : boolean = false;\n  @Input({ transform: booleanAttribute }) showOverlay : boolean = false;\n  @Input({ transform: booleanAttribute }) teammembersSubscribed : boolean = false;\n  @Input({ transform: booleanAttribute }) propertymanagerSubscribed : boolean = false;\n  @Input({ transform: booleanAttribute }) autoconverterSubscribed : boolean = false;\n  @Input({ transform: booleanAttribute }) connexisSubscribed : boolean = false;\n  @Input({ transform: booleanAttribute }) openProjectDisabled : boolean = false;\n  @Input({ transform: booleanAttribute }) bimexplorerDisabled : boolean = false;\n  @Input({ transform: booleanAttribute }) autoconverterDisabled : boolean = false;\n  @Input({ transform: booleanAttribute }) connexisDisabled : boolean = false;\n  @Input({ transform: booleanAttribute }) teammembersDisabled : boolean = false;\n  @Input({ transform: booleanAttribute }) propertymanagerDisabled : boolean = false;\n  @Input({ transform: booleanAttribute }) shopDisabled : boolean = false;\n  @Input({ transform: booleanAttribute }) addinsDisabled : boolean = false;\n  @Input({ transform: booleanAttribute }) openProjectVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) bimplusProjectMenuVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) projectmembersVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) modelsVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) documentsVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) projectsettingsVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) processesVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) bimexplorerVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) autoconverterVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) connexisVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) teammembersVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) propertymanagerVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) shopVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) addinsVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) dividerprojectmanagementVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) dividerappsVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) getYourTeamVisible : boolean = false;\n  @Input({ transform: booleanAttribute }) tryBimplusProVisible : boolean = false;\n  @Input() appsWithInfo : string[] = [];\n  @Input() appsOrder : string[] = [];\n  @Input() menuItemsOrder : string[] = [];\n\n  @Output() bimplusMainMenuClicked = new EventEmitter<{ action: string, type: string }>();\n  @Output() bimplusMainMenuOverlayClicked = new EventEmitter<void>();\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['localizedStrings']) {\n      this._localizedStrings.set(changes['localizedStrings'].currentValue);\n    }\n  }\n\n  get apps(): MenuListType[] {\n    let appsList = this.appsList.sort((a, b) => this.appsOrder.indexOf(a.id) - this.appsOrder.indexOf(b.id));\n\n    // if connexisVisible remove PORTAL_CONNEXIS_BTN.\n    if (!this.connexisVisible) {\n      appsList = appsList.filter(({ id }) => id !== MenuListTypeId.PORTAL_CONNEXIS_BTN);\n    }\n\n    // if teammembersDisabled remove PORTAL_TEAM_MANAGEMENT_BTN.\n    if (this.teammembersDisabled) {\n      appsList = appsList.filter(({ id }) => id !== MenuListTypeId.PORTAL_TEAM_MANAGEMENT_BTN);\n    }\n\n    // if propertymanagerDisabled remove PORTAL_PROPERTY_MANAGER_BTN.\n    if (this.propertymanagerDisabled) {\n      appsList = appsList.filter(({ id }) => id !== MenuListTypeId.PORTAL_PROPERTY_MANAGER_BTN);\n    }\n\n    // if isTouch remove property manager btn. & approvals btn.\n    if(this.isTouch) {\n      appsList = appsList.filter(({ id }) => \n        id !== MenuListTypeId.PORTAL_PROPERTY_MANAGER_BTN && \n        id !== MenuListTypeId.PORTAL_BIM_PROCESSES\n      );\n    }\n\n    return appsList;\n  }\n\n  get footerList(): MenuListType[] {\n    let footerList = this._menuFooterList.filter(item => this._isSubscribed(item) && !this._isHidden(item));\n\n    // in case that \"Get Your Team\" is not visible and teammembers are disabled then remove divider first, or is not isTouch mode\n    if (this.teammembersDisabled || !this.isTouch) {\n      footerList = footerList.filter(({ id }) => id !== MenuListTypeId.DIVIDERAPPS);\n    }\n\n    // if team is assigned then remove \"Get Your Team\" button\n    if (!this.getYourTeamVisible) {\n      return footerList.filter(({ id }) => id !== MenuListTypeId.PORTAL_GET_YOUR_TEAM_BTN);\n    }\n\n    // remove divider if there is no \"Get Your Team\" button\n    return footerList.filter(({ id }) => id !== MenuListTypeId.DIVIDERAPPS);\n  }\n\n  /**--------------------------------------------------------------------------\n  * check if app is subscribed\n  --------------------------------------------------------------------------*/\n  _isSubscribed(item:MenuListType):boolean {\n\n    if (item.checkSubscription) {\n      const key = `${item.action}Subscribed`;\n      return !!((this as unknown as BimplusMainMenuComponentAttribute )[key]);\n    }\n    return true;\n  }\n  /**--------------------------------------------------------------------------\n  * check if app is clickable\n  --------------------------------------------------------------------------*/\n  _isClickable(item:MenuListType):boolean {\n\n    if (item.clickPolicy === \"noProjectNoSubscription\") {\n      return this.projectName !== \"\";\n    }\n    return true;\n  }\n\n  /**--------------------------------------------------------------------------\n  * check if app is subscribed/visible\n  --------------------------------------------------------------------------*/\n  _isHidden(item:MenuListType):boolean {\n\n    if (item) {\n      const key = `${item.action ? item.action : item.id}Visible`;\n      return !((this as unknown as BimplusMainMenuComponentAttribute )[key]);\n    }\n    return false;\n  }\n\n  /**--------------------------------------------------------------------------\n  * check if app is disabled\n  --------------------------------------------------------------------------*/\n  _isDisabled(item:MenuListType) {\n    const key = `${item.action}Disabled`;\n    return !!((this as unknown as BimplusMainMenuComponentAttribute )[key]);\n  }\n\n  _getContextData(item: MenuListType, active: boolean, disabled: boolean, clickable: boolean, selected: boolean) {\n    return {\n      item: item,\n      active: active,\n      disabled: disabled,\n      clickable: clickable,\n      selected: selected,\n      showInfoIcon: this.appsWithInfo.includes(item.id)\n    };\n  }\n\n  _openPrjBtn:MenuListType = { action:\"openProject\", id:\"portalSelectProjectBtn\",type:\"\", class: \"bim-mm-icon-folder\", textId: \"_Portal_Menu_Open_Project\", textIdDisabled: \"_Portal_Menu_Open_Project\",disabledTitle:'',checkSubscription: true, devOrStageOnly : false,clickPolicy: \"\"};\n\n  contextData = {item:\"haha\",active:true,disabled:true,clickable:true,selected:true};\n\n\n  appsList: MenuListType[] = [\n    { action:\"projectmembers\", id: MenuListTypeId.PORTAL_BIM_USERS, type:\"\", class: \"bim-mm-icon-users\", textId: \"_projectStatisticsMembers\", textIdDisabled: \"_projectStatisticsMembers\", disabledTitle:\"_Insufficient rights title\",checkSubscription: false,devOrStageOnly : false,clickPolicy: \"\"},\n    { action:\"models\", id: MenuListTypeId.PORTAL_BIM_MODELS, type:\"\",class: \"bim-mm-icon-models\", textId: \"_Divisions\", textIdDisabled: \"_Divisions\",disabledTitle:'',checkSubscription: false,devOrStageOnly : false,clickPolicy: \"\"},\n    { action:\"documents\", id: MenuListTypeId.PORTAL_BIM_DOCUMENTS, type:\"\",class: \"bim-mm-icon-documents\", textId: \"_Files\", textIdDisabled: \"_Files\",disabledTitle:'',checkSubscription: false,devOrStageOnly : false,clickPolicy: \"\"},\n    { action:\"projectsettings\", id: MenuListTypeId.PORTAL_BIM_PROJECT_SETTINGS, type:\"\",class: \"bim-mm-icon-project-settings\", textId: \"_Settings\", textIdDisabled: \"_Settings\",disabledTitle:'',checkSubscription: false,devOrStageOnly : false,clickPolicy: \"\"},\n    { action:\"processes\", id: MenuListTypeId.PORTAL_BIM_PROCESSES, type:\"\",class: \"bim-mm-icon-processes\", textId: \"_Approvals\", textIdDisabled: \"_Approvals\",disabledTitle:'',checkSubscription: false,devOrStageOnly : false,clickPolicy: \"\"},\n    { action:\"\",id: MenuListTypeId.DIVIDER_PROJECT_MANAGEMENT, type:\"divider\", class: \"bim-mm-app-item-divider\", textId: \"\",textIdDisabled:\"\",disabledTitle:'',checkSubscription: false,devOrStageOnly : false,clickPolicy: \"\"},\n\n    { action:\"bimexplorer\", id: MenuListTypeId.PORTAL_BIM_VIEWER_BTN, type:\"\",class: \"bim-mm-icon-bim-explorer\", textId: \"BIM Explorer\", textIdDisabled: \"BIM Explorer\", disabledTitle:'',checkSubscription: false,devOrStageOnly : false,clickPolicy: \"noProjectNoSubscription\"},\n    { action:\"cloudviewer\", id: MenuListTypeId.PORTAL_CLOUD_VIEWER_BTN, type:\"\",class: \"bim-mm-icon-cloud-viewer\", textId: \"Model Viewer\", textIdDisabled: \"Model Viewer\", disabledTitle:'',checkSubscription: false,devOrStageOnly : false,clickPolicy: \"noProjectNoSubscription\"},\n    { action:\"connexis\", id: MenuListTypeId.PORTAL_CONNEXIS_BTN, type:\"\",class: \"bim-mm-icon-connexis\", textId: \"Connexis\", textIdDisabled: \"Connexis\", disabledTitle:'',checkSubscription: false, devOrStageOnly : false, clickPolicy: \"noProjectNoSubscription\"},\n    { action:\"autoconverter\", id: MenuListTypeId.PORTAL_BIM_AUTOCONVERTER_BTN, type:\"\",class: \"bim-mm-icon-autoconverter\", textId: \"Autoconverter\", textIdDisabled: \"Autoconverter\", disabledTitle:'',checkSubscription: true, devOrStageOnly : false, clickPolicy: \"noProjectNoSubscription\"},\n\n    { action:\"\",id: MenuListTypeId.DIVIDERAPPS, type:\"divider\", class: \"bim-mm-app-item-divider\", textId: \"\",textIdDisabled:\"\",disabledTitle:'',checkSubscription: false,devOrStageOnly : false,clickPolicy: \"\"},\n\n    { action:\"teammembers\", id: MenuListTypeId.PORTAL_TEAM_MANAGEMENT_BTN, type:\"\", class: \"bim-mm-icon-team-members\", textId: \"_Portal_Menu_Team_Members\", textIdDisabled: \"_Portal_Menu_Team_Members\", disabledTitle:'',checkSubscription: true, devOrStageOnly : false,clickPolicy: \"\"},\n    { action:\"propertymanager\", id: MenuListTypeId.PORTAL_PROPERTY_MANAGER_BTN, type:\"\",class: \"bim-mm-icon-property-manager\", textId: \"_Portal_Menu_Properties\", textIdDisabled: \"_Portal_Menu_Properties\", disabledTitle:'',checkSubscription: true, devOrStageOnly : false,clickPolicy: \"\"},\n  ];\n\n  _menuFooterList: MenuListType[] = [\n    { action:\"\",id: MenuListTypeId.DIVIDERAPPS, type:\"divider\", class: \"bim-mm-app-item-divider\",checkSubscription: false,devOrStageOnly : false } as MenuListType,\n    { action:\"addins\", id: MenuListTypeId.PORTAL_ADD_INS_BTN, type:\"\", class: \"bim-mm-icon-add-ins\", textId: \"_AddIns\", textIdDisabled: \"_AddIns\", disabledTitle:'', checkSubscription: false, devOrStageOnly : false, clickPolicy: \"\"},\n    { \n      action:\"getYourTeam\", \n      id: MenuListTypeId.PORTAL_GET_YOUR_TEAM_BTN,\n      class: \"bim-mm-icon-get-your-team\", \n      textId: \"_Get_Your_Team\", \n      textIdDisabled: \"_Get_Your_Team\",\n    } as MenuListType,\n    { \n      action:\"tryBimplusPro\", \n      id: MenuListTypeId.PORTAL_TRY_BIMPLUS_PRO_BTN,\n      class: \"bim-mm-icon-try-bimplus-pro\", \n      textId: \"_Try_Bimplus_Pro\", \n      textIdDisabled: \"_Try_Bimplus_Pro\",\n    } as MenuListType,    \n    { action:\"shop\", id: MenuListTypeId.PORTAL_SHOP_BTN, type:\"\",class: \"bim-mm-icon-shop\", textId: \"_Get_More\", textIdDisabled: \"_Get_More\",disabledTitle:'',checkSubscription: false,devOrStageOnly : false,clickPolicy: \"\"}\n  ];\n\n  _overlayClicked(){\n    fireEvent(this, \"bimplusMainMenuOverlayClicked\");\n  }\n\n  _mainMenuItemClicked(item: MenuListType,type:string,event: Event | undefined ){\n    if (event) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n\n    if(type != \"info\") {\n      if (this._isDisabled(item)){\n        return;\n      }\n    }\n\n    const action = item.action;\n    fireEvent(this,\"bimplusMainMenuClicked\", {action,type:type } );\n  }\n}\n","<ng-template #appItemContent let-contextData>\r\n  @if (contextData.item.type === 'divider') {\r\n    <div class=\"bim-mm-app-item\" [class]=\"contextData.item.class\" [id]=\"contextData.item.id\"></div>\r\n  } @else {\r\n    <div class=\"bim-mm-app-item\" [id]=\"contextData.item.id\"\r\n      [ngClass]=\"isTouch?'':'hover-show-info '+(contextData.active?'active ':' ') +(contextData.disabled?'disabled ':' ')+(contextData.clickable?' ':'not-clickable ')+(contextData.selected?'selected ':' ')\"\r\n      [title]  =\"((contextData.disabled) ?  (contextData.item.disabledTitle | translate) : '' )\"\r\n      >\r\n      <div class=\"bim-mm-app-item-details\"\r\n           [ngClass] = \" contextData.clickable ? '' : 'not-clickable' \"\r\n           (click)=\"_mainMenuItemClicked(contextData.item,'normal',$event)\"\r\n           (keypress)=\"_mainMenuItemClicked(contextData.item,'normal',$event)\">\r\n          <div class=\"bim-mm-icon\"\r\n              [ngClass]=\"contextData.item.class + (contextData.active?' active':'') + (contextData.disabled?' disabled ':'')\">\r\n          </div>\r\n          <span>{{(contextData.isDisabled && (contextData.item.textIdDisabled !==\"\") ? contextData.item.textIdDisabled : contextData.item.textId) | translate}}</span>\r\n      </div>\r\n      @if(contextData.showInfoIcon){\r\n      <div class=\"bim-mm-app-item-info bim-mm-icon bim-mm-icon-info\"\r\n           (click)=\"_mainMenuItemClicked(contextData.item, 'info',$event)\"\r\n           (keypress)=\"_mainMenuItemClicked(contextData.item, 'info',$event)\">\r\n      </div>\r\n      }\r\n  </div>\r\n  }\r\n</ng-template>\r\n\r\n\r\n\r\n<div \r\n  class=\"bim-mm-wrapper\" \r\n  [ngClass]=\"showOverlay ? 'bim-mm-overlay' : ''\" \r\n  (click)=\"_overlayClicked()\"\r\n  (keypress)=\"_overlayClicked()\"\r\n  >\r\n    <div class= \"bim-mm-container\">\r\n      @if(!_isHidden(_openPrjBtn)){\r\n        <ng-container\r\n        *ngTemplateOutlet=\"appItemContent; context: { $implicit: _getContextData(_openPrjBtn,projectActiveItem === 'projectlist',_isDisabled(_openPrjBtn),true,projectActiveItem === 'projectlist') }\"\r\n        ></ng-container>\r\n      }\r\n\r\n      @if(bimplusProjectMenuVisible){\r\n        <lib-bimplus-project-menu\r\n            projectName = {{projectName}}\r\n            projectImageUrl = {{projectImageUrl}}\r\n            projectExplorerUrl = {{projectExplorerUrl}}\r\n            projectActiveItem = {{projectActiveItem}}\r\n            projectmembersDisabled = {{projectmembersDisabled}}\r\n            modelsDisabled = {{modelsDisabled}}\r\n            documentsDisabled = {{documentsDisabled}}\r\n            projectsettingsDisabled = {{projectsettingsDisabled}}\r\n            processesDisabled = {{processesDisabled}}\r\n            projectmembersVisible = {{projectmembersVisible}}\r\n            modelsVisible = {{modelsVisible}}\r\n            documentsVisible = {{documentsVisible}}\r\n            projectsettingsVisible = {{projectsettingsVisible}}\r\n            processesVisible = {{processesVisible}}\r\n            isCollapsed = {{isCollapsed}}\r\n            isMiniMode = {{isTouch}}\r\n            isTouch = {{isTouch}}\r\n            hideMenuIcons = {{hideProjectMenuIcons}}\r\n            showHorizontalMenuIcons = {{showHorizontalMenuIcons}}\r\n            [menuItemsOrder]=\"menuItemsOrder\"\r\n        ></lib-bimplus-project-menu>\r\n      }\r\n        <div [ngClass]=\"apps.length || footerList.length ? 'bim-mm-apps-container' : ''\">\r\n          <div class=\"bim-mm-apps-list\">\r\n            <div *ngFor=\"let appItem of apps\">\r\n              <ng-container\r\n                *ngTemplateOutlet=\"appItemContent; context: { $implicit: _getContextData(appItem,!_isSubscribed(appItem),_isDisabled(appItem),_isClickable(appItem),menuActiveItem === appItem.action)}\"\r\n              ></ng-container>\r\n            </div>\r\n          </div>\r\n          <div class=\"bim-mm-footer-container\">\r\n            <div *ngFor=\"let footerItem of footerList\">\r\n              <ng-container\r\n                *ngTemplateOutlet=\"appItemContent; context: { $implicit: _getContextData(footerItem,footerActiveItem === footerItem.action,_isDisabled(footerItem),true,false)}\"\r\n              ></ng-container>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n</div>\r\n","export enum LogoState {\n  BimplusViewer = 'bimplusViewer', // Bimplus logo\n  ModelViewerBlack = 'modelViewerBlack', // Model viewer black logo\n  ModelViewer = 'modelViewer', // Cloud viewer logo\n  ConnexisViewer = 'connexisViewer', // Connexis viewer logo\n  ConnexisViewerBlack = 'connexisViewerBlack' // Connexis viewer logo (black)\n}\n\n","import { CommonModule } from '@angular/common';\r\nimport { Component, ViewEncapsulation, Input, Output, EventEmitter, booleanAttribute, computed, input } from '@angular/core';\r\nimport { fireEvent } from '../../utils/utils';\r\nimport { LogoState } from './logo-state.enum';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\n@Component({\r\n  selector: 'lib-bimplus-navbar',\r\n  imports: [CommonModule, TranslateModule],\r\n  templateUrl: './bimplus-navbar.component.html',\r\n  styleUrl: './bimplus-navbar.component.less',\r\n  encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusNavbarComponent {\r\n  @Input() projectInfo : string = \"\";\r\n  @Input() teamInfo : string = \"\";\r\n  @Input({ transform: booleanAttribute }) isDev : boolean = false;\r\n  @Input({ transform: booleanAttribute }) isStage : boolean = false;\r\n  @Input() teamInfoOffset : string = \"\";\r\n  @Input({ transform: booleanAttribute }) isNavbarMenuVisible : boolean = false;\r\n  @Input({ transform: booleanAttribute }) isNavbarInfoVisible : boolean = false;\r\n  logoState = input<LogoState>(LogoState.BimplusViewer);\r\n  isModelViewerActive = input(false , { transform: booleanAttribute });\r\n  // @Input({ transform: booleanAttribute }) isConnexisViewerActive : boolean = false;\r\n  @Input({ transform: booleanAttribute }) isNavbarMessageVisible : boolean = false;\r\n  @Input({ transform: booleanAttribute }) isNavbarMenuActive : boolean = false;\r\n  @Input({ transform: booleanAttribute }) isNavbarMenuEnabled : boolean = true;\r\n  @Input({ transform: booleanAttribute }) isTouch : boolean = false;\r\n  @Input({ transform: booleanAttribute }) isDashboardTooltipEnabled: boolean = true;\r\n  @Input() selectedLanguage : string = \"en\";\r\n  @Output() bimplusNavbarClicked = new EventEmitter<string>();\r\n\r\n  // Make the enum available in the template\r\n  public LogoState = LogoState;\r\n\r\n  protected readonly logoStateSignal = computed<LogoState>(() => {\r\n    if (this.isModelViewerActive()) {\r\n      return LogoState.ModelViewerBlack;\r\n    }\r\n\r\n    return this.logoState();\r\n  });\r\n\r\n  _menuClicked() {\r\n    if ( this.isNavbarMenuEnabled ) {\r\n      fireEvent(this, \"bimplusNavbarClicked\", \"menu\");\r\n    }\r\n  }\r\n\r\n  _logoClicked() {\r\n    if (this.logoStateSignal() === LogoState.BimplusViewer) {\r\n      // Fire only an event for BimplusViewer\r\n      fireEvent(this, \"bimplusNavbarClicked\", \"logo\");\r\n    }\r\n  }\r\n\r\n  _projectInfoClicked() {\r\n    if ( this.isDev ) {\r\n      fireEvent(this, \"bimplusNavbarClicked\", \"project\");\r\n    }\r\n  }\r\n}\r\n","<div\r\n    class=\"bimplus-navbar\"\r\n    [ngClass]=\"isTouch ? 'is-touch' : ''\"\r\n>\r\n    <div class=\"bimplus-navbar-logo-container\">\r\n        <div\r\n            class=\"bimplus-logo\"\r\n            [ngClass]=\"{\r\n                'model-viewer': logoStateSignal() === LogoState.ModelViewer,\r\n                'model-viewer-black': logoStateSignal() === LogoState.ModelViewerBlack,\r\n                'connexis-viewer': logoStateSignal() === LogoState.ConnexisViewer,\r\n                'connexis-viewer-black': logoStateSignal() === LogoState.ConnexisViewerBlack,\r\n                'burger-menu-not-visible': !isNavbarMenuVisible\r\n              }\"\r\n            (click)=\"_logoClicked()\"\r\n            (keypress)=\"_logoClicked()\"\r\n            [title]=\"(isDashboardTooltipEnabled ? '_dashboard_tooltip'  : '') | translate\"\r\n        ></div>\r\n\r\n        <div\r\n            class=\"bimplus-navbar-menu icon\"\r\n            [ngClass]=\"{'active':isNavbarMenuActive, 'hidden': !isNavbarMenuVisible, 'disabled': !isNavbarMenuEnabled}\"\r\n            (click)=\"_menuClicked()\"\r\n            (keypress)=\"_menuClicked()\"\r\n        ></div>\r\n    </div>\r\n\r\n    <div class=\"bimplus-navbar-container\">\r\n        <div\r\n            class=\"bimplus-navbar-info\"\r\n            [ngClass]=\"{'hidden': !isNavbarInfoVisible}\"\r\n            [style.margin-left]=\"teamInfoOffset\"\r\n        >\r\n            <span class=\"team\">{{teamInfo}}</span>\r\n            <span *ngIf=\"projectInfo && !isTouch\">&nbsp;&nbsp; -&nbsp;&nbsp;</span>\r\n            <span\r\n                class=\"project\"\r\n                [ngClass]=\"isDev ? 'clickable' : ''\"\r\n                (click)=\"_projectInfoClicked()\"\r\n                (keypress)=\"_projectInfoClicked()\"\r\n            >\r\n                {{projectInfo}}\r\n            </span>\r\n        </div>\r\n\r\n        <div class=\"bimplus-navbar-slot\">\r\n          <slot></slot>\r\n        </div>\r\n\r\n    </div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\nimport {\n  Component,\n  ViewEncapsulation,\n  Input,\n  Output,\n  EventEmitter,\n  booleanAttribute,\n  OnChanges,\n  SimpleChanges,\n  OnInit,\n  HostBinding\n} from '@angular/core';\nimport { fireEvent } from '../../utils/utils';\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\nimport { BimplusLocalizedWidgetComponent } from '../bimplus-localized-widget/bimplus-localized-widget.component';\nimport { BimplusScrollableContainerComponent } from '../bimplus-scrollable-container/bimplus-scrollable-container.component';\n\nconst BIMPLUS_NOTIFY_MESSAGES = \"bimplus-notify-messages\";\ninterface MessageModel {\n  'id': string | undefined,\n  'type': string | undefined,\n  'title': string | undefined,\n  'text': string | undefined,\n  'link': string | undefined,\n  'linkText': string | string[] | undefined,\n  'links': string[] | undefined,\n  'actionId': number | undefined,\n  'capitalizedTitle': string | boolean | undefined\n}\n@Component({\n  selector: 'lib-bimplus-notify',\n  imports: [\n    CommonModule,\n    TranslateModule,\n    BimplusScrollableContainerComponent\n  ],\n  providers: [TranslateService],\n  templateUrl: './bimplus-notify.component.html',\n  styleUrl: './bimplus-notify.component.less',\n  encapsulation: ViewEncapsulation.None\n})\nexport class BimplusNotifyComponent extends BimplusLocalizedWidgetComponent implements OnChanges, OnInit{\n  constructor(translateService: TranslateService){\n    super(translateService)\n  }\n  // Expose Array constructor as a property\n  Array = Array;\n  \n  @HostBinding('class.new-messages')\n  get newMessages() {\n    return this._alertActive;\n  }\n\n  @HostBinding('class.bim-notify')\n  get bimNotify() {\n    return true; // Or you can use a condition here if needed\n  }\n\n  /**--------------------------------------------------------------------------\n  * List of messages\n  --------------------------------------------------------------------------*/\n  _messagesList: MessageModel[] = [];\n\n  /**--------------------------------------------------------------------------\n  * properties\n  --------------------------------------------------------------------------*/\n  @Input() messagePreviewTime : number = 3000; // in ms\n\n  /**--------------------------------------------------------------------------\n  * properties\n  --------------------------------------------------------------------------*/\n  @Input({ transform: booleanAttribute }) showMessagePreview : boolean = true;\n\n  /**--------------------------------------------------------------------------\n  * properties\n  --------------------------------------------------------------------------*/\n  @Input() previewMessagesLimit : number = 3;\n\n  /**--------------------------------------------------------------------------\n  * offset of preview messages from main icon\n  --------------------------------------------------------------------------*/\n  @Input() previewMessagesOffsetY : string = '2.7em';\n\n  /**--------------------------------------------------------------------------\n  * properties\n  --------------------------------------------------------------------------*/\n  @Input() messages : string = '';\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['messages']) {\n      const newValue = changes['messages'].currentValue;\n      this.updateMessages(newValue);\n    }\n  }\n\n  updateMessages(newValue: string /*, oldValue: string*/) {\n    const isOk = newValue  && typeof newValue === 'string';\n    if (!isOk) {\n      this._messagesList = [];\n      this._previewMessagesList = [];\n      this._alertActive = false;\n      return;\n    }\n\n    const msgData = JSON.parse(newValue);\n    this._messagesList = msgData.messages;\n\n    // filter new messages into the list for preview\n    let newMessagesList = this._messagesList.filter( (msg) => this._oldMessagesList.findIndex( (oldMsg) => oldMsg.id === msg.id ) < 0 );\n    newMessagesList = newMessagesList.filter( (item) => this._messageNotReadYet(item));  // filtering out allready read messages (stored in localstorage)\n\n    // setup preview for new messages\n    newMessagesList.reverse().forEach( (newMsg) => {\n      if ( this._previewMessagesList.findIndex( (item) => newMsg.id === item.id ) < 0){\n        this._previewMessagesList.unshift(newMsg);\n\n        if( this.messagePreviewTime > 0 ) {\n          setTimeout(() => {\n            this._closePreviewMessage(newMsg.id, false);\n          }, this.messagePreviewTime);\n        }\n      }\n    })\n\n    // limit preview messages count\n    this._previewMessagesList.length = this._previewMessagesList.length > this.previewMessagesLimit ? this.previewMessagesLimit : this._previewMessagesList.length;\n\n    // set old state and alert\n    this._oldMessagesList =  this._messagesList;\n    this._alertActive = this._messagesList.length != 0;\n  }\n\n  /**--------------------------------------------------------------------------\n  * States\n  --------------------------------------------------------------------------*/\n  _menuOpened: boolean = false;\n  _alertActive: boolean = false;\n  _oldMessagesList: MessageModel[] = [];\n  // list of messages for preview\n  _previewMessagesList: MessageModel[] = [];\n\n\n  /**--------------------------------------------------------------------------\n  * Delete item event\n  --------------------------------------------------------------------------*/\n  @Output() bimplusNotifyDeleteMessage = new EventEmitter<string>();\n\n  /**--------------------------------------------------------------------------\n  * Delete all item event\n  --------------------------------------------------------------------------*/\n  @Output() bimplusNotifyDeleteAllMessages = new EventEmitter<string>();\n\n  /**--------------------------------------------------------------------------\n  * Message action event\n  --------------------------------------------------------------------------*/\n  @Output() bimplusNotifyMessageAction = new EventEmitter<string>();\n\n  /**--------------------------------------------------------------------------\n  * initial component load\n  --------------------------------------------------------------------------*/\n  ngOnInit(): void {\n    this.updateMessages(this.messages);\n  }\n\n  /**--------------------------------------------------------------------------\n  * close single message\n  --------------------------------------------------------------------------*/\n  _closeMessage( item: MessageModel, preview: boolean, event: Event | undefined ){\n    if (preview) {\n      return this._closePreviewMessage(item.id);\n    }\n\n    if (event) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n\n    fireEvent(this, \"bimplusNotifyDeleteMessage\", JSON.stringify(item));\n  }\n\n  /**--------------------------------------------------------------------------\n  * close preview message\n  --------------------------------------------------------------------------*/\n  _closePreviewMessage( msgId: string | undefined, closedByUser = true ){\n    if (!msgId) {\n      return;\n    }\n\n    this._previewMessagesList = this._previewMessagesList.filter( (msg) => msg.id !== msgId );\n    this.storeMessagesAsRead([msgId]);\n    if ( closedByUser && this._previewMessagesList.length === 0 ){\n      this._alertActive = false;\n    }\n  }\n\n  /**--------------------------------------------------------------------------\n  * close all messages\n  --------------------------------------------------------------------------*/\n  _deleteAllMessages(){\n    fireEvent(this, \"bimplusNotifyDeleteAllMessages\");\n    this.clearAllLocalStorageMessages();\n  }\n\n  /**--------------------------------------------------------------------------\n  * message clicked\n  --------------------------------------------------------------------------*/\n  _messageAction( item: MessageModel, index: number ){\n    item.actionId = index;\n    fireEvent(this, \"bimplusNotifyMessageAction\", JSON.stringify(item));\n  }\n\n  /**--------------------------------------------------------------------------\n  * toggle menu open\n  --------------------------------------------------------------------------*/\n  _toggleOpened(){\n    this._menuOpened = !this._menuOpened;\n    this._alertActive = false;\n    this._previewMessagesList = [];\n  }\n\n  _messageNotReadYet(message: MessageModel){\n    if(!message?.id){\n      return true;\n    }\n    const messageListString = window.localStorage.getItem(BIMPLUS_NOTIFY_MESSAGES);\n    if(!messageListString){\n      return true;\n    }\n    return !messageListString.includes(message.id);\n  }\n\n  storeMessagesAsRead(messageList: string[]){\n    if(!messageList || messageList.length <1){\n      return;\n    }\n    let messageListString = window.localStorage.getItem(BIMPLUS_NOTIFY_MESSAGES);\n    if(!messageListString){\n      messageListString = \"\";\n    }\n    messageList.forEach((item: string)=>{\n      if(!messageListString?.includes(item)){\n        messageListString+=(item+\";\");\n      }\n    })\n    window.localStorage.setItem(BIMPLUS_NOTIFY_MESSAGES,messageListString);\n  }\n\n  clearAllLocalStorageMessages(){\n    window.localStorage.removeItem(BIMPLUS_NOTIFY_MESSAGES);\n  }\n\n  /**--------------------------------------------------------------------------\n  * get item link title\n  --------------------------------------------------------------------------*/\n  _getItemLinkTitle( item: MessageModel, index: number ){\n    let itemLinksTitles: (string | undefined)[] = [];\n    if ( item.linkText && (item.links || item.link)) {\n      itemLinksTitles = Array.isArray(item.links) ? item.links : [item.link];\n    }\n    return itemLinksTitles[index] ?? '';\n  }\n}\n","<div\n    class=\"dropdown\"\n    [ngClass]=\"_menuOpened ? 'open' : ''\"\n    (click)=\"_toggleOpened()\"\n    (keypress)=\"_toggleOpened()\"\n    [title]=\"'_BimplusNotifyTitle' | translate\"\n>\n    <div class=\"dropdown-toggle\" >\n        <div\n            class=\"main-icon\"\n            [ngClass]=\"'icon-notify' + (this._alertActive ? '-alert notify' : '')\"\n        ></div>\n    </div>\n\n    <div\n        class=\"bimcomp-dropdown-menu\"\n        [ngClass]=\"_menuOpened ? 'open' : ''\"\n    >\n        <div class=\"notify-tick\"></div>\n        <div class=\"messages-title\">\n            <div class=\"messages-count\">\n                ({{this._messagesList.length}})\n            </div>\n            <div\n                class=\"messages-delete-all\"\n                (click)=\"_deleteAllMessages()\"\n                (keypress)=\"_deleteAllMessages()\"\n            >\n                {{\"_Notify_Mark_All\" | translate}}\n            </div>\n        </div>\n        <div class=\"messages-container\">\n            @if (_messagesList.length) {\n                <lib-bimplus-scrollable-container>\n                    <div\n                        *ngFor=\"let item of _messagesList\"\n                        class=\"message-item\"\n                    >\n                        <div class=\"message-item-title\">\n                            <div [ngClass]=\"'message-item-icon-' + item.type\"></div>\n                            <div\n                                class=\"message-item-title-text\"\n                                [ngClass]=\"{'capitalize':item.capitalizedTitle}\"\n                            >\n                                {{item.title}}\n                            </div>\n                            <div\n                                class=\"message-item-icon-close\"\n                                (click)=\"_closeMessage(item, false, $event)\"\n                                (keypress)=\"_closeMessage(item, false, $event)\"\n                            ></div>\n                        </div>\n    \n                        <div class=\"message-item-body-text\">{{item.text}}</div>\n                        @if (item.linkText) {\n                            <div\n                                *ngFor=\"let link of (item.linkText.constructor === Array ? item.linkText : [item.linkText]); let i = index\"\n                                class=\"message-item-link\"\n                                [title]=\"_getItemLinkTitle(item, i)\"\n                                (click)=\"_messageAction(item, i)\"\n                                (keypress)=\"_messageAction(item, i)\"\n                            >{{link}}</div>\n                        }\n                    </div>\n                </lib-bimplus-scrollable-container>\n            } @else {\n                <div class=\"message-item-empty\">\n                    <div class=\"message-item-empty-icon\"></div>\n                    <div class=\"message-item-empty-text\">{{\"_Notify_No_Messages\" | translate}}</div>\n                </div>\n            }\n        </div>\n    </div>\n</div>\n\n<div\n    class=\"bimcomp-overlay\"\n    [ngClass]=\"_menuOpened ? 'open' : ''\"\n    (click)=\"_toggleOpened()\"\n    (keypress)=\"_toggleOpened()\"\n></div>\n\n<div\n    class=\"bimcomp-messages-preview\"\n    [ngClass]=\"(showMessagePreview && !_menuOpened && _previewMessagesList.length > 0) ? 'visible' : ''\"\n    [style.top]=\"previewMessagesOffsetY\"\n>\n    <div class=\"messages-container-preview\">\n        <div\n            *ngFor=\"let item of _previewMessagesList\"\n            class=\"message-item\"\n        >\n            <div class=\"message-item-title\">\n                <div [ngClass]=\"'message-item-icon-' + item.type\"></div>\n                <div\n                    class=\"message-item-title-text\"\n                    [ngClass]=\"{'capitalize':item.capitalizedTitle}\"\n                >\n                    {{item.title}}\n                </div>\n                <div\n                    class=\"message-item-icon-close\"\n                    (click)=\"_closeMessage(item, true, $event)\"\n                    (keypress)=\"_closeMessage(item, true, $event)\"\n                ></div>\n            </div>\n\n            <div class=\"message-item-body-text\">\n                {{item.text}}\n            </div>\n            @if (item.linkText) {\n                <div\n                    *ngFor=\"let link of (item.linkText.constructor === Array ? item.linkText : [item.linkText]); let i = index\"\n                    class=\"message-item-link\"\n                    [title]=\"_getItemLinkTitle(item, i)\"\n                    (click)=\"_messageAction(item, i)\"\n                    (keypress)=\"_messageAction(item, i)\"\n                >{{link}}</div>\n            }\n        </div>\n    </div>\n</div>","import { Component, EventEmitter, input, Output } from '@angular/core';\n\n@Component({\n  selector: 'lib-bimplus-overlay-message',\n  templateUrl: './bimplus-overlay-message.component.html',\n  styleUrl: './bimplus-overlay-message.component.less'\n})\nexport class BimplusOverlayMessageComponent {\n  title = input<string>(\"\");\n  message = input<string>(\"\");\n\n  @Output() closeMessage = new EventEmitter<void>();\n\n  closeButton() {\n    this.closeMessage.emit();\n    // (document.activeElement as HTMLElement)?.blur(); // Remove focus of active element\n  }\n\n  closeKeypressed(event: KeyboardEvent) {\n    if (event.key === 'Escape' || event.key === 'Esc') {\n      this.closeMessage.emit();\n    }\n  }\n\n}\n","<div class=\"bimplus-overlay-message\">\n  <div class=\"overlay-dialog-container\">\n    <div class=\"header\">\n\n      <div class=\"icon\"></div>\n\n      @if (title(); as title) {\n      <div class=\"title-text\">\n        {{ title }}\n      </div>\n      }\n\n      <button\n        class=\"close-button\"\n        (click)=\"closeButton()\"\n        tabindex=\"0\"\n        (keydown)=\"closeKeypressed($event)\">\n      </button>\n\n    </div>\n\n    <div class=\"content\">\n      @if (message(); as message) {\n        <div class=\"text\" [innerHTML]=\"message\">\n        </div>\n      }\n    </div>\n  </div>\n</div>\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n  name: 'pxsuffix',\r\n  standalone: true\r\n})\r\nexport class PxsuffixPipe implements PipeTransform {\r\n\r\n  transform(input: number): string{ //string type\r\n    return input + 'px';\r\n } \r\n\r\n}\r\n","import { Directive, HostListener, Output, EventEmitter } from '@angular/core';\r\nimport { fireEvent } from '../utils/utils';\r\n\r\n@Directive({\r\n  selector: '[xDraggable]',\r\n  standalone: true\r\n})\r\nexport class XDraggableDirective {\r\n\r\n  oldX = 0;\r\n  isDragging = false;\r\n  wasDragging = false;\r\n  isMouseDown = false;\r\n\r\n  @Output()\r\n  dragging = new EventEmitter<number>();\r\n\r\n  @Output()\r\n  clicked = new EventEmitter<MouseEvent>();\r\n\r\n  @HostListener('document:mousemove', ['$event'])\r\n  onMouseMove(event: MouseEvent) {\r\n    if (!this.isDragging && !this.isMouseDown) {\r\n        return;\r\n    }\r\n\r\n    const deltaX = (event.clientX - this.oldX);\r\n\r\n    if(!this.isDragging){\r\n      if(Math.abs(deltaX) > 2){\r\n        this.isDragging = true;\r\n        this.wasDragging = true;\r\n      }else{\r\n        return;\r\n      }\r\n    }\r\n\r\n    fireEvent(this, \"dragging\", deltaX);\r\n\r\n    this.oldX = event.clientX;\r\n  }\r\n\r\n  @HostListener('document:mouseup', ['$event'])\r\n  onMouseUp() {\r\n    this.isDragging = false;\r\n    this.isMouseDown = false;\r\n  }\r\n\r\n  @HostListener('mousedown', ['$event'])\r\n  onMouseDown(event: MouseEvent) {\r\n    this.isMouseDown = true;\r\n    this.wasDragging = false;\r\n    this.oldX = event.clientX;\r\n  }\r\n\r\n  @HostListener('click', ['$event'])\r\n  onMouseClick(event: MouseEvent) {\r\n    if(!this.wasDragging){\r\n      fireEvent(this, \"clicked\", event);\r\n    }\r\n  }\r\n\r\n}\r\n","import { Component, Output, EventEmitter, ViewEncapsulation, signal, input, effect } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { PxsuffixPipe } from '../../pipes/pxsuffix.pipe';\r\nimport { XDraggableDirective } from '../../directives/x-draggable.directive'\r\nimport { BimplusLocalizedWidgetComponent } from \"./../bimplus-localized-widget/bimplus-localized-widget.component\"\r\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\r\nimport { fireEvent } from '../../utils/utils';\r\n\r\nexport interface SidenavItem {\r\n  id: string;\r\n  icon?: string;\r\n  iconActive?: string;\r\n  iconDisabled?: string;\r\n  text: string;\r\n  disabled?: boolean;\r\n}\r\n\r\n@Component({\r\n  selector: 'lib-bimplus-sidenav',\r\n  imports: [CommonModule, PxsuffixPipe, XDraggableDirective, TranslateModule],\r\n  providers: [TranslateService],\r\n  templateUrl: './bimplus-sidenav.component.html',\r\n  styleUrl: './bimplus-sidenav.component.less',\r\n  encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusSidenavComponent extends BimplusLocalizedWidgetComponent {\r\n  constructor(translateService: TranslateService) {\r\n    super(translateService);\r\n  }\r\n\r\n  // #region public fields\r\n  readonly activeItem = signal<string>('');\r\n  readonly drawerWidth = signal<number>(300);\r\n  readonly drawerExpanded = signal(true);\r\n\r\n  @Output() activeItemChanged = new EventEmitter<string>();\r\n  @Output() actionClicked = new EventEmitter<string>();\r\n  @Output() footerClicked = new EventEmitter<string>();\r\n\r\n  items = input<SidenavItem[]>([]);\r\n  // we need to wait for the items before we can activate the first item, this is instead of using a lifecycle methods (ngOnInit) or set\r\n  private readonly activateItemEffectRef = effect(() => {\r\n    if (this.items().length) {\r\n      this._activateItem(this.items()[0].id);\r\n      // if there is first item, we need to manually destroy this effect to prevent call it again\r\n      this.activateItemEffectRef.destroy();\r\n    }\r\n  }, { manualCleanup: true })\r\n  actionItems = input<SidenavItem[]>([]);\r\n  footerItem = input<SidenavItem | null>(null);\r\n\r\n\r\n  // #endregion public fields\r\n\r\n  // #region public methods\r\n  _activateItem(item: string) {\r\n    this.activeItem.set(item);\r\n    const foundItem = this.items().find(x => x.id == item);\r\n    if (!foundItem) {\r\n      return;\r\n    }\r\n\r\n    if (!this.drawerExpanded()) {\r\n      this._toggleDrawer();\r\n    }\r\n    fireEvent(this, \"activeItemChanged\", item);\r\n  }\r\n\r\n  _clickAction(item: string) {\r\n    fireEvent(this, \"actionClicked\", item);\r\n  }\r\n\r\n  _clickFooter(item: string) {\r\n    fireEvent(this, \"footerClicked\", item);\r\n  }\r\n\r\n  _toggleDrawer() {\r\n    this.drawerExpanded.update(value => !value);\r\n  }\r\n\r\n  _onResizeWidth(event: number): void {\r\n    const deltaX = event;\r\n    this.drawerWidth.update(value => (value + deltaX));\r\n  }\r\n  // #endregion public methods\r\n}\r\n","<div class=\"sidenav\">\n  @for (sideNavItem of items(); track sideNavItem) {\n  <div class=\"sidenav-row\">\n    @if (sideNavItem.disabled) {\n    <div\n      [attr.data-test]=\"'sidenav_item_' + sideNavItem.id\"\n      class=\"sidenav-item\"\n      [style.background]=\"\n        ' no-repeat center center url(' + sideNavItem.iconDisabled + ')'\n      \"\n      [title]=\"sideNavItem.text | translate\"\n      (keypress)=\"_toggleDrawer()\"\n    ></div>\n    } @else { @if (activeItem() === sideNavItem.id) {\n    <div\n      [attr.data-test]=\"'sidenav_item_' + sideNavItem.id\"\n      class=\"sidenav-item\"\n      [style.background]=\"\n        ' no-repeat center center url(' + sideNavItem.iconActive + ')'\n      \"\n      (click)=\"_toggleDrawer()\"\n      (keypress)=\"_toggleDrawer()\"\n      [title]=\"sideNavItem.text | translate\"\n    ></div>\n    } @else {\n    <div\n      [attr.data-test]=\"'sidenav_item_' + sideNavItem.id\"\n      class=\"sidenav-item\"\n      [style.background]=\"\n        ' no-repeat center center url(' + sideNavItem.icon + ')'\n      \"\n      (click)=\"_activateItem(sideNavItem.id)\"\n      (keypress)=\"_activateItem(sideNavItem.id)\"\n      [title]=\"sideNavItem.text | translate\"\n    ></div>\n    } }\n  </div>\n  } @if (actionItems().length) {\n  <div class=\"sidenav-separator\"></div>\n  @for(actionItem of actionItems(); track actionItem) {\n  <div class=\"sidenav-row\">\n    <div\n      [attr.data-test]=\"'sidenav_action_item_' + actionItem.id\"\n      class=\"sidenav-item\"\n      [style.background]=\"\n        ' no-repeat center center url(' + actionItem.icon + ')'\n      \"\n      (click)=\"_clickAction(actionItem.id)\"\n      (keypress)=\"_clickAction(actionItem.id)\"\n      [title]=\"actionItem.text | translate\"\n    ></div>\n  </div>\n  } } @if (footerItem(); as footerItem) {\n  <div class=\"sidenav-row-footer\">\n    <div\n      [attr.data-test]=\"'sidenav_footer_item_' + footerItem.id\"\n      class=\"sidenav-item\"\n      [style.background]=\"\n        ' no-repeat center center url(' + footerItem.icon + ')'\n      \"\n      (click)=\"_clickFooter(footerItem.id)\"\n      (keypress)=\"_clickFooter(footerItem.id)\"\n    ></div>\n  </div>\n  }\n</div>\n\n<div\n  class=\"sidenav-drawer\"\n  [style.width]=\"drawerWidth() | pxsuffix\"\n  [ngClass]=\"drawerExpanded() ? '' : 'hidden'\"\n>\n  <slot></slot>\n  @if (drawerExpanded()) {\n  <div\n    xDraggable\n    class=\"sidenav-resize-border-right\"\n    (dragging)=\"_onResizeWidth($event)\"\n  ></div>\n  <div\n    xDraggable\n    data-test=\"sidenav-resize-handle\"\n    class=\"sidenav-resize-handle-left\"\n    (dragging)=\"_onResizeWidth($event)\"\n    (clicked)=\"_toggleDrawer()\"\n  ></div>\n  }\n</div>\n@if (!drawerExpanded()) {\n<div\n  data-test=\"sidenav-resize-handle\"\n  class=\"sidenav-resize-handle-left collapsed\"\n  (click)=\"_toggleDrawer()\"\n  (keypress)=\"_toggleDrawer()\"\n></div>\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, ViewEncapsulation, Output, EventEmitter, input } from '@angular/core';\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\nimport { BimplusLocalizedWidgetComponent } from \"../bimplus-localized-widget/bimplus-localized-widget.component\"\nimport { fireEvent } from '../../utils/utils';\n\n@Component({\n  selector: 'lib-bimplus-storage-info',\n  imports: [CommonModule, TranslateModule],\n  providers: [TranslateService],\n  templateUrl: './bimplus-storage-info.component.html',\n  styleUrl: './bimplus-storage-info.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusStorageInfoComponent extends BimplusLocalizedWidgetComponent{\n  constructor(translateService: TranslateService){\n    super(translateService)\n  }\n  /**--------------------------------------------------------------------------\n  * properties\n  --------------------------------------------------------------------------*/\n  usedStorage = input<number>(0);\n\n\n  @Output() bimplusStorageInfoClicked = new EventEmitter<string>();\n\n  /**--------------------------------------------------------------------------\n  * clicked storage info container\n  --------------------------------------------------------------------------*/\n  _infoClicked( action: string ){\n    fireEvent(this, \"bimplusStorageInfoClicked\", action);\n  }\n}\n","<div\n    class=\"storage-info\"\n    (click)=\"_infoClicked('storageInfo')\"\n    (keypress)=\"_infoClicked('storageInfo')\"\n>\n    <span class=\"progress-title\">\n        {{\"_Common_Data_Environment_Quota\" | translate}}\n        <span class=\"progress-text\" data-test=\"used-storage\">\n            {{usedStorage()}}%\n        </span>\n    </span>\n    <div class=\"storage-info-bar-container\">\n        <div \n            class=\"storage-info-bar\"\n            [ngClass]=\"{\n                'red': usedStorage() >= 90,\n                'yellow': usedStorage() >= 80 && usedStorage() < 90,\n                'green': usedStorage() < 80\n            }\"\n            [style.width]=\"usedStorage() + '%'\"\n            [style.max-width]=\"usedStorage() + '%'\"\n        ></div>\n    </div>\n</div>","import { ToolHubVisualSettings, ToolHubItemUnits } from './bimplus-tool-hub.interface';\n\nconst RAD_DEG : number = Math.PI / 180.0;\nconst PI2 : number = 2 * Math.PI;\n\n\nexport class SVGGenerator {\n\n  // Constants for drawing arc\n  /**\n   * @param  {Array.<Number>} center\n   * @param  {Number} R\n   * @param  {Number} angle\n   * @return {Array.<Number>}\n   */\n  static pointOnArc(center: [number,number], R: number, angle: number) : [number, number] {\n    const radians = (angle - 90) * RAD_DEG;\n\n    return [center[0] + R * Math.cos(radians), center[1] + R * Math.sin(radians)];\n  }\n\n  /**\n   * Generates arc path\n   *\n   * @param  {Array.<Number>} center\n   * @param  {Number}         radius\n   * @param  {Number}         start\n   * @param  {Number}         end\n   * @param  {Number}         width\n   * @param  {Number}         corner Corner radius\n   * @param  {Number}         canvasWidth - Divisor to have svg with range 0 to 1\n   *\n   * @return {String|Array.<Number|String>}\n   */\n  static arc(center: [number,number], radius: number, start: number, end: number, width: number, corner: number, canvasWidth: number) : string {\n\n    const innerR = radius - width;\n    const circumference = Math.abs(end - start);\n    corner = Math.min(width / 2, corner);\n\n    if (360 * (corner / (Math.PI * (radius - width))) > Math.abs(start - end)) {\n      corner = circumference / 360 * innerR * Math.PI;\n    }\n\n    // inner and outer radiuses\n    const innerR2 = innerR + corner;\n    const outerRadius = radius - corner;\n\n    // butts corner points\n    const oStart = this.pointOnArc(center, outerRadius, start);\n    const oEnd = this.pointOnArc(center, outerRadius, end);\n\n    const iStart = this.pointOnArc(center, innerR2, start);\n    const iEnd = this.pointOnArc(center, innerR2, end);\n\n    const iSection = 360 * (corner / (PI2 * innerR));\n    const oSection = 360 * (corner / (PI2 * radius));\n\n    // arcs endpoints\n    const iArcStart = this.pointOnArc(center, innerR, start + iSection);\n    const iArcEnd = this.pointOnArc(center, innerR, end - iSection);\n\n    const oArcStart = this.pointOnArc(center, radius, start + oSection);\n    const oArcEnd = this.pointOnArc(center, radius, end - oSection);\n\n    const arcSweep1 = circumference > 180 + 2 * oSection ? 1 : 0;\n    const arcSweep2 = circumference > 180 + 2 * iSection ? 1 : 0;\n\n    const points : Array<string> = new Array<string>(\n      // begin path\n      \"M\", (oStart[0] / canvasWidth).toString(), (oStart[1] / canvasWidth).toString(),\n      // outer start corner\n      \"A\", (corner / canvasWidth).toString(), (corner / canvasWidth).toString(), \"0\", \"0\", \"1\", (oArcStart[0] / canvasWidth).toString(), (oArcStart[1] / canvasWidth).toString(),\n      // outer main arc\n      \"A\", (radius / canvasWidth).toString(), (radius / canvasWidth).toString(), \"0\", (arcSweep1 / canvasWidth).toString(), \"1\", (oArcEnd[0] / canvasWidth).toString(), (oArcEnd[1] / canvasWidth).toString(),\n      // outer end corner\n      \"A\", (corner / canvasWidth).toString(), (corner / canvasWidth).toString(), \"0\", \"0\", \"1\", (oEnd[0] / canvasWidth).toString(), (oEnd[1] / canvasWidth).toString(),\n      // end butt\n      \"L\", (iEnd[0] / canvasWidth).toString(), (iEnd[1] / canvasWidth).toString(),\n      // inner end corner\n      \"A\", (corner / canvasWidth).toString(), (corner / canvasWidth).toString(), \"0\", \"0\", \"1\", (iArcEnd[0] / canvasWidth).toString(), (iArcEnd[1] / canvasWidth).toString(),\n      // inner arc\n      \"A\", (innerR / canvasWidth).toString(), (innerR / canvasWidth).toString(), \"0\", (arcSweep2 / canvasWidth).toString(), \"0\", (iArcStart[0] / canvasWidth).toString(), (iArcStart[1] / canvasWidth).toString(),\n      // inner start corner\n      \"A\", (corner / canvasWidth).toString(), (corner / canvasWidth).toString(), \"0\", \"0\", \"1\", (iStart[0] / canvasWidth).toString(), (iStart[1] / canvasWidth).toString(), \"Z\" // end path*/\n    );\n\n    return points.join(' ');\n  }\n\n  /*\n      * svg units - when \"objectBoundingBox\" is applied, coordinates are relative,\n      * use coordinates as ratio (in range 0-1),\n      * f.e. (1,1) is botom right corner of element\n    */\n  static drawMenuItemSvg(svgRadius: number, svgRadiusInner: number, buttonsLength: number, isEMEmbedded: boolean): ToolHubItemUnits {\n    \n    const radius = isEMEmbedded ? (svgRadius - 5) * 10 : svgRadius * 10;\n    const radiusInner = isEMEmbedded ? (svgRadiusInner - 3) * 10 : svgRadiusInner * 10;\n    const width = radius * 2;\n    // coordinates of points describing one item on menu\n    const angle = 360 / ((buttonsLength > 0) ? buttonsLength : 1);\n    const halfAngleRadians = (angle * Math.PI) / 360;\n    const leftX = radius - Math.sin(halfAngleRadians) * radius;\n    const leftY = radius - Math.cos(halfAngleRadians) * radius;\n    const rightX = radius + Math.sin(halfAngleRadians) * radius;\n    const rightY = radius - Math.cos(halfAngleRadians) * radius;\n  \n  \n    return {\n      radius: radius / width,\n      radiusInner: radiusInner / width,\n      width: 1,\n      thick: (radius - radiusInner) / width,\n      innerEdgeRight: (radius + radiusInner) / width,\n      leftX: leftX / width,\n      leftY: leftY / width,\n      rightX: rightX / width,\n      rightY: rightY / width\n    };\n  }\n\n  \n  static generateAnnularSector(settings : ToolHubVisualSettings): string{\n    const multiplier = 12;\n    return SVGGenerator.arc(\n      [settings.subMenuCenter[0] * multiplier, settings.subMenuCenter[1] * multiplier],\n      settings.subMenuRadius * multiplier,\n      settings.subMenuStartAngle,\n      settings.subMenuEndAngle,\n      settings.subMenuWidth,\n      7,\n      425\n    );\n  }\n\n  static generateAnnularSectorBorder(settings : ToolHubVisualSettings): string{\n    const multiplier = 12;\n    return SVGGenerator.arc(\n      [settings.subMenuCenter[0] * multiplier, settings.subMenuCenter[1] * multiplier],\n      (settings.subMenuRadius * multiplier) + 1,\n      settings.subMenuStartAngle - 0.5,\n      settings.subMenuEndAngle  + 0.5,\n      settings.subMenuWidth + 2,\n      7,\n      425\n    );\n  }\n\n  static generateDeadZoneAnnularSector(settings : ToolHubVisualSettings): string{\n    const multiplier = 12;\n    return SVGGenerator.arc(\n      [settings.deadZoneCenter[0] * multiplier, settings.deadZoneCenter[1] * multiplier],\n      (settings.deadZoneRadius) * multiplier,\n      settings.deadZoneStartAngle,\n      settings.deadZoneEndAngle,\n      settings.deadZoneWidth,\n      7,\n      700);\n  }\n\n  static getSVGViewBox(units : ToolHubItemUnits):string{\n    return `0 0 ${units.width} ${units.width}`;\n  }\n\n  static getSVGCenterMenuPath(units : ToolHubItemUnits):string{\n    return `M 0 ${units.radius} A ${units.radius} ${units.radius} 0 0 1 ${units.width} ${units.radius} L ${units.width} ${units.radius} A ${units.radius} ${units.radius} 0 0 1 0 ${units.radius} L ${units.thick} ${units.radius} A ${units.radiusInner} ${units.radiusInner} 0 0 0 ${units.innerEdgeRight} ${units.radius} L ${units.innerEdgeRight} ${units.radius} A ${units.radiusInner} ${units.radiusInner} 0 0 0 ${units.thick} ${units.radius} Z`;\n  }\n\n  static getSVGCenterMenuItemPath(units : ToolHubItemUnits):string{\n    return `M ${units.radius} ${units.radius} L ${units.leftX} ${units.leftY} A ${units.radius} ${units.radius} 0 0 1 ${units.rightX} ${units.rightY} L ${units.rightX} ${units.rightY} L ${units.radius} ${units.radius} Z`;\n  }\n\n  static getSVGCenterSubMenuItemPath(subMenuUnits : ToolHubItemUnits):string{\n    return `M ${subMenuUnits.radius} ${subMenuUnits.radius} L ${subMenuUnits.leftX} ${subMenuUnits.leftY} A ${subMenuUnits.radius} ${subMenuUnits.radius} 0 0 1 ${subMenuUnits.rightX} ${subMenuUnits.rightY} L ${subMenuUnits.rightX} ${subMenuUnits.rightY} L ${subMenuUnits.radius} ${subMenuUnits.radius} Z`;\n  }\n\n}\n","import { Component, HostBinding, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ToolHubItem } from '../bimplus-tool-hub.interface';\r\n@Component({\r\n  selector: 'lib-tool-hub-item',\r\n  imports: [CommonModule],\r\n  templateUrl: './tool-hub-item.component.html',\r\n  styleUrl: '../bimplus-tool-hub.component.less'\r\n})\r\nexport class ToolHubItemComponent {\r\n  @Input()\r\n  item : ToolHubItem | null = null;\r\n  \r\n  @HostBinding('class.active')\r\n  @Input() \r\n  active : boolean = false;\r\n  \r\n  @HostBinding('class.enabled')\r\n  @Input() \r\n  isEnabled : boolean = true;\r\n  \r\n  @HostBinding('class.centermenu-button') centerMenuButtonClass: boolean = true;\r\n}\r\n","  <div *ngIf=\"item\" class=\"centermenu-button-icon dragger\"  [ngClass]=\"{\r\n    'disabled' : !isEnabled,\r\n    'enabled' : isEnabled,\r\n    'active' : active\r\n  }\"  [className]=\"item.iconClass\">\r\n  \r\n  <span class=\"centermenu-button-text\">{{item.text}}</span>\r\n</div>","import { Component, HostBinding, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ToolHubSubItem } from '../bimplus-tool-hub.interface';\r\n@Component({\r\n  selector: 'lib-tool-hub-sub-item',\r\n  imports: [CommonModule],\r\n  templateUrl: './tool-hub-sub-item.component.html',\r\n  styleUrl: '../bimplus-tool-hub.component.less'\r\n})\r\nexport class ToolHubSubItemComponent {\r\n  @Input() item : ToolHubSubItem | null = null;\r\n  \r\n  @HostBinding('class.active')\r\n  @Input() \r\n  active : boolean = false;\r\n  \r\n  @HostBinding('class.enabled')\r\n  @Input() \r\n  isEnabled : boolean = true;\r\n\r\n  @HostBinding('class.centermenu-button') centerMenuButtonClass: boolean = true;\r\n  @HostBinding('class.center-sub-menu-button') centerSubMenuButtonClass: boolean = true;\r\n}\r\n","<div\r\n  *ngIf=\"item\"\r\n  class=\"center-sub-menu-button-icon\"\r\n  [ngClass]=\"{\r\n    disabled: !isEnabled,\r\n    enabled: isEnabled,\r\n    active: item.type !== 'separator' && active\r\n  }\"\r\n  [className]=\"item.iconClass\"\r\n>\r\n  <span class=\"centermenu-button-text\">{{ item.text }}</span>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output, ViewEncapsulation, booleanAttribute, ElementRef, OnInit, AfterViewInit  } from '@angular/core';\r\nimport { BimplusLocalizedWidgetComponent } from \"./../bimplus-localized-widget/bimplus-localized-widget.component\"\r\nimport { TranslateService, TranslateModule } from '@ngx-translate/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { SVGGenerator } from './svg-generator';\r\nimport { ToolHubItemComponent } from './tool-hub-item/tool-hub-item.component';\r\nimport { ToolHubSubItemComponent } from './tool-hub-sub-item/tool-hub-sub-item.component';\r\nimport { DraggableDirective } from '../../directives/draggable.directive'\r\nimport { ToolHubItem, ToolHubSubItem, ToolHubVisualSettings, ToolHubItemUnits, ToolHubItemStates } from './bimplus-tool-hub.interface';\r\nimport { LayoutManagerService } from '../../services/layout-manager.service';\r\nimport { ResizeObserverService } from '../../services/resize-observer.service';\r\n//import { fireEvent } from '../../utils/utils';\r\n\r\nfunction createDefaultVisualSettings(): ToolHubVisualSettings {\r\n  const settings: ToolHubVisualSettings = {\r\n    subMenuStartAngle: 40,\r\n    subMenuEndAngle: 140,\r\n    svgRadiusInner: 5.75,\r\n    svgRadius: 10.25,\r\n    subMenuCenter: [17.25, 17.5],\r\n    subMenuRadius: 15.5,\r\n    subMenuWidth: 52,\r\n    deadZoneCenter: [17, 18],\r\n    deadZoneWidth: 140,\r\n    deadZoneRadius: 22,\r\n    deadZoneStartAngle: 35,\r\n    deadZoneEndAngle: 145\r\n  }\r\n  return settings;\r\n}\r\n\r\n// Use when implementing embedded mode\r\n// function createEmbeddedSettings() : ToolHubVisualSettings{\r\n//   const settings : ToolHubVisualSettings = {\r\n//     subMenuStartAngle : 40,\r\n//     subMenuEndAngle : 140,\r\n//     svgRadiusInner : 4,\r\n//     svgRadius : 7.25,\r\n//     subMenuCenter : [17.25, 17.3],\r\n//     subMenuRadius : 16.2,\r\n//     subMenuWidth : 62,\r\n//     deadZoneCenter : [16.5, 16],\r\n//     deadZoneWidth : 120,\r\n//     deadZoneRadius : 18,\r\n//     deadZoneStartAngle : 35,\r\n//     deadZoneEndAngle : 145\r\n//   }\r\n//   return settings;\r\n// }\r\n\r\nfunction createDefaultItems(): Array<ToolHubItem> {\r\n  const items: Array<ToolHubItem> = [\r\n    //--- create task ---------------------------------------------------\r\n    {\r\n      buttonId: 'cmButCreateTask',\r\n      iconClass: 'ui-icon-create-task',\r\n      text: '_Create_issue_center_menu_tooltip',\r\n      tooltip: '_Create_issue_center_menu_tooltip',\r\n      tooltipDisabled: '_Create_issue_center_menu_tooltip',\r\n    },\r\n\r\n    //--- quantity takeoff ---------------------------------------------------\r\n    {\r\n      buttonId: 'cmButQuantityTakeOff',\r\n      iconClass: 'ui-icon-quantity-take-off',\r\n      text: '_Quantity_take_Off_center_menu_tooltip',\r\n      tooltip: '_Quantity_take_Off_center_menu_tooltip',\r\n      tooltipDisabled: '_Quantity_take_Off_center_menu_tooltip',\r\n    },\r\n\r\n    //--- markup ---------------------------------------------------\r\n    {\r\n      buttonId: 'cmButMarkup',\r\n      iconClass: 'ui-icon-markup',\r\n      text: '_Markups_center_menu_tooltip',\r\n      tooltip: '_Markups_center_menu_tooltip',\r\n      tooltipDisabled: '_Markups_center_menu_tooltip',\r\n    },\r\n\r\n    //--- section ---------------------------------------------------\r\n    {\r\n      buttonId: 'cmButSection',\r\n      iconClass: 'ui-icon-section',\r\n      text: '_Sectioning_center_menu_tooltip',\r\n      tooltip: '_Sectioning_center_menu_tooltip',\r\n      tooltipDisabled: '_Sectioning_center_menu_tooltip',\r\n    },\r\n\r\n    //--- hide ---------------------------------------------------\r\n    {\r\n      buttonId: 'cmButObjTranspMenu',\r\n      iconClass: 'ui-icon-obj-transp',\r\n      text: '_Hide_objects_center_menu_tooltip',\r\n      tooltip: '_Hide_objects_center_menu_tooltip',\r\n      tooltipDisabled: '_Hide_objects_center_menu_tooltip',\r\n    },\r\n\r\n    //--- isolate ---------------------------------------------------\r\n    {\r\n      buttonId: 'cmButObjSel',\r\n      iconClass: 'ui-icon-obj-select',\r\n      text: '_Isolate_objects_center_menu_tooltip',\r\n      tooltip: '_Isolate_objects_center_menu_tooltip',\r\n      tooltipDisabled: '_Isolate_objects_center_menu_tooltip',\r\n    },\r\n\r\n    //--- navigation map ---------------------------------------------------\r\n    {\r\n      buttonId: 'cmButNavigationMap',\r\n      iconClass: 'ui-icon-navigation-map',\r\n      text: '_Navigation_nap_center_menu_tooltip',\r\n      tooltip: '_Navigation_nap_center_menu_tooltip',\r\n      tooltipDisabled: '_Navigation_nap_center_menu_tooltip',\r\n    },\r\n\r\n    //--- fullscreen ----------------------------------------------\r\n    {\r\n      buttonId: 'cmButFullScreen',\r\n      iconClass: 'ui-icon-fullscreen',\r\n      text: '_Fullscreen_node_center_menu_tooltip',\r\n      tooltip: '_Fullscreen_node_center_menu_tooltip',\r\n      tooltipDisabled: '_Fullscreen_node_center_menu_tooltip',\r\n    },\r\n\r\n    //--- project navigator ---------------------------------------\r\n    {\r\n      buttonId: 'cmButProjectNavigator',\r\n      iconClass: 'ui-icon-project-navigator',\r\n      text: '_Project_navigator_center_menu_tooltip',\r\n      tooltip: '_Project_navigator_center_menu_tooltip',\r\n      tooltipDisabled: '_Project_navigator_center_menu_tooltip',\r\n    },\r\n\r\n    //--- reset ---------------------------------------------------\r\n    {\r\n      iconClass: 'ui-icon-obj-reset',\r\n      buttonId: 'cmButResetObj',\r\n      text: '_Reset_viewport_center_menu_tooltip',\r\n      tooltip: '_Reset_viewport_center_menu_tooltip',\r\n      tooltipDisabled: '_Reset_viewport_center_menu_tooltip',\r\n    },\r\n\r\n    //--- view ---------------------------------------------------\r\n    {\r\n      buttonId: 'cmButResetVp',\r\n      iconClass: 'ui-icon-reset-vp',\r\n      text: '_Select_view_center_menu_tooltip',\r\n      tooltip: '_Select_view_center_menu_tooltip',\r\n      tooltipDisabled: '_Select_view_center_menu_tooltip',\r\n      subMenuId: 'cmb-view-submenu',\r\n      subItems: [\r\n        //--- Front View ---------------------------------------------------\r\n        {\r\n          buttonId: 'cmButFrontView',\r\n          type: 'button',\r\n          iconClass: 'ui-icon-front-view',\r\n          text: '_Front_view_center_menu_tooltip',\r\n          tooltip: '_Front_view_center_menu_tooltip',\r\n          tooltipDisabled: '_Front_view_center_menu_tooltip',\r\n          actionClick: 'centerMenuFrontViewClick',\r\n        },\r\n        //--- Top View ---------------------------------------------------\r\n        {\r\n          buttonId: 'cmButTopView',\r\n          type: 'button',\r\n          iconClass: 'ui-icon-top-view',\r\n          text: '_Top_view_center_menu_tooltip',\r\n          tooltip: '_Top_view_center_menu_tooltip',\r\n          tooltipDisabled: '_Top_view_center_menu_tooltip',\r\n          actionClick: 'centerMenuTopViewClick',\r\n        },\r\n        //--- Side View ---------------------------------------------------\r\n        {\r\n          buttonId: 'cmButSideView',\r\n          type: 'button',\r\n          iconClass: 'ui-icon-side-view',\r\n          text: '_Side_view_center_menu_tooltip',\r\n          tooltip: '_Side_view_center_menu_tooltip',\r\n          tooltipDisabled: '_Side_view_center_menu_tooltip',\r\n          actionClick: 'centerMenuSideViewClick',\r\n        },\r\n        //--- Perspective View ---------------------------------------------------\r\n        {\r\n          buttonId: 'cmButPerspectiveView',\r\n          type: 'button',\r\n          iconClass: 'ui-icon-perspective-view',\r\n          text: '_Perspective_view_center_menu_tooltip',\r\n          tooltip: '_Perspective_view_center_menu_tooltip',\r\n          tooltipDisabled: '_Perspective_view_center_menu_tooltip',\r\n          actionClick: 'centerMenuPerspectiveViewClick',\r\n        },\r\n        //--- Separator ---------------------------------------------------\r\n        {\r\n          buttonId: 'toolhubSubmenuSeparatorId1',\r\n          type: 'separator',\r\n          iconClass: 'center-sub-menu-button-icon toolhub-submenu-separator',\r\n          text: '',\r\n          tooltip: '',\r\n          tooltipDisabled: '',\r\n          actionClick: '',\r\n        },\r\n        //--- Toggle button perspective/orthogonal projection --------------------\r\n        {\r\n          buttonId: 'cmButToggleProjection',\r\n          type: 'button',\r\n          iconClass: 'ui-icon-orthographic-camera-projection',\r\n          text: '_Orthographic_projection_center_menu_tooltip',\r\n          tooltip: '_Orthographic_projection_center_menu_tooltip',\r\n          tooltipDisabled: '_Orthographic_projection_center_menu_tooltip',\r\n          actionClick: 'centerMenuToggleProjection',\r\n        },\r\n      ]\r\n    }\r\n  ]\r\n\r\n  // Set all tool hub items states to inactive and disabled. Host App must define states\r\n  items.forEach(item => { item.active = false; item.disabled = true })\r\n\r\n  return items;\r\n}\r\n\r\nconst DEFAULT_POSITION_LEFT = 350;\r\nconst DEFAULT_POSITION_TOP  = 670;\r\n@Component({\r\n  selector: 'lib-bimplus-tool-hub',\r\n  imports: [\r\n    TranslateModule,\r\n    CommonModule,\r\n    ToolHubItemComponent,\r\n    ToolHubSubItemComponent,\r\n    DraggableDirective\r\n  ],\r\n  providers: [TranslateService],\r\n  templateUrl: './bimplus-tool-hub.component.html',\r\n  styleUrl: './bimplus-tool-hub.component.less',\r\n  encapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class BimplusToolHubComponent extends BimplusLocalizedWidgetComponent implements OnInit,AfterViewInit {\r\n  constructor(translateService: TranslateService,\r\n              private layoutManagerService: LayoutManagerService,\r\n              private resizeObserverService:ResizeObserverService,\r\n              private element: ElementRef) {\r\n    super(translateService);\r\n           \r\n    this.items = createDefaultItems();\r\n    this._visualSettings = createDefaultVisualSettings();\r\n    this._units = this.calculateCurrentMenuItemUnits();\r\n    this._subMenuUnits = this.calculateCurrentSubMenuItemUnits();\r\n    this._annularSector = SVGGenerator.generateAnnularSector(this._visualSettings);\r\n    this._annularSectorBorder = SVGGenerator.generateAnnularSectorBorder(this._visualSettings);\r\n    this._deadZoneAnnularSector = SVGGenerator.generateDeadZoneAnnularSector(this._visualSettings);\r\n\r\n  }\r\n\r\n  // #region public fields\r\n  \r\n  get itemStates(): Array<ToolHubItemStates> {\r\n    return this._itemStates;\r\n  }\r\n  @Input() set itemStates(value: Array<ToolHubItemStates>) {\r\n    this._itemStates = value;\r\n    this.setItemStates(this._itemStates);\r\n  }\r\n\r\n  setItemStates(itemStates: Array<ToolHubItemStates>) {\r\n    for (const itemState of itemStates) {\r\n      const item = this._items.find(item => item.buttonId === itemState.buttonId);\r\n      if (item) {\r\n        if (itemState.active != undefined) {\r\n          item.active = itemState.active;\r\n        }\r\n        if (itemState.disabled !== undefined) {\r\n          item.disabled = itemState.disabled;\r\n        }\r\n      }\r\n    }\r\n\r\n    this._updateActivationState();\r\n  }\r\n\r\n\r\n  get items(): Array<ToolHubItem> {\r\n    return this._items;\r\n  }\r\n  @Input() set items(value: Array<ToolHubItem>) {\r\n    this._items = value;\r\n\r\n    const buttonsLength = (this._items?.length) > 0 ? this._items.length : 1;\r\n    const rootStyle = document?.documentElement?.style;\r\n    if (rootStyle) {\r\n      const menuItems = rootStyle.getPropertyValue(\"--menu-items\");\r\n      if (parseInt(menuItems) !== buttonsLength) {\r\n        rootStyle.setProperty(\"--menu-items\", buttonsLength.toString());\r\n      }\r\n    }\r\n\r\n    // Transfer disabled states, which can defined by host app\r\n    this.setItemStates(this._itemStates);\r\n  }\r\n\r\n  get activeSubItems(): Array<ToolHubSubItem> | null {\r\n    return this._activeSubItems;\r\n  }\r\n\r\n  get isCollapsed(): boolean {\r\n    return this._isCollapsed;\r\n  }\r\n  @Input({ transform: booleanAttribute })\r\n  set isCollapsed(value: boolean) {\r\n    this._isCollapsed = value;\r\n  }\r\n\r\n  get isPerspectiveProjection(): boolean {\r\n    return this._isPerspectiveProjection;\r\n  }\r\n  @Input({ transform: booleanAttribute })\r\n  set isPerspectiveProjection(value: boolean) {\r\n    this._isPerspectiveProjection = value;\r\n  }\r\n\r\n  get units(): ToolHubItemUnits {\r\n    return this._units;\r\n  }\r\n\r\n  get subMenuUnits(): ToolHubItemUnits {\r\n    return this._subMenuUnits;\r\n  }\r\n\r\n  get annularSector(): string {\r\n    return this._annularSector;\r\n  }\r\n\r\n  get annularSectorBorder(): string {\r\n    return this._annularSectorBorder;\r\n  }\r\n\r\n  get deadZoneAnnularSector(): string {\r\n    return this._deadZoneAnnularSector;\r\n  }\r\n\r\n  @Input({ transform: booleanAttribute }) isEmbedded: boolean = false;\r\n  @Input({ transform: booleanAttribute }) isFocused: boolean = false;\r\n  @Input({ transform: booleanAttribute }) isActive: boolean = true;\r\n  @Output() itemClicked = new EventEmitter<string>();\r\n  @Output() subItemClicked = new EventEmitter<string>();\r\n  \r\n  // Define event handler for reusing draggable also from resize parent \r\n  //@Output() resizedragging = new EventEmitter<[number,number]>();\r\n\r\n  private componentId = 'center-menu-fp-id';\r\n  private subscription: Subscription | null = null;  // Initialize to null\r\n\r\n  ngOnInit():void{   \r\n    this.layoutManagerService.registerObject(this.element,this.componentId,'#center-menu-fp-id',true,DEFAULT_POSITION_LEFT,DEFAULT_POSITION_TOP);\r\n    this.layoutManagerService.registeredItems$.subscribe(items => {\r\n      const layoutManagerItem = items.find(item => item.id === this.componentId);\r\n      this.isCollapsed = Boolean(layoutManagerItem?.isCollapsed);      \r\n    });\r\n    \r\n  }\r\n  \r\n  ngAfterViewInit():void{\r\n   // if the component wants to be registered in layout manager system\r\n   // Subscribe to the observable\r\n    this.subscription = this.resizeObserverService.parentAppRect$.subscribe(value => {\r\n      this.handleParentAppRectSizeChange(value);\r\n    });\r\n  }\r\n  \r\n  // #endregion public fields\r\n \r\n  // #region public methods\r\n  public getSVGViewBox(): string {\r\n    return SVGGenerator.getSVGViewBox(this._units);\r\n  }\r\n\r\n  public getSVGCenterMenuPath(): string {\r\n    return SVGGenerator.getSVGCenterMenuPath(this._units);\r\n  }\r\n\r\n  public getSVGCenterMenuItemPath(): string {\r\n    return SVGGenerator.getSVGCenterMenuItemPath(this._units);\r\n  }\r\n\r\n  public getSVGCenterSubMenuItemPath(): string {\r\n    return SVGGenerator.getSVGCenterSubMenuItemPath(this._subMenuUnits);\r\n  }\r\n\r\n  public toggleMenu() {\r\n    this.layoutManagerService.updateCollapsed(!this.isCollapsed,this.componentId);\r\n    setTimeout(()=>{\r\n      this.layoutManagerService.checkPosition('center-menu-fp-id',this.getSelector(),undefined,0,0,true);      \r\n      })\r\n  }\r\n\r\n  findToolHubItemById(id: string): ToolHubItem | undefined {\r\n    return this._items.find(x => x.buttonId === id);\r\n  }\r\n\r\n  clickToolHubItem(action: string) {\r\n    const item = this.findToolHubItemById(action);\r\n    if (!item || item?.disabled) {\r\n      return;\r\n    }\r\n\r\n    this.itemClicked.emit(action);\r\n  }\r\n\r\n  clickToolHubSubItem(action: string) {\r\n    if (!this._activeSubItems) {\r\n      return;\r\n    }\r\n\r\n    const item = this._activeSubItems.find(x => x.buttonId === action);\r\n    if (!item) {\r\n      return;\r\n    }\r\n\r\n    this.subItemClicked.emit(action);\r\n    this.closeActiveSubItemsView();\r\n  }\r\n\r\n  toggleToolHubItemActive(buttonId: string) {\r\n    const item = this.findToolHubItemById(buttonId);\r\n    if (!item || item.disabled) {\r\n      return;\r\n    }\r\n\r\n    item.active = !item.active;\r\n\r\n    this._updateActivationState();\r\n  }\r\n\r\n  toggleSubItemsView(buttonId: string) {\r\n    const item = this.findToolHubItemById(buttonId);\r\n    if (!item || item.disabled || !item.subItems) {\r\n      return;\r\n    }\r\n\r\n    item.active = !item.active;\r\n    if (item.active) {\r\n      this._activeSubItemsView = item;\r\n      this._activeSubItems = item.subItems;\r\n    } else {\r\n      this._activeSubItemsView = null;\r\n      this._activeSubItems = null;\r\n    }\r\n  }\r\n\r\n  toggleCameraProjection(buttonId: string) {\r\n    if (!this._activeSubItems) {\r\n      return;\r\n    }\r\n\r\n    const item = this._activeSubItems.find(x => x.buttonId === buttonId);\r\n    if (!item) {\r\n      return;\r\n    }\r\n\r\n    this.isPerspectiveProjection = !this.isPerspectiveProjection;\r\n\r\n    item.iconClass = this.isPerspectiveProjection ? 'ui-icon-orthographic-camera-projection' : 'ui-icon-perspective-camera-projection';\r\n    item.text = this.isPerspectiveProjection ? '_Orthographic_projection_center_menu_tooltip' : '_Perspective_projection_center_menu_tooltip';\r\n    item.tooltip = this.isPerspectiveProjection ? '_Orthographic_projection_center_menu_tooltip' : '_Perspective_projection_center_menu_tooltip';\r\n    item.tooltipDisabled = this.isPerspectiveProjection ? '_Orthographic_projection_center_menu_tooltip' : '_Perspective_projection_center_menu_tooltip';\r\n  }\r\n\r\n  closeActiveSubItemsView() {\r\n    if (this._activeSubItemsView) {\r\n      this._activeSubItemsView.active = false;\r\n      this._activeSubItemsView = null;\r\n    }\r\n    this._activeSubItems = null;\r\n  }\r\n\r\n  setHoveredState(element: string, hovered: boolean) {\r\n    const index = this._hoveredElements.indexOf(element);\r\n    const storedCountHoverd = this._hoveredElements.length;\r\n\r\n    if (index >= 0 && !hovered) {\r\n      this._hoveredElements.splice(index, 1);\r\n    }\r\n\r\n    if (index < 0 && hovered) {\r\n      this._hoveredElements.push(element);\r\n    }\r\n\r\n    if (storedCountHoverd > 0 && this._hoveredElements.length === 0) {\r\n\r\n      // If hovered elements count reaches zero, check again a bit delayed. If nothing hovered at that time, close submenu\r\n      setInterval(() => {\r\n        if (this._hoveredElements.length === 0) {\r\n          this.closeActiveSubItemsView();\r\n        }\r\n      }, 1000);\r\n    }\r\n  }\r\n\r\n  private getSelector():string{\r\n    return this.isCollapsed ? '#center-menu-controller':'.center-menu-fp';\r\n  }\r\n\r\n  dragElement(event: [number, number]): void {\r\n    const deltaX1 = event[0];\r\n    const deltaY1 = event[1];        \r\n    this.layoutManagerService.checkPosition('center-menu-fp-id',this.getSelector(),undefined,deltaX1,deltaY1)    \r\n  }\r\n\r\n  onDragEnd(){\r\n    this.layoutManagerService.handleDragEnd('center-menu-fp-id');\r\n  }\r\n\r\n  // #endregion public methods\r\n\r\n  // #region private fields\r\n  private _isCollapsed: boolean = false;\r\n  private _itemStates: Array<ToolHubItemStates> = Array<ToolHubItemStates>();\r\n  private _items: Array<ToolHubItem> = Array<ToolHubItem>();\r\n  private _activeSubItemsView: ToolHubItem | null = null;\r\n  private _activeSubItems: Array<ToolHubSubItem> | null = null;\r\n  private _isPerspectiveProjection = true; // flag about perspective or orthographic camera projection\r\n  private _visualSettings: ToolHubVisualSettings;\r\n  private _units: ToolHubItemUnits;\r\n  private _subMenuUnits: ToolHubItemUnits;\r\n  private _annularSector: string;\r\n  private _annularSectorBorder: string;\r\n  private _deadZoneAnnularSector: string;\r\n  private _hoveredElements: Array<string> = Array<string>();\r\n  // #endregion private fields\r\n\r\n  // #region private methods\r\n  private calculateCurrentMenuItemUnits(): ToolHubItemUnits {\r\n    return SVGGenerator.drawMenuItemSvg(this._visualSettings.svgRadius, this._visualSettings.svgRadiusInner, this._items.length, this.isEmbedded);\r\n  }\r\n\r\n  private calculateCurrentSubMenuItemUnits(): ToolHubItemUnits {\r\n    return SVGGenerator.drawMenuItemSvg(this._visualSettings.svgRadius, this._visualSettings.svgRadiusInner, 20, this.isEmbedded);\r\n  }\r\n\r\n  private handleParentAppRectSizeChange(parentRect:DOMRect | undefined):void{\r\n    this.layoutManagerService.checkPosition(this.componentId,this.getSelector(),parentRect,0,0,true);    \r\n  }\r\n\r\n  private _oneOrMoreItemsActive(){\r\n    for(const item of this.items){\r\n      if(item.active === true)\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  private _updateActivationState(){\r\n    if(this._oneOrMoreItemsActive()){\r\n      this.isActive = true;\r\n    }else{\r\n      this.isActive = false;\r\n    }\r\n  }\r\n  // #region private methods\r\n}\r\n","<div class=\"center-menu\">\r\n  <div\r\n    class=\"center-menu-fp\"\r\n    id=\"center-menu-fp-id\"\r\n    [ngClass]=\"activeSubItems ? 'submenu-active' : ''\"\r\n  >\r\n    <div\r\n      libDraggable\r\n      id=\"center-menu-controller\"\r\n      class=\"center-menu-controller dragger\"\r\n      data-test=\"toolhub_controller\"\r\n      [ngClass]=\"{\r\n        opened: !isCollapsed,\r\n        active: isActive\r\n      }\"\r\n      [title]=\"\r\n        isCollapsed\r\n          ? ('_Show_toolhub_tooltip' | translate)\r\n          : ('_Minimize_toolhub_tooltip' | translate)\r\n      \"\r\n      (clicked)=\"toggleMenu()\"\r\n      (dragging)=\"dragElement($event)\"\r\n      (dragEnd) =\"onDragEnd()\"\r\n    ></div>\r\n    <div\r\n      class=\"center-menu-circle-border-inner\"\r\n      [ngClass]=\"isCollapsed ? 'hidden' : ''\"\r\n    ></div>\r\n    <div\r\n      class=\"center-menu-circle-border-outer\"\r\n      [ngClass]=\"isCollapsed ? 'hidden' : ''\"\r\n      (mouseleave)=\"setHoveredState('menuCircleBorderOuter', false)\"\r\n      (mouseenter)=\"setHoveredState('menuCircleBorderOuter', true)\"\r\n    ></div>\r\n    <div\r\n      libDraggable\r\n      class=\"center-menu-circle\"\r\n      [ngClass]=\"isCollapsed ? 'hidden' : ''\"\r\n      (mouseleave)=\"setHoveredState('menuCircle', false)\"\r\n      (mouseenter)=\"setHoveredState('menuCircle', true)\"\r\n      (dragging)=\"dragElement($event)\"\r\n    >\r\n      <lib-tool-hub-item\r\n        libDraggable\r\n        *ngFor=\"let item of items\"\r\n        [attr.data-test]=\"'toolhub_item_' + item.buttonId\"\r\n        [title]=\"item.tooltip | translate\"\r\n        [item]=\"item\"\r\n        [active]=\"!!item.active\"\r\n        [isEnabled]=\"!item.disabled\"\r\n        (clicked)=\"clickToolHubItem(item.buttonId)\"\r\n      ></lib-tool-hub-item>\r\n\r\n      <svg\r\n        class=\"centermenu-button-svg\"\r\n        [attr.viewBox]=\"getSVGViewBox()\"\r\n        fill=\"none\"\r\n      >\r\n        <clipPath id=\"svgCenterMenu\" clipPathUnits=\"objectBoundingBox\">\r\n          <path [attr.d]=\"getSVGCenterMenuPath()\" fill=\"white\" />\r\n        </clipPath>\r\n        <clipPath id=\"svgCenterMenuItem\" clipPathUnits=\"objectBoundingBox\">\r\n          <path [attr.d]=\"getSVGCenterMenuItemPath()\" fill=\"white\" />\r\n        </clipPath>\r\n        <clipPath id=\"svgCenterSubMenuItem\" clipPathUnits=\"objectBoundingBox\">\r\n          <path [attr.d]=\"getSVGCenterSubMenuItemPath()\" fill=\"white\" />\r\n        </clipPath>\r\n        <clipPath id=\"svgCenterMenuSubMenu\" clipPathUnits=\"objectBoundingBox\">\r\n          <path [attr.d]=\"annularSector\" fill=\"none\" />\r\n        </clipPath>\r\n        <clipPath\r\n          id=\"svgCenterMenuSubMenuBorder\"\r\n          clipPathUnits=\"objectBoundingBox\"\r\n        >\r\n          <path [attr.d]=\"annularSectorBorder\" fill=\"none\" />\r\n        </clipPath>\r\n        <clipPath\r\n          id=\"svgCenterMenuSubMenuDeadZone\"\r\n          clipPathUnits=\"objectBoundingBox\"\r\n        >\r\n          <path [attr.d]=\"deadZoneAnnularSector\" fill=\"none\" />\r\n        </clipPath>\r\n      </svg>\r\n    </div>\r\n\r\n    @if (activeSubItems) {\r\n    <div\r\n      class=\"center-menu-sub-menu-border\"\r\n      [ngClass]=\"isCollapsed ? 'hidden' : ''\"\r\n      (mouseleave)=\"setHoveredState('submenuBorder', false)\"\r\n      (mouseenter)=\"setHoveredState('submenuBorder', true)\"\r\n    ></div>\r\n    <div\r\n      class=\"center-menu-sub-menu\"\r\n      [ngClass]=\"isCollapsed ? 'hidden' : ''\"\r\n      (mouseleave)=\"setHoveredState('submenu', false)\"\r\n      (mouseenter)=\"setHoveredState('submenu', true)\"\r\n    >\r\n      <ng-container *ngFor=\"let item of activeSubItems\">\r\n        <lib-tool-hub-sub-item\r\n          *ngIf=\"item.type === 'button'\"\r\n          [attr.data-test]=\"'toolhub_subitem_' + item.buttonId\"\r\n          [title]=\"item.tooltip | translate\"\r\n          [item]=\"item\"\r\n          (click)=\"clickToolHubSubItem(item.buttonId)\"\r\n          (keypress)=\"clickToolHubSubItem(item.buttonId)\"\r\n        ></lib-tool-hub-sub-item>\r\n        <!-- this item is added as 6th but is moved back in less file to 5th position -->\r\n        <lib-tool-hub-sub-item\r\n          *ngIf=\"item.type === 'separator'\"\r\n          [attr.data-test]=\"'toolhub_subitem_' + item.buttonId\"\r\n          [item]=\"item\"\r\n        ></lib-tool-hub-sub-item>\r\n      </ng-container>\r\n    </div>\r\n    <div\r\n      class=\"center-menu-sub-menu-dead-zone\"\r\n      [ngClass]=\"isCollapsed ? 'hidden' : ''\"\r\n      (mouseleave)=\"setHoveredState('deadZone', false)\"\r\n      (mouseenter)=\"setHoveredState('deadZone', true)\"\r\n    ></div>\r\n    }\r\n  </div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\nimport { Component, ViewEncapsulation, Input, Output, EventEmitter, booleanAttribute,OnChanges, SimpleChanges  } from '@angular/core';\nimport {TranslateService, TranslateModule} from '@ngx-translate/core';\nimport {BimplusLocalizedWidgetComponent} from \"../bimplus-localized-widget/bimplus-localized-widget.component\"\nimport { fireEvent } from '../../utils/utils';\n\nexport interface MenuItem {\n  id: string,\n  action: string,\n  class: string,\n  textId: string,\n  type: string,\n  checkState: string,\n  url: string,\n  _url?: () => string; // Function that takes no arguments and returns a string\n  textClass: string,\n  queryParams: string\n}\nexport interface MenuItemEventData {\n  index: number,\n  action: string\n}\nexport interface LangItem {\n  symbol: string,\n  text: string,\n  lCode: string | undefined\n}\n\n@Component({\n  selector: 'lib-bimplus-user-menu',\n  imports: [CommonModule, TranslateModule],\n  providers: [TranslateService],\n  templateUrl: './bimplus-user-menu.component.html',\n  styleUrl: './bimplus-user-menu.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\n\nexport class BimplusUserMenuComponent extends BimplusLocalizedWidgetComponent implements OnChanges{\n  constructor(translateService: TranslateService){\n    super(translateService)\n  }\n\n  _languagesList: LangItem[] = [\n    { symbol: \"cs\", text: \"Čeština\", lCode: \"3\" },\n    { symbol: \"de\", text: \"Deutsch\", lCode: \"1\" },\n    { symbol: \"en\", text: \"English (UK)\", lCode: \"0\" },\n    { symbol: \"us\", text: \"English (US)\", lCode: undefined },\n    { symbol: \"es\", text: \"Español\", lCode: \"18\" },\n    { symbol: \"fr\", text: \"Français\", lCode: \"4\" },\n    { symbol: \"it\", text: \"Italiano\", lCode: \"2\" },\n    { symbol: \"ru\", text: \"Русский\", lCode: \"14\" },\n    { symbol: \"ro\", text: \"Romana\", lCode: undefined },\n    { symbol: \"tr\", text: \"Türkçe\", lCode: undefined }\n  ];\n\n  /**--------------------------------------------------------------------------\n  * States\n  --------------------------------------------------------------------------*/\n  _menuOpened = false;\n  _languagesMenuOpened = false;\n\n  /**--------------------------------------------------------------------------\n  * properties\n  --------------------------------------------------------------------------*/\n  @Input({ transform: booleanAttribute }) accountSettingsVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) removeConnectedAppsVisible : boolean = false;\n  @Input({ transform: booleanAttribute }) userGuideVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) supportVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) forumVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) releaseNotesVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) submenuVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) clearCacheVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) dividerLoggedInVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) logoutVisible : boolean = true;\n  @Input({ transform: booleanAttribute }) isEmbedded : boolean = false;\n  @Input({ transform: booleanAttribute }) isTouch : boolean = false;\n  @Input({ transform: booleanAttribute }) allowRcaItem : boolean = false;\n\n  /**--------------------------------------------------------------------------\n  * properties\n  --------------------------------------------------------------------------*/\n  @Input() buttonTitle : string = '';\n  @Input() userName : string = 'Unknown user';\n  @Input() userPhotoUrl : string = '';\n  @Input() userGuideLinkUrl : string = 'https://doc.allplan.com/display/BIMPLUSMANUAL/Bimplus+Benutzerhandbuch';\n  @Input() supportLinkUrl : string = 'https://connect2.allplan.com/services/support';\n  @Input() forumLinkUrl : string = 'https://connect.allplan.com/de/forum/themen/bim-benutzer-forum.ct';\n  /**--------------------------------------------------------------------------\n  * Component events\n  --------------------------------------------------------------------------*/\n  @Output() bimplusUserMenuClicked = new EventEmitter<MenuItemEventData>();\n  @Output() bimplusLanguageSelected = new EventEmitter<string>();\n\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['localizedStrings']) {\n      this._localizedStrings.set(changes['localizedStrings'].currentValue);\n    }\n  }\n\n  /**--------------------------------------------------------------------------\n  * List of menu items\n  * Note : action is used to identify action which should be executed\n  --------------------------------------------------------------------------*/\n  _menuItemsList: MenuItem[] = [\n    { id:\"accountSettingsPage\", action:\"accountSettings\", class: \"icon-account-settings\", textId: \"_Edit_profile\", type: \"\", checkState: \"\", textClass: \"\", queryParams: \"\", url: \"\"},\n    { id:\"removeConnectedApps\", action:\"removeConnectedApps\", checkState: \"allowRcaItem\", class: \"icon-rca\", textClass: \"text-capitalized\", textId: \"_Remove_connected_apps\", type: \"\", url: \"\", queryParams: \"\"},\n    { id:\"userGuideLink\", action:\"userGuide\", class: \"icon-user-guide\", textId: \"_UserGuide\", get url() { return this._url?.() ?? ''; }, _url: () => this.userGuideLinkUrl, type: \"\", checkState: \"\", textClass: \"\", queryParams: \"\"},\n    { id:\"supportLink\", action:\"support\", class: \"icon-support\", textId: \"_Support\", get url() { return this._url?.() ?? ''; }, _url: () => this.supportLinkUrl, queryParams: \"no_cache=1\", type: \"\", checkState: \"\", textClass: \"\"},\n    { id:\"forumLink\", action:\"forum\", class: \"icon-forum\", textId: \"_Forum\", get url() { return this._url?.() ?? ''; }, _url: () => this.forumLinkUrl, type: \"\", checkState: \"\", textClass: \"\", queryParams: \"\"},\n    { id:\"releaseNotesLink\", action:\"releaseNotes\", class: \"icon-release-notes\", textId: \"_Release_notes\", type: \"\", checkState: \"\", textClass: \"\", queryParams: \"\", url: \"\"},\n    { id:\"languagesSubmenu\", action:\"submenu\", class: \"icon-languages\", textId: \"_Languages\", type: \"\", checkState: \"\", url: \"\", textClass: \"\", queryParams: \"\"},\n    { id:\"clearCache\", action:\"clearCache\", class: \"icon-clear-cache\", textId: \"_Clear cache\", type: \"\", checkState: \"\", url: \"\", textClass: \"\", queryParams: \"\"},\n    { id:\"dividerLoggedIn\", type: \"divider\", action: \"\", class: \"\", textId: \"\", checkState: \"\", url: \"\", textClass: \"\", queryParams: \"\"},\n    { id:\"logout\", action:\"logout\", class: \"icon-log-out\", textId: \"_Logout\", type: \"\", checkState: \"\", url: \"\", textClass: \"\", queryParams: \"\"}\n  ];\n\n  /**--------------------------------------------------------------------------\n  * Item clicked\n  --------------------------------------------------------------------------*/\n  _menuItemClicked( item: MenuItem, index : number ){\n    if (!item || item.type === 'divider') {\n      return;\n    }\n\n\n    if (item.action === 'submenu') {\n      this._toggleLanguagesSubmenuOpened();\n    }\n    else {\n      this._languagesMenuOpened = false;\n      this._menuOpened = false;\n      fireEvent(this, \"bimplusUserMenuClicked\", { index, action: item.action ? item.action : '' });\n    }\n  }\n\n  /**--------------------------------------------------------------------------\n  * language submenu item clicked\n  --------------------------------------------------------------------------*/\n  _switchLanguage( language: string ){\n    this._languagesMenuOpened = false;\n    this._menuOpened = false;\n    fireEvent(this, \"bimplusLanguageSelected\", language);\n  }\n\n  /**--------------------------------------------------------------------------\n  * toggle menu open\n  --------------------------------------------------------------------------*/\n  _toggleOpened(){\n    this._menuOpened = !this._menuOpened;\n    if(!this._menuOpened) {\n      this._languagesMenuOpened = false;\n    }\n  }\n\n  /**--------------------------------------------------------------------------\n  * toggle language submenu open\n  --------------------------------------------------------------------------*/\n  _toggleLanguagesSubmenuOpened(){\n    if(!this._menuOpened) {\n      return;\n    }\n    this._languagesMenuOpened = !this._languagesMenuOpened;\n  }\n\n  /**--------------------------------------------------------------------------\n  * check if item is visible\n  --------------------------------------------------------------------------*/\n  _isHidden(item: MenuItem) {\n\n    if (item) {\n      return !this[(`${item.action ? item.action : item.id}Visible` as keyof BimplusUserMenuComponent)];\n    }\n\n    return false;\n  }\n\n  //--- add lang code and additional query params to supported urls\n  _buildUrl(item: MenuItem | undefined) {\n    let itemUrl = item?.url;\n    const actualLang = this._languagesList.find(lang=> lang.symbol === this.selectedLanguage);\n    const langCode = actualLang?.lCode;\n    const supportsLangCode = itemUrl?.endsWith?.('.ct') && langCode;\n    if (item?.queryParams || supportsLangCode) {\n      itemUrl = itemUrl + '?';\n      if (supportsLangCode) {\n        itemUrl = itemUrl + 'L=' + langCode;\n        if (item?.queryParams) {\n          itemUrl = itemUrl + '&';\n        }\n      }\n      if (item?.queryParams) {\n        itemUrl = itemUrl + item.queryParams;\n      }\n    }\n    return itemUrl;\n  }\n\n  _getMenuItems() {\n    const menuItemsListFiltered = this.isEmbedded ? this._menuItemsList.slice(0,-3) : this._menuItemsList;\n    return menuItemsListFiltered.map( (item) => {\n\n      if (this._isHidden(item) || (item.checkState && !this[(item.checkState as keyof BimplusUserMenuComponent)])) {\n        return;\n      }\n      return item;\n    });\n  }\n\n  _getLangId(lang: LangItem | undefined) {\n    return \"portalLanguage\" + lang?.symbol.charAt(0).toUpperCase() + lang?.symbol.slice(1);\n  }\n}\n","<div\n  [attr.key]=\"'bimcompOverlay'\"\n  class=\"bimcomp-overlay\"\n  [ngClass]=\"_menuOpened ? 'open' : ''\"\n  (click)=\"_toggleOpened()\"\n  (keypress)=\"_toggleOpened()\"\n></div>\n<div\n  [attr.key]=\"'userMenu'\"\n  class=\"dropdown\"\n  [ngClass]=\"_menuOpened ? 'open' : ''\"\n>\n  <div\n    class=\"dropdown-toggle\"\n    [title]=\"buttonTitle ? buttonTitle : ''\"\n    (click)=\"_toggleOpened()\"\n    (keypress)=\"_toggleOpened()\"\n  >\n    <img\n      class=\"user-photo\"\n      src=\"{{ userPhotoUrl ? userPhotoUrl : '' }}\"\n      alt=\"{{ buttonTitle ? buttonTitle : '' }}\"\n    />\n    <div class=\"user-name\">\n      @if (!isTouch) {\n      {{ userName }}\n      }\n    </div>\n    <span class=\"caret\"></span>\n  </div>\n  <ul class=\"bimcomp-dropdown-menu\" [ngClass]=\"_menuOpened ? 'open' : ''\">\n    <ng-container *ngFor=\"let item of _getMenuItems(); let i = index\">\n      <li\n        *ngIf=\"item\"\n        [attr.key]=\"item.id\"\n        [attr.role]=\"item.type === 'divider' ? 'separator' : ''\"\n        [ngClass]=\"{\n          divider: item.type === 'divider',\n          languageMenuItem: item.action === 'submenu',\n          'submenu-hidden':\n            (!item.url || item.url.slice(0, 2) === '#/') &&\n            item.action !== 'submenu'\n        }\"\n        (click)=\"_menuItemClicked(item, i)\"\n        (keypress)=\"_menuItemClicked(item, i)\"\n      >\n        @if (item.action === 'submenu') {\n        <div class=\"submenu arrow\"></div>\n        <div class=\"icon\" [ngClass]=\"item.class\"></div>\n        <span\n          class=\"menu-item-text\"\n          [ngClass]=\"item.textClass ? item.textClass : ''\"\n        >\n          {{ item.textId | translate }}\n        </span>\n        <div\n          class=\"languagesSubmenu\"\n          [ngClass]=\"_languagesMenuOpened ? 'open' : ''\"\n        >\n          <div class=\"languageSubmenuItems\">\n            <div\n              *ngFor=\"let lang of _languagesList\"\n              [attr.key]=\"_getLangId(lang)\"\n              id=\"{{ _getLangId(lang) }}\"\n              class=\"languageSubmenuItem\"\n              [ngClass]=\"\n                lang.symbol === this.selectedLanguage ? 'selected' : ''\n              \"\n              (click)=\"_switchLanguage(lang.symbol)\"\n              (keypress)=\"_switchLanguage(lang.symbol)\"\n            >\n              {{ lang.text }}\n            </div>\n          </div>\n        </div>\n        } @else if (!item.url || item.url.slice(0,2) === \"#/\") {\n        <div class=\"icon\" [ngClass]=\"item.class\"></div>\n        <span\n          class=\"menu-item-text\"\n          [ngClass]=\"item.textClass ? item.textClass : ''\"\n        >\n          {{ item.textId | translate }}\n        </span>\n        } @else if (!item.type || item.type !== \"divider\") {\n        <a\n          href=\"{{ _buildUrl(item) }}\"\n          rel=\"noopener\"\n          target=\"_blank\"\n          class=\"submenu-hidden\"\n        >\n          <div class=\"icon\" [ngClass]=\"item.class\"></div>\n          <span\n            class=\"menu-item-text\"\n            [ngClass]=\"item.textClass ? item.textClass : ''\"\n          >\n            {{ item.textId | translate }}\n          </span>\n        </a>\n        }\n      </li>\n    </ng-container>\n  </ul>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, ViewEncapsulation, Input, Output, EventEmitter, booleanAttribute } from '@angular/core';\nimport { fireEvent } from '../../utils/utils';\n\n@Component({\n  selector: 'lib-bimplus-zoom',\n  imports: [CommonModule],\n  templateUrl: './bimplus-zoom.component.html',\n  styleUrl: './bimplus-zoom.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusZoomComponent{\n  /**--------------------------------------------------------------------------\n  * List of available zoom\n  --------------------------------------------------------------------------*/\n  _zoomList = [\n    { symbol: \"100\", text: \"100%\"},\n    { symbol: \"105\", text: \"105%\"},\n    { symbol: \"110\", text: \"110%\"},\n    { symbol: \"115\", text: \"115%\"},\n    { symbol: \"120\", text: \"120%\"},\n    { symbol: \"125\", text: \"125%\"},\n    { symbol: \"130\", text: \"130%\"},\n    { symbol: \"135\", text: \"135%\"},\n    { symbol: \"140\", text: \"140%\"},\n    { symbol: \"145\", text: \"145%\"},\n    { symbol: \"150\", text: \"150%\"}\n  ];\n\n  /**--------------------------------------------------------------------------\n  * States\n  --------------------------------------------------------------------------*/\n  _menuOpened = false;\n \n  /**--------------------------------------------------------------------------\n  * properties\n  --------------------------------------------------------------------------*/\n  @Input({ transform: booleanAttribute }) isTouch : boolean = false;\n\n  /**--------------------------------------------------------------------------\n  * properties\n  --------------------------------------------------------------------------*/\n  @Input() selectedZoom : string = '125';\n\n  /**--------------------------------------------------------------------------\n  * Zoom selected event\n  --------------------------------------------------------------------------*/\n  @Output() bimplusZoomSelected = new EventEmitter<string>();\n\n  /**--------------------------------------------------------------------------\n  * Zoom selection\n  --------------------------------------------------------------------------*/\n  _switchZoom( zoom: string ){\n    fireEvent(this, \"bimplusZoomSelected\", zoom);\n  }\n\n  /**--------------------------------------------------------------------------\n  * toggle menu open\n  --------------------------------------------------------------------------*/\n  _toggleOpened(){\n    this._menuOpened = !this._menuOpened;\n  }\n\n  /**--------------------------------------------------------------------------\n  * setup dynamic classes for zoom item\n  --------------------------------------------------------------------------*/\n  _getZoomClassObject( symbol: string ){\n    return {\n      'selected': this.selectedZoom === symbol,\n      ['bimzoom-' + symbol]: true\n    };\n  }\n}\n","<div\n    class=\"bimcomp-overlay\"\n    [ngClass]=\"_menuOpened ? 'open' : ''\"\n    (click)=\"_toggleOpened()\"\n    (keypress)=\"_toggleOpened()\"\n></div>\n<div \n    class=\"dropdown\"\n    [ngClass]=\"{'open': _menuOpened, 'is-touch': isTouch}\"\n    (click)=\"_toggleOpened()\"\n    (keypress)=\"_toggleOpened()\"\n>\n    <div class=\"dropdown-toggle\">\n        <div class=\"main-icon icon-zoom\"></div>\n        <span class=\"caret\"></span>\n    </div>\n    <ul\n        class=\"bimcomp-dropdown-menu\"\n        [ngClass]=\"_menuOpened ? 'open' : ''\"\n    >\n        <li\n            *ngFor=\"let zoom of _zoomList\"\n            class=\"bimcomp-dropdown-menu-item\"\n            [ngClass]=\"_getZoomClassObject(zoom.symbol)\"\n            (click)=\"_switchZoom(zoom.symbol)\"\n            (keypress)=\"_switchZoom(zoom.symbol)\"\n        >\n          <span>{{zoom.text}}</span>\n        </li>\n    </ul>\n</div>\n","import { Directive, ElementRef, Output, EventEmitter, HostListener } from '@angular/core';\n\n@Directive({\n  selector: '[libClickOutside]',\n  standalone: true\n})\nexport class ClickOutsideDirective {\n  @Output() public clickOutside = new EventEmitter<void>();\n\n  constructor(private elementRef: ElementRef) { }\n\n  @HostListener('document:click', ['$event.target'])\n  public onClick(targetElement: HTMLElement) {\n    const clickedInside = this.elementRef.nativeElement.contains(targetElement);\n    if (!clickedInside) {\n      this.clickOutside.emit();\n    }\n  }\n}\n","import { \n  Component\n  , Input\n  , Output\n  , booleanAttribute\n  , ViewEncapsulation\n  , ElementRef\n  , EventEmitter\n  , signal,\n  model\n} from '@angular/core';\nimport { NgStyle} from '@angular/common';\nimport { BimplusContextMenuItem, BimplusContextMenuPosition } from './bimplus-context-menu.interface';\nimport { ClickOutsideDirective } from '../../directives/click-outside/click-outside.directive';\nimport { fireEvent } from '../../utils/utils';\n\n@Component({\n  selector: 'lib-bimplus-context-menu',\n  imports: [\n    NgStyle,\n    ClickOutsideDirective,\n  ],\n  templateUrl: './bimplus-context-menu.component.html',\n  styleUrl: './bimplus-context-menu.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\n\nexport class BimplusContextMenuComponent {\n  @Output() triggerSelected = new EventEmitter();\n  @Input({ transform: booleanAttribute }) showIcons: boolean = true;\n  @Input() triggerTitle : string = \"\";\n\n  protected readonly _showDropdown = signal<boolean>(false);\n  protected _data?: object = undefined;;\n  protected readonly _position = signal<BimplusContextMenuPosition>({\n    posX: -2000,\n    posY: -2000\n  })\n  private readonly _element: HTMLElement;\n  private _interval: number | undefined;\n  items = model<BimplusContextMenuItem[] | null | undefined>([]);\n\n  constructor(private readonly el: ElementRef) {\n    this._element = this.el.nativeElement.shadowRoot;\n  }\n\n  get data(): undefined | object {\n    return this._data;\n  }\n  @Input() set data(data: object) {\n    this._data = data;\n  }\n\n  protected _clickOutside() {\n    this._stopTriggerPositionTracking();\n    this._showDropdown.set(false);\n  }\n\n  protected _actionClick(item: BimplusContextMenuItem) {\n    this._showDropdown.set(false);\n\n    if(typeof item.disabled === 'function') {\n      if(item.disabled?.(this._data)) {\n        return;\n      }\n      item.action?.(this._data);\n      return;\n    }\n\n    if(item.disabled) {\n      return;\n    }\n    item.action?.(this._data);\n  }\n\n  protected _disabled(item: BimplusContextMenuItem): boolean {\n    if(!item.disabled) {\n      return false;\n    }\n    if(typeof item.disabled === 'function') {\n      return item.disabled?.(this._data);\n    }\n    return item.disabled;\n  }\n\n  protected _calculateContextMenuPosition() {\n    const _triggerElament = this._element.querySelector(\".context-menu-trigger\");\n    if(!_triggerElament) {\n      return;\n    }\n\n    const { right: posX, top: posY } = _triggerElament.getBoundingClientRect();\n    this._position.set({ posX, posY });\n  }\n\n  protected _stopTriggerPositionTracking(): void {\n    if(!this._interval){\n      return;\n    }\n\n    clearInterval(this._interval);\n    this._interval = undefined;\n  }\n\n  protected _startTriggerPositionTracking(): void {\n    if(this._interval){\n      return;\n    }\n    this._interval =  setInterval(() => {\n      this._calculateContextMenuPosition();\n    }, 50) as unknown as number;\n  }\n\n  protected _toggleDropdown(event: Event) {\n    this._showDropdown.update(value => !value);\n    this._calculateContextMenuPosition();\n    this._startTriggerPositionTracking();\n    fireEvent(this, \"triggerSelected\");\n    event.stopPropagation();\n  }\n}\n","<div class=\"basic-context-menu\" libClickOutside (clickOutside)=\"_clickOutside()\">\n  <div class=\"context-menu-trigger\" \n    (click)=\"_toggleDropdown($event)\"\n    (keypress)=\"_toggleDropdown($event)\"\n    title=\"{{triggerTitle}}\"\n    data-test=\"context-menu\"\n  >\n  @if (_showDropdown()) {\n    <ul\n      class=\"basic-context-menu__list\"\n      data-test=\"basic-context-menu__list\"\n      [ngStyle]=\"{\n        'top.px': _position().posY\n        , 'left.px': _position().posX\n      }\"\n    >\n      @for(item of items(); track item) {\n        @if (item.id !== 'separator') {\n          <li \n            class=\"basic-context-menu__item\"\n            data-test=\"basic-context-menu__item\"\n            [class.basic-context-menu__item--disabled]=\"_disabled(item)\"\n            (click)=\"_actionClick(item)\"\n            (keypress)=\"_actionClick(item)\"\n          >\n            @if (showIcons) {\n              <div class=\"basic-context-menu__item__icon\" data-test=\"basic-context-menu__item__icon\" [style.background-image]=\"'url(' + item.icon + ')'\">\n              </div>\n            }\n            <div class=\"basic-context-menu__item__label\" data-test=\"basic-context-menu__item__label\" title=\"{{item.tooltip ? item.tooltip : item.title}}\">\n              {{item.title}}\n            </div>\n          </li>\n        } @else {\n          <div class=\"basic-context-menu__item__separator\" data-test=\"basic-context-menu__item__separator\"></div>\n        }\n      }\n    </ul>\n  }\n</div>\n","import { ElementRef, Component, OnInit, Input, OnChanges, SimpleChange, booleanAttribute, Output, EventEmitter, TemplateRef, input } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatTreeFlatDataSource, MatTreeFlattener, MatTreeModule } from '@angular/material/tree';\nimport { SelectionModel} from '@angular/cdk/collections';\nimport { CdkTreeModule, FlatTreeControl } from '@angular/cdk/tree';\nimport { CommonModule } from '@angular/common';\nimport { fireEvent } from '../../utils/utils';\nimport { TreeNode, FlatNode, FlatTreeContextMenus } from './bimplus-flat-tree.interface';\nimport { BimplusContextMenuComponent } from  '../bimplus-context-menu/bimplus-context-menu.component';\n\ninterface BimplusFlatTreeComponentAttribute  {\n  [key: string]: unknown; // Add index signature allowing string indexing\n   //Other properties and methods...\n}\n\n@Component({\n  selector: 'lib-bimplus-flat-tree',\n  imports: [MatTreeModule,\n    MatButtonModule,\n    MatIconModule,\n    CdkTreeModule,\n    BimplusContextMenuComponent,\n    CommonModule\n  ],\n  templateUrl: './bimplus-flat-tree.component.html',\n  styleUrl: './bimplus-flat-tree.component.less'\n})\n\nexport class BimplusFlatTreeComponent implements OnInit, OnChanges{\n  @Input() treeDataStringified: string | null = null;\n  treeTitle = input<string | undefined>(undefined);\n  @Input() paddingIndent : string = \"2.8rem\"\n  @Input({ transform: booleanAttribute }) multiSelect: boolean = false;\n  @Input({ transform: booleanAttribute }) oneLevelMultiSelect: boolean = false;\n  @Input({ transform: booleanAttribute }) showFoldersIcons: boolean = false;\n  @Input({ transform: booleanAttribute }) showObjectsIcons: boolean = false;\n  @Input({ transform: booleanAttribute }) enableSelect: boolean = true;\n  @Input({ transform: booleanAttribute }) enableParentHighlighting: boolean = true;\n  @Input({ transform: booleanAttribute }) enableDragAndDrop: boolean = false;\n  @Input() dataTestPrefix : string = \"\";\n  @Input() contextMenus: FlatTreeContextMenus | null | undefined = null;\n  constructor(private readonly el: ElementRef) {}\n  @Input({ transform: booleanAttribute }) hasCheckBox1:boolean = false;\n  @Input({ transform: booleanAttribute }) hasCheckBox2:boolean = false;\n\n  get treeData() : Array<TreeNode>{\n    return this._dataSource.data;\n  }\n\n  @Input() set treeData(data: Array<TreeNode>) {\n    this.treeDataStringified = null;\n    this._dataSource.data = data;\n  }\n  customNodeTemplate = input<TemplateRef<unknown> | null>(null);\n\n  @Output() selectedNodes = new EventEmitter<FlatNode[]>();\n  @Output() checked1Nodes = new EventEmitter<FlatNode[]>();\n  @Output() checked2Nodes = new EventEmitter<FlatNode[]>();\n\n  private _selectionList: SelectionModel<FlatNode> | undefined = undefined;\n\n\n  ngOnInit(): void {\n    const element = this.el.nativeElement;\n    if (element) {\n      (element as unknown as BimplusFlatTreeComponentAttribute)['get_node'] = this.get_node.bind(this);\n      (element as unknown as BimplusFlatTreeComponentAttribute)['select_node'] = this.select_node.bind(this);\n    }\n\n    this._selectionList = new SelectionModel<FlatNode>(this.multiSelect || this.oneLevelMultiSelect);\n    if(this.treeDataStringified){\n      this._setNewData(this.treeDataStringified)\n    }\n  }\n\n  public expandTree(){\n    this._treeControl.expandAll();\n  }\n\n  private _getNode(id: string, nodes: Array<TreeNode>): TreeNode | null {\n    for(const node of nodes) {\n      if(node.id === id) {\n        return node;\n      }\n      if(node.children) {\n        const _node: TreeNode | null = this._getNode(id, node.children);\n        if(_node) {\n          return _node;\n        }\n      }\n    }\n    return null;\n  }\n\n  public get_node(id: { id: string } | string, getDOMElement: boolean = false): TreeNode | Element | null {\n    if(typeof id === 'string') {\n      return this._getNode(id, this._dataSource.data);\n    }\n    if(getDOMElement) {\n      const _element: Element = this.el.nativeElement.querySelector(`[node-id='${id.id}']`);\n      return _element;\n    }\n    return this._getNode(id.id, this._dataSource.data);\n  }\n\n  public select_node(id: string, skipEvent: boolean = false) {\n    const node = this._treeControl.dataNodes.find(n => n.id === id);\n    if(!node) {\n      return;\n    }\n\n    if(!this._selectionList) {\n      return;\n    }\n\n    if(this.oneLevelMultiSelect && this._selectionList.selected.length > 0) {\n      if(this._selectionList.selected[0].parent !== node.parent) {\n        this._selectionList.clear();\n      }\n    }\n\n    if(this._selectionList.isSelected(node)) {\n      return;\n    }\n\n    this._selectionList.select(node);\n    if(!this.multiSelect && !this.oneLevelMultiSelect && !skipEvent) {\n      fireEvent(this, \"selectedNodes\", this._selectionList.selected );\n      return;\n    }\n\n    if(!this.oneLevelMultiSelect) {\n      this._toggleDescendantsNodes(node);\n    }\n\n    if(this.enableParentHighlighting) {\n      this._updateParentSelections(node);\n    }\n\n    if(!skipEvent){\n      fireEvent(this, \"selectedNodes\", this._selectionList.selected );\n    }\n\n  }\n\n  public reset_selection(){\n    this._selectionList?.clear();\n  }\n\n  public expand_node(id : string){\n    const node = this._treeControl.dataNodes.find(n => n.id === id);\n    if(!node) {\n      return;\n    }\n\n    this._treeControl.expand(node);\n  }\n\n  public is_expanded(id : string){\n    const node = this._treeControl.dataNodes.find(n => n.id === id);\n    if(!node) {\n      return false;\n    }\n\n    return this._treeControl.isExpanded(node);\n  }\n\n  public is_selected(id : string){\n    if(!this._selectionList)\n      return;\n\n    const node = this._treeControl.dataNodes.find(n => n.id === id);\n    if(!node) {\n      return false;\n    }\n\n    return this._selectionList?.isSelected(node);\n  }\n\n  private _setNewData(treeDataStringified: string): void {\n    const _tree_data = JSON.parse(treeDataStringified);\n    this._dataSource.data = _tree_data ?? [];\n  }\n\n  private _changedTreeData(change: SimpleChange) {\n    this._setNewData(change.currentValue)\n  }\n\n  ngOnChanges(changes: { [propKey: string]: SimpleChange }): void {\n    if(changes['multiSelect'] || changes['oneLevelMultiSelect']) {\n      this._selectionList = new SelectionModel<FlatNode>(this.multiSelect || this.oneLevelMultiSelect);\n    }\n    if(changes['treeDataStringified']) {\n      this._changedTreeData(changes['treeDataStringified'])\n    }\n  }\n\n  private _transformer = (node: TreeNode, level: number): FlatNode => {\n    return {\n      expandable: node.children !== undefined && node.children.length > 0,\n      children_count: node.children?.length,\n      name: node.name,\n      id: node.id,\n      level: level,\n      parent: node.parent,\n      nodeType: node.nodeType,\n      isChecked1: true,\n      isChecked2: true,\n      isUndetermined1: false,\n      isUndetermined2: false\n    };\n  };\n\n  protected _treeControl = new FlatTreeControl<FlatNode>(\n    node => node.level,\n    node => node.expandable,\n  );\n\n  protected _treeFlattener = new MatTreeFlattener(\n    this._transformer,\n    node => node.level,\n    node => node.expandable,\n    node => node.children\n  );\n\n  protected _dataSource = new MatTreeFlatDataSource(this._treeControl, this._treeFlattener);\n  protected _isExpandable = (_: number, node: FlatNode) => node.expandable;\n  protected _isCustomNodeType(node: FlatNode): boolean{\n    return node.nodeType != undefined && node.nodeType != \"\";\n  }\n\n  protected _hasChildren(node: FlatNode): boolean {\n    if(!node.expandable) {\n      return false;\n    }\n    if(node.children_count === undefined) {\n      return false\n    }\n    return node.children_count > 0\n  }\n\n  protected _descendantsAllSelected(node: FlatNode): boolean {\n    if(!this._selectionList) {\n      return false;\n    }\n\n    const _selectionList: SelectionModel<FlatNode> = this._selectionList;\n\n    const _descendants = this._treeControl.getDescendants(node);\n    if(_descendants.length === 0) {\n      return true;\n    }\n    const _descAllSelected = _descendants.length > 0 && _descendants.every((child) => {\n      return _selectionList.isSelected(child);\n    });\n    return _descAllSelected;\n  }\n\n  protected _descendantsPartiallySelected(node: FlatNode): boolean {\n    if(!this._selectionList) {\n      return false;\n    }\n    const _selectionList: SelectionModel<FlatNode> = this._selectionList;\n\n    const _descendants = this._treeControl.getDescendants(node);\n    const _result = _descendants.some((child) => {\n      return _selectionList.isSelected(child)\n    });\n    return _result && !this._descendantsAllSelected(node);\n  }\n\n  private _toggleDescendantsNodes(node: FlatNode) {\n    if(!this._selectionList) {\n      return;\n    }\n\n    const _isNodeSelected = this._selectionList.isSelected(node);\n    if(_isNodeSelected) {\n      this._selectionList.select(...this._treeControl.getDescendants(node));\n    }\n    else {\n      this._selectionList.deselect(...this._treeControl.getDescendants(node));\n    }\n  }\n\n  private _updateParentSelections(node: FlatNode) {\n    if(!this._selectionList) {\n      return;\n    }\n\n    let _parentId = node.parent;\n    let _parentNode = this._treeControl.dataNodes.find(n => n.id === _parentId)\n    while(_parentNode) {\n      if(this._descendantsAllSelected(_parentNode)) {\n        this._selectionList.select(_parentNode);\n      }\n      else{\n        this._selectionList.deselect(_parentNode);\n      }\n      _parentId = _parentNode.parent;\n      _parentNode = this._treeControl.dataNodes.find(n => n.id === _parentId);\n    }\n  }\n\n  protected _toggleNode(event: Event, node: FlatNode) {\n    if(!node) {\n      return;\n    }\n\n    if(!this.enableSelect) {\n      return;\n    }\n\n    if(!this._selectionList) {\n      return;\n    }\n\n    // Check if event is a MouseEvent before accessing ctrlKey\n    const isMouseEvent = event != null && event instanceof MouseEvent;\n    if (isMouseEvent && !event?.ctrlKey) {\n      this._selectionList.clear();\n    }\n\n    if(this.oneLevelMultiSelect && this._selectionList.selected.length > 0) {\n      if(this._selectionList.selected[0].parent !== node.parent) {\n        this._selectionList.clear();\n      }\n    }\n\n    this._selectionList.toggle(node);\n    if(!this.multiSelect && !this.oneLevelMultiSelect) {\n      fireEvent(this, \"selectedNodes\", this._selectionList.selected );\n      return;\n    }\n\n    if(!this.oneLevelMultiSelect) {\n      this._toggleDescendantsNodes(node);\n    }\n\n    if(this.enableParentHighlighting) {\n      this._updateParentSelections(node);\n    }\n\n    fireEvent(this, \"selectedNodes\", this._selectionList.selected );\n  }\n\n  protected _isSelected(node: FlatNode): boolean{\n    if(!this._selectionList) {\n      return false;\n    }\n    return this._selectionList?.isSelected(node);\n  }\n  \n  protected _toggleCheckBox1( event:Event,node: FlatNode) {    \n    if (event) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n    node.isChecked1 = !node.isChecked1;\n    if(node.expandable){\n      this._treeControl.getDescendants(node).forEach(n => {\n        n.isChecked1 = node.isChecked1;\n      });\n    }\n    node.isUndetermined1 = false;\n    this.checkUndetermined(node,1);\n    fireEvent(this, \"checked1Nodes\", [node]);\n  }\n  \n  protected _toggleCheckBox2(event:Event, node: FlatNode) {\n    if (event) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n    node.isChecked2 = !node.isChecked2;\n    if(node.expandable){\n      this._treeControl.getDescendants(node).forEach(n => {\n        n.isChecked2 = node.isChecked2;\n      });\n    }\n    node.isUndetermined2 = false;\n    this.checkUndetermined(node,2);\n    fireEvent(this, \"checked2Nodes\", [node]);\n  }\n  \n  //simplified version of checkUndetermined\n  checkUndetermined(node:FlatNode,checkbox: number){\n    if(!this.hasCheckBox1 && checkbox === 1){\n      return;\n    }\n    if(!this.hasCheckBox2 && checkbox === 2){\n      return;\n    }\n    if(!node.parent){\n      return;\n    }\n    let myNode = node;    \n    while(myNode && myNode.parent){\n      const parentNode = this._treeControl.dataNodes.find(n => n.id === myNode.parent);      \n      if(!parentNode){\n        return;\n      }\n      let checked = 0;\n      let unchecked = 0;        \n      let undetermined = false;\n      this._treeControl.getDescendants(parentNode).forEach(n => {\n        if(checkbox === 1 ? n.isChecked1: n.isChecked2){ \n          checked++;\n        } else {\n          unchecked++;\n        }\n        if(checkbox === 1 ? n.isUndetermined1: n.isUndetermined2){ \n          undetermined = true;        \n        }\n        if(checked > 0 && unchecked > 0){\n          undetermined = true;        \n        }\n      });\n      if(checkbox === 1 ){\n        parentNode.isUndetermined1 = undetermined;\n        parentNode.isChecked1 = !unchecked;\n      } else {\n        parentNode.isUndetermined2 = undetermined;\n        parentNode.isChecked2 = !unchecked;\n      }\n      myNode = parentNode;\n    };\n  }\n  protected _isUndetermined1(node: FlatNode): boolean{\n    return node.isUndetermined1;\n  }\n  \n  protected _isUndetermined2(node: FlatNode): boolean{\n    return node.isUndetermined2;\n  }\n\n  protected _isChecked1(node: FlatNode): boolean{        \n    return node.isChecked1;\n  }\n  protected _isChecked2(node: FlatNode): boolean{        \n    return node.isChecked2;\n  }\n}\n","<div class=\"tree-container\">\n  @if (treeTitle(); as treeTitle) {\n    <div class=\"tree-title\">{{treeTitle}}</div>\n  }\n  <cdk-tree [dataSource]=\"_dataSource\" [treeControl]=\"_treeControl\">\n    <!-- This is the tree node template for leaf nodes -->\n    <cdk-tree-node\n      [matTreeNodePaddingIndent]=\"paddingIndent\"\n      *matTreeNodeDef=\"let node\"\n      matTreeNodePadding\n      (click)=\"_toggleNode($event, node)\"\n      (keypress)=\"_toggleNode($event, node)\"\n      class=\"object-node\"\n      [class.dragable-node]=\"enableDragAndDrop && node.level > 0\"\n      [class.selected-node]=\"_isSelected(node)\"\n      [attr.data-test]=\"dataTestPrefix + node.id\"\n      [title]=\"node.name\"\n      [attr.node-id]=\"node.id\"\n    >\n      <!-- use a disabled button to provide padding for tree leaf -->\n      <button mat-icon-button disabled>\n      </button>\n      @if (customNodeTemplate() && _isCustomNodeType(node)) {\n        <ng-container \n             [ngTemplateOutlet]=\"customNodeTemplate()\" \n             [ngTemplateOutletContext]=\"{node:node}\">\n        </ng-container>\n      }@else{\n        <div class=\"icon object-icon\" *ngIf=\"showObjectsIcons\">\n        </div>\n        <span\n          class=\"node-label\"\n          [class.selected-node]=\"_isSelected(node)\"\n        >\n          <div class=\"custom-drag-placeholder\" *cdkDragPlaceholder></div>\n          <div>\n            {{node.name}}\n          </div>\n        </span>\n      }\n      <lib-bimplus-context-menu\n        [items]=\"contextMenus?.objectContextMenuitems\"\n        [data]=\"node\"\n        *ngIf=\"contextMenus?.objectContextMenuitems?.length\"\n        (triggerSelected)=\"_toggleNode($event, node)\"\n      >\n      </lib-bimplus-context-menu>\n      @if(hasCheckBox1){\n        <div\n          class=\"custom-checkbox1\"\n          [ngClass]=\"{ 'icon-checked': _isChecked1(node), 'icon-unchecked': !_isChecked1(node) }\"\n          (click)=\"_toggleCheckBox1($event,node)\"\n          (keypress)=\"_toggleCheckBox1($event,node)\"\n        ></div>\n      }\n      @if(hasCheckBox2){\n        <div\n          class=\"custom-checkbox2\"\n          [ngClass]=\"{ 'icon-checked': _isChecked2(node), 'icon-unchecked': !_isChecked2(node) }\"\n          (click)=\"_toggleCheckBox2($event,node)\"\n          (keypress)=\"_toggleCheckBox2($event,node)\"\n        ></div>\n      }\n    </cdk-tree-node>\n    <!-- This is the tree node template for expandable nodes -->\n    <cdk-tree-node [matTreeNodePaddingIndent]=\"paddingIndent\"\n      *matTreeNodeDef=\"let node;when: _isExpandable\"\n      matTreeNodePadding\n      (click)=\"_toggleNode($event, node)\"\n      (keypress)=\"_toggleNode($event, node)\"\n      class=\"folder-node\"\n      [class.dragable-node]=\"enableDragAndDrop && node.level > 0\"\n      [class.selected-node]=\"_isSelected(node)\"\n      [attr.data-test]=\"dataTestPrefix + node.id\"\n      [title]=\"node.name\"\n      [attr.node-id]=\"node.id\"\n    >\n      <button\n        mat-icon-button\n        matTreeNodeToggle\n        [attr.aria-label]=\"'Toggle ' + node.name\"\n      >\n        <div\n          class=\"icon expand-collapse-icon\"\n          [class.expand-more-icon]=\"_hasChildren(node) && !_treeControl.isExpanded(node)\"\n          [class.collapse-icon]=\"_hasChildren(node) && _treeControl.isExpanded(node)\"\n        >\n        </div>\n      </button>      \n      @if (customNodeTemplate() && _isCustomNodeType(node)) {\n        <ng-container \n             [ngTemplateOutlet]=\"customNodeTemplate()\" \n             [ngTemplateOutletContext]=\"{node:node}\">\n        </ng-container>\n      }@else{\n        <div class=\"icon folder-icon\" *ngIf=\"showFoldersIcons\">\n        </div>\n        <span class=\"node-label\"\n          [class.selected-node]=\"_isSelected(node)\"\n          [class.selected-all-descendants-nodes]=\"_descendantsAllSelected(node) && _isSelected(node) && enableParentHighlighting\"\n          [class.selected-partially-descendants-nodes]=\"_descendantsPartiallySelected(node) && enableParentHighlighting\"\n        >\n          <div class=\"custom-drag-placeholder\" *cdkDragPlaceholder></div>\n          <div class=\"node-label\">\n            {{node.name}}\n          </div>\n        </span>\n      }\n      <lib-bimplus-context-menu\n        [items]=\"contextMenus?.folderContextMenuitems\"\n        [data]=\"node\"\n        *ngIf=\"contextMenus?.folderContextMenuitems?.length\"\n        (triggerSelected)=\"_toggleNode($event, node)\"\n      >\n      </lib-bimplus-context-menu>\n\n      @if(hasCheckBox1){\n        <div\n          class=\"custom-checkbox1\"\n          [ngClass]=\"{\n            'icon-undetermined': _isUndetermined1(node),\n            'icon-checked': !_isUndetermined1(node) && _isChecked1(node),\n            'icon-unchecked': !_isUndetermined1(node) && !_isChecked1(node)\n          }\"\n          (click)=\"_toggleCheckBox1($event,node)\"\n          (keypress)=\"_toggleCheckBox1($event,node)\"\n        ></div>\n      }\n      @if(hasCheckBox2){\n        <div\n          class=\"custom-checkbox2\"\n          [ngClass]=\"{\n            'icon-undetermined': _isUndetermined2(node),\n            'icon-checked': !_isUndetermined2(node) && _isChecked2(node),\n            'icon-unchecked': !_isUndetermined2(node) && !_isChecked2(node)\n          }\"\n          (click)=\"_toggleCheckBox2($event,node)\"\n          (keypress)=\"_toggleCheckBox2($event,node)\"\n        ></div>\n      }\n    </cdk-tree-node>\n  </cdk-tree>\n</div>\n","\r\nexport interface FilterType{\r\n  id: string,\r\n  name: string\r\n}\r\n\r\nexport interface FilterCriterium{\r\n  name : string,\r\n  value? : string | number | boolean | null | undefined,\r\n  namedValue? : string, // display name of value in UI\r\n  id? : string,\r\n  subString : string,\r\n}\r\n\r\nexport enum FilterCriteriaSelectionMode{\r\n  None,\r\n  SelectObjectProperties,\r\n  SelectAttributes\r\n} \r\n\r\nexport const MaxFilterCriteria = 5;","import { Component, EventEmitter, HostBinding, Input, Output } from '@angular/core';\r\nimport { FilterCriterium } from '../bimplus-object-navigator.interface';\r\nimport { BimplusLocalizedWidgetComponent } from '../../bimplus-localized-widget/bimplus-localized-widget.component';\r\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\r\n\r\n@Component({\r\n  selector: 'app-filter-criterium',\r\n  imports: [TranslateModule],\r\n  templateUrl: './filter-criterium.component.html',\r\n  styleUrl: './filter-criterium.component.less'\r\n})\r\nexport class FilterCriteriumComponent extends BimplusLocalizedWidgetComponent {\r\n\r\n  constructor (translateService:  TranslateService){\r\n    super(translateService)\r\n  }\r\n\r\n  // #region public fields\r\n  @Input()\r\n  criterium : FilterCriterium = { name : \"\", subString:\"\"}\r\n\r\n  @HostBinding('style.margin-left.em') @Input() indent: number = 0;\r\n\r\n  @Output() deleteCriterium = new EventEmitter<void>();\r\n  // #endregion public fields\r\n\r\n  // #region public methods\r\n  clickedDelete(){\r\n    this.deleteCriterium.emit();\r\n  }\r\n  // #endregion public methods\r\n}\r\n","<div class=\"filter-criterium-row\">\r\n  <span class=\"filter-criterium-item\">\r\n    {{ criterium.name }}\r\n    @if(criterium.namedValue) { &nbsp;&#40;{{ criterium.namedValue }}&#41; }\r\n  </span>\r\n  <div\r\n    class=\"filter-criterium-icon-delete\"\r\n    (click)=\"clickedDelete()\"\r\n    (keypress)=\"clickedDelete()\"\r\n  ></div>\r\n</div>\r\n","import { Component, computed, EventEmitter, input, Input, Output, ViewChild } from '@angular/core';\r\nimport { BimplusFlatTreeComponent } from '../bimplus-flat-tree/bimplus-flat-tree.component';\r\nimport { FlatNode, TreeNode } from '../bimplus-flat-tree/bimplus-flat-tree.interface';\r\nimport { ObjectStructureNode } from './bimplus-object-structure.interface';\r\n\r\n@Component({\r\n  selector: 'lib-bimplus-object-structure',\r\n  imports: [BimplusFlatTreeComponent],\r\n  templateUrl: './bimplus-object-structure.component.html',\r\n  styleUrl: './bimplus-object-structure.component.less'\r\n})\r\nexport class BimplusObjectStructureComponent{\r\n  @Input() hasCheckBox1:boolean = false;\r\n  @Input() hasCheckBox2:boolean = false;\r\n  \r\n  objectStructure = input<ObjectStructureNode>({\r\n    id : \"\",\r\n    name : \"\",\r\n    parent: \"\",\r\n    visible: true,\r\n    opaque: true\r\n  });\r\n\r\n  @ViewChild(BimplusFlatTreeComponent) treeComponent: BimplusFlatTreeComponent | null = null;\r\n  \r\n  private _convertObjectStructureNodeToTreeNode(node : ObjectStructureNode) : TreeNode{\r\n\r\n    const treeNode : TreeNode = {\r\n      name: node.name,\r\n      id: node.id,\r\n      parent: node.parent \r\n    };\r\n\r\n    if(node.children){\r\n      treeNode.children = [];\r\n      for(const child of node.children){\r\n        const childTreeNode = this._convertObjectStructureNodeToTreeNode(child);\r\n        treeNode.children.push(childTreeNode);\r\n      }\r\n    }\r\n\r\n    return treeNode;\r\n  }\r\n\r\n  readonly treeData = computed<TreeNode[]>(() => {\r\n    const objectStructure = this.objectStructure();\r\n    if(!objectStructure){\r\n      return [];\r\n    }\r\n\r\n    const root = this._convertObjectStructureNodeToTreeNode(objectStructure);\r\n    if(!root){\r\n      return [];\r\n    }\r\n\r\n    return [root];\r\n  })\r\n\r\n\r\n  private _findNode(id:string, node : ObjectStructureNode) : ObjectStructureNode | null{\r\n    if(node.id == id){\r\n      return node;\r\n    }\r\n\r\n    if(node.children){\r\n      for(const child of node.children){\r\n        const res = this._findNode(id, child);\r\n        if(res){\r\n          return res;\r\n        }\r\n      }\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  handleSelectedNodes(nodes : FlatNode[]){\r\n    if(nodes.length === 1){\r\n      const selectedNode = this._findNode(nodes[0].id, this.objectStructure());\r\n      if(selectedNode){\r\n        this.nodeSelected.emit(selectedNode);\r\n      }\r\n    }    \r\n  }\r\n  \r\n  handleVisibleNodes(nodes : FlatNode[]){\r\n    if(nodes.length === 1){\r\n      const visibleNode = this._findNode(nodes[0].id, this.objectStructure());\r\n      if(visibleNode){\r\n        const outpuData:ObjectStructureNode ={\r\n          name:visibleNode.name,\r\n          parent: visibleNode.parent,          \r\n          id: visibleNode.id,\r\n          visible: nodes[0].isChecked2,\r\n          opaque:  nodes[0].isChecked1,\r\n        }\r\n        this.nodeVisible.emit(outpuData);\r\n      }\r\n    }    \r\n  }\r\n  \r\n  handleOpaqueNodes(nodes : FlatNode[]){\r\n    if(nodes.length === 1){\r\n      const opaqueNode = this._findNode(nodes[0].id, this.objectStructure());\r\n      if(opaqueNode){\r\n        const outpuData:ObjectStructureNode ={\r\n          name:opaqueNode.name,\r\n          parent: opaqueNode.parent,          \r\n          id: opaqueNode.id,\r\n          visible: nodes[0].isChecked2,\r\n          opaque:  nodes[0].isChecked1,\r\n        }\r\n        this.nodeOpaque.emit(outpuData);\r\n      }\r\n    }    \r\n  }\r\n\r\n  expandTree(){\r\n    this.treeComponent?.expandTree();\r\n  }\r\n\r\n  @Output() nodeSelected = new EventEmitter<ObjectStructureNode>();\r\n  @Output() nodeVisible  = new EventEmitter<ObjectStructureNode>();\r\n  @Output() nodeOpaque   = new EventEmitter<ObjectStructureNode>();\r\n}\r\n","<lib-bimplus-flat-tree\r\n  paddingIndent=\"1.4rem\"\r\n  [treeData]=\"treeData()\"\r\n  enableParentHighlighting=\"false\"\r\n  (selectedNodes) = \"handleSelectedNodes($event)\"\r\n  (checked2Nodes) = \"handleVisibleNodes($event)\"\r\n  (checked1Nodes) = \"handleOpaqueNodes($event)\"\r\n  dataTestPrefix=\"object-structure-tree-\"\r\n  [hasCheckBox1]=\"hasCheckBox1\"\r\n  [hasCheckBox2]=\"hasCheckBox2\"\r\n></lib-bimplus-flat-tree>\r\n","import { Component, computed, EventEmitter, input, Output, ViewChild } from '@angular/core';\r\nimport { BimplusFlatTreeComponent } from '../bimplus-flat-tree/bimplus-flat-tree.component';\r\nimport { ComplexPropertiesNode } from './bimplus-object-complex-properties.interface';\r\nimport { FlatNode, TreeNode } from '../bimplus-flat-tree/bimplus-flat-tree.interface';\r\n\r\n@Component({\r\n  selector: 'lib-bimplus-object-complex-properties',\r\n  imports: [BimplusFlatTreeComponent],\r\n  templateUrl: './bimplus-object-complex-properties.component.html',\r\n  styleUrl: './bimplus-object-complex-properties.component.less'\r\n})\r\nexport class BimplusObjectComplexPropertiesComponent {\r\n  complexProperties = input<ComplexPropertiesNode>({\r\n    id: \"\",\r\n    name: \"\",\r\n    parent: \"\"\r\n  });\r\n\r\n  @ViewChild(BimplusFlatTreeComponent) treeComponent: BimplusFlatTreeComponent | null = null;\r\n\r\n  readonly treeData = computed<TreeNode[]>(() => {\r\n    const complexProperties = this.complexProperties();\r\n    if(!complexProperties) {\r\n      return [];\r\n    }\r\n\r\n    const root = this._convertObjectStructureNodeToTreeNode(complexProperties);\r\n    if(!root) {\r\n      return [];\r\n    }\r\n\r\n    return [root];\r\n  })\r\n\r\n  private _convertObjectStructureNodeToTreeNode(node : ComplexPropertiesNode) : TreeNode{\r\n\r\n    const treeNode : TreeNode = {\r\n      name: node.name,\r\n      id: node.id,\r\n      parent: node.parent \r\n    };\r\n\r\n    if(node.children){\r\n      treeNode.children = [];\r\n      for(const child of node.children){\r\n        const childTreeNode = this._convertObjectStructureNodeToTreeNode(child);\r\n        treeNode.children.push(childTreeNode);\r\n      }\r\n    }\r\n\r\n    return treeNode;\r\n  }\r\n\r\n\r\n  private _findNode(id:string, node : ComplexPropertiesNode) : ComplexPropertiesNode | null{\r\n    if(node.id == id){\r\n      return node;\r\n    }\r\n\r\n    if(node.children){\r\n      for(const child of node.children){\r\n        const res = this._findNode(id, child);\r\n        if(res){\r\n          return res;\r\n        }\r\n      }\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  handleSelectedNodes(nodes : FlatNode[]){\r\n    if(nodes.length === 1){\r\n      const selectedNode = this._findNode(nodes[0].id, this.complexProperties());\r\n      if(selectedNode){\r\n        this.nodeSelected.emit(selectedNode);\r\n      }\r\n    }    \r\n  }\r\n\r\n  expandTree(){\r\n    this.treeComponent?.expandTree();\r\n  }\r\n\r\n  @Output() nodeSelected = new EventEmitter<ComplexPropertiesNode>();\r\n}\r\n","<lib-bimplus-flat-tree\r\n  paddingIndent=\"1.4rem\"\r\n  [treeData]=\"treeData()\"\r\n  enableParentHighlighting=\"false\"\r\n  (selectedNodes)=\"handleSelectedNodes($event)\"\r\n  dataTestPrefix=\"object-complex-properties-tree-\"\r\n></lib-bimplus-flat-tree>\r\n","import * as WebSdk from 'bimplus-websdk';\r\n\r\nexport interface ObjectStructureNode{\r\n  id: string;\r\n  children? : ObjectStructureNode[];\r\n  name: string;\r\n  parent: string;\r\n  visible: boolean;\r\n  opaque: boolean;\r\n}\r\n\r\nexport class ObjectStructureNodeBuilder{\r\n  static createFromResponse(response : WebSdk.ObjectTopologyResponse) : ObjectStructureNode{\r\n    const node : ObjectStructureNode = {\r\n      id : response.id,\r\n      name : response.name ?  `${response.type}(${response.name})` : response.type,\r\n      parent : response.parent,\r\n      visible : true,\r\n      opaque : true\r\n    }\r\n\r\n    if(response.children){\r\n      node.children = [];\r\n      for(const child of response.children){\r\n        node.children.push(ObjectStructureNodeBuilder.createFromResponse(child as WebSdk.ObjectTopologyResponse));\r\n      }\r\n    }\r\n\r\n    return node;\r\n  }\r\n}","import * as WebSdk from 'bimplus-websdk';\r\n\r\nexport interface ComplexPropertiesNode{\r\n  id: string;\r\n  children? : ComplexPropertiesNode[];\r\n  name: string;\r\n  parent: string;\r\n}\r\n\r\nexport class ComplexPropertiesNodeBuilder{\r\n  static createFromResponse(response : WebSdk.ObjectComplexPropertyTopologyResponse) : ComplexPropertiesNode{\r\n    const node : ComplexPropertiesNode = {\r\n      id : response.id,\r\n      name : response.type ?  response.type : response.name,\r\n      parent : response.parent\r\n    }\r\n\r\n    if(response.children){\r\n      node.children = [];\r\n      for(const child of response.children){\r\n        node.children.push(ComplexPropertiesNodeBuilder.createFromResponse(child as WebSdk.ObjectComplexPropertyTopologyResponse));\r\n      }\r\n    }\r\n\r\n    return node;\r\n  }\r\n}","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n  name: 'formatValue',\n  standalone: true\n})\nexport class FormatValuePipe implements PipeTransform {\n  transform(value: number | string | boolean | null | undefined): string {\n    if (value === null || value === undefined) {\n      return '[null]';\n    } else if (value === '') {\n      return '[empty]';\n    } else if (typeof value === 'boolean') {\n      return value ? 'TRUE' : 'FALSE';\n    }\n    return value.toString(); // Return the value as a string\n  }\n}","import { Pipe, PipeTransform } from '@angular/core';\nimport moment from 'moment';\n\n@Pipe({\n  name: 'DateTime',\n  standalone: true,\n})\nexport class DateTimePipe implements PipeTransform {\n  transform(value: string, format: string = \"L\"): string {\n    // This UTC date/time 2024-12-11T23:00:00+00:00\n    // gets transformed in Germany with timezone shift of +1 by\n    //     moment(value).format(format)     ==> 12/12/2024\n    // and by\n    //     moment.utc(value).format(format) ==> 12/11/2024\n    //\n    const date = moment(value).format(format);\n    return date;\n  }\n}","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport * as WebSdk from 'bimplus-websdk';\r\nimport { BehaviorSubject, from } from 'rxjs';\r\nimport { BimplusLocalizedWidgetComponent } from '../../bimplus-localized-widget/bimplus-localized-widget.component';\r\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\r\nimport { ExpansionPanelComponent } from '../../expansion-panel/expansion-panel.component';\r\nimport { ExpansionPanelHeaderComponent } from '../../expansion-panel-header/expansion-panel-header.component';\r\nimport { FilterCriterium, MaxFilterCriteria } from '../bimplus-object-navigator.interface';\r\nimport { BimplusObjectStructureComponent } from '../../bimplus-object-structure/bimplus-object-structure.component';\r\nimport { BimplusObjectComplexPropertiesComponent } from '../../bimplus-object-complex-properties/bimplus-object-complex-properties.component';\r\nimport { ObjectStructureNode, ObjectStructureNodeBuilder } from '../../bimplus-object-structure/bimplus-object-structure.interface';\r\nimport { ComplexPropertiesNode, ComplexPropertiesNodeBuilder } from '../../bimplus-object-complex-properties/bimplus-object-complex-properties.interface';\r\nimport { CriteriaSelectObjectAttribute, CriteriaSelectObjectAttributeGroup } from './criteria-select-object-properties.interface';\r\nimport { FormatValuePipe } from '../../../pipes/format-value.pipe';\r\nimport { DateTimePipe } from '../../../pipes/datetime.pipe';\r\n\r\n@Component({\r\n  selector: 'lib-criteria-select-object-properties',\r\n  imports: [ExpansionPanelHeaderComponent, ExpansionPanelComponent, TranslateModule, BimplusObjectStructureComponent, BimplusObjectComplexPropertiesComponent],\r\n  providers: [FormatValuePipe, DateTimePipe],\r\n  templateUrl: './criteria-select-object-properties.component.html',\r\n  styleUrl: './criteria-select-object-properties.component.less'\r\n})\r\nexport class CriteriaSelectObjectPropertiesComponent extends BimplusLocalizedWidgetComponent implements OnInit {\r\n\r\n  constructor(\r\n    translateService: TranslateService,\r\n    private formatValuePipe: FormatValuePipe,\r\n    private datetimePipe: DateTimePipe) {\r\n    super(translateService)\r\n  }\r\n\r\n  ngOnInit() {\r\n    this._currentPropertiesObjectId$.subscribe({\r\n      next: (id) => {\r\n        if (id) {\r\n          this._createObjectProperties(id, this.revision)\r\n        }\r\n      }\r\n    });\r\n\r\n    this._currentObjectId$.subscribe({\r\n      next: (id) => {\r\n        this._currentPropertiesObjectId$.next(id);\r\n        this._createComplexPropertiestructure(id, this.revision);\r\n      }\r\n    });\r\n\r\n  }\r\n\r\n  @Input()\r\n  api: WebSdk.Api | null = null;\r\n\r\n  @Input()\r\n  set rootObjectId(id: string) {\r\n    this._currentObjectId$.next(id);\r\n    this._createObjectStructure(id, this.revision);\r\n\r\n    this._rootObjectId = id;\r\n  }\r\n\r\n  get rootObjectId(): string {\r\n    return this._rootObjectId;\r\n  }\r\n\r\n  @Input()\r\n  revision: number | undefined = undefined;\r\n\r\n  private readonly _currentObjectId$ = new BehaviorSubject<string>(\"\");\r\n\r\n  private readonly _currentPropertiesObjectId$ = new BehaviorSubject<string>(\"\");\r\n\r\n  objectAttributeGroups: CriteriaSelectObjectAttributeGroup[] = [];\r\n\r\n  MaxFilterCriteria = MaxFilterCriteria; // For exposure to template\r\n\r\n  private _rootObjectId: string = \"\";\r\n\r\n  @Input()\r\n  set filterCriteria(criteria: FilterCriterium[]) {\r\n    this._filterCriteria = criteria;\r\n    this._syncAttributeStatesFromCriteria();\r\n  }\r\n\r\n  @Output() filterCriteriaChange = new EventEmitter<FilterCriterium[]>();\r\n\r\n  get filterCriteria() {\r\n    return this._filterCriteria;\r\n  }\r\n\r\n  private _filterCriteria: FilterCriterium[] = [];\r\n\r\n  private _objectStructure: ObjectStructureNode | null = null;\r\n\r\n  get objectStructure(): ObjectStructureNode | null {\r\n    return this._objectStructure\r\n  }\r\n\r\n  private _complexProperties: ComplexPropertiesNode | null = null;\r\n\r\n  get complexProperties(): ComplexPropertiesNode | null {\r\n    return this._complexProperties;\r\n  }\r\n\r\n  toggleAttribute(attrib: CriteriaSelectObjectAttribute) {\r\n    attrib.checked = !attrib.checked;\r\n    if (attrib.checked === false) {\r\n      attrib.valueChecked = false;\r\n    }\r\n\r\n    this.handleFilterCriteriumAttributeStateChange(attrib);\r\n  }\r\n\r\n  toggleAttributeValue(attrib: CriteriaSelectObjectAttribute) {\r\n    attrib.valueChecked = !attrib.valueChecked;\r\n    attrib.checked = attrib.valueChecked;\r\n\r\n    this.handleFilterCriteriumAttributeStateChange(attrib);\r\n  }\r\n\r\n  _defineFilterString(attrib: CriteriaSelectObjectAttribute) {\r\n    let substring = `[I][${attrib.id}].Value`;\r\n\r\n    if (attrib.valueChecked) {\r\n      substring += `[F][0]=${this.formatValuePipe.transform(attrib.value)}`;\r\n    }\r\n    return substring;\r\n  }\r\n\r\n  _addFilterCriteria(attrib: CriteriaSelectObjectAttribute) {\r\n    // add a new entry\r\n    this.filterCriteria.push({\r\n      name: attrib.name,\r\n      value: attrib.valueChecked ? attrib.value : undefined,\r\n      namedValue: attrib.valueChecked ? this.normalizedValue(attrib, true) : undefined,\r\n      id: attrib.id,\r\n      subString: this._defineFilterString(attrib),\r\n    });\r\n  }\r\n\r\n  _updateFilterCriteria(attrib: CriteriaSelectObjectAttribute, index: number) {\r\n    // update an existing entry\r\n    this.filterCriteria[index] = {\r\n      ...this.filterCriteria[index],\r\n      name: attrib.name,\r\n      value: attrib.valueChecked ? attrib.value : undefined,\r\n      namedValue: attrib.valueChecked ? this.normalizedValue(attrib, true) : undefined,\r\n      subString: this._defineFilterString(attrib),\r\n    };\r\n  }\r\n\r\n  // Helper function for rounding to specified decimals\r\n  private roundToDecimal(value: number, decimal: number): number {\r\n    const multiplier = Math.pow(10, decimal);\r\n    return Math.round(value * multiplier) / multiplier;\r\n  }\r\n\r\n  titleForAttribute(attribute: CriteriaSelectObjectAttribute): string {\r\n    // Translation moved to implementation to not run the translation \r\n    // for many values which don't need it\r\n    if (attribute.value === null || attribute.value === undefined) {\r\n      return this.translateService.instant('_Not_defined');\r\n    } else if (attribute.value === '') {\r\n      return this.translateService.instant('_Empty_value');\r\n    }\r\n    return String(attribute.value);\r\n  }\r\n\r\n  normalizedValue(attribute: CriteriaSelectObjectAttribute, forFilterCriteria: boolean = false): string {\r\n    // Translation moved to implementation to not run the translation \r\n    // for many values which don't need it\r\n    if (attribute.value === null || attribute.value === undefined) {\r\n      return forFilterCriteria ? this.translateService.instant(\"_Not_defined\") : \"...\";\r\n    }\r\n\r\n    if (attribute.value === '') {\r\n      return forFilterCriteria ? this.translateService.instant(\"_Empty_value\") : \"''\";\r\n    }\r\n\r\n    if (attribute?.control === \"Enumeration\" && attribute.enumValues) {\r\n      const result: string = String(attribute.enumValues[Number(attribute.value)]);\r\n      return result;\r\n    }\r\n\r\n    // Handle numeric rounding\r\n    if (!forFilterCriteria &&\r\n      attribute.type === 'double' &&\r\n      attribute.decimal &&\r\n      typeof (attribute.value) === 'number') {\r\n      const roundedValue = this.roundToDecimal(attribute.value, attribute.decimal);\r\n      return String(roundedValue);\r\n    }\r\n\r\n    if (attribute?.control === \"Checkbox\") {\r\n      return (attribute.value === 1) ? \"True\" : \"False\";\r\n    }\r\n\r\n    // Handle datetime transformation\r\n    if (attribute?.type === \"datetime\" && typeof (attribute.value) === 'string') {\r\n      return this.datetimePipe.transform(attribute.value);\r\n    }\r\n\r\n    return String(attribute.value);\r\n  }\r\n\r\n  handleFilterCriteriumAttributeStateChange(attrib: CriteriaSelectObjectAttribute) {\r\n    const index = this.filterCriteria.findIndex(x => x.id === attrib.id);\r\n    // FILTER CRITERIA ALREADY EXISTS\r\n    if (index >= 0) {\r\n      if (attrib.checked === false && attrib.valueChecked === false) {\r\n        // REMOVE\r\n        // filterCriteria no longer used (left / right checkboxes not checked)\r\n        this.filterCriteria.splice(index, 1);\r\n      } else {\r\n        // UPDATE\r\n        // filterCriteria still used, but value should be used (right checkbox checked)\r\n        this._updateFilterCriteria(attrib, index);\r\n      }\r\n      this.filterCriteriaChange.emit(this.filterCriteria);\r\n    }\r\n    // FILTER CRITERIA DOES NOT EXIST and MAX CRITERIA NOT REACHED\r\n    else if (this.filterCriteria.length < MaxFilterCriteria) {\r\n      // ADD\r\n      this._addFilterCriteria(attrib);\r\n      this.filterCriteriaChange.emit(this.filterCriteria);\r\n    }\r\n  }\r\n\r\n  handleObjectStructureNodeSelected(node: ObjectStructureNode) {\r\n    this._currentObjectId$.next(node.id);\r\n  }\r\n\r\n  handleComplexPropertyNodeSelected(node: ComplexPropertiesNode) {\r\n    this._currentPropertiesObjectId$.next(node.id);\r\n  }\r\n\r\n  private _createObjectProperties(objectId: string, revision: number | undefined) {\r\n    this._loadObjectProperties(objectId, revision)?.subscribe({\r\n\r\n      // properties response is badly structured, nearly impossible to create class structure from it. Therefore using shortcut\r\n      // any for json response\r\n\r\n      // eslint-disable-next-line  @typescript-eslint/no-explicit-any\r\n      next: (propertiesData: any) => {\r\n        \r\n        this.objectAttributeGroups = this._createAttributeGroupsFromResponse(propertiesData);\r\n        this._syncAttributeStatesFromCriteria();\r\n      },\r\n      error: () => {\r\n        this.objectAttributeGroups = [];\r\n      }\r\n    }\r\n    )\r\n\r\n  }\r\n\r\n  // eslint-disable-next-line  @typescript-eslint/no-explicit-any\r\n  private _createAttributeGroupsFromResponse(propertiesData: any) {\r\n\r\n    const groups: Array<CriteriaSelectObjectAttributeGroup> = [];\r\n    let localizedAttribGroups = null;\r\n    if (propertiesData.localizedAttributeGroups) {\r\n      localizedAttribGroups = propertiesData.localizedAttributeGroups;\r\n    }\r\n\r\n    if (!propertiesData.attributes) {\r\n      return groups;\r\n    }\r\n\r\n    const attribGroups = propertiesData.attributes;\r\n    for (const [groupName, attribsObject] of Object.entries(attribGroups)) {\r\n\r\n      const newGroup: CriteriaSelectObjectAttributeGroup = {\r\n        name: groupName,\r\n        expanded: false,\r\n        attributes: []\r\n      };\r\n\r\n      if (localizedAttribGroups?.[groupName]) {\r\n        newGroup.name = localizedAttribGroups[groupName];\r\n      }\r\n\r\n      if (!attribsObject) {\r\n        continue;\r\n      }\r\n\r\n      for (const attrib of Object.values(attribsObject)) {\r\n\r\n        const newAttrib: CriteriaSelectObjectAttribute = {\r\n          id: attrib.id,\r\n          name: attrib.name,\r\n          description: attrib.description,\r\n          value: attrib.value,\r\n          isChangeable: attrib.isChangeable,\r\n          type: attrib.type,\r\n          checked: false,\r\n          valueChecked: false,\r\n          group: attrib.group,\r\n        }\r\n\r\n        // Add attribute information which is not always present\r\n        if (attrib.control) {\r\n          newAttrib.control = attrib.control;\r\n        }\r\n        if (attrib.defaultValue) {\r\n          newAttrib.defaultValue = attrib.defaultValue;\r\n        }\r\n        if (attrib.unit) {\r\n          newAttrib.unit = attrib.unit;\r\n        }\r\n        if (attrib.decimal) {\r\n          newAttrib.decimal = attrib.decimal;\r\n        }\r\n        if (attrib.enumdefinition) {\r\n          newAttrib.enumValues = attrib.enumdefinition;\r\n        }\r\n\r\n        newGroup.attributes.push(newAttrib);\r\n      }\r\n\r\n      groups.push(newGroup);\r\n    }\r\n\r\n    return groups;\r\n  }\r\n\r\n  private _syncAttributeStatesFromCriteria() {\r\n    this.objectAttributeGroups.forEach(group => {\r\n      group.attributes.forEach(attrib => {\r\n        const criteria = this._filterCriteria.find(x => x.id == attrib.id)\r\n        if (criteria) {\r\n          attrib.checked = true;\r\n          attrib.valueChecked = criteria.value !== undefined;\r\n        } else {\r\n          attrib.checked = false;\r\n          attrib.valueChecked = false;\r\n        }\r\n      })\r\n    })\r\n  }\r\n\r\n  private _loadObjectProperties(objectId: string, revision: number | undefined) {\r\n    if (!this.api) {\r\n      return;\r\n    }\r\n\r\n    return from(this.api.objects.get(objectId, revision, \"8\", undefined, false, undefined));\r\n  }\r\n\r\n  private _loadObjectStructure(objectId: string, revision: number | undefined) {\r\n    if (!this.api) {\r\n      return;\r\n    }\r\n\r\n    return from(this.api.objects.getTopology(objectId, revision, false, false, undefined));\r\n  }\r\n\r\n  private _loadObjectComplexPropertiesStructure(objectId: string, revision: number | undefined) {\r\n    if (!this.api) {\r\n      return;\r\n    }\r\n\r\n    return from(this.api.objects.getComplexPropertiesTopology(objectId, revision));\r\n  }\r\n\r\n  private _createComplexPropertiestructure(objectId: string, revision: number | undefined) {\r\n    this._loadObjectComplexPropertiesStructure(objectId, revision)?.subscribe({\r\n      next: (structureData) => {\r\n        if (structureData) {\r\n          const complexProps = ComplexPropertiesNodeBuilder.createFromResponse(structureData);\r\n          if (complexProps?.children?.length) {\r\n            this._complexProperties = complexProps;\r\n          } else {\r\n            this._complexProperties = null;\r\n          }\r\n        }\r\n      }\r\n    })\r\n  }\r\n\r\n  private _createObjectStructure(objectId: string, revision: number | undefined) {\r\n    this._loadObjectStructure(objectId, revision)?.subscribe({\r\n      next: (structureData) => {\r\n        if (structureData) {\r\n          this._objectStructure = ObjectStructureNodeBuilder.createFromResponse(structureData);\r\n        }\r\n      }\r\n    })\r\n  }\r\n}\r\n","<!-- Object structure-->\n<lib-expansion-panel>\n  <lib-expansion-panel-header>\n    <span class=\"criteria-select-object-properties-header\">\n      {{ \"_Object structure\" | translate }}</span\n    >\n  </lib-expansion-panel-header>\n  @if(objectStructure){\n    <lib-bimplus-object-structure\n      [objectStructure]=\"objectStructure\"\n      [hasCheckBox1]=\"false\"\n      [hasCheckBox2]=\"false\"\n      (nodeSelected)=\"handleObjectStructureNodeSelected($event)\"\n    >\n    </lib-bimplus-object-structure>\n  }\n</lib-expansion-panel>\n<!-- End Object structure-->\n\n<!-- Complex properties-->\n@if(complexProperties){\n<lib-expansion-panel>\n  <lib-expansion-panel-header>\n    <span class=\"criteria-select-object-properties-header\">\n      {{ \"_Object multiproperties tree\" | translate }}</span\n    >\n  </lib-expansion-panel-header>\n  <lib-bimplus-object-complex-properties\n    [complexProperties]=\"complexProperties\"\n    (nodeSelected)=\"handleComplexPropertyNodeSelected($event)\"\n  >\n  </lib-bimplus-object-complex-properties>\n</lib-expansion-panel>\n}\n<!-- End Complex properties-->\n\n<!-- Properties list-->\n@if(objectAttributeGroups.length > 0){\n<lib-expansion-panel>\n  <lib-expansion-panel-header>\n    <span class=\"criteria-select-object-properties-header\">\n      {{ \"_Object properties\" | translate }}</span\n    >\n  </lib-expansion-panel-header>\n\n  @for (attribGroup of objectAttributeGroups; track attribGroup) {\n  <lib-expansion-panel [expanded]=\"attribGroup.expanded\">\n    <lib-expansion-panel-header>\n      <span class=\"criteria-select-object-properties-group-header\">\n        {{ attribGroup.name }}\n      </span>\n    </lib-expansion-panel-header>\n    <div>\n      @for (attrib of attribGroup.attributes; track attrib) {\n      <div class=\"criteria-select-object-properties-attrib-row\">\n        <div class=\"criteria-select-object-properties-attrib-row-content\">\n          <div\n            class=\"criteria-select-object-properties-attrib-row-cell criteria-select-checkbox\"\n          >\n            <label\n              class=\"criteria-select-object-properties-attrib-row-cell-label\"\n            >\n              <input\n                type=\"checkbox\"\n                [checked]=\"attrib.checked\"\n                [disabled]=\"\n                  filterCriteria.length === MaxFilterCriteria && !attrib.checked\n                \"\n                (click)=\"toggleAttribute(attrib)\"\n                (keypress)=\"toggleAttribute(attrib)\"\n              />\n              <span></span>\n            </label>\n            <div class=\"criteria-select-object-properties-attrib-row-cell-text\">\n              {{ attrib.name }}\n            </div>\n          </div>\n          <div\n            class=\"criteria-select-object-properties-attrib-row-cell criteria-select-checkbox\"\n          >\n            <label\n              class=\"criteria-select-object-properties-attrib-row-cell-label\"\n            >\n              <input\n                type=\"checkbox\"\n                [checked]=\"attrib.valueChecked\"\n                [disabled]=\"\n                  filterCriteria.length === MaxFilterCriteria && !attrib.checked\n                \"\n                (click)=\"toggleAttributeValue(attrib)\"\n                (keypress)=\"toggleAttributeValue(attrib)\"\n              />\n              <span></span>\n            </label>\n            <div\n              class=\"criteria-select-object-properties-attrib-row-cell-text\"\n              title=\"{{ titleForAttribute(attrib) }}\"\n            >\n              {{ normalizedValue(attrib) }}\n            </div>\n          </div>\n        </div>\n      </div>\n      }\n    </div>\n  </lib-expansion-panel>\n  }\n</lib-expansion-panel>\n}\n<!-- End Properties list-->\n","import { AfterViewInit, Component, EventEmitter, Input, model, Output, ViewChild } from '@angular/core';\r\nimport { BimplusFlatTreeComponent } from '../../bimplus-flat-tree/bimplus-flat-tree.component';\r\nimport { FlatNode, TreeNode } from '../../bimplus-flat-tree/bimplus-flat-tree.interface';\r\nimport { BimplusOverlayMessageComponent } from '../../bimplus-overlay-message/bimplus-overlay-message.component';\r\nimport * as WebSdk from 'bimplus-websdk';\r\n\r\ntype TreeNodesLookup = Record<string, TreeNode>;\r\ntype TreeNodeObjectCounts = Record<string, number>;\r\n\r\n@Component({\r\n  selector: 'lib-object-filter-result',\r\n  imports: [\r\n    BimplusFlatTreeComponent,\r\n    BimplusOverlayMessageComponent,\r\n  ],\r\n  templateUrl: './object-filter-result.component.html',\r\n  styleUrl: './object-filter-result.component.less'\r\n})\r\nexport class ObjectFilterResultComponent implements AfterViewInit {\r\n\r\n  // #region public fields\r\n  @ViewChild(BimplusFlatTreeComponent) treeComponent: BimplusFlatTreeComponent | null = null;\r\n\r\n  @Input()\r\n  set filterResult(res: WebSdk.ObjectFilterStructureResponse | null) {\r\n    this._filterResult = res;\r\n    this._updateTreeData();\r\n  }\r\n\r\n  @Input()\r\n  set selectedObjects(selectedObjects: string[]) {\r\n    this._selectedObjects = selectedObjects;\r\n    this._syncSelectedObjects();\r\n  }\r\n\r\n  isFilterResultInvalid = model<boolean>(false);\r\n\r\n  // User has clicked on close button of overlay message\r\n  // Set the invalid filter back to false to remove overlay message\r\n  public setFilterResultValid() {\r\n    this.isFilterResultInvalid.set(false);\r\n  }\r\n\r\n  @Input() filterResultInvalidTitle: string = \"\";\r\n  @Input() filterResultInvalidText: string = \"\";\r\n\r\n  get treeData() {\r\n    return this._treeData;\r\n  }\r\n\r\n  @Output() nodeSelectionChanged = new EventEmitter<string[]>();\r\n  @Output() nodeDoubleClicked = new EventEmitter<string>();\r\n  @Output() nodeMouseEntered = new EventEmitter<string>();\r\n  @Output() nodeMouseLeft = new EventEmitter<string>();\r\n  // #endregion public fields\r\n\r\n  // #region public methods\r\n  ngAfterViewInit(): void {\r\n    if (this._treeData && this._treeData.length > 0) {\r\n      this._expandToObjectLevel(this._treeData[0]);\r\n    }\r\n  }\r\n\r\n  handleSelectedNodes(nodes: FlatNode[]) {\r\n    this.nodeSelectionChanged.emit(nodes.map(x => x.id));\r\n  }\r\n\r\n  getNodeObjectCounter(id: string) {\r\n    return this._treeNodeObjectCounts[id];\r\n  }\r\n\r\n  dblClickedObjectNode(node: TreeNode) {\r\n    this.nodeDoubleClicked.emit(node.id);\r\n  }\r\n\r\n  mouseEnterObjectNode(node: TreeNode) {\r\n    this.nodeMouseEntered.emit(node.id);\r\n  }\r\n\r\n  mouseLeaveObjectNode(node: TreeNode) {\r\n    this.nodeMouseLeft.emit(node.id);\r\n  }\r\n\r\n  expandToObjectLevel() {\r\n    if (this.treeData.length === 0)\r\n      return;\r\n\r\n    this._expandToObjectLevel(this._treeData[0]);\r\n  }\r\n\r\n  clearFilterResult() {\r\n    this._filterResult = null;\r\n    this._treeData = [];\r\n  }\r\n  // #endregion public methods\r\n\r\n  // #region private fields\r\n  private _filterResult: WebSdk.ObjectFilterStructureResponse | null = null;\r\n  private _treeData: TreeNode[] = [];\r\n  private _treeNodesLookup: TreeNodesLookup = {};\r\n  private _treeNodeObjectCounts: TreeNodeObjectCounts = {};\r\n  private _selectedObjects: string[] = [];\r\n  // #endregion private fields\r\n\r\n  // #region private methods\r\n  private _syncSelectedObjects() {\r\n\r\n    const nodes: TreeNode[] = []\r\n\r\n    for (const id of this._selectedObjects) {\r\n      const treeNode = this._treeNodesLookup[id];\r\n      if (treeNode) {\r\n        nodes.push(treeNode);\r\n      }\r\n    }\r\n\r\n    this.treeComponent?.reset_selection();\r\n\r\n    for (const node of nodes) {\r\n      this.treeComponent?.select_node(node.id);\r\n    }\r\n\r\n  }\r\n\r\n  private _updateObjectCounters() {\r\n    this._treeNodeObjectCounts = {};\r\n    this._countObjects(this.treeData[0]);\r\n  }\r\n\r\n  private _countObjects(node: TreeNode) {\r\n    if (node.nodeType && node.nodeType === \"objectNode\")\r\n      return 1;\r\n\r\n    let count = 0;\r\n    if (!node.children)\r\n      return 0;\r\n\r\n    for (const child of node.children) {\r\n      if (!child)\r\n        continue;\r\n\r\n      count += this._countObjects(child);\r\n    }\r\n\r\n    this._treeNodeObjectCounts[node.id] = count;\r\n    return count;\r\n  }\r\n\r\n  private _updateTreeData() {\r\n    if (!this._filterResult) {\r\n      return;\r\n    }\r\n\r\n    this._treeNodesLookup = {};\r\n    this._treeData = [this._convertFilterResultToTreeNode(this._filterResult.structure, this._treeNodesLookup)];\r\n    this._updateObjectCounters();\r\n  }\r\n\r\n  private _convertFilterResultToTreeNode(node: WebSdk.StructureNode, nodesLookup: TreeNodesLookup | undefined = undefined): TreeNode {\r\n\r\n    const treeNode: TreeNode = {\r\n      name: node.name,\r\n      id: node.id,\r\n      parent: node.parent\r\n    };\r\n\r\n    if (node.children) {\r\n      treeNode.children = [];\r\n      for (const child of node.children) {\r\n        const childTreeNode = this._convertFilterResultToTreeNode(child, nodesLookup);\r\n        treeNode.children.push(childTreeNode);\r\n      }\r\n    }\r\n\r\n    if (!treeNode.parent) {\r\n      treeNode.nodeType = \"rootNode\";\r\n    } else if (node.type === \"Structure\") {\r\n      treeNode.nodeType = \"structureNode\";\r\n    } else {\r\n      treeNode.nodeType = \"objectNode\"\r\n    }\r\n\r\n    if (nodesLookup) {\r\n      nodesLookup[treeNode.id] = treeNode;\r\n    }\r\n\r\n    return treeNode;\r\n  }\r\n\r\n  private _expandToObjectLevel(node: TreeNode) {\r\n    if (node.children) {\r\n      for (const child of node.children) {\r\n        if (child.nodeType && child.nodeType === \"objectNode\") {\r\n          return;\r\n        } else {\r\n          this._expandToObjectLevel(child);\r\n        }\r\n\r\n      }\r\n    }\r\n\r\n    this.treeComponent?.expand_node(node.id);\r\n  }\r\n  // #endregion private methods\r\n\r\n}\r\n","<lib-bimplus-flat-tree\n  paddingIndent=\"1.4rem\"\n  [treeData]=\"treeData\"\n  enableParentHighlighting=\"false\"\n  oneLevelMultiSelect=\"false\"\n  multiSelect=\"true\"\n  dataTestPrefix=\"object-filter-result-tree-\"\n  (selectedNodes)=\"handleSelectedNodes($event)\"\n  [customNodeTemplate]=\"objFilterResultNode\"\n></lib-bimplus-flat-tree>\n\n@if(isFilterResultInvalid()){\n<div class=\"message-overlay\">\n  <lib-bimplus-overlay-message\n    [title]=\"filterResultInvalidTitle\"\n    [message]=\"filterResultInvalidText\"\n    (close)=\"setFilterResultValid()\"\n  >\n  </lib-bimplus-overlay-message>\n</div>\n}\n\n<ng-template #objFilterResultNode let-node=\"node\">\n  @switch (node.nodeType) { @case (\"rootNode\") {\n  <div class=\"object-navigator-filter-result-root-node noselect\">\n    {{ node.name }} &nbsp;&#40; {{ getNodeObjectCounter(node.id) }} &#41;\n  </div>\n  } @case (\"structureNode\") {\n  <div class=\"noselect\">\n    {{ node.name }} &nbsp;&#40; {{ getNodeObjectCounter(node.id) }} &#41;\n  </div>\n  } @case (\"objectNode\") {\n  <span class=\"noselect\">\n    <div\n      class=\"noselect\"\n      (dblclick)=\"dblClickedObjectNode(node)\"\n      (mouseenter)=\"mouseEnterObjectNode(node)\"\n      (mouseleave)=\"mouseLeaveObjectNode(node)\"\n    >\n      {{ node.name }}\n    </div>\n  </span>\n  } }\n</ng-template>\n","import { FilterCriterium } from \"../components/bimplus-object-navigator/bimplus-object-navigator.interface\";\n\nconst DivsionIDSubstring = 'tabAttribElement.DivisionID';\n\nexport class FilterString {\n\n  constructor(filterString: string = \"\", maxFilterCriteria: number = 5) {\n    this._filterString = filterString;\n    this._maxFilterCriteria = maxFilterCriteria;\n  }\n\n  get filterString() {\n    return this._filterString;\n  }\n\n  private _filterString: string = \"\";\n  private _maxFilterCriteria: number = 5;\n\n  fromFilterCriteria(criteria: FilterCriterium[]) {\n    this._filterString = `[I]${DivsionIDSubstring}`;\n\n    for (const criterium of criteria) {\n      this._filterString += criterium.subString;\n    }\n\n    return this._filterString;\n  }\n\n  getReadableValuesFromFilterCriteria(criteria: FilterCriterium[]): Record<string, string> {\n    const readableValues: Record<string, string> = {};\n    for (const criterium of criteria) {\n      if (criterium.id && criterium.name)\n        readableValues[criterium.id] = criterium.name;\n    }\n\n    return readableValues;\n  }\n\n  toFilterCriteria(readableValues: Record<string, string> | undefined = undefined): FilterCriterium[] {\n    const criteria: FilterCriterium[] = [];\n\n    let firstModelIdCriteriaSkipped = false;\n\n    const parts = this._filterString.split('[I]');\n    for (const part of parts) {\n      if (part.length === 0) {\n        continue;\n      }\n\n      if (part.includes(DivsionIDSubstring) && !firstModelIdCriteriaSkipped) {\n        firstModelIdCriteriaSkipped = true;\n        continue;\n      }\n\n      criteria.push(this._parseFilterSubstring(part, readableValues));\n      if (criteria.length === this._maxFilterCriteria) {\n        break;\n      }\n    }\n\n    return criteria;\n  }\n\n  private _parseFilterSubstring(subString: string, readableValues: Record<string, string> | undefined = undefined): FilterCriterium {\n    let name = subString;\n    let id: string | undefined = undefined;\n\n    const indexOpenBrackets = subString.indexOf('[');\n    const indexCloseBrackets = subString.indexOf(']');\n\n    if (indexOpenBrackets >= 0 && indexCloseBrackets >= 0 && indexCloseBrackets > indexOpenBrackets) {\n      const readableId = subString.slice(indexOpenBrackets + 1, indexCloseBrackets);\n      id = readableId;\n      if (readableId && readableValues) {\n        const readableString = readableValues[readableId];\n        if (readableString) {\n          name = readableString;\n        }\n      }\n    } else if (subString.includes('.')) {\n      const splitted = subString.split('.');\n      name = splitted[splitted.length - 1];\n    }\n\n    return {\n      name: name,\n      subString: \"[I]\" + subString,\n      id: id\n    }\n  }\n\n}\n","import * as WebSdk from 'bimplus-websdk';\nimport { Observable, concatMap, from, map } from 'rxjs';\n\nexport class FilterStructureFetcher {\n\n  static fetchObjectFilterStructureFromSelection(projectId: string, filter: WebSdk.ObjectFilter, selectionObject: WebSdk.ExportObject, api: WebSdk.Api): Observable<WebSdk.ObjectFilterStructureResponse> {\n    const isTemporary = !filter.id;\n    let filterId = filter.id ? filter.id : \"\";\n\n    let observeable: Observable<WebSdk.ObjectFilterStructureResponse> | null = null;\n\n    if (!isTemporary) {\n      observeable = from(api.exportService.createExportSelection(projectId, JSON.stringify(selectionObject))).pipe(\n        concatMap(selectionObj => {\n          if (!selectionObj?.id) {\n            throw new Error('Failed to create selection object');\n          }\n          return from(api.objectFilters.getSelectionFilteredObjects(selectionObj.id, filterId, undefined, undefined));\n        })\n      )\n    } else {\n      observeable = from(api.objectFilters.post(JSON.stringify(filter), projectId)).pipe(\n        concatMap(filterObj => {\n          if (!filterObj?.id) {\n            throw new Error('Failed to create temporary filter object');\n          }\n\n          filterId = filterObj.id;\n\n          return from(api.exportService.createExportSelection(projectId, JSON.stringify(selectionObject)));\n        }),\n        concatMap(selectionObj => {\n          if (!selectionObj?.id) {\n            throw new Error('Failed to create selection object');\n          }\n          return from(api.objectFilters.getSelectionFilteredObjects(selectionObj.id, filterId, undefined, undefined)).pipe(\n            map((filterResult) => {\n              api.objectFilters.delete(filterId);\n              return filterResult;\n            })\n          );\n        })\n      )\n    }\n    return observeable;\n  }\n\n}\n","import { Component, EventEmitter, HostBinding, Input, OnInit, Output,  ViewChild, ViewEncapsulation } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport * as WebSdk from 'bimplus-websdk';\nimport { BehaviorSubject ,from } from 'rxjs';\nimport { CommonModule} from '@angular/common';\nimport { FilterCriteriaSelectionMode, FilterCriterium, FilterType, MaxFilterCriteria } from './bimplus-object-navigator.interface';\nimport { FilterCriteriumComponent } from './filter-criterium/filter-criterium.component';\nimport { ExpansionPanelComponent } from '../expansion-panel/expansion-panel.component';\n\nimport { NgSelectModule } from '@ng-select/ng-select';\nimport { BimplusSidenavDrawerContentComponent } from '../bimplus-sidenav-drawer-content/bimplus-sidenav-drawer-content.component';\nimport { ExpansionPanelHeaderComponent } from '../expansion-panel-header/expansion-panel-header.component';\nimport { ExpansionPanelHeaderActionsComponent } from '../expansion-panel-header-actions/expansion-panel-header-actions.component';\nimport { BimplusLocalizedWidgetComponent } from '../bimplus-localized-widget/bimplus-localized-widget.component';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { CriteriaSelectObjectPropertiesComponent } from './criteria-select-object-properties/criteria-select-object-properties.component';\nimport { ObjectFilterResultComponent } from './object-filter-result/object-filter-result.component';\nimport { BimplusContextMenuComponent } from  '../bimplus-context-menu/bimplus-context-menu.component'\nimport { BimplusContextMenuItem } from '../bimplus-context-menu/bimplus-context-menu.interface';\nimport { FilterString } from '../../utils/filterString';\nimport { FilterStructureFetcher } from '../../utils/filterStructureFetcher';\nimport { BimplusScrollableContainerComponent } from '../bimplus-scrollable-container/bimplus-scrollable-container.component'\n\n@Component({\n  selector: 'lib-bimplus-object-navigator',\n  imports: [CommonModule,\n    FormsModule,\n    NgSelectModule,\n    FilterCriteriumComponent,\n    ExpansionPanelComponent,\n    ExpansionPanelHeaderComponent,\n    ExpansionPanelHeaderActionsComponent,\n    BimplusSidenavDrawerContentComponent,\n    TranslateModule,\n    CriteriaSelectObjectPropertiesComponent,\n    BimplusContextMenuComponent,\n    ObjectFilterResultComponent,\n    BimplusScrollableContainerComponent\n  ],\n  templateUrl: './bimplus-object-navigator.component.html',\n  styleUrl: './bimplus-object-navigator.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusObjectNavigatorComponent extends BimplusLocalizedWidgetComponent implements OnInit {\n\n  constructor(translateService:  TranslateService){\n    super(translateService)\n  }\n\n  // #region public fields\n  @ViewChild(ObjectFilterResultComponent) objectFilterResult: ObjectFilterResultComponent | null = null;\n\n  @Input()\n  hideFilterContextMenu: boolean = false;\n\n  @Input()\n  filterContextMenu: Array<BimplusContextMenuItem> = [];\n\n  @Input()\n  set filterTypes(types : Array<FilterType>){\n    this._filterTypes = types;\n    if(this._filterTypes.length >0)\n      this.activeFilterType = this._filterTypes[0];\n  }\n\n  get filterTypes():Array<FilterType>{\n    return this._filterTypes;\n  }\n\n  set activeFilterType(value : FilterType | null){\n    this.activeFilterTypeSubject$.next(value);\n  }\n\n  get activeFilterType() : FilterType | null{\n    return this.activeFilterTypeSubject$.getValue();\n  }\n\n  activeFilterTypeSubject$ = new BehaviorSubject<FilterType | null> (null);\n  activeFilterSubject$ = new BehaviorSubject<WebSdk.ObjectFilter | null> (null);\n\n  set activeFilter(filter : WebSdk.ObjectFilter | null){\n\n    // New active filter is selected. Apply filter button should be enabled\n    this.filterCriteriaChanged = true;\n\n    if(filter && !filter.id){ // Switching to custom filter will restore the default custom filter\n      this._setDefaultCustomFilterString(filter);\n    }\n\n    this.activeFilterSubject$.next(filter);\n  }\n\n  get activeFilter() : WebSdk.ObjectFilter | null{\n    return this.activeFilterSubject$.getValue();\n  }\n\n  @Input()\n  filters : WebSdk.ObjectFiltersResponse | null = null;\n\n  filterCriteria : FilterCriterium[] = []\n  filterCriteriaChanged : boolean = false;\n  maxFilterCriteria: number = MaxFilterCriteria;\n\n  @Input()\n  api : WebSdk.Api | null = null;\n\n  @Input()\n  projectId : string = ''\n\n  @HostBinding('class.object-navigator') objNavClassClass: boolean = true;\n\n  filterCriteriaSelectionMode$ = new BehaviorSubject<FilterCriteriaSelectionMode>(FilterCriteriaSelectionMode.None);\n\n  @Output()\n  filterCriteriaSelectionModeChanged = new EventEmitter<FilterCriteriaSelectionMode>();\n\n  @Input()\n  selectedObjectId : string | null = null;\n\n  @Input()\n  selectedRevision : number | undefined = undefined;\n\n  @Input()\n  selectedObjects : string[] = [];\n\n  @Input()\n  selectionObject : WebSdk.ExportObject | null = null;\n\n  get filterResult(){\n    return this._filterResult;\n  }\n\n  @Output()\n  filterResultObjectSelectionChanged = new EventEmitter<string[]>();\n\n  @Output()\n  filterResultObjectDoubleClicked = new EventEmitter<string>();\n\n  @Output()\n  filterResultObjectMouseEntered = new EventEmitter<string>();\n\n  @Output()\n  filterResultObjectMouseLeft = new EventEmitter<string>();\n\n  @Output()\n  pipetteActiveStatus = new EventEmitter<boolean>();\n\n  FilterCriteriaSelectionMode = FilterCriteriaSelectionMode; // Expose enum to template\n\n  public isLoadingResults = false;\n\n  public filterResultInvalidated = false;\n  // #endregion public fields\n\n  // #region private fields\n  private _filterResult : WebSdk.ObjectFilterStructureResponse | null = null;\n  private _filterTypes : Array<FilterType> = [];\n  // #endregion private fields\n\n  // #region public methods\n  ngOnInit() {\n\n    this.activeFilterTypeSubject$.subscribe({\n      next: (v) => {\n        if(!this.projectId || !this.api || !v){\n          return;\n        }\n\n        if (this._filterResult) {\n          // Filter results are available and visibility of model/layer was changed\n          // Invalidate filter results => show overlay info dailog\n          this.filterResultInvalidated = true;\n        }\n\n        this.activeFilter = null;\n\n        this.loadCurrentLayerFilters(this.projectId, v.id)?.subscribe({\n            next: (value) => {\n              this.filters = [this._createDefaultCustomFilter(v.id), ...value];\n              this.activeFilter = this.filters[0];\n              this._applyCustomOrStoredFilter();\n            },\n            error: err => {throw new Error (err)},\n          }\n        )}\n    });\n\n    this.activeFilterSubject$.subscribe({\n      next: (v) => {\n        if(!v)\n          return;\n\n        this.filterCriteria = this.parseFilterString(v);\n        this._applyCustomOrStoredFilter();\n      }\n    });\n\n    this.filterCriteriaSelectionMode$.subscribe({\n      next: (v) => {\n        this.filterCriteriaSelectionModeChanged.emit(v)\n      }\n    })\n\n    if( this.filterTypes.length > 0){\n      this.activeFilterType = this.filterTypes[0];\n    }\n  }\n\n  loadCurrentLayerFilters(projectId : string, layerId : string){\n    if(!this.api){\n      return;\n    }\n    return from(this.api.objectFilters.get(layerId,projectId));\n  }\n\n  parseFilterString(filter : WebSdk.ObjectFilter){\n    const filterString = new FilterString(filter.filterString, this.maxFilterCriteria);\n    return filterString.toFilterCriteria(filter.readableValues);\n  }\n\n  deleteFilterCriterium(index: number){\n    this.filterCriteria.splice(index, 1);\n    this.filterCriteria = [...this.filterCriteria];\n    // Filter criteria was removed. Apply filter button should be enabled\n    this.filterCriteriaChanged = true;\n    this.activateModifiedCustomFilter();\n  }\n\n  setFilterCriteriaSelectionMode(mode: FilterCriteriaSelectionMode) {\n    const isSameMode = this.filterCriteriaSelectionMode$.getValue() === mode;\n    this.filterCriteriaSelectionMode$.next(isSameMode ? FilterCriteriaSelectionMode.None : mode);\n    this.handlePipetteActiveStatus(!isSameMode);\n  }\n  \n  applyFilterDisabled() : boolean {\n    // Apply filter button should be disabled when no filter criteria are selected\n    // or filter criteria was already applied and no new criteria was selected\n    return this.filterCriteria.length === 0 || ! this.filterCriteriaChanged;\n  }\n\n  applyFilter(){\n    this.handlePipetteActiveStatus(false /* disable pipette cursor */);\n    this.filterCriteriaSelectionMode$.next(FilterCriteriaSelectionMode.None);\n    this._filterResult = null;\n    // Filter results will be updated again, so they are no longer invalid\n    this.filterResultInvalidated = false;\n\n    // Custom filter is selected\n    if(this.activeFilter && !this.activeFilter.id){\n      this.activeFilter.filterString = new FilterString().fromFilterCriteria(this.filterCriteria);\n    }\n\n    if(this.selectionObject){\n      this._applySelectionObjectFilter(this.activeFilter);\n    }\n  }\n\n  handleFilterResultSelectionChanged(selection : string[]){\n    this.filterResultObjectSelectionChanged.emit(selection);\n  }\n\n  handleFilterResultObjectDoubleClicked(selection : string){\n    this.filterResultObjectDoubleClicked.emit(selection);\n  }\n\n  handleFilterResultObjectMouseEntered(selection : string){\n    this.filterResultObjectMouseEntered.emit(selection);\n  }\n\n  handleFilterResultObjectMouseLeft(selection : string){\n    this.filterResultObjectMouseLeft.emit(selection);\n  }\n\n  handlePipetteActiveStatus(status: boolean) {\n    this.pipetteActiveStatus.emit(status);\n  }\n\n  filterCriteriaWasChanged(/*filterCriteria: FilterCriterium[]*/) {\n    // Some new filter criteria was selected. Apply filter button should be enabled\n    this.filterCriteriaChanged = true;\n  }\n\n  activateModifiedCustomFilter(){\n    // When existing filter is changed, Custom filter will be selected and filter settings need to be cloned. Nothing is done when custom filter is already active\n    if(this.activeFilter?.id && this.filters){\n\n      // Copy filter string from current criteria settings to custom filter\n      this.filters[0].filterString = new FilterString().fromFilterCriteria(this.filterCriteria);\n      this.filters[0].readableValues = new FilterString().getReadableValuesFromFilterCriteria(this.filterCriteria);\n\n      this.activeFilterSubject$.next(this.filters[0]);\n    }\n  }\n  // #endregion public methods\n\n  // #region private methods\n  private _applySelectionObjectFilter(activeFilter : WebSdk.ObjectFilter | null){\n\n    if(!this.api || !this.selectionObject || !activeFilter){\n      return;\n    }\n\n    this.selectionObject.singleUse = true;\n    this.selectionObject.selection.singleuse = true;\n\n    this.isLoadingResults = true;\n\n    FilterStructureFetcher.fetchObjectFilterStructureFromSelection(this.projectId, activeFilter, this.selectionObject, this.api).subscribe({\n      next: (filterResult) => {\n        this._filterResult = filterResult;\n        this.isLoadingResults = false;\n        // Fetching new results finished. Apply filter button should be disabled\n        this.filterCriteriaChanged = false;\n      }\n    });\n  }\n\n  private _setDefaultCustomFilterString(filter: WebSdk.ObjectFilter){\n    const typeAttribId = \"a0e8ae2c-c869-4ec3-9019-25d3704be707\";\n    filter.filterString = `[I][${typeAttribId}].Value`;\n    filter.readableValues = {};\n    filter.readableValues[typeAttribId] = \"Type\"; // Provide readable criterium name for type\n  }\n\n  private _createDefaultCustomFilter(disciplineID: string) : WebSdk.ObjectFilter{\n\n    const filter = {\n      module: \"00000000-0000-0000-0000-000000000000\",\n      category: \"\",\n      disciplineID: disciplineID,\n      name: \"Custom filter\",\n      filterString:  \"\",\n      isDefault: false,\n      disableSortByModels: false,\n    }\n\n    this._setDefaultCustomFilterString(filter);\n    return filter;\n  }\n\n  private _applyCustomOrStoredFilter() {\n    if(this.activeFilter && this.activeFilter.id){\n      // Stored filter is selected. Results must be applied automatically.\n      this.applyFilter();\n    } else {\n      // Custom filter is selected. Properties of selected object must be shown again.\n      if (this.selectedObjectId) {\n        this.setFilterCriteriaSelectionMode(FilterCriteriaSelectionMode.SelectObjectProperties);\n      } else {\n        this.objectFilterResult?.clearFilterResult();\n      }\n    }\n  }\n  // #endregion private methods\n\n}\n","<lib-bimplus-sidenav-drawer-content [header]=\"'_Object navigator' | translate\"\n    [isLoading]=\"isLoadingResults\"\n    [loadingSpinnerText]=\"'_Loading_Filter_Results' | translate\"\n>\n    <div class=\"object-navigator-content-container\">\n        @if(filterTypes.length > 0){\n            <div class=\"description\">\n                {{\"_Select_an_object_using_Object_Picker\" | translate}}\n            </div>\n            <div class=\"object-navigator-filters-type\">\n                <ng-select data-test=\"object-navigator-filter-types-dropdown\" class=\"object-navigator-dropdown\" [(ngModel)]=\"activeFilterType\" [clearable]=\"false\" [searchable]=\"false\">\n                    <ng-option *ngFor=\"let type of filterTypes\" [value]=\"type\">{{type.name}}</ng-option>\n                </ng-select>\n            </div>\n            <div class=\"object-navigator-filters-name\">\n                <ng-select data-test=\"object-navigator-filters-name-dropdown\" class=\"object-navigator-dropdown\" [(ngModel)]=\"activeFilter\"  [clearable]=\"false\" [disabled]=\"!filters\" [searchable]=\"false\">\n                    <ng-option *ngFor=\"let filter of filters\" [value]=\"filter\">{{filter.name}}</ng-option>\n                </ng-select>\n\n                @if(!hideFilterContextMenu){\n                    <lib-bimplus-context-menu class=\"object-navigator-filters-name-context-menu\"\n                    [items]=\"filterContextMenu\"\n                    *ngIf=\"filterContextMenu?.length\"\n                >\n                </lib-bimplus-context-menu>\n                }\n\n            </div>\n\n            <lib-expansion-panel class=\"object-navigator-filter-criteria-panel\">\n                <lib-expansion-panel-header>\n                    <span class=\"object-navigator-filter-criteria-header\">\n                        {{ \"_Assign_Objects_Selection_Mode\" | translate }} &#40;{{ filterCriteria.length }}/{{ maxFilterCriteria }}&#41;\n                    </span>\n                    <lib-expansion-panel-header-actions>\n                        <div class=\"object-navigator-pick-object-button\"\n                          [ngClass]=\"filterCriteriaSelectionMode$.getValue() === FilterCriteriaSelectionMode.SelectObjectProperties? 'active' : ''\"\n                          (click)=\"setFilterCriteriaSelectionMode(FilterCriteriaSelectionMode.SelectObjectProperties)\"\n                          (keypress)=\"setFilterCriteriaSelectionMode(FilterCriteriaSelectionMode.SelectObjectProperties)\"\n                          [title]=\"'_Object_Picker'| translate\"\n                        ></div>\n                    </lib-expansion-panel-header-actions>\n                </lib-expansion-panel-header>\n\n                <div class=\"filter-criteria-container\">\n                @for (criterium of filterCriteria; track criterium; let  i = $index) {\n                    <app-filter-criterium\n                        [criterium] = \"criterium\"\n                        [indent]=\"i*0.8\"\n                        (deleteCriterium)=\"deleteFilterCriterium(i)\"\n                    ></app-filter-criterium>\n                }\n                </div>\n            </lib-expansion-panel>\n\n            @switch(filterCriteriaSelectionMode$.getValue()){\n                @case(FilterCriteriaSelectionMode.SelectObjectProperties){\n                    @if(!selectedObjectId){\n                        <p id=\"NoObjectSelected\">{{ \"_NoObjectSelected\" | translate}}</p>\n                    }\n                }\n            }\n\n            <div class=\"object-navigator-apply-button-row\">\n                <button class=\"primary-button\" \n                    [class.disabled]=\"applyFilterDisabled()\"\n                    [disabled]=\"applyFilterDisabled()\"\n                    (click)=\"applyFilter()\"\n                > \n                    {{\"_Apply filter\" | translate}}\n                </button>\n            </div>\n\n            <div class=\"object-navigator-separator\"></div>\n\n            @switch(filterCriteriaSelectionMode$.getValue()){\n                @case(FilterCriteriaSelectionMode.SelectObjectProperties){\n                    @if(selectedObjectId){\n                        <div class=\"scrollable-content-container\">\n                          <lib-bimplus-scrollable-container>\n                            <lib-criteria-select-object-properties\n                              [api]=\"api\"\n                              [selectedLanguage]=\"selectedLanguage\"\n                              [localizedStrings]=\"localizedStrings\"\n                              [(filterCriteria)]=\"filterCriteria\"\n                              [rootObjectId]=\"selectedObjectId\"\n                              [revision]=\"selectedRevision\"\n                              (filterCriteriaChange)=\"filterCriteriaWasChanged()\"\n                            >\n                            </lib-criteria-select-object-properties>\n                          </lib-bimplus-scrollable-container>\n                        </div>\n                    }\n                }\n                @case(FilterCriteriaSelectionMode.SelectAttributes){\n\n                }\n                @default{\n                    @if (filterResult) {\n                        <div class=\"scrollable-content-container\">\n                            <lib-bimplus-scrollable-container>\n                                <lib-object-filter-result\n                                    [filterResult]=\"filterResult\"\n                                    [selectedObjects]=\"selectedObjects\"\n                                    [isFilterResultInvalid]=\"filterResultInvalidated\"\n                                    [filterResultInvalidTitle]=\"'Result_is_Invalid' | translate\"\n                                    [filterResultInvalidText]=\"'Selection_in_Project_navigator_has_changed' | translate\"\n                                    (nodeSelectionChanged)=\"handleFilterResultSelectionChanged($event)\"\n                                    (nodeDoubleClicked)=\"handleFilterResultObjectDoubleClicked($event)\"\n                                    (nodeMouseEntered)=\"handleFilterResultObjectMouseEntered($event)\"\n                                    (nodeMouseLeft)=\"handleFilterResultObjectMouseLeft($event)\"\n                                ></lib-object-filter-result>\n                            </lib-bimplus-scrollable-container>\n                        </div>\n                    }\n                }\n            }\n        }\n        @else {\n            <div data-test=\"object-navigator-no-filter-types-message\" class=\"object-navigator-no-filter-types\"> {{\"_No_visible_models_found\" | translate}} </div>\n        }\n    </div>\n</lib-bimplus-sidenav-drawer-content>\n","import {\n  Component\n  , ViewEncapsulation\n  , Input\n  , EventEmitter\n  , Output\n  , ElementRef\n  , OnChanges\n  , SimpleChanges\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ClickOutsideDirective } from '../../directives/click-outside/click-outside.directive';\nimport { TooltipMessageData, TooltipMessagePosition } from './bimplus-tooltip-message.interface'\n@Component({\n  selector: 'lib-bimplus-tooltip-message',\n  imports: [CommonModule, ClickOutsideDirective],\n  templateUrl: './bimplus-tooltip-message.component.html',\n  styleUrl: './bimplus-tooltip-message.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\n\nexport class BimplusTooltipMessageComponent  implements OnChanges  {\n  private _element: HTMLElement;\n  constructor(private el: ElementRef) {\n    this._element = this.el.nativeElement.shadowRoot;\n  }\n\n    // Getter for _element\n    public get element(): HTMLElement {\n      return this._element;\n    }\n\n  @Input() messagePosition: TooltipMessagePosition = {\n    posX: 0,\n    posY: 0,\n  };\n\n  @Input() messageData: TooltipMessageData = {};\n\n  @Input() messageVisibility: boolean = false;\n  @Output() messageVisibilityChange = new  EventEmitter<boolean>();\n\n  protected _clickOutside() {\n    this.messageVisibility = false;\n    this.messageVisibilityChange.emit(this.messageVisibility)\n  }\n\n  //<<Calculation of the correct position of the tooltip\n  private _resizeObserver!: ResizeObserver;\n  protected _messageParentElement!: ElementRef;\n\n  protected _parentWidth: number = 0;\n  protected _parentHeight: number = 0;\n\n  get messageParent(): ElementRef {\n    return this._messageParentElement;\n  }\n\n  @Input() set messageParent(element: ElementRef) {\n    this._messageParentElement = element;\n    if(!this._messageParentElement) {\n      return;\n    }\n\n    this._resizeObserver = new ResizeObserver(entries => {\n      for (const entry of entries) {\n        const { width, height } = entry.contentRect;\n        this._parentWidth = width;\n        this._parentHeight = height;        \n      }\n    });\n\n    this._resizeObserver.observe(this._messageParentElement.nativeElement);\n  }\n\n  tooltipRectangleIsOutOfParentRectangleX(tooltipRectangle: DOMRect, parentRectangle: DOMRect): boolean {\n    return (tooltipRectangle.x + tooltipRectangle.width - parentRectangle.x - parentRectangle.width) > 0;\n  }\n  tooltipRectangleIsOutOfParentRectangleY(tooltipRectangle: DOMRect, parentRectangle: DOMRect): boolean {\n    return (tooltipRectangle.y + tooltipRectangle.height - parentRectangle.y - parentRectangle.height) > 0;\n  }\n\n  correctTooltipPositionX(oldPosX: number, flippedX: boolean, oldPosY: number, flippedY: boolean): void {\n    if(!this._messageParentElement) {\n      return;\n    }\n    const _tooltipElement = this._element.querySelector(\".tooltip-message\");\n    if(!_tooltipElement) {\n      return;\n    }\n    const _tooltipRectangle = _tooltipElement.getBoundingClientRect();\n    const _parentRectangle = this._messageParentElement.nativeElement.getBoundingClientRect();\n    if(Math.abs(_tooltipRectangle.x + _tooltipRectangle.width - oldPosX - _parentRectangle.left) > 3) {\n      this.messagePosition.posX = this.messagePosition.posX + oldPosX - (_tooltipRectangle.x + _tooltipRectangle.width);\n      setTimeout(() => {\n        this.correctTooltipPositionX(oldPosX, flippedX, oldPosY, flippedY);\n      }, 0); \n    } else if(flippedY && Math.abs(_tooltipRectangle.y + _tooltipRectangle.height - oldPosY - _parentRectangle.top) > 3) {\n      setTimeout(() => {\n        this.correctTooltipPositionY(oldPosX, flippedX, oldPosY, flippedY);\n      }, 0); \n    } else if(this.tooltipRectangleIsOutOfParentRectangleY(_tooltipRectangle, _parentRectangle)) {\n      this.messagePosition.posY = this.messagePosition.posY - _tooltipRectangle.height;\n      setTimeout(() => {\n        this.correctTooltipPositionY(oldPosX, flippedX, oldPosY, true);\n      }, 0);\n    }\n  }\n\n  correctTooltipPositionY(oldPosX: number, flippedX: boolean, oldPosY: number, flippedY: boolean): void {\n    if(!this._messageParentElement) {\n      return;\n    }\n    const _tooltipElement = this._element.querySelector(\".tooltip-message\");\n    if(!_tooltipElement) {\n      return;\n    }\n    const _tooltipRectangle = _tooltipElement.getBoundingClientRect();\n    const _parentRectangle = this._messageParentElement.nativeElement.getBoundingClientRect();\n    if(Math.abs(_tooltipRectangle.y + _tooltipRectangle.height - oldPosY - _parentRectangle.top) > 3) {\n      this.messagePosition.posY = this.messagePosition.posY + oldPosY - (_tooltipRectangle.y + _tooltipRectangle.height);\n      setTimeout(() => {\n        this.correctTooltipPositionY(oldPosX, flippedX, oldPosY, flippedY);\n      }, 0); \n    } else if(flippedX && Math.abs(_tooltipRectangle.x + _tooltipRectangle.width - oldPosX - _parentRectangle.left) > 3) {\n      setTimeout(() => {\n        this.correctTooltipPositionX(oldPosX, flippedX, oldPosY, flippedY);\n      }, 0); \n    } else if(this.tooltipRectangleIsOutOfParentRectangleX(_tooltipRectangle, _parentRectangle)) {\n      this.messagePosition.posX = this.messagePosition.posX - _tooltipRectangle.width;\n      setTimeout(() => {\n        this.correctTooltipPositionX(oldPosX, true, oldPosY, flippedY);\n      }, 0);\n    }\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['messageVisibility']) {\n      if(!changes['messageVisibility'].currentValue) {\n        return;\n      }\n      setTimeout(() => {\n        if(!this._messageParentElement) {\n          return;\n        }\n        const _oldPosX = this.messagePosition.posX;\n        const _oldPosY = this.messagePosition.posY;\n        const _tooltipElement = this._element.querySelector(\".tooltip-message\");\n        if(!_tooltipElement) {\n          return;\n        }\n        const _tooltipRectangle = _tooltipElement.getBoundingClientRect();\n        const _parentRectangle = this._messageParentElement.nativeElement.getBoundingClientRect();\n        if(this.tooltipRectangleIsOutOfParentRectangleX(_tooltipRectangle, _parentRectangle)) {\n          this.messagePosition.posX = this.messagePosition.posX - _tooltipRectangle.width;\n          setTimeout(() => {\n            this.correctTooltipPositionX(_oldPosX, true, _oldPosY, false);\n          }, 0);\n        } else if(this.tooltipRectangleIsOutOfParentRectangleY(_tooltipRectangle, _parentRectangle)) {\n          this.messagePosition.posY = this.messagePosition.posY - _tooltipRectangle.height;\n          setTimeout(() => {\n            this.correctTooltipPositionY(_oldPosX, false, _oldPosY, true);\n          }, 0);\n        }\n      }, 0);\n    }\n  }\n  //Calculation of the correct position of the tooltip>>\n}\n","<div *ngIf=\"messageVisibility\"\n  class=\"tooltip-message\"\n  libClickOutside\n  (clickOutside)=\"_clickOutside()\"\n  [ngStyle]=\"{\n    'top.px': messagePosition.posY\n    , 'left.px': messagePosition.posX\n  }\"\n>\n  <ng-content select=\".tooltip-message-title-content\"></ng-content>\n  <div\n    class=\"tooltip-message-title\"\n    *ngIf=\"messageData && messageData.title\"\n  >\n    {{messageData.title}}\n  </div>\n\n  <ng-content select=\".tooltip-message-messages-content\"></ng-content>\n  <div\n    class=\"tooltip-message-messages\"\n    *ngIf=\"messageData && messageData.messages\"\n  >\n    <ng-container *ngFor=\"let message of messageData.messages\">\n      <ng-container *ngIf=\"message.separatingLine\">\n        <div class=\"separating-line\"></div>\n      </ng-container>\n      <div class=\"tooltip-message-message\">\n        <span\n          *ngIf=\"message.label\"\n          class=\"label\"\n          [class.failed]=\"message.type==='failed'\"\n          [class.success]=\"message.type==='success'\"\n        >\n          {{message.label}}\n        </span>\n        <span\n          *ngIf=\"message.value\"\n          class=\"value\"\n        >\n          <ng-container *ngIf=\"message.label\">:</ng-container>\n          {{message.value}}\n        </span>\n      </div>\n    </ng-container>\n  </div>\n  \n  <ng-content select=\".tooltip-message-footer-content\"></ng-content>\n  <div\n    class=\"tooltip-message-footer\"\n    *ngIf=\"messageData && messageData.footer\"\n  >\n    {{messageData.footer}}\n  </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, ViewEncapsulation, Input, Output, EventEmitter, booleanAttribute, OnChanges, SimpleChanges} from '@angular/core';\nimport {TranslateService, TranslateModule} from '@ngx-translate/core';\nimport {BimplusLocalizedWidgetComponent} from \"./../bimplus-localized-widget/bimplus-localized-widget.component\"\nimport { fireEvent } from '../../utils/utils';\n\n@Component({\n  selector: 'lib-bimplus-touch-menu',\n  imports: [CommonModule, TranslateModule],\n  providers: [TranslateService],\n  templateUrl: './bimplus-touch-menu.component.html',\n  styleUrl: './bimplus-touch-menu.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\n\nexport class BimplusTouchMenuComponent extends BimplusLocalizedWidgetComponent implements  OnChanges{\n  constructor(translateService:  TranslateService){\n    super(translateService)\n  }\n  /**--------------------------------------------------------------------------\n  * List of menu items\n  * Note : action is used to identify action which should be executed\n  --------------------------------------------------------------------------*/\n  _menuItemsList = [\n    { mode:\"touch\", class: \"icon-touch-mode-toolbar\", textId: \"_Touch_Mode\"},\n    { mode:\"desktop\", class: \"icon-desktop-mode-toolbar\", textId: \"_Desktop_Mode\"},\n  ];\n\n  get _selectedItem() {\n    return this._menuItemsList.find(item => item.mode == this.selectedMode);\n  }\n\n  /**--------------------------------------------------------------------------\n  * States\n  --------------------------------------------------------------------------*/\n  _menuOpened = false;\n \n  /**--------------------------------------------------------------------------\n  * properties\n  --------------------------------------------------------------------------*/\n  @Input({ transform: booleanAttribute }) isTouch : boolean = false;\n\n  /**--------------------------------------------------------------------------\n  * properties\n  --------------------------------------------------------------------------*/\n  @Input() selectedMode : string = 'desktop';\n\n  /**--------------------------------------------------------------------------\n  * Zoom selected event\n  --------------------------------------------------------------------------*/\n  @Output() bimplusTouchModeSelected = new EventEmitter<string>();\n\n  \n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['localizedStrings']) {\n      this._localizedStrings.set(changes['localizedStrings'].currentValue);      \n    }\n  }\n\n  /**--------------------------------------------------------------------------\n  * Item clicked\n  --------------------------------------------------------------------------*/\n  _menuItemClicked( mode: string ){\n    fireEvent(this, \"bimplusTouchModeSelected\", mode);\n  }\n\n  /**--------------------------------------------------------------------------\n  * toggle menu open\n  --------------------------------------------------------------------------*/\n  _toggleOpened(){\n    this._menuOpened = !this._menuOpened;\n  }\n}\n","<div\n    class=\"bimcomp-overlay\"\n    [ngClass]=\"_menuOpened ? 'open' : ''\"\n    (click)=\"_toggleOpened()\"\n    (keypress)=\"_toggleOpened()\"\n    >\n</div>\n<div \n    class=\"dropdown\"\n    [ngClass]=\"{'open': _menuOpened, 'is-touch': isTouch}\"\n    (click)=\"_toggleOpened()\"\n    (keypress)=\"_toggleOpened()\"\n    >\n    <div class=\"dropdown-toggle\">\n        <div \n            class=\"main-icon\"\n            [ngClass]=\"this._selectedItem?.class ? this._selectedItem?.class : ''\"\n        ></div>\n        <span class=\"caret\"></span>\n    </div>\n    <ul \n        class=\"bimcomp-dropdown-menu\"\n        [ngClass]=\"{'open':this._menuOpened}\">\n        <li\n            *ngFor=\"let item of _menuItemsList\"\n            class=\"bimcomp-dropdown-menu-item\"\n            [ngClass]=\"{'selected':this.selectedMode === item.mode}\"\n            (click)=\"_menuItemClicked(item.mode)\"\n            (keypress)=\"_menuItemClicked(item.mode)\"\n            >\n            <div \n                class=\"icon\"\n                [ngClass]=\"item.class\"\n            ></div>\n            <span>{{item.textId | translate}}</span>\n        </li>\n    </ul>\n</div>\n","import { Injectable } from '@angular/core';\r\nimport { LocalizedStrings } from './../types/types'\r\nimport { BehaviorSubject } from 'rxjs/internal/BehaviorSubject';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class LanguageStringsService {\r\n\r\n  // #region public fields\r\n  set languageFilesUri(uri : string){\r\n    this._languageFilesUri = uri;\r\n  }\r\n  private readonly defaultLang: string = 'en';\r\n  currentLanguage$ = new BehaviorSubject<string> (this.defaultLang);\r\n  currentLanguageStrings$ = new BehaviorSubject<LocalizedStrings>({});\r\n\r\n  get currentLanguage() : string {\r\n    return this.currentLanguage$.getValue();\r\n  }\r\n\r\n  set currentLanguageStrings(langStrings : LocalizedStrings){\r\n    this.currentLanguageStrings$.next(langStrings);\r\n  }\r\n\r\n  get currentLanguageStrings() : LocalizedStrings {\r\n    return this.currentLanguageStrings$.getValue();\r\n  }\r\n  // #endregion public fields\r\n\r\n  // #region public methods\r\n  async setCurrentLanguage(lang : string){\r\n    this.currentLanguage$.next(lang);\r\n    await this.fetchLanguageStrings(lang);    \r\n  }\r\n\r\n  extractLocalizedStrings(stringIds : Array<string>) : LocalizedStrings {\r\n    const obj : LocalizedStrings = {};\r\n    for (const [key, value] of Object.entries(this.currentLanguageStrings)) {\r\n      if(typeof value == 'string' && stringIds.find(x=>x === key)){\r\n        obj[key] = value;\r\n      }\r\n    }\r\n\r\n    return obj;\r\n  }\r\n\r\n  async fetchLanguageStrings(lang : string){\r\n    const data = await fetch(`${this._languageFilesUri}/strings_${lang}.json`);\r\n    const dataJSON = await data.json();\r\n    // add missing translations from default language translations\r\n    if (lang !== this.defaultLang) {\r\n      const fallbackData = await fetch(`${this._languageFilesUri}/strings_en.json`);\r\n      const fallbackDataJSON = await fallbackData?.json?.();\r\n      const fallbackDataJSONIndexes = fallbackDataJSON && Object.keys(fallbackDataJSON);\r\n      if (fallbackDataJSONIndexes?.length) {\r\n        for (const index in fallbackDataJSONIndexes) {\r\n          const indexName = fallbackDataJSONIndexes[index];\r\n          if (!dataJSON[indexName]) {\r\n            dataJSON[indexName] = fallbackDataJSON[indexName];\r\n          }\r\n        }\r\n      }\r\n    }\r\n    this.currentLanguageStrings$.next(dataJSON);    \r\n  }\r\n  // #endregion public methods\r\n\r\n  // #region private fields  \r\n  private _languageFilesUri : string = \"/assets\"\r\n  // #endregion private fields\r\n}\r\n","import { Injectable } from '@angular/core';\n\nexport enum CursorType {\n  Pick = 'cursor-pick',\n  Hide = 'cursor-hide',\n}\n\n@Injectable({\n  providedIn: 'root'\n})\n\nexport class CursorsService {\n\n  // #region private fields\n  private _cursorElement: HTMLElement | null = null;\n  // #endregion private fields\n\n  // #region private methods\n  private getCursorElement(): HTMLElement | null {\n    if (this._cursorElement) {\n      return this._cursorElement;\n    } else {\n      return this.getMainViewportContainer();\n    }\n  }\n  private getMainViewportContainer() : HTMLElement | null {\n    const mainViewportContainer = document.getElementById('mainViewportContainer');\n    if (!mainViewportContainer) {\n      console.log(\"mainViewportContainer not found\");\n    }\n    return mainViewportContainer;\n  }\n\n  private addCursor(cursorType: CursorType) {\n    this.getCursorElement()?.classList.add(cursorType);\n  }\n\n  private removeCursor(cursorType: CursorType) {\n    this.getCursorElement()?.classList.remove(cursorType);\n  }\n  // #endregion\n\n\n  // #region public methods\n  setCursorElement(cursorElement: HTMLElement | null) {\n    this._cursorElement = cursorElement;\n  }\n\n  showPickCursor(show: boolean) {\n    if (show) {\n      this.addCursor(CursorType.Pick)\n    } else {\n      this.removeCursor(CursorType.Pick);\n    }\n  }\n\n  showHideCursor(show: boolean) {\n    if (show) {\n      this.addCursor(CursorType.Hide)\n    } else {\n      this.removeCursor(CursorType.Hide);\n    }\n  }\n  // #endregion\n}\n","import { Directive, ElementRef, HostListener, Input, Renderer2 } from '@angular/core';\n\n@Directive({\n  selector: '[libDraggableComponent]',\n  standalone: true\n})\nexport class ComponentDraggableDirective {\n\n  private _isDraggingActive = false;\n  private _isDragging = false;\n\n  startX: number = 0;\n  startY: number = 0;\n\n  constructor(private el: ElementRef, private renderer: Renderer2) {\n    if (!this._isDraggingActive) return;\n    this.renderer.setStyle(this.el.nativeElement, 'cursor', 'grab');\n    this.renderer.setStyle(this.el.nativeElement, 'user-drag', 'none');\n  }\n\n  @Input() set libDraggableComponent(condition: boolean) {\n    const element = this.el.nativeElement;\n    this._isDraggingActive = condition;\n    if (condition) {\n      this.renderer.setStyle(element, 'cursor', 'grab');\n      this.renderer.setStyle(element, 'user-drag', 'none');\n    } else {\n      this.renderer.setStyle(element, 'cursor', 'unset');\n      this.renderer.setStyle(element, 'user-drag', 'auto');\n    }\n  }\n\n  @HostListener('mousedown', ['$event'])\n  onMouseDown(event: MouseEvent) {\n    if (!this._isDraggingActive) return;\n    this.startX = event.clientX;\n    this.startY = event.clientY;\n    this._isDragging = true;\n    this.renderer.setStyle(this.el.nativeElement, 'cursor', 'grabbing');\n    event.preventDefault();\n  }\n\n  @HostListener('document:mouseup')\n  onMouseUp() {\n    if (!this._isDraggingActive) return;\n    if (this._isDragging) {\n      this._isDragging = false;\n      this.renderer.setStyle(this.el.nativeElement, 'cursor', 'grab');\n    }\n  }\n\n  @HostListener('document:mousemove', ['$event'])\n  onMouseMove(event: MouseEvent) {\n    if (!this._isDraggingActive) return;\n\n    if (this._isDragging) {\n      const newX = this.startX - event.clientX;\n      const newY = this.startY - event.clientY;\n\n      this.startX = event.clientX;\n      this.startY = event.clientY;\n\n      const top = this.el.nativeElement.offsetTop - newY;\n      const left = this.el.nativeElement.offsetLeft - newX;\n\n      this.renderer.setStyle(this.el.nativeElement, 'position', 'absolute');\n      this.renderer.setStyle(this.el.nativeElement, 'left', `${left}px`);\n      this.renderer.setStyle(this.el.nativeElement, 'top', `${top}px`);\n    }\n  }\n\n\n  /* touch mode */\n  @HostListener('touchstart', ['$event']) //corresponding to mousedown\n  onTouchStart(event: TouchEvent) {\n    if (!this._isDraggingActive) return;\n    this.startX = event.targetTouches[0].pageX;\n    this.startY = event.targetTouches[0].pageY;\n    this._isDragging = true;\n    this.renderer.setStyle(this.el.nativeElement, 'cursor', 'grabbing');\n  }\n\n  @HostListener('document:touchmove', ['$event']) //corresponding to mousemove\n  onTouchMove(event: TouchEvent) {\n    if (!this._isDraggingActive) return;\n\n    if (this._isDragging) {\n      const newX = this.startX - event.targetTouches[0].pageX;\n      const newY = this.startY - event.targetTouches[0].pageY;\n\n      this.startX = event.targetTouches[0].pageX;\n      this.startY = event.targetTouches[0].pageY;\n\n      const top = this.el.nativeElement.offsetTop - newY;\n      const left = this.el.nativeElement.offsetLeft - newX;\n\n      this.renderer.setStyle(this.el.nativeElement, 'position', 'absolute');\n      this.renderer.setStyle(this.el.nativeElement, 'left', `${left}px`);\n      this.renderer.setStyle(this.el.nativeElement, 'top', `${top}px`);\n    }\n  }\n\n  @HostListener('document:touchend', ['$event']) //corresponding to mouseup\n  onTouchEnd() {\n    if (!this._isDraggingActive) return;\n    if (this._isDragging) {\n      this._isDragging = false;\n      this.renderer.setStyle(this.el.nativeElement, 'cursor', 'grab');\n    }\n  }\n\n}\n","import { AfterContentInit, ChangeDetectorRef, Component, ElementRef, OnInit, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { IDialogOptions } from './bimplus-general-dialog-config-settings';\nimport { ComponentDraggableDirective } from '../../directives/component-draggable/componentsDraggable.directive';\nimport { CommonModule } from '@angular/common';\nimport { DialogService } from './bimplus-general-overlay-dialog.service';\n\n@Component({\n  selector: 'app-general-overlay-dialog',\n  imports: [ComponentDraggableDirective, CommonModule],\n  templateUrl: './bimplus-general-overlay-dialog.component.html',\n  styleUrls: ['./bimplus-general-overlay-dialog.component.less'],\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimportalGeneralOverlayDialogComponent implements OnInit, AfterContentInit {\n\n  @ViewChild('dialogRefContainer') genDialogRefContainer!: ElementRef<HTMLDivElement>;\n  @ViewChild('dialogOverlay') dialogOverlay!: ElementRef<HTMLDivElement>;\n\n  options: IDialogOptions | undefined;\n  units: string = 'rem';\n\n  constructor(private readonly dialogService: DialogService, private readonly cdref: ChangeDetectorRef) { }\n\n  ngOnInit(): void {\n    this.options = this.dialogService.options;\n  }\n\n  onClose() {\n    this.dialogService.close();\n  }\n\n  ngAfterContentInit() {\n    if (this.options) {\n      this.cdref.detectChanges();\n      this.setOptions();\n    }\n  }\n\n  setOptions() {\n    if (this.options) {\n      this.setDimensions();\n      this.setPosition();\n      this.setOverlay();\n    }\n  }\n\n  private setDimensions() {\n    const width = this.options?.width && this.options.width.length > 0 ? this.options.width : 'auto';\n    const height = this.options?.height && this.options.height.length > 0 ? this.options.height : 'auto';\n    this.genDialogRefContainer.nativeElement.style.width = width;\n    this.genDialogRefContainer.nativeElement.style.height = height;\n  }\n\n  private setPosition() {\n    if (this.options?.position === 'middle') {\n      this.setPositionsMiddle();\n    } else if (this.options?.position === 'unset') {\n      this.setPositionsUnset();\n    }\n  }\n\n  setPositionsUnset() {\n    if (this.options) {\n      this.genDialogRefContainer.nativeElement.style.position = 'fixed';\n      const top = this.options?.positionOptions?.top ?? '0' + this.units;\n      const bottom = this.options?.positionOptions?.bottom ?? '0' + this.units;\n      const left = this.options?.positionOptions?.left ?? '0' + this.units;\n      const right = this.options?.positionOptions?.right ?? '0' + this.units;\n\n      this.genDialogRefContainer.nativeElement.style.position = 'absolute';\n      this.genDialogRefContainer.nativeElement.style.top = top;\n      this.genDialogRefContainer.nativeElement.style.left = left;\n      this.genDialogRefContainer.nativeElement.style.bottom = bottom;\n      this.genDialogRefContainer.nativeElement.style.right = right;\n\n      this.options.overlayVisibilityEnabled = this.options.overlayVisibilityEnabled ? this.options.overlayVisibilityEnabled : false;\n      this.options.overlayClickEnabled = this.options.overlayVisibilityEnabled && this.options.overlayClickEnabled ? this.options.overlayClickEnabled : false;\n    }\n  }\n\n  setPositionsMiddle() {\n    if (this.options) {\n      this.genDialogRefContainer.nativeElement.className = this.genDialogRefContainer.nativeElement.className + ' middle';\n      this.options.draggable = false;\n      this.options.overlayVisibilityEnabled = this.options.overlayVisibilityEnabled ? this.options.overlayVisibilityEnabled : true;\n      this.options.overlayClickEnabled = this.options.overlayVisibilityEnabled && this.options.overlayClickEnabled ? this.options.overlayClickEnabled : false;\n    }\n  }\n\n  private setOverlay() {\n    if (this.options?.overlayVisibilityEnabled) {\n      this.dialogOverlay.nativeElement.style.backgroundColor = 'var(--modal-fade-in-background-color)';\n    }\n  }\n\n  onKeyPress(event: KeyboardEvent) {\n    if (event.key === 'Escape' || event.key === 'Esc') {\n      if (this.options?.overlayClickEnabled) {\n        this.dialogService.close();\n      }\n    }\n  }\n\n}\n\n\n","<div class=\"general-dialog-wrapper\" #generalDialogWrapper *ngIf=\"options\">\n  <section class=\"general-dialog-content\" #dialogRefContainer\n    [libDraggableComponent]=\"options.draggable ? true : false\">\n    <ng-content></ng-content>\n  </section>\n  <div class=\"general-dialog-overlay\" #dialogOverlay (click)=\"onClose()\" (keypress)=\"onKeyPress($event)\"\n    [style.display]=\"options.overlayVisibilityEnabled ? 'block' : 'none'\">\n  </div>\n</div>\n","import { ApplicationRef, ComponentRef, createComponent, EnvironmentInjector, Injectable, Type } from '@angular/core';\nimport { IDialogInputData, IDialogOptions } from './bimplus-general-dialog-config-settings';\nimport { Subject } from 'rxjs';\nimport { BimportalGeneralOverlayDialogComponent } from './bimplus-general-overlay-dialog.component';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class DialogService {\n\n  generalDialogComponentBody!: ComponentRef<unknown>; //here will be rendered every component we call inside general dialog\n  generalDialog!: ComponentRef<BimportalGeneralOverlayDialogComponent>; //here will be rendered every component we call inside general dialog\n  private _isDialogOpen = false;\n\n  inputData: unknown;\n  private readonly outputData = new Subject<unknown>();\n\n  options: IDialogOptions | undefined;\n\n  constructor(private readonly appRef: ApplicationRef,\n    private readonly injector: EnvironmentInjector) { }\n\n  open(componentBody: Type<unknown>, data: IDialogInputData) { //todo pass data to second component\n    if (data?.options) {\n      this.initializeSettings(data);\n      this.createComponentsRef(componentBody); //componentBody is component which is added inside to general dialog and rendered\n    }\n  }\n\n  initializeSettings(data: IDialogInputData) {\n    try {\n      this.inputData = data?.data;\n      this.options = data.options;\n    } catch (e) {\n      console.log('Missing data in open method', e);\n    }\n\n  }\n\n  createComponentsRef(componentBody: Type<unknown>) {\n    this.generalDialogComponentBody = createComponent(componentBody, {\n      environmentInjector: this.injector,\n    });\n\n    this.generalDialog = createComponent(BimportalGeneralOverlayDialogComponent, {\n      environmentInjector: this.injector,\n      projectableNodes: [[this.generalDialogComponentBody.location.nativeElement]],\n    });\n\n    document.body.appendChild(this.generalDialog.location.nativeElement);\n\n    this.appRef.attachView(this.generalDialogComponentBody.hostView); //first render body of general dialog, it can be any component we create\n    this.appRef.attachView(this.generalDialog.hostView); //then render body of general dialog, which we can add in any component, can have different content\n    this._isDialogOpen = true;\n  }\n\n  close(outputData?: unknown) {\n    if (outputData) {\n      this.setOutputData(outputData);\n    } else {\n      this.resetSettings();\n    }\n    this.generalDialogComponentBody.location.nativeElement.remove();\n    this.generalDialog.location.nativeElement.remove();\n    this._isDialogOpen = false;\n  }\n\n  resetSettings() {\n    this.inputData = null;\n    this.options = undefined;\n  }\n\n  isDialogOpened() {\n    return this._isDialogOpen;\n  }\n\n  setOutputData(data: unknown): void {\n    if (this._isDialogOpen) {\n      this.outputData.next(data);\n    }\n  }\n\n  getOutputData(): Subject<unknown> {\n    return this.outputData;\n  }\n\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  Component,\n  HostListener,\n  Input,\n  TemplateRef,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { DialogService } from '../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service';\nimport { BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\nimport { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';\n\nexport interface WarningDialogInputData {\n  title: string;\n  message: string;\n  buttonsRef?: TemplateRef<unknown>;\n}\n\n@Component({\n  selector: 'lib-bimplus-overlay-dialog-warning',\n  imports: [CommonModule, TranslateModule, BimplusButtonsRowComponent],\n  templateUrl: './bimplus-overlay-dialog-warning.component.html',\n  styleUrls: ['./bimplus-overlay-dialog-warning.component.less'],\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusOverlayDialogWarningComponent {\n  private _title: string = '';\n  private _message: string = '';\n  private readonly _data: WarningDialogInputData | undefined;\n  protected readonly buttonsRef: TemplateRef<unknown> | null = null;\n  acceptCallback: (() => void) | undefined;\n  protected readonly buttons: BimplusButtonRowItem[] = [\n    {\n      id: \"warningDialogAcceptButton\",\n      title: this.translateService.instant('_Ok'),\n      tooltip: this.translateService.instant('_Ok'),\n      disabled: false,\n      buttonStyle: 'primary'\n    }\n  ];\n\n  @Input()\n  get title(): string {\n    return this._title;\n  }\n  set title(value: string) {\n    this._title = value;\n  }\n\n  @Input()\n  get message(): string {\n    return this._message;\n  }\n  set message(value: string) {\n    this._message = value;\n  }\n\n  constructor(\n    private readonly dialogService: DialogService,\n    private readonly translateService: TranslateService\n  ) {\n    this._data = this.dialogService.inputData as WarningDialogInputData;\n    this.buttonsRef = this._data?.buttonsRef ?? null;\n    this._title = this._data?.title || '';\n    this._message = this._data?.message || '';\n  }\n\n  close() {\n    this.dialogService.close();\n  }\n\n  keypressClose(event: KeyboardEvent) {\n    if (event.key === 'Escape' || event.key === 'Esc') {\n      this.close();\n    }\n  }\n\n  buttonRowButtonClicked(): void {\n    this.close();\n\n    this.acceptCallback?.();\n  }\n\n  @HostListener('document:keydown', ['$event'])\n  handleKeydown(event: KeyboardEvent) {\n    if (event.key === 'Escape' || event.key === 'Esc') {\n      this.close();\n    }\n  }\n}\n","<div class=\"overlay-dialog-container\">\n  <div class=\"overlay-dialog-container_title\">\n    <div class=\"overlay-dialog-container_title_icon\"></div>\n    <div class=\"overlay-dialog-container_title_msg\">\n      {{ title }}\n    </div>\n    <div\n      class=\"overlay-dialog-container_title_close\"\n      (click)=\"close()\"\n      (keypress)=\"keypressClose($event)\"\n    ></div>\n  </div>\n  <div class=\"overlay-dialog-container_content\">\n    <div\n      class=\"overlay-dialog-container_content_msg\"\n      [innerHTML]=\"this.message\"\n    ></div>\n    <section class=\"overlay-dialog-container_content_buttons\">\n      @if(buttonsRef) {\n        <ng-container\n          *ngTemplateOutlet=\"buttonsRef; context: { close: close.bind(this) }\"\n        ></ng-container>\n      } @else {\n        <div class=\"buttons\">\n          <lib-bimplus-buttons-row\n            [items]=\"buttons\"\n            (buttonClicked)=\"buttonRowButtonClicked()\"\n          />\n        </div>\n      }\n    </section>\n  </div>\n</div>\n","import { Component, ViewEncapsulation, Input, OnInit, OnDestroy, HostListener } from '@angular/core';\nimport { XDraggableDirective } from '../../directives/x-draggable.directive';\nimport { PxsuffixPipe } from '../../pipes/pxsuffix.pipe';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n  selector: 'lib-resizable-panel',\n  imports: [CommonModule, XDraggableDirective, PxsuffixPipe],\n  templateUrl: './resizable-panel.component.html',\n  styleUrl: './resizable-panel.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class ResizablePanelComponent implements OnInit, OnDestroy {\n  @Input() position: 'left' | 'right' = 'right';\n  @Input() hasDraggableHandle: boolean = false;\n  @Input() hasDraggableBorder: boolean = false;\n  @Input() minWidth: number | (() => number) | undefined = 350;\n  @Input() maxWidth: number | (() => number) | undefined;\n  @Input() defaultWidth: number = 350;\n  // Function to determine if resizing is allowed\n  @Input() canResize: (currentWidth: number, deltaX: number) => boolean = () => true;\n\n  drawerWidth: number = this.defaultWidth;\n  drawerExpanded: boolean = true;\n\n  ngOnInit() {\n    this.drawerWidth = this.defaultWidth;\n    window.addEventListener('resize', this.handleWindowResize);\n  }\n\n  ngOnDestroy() {\n    window.removeEventListener('resize', this.handleWindowResize);\n  }\n\n  applyWidthConstraints() {\n    const minWidth = typeof this.minWidth === 'function' ? this.minWidth() : this.minWidth;\n    const maxWidth = typeof this.maxWidth === 'function' ? this.maxWidth() : this.maxWidth;\n\n    if (minWidth && this.drawerWidth < minWidth) {\n      this.drawerWidth = minWidth;\n    } else if (maxWidth && this.drawerWidth > maxWidth) {\n      this.drawerWidth = maxWidth;\n    }\n  }\n\n  @HostListener('window:resize')\n  handleWindowResize = (): void => {\n    this.applyWidthConstraints();\n  };\n\n  _toggleDrawer() {\n    this.drawerExpanded = !this.drawerExpanded;\n    if (!this.drawerExpanded) {\n      return;\n    }\n\n    this.applyWidthConstraints();\n  }\n\n  _onResizeWidth(event: number): void {\n    const deltaX = event;\n\n    let newWidth = this.drawerWidth;\n    if (this.position === 'left') {\n      newWidth += deltaX;\n    } else if (this.position === 'right') {\n      newWidth -= deltaX;\n    }\n\n    if (this.canResize?.(this.drawerWidth, deltaX) !== false) {\n      this.drawerWidth = newWidth;\n\n      this.applyWidthConstraints();\n    }\n  }\n}\n","<div\n  class=\"resizable-panel-drawer\"\n  [style.width] = \"drawerWidth | pxsuffix\"\n  [ngClass]=\"drawerExpanded ? '' : 'hidden'\"\n  [class.position-right]=\"position === 'right'\"\n  [class.position-left]=\"position === 'left'\"\n>\n  <slot></slot>\n  @if (drawerExpanded) {\n    @if (hasDraggableBorder) {\n      <div\n        xDraggable\n        class=\"resizable-panel-resize-border\"\n        (dragging)=\"_onResizeWidth($event)\"\n        [class.position-right]=\"position === 'right'\"\n        [class.position-left]=\"position === 'left'\"\n      >\n      </div>\n    }\n    @if (hasDraggableHandle) {\n      <div\n        xDraggable\n        class=\"resizable-panel-resize-handle\"\n        (dragging)=\"_onResizeWidth($event)\"\n        (clicked)=\"_toggleDrawer()\"\n        [class.position-right]=\"position === 'right'\"\n        [class.position-left]=\"position === 'left'\"\n      >\n      </div>\n    }\n  }\n</div>\n@if (!drawerExpanded) {\n  @if (hasDraggableHandle) {\n    <div\n      class=\"resizable-panel-resize-handle collapsed\"\n      (click)=\"_toggleDrawer()\"\n      (keypress)=\"_toggleDrawer()\"\n      [class.position-right]=\"position === 'right'\"\n      [class.position-left]=\"position === 'left'\"\n    >\n    </div>\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { AfterViewInit, Component, ElementRef, HostListener, Input, ViewChild, ViewEncapsulation } from '@angular/core';\n\n@Component({\n  selector: 'lib-bimplus-link-tooltip-message',\n  templateUrl: './bimplus-link-tooltip-message.component.html',\n  styleUrls: ['./bimplus-link-tooltip-message.component.less'],\n  imports: [CommonModule],\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusLinkTooltipMessageComponent implements AfterViewInit {\n\n  @ViewChild('messageLink') messageLink!: ElementRef<HTMLElement>;\n\n  private _enableCopyPressKeys = true;\n  private _titleHeader = '';\n  private _link = '';\n\n  @Input()\n  get link(): string {\n    return this._link;\n  }\n  set link(value: string) {\n    this._link = value;\n  }\n\n  @Input()\n  get titleHeader(): string {\n    return this._titleHeader;\n  }\n  set titleHeader(value: string) {\n    this._titleHeader = value;\n  }\n\n  @Input()\n  get enableCopyPressKeys(): boolean {\n    return this._enableCopyPressKeys;\n  }\n  set enableCopyPressKeys(value: boolean) {\n    this._enableCopyPressKeys = value;\n  }\n\n  @Input()\n  arrowPosition = 'right-arrow';\n\n  @Input()\n  onClose?: () => void;\n\n  ngAfterViewInit(): void {\n    this.selectText(this.messageLink.nativeElement);\n  }\n\n  selectText(node: HTMLElement) {\n    if (window.getSelection) {\n      const selection = window.getSelection();\n      const range = document.createRange();\n      range.selectNodeContents(node);\n      selection?.removeAllRanges();\n      selection?.addRange(range);\n    } else {\n      console.log(\"Could not select text in node: Unsupported browser.\");\n    }\n  }\n\n  close() {\n    this.onClose?.();\n  }\n\n  @HostListener('window:keydown.control.c', ['$event'])\n  onKeyPress() {\n    if (this.messageLink && this.enableCopyPressKeys) {\n      navigator.clipboard.writeText(this.messageLink.nativeElement.innerText).catch((err) => {\n        console.error(\"Could not copy text in node.\", err);\n      });\n    }\n  }\n}","<div class=\"link-content\" #linkContent>\n  <div\n    class=\"link-tooltip-message\"\n    #linkTooltipMessage\n  >\n    <div class=\"header\">\n      <span class=\"title\">{{titleHeader}}</span>\n      <span\n        class='tooltip-cross-icon close'\n        (click)=\"close()\"\n        (keydown)=\"close()\"\n      >✕︎</span>\n    </div>\n    <div class=\"content\">\n      <div\n        class=\"link\"\n        #messageLink\n        [innerHTML]=\"link\">\n      </div>\n    </div>\n  </div>\n  <div\n    class=\"arrow\"\n    [ngClass]=\"arrowPosition\"\n  ></div>\n</div>\n<div\n  class=\"link-tooltip-message-overlay\"\n  (click)=\"close()\"\n  (keydown)=\"close()\"\n></div>","import {\n  Component\n  , Input\n  , Output\n  , EventEmitter\n  , ViewEncapsulation\n  , SimpleChanges\n  , OnChanges\n} from '@angular/core';\nimport { CreateLinkData, SelectedObject } from './object-properties-header.interface';\nimport { CommonModule, NgIf} from '@angular/common';\nimport { NgSelectModule } from '@ng-select/ng-select';\nimport { FormsModule } from '@angular/forms';\nimport { fireEvent } from '../../utils/utils';\nimport {\n  TranslateModule\n  , TranslateService\n} from '@ngx-translate/core';\nimport { BimplusLocalizedWidgetComponent } from '../bimplus-localized-widget/bimplus-localized-widget.component';\nimport { BimplusLinkTooltipMessageComponent } from '../bimplus-link-tooltip-message/bimplus-link-tooltip-message.component';\n\n@Component({\n  selector: 'lib-object-properties-header',\n  imports: [\n    CommonModule,\n    FormsModule,\n    NgSelectModule,\n    TranslateModule,\n    BimplusLinkTooltipMessageComponent,\n    NgIf\n  ],\n  providers: [TranslateService],\n  templateUrl: './object-properties-header.component.html',\n  styleUrl: './object-properties-header.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\n\nexport class ObjectPropertiesHeaderComponent extends BimplusLocalizedWidgetComponent implements OnChanges {\n  constructor(translateService:  TranslateService){\n    super(translateService)\n  }\n\n  @Output() selectedObject = new EventEmitter<SelectedObject>();\n\n  @Output() closePropertiesPanel = new EventEmitter();\n\n  @Input() selectedObjects: Array<SelectedObject> = [];\n\n  _activeObject: SelectedObject | null = null;\n  openLinkMessage: boolean = false;\n\n  @Input()\n  onOpenLink?: () => void;\n\n  set activeObject(value: SelectedObject | null) {\n    this._activeObject = value;\n    fireEvent(this, \"selectedObject\", value);\n  }\n\n  get activeObject(): SelectedObject | null {\n    return this._activeObject;\n  }\n\n  private _linkData: CreateLinkData = {\n    link: '',\n    titleHeader: '',\n    linkMessageVisible: false,\n    enableCopyPressKeys: false\n  };\n\n  @Input()\n  get linkData(): CreateLinkData {\n    return this._linkData;\n  }\n  set linkData(value: CreateLinkData) {\n    this._linkData = value;\n  }\n\n  _closePropertiesPanel(event: Event) {\n    fireEvent(this, \"closePropertiesPanel\", event);\n    event.stopPropagation();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (!changes['selectedObjects']) {\n      return;\n    }\n    const previousValue: SelectedObject[] | null = changes['selectedObjects'].previousValue;\n    const currentValue: SelectedObject[] | null = changes['selectedObjects'].currentValue;\n    if(currentValue && currentValue.length > 0) {\n      this.activeObject = currentValue[currentValue.length - 1];\n    }\n    console.log(`Data changed from ${previousValue} to ${currentValue}`);\n  }\n\n  openLink() {\n    this.openLinkMessage = true;\n    this.onOpenLink?.();\n  }\n\n  closeLink = () => {\n    this.openLinkMessage = false;\n  }\n}\n","<div class=\"object-properties-header\">\n  <div class=\"object-properties-header-object\">\n    <div class=\"object-properties-header-object-select\">\n      <ng-select class=\"object-properties-header-object-select-dropdown\" [(ngModel)]=\"activeObject\" [clearable]=\"false\" [searchable]=\"false\">\n        <ng-option *ngFor=\"let object of selectedObjects\" [value]=\"object\">\n          {{object.type}}\n          @if(object.name) {\n            ({{object.name}})\n          }\n        </ng-option>\n      </ng-select>\n    </div>\n  </div>\n  <div\n    class=\"object-properties-header-link-icon\"\n    title=\"{{'_Create link' | translate}}\"\n    (click)=\"openLink()\"\n    (keydown)=\"openLink()\"\n  >\n  </div>\n  <lib-bimplus-link-tooltip-message\n    *ngIf=\"openLinkMessage\"\n    [enableCopyPressKeys]=\"linkData.enableCopyPressKeys\"\n    [titleHeader]=\"linkData.titleHeader\"\n    [link]=\"linkData.link\"\n    [onClose]=\"closeLink\"\n  />\n  <div\n    class=\"object-properties-header-close-icon\"\n    (click)=\"_closePropertiesPanel($event)\"\n    (keydown)=\"_closePropertiesPanel($event)\"\n    title=\"{{'_Close_properties_panel_title' | translate}}\"\n  >\n</div>\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n  name: 'round',\r\n  standalone: true\r\n})\r\nexport class RoundPipe implements PipeTransform {\r\n\r\n  transform(value: string, decimal: number): string {\r\n    const num = parseFloat(value);\r\n    const dec = decimal;\r\n\r\n    const mult = Math.pow(10, dec);\r\n\r\n    return \"\" + Math.round(num * mult) / mult;\r\n  }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { ObjectAttribute } from '../components/object-properties/object-properties.interface';\nimport { RoundPipe } from './round.pipe';\nimport moment from 'moment';\nimport 'moment/min/locales';\n\n\n@Pipe({\n  name: 'getAttributeValueAsString',\n  standalone: true\n})\nexport class GetAttributeValueAsString implements PipeTransform {\n\n  constructor() {\n    const locale = window.navigator.language;\n    moment.locale(locale);\n  }\n\n  _transformDoubleToString(value: ObjectAttribute): string {\n    return new RoundPipe().transform(value.value, value.decimal || 2);\n  }\n\n  _transformDoubleEnumerationToString(value: ObjectAttribute): string {\n    if(!value.enumdefinition) {\n      return '';\n    }\n    const _retval =  value.enumdefinition[Number(value.value)];\n    if(_retval) {\n      return `${_retval}`;\n    }\n    return '';\n  }\n\n  _transformDatetimeToString(value: ObjectAttribute): string {\n    const localeDate: string = moment(value.value).format('L')\n    if(localeDate) {\n      return localeDate;\n    }\n    return `${value.value}`;\n  }\n\n  _transformGUIDToString(value: ObjectAttribute): string {\n    return `${value.value}`;\n  }\n\n  _transformEnumerationToString(value: ObjectAttribute): string {\n    if(value.control && /^Enumeration$/i.test(value.control)) {\n      if(!value.enumdefinition) {\n        return '';\n      }\n      const _retVal = value.enumdefinition[Number(value.value)];\n      if(_retVal) {\n        return `${_retVal}`;\n      }\n      return '';\n    }\n    return `${value.value}`;\n  }\n\n  _transformGUIDEnumerationToString(value: ObjectAttribute): string {\n    return this._transformEnumerationToString(value);\n  }\n\n  _transformIntToString(value: ObjectAttribute): string {\n    return `${value.value}`;\n  }\n\n  _transformIntEnumerationToString(value: ObjectAttribute): string {\n    return this._transformEnumerationToString(value);\n  }\n\n  _transformString(value: ObjectAttribute): string {\n    return `${value.value}`;\n  }\n\n  _transformStringEnumeration(value: ObjectAttribute): string {\n    return this._transformEnumerationToString(value);\n  }\n\n  _transformStringCombobox(value: ObjectAttribute): string {\n    if(value.control && /^Combobox$/i.test(value.control)) {\n      return `${value.value}`;\n    }\n    return `${value.value}`;\n  }\n\n  _transformBooleanToString(value: ObjectAttribute): string {\n    if(value.value === '1'\n      || /^true$/i.test(value.value)) {\n        return \"True\";\n      }\n      return \"False\";\n  }\n\n  transform(value: ObjectAttribute): string {\n    const _value = value.value;\n    if (this.isEmpty(_value)) {\n      return '';\n    }\n\n    if (this.isDouble(value)) {\n      return this._transformDoubleToString(value);\n    }\n\n    if (this.isDoubleEnumeration(value)) {\n      return this._transformDoubleEnumerationToString(value);\n    }\n\n    if (this.isDatetime(value)) {\n      return this._transformDatetimeToString(value);\n    }\n\n    if (this.isGUID(value)) {\n      return this._transformGUIDToString(value);\n    }\n\n    if (this.isGUIDEnumeration(value)) {\n      return this._transformGUIDEnumerationToString(value);\n    }\n\n    if (this.isInt(value)) {\n      return this._transformIntToString(value);\n    }\n\n    if (this.isIntEnumeration(value)) {\n      return this._transformIntEnumerationToString(value);\n    }\n\n    if (this.isString(value)) {\n      return this._transformString(value);\n    }\n\n    if (this.isStringEnumeration(value)) {\n      return this._transformStringEnumeration(value);\n    }\n\n    if (this.isStringCombobox(value)) {\n      return this._transformStringCombobox(value);\n    }\n\n    if (this.isBooleanCheckbox(value)) {\n      return this._transformBooleanToString(value);\n    }\n\n    if (this.isBooleanTextbox(value)) {\n      return this._transformBooleanToString(value);\n    }\n\n    return value.value;\n  }\n\n  private isEmpty(value: string | undefined | null): boolean {\n    return value === undefined || value === null || value === '';\n  }\n\n  private isDouble(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^double$/i.test(value.type) && !value.control;\n  }\n\n  private isDoubleEnumeration(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^double$/i.test(value.type)\n      && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\n  }\n\n  private isDatetime(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^datetime$/i.test(value.type) && !value.control;\n  }\n\n  private isGUID(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^guid$/i.test(value.type) && !value.control;\n  }\n\n  private isGUIDEnumeration(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^guid$/i.test(value.type)\n      && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\n  }\n\n  private isInt(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^int(32)?$/i.test(value.type) && !value.control;\n  }\n\n  private isIntEnumeration(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^int(32)?$/i.test(value.type)\n      && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\n  }\n\n  private isString(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^string$/i.test(value.type) && !value.control;\n  }\n\n  private isStringEnumeration(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^string$/i.test(value.type)\n      && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\n  }\n\n  private isStringCombobox(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^string$/i.test(value.type)\n      && typeof value.control === 'string' && /^combobox$/i.test(value.control);\n  }\n\n  private isBooleanCheckbox(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^boolean$/i.test(value.type)\n      && typeof value.control === 'string' && /^checkbox$/i.test(value.control);\n  }\n\n  private isBooleanTextbox(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^boolean$/i.test(value.type) && !value.control;\n  }\n}\n","import { ObjectAttribute } from '../components/object-properties/object-properties.interface';\n\nexport function isObjectPropertyValueBlank(attrib: ObjectAttribute): boolean {\n  return attrib.value === undefined\n    || attrib.value === null\n    || attrib.value === ''\n    || attrib.value === '\\n\\t'\n    || attrib.value === '\\n'\n    || attrib.value === '\\t';\n}","import { Input, Component, ViewEncapsulation, signal } from '@angular/core';\nimport isURL from 'validator/lib/isURL';\n\n@Component({\n  selector: 'lib-object-property-value',\n  standalone: true,\n  templateUrl: './object-property-value.component.html',\n  styleUrls: ['./object-property-value.component.less'],\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class ObjectPropertyValueComponent {\n  protected _tooltip = signal<string>('');\n  protected _value = signal<string>('');\n  protected _valueIsUrl = signal<boolean>(false);\n  protected _decoratedHyperlink = signal<string>('');\n\n  @Input() set value(value: string) {\n    this._value.set(value);\n    if(this._isUrl(value)) {\n      this._valueIsUrl.set(true);\n      this._decoratedHyperlink.set(this._decorateHyperlink(value));\n    }\n    else {\n      this._valueIsUrl.set(false);\n    }\n  }\n\n  @Input() set tooltip(tooltip: string) {\n    this._tooltip.set(tooltip);\n  }\n\n  private _isUrl(url: string): boolean {\n    if (!url) {\n      return false;\n    }\n    const link = url.trim();\n    if(!/^http(s?):\\/\\//.exec(link) && !/^www\\./.exec(link)) {\n      return false;\n    }\n\n    return isURL(link);\n  }\n\n  private _decorateHyperlink(url: string): string {\n    if(!this._isUrl(url)) {\n      return '';\n    }\n    let link = url.trim();\n\n    if (link && !/^http(s?):\\/\\//.exec(link)) {\n      link = 'https://' + link;\n    }\n    return link;\n  }\n\n  constructor() { }\n}\n","@if(_valueIsUrl()) {\n  <a class=\"link-detect-automatically\" target=\"_blank\" rel=\"noopener\" href={{_decoratedHyperlink()}} title=\"{{_tooltip()}}\">{{_value()}}</a>\n}\n@else {\n  <div class=\"value\" title=\"{{_tooltip()}}\">\n    {{_value()}}\n  </div>\n}\n","import { Component, EventEmitter, forwardRef, Input, Output, ViewEncapsulation, signal, booleanAttribute, ViewChild, ElementRef } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, ReactiveFormsModule } from \"@angular/forms\";\nimport { TranslateModule } from \"@ngx-translate/core\";\n\n@Component({\n  selector: 'lib-bimplus-input-text-field',\n  imports: [\n    ReactiveFormsModule,\n    TranslateModule\n  ],\n  templateUrl: './bimplus-input-text-field.component.html',\n  styleUrl: './bimplus-input-text-field.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => BimplusInputTextFieldComponent),\n      multi: true,\n    },\n  ]\n})\nexport class BimplusInputTextFieldComponent implements ControlValueAccessor {\n  @ViewChild('inputValueBox', { static: false }) inputElement!: ElementRef;\n  @Input() placeholder: string = '';\n  @Output() enterKeyPressed = new EventEmitter<void>();\n\n  protected _showClearButton = signal<boolean>(false);\n  @Input({ transform: booleanAttribute }) set showClearButton(show_clear_button: boolean) {\n    this._showClearButton.set(show_clear_button);\n  }\n\n  protected _validValue = signal<boolean>(true);\n  @Input({ transform: booleanAttribute }) set validValue(valid_value: boolean) {\n    this._validValue.set(valid_value);\n  }\n\n  value: string = '';\n  isDisabled: boolean = false;\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  onChange = (value: string) => {\n  };\n  onTouched = () => {\n  };\n\n  writeValue(value: string): void {\n    this.value = value;\n  }\n\n  registerOnChange(fn: (value: string) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this.isDisabled = isDisabled;\n  }\n\n  handleInput(event: Event): void {\n    const input = event.target as HTMLInputElement;\n    this.value = input.value;\n    this.onChange(this.value);\n  }\n\n  handleBlur(): void {\n    this.onTouched();\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  protected _clearValue(event: Event): void {\n    this.value = \"\";\n    this.inputElement.nativeElement.focus();\n    this.onChange(this.value);\n  }\n\n  protected handleKeyDown(event: KeyboardEvent): void {\n    if (event.key !== 'Enter') {\n      return;\n    }\n    this.enterKeyPressed.emit();\n  }\n}\n","<div\n  class=\"text-input-wrapper\"\n  [class.invalid-value]=\"!_validValue()\"\n  [class.with-clear-button]=\"_showClearButton()\"\n>\n  <input\n    type=\"text\"\n    [value]=\"value\"\n    (input)=\"handleInput($event)\"\n    (blur)=\"handleBlur()\"\n    [disabled]=\"isDisabled\"\n    [placeholder]=\"placeholder\"\n    (keydown)=\"handleKeyDown($event)\"\n    class=\"text-input\"\n    #inputValueBox\n  />\n  @if(_showClearButton()) {\n    <div\n      class=\"clear-button\"\n      (click)=\"_clearValue($event)\"\n      (keydown)=\"handleKeyDown($event)\"\n    >\n    </div>\n  }\n</div>\n","import {\n  Component\n  , EventEmitter\n  , forwardRef\n  , Output\n  , ViewEncapsulation\n} from '@angular/core';\nimport {\n  ControlValueAccessor\n  , NG_VALUE_ACCESSOR\n  , ReactiveFormsModule\n} from \"@angular/forms\";\nimport { TranslateModule } from \"@ngx-translate/core\";\n\n@Component({\n  selector: 'lib-bimplus-input-checkbox',\n  imports: [\n    ReactiveFormsModule,\n    TranslateModule\n  ],\n  templateUrl: './bimplus-input-checkbox.component.html',\n  styleUrl: './bimplus-input-checkbox.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => BimplusInputCheckboxComponent),\n      multi: true,\n    },\n  ]\n})\nexport class BimplusInputCheckboxComponent implements ControlValueAccessor {\n  @Output() enterKeyPressed = new EventEmitter<void>();\n\n  value: boolean = false;\n  isDisabled: boolean = false;\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  onChange = (value: boolean) => {\n  };\n  onTouched = () => {\n  };\n\n  // Called when the checkbox value changes\n  onCheckboxChange(event: Event) {\n    const checked = (event.target as HTMLInputElement).checked;\n    this.value = checked;\n    this.onChange(checked); // Notify the parent form about the change\n    this.onTouched(); // Mark the control as touched\n  }\n\n  writeValue(value: boolean): void {\n    this.value = value;\n  }\n\n  registerOnChange(fn: (value: boolean) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this.isDisabled = isDisabled;\n  }\n\n  toggleAttributeValue() {\n    this.value = !this.value;\n    this.onChange(this.value);\n    this.onTouched();\n  }\n}\n","<div\n  class=\"select-checkbox\"\n>\n  <div>\n    <input\n      type=\"checkbox\"\n      [checked]=\"value\"\n      (change)=\"onCheckboxChange($event)\"\n      (click)=\"toggleAttributeValue()\"\n      (keypress)=\"toggleAttributeValue()\"\n    >\n    <span></span>\n  </div>\n</div>\n","import { Component, EventEmitter, forwardRef, Input, Output, ViewEncapsulation, signal, booleanAttribute, ViewChild, ElementRef } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, ReactiveFormsModule } from \"@angular/forms\";\nimport { TranslateModule } from \"@ngx-translate/core\";\n\n@Component({\n  selector: 'lib-bimplus-input-number',\n  imports: [\n    ReactiveFormsModule,\n    TranslateModule\n  ],\n  templateUrl: './bimplus-input-number.component.html',\n  styleUrl: './bimplus-input-number.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => BimplusInputNumberComponent),\n      multi: true,\n    },\n  ]\n})\nexport class BimplusInputNumberComponent implements ControlValueAccessor {\n  @ViewChild('inputValueBox', { static: false }) inputElement!: ElementRef;\n  @Input() placeholder: string = '';\n  @Output() enterKeyPressed = new EventEmitter<void>();\n\n  protected _validValue = signal<boolean>(true);\n  @Input({ transform: booleanAttribute }) set validValue(valid_value: boolean) {\n    this._validValue.set(valid_value);\n  }\n\n  @Input() minValue: string = '';\n  @Input() maxValue: string = '';\n\n  value: number = 0;\n  isDisabled: boolean = false;\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  onChange = (value: number) => {\n  };\n  onTouched = () => {\n  };\n\n  writeValue(value: number): void {\n    this.value = value;\n  }\n\n  registerOnChange(fn: (value: number) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this.isDisabled = isDisabled;\n  }\n\n  handleInput(event: Event): void {\n    const input = event.target as HTMLInputElement;\n    this.value = parseInt(input.value);\n    this.onChange(this.value);\n  }\n\n  handleBlur(): void {\n    this.onTouched();\n  }\n\n  protected handleKeyDown(event: KeyboardEvent): void {\n    if (event.key !== 'Enter') {\n      return;\n    }\n    this.enterKeyPressed.emit();\n  }\n}\n","<div\n  class=\"text-input-wrapper\"\n  [class.invalid-value]=\"!_validValue()\"\n>\n  <input\n    type=\"number\"\n    [value]=\"value\"\n    (input)=\"handleInput($event)\"\n    (blur)=\"handleBlur()\"\n    [disabled]=\"isDisabled\"\n    [placeholder]=\"placeholder\"\n    (keydown)=\"handleKeyDown($event)\"\n    class=\"text-input\"\n    [min]=\"minValue\"\n    [max]=\"maxValue\"\n    #inputValueBox\n  />\n</div>\n","import { Component\n  , EventEmitter\n  , forwardRef\n  , Input\n  , Output\n  , ViewEncapsulation\n  , signal\n  , booleanAttribute\n  , ViewChild\n  , ElementRef\n  , OnInit\n} from '@angular/core';\nimport { ControlValueAccessor\n  , NG_VALUE_ACCESSOR\n  , ReactiveFormsModule\n  , FormsModule\n} from \"@angular/forms\";\nimport { TranslateModule } from \"@ngx-translate/core\";\nimport { NgSelectModule } from '@ng-select/ng-select';\nimport { BehaviorSubject } from 'rxjs';\nimport { CommonModule} from '@angular/common';\n\ninterface EnumDefinition {\n  id: string;\n  name: string;\n};\n\n@Component({\n  selector: 'lib-bimplus-input-combobox',\n  imports: [\n    CommonModule,\n    FormsModule,\n    ReactiveFormsModule,\n    NgSelectModule,\n    TranslateModule\n  ],\n  templateUrl: './bimplus-input-combobox.component.html',\n  styleUrl: './bimplus-input-combobox.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => BimplusInputComboboxComponent),\n      multi: true,\n    },\n  ]\n})\n\nexport class BimplusInputComboboxComponent implements ControlValueAccessor, OnInit {\n  @ViewChild('inputValueBox', { static: false }) inputElement!: ElementRef;\n  @Input() placeholder: string = '';\n  @Output() enterKeyPressed = new EventEmitter<void>();\n\n  protected _validValue = signal<boolean>(true);\n  @Input({ transform: booleanAttribute }) set validValue(valid_value: boolean) {\n    this._validValue.set(valid_value);\n  }\n\n  private _type: string = 'enum';\n  protected _enumdefinition: Array<EnumDefinition> = [];\n  @Input() set enumdefinition(enum_definition: Record<number | string, string> | undefined | Array<string>) {\n    if(!enum_definition) {\n      return;\n    }\n    if(Array.isArray(enum_definition)) {\n      enum_definition.forEach((value, index) => {\n        this._enumdefinition.push({ id: index.toString(), name: value });\n      });\n      this._type = 'array';\n      return;\n    }\n    Object.keys(enum_definition).forEach((key) => {\n      if(typeof key === 'string') {\n        this._enumdefinition.push({ id: key, name: enum_definition[key] });\n      }\n      if(typeof key === 'number') {\n        this._enumdefinition.push({ id: key, name: enum_definition[Number(key)] });\n      }\n\n    });\n  }\n\n  private _setActiveEnumValue() {\n    const sel: EnumDefinition | undefined = this._enumdefinition.find((enumDef) => enumDef.id === this._selectedValue);\n    if(!sel){\n      return;\n    }\n    this.activeEnum = sel\n  }\n\n  _setActiveArrayValue() {\n    const sel: EnumDefinition | undefined = this._enumdefinition.find((enumDef) => enumDef.name === this._selectedValue);\n    if(!sel){\n      return;\n    }\n    this.activeEnum = sel\n  }\n\n  private _selectedValue: string | null = null;\n  @Input() set selectedValue(value: string | null) {\n    this._selectedValue = value;\n    if(this._type === 'enum') {\n      this._setActiveEnumValue();\n      return;\n    }\n    if(this._type === 'array') {\n      this._setActiveArrayValue();\n    }\n  }\n\n  ngOnInit() {\n    this.activeEnumSubject$.subscribe({\n      next: (value) => {\n        if(this._type === 'enum') {\n          this.value = value?.id ?? '';\n          this.onChange(this.value);\n        }\n        if(this._type === 'array') {\n            this.value = value?.name ?? '';\n            this.onChange(this.value);\n          }\n        }\n    });\n  }\n\n  set activeEnum(value : EnumDefinition | null){\n    this.activeEnumSubject$.next(value);\n  }\n\n  get activeEnum() : EnumDefinition | null {\n    return this.activeEnumSubject$.getValue();\n  }\n\n  activeEnumSubject$ = new BehaviorSubject<EnumDefinition | null> (null);\n\n  \n  value: string = '';\n  isDisabled: boolean = false;\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  onChange = (value: string) => {\n  };\n  onTouched = () => {\n  };\n\n  writeValue(value: string): void {\n    this.value = value;\n  }\n\n  registerOnChange(fn: (value: string) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this.isDisabled = isDisabled;\n  }\n\n  handleInput(event: Event): void {\n    const input = event.target as HTMLInputElement;\n    this.value = input.value;\n    this.onChange(this.value);\n  }\n\n  handleBlur(): void {\n    this.onTouched();\n  }\n\n  protected handleKeyDown(event: KeyboardEvent): void {\n    if (event.key !== 'Enter') {\n      return;\n    }\n    this.enterKeyPressed.emit();\n  }\n}\n","<div class=\"enum-wrapper\" [class.invalid-value]=\"!_validValue()\">\n  <div class=\"double-enumeration\">\n    <ng-select\n      class=\"enum-dropdown\"\n      [(ngModel)]=\"activeEnum\"\n      [clearable]=\"false\"\n      [searchable]=\"_enumdefinition.length >= 10\"\n      (keydown)=\"handleKeyDown($event)\"\n    >\n      <ng-option *ngFor=\"let val of _enumdefinition\" [value]=\"val\">{{\n        val.name\n      }}</ng-option>\n    </ng-select>\n  </div>\n</div>\n","import { Component,\n  OnInit,\n  forwardRef,\n  Input,\n  Output,\n  booleanAttribute,\n  signal,\n  EventEmitter,\n  ViewChild,\n  ElementRef,\n  ViewEncapsulation\n} from '@angular/core';\nimport { ControlValueAccessor\n  , NG_VALUE_ACCESSOR\n  , ReactiveFormsModule\n  , FormsModule\n} from \"@angular/forms\";\nimport { TranslateModule } from \"@ngx-translate/core\";\nimport { CommonModule} from '@angular/common';\nimport { MatNativeDateModule, DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core';\nimport { MomentDateModule, MAT_MOMENT_DATE_ADAPTER_OPTIONS, MomentDateAdapter} from '@angular/material-moment-adapter';\nimport { MatDatepickerModule, MatDatepickerInputEvent } from '@angular/material/datepicker';\n\nexport const MY_DATE_FORMATS = {\n  parse: {\n    dateInput: 'L', \n  },\n  display: {\n    dateInput: 'L', \n    monthYearLabel: 'MMM YYYY',\n    dateA11yLabel: 'L',\n    monthYearA11yLabel: 'MMM YYYY',\n  }\n};\n\n@Component({\n  selector: 'lib-bimplus-input-date',\n  imports: [\n    CommonModule,\n    FormsModule,\n    ReactiveFormsModule,\n    TranslateModule,\n    MatDatepickerModule,\n    MomentDateModule,\n    MatNativeDateModule\n  ],\n  templateUrl: './bimplus-input-date.component.html',\n  styleUrls: ['./bimplus-input-date.component.less'],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => BimplusInputDateComponent),\n      multi: true,\n    },\n    {\n      provide: DateAdapter,\n      useClass: MomentDateAdapter,\n      deps: [MAT_DATE_LOCALE, MAT_DATE_FORMATS, MAT_MOMENT_DATE_ADAPTER_OPTIONS]\n    },\n    {\n      provide: MAT_DATE_FORMATS,\n      useValue: MY_DATE_FORMATS\n    },\n    {\n      provide: MAT_DATE_LOCALE,\n      useValue: navigator.language\n    }, // Set the locale here!\n    {\n      provide: MAT_MOMENT_DATE_ADAPTER_OPTIONS,\n      useValue: {\n          useUtc: false\n      }\n    },\n  ],\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusInputDateComponent  implements ControlValueAccessor, OnInit {\n  @ViewChild('inputDateBox', { static: false }) inputDateBox!: ElementRef;\n  \n  value: string = '';\n  dateValue: Date | null = new Date();\n  isDisabled: boolean = false;\n\n  @Output() enterKeyPressed = new EventEmitter<void>();\n\n  protected _showClearButton = signal<boolean>(false);\n  @Input({ transform: booleanAttribute }) set showClearButton(show_clear_button: boolean) {\n    this._showClearButton.set(show_clear_button);\n  }\n\n  protected _validValue = signal<boolean>(true);\n  @Input({ transform: booleanAttribute }) set validValue(valid_value: boolean) {\n    this._validValue.set(valid_value);\n  }\n\n  @Input() minValue: string = '';\n  @Input() maxValue: string = '';\n\n  constructor() { }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  onChange = (value: string) => {\n  };\n  onTouched = () => {\n  };\n\n  writeValue(value: string): void {\n    this.value = value;\n    this.dateValue = new Date(value);\n  }\n\n  registerOnChange(fn: (value: string) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this.isDisabled = isDisabled;\n  }\n\n  private readonly STYLE_ID = 'datepicker-styles';\n  private injectGlobalStyles(): void {\n    // Check if the style tag already exists\n    if (document.getElementById(this.STYLE_ID)) {\n      return; // Style already injected, skip\n    }\n\n    // Create the style tag\n    const styleElement = document.createElement('style');\n    styleElement.id = this.STYLE_ID;\n\n    styleElement.textContent = `\n      mat-datepicker-content mat-calendar.bimplus-datepicker {\n          background-color: var(--brand-white-color);\n          border-color: var(--issue-details-view-select-border-color);\n          border: .1rem solid;\n      }\n\n      mat-calendar.bimplus-datepicker .mat-mdc-button {\n          font-size: 1.6rem;\n          font-weight: 700;\n      }\n      mat-calendar.bimplus-datepicker .mat-mdc-button:hover {\n          border-radius: 0;\n      }\n      mat-calendar.bimplus-datepicker mat-calendar-header .mat-calendar-controls {\n          margin: 0;\n      }\n      mat-calendar.bimplus-datepicker mat-calendar-header .mat-calendar-header {\n          background-color: rgb(236, 239, 241);\n          padding: 0;\n      }\n\n      mat-calendar.bimplus-datepicker .mat-calendar-content {\n          padding: 0;\n      }\n\n      mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-table-header{\n          height: 2rem;\n      }\n\n      mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-table-header tr{\n          height: 2rem;\n      }\n\n      mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-table-header tr th{\n          height: 2rem;\n          padding: 0;\n          font-size: 1.3rem;\n          font-weight: 700;\n      }\n\n      mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-body tr td button{\n          font-size: 1.3rem;\n      }\n\n      mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-body tr td button .mat-calendar-body-selected {\n          border-radius: 0;\n      }\n\n      mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-body tr td button .mat-calendar-body-today {\n          border-radius: 0;\n      }\n\n      mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-body tr td button .mat-calendar-body-cell-content.mat-focus-indicator {\n          border-radius: 0;\n      }\n\n      mat-calendar.bimplus-datepicker .mat-calendar-content mat-month-view .mat-calendar-body tr td.mat-calendar-body-label {\n          font-size: 1.3rem;\n          font-weight: 700;\n      }\n\n      mat-calendar.bimplus-datepicker .mat-calendar-content mat-multi-year-view .mat-calendar-body tr td button{\n          font-size: 1.3rem;\n      }\n\n      mat-calendar.bimplus-datepicker .mat-calendar-content mat-multi-year-view .mat-calendar-body tr td button .mat-calendar-body-selected {\n          border-radius: 0;\n      }\n\n      mat-calendar.bimplus-datepicker .mat-calendar-content mat-multi-year-view .mat-calendar-body tr td button .mat-calendar-body-cell-content.mat-focus-indicator {\n          border-radius: 0;\n      }\n\n      mat-calendar.bimplus-datepicker .mat-calendar-content mat-year-view .mat-calendar-body tr td button{\n          font-size: 1.3rem;\n      }\n\n      mat-calendar.bimplus-datepicker .mat-calendar-content mat-year-view .mat-calendar-body tr td button .mat-calendar-body-selected {\n          border-radius: 0;\n      }\n\n      mat-calendar.bimplus-datepicker .mat-calendar-content mat-year-view .mat-calendar-body tr td button .mat-calendar-body-cell-content.mat-focus-indicator {\n          border-radius: 0;\n      }\n\n      mat-calendar.bimplus-datepicker .mat-calendar-content mat-year-view .mat-calendar-body tr td.mat-calendar-body-label {\n          font-size: 1.3rem;\n          font-weight: 700;\n      }\n    `;\n\n    // Append the style tag to document.head\n    document.head.appendChild(styleElement);\n  }\n  ngOnInit() {\n    this.injectGlobalStyles();\n    console.log('BimplusInputDateComponent ngOnInit'); \n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  protected _clearValue(event: Event): void {\n    this.value = \"\";\n    this.dateValue = null;\n    this.onChange(this.value);\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  protected _showDatePicker(event: Event): void {\n    console.log('BimplusInputDateComponent _showDatePicker');\n  }\n  \n  protected handleKeyDown(event: KeyboardEvent): void {\n    if (event.key !== 'Enter') {\n      return;\n    }\n    this.enterKeyPressed.emit();\n  }\n\n  onDateChanged(event: MatDatepickerInputEvent<Date>) {\n    const selectedDate = event.value;\n\n    if (selectedDate) {\n      this.value = selectedDate.toISOString();\n      this.onChange(this.value);\n      console.log('Selected Date (UTC):', selectedDate);\n    }\n  }\n}\n","<div class=\"date-input-wrapper\">\n    <mat-datepicker-toggle matIconPostfix [for]=\"picker\"  [disableRipple]=\"true\"></mat-datepicker-toggle>\n    <input matInput [matDatepicker]=\"picker\" readonly [(ngModel)]=\"dateValue\" #inputDateBox (dateChange)=\"onDateChanged($event)\" (click)=\"picker.open()\">\n    <mat-datepicker #picker [panelClass]=\"'bimplus-datepicker'\"></mat-datepicker>\n    <div\n      class=\"clear-button\"\n      (click)=\"_clearValue($event)\"\n      (keydown)=\"handleKeyDown($event)\"\n    ></div>\n</div>","import {\n  Component\n  , Input\n  , ViewEncapsulation\n  , signal\n} from '@angular/core';\nimport {\n  ObjectAttributeGroup\n  , ObjectAttribute\n} from '../object-properties/object-properties.interface';\nimport { GetAttributeValueAsString } from '../../pipes/get-attribute-value-as-string.pipe';\nimport { isObjectPropertyValueBlank } from '../../utils/objectProperties';\nimport { ObjectPropertyValueComponent } from './object-property-value/object-property-value.component';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { BimplusInputTextFieldComponent } from \"../bimplus-input-text-field/bimplus-input-text-field.component\";\nimport { BimplusInputCheckboxComponent } from \"../bimplus-input-checkbox/bimplus-input-checkbox.component\";\nimport { BimplusInputNumberComponent } from '../bimplus-input-number/bimplus-input-number.component';\nimport { BimplusInputComboboxComponent } from '../bimplus-input-combobox/bimplus-input-combobox.component';\nimport { BimplusInputDateComponent } from '../bimplus-input-date/bimplus-input-date.component';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n  selector: 'lib-object-properties-group',\n  imports: [\n    GetAttributeValueAsString,\n    ObjectPropertyValueComponent,\n    BimplusInputTextFieldComponent,\n    BimplusInputCheckboxComponent,\n    BimplusInputNumberComponent,\n    BimplusInputComboboxComponent,\n    BimplusInputDateComponent,\n    ReactiveFormsModule,\n    CommonModule\n  ],\n  templateUrl: './object-properties-group.component.html',\n  styleUrls: ['./object-properties-group.component.less'],\n  encapsulation: ViewEncapsulation.ShadowDom\n})\n\nexport class ObjectPropertiesGroupComponent {\n  protected _editMode = signal<boolean>(false);\n\n  @Input() set editMode(edit_mode: boolean) {\n    this._editMode.set(edit_mode);\n  }\n\n  @Input() objectPropertiesForm: FormGroup | undefined;\n\n  protected _existFormControlForAttibute(attribId: string): boolean {\n    if(!this.objectPropertiesForm) {\n      return false;\n    }\n\n    const attrib = this.objectPropertiesForm.get(attribId);\n\n    if(!attrib) {\n      return false;\n    }\n    return true;\n  }\n\n  protected _isValueValid(attribId: string): boolean {\n    if(!this.objectPropertiesForm) {\n      return false;\n    }\n    const attrib = this.objectPropertiesForm.get(attribId);\n\n    if(!attrib) {\n      return false;\n    }\n    return attrib?.valid;\n  }\n\n  protected _canUpdateObject = signal<boolean>(false);\n  @Input() set canUpdateObject(canUpdateObject: boolean) {\n    this._canUpdateObject.set(canUpdateObject);\n  }\n\n  protected _attributesGroup = signal<ObjectAttributeGroup>({\n    name: '',\n    attributes: [],\n    expanded: false,\n  });\n\n  @Input() set attributesGroup(value: ObjectAttributeGroup | undefined) {\n    if(!value){\n      return;\n    }\n    this._attributesGroup.set(value);\n  }\n\n  constructor() { }\n\n  protected isValueBlank(attrib: ObjectAttribute): boolean {\n    return isObjectPropertyValueBlank(attrib);\n  }\n  protected _isBoleanTextBox(attrib: ObjectAttribute): boolean {\n    return (typeof attrib.type === 'string' && /^boolean$/i.test(attrib.type)) && !attrib.control;\n  }\n  protected _isBoleanCheckBox(attrib: ObjectAttribute): boolean {\n    return (typeof attrib.type === 'string' && /^boolean$/i.test(attrib.type))\n     && (typeof attrib.control  === 'string' && /^checkbox$/i.test(attrib.control));\n  }\n  protected _isTextBox(attrib: ObjectAttribute): boolean {\n    return (typeof attrib.type === 'string' && /^string$/i.test(attrib.type)) && !attrib.control;\n  }\n  protected _isDoubleTextBox(attrib: ObjectAttribute): boolean {\n    return (typeof attrib.type === 'string' && /^double$/i.test(attrib.type)) && !attrib.control;\n  }\n  protected _isIntegerTextBox(attrib: ObjectAttribute): boolean {\n    return (typeof attrib.type === 'string' && /^int(32)?$/i.test(attrib.type)) && !attrib.control;\n  }\n  protected _isGuidTextBox(attrib: ObjectAttribute): boolean {\n    return (typeof attrib.type === 'string' && /^guid$/i.test(attrib.type)) && !attrib.control;\n  }\n  protected _isDoubleEnumeration(attrib: ObjectAttribute): boolean {\n    return (typeof attrib.type === 'string' && /^double$/i.test(attrib.type))\n    && (typeof attrib.control === 'string' && /^enumeration$/i.test(attrib.control));\n  }\n  protected _isGuidEnumeration(attrib: ObjectAttribute): boolean {\n    return (typeof attrib.type === 'string' && /^guid$/i.test(attrib.type))\n    && (typeof attrib.control === 'string' && /^enumeration$/i.test(attrib.control));\n  }\n  protected _isIntegerEnumeration(attrib: ObjectAttribute): boolean {\n    return (typeof attrib.type === 'string' && /^int(32)?$/i.test(attrib.type))\n    && (typeof attrib.control === 'string' && /^enumeration$/i.test(attrib.control));\n  }\n  protected _isStringEnumeration(attrib: ObjectAttribute): boolean {\n    return (typeof attrib.type === 'string' && /^string$/i.test(attrib.type))\n    && (typeof attrib.control === 'string' && /^enumeration$/i.test(attrib.control));\n  }\n  protected _isStringCombobox(attrib: ObjectAttribute): boolean {\n    return (typeof attrib.type === 'string' && /^string$/i.test(attrib.type))\n    && (typeof attrib.control === 'string' && /^combobox$/i.test(attrib.control));\n  }\n  protected _isDatetime(attrib: ObjectAttribute): boolean {\n    return ((typeof attrib.type === 'string' && /^datetime$/i.test(attrib.type))  && !attrib.control);\n  }\n}\n","@if(objectPropertiesForm) {\n    <div class=\"object-property-table\"\n      [formGroup]=\"objectPropertiesForm\"\n      [class.edit-mode] = \"_editMode()\"\n    >\n      @for (attrib of _attributesGroup().attributes; track attrib) {\n        <div class=\"row-wrapper\">\n          <div class=\"table-cell object-property-icon uuid-{{attrib.id}}\"></div>\n          <div class=\"table-cell object-property-name uuid-{{attrib.id}}\" title=\"{{attrib.tooltip}}\">{{attrib.name}}:</div>\n          <div class=\"table-cell object-property-value uuid-{{attrib.id}}\">\n            @if(_editMode() && _canUpdateObject() && attrib.isChangeable && _existFormControlForAttibute(attrib.id)) {\n              @if(\n                _isBoleanTextBox(attrib)\n                || _isTextBox(attrib)\n                || _isDoubleTextBox(attrib)\n                || _isGuidTextBox(attrib)\n              ) {\n                <lib-bimplus-input-text-field\n                  class=\"flex-grow\"\n                  formControlName=\"{{attrib.id}}\"\n                  [validValue]=\"_isValueValid(attrib.id)\"\n                  [showClearButton]=true\n                />\n              }\n              @else if(\n                _isIntegerTextBox(attrib)\n              ) {\n                <lib-bimplus-input-number\n                  class=\"flex-grow\"\n                  formControlName=\"{{attrib.id}}\"\n                  [validValue]=\"_isValueValid(attrib.id)\"\n                  minValue=\"{{attrib.minValue}}\"\n                  maxValue=\"{{attrib.maxValue}}\"\n                />\n              }\n              @else if(\n                _isBoleanCheckBox(attrib)\n              ) {\n                <lib-bimplus-input-checkbox\n                  class=\"flex-grow\"\n                  formControlName=\"{{attrib.id}}\"\n                />\n              }\n              @else if(\n                _isDoubleEnumeration(attrib)\n              ) {\n                <lib-bimplus-input-combobox\n                  class=\"flex-grow\"\n                  formControlName=\"{{attrib.id}}\"\n                  [validValue]=\"_isValueValid(attrib.id)\"\n                  [enumdefinition]=\"attrib.enumdefinition\"\n                  [selectedValue]=\"attrib.value | number\"\n                />\n              }\n              @else if(\n                _isGuidEnumeration(attrib)\n              ) {\n                <lib-bimplus-input-combobox\n                  class=\"flex-grow\"\n                  formControlName=\"{{attrib.id}}\"\n                  [validValue]=\"_isValueValid(attrib.id)\"\n                  [enumdefinition]=\"attrib.enumdefinition\"\n                  [selectedValue]=\"attrib.value\"\n                />\n              }\n              @else if(\n                _isIntegerEnumeration(attrib)\n              ) {\n                <lib-bimplus-input-combobox\n                  class=\"flex-grow\"\n                  formControlName=\"{{attrib.id}}\"\n                  [validValue]=\"_isValueValid(attrib.id)\"\n                  [enumdefinition]=\"attrib.enumdefinition\"\n                  [selectedValue]=\"attrib.value | number\"\n                />\n              }\n              @else if(\n                _isStringEnumeration(attrib)\n              ) {\n                <lib-bimplus-input-combobox\n                  class=\"flex-grow\"\n                  formControlName=\"{{attrib.id}}\"\n                  [validValue]=\"_isValueValid(attrib.id)\"\n                  [enumdefinition]=\"attrib.enumdefinition\"\n                  [selectedValue]=\"attrib.value\"\n                />\n              }\n              @else if(\n                _isStringCombobox(attrib)\n              ) {\n                <lib-bimplus-input-combobox\n                  class=\"flex-grow\"\n                  formControlName=\"{{attrib.id}}\"\n                  [validValue]=\"_isValueValid(attrib.id)\"\n                  [enumdefinition]=\"attrib.enumdefinition\"\n                  [selectedValue]=\"attrib.value\"\n                />\n              }\n              @else if(\n                _isDatetime(attrib)\n              ) {\n                <lib-bimplus-input-date\n                  class=\"flex-grow\"\n                  formControlName=\"{{attrib.id}}\"\n                  [validValue]=\"_isValueValid(attrib.id)\"\n                  minValue=\"{{attrib.minValue}}\"\n                  maxValue=\"{{attrib.maxValue}}\"\n                  [showClearButton]=true\n                />\n              }\n            }\n            @else {\n              <lib-object-property-value\n                value=\"{{attrib | getAttributeValueAsString}}\"\n                tooltip=\"{{attrib.tooltip}}\"\n              />\n            }\n          </div>\n          <div class=\"table-cell object-property-unit uuid-{{attrib.id}}\" title=\"{{attrib.tooltip}}\">{{attrib.unit}}</div>\n        </div>\n      }\n    </div>\n}\n@else {\n  <div class=\"object-property-table\"\n    [class.edit-mode] = \"_editMode()\"\n  >\n    @for (attrib of _attributesGroup().attributes; track attrib) {\n\n      @if(!isValueBlank(attrib)) {\n        <div class=\"row-wrapper\">\n          <div class=\"table-cell object-property-icon uuid-{{attrib.id}}\"></div>\n          <div class=\"table-cell object-property-name uuid-{{attrib.id}}\" title=\"{{attrib.tooltip}}\">{{attrib.name}}:</div>\n          <div class=\"table-cell object-property-value uuid-{{attrib.id}}\">\n            <lib-object-property-value\n              value=\"{{attrib | getAttributeValueAsString}}\"\n              tooltip=\"{{attrib.tooltip}}\"\n            />\n          </div>\n          <div class=\"table-cell object-property-unit uuid-{{attrib.id}}\" title=\"{{attrib.tooltip}}\">{{attrib.unit}}</div>\n        </div>\n      }\n    }\n  </div>\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { ObjectAttribute } from '../components/object-properties/object-properties.interface';\nimport { RoundPipe } from './round.pipe';\nimport moment from 'moment';\nimport 'moment/min/locales';\n\n\n@Pipe({\n  name: 'getAttributeValue',\n  standalone: true\n})\nexport class GetAttributeValue implements PipeTransform {\n\n  constructor() {\n    const locale = window.navigator.language;\n    moment.locale(locale);\n  }\n\n  _transformDouble(value: ObjectAttribute): string {\n    return new RoundPipe().transform(value.value, value.decimal ?? 2);\n  }\n\n  _transformDoubleEnumeration(value: ObjectAttribute): string {\n    return this._transformDouble(value);\n  }\n\n  _transformDatetime(value: ObjectAttribute): string {\n    return value.value;\n  }\n\n  _transformGUID(value: ObjectAttribute): string {\n    return value.value;\n  }\n\n  _transformGUIDEnumeration(value: ObjectAttribute): string {\n    return `${value.value}`;\n  }\n\n  _transformInt(value: ObjectAttribute): string {\n    return value.value;\n  }\n\n  _transformIntEnumeration(value: ObjectAttribute): string {\n    return `${value.value}`;\n  }\n\n  _transformString(value: ObjectAttribute): string {\n    return value.value;\n  }\n\n  _transformStringEnumeration(value: ObjectAttribute): string {\n    return `${value.value}`;\n  }\n\n  _transformStringCombobox(value: ObjectAttribute): string {\n    if(value.control && /^combobox$/i.test(value.control)) {\n      return value.value;\n    }\n    return '';\n  }\n\n  _transformBooleanToBoolean(value: ObjectAttribute): boolean {\n    if(value.value === '1'\n      || /^true$/i.test(value.value)) {\n        return true;\n      }\n      return false;\n  }\n\n  _transformBooleanToString(value: ObjectAttribute): string {\n    if(value.value === '1'\n      || /^true$/i.test(value.value)) {\n        return \"True\";\n      }\n      return \"False\";\n  }\n\n  transform(value: ObjectAttribute): string | boolean {\n    const _value = value.value;\n    if (this.isEmpty(_value)) {\n      return '';\n    }\n\n    if (this.isDouble(value)) {\n      return this._transformDouble(value);\n    }\n\n    if (this.isDoubleEnumeration(value)) {\n      return this._transformDoubleEnumeration(value);\n    }\n\n    if (this.isDatetime(value)) {\n      return this._transformDatetime(value);\n    }\n\n    if (this.isGUID(value)) {\n      return this._transformGUID(value);\n    }\n\n    if (this.isGUIDEnumeration(value)) {\n      return this._transformGUIDEnumeration(value);\n    }\n\n    if (this.isInt(value)) {\n      return this._transformInt(value);\n    }\n\n    if (this.isIntEnumeration(value)) {\n      return this._transformIntEnumeration(value);\n    }\n\n    if (this.isString(value)) {\n      return this._transformString(value);\n    }\n\n    if (this.isStringEnumeration(value)) {\n      return this._transformStringEnumeration(value);\n    }\n\n    if (this.isStringCombobox(value)) {\n      return this._transformStringCombobox(value);\n    }\n\n    if (this.isBooleanCheckbox(value)) {\n      return this._transformBooleanToBoolean(value);\n    }\n\n    if (this.isBooleanTextbox(value)) {\n      return this._transformBooleanToString(value);\n    }\n\n    return value.value;\n  }\n\n  private isEmpty(value: string | undefined | null): boolean {\n    return value === undefined || value === null || value === '';\n  }\n\n  private isDouble(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^double$/i.test(value.type) && !value.control;\n  }\n\n  private isDoubleEnumeration(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^double$/i.test(value.type)\n      && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\n  }\n\n  private isDatetime(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^datetime$/i.test(value.type) && !value.control;\n  }\n\n  private isGUID(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^guid$/i.test(value.type) && !value.control;\n  }\n\n  private isGUIDEnumeration(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^guid$/i.test(value.type)\n      && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\n  }\n\n  private isInt(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^int(32)?$/i.test(value.type) && !value.control;\n  }\n\n  private isIntEnumeration(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^int(32)?$/i.test(value.type)\n      && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\n  }\n\n  private isString(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^string$/i.test(value.type) && !value.control;\n  }\n\n  private isStringEnumeration(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^string$/i.test(value.type)\n      && typeof value.control === 'string' && /^enumeration$/i.test(value.control);\n  }\n\n  private isStringCombobox(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^string$/i.test(value.type)\n      && typeof value.control === 'string' && /^combobox$/i.test(value.control);\n  }\n\n  private isBooleanCheckbox(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^boolean$/i.test(value.type)\n      && typeof value.control === 'string' && /^checkbox$/i.test(value.control);\n  }\n\n  private isBooleanTextbox(value: ObjectAttribute): boolean {\n    return typeof value.type === 'string' && /^boolean$/i.test(value.type) && !value.control;\n  }\n}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nexport function doubleValidator(minValue: string, maxValue: string): ValidatorFn {\n  return (control: AbstractControl): ValidationErrors | null => {\n    if(control.value === null || control.value === undefined || control.value === '') {\n      return null;\n    }\n\n    const value = control.value;\n    const isValidDouble = /^[-+]?\\d*?\\.?\\d+?([eE][-+]?\\d+?)?$/.test(value); //Regex for a double\n\n    if(!isValidDouble) {\n      return { invalidDouble: { value: value, message: `Invalid number format: ${value}.` } };\n    }\n\n    if(isNaN(parseFloat(value))) {\n      return { invalidDouble: { value: value, message: `Invalid number format: ${value}.` } };\n    }\n\n    if (minValue && parseFloat(value) < parseFloat(minValue)) {\n      return { invalidDouble: { value: value, message: `Value must be greater than or equal to ${minValue}.` } };\n    }\n    if (maxValue && parseFloat(value) > parseFloat(maxValue)) {\n      return { invalidDouble: { value: value, message: `Value must be less than or equal to ${maxValue}.` } };\n    }\n\n    return null;\n  };\n}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nexport function integerValidator(minValue: string, maxValue: string): ValidatorFn {\n  return (control: AbstractControl): ValidationErrors | null => {\n    const value = control.value;\n    if(value === null || value === undefined || value === '') {\n      return null;\n    }\n    const isValidInteger = /^[+-]?\\d+$/.test(value); //Regex for a integer\n\n    if(!isValidInteger) {\n      return { invalidInteger: { value: value, message: `Invalid number format: ${value}.` } };\n    }\n\n    if(isNaN(parseInt(value))) {\n      return { invalidInteger: { value: value, message: `Invalid number format: ${value}.` } };\n    }\n\n    if (minValue && parseInt(value) < parseInt(minValue)) {\n      return { invalidInteger: { value: value, message: `Value must be greater than or equal to ${minValue}.` } };\n    }\n    if (maxValue && parseInt(value) > parseInt(maxValue)) {\n      return { invalidInteger: { value: value, message: `Value must be less than or equal to ${maxValue}.` } };\n    }\n\n    return null;\n  };\n}","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nexport function guidValidator(): ValidatorFn {\n  return (control: AbstractControl): ValidationErrors | null => {\n    const value = control.value;\n    if(value === null || value === undefined || value === '') {\n      return null;\n    }\n    const isValidGuid =  /^[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}$/.test(value); //Regex for a guid\n\n    if(!isValidGuid) {\n      return { invalidGuid: { value: value, message: `Invalid guid format: ${value}.` } };\n    }\n\n    return null;\n  };\n}","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nexport function doubleEnumValidator(enumData: Record<number | string, string> | undefined | Array<string>): ValidatorFn {\n  return (control: AbstractControl): ValidationErrors | null => {\n    if(!enumData) {\n      return null;\n    }\n    if(Array.isArray(enumData)) {\n      return null;\n    }\n    const value = control.value;\n    if(value === null || value === undefined || value === '') {\n      return null;\n    }\n    const isValueFromEnum =  Object.keys(enumData).includes(value);\n\n    if(!isValueFromEnum) {\n      return { invalidGuid: { value: value, message: `Invalid value: ${value}.` } };\n    }\n\n    return null;\n  };\n}","import {\n  AfterViewInit,\n  Component,\n  effect,\n  ElementRef,\n  Input,\n  OnDestroy,\n  ViewChild,\n  ViewEncapsulation\n} from '@angular/core';\nimport * as Renderer from 'bimplus-renderer';\nimport * as THREE from 'three';\nimport * as WebSdk from \"bimplus-websdk\";\nimport {TranslatePipe} from \"@ngx-translate/core\";\nimport { PreviewObject } from './object-preview.interface';\n\n@Component({\n  selector: 'lib-object-preview',\n  imports: [\n    TranslatePipe\n  ],\n  templateUrl: './object-preview.component.html',\n  styleUrls: ['./object-preview.component.less'],\n  encapsulation: ViewEncapsulation.None\n})\nexport class ObjectPreviewComponent implements AfterViewInit, OnDestroy {\n  private resizeObserver: ResizeObserver | null = null;\n  viewport: Renderer.Viewport3D | null = null;\n  isLoading = true;\n  previousWidth = 0;\n  previousHeight = 0;\n  resizeTimeout: number | undefined;\n\n  @ViewChild('rendererviewport') rendererViewportElement!: ElementRef;\n\n  @Input() api: WebSdk.Api | null = null;\n\n  @Input()\n  set objectId(id: string) {\n    this._objectId = id;\n    this.onObjectIdChanged();\n  }\n\n  get objectId(): string | undefined {\n    return this._objectId;\n  }\n\n  private _objectId: string | undefined = undefined;\n\n  @Input() revision: number | undefined = undefined;\n  @Input() set visibleNode(value: PreviewObject){\n    if(this.viewport){\n      this.viewport.toggleObjectNode({id:value.id, visible:value.visible});\n    }\n  }\n  @Input() set opaqueNode(value: PreviewObject){    \n    if(this.viewport){\n      this.viewport.toggleObjectNodeOpacity({id:value.id, opacity:value.opaque});\n    }\n\n  }\n\n  private contentLoader: Renderer.ContentLoader | null = null;\n\n  private isRendererInitialized: boolean = false;\n\n  constructor(private readonly el: ElementRef) {\n    effect(()=>{\n      if (this.visibleNode) {\n        this.processVisibilityNode(this.visibleNode);\n      }\n    });\n    // React to changes in the `opaqueNode` signal\n    effect(() => {\n      if (this.opaqueNode) {\n        this.processOpacityNode(this.opaqueNode);\n      }\n    });\n  }\n  \n  // Method to process the node\n  processVisibilityNode(node: PreviewObject): void {\n    console.log('Processing visbility of node in lib-object-preview:', node);   \n  }\n  processOpacityNode(node: PreviewObject): void {\n    console.log('Processing opacity of node in lib-object-preview:', node);   \n  }\n\n  ngAfterViewInit(): void {\n    const container = this.el.nativeElement;\n        \n    // Initialize ResizeObserver\n    this.resizeObserver = new ResizeObserver((entries) => {\n      for (const entry of entries) {\n        const width = entry?.contentRect?.width;\n\n        if (width != this.previousWidth) {\n          this.previousWidth = width;\n          this.recalculatePreviewSize();\n        }\n      }\n    });\n\n    // Start observing the component's main container\n    this.resizeObserver.observe(container);\n    this.initRenderer();\n\n    this.contentLoader = new Renderer.ContentLoader(this.api as WebSdk.Api, this.viewport as Renderer.Viewport3D);\n\n    this.isRendererInitialized = true;\n\n    this.loadObject();\n  }\n\n  ngOnDestroy() {\n    this.resizeObserver?.disconnect();\n    this.viewport?.dispose();\n  }\n\n  recalculatePreviewSize() {\n    clearTimeout(this.resizeTimeout);\n\n    this.resizeTimeout = setTimeout(() => {\n      const width = this.rendererViewportElement?.nativeElement.offsetWidth;\n      const height = this.rendererViewportElement?.nativeElement.offsetHeight;\n\n      if (width && height) {\n        this.viewport?.setViewportSize(width, height);\n        this.viewport?.draw();\n      } else {\n        console.error(\"Viewport size is zero\");\n      }\n    }, 1) as unknown as number; // Delay execution to avoid rapid resizing and flickering\n  }\n\n  metricUnits: Renderer.MeasurementUnits = {\n    weight: {\n      multiplicator: 0.001,\n      precision: 2,\n      unit: 'kg',\n    },\n    length: {\n      multiplicator: 0.001,\n      precision: 2,\n      unit: 'm',\n    },\n    width: {\n      multiplicator: 0.001,\n      precision: 2,\n      unit: 'm',\n    },\n    height: {\n      multiplicator: 0.001,\n      precision: 2,\n      unit: 'm',\n    },\n    area: {\n      multiplicator: 0.000001,\n      precision: 2,\n      unit: 'm²',\n    },\n    volume: {\n      multiplicator: 1e-9,\n      precision: 2,\n      unit: 'm³',\n    },\n  };\n\n  imperialUnits: Renderer.MeasurementUnits = {\n    length: {\n      multiplicator: 0.00328083989,\n      precision: 2,\n      unit: 'feet',\n    },\n    width: {\n      multiplicator: 0.00328083989,\n      precision: 2,\n      unit: 'feet',\n    },\n    height: {\n      multiplicator: 0.00328083989,\n      precision: 2,\n      unit: 'feet',\n    },\n  };\n\n  viewportSettings: Renderer.ViewportSettings = {\n    defaultOpacity: 0.5,\n    disciplineOpacity: 0.1,\n    pinSizeScaleFactor: 2,\n    maxWebGLBufferSize: 350e12,\n    mixedModelMode: true,\n    useFrameSelection: false,\n    pinFlyToDistance: 20000,\n    nearClippingPlane: 0.01,\n    slideThmbSize: [180, 112],\n    units: {\n      mm: this.metricUnits,\n      inch: {},\n    },\n  };\n\n  units = {\n    Metric: this.metricUnits,\n    Imperial: this.imperialUnits,\n  };\n\n  setAmbientOcclusionOptions() {\n    if (!this.viewport) {\n      return\n    }\n\n    const viewportOcclusionData = {\n      usage: false,\n      usageForInteraction: false,\n      useShadows: false,\n      useShadowsForInteraction: false,\n      lightRotation: Math.PI * 35.00 / 180.0,\n      lightElevation: Math.PI * 50.00 / 180.0,\n      lightColor: new THREE.Color(1.0, 1.0, 1.0),\n      ambientLightColor: new THREE.Color(0.6, 0.6, 0.6),\n    };\n    this.viewport.setAmbientOcclusionOptions(viewportOcclusionData);\n  }\n\n  setBackgroundOptions() {\n    if (!this.viewport) {\n      return\n    }\n\n    const daySkyBackgroundSetting = {\n      name: \"day sky\",\n      ambientLightColor: 0x868686,\n      backgroundType: Renderer.Background.BackgroundType_LinearGradient,\n      backgroundParams: {\n        alpha: 1.0,\n        colorStops: [\n          {\n            offset: 0.0,\n            color: \"#87CDE9\"\n          },\n          {\n            offset: 0.5104,\n            color: \"#DDEDFE\"\n          },\n          {\n            offset: 0.9635,\n            color: \"#D3D3D4\"\n          }\n        ]\n      }\n    };\n    this.viewport.setBackground(daySkyBackgroundSetting.backgroundType, daySkyBackgroundSetting.backgroundParams);\n  }\n\n  setHoverOption(useHoverEffect: boolean = true) {\n    if (!this.viewport) {\n      return\n    }\n    this.viewport.setUseHoverEffect(useHoverEffect);\n  }\n\n  initRenderer() {\n    this.viewport = new Renderer.Viewport3D({\n      settings: this.viewportSettings,\n      units: this.units.Metric,\n      domElementId: \"\",\n      GPUPick: true,\n      api: this.api as WebSdk.Api,\n      name: \"objectPreviewRendererViewport\",\n      lookupTextureSize: 32,\n      ssaoSupported: false, // Disable SSAO support for object details window\n      shadowsSupported: false,\n      panningScaleFactor: 4.0, //In case of preview window use bigger panning scale factor\n      commandPolicies: {\n        CommandSelect: {\n          noBubble: true, // Don't do a upwards activation\n          noTraverse: true // Don't do a downwards activation\n        }\n      }\n    });\n\n    this.setBackgroundOptions();\n    this.setHoverOption();\n    this.viewport.draw();\n\n    if (this.viewport?.domElement) {\n      this.viewport.domElement.id = \"objectPreviewRendererViewport\";\n      const nativeElement = this.el.nativeElement?.shadowRoot || this.el.nativeElement;\n      nativeElement?.getElementsByClassName?.(\"rendered-preview\")[0]?.appendChild?.(this.viewport.domElement);\n    } else {\n      console.error(\"no dom element present for renderer!\");\n    }\n  }\n\n  private onObjectIdChanged() {\n    this.loadObject();\n  }\n\n  private loadObject() {\n    if (!this.isRendererInitialized) {\n      return;\n    }\n\n    if (!this.contentLoader) {\n      console.error(\"content loader is not there!\");\n      return;\n    }\n\n    console.log('loading object:', this.objectId);\n\n    this.isLoading = true;\n\n    this.viewport?.resetViewport();\n\n    const projectContent = null;\n    this.contentLoader.loadObject(this.objectId as string, this.revision, projectContent).then(() => {\n      // Set the viewport to project view - reset camera\n      this.viewport?.setupProjectView();\n      this.isLoading = false;\n    });\n  }\n}\n","<div class=\"rendered-preview\" #rendererviewport>\n  @if (isLoading) {\n    <div class=\"loading-spinner-icon\" title=\"{{'_LoadingGeometry' | translate}}\">\n    </div>\n  }\n</div>\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nexport function guidEnumValidator(enumData: Record<number | string, string> | undefined | Array<string>): ValidatorFn {\n  return (control: AbstractControl): ValidationErrors | null => {\n    if(!enumData) {\n      return null;\n    }\n    if(Array.isArray(enumData)) {\n      return null;\n    }\n    const value = control.value;\n    if(value === null || value === undefined || value === '') {\n      return null;\n    }\n    const isValueFromEnum =  Object.keys(enumData).includes(value);\n\n    if(!isValueFromEnum) {\n      return { invalidGuid: { value: value, message: `Invalid value: ${value}.` } };\n    }\n\n    return null;\n  };\n}","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nexport function stringEnumValidator(enumData: Record<number | string, string> | undefined | Array<string>): ValidatorFn {\n  return (control: AbstractControl): ValidationErrors | null => {\n    if(!enumData) {\n      return null;\n    }\n    if(Array.isArray(enumData)) {\n      return null;\n    }\n    const value = control.value;\n    if(value === null || value === undefined || value === '') {\n      return null;\n    }\n    const isValueFromEnum =  Object.keys(enumData).includes(value);\n\n    if(!isValueFromEnum) {\n      return { invalidGuid: { value: value, message: `Invalid value: ${value}.` } };\n    }\n\n    return null;\n  };\n}","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nexport function stringComboboxValidator(arrayData: Record<number | string, string> | undefined | Array<string>): ValidatorFn {\n  return (control: AbstractControl): ValidationErrors | null => {\n    if(!arrayData) {\n      return null;\n    }\n    if(!Array.isArray(arrayData)) {\n      return null;\n    }\n  \n    const value = control.value;\n    if(value === null || value === undefined || value === '') {\n      return null;\n    }\n    const isValueFromEnum =  arrayData.includes(value);\n\n    if(!isValueFromEnum) {\n      return { invalidGuid: { value: value, message: `Invalid value: ${value}.` } };\n    }\n\n    return null;\n  };\n}","import { Injectable } from '@angular/core';\nimport * as WebSdk from 'bimplus-websdk';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class ObjectPropertiesService {\n\n  _model: BehaviorSubject<WebSdk.ObjectData | null> = new BehaviorSubject<WebSdk.ObjectData | null>(null);\n\n  constructor() { }\n\n  get modelValue(): WebSdk.ObjectData | null {\n    return this._model.value;\n  }\n\n  get model$(): BehaviorSubject<WebSdk.ObjectData | null> {\n    return this._model;\n  }\n\n  setModel(model: WebSdk.ObjectData): void {\n    this._model.next(model);\n  }\n\n}\n","import {\n  Component\n  , ViewEncapsulation\n  , Input\n  , OnInit\n  , signal\n  , WritableSignal\n  , ChangeDetectorRef,\n  EventEmitter,\n  Output\n} from '@angular/core';\nimport { ExpansionPanelComponent } from '../expansion-panel/expansion-panel.component';\nimport { ExpansionPanelHeaderComponent } from '../expansion-panel-header/expansion-panel-header.component';\nimport { BimplusLocalizedWidgetComponent } from '../bimplus-localized-widget/bimplus-localized-widget.component';\nimport {\n  TranslateModule\n  , TranslateService\n} from '@ngx-translate/core';\nimport {\n  ObjectStructureNode,\n  ObjectStructureNodeBuilder,\n} from '../bimplus-object-structure/bimplus-object-structure.interface';\nimport { PreviewObject } from '../object-preview/object-preview.interface';\nimport * as WebSdk from 'bimplus-websdk';\nimport {\n  from\n  , BehaviorSubject\n} from 'rxjs';\nimport { BimplusObjectStructureComponent } from '../bimplus-object-structure/bimplus-object-structure.component';\nimport {\n  ComplexPropertiesNode,\n  ComplexPropertiesNodeBuilder,\n} from '../bimplus-object-complex-properties/bimplus-object-complex-properties.interface';\nimport { BimplusObjectComplexPropertiesComponent } from '../bimplus-object-complex-properties/bimplus-object-complex-properties.component';\nimport {\n  ObjectAttribute,\n  ObjectAttributeGroup,\n} from './object-properties.interface';\nimport { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';\nimport {\n  BimplusButtonRowItem,\n  BimplusButtonClickEvent,\n} from '../bimplus-buttons-row/bimplus-buttons-row.interface';\nimport { BimplusScrollableContainerComponent } from '../bimplus-scrollable-container/bimplus-scrollable-container.component';\nimport { ObjectPropertiesGroupComponent } from '../object-properties-group/object-properties-group.component';\nimport { isObjectPropertyValueBlank } from '../../utils/objectProperties';\nimport {\n  FormGroup\n  , ReactiveFormsModule\n  , FormBuilder\n  , FormControl\n  , Validators\n} from '@angular/forms';\nimport { GetAttributeValue } from '../../pipes/get-attribute-value.pipe';\nimport { doubleValidator } from '../../validators/double.validator';\nimport { integerValidator } from '../../validators/integer.validator';\nimport { guidValidator } from '../../validators/guid.validator';\nimport { doubleEnumValidator } from '../../validators/double-enum.validator';\nimport { ObjectPreviewComponent } from \"../object-preview/object-preview.component\";\nimport { ObjectPropertiesService } from './object-properties.service';\nimport { guidEnumValidator } from '../../validators/guid-enum.validator';\nimport { stringEnumValidator } from '../../validators/string-enum.validator';\nimport { stringComboboxValidator } from '../../validators/string-combobox.validator';\n\n@Component({\n  selector: 'lib-object-properties',\n  imports: [\n    ExpansionPanelComponent,\n    ExpansionPanelHeaderComponent,\n    TranslateModule,\n    BimplusObjectStructureComponent,\n    BimplusObjectComplexPropertiesComponent,\n    BimplusButtonsRowComponent,\n    BimplusScrollableContainerComponent,\n    ObjectPropertiesGroupComponent,\n    ObjectPropertiesGroupComponent,\n    ObjectPreviewComponent,\n    ReactiveFormsModule\n  ],\n  templateUrl: './object-properties.component.html',\n  styleUrls: ['./object-properties.component.less'],\n  encapsulation: ViewEncapsulation.ShadowDom\n})\n\nexport class ObjectPropertiesComponent\n  extends BimplusLocalizedWidgetComponent\n  implements OnInit\n{\n  protected _objectPropertiesForm  = new FormGroup({});\n\n  protected _objectPropertiesGroupForm(group_name: string): FormGroup {\n    const _groupForm: FormGroup = this._objectPropertiesForm;\n    return _groupForm.controls[group_name] as FormGroup;\n  }\n\n  constructor(translateService: TranslateService\n    , private readonly formBuilder: FormBuilder\n    , private readonly cdr: ChangeDetectorRef\n    , private readonly objectPropertiesService: ObjectPropertiesService )\n  {\n    super(translateService);\n  }\n\n  protected _editMode = signal<boolean>(false);\n  private _objectStructure: ObjectStructureNode | null = null;\n\n  get objectStructure(): ObjectStructureNode | null {\n    return this._objectStructure;\n  }\n\n  private _complexProperties: ComplexPropertiesNode | null = null;\n\n  get complexProperties(): ComplexPropertiesNode | null {\n    return this._complexProperties;\n  }\n\n  @Input() api: WebSdk.Api | null = null;\n  @Input() revision: number | undefined = undefined;\n\n  protected _canUpdateObject = signal<boolean>(false);\n  @Input() set canUpdateObject(canUpdateObject: boolean) {\n    this._canUpdateObject.set(canUpdateObject);\n  }\n\n  private _rootObjectId : string = \"\";\n  @Input() set rootObjectId(id: string) {\n    if(this._rootObjectId === id) {\n      return;\n    }\n    this._cancelEditingProperties();\n\n    this._currentObjectId$.next(id);\n    this._createObjectStructure(id, this.revision);\n    this._rootObjectId = id;\n  }\n\n  get rootObjectId(): string {\n    return this._rootObjectId;\n  }\n\n  private readonly isSaveButtonDisabled$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);\n  protected readonly visibleNodeSignal:WritableSignal<PreviewObject> = signal({id:\"\",visible:false,opaque:false});\n  protected readonly opaqueNodeSignal:WritableSignal<PreviewObject> = signal({id:\"\",visible:false,opaque:false});\n\n  private readonly _currentObjectId$ = new BehaviorSubject<string> (\"\");\n  private readonly _currentPropertiesObjectId$ = new BehaviorSubject<string> (\"\");\n\n  buttonRowItems: Array<BimplusButtonRowItem> = [];\n  configEditProperties: Array<BimplusButtonRowItem> = [];\n  configEditedProperties: Array<BimplusButtonRowItem> = [];\n\n  @Output() updatedObjectProperties = new EventEmitter<{ [key: string]: unknown }>();\n\n  _editPropertiesButtonsConfiguration() {\n    this.configEditProperties.push({\n      id: 'edit-properties',\n      title: this.translateService.instant('_Edit_properties'),\n      tooltip: this.translateService.instant('_Edit_properties'),\n      disabled: !this._canUpdateObject(),\n      buttonStyle: 'primary',\n    });\n  }\n\n  _editedPropertiesButtonsConfiguration() {\n    this.configEditedProperties.push({\n      id: 'save-changed-properties',\n      title: this.translateService.instant('_Save'),\n      tooltip: this.translateService.instant('_Save'),\n      disabled: this.isSaveButtonDisabled$,\n      buttonStyle: 'primary',\n    });\n    this.configEditedProperties.push({\n      id: 'cancel-editing-properties',\n      title: this.translateService.instant('_Cancel'),\n      tooltip: this.translateService.instant('_Cancel'),\n      disabled: false,\n      buttonStyle: 'secondary',\n    });\n  }\n\n  ngOnInit() {\n    this._editPropertiesButtonsConfiguration();\n    this._editedPropertiesButtonsConfiguration();\n\n    this.buttonRowItems = this.configEditProperties;\n\n    this.subscribeProperties();  \n  }\n\n  subscribeProperties() {\n    this._currentPropertiesObjectId$.subscribe({\n      next: (id) => {\n        if (id) {\n          this._createObjectProperties(id, this.revision);\n        }\n      },\n    });\n\n    this._currentObjectId$.subscribe({\n      next: (id) => {\n        this._currentPropertiesObjectId$.next(id);\n        this._createComplexPropertiestructure(id, this.revision);\n      },\n    });\n  }\n\n  handleObjectStructureNodeSelected(node: ObjectStructureNode) {\n    console.log(node);\n    this._currentObjectId$.next(node.id);\n  }\n\n  handleObjectStructureNodeVisible(node : ObjectStructureNode){\n    const objNode: PreviewObject = {\n      id:node.id,\n      visible: node.visible,\n      opaque: node.opaque};\n    this.visibleNodeSignal.set(objNode); // Update the signal\n  }\n\n  handleObjectStructureNodeOpaque(node : ObjectStructureNode){\n    const objNode: PreviewObject = {\n      id:node.id,\n      visible: node.visible,\n      opaque: node.opaque};\n    this.opaqueNodeSignal.set(objNode); // Update the signal\n  }\n  \n\n  handleComplexPropertyNodeSelected(node : ComplexPropertiesNode){\n    console.log(node);\n    this._currentPropertiesObjectId$.next(node.id);\n  }\n\n  private _loadObjectStructure(objectId: string, revision: number | undefined) {\n    if (!this.api) {\n      return;\n    }\n\n    if (!objectId) {\n      return;\n    }\n\n    return from(\n      this.api.objects.getTopology(objectId, revision, false, false, undefined)\n    );\n  }\n\n  private _createObjectStructure(\n    objectId: string,\n    revision: number | undefined\n  ) {\n    this._loadObjectStructure(objectId, revision)?.subscribe({\n      next: (structureData) => {\n        if (structureData) {\n          this._objectStructure =\n            ObjectStructureNodeBuilder.createFromResponse(structureData);\n        }\n      },\n    });\n  }\n\n  private _loadObjectComplexPropertiesStructure(\n    objectId: string,\n    revision: number | undefined\n  ) {\n    if (!this.api) {\n      return;\n    }\n\n    if (!objectId) {\n      return;\n    }\n\n    return from(\n      this.api.objects.getComplexPropertiesTopology(objectId, revision)\n    );\n  }\n\n  private _createComplexPropertiestructure(\n    objectId: string,\n    revision: number | undefined\n  ) {\n    this._loadObjectComplexPropertiesStructure(objectId, revision)?.subscribe({\n      next: (structureData) => {\n        if (structureData) {\n          const complexProps =\n            ComplexPropertiesNodeBuilder.createFromResponse(structureData);\n          if (complexProps?.children?.length) {\n            this._complexProperties = complexProps;\n          } else {\n            this._complexProperties = null;\n          }\n        }\n      },\n    });\n  }\n\n  protected objectAttributeGroups = signal<ObjectAttributeGroup[]>([]);\n\n  private _loadObjectProperties(\n    objectId: string,\n    revision: number | undefined\n  ) {\n    if (!this.api) {\n      return;\n    }\n\n    if (!objectId) {\n      return;\n    }\n\n    return from(\n      this.api.objects.get(objectId, revision, '8', undefined, false, undefined)\n    );\n  }\n\n  private _createObjectProperties(\n    objectId: string,\n    revision: number | undefined\n  ) {\n    this._loadObjectProperties(objectId, revision)?.subscribe({\n      // properties response is badly structured, nearly impossible to create class structure from it. Therefore using shortcut\n      // any for json response\n\n      // eslint-disable-next-line  @typescript-eslint/no-explicit-any\n      next: (propertiesData: any) => {\n        this.objectPropertiesService.setModel(propertiesData);\n        this.objectAttributeGroups.set(this._createAttributeGroupsFromResponse(propertiesData));\n      },\n      error: () => {\n        this.objectAttributeGroups.set([]);\n      },\n    });\n  }\n\n  // eslint-disable-next-line  @typescript-eslint/no-explicit-any\n  private _tooltip(attrib: any): string {\n    const nameTitle: string = this.translateService.instant('_Name');\n    const name: string = attrib.name ? attrib.name : '';\n    const descriptionTitle: string =\n      this.translateService.instant('description');\n    const description: string = attrib.description;\n    const uuidTitle: string = this.translateService.instant('_UUID');\n    const uuid: string = attrib.id;\n    if (\n      description === null ||\n      description === undefined ||\n      description === ''\n    ) {\n      return `${nameTitle}: ${name}\\n${uuidTitle}: ${uuid}`;\n    }\n    return `${nameTitle}: ${name}\\n${descriptionTitle}: ${description}\\n${uuidTitle}: ${uuid}`;\n  }\n\n  // eslint-disable-next-line  @typescript-eslint/no-explicit-any\n  private _createAttributeGroupsFromResponse(propertiesData: any) {\n    const groups: Array<ObjectAttributeGroup> = [];\n    let localizedAttribGroups = null;\n    if (propertiesData.localizedAttributeGroups) {\n      localizedAttribGroups = propertiesData.localizedAttributeGroups;\n    }\n\n    if (!propertiesData.attributes) {\n      return groups;\n    }\n\n    const attribGroups = propertiesData.attributes;\n    for (const [groupName, attribsObject] of Object.entries(attribGroups)) {\n      const newGroup: ObjectAttributeGroup = {\n        name: groupName,\n        expanded: false,\n        attributes: [],\n      };\n\n      if (localizedAttribGroups?.[groupName]) {\n        newGroup.name = localizedAttribGroups[groupName];\n      }\n\n      if (!attribsObject) {\n        continue;\n      }\n\n      for (const attrib of Object.values(attribsObject)) {\n        const newAttrib: ObjectAttribute = {\n          id: attrib.id,\n          name: attrib.name,\n          description: attrib.description,\n          value: attrib.value,\n          group: attrib.group,\n          type: attrib.type,\n          unit: attrib.unit,\n          decimal: attrib.decimal,\n          control: attrib.control,\n          enumdefinition: attrib.enumdefinition,\n          isChangeable: attrib.isChangeable,\n          tooltip: this._tooltip(attrib),\n          minValue: attrib.minValue,\n          maxValue: attrib.maxValue,\n        };\n\n        newGroup.attributes.push(newAttrib);\n      }\n      groups.push(newGroup);\n    }\n\n    return groups;\n  }\n\n  _deleteForm() {\n    this._objectPropertiesForm = new FormGroup({});\n  }\n\n  private initialFormValues: string = \"\";\n  _createForm() {\n    const _getAttributeValue = new GetAttributeValue();\n    const _form: { [key: string]: FormGroup } = {};\n    this.objectAttributeGroups().forEach(groupAttributes => {\n      const _form_group: { [key: string]: FormControl | null } = {};\n      groupAttributes.attributes.forEach(attribute => {\n        if((typeof attribute.type === 'string' && /^boolean$/i.test(attribute.type)) && !attribute.control) {\n          _form_group[attribute.id] = this.formBuilder.control(\n            _getAttributeValue.transform(attribute)\n            , attribute.isChangeable ? [Validators.pattern(/^(false|true|0|1)$/i)] : []\n          );\n          return;\n        }\n        if((typeof attribute.type === 'string' && /^boolean$/i.test(attribute.type))\n            && (typeof attribute.control === 'string' && /^checkbox$/i.test(attribute.control))\n          )\n        {\n          _form_group[attribute.id] = this.formBuilder.control(\n            _getAttributeValue.transform(attribute)\n          );\n          return;\n        }\n        if((typeof attribute.type === 'string' && /^string$/i.test(attribute.type)) && !attribute.control) {\n          _form_group[attribute.id] = this.formBuilder.control(\n            _getAttributeValue.transform(attribute)\n          );\n          return;\n        }\n        if((typeof attribute.type === 'string' && /^double$/i.test(attribute.type)) && !attribute.control) {\n          _form_group[attribute.id] = this.formBuilder.control(\n            _getAttributeValue.transform(attribute)\n            , attribute.isChangeable ? [doubleValidator(attribute.minValue, attribute.maxValue)] : []\n          );\n          return;\n        }\n        if((typeof attribute.type === 'string' && /^int(32)?$/i.test(attribute.type)) && !attribute.control) {\n          _form_group[attribute.id] = this.formBuilder.control(\n            _getAttributeValue.transform(attribute)\n            , attribute.isChangeable ? [integerValidator(attribute.minValue, attribute.maxValue)] : []\n          );\n          return;\n        }\n        if((typeof attribute.type === 'string' && /^guid$/i.test(attribute.type)) && !attribute.control) {\n          _form_group[attribute.id] = this.formBuilder.control(\n            _getAttributeValue.transform(attribute)\n            , attribute.isChangeable ? [guidValidator()] : []\n          );\n          return;\n        }\n        if((typeof attribute.type === 'string' && /^double$/i.test(attribute.type))\n          && (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))\n        ) {\n          _form_group[attribute.id] = this.formBuilder.control(\n            _getAttributeValue.transform(attribute)\n            , attribute.isChangeable ? [doubleEnumValidator(attribute.enumdefinition)] : []\n          );\n          return;\n        }\n        if((typeof attribute.type === 'string' && /^guid$/i.test(attribute.type))\n          && (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))\n        ) {\n          _form_group[attribute.id] = this.formBuilder.control(\n            _getAttributeValue.transform(attribute)\n            , attribute.isChangeable ? [guidEnumValidator(attribute.enumdefinition)] : []\n          );\n          return;\n        }\n        if((typeof attribute.type === 'string' && /^int(32)?$/i.test(attribute.type))\n          && (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))\n        ) {\n          _form_group[attribute.id] = this.formBuilder.control(\n            _getAttributeValue.transform(attribute)\n            , attribute.isChangeable ? [doubleEnumValidator(attribute.enumdefinition)] : []\n          );\n          return;\n        }\n        if((typeof attribute.type === 'string' && /^string$/i.test(attribute.type))\n          && (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))\n        ) {\n          _form_group[attribute.id] = this.formBuilder.control(\n            _getAttributeValue.transform(attribute)\n            , attribute.isChangeable ? [stringEnumValidator(attribute.enumdefinition)] : []\n          );\n          return;\n        }\n        if((typeof attribute.type === 'string' && /^string$/i.test(attribute.type))\n          && (typeof attribute.control === 'string' && /^combobox$/i.test(attribute.control))\n        ) {\n          _form_group[attribute.id] = this.formBuilder.control(\n            _getAttributeValue.transform(attribute)\n            , attribute.isChangeable ? [stringComboboxValidator(attribute.enumdefinition)] : []\n          );\n          return;\n        }\n        if((typeof attribute.type === 'string' && /^datetime$/i.test(attribute.type)) && !attribute.control) {\n          _form_group[attribute.id] = this.formBuilder.control(\n            _getAttributeValue.transform(attribute)\n            , attribute.isChangeable ? [] : []\n          );\n          return;\n        }\n    });\n      _form[groupAttributes.name] = this.formBuilder.group(_form_group);\n    });\n    this._objectPropertiesForm = this.formBuilder.group(_form);\n\n    this.initialFormValues = JSON.stringify(this._objectPropertiesForm.value);\n    this._objectPropertiesForm.valueChanges.subscribe({\n      next: (value) => {\n        const changed: boolean = JSON.stringify(value) !== this.initialFormValues;\n        this.isSaveButtonDisabled$.next(!(this._objectPropertiesForm.valid && changed));\n      }\n    });\n  }\n\n  private _getPropertyName(uuid: string): string {\n    const attrGroups: ObjectAttributeGroup[] = this.objectAttributeGroups();\n    for (const attrGroup of attrGroups) {\n      for (const attr of attrGroup.attributes) {\n        if (attr.id === uuid) {\n          return attr.name;\n        }\n      }\n    }\n    return '';\n  }\n\n  private _getPropertyType(uuid: string): string {\n    const attrGroups: ObjectAttributeGroup[] = this.objectAttributeGroups();\n    for (const attrGroup of attrGroups) {\n      for (const attr of attrGroup.attributes) {\n        if (attr.id === uuid) {\n          return attr.type;\n        }\n      }\n    }\n    return '';\n  }\n\n  private _getPropertyControl(uuid: string): string | undefined {\n    const attrGroups: ObjectAttributeGroup[] = this.objectAttributeGroups();\n    for (const attrGroup of attrGroups) {\n      for (const attr of attrGroup.attributes) {\n        if (attr.id === uuid) {\n          return attr.control;\n        }\n      }\n    }\n    return '';\n  }\n\n  private _convertValueToBoolean(value: string): boolean {\n    return /^true$/i.test(value) || /^1$/i.test(value);\n  }\n\n  private _convertValueToDouble(value: string): number {\n    return parseFloat(value);\n  }\n\n  private _hasBeenValueChanged(uuid: string, value: string | number | boolean): boolean {\n    const attrGroups: ObjectAttributeGroup[] = this.objectAttributeGroups();\n    for (const attrGroup of attrGroups) {\n      for (const attr of attrGroup.attributes) {\n        if (attr.id === uuid) {\n          return value !== attr.value;\n        }\n      }\n    }\n    return false;\n  }\n\n  private _getChangedData(formGroup: FormGroup): { [key: string]: unknown } {\n    const changedData: { [key: string]: unknown } = {};\n\n    Object.keys(formGroup.controls).forEach(key => {\n      const control = formGroup.get(key);\n\n      if (control instanceof FormControl) {\n        // If it's a FormControl and it's dirty, capture the changed value\n        if (control.dirty) {\n          const propName: string = this._getPropertyName(key);\n          const propType: string = this._getPropertyType(key);\n          // const propControl: string = this._getPropertyControl(key);\n          if(propName === '') {\n            const _newValue = {\n              id: key,\n              value: control.value\n            };\n            changedData[key] = _newValue;\n          } else {\n            if(/^boolean$/i.test(propType)) {\n              const _val: boolean = this._convertValueToBoolean(control.value);\n              if(this._hasBeenValueChanged(key, _val)) {\n                const _newValue = {\n                  id: key,\n                  value: _val\n                };\n                changedData[propName] = _newValue;\n              }\n            }\n            else if(/^double$/i.test(propType)) {\n              const _val: number = this._convertValueToDouble(control.value);\n              if(this._hasBeenValueChanged(key, _val)) {\n                const _newValue = {\n                  id: key,\n                  value: _val\n                };\n                changedData[propName] = _newValue;\n              }\n            }\n            else {\n              const _val: string = control.value;\n\n              if(this._hasBeenValueChanged(key, control.value)) {\n                const _newValue = {\n                  id: key,\n                  value: _val\n                };\n                changedData[propName] = _newValue;\n              }\n            }\n          }\n        }\n      } else if (control instanceof FormGroup) {\n        if(control.dirty) {\n          // Recursively get changed data from nested FormGroup\n          const nestedChanges = this._getChangedData(control);\n          if (Object.keys(nestedChanges).length > 0) {\n            changedData[key] = nestedChanges;\n          }\n        }\n      }\n    });\n\n    return changedData;\n  }\n\n  private _saveObjectProperties() {\n    const saveData: { [key: string]: unknown } = {};\n    saveData['id'] = this._currentObjectId$.value;\n    saveData['unsaved'] = true;\n    saveData['attributes'] = this._getChangedData(this._objectPropertiesForm);\n    this.saveObjectProperties(saveData);\n  }\n\n  private _cancelEditingProperties() {\n    this._editMode.set(false);\n    this._deleteForm();\n    this.buttonRowItems = this.configEditProperties\n  }\n\n  protected buttonClicked($event: BimplusButtonClickEvent) {\n    if ($event.id === 'edit-properties') {\n      this._editMode.set(true);\n      this._createForm();\n      console.log('Edit properties clicked');\n      this.buttonRowItems = this.configEditedProperties;\n    }\n\n    if ($event.id === 'save-changed-properties') {\n      this._saveObjectProperties();\n      this._cancelEditingProperties();\n      console.log('Save changed properties clicked');\n    }\n\n    if ($event.id === 'cancel-editing-properties') {\n      this._cancelEditingProperties();\n      console.log('Cancel edit properties clicked');\n    }\n  }\n\n  hasSetAnyAttribute(objectAttributeGroup: ObjectAttributeGroup) {\n    return objectAttributeGroup.attributes.some((attrib) => {\n      return !isObjectPropertyValueBlank(attrib);\n    });\n  }\n\n  protected saveObjectProperties(data: { [key: string]: unknown }): void {\n    const selectedObjectId = this._currentPropertiesObjectId$.value;\n    if (!data || !selectedObjectId) {\n      return;\n    }\n\n    if (!this.api) {\n      return;\n    }\n\n    from(this.api.objects.put(selectedObjectId, JSON.stringify(data))).subscribe({\n      next: (response: { [key: string]: unknown }) => {\n        this._createObjectProperties(selectedObjectId, this.revision);\n        this._createObjectStructure(selectedObjectId, this.revision);\n        this.updatedObjectProperties.emit({ id: selectedObjectId, request: data, response });\n      },\n    });\n  }\n}\n","<lib-bimplus-buttons-row\n  [items]=\"buttonRowItems\"\n  (buttonClicked)=\"buttonClicked($event)\"\n/>\n\n<div class=\"object-properties\">\n\n  <lib-bimplus-scrollable-container>\n    <lib-expansion-panel class=\"object-properties-preview-panel\">\n      <lib-expansion-panel-header>\n        <span class=\"object-structure-header\">{{\"_3D preview\" | translate}}</span>\n      </lib-expansion-panel-header>\n      <lib-object-preview \n        [api]=\"api\" \n        [revision]=\"revision\" \n        [objectId]=\"rootObjectId\"\n        [visibleNode]=\"visibleNodeSignal()\"\t\n        [opaqueNode]=\"opaqueNodeSignal()\"\n      />\n    </lib-expansion-panel>\n    <!-- Object structure-->\n    <lib-expansion-panel class=\"object-properties-object-structure-panel\">\n      <lib-expansion-panel-header>\n        <span class=\"object-structure-header\">{{\"_Object structure\" | translate}}</span>\n      </lib-expansion-panel-header>\n      @if (objectStructure) {\n        <lib-bimplus-object-structure\n          [objectStructure]=\"objectStructure\"\n          [hasCheckBox1]=\"true\"\n          [hasCheckBox2]=\"true\"\n          (nodeSelected)=\"handleObjectStructureNodeSelected($event)\"\n          (nodeVisible)= \"handleObjectStructureNodeVisible($event)\"\n          (nodeOpaque)=  \"handleObjectStructureNodeOpaque($event)\"\n        />\n      }\n    </lib-expansion-panel>\n    <!-- End Object structure-->\n\n    <!-- Complex properties-->\n    @if(complexProperties){\n      <lib-expansion-panel>\n        <lib-expansion-panel-header>\n          <span class=\"object-properties-header\"> {{\"_Object multiproperties tree\" | translate}}</span>\n        </lib-expansion-panel-header>\n        <lib-bimplus-object-complex-properties\n          [complexProperties]=\"complexProperties\"\n          (nodeSelected)=\"handleComplexPropertyNodeSelected($event)\"\n        />\n      </lib-expansion-panel>\n    }\n    <!-- End Complex properties-->\n\n    @if(objectAttributeGroups().length > 0){\n      <lib-expansion-panel>\n        <lib-expansion-panel-header>\n          <span class=\"object-properties-header\">{{\"_Object properties\" | translate}}</span>\n        </lib-expansion-panel-header>\n        <form [formGroup]=\"_objectPropertiesForm\" class=\"input-form\">\n          @for (attribGroup of objectAttributeGroups(); track attribGroup) {\n            @if(_editMode() || hasSetAnyAttribute(attribGroup)){\n              <lib-expansion-panel [expanded]=\"attribGroup.expanded\">\n                <lib-expansion-panel-header>\n                  <span class=\"object-properties-group-header\"> {{attribGroup.name}}</span>\n                </lib-expansion-panel-header>\n                <lib-object-properties-group\n                  [attributesGroup]=\"attribGroup\"\n                  [editMode]=\"_editMode()\"\n                  [canUpdateObject]=\"_canUpdateObject()\"\n                  [objectPropertiesForm]=\"_objectPropertiesGroupForm(attribGroup.name)\"\n                />\n              </lib-expansion-panel>\n            }\n          }\n        </form>\n      </lib-expansion-panel>\n    }\n  </lib-bimplus-scrollable-container>\n</div>\n","import {Component, HostListener, Input, ViewEncapsulation} from '@angular/core';\nimport {TranslateModule, TranslateService} from \"@ngx-translate/core\";\nimport {DialogService} from \"../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service\";\nimport {BimplusButtonsRowComponent} from \"../bimplus-buttons-row/bimplus-buttons-row.component\";\nimport {BimplusButtonClickEvent, BimplusButtonRowItem} from \"../bimplus-buttons-row/bimplus-buttons-row.interface\";\n\nexport interface ConfirmDialogInputData {\n  title: string;\n  message: string;\n  acceptButtonLocalizedString: string;\n  cancelButtonLocalizedString: string;\n  acceptCallback: () => void;\n}\n\n@Component({\n  selector: 'lib-bimplus-overlay-dialog-confirm',\n  imports: [\n    TranslateModule,\n    BimplusButtonsRowComponent\n  ],\n  templateUrl: './bimplus-overlay-dialog-confirm.component.html',\n  styleUrl: './bimplus-overlay-dialog-confirm.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\n\nexport class BimplusOverlayDialogConfirmComponent {\n  private _title: string = '';\n  private _message: string = '';\n  acceptButtonLocalizedString: string = '_Accept';\n  cancelButtonLocalizedString: string = '_Cancel';\n  acceptCallback: (() => void) | undefined;\n  protected buttons: BimplusButtonRowItem[] = [];\n\n  @Input()\n  get title(): string {\n    return this._title;\n  }\n  set title(value: string) {\n    this._title = value;\n  }\n\n  @Input()\n  get message(): string {\n    return this._message;\n  }\n  set message(value: string) {\n    this._message = value;\n  }\n\n  constructor(\n    private readonly dialogService: DialogService,\n    private readonly translateService: TranslateService\n  ) {\n    const data = this.dialogService.inputData as ConfirmDialogInputData;\n\n    if (data) {\n      this.title = data.title || '';\n      this.message = data.message || '';\n      this.acceptButtonLocalizedString = data.acceptButtonLocalizedString || '_Accept';\n      this.cancelButtonLocalizedString = data.cancelButtonLocalizedString || '_Cancel';\n      this.acceptCallback = data.acceptCallback;\n    }\n\n    this.initializeButtons();\n  }\n\n  initializeButtons() {\n    this.buttons = [\n      {\n        id: \"accept\",\n        title: this.translateService.instant(this.acceptButtonLocalizedString),\n        tooltip: this.translateService.instant(this.acceptButtonLocalizedString),\n        disabled: false,\n        buttonStyle: 'primary'\n      },\n      {\n        id: \"cancel\",\n        title: this.translateService.instant(this.cancelButtonLocalizedString),\n        tooltip: this.translateService.instant(this.cancelButtonLocalizedString),\n        disabled: false,\n        buttonStyle: 'secondary'\n      }\n    ];\n  }\n\n  close() {\n    this.dialogService.close();\n    (document.activeElement as HTMLElement)?.blur();\n  }\n\n  keypressClose(event: KeyboardEvent) {\n    if (event.key === 'Escape' || event.key === 'Esc') {\n      this.dialogService.close();\n    }\n  }\n\n  buttonRowButtonClicked($event: BimplusButtonClickEvent) {\n    this.dialogService.close();\n\n    if ($event.id === \"accept\") {\n      this.acceptCallback?.();\n    }\n  }\n\n  @HostListener('document:keydown', ['$event'])\n  handleKeydown(event: KeyboardEvent) {\n    if (event.key === 'Escape' || event.key === 'Esc') {\n      this.close();\n    }\n  }\n}\n","<div class=\"overlay-dialog-container\">\n  <div class=\"header\">\n    <div class=\"icon\"></div>\n    <div class=\"title-text\">\n      {{ title }}\n    </div>\n    <div\n      class=\"close-button\"\n      (click)=\"close()\"\n      (keydown)=\"keypressClose($event)\"\n    ></div>\n  </div>\n  <div class=\"content\">\n    <div class=\"text\" [innerHTML]=\"message\"></div>\n    <div class=\"buttons\">\n      <lib-bimplus-buttons-row\n        [items]=\"buttons\"\n        (buttonClicked)=\"buttonRowButtonClicked($event)\"\n      />\n    </div>\n  </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport * as WebSdk from 'bimplus-websdk';\n@Injectable({\n  providedIn: 'root'\n})\nexport class DecoratorsService {\n\n  constructor() { }\n  \n  fmt(string: string, ...formats: unknown[]): string {\n    let index = 0;\n\n    return string.replace(/%@(\\d+)?/g, (match: string, argumentIndex: string) => {\n      const argumentIndexN = argumentIndex ? parseInt(argumentIndex, 10) - 1 : index++;\n      const _match = formats[argumentIndexN];\n\n      if (_match === null) {\n        return '(null)';\n      }\n      if (_match === undefined) {\n        return '';\n      }\n      return _match.toString();\n    });\n  }\n/**--------------------------------------------------------------------------\n   * decorate link\n  --------------------------------------------------------------------------*/\n  decorateLink(api:WebSdk.Api,link:WebSdk.AttachmentLink,objectIds:[string]):WebSdk.AttachmentLink{\n\n    const retval:WebSdk.AttachmentLink = {\n      id: link.id,\n      name: link.name,\n      fileName: link.fileName,\n      size: link.size,\n      link: link.link,\n      fileNameShort: '',\n      extension: '',\n      objectIds: objectIds,\n      version: link.version,\n      sizeMB: \"\"\n    };\n    const access_token = api.getAccessToken();\n    const attVersion = \"attachments/%@/versions/%@/download\";\n    const url = api.getApiTeamUrl()+attVersion;\n    const isEmbeddedAllplanMode = false;\n    retval.size = parseFloat((link.size / 1000).toFixed(2));\n    retval.link = `${this.fmt(url, link.id, link.version)}?api-token=${access_token}${ isEmbeddedAllplanMode ? '' : '&openInBrowser=true'}`;\n    if (link.fileName.length > 20) {\n      const fileParts = link.fileName.split('.');\n      if (fileParts.length > 1) {\n        retval.fileNameShort = fileParts.slice(0, -1).join('.');\n        retval.extension = \".\" + fileParts.slice(-1);\n      } else {\n        retval.fileNameShort = link.fileName;\n      }\n    } else {\n      retval.fileNameShort = link.fileName;\n    }    \n    return retval;\n  }  \n}\n","import {  Component  , ViewEncapsulation  , Input  , OnInit, Renderer2, ElementRef, OnDestroy, booleanAttribute, Output, EventEmitter } from '@angular/core';\nimport { BimplusLocalizedWidgetComponent } from '../bimplus-localized-widget/bimplus-localized-widget.component';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport * as WebSdk from 'bimplus-websdk';\nimport {  from  , BehaviorSubject, switchMap, forkJoin } from 'rxjs';\nimport { concatMap } from 'rxjs/operators';\nimport { BimplusScrollableContainerComponent } from '../bimplus-scrollable-container/bimplus-scrollable-container.component'\nimport { ProjectNavigatorProject } from '../project-models/project-models.interface';\nimport { BimplusButtonsRowComponent } from \"../bimplus-buttons-row/bimplus-buttons-row.component\";\nimport { BimplusButtonClickEvent, BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\nimport {\n  BimplusOverlayDialogConfirmComponent\n} from \"../bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component\";\nimport {DialogService} from \"../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service\";\nimport * as WebClient from 'bimplus-webclient';\nimport {NewAttachInfo} from '../bimplus-object-comments-list/bimplus-object-comments-list.interface';\nimport {DecoratorsService } from '../../services/decorators.service';\nexport const EMBEDDED_MODAL_DIALOGE_TYPE_FILE = 'file';\n\nexport const postAttachmentLinks = (newAttachmentIDs: string[], objectId: string, api: WebSdk.Api) => {\n  // Create an array of observables for each post request\n  const postRequests = newAttachmentIDs.map((id) =>            \n    from(api.objects.postAttachmentLink(objectId, JSON.stringify({ attachmentId: id})))      \n  );\n\n  // Use forkJoin to wait for all post requests to complete in parallel\n  return forkJoin(postRequests)\n  .pipe(\n    // After all posts are complete, switch to the next call to get updated links\n    concatMap(() => from(api.objects.getAttachmentLinks(objectId)))\n  )\n}\n\n@Component({\n  selector: 'lib-links-to-documents',\n  imports: [\n    TranslateModule,\n    BimplusScrollableContainerComponent,\n    BimplusButtonsRowComponent,\n  ],\n  templateUrl: './links-to-documents.component.html',\n  styleUrls: ['./links-to-documents.component.less'],\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class LinksToDocumentsComponent extends BimplusLocalizedWidgetComponent implements OnInit, OnDestroy {\n\n  constructor(translateService:  TranslateService,\n             private readonly dialogService: DialogService,\n             private readonly renderer: Renderer2,\n             private readonly el: ElementRef,\n             private readonly decorators:DecoratorsService\n  ) {\n    super(translateService)\n    this.shadowRootElement = this.el.nativeElement.shadowRoot;\n\n  }\n  private readonly shadowRootElement: HTMLElement;\n  private _rootObjectId : string = \"\";\n  isDestroyed = false;\n  localWormHole:boolean  = true;\n    //When is true then it means the creation of link is in progress\n  inProgress:boolean= false;\n\n  @Input({ required: true }) api!: WebSdk.Api | null;\n  @Input() canCreateAttachmentLink: boolean = true;\n  /** Input Attribute to specify if should show only list of attachments. */\n  @Input({ transform: booleanAttribute }) listOnly = false;\n  /** Input Attribute to specify if should show message when no attachments found. */\n  @Input({ transform: booleanAttribute }) showEmptyMessage: boolean = true;\n  /** Input Attribute to tell if show/hide attachemt size information. */\n  @Input({ transform: booleanAttribute }) hideAttachmentSize = false;\n\n  @Input() inputBaseUrl: string =''; // base url for the embedded modal\n  \n  _attachments: WebSdk.AttachmentLink[] = [];\n\n  @Input()\n  set attachments(value: WebSdk.AttachmentLink[]) {\n    this._attachments = value;\n    this.onAttachmentsChange();\n  }\n\n  get attachments(): WebSdk.AttachmentLink[] {\n    return this._attachments;\n  }\n\n  onAttachmentsChange() {\n    if(this.api && this.rootObjectId){\n      this._attachments = this.decorateAttachmentLinks(this.api,this._attachments);    \n    }\n  }\n\n\n  @Output() attachmentsChange = new EventEmitter<string[]>();\n  @Output() attachmentsLinkChange = new EventEmitter<NewAttachInfo[]>();\n  @Input() canDeleteAttachmentLink:boolean = true;\n  @Input() project : ProjectNavigatorProject | null = null;\n  @Input() wormholeSelector : string | undefined= \"localEmbeddedModalId\";  // calling application can provide a place where the iframe for documents selection will be rendered\n  @Input() env : string = 'dev';\n\n  @Input()\n  set rootObjectId(id : string|undefined){\n    if(!id){\n      return;\n    }\n    this._currentObjectId$.next(id);\n    this._rootObjectId = id;\n  }\n\n  get rootObjectId() : string{\n    return this._rootObjectId;\n  }\n\n  private readonly _currentObjectId$ = new BehaviorSubject<string> (\"\");\n  _attachmentCount : number = 0;\n  buttonRowItems: Array<BimplusButtonRowItem> = [\n    {\n      id: \"add-documents\"\n      , title: this.translateService.instant('_Add_document')\n      , tooltip: this.translateService.instant('_Add_document')\n      , disabled: !this.canCreateAttachmentLink\n      , buttonStyle: 'primary'\n    }\n  ];\n\n  ngOnInit() {\n    if (!this.listOnly) {\n      this._currentObjectId$.subscribe({\n        next: (id) => {\n          this._createAttachmentLinkStructure(id);\n        }\n      });\n    }\n  };\n\n  ngOnDestroy(): void {\n    this.isDestroyed = true;\n  }\n  \n  // eslint-disable-next-line  @typescript-eslint/no-explicit-any\n  private decorateAttachmentId(item:any){\n      const it:NewAttachInfo = {\n        id: item.id,\n        name: item.name,\n        nameShort: item.name,\n        url:'',\n        iconClass: '',\n        iconTitle: '',\n        type: 'AttachmentLink',\n        deleteButtonTitle:''        \n      };     \n    return it;\n  }\n\n  private decorateAttachmentLinks(api:WebSdk.Api, links:WebSdk.AttachmentLinksResponse):WebSdk.AttachmentLink[]{\n    const decoratedLinks = links.map((link) => this.decorators.decorateLink(api,link,[this._currentObjectId$.value]));\n    decoratedLinks.sort((a,b) => {\n      if(a.fileName.toLowerCase() < b.fileName.toLowerCase() ) return -1;\n      if(a.fileName.toLowerCase()  > b.fileName.toLowerCase() ) return 1;\n      return 0;\n    });\n    return decoratedLinks;\n  }\n\n  private _createAttachmentLinkStructure(objectId : string){\n\n    this._loadAttachmentLinkStructure(objectId)?.subscribe({\n      next :(structureData) => {\n        if(structureData){\n          //this._attachmentLinkStructure = _attachmentLink StructureBuilder.createFromResponse(structureData);\n          this._attachmentCount = structureData?.length;\n          if(this.api){\n            const retval = this.decorateAttachmentLinks(this.api,structureData);\n            if(retval){\n              this._attachments = retval;\n            }\n          }\n        }\n      }\n    })\n  }\n\n  private _loadAttachmentLinkStructure(objectId : string){\n    if(!this.api){\n      return;\n    }\n\n    if(!objectId) {\n      return;\n    }\n    return from(this.api.objects.getAttachmentLinks(objectId));\n  }\n\n  documentSelection :string[] | null = null;\n  isOpened:boolean = false;\n  embeddedModalContainer:string = 'embedded-modal';\n\n  // show or hide embedded modal\n  setModalVisibility(opened = true) {\n    if(!this.wormholeSelector){\n      return;\n    }\n    const element =  this.localWormHole ? this.shadowRootElement.querySelector(\"#\" + this.wormholeSelector):\n                                     document.getElementById(this.wormholeSelector);\n    if (!element) {\n      return;\n    }\n    if(this.localWormHole){\n      if(element.parentElement){\n        this.renderer.setStyle(element.parentElement,'display',opened?'block':'none')\n      }\n    } else {\n      this.renderer.setStyle(element.parentElement,'display',opened?'block':'none')\n    }\n\n    ///containerEl.fadeIn(\"fast\") : containerEl.fadeOut(\"fast\");\n    this.isOpened = opened;\n  }\n\n\n  closeEmbeddedModalFileSelection() {\n    this.setModalVisibility(false);\n  }\n\n  _addLink(api:WebSdk.Api, ids:string[]) {\n    // filter out already existing attachment links \n    const newAttachmentIDs = ids.filter( item => !this.attachments.find(n => n.id === item) );\n    if( !newAttachmentIDs.length ){\n      return;\n    }\n    if(this.inProgress){\n      console.log('in progress');\n      return;\n    }\n\n    if(!this.rootObjectId){\n      // we don't know to which object we want to attach the documents\n      // so we will deliver just information about selected documents\n      const getRequests = newAttachmentIDs.map((id) =>            \n        from(api.objects.get(id,0,undefined,undefined,undefined,undefined))\n      );\n    \n      forkJoin(getRequests).subscribe({\n        next: (results) => {\n          // Process the array of results\n          (results as WebSdk.AttachmentLink[])?.forEach((item) => {\n            if(item?.id && !this.attachments.find(attachment => attachment?.id === item.id)){\n              this._attachments.push(item);\n            }\n          });\n          const retval:NewAttachInfo[] = this._attachments.map((item) => this.decorateAttachmentId(item));                \n          this.attachmentsLinkChange.emit(retval);\n        },\n        error: (err) => {\n          console.error('Error occurred during requests:', err);\n          this._attachments=[];\n        }\n      });\n      return;\n    }\n\n    // we know to which object we want to attach the documents\n    this.inProgress = true;\n    postAttachmentLinks(newAttachmentIDs, this.rootObjectId, api)\n    .subscribe({\n      next: (updatedAttachments) => {\n        this._attachments = this.decorateAttachmentLinks(\n          api,\n          updatedAttachments\n        ); // Update attachments in component   \n        this.inProgress = false;  \n        this.attachmentsChange.emit(newAttachmentIDs)   \n      },\n      error: (err) => {\n        console.error('Failed to add or reload attachments:', err);\n        this.inProgress = false;\n      }\n    });\n  }\n\n\n  createAttachmentLink(api: WebSdk.Api){\n    console.log('createAttachmentLink')\n    this.localWormHole = this.wormholeSelector === \"localEmbeddedModalId\";\n    const callbackF = (docIDs:string[]):void => {\n      const ids = (typeof docIDs === 'string') ? [docIDs] : docIDs;\n      const foundDocuments = ids && ids.length > 0;\n      if(!this.isDestroyed){\n        this.closeEmbeddedModalFileSelection();\n        if (foundDocuments) {\n          this._addLink(api,ids);\n        }\n      }\n    }\n\n    if (typeof callbackF !== \"function\"  || !this.project || !this.api) {\n      return;\n    }\n\n    setTimeout(() => {\n      const isLocalhost = window.location.href.includes(\"localhost\");\n      let access_token :string|null |undefined= '';\n      access_token = this.api?.getAccessToken();\n      if (!access_token) {\n        access_token = window.localStorage.getItem('access_token');\n        if (!access_token /*&& isLocalhost*/) {\n          return;\n        }\n      }\n      const newClient =  new WebClient.ExternalClient('BImplusNGXComponentClient');\n      newClient?.initialize();\n      // Make embedded windows pointing to the current feature branch with baseUrl setup\n      const options:{baseUrl?:string} = {};\n      // In case of localhost ommit explicit setup of baseUrl\n      if (!isLocalhost) {\n        // Remove '/viewer/' from the end of pathname\n        let filteredPathname = window.location.pathname.replace(/\\/viewer\\/$/, '/');\n        // Remove '/connexis/' from the end of pathname if we use temporary url for connexis like  https://portal-dev.bimplus.net/connexis/?embedded...\n        filteredPathname = filteredPathname.replace(/\\/connexis\\/$/, '/');\n        options.baseUrl = this.inputBaseUrl ? this.inputBaseUrl: window.location.origin + filteredPathname;\n      }\n\n      ///const env:string=\"dev\";  ///!!! to-do introduce env variable into components\n      const clientModule = WebClient.BimFilesSelect;\n      if(this.wormholeSelector){\n        const documentSelection = new clientModule(this.wormholeSelector, access_token, newClient, this.env, options);\n        if (!documentSelection) {\n          return;\n        }\n        documentSelection.onAttachmentSelected = callbackF;\n\n        if(this.project){\n          if(this.localWormHole){\n            documentSelection.loadShadowRoot(this.shadowRootElement,this.project.teamSlug , this.project.id);\n          }else{\n            documentSelection.load(this.project.teamSlug , this.project.id);\n          }\n        }\n        this.setModalVisibility(true);\n      }\n    },200);\n\n  }\n\n  _deleteAttachmentLink(api:WebSdk.Api ,id:string,$event:Event){\n    $event.stopPropagation();\n    $event.preventDefault();\n    const objects = api.objects;\n    const objectId = this._currentObjectId$.value;\n    from(api.objects.deleteAttachmentLink(this.rootObjectId,id)).pipe(\n      switchMap(() => from(objects.getAttachmentLinks(objectId)))\n    ).subscribe({\n      next: (updatedAttachments) => {\n        if(this.api){\n          this._attachments = this.decorateAttachmentLinks(this.api,updatedAttachments);  // Update attachments in component\n          // Process the array of results\n          const retval:NewAttachInfo[] = this._attachments?.map((item) => this.decorateAttachmentId(item));\n          this.attachmentsLinkChange.emit(retval);\n        }\n      },\n      error: (err) => {\n        console.error('Failed to delete or reload attachments:', err);\n      }\n    });\n  }\n\n  deleteAttachmentLink(attachment:WebSdk.AttachmentLink,$event:Event){\n    if(!this.api){\n      return;\n    }\n    if(!attachment) {\n      return;\n    }\n    const api  = this.api;\n    this.dialogService.open(BimplusOverlayDialogConfirmComponent, {\n      options: {\n        position: 'middle',\n        positionOptions: {},\n        overlayClickEnabled: false,\n        overlayVisibilityEnabled: true,\n        draggable: true\n      }, data: {\n        title: this.translateService.instant('_Delete_attachmentlink'),\n        message: this.translateService.instant('_Attachmentlink_delete_confirmation_message'),\n        acceptButtonLocalizedString: \"_Delete\",\n        acceptCallback: () => {\n          this._deleteAttachmentLink(api,attachment.id,$event);\n        }\n      }\n    });\n  }\n\n\n  buttonClicked($event: BimplusButtonClickEvent){\n    if(!this.api){\n      return;\n    }\n    const api  = this.api;\n    if($event.id == \"add-documents\"){\n      this.createAttachmentLink(api);\n    }\n  }\n}\n","<div class=\"links-to-documents\">\n  @if (canCreateAttachmentLink && !listOnly) {\n    <lib-bimplus-buttons-row\n    [items]=\"buttonRowItems\"\n    (buttonClicked)=\"buttonClicked($event)\"\n    />\n  }\n  @if (wormholeSelector === 'localEmbeddedModalId'){\n    <div class='embedded-modal-container'>\n      <iframe id={{wormholeSelector}} [title]=\"\"></iframe>\n    </div>  \n  }\n  @if (!_attachments.length && showEmptyMessage) {\n    <div \n      data-test=\"no-attachment-links\"\n      class=\"bim-attachment-not-found\"\n      > {{ '_No_attachmentlinks_found' | translate }}\n    </div>\n  } @else {\n    <div class=\"scrollable-content-container\">\n      <lib-bimplus-scrollable-container>\n        @for (attachment of _attachments; track attachment; let  i = $index) {\n          <div class=\"attachment-row\">\n            @if (canDeleteAttachmentLink) {\n              <span class=\"bim-attachment-delete-button\" (click)=\"deleteAttachmentLink(attachment,$event)\" (keydown)=\"deleteAttachmentLink(attachment,$event)\">\n                <div\n                  title=\"{{ '_Delete_attachmentlink' | translate }}\"\n                >\n                  &#10005;&#xFE0E;\n                </div>\n              </span>\n            }\n            <a class=\"bim-attachmentlink-item\" href={{attachment.link}} target='_blank' rel='noopener noreferrer'>\n              <div class=\"bim-attachment-name\" title={{attachment.fileName}}>\n                {{attachment.name ? attachment.name : attachment.fileName}}\n              </div>\n              @if (!hideAttachmentSize) {\n                <div class=\"bim-attachment-size\" title={{attachment.name}}>\n                  ({{attachment.size}} kB)\n                </div>\n              }\n            </a>\n          </div>\n        }\n      </lib-bimplus-scrollable-container>\n    </div>\n  }\n</div>\n","import {Component, EventEmitter, Input, Output} from '@angular/core';\nimport * as WebSdk from \"bimplus-websdk\";\nimport {BimplusLocalizedWidgetComponent} from \"../bimplus-localized-widget/bimplus-localized-widget.component\";\nimport {TranslateModule, TranslateService} from \"@ngx-translate/core\";\n\n@Component({\n  selector: 'lib-object-hyperlinks-item',\n  imports: [\n    TranslateModule\n  ],\n  templateUrl: './object-hyperlinks-item.component.html',\n  styleUrl: './object-hyperlinks-item.component.less'\n})\nexport class ObjectHyperlinksItemComponent extends BimplusLocalizedWidgetComponent {\n  constructor(translateService: TranslateService) {\n    super(translateService)\n  }\n\n  @Input() hyperlink: WebSdk.Hyperlink | undefined;\n  @Input() deleteButtonEnabled: boolean = true;\n\n  @Output() deleteButtonClicked = new EventEmitter<void>();\n\n  onDeleteButtonClick(): void {\n    this.deleteButtonClicked.emit();\n  }\n\n  onDeleteButtonKeyDown($event: KeyboardEvent) {\n    if ($event.key === 'Enter' || $event.key === ' ') {\n      $event.preventDefault();\n\n      this.onDeleteButtonClick();\n    }\n  }\n}\n","<div class=\"hyperlink-item\">\n  @if (deleteButtonEnabled) {\n    <div class=\"bim-list-button delete\" title=\"{{ '_Hyperlink delete confirmation title' | translate }}\" (click)=\"onDeleteButtonClick()\"\n         (keydown)=\"onDeleteButtonKeyDown($event)\">\n      &#10005;&#xFE0E;\n    </div>\n  }\n\n  <a href=\"{{ hyperlink?.url }}\" class='bim-hyperlink-url' target=\"_blank\" title=\"{{ hyperlink?.url }}\">\n    <div class=\"bim-hyperlink-name\">\n      {{ hyperlink?.name }}\n    </div>\n  </a>\n</div>\n","import {Component, Input, OnInit, ViewEncapsulation} from '@angular/core';\nimport {BimplusButtonsRowComponent} from \"../bimplus-buttons-row/bimplus-buttons-row.component\";\nimport {BimplusButtonClickEvent, BimplusButtonRowItem} from \"../bimplus-buttons-row/bimplus-buttons-row.interface\";\nimport {BimplusLocalizedWidgetComponent} from \"../bimplus-localized-widget/bimplus-localized-widget.component\";\nimport {TranslateModule, TranslateService} from \"@ngx-translate/core\";\nimport {\n  BimplusScrollableContainerComponent\n} from \"../bimplus-scrollable-container/bimplus-scrollable-container.component\";\nimport {ObjectHyperlinksItemComponent} from \"../object-hyperlinks-item/object-hyperlinks-item.component\";\nimport * as WebSdk from \"bimplus-websdk\";\nimport {BehaviorSubject} from \"rxjs\";\nimport {NgForOf} from \"@angular/common\";\nimport {DialogService} from \"../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service\";\nimport {\n  BimplusOverlayDialogConfirmComponent\n} from \"../bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component\";\nimport {FormBuilder, FormGroup, ReactiveFormsModule, Validators} from \"@angular/forms\";\nimport {BimplusInputTextFieldComponent} from \"../bimplus-input-text-field/bimplus-input-text-field.component\";\n\n@Component({\n  selector: 'lib-object-hyperlinks',\n  imports: [\n    BimplusButtonsRowComponent,\n    BimplusScrollableContainerComponent,\n    ObjectHyperlinksItemComponent,\n    NgForOf,\n    TranslateModule,\n    ReactiveFormsModule,\n    BimplusInputTextFieldComponent\n  ],\n  templateUrl: './object-hyperlinks.component.html',\n  styleUrl: './object-hyperlinks.component.less',\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class ObjectHyperlinksComponent extends BimplusLocalizedWidgetComponent implements OnInit {\n  hyperlinkForm: FormGroup;\n\n  constructor(translateService: TranslateService, private readonly dialogService: DialogService, private readonly formBuilder: FormBuilder) {\n    super(translateService);\n\n    this.hyperlinkForm = this.formBuilder.group({\n      name: ['', []],\n      url: ['',\n        [\n          Validators.required,\n          Validators.pattern(/^[^<>]*$/), // Do not allow < or >\n          Validators.pattern(/^(?!\\s*$).+/) // Do not allow all empty string, but allow text after spaces\n        ]\n      ]\n    });\n\n    this.hyperlinkForm.statusChanges.subscribe(status => {\n      this.buttonRowItems[0].disabled = status !== 'VALID';\n    });\n  }\n\n  @Input() api: WebSdk.Api | null = null;\n\n  @Input()\n  set rootObjectId(id: string) {\n    this._currentObjectId$.next(id);\n    this.loadHyperlinks(id);\n\n    this._rootObjectId = id;\n  }\n\n  get rootObjectId(): string {\n    return this._rootObjectId;\n  }\n\n  private readonly _currentObjectId$ = new BehaviorSubject<string>(\"\");\n  private readonly _currentPropertiesObjectId$ = new BehaviorSubject<string>(\"\");\n  private _rootObjectId: string = \"\";\n\n  buttonRowItems: Array<BimplusButtonRowItem> = [];\n\n  @Input() canCreateHyperlinks: boolean = true;\n  @Input() canDeleteHyperlinks: boolean = true;\n\n  hyperlinks: Array<WebSdk.Hyperlink> = [];\n\n  ngOnInit() {\n    this.buttonRowItems.push(\n      {\n        id: \"add-hyperlink\"\n        , title: this.translateService.instant('_Add hyperlink')\n        , tooltip: this.translateService.instant('_Add hyperlink')\n        , disabled: true\n        , buttonStyle: 'primary'\n      }\n    );\n  }\n\n  buttonRowButtonClicked($event: BimplusButtonClickEvent) {\n    if ($event.id === \"add-hyperlink\") {\n      if (this.hyperlinkForm.valid) {\n        this.addHyperlink(this.hyperlinkForm.value['name'], this.hyperlinkForm.value['url'], this._rootObjectId).then(() => {\n          this.loadHyperlinks(this._rootObjectId);\n          this.hyperlinkForm.reset();\n        });\n      }\n    }\n  }\n\n  private loadHyperlinks(objectId: string) {\n    if (!this.api)\n      return;\n\n    this.api.objects.getHyperlinks(objectId).then((response: WebSdk.HyperlinksResponse) => {\n      this.hyperlinks = response;\n    });\n  }\n\n  private addHyperlink(name: string, url: string, objectId: string): Promise<WebSdk.Hyperlink> {\n    if (!this.api)\n      return Promise.reject(new Error('API not available'));\n\n    let sanitizedUrl: string = url.trim();\n\n    if (!RegExp(/^http(s?):\\/\\//).exec(sanitizedUrl)) {\n      sanitizedUrl = 'https://' + sanitizedUrl;\n    }\n\n    let sanitizedName = name?.trim() ?? '';\n\n    if (sanitizedName === '') {\n      sanitizedName = sanitizedUrl;\n    }\n\n    sanitizedName = sanitizedName?.replace(/^http(s?):\\/\\//, '');\n\n    const data = JSON.stringify({\n      name: sanitizedName,\n      url: sanitizedUrl,\n      objectId: objectId\n    });\n\n    return this.api.objects.postHyperlink(objectId, data);\n  }\n\n  onHyperlinkItemDeleteButtonClicked(hyperlink: WebSdk.Hyperlink) {\n    this.dialogService.open(BimplusOverlayDialogConfirmComponent, {\n      options: {\n        position: 'middle',\n        positionOptions: {},\n        overlayClickEnabled: false,\n        overlayVisibilityEnabled: true,\n        draggable: true\n      }, data: {\n        title: this.translateService.instant('_Hyperlink delete confirmation title'),\n        message: this.translateService.instant('_Hyperlink delete confirmation message'),\n        acceptButtonLocalizedString: \"_Delete\",\n        acceptCallback: () => {\n          this.deleteHyperlink(hyperlink.id);\n        }\n      }\n    });\n  }\n\n  private deleteHyperlink(id: string) {\n    if (!this.api)\n      return;\n\n    this.api.hyperlinks.delete(id).then(() => {\n      this.loadHyperlinks(this._rootObjectId);\n    });\n  }\n}\n","@if (canCreateHyperlinks) {\n  <form [formGroup]=\"hyperlinkForm\" class=\"input-form\">\n    <div>\n      <lib-bimplus-input-text-field formControlName=\"name\" placeholder=\"{{ '_Name' | translate }}\"/>\n    </div>\n    <div>\n      <lib-bimplus-input-text-field formControlName=\"url\" placeholder=\"{{ '_URL' | translate }}\"/>\n    </div>\n\n    <lib-bimplus-buttons-row [items]=\"buttonRowItems\" (buttonClicked)=\"buttonRowButtonClicked($event)\"/>\n  </form>\n}\n\n<div class=\"list-anchor\">\n  <div class=\"list\">\n    <lib-bimplus-scrollable-container>\n      @if (hyperlinks.length > 0) {\n        <div style=\"padding-left: 8px\" *ngFor=\"let hyperlink of hyperlinks\">\n          <lib-object-hyperlinks-item [hyperlink]=\"hyperlink\" [deleteButtonEnabled]=\"canDeleteHyperlinks\"\n                                      (deleteButtonClicked)=\"onHyperlinkItemDeleteButtonClicked(hyperlink)\"/>\n        </div>\n      } @else {\n        <div class=\"no-links\">{{ \"_No hyperlinks found\" | translate }}</div>\n      }\n    </lib-bimplus-scrollable-container>\n  </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, HostListener, Input, ViewEncapsulation } from '@angular/core';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { DialogService } from '../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service';\nimport { BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\nimport { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';\n\nexport interface ErrorDialogInputData {\n  title: string;\n  message: string;\n}\n\n@Component({\n  selector: 'lib-bimplus-overlay-dialog-error',\n  imports: [CommonModule, TranslateModule, BimplusButtonsRowComponent],\n  templateUrl: './bimplus-overlay-dialog-error.component.html',\n  styleUrls: ['./bimplus-overlay-dialog-error.component.less'],\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusOverlayDialogErrorComponent {\n\n  private _title: string = '';\n  private _message: string = '';\n  private readonly _data: ErrorDialogInputData | undefined;\n  acceptCallback: (() => void) | undefined;\n  protected readonly buttons: BimplusButtonRowItem[] = [\n    {\n      id: \"errorDialogAcceptButton\",\n      title: this.translateService.instant('_Ok'),\n      tooltip: this.translateService.instant('_Ok'),\n      disabled: false,\n      buttonStyle: 'primary'\n    }\n  ];\n\n  @Input()\n  get title(): string {\n    return this._title;\n  }\n  set title(value: string) {\n    this._title = value;\n  }\n\n  @Input()\n  get message(): string {\n    return this._message;\n  }\n  set message(value: string) {\n    this._message = value;\n  }\n\n  constructor(\n    private readonly dialogService: DialogService,\n    private readonly translateService: TranslateService\n  ) {\n    this._data = this.dialogService.inputData as ErrorDialogInputData;\n    this._title = this._data?.title || '';\n    this._message = this._data?.message || '';\n  }\n\n  close() {\n    this.dialogService.close();\n  }\n\n  keypressClose(event: KeyboardEvent) {\n    if (event.key === 'Escape' || event.key === 'Esc') {\n      this.close();\n    }\n  }\n\n  buttonRowButtonClicked(): void {\n    this.close();\n\n    this.acceptCallback?.();\n  }\n\n  @HostListener('document:keydown', ['$event'])\n  handleKeydown(event: KeyboardEvent) {\n    if (event.key === 'Escape' || event.key === 'Esc') {\n      this.close();\n    }\n  }\n}\n","<div class=\"overlay-dialog-container\">\n  <div class=\"overlay-dialog-container_title\">\n    <div class=\"overlay-dialog-container_title_icon\">\n    </div>\n    <div class=\"overlay-dialog-container_title_msg\">\n      {{title}}\n    </div>\n    <div\n      class=\"overlay-dialog-container_title_close\"\n      (click)=\"close()\"\n      (keypress)=\"keypressClose($event)\"\n    ></div>\n  </div>\n  <div class=\"overlay-dialog-container_content\">\n    <div class=\"overlay-dialog-container_content_msg\">\n      {{this.message}}\n    </div>\n    <div class=\"buttons\">\n      <lib-bimplus-buttons-row\n        [items]=\"buttons\"\n        (buttonClicked)=\"buttonRowButtonClicked()\"\n      />\n    </div>\n  </div>\n</div>\n","import { InjectionToken } from \"@angular/core\";\r\n\r\nexport type BimplusTabComponentModel = {\r\n  id: string;\r\n  title: string;\r\n  img: {\r\n    default: string;\r\n    active: string;\r\n  };\r\n};\r\n\r\nexport const DEFAULT_TAB_SWITCHER_ELEMENTS: BimplusTabComponentModel[] = [\r\n  { id: 'object-properties', img: { default: 'ic_models', active: 'ic_models_maincolor' }, title: '_Object properties' },\r\n  { id: 'comments', img: { default: 'Comments_18_gray', active: 'Comments_18_maincolor' }, title: '_Comments' },\r\n  { id: 'attachments', img: { default: 'Attachment_18_gray', active: 'Attachment_18_maincolor' }, title: '_Attachments' },\r\n  { id: 'hyperlinks', img: { default: 'Links_18_gray', active: 'Links_18_maincolor' }, title: 'hyperlinks' },\r\n  { id: 'links-to-documents', img: { default: 'Attachmentlink_18_gray', active: 'Attachmentlink_18_maincolor' }, title: '_Links_to_documents' },\r\n];\r\n\r\nexport type BimplusTabsSwitcherConfig = {\r\n  defaultTabsSwitcherElements?: BimplusTabComponentModel[];\r\n  disabled: Partial<{\r\n    all: boolean;\r\n    id: string;\r\n  }>\r\n};\r\n\r\nexport const BIMPLUS_TABS_SWITCHER_CONFIG = new InjectionToken<BimplusTabsSwitcherConfig>('bimplus-tabs-switcher-config');","import { Inject, Injectable, Optional } from '@angular/core';\r\nimport { BehaviorSubject, Subject } from 'rxjs';\r\nimport { BIMPLUS_TABS_SWITCHER_CONFIG, BimplusTabComponentModel, BimplusTabsSwitcherConfig, DEFAULT_TAB_SWITCHER_ELEMENTS } from '../bimplus-tabs-switcher.interface';\r\n\r\n@Injectable()\r\nexport class BimplusTabsSwitcherService {\r\n  /** Default tab switcher elements. */\r\n  private readonly tabSwitcherElements = new BehaviorSubject<\r\n    BimplusTabComponentModel[]\r\n  >(DEFAULT_TAB_SWITCHER_ELEMENTS);\r\n  public readonly tabSwitcherElements$ =\r\n    this.tabSwitcherElements.asObservable();\r\n\r\n  /** Attribute to indicate active tab. (only for BimplusTabComponent) */\r\n  private readonly activeTab = new Subject<string>();\r\n  public readonly activeTab$ = this.activeTab.asObservable();\r\n\r\n  public setActiveTab(key: string): void {\r\n    this.activeTab.next(key);\r\n  }\r\n\r\n  constructor(\r\n    @Optional()\r\n    @Inject(BIMPLUS_TABS_SWITCHER_CONFIG)\r\n    private readonly bimplusTabsSwitcherConfig?: Pick<\r\n      BimplusTabsSwitcherConfig,\r\n      'defaultTabsSwitcherElements'\r\n    >\r\n  ) {\r\n    // if there is new default tabs from configuration token then use them instead of original default tabs\r\n    if (this.bimplusTabsSwitcherConfig?.defaultTabsSwitcherElements) {\r\n      this.tabSwitcherElements.next(\r\n        this.bimplusTabsSwitcherConfig.defaultTabsSwitcherElements\r\n      );\r\n    }\r\n  }\r\n}\r\n","import { NgClass } from '@angular/common';\r\nimport { Component, computed, EventEmitter, HostListener, Inject, Input, OnInit, Optional, Output, signal } from '@angular/core';\r\nimport { BimplusTabsSwitcherService } from '../../services/bimplus-tabs-switcher.service';\r\nimport { BIMPLUS_TABS_SWITCHER_CONFIG, BimplusTabComponentModel, BimplusTabsSwitcherConfig } from '../../bimplus-tabs-switcher.interface';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\nconst DEFAULT_IMAGE_SRC = '../../../../../../';\r\n\r\n@Component({\r\n  selector: 'lib-bimplus-tab',\r\n  imports: [NgClass, TranslateModule],\r\n  templateUrl: './bimplus-tab.component.html',\r\n  styleUrl: './bimplus-tab.component.less'\r\n})\r\nexport class BimplusTabComponent implements OnInit {\r\n  @Input({ required: true }) bimplusTabComponentModel!: BimplusTabComponentModel;\r\n  @Input() imageBaseSrc?: string | null = DEFAULT_IMAGE_SRC;\r\n  /** Currently active tab. */\r\n  @Input() set activeTab(value: string | undefined) {\r\n    if (!value) {\r\n      return;\r\n    }\r\n\r\n    this.bimplusTabsSwitcherService.setActiveTab(value);\r\n  }\r\n  @Output() activeTabChange = new EventEmitter<string>();\r\n\r\n  /** Attribute indicating active tab. */\r\n  protected readonly activeTabSignal = toSignal(this.bimplusTabsSwitcherService.activeTab$);\r\n  /** Indicate that tab is active or not. */\r\n  protected readonly isActive = computed(() => this.activeTabSignal() === this.bimplusTabComponentModel.id);\r\n  /** Indicate that tab is disabled or not. */\r\n  protected readonly isDisabled = signal<boolean>(false);\r\n  /** Computed property for image file name based on active/default state. */\r\n  protected readonly imgName = computed(() =>\r\n    this.isActive() ? this.bimplusTabComponentModel.img.active : this.bimplusTabComponentModel.img.default\r\n  )\r\n  protected readonly onHoverOver = signal<boolean>(false);\r\n\r\n  /** Whether all tabs is disabled based on configuration token. */\r\n  private readonly isAllDisabled = this.bimplusTabsSwitcherConfig?.disabled?.all ?? false;\r\n\r\n  constructor(\r\n    @Optional() @Inject(BIMPLUS_TABS_SWITCHER_CONFIG) private readonly bimplusTabsSwitcherConfig: BimplusTabsSwitcherConfig,\r\n    protected readonly bimplusTabsSwitcherService: BimplusTabsSwitcherService\r\n  ) {\r\n    if (this.isAllDisabled) {\r\n      this.isDisabled.set(true);\r\n    }\r\n  }\r\n\r\n  @HostListener('mouseenter')\r\n  protected onMouseEnter(): void {\r\n    this.onHoverOver.set(true)\r\n  }\r\n\r\n  @HostListener('mouseleave')\r\n  protected onMouseLeave(): void {\r\n    this.onHoverOver.set(false)\r\n  }\r\n\r\n  public ngOnInit(): void {\r\n    // wheter specific tab is disabled\r\n    if (!this.isAllDisabled && this.bimplusTabsSwitcherConfig?.disabled?.id) {\r\n      this.isDisabled.set(this.bimplusTabsSwitcherConfig.disabled?.id === this.bimplusTabComponentModel.id);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Will update active tab to service state.\r\n   * @protected\r\n   * @returns void\r\n   */\r\n  protected activate(): void {\r\n    if (this.isDisabled()) {\r\n      return;\r\n    }\r\n\r\n    this.bimplusTabsSwitcherService.setActiveTab(this.bimplusTabComponentModel.id);\r\n    this.activeTabChange.emit(this.bimplusTabComponentModel.id);\r\n  }\r\n}\r\n","<div\r\n    class=\"tab-element\"\r\n    [title]=\"bimplusTabComponentModel.title | translate\"\r\n    [class.disabled]=\"isDisabled()\"\r\n    (click)=\"!isDisabled() && activate()\"\r\n    (keypress)=\"!isDisabled() && activate()\"\r\n>\r\n    <img src=\"{{imageBaseSrc}}assets/images/default/{{imgName()}}.svg\" [alt]=\"imgName()\">\r\n    <div\r\n        [attr.data-test]=\"'underline-switcher-' + bimplusTabComponentModel.id\"\r\n        [ngClass]=\"{\r\n            'underline-switcher': true,\r\n            'highlight': isActive(),\r\n            'hovering': onHoverOver()\r\n        }\"\r\n    ></div>\r\n</div>\r\n","import { Component, ViewEncapsulation, Optional, ChangeDetectionStrategy, signal, Signal, SkipSelf, Output, EventEmitter, Input, inject } from '@angular/core';\nimport { BimplusTabsSwitcherService } from './services/bimplus-tabs-switcher.service';\nimport { BimplusTabComponent } from './components/bimplus-tab/bimplus-tab.component';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { BimplusTabComponentModel, DEFAULT_TAB_SWITCHER_ELEMENTS } from './bimplus-tabs-switcher.interface';\nimport { APP_BASE_HREF } from '@angular/common';\n\n@Component({\n  selector: 'lib-bimplus-tabs-switcher',\n  imports: [BimplusTabComponent],\n  templateUrl: './bimplus-tabs-switcher.component.html',\n  styleUrls: ['./bimplus-tabs-switcher.component.less'],\n  providers: [BimplusTabsSwitcherService],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusTabsSwitcherComponent {\n  @Input() activeTab?: string;\n  @Output() activeTabChange = new EventEmitter<string>();\n\n  /** default tab elements, can be chanaged from outside by BimplusTabsSwitcherService */\n  protected readonly tabSwitcherElements: Signal<BimplusTabComponentModel[]>;\n  /** app base href */\n  protected readonly baseHref = inject(APP_BASE_HREF, { optional: true });\n\n  constructor(\n    @Optional() @SkipSelf()\n    private readonly bimplusTabsSwitcherService: BimplusTabsSwitcherService\n  ) {\n    // will check wheter is used from outside and if not then add default tabs\n    if (this.bimplusTabsSwitcherService) {\n      this.tabSwitcherElements = toSignal(this.bimplusTabsSwitcherService.tabSwitcherElements$) as Signal<BimplusTabComponentModel[]>\n    } else {\n      this.tabSwitcherElements = signal<BimplusTabComponentModel[]>(DEFAULT_TAB_SWITCHER_ELEMENTS).asReadonly();\n    }\n  }\n}\n","<div class=\"tabswitcher-container\">\n    @for (tabElement of tabSwitcherElements(); track tabElement.id) {\n        <lib-bimplus-tab\n            [attr.data-test]=\"tabElement.id\"\n            [activeTab]=\"activeTab\"\n            [imageBaseSrc]=\"baseHref\"\n            (activeTabChange)=\"activeTabChange.emit($event)\"\n            [bimplusTabComponentModel]=\"{ id: tabElement.id, title: tabElement.title, img: { active: tabElement.img.active, default: tabElement.img.default }}\"\n        />\n    }\n     <ng-content></ng-content>\n</div>","import { DecimalPipe } from '@angular/common';\r\nimport { Pipe, PipeTransform } from '@angular/core';\r\n\r\nconst MB_SIZE = 1000;\r\n\r\nexport const BitConverterSize = {\r\n    KB: 'kB',\r\n    GB: 'gib',\r\n    MB: 'mb'\r\n    // more..\r\n} as const;\r\n\r\ntype SizeType = typeof BitConverterSize['GB' | 'KB' | 'MB'];\r\n\r\n@Pipe({\r\n  name: 'bitConverter',\r\n  standalone: true\r\n})\r\nexport class BitConverterPipe extends DecimalPipe implements PipeTransform {\r\n    override transform(value: number | string, digitsInfo?: string, locale?: string): string | null;\r\n    override transform(value: null | undefined, digitsInfo?: string, locale?: string): null;\r\n    override transform(value: number | string | null | undefined, digitsInfo?: string, locale?: string): string | null;\r\n    override transform(value: unknown, sizeToConvert: SizeType = BitConverterSize.KB, digitsInfo: string = '1.2-2', base: number = MB_SIZE): string | null {\r\n        if (!this.isNumber(value)) {\r\n            throw new Error('[BitConverterPipe]: value is not a number');\r\n        }\r\n        const size = this.getSizeFromBites(value, sizeToConvert, base);\r\n        let decimalValue = super.transform(size, digitsInfo);\r\n        decimalValue ??= value.toString();\r\n\r\n        return `(${decimalValue} ${sizeToConvert})`;\r\n    }\r\n\r\n    private getSizeFromBites(value: number, size: SizeType, base: number): number {\r\n        switch(size) {\r\n            case 'kB':\r\n                return value / base;\r\n            case 'mb':\r\n                return value / (base * base);\r\n            case 'gib':\r\n                return value / (base * base * base);\r\n            default:\r\n                return value;\r\n        }\r\n    }\r\n\r\n    private isNumber(value: unknown): value is number {\r\n        return  typeof value === 'number' && !isNaN(value);\r\n    }\r\n}\r\n","import { InjectionToken } from '@angular/core';\nimport { BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\n\nexport type BimplusAttachmentsConfig = {\n  buttons?: BimplusButtonRowItem[];\n  hideDeleteAttachmentButton?: boolean;\n  showNoAttachmentsFound?: boolean;\n  hideAttachmentSize?: boolean;\n};\nexport const BIMPLUS_ATTACHMENTS_CONFIG =\n  new InjectionToken<BimplusAttachmentsConfig>('bimplus-attachments-config');\n\nexport interface IAttachment {\n  id: string;\n  fileName: string;\n  size: number | undefined;\n  file?: File;\n}\n\nexport class Attachment implements Partial<IAttachment> {\n  public id: string;\n  public fileName: string;\n  public size: number | undefined;\n  public file?: File;\n\n  constructor(data: Partial<IAttachment>) {\n    this.id = data.id ?? '';\n    this.fileName = data.fileName ?? '';\n    this.size = data.size ?? 0;\n  }\n}\n\ntype Builder = typeof AttachmentBuilder;\n\nexport abstract class AttachmentBuilder {\n  private static attachment = new Attachment({});\n\n  public static create(value: Attachment): Builder {\n    this.attachment = new Attachment(value);\n    return this;\n  }\n\n  public static setId(id: string): Builder {\n    this.attachment.id = id;\n    return this;\n  }\n\n  public static setFileName(name: string): Builder {\n    this.attachment.fileName = name;\n    return this;\n  }\n\n  public static setSize(size: number): Builder {\n    this.attachment.size = size;\n    return this;\n  }\n\n  public static setFile(file: File): Builder {\n    this.attachment.file = file;\n    return this;\n  }\n\n  public static build(): Attachment {\n    const attachmentToReturn = structuredClone(this.attachment);\n    this.attachment = new Attachment({});\n\n    return attachmentToReturn;\n  }\n}\n","import {\n  AfterViewInit,\n  Component,\n  computed,\n  ElementRef,\n  EventEmitter,\n  inject,\n  Input,\n  OnDestroy,\n  Output,\n  signal,\n  TemplateRef,\n  ViewChild,\n} from '@angular/core';\nimport { BitConverterPipe } from '../../../../pipes/bit-converter.pipe';\nimport { TranslateModule } from '@ngx-translate/core';\nimport {\n  Attachment,\n  BIMPLUS_ATTACHMENTS_CONFIG,\n} from '../../bimplus-attachments.interface';\n\nconst BIM_ATTACHMENT_DELETE_BUTTON_WIDTH = 30;\nconst BIM_ATTACHMENT_ITEM_PADDING_LEFT = 28;\n\n@Component({\n  selector: 'lib-bimplus-attachment-item',\n  imports: [BitConverterPipe, TranslateModule],\n  templateUrl: './bimplus-attachment-item.component.html',\n  styleUrl: './bimplus-attachment-item.component.less'\n})\nexport class BimplusAttachmentItemComponent\n  implements AfterViewInit, OnDestroy\n{\n  @Input() closeIconTemplate?: TemplateRef<unknown>;\n  @ViewChild('attachmentSizeRef') attachmentSizeRef?: ElementRef<HTMLElement>;\n  @ViewChild('attachmentNameRef') attachmentNameRef!: ElementRef<HTMLElement>;\n  @Input({ required: true }) attachment!: Attachment;\n  @Input() set parentWidth(value: number | undefined) {\n    if (!value) {\n      return;\n    }\n\n    this.parentWidthSignal.set(value);\n  }\n  @Output() deleteAttachment = new EventEmitter<Attachment>();\n  @Output() getAttachment = new EventEmitter<Attachment>();\n\n  get type(): string {\n    return `.${this.attachment.fileName.split('.').at(-1)}`;\n  }\n\n  private intersectionObserver?: IntersectionObserver;\n  /** Parent element width. */\n  private readonly parentWidthSignal = signal<number | undefined>(undefined);\n  /** Attachment size text width. */\n  private readonly attachmentSizeWidth = signal<number>(0);\n  /** Wheter name is fully visible or not based on parent width. */\n  protected readonly nameIsFullyVisible = signal<boolean>(false);\n\n  protected readonly config = inject(BIMPLUS_ATTACHMENTS_CONFIG, {\n    optional: true,\n  });\n\n  /** Attribute to indicate if show/hide size of File. */\n  protected readonly hideSize = !!this.config?.hideAttachmentSize;\n\n  /** Width size of file name line. */\n  protected readonly nameInfoLineWidth = computed<number>(() => {\n    const parentWidth = this.parentWidthSignal();\n    const attachmentSizeWidth = this.attachmentSizeWidth();\n    const nameIsFullyVisible = this.nameIsFullyVisible();\n\n    if (!parentWidth) {\n      return 0;\n    }\n\n    if (nameIsFullyVisible) {\n      return parentWidth - BIM_ATTACHMENT_DELETE_BUTTON_WIDTH;\n    }\n\n    return (\n      parentWidth -\n      attachmentSizeWidth -\n      (BIM_ATTACHMENT_DELETE_BUTTON_WIDTH + BIM_ATTACHMENT_ITEM_PADDING_LEFT)\n    );\n  });\n\n  public ngAfterViewInit(): void {\n    if (this.attachmentSizeRef) {\n      this.attachmentSizeWidth.set(\n        +this.attachmentSizeRef.nativeElement.clientWidth\n      );\n      this.createIntersectionObserver();\n      this.intersectionObserver!.observe(this.attachmentNameRef.nativeElement);\n    }\n  }\n\n  public ngOnDestroy(): void {\n    this.intersectionObserver?.unobserve(this.attachmentNameRef.nativeElement);\n  }\n\n  private createIntersectionObserver(): void {\n    const options: IntersectionObserverInit = {\n      root: null,\n      rootMargin: '0px',\n      threshold: 1.0,\n    };\n    const callback: IntersectionObserverCallback = (entries) =>\n      entries.forEach(({ intersectionRect, boundingClientRect }) => {\n        const isWidthFullyVisible = intersectionRect.width === boundingClientRect.width;\n        this.nameIsFullyVisible.set(isWidthFullyVisible);\n      });\n\n    this.intersectionObserver = new IntersectionObserver(callback, options);\n  }\n}\n","<div class=\"bim-attachment-item\">\n  <div\n    data-test=\"bim-attachment\"\n    (click)=\"getAttachment.emit(attachment)\"\n    (keypress)=\"$event.preventDefault()\"\n    title=\"{{ attachment.fileName }}\"\n    class=\"bim-attachment-name\"\n    [style.width.px]=\"nameInfoLineWidth()\"\n  >\n    <span #attachmentNameRef>{{ attachment.fileName }}</span>\n    @if (nameIsFullyVisible() && !hideSize) {\n      <span class=\"bim-attachment-size\">{{ attachment.size | bitConverter:'kB':'1.2-2' }}</span>\n    }\n  </div>\n  @if(!nameIsFullyVisible() && !hideSize) {\n    <span>{{ type }} </span>\n    <div #attachmentSizeRef class=\"bim-attachment-size\">\n      {{ attachment.size | bitConverter:'kB':'1.2-2' }}\n    </div>\n  }\n  @if (!config?.hideDeleteAttachmentButton) {\n    <span\n      data-test=\"delete-attachment-btn\"\n      class=\"bim-attachment-delete-button\"\n      title=\"{{ '_Delete attachment' | translate }}\"\n      (click)=\"deleteAttachment.emit(attachment)\"\n      (keypress)=\"$event.preventDefault()\"\n    >\n      <span class=\"icon\">✕︎</span>\n    </span>\n  }\n</div>\n","import {\n  AfterViewInit,\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  EventEmitter,\n  inject,\n  Input,\n  OnDestroy,\n  Output,\n  signal,\n  TemplateRef,\n  ViewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { BimplusLocalizedWidgetComponent } from '../bimplus-localized-widget/bimplus-localized-widget.component';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';\nimport { BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\nimport { BimplusAttachmentItemComponent } from './components/bimplus-attachment-item/bimplus-attachment-item.component';\nimport { BimplusScrollableContainerComponent } from '../bimplus-scrollable-container/bimplus-scrollable-container.component'\nimport {\n  Attachment,\n  BIMPLUS_ATTACHMENTS_CONFIG,\n} from './bimplus-attachments.interface';\nimport * as WebSdk from 'bimplus-websdk';\n@Component({\n  selector: 'lib-bimplus-attachments',\n  imports: [\n    TranslateModule,\n    BimplusButtonsRowComponent,\n    BimplusAttachmentItemComponent,\n    BimplusScrollableContainerComponent\n  ],\n  templateUrl: './bimplus-attachments.component.html',\n  styleUrl: './bimplus-attachments.component.less',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusAttachmentsComponent\n  extends BimplusLocalizedWidgetComponent\n  implements AfterViewInit, OnDestroy\n{\n  @Input() api : WebSdk.Api | null = null;\n  /** Attribute for attachments which were saved to server. */\n  @Input() attachments: Attachment[] = [];\n  @Input() closeIconTemplate?: TemplateRef<unknown>;\n  /** Attribute to set if should button display or no. */\n  @Input({ transform: booleanAttribute }) listOnly = false;\n  @ViewChild('attachmentListRef') attachmentListRef!: ElementRef<HTMLElement>;\n  @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\n  @Output() deleteAttachment = new EventEmitter<Attachment>();\n  @Output() addAttachment = new EventEmitter<File>();\n  @Output() getAttachment = new EventEmitter<Attachment>();\n\n  private resizeObserver!: ResizeObserver;\n  /** Configuration token. */\n  protected readonly config = inject(BIMPLUS_ATTACHMENTS_CONFIG, {\n    optional: true,\n  });\n  /** Attachments buttons. */\n  protected readonly buttons: BimplusButtonRowItem[] = [\n    {\n      id: 'add-attachment',\n      title: this.translateService.instant('_Add attachment'),\n      tooltip: this.translateService.instant('_Add attachment'),\n      disabled: false,\n      buttonStyle: 'primary',\n      type: 'file',\n    },\n  ];\n  /** Width size of file name line. */\n  protected readonly attachmentListWidth = signal<number | undefined>(\n    undefined\n  );\n\n  /**\n   * Will open window to select File.\n   * @return void\n   * @public\n   */\n  public open(): void {\n    this.fileInput.nativeElement.click();\n  }\n\n  public ngAfterViewInit(): void {\n    this.createResizeObserver();\n    this.resizeObserver.observe(this.attachmentListRef.nativeElement);\n  }\n\n  public ngOnDestroy(): void {\n    this.resizeObserver.unobserve(this.attachmentListRef.nativeElement);\n  }\n\n  protected onFileChanged(files: File[] | Event, inputElement?: HTMLInputElement): void {\n    let filesArray: File[] = [];\n    if(files instanceof FileList){\n      filesArray = Array.from(files);\n    } else if(files instanceof Event){\n      const input = files.target as HTMLInputElement;\n      if (input?.files) {        \n        filesArray = Array.from(input.files); \n      }\n    }      \n    for (const file of filesArray) {\n      if (file instanceof File) {\n          this.addAttachment.emit(file);\n      }      \n    }      \n    // reset value to be able select same value again\n    if (inputElement) {\n      inputElement.value = ''\n    }\n  }\n\n  private createResizeObserver(): void {\n    this.resizeObserver = new ResizeObserver((entries) => {\n      const { width }: DOMRectReadOnly = entries[0].contentRect;\n      this.attachmentListWidth.set(width);\n    });\n  }\n}\n","<div class=\"bim-attachments\">\r\n  @if (listOnly) {\r\n    <input #fileInput hidden type=\"file\" (change)=\"onFileChanged($event, fileInput)\" multiple>\r\n  } @else {\r\n    <lib-bimplus-buttons-row [items]=\"config?.buttons ?? buttons\" (fileChanged)=\"onFileChanged($event)\" [isMultiple]=\"true\"/>\r\n  }\r\n\r\n  @if (listOnly) {\r\n    <section #attachmentListRef class=\"bim-attachments-list\">\r\n      @if (!attachments.length) {\r\n        @if (config?.showNoAttachmentsFound) {\r\n          <div\r\n            data-test=\"no-attachments\"\r\n            class=\"bim-attachments-list-empty\"\r\n          >{{ '_No attachments found' | translate }}</div>\r\n        }\r\n      } @else {\r\n        @for (attachment of attachments; track attachment.id) {\r\n          <lib-bimplus-attachment-item\r\n            [closeIconTemplate]=\"closeIconTemplate\"\r\n            [attr.data-test]=\"attachment.id\"\r\n            (deleteAttachment)=\"deleteAttachment.emit($event)\"\r\n            (getAttachment)=\"getAttachment.emit($event)\"\r\n            [parentWidth]=\"attachmentListWidth()\"\r\n            [attachment]=\"attachment\"\r\n          />\r\n        }\r\n      }\r\n    </section>\r\n  } @else {\r\n    <div class=\"scrollable-content-container\">\r\n      <lib-bimplus-scrollable-container>\r\n        <section #attachmentListRef class=\"bim-attachments-list\">\r\n          @if (!attachments.length) {\r\n            @if (config?.showNoAttachmentsFound) {\r\n              <div\r\n                data-test=\"no-attachments\"\r\n                class=\"bim-attachments-list-empty\"\r\n              >{{ '_No attachments found' | translate }}</div>\r\n            }\r\n          } @else {\r\n            @for (attachment of attachments; track attachment.id) {\r\n              <lib-bimplus-attachment-item\r\n                [closeIconTemplate]=\"closeIconTemplate\"\r\n                [attr.data-test]=\"attachment.id\"\r\n                (deleteAttachment)=\"deleteAttachment.emit($event)\"\r\n                (getAttachment)=\"getAttachment.emit($event)\"\r\n                [parentWidth]=\"attachmentListWidth()\"\r\n                [attachment]=\"attachment\"\r\n              />\r\n            }\r\n          }\r\n        </section>\r\n      </lib-bimplus-scrollable-container>\r\n    </div>    \r\n  }\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n  Attachment,\r\n  AttachmentBuilder,\r\n} from '../bimplus-attachments.interface';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class BimplusAttachmentsService {\r\n  public getAttachment(value: Attachment | File): Attachment {\r\n    let attachment: Attachment;\r\n    if (value instanceof File) {\r\n      attachment = AttachmentBuilder.setFile(value)\r\n        .setFileName(value.name)\r\n        .build();\r\n    } else {\r\n      attachment = AttachmentBuilder.create(value).build();\r\n    }\r\n\r\n    return attachment;\r\n  }\r\n\r\n  public download(href: string, fileName: string): void {\r\n    const anchor: HTMLAnchorElement = document.createElement('a');\r\n    anchor.rel = 'noopener noreferrer';\r\n    anchor.target = '_blank';\r\n    anchor.href = href;\r\n    anchor.download = fileName;\r\n    anchor.click();\r\n  }\r\n}\r\n","import { Component, HostListener, Input, ViewEncapsulation } from '@angular/core';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';\nimport { BimplusButtonClickEvent, BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\nimport { DialogService } from '../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service';\n\nexport interface CommentDialogData {\n  title: string;\n  message: string;\n  acceptCallback: () => void;\n}\n\nconst DELETE_BUTTON_ID = 'delete';\nconst CANCEL_BUTTON_ID = 'cancel';\n\n@Component({\n  selector: 'lib-bimplus-overlay-dialog-delete',\n  templateUrl: './bimplus-overlay-dialog-delete.component.html',\n  styleUrls: ['./bimplus-overlay-dialog-delete.component.less'],\n  imports: [TranslateModule, BimplusButtonsRowComponent],\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusOverlayDialogDeleteComponent {\n\n  private _title: string = '';\n  private _message: string = '';\n  private readonly data: CommentDialogData | undefined;\n  acceptCallback: (() => void) | undefined;\n  protected readonly buttons: BimplusButtonRowItem[] = [\n    {\n      id: DELETE_BUTTON_ID,\n      title: this.translateService.instant('_Delete'),\n      tooltip: this.translateService.instant('_Delete'),\n      disabled: false,\n      buttonStyle: 'primary'\n    },\n    {\n      id: CANCEL_BUTTON_ID,\n      title: this.translateService.instant('_Cancel'),\n      tooltip: this.translateService.instant('_Cancel'),\n      disabled: false,\n      buttonStyle: 'secondary'\n    }\n  ];\n\n  @Input()\n  get title(): string {\n    return this._title;\n  }\n  set title(value: string) {\n    this._title = value;\n  }\n\n  @Input()\n  get message(): string {\n    return this._message;\n  }\n  set message(value: string) {\n    this._message = value;\n  }\n\n  constructor(\n    private readonly dialogService: DialogService,\n    private readonly translateService: TranslateService\n  ) {\n    this.data = this.dialogService.inputData as CommentDialogData;\n    if (this.data) {\n      this._title = this.data.title || '';\n      this._message = this.data.message || '';\n      this.acceptCallback = this.data.acceptCallback;\n    }\n  }\n\n  close(): void {\n    this.dialogService.close();\n  }\n\n  keypressClose(event: KeyboardEvent): void {\n    if (event.key === 'Escape' || event.key === 'Esc') {\n      this.dialogService.close();\n    }\n  }\n\n  buttonRowButtonClicked($event: BimplusButtonClickEvent): void {\n    this.dialogService.close();\n\n    if ($event.id === DELETE_BUTTON_ID) {\n      this.acceptCallback?.();\n    }\n  }\n\n  @HostListener('document:keydown', ['$event'])\n  handleKeydown(event: KeyboardEvent) {\n    if (event.key === 'Escape' || event.key === 'Esc') {\n      this.close();\n    }\n  }\n}\n","<div class=\"overlay-dialog-container\">\n  <div class=\"overlay-dialog-container_title\">\n    <div class=\"overlay-dialog-container_title_icon\"></div>\n    <div class=\"overlay-dialog-container_title_msg\">\n      {{title}}\n    </div>\n    <div\n      class=\"overlay-dialog-container_title_close\"\n      (click)=\"close()\"\n      (keypress)=\"keypressClose($event)\"\n    ></div>\n  </div>\n  <div class=\"overlay-dialog-container_content\">\n    <div\n      class=\"overlay-dialog-container_content_msg\"\n      [innerHTML]=\"message\">\n    </div>\n    <div class=\"buttons\">\n      <lib-bimplus-buttons-row\n        [items]=\"buttons\"\n        (buttonClicked)=\"buttonRowButtonClicked($event)\"\n      />\n    </div>\n  </div>\n</div>\n","import { Directive, ElementRef, HostListener, Input } from '@angular/core';\n\n@Directive({\n  selector: '[libAutoResizeTextarea]',\n  standalone: true\n})\nexport class AutoResizeTextareaDirective {\n\n  private _libAutoResizeTextarea = false;\n  private _autoResizeMinRows = 1;\n  private _autoResizeMaxRows = 1;\n  private currentRows = 1;\n  private offsetHeight = 0;\n  private readonly input: HTMLTextAreaElement;\n  private avgLineHeight = 0;\n\n  @Input()\n  set autoResizeMinRows(value: number) {\n    this._autoResizeMinRows = value > 0 ? value : 1;\n    this.currentRows = this.currentRows < value ? value : this.currentRows;\n    this.input.rows = value;\n  }\n  get autoResizeMinRows(): number {\n    return this._autoResizeMinRows;\n  }\n\n  @Input()\n  set autoResizeMaxRows(value: number) {\n    this._autoResizeMaxRows = value < 1 ? 1 : value;\n  }\n  get autoResizeMaxRows(): number {\n    return this._autoResizeMaxRows;\n  }\n\n  @Input()\n  set libAutoResizeTextarea(condition: boolean) {\n    this._libAutoResizeTextarea = condition;\n  }\n  get libAutoResizeTextarea(): boolean {\n    return this._libAutoResizeTextarea;\n  }\n\n  constructor(private el: ElementRef) {\n    this.input = this.el.nativeElement;\n  }\n\n  @HostListener('input')\n  onInput(): void {\n    if (this.libAutoResizeTextarea) {\n      this.calculateLineHeight();\n      this.updateRows();\n    }\n  }\n\n  private calculateLineHeight(): void {\n    const style = window.getComputedStyle(this.input, null);\n    const lineHeight = style.getPropertyValue('line-height');\n    let newLineHeight = 0;\n    if (lineHeight === 'normal') {\n      newLineHeight = (parseFloat(style.getPropertyValue('font-size')) || 16) * 1.14;\n    } else {\n      newLineHeight = parseFloat(lineHeight);\n    }\n    this.avgLineHeight = Math.trunc(newLineHeight);\n  }\n\n  private updateRows(): void {\n    if (this.offsetHeight <= 0) {\n      this.offsetHeight = this.input.scrollHeight;\n    }\n\n    this.input.rows = this._autoResizeMinRows;\n\n    const rows = Math.floor(\n      (this.input.scrollHeight - this.offsetHeight) /\n      this.avgLineHeight\n    );\n\n    const rowsCount = this._autoResizeMinRows + rows;\n\n    this.input.rows = rowsCount > this._autoResizeMaxRows\n      ? this._autoResizeMaxRows\n      : rowsCount;\n  }\n\n}\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { AutoResizeTextareaDirective } from './auto-resize-textarea.directive';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@Component({\n  selector: 'lib-bimplus-textarea',\n  templateUrl: './bimplus-textarea.component.html',\n  styleUrls: ['./bimplus-textarea.component.less'],\n  imports: [ReactiveFormsModule, AutoResizeTextareaDirective, TranslateModule]\n})\nexport class BimplusTextareaComponent implements OnInit, OnDestroy {\n\n  textareaControl = new FormControl();\n\n  private _textareaSubscription?: Subscription;\n\n  @Output() textAreaValueChange = new EventEmitter<string>();\n\n  private _name = '';\n  private _placeholder = '';\n  private _readonly = false;\n  private _required = false;\n  private _rows = 1;\n  private _activeAutoResizeTextarea = false;\n  private _minRows = 1;\n  private _maxRows = 1;\n  private _clearValue = false;\n\n  @Input()\n  set name(value: string) {\n    this._name = value;\n  }\n  get name(): string {\n    return this._name;\n  }\n\n  @Input()\n  set placeholder(value: string) {\n    this._placeholder = value;\n  }\n  get placeholder(): string {\n    return this._placeholder;\n  }\n\n  @Input()\n  set readonly(value: boolean) {\n    this._readonly = value;\n  }\n  get readonly(): boolean {\n    return this._readonly;\n  }\n\n  @Input()\n  set required(value: boolean) {\n    this._required = value;\n  }\n  get required(): boolean {\n    return this._required;\n  }\n\n  @Input()\n  set minRows(value: number) {\n    this._minRows = value;\n  }\n  get minRows(): number {\n    return this._minRows;\n  }\n\n  @Input()\n  set maxRows(value: number) {\n    this._maxRows = value;\n  }\n  get maxRows(): number {\n    return this._maxRows;\n  }\n\n  @Input()\n  set activeAutoResizeTextarea(value: boolean) {\n    this._activeAutoResizeTextarea = value;\n  }\n  get activeAutoResizeTextarea(): boolean {\n    return this._activeAutoResizeTextarea;\n  }\n\n  @Input()\n  set clearValue(clear: boolean) {\n    if (clear) {\n      this.textareaControl.reset();\n      this._clearValue = false;\n    } else {\n      this._clearValue = clear;\n    }\n  }\n  get clearValue(): boolean {\n    return this._clearValue;\n  }\n\n  @Input()\n  set rows(value: number) {\n    this._rows = value;\n  }\n  get rows(): number {\n    return this._rows;\n  }\n\n  constructor() {}\n\n  ngOnInit() {\n    this._textareaSubscription = this.textareaControl.valueChanges.subscribe(value => {\n      this.textAreaValueChange.emit(value);\n    });\n  }\n\n  getTextareaValue() {\n    return this.textareaControl.value;\n  }\n\n  onKeydown(event: KeyboardEvent): boolean {\n    const forbiddenKeys = ['<', '>'];\n    if (forbiddenKeys.includes(event.key)) {\n      event.preventDefault();\n      return false;\n    }\n    return true;\n  }\n\n  ngOnDestroy() {\n    this._textareaSubscription?.unsubscribe();\n  }\n}\n","@if(activeAutoResizeTextarea){\n  <textarea\n    [formControl]=\"textareaControl\"\n    [placeholder]=\"placeholder | translate\"\n    [name]=\"name\"\n    [readonly]=\"readonly\"\n    [required]=\"required\"\n    (keydown)=\"onKeydown($event)\"\n    [libAutoResizeTextarea]=\"activeAutoResizeTextarea\"\n    [autoResizeMinRows]=\"minRows\"\n    [autoResizeMaxRows]=\"maxRows\"\n    ></textarea>\n  } @else {\n  <textarea\n    [formControl]=\"textareaControl\"\n    [placeholder]=\"placeholder\"\n    [name]=\"name\"\n    [readonly]=\"readonly\"\n    [required]=\"required\"\n    (keydown)=\"onKeydown($event)\"\n    [rows]=\"rows\"\n  ></textarea>\n  }\n","import { formatDate, NgForOf } from '@angular/common';\nimport { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';\nimport * as WebSdk from \"bimplus-websdk\";\nimport { TranslatePipe } from \"@ngx-translate/core\";\nimport { BimplusAttachmentsComponent } from '../bimplus-attachments/bimplus-attachments.component';\nimport { Attachment, BIMPLUS_ATTACHMENTS_CONFIG, BimplusAttachmentsConfig } from '../bimplus-attachments/bimplus-attachments.interface';\nimport { CommentOutputData } from '../bimplus-object-comments-list/bimplus-object-comments-list.interface';\n\nconst config: BimplusAttachmentsConfig = {\n  hideDeleteAttachmentButton: true,\n  hideAttachmentSize: true\n}\n\n@Component({\n  selector: 'lib-bimplus-comment',\n  templateUrl: './bimplus-comment.component.html',\n  styleUrls: ['./bimplus-comment.component.less'],\n  imports: [NgForOf, TranslatePipe, BimplusAttachmentsComponent],\n  providers: [{ provide: BIMPLUS_ATTACHMENTS_CONFIG, useValue: config }],\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusCommentComponent {\n\n  @Output() outputActionCommentEvent = new EventEmitter<CommentOutputData>();\n  @Output() getAttachment = new EventEmitter<Attachment>();\n\n  private _message: string | undefined = undefined;\n  \n  @Input() api : WebSdk.Api | null = null;\n\n  /** Attachments links to particular comment. */\n  @Input() attachmentLinkItems:WebSdk.AttachmentLink[] = []\n\n  @Input()\n  set message(value: string | undefined) {\n    this._message = value;\n  }\n  get message(): string | undefined {\n    return this._message;\n  }\n\n  private _date = '';\n  @Input()\n  set date(value: string) {\n    const formattedValue = new Intl.DateTimeFormat(undefined, { timeStyle: \"short\" }).format(new Date(value));\n    this._date = formattedValue;\n  }\n  get date(): string {\n    return this._date;\n  }\n\n  private _action = 'close';\n  @Input()\n  set action(value: string) {\n    this._action = value;\n  }\n  get action(): string {\n    return this._action;\n  }\n\n  private _commentId = '';\n  @Input()\n  set commentId(value: string) {\n    this._commentId = value;\n  }\n  get commentId(): string {\n    return this._commentId;\n  }\n\n  private _isActUserAuthor = true;\n  @Input()\n  set isActUserAuthor(value: boolean) {\n    this._isActUserAuthor = value;\n  }\n  get isActUserAuthor(): boolean {\n    return this._isActUserAuthor;\n  }\n\n  private _displayname = '';\n  @Input()\n  set displayname(value: string) {\n    this._displayname = value;\n  }\n  get displayname(): string {\n    return this._displayname;\n  }\n\n  @Input() hyperlinks: WebSdk.Hyperlink[] | undefined = [];\n\n  /** Attachments related to particular comment. */\n  @Input() attachments: WebSdk.Attachment[] = [];\n\n  emitAction(data: CommentOutputData): void {\n    this.outputActionCommentEvent.emit(data);\n  }\n\n  close(): void {\n    const data: CommentOutputData = { action: this.action, data: { commentId: this.commentId } };\n    this.emitAction(data);\n  }\n\n  onKeyPress(event: KeyboardEvent): void {\n    if (event.key === 'Escape' || event.key === 'Esc') {\n      this.close();\n    }\n  }\n\n  formatTime(date: string): string {\n    const locale = window.navigator.language;\n    const unformattedDate = new Date(date);\n    if (locale.includes('en')) {\n      return formatDate(unformattedDate, 'hh:mm a', locale);\n    }\n    return formatDate(unformattedDate, 'hh:mm', locale);\n  }\n}\n","@if (message !== undefined) {\n<div \n  class=\"comment-item-container\"\n  [class]=\"isActUserAuthor ? 'author' : ''\">\n  @if (!isActUserAuthor) {\n    <div class=\"comment-header\">\n      <div class=\"comment-title\">{{isActUserAuthor? '' : displayname}}</div>    \n    </div>\n  }\n  @if (isActUserAuthor) {\n    <div\n      class=\"comment-close\"\n      (click)=\"close()\"\n      (keydown)=\"onKeyPress($event)\"\n    ></div>\n  }\n  @if (message !== undefined){\n  <div class=\"comment-item-text\">{{message}}</div>\n  }\n\n  @if (attachments.length) {\n    <lib-bimplus-attachments \n      listOnly \n      [attachments]=\"attachments\" \n      (getAttachment)=\"getAttachment.emit($event)\"\n    />\n  }\n\n  @if (attachmentLinkItems.length) {\n    <a *ngFor=\"let attachmentLink of attachmentLinkItems\" class=\"item-row\" href=\"{{attachmentLink.link}}\" target=\"_blank\">\n      <div class=\"attachment-link-icon\" title=\"{{ '_Attachment_link' | translate }}\"></div>\n      <div class=\"text\" title=\"{{ attachmentLink.name }}\">{{ attachmentLink.name}}</div>\n    </a>    \n  }\n\n  <a *ngFor=\"let link of hyperlinks\" class=\"item-row\" href=\"{{ link.url }}\" target=\"_blank\">\n    <div class=\"link-icon\" title=\"{{ '_Hyperlink' | translate }}\"></div>\n    <div class=\"text\" title=\"{{ link.url }}\">{{ link.name }}</div>\n  </a>\n  \n  @if (date && date.length > 0){\n  <div class=\"comment-item-date\">\n    {{date}}\n  </div>\n  }\n</div>\n}\n","import { inject, Injectable } from '@angular/core';\nimport * as WebSdk from \"bimplus-websdk\";\nimport {catchError, defaultIfEmpty, first, forkJoin, from, map, Observable, of, switchMap} from 'rxjs';\nimport { BimplusAttachmentsService } from '../bimplus-attachments/services/bimplus-attachments.service';\nimport { Attachment } from '../bimplus-attachments/bimplus-attachments.interface';\nimport { postAttachmentLinks } from '../links-to-documents/links-to-documents.component';\nimport {DecoratorsService } from '../../services/decorators.service';\n\n@Injectable()\nexport class BimplusObjectCommentsListService {\n  public api!: WebSdk.Api;\n\n  private readonly bimplusAttachmentsService = inject(BimplusAttachmentsService);\n\n  constructor(\n    private readonly decorators:DecoratorsService\n  ) {}\n\n\n  public deleteComment(commentId: string) {\n    return from(this.api.comments.delete(commentId));\n  }\n\n  public downloadAttachment(attachment: Attachment) {\n    const { id, fileName } = attachment;\n    if (!this.api) {\n      return;\n    }\n    const api = this.api;\n    const path = `${api.getApiTeamUrl()}attachments/${id}/download?api-token=${api.getAccessToken()}&openInBrowser=true`;\n    this.bimplusAttachmentsService.download(path, fileName);\n  }\n\n  public postComments(\n    rootObjectId: string,\n    dataText: string,\n    hyperlinks: Partial<WebSdk.Hyperlink>[],\n    attachments: Attachment[],\n    newAttachmentIDs: string[]\n  ): Observable<string | null> {\n    return from(this.api.objects.postComment(rootObjectId, dataText)).pipe(\n      switchMap(createdComment => {\n        const { id: createdCommentId } = createdComment;\n\n        // Create form data for attachments\n        const formData = attachments.map(attachment => {\n          const attachmentsPayload = new FormData();\n          attachmentsPayload.append('file', attachment.file!);\n          attachmentsPayload.append('name', attachment.fileName);\n          attachmentsPayload.append('size', attachment.file!.size.toString());\n          attachmentsPayload.append('type', attachment.file!.type);\n          attachmentsPayload.append('objectId', createdCommentId);\n          return attachmentsPayload;\n        });\n\n        // Post attachments if any, otherwise continue\n        const attachmentCalls = formData.length\n          ? forkJoin(formData.map(data => from(this.api.objects.postAttachment(createdCommentId, data, undefined, ''))))\n          : of([]);\n\n        return attachmentCalls.pipe(map(() => createdCommentId));\n      }),\n      switchMap(createdCommentId => {\n        // Post attachment links\n        return newAttachmentIDs.length\n          ? postAttachmentLinks(newAttachmentIDs, createdCommentId, this.api).pipe(map(() => createdCommentId))\n          : of(createdCommentId);\n      }),\n      switchMap(createdCommentId => {\n        // Manage hyperlinks\n        return hyperlinks.length\n          ? this.manageHyperLinks(createdCommentId, hyperlinks).pipe(map(() => createdCommentId))\n          : of(createdCommentId);\n      }),\n      defaultIfEmpty(null),\n      first(),\n      catchError(error => {\n        console.error('Error in postComments:', error);\n        return of(null); // Ensure the stream completes with null in case of an error\n      })\n    );\n  }\n  private decorateComment(comment: WebSdk.CommentResponse) {\n    if(comment.attachmentLinks && comment.attachmentLinks.length > 0) {\n      const decoratedLinks = comment.attachmentLinks.map((link) => this.decorators.decorateLink(this.api!,link, [comment.id]));      \n      comment.attachmentLinks = decoratedLinks;        \n    }\n  }\n\n  private decorateComments(comments: WebSdk.CommentsResponse) {    \n    comments.forEach((comment) => {\n      this.decorateComment(comment);\n     });\n    return comments;\n  }\n\n  public loadComments(objectId: string): Observable<WebSdk.CommentsResponse> {\n    return from(this.api.objects.getComments(objectId)).pipe(\n      map((response: WebSdk.CommentsResponse | undefined) => {\n        if (!response) {\n          throw new Error('Comments response is undefined'); // Handle undefined response\n        }\n        // Modify the response here\n        return  this.decorateComments(response!);        \n      })\n    );\n  }\n\n  public manageHyperLinks(\n    createdCommentId: string,\n    hyperlinks: Partial<WebSdk.Hyperlink>[]\n  ) {\n    const hyperlinkPromises: (Promise<void | WebSdk.Hyperlink> | undefined)[] =\n      [];\n\n    hyperlinks.forEach((h) => {\n      if (!h) {\n        return;\n      }\n      const hyperlinkData = JSON.stringify({\n        name: h.name,\n        objectId: h.objectId,\n        url: h.url\n      });\n      const promise = this.api?.objects\n        .postHyperlink(createdCommentId, hyperlinkData)\n        .catch((err) => {\n          console.log(err);\n        });\n      hyperlinkPromises.push(promise);\n    });\n\n    return from(Promise.all(hyperlinkPromises));\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { StatusBarData } from './statusBar';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class BimplusStatusBarService {\n\n  _statusBarData: BehaviorSubject<StatusBarData> = new BehaviorSubject<StatusBarData>({\n    title: '',\n    statusBarVisible: false\n  });\n\n  constructor() { }\n\n  get statusBarVisible(): boolean {\n    return this._statusBarData.value.statusBarVisible;\n  }\n\n  get title(): string {\n    return this._statusBarData.value.title;\n  }\n\n  get statusBarData(): StatusBarData {\n    return this._statusBarData.value;\n  }\n\n  get statusBarDataSubscription(): BehaviorSubject<StatusBarData> {\n    return this._statusBarData;\n  }\n\n  setStatusBarData(data: StatusBarData): void {\n    this._statusBarData.next(data);\n  }\n\n}\n","import { Component, Input, OnChanges, OnInit, signal, SimpleChanges, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { BimplusOverlayDialogDeleteComponent } from '../bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { AsyncPipe, DatePipe, NgFor } from '@angular/common';\nimport { DialogService } from '../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service';\nimport { BimplusTextareaComponent } from '../bimplus-textarea/bimplus-textarea.component';\nimport { BimplusCommentComponent } from '../bimplus-comment/bimplus-comment.component';\nimport * as WebSdk from \"bimplus-websdk\";\nimport { BimplusButtonClickEvent, BimplusButtonRowItem } from '../bimplus-buttons-row/bimplus-buttons-row.interface';\nimport { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';\nimport { BimplusLocalizedWidgetComponent } from '../bimplus-localized-widget/bimplus-localized-widget.component';\nimport { BimplusScrollableContainerComponent } from '../bimplus-scrollable-container/bimplus-scrollable-container.component';\nimport { CommentData, CommentOutputData, IDialogConfirmClose } from './bimplus-object-comments-list.interface';\nimport { BimplusInputTextFieldComponent } from \"../bimplus-input-text-field/bimplus-input-text-field.component\";\nimport { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule, Validators } from \"@angular/forms\";\nimport { BimplusAttachmentsComponent } from '../bimplus-attachments/bimplus-attachments.component';\nimport { BimplusAttachmentsService } from '../bimplus-attachments/services/bimplus-attachments.service';\nimport {\n  Attachment,\n  BIMPLUS_ATTACHMENTS_CONFIG,\n  BimplusAttachmentsConfig,\n} from '../bimplus-attachments/bimplus-attachments.interface';\nimport { BehaviorSubject, switchMap } from 'rxjs';\nimport { BimplusObjectCommentsListService } from './bimplus-object-comments-list.service';\nimport { LinksToDocumentsComponent } from '../links-to-documents/links-to-documents.component';\nimport { ProjectNavigatorProject } from '../project-models/project-models.interface';\nimport { BimplusStatusBarService } from '../bimplus-status-bar/bimplus-status-bar.service';\nimport { NewAttachInfo } from './bimplus-object-comments-list.interface';\n\n\nconst config: BimplusAttachmentsConfig = {\n  showNoAttachmentsFound: false,\n  hideAttachmentSize: true,\n};\n@Component({\n  selector: 'lib-bimplus-object-comments-list',\n  templateUrl: './bimplus-object-comments-list.component.html',\n  styleUrls: ['./bimplus-object-comments-list.component.less'],\n  imports: [\n    NgFor,\n    CommonModule,\n    BimplusTextareaComponent,\n    BimplusCommentComponent,\n    BimplusButtonsRowComponent,\n    TranslateModule,\n    BimplusScrollableContainerComponent,\n    BimplusInputTextFieldComponent,\n    BimplusAttachmentsComponent,\n    LinksToDocumentsComponent,\n    FormsModule,\n    ReactiveFormsModule,\n    AsyncPipe,\n  ],\n  providers: [\n    DatePipe,\n    BimplusObjectCommentsListService,\n    BimplusAttachmentsService,\n    { provide: BIMPLUS_ATTACHMENTS_CONFIG, useValue: config },\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusObjectCommentsListComponent\n  extends BimplusLocalizedWidgetComponent\n  implements OnInit, OnChanges {\n  hyperlinkForm: FormGroup;\n\n  @Input({ required: true }) api!: WebSdk.Api | null;\n  @Input() project: ProjectNavigatorProject | null = null;\n  @Input() wormholeSelector: string = \"localEmbeddedModalId\";\n  @Input() env: string = \"prod\";\n  @Input() attachmentLinkItems: WebSdk.AttachmentLink[] = []\n  @Input() inputBaseUrl: string = '';\n  protected readonly commentsList$ = new BehaviorSubject<WebSdk.CommentResponse[]>([]);\n  protected readonly loading = signal(false);\n  protected readonly attachmentsState = signal<Attachment[]>([]);\n  buttonRowItems: BimplusButtonRowItem[] = [];\n  hyperlinkButtonRowItems: BimplusButtonRowItem[] = [];\n  textAreaValue: string | null = null;\n  lastShownDate = '';\n  placeholder = '';\n  name = '';\n  readonly = false;\n  autoResizeTextarea = true;\n  minRows = 3;\n  maxRows = 10;\n  clearValue = false;\n  statusBarTitleMessage = this.translateService.instant('_Loading');\n\n  // attachment ids ready to map to concrete comment\n  newAttachmentIDs: string[] = []\n\n  isAddingHyperlink: boolean = false;\n\n  newCommentAttachments: NewAttachInfo[] = [];\n\n  private _rootObjectId = '';\n  private _userId = '';\n\n  @Input()\n  set rootObjectId(id: string) {\n    this._rootObjectId = id;\n  }\n\n  get rootObjectId(): string {\n    return this._rootObjectId;\n  }\n\n  @Input()\n  set userId(id: string) {\n    this._userId = id;\n  }\n\n  get userId(): string {\n    return this._userId;\n  }\n\n  constructor(\n    private readonly dialogService: DialogService,\n    translateService: TranslateService,\n    private readonly datePipe: DatePipe,\n    private readonly formBuilder: FormBuilder,\n    protected readonly bimplusAttachmentsService: BimplusAttachmentsService,\n    private readonly bimplusObjectCommentsListService: BimplusObjectCommentsListService,\n    private statusBarService: BimplusStatusBarService\n  ) {\n    super(translateService);\n\n    this.hyperlinkForm = this.formBuilder.group({\n      name: ['', []],\n      url: [\n        '',\n        [\n          Validators.required,\n          Validators.pattern(/^[^<>]*$/), // Do not allow < or >\n          Validators.pattern(/^(?!\\s*$).+/), // Do not allow all empty string, but allow text after spaces\n        ],\n      ],\n    });\n  }\n\n  isCreateButtonDisabled(): boolean {\n    return !(\n      this.textAreaValue ||\n      this.newAttachmentIDs?.length > 0 ||\n      this.getHyperlinks(this.rootObjectId)?.length > 0 ||\n      this.attachmentsState()?.length > 0\n    );\n  }\n\n  checkCreateButtonState() {\n    if (!this.buttonRowItems?.[0]) {\n      return;\n    }\n    this.buttonRowItems[0].disabled = this.isCreateButtonDisabled();\n  }\n\n  public ngOnInit(): void {\n    this.bimplusObjectCommentsListService.api = this.api!;\n    this.loadComments();\n    const submit: BimplusButtonRowItem[] = [\n      {\n        id: 'submit',\n        title: this.translateService.instant('_Add comment'),\n        tooltip: this.translateService.instant('_Add comment'),\n        disabled: this.isCreateButtonDisabled(),\n        buttonStyle: 'primary',\n      },\n    ];\n    this.placeholder = this.translateService.instant(\n      '_Place comment text here'\n    );\n    this.name = this.translateService.instant('comment');\n    this.buttonRowItems = submit;\n\n    this.hyperlinkButtonRowItems.push(\n      {\n        id: 'cancel-hyperlink',\n        title: this.translateService.instant('_Cancel'),\n        tooltip: this.translateService.instant('_Cancel'),\n        disabled: false,\n        buttonStyle: 'primary',\n      },\n      {\n        id: 'add-hyperlink',\n        title: this.translateService.instant('_Add hyperlink'),\n        tooltip: this.translateService.instant('_Add hyperlink'),\n        disabled: true,\n        buttonStyle: 'primary',\n      }\n    );\n\n    this.hyperlinkForm.statusChanges.subscribe((status) => {\n      this.hyperlinkButtonRowItems[1].disabled = status !== 'VALID';\n    });\n  }\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['rootObjectId'] && !changes['rootObjectId'].firstChange) {\n      this.lastShownDate = '';\n      this.loadComments();\n    }\n  }\n\n  protected onAttachmentsLinkChange(newAttachments: NewAttachInfo[]): void {\n    const newDecoratedAttachments: NewAttachInfo[] = newAttachments.map((attachment) => {\n      attachment.iconClass = 'fa fa-link';\n      attachment.iconTitle = this.translateService.instant('_Attachment_link');\n      attachment.deleteButtonTitle = this.translateService.instant('_Delete_attachmentlink');\n      return attachment;\n    });\n    const newCommentAttachments = this.newCommentAttachments.filter((attachment) => attachment?.type === 'Hyperlink');\n    this.newCommentAttachments = [...newCommentAttachments, ...newDecoratedAttachments];\n    this.newAttachmentIDs = newAttachments.map((attachment) => attachment.id);\n    this.checkCreateButtonState();\n  }\n\n\n  protected onAddAttachment(file: File): void {\n    const attachment = this.bimplusAttachmentsService.getAttachment(file);\n    this.attachmentsState.update(attachments => ([...attachments, attachment]));\n    this.checkCreateButtonState();\n  }\n\n  protected onDeleteAttachment(attachment: Attachment): void {\n    this.attachmentsState.update(attachments => attachments.filter(a => a !== attachment));\n    this.checkCreateButtonState();\n  }\n\n  /** Event on click attachment. */\n  protected onGetAttachment(attachment: Attachment): void {\n    this.bimplusObjectCommentsListService.downloadAttachment(attachment);\n  }\n\n  onTextareaValueChange(value: string) {\n    this.textAreaValue = value;\n    this.checkCreateButtonState();\n  }\n\n  handleActionCommentEvent(event: CommentOutputData) {\n    if (event.action === 'delete') {\n      const data = event.data as CommentData;\n      this.openDialogDeleteComment(data.commentId);\n    }\n  }\n\n  actionDialogClose(data: IDialogConfirmClose) {\n    this.dialogService.close(data);\n  }\n\n  openDialogDeleteComment(commentId: string) {\n    this.dialogService.open(BimplusOverlayDialogDeleteComponent, {\n      options: {\n        position: 'middle',\n        positionOptions: {},\n        overlayClickEnabled: false,\n        overlayVisibilityEnabled: true,\n        draggable: true,\n      },\n      data: {\n        title: this.translateService.instant(\n          '_Comment delete confirmation title'\n        ),\n        message: this.translateService.instant(\n          '_Comment delete confirmation message'\n        ),\n        acceptCallback: () => {\n          this.deleteComment(commentId);\n        },\n      },\n    });\n  }\n\n  isSameDate(date?: string): boolean {\n    if (!date) {\n      return false;\n    }\n    const shortDate = this.datePipe.transform(date, 'shortDate');\n    if (!shortDate) {\n      // Transformation date to shortDate failed\n      return false;\n    }\n    if (this.lastShownDate === shortDate) {\n      // Date is identical to the last shown date\n      return true;\n    }\n    // Valid date but not identical to last one\n    this.lastShownDate = shortDate;\n    return false;\n  }\n\n  buttonRowButtonClicked($event: BimplusButtonClickEvent) {\n    if ($event.id === 'submit') {\n      if (!this.api || !this.rootObjectId) return;\n      this.loading.set(true);\n\n      const data = {\n        text: this.textAreaValue,\n        objectId: this.rootObjectId,\n      };\n      const dataText = JSON.stringify(data);\n      this.statusBarService.setStatusBarData({ statusBarVisible: true, title: this.translateService.instant('_Creating new comment') });\n      this.bimplusObjectCommentsListService.postComments(this.rootObjectId, dataText, this.getHyperlinks(this.rootObjectId), this.attachmentsState(), this.newAttachmentIDs)\n        .pipe(switchMap(() => this.bimplusObjectCommentsListService.loadComments(this.rootObjectId)))\n        .subscribe({\n          next: (comments) => this.commentsList$.next(comments),\n          complete: () => {\n            this.attachmentsState.set([]);\n            this.newCommentAttachments = [];\n            this.attachmentLinkItems = [];\n            this.newAttachmentIDs = [];\n            this.textAreaValue = null;\n            this.clearValue = true;\n            this.buttonRowItems[0].disabled = true;\n            this.loading.set(false);\n            this.statusBarService.setStatusBarData({ statusBarVisible: false, title: '' });\n          }\n        });\n    }\n  }\n\n  hyperlinkButtonRowButtonClicked($event: BimplusButtonClickEvent) {\n    if ($event.id === 'add-hyperlink') {\n      this.addNewCommentHyperlink();\n    } else if ($event.id === 'cancel-hyperlink') {\n      this.hyperlinkForm.reset();\n      this.isAddingHyperlink = false;\n    }\n  }\n\n  addNewCommentHyperlink() {\n    if (!this.hyperlinkForm.valid) {\n      return;\n    }\n\n    let sanitizedUrl: string = this.hyperlinkForm.value['url'].trim();\n    if (!RegExp(/^http(s?):\\/\\//).exec(sanitizedUrl)) {\n      sanitizedUrl = 'https://' + sanitizedUrl;\n    }\n    let sanitizedName = this.hyperlinkForm.value['name']?.trim() ?? '';\n    if (sanitizedName === '') {\n      sanitizedName = sanitizedUrl;\n    }\n    const newItem: NewAttachInfo = {\n      id: '',\n      type: 'Hyperlink',\n      nameShort: sanitizedName,\n      name: sanitizedName,\n      url: sanitizedUrl,\n      iconClass: 'fa fa-link',\n      iconTitle: this.translateService.instant('_Hyperlink'),\n      deleteButtonTitle: this.translateService.instant('_Remove hyperlink'),\n    };\n    this.newCommentAttachments.push(newItem);\n    this.hyperlinkForm.reset();\n    this.isAddingHyperlink = false;\n    this.checkCreateButtonState();\n  }\n\n  deleteComment(commentId: string) {\n    this.statusBarService.setStatusBarData({ statusBarVisible: true, title: this.translateService.instant('_Deleting the comment') });\n    this.bimplusObjectCommentsListService.deleteComment(commentId)\n      .subscribe(() => this.loadComments())\n  }\n\n  addHyperlinkIconClicked() {\n    this.isAddingHyperlink = !this.isAddingHyperlink;\n  }\n\n  addHyperlinkIconKeypress(event: KeyboardEvent) {\n    if (event.key === 'Enter' || event.key === ' ') {\n      this.addHyperlinkIconClicked();\n    }\n  }\n\n  removeNewCommentAttachment(link: NewAttachInfo) {\n    this.newCommentAttachments = this.newCommentAttachments.filter(\n      (commentLink) => commentLink.id !== link.id\n    );\n    if (link?.type !== 'Hyperlink') {\n      this.attachmentLinkItems = this.attachmentLinkItems.filter(\n        (attachmentLink) => attachmentLink.id !== link.id\n      );\n      this.newAttachmentIDs = this.newAttachmentIDs.filter(id => id !== link.id)\n    }\n    this.checkCreateButtonState();\n  }\n\n  removeNewCommentAttachmentKeypress(\n    event: KeyboardEvent,\n    link: NewAttachInfo\n  ) {\n    if (event.key === 'Enter' || event.key === ' ') {\n      this.removeNewCommentAttachment(link);\n    }\n  }\n\n  isActUserAuthor(item: WebSdk.CommentResponse) {\n    return item.author?.id === this.userId;\n  }\n\n  displayName(item: WebSdk.CommentResponse): string {\n    return item.author?.displayname ? item.author?.displayname : '';\n  }\n\n  formatDate(date: string): string {\n    const locale = window.navigator.language;\n    if (locale.includes('en')) {\n      const unformattedDate = new Date(date);\n      return unformattedDate.getMonth() + '/' + unformattedDate.getDate() + '/' + unformattedDate.getFullYear();\n    }\n    return new Intl.DateTimeFormat(undefined, { dateStyle: \"short\" }).format(new Date(date));\n  }\n\n  clearTextareaValue() {\n    return this.clearValue;\n  }\n\n\n  private loadComments() {\n    this.statusBarService.setStatusBarData({ statusBarVisible: true, title: this.translateService.instant('_Loading comments list') });\n    this.loading.set(true);\n    this.bimplusObjectCommentsListService\n      .loadComments(this.rootObjectId)\n      .subscribe({\n        next: comments => {\n          this.commentsList$.next(comments)\n        },\n\n        complete: () => {\n          this.loading.set(false);\n          this.statusBarService.setStatusBarData({ statusBarVisible: false, title: '' });\n        }\n      })\n  }\n\n  private getHyperlinks(objectId: string): Partial<WebSdk.Hyperlink>[] {\n    return this.newCommentAttachments\n      .filter(h => h?.type === 'Hyperlink') // Filter objects with type 'Hyperlink'\n      .map((h) => ({\n        ...h,\n        objectId,\n      }));\n  }\n\n  onEnterKeyPressedInHyperlinkForm() {\n    this.addNewCommentHyperlink();\n  }\n}\n","@if (!loading()) {\n<div class=\"comment-tab-container\">\n  <div class=\"textarea-container\">\n    <lib-bimplus-textarea\n      (textAreaValueChange)=\"onTextareaValueChange($event)\"\n      [placeholder]=\"placeholder\"\n      [name]=\"name\"\n      [readonly]=\"readonly\"\n      [activeAutoResizeTextarea]=\"true\"\n      [minRows]=\"minRows\"\n      [maxRows]=\"maxRows\"\n      [clearValue]=\"clearTextareaValue()\"\n    ></lib-bimplus-textarea>\n  </div>\n\n  <lib-bimplus-attachments\n    #attachments\n    listOnly\n    [class]=\"['new-comment-attachments']\"\n    [attachments]=\"attachmentsState()\"\n    (addAttachment)=\"onAddAttachment($event)\"\n    (deleteAttachment)=\"onDeleteAttachment($event)\"\n  />\n\n  <lib-links-to-documents \n    #linksToDocuments\n    listOnly\n    hideAttachmentSize\n    showEmptyMessage=\"false\" \n    [attachments]=\"attachmentLinkItems\"\n    (attachmentsLinkChange)=\"onAttachmentsLinkChange($event)\"\n    [api]=\"api\"        \n    [project]=\"project\"\n    [rootObjectId]=''\n    [canCreateAttachmentLink]=\"true\"\n    [canDeleteAttachmentLink]=\"true\"\n    [wormholeSelector]=\"wormholeSelector\"\n    [env]=\"env\"\n    [inputBaseUrl]=\"inputBaseUrl\"\n  />\n\n  @if (newCommentAttachments.length > 0) {\n    <div class=\"new-comment-attachment-list\">\n      <div *ngFor=\"let item of newCommentAttachments\" \n        [ngClass]=\"'new-comment-attachment ' + item.type\"\n        [title]=\"item.type === 'Hyperlink' ? item.url: item.name\">\n        <div \n          [ngClass]=\"'icon-small ' + item.type\"          \n          [title]=\"item.type === 'Hyperlink' ? item.url: item.name\">\n        </div>\n        <div class=\"text\">{{ item.name }} </div>      \n      <span class=\"cancel-icon\" title=\"{{ item.deleteButtonTitle}}\" (click)=\"removeNewCommentAttachment(item)\" (keydown)=\"removeNewCommentAttachmentKeypress($event, item)\"></span>\n      </div>    \n    </div>\n  }\n\n  @if (isAddingHyperlink) {\n      <form [formGroup]=\"hyperlinkForm\" class=\"hyperlink-input-form\">\n        <div class=\"hyperlink-input-row\">\n          <div class=\"link-icon icon-next-to-text-input\"></div>\n          <lib-bimplus-input-text-field class=\"flex-grow\" formControlName=\"name\" placeholder=\"{{ '_Name' | translate }}\" (enterKeyPressed)=\"onEnterKeyPressedInHyperlinkForm()\"/>\n        </div>\n        <div class=\"hyperlink-input-row\">\n          <div class=\"icon-next-to-text-input\"></div>\n          <lib-bimplus-input-text-field class=\"flex-grow\" formControlName=\"url\" placeholder=\"{{ '_URL' | translate }}\" (enterKeyPressed)=\"onEnterKeyPressedInHyperlinkForm()\"/>\n        </div>\n\n        <lib-bimplus-buttons-row [items]=\"hyperlinkButtonRowItems\" (buttonClicked)=\"hyperlinkButtonRowButtonClicked($event)\"/>\n      </form>\n  }\n\n  <div class=\"comments-tab-attachments-section\">\n    <div class=\"comments-attachments-list\">\n      <div class=\"tab-attachments icon attachments-icon hidden\"></div>\n      <div class=\"attachment-icon icon-small interactive\" [title]=\"'_Add attachment' | translate\" (click)=\"attachments.open()\" (keydown)=\"attachments.open()\"></div>\n      <div class=\"link-icon icon-small interactive\" [title]=\"'_Add hyperlink' | translate\" (click)=\"addHyperlinkIconClicked()\" (keydown)=\"addHyperlinkIconKeypress($event)\"></div>\n      <div class=\"attachment-link-icon icon-small interactive\" [title]=\"'_Add_attachment_link' | translate\" (click)=\"linksToDocuments.createAttachmentLink(api!)\" (keydown)=\"linksToDocuments.createAttachmentLink(api!)\"></div>\n      <div class=\"tab-attachmentlinks icon attachments-icon hidden\"></div>\n    </div>\n    <div class=\"add-comment\">\n      <lib-bimplus-buttons-row\n        [items]=\"buttonRowItems\"\n        (buttonClicked)=\"buttonRowButtonClicked($event)\" />\n    </div>\n  </div>\n\n  <div class=\"comments-separator\"></div>\n\n  <div class=\"scrollable-content-container\">\n    <lib-bimplus-scrollable-container>\n      @if ((commentsList$ | async)?.length === 0) {\n        <div class=\"no-comments-found\">\n          {{ '_No comments found' | translate }}\n        </div>\n      } @else {\n        @for (item of commentsList$ | async; track item) {\n          @if(item.createdAt && !isSameDate(item.createdAt)) {\n            <div class=\"comment-list-date\">\n              {{formatDate(item.createdAt)}}\n            </div>\n          }\n          <lib-bimplus-comment\n            (outputActionCommentEvent)=\"handleActionCommentEvent($event)\"\n            (getAttachment)=\"onGetAttachment($event)\"\n            [message]=\"item.text\"\n            [api]=\"api\"\n            [date]=\"item.createdAt ? item.createdAt : ''\"\n            action=\"delete\"\n            [commentId]=\"item.id\"\n            [attachments]=\"item.attachments ?? []\"\n            [attachmentLinkItems]=\"item.attachmentLinks ?? []\"\n            [hyperlinks]=\"item.hyperlinks\"\n            [isActUserAuthor]=\"isActUserAuthor(item)\"\n            [displayname]=\"displayName(item)\">\n          </lib-bimplus-comment>\n        }\n      }\n    </lib-bimplus-scrollable-container>\n  </div>\n</div>\n}\n","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\nimport { BimplusStatusBarService } from './bimplus-status-bar.service';\nimport { StatusBarData } from './statusBar';\n\n@Component({\n  selector: 'lib-bimplus-status-bar',\n  templateUrl: './bimplus-status-bar.component.html',\n  styleUrls: ['./bimplus-status-bar.component.less'],\n  encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class BimplusStatusBarComponent implements OnInit {\n\n  private _title = '';\n  get title(): string {\n    return this._title;\n  }\n\n  constructor(private statusBarService: BimplusStatusBarService) { }\n\n  ngOnInit(): void {\n    this.statusBarService.statusBarDataSubscription.subscribe((data: StatusBarData) => {\n      this._title = data.title;\n    });\n  }\n\n  closeClick(): void {\n    this.statusBarService.setStatusBarData({\n      title: '',\n      statusBarVisible: false\n    });\n  }\n\n  closeKeyDown($event: KeyboardEvent) {\n    if ($event.key === 'Enter' || $event.key === 'Escape') {\n      this.closeClick();\n    }\n  }\n\n}\n","<div\n  class=\"statusBar-container\">\n  <span \n    class=\"status-bar-text\"\n    [innerHTML]=\"title\">\n  </span>\n  <div\n    class=\"close-button\"\n    title=\"Close\"\n    (click)=\"closeClick()\"\n    (keydown)=\"closeKeyDown($event)\">\n  </div>\n</div>"]}