@trudb/tru-common-lib 0.0.725 → 0.0.728
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{esm2020 → esm2022}/lib/assets/tru-icon-module.mjs +32 -32
- package/{esm2020 → esm2022}/lib/assets/tru-search-icon-module.mjs +36 -36
- package/{esm2020 → esm2022}/lib/base-classes/tru-component-config-base.mjs +3 -3
- package/{esm2020 → esm2022}/lib/base-classes/tru-control-component-config-base.mjs +3 -3
- package/{esm2020 → esm2022}/lib/base-classes/tru-edit-control-base.mjs +17 -17
- package/esm2022/lib/base-classes/tru-edit-control-config-base.mjs +6 -0
- package/{esm2020 → esm2022}/lib/base-classes/tru-edit-parent-control-config-base.mjs +3 -3
- package/{esm2020 → esm2022}/lib/base-classes/tru-edit-pkey-control-config-base.mjs +3 -3
- package/esm2022/lib/base-classes/tru-entity-base.mjs +14 -0
- package/esm2022/lib/base-classes/tru-list-control-config-base.mjs +6 -0
- package/{esm2020 → esm2022}/lib/base-classes/tru-property-config-base.mjs +14 -15
- package/{esm2020 → esm2022}/lib/base-classes/tru-search-config-base.mjs +3 -3
- package/esm2022/lib/base-classes/tru-search-control-base.mjs +45 -0
- package/esm2022/lib/base-classes/tru-search-control-config-base.mjs +5 -0
- package/esm2022/lib/base-classes/tru-search-control-range-base.mjs +45 -0
- package/esm2022/lib/base-classes/tru-table-config-base.mjs +12 -0
- package/{esm2020 → esm2022}/lib/base-views/detail/tru-detail-view-base-module.mjs +19 -19
- package/esm2022/lib/base-views/detail/tru-detail-view-base.mjs +83 -0
- package/esm2022/lib/base-views/search/services/tru-search-view-control-event-handler.mjs +25 -0
- package/esm2022/lib/base-views/search/services/tru-search-view-event-handler.mjs +25 -0
- package/{esm2020 → esm2022}/lib/base-views/search/tru-search-view-base-module.mjs +19 -19
- package/esm2022/lib/base-views/search/tru-search-view-base.mjs +68 -0
- package/{esm2020 → esm2022}/lib/base-views/search-result/tru-search-result-view-base-module.mjs +19 -19
- package/esm2022/lib/base-views/search-result/tru-search-result-view-base.mjs +54 -0
- package/{esm2020 → esm2022}/lib/classes/tru-choice.mjs +2 -2
- package/esm2022/lib/classes/tru-context-filter-choice.mjs +11 -0
- package/esm2022/lib/classes/tru-context-filter.mjs +16 -0
- package/esm2022/lib/classes/tru-data-change-parser.mjs +287 -0
- package/esm2022/lib/classes/tru-data-change.mjs +5 -0
- package/{esm2020 → esm2022}/lib/classes/tru-formula-eval.mjs +156 -156
- package/esm2022/lib/classes/tru-merge-data-set.mjs +11 -0
- package/esm2022/lib/classes/tru-merge-data.mjs +20 -0
- package/{esm2020 → esm2022}/lib/classes/tru-name-value.mjs +2 -2
- package/esm2022/lib/classes/tru-predicate.mjs +47 -0
- package/{esm2020 → esm2022}/lib/classes/tru-property-config-cloud-file.mjs +4 -4
- package/esm2022/lib/classes/tru-property-config-date.mjs +7 -0
- package/esm2022/lib/classes/tru-property-config-decimal.mjs +9 -0
- package/{esm2020 → esm2022}/lib/classes/tru-property-config-file.mjs +6 -8
- package/esm2022/lib/classes/tru-property-config-foreign-key.mjs +8 -0
- package/esm2022/lib/classes/tru-property-config-integer.mjs +7 -0
- package/esm2022/lib/classes/tru-property-config-password.mjs +6 -0
- package/esm2022/lib/classes/tru-property-config-percentage.mjs +7 -0
- package/esm2022/lib/classes/tru-property-config-scientific.mjs +7 -0
- package/{esm2020 → esm2022}/lib/classes/tru-property-config-text-choices.mjs +6 -8
- package/{esm2020 → esm2022}/lib/classes/tru-property-config-text.mjs +8 -10
- package/{esm2020 → esm2022}/lib/classes/tru-property-config-usa-address.mjs +6 -8
- package/{esm2020 → esm2022}/lib/classes/tru-property-config-zip-code.mjs +6 -8
- package/esm2022/lib/classes/tru-query-predicate-manager.mjs +49 -0
- package/{esm2020 → esm2022}/lib/components/confirm-dialog/tru-confirm-dialog-module.mjs +20 -20
- package/esm2022/lib/components/confirm-dialog/tru-confirm-dialog.mjs +59 -0
- package/{esm2020 → esm2022}/lib/components/data-grid/classes/tru-data-grid-config.mjs +1 -1
- package/{esm2020 → esm2022}/lib/components/data-grid/enums/tru-data-grid-types.mjs +6 -6
- package/esm2022/lib/components/data-grid/overlays/tru-data-grid-loading-overlay/tru-data-grid-loading-overlay.mjs +40 -0
- package/esm2022/lib/components/data-grid/overlays/tru-data-grid-no-rows-overlay/tru-data-grid-no-rows-overlay.mjs +27 -0
- package/esm2022/lib/components/data-grid/tru-data-grid-module.mjs +67 -0
- package/esm2022/lib/components/data-grid/tru-data-grid.mjs +382 -0
- package/{esm2020 → esm2022}/lib/components/desktop/classes/tru-desktop-title.mjs +2 -2
- package/esm2022/lib/components/desktop/classes/tru-desktop-view-config.mjs +21 -0
- package/{esm2020 → esm2022}/lib/components/desktop/directives/resizable/tru-desktop-resizable-module.mjs +19 -19
- package/esm2022/lib/components/desktop/directives/resizable/tru-desktop-resizable.mjs +122 -0
- package/{esm2020 → esm2022}/lib/components/desktop/menubar/tru-desktop-menubar-module.mjs +56 -56
- package/esm2022/lib/components/desktop/menubar/tru-desktop-menubar.mjs +36 -0
- package/esm2022/lib/components/desktop/services/tru-desktop-manager.mjs +86 -0
- package/esm2022/lib/components/desktop/services/tru-desktop-service.mjs +108 -0
- package/esm2022/lib/components/desktop/services/tru-window-action-event-handler.mjs +25 -0
- package/esm2022/lib/components/desktop/services/tru-window-event-args.mjs +24 -0
- package/esm2022/lib/components/desktop/services/tru-window-event-handler.mjs +42 -0
- package/{esm2020 → esm2022}/lib/components/desktop/statusbar/tru-desktop-statusbar-module.mjs +19 -19
- package/esm2022/lib/components/desktop/statusbar/tru-desktop-statusbar.mjs +20 -0
- package/{esm2020 → esm2022}/lib/components/desktop/taskbar/tru-desktop-taskbar-module.mjs +21 -21
- package/esm2022/lib/components/desktop/taskbar/tru-desktop-taskbar.mjs +41 -0
- package/{esm2020 → esm2022}/lib/components/desktop/tru-desktop-module.mjs +72 -72
- package/esm2022/lib/components/desktop/tru-desktop.mjs +737 -0
- package/{esm2020 → esm2022}/lib/components/desktop/view/tru-desktop-view-module.mjs +19 -19
- package/esm2022/lib/components/desktop/view/tru-desktop-view.mjs +29 -0
- package/{esm2020 → esm2022}/lib/components/desktop/viewport/tru-desktop-viewport-module.mjs +20 -20
- package/esm2022/lib/components/desktop/viewport/tru-desktop-viewport.mjs +117 -0
- package/{esm2020 → esm2022}/lib/components/desktop/window/tru-desktop-window-module.mjs +58 -58
- package/esm2022/lib/components/desktop/window/tru-desktop-window.mjs +467 -0
- package/{esm2020 → esm2022}/lib/components/export-dialog/tru-export-dialog-module.mjs +20 -20
- package/esm2022/lib/components/export-dialog/tru-export-dialog.mjs +61 -0
- package/{esm2020 → esm2022}/lib/components/layout/column/tru-column-module.mjs +19 -19
- package/{esm2020 → esm2022}/lib/components/layout/column/tru-column.mjs +12 -12
- package/{esm2020 → esm2022}/lib/components/layout/form/tru-form-module.mjs +19 -19
- package/esm2022/lib/components/layout/form/tru-form.mjs +35 -0
- package/{esm2020 → esm2022}/lib/components/layout/group-box/tru-group-box-module.mjs +19 -19
- package/{esm2020 → esm2022}/lib/components/layout/group-box/tru-group-box.mjs +12 -12
- package/{esm2020 → esm2022}/lib/components/layout/row/tru-row-module.mjs +19 -19
- package/{esm2020 → esm2022}/lib/components/layout/row/tru-row.mjs +12 -12
- package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-config.mjs +7 -7
- package/esm2022/lib/components/login/classes/tru-auth-jwt-strategy.mjs +63 -0
- package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-login-request.mjs +5 -3
- package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-logout-request.mjs +4 -3
- package/esm2022/lib/components/login/classes/tru-auth-session-strategy.mjs +21 -0
- package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-strategy-provider.mjs +19 -19
- package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-token.mjs +11 -8
- package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-user-request.mjs +4 -3
- package/esm2022/lib/components/login/services/tru-auth-cache.mjs +20 -0
- package/esm2022/lib/components/login/services/tru-auth-interceptor.mjs +46 -0
- package/esm2022/lib/components/login/services/tru-auth.mjs +87 -0
- package/esm2022/lib/components/login/tru-login-module.mjs +46 -0
- package/esm2022/lib/components/login/tru-login.mjs +59 -0
- package/{esm2020 → esm2022}/lib/components/password-dialog/tru-password-dialog-module.mjs +20 -20
- package/esm2022/lib/components/password-dialog/tru-password-dialog.mjs +53 -0
- package/{esm2020 → esm2022}/lib/components/toolbar/button/tru-toolbar-button-module.mjs +32 -32
- package/esm2022/lib/components/toolbar/button/tru-toolbar-button.mjs +40 -0
- package/{esm2020 → esm2022}/lib/components/toolbar/classes/tru-toolbar-dropdown-option.mjs +1 -1
- package/{esm2020 → esm2022}/lib/components/toolbar/context-filter/tru-toolbar-context-filter-module.mjs +44 -44
- package/esm2022/lib/components/toolbar/context-filter/tru-toolbar-context-filter.mjs +26 -0
- package/{esm2020 → esm2022}/lib/components/toolbar/dropdown/tru-toolbar-dropdown-module.mjs +36 -36
- package/esm2022/lib/components/toolbar/dropdown/tru-toolbar-dropdown.mjs +45 -0
- package/{esm2020 → esm2022}/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button-module.mjs +19 -19
- package/esm2022/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button.mjs +17 -0
- package/{esm2020 → esm2022}/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item-module.mjs +19 -19
- package/esm2022/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item.mjs +26 -0
- package/{esm2020 → esm2022}/lib/components/toolbar/menu/tru-toolbar-menu-module.mjs +32 -32
- package/esm2022/lib/components/toolbar/menu/tru-toolbar-menu.mjs +33 -0
- package/{esm2020 → esm2022}/lib/components/toolbar/separator/tru-toolbar-separator-module.mjs +19 -19
- package/{esm2020 → esm2022}/lib/components/toolbar/separator/tru-toolbar-separator.mjs +12 -12
- package/{esm2020 → esm2022}/lib/components/toolbar/text/tru-toolbar-text-module.mjs +32 -32
- package/esm2022/lib/components/toolbar/text/tru-toolbar-text.mjs +27 -0
- package/{esm2020 → esm2022}/lib/components/toolbar/tru-toolbar-module.mjs +73 -73
- package/{esm2020 → esm2022}/lib/components/toolbar/tru-toolbar.mjs +20 -21
- package/{esm2020 → esm2022}/lib/components/toolbar/user-profile/tru-toolbar-user-profile-module.mjs +36 -36
- package/esm2022/lib/components/toolbar/user-profile/tru-toolbar-user-profile.mjs +38 -0
- package/esm2022/lib/components/validation-dialog/tru-validation-dialog-config.mjs +25 -0
- package/{esm2020 → esm2022}/lib/components/validation-dialog/tru-validation-dialog-module.mjs +19 -19
- package/esm2022/lib/components/validation-dialog/tru-validation-dialog.mjs +83 -0
- package/{esm2020 → esm2022}/lib/directives/breeze-validator/tru-breeze-validator-module.mjs +19 -19
- package/esm2022/lib/directives/breeze-validator/tru-breeze-validator.mjs +107 -0
- package/{esm2020 → esm2022}/lib/directives/search-panel-position-manager/tru-search-panel-position-manager-module.mjs +19 -19
- package/esm2022/lib/directives/search-panel-position-manager/tru-search-panel-position-manager.mjs +155 -0
- package/{esm2020 → esm2022}/lib/directives/select-panel/tru-mat-select-panel-module.mjs +19 -19
- package/esm2022/lib/directives/select-panel/tru-mat-select-panel.mjs +69 -0
- package/{esm2020 → esm2022}/lib/interfaces/tru-value.mjs +1 -1
- package/{esm2020 → esm2022}/lib/material.module.mjs +192 -192
- package/esm2022/lib/services/tru-app-environment.mjs +113 -0
- package/esm2022/lib/services/tru-breeze-context-factory.mjs +84 -0
- package/esm2022/lib/services/tru-breeze-metadata-provider.mjs +21 -0
- package/esm2022/lib/services/tru-component-lookup.mjs +23 -0
- package/esm2022/lib/services/tru-connection-hub.mjs +52 -0
- package/esm2022/lib/services/tru-context-filters.mjs +28 -0
- package/esm2022/lib/services/tru-data-context.mjs +263 -0
- package/esm2022/lib/services/tru-entity-accessor.mjs +292 -0
- package/esm2022/lib/services/tru-model-property-lookup.mjs +21 -0
- package/{esm2020 → esm2022}/lib/services/tru-predicate-map.mjs +11 -11
- package/esm2022/lib/services/tru-search-result-view-manager.mjs +18 -0
- package/esm2022/lib/services/tru-sort.mjs +113 -0
- package/esm2022/lib/services/tru-table-registry.mjs +15 -0
- package/esm2022/lib/services/tru-text-manager.mjs +148 -0
- package/esm2022/lib/services/tru-ui-notification.mjs +107 -0
- package/esm2022/lib/services/tru-user.mjs +62 -0
- package/esm2022/lib/services/tru-util.mjs +76 -0
- package/{esm2020 → esm2022}/lib/tru-common-module.mjs +16 -16
- package/{esm2020 → esm2022}/public-api.mjs +144 -144
- package/{esm2020 → esm2022}/trudb-tru-common-lib.mjs +4 -4
- package/fesm2022/trudb-tru-common-lib.mjs +6932 -0
- package/fesm2022/trudb-tru-common-lib.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/assets/tru-icon-module.d.ts +11 -11
- package/lib/assets/tru-search-icon-module.d.ts +11 -11
- package/lib/base-classes/tru-component-config-base.d.ts +3 -3
- package/lib/base-classes/tru-control-component-config-base.d.ts +20 -20
- package/lib/base-classes/tru-edit-control-base.d.ts +10 -10
- package/lib/base-classes/tru-edit-control-config-base.d.ts +21 -21
- package/lib/base-classes/tru-edit-parent-control-config-base.d.ts +9 -9
- package/lib/base-classes/tru-edit-pkey-control-config-base.d.ts +11 -11
- package/lib/base-classes/tru-entity-base.d.ts +14 -14
- package/lib/base-classes/tru-list-control-config-base.d.ts +21 -21
- package/lib/base-classes/tru-property-config-base.d.ts +13 -13
- package/lib/base-classes/tru-search-config-base.d.ts +9 -9
- package/lib/base-classes/tru-search-control-base.d.ts +21 -21
- package/lib/base-classes/tru-search-control-config-base.d.ts +13 -13
- package/lib/base-classes/tru-search-control-range-base.d.ts +25 -25
- package/lib/base-classes/tru-table-config-base.d.ts +11 -11
- package/lib/base-views/detail/tru-detail-view-base-module.d.ts +9 -9
- package/lib/base-views/detail/tru-detail-view-base.d.ts +32 -32
- package/lib/base-views/search/services/tru-search-view-control-event-handler.d.ts +12 -12
- package/lib/base-views/search/services/tru-search-view-event-handler.d.ts +11 -11
- package/lib/base-views/search/tru-search-view-base-module.d.ts +9 -9
- package/lib/base-views/search/tru-search-view-base.d.ts +36 -36
- package/lib/base-views/search-result/tru-search-result-view-base-module.d.ts +9 -9
- package/lib/base-views/search-result/tru-search-result-view-base.d.ts +25 -25
- package/lib/classes/tru-choice.d.ts +8 -8
- package/lib/classes/tru-context-filter-choice.d.ts +6 -6
- package/lib/classes/tru-context-filter.d.ts +10 -10
- package/lib/classes/tru-data-change-parser.d.ts +33 -33
- package/lib/classes/tru-data-change.d.ts +4 -4
- package/lib/classes/tru-formula-eval.d.ts +31 -31
- package/lib/classes/tru-merge-data-set.d.ts +7 -7
- package/lib/classes/tru-merge-data.d.ts +9 -9
- package/lib/classes/tru-name-value.d.ts +9 -9
- package/lib/classes/tru-predicate.d.ts +8 -8
- package/lib/classes/tru-property-config-cloud-file.d.ts +4 -4
- package/lib/classes/tru-property-config-date.d.ts +6 -6
- package/lib/classes/tru-property-config-decimal.d.ts +8 -8
- package/lib/classes/tru-property-config-file.d.ts +5 -5
- package/lib/classes/tru-property-config-foreign-key.d.ts +7 -7
- package/lib/classes/tru-property-config-integer.d.ts +6 -6
- package/lib/classes/tru-property-config-password.d.ts +5 -5
- package/lib/classes/tru-property-config-percentage.d.ts +6 -6
- package/lib/classes/tru-property-config-scientific.d.ts +6 -6
- package/lib/classes/tru-property-config-text-choices.d.ts +5 -5
- package/lib/classes/tru-property-config-text.d.ts +7 -7
- package/lib/classes/tru-property-config-usa-address.d.ts +5 -5
- package/lib/classes/tru-property-config-zip-code.d.ts +5 -5
- package/lib/classes/tru-query-predicate-manager.d.ts +26 -26
- package/lib/components/confirm-dialog/tru-confirm-dialog-module.d.ts +10 -10
- package/lib/components/confirm-dialog/tru-confirm-dialog.d.ts +28 -28
- package/lib/components/data-grid/classes/tru-data-grid-config.d.ts +7 -7
- package/lib/components/data-grid/enums/tru-data-grid-types.d.ts +5 -5
- package/lib/components/data-grid/overlays/tru-data-grid-loading-overlay/tru-data-grid-loading-overlay.d.ts +13 -13
- package/lib/components/data-grid/overlays/tru-data-grid-no-rows-overlay/tru-data-grid-no-rows-overlay.d.ts +13 -13
- package/lib/components/data-grid/tru-data-grid-module.d.ts +15 -15
- package/lib/components/data-grid/tru-data-grid.d.ts +67 -67
- package/lib/components/desktop/classes/tru-desktop-title.d.ts +4 -4
- package/lib/components/desktop/classes/tru-desktop-view-config.d.ts +16 -16
- package/lib/components/desktop/directives/resizable/tru-desktop-resizable-module.d.ts +9 -9
- package/lib/components/desktop/directives/resizable/tru-desktop-resizable.d.ts +32 -32
- package/lib/components/desktop/menubar/tru-desktop-menubar-module.d.ts +17 -17
- package/lib/components/desktop/menubar/tru-desktop-menubar.d.ts +15 -15
- package/lib/components/desktop/services/tru-desktop-manager.d.ts +33 -33
- package/lib/components/desktop/services/tru-desktop-service.d.ts +95 -95
- package/lib/components/desktop/services/tru-window-action-event-handler.d.ts +12 -12
- package/lib/components/desktop/services/tru-window-event-args.d.ts +17 -17
- package/lib/components/desktop/services/tru-window-event-handler.d.ts +20 -20
- package/lib/components/desktop/statusbar/tru-desktop-statusbar-module.d.ts +9 -9
- package/lib/components/desktop/statusbar/tru-desktop-statusbar.d.ts +10 -10
- package/lib/components/desktop/taskbar/tru-desktop-taskbar-module.d.ts +11 -11
- package/lib/components/desktop/taskbar/tru-desktop-taskbar.d.ts +15 -15
- package/lib/components/desktop/tru-desktop-module.d.ts +20 -20
- package/lib/components/desktop/tru-desktop.d.ts +337 -337
- package/lib/components/desktop/view/tru-desktop-view-module.d.ts +9 -9
- package/lib/components/desktop/view/tru-desktop-view.d.ts +14 -14
- package/lib/components/desktop/viewport/tru-desktop-viewport-module.d.ts +10 -10
- package/lib/components/desktop/viewport/tru-desktop-viewport.d.ts +48 -48
- package/lib/components/desktop/window/tru-desktop-window-module.d.ts +17 -17
- package/lib/components/desktop/window/tru-desktop-window.d.ts +189 -189
- package/lib/components/export-dialog/tru-export-dialog-module.d.ts +10 -10
- package/lib/components/export-dialog/tru-export-dialog.d.ts +26 -26
- package/lib/components/layout/column/tru-column-module.d.ts +9 -9
- package/lib/components/layout/column/tru-column.d.ts +6 -6
- package/lib/components/layout/form/tru-form-module.d.ts +9 -9
- package/lib/components/layout/form/tru-form.d.ts +10 -10
- package/lib/components/layout/group-box/tru-group-box-module.d.ts +9 -9
- package/lib/components/layout/group-box/tru-group-box.d.ts +6 -6
- package/lib/components/layout/row/tru-row-module.d.ts +9 -9
- package/lib/components/layout/row/tru-row.d.ts +6 -6
- package/lib/components/login/classes/tru-auth-config.d.ts +16 -16
- package/lib/components/login/classes/tru-auth-jwt-strategy.d.ts +15 -15
- package/lib/components/login/classes/tru-auth-login-request.d.ts +4 -4
- package/lib/components/login/classes/tru-auth-logout-request.d.ts +3 -3
- package/lib/components/login/classes/tru-auth-session-strategy.d.ts +13 -13
- package/lib/components/login/classes/tru-auth-strategy-provider.d.ts +9 -9
- package/lib/components/login/classes/tru-auth-token.d.ts +6 -6
- package/lib/components/login/classes/tru-auth-user-request.d.ts +3 -3
- package/lib/components/login/services/tru-auth-cache.d.ts +11 -11
- package/lib/components/login/services/tru-auth-interceptor.d.ts +16 -16
- package/lib/components/login/services/tru-auth.d.ts +29 -29
- package/lib/components/login/tru-login-module.d.ts +11 -11
- package/lib/components/login/tru-login.d.ts +21 -21
- package/lib/components/password-dialog/tru-password-dialog-module.d.ts +10 -10
- package/lib/components/password-dialog/tru-password-dialog.d.ts +24 -23
- package/lib/components/toolbar/button/tru-toolbar-button-module.d.ts +11 -11
- package/lib/components/toolbar/button/tru-toolbar-button.d.ts +16 -16
- package/lib/components/toolbar/classes/tru-toolbar-dropdown-option.d.ts +4 -4
- package/lib/components/toolbar/context-filter/tru-toolbar-context-filter-module.d.ts +14 -14
- package/lib/components/toolbar/context-filter/tru-toolbar-context-filter.d.ts +13 -13
- package/lib/components/toolbar/dropdown/tru-toolbar-dropdown-module.d.ts +12 -12
- package/lib/components/toolbar/dropdown/tru-toolbar-dropdown.d.ts +18 -18
- package/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button-module.d.ts +9 -9
- package/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button.d.ts +7 -7
- package/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item-module.d.ts +9 -9
- package/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item.d.ts +8 -8
- package/lib/components/toolbar/menu/tru-toolbar-menu-module.d.ts +11 -11
- package/lib/components/toolbar/menu/tru-toolbar-menu.d.ts +10 -10
- package/lib/components/toolbar/separator/tru-toolbar-separator-module.d.ts +9 -9
- package/lib/components/toolbar/separator/tru-toolbar-separator.d.ts +6 -6
- package/lib/components/toolbar/text/tru-toolbar-text-module.d.ts +11 -11
- package/lib/components/toolbar/text/tru-toolbar-text.d.ts +12 -12
- package/lib/components/toolbar/tru-toolbar-module.d.ts +16 -16
- package/lib/components/toolbar/tru-toolbar.d.ts +9 -9
- package/lib/components/toolbar/user-profile/tru-toolbar-user-profile-module.d.ts +12 -12
- package/lib/components/toolbar/user-profile/tru-toolbar-user-profile.d.ts +17 -17
- package/lib/components/validation-dialog/tru-validation-dialog-config.d.ts +13 -13
- package/lib/components/validation-dialog/tru-validation-dialog-module.d.ts +9 -9
- package/lib/components/validation-dialog/tru-validation-dialog.d.ts +20 -20
- package/lib/directives/breeze-validator/tru-breeze-validator-module.d.ts +9 -9
- package/lib/directives/breeze-validator/tru-breeze-validator.d.ts +27 -27
- package/lib/directives/search-panel-position-manager/tru-search-panel-position-manager-module.d.ts +9 -9
- package/lib/directives/search-panel-position-manager/tru-search-panel-position-manager.d.ts +40 -40
- package/lib/directives/select-panel/tru-mat-select-panel-module.d.ts +9 -9
- package/lib/directives/select-panel/tru-mat-select-panel.d.ts +17 -17
- package/lib/interfaces/tru-value.d.ts +6 -6
- package/lib/material.module.d.ts +50 -50
- package/lib/services/tru-app-environment.d.ts +57 -57
- package/lib/services/tru-breeze-context-factory.d.ts +32 -32
- package/lib/services/tru-breeze-metadata-provider.d.ts +9 -9
- package/lib/services/tru-component-lookup.d.ts +9 -9
- package/lib/services/tru-connection-hub.d.ts +18 -18
- package/lib/services/tru-context-filters.d.ts +10 -10
- package/lib/services/tru-data-context.d.ts +42 -42
- package/lib/services/tru-entity-accessor.d.ts +46 -46
- package/lib/services/tru-model-property-lookup.d.ts +10 -10
- package/lib/services/tru-predicate-map.d.ts +6 -6
- package/lib/services/tru-search-result-view-manager.d.ts +10 -10
- package/lib/services/tru-sort.d.ts +56 -56
- package/lib/services/tru-table-registry.d.ts +8 -8
- package/lib/services/tru-text-manager.d.ts +68 -68
- package/lib/services/tru-ui-notification.d.ts +36 -36
- package/lib/services/tru-user.d.ts +29 -29
- package/lib/services/tru-util.d.ts +14 -14
- package/lib/tru-common-module.d.ts +6 -6
- package/package.json +5 -11
- package/public-api.d.ts +117 -117
- package/esm2020/lib/base-classes/tru-edit-control-config-base.mjs +0 -4
- package/esm2020/lib/base-classes/tru-entity-base.mjs +0 -13
- package/esm2020/lib/base-classes/tru-list-control-config-base.mjs +0 -4
- package/esm2020/lib/base-classes/tru-search-control-base.mjs +0 -47
- package/esm2020/lib/base-classes/tru-search-control-config-base.mjs +0 -4
- package/esm2020/lib/base-classes/tru-search-control-range-base.mjs +0 -47
- package/esm2020/lib/base-classes/tru-table-config-base.mjs +0 -13
- package/esm2020/lib/base-views/detail/tru-detail-view-base.mjs +0 -76
- package/esm2020/lib/base-views/search/services/tru-search-view-control-event-handler.mjs +0 -27
- package/esm2020/lib/base-views/search/services/tru-search-view-event-handler.mjs +0 -27
- package/esm2020/lib/base-views/search/tru-search-view-base.mjs +0 -63
- package/esm2020/lib/base-views/search-result/tru-search-result-view-base.mjs +0 -51
- package/esm2020/lib/classes/tru-context-filter-choice.mjs +0 -8
- package/esm2020/lib/classes/tru-context-filter.mjs +0 -16
- package/esm2020/lib/classes/tru-data-change-parser.mjs +0 -277
- package/esm2020/lib/classes/tru-data-change.mjs +0 -7
- package/esm2020/lib/classes/tru-merge-data-set.mjs +0 -12
- package/esm2020/lib/classes/tru-merge-data.mjs +0 -17
- package/esm2020/lib/classes/tru-predicate.mjs +0 -47
- package/esm2020/lib/classes/tru-property-config-date.mjs +0 -9
- package/esm2020/lib/classes/tru-property-config-decimal.mjs +0 -11
- package/esm2020/lib/classes/tru-property-config-foreign-key.mjs +0 -10
- package/esm2020/lib/classes/tru-property-config-integer.mjs +0 -9
- package/esm2020/lib/classes/tru-property-config-password.mjs +0 -8
- package/esm2020/lib/classes/tru-property-config-percentage.mjs +0 -9
- package/esm2020/lib/classes/tru-property-config-scientific.mjs +0 -9
- package/esm2020/lib/classes/tru-query-predicate-manager.mjs +0 -49
- package/esm2020/lib/components/confirm-dialog/tru-confirm-dialog.mjs +0 -45
- package/esm2020/lib/components/data-grid/overlays/tru-data-grid-loading-overlay/tru-data-grid-loading-overlay.mjs +0 -39
- package/esm2020/lib/components/data-grid/overlays/tru-data-grid-no-rows-overlay/tru-data-grid-no-rows-overlay.mjs +0 -26
- package/esm2020/lib/components/data-grid/tru-data-grid-module.mjs +0 -67
- package/esm2020/lib/components/data-grid/tru-data-grid.mjs +0 -370
- package/esm2020/lib/components/desktop/classes/tru-desktop-view-config.mjs +0 -21
- package/esm2020/lib/components/desktop/directives/resizable/tru-desktop-resizable.mjs +0 -109
- package/esm2020/lib/components/desktop/menubar/tru-desktop-menubar.mjs +0 -34
- package/esm2020/lib/components/desktop/services/tru-desktop-manager.mjs +0 -84
- package/esm2020/lib/components/desktop/services/tru-desktop-service.mjs +0 -116
- package/esm2020/lib/components/desktop/services/tru-window-action-event-handler.mjs +0 -27
- package/esm2020/lib/components/desktop/services/tru-window-event-args.mjs +0 -26
- package/esm2020/lib/components/desktop/services/tru-window-event-handler.mjs +0 -44
- package/esm2020/lib/components/desktop/statusbar/tru-desktop-statusbar.mjs +0 -18
- package/esm2020/lib/components/desktop/taskbar/tru-desktop-taskbar.mjs +0 -40
- package/esm2020/lib/components/desktop/tru-desktop.mjs +0 -731
- package/esm2020/lib/components/desktop/view/tru-desktop-view.mjs +0 -25
- package/esm2020/lib/components/desktop/viewport/tru-desktop-viewport.mjs +0 -113
- package/esm2020/lib/components/desktop/window/tru-desktop-window.mjs +0 -457
- package/esm2020/lib/components/export-dialog/tru-export-dialog.mjs +0 -57
- package/esm2020/lib/components/layout/form/tru-form.mjs +0 -34
- package/esm2020/lib/components/login/classes/tru-auth-jwt-strategy.mjs +0 -65
- package/esm2020/lib/components/login/classes/tru-auth-session-strategy.mjs +0 -19
- package/esm2020/lib/components/login/services/tru-auth-cache.mjs +0 -22
- package/esm2020/lib/components/login/services/tru-auth-interceptor.mjs +0 -43
- package/esm2020/lib/components/login/services/tru-auth.mjs +0 -81
- package/esm2020/lib/components/login/tru-login-module.mjs +0 -46
- package/esm2020/lib/components/login/tru-login.mjs +0 -58
- package/esm2020/lib/components/password-dialog/tru-password-dialog.mjs +0 -44
- package/esm2020/lib/components/toolbar/button/tru-toolbar-button.mjs +0 -41
- package/esm2020/lib/components/toolbar/context-filter/tru-toolbar-context-filter.mjs +0 -24
- package/esm2020/lib/components/toolbar/dropdown/tru-toolbar-dropdown.mjs +0 -43
- package/esm2020/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button.mjs +0 -16
- package/esm2020/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item.mjs +0 -26
- package/esm2020/lib/components/toolbar/menu/tru-toolbar-menu.mjs +0 -33
- package/esm2020/lib/components/toolbar/text/tru-toolbar-text.mjs +0 -28
- package/esm2020/lib/components/toolbar/user-profile/tru-toolbar-user-profile.mjs +0 -35
- package/esm2020/lib/components/validation-dialog/tru-validation-dialog-config.mjs +0 -21
- package/esm2020/lib/components/validation-dialog/tru-validation-dialog.mjs +0 -79
- package/esm2020/lib/directives/breeze-validator/tru-breeze-validator.mjs +0 -100
- package/esm2020/lib/directives/search-panel-position-manager/tru-search-panel-position-manager.mjs +0 -151
- package/esm2020/lib/directives/select-panel/tru-mat-select-panel.mjs +0 -66
- package/esm2020/lib/services/tru-app-environment.mjs +0 -94
- package/esm2020/lib/services/tru-breeze-context-factory.mjs +0 -79
- package/esm2020/lib/services/tru-breeze-metadata-provider.mjs +0 -22
- package/esm2020/lib/services/tru-component-lookup.mjs +0 -25
- package/esm2020/lib/services/tru-connection-hub.mjs +0 -48
- package/esm2020/lib/services/tru-context-filters.mjs +0 -29
- package/esm2020/lib/services/tru-data-context.mjs +0 -258
- package/esm2020/lib/services/tru-entity-accessor.mjs +0 -287
- package/esm2020/lib/services/tru-model-property-lookup.mjs +0 -22
- package/esm2020/lib/services/tru-search-result-view-manager.mjs +0 -17
- package/esm2020/lib/services/tru-sort.mjs +0 -114
- package/esm2020/lib/services/tru-table-registry.mjs +0 -16
- package/esm2020/lib/services/tru-text-manager.mjs +0 -134
- package/esm2020/lib/services/tru-ui-notification.mjs +0 -103
- package/esm2020/lib/services/tru-user.mjs +0 -63
- package/esm2020/lib/services/tru-util.mjs +0 -77
- package/fesm2015/trudb-tru-common-lib.mjs +0 -6799
- package/fesm2015/trudb-tru-common-lib.mjs.map +0 -1
- package/fesm2020/trudb-tru-common-lib.mjs +0 -6776
- package/fesm2020/trudb-tru-common-lib.mjs.map +0 -1
|
@@ -1,731 +0,0 @@
|
|
|
1
|
-
import { Component, Input, ViewChild } from '@angular/core';
|
|
2
|
-
import { TruDesktopService } from './services/tru-desktop-service';
|
|
3
|
-
import { TruDesktopViewConfig } from './classes/tru-desktop-view-config';
|
|
4
|
-
import { TruDesktopViewport } from './viewport/tru-desktop-viewport';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "./services/tru-desktop-service";
|
|
7
|
-
import * as i2 from "../../services/tru-text-manager";
|
|
8
|
-
import * as i3 from "./services/tru-window-event-handler";
|
|
9
|
-
import * as i4 from "@angular/common";
|
|
10
|
-
import * as i5 from "./menubar/tru-desktop-menubar";
|
|
11
|
-
import * as i6 from "./taskbar/tru-desktop-taskbar";
|
|
12
|
-
import * as i7 from "./viewport/tru-desktop-viewport";
|
|
13
|
-
export class TruDesktop {
|
|
14
|
-
constructor(desktopService, textManager, truWindowEventHandler) {
|
|
15
|
-
this.desktopService = desktopService;
|
|
16
|
-
this.textManager = textManager;
|
|
17
|
-
this.truWindowEventHandler = truWindowEventHandler;
|
|
18
|
-
this.minimizeAll = false;
|
|
19
|
-
this.desktop = this.desktopService.createDesktop();
|
|
20
|
-
this.minWindowCascadePosition = 40;
|
|
21
|
-
this.maxWindowCascadePosition = 100;
|
|
22
|
-
this.lastWindowCascadePosition = { top: this.minWindowCascadePosition, left: this.minWindowCascadePosition };
|
|
23
|
-
this.shiftPressed = false;
|
|
24
|
-
this.altPressed = false;
|
|
25
|
-
this.xPressed = false;
|
|
26
|
-
this.keyboardMap = ["", "", "", "CANCEL", "", "", "HELP", "", "BACK_SPACE", "TAB", "", "", "CLEAR", "ENTER", "RETURN", "", "SHIFT", "CONTROL", "ALT", "PAUSE", "CAPS_LOCK", "KANA", "EISU", "JUNJA", "FINAL", "HANJA", "", "ESCAPE", "CONVERT", "NONCONVERT", "ACCEPT", "MODECHANGE", "SPACE", "PAGE_UP", "PAGE_DOWN", "END", "HOME", "LEFT", "UP", "RIGHT", "DOWN", "SELECT", "PRINT", "EXECUTE", "PRINTSCREEN", "INSERT", "DELETE", "", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "COLON", "SEMICOLON", "LESS_THAN", "EQUALS", "GREATER_THAN", "QUESTION_MARK", "AT", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "WIN", "", "CONTEXT_MENU", "", "SLEEP", "NUMPAD0", "NUMPAD1", "NUMPAD2", "NUMPAD3", "NUMPAD4", "NUMPAD5", "NUMPAD6", "NUMPAD7", "NUMPAD8", "NUMPAD9", "MULTIPLY", "ADD", "SEPARATOR", "SUBTRACT", "DECIMAL", "DIVIDE", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "F13", "F14", "F15", "F16", "F17", "F18", "F19", "F20", "F21", "F22", "F23", "F24", "", "", "", "", "", "", "", "", "NUM_LOCK", "SCROLL_LOCK", "WIN_OEM_FJ_JISHO", "WIN_OEM_FJ_MASSHOU", "WIN_OEM_FJ_TOUROKU", "WIN_OEM_FJ_LOYA", "WIN_OEM_FJ_ROYA", "", "", "", "", "", "", "", "", "", "CIRCUMFLEX", "EXCLAMATION", "DOUBLE_QUOTE", "HASH", "DOLLAR", "PERCENT", "AMPERSAND", "UNDERSCORE", "OPEN_PAREN", "CLOSE_PAREN", "ASTERISK", "PLUS", "PIPE", "HYPHEN_MINUS", "OPEN_CURLY_BRACKET", "CLOSE_CURLY_BRACKET", "TILDE", "", "", "", "", "VOLUME_MUTE", "VOLUME_DOWN", "VOLUME_UP", "", "", "", "", "COMMA", "", "PERIOD", "SLASH", "BACK_QUOTE", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "OPEN_BRACKET", "BACK_SLASH", "CLOSE_BRACKET", "QUOTE", "", "META", "ALTGR", "", "WIN_ICO_HELP", "WIN_ICO_00", "", "WIN_ICO_CLEAR", "", "", "WIN_OEM_RESET", "WIN_OEM_JUMP", "WIN_OEM_PA1", "WIN_OEM_PA2", "WIN_OEM_PA3", "WIN_OEM_WSCTRL", "WIN_OEM_CUSEL", "WIN_OEM_ATTN", "WIN_OEM_FINISH", "WIN_OEM_COPY", "WIN_OEM_AUTO", "WIN_OEM_ENLW", "WIN_OEM_BACKTAB", "ATTN", "CRSEL", "EXSEL", "EREOF", "PLAY", "ZOOM", "", "PA1", "WIN_OEM_CLEAR", ""];
|
|
27
|
-
this.logoUrl = null;
|
|
28
|
-
/**
|
|
29
|
-
* @tru.doc function
|
|
30
|
-
* @name truDesktopComponent.getDesktop
|
|
31
|
-
* @module tru.desktop
|
|
32
|
-
*
|
|
33
|
-
* @description
|
|
34
|
-
* Return an object of desktop.
|
|
35
|
-
*
|
|
36
|
-
* @returns {object} desktop.
|
|
37
|
-
*/
|
|
38
|
-
this.getDesktop = () => {
|
|
39
|
-
return this.desktop;
|
|
40
|
-
};
|
|
41
|
-
/**
|
|
42
|
-
* @tru.doc function
|
|
43
|
-
* @name truDesktopComponent.getOptions
|
|
44
|
-
* @module tru.desktop
|
|
45
|
-
*
|
|
46
|
-
* @description
|
|
47
|
-
* Return an object of desktop options.
|
|
48
|
-
*
|
|
49
|
-
* @returns {object} options.
|
|
50
|
-
*/
|
|
51
|
-
this.getOptions = () => {
|
|
52
|
-
return this.options;
|
|
53
|
-
};
|
|
54
|
-
/**
|
|
55
|
-
* @tru.doc function
|
|
56
|
-
* @name truDesktopComponent.getWindows
|
|
57
|
-
* @module tru.desktop
|
|
58
|
-
*
|
|
59
|
-
* @description
|
|
60
|
-
* Return an array of windows.
|
|
61
|
-
*
|
|
62
|
-
* @returns {array} windows.
|
|
63
|
-
*/
|
|
64
|
-
this.getWindows = () => {
|
|
65
|
-
return this.windows;
|
|
66
|
-
};
|
|
67
|
-
/**
|
|
68
|
-
* @tru.doc function
|
|
69
|
-
* @name truDesktopComponent.getNextMaxZIndex
|
|
70
|
-
* @module tru.desktop
|
|
71
|
-
*
|
|
72
|
-
* @description
|
|
73
|
-
* Iterates through all window objects in the windows array to find the max z-index
|
|
74
|
-
* and increases the value found by 1.
|
|
75
|
-
*
|
|
76
|
-
* @returns {int}
|
|
77
|
-
*/
|
|
78
|
-
this.getNextMaxZIndex = () => {
|
|
79
|
-
var max = 0;
|
|
80
|
-
var tmp;
|
|
81
|
-
for (var i = this.windows.length - 1; i >= 0; i--) {
|
|
82
|
-
tmp = this.windows[i].zIndex;
|
|
83
|
-
if (tmp > max)
|
|
84
|
-
max = tmp;
|
|
85
|
-
}
|
|
86
|
-
return ++max;
|
|
87
|
-
};
|
|
88
|
-
/**
|
|
89
|
-
* @tru.doc function
|
|
90
|
-
* @name truDesktopComponent.clearActive
|
|
91
|
-
* @module tru.desktop
|
|
92
|
-
*
|
|
93
|
-
* @description
|
|
94
|
-
* Iterates through all window objects in the windows
|
|
95
|
-
* and sets the active property to false.
|
|
96
|
-
*
|
|
97
|
-
*/
|
|
98
|
-
this.clearActive = () => {
|
|
99
|
-
this.windows.forEach((window) => {
|
|
100
|
-
window.active = false;
|
|
101
|
-
});
|
|
102
|
-
};
|
|
103
|
-
/**
|
|
104
|
-
* @tru.doc function
|
|
105
|
-
* @name truDesktopComponent.getActiveWindow
|
|
106
|
-
* @module tru.desktop
|
|
107
|
-
*
|
|
108
|
-
* @description
|
|
109
|
-
* Gets the active window.
|
|
110
|
-
*
|
|
111
|
-
* @returns {object} view object.
|
|
112
|
-
*/
|
|
113
|
-
this.getActiveWindow = () => {
|
|
114
|
-
var activeWindow = null;
|
|
115
|
-
this.windows.forEach((wdw) => {
|
|
116
|
-
if (wdw.active === true) {
|
|
117
|
-
activeWindow = wdw;
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
return activeWindow;
|
|
121
|
-
};
|
|
122
|
-
/**
|
|
123
|
-
* @tru.doc function
|
|
124
|
-
* @name truDesktopComponent.getActiveView
|
|
125
|
-
* @module tru.desktop
|
|
126
|
-
*
|
|
127
|
-
* @description
|
|
128
|
-
* Gets the active view.
|
|
129
|
-
*
|
|
130
|
-
* @returns {object} view object.
|
|
131
|
-
*/
|
|
132
|
-
this.getActiveView = (wdw) => {
|
|
133
|
-
var activeView = null;
|
|
134
|
-
wdw.views.forEach((view) => {
|
|
135
|
-
if (view.active$.getValue() === true) {
|
|
136
|
-
activeView = view;
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
return activeView;
|
|
140
|
-
};
|
|
141
|
-
/**
|
|
142
|
-
* @tru.doc function
|
|
143
|
-
* @name truDesktopComponent.allWindowsAreMinimized
|
|
144
|
-
* @module tru.desktop
|
|
145
|
-
*
|
|
146
|
-
* @description
|
|
147
|
-
* Iterates through windows to determine if all are minimized.
|
|
148
|
-
*
|
|
149
|
-
*/
|
|
150
|
-
this.allWindowsAreMinimized = () => {
|
|
151
|
-
var allMinimized = true;
|
|
152
|
-
this.windows.forEach((window) => {
|
|
153
|
-
if (!window.minimized) {
|
|
154
|
-
allMinimized = false;
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
return allMinimized;
|
|
158
|
-
};
|
|
159
|
-
/**
|
|
160
|
-
* @tru.doc function
|
|
161
|
-
* @name truDesktopComponent.hideShowAll
|
|
162
|
-
* @module tru.desktop
|
|
163
|
-
*
|
|
164
|
-
* @description
|
|
165
|
-
* Hides/shows all windows
|
|
166
|
-
*
|
|
167
|
-
*/
|
|
168
|
-
this.hideShowAll = () => {
|
|
169
|
-
this.minimizeAll = this.allWindowsAreMinimized() ? false : !this.minimizeAll;
|
|
170
|
-
this.windows.forEach((wdw) => {
|
|
171
|
-
if (wdw.outOfBounds)
|
|
172
|
-
this.recover(wdw);
|
|
173
|
-
wdw.active = false;
|
|
174
|
-
wdw.minimized = this.minimizeAll;
|
|
175
|
-
});
|
|
176
|
-
this.activateForemostWindow();
|
|
177
|
-
return this.minimizeAll;
|
|
178
|
-
};
|
|
179
|
-
/**
|
|
180
|
-
* @tru.doc function
|
|
181
|
-
* @name truDesktopComponent.findWindowViewDirective
|
|
182
|
-
* @module tru.desktop
|
|
183
|
-
*
|
|
184
|
-
* @description
|
|
185
|
-
* Looks for previously open window with a view directive
|
|
186
|
-
*
|
|
187
|
-
*/
|
|
188
|
-
this.findWindowViewDirective = (windowViewDirective) => {
|
|
189
|
-
for (let i = 0; i < this.windows.length; i++) {
|
|
190
|
-
for (let j = 0; j < this.windows[i].views.length; j++) {
|
|
191
|
-
if (this.windows[i].views[0].viewDirective === windowViewDirective)
|
|
192
|
-
return this.windows[i];
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
return null;
|
|
196
|
-
};
|
|
197
|
-
/**
|
|
198
|
-
* @tru.doc function
|
|
199
|
-
* @name truDesktopComponent.openWindow
|
|
200
|
-
* @module tru.desktop
|
|
201
|
-
*
|
|
202
|
-
* @description
|
|
203
|
-
* Displays a new window. All window properties defined by the application developer will be
|
|
204
|
-
* overlaid here before displaying the window
|
|
205
|
-
*
|
|
206
|
-
*/
|
|
207
|
-
this.openWindow = (windowConfigOverlays, singleInstance) => {
|
|
208
|
-
let activeWindow = this.getActiveWindow();
|
|
209
|
-
if (activeWindow && activeWindow.isModal) {
|
|
210
|
-
activeWindow.invalidOperation = true;
|
|
211
|
-
return;
|
|
212
|
-
}
|
|
213
|
-
if (singleInstance) {
|
|
214
|
-
let window = this.findWindowViewDirective(windowConfigOverlays.views[0].viewDirective);
|
|
215
|
-
if (window) {
|
|
216
|
-
this.updateWindowState(window);
|
|
217
|
-
return;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
if (windowConfigOverlays.isModal) {
|
|
221
|
-
let heightOffset = (parseInt(windowConfigOverlays.height, 10) / 2) + 30;
|
|
222
|
-
let widthOffset = (parseInt(windowConfigOverlays.width, 10) / 2);
|
|
223
|
-
windowConfigOverlays.top = 'calc(50% - ' + heightOffset + 'px )';
|
|
224
|
-
windowConfigOverlays.left = 'calc(50% - ' + widthOffset + 'px )';
|
|
225
|
-
}
|
|
226
|
-
this.clearActive();
|
|
227
|
-
let configuredWindow = this.configureWindow(windowConfigOverlays);
|
|
228
|
-
configuredWindow.views = this.configureViews(windowConfigOverlays, configuredWindow);
|
|
229
|
-
if (!configuredWindow.isModal) {
|
|
230
|
-
configuredWindow.cascadeWindow = false;
|
|
231
|
-
this.savePosition(configuredWindow);
|
|
232
|
-
this.maximize(configuredWindow);
|
|
233
|
-
this.windows.push(configuredWindow);
|
|
234
|
-
}
|
|
235
|
-
else {
|
|
236
|
-
this.windows.push(configuredWindow);
|
|
237
|
-
}
|
|
238
|
-
};
|
|
239
|
-
/**
|
|
240
|
-
* @tru.doc function
|
|
241
|
-
* @name truDesktopComponent.configureWindow
|
|
242
|
-
* @module tru.desktop
|
|
243
|
-
*
|
|
244
|
-
* @description
|
|
245
|
-
* Creates a new window instance.
|
|
246
|
-
*
|
|
247
|
-
*/
|
|
248
|
-
this.configureWindow = (windowConfigOverlays) => {
|
|
249
|
-
var windowConfigInstance = Object.assign({}, this.desktop.windowConfig);
|
|
250
|
-
windowConfigInstance.savedPosition = Object.create({ top: 0, left: 0, right: 0, bottom: 0, height: 0, width: 0 });
|
|
251
|
-
windowConfigInstance.zIndex = this.getNextMaxZIndex();
|
|
252
|
-
//windowConfigInstance.globals = Object.assign({}, $rootScope.$eval(this.options.globals));
|
|
253
|
-
return Object.assign(windowConfigInstance, windowConfigOverlays);
|
|
254
|
-
};
|
|
255
|
-
/**
|
|
256
|
-
* @tru.doc function
|
|
257
|
-
* @name truDesktopComponent.configureViews
|
|
258
|
-
* @module tru.desktop
|
|
259
|
-
*
|
|
260
|
-
* @description
|
|
261
|
-
* Creates one or more view instances
|
|
262
|
-
*
|
|
263
|
-
*/
|
|
264
|
-
this.configureViews = (windowConfigOverlays, configuredWindow) => {
|
|
265
|
-
let configuredViews = [];
|
|
266
|
-
windowConfigOverlays.views.forEach((view) => {
|
|
267
|
-
let configuredView = new TruDesktopViewConfig();
|
|
268
|
-
configuredView.componentName = view.componentName;
|
|
269
|
-
configuredView.entities = view.entities;
|
|
270
|
-
configuredView.entityIndex = view.entityIndex;
|
|
271
|
-
configuredView.isDirty = view.isDirty;
|
|
272
|
-
configuredView.isEditing = view.isEditing;
|
|
273
|
-
configuredView.isInvalid = view.isValid;
|
|
274
|
-
configuredView.openAsDetaiView = view.openAsDetailView;
|
|
275
|
-
//viewConfigInstance.globals = this.options.globals;
|
|
276
|
-
//let configuredView = Object.assign(viewConfigInstance, view);
|
|
277
|
-
configuredView.window = configuredWindow;
|
|
278
|
-
configuredViews.push(configuredView);
|
|
279
|
-
});
|
|
280
|
-
return configuredViews;
|
|
281
|
-
};
|
|
282
|
-
/**
|
|
283
|
-
* @tru.doc function
|
|
284
|
-
* @name truDesktopComponent.closeWindow
|
|
285
|
-
* @module tru.desktop
|
|
286
|
-
*
|
|
287
|
-
* @description
|
|
288
|
-
* Remove a window {object} from the windows array.
|
|
289
|
-
*
|
|
290
|
-
* @returns {boolean} returns true if window was closed, false if not closed.
|
|
291
|
-
*/
|
|
292
|
-
this.closeWindow = (wdw) => {
|
|
293
|
-
if (!this.options.allowDirtyClose && wdw.isDirty) {
|
|
294
|
-
alert("Unsaved Changes. Save changes before closing window.");
|
|
295
|
-
return false;
|
|
296
|
-
}
|
|
297
|
-
if (!this.options.allowInvalidClose && wdw.isInvalid) {
|
|
298
|
-
alert("Data is invalid. Correct Invalid data before closing window.");
|
|
299
|
-
return false;
|
|
300
|
-
}
|
|
301
|
-
if (this.options.canCloseFn !== undefined) {
|
|
302
|
-
if (this.options.canCloseFn(wdw)) {
|
|
303
|
-
this.windows.splice(this.windows.indexOf(wdw), 1);
|
|
304
|
-
this.activateForemostWindow();
|
|
305
|
-
return true;
|
|
306
|
-
}
|
|
307
|
-
;
|
|
308
|
-
}
|
|
309
|
-
else {
|
|
310
|
-
this.windows.splice(this.windows.indexOf(wdw), 1);
|
|
311
|
-
this.activateForemostWindow();
|
|
312
|
-
return true;
|
|
313
|
-
}
|
|
314
|
-
return false;
|
|
315
|
-
};
|
|
316
|
-
/**
|
|
317
|
-
* @tru.doc function
|
|
318
|
-
* @name truDesktopComponent.activateForemostWindow
|
|
319
|
-
* @module tru.desktop
|
|
320
|
-
*
|
|
321
|
-
* @description
|
|
322
|
-
* Set the foremost window to an active state
|
|
323
|
-
*
|
|
324
|
-
*/
|
|
325
|
-
this.activateForemostWindow = () => {
|
|
326
|
-
var foremost = undefined;
|
|
327
|
-
for (var i = 0; i < this.windows.length; i++) {
|
|
328
|
-
if ((foremost === undefined || this.windows[i].zIndex > foremost.zIndex) && !this.windows[i].minimized && !this.windows[i].outOfBounds)
|
|
329
|
-
foremost = this.windows[i];
|
|
330
|
-
}
|
|
331
|
-
if (foremost)
|
|
332
|
-
foremost.active = true;
|
|
333
|
-
};
|
|
334
|
-
/**
|
|
335
|
-
* @tru.doc function
|
|
336
|
-
* @name truDesktopComponent.activateNextWindow
|
|
337
|
-
* @module tru.desktop
|
|
338
|
-
*
|
|
339
|
-
* @description
|
|
340
|
-
* Set the next window to an active state
|
|
341
|
-
*
|
|
342
|
-
*/
|
|
343
|
-
this.activateNextWindow = (activeWindowLocation) => {
|
|
344
|
-
if (this.windows.length <= 1)
|
|
345
|
-
return;
|
|
346
|
-
var backend = this.windows.slice(activeWindowLocation);
|
|
347
|
-
var frontend = this.windows.slice(0, activeWindowLocation - 1);
|
|
348
|
-
var sorted = backend.concat(frontend);
|
|
349
|
-
var nextWindow = undefined;
|
|
350
|
-
for (var i = 0; i < sorted.length; i++) {
|
|
351
|
-
if (!sorted[i].minimized && !sorted[i].outOfBounds && !nextWindow)
|
|
352
|
-
nextWindow = sorted[i];
|
|
353
|
-
}
|
|
354
|
-
if (nextWindow) {
|
|
355
|
-
this.clearActive();
|
|
356
|
-
nextWindow.zIndex = this.getNextMaxZIndex();
|
|
357
|
-
nextWindow.active = true;
|
|
358
|
-
}
|
|
359
|
-
};
|
|
360
|
-
/**
|
|
361
|
-
* @tru.doc function
|
|
362
|
-
* @name truDesktopComponent.activatePreviousWindow
|
|
363
|
-
* @module tru.desktop
|
|
364
|
-
*
|
|
365
|
-
* @description
|
|
366
|
-
* Set the previous window to an active state
|
|
367
|
-
*
|
|
368
|
-
*/
|
|
369
|
-
this.activatePreviousWindow = (activeWindowLocation) => {
|
|
370
|
-
if (this.windows.length <= 1)
|
|
371
|
-
return;
|
|
372
|
-
var backend = this.windows.slice(activeWindowLocation);
|
|
373
|
-
var frontend = this.windows.slice(0, activeWindowLocation - 1);
|
|
374
|
-
var sorted = backend.concat(frontend);
|
|
375
|
-
var nextWindow = undefined;
|
|
376
|
-
for (var i = sorted.length - 1; i >= 0; i--) {
|
|
377
|
-
if (!sorted[i].minimized && !sorted[i].outOfBounds && !nextWindow)
|
|
378
|
-
nextWindow = sorted[i];
|
|
379
|
-
}
|
|
380
|
-
if (nextWindow) {
|
|
381
|
-
this.clearActive();
|
|
382
|
-
nextWindow.zIndex = this.getNextMaxZIndex();
|
|
383
|
-
nextWindow.active = true;
|
|
384
|
-
}
|
|
385
|
-
};
|
|
386
|
-
/**
|
|
387
|
-
* @tru.doc function
|
|
388
|
-
* @name truDesktopComponent.minimize
|
|
389
|
-
* @module tru.desktop
|
|
390
|
-
*
|
|
391
|
-
* @description
|
|
392
|
-
* Visually removes window from the viewport.
|
|
393
|
-
*
|
|
394
|
-
*/
|
|
395
|
-
this.minimize = (window) => {
|
|
396
|
-
this.savePosition(window);
|
|
397
|
-
window.active = false;
|
|
398
|
-
window.minimized = true;
|
|
399
|
-
this.activateForemostWindow();
|
|
400
|
-
};
|
|
401
|
-
/**
|
|
402
|
-
* @tru.doc function
|
|
403
|
-
* @name truDesktopComponent.maximize
|
|
404
|
-
* @module tru.desktop
|
|
405
|
-
*
|
|
406
|
-
* @description
|
|
407
|
-
* Positions window such that it fills the whole viewport.
|
|
408
|
-
*
|
|
409
|
-
*/
|
|
410
|
-
this.maximize = (window) => {
|
|
411
|
-
window.top = 0;
|
|
412
|
-
window.left = 0;
|
|
413
|
-
window.right = 0;
|
|
414
|
-
window.bottom = 0;
|
|
415
|
-
window.height = 'auto';
|
|
416
|
-
window.width = '100%';
|
|
417
|
-
window.maximized = 'fill';
|
|
418
|
-
};
|
|
419
|
-
/**
|
|
420
|
-
* @tru.doc function
|
|
421
|
-
* @name truDesktopComponent.maximizeLeft
|
|
422
|
-
* @module tru.desktop
|
|
423
|
-
*
|
|
424
|
-
* @description
|
|
425
|
-
* Positions window such that it fills the left portion viewport.
|
|
426
|
-
*
|
|
427
|
-
*/
|
|
428
|
-
this.maximizeLeft = (window) => {
|
|
429
|
-
window.split = true;
|
|
430
|
-
window.top = 0;
|
|
431
|
-
window.left = 0;
|
|
432
|
-
window.bottom = 0;
|
|
433
|
-
window.width = '50%';
|
|
434
|
-
window.height = 'auto';
|
|
435
|
-
window.maximized = 'left';
|
|
436
|
-
};
|
|
437
|
-
/**
|
|
438
|
-
* @tru.doc function
|
|
439
|
-
* @name truDesktopComponent.maximizeRight
|
|
440
|
-
* @module tru.desktop
|
|
441
|
-
*
|
|
442
|
-
* @description
|
|
443
|
-
* Positions window such that it fills the right portion viewport.
|
|
444
|
-
*
|
|
445
|
-
*/
|
|
446
|
-
this.maximizeRight = (window) => {
|
|
447
|
-
window.top = 0;
|
|
448
|
-
window.left = '50%';
|
|
449
|
-
window.right = 0;
|
|
450
|
-
window.bottom = 0;
|
|
451
|
-
window.width = '50%';
|
|
452
|
-
window.height = 'auto';
|
|
453
|
-
window.maximized = 'right';
|
|
454
|
-
};
|
|
455
|
-
/**
|
|
456
|
-
* @tru.doc function
|
|
457
|
-
* @name truDesktopComponent.recover
|
|
458
|
-
* @module tru.desktop
|
|
459
|
-
*
|
|
460
|
-
* @description
|
|
461
|
-
* Brings window back into view when it has escaped the viewport.
|
|
462
|
-
*
|
|
463
|
-
*/
|
|
464
|
-
this.recover = (window) => {
|
|
465
|
-
window.active = true;
|
|
466
|
-
window.outOfBounds = false;
|
|
467
|
-
window.minimized = false;
|
|
468
|
-
window.zIndex = this.getNextMaxZIndex();
|
|
469
|
-
this.cascadeWindow(window);
|
|
470
|
-
this.clearActive();
|
|
471
|
-
this.activateForemostWindow();
|
|
472
|
-
};
|
|
473
|
-
/**
|
|
474
|
-
* @tru.doc function
|
|
475
|
-
* @name truDesktopComponent.restore
|
|
476
|
-
* @module tru.desktop
|
|
477
|
-
*
|
|
478
|
-
* @description
|
|
479
|
-
*
|
|
480
|
-
*/
|
|
481
|
-
this.restore = (wdw) => {
|
|
482
|
-
if (wdw.maximized === 'fill') {
|
|
483
|
-
this.maximize(wdw);
|
|
484
|
-
}
|
|
485
|
-
else if (wdw.maximized === 'left') {
|
|
486
|
-
this.maximizeLeft(wdw);
|
|
487
|
-
}
|
|
488
|
-
else if (wdw.maximized === 'right') {
|
|
489
|
-
this.maximizeRight(wdw);
|
|
490
|
-
}
|
|
491
|
-
this.updateWindowState(wdw);
|
|
492
|
-
};
|
|
493
|
-
/**
|
|
494
|
-
* @tru.doc function
|
|
495
|
-
* @name truDesktopComponent.bringToFront
|
|
496
|
-
* @module tru.desktop
|
|
497
|
-
*
|
|
498
|
-
* @description
|
|
499
|
-
*
|
|
500
|
-
*/
|
|
501
|
-
this.updateWindowState = (wdw) => {
|
|
502
|
-
if (wdw.outOfBounds) {
|
|
503
|
-
this.recover(wdw);
|
|
504
|
-
return;
|
|
505
|
-
}
|
|
506
|
-
if (wdw.maximized === 'fill') {
|
|
507
|
-
this.maximize(wdw);
|
|
508
|
-
}
|
|
509
|
-
else if (wdw.maximized === 'left') {
|
|
510
|
-
this.maximizeLeft(wdw);
|
|
511
|
-
}
|
|
512
|
-
else if (wdw.maximized === 'right') {
|
|
513
|
-
this.maximizeRight(wdw);
|
|
514
|
-
}
|
|
515
|
-
this.clearActive();
|
|
516
|
-
wdw.active = true;
|
|
517
|
-
wdw.minimized = false;
|
|
518
|
-
wdw.zIndex = this.getNextMaxZIndex();
|
|
519
|
-
};
|
|
520
|
-
/**
|
|
521
|
-
* @tru.doc function
|
|
522
|
-
* @name truDesktopComponent.restoreSavedPosition
|
|
523
|
-
* @module tru.desktop
|
|
524
|
-
*
|
|
525
|
-
* @description
|
|
526
|
-
* Set the windows last know position to the current position.
|
|
527
|
-
*
|
|
528
|
-
*/
|
|
529
|
-
this.restoreSavedPosition = (wdw) => {
|
|
530
|
-
this.clearActive();
|
|
531
|
-
wdw.top = wdw.savedPosition.top;
|
|
532
|
-
wdw.left = wdw.savedPosition.left;
|
|
533
|
-
wdw.right = wdw.savedPosition.right;
|
|
534
|
-
wdw.bottom = wdw.savedPosition.bottom;
|
|
535
|
-
wdw.height = wdw.savedPosition.height;
|
|
536
|
-
wdw.width = wdw.savedPosition.width;
|
|
537
|
-
wdw.maximized = undefined;
|
|
538
|
-
wdw.minimized = undefined;
|
|
539
|
-
wdw.active = true;
|
|
540
|
-
wdw.minimized = false;
|
|
541
|
-
wdw.zIndex = this.getNextMaxZIndex();
|
|
542
|
-
};
|
|
543
|
-
/**
|
|
544
|
-
* @tru.doc function
|
|
545
|
-
* @name truDesktopComponent.savePosition
|
|
546
|
-
* @module tru.desktop
|
|
547
|
-
*
|
|
548
|
-
* @description
|
|
549
|
-
* Save the windows last know position.
|
|
550
|
-
*
|
|
551
|
-
*/
|
|
552
|
-
this.savePosition = (wdw) => {
|
|
553
|
-
wdw.savedPosition.top = wdw.top;
|
|
554
|
-
wdw.savedPosition.left = wdw.left;
|
|
555
|
-
wdw.savedPosition.right = wdw.right;
|
|
556
|
-
wdw.savedPosition.bottom = wdw.bottom;
|
|
557
|
-
wdw.savedPosition.height = wdw.height;
|
|
558
|
-
wdw.savedPosition.width = wdw.width;
|
|
559
|
-
};
|
|
560
|
-
/**
|
|
561
|
-
* @tru.doc function
|
|
562
|
-
* @name truDesktopComponent.closeWindow
|
|
563
|
-
* @module tru.desktop
|
|
564
|
-
*
|
|
565
|
-
* @description
|
|
566
|
-
* Moves a window to the next cascade position.
|
|
567
|
-
*
|
|
568
|
-
*/
|
|
569
|
-
this.cascadeWindow = (window) => {
|
|
570
|
-
if (!this.options.enableWindowCascading || window.isModal)
|
|
571
|
-
return;
|
|
572
|
-
this.lastWindowCascadePosition.top += 10;
|
|
573
|
-
this.lastWindowCascadePosition.left += 10;
|
|
574
|
-
if (this.lastWindowCascadePosition.top > this.maxWindowCascadePosition)
|
|
575
|
-
this.lastWindowCascadePosition.top = this.minWindowCascadePosition;
|
|
576
|
-
if (this.lastWindowCascadePosition.left > this.maxWindowCascadePosition)
|
|
577
|
-
this.lastWindowCascadePosition.left = this.minWindowCascadePosition;
|
|
578
|
-
window.top = this.lastWindowCascadePosition.top + 'px';
|
|
579
|
-
window.left = this.lastWindowCascadePosition.left + 'px';
|
|
580
|
-
};
|
|
581
|
-
/**
|
|
582
|
-
* @tru.doc function
|
|
583
|
-
* @name truDesktopComponent.getKeyCode
|
|
584
|
-
* @module tru.desktop
|
|
585
|
-
*
|
|
586
|
-
* @description
|
|
587
|
-
*
|
|
588
|
-
*/
|
|
589
|
-
this.getKeySequence = (event) => {
|
|
590
|
-
var keys = [];
|
|
591
|
-
if (event.shiftKey)
|
|
592
|
-
keys.push('shift');
|
|
593
|
-
if (event.ctrlKey)
|
|
594
|
-
keys.push('ctrl');
|
|
595
|
-
if (event.altKey)
|
|
596
|
-
keys.push('alt');
|
|
597
|
-
if (event.metaKey)
|
|
598
|
-
keys.push('meta');
|
|
599
|
-
var keyCode = event.keyCode || event.which;
|
|
600
|
-
if (keyCode)
|
|
601
|
-
keys.push(this.keyboardMap[keyCode].toLowerCase());
|
|
602
|
-
return keys.join('+');
|
|
603
|
-
};
|
|
604
|
-
/**
|
|
605
|
-
* @tru.doc event
|
|
606
|
-
* @module tru.desktop
|
|
607
|
-
*
|
|
608
|
-
* @description
|
|
609
|
-
*
|
|
610
|
-
*/
|
|
611
|
-
this.onKeyDown = (event) => {
|
|
612
|
-
var keySequence = this.getKeySequence(event);
|
|
613
|
-
if (keySequence === 'alt+m') { //Maximize
|
|
614
|
-
var activeWindow = this.getActiveWindow();
|
|
615
|
-
if (activeWindow === null)
|
|
616
|
-
return;
|
|
617
|
-
if (!activeWindow.maximized) {
|
|
618
|
-
this.savePosition(activeWindow);
|
|
619
|
-
this.maximize(activeWindow);
|
|
620
|
-
}
|
|
621
|
-
else if (activeWindow.maximized === 'right' || activeWindow.maximized === 'left')
|
|
622
|
-
this.maximize(activeWindow);
|
|
623
|
-
else
|
|
624
|
-
this.restoreSavedPosition(activeWindow);
|
|
625
|
-
event.preventDefault();
|
|
626
|
-
}
|
|
627
|
-
if (keySequence === 'alt+n') { //Minimize
|
|
628
|
-
var activeWindow = this.getActiveWindow();
|
|
629
|
-
if (activeWindow === null || activeWindow.minimized)
|
|
630
|
-
return;
|
|
631
|
-
this.minimize(activeWindow);
|
|
632
|
-
event.preventDefault();
|
|
633
|
-
}
|
|
634
|
-
if (keySequence === 'alt+w') { //Cycles Forward
|
|
635
|
-
var index = this.windows.indexOf(this.getActiveWindow());
|
|
636
|
-
this.activateNextWindow(index + 1);
|
|
637
|
-
event.preventDefault();
|
|
638
|
-
}
|
|
639
|
-
if (keySequence === 'shift+alt+w') { //Cycles Backward
|
|
640
|
-
var index = this.windows.indexOf(this.getActiveWindow());
|
|
641
|
-
this.activatePreviousWindow(index + 1);
|
|
642
|
-
event.preventDefault();
|
|
643
|
-
}
|
|
644
|
-
if (keySequence === 'shift+alt+x' && !(this.shiftPressed && this.altPressed && this.xPressed)) { //Close
|
|
645
|
-
var activeWindow = this.getActiveWindow();
|
|
646
|
-
if (!activeWindow)
|
|
647
|
-
return;
|
|
648
|
-
this.closeWindow(activeWindow);
|
|
649
|
-
event.preventDefault();
|
|
650
|
-
}
|
|
651
|
-
if (keySequence === 'alt+d') { //Toggle Desktop
|
|
652
|
-
//this.desktopShown = this.hideShowAll();
|
|
653
|
-
event.preventDefault();
|
|
654
|
-
}
|
|
655
|
-
if (event.shiftKey)
|
|
656
|
-
this.shiftPressed = true;
|
|
657
|
-
if (event.altKey)
|
|
658
|
-
this.altPressed = true;
|
|
659
|
-
if (event.keyCode === 88)
|
|
660
|
-
this.xPressed = true;
|
|
661
|
-
};
|
|
662
|
-
this.onKeyUp = (event) => {
|
|
663
|
-
if (event.shiftKey)
|
|
664
|
-
this.shiftPressed = false;
|
|
665
|
-
if (event.altKey)
|
|
666
|
-
this.altPressed = false;
|
|
667
|
-
if (event.keyCode === 88)
|
|
668
|
-
this.xPressed = false;
|
|
669
|
-
};
|
|
670
|
-
/**
|
|
671
|
-
* @tru.doc function
|
|
672
|
-
* @name truDesktopComponent.handleSelectAttempt
|
|
673
|
-
* @module tru.desktop
|
|
674
|
-
*
|
|
675
|
-
* @description
|
|
676
|
-
* Prevents the user from highlight desktop elements.
|
|
677
|
-
*
|
|
678
|
-
*/
|
|
679
|
-
this.handleSelectAttempt = (e) => {
|
|
680
|
-
var nodeName = e.target.nodeName.toLowerCase();
|
|
681
|
-
if (nodeName === 'input' || nodeName === 'textarea' || nodeName === 'select')
|
|
682
|
-
return true;
|
|
683
|
-
if (window.event) {
|
|
684
|
-
e.preventDefault();
|
|
685
|
-
}
|
|
686
|
-
return true;
|
|
687
|
-
};
|
|
688
|
-
this.windows = [];
|
|
689
|
-
}
|
|
690
|
-
ngOnInit() {
|
|
691
|
-
this.logoUrl = this.options.logoUrl;
|
|
692
|
-
this.options = Object.assign(this.desktop.options, this.options);
|
|
693
|
-
this.options.viewportTop = this.options.menubarConfig !== undefined ? this.options.menubarHeight + 1 : 0;
|
|
694
|
-
this.truWindowEventHandler.onOpen().subscribe((windiowEvent) => {
|
|
695
|
-
this.openWindow(windiowEvent, false);
|
|
696
|
-
});
|
|
697
|
-
document.onselectstart = this.handleSelectAttempt;
|
|
698
|
-
window.addEventListener('keydown', this.onKeyDown);
|
|
699
|
-
window.addEventListener('keyup', this.onKeyUp);
|
|
700
|
-
window.onbeforeunload = (e) => {
|
|
701
|
-
let hasChanges = this.viewportComponent.windowComponents.filter((w) => { return w.hasChanges() ? true : false; });
|
|
702
|
-
if (hasChanges.length) {
|
|
703
|
-
e = e || window.event;
|
|
704
|
-
var msg = this.textManager.msgConfirmExitWithChangesPending;
|
|
705
|
-
// For IE and Firefox
|
|
706
|
-
if (e) {
|
|
707
|
-
e.returnValue = msg;
|
|
708
|
-
}
|
|
709
|
-
// For Safari / chrome
|
|
710
|
-
return msg;
|
|
711
|
-
}
|
|
712
|
-
return false;
|
|
713
|
-
};
|
|
714
|
-
}
|
|
715
|
-
ngOnDestroy() {
|
|
716
|
-
window.removeEventListener('keydown', this.onKeyDown);
|
|
717
|
-
window.removeEventListener('keyup', this.onKeyUp);
|
|
718
|
-
}
|
|
719
|
-
}
|
|
720
|
-
TruDesktop.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: TruDesktop, deps: [{ token: i1.TruDesktopService }, { token: i2.TruTextManager }, { token: i3.TruWindowEventHandler }], target: i0.ɵɵFactoryTarget.Component });
|
|
721
|
-
TruDesktop.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.1", type: TruDesktop, selector: "tru-desktop", inputs: { options: "options" }, providers: [TruDesktopService], viewQueries: [{ propertyName: "viewportComponent", first: true, predicate: TruDesktopViewport, descendants: true }], ngImport: i0, template: "<div class=\"desktop-wrapper\">\r\n\r\n <div class=\"desktop-menubar-container\" [ngStyle]=\"{'height': options.menubarHeight + 'px'}\">\r\n <tru-desktop-menubar [desktopCtrl]=\"this\"></tru-desktop-menubar>\r\n </div>\r\n\r\n <tru-desktop-viewport [windows]=\"windows\" [desktopCtrl]=\"this\"></tru-desktop-viewport>\r\n\r\n <tru-desktop-taskbar [windows]=\"windows\" [desktopCtrl]=\"this\"></tru-desktop-taskbar>\r\n\r\n <img class=\"desktop-viewport-logo\" data-ng-show=\"logoUrl\" alt=\"\">\r\n</div>\r\n", styles: ["body{-webkit-user-select:none;user-select:none}input,textarea{-moz-user-select:text}.desktop-text{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:14px;line-height:1;color:#333}.desktop-wrapper{position:absolute!important;inset:0;background:#ffffff;overflow:hidden}.desktop-relative{position:relative}.desktop-display-none{display:none}.desktop-click-through{pointer-events:none}.desktop-menubar-container{position:absolute!important;top:0;left:0;right:0;height:26px;background:#f8f8f8;border-bottom:1px solid #e7e7e7;padding-left:5px}\n"], dependencies: [{ kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.TruDesktopMenubar, selector: "tru-desktop-menubar", inputs: ["desktopCtrl"] }, { kind: "component", type: i6.TruDesktopTaskbar, selector: "tru-desktop-taskbar", inputs: ["windows", "desktopCtrl"] }, { kind: "component", type: i7.TruDesktopViewport, selector: "tru-desktop-viewport", inputs: ["windows", "desktopCtrl"] }] });
|
|
722
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: TruDesktop, decorators: [{
|
|
723
|
-
type: Component,
|
|
724
|
-
args: [{ selector: 'tru-desktop', providers: [TruDesktopService], template: "<div class=\"desktop-wrapper\">\r\n\r\n <div class=\"desktop-menubar-container\" [ngStyle]=\"{'height': options.menubarHeight + 'px'}\">\r\n <tru-desktop-menubar [desktopCtrl]=\"this\"></tru-desktop-menubar>\r\n </div>\r\n\r\n <tru-desktop-viewport [windows]=\"windows\" [desktopCtrl]=\"this\"></tru-desktop-viewport>\r\n\r\n <tru-desktop-taskbar [windows]=\"windows\" [desktopCtrl]=\"this\"></tru-desktop-taskbar>\r\n\r\n <img class=\"desktop-viewport-logo\" data-ng-show=\"logoUrl\" alt=\"\">\r\n</div>\r\n", styles: ["body{-webkit-user-select:none;user-select:none}input,textarea{-moz-user-select:text}.desktop-text{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:14px;line-height:1;color:#333}.desktop-wrapper{position:absolute!important;inset:0;background:#ffffff;overflow:hidden}.desktop-relative{position:relative}.desktop-display-none{display:none}.desktop-click-through{pointer-events:none}.desktop-menubar-container{position:absolute!important;top:0;left:0;right:0;height:26px;background:#f8f8f8;border-bottom:1px solid #e7e7e7;padding-left:5px}\n"] }]
|
|
725
|
-
}], ctorParameters: function () { return [{ type: i1.TruDesktopService }, { type: i2.TruTextManager }, { type: i3.TruWindowEventHandler }]; }, propDecorators: { options: [{
|
|
726
|
-
type: Input
|
|
727
|
-
}], viewportComponent: [{
|
|
728
|
-
type: ViewChild,
|
|
729
|
-
args: [TruDesktopViewport]
|
|
730
|
-
}] } });
|
|
731
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1LWRlc2t0b3AuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90cnUtY29tbW9uLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvZGVza3RvcC90cnUtZGVza3RvcC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydS1jb21tb24tbGliL3NyYy9saWIvY29tcG9uZW50cy9kZXNrdG9wL3RydS1kZXNrdG9wLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQWEsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRy9FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBR3pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7Ozs7QUFRckUsTUFBTSxPQUFPLFVBQVU7SUFJckIsWUFDVSxjQUFpQyxFQUNqQyxXQUEyQixFQUMzQixxQkFBNEM7UUFGNUMsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBQ2pDLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUMzQiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBR3RELGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLFlBQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzlDLDZCQUF3QixHQUFHLEVBQUUsQ0FBQztRQUM5Qiw2QkFBd0IsR0FBRyxHQUFHLENBQUM7UUFDL0IsOEJBQXlCLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUN4RyxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsZ0JBQVcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxvQkFBb0Is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aUJBQWlCO3NCQUF2RCxTQUFTO3VCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgUXVlcnlMaXN0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVHJ1V2luZG93RXZlbnRBcmdzIH0gZnJvbSAnLi9zZXJ2aWNlcy90cnUtd2luZG93LWV2ZW50LWFyZ3MnO1xyXG5pbXBvcnQgeyBUcnVXaW5kb3dFdmVudEhhbmRsZXIgfSBmcm9tICcuL3NlcnZpY2VzL3RydS13aW5kb3ctZXZlbnQtaGFuZGxlcic7XG5pbXBvcnQgeyBUcnVEZXNrdG9wU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdHJ1LWRlc2t0b3Atc2VydmljZSc7XG5pbXBvcnQgeyBUcnVEZXNrdG9wVmlld0NvbmZpZyB9IGZyb20gJy4vY2xhc3Nlcy90cnUtZGVza3RvcC12aWV3LWNvbmZpZyc7XHJcbmltcG9ydCB7IFRydVRleHRNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdHJ1LXRleHQtbWFuYWdlcic7XHJcbmltcG9ydCB7IFRydURlc2t0b3BXaW5kb3cgfSBmcm9tICcuL3dpbmRvdy90cnUtZGVza3RvcC13aW5kb3cnO1xyXG5pbXBvcnQgeyBUcnVEZXNrdG9wVmlld3BvcnQgfSBmcm9tICcuL3ZpZXdwb3J0L3RydS1kZXNrdG9wLXZpZXdwb3J0JztcclxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0cnUtZGVza3RvcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi90cnUtZGVza3RvcC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdHJ1LWRlc2t0b3AuY3NzJ10sXG4gIHByb3ZpZGVyczogW1RydURlc2t0b3BTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBUcnVEZXNrdG9wIGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgb3B0aW9uczogYW55O1xuICBAVmlld0NoaWxkKFRydURlc2t0b3BWaWV3cG9ydCkgcHJpdmF0ZSB2aWV3cG9ydENvbXBvbmVudCE6IFRydURlc2t0b3BWaWV3cG9ydDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRlc2t0b3BTZXJ2aWNlOiBUcnVEZXNrdG9wU2VydmljZSxcbiAgICBwcml2YXRlIHRleHRNYW5hZ2VyOiBUcnVUZXh0TWFuYWdlcixcbiAgICBwcml2YXRlIHRydVdpbmRvd0V2ZW50SGFuZGxlcjogVHJ1V2luZG93RXZlbnRIYW5kbGVyKSB7XG4gIH1cclxuXG4gIG1pbmltaXplQWxsID0gZmFsc2U7XG4gIGRlc2t0b3AgPSB0aGlzLmRlc2t0b3BTZXJ2aWNlLmNyZWF0ZURlc2t0b3AoKTtcbiAgbWluV2luZG93Q2FzY2FkZVBvc2l0aW9uID0gNDA7XG4gIG1heFdpbmRvd0Nhc2NhZGVQb3NpdGlvbiA9IDEwMDtcbiAgbGFzdFdpbmRvd0Nhc2NhZGVQb3NpdGlvbiA9IHsgdG9wOiB0aGlzLm1pbldpbmRvd0Nhc2NhZGVQb3NpdGlvbiwgbGVmdDogdGhpcy5taW5XaW5kb3dDYXNjYWRlUG9zaXRpb24gfTtcbiAgc2hpZnRQcmVzc2VkID0gZmFsc2U7XG4gIGFsdFByZXNzZWQgPSBmYWxzZTtcbiAgeFByZXNzZWQgPSBmYWxzZTtcbiAga2V5Ym9hcmRNYXAgPSBbXCJcIiwgXCJcIiwgXCJcIiwgXCJDQU5DRUxcIiwgXCJcIiwgXCJcIiwgXCJIRUxQXCIsIFwiXCIsIFwiQkFDS19TUEFDRVwiLCBcIlRBQlwiLCBcIlwiLCBcIlwiLCBcIkNMRUFSXCIsIFwiRU5URVJcIiwgXCJSRVRVUk5cIiwgXCJcIiwgXCJTSElGVFwiLCBcIkNPTlRST0xcIiwgXCJBTFRcIiwgXCJQQVVTRVwiLCBcIkNBUFNfTE9DS1wiLCBcIktBTkFcIiwgXCJFSVNVXCIsIFwiSlVOSkFcIiwgXCJGSU5BTFwiLCBcIkhBTkpBXCIsIFwiXCIsIFwiRVNDQVBFXCIsIFwiQ09OVkVSVFwiLCBcIk5PTkNPTlZFUlRcIiwgXCJBQ0NFUFRcIiwgXCJNT0RFQ0hBTkdFXCIsIFwiU1BBQ0VcIiwgXCJQQUdFX1VQXCIsIFwiUEFHRV9ET1dOXCIsIFwiRU5EXCIsIFwiSE9NRVwiLCBcIkxFRlRcIiwgXCJVUFwiLCBcIlJJR0hUXCIsIFwiRE9XTlwiLCBcIlNFTEVDVFwiLCBcIlBSSU5UXCIsIFwiRVhFQ1VURVwiLCBcIlBSSU5UU0NSRUVOXCIsIFwiSU5TRVJUXCIsIFwiREVMRVRFXCIsIFwiXCIsIFwiMFwiLCBcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCIsIFwiNlwiLCBcIjdcIiwgXCI4XCIsIFwiOVwiLCBcIkNPTE9OXCIsIFwiU0VNSUNPTE9OXCIsIFwiTEVTU19USEFOXCIsIFwiRVFVQUxTXCIsIFwiR1JFQVRFUl9USEFOXCIsIFwiUVVFU1RJT05fTUFSS1wiLCBcIkFUXCIsIFwiQVwiLCBcIkJcIiwgXCJDXCIsIFwiRFwiLCBcIkVcIiwgXCJGXCIsIFwiR1wiLCBcIkhcIiwgXCJJXCIsIFwiSlwiLCBcIktcIiwgXCJMXCIsIFwiTVwiLCBcIk5cIiwgXCJPXCIsIFwiUFwiLCBcIlFcIiwgXCJSXCIsIFwiU1wiLCBcIlRcIiwgXCJVXCIsIFwiVlwiLCBcIldcIiwgXCJYXCIsIFwiWVwiLCBcIlpcIiwgXCJXSU5cIiwgXCJcIiwgXCJDT05URVhUX01FTlVcIiwgXCJcIiwgXCJTTEVFUFwiLCBcIk5VTVBBRDBcIiwgXCJOVU1QQUQxXCIsIFwiTlVNUEFEMlwiLCBcIk5VTVBBRDNcIiwgXCJOVU1QQUQ0XCIsIFwiTlVNUEFENVwiLCBcIk5VTVBBRDZcIiwgXCJOVU1QQUQ3XCIsIFwiTlVNUEFEOFwiLCBcIk5VTVBBRDlcIiwgXCJNVUxUSVBMWVwiLCBcIkFERFwiLCBcIlNFUEFSQVRPUlwiLCBcIlNVQlRSQUNUXCIsIFwiREVDSU1BTFwiLCBcIkRJVklERVwiLCBcIkYxXCIsIFwiRjJcIiwgXCJGM1wiLCBcIkY0XCIsIFwiRjVcIiwgXCJGNlwiLCBcIkY3XCIsIFwiRjhcIiwgXCJGOVwiLCBcIkYxMFwiLCBcIkYxMVwiLCBcIkYxMlwiLCBcIkYxM1wiLCBcIkYxNFwiLCBcIkYxNVwiLCBcIkYxNlwiLCBcIkYxN1wiLCBcIkYxOFwiLCBcIkYxOVwiLCBcIkYyMFwiLCBcIkYyMVwiLCBcIkYyMlwiLCBcIkYyM1wiLCBcIkYyNFwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIk5VTV9MT0NLXCIsIFwiU0NST0xMX0xPQ0tcIiwgXCJXSU5fT0VNX0ZKX0pJU0hPXCIsIFwiV0lOX09FTV9GSl9NQVNTSE9VXCIsIFwiV0lOX09FTV9GSl9UT1VST0tVXCIsIFwiV0lOX09FTV9GSl9MT1lBXCIsIFwiV0lOX09FTV9GSl9ST1lBXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiQ0lSQ1VNRkxFWFwiLCBcIkVYQ0xBTUFUSU9OXCIsIFwiRE9VQkxFX1FVT1RFXCIsIFwiSEFTSFwiLCBcIkRPTExBUlwiLCBcIlBFUkNFTlRcIiwgXCJBTVBFUlNBTkRcIiwgXCJVTkRFUlNDT1JFXCIsIFwiT1BFTl9QQVJFTlwiLCBcIkNMT1NFX1BBUkVOXCIsIFwiQVNURVJJU0tcIiwgXCJQTFVTXCIsIFwiUElQRVwiLCBcIkhZUEhFTl9NSU5VU1wiLCBcIk9QRU5fQ1VSTFlfQlJBQ0tFVFwiLCBcIkNMT1NFX0NVUkxZX0JSQUNLRVRcIiwgXCJUSUxERVwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlZPTFVNRV9NVVRFXCIsIFwiVk9MVU1FX0RPV05cIiwgXCJWT0xVTUVfVVBcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJDT01NQVwiLCBcIlwiLCBcIlBFUklPRFwiLCBcIlNMQVNIXCIsIFwiQkFDS19RVU9URVwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIk9QRU5fQlJBQ0tFVFwiLCBcIkJBQ0tfU0xBU0hcIiwgXCJDTE9TRV9CUkFDS0VUXCIsIFwiUVVPVEVcIiwgXCJcIiwgXCJNRVRBXCIsIFwiQUxUR1JcIiwgXCJcIiwgXCJXSU5fSUNPX0hFTFBcIiwgXCJXSU5fSUNPXzAwXCIsIFwiXCIsIFwiV0lOX0lDT19DTEVBUlwiLCBcIlwiLCBcIlwiLCBcIldJTl9PRU1fUkVTRVRcIiwgXCJXSU5fT0VNX0pVTVBcIiwgXCJXSU5fT0VNX1BBMVwiLCBcIldJTl9PRU1fUEEyXCIsIFwiV0lOX09FTV9QQTNcIiwgXCJXSU5fT0VNX1dTQ1RSTFwiLCBcIldJTl9PRU1fQ1VTRUxcIiwgXCJXSU5fT0VNX0FUVE5cIiwgXCJXSU5fT0VNX0ZJTklTSFwiLCBcIldJTl9PRU1fQ09QWVwiLCBcIldJTl9PRU1fQVVUT1wiLCBcIldJTl9PRU1fRU5MV1wiLCBcIldJTl9PRU1fQkFDS1RBQlwiLCBcIkFUVE5cIiwgXCJDUlNFTFwiLCBcIkVYU0VMXCIsIFwiRVJFT0ZcIiwgXCJQTEFZXCIsIFwiWk9PTVwiLCBcIlwiLCBcIlBBMVwiLCBcIldJTl9PRU1fQ0xFQVJcIiwgXCJcIl07XG4gIGxvZ29VcmwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmdldERlc2t0b3BcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0dXJuIGFuIG9iamVjdCBvZiBkZXNrdG9wLlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSBkZXNrdG9wLlxuICAgKi9cbiAgZ2V0RGVza3RvcCA9ICgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5kZXNrdG9wO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmdldE9wdGlvbnNcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0dXJuIGFuIG9iamVjdCBvZiBkZXNrdG9wIG9wdGlvbnMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IG9wdGlvbnMuXG4gICAqL1xuICBnZXRPcHRpb25zID0gKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuZ2V0V2luZG93c1xuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2Ygd2luZG93cy5cbiAgICpcbiAgICogQHJldHVybnMge2FycmF5fSB3aW5kb3dzLlxuICAgKi9cbiAgZ2V0V2luZG93cyA9ICgpID0+IHtcbiAgICByZXR1cm4gdGhpcy53aW5kb3dzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmdldE5leHRNYXhaSW5kZXhcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSXRlcmF0ZXMgdGhyb3VnaCBhbGwgd2luZG93IG9iamVjdHMgaW4gdGhlIHdpbmRvd3MgYXJyYXkgdG8gZmluZCB0aGUgbWF4IHotaW5kZXhcbiAgICogYW5kIGluY3JlYXNlcyB0aGUgdmFsdWUgZm91bmQgYnkgMS5cbiAgICpcbiAgICogQHJldHVybnMge2ludH1cbiAgICovXG4gIGdldE5leHRNYXhaSW5kZXggPSAoKSA9PiB7XG4gICAgdmFyIG1heCA9IDA7XG4gICAgdmFyIHRtcDtcbiAgICBmb3IgKHZhciBpID0gdGhpcy53aW5kb3dzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB0bXAgPSB0aGlzLndpbmRvd3NbaV0uekluZGV4O1xuICAgICAgaWYgKHRtcCA+IG1heCkgbWF4ID0gdG1wO1xuICAgIH1cbiAgICByZXR1cm4gKyttYXg7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuY2xlYXJBY3RpdmVcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSXRlcmF0ZXMgdGhyb3VnaCBhbGwgd2luZG93IG9iamVjdHMgaW4gdGhlIHdpbmRvd3NcbiAgICogYW5kIHNldHMgdGhlIGFjdGl2ZSBwcm9wZXJ0eSB0byBmYWxzZS5cbiAgICpcbiAgICovXG4gIGNsZWFyQWN0aXZlID0gKCkgPT4ge1xuICAgIHRoaXMud2luZG93cy5mb3JFYWNoKCh3aW5kb3c6IGFueSkgPT4ge1xuICAgICAgd2luZG93LmFjdGl2ZSA9IGZhbHNlO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmdldEFjdGl2ZVdpbmRvd1xuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBHZXRzIHRoZSBhY3RpdmUgd2luZG93LlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSB2aWV3IG9iamVjdC5cbiAgICovXG4gIGdldEFjdGl2ZVdpbmRvdyA9ICgpOiBhbnkgPT4ge1xuICAgIHZhciBhY3RpdmVXaW5kb3cgPSBudWxsO1xuICAgIHRoaXMud2luZG93cy5mb3JFYWNoKCh3ZHc6IGFueSkgPT4ge1xuICAgICAgaWYgKHdkdy5hY3RpdmUgPT09IHRydWUpIHtcbiAgICAgICAgYWN0aXZlV2luZG93ID0gd2R3O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhY3RpdmVXaW5kb3c7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuZ2V0QWN0aXZlVmlld1xuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBHZXRzIHRoZSBhY3RpdmUgdmlldy5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH0gdmlldyBvYmplY3QuXG4gICAqL1xuICBnZXRBY3RpdmVWaWV3ID0gKHdkdzogYW55KSA9PiB7XG4gICAgdmFyIGFjdGl2ZVZpZXcgPSBudWxsO1xuICAgIHdkdy52aWV3cy5mb3JFYWNoKCh2aWV3OiBhbnkpID0+IHtcbiAgICAgIGlmICh2aWV3LmFjdGl2ZSQuZ2V0VmFsdWUoKSA9PT0gdHJ1ZSkge1xuICAgICAgICBhY3RpdmVWaWV3ID0gdmlldztcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYWN0aXZlVmlldztcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5hbGxXaW5kb3dzQXJlTWluaW1pemVkXG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEl0ZXJhdGVzIHRocm91Z2ggd2luZG93cyB0byBkZXRlcm1pbmUgaWYgYWxsIGFyZSBtaW5pbWl6ZWQuXG4gICAqXG4gICAqL1xuICBhbGxXaW5kb3dzQXJlTWluaW1pemVkID0gKCkgPT4ge1xuICAgIHZhciBhbGxNaW5pbWl6ZWQgPSB0cnVlO1xuICAgIHRoaXMud2luZG93cy5mb3JFYWNoKCh3aW5kb3c6IGFueSkgPT4ge1xuICAgICAgaWYgKCF3aW5kb3cubWluaW1pemVkKSB7XG4gICAgICAgIGFsbE1pbmltaXplZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhbGxNaW5pbWl6ZWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuaGlkZVNob3dBbGxcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSGlkZXMvc2hvd3MgYWxsIHdpbmRvd3NcbiAgICpcbiAgICovXG4gIGhpZGVTaG93QWxsID0gKCkgPT4ge1xuICAgIHRoaXMubWluaW1pemVBbGwgPSB0aGlzLmFsbFdpbmRvd3NBcmVNaW5pbWl6ZWQoKSA/IGZhbHNlIDogIXRoaXMubWluaW1pemVBbGw7XG4gICAgdGhpcy53aW5kb3dzLmZvckVhY2goKHdkdzogYW55KSA9PiB7XG4gICAgICBpZiAod2R3Lm91dE9mQm91bmRzKSB0aGlzLnJlY292ZXIod2R3KTtcbiAgICAgIHdkdy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgIHdkdy5taW5pbWl6ZWQgPSB0aGlzLm1pbmltaXplQWxsO1xuICAgIH0pO1xuICAgIHRoaXMuYWN0aXZhdGVGb3JlbW9zdFdpbmRvdygpO1xuICAgIHJldHVybiB0aGlzLm1pbmltaXplQWxsO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXHJcbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5maW5kV2luZG93Vmlld0RpcmVjdGl2ZVxyXG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqIExvb2tzIGZvciBwcmV2aW91c2x5IG9wZW4gd2luZG93IHdpdGggYSB2aWV3IGRpcmVjdGl2ZVxyXG4gICAqXHJcbiAgICovXHJcbiAgZmluZFdpbmRvd1ZpZXdEaXJlY3RpdmUgPSAod2luZG93Vmlld0RpcmVjdGl2ZTogYW55KSA9PiB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMud2luZG93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMud2luZG93c1tpXS52aWV3cy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGlmICh0aGlzLndpbmRvd3NbaV0udmlld3NbMF0udmlld0RpcmVjdGl2ZSA9PT0gd2luZG93Vmlld0RpcmVjdGl2ZSlcclxuICAgICAgICAgIHJldHVybiB0aGlzLndpbmRvd3NbaV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQub3BlbldpbmRvd1xuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBEaXNwbGF5cyBhIG5ldyB3aW5kb3cuIEFsbCB3aW5kb3cgcHJvcGVydGllcyBkZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgd2lsbCBiZVxuICAgKiBvdmVybGFpZCBoZXJlIGJlZm9yZSBkaXNwbGF5aW5nIHRoZSB3aW5kb3dcbiAgICpcbiAgICovXG4gIG9wZW5XaW5kb3cgPSAod2luZG93Q29uZmlnT3ZlcmxheXM6IGFueSwgc2luZ2xlSW5zdGFuY2U6IGFueSkgPT4ge1xuICAgIGxldCBhY3RpdmVXaW5kb3cgPSB0aGlzLmdldEFjdGl2ZVdpbmRvdygpO1xyXG4gICAgaWYgKGFjdGl2ZVdpbmRvdyAmJiBhY3RpdmVXaW5kb3cuaXNNb2RhbCkge1xyXG4gICAgICBhY3RpdmVXaW5kb3cuaW52YWxpZE9wZXJhdGlvbiA9IHRydWU7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2luZ2xlSW5zdGFuY2UpIHtcclxuICAgICAgbGV0IHdpbmRvdyA9IHRoaXMuZmluZFdpbmRvd1ZpZXdEaXJlY3RpdmUod2luZG93Q29uZmlnT3ZlcmxheXMudmlld3NbMF0udmlld0RpcmVjdGl2ZSk7XHJcbiAgICAgIGlmICh3aW5kb3cpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVdpbmRvd1N0YXRlKHdpbmRvdyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdpbmRvd0NvbmZpZ092ZXJsYXlzLmlzTW9kYWwpIHtcclxuICAgICAgbGV0IGhlaWdodE9mZnNldCA9IChwYXJzZUludCh3aW5kb3dDb25maWdPdmVybGF5cy5oZWlnaHQsIDEwKSAvIDIpICsgMzA7XHJcbiAgICAgIGxldCB3aWR0aE9mZnNldCA9IChwYXJzZUludCh3aW5kb3dDb25maWdPdmVybGF5cy53aWR0aCwgMTApIC8gMik7XHJcbiAgICAgIHdpbmRvd0NvbmZpZ092ZXJsYXlzLnRvcCA9ICdjYWxjKDUwJSAtICcgKyBoZWlnaHRPZmZzZXQgKyAncHggKSc7XHJcbiAgICAgIHdpbmRvd0NvbmZpZ092ZXJsYXlzLmxlZnQgPSAnY2FsYyg1MCUgLSAnICsgd2lkdGhPZmZzZXQgKyAncHggKSc7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xyXG4gICAgbGV0IGNvbmZpZ3VyZWRXaW5kb3cgPSB0aGlzLmNvbmZpZ3VyZVdpbmRvdyh3aW5kb3dDb25maWdPdmVybGF5cyk7XHJcbiAgICBjb25maWd1cmVkV2luZG93LnZpZXdzID0gdGhpcy5jb25maWd1cmVWaWV3cyh3aW5kb3dDb25maWdPdmVybGF5cywgY29uZmlndXJlZFdpbmRvdyk7XHJcbiAgICBpZiAoIWNvbmZpZ3VyZWRXaW5kb3cuaXNNb2RhbCkge1xyXG4gICAgICBjb25maWd1cmVkV2luZG93LmNhc2NhZGVXaW5kb3cgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zYXZlUG9zaXRpb24oY29uZmlndXJlZFdpbmRvdyk7XHJcbiAgICAgIHRoaXMubWF4aW1pemUoY29uZmlndXJlZFdpbmRvdyk7XHJcbiAgICAgIHRoaXMud2luZG93cy5wdXNoKGNvbmZpZ3VyZWRXaW5kb3cpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy53aW5kb3dzLnB1c2goY29uZmlndXJlZFdpbmRvdyk7XHJcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuY29uZmlndXJlV2luZG93XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENyZWF0ZXMgYSBuZXcgd2luZG93IGluc3RhbmNlLlxuICAgKlxuICAgKi9cbiAgY29uZmlndXJlV2luZG93ID0gKHdpbmRvd0NvbmZpZ092ZXJsYXlzOiBhbnkpID0+IHtcbiAgICB2YXIgd2luZG93Q29uZmlnSW5zdGFuY2UgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmRlc2t0b3Aud2luZG93Q29uZmlnKTtcbiAgICB3aW5kb3dDb25maWdJbnN0YW5jZS5zYXZlZFBvc2l0aW9uID0gT2JqZWN0LmNyZWF0ZSh7IHRvcDogMCwgbGVmdDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMCwgaGVpZ2h0OiAwLCB3aWR0aDogMCB9KTtcbiAgICB3aW5kb3dDb25maWdJbnN0YW5jZS56SW5kZXggPSB0aGlzLmdldE5leHRNYXhaSW5kZXgoKTtcbiAgICAvL3dpbmRvd0NvbmZpZ0luc3RhbmNlLmdsb2JhbHMgPSBPYmplY3QuYXNzaWduKHt9LCAkcm9vdFNjb3BlLiRldmFsKHRoaXMub3B0aW9ucy5nbG9iYWxzKSk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24od2luZG93Q29uZmlnSW5zdGFuY2UsIHdpbmRvd0NvbmZpZ092ZXJsYXlzKTtcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5jb25maWd1cmVWaWV3c1xuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDcmVhdGVzIG9uZSBvciBtb3JlIHZpZXcgaW5zdGFuY2VzXG4gICAqXG4gICAqL1xuICBjb25maWd1cmVWaWV3cyA9ICh3aW5kb3dDb25maWdPdmVybGF5czogYW55LCBjb25maWd1cmVkV2luZG93OiBhbnkpOiBBcnJheTxhbnk+ID0+IHtcbiAgICBsZXQgY29uZmlndXJlZFZpZXdzOiBBcnJheTxhbnk+ID0gW107XG4gICAgd2luZG93Q29uZmlnT3ZlcmxheXMudmlld3MuZm9yRWFjaCgodmlldzogYW55KSA9PiB7XG4gICAgICBsZXQgY29uZmlndXJlZFZpZXcgPSBuZXcgVHJ1RGVza3RvcFZpZXdDb25maWcoKTtcclxuICAgICAgY29uZmlndXJlZFZpZXcuY29tcG9uZW50TmFtZSA9IHZpZXcuY29tcG9uZW50TmFtZTtcclxuICAgICAgY29uZmlndXJlZFZpZXcuZW50aXRpZXMgPSB2aWV3LmVudGl0aWVzO1xyXG4gICAgICBjb25maWd1cmVkVmlldy5lbnRpdHlJbmRleCA9IHZpZXcuZW50aXR5SW5kZXg7XHJcbiAgICAgIGNvbmZpZ3VyZWRWaWV3LmlzRGlydHkgPSB2aWV3LmlzRGlydHk7XHJcbiAgICAgIGNvbmZpZ3VyZWRWaWV3LmlzRWRpdGluZyA9IHZpZXcuaXNFZGl0aW5nO1xyXG4gICAgICBjb25maWd1cmVkVmlldy5pc0ludmFsaWQgPSB2aWV3LmlzVmFsaWQ7XHJcbiAgICAgIGNvbmZpZ3VyZWRWaWV3Lm9wZW5Bc0RldGFpVmlldyA9IHZpZXcub3BlbkFzRGV0YWlsVmlldztcbiAgICAgIC8vdmlld0NvbmZpZ0luc3RhbmNlLmdsb2JhbHMgPSB0aGlzLm9wdGlvbnMuZ2xvYmFscztcbiAgICAgIC8vbGV0IGNvbmZpZ3VyZWRWaWV3ID0gT2JqZWN0LmFzc2lnbih2aWV3Q29uZmlnSW5zdGFuY2UsIHZpZXcpO1xuICAgICAgY29uZmlndXJlZFZpZXcud2luZG93ID0gY29uZmlndXJlZFdpbmRvdztcbiAgICAgIGNvbmZpZ3VyZWRWaWV3cy5wdXNoKGNvbmZpZ3VyZWRWaWV3KTtcbiAgICB9KTtcbiAgICByZXR1cm4gY29uZmlndXJlZFZpZXdzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmNsb3NlV2luZG93XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJlbW92ZSBhIHdpbmRvdyB7b2JqZWN0fSBmcm9tIHRoZSB3aW5kb3dzIGFycmF5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gcmV0dXJucyB0cnVlIGlmIHdpbmRvdyB3YXMgY2xvc2VkLCBmYWxzZSBpZiBub3QgY2xvc2VkLlxuICAgKi9cbiAgY2xvc2VXaW5kb3cgPSAod2R3OiBhbnkpID0+IHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5hbGxvd0RpcnR5Q2xvc2UgJiYgd2R3LmlzRGlydHkpIHtcbiAgICAgIGFsZXJ0KFwiVW5zYXZlZCBDaGFuZ2VzLiBTYXZlIGNoYW5nZXMgYmVmb3JlIGNsb3Npbmcgd2luZG93LlwiKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5hbGxvd0ludmFsaWRDbG9zZSAmJiB3ZHcuaXNJbnZhbGlkKSB7XG4gICAgICBhbGVydChcIkRhdGEgaXMgaW52YWxpZC4gQ29ycmVjdCBJbnZhbGlkIGRhdGEgYmVmb3JlIGNsb3Npbmcgd2luZG93LlwiKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNhbkNsb3NlRm4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5jYW5DbG9zZUZuKHdkdykpIHtcbiAgICAgICAgdGhpcy53aW5kb3dzLnNwbGljZSh0aGlzLndpbmRvd3MuaW5kZXhPZih3ZHcpLCAxKTtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZUZvcmVtb3N0V2luZG93KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53aW5kb3dzLnNwbGljZSh0aGlzLndpbmRvd3MuaW5kZXhPZih3ZHcpLCAxKTtcbiAgICAgIHRoaXMuYWN0aXZhdGVGb3JlbW9zdFdpbmRvdygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5hY3RpdmF0ZUZvcmVtb3N0V2luZG93XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldCB0aGUgZm9yZW1vc3Qgd2luZG93IHRvIGFuIGFjdGl2ZSBzdGF0ZVxuICAgKlxuICAgKi9cbiAgYWN0aXZhdGVGb3JlbW9zdFdpbmRvdyA9ICgpID0+IHtcbiAgICB2YXIgZm9yZW1vc3QgPSB1bmRlZmluZWQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLndpbmRvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICgoZm9yZW1vc3QgPT09IHVuZGVmaW5lZCB8fCB0aGlzLndpbmRvd3NbaV0uekluZGV4ID4gZm9yZW1vc3QuekluZGV4KSAmJiAhdGhpcy53aW5kb3dzW2ldLm1pbmltaXplZCAmJiAhdGhpcy53aW5kb3dzW2ldLm91dE9mQm91bmRzKVxuICAgICAgICBmb3JlbW9zdCA9IHRoaXMud2luZG93c1tpXTtcbiAgICB9XG4gICAgaWYgKGZvcmVtb3N0KVxuICAgICAgZm9yZW1vc3QuYWN0aXZlID0gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5hY3RpdmF0ZU5leHRXaW5kb3dcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0IHRoZSBuZXh0IHdpbmRvdyB0byBhbiBhY3RpdmUgc3RhdGVcbiAgICpcbiAgICovXG4gIGFjdGl2YXRlTmV4dFdpbmRvdyA9IChhY3RpdmVXaW5kb3dMb2NhdGlvbjogYW55KSA9PiB7XG4gICAgaWYgKHRoaXMud2luZG93cy5sZW5ndGggPD0gMSkgcmV0dXJuO1xuICAgIHZhciBiYWNrZW5kID0gdGhpcy53aW5kb3dzLnNsaWNlKGFjdGl2ZVdpbmRvd0xvY2F0aW9uKTtcbiAgICB2YXIgZnJvbnRlbmQgPSB0aGlzLndpbmRvd3Muc2xpY2UoMCwgYWN0aXZlV2luZG93TG9jYXRpb24gLSAxKTtcbiAgICB2YXIgc29ydGVkID0gYmFja2VuZC5jb25jYXQoZnJvbnRlbmQpO1xuICAgIHZhciBuZXh0V2luZG93ID0gdW5kZWZpbmVkO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc29ydGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXNvcnRlZFtpXS5taW5pbWl6ZWQgJiYgIXNvcnRlZFtpXS5vdXRPZkJvdW5kcyAmJiAhbmV4dFdpbmRvdylcbiAgICAgICAgbmV4dFdpbmRvdyA9IHNvcnRlZFtpXTtcbiAgICB9XG5cbiAgICBpZiAobmV4dFdpbmRvdykge1xuICAgICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xuICAgICAgbmV4dFdpbmRvdy56SW5kZXggPSB0aGlzLmdldE5leHRNYXhaSW5kZXgoKTtcbiAgICAgIG5leHRXaW5kb3cuYWN0aXZlID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuYWN0aXZhdGVQcmV2aW91c1dpbmRvd1xuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXQgdGhlIHByZXZpb3VzIHdpbmRvdyB0byBhbiBhY3RpdmUgc3RhdGVcbiAgICpcbiAgICovXG4gIGFjdGl2YXRlUHJldmlvdXNXaW5kb3cgPSAoYWN0aXZlV2luZG93TG9jYXRpb246IGFueSkgPT4ge1xuICAgIGlmICh0aGlzLndpbmRvd3MubGVuZ3RoIDw9IDEpIHJldHVybjtcbiAgICB2YXIgYmFja2VuZCA9IHRoaXMud2luZG93cy5zbGljZShhY3RpdmVXaW5kb3dMb2NhdGlvbik7XG4gICAgdmFyIGZyb250ZW5kID0gdGhpcy53aW5kb3dzLnNsaWNlKDAsIGFjdGl2ZVdpbmRvd0xvY2F0aW9uIC0gMSk7XG4gICAgdmFyIHNvcnRlZCA9IGJhY2tlbmQuY29uY2F0KGZyb250ZW5kKTtcbiAgICB2YXIgbmV4dFdpbmRvdyA9IHVuZGVmaW5lZDtcbiAgICBmb3IgKHZhciBpID0gc29ydGVkLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAoIXNvcnRlZFtpXS5taW5pbWl6ZWQgJiYgIXNvcnRlZFtpXS5vdXRPZkJvdW5kcyAmJiAhbmV4dFdpbmRvdylcbiAgICAgICAgbmV4dFdpbmRvdyA9IHNvcnRlZFtpXTtcbiAgICB9XG5cbiAgICBpZiAobmV4dFdpbmRvdykge1xuICAgICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xuICAgICAgbmV4dFdpbmRvdy56SW5kZXggPSB0aGlzLmdldE5leHRNYXhaSW5kZXgoKTtcbiAgICAgIG5leHRXaW5kb3cuYWN0aXZlID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQubWluaW1pemVcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVmlzdWFsbHkgcmVtb3ZlcyB3aW5kb3cgZnJvbSB0aGUgdmlld3BvcnQuXG4gICAqXG4gICAqL1xuICBtaW5pbWl6ZSA9ICh3aW5kb3c6IGFueSkgPT4ge1xuICAgIHRoaXMuc2F2ZVBvc2l0aW9uKHdpbmRvdyk7XG5cbiAgICB3aW5kb3cuYWN0aXZlID0gZmFsc2U7XG4gICAgd2luZG93Lm1pbmltaXplZCA9IHRydWU7XG4gICAgdGhpcy5hY3RpdmF0ZUZvcmVtb3N0V2luZG93KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQubWF4aW1pemVcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUG9zaXRpb25zIHdpbmRvdyBzdWNoIHRoYXQgaXQgZmlsbHMgdGhlIHdob2xlIHZpZXdwb3J0LlxuICAgKlxuICAgKi9cbiAgbWF4aW1pemUgPSAod2luZG93OiBhbnkpID0+IHtcbiAgICB3aW5kb3cudG9wID0gMDtcbiAgICB3aW5kb3cubGVmdCA9IDA7XG4gICAgd2luZG93LnJpZ2h0ID0gMDtcbiAgICB3aW5kb3cuYm90dG9tID0gMDtcbiAgICB3aW5kb3cuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgIHdpbmRvdy53aWR0aCA9ICcxMDAlJztcbiAgICB3aW5kb3cubWF4aW1pemVkID0gJ2ZpbGwnO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50Lm1heGltaXplTGVmdFxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBQb3NpdGlvbnMgd2luZG93IHN1Y2ggdGhhdCBpdCBmaWxscyB0aGUgbGVmdCBwb3J0aW9uIHZpZXdwb3J0LlxuICAgKlxuICAgKi9cbiAgbWF4aW1pemVMZWZ0ID0gKHdpbmRvdzogYW55KSA9PiB7XG4gICAgd2luZG93LnNwbGl0ID0gdHJ1ZTtcbiAgICB3aW5kb3cudG9wID0gMDtcbiAgICB3aW5kb3cubGVmdCA9IDA7XG4gICAgd2luZG93LmJvdHRvbSA9IDA7XG4gICAgd2luZG93LndpZHRoID0gJzUwJSc7XG4gICAgd2luZG93LmhlaWdodCA9ICdhdXRvJztcbiAgICB3aW5kb3cubWF4aW1pemVkID0gJ2xlZnQnO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50Lm1heGltaXplUmlnaHRcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUG9zaXRpb25zIHdpbmRvdyBzdWNoIHRoYXQgaXQgZmlsbHMgdGhlIHJpZ2h0IHBvcnRpb24gdmlld3BvcnQuXG4gICAqXG4gICAqL1xuICBtYXhpbWl6ZVJpZ2h0ID0gKHdpbmRvdzogYW55KSA9PiB7XG4gICAgd2luZG93LnRvcCA9IDA7XG4gICAgd2luZG93LmxlZnQgPSAnNTAlJztcbiAgICB3aW5kb3cucmlnaHQgPSAwO1xuICAgIHdpbmRvdy5ib3R0b20gPSAwO1xuICAgIHdpbmRvdy53aWR0aCA9ICc1MCUnO1xuICAgIHdpbmRvdy5oZWlnaHQgPSAnYXV0byc7XG4gICAgd2luZG93Lm1heGltaXplZCA9ICdyaWdodCc7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQucmVjb3ZlclxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBCcmluZ3Mgd2luZG93IGJhY2sgaW50byB2aWV3IHdoZW4gaXQgaGFzIGVzY2FwZWQgdGhlIHZpZXdwb3J0LlxuICAgKlxuICAgKi9cbiAgcmVjb3ZlciA9ICh3aW5kb3c6IGFueSkgPT4ge1xuICAgIHdpbmRvdy5hY3RpdmUgPSB0cnVlO1xuICAgIHdpbmRvdy5vdXRPZkJvdW5kcyA9IGZhbHNlO1xuICAgIHdpbmRvdy5taW5pbWl6ZWQgPSBmYWxzZTtcbiAgICB3aW5kb3cuekluZGV4ID0gdGhpcy5nZXROZXh0TWF4WkluZGV4KCk7XG4gICAgdGhpcy5jYXNjYWRlV2luZG93KHdpbmRvdyk7XG4gICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xuICAgIHRoaXMuYWN0aXZhdGVGb3JlbW9zdFdpbmRvdygpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LnJlc3RvcmVcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICovXG4gIHJlc3RvcmUgPSAod2R3OiBhbnkpID0+IHtcbiAgICBpZiAod2R3Lm1heGltaXplZCA9PT0gJ2ZpbGwnKSB7XG4gICAgICB0aGlzLm1heGltaXplKHdkdyk7XG4gICAgfSBlbHNlIGlmICh3ZHcubWF4aW1pemVkID09PSAnbGVmdCcpIHtcbiAgICAgIHRoaXMubWF4aW1pemVMZWZ0KHdkdyk7XG4gICAgfSBlbHNlIGlmICh3ZHcubWF4aW1pemVkID09PSAncmlnaHQnKSB7XG4gICAgICB0aGlzLm1heGltaXplUmlnaHQod2R3KTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVXaW5kb3dTdGF0ZSh3ZHcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmJyaW5nVG9Gcm9udFxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKi9cbiAgdXBkYXRlV2luZG93U3RhdGUgPSAod2R3OiBhbnkpID0+IHtcclxuICAgIGlmICh3ZHcub3V0T2ZCb3VuZHMpIHtcclxuICAgICAgdGhpcy5yZWNvdmVyKHdkdyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod2R3Lm1heGltaXplZCA9PT0gJ2ZpbGwnKSB7XHJcbiAgICAgIHRoaXMubWF4aW1pemUod2R3KTtcclxuICAgIH0gZWxzZSBpZiAod2R3Lm1heGltaXplZCA9PT0gJ2xlZnQnKSB7XHJcbiAgICAgIHRoaXMubWF4aW1pemVMZWZ0KHdkdyk7XHJcbiAgICB9IGVsc2UgaWYgKHdkdy5tYXhpbWl6ZWQgPT09ICdyaWdodCcpIHtcclxuICAgICAgdGhpcy5tYXhpbWl6ZVJpZ2h0KHdkdyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XHJcbiAgICB3ZHcuYWN0aXZlID0gdHJ1ZTtcclxuICAgIHdkdy5taW5pbWl6ZWQgPSBmYWxzZTtcclxuICAgIHdkdy56SW5kZXggPSB0aGlzLmdldE5leHRNYXhaSW5kZXgoKTtcclxuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LnJlc3RvcmVTYXZlZFBvc2l0aW9uXG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldCB0aGUgd2luZG93cyBsYXN0IGtub3cgcG9zaXRpb24gdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uXG4gICAqXG4gICAqL1xuICByZXN0b3JlU2F2ZWRQb3NpdGlvbiA9ICh3ZHc6IGFueSkgPT4ge1xuICAgIHRoaXMuY2xlYXJBY3RpdmUoKTtcbiAgICB3ZHcudG9wID0gd2R3LnNhdmVkUG9zaXRpb24udG9wO1xuICAgIHdkdy5sZWZ0ID0gd2R3LnNhdmVkUG9zaXRpb24ubGVmdDtcbiAgICB3ZHcucmlnaHQgPSB3ZHcuc2F2ZWRQb3NpdGlvbi5yaWdodDtcbiAgICB3ZHcuYm90dG9tID0gd2R3LnNhdmVkUG9zaXRpb24uYm90dG9tO1xuICAgIHdkdy5oZWlnaHQgPSB3ZHcuc2F2ZWRQb3NpdGlvbi5oZWlnaHQ7XG4gICAgd2R3LndpZHRoID0gd2R3LnNhdmVkUG9zaXRpb24ud2lkdGg7XG4gICAgd2R3Lm1heGltaXplZCA9IHVuZGVmaW5lZDtcbiAgICB3ZHcubWluaW1pemVkID0gdW5kZWZpbmVkO1xuICAgIHdkdy5hY3RpdmUgPSB0cnVlO1xuICAgIHdkdy5taW5pbWl6ZWQgPSBmYWxzZTtcbiAgICB3ZHcuekluZGV4ID0gdGhpcy5nZXROZXh0TWF4WkluZGV4KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuc2F2ZVBvc2l0aW9uXG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNhdmUgdGhlIHdpbmRvd3MgbGFzdCBrbm93IHBvc2l0aW9uLlxuICAgKlxuICAgKi9cbiAgc2F2ZVBvc2l0aW9uID0gKHdkdzogYW55KSA9PiB7XG4gICAgd2R3LnNhdmVkUG9zaXRpb24udG9wID0gd2R3LnRvcDtcbiAgICB3ZHcuc2F2ZWRQb3NpdGlvbi5sZWZ0ID0gd2R3LmxlZnQ7XG4gICAgd2R3LnNhdmVkUG9zaXRpb24ucmlnaHQgPSB3ZHcucmlnaHQ7XG4gICAgd2R3LnNhdmVkUG9zaXRpb24uYm90dG9tID0gd2R3LmJvdHRvbTtcbiAgICB3ZHcuc2F2ZWRQb3NpdGlvbi5oZWlnaHQgPSB3ZHcuaGVpZ2h0O1xuICAgIHdkdy5zYXZlZFBvc2l0aW9uLndpZHRoID0gd2R3LndpZHRoO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmNsb3NlV2luZG93XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIE1vdmVzIGEgd2luZG93IHRvIHRoZSBuZXh0IGNhc2NhZGUgcG9zaXRpb24uXG4gICAqXG4gICAqL1xuICBjYXNjYWRlV2luZG93ID0gKHdpbmRvdzogYW55KSA9PiB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZW5hYmxlV2luZG93Q2FzY2FkaW5nIHx8IHdpbmRvdy5pc01vZGFsKSByZXR1cm47XG4gICAgdGhpcy5sYXN0V2luZG93Q2FzY2FkZVBvc2l0aW9uLnRvcCArPSAxMDtcbiAgICB0aGlzLmxhc3RXaW5kb3dDYXNjYWRlUG9zaXRpb24ubGVmdCArPSAxMDtcbiAgICBpZiAodGhpcy5sYXN0V2luZG93Q2FzY2FkZVBvc2l0aW9uLnRvcCA+IHRoaXMubWF4V2luZG93Q2FzY2FkZVBvc2l0aW9uKVxuICAgICAgdGhpcy5sYXN0V2luZG93Q2FzY2FkZVBvc2l0aW9uLnRvcCA9IHRoaXMubWluV2luZG93Q2FzY2FkZVBvc2l0aW9uO1xuICAgIGlmICh0aGlzLmxhc3RXaW5kb3dDYXNjYWRlUG9zaXRpb24ubGVmdCA+IHRoaXMubWF4V2luZG93Q2FzY2FkZVBvc2l0aW9uKVxuICAgICAgdGhpcy5sYXN0V2luZG93Q2FzY2FkZVBvc2l0aW9uLmxlZnQgPSB0aGlzLm1pbldpbmRvd0Nhc2NhZGVQb3NpdGlvbjtcblxuICAgIHdpbmRvdy50b3AgPSB0aGlzLmxhc3RXaW5kb3dDYXNjYWRlUG9zaXRpb24udG9wICsgJ3B4JztcbiAgICB3aW5kb3cubGVmdCA9IHRoaXMubGFzdFdpbmRvd0Nhc2NhZGVQb3NpdGlvbi5sZWZ0ICsgJ3B4JztcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5nZXRLZXlDb2RlXG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqL1xuICBnZXRLZXlTZXF1ZW5jZSA9IChldmVudDogYW55KSA9PiB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIGtleXMucHVzaCgnc2hpZnQnKTtcbiAgICBpZiAoZXZlbnQuY3RybEtleSkga2V5cy5wdXNoKCdjdHJsJyk7XG4gICAgaWYgKGV2ZW50LmFsdEtleSkga2V5cy5wdXNoKCdhbHQnKTtcbiAgICBpZiAoZXZlbnQubWV0YUtleSkga2V5cy5wdXNoKCdtZXRhJyk7XG5cbiAgICB2YXIga2V5Q29kZSA9IGV2ZW50LmtleUNvZGUgfHwgZXZlbnQud2hpY2g7XG4gICAgaWYgKGtleUNvZGUpIGtleXMucHVzaCh0aGlzLmtleWJvYXJkTWFwW2tleUNvZGVdLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgcmV0dXJuIGtleXMuam9pbignKycpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBldmVudFxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKi9cbiAgb25LZXlEb3duID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICB2YXIga2V5U2VxdWVuY2UgPSB0aGlzLmdldEtleVNlcXVlbmNlKGV2ZW50KTtcbiAgICBpZiAoa2V5U2VxdWVuY2UgPT09ICdhbHQrbScpIHsgLy9NYXhpbWl6ZVxuICAgICAgdmFyIGFjdGl2ZVdpbmRvdyA9IHRoaXMuZ2V0QWN0aXZlV2luZG93KCk7XG4gICAgICBpZiAoYWN0aXZlV2luZG93ID09PSBudWxsKSByZXR1cm47XG4gICAgICBpZiAoIWFjdGl2ZVdpbmRvdy5tYXhpbWl6ZWQpIHtcbiAgICAgICAgdGhpcy5zYXZlUG9zaXRpb24oYWN0aXZlV2luZG93KTtcbiAgICAgICAgdGhpcy5tYXhpbWl6ZShhY3RpdmVXaW5kb3cpO1xuICAgICAgfSBlbHNlIGlmIChhY3RpdmVXaW5kb3cubWF4aW1pemVkID09PSAncmlnaHQnIHx8IGFjdGl2ZVdpbmRvdy5tYXhpbWl6ZWQgPT09ICdsZWZ0JylcbiAgICAgICAgdGhpcy5tYXhpbWl6ZShhY3RpdmVXaW5kb3cpO1xuICAgICAgZWxzZVxuICAgICAgICB0aGlzLnJlc3RvcmVTYXZlZFBvc2l0aW9uKGFjdGl2ZVdpbmRvdyk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAoa2V5U2VxdWVuY2UgPT09ICdhbHQrbicpIHsgLy9NaW5pbWl6ZVxuICAgICAgdmFyIGFjdGl2ZVdpbmRvdyA9IHRoaXMuZ2V0QWN0aXZlV2luZG93KCk7XG4gICAgICBpZiAoYWN0aXZlV2luZG93ID09PSBudWxsIHx8IGFjdGl2ZVdpbmRvdy5taW5pbWl6ZWQpIHJldHVybjtcbiAgICAgIHRoaXMubWluaW1pemUoYWN0aXZlV2luZG93KTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmIChrZXlTZXF1ZW5jZSA9PT0gJ2FsdCt3JykgeyAvL0N5Y2xlcyBGb3J3YXJkXG4gICAgICB2YXIgaW5kZXggPSB0aGlzLndpbmRvd3MuaW5kZXhPZih0aGlzLmdldEFjdGl2ZVdpbmRvdygpKTtcbiAgICAgIHRoaXMuYWN0aXZhdGVOZXh0V2luZG93KGluZGV4ICsgMSk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAoa2V5U2VxdWVuY2UgPT09ICdzaGlmdCthbHQrdycpIHsgLy9DeWNsZXMgQmFja3dhcmRcbiAgICAgIHZhciBpbmRleCA9IHRoaXMud2luZG93cy5pbmRleE9mKHRoaXMuZ2V0QWN0aXZlV2luZG93KCkpO1xuICAgICAgdGhpcy5hY3RpdmF0ZVByZXZpb3VzV2luZG93KGluZGV4ICsgMSk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAoa2V5U2VxdWVuY2UgPT09ICdzaGlmdCthbHQreCcgJiYgISh0aGlzLnNoaWZ0UHJlc3NlZCAmJiB0aGlzLmFsdFByZXNzZWQgJiYgdGhpcy54UHJlc3NlZCkpIHsgLy9DbG9zZVxuICAgICAgdmFyIGFjdGl2ZVdpbmRvdyA9IHRoaXMuZ2V0QWN0aXZlV2luZG93KCk7XG4gICAgICBpZiAoIWFjdGl2ZVdpbmRvdykgcmV0dXJuO1xuICAgICAgdGhpcy5jbG9zZVdpbmRvdyhhY3RpdmVXaW5kb3cpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgaWYgKGtleVNlcXVlbmNlID09PSAnYWx0K2QnKSB7IC8vVG9nZ2xlIERlc2t0b3BcbiAgICAgIC8vdGhpcy5kZXNrdG9wU2hvd24gPSB0aGlzLmhpZGVTaG93QWxsKCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmIChldmVudC5zaGlmdEtleSlcbiAgICAgIHRoaXMuc2hpZnRQcmVzc2VkID0gdHJ1ZTtcbiAgICBpZiAoZXZlbnQuYWx0S2V5KVxuICAgICAgdGhpcy5hbHRQcmVzc2VkID0gdHJ1ZTtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gODgpXG4gICAgICB0aGlzLnhQcmVzc2VkID0gdHJ1ZTtcbiAgfVxuXG4gIG9uS2V5VXAgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgIGlmIChldmVudC5zaGlmdEtleSlcbiAgICAgIHRoaXMuc2hpZnRQcmVzc2VkID0gZmFsc2U7XG4gICAgaWYgKGV2ZW50LmFsdEtleSlcbiAgICAgIHRoaXMuYWx0UHJlc3NlZCA9IGZhbHNlO1xuICAgIGlmIChldmVudC5rZXlDb2RlID09PSA4OClcbiAgICAgIHRoaXMueFByZXNzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmhhbmRsZVNlbGVjdEF0dGVtcHRcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUHJldmVudHMgdGhlIHVzZXIgZnJvbSBoaWdobGlnaHQgZGVza3RvcCBlbGVtZW50cy5cbiAgICpcbiAgICovXG4gIGhhbmRsZVNlbGVjdEF0dGVtcHQgPSAoZTogYW55KSA9PiB7XG4gICAgdmFyIG5vZGVOYW1lID0gZS50YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgfHwgbm9kZU5hbWUgPT09ICd0ZXh0YXJlYScgfHwgbm9kZU5hbWUgPT09ICdzZWxlY3QnKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAod2luZG93LmV2ZW50KSB7IGUucHJldmVudERlZmF1bHQoKTsgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgd2luZG93czogQXJyYXk8YW55PiA9IFtdO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2dvVXJsID0gdGhpcy5vcHRpb25zLmxvZ29Vcmw7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHRoaXMuZGVza3RvcC5vcHRpb25zLCB0aGlzLm9wdGlvbnMpO1xyXG4gICAgdGhpcy5vcHRpb25zLnZpZXdwb3J0VG9wID0gdGhpcy5vcHRpb25zLm1lbnViYXJDb25maWcgIT09IHVuZGVmaW5lZCA/IHRoaXMub3B0aW9ucy5tZW51YmFySGVpZ2h0ICsgMSA6IDA7XHJcbiAgICB0aGlzLnRydVdpbmRvd0V2ZW50SGFuZGxlci5vbk9wZW4oKS5zdWJzY3JpYmUoKHdpbmRpb3dFdmVudDogVHJ1V2luZG93RXZlbnRBcmdzKSA9PiB7XHJcbiAgICAgIHRoaXMub3BlbldpbmRvdyh3aW5kaW93RXZlbnQsIGZhbHNlKTtcclxuICAgIH0pO1xyXG4gICAgZG9jdW1lbnQub25zZWxlY3RzdGFydCA9IHRoaXMuaGFuZGxlU2VsZWN0QXR0ZW1wdDtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbktleURvd24pO1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5vbktleVVwKTtcclxuICAgIHdpbmRvdy5vbmJlZm9yZXVubG9hZCA9IChlOiBhbnkpID0+IHtcclxuICAgICAgbGV0IGhhc0NoYW5nZXMgPSB0aGlzLnZpZXdwb3J0Q29tcG9uZW50LndpbmRvd0NvbXBvbmVudHMuZmlsdGVyKCh3OiBUcnVEZXNrdG9wV2luZG93KSA9PiB7IHJldHVybiB3Lmhhc0NoYW5nZXMoKSA/IHRydWUgOiBmYWxzZTsgfSlcclxuICAgICAgaWYgKGhhc0NoYW5nZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgZSA9IGUgfHwgd2luZG93LmV2ZW50O1xyXG4gICAgICAgIHZhciBtc2cgPSB0aGlzLnRleHRNYW5hZ2VyLm1zZ0NvbmZpcm1FeGl0V2l0aENoYW5nZXNQZW5kaW5nO1xyXG5cclxuICAgICAgICAvLyBGb3IgSUUgYW5kIEZpcmVmb3hcclxuICAgICAgICBpZiAoZSkge1xyXG4gICAgICAgICAgZS5yZXR1cm5WYWx1ZSA9IG1zZztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEZvciBTYWZhcmkgLyBjaHJvbWVcclxuICAgICAgICByZXR1cm4gbXNnO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH07XHJcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbktleURvd24pO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMub25LZXlVcCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkZXNrdG9wLXdyYXBwZXJcIj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImRlc2t0b3AtbWVudWJhci1jb250YWluZXJcIiBbbmdTdHlsZV09XCJ7J2hlaWdodCc6IG9wdGlvbnMubWVudWJhckhlaWdodCArICdweCd9XCI+XHJcbiAgICA8dHJ1LWRlc2t0b3AtbWVudWJhciBbZGVza3RvcEN0cmxdPVwidGhpc1wiPjwvdHJ1LWRlc2t0b3AtbWVudWJhcj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPHRydS1kZXNrdG9wLXZpZXdwb3J0IFt3aW5kb3dzXT1cIndpbmRvd3NcIiBbZGVza3RvcEN0cmxdPVwidGhpc1wiPjwvdHJ1LWRlc2t0b3Atdmlld3BvcnQ+XHJcblxyXG4gIDx0cnUtZGVza3RvcC10YXNrYmFyIFt3aW5kb3dzXT1cIndpbmRvd3NcIiBbZGVza3RvcEN0cmxdPVwidGhpc1wiPjwvdHJ1LWRlc2t0b3AtdGFza2Jhcj5cclxuXHJcbiAgPGltZyBjbGFzcz1cImRlc2t0b3Atdmlld3BvcnQtbG9nb1wiIGRhdGEtbmctc2hvdz1cImxvZ29VcmxcIiBhbHQ9XCJcIj5cclxuPC9kaXY+XHJcbiJdfQ==
|