@scion/workbench 18.0.0-beta.9 → 19.0.0-beta.1
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/design/_workbench-view-global-styles.scss +0 -1
- package/fesm2022/scion-workbench.mjs +8556 -8622
- package/fesm2022/scion-workbench.mjs.map +1 -1
- package/lib/common/css-class.util.d.ts +5 -0
- package/lib/common/math.util.d.ts +7 -0
- package/lib/common/objects.util.d.ts +1 -1
- package/lib/dialog/workbench-dialog.component.d.ts +1 -2
- package/lib/layout/migration/model/workbench-layout-migration-v6.model.d.ts +35 -0
- package/lib/layout/migration/workbench-layout-migration-v6.service.d.ts +12 -0
- package/lib/layout/workbench-layout.model.d.ts +0 -1
- package/lib/layout/workbench-layout.service.d.ts +10 -12
- package/lib/layout/workench-layout-serializer.service.d.ts +1 -2
- package/lib/part/part-action-bar/part-action-bar.component.d.ts +2 -6
- package/lib/part/part-bar/part-bar.component.d.ts +66 -48
- package/lib/part/view-tab/view-tab.component.d.ts +3 -3
- package/lib/public_api.d.ts +0 -2
- package/lib/routing/routing.util.d.ts +2 -2
- package/lib/view/view-move-handler.service.d.ts +16 -14
- package/lib/view/view.component.d.ts +1 -2
- package/lib/view//311/265workbench-view.model.d.ts +1 -9
- package/lib/view-dnd/grid-drop-targets.util.d.ts +1 -1
- package/lib/view-dnd/view-drag.service.d.ts +72 -49
- package/lib/view-dnd/view-tab-drag-image-renderer.service.d.ts +11 -36
- package/package.json +8 -10
- package/esm2022/lib/activation-instant.provider.mjs +0 -29
- package/esm2022/lib/common/animation-frame.observable.mjs +0 -37
- package/esm2022/lib/common/asserts.util.mjs +0 -31
- package/esm2022/lib/common/class-list.mjs +0 -99
- package/esm2022/lib/common/coerce-observable.pipe.mjs +0 -28
- package/esm2022/lib/common/disposable.mjs +0 -11
- package/esm2022/lib/common/dom.util.mjs +0 -100
- package/esm2022/lib/common/grid-element-if-visible.pipe.mjs +0 -32
- package/esm2022/lib/common/instanceof.pipe.mjs +0 -26
- package/esm2022/lib/common/map-coerce.pipe.mjs +0 -28
- package/esm2022/lib/common/null-if-empty.pipe.mjs +0 -38
- package/esm2022/lib/common/objects.util.mjs +0 -40
- package/esm2022/lib/common/observables.mjs +0 -72
- package/esm2022/lib/common/operators.mjs +0 -27
- package/esm2022/lib/common/public_api.mjs +0 -11
- package/esm2022/lib/common/stringify-error.util.mjs +0 -19
- package/esm2022/lib/common/throw-error.util.mjs +0 -16
- package/esm2022/lib/common/typeof.pipe.mjs +0 -26
- package/esm2022/lib/common/uid.util.mjs +0 -22
- package/esm2022/lib/common//311/265destroy-ref.mjs +0 -36
- package/esm2022/lib/communication/workbench-broadcast-channel.mjs +0 -38
- package/esm2022/lib/content-projection/content-as-overlay.component.mjs +0 -114
- package/esm2022/lib/content-projection/workbench-element-references.mjs +0 -32
- package/esm2022/lib/dialog/dialog-footer/dialog-action-filter.pipe.mjs +0 -26
- package/esm2022/lib/dialog/dialog-footer/dialog-footer.component.mjs +0 -34
- package/esm2022/lib/dialog/dialog-footer/workbench-dialog-action.directive.mjs +0 -51
- package/esm2022/lib/dialog/dialog-footer/workbench-dialog-footer.directive.mjs +0 -46
- package/esm2022/lib/dialog/dialog-header/dialog-header.component.mjs +0 -33
- package/esm2022/lib/dialog/dialog-header/workbench-dialog-header.directive.mjs +0 -46
- package/esm2022/lib/dialog/movable.directive.mjs +0 -126
- package/esm2022/lib/dialog/public_api.mjs +0 -15
- package/esm2022/lib/dialog/resizable.directive.mjs +0 -392
- package/esm2022/lib/dialog/workbench-dialog.component.mjs +0 -250
- package/esm2022/lib/dialog/workbench-dialog.mjs +0 -79
- package/esm2022/lib/dialog/workbench-dialog.options.mjs +0 -11
- package/esm2022/lib/dialog/workbench-dialog.registry.mjs +0 -73
- package/esm2022/lib/dialog/workbench-dialog.service.mjs +0 -96
- package/esm2022/lib/dialog//311/265workbench-dialog.mjs +0 -310
- package/esm2022/lib/dialog//311/265workbench-dialog.service.mjs +0 -98
- package/esm2022/lib/executor/latest-task-executor.mjs +0 -55
- package/esm2022/lib/executor/single-task-executor.mjs +0 -72
- package/esm2022/lib/filter-field/filter-field.component.mjs +0 -130
- package/esm2022/lib/glass-pane/blockable.mjs +0 -11
- package/esm2022/lib/glass-pane/blocking.mjs +0 -11
- package/esm2022/lib/glass-pane/glass-pane.directive.mjs +0 -120
- package/esm2022/lib/layout/grid-element/grid-element.component.mjs +0 -111
- package/esm2022/lib/layout/main-area-layout/main-area-layout.component.mjs +0 -97
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v2.model.mjs +0 -11
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v3.model.mjs +0 -11
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v4.model.mjs +0 -11
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v5.model.mjs +0 -11
- package/esm2022/lib/layout/migration/workbench-layout-migration-v3.service.mjs +0 -117
- package/esm2022/lib/layout/migration/workbench-layout-migration-v4.service.mjs +0 -57
- package/esm2022/lib/layout/migration/workbench-layout-migration-v5.service.mjs +0 -67
- package/esm2022/lib/layout/public_api.mjs +0 -12
- package/esm2022/lib/layout/stringifier.mjs +0 -70
- package/esm2022/lib/layout/workbench-layout.component.mjs +0 -90
- package/esm2022/lib/layout/workbench-layout.factory.mjs +0 -24
- package/esm2022/lib/layout/workbench-layout.mjs +0 -16
- package/esm2022/lib/layout/workbench-layout.model.mjs +0 -62
- package/esm2022/lib/layout/workbench-layout.service.mjs +0 -68
- package/esm2022/lib/layout/workbench-layouts.util.mjs +0 -58
- package/esm2022/lib/layout/workench-layout-serializer.service.mjs +0 -109
- package/esm2022/lib/layout//311/265workbench-layout.factory.mjs +0 -54
- package/esm2022/lib/layout//311/265workbench-layout.mjs +0 -876
- package/esm2022/lib/logging/console-appender.service.mjs +0 -46
- package/esm2022/lib/logging/index.mjs +0 -15
- package/esm2022/lib/logging/logger-names.mjs +0 -32
- package/esm2022/lib/logging/logger.mjs +0 -36
- package/esm2022/lib/logging/logging-support.mjs +0 -26
- package/esm2022/lib/logging/logging.model.mjs +0 -45
- package/esm2022/lib/logging/public_api.mjs +0 -12
- package/esm2022/lib/logging//311/265logger.mjs +0 -73
- package/esm2022/lib/message-box/message-box-footer/message-box-footer.component.mjs +0 -69
- package/esm2022/lib/message-box/message-box-header/message-box-header.component.mjs +0 -28
- package/esm2022/lib/message-box/public_api.mjs +0 -11
- package/esm2022/lib/message-box/workbench-message-box.component.mjs +0 -102
- package/esm2022/lib/message-box/workbench-message-box.options.mjs +0 -2
- package/esm2022/lib/message-box/workbench-message-box.service.mjs +0 -39
- package/esm2022/lib/message-box//311/265workbench-message-box.service.mjs +0 -45
- package/esm2022/lib/microfrontend-platform/common/microfrontend.util.mjs +0 -71
- package/esm2022/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.mjs +0 -126
- package/esm2022/lib/microfrontend-platform/initialization/ng-zone-observable-decorator.mjs +0 -36
- package/esm2022/lib/microfrontend-platform/initialization/workbench-host-manifest-interceptor.service.mjs +0 -84
- package/esm2022/lib/microfrontend-platform/manifest-object-cache.service.mjs +0 -63
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.mjs +0 -54
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-intent-handler.interceptor.mjs +0 -85
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.mjs +0 -140
- package/esm2022/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.mjs +0 -133
- package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.mjs +0 -113
- package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.mjs +0 -43
- package/esm2022/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.mjs +0 -101
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-capability-validator.interceptor.mjs +0 -35
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.interceptor.mjs +0 -88
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-legacy-intent-translator.interceptor.mjs +0 -32
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box.component.mjs +0 -121
- package/esm2022/lib/microfrontend-platform/microfrontend-notification/microfrontend-notification-intent-handler.service.mjs +0 -45
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-capability-validator.interceptor.mjs +0 -39
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-installer.service.mjs +0 -120
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-intent-handler.interceptor.mjs +0 -55
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/workbench-perspective-data.mjs +0 -19
- package/esm2022/lib/microfrontend-platform/microfrontend-platform-config-loader.mjs +0 -13
- package/esm2022/lib/microfrontend-platform/microfrontend-platform.config.mjs +0 -11
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-capability-validator.interceptor.mjs +0 -31
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.mjs +0 -132
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.mjs +0 -115
- package/esm2022/lib/microfrontend-platform/microfrontend-splash/microfrontend-splash.component.mjs +0 -21
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.mjs +0 -112
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.mjs +0 -313
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-workbench-view.model.mjs +0 -23
- package/esm2022/lib/microfrontend-platform/public_api.mjs +0 -13
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.mjs +0 -31
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.mjs +0 -127
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-routes.mjs +0 -125
- package/esm2022/lib/microfrontend-platform/stable-capability-id-assigner.interceptor.mjs +0 -32
- package/esm2022/lib/microfrontend-platform/workbench-microfrontend-support.mjs +0 -191
- package/esm2022/lib/migration/workbench-migration.mjs +0 -11
- package/esm2022/lib/migration/workbench-migrator.mjs +0 -38
- package/esm2022/lib/notification/notification-css-classes.pipe.mjs +0 -24
- package/esm2022/lib/notification/notification-list.component.mjs +0 -51
- package/esm2022/lib/notification/notification.component.mjs +0 -109
- package/esm2022/lib/notification/notification.config.mjs +0 -11
- package/esm2022/lib/notification/notification.mjs +0 -19
- package/esm2022/lib/notification/notification.service.mjs +0 -134
- package/esm2022/lib/notification/public_api.mjs +0 -12
- package/esm2022/lib/notification/text-notification.component.mjs +0 -23
- package/esm2022/lib/notification//311/265notification.mjs +0 -42
- package/esm2022/lib/page-not-found/page-not-found.component.mjs +0 -26
- package/esm2022/lib/part/part-action-bar/part-action-bar.component.mjs +0 -31
- package/esm2022/lib/part/part-action-bar/part-action.directive.mjs +0 -77
- package/esm2022/lib/part/part-bar/part-bar.component.mjs +0 -444
- package/esm2022/lib/part/part-portal.pipe.mjs +0 -35
- package/esm2022/lib/part/part.component.mjs +0 -135
- package/esm2022/lib/part/public_api.mjs +0 -13
- package/esm2022/lib/part/view-context-menu/accelerator-format.pipe.mjs +0 -31
- package/esm2022/lib/part/view-context-menu/text.component.mjs +0 -38
- package/esm2022/lib/part/view-context-menu/view-menu.component.mjs +0 -89
- package/esm2022/lib/part/view-context-menu/view-menu.directive.mjs +0 -76
- package/esm2022/lib/part/view-context-menu/view-menu.service.mjs +0 -340
- package/esm2022/lib/part/view-list/view-list.component.mjs +0 -117
- package/esm2022/lib/part/view-list-button/view-list-button.component.mjs +0 -82
- package/esm2022/lib/part/view-list-item/view-list-item.component.mjs +0 -60
- package/esm2022/lib/part/view-tab/view-tab.component.mjs +0 -218
- package/esm2022/lib/part/view-tab-content/view-tab-content.component.mjs +0 -29
- package/esm2022/lib/part/view-tab-drag-image/view-tab-drag-image.component.mjs +0 -81
- package/esm2022/lib/part/workbench-part-action.registry.mjs +0 -23
- package/esm2022/lib/part/workbench-part.model.mjs +0 -19
- package/esm2022/lib/part/workbench-part.registry.mjs +0 -23
- package/esm2022/lib/part//311/265workbench-part.model.mjs +0 -146
- package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v1.model.mjs +0 -11
- package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v2.model.mjs +0 -11
- package/esm2022/lib/perspective/migration/workbench-perspective-migration-v2.service.mjs +0 -57
- package/esm2022/lib/perspective/public_api.mjs +0 -11
- package/esm2022/lib/perspective/workbench-grid-merger.service.mjs +0 -39
- package/esm2022/lib/perspective/workbench-perspective-storage.service.mjs +0 -72
- package/esm2022/lib/perspective/workbench-perspective-view-conflict-resolver.service.mjs +0 -50
- package/esm2022/lib/perspective/workbench-perspective.model.mjs +0 -2
- package/esm2022/lib/perspective/workbench-perspective.registry.mjs +0 -23
- package/esm2022/lib/perspective/workbench-perspective.service.mjs +0 -180
- package/esm2022/lib/perspective/workench-perspective-serializer.service.mjs +0 -62
- package/esm2022/lib/perspective//311/265workbench-perspective.model.mjs +0 -210
- package/esm2022/lib/popup/popup.component.mjs +0 -124
- package/esm2022/lib/popup/popup.config.mjs +0 -100
- package/esm2022/lib/popup/popup.origin.mjs +0 -11
- package/esm2022/lib/popup/popup.service.mjs +0 -339
- package/esm2022/lib/popup/public_api.mjs +0 -12
- package/esm2022/lib/portal/wb-component-portal.mjs +0 -130
- package/esm2022/lib/portal/workbench-portal-outlet.directive.mjs +0 -68
- package/esm2022/lib/public_api.mjs +0 -32
- package/esm2022/lib/registry/workbench-object-registry.mjs +0 -104
- package/esm2022/lib/routing/empty-outlet/empty-outlet.component.mjs +0 -31
- package/esm2022/lib/routing/public_api.mjs +0 -14
- package/esm2022/lib/routing/routing.model.mjs +0 -11
- package/esm2022/lib/routing/routing.util.mjs +0 -215
- package/esm2022/lib/routing/url-segment-matcher.mjs +0 -46
- package/esm2022/lib/routing/workbench-auxiliary-route-installer.service.mjs +0 -110
- package/esm2022/lib/routing/workbench-dialog-differ.mjs +0 -51
- package/esm2022/lib/routing/workbench-layout-differ.mjs +0 -61
- package/esm2022/lib/routing/workbench-message-box-differ.mjs +0 -51
- package/esm2022/lib/routing/workbench-navigational-states.mjs +0 -33
- package/esm2022/lib/routing/workbench-popup-differ.mjs +0 -51
- package/esm2022/lib/routing/workbench-route-data.mjs +0 -39
- package/esm2022/lib/routing/workbench-route-guards.mjs +0 -57
- package/esm2022/lib/routing/workbench-router-link.directive.mjs +0 -124
- package/esm2022/lib/routing/workbench-router.service.mjs +0 -19
- package/esm2022/lib/routing/workbench-url-observer.service.mjs +0 -305
- package/esm2022/lib/routing/workbench-view-outlet-differ.mjs +0 -58
- package/esm2022/lib/routing//311/265location.mjs +0 -70
- package/esm2022/lib/routing//311/265workbench-router.service.mjs +0 -359
- package/esm2022/lib/startup/public_api.mjs +0 -12
- package/esm2022/lib/startup/splash/splash.component.mjs +0 -24
- package/esm2022/lib/startup/workbench-initializer.mjs +0 -96
- package/esm2022/lib/startup/workbench-launcher.service.mjs +0 -173
- package/esm2022/lib/storage/public_api.mjs +0 -11
- package/esm2022/lib/storage/workbench-storage.mjs +0 -37
- package/esm2022/lib/testing/public_api.mjs +0 -12
- package/esm2022/lib/testing/workbench-testing.module.mjs +0 -49
- package/esm2022/lib/testing/workbench.provider.mjs +0 -60
- package/esm2022/lib/theme/workbench-theme-switcher.service.mjs +0 -72
- package/esm2022/lib/view/public_api.mjs +0 -11
- package/esm2022/lib/view/view-context-provider.mjs +0 -31
- package/esm2022/lib/view/view-move-handler.service.mjs +0 -145
- package/esm2022/lib/view/view-portal.pipe.mjs +0 -33
- package/esm2022/lib/view/view.component.mjs +0 -128
- package/esm2022/lib/view/workbench-view.model.mjs +0 -12
- package/esm2022/lib/view/workbench-view.registry.mjs +0 -23
- package/esm2022/lib/view//311/265workbench-view.model.mjs +0 -375
- package/esm2022/lib/view-dnd/grid-drop-targets.util.mjs +0 -49
- package/esm2022/lib/view-dnd/requires-drop-zone.pipe.mjs +0 -58
- package/esm2022/lib/view-dnd/view-drag.service.mjs +0 -213
- package/esm2022/lib/view-dnd/view-drop-placeholder-renderer.service.mjs +0 -89
- package/esm2022/lib/view-dnd/view-drop-zone.directive.mjs +0 -183
- package/esm2022/lib/view-dnd/view-tab-drag-image-renderer.service.mjs +0 -224
- package/esm2022/lib/workbench-config.mjs +0 -15
- package/esm2022/lib/workbench-id.mjs +0 -21
- package/esm2022/lib/workbench.component.mjs +0 -146
- package/esm2022/lib/workbench.constants.mjs +0 -41
- package/esm2022/lib/workbench.model.mjs +0 -11
- package/esm2022/lib/workbench.module.mjs +0 -101
- package/esm2022/lib/workbench.provider.mjs +0 -111
- package/esm2022/lib/workbench.service.mjs +0 -29
- package/esm2022/lib//311/265workbench.service.mjs +0 -102
- package/esm2022/public-api.mjs +0 -14
- package/esm2022/scion-workbench.mjs +0 -5
- package/lib/common/animation-frame.observable.d.ts +0 -10
- package/lib/testing/public_api.d.ts +0 -2
- package/lib/testing/workbench-testing.module.d.ts +0 -40
- package/lib/testing/workbench.provider.d.ts +0 -31
- package/lib/workbench.module.d.ts +0 -65
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2018-2023 Swiss Federal Railways
|
|
3
|
-
*
|
|
4
|
-
* This program and the accompanying materials are made
|
|
5
|
-
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
-
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
-
*
|
|
8
|
-
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
-
*/
|
|
10
|
-
import { Location, LocationStrategy } from '@angular/common';
|
|
11
|
-
import { ApplicationRef, inject, Injectable, makeEnvironmentProviders } from '@angular/core';
|
|
12
|
-
import { Router } from '@angular/router';
|
|
13
|
-
import { WorkbenchNavigationalStates } from './workbench-navigational-states';
|
|
14
|
-
import * as i0 from "@angular/core";
|
|
15
|
-
/**
|
|
16
|
-
* Provides a set of DI providers to patch {@link Location} for the Angular router to always add workbench navigations
|
|
17
|
-
* to the browsing history stack.
|
|
18
|
-
*
|
|
19
|
-
* @see ɵLocation
|
|
20
|
-
*/
|
|
21
|
-
export function provideLocationPatch() {
|
|
22
|
-
return makeEnvironmentProviders([
|
|
23
|
-
{
|
|
24
|
-
provide: Location,
|
|
25
|
-
useClass: ɵLocation,
|
|
26
|
-
},
|
|
27
|
-
]);
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Patches {@link Location} for the Angular router to always add workbench navigations to the browsing history stack,
|
|
31
|
-
* even if the URL does not change.
|
|
32
|
-
*
|
|
33
|
-
* Rationale:
|
|
34
|
-
* If only the layout of the workbench grid is changed, the URL does not change because the layout is passed to the
|
|
35
|
-
* navigation as state and not as a query parameter. By default, an unchanged URL does not create a new entry in the
|
|
36
|
-
* browsing history stack, but replaces the current entry. See Angular router.ts#setBrowserUrl
|
|
37
|
-
*/
|
|
38
|
-
class ɵLocation extends Location {
|
|
39
|
-
constructor() {
|
|
40
|
-
super(inject(LocationStrategy));
|
|
41
|
-
this._appRef = inject(ApplicationRef);
|
|
42
|
-
}
|
|
43
|
-
isCurrentPathEqualTo(path, query) {
|
|
44
|
-
return super.isCurrentPathEqualTo(path, query) ? !this.isWorkbenchNavigation() : false;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Indicates whether the current navigation is a workbench navigation performed through the workbench router.
|
|
48
|
-
*/
|
|
49
|
-
isWorkbenchNavigation() {
|
|
50
|
-
const currentNavigation = this.router?.getCurrentNavigation() ?? null;
|
|
51
|
-
return currentNavigation !== null && WorkbenchNavigationalStates.fromNavigation(currentNavigation) !== null;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Reference to the Angular router.
|
|
55
|
-
*/
|
|
56
|
-
get router() {
|
|
57
|
-
// Note that we cannot inject the `Router` in the constructor because the `Router` depends on `Location`,
|
|
58
|
-
// which would cause a circular dependency at construction time. Instead, we inject the router lazy.
|
|
59
|
-
// However, injecting the router will fail if the platform has already been destroyed, which happens
|
|
60
|
-
// in tests that tear down before the initial navigation has finished. To avoid this error, we inject
|
|
61
|
-
// the router only if the platform is still running.
|
|
62
|
-
return (this._router ??= !this._appRef.destroyed ? this._appRef.injector.get(Router) : undefined);
|
|
63
|
-
}
|
|
64
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ɵLocation, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
65
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ɵLocation }); }
|
|
66
|
-
}
|
|
67
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ɵLocation, decorators: [{
|
|
68
|
-
type: Injectable
|
|
69
|
-
}], ctorParameters: () => [] });
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiybVsb2NhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3JvdXRpbmcvybVsb2NhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRCxPQUFPLEVBQUMsY0FBYyxFQUF3QixNQUFNLEVBQUUsVUFBVSxFQUFFLHdCQUF3QixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQzs7QUFFNUU7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CO0lBQ2xDLE9BQU8sd0JBQXdCLENBQUM7UUFDOUI7WUFDRSxPQUFPLEVBQUUsUUFBUTtZQUNqQixRQUFRLEVBQUUsU0FBUztTQUNwQjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQ00sU0FBVSxTQUFRLFFBQVE7SUFLOUI7UUFDRSxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUoxQixZQUFPLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBS3pDLENBQUM7SUFFZSxvQkFBb0IsQ0FBQyxJQUFZLEVBQUUsS0FBYztRQUMvRCxPQUFPLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN6RixDQUFDO0lBRUQ7O09BRUc7SUFDSyxxQkFBcUI7UUFDM0IsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLG9CQUFvQixFQUFFLElBQUksSUFBSSxDQUFDO1FBQ3RFLE9BQU8saUJBQWlCLEtBQUssSUFBSSxJQUFJLDJCQUEyQixDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksQ0FBQztJQUM5RyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFZLE1BQU07UUFDaEIseUdBQXlHO1FBQ3pHLG9HQUFvRztRQUNwRyxvR0FBb0c7UUFDcEcscUdBQXFHO1FBQ3JHLG9EQUFvRDtRQUNwRCxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7OEdBL0JHLFNBQVM7a0hBQVQsU0FBUzs7MkZBQVQsU0FBUztrQkFEZCxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDIzIFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbiAqXG4gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG5pbXBvcnQge0xvY2F0aW9uLCBMb2NhdGlvblN0cmF0ZWd5fSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtBcHBsaWNhdGlvblJlZiwgRW52aXJvbm1lbnRQcm92aWRlcnMsIGluamVjdCwgSW5qZWN0YWJsZSwgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Um91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtXb3JrYmVuY2hOYXZpZ2F0aW9uYWxTdGF0ZXN9IGZyb20gJy4vd29ya2JlbmNoLW5hdmlnYXRpb25hbC1zdGF0ZXMnO1xuXG4vKipcbiAqIFByb3ZpZGVzIGEgc2V0IG9mIERJIHByb3ZpZGVycyB0byBwYXRjaCB7QGxpbmsgTG9jYXRpb259IGZvciB0aGUgQW5ndWxhciByb3V0ZXIgdG8gYWx3YXlzIGFkZCB3b3JrYmVuY2ggbmF2aWdhdGlvbnNcbiAqIHRvIHRoZSBicm93c2luZyBoaXN0b3J5IHN0YWNrLlxuICpcbiAqIEBzZWUgybVMb2NhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUxvY2F0aW9uUGF0Y2goKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICByZXR1cm4gbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBMb2NhdGlvbixcbiAgICAgIHVzZUNsYXNzOiDJtUxvY2F0aW9uLFxuICAgIH0sXG4gIF0pO1xufVxuXG4vKipcbiAqIFBhdGNoZXMge0BsaW5rIExvY2F0aW9ufSBmb3IgdGhlIEFuZ3VsYXIgcm91dGVyIHRvIGFsd2F5cyBhZGQgd29ya2JlbmNoIG5hdmlnYXRpb25zIHRvIHRoZSBicm93c2luZyBoaXN0b3J5IHN0YWNrLFxuICogZXZlbiBpZiB0aGUgVVJMIGRvZXMgbm90IGNoYW5nZS5cbiAqXG4gKiBSYXRpb25hbGU6XG4gKiBJZiBvbmx5IHRoZSBsYXlvdXQgb2YgdGhlIHdvcmtiZW5jaCBncmlkIGlzIGNoYW5nZWQsIHRoZSBVUkwgZG9lcyBub3QgY2hhbmdlIGJlY2F1c2UgdGhlIGxheW91dCBpcyBwYXNzZWQgdG8gdGhlXG4gKiBuYXZpZ2F0aW9uIGFzIHN0YXRlIGFuZCBub3QgYXMgYSBxdWVyeSBwYXJhbWV0ZXIuIEJ5IGRlZmF1bHQsIGFuIHVuY2hhbmdlZCBVUkwgZG9lcyBub3QgY3JlYXRlIGEgbmV3IGVudHJ5IGluIHRoZVxuICogYnJvd3NpbmcgaGlzdG9yeSBzdGFjaywgYnV0IHJlcGxhY2VzIHRoZSBjdXJyZW50IGVudHJ5LiBTZWUgQW5ndWxhciByb3V0ZXIudHMjc2V0QnJvd3NlclVybFxuICovXG5ASW5qZWN0YWJsZSgvKiBETyBOT1QgUFJPVklERSB2aWEgJ3Byb3ZpZGVkSW4nIG1ldGFkYXRhIGFzIHJlZ2lzdGVyZWQgdW5kZXIgYExvY2F0aW9uYCBESSB0b2tlbi4gKi8pXG5jbGFzcyDJtUxvY2F0aW9uIGV4dGVuZHMgTG9jYXRpb24ge1xuXG4gIHByaXZhdGUgX2FwcFJlZiA9IGluamVjdChBcHBsaWNhdGlvblJlZik7XG4gIHByaXZhdGUgX3JvdXRlcjogUm91dGVyIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGluamVjdChMb2NhdGlvblN0cmF0ZWd5KSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgaXNDdXJyZW50UGF0aEVxdWFsVG8ocGF0aDogc3RyaW5nLCBxdWVyeT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5pc0N1cnJlbnRQYXRoRXF1YWxUbyhwYXRoLCBxdWVyeSkgPyAhdGhpcy5pc1dvcmtiZW5jaE5hdmlnYXRpb24oKSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXJyZW50IG5hdmlnYXRpb24gaXMgYSB3b3JrYmVuY2ggbmF2aWdhdGlvbiBwZXJmb3JtZWQgdGhyb3VnaCB0aGUgd29ya2JlbmNoIHJvdXRlci5cbiAgICovXG4gIHByaXZhdGUgaXNXb3JrYmVuY2hOYXZpZ2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGN1cnJlbnROYXZpZ2F0aW9uID0gdGhpcy5yb3V0ZXI/LmdldEN1cnJlbnROYXZpZ2F0aW9uKCkgPz8gbnVsbDtcbiAgICByZXR1cm4gY3VycmVudE5hdmlnYXRpb24gIT09IG51bGwgJiYgV29ya2JlbmNoTmF2aWdhdGlvbmFsU3RhdGVzLmZyb21OYXZpZ2F0aW9uKGN1cnJlbnROYXZpZ2F0aW9uKSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gdGhlIEFuZ3VsYXIgcm91dGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgcm91dGVyKCk6IFJvdXRlciB8IHVuZGVmaW5lZCB7XG4gICAgLy8gTm90ZSB0aGF0IHdlIGNhbm5vdCBpbmplY3QgdGhlIGBSb3V0ZXJgIGluIHRoZSBjb25zdHJ1Y3RvciBiZWNhdXNlIHRoZSBgUm91dGVyYCBkZXBlbmRzIG9uIGBMb2NhdGlvbmAsXG4gICAgLy8gd2hpY2ggd291bGQgY2F1c2UgYSBjaXJjdWxhciBkZXBlbmRlbmN5IGF0IGNvbnN0cnVjdGlvbiB0aW1lLiBJbnN0ZWFkLCB3ZSBpbmplY3QgdGhlIHJvdXRlciBsYXp5LlxuICAgIC8vIEhvd2V2ZXIsIGluamVjdGluZyB0aGUgcm91dGVyIHdpbGwgZmFpbCBpZiB0aGUgcGxhdGZvcm0gaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQsIHdoaWNoIGhhcHBlbnNcbiAgICAvLyBpbiB0ZXN0cyB0aGF0IHRlYXIgZG93biBiZWZvcmUgdGhlIGluaXRpYWwgbmF2aWdhdGlvbiBoYXMgZmluaXNoZWQuIFRvIGF2b2lkIHRoaXMgZXJyb3IsIHdlIGluamVjdFxuICAgIC8vIHRoZSByb3V0ZXIgb25seSBpZiB0aGUgcGxhdGZvcm0gaXMgc3RpbGwgcnVubmluZy5cbiAgICByZXR1cm4gKHRoaXMuX3JvdXRlciA/Pz0gIXRoaXMuX2FwcFJlZi5kZXN0cm95ZWQgPyB0aGlzLl9hcHBSZWYuaW5qZWN0b3IuZ2V0KFJvdXRlcikgOiB1bmRlZmluZWQpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,359 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2018-2024 Swiss Federal Railways
|
|
3
|
-
*
|
|
4
|
-
* This program and the accompanying materials are made
|
|
5
|
-
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
-
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
-
*
|
|
8
|
-
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
-
*/
|
|
10
|
-
import { Router } from '@angular/router';
|
|
11
|
-
import { Defined } from '@scion/toolkit/util';
|
|
12
|
-
import { assertNotInReactiveContext, inject, Injectable, Injector, NgZone, runInInjectionContext } from '@angular/core';
|
|
13
|
-
import { WorkbenchLayoutService } from '../layout/workbench-layout.service';
|
|
14
|
-
import { MAIN_AREA_LAYOUT_QUERY_PARAM } from '../workbench.constants';
|
|
15
|
-
import { ANGULAR_ROUTER_MUTEX, SingleTaskExecutor } from '../executor/single-task-executor';
|
|
16
|
-
import { firstValueFrom } from 'rxjs';
|
|
17
|
-
import { WorkbenchNavigationalStates } from './workbench-navigational-states';
|
|
18
|
-
import { Routing } from './routing.util';
|
|
19
|
-
import { UrlSegmentMatcher } from './url-segment-matcher';
|
|
20
|
-
import { Objects } from '../common/objects.util';
|
|
21
|
-
import { WORKBENCH_VIEW_REGISTRY } from '../view/workbench-view.registry';
|
|
22
|
-
import * as i0 from "@angular/core";
|
|
23
|
-
/** @inheritDoc */
|
|
24
|
-
export class ɵWorkbenchRouter {
|
|
25
|
-
constructor() {
|
|
26
|
-
this._router = inject(Router);
|
|
27
|
-
this._workbenchLayoutService = inject(WorkbenchLayoutService);
|
|
28
|
-
this._workbenchViewRegistry = inject(WORKBENCH_VIEW_REGISTRY);
|
|
29
|
-
this._injector = inject(Injector);
|
|
30
|
-
this._zone = inject(NgZone);
|
|
31
|
-
/** Mutex to serialize Workbench Router navigation requests, preventing race conditions when modifying the active workbench layout to operate on the most-recent layout. */
|
|
32
|
-
this._workbenchRouterMutex = new SingleTaskExecutor();
|
|
33
|
-
/** Mutex to serialize Angular Router navigation requests, preventing the cancellation of previously initiated asynchronous navigations. */
|
|
34
|
-
this._angularRouterMutex = inject(ANGULAR_ROUTER_MUTEX);
|
|
35
|
-
/** Holds the current navigational context during a workbench navigation, or `null` if no navigation is in progress. */
|
|
36
|
-
this._currentNavigationContext = null;
|
|
37
|
-
// Instruct the Angular router to process navigations that do not change the current URL, i.e., when only updating navigation state.
|
|
38
|
-
// For example, the workbench grid is passed to the navigation as state, not as a query parameter. Without this flag set, changes to
|
|
39
|
-
// the workbench grid would not be added to the browsing history stack.
|
|
40
|
-
// Although the `onSameUrlNavigation` flag can be set per navigation via the navigation extras, this is not sufficient because the
|
|
41
|
-
// Angular router ignores it when navigating back and forth in the browsing history.
|
|
42
|
-
// See Angular router.ts#setUpLocationChangeListener and router.ts#navigateToSyncWithBrowser
|
|
43
|
-
this._router.onSameUrlNavigation = 'reload';
|
|
44
|
-
}
|
|
45
|
-
async navigate(commandsOrNavigateFn, extras) {
|
|
46
|
-
assertNotInReactiveContext(this.navigate, 'Call WorkbenchRouter.navigate() in a non-reactive (non-tracking) context, such as within the untracked() function.');
|
|
47
|
-
// Ensure to run in Angular zone.
|
|
48
|
-
if (!NgZone.isInAngularZone()) {
|
|
49
|
-
return this._zone.run(() => this.navigate(commandsOrNavigateFn, extras));
|
|
50
|
-
}
|
|
51
|
-
const navigateFn = typeof commandsOrNavigateFn === 'function' ? commandsOrNavigateFn : createNavigationFromCommands(commandsOrNavigateFn, extras ?? {});
|
|
52
|
-
// Serialize navigation requests to avoid race conditions when modifying the active workbench layout, ensuring layout operations are performed on the most-recent layout.
|
|
53
|
-
const newLayout = await this._workbenchRouterMutex.submit(async () => {
|
|
54
|
-
// Wait until the initial layout is available, i.e., after completion of Angular's initial navigation.
|
|
55
|
-
// Otherwise, this navigation would override the initial layout as given in the URL.
|
|
56
|
-
if (!this._workbenchLayoutService.layout()) {
|
|
57
|
-
await this.waitForInitialLayout();
|
|
58
|
-
}
|
|
59
|
-
// Let the navigator compute the new workbench layout.
|
|
60
|
-
const currentLayout = this._workbenchLayoutService.layout();
|
|
61
|
-
let newLayout = await runInInjectionContext(this._injector, () => navigateFn(currentLayout));
|
|
62
|
-
if (!newLayout) {
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
// Remove views marked for removal that have no `CanClose` guard.
|
|
66
|
-
// Views with a `CanClose` guard are removed later, outside the navigation mutex, to avoid blocking the workbench router.
|
|
67
|
-
newLayout = this.removeViewsWithoutGuard(newLayout);
|
|
68
|
-
// Skip navigation if the layout has not changed, such as when only closing views with a `CanClose` guard.
|
|
69
|
-
if (newLayout.equals(currentLayout, { excludeViewMarkedForRemoval: true })) {
|
|
70
|
-
return newLayout;
|
|
71
|
-
}
|
|
72
|
-
// Create extras with workbench navigation instructions.
|
|
73
|
-
extras = createNavigationExtras({ newLayout, currentLayout }, extras);
|
|
74
|
-
// Perform the navigation.
|
|
75
|
-
const commands = computeNavigationCommands(currentLayout.viewOutlets(), newLayout.viewOutlets());
|
|
76
|
-
if (!await this._angularRouterMutex.submit(() => this._router.navigate(commands, extras))) {
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
// Block subsequent navigation(s) until Angular has flushed the changed layout to the DOM.
|
|
80
|
-
await firstValueFrom(this._zone.onStable);
|
|
81
|
-
return newLayout;
|
|
82
|
-
});
|
|
83
|
-
if (!newLayout) {
|
|
84
|
-
return false;
|
|
85
|
-
}
|
|
86
|
-
// Remove views marked for removal, confirming closing by calling each view's `CanClose` guard.
|
|
87
|
-
return this.scheduleViewRemoval(newLayout);
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Performs changes to the current workbench layout.
|
|
91
|
-
*
|
|
92
|
-
* Unlike {@link navigate}, does not perform the navigation but returns the URL tree instead.
|
|
93
|
-
*
|
|
94
|
-
* The router will invoke the callback and pass the current layout for modification. The callback can call `inject` to get any required dependencies.
|
|
95
|
-
*
|
|
96
|
-
* The following example adds a part to the left of the main area, inserts a view and navigates it.
|
|
97
|
-
*
|
|
98
|
-
* ```ts
|
|
99
|
-
* inject(WorkbenchRouter).createUrlTree(layout => layout
|
|
100
|
-
* .addPart('left', {relativeTo: MAIN_AREA, align: 'left'})
|
|
101
|
-
* .addView('navigator', {partId: 'left'})
|
|
102
|
-
* .navigateView('navigator', ['path/to/view'])
|
|
103
|
-
* .activateView('navigator'),
|
|
104
|
-
* );
|
|
105
|
-
* ```
|
|
106
|
-
*
|
|
107
|
-
* @param onNavigate - Specifies the callback to modify the layout.
|
|
108
|
-
* @param extras - Controls how to perform the navigation.
|
|
109
|
-
* @see NavigateFn
|
|
110
|
-
*/
|
|
111
|
-
async createUrlTree(onNavigate, extras) {
|
|
112
|
-
assertNotInReactiveContext(this.createUrlTree, 'Call WorkbenchRouter.createUrlTree() in a non-reactive (non-tracking) context, such as within the untracked() function.');
|
|
113
|
-
// Ensure to run in Angular zone.
|
|
114
|
-
if (!NgZone.isInAngularZone()) {
|
|
115
|
-
return this._zone.run(() => this.createUrlTree(onNavigate, extras));
|
|
116
|
-
}
|
|
117
|
-
// Serialize navigation requests to avoid race conditions when modifying the active workbench layout, ensuring layout operations are performed on the most-recent layout.
|
|
118
|
-
return this._workbenchRouterMutex.submit(async () => {
|
|
119
|
-
// Wait until the initial layout is available, i.e., after completion of Angular's initial navigation.
|
|
120
|
-
// Otherwise, would override the initial layout as given in the URL.
|
|
121
|
-
if (!this._workbenchLayoutService.layout()) {
|
|
122
|
-
await this.waitForInitialLayout();
|
|
123
|
-
}
|
|
124
|
-
// Let the navigator compute the new workbench layout.
|
|
125
|
-
const currentLayout = this._workbenchLayoutService.layout();
|
|
126
|
-
let newLayout = await runInInjectionContext(this._injector, () => onNavigate(currentLayout));
|
|
127
|
-
if (!newLayout) {
|
|
128
|
-
return null;
|
|
129
|
-
}
|
|
130
|
-
// Remove views marked for removal.
|
|
131
|
-
newLayout.views({ markedForRemoval: true }).forEach(view => {
|
|
132
|
-
newLayout = newLayout.removeView(view.id, { force: true });
|
|
133
|
-
});
|
|
134
|
-
// Create extras with workbench navigation instructions.
|
|
135
|
-
extras = createNavigationExtras({ newLayout, currentLayout }, extras);
|
|
136
|
-
// Create the new URL tree.
|
|
137
|
-
const commands = computeNavigationCommands(currentLayout.viewOutlets(), newLayout.viewOutlets());
|
|
138
|
-
return this._router.createUrlTree(commands, extras);
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Remove views marked for removal that have no `CanClose` guard.
|
|
143
|
-
*/
|
|
144
|
-
removeViewsWithoutGuard(layout) {
|
|
145
|
-
return layout.views({ markedForRemoval: true }).reduce((layout, mView) => {
|
|
146
|
-
const view = this._workbenchViewRegistry.get(mView.id, { orElse: null });
|
|
147
|
-
if (!view || (view.closable() && !view.canCloseGuard)) {
|
|
148
|
-
return layout.removeView(mView.id, { force: true });
|
|
149
|
-
}
|
|
150
|
-
return layout;
|
|
151
|
-
}, layout);
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Removes views marked for removal, confirming closing by calling each view's `CanClose` guard.
|
|
155
|
-
*
|
|
156
|
-
* Guards are executed in parallel, and views are removed in separate navigations.
|
|
157
|
-
*
|
|
158
|
-
* @return a Promise that resolves to `true` when all marked views were successfully closed or declined closing.
|
|
159
|
-
*/
|
|
160
|
-
async scheduleViewRemoval(layout) {
|
|
161
|
-
const navigations = layout.views({ markedForRemoval: true })
|
|
162
|
-
.map(mView => this._workbenchViewRegistry.get(mView.id, { orElse: null }))
|
|
163
|
-
.filter((view) => !!view && view.closable())
|
|
164
|
-
.map(async (view) => {
|
|
165
|
-
// Capture current navigation id to not proceed closing if navigated in the meantime.
|
|
166
|
-
const navigationId = view.navigationId;
|
|
167
|
-
// Make view non-closable to prevent closing the view again while awaiting closing confirmation.
|
|
168
|
-
view.closable = false;
|
|
169
|
-
try {
|
|
170
|
-
const close = await view.canCloseGuard();
|
|
171
|
-
if (close && view.navigationId === navigationId) {
|
|
172
|
-
return this.navigate(layout => layout.removeView(view.id, { force: true }));
|
|
173
|
-
}
|
|
174
|
-
return true;
|
|
175
|
-
}
|
|
176
|
-
finally {
|
|
177
|
-
view.closable = true;
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
// Wait for all `CanClose` guards to resolve and subsequent navigations to complete.
|
|
181
|
-
return (await Promise.all(navigations)).every(Boolean);
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Returns the context of the current workbench navigation, when being invoked during navigation, or throws an error otherwise.
|
|
185
|
-
*/
|
|
186
|
-
getCurrentNavigationContext() {
|
|
187
|
-
if (!this._currentNavigationContext) {
|
|
188
|
-
throw Error('[NavigateError] Navigation context not available because no navigation is in progress.');
|
|
189
|
-
}
|
|
190
|
-
return this._currentNavigationContext;
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Sets navigational contextual data.
|
|
194
|
-
*/
|
|
195
|
-
setCurrentNavigationContext(context) {
|
|
196
|
-
this._currentNavigationContext = context;
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Blocks until the initial layout is available, i.e. after completion of Angular's initial navigation.
|
|
200
|
-
*/
|
|
201
|
-
async waitForInitialLayout() {
|
|
202
|
-
await firstValueFrom(this._workbenchLayoutService.layout$);
|
|
203
|
-
}
|
|
204
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ɵWorkbenchRouter, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
205
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ɵWorkbenchRouter, providedIn: 'root' }); }
|
|
206
|
-
}
|
|
207
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ɵWorkbenchRouter, decorators: [{
|
|
208
|
-
type: Injectable,
|
|
209
|
-
args: [{ providedIn: 'root' }]
|
|
210
|
-
}], ctorParameters: () => [] });
|
|
211
|
-
/**
|
|
212
|
-
* Creates a navigation to navigate view(s) based on the provided array of commands and extras.
|
|
213
|
-
*/
|
|
214
|
-
function createNavigationFromCommands(commands, extras) {
|
|
215
|
-
return (layout) => {
|
|
216
|
-
if (extras.close) {
|
|
217
|
-
if (extras.target) {
|
|
218
|
-
if (commands.length || extras.hint || extras.partId || extras.relativeTo) {
|
|
219
|
-
throw Error('[NavigateError] Commands, hint, part or relativeTo must not be set when closing a view by id.');
|
|
220
|
-
}
|
|
221
|
-
return layout.removeView(extras.target);
|
|
222
|
-
}
|
|
223
|
-
const urlSegments = Routing.commandsToSegments(commands, { relativeTo: extras.relativeTo });
|
|
224
|
-
return layout
|
|
225
|
-
.views({
|
|
226
|
-
partId: extras.partId,
|
|
227
|
-
segments: new UrlSegmentMatcher(urlSegments, { matchMatrixParams: false, matchWildcardPath: true }),
|
|
228
|
-
navigationHint: extras.hint ?? null,
|
|
229
|
-
})
|
|
230
|
-
.reduce((layout, view) => layout.removeView(view.id), layout);
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
switch (extras.target ?? 'auto') {
|
|
234
|
-
case 'blank': {
|
|
235
|
-
return addView(layout.computeNextViewId(), layout);
|
|
236
|
-
}
|
|
237
|
-
case 'auto': {
|
|
238
|
-
const urlSegments = Routing.commandsToSegments(commands, { relativeTo: extras.relativeTo });
|
|
239
|
-
const views = layout.views({
|
|
240
|
-
partId: extras.partId,
|
|
241
|
-
segments: new UrlSegmentMatcher(urlSegments, { matchMatrixParams: false, matchWildcardPath: false }),
|
|
242
|
-
navigationHint: extras.hint ?? null,
|
|
243
|
-
});
|
|
244
|
-
if (views.length) {
|
|
245
|
-
return views.reduce((layout, view) => updateView(view.id, layout), layout);
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
return addView(layout.computeNextViewId(), layout);
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
default: {
|
|
252
|
-
const viewId = extras.target;
|
|
253
|
-
if (layout.hasView(viewId)) {
|
|
254
|
-
return updateView(viewId, layout);
|
|
255
|
-
}
|
|
256
|
-
else {
|
|
257
|
-
return addView(viewId, layout);
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
};
|
|
263
|
-
/**
|
|
264
|
-
* Adds the specified view to the layout.
|
|
265
|
-
*/
|
|
266
|
-
function addView(viewId, layout) {
|
|
267
|
-
// Default to the active part if not specified or not in the layout, with the active part of the main area taking precedence.
|
|
268
|
-
const partId = (() => {
|
|
269
|
-
if (extras.partId && layout.hasPart(extras.partId)) {
|
|
270
|
-
return extras.partId;
|
|
271
|
-
}
|
|
272
|
-
return layout.activePart({ grid: 'mainArea' })?.id ?? layout.activePart({ grid: 'workbench' }).id;
|
|
273
|
-
})();
|
|
274
|
-
return layout
|
|
275
|
-
.addView(viewId, {
|
|
276
|
-
partId: partId,
|
|
277
|
-
position: extras.position ?? 'after-active-view',
|
|
278
|
-
activateView: extras.activate ?? true,
|
|
279
|
-
activatePart: extras.activate ?? true,
|
|
280
|
-
})
|
|
281
|
-
.navigateView(viewId, commands, {
|
|
282
|
-
relativeTo: extras.relativeTo,
|
|
283
|
-
hint: extras.hint,
|
|
284
|
-
cssClass: extras.cssClass,
|
|
285
|
-
data: extras.data,
|
|
286
|
-
state: extras.state,
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
/**
|
|
290
|
-
* Updates the specified view.
|
|
291
|
-
*/
|
|
292
|
-
function updateView(viewId, layout) {
|
|
293
|
-
if (extras.activate ?? true) {
|
|
294
|
-
layout = layout.activateView(viewId, { activatePart: true });
|
|
295
|
-
}
|
|
296
|
-
return layout.navigateView(viewId, commands, {
|
|
297
|
-
relativeTo: extras.relativeTo,
|
|
298
|
-
hint: extras.hint,
|
|
299
|
-
cssClass: extras.cssClass,
|
|
300
|
-
data: extras.data,
|
|
301
|
-
state: extras.state,
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
/**
|
|
306
|
-
* Creates navigation extras with workbench navigation instructions.
|
|
307
|
-
*/
|
|
308
|
-
function createNavigationExtras(layouts, extras) {
|
|
309
|
-
const { newLayout, currentLayout } = layouts;
|
|
310
|
-
const { workbenchGrid, mainAreaGrid } = newLayout.serialize({ excludeViewMarkedForRemoval: true });
|
|
311
|
-
// IMPORTANT: Update `ɵWorkbenchLayout.equals` function when adding new state properties.
|
|
312
|
-
return {
|
|
313
|
-
...extras,
|
|
314
|
-
// Instruct the Angular router to process the navigation even if the URL does not change, e.g., when changing the workbench grid which is not contained in the URL.
|
|
315
|
-
onSameUrlNavigation: 'reload',
|
|
316
|
-
// Unset `relativeTo` because commands are already normalized to their absolute form.
|
|
317
|
-
relativeTo: null,
|
|
318
|
-
// Associate workbench-specific state with the navigation.
|
|
319
|
-
state: WorkbenchNavigationalStates.create({
|
|
320
|
-
workbenchGrid: workbenchGrid,
|
|
321
|
-
// Fall back to the current layout's perspective if not specified by the new layout,
|
|
322
|
-
// e.g., the navigator provides a new layout to replace the current layout.
|
|
323
|
-
perspectiveId: newLayout.perspectiveId ?? currentLayout?.perspectiveId,
|
|
324
|
-
maximized: newLayout.maximized,
|
|
325
|
-
navigationStates: newLayout.navigationStates(),
|
|
326
|
-
}),
|
|
327
|
-
// Add the main area as query parameter.
|
|
328
|
-
queryParams: { ...extras?.queryParams, [MAIN_AREA_LAYOUT_QUERY_PARAM]: mainAreaGrid },
|
|
329
|
-
// Merge with existing query params unless specified an explicit strategy, e.g., for migrating an outdated layout URL.
|
|
330
|
-
// Note that `null` is a valid strategy for clearing existing query params, so do not use the nullish coalescing operator (??).
|
|
331
|
-
queryParamsHandling: Defined.orElse(extras?.queryParamsHandling, 'merge'),
|
|
332
|
-
};
|
|
333
|
-
}
|
|
334
|
-
/**
|
|
335
|
-
* Computes commands that can be passed to the Angular router to navigate view outlets and to remove view outlets of removed views.
|
|
336
|
-
*/
|
|
337
|
-
function computeNavigationCommands(previousViewOutlets, nextViewOutlets) {
|
|
338
|
-
const previousViewOutletMap = new Map(Objects.entries(previousViewOutlets));
|
|
339
|
-
const nextViewOutletMap = new Map(Objects.entries(nextViewOutlets));
|
|
340
|
-
const commands = new Map();
|
|
341
|
-
const viewIds = new Set([...previousViewOutletMap.keys(), ...nextViewOutletMap.keys()]);
|
|
342
|
-
viewIds.forEach(viewId => {
|
|
343
|
-
// Test if the view was added to the layout.
|
|
344
|
-
if (!previousViewOutletMap.has(viewId)) {
|
|
345
|
-
commands.set(viewId, Routing.segmentsToCommands(nextViewOutletMap.get(viewId)));
|
|
346
|
-
}
|
|
347
|
-
// Test if the view was removed from the layout.
|
|
348
|
-
else if (!nextViewOutletMap.has(viewId)) {
|
|
349
|
-
commands.set(viewId, null);
|
|
350
|
-
}
|
|
351
|
-
// Test if the view was updated.
|
|
352
|
-
else if (!new UrlSegmentMatcher(previousViewOutletMap.get(viewId), { matchMatrixParams: true, matchWildcardPath: false }).matches(nextViewOutletMap.get(viewId))) {
|
|
353
|
-
commands.set(viewId, Routing.segmentsToCommands(nextViewOutletMap.get(viewId)));
|
|
354
|
-
}
|
|
355
|
-
});
|
|
356
|
-
// Add view commands to the 'outlets' property to be interpreted by the Angular router.
|
|
357
|
-
return commands.size ? [{ outlets: Object.fromEntries(commands) }] : [];
|
|
358
|
-
}
|
|
359
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiybV3b3JrYmVuY2gtcm91dGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9yb3V0aW5nL8m1d29ya2JlbmNoLXJvdXRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFtQixNQUFNLEVBQXNCLE1BQU0saUJBQWlCLENBQUM7QUFFOUUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sRUFBQywwQkFBMEIsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUscUJBQXFCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEgsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDMUUsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDcEUsT0FBTyxFQUFDLG9CQUFvQixFQUFFLGtCQUFrQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDMUYsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUU1RSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHdkMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDOztBQUd4RSxrQkFBa0I7QUFFbEIsTUFBTSxPQUFPLGdCQUFnQjtJQWMzQjtRQVppQixZQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pCLDRCQUF1QixH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QUFDLE1BQU0sQ0FBRSxFQUFFLEVBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUUsQ0FBQyxFQUFFLENBQUM7WUFDakssUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkYsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsdUZBQXVGO0lBQ3ZGLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3hFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjQgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7TmF2aWdhdGlvbkV4dHJhcywgUm91dGVyLCBVcmxTZWdtZW50LCBVcmxUcmVlfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtXb3JrYmVuY2hSb3V0ZXJ9IGZyb20gJy4vd29ya2JlbmNoLXJvdXRlci5zZXJ2aWNlJztcbmltcG9ydCB7RGVmaW5lZH0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvdXRpbCc7XG5pbXBvcnQge2Fzc2VydE5vdEluUmVhY3RpdmVDb250ZXh0LCBpbmplY3QsIEluamVjdGFibGUsIEluamVjdG9yLCBOZ1pvbmUsIHJ1bkluSW5qZWN0aW9uQ29udGV4dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1dvcmtiZW5jaExheW91dFNlcnZpY2V9IGZyb20gJy4uL2xheW91dC93b3JrYmVuY2gtbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHtNQUlOX0FSRUFfTEFZT1VUX1FVRVJZX1BBUkFNfSBmcm9tICcuLi93b3JrYmVuY2guY29uc3RhbnRzJztcbmltcG9ydCB7QU5HVUxBUl9ST1VURVJfTVVURVgsIFNpbmdsZVRhc2tFeGVjdXRvcn0gZnJvbSAnLi4vZXhlY3V0b3Ivc2luZ2xlLXRhc2stZXhlY3V0b3InO1xuaW1wb3J0IHtmaXJzdFZhbHVlRnJvbX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1dvcmtiZW5jaE5hdmlnYXRpb25hbFN0YXRlc30gZnJvbSAnLi93b3JrYmVuY2gtbmF2aWdhdGlvbmFsLXN0YXRlcyc7XG5pbXBvcnQge8m1V29ya2JlbmNoTGF5b3V0fSBmcm9tICcuLi9sYXlvdXQvybV3b3JrYmVuY2gtbGF5b3V0JztcbmltcG9ydCB7Um91dGluZ30gZnJvbSAnLi9yb3V0aW5nLnV0aWwnO1xuaW1wb3J0IHtDb21tYW5kcywgVmlld091dGxldHMsIFdvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0LCBXb3JrYmVuY2hOYXZpZ2F0aW9uRXh0cmFzfSBmcm9tICcuL3JvdXRpbmcubW9kZWwnO1xuaW1wb3J0IHtWaWV3SWR9IGZyb20gJy4uL3ZpZXcvd29ya2JlbmNoLXZpZXcubW9kZWwnO1xuaW1wb3J0IHtVcmxTZWdtZW50TWF0Y2hlcn0gZnJvbSAnLi91cmwtc2VnbWVudC1tYXRjaGVyJztcbmltcG9ydCB7T2JqZWN0c30gZnJvbSAnLi4vY29tbW9uL29iamVjdHMudXRpbCc7XG5pbXBvcnQge1dPUktCRU5DSF9WSUVXX1JFR0lTVFJZfSBmcm9tICcuLi92aWV3L3dvcmtiZW5jaC12aWV3LnJlZ2lzdHJ5JztcbmltcG9ydCB7ybVXb3JrYmVuY2hWaWV3fSBmcm9tICcuLi92aWV3L8m1d29ya2JlbmNoLXZpZXcubW9kZWwnO1xuXG4vKiogQGluaGVyaXREb2MgKi9cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIMm1V29ya2JlbmNoUm91dGVyIGltcGxlbWVudHMgV29ya2JlbmNoUm91dGVyIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9yb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoTGF5b3V0U2VydmljZSA9IGluamVjdChXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2JlbmNoVmlld1JlZ2lzdHJ5ID0gaW5qZWN0KFdPUktCRU5DSF9WSUVXX1JFR0lTVFJZKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICBwcml2YXRlIHJlYWRvbmx5IF96b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIC8qKiBNdXRleCB0byBzZXJpYWxpemUgV29ya2JlbmNoIFJvdXRlciBuYXZpZ2F0aW9uIHJlcXVlc3RzLCBwcmV2ZW50aW5nIHJhY2UgY29uZGl0aW9ucyB3aGVuIG1vZGlmeWluZyB0aGUgYWN0aXZlIHdvcmtiZW5jaCBsYXlvdXQgdG8gb3BlcmF0ZSBvbiB0aGUgbW9zdC1yZWNlbnQgbGF5b3V0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF93b3JrYmVuY2hSb3V0ZXJNdXRleCA9IG5ldyBTaW5nbGVUYXNrRXhlY3V0b3IoKTtcbiAgLyoqIE11dGV4IHRvIHNlcmlhbGl6ZSBBbmd1bGFyIFJvdXRlciBuYXZpZ2F0aW9uIHJlcXVlc3RzLCBwcmV2ZW50aW5nIHRoZSBjYW5jZWxsYXRpb24gb2YgcHJldmlvdXNseSBpbml0aWF0ZWQgYXN5bmNocm9ub3VzIG5hdmlnYXRpb25zLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9hbmd1bGFyUm91dGVyTXV0ZXggPSBpbmplY3QoQU5HVUxBUl9ST1VURVJfTVVURVgpO1xuICAvKiogSG9sZHMgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbmFsIGNvbnRleHQgZHVyaW5nIGEgd29ya2JlbmNoIG5hdmlnYXRpb24sIG9yIGBudWxsYCBpZiBubyBuYXZpZ2F0aW9uIGlzIGluIHByb2dyZXNzLiAqL1xuICBwcml2YXRlIF9jdXJyZW50TmF2aWdhdGlvbkNvbnRleHQ6IFdvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSW5zdHJ1Y3QgdGhlIEFuZ3VsYXIgcm91dGVyIHRvIHByb2Nlc3MgbmF2aWdhdGlvbnMgdGhhdCBkbyBub3QgY2hhbmdlIHRoZSBjdXJyZW50IFVSTCwgaS5lLiwgd2hlbiBvbmx5IHVwZGF0aW5nIG5hdmlnYXRpb24gc3RhdGUuXG4gICAgLy8gRm9yIGV4YW1wbGUsIHRoZSB3b3JrYmVuY2ggZ3JpZCBpcyBwYXNzZWQgdG8gdGhlIG5hdmlnYXRpb24gYXMgc3RhdGUsIG5vdCBhcyBhIHF1ZXJ5IHBhcmFtZXRlci4gV2l0aG91dCB0aGlzIGZsYWcgc2V0LCBjaGFuZ2VzIHRvXG4gICAgLy8gdGhlIHdvcmtiZW5jaCBncmlkIHdvdWxkIG5vdCBiZSBhZGRlZCB0byB0aGUgYnJvd3NpbmcgaGlzdG9yeSBzdGFjay5cbiAgICAvLyBBbHRob3VnaCB0aGUgYG9uU2FtZVVybE5hdmlnYXRpb25gIGZsYWcgY2FuIGJlIHNldCBwZXIgbmF2aWdhdGlvbiB2aWEgdGhlIG5hdmlnYXRpb24gZXh0cmFzLCB0aGlzIGlzIG5vdCBzdWZmaWNpZW50IGJlY2F1c2UgdGhlXG4gICAgLy8gQW5ndWxhciByb3V0ZXIgaWdub3JlcyBpdCB3aGVuIG5hdmlnYXRpbmcgYmFjayBhbmQgZm9ydGggaW4gdGhlIGJyb3dzaW5nIGhpc3RvcnkuXG4gICAgLy8gU2VlIEFuZ3VsYXIgcm91dGVyLnRzI3NldFVwTG9jYXRpb25DaGFuZ2VMaXN0ZW5lciBhbmQgcm91dGVyLnRzI25hdmlnYXRlVG9TeW5jV2l0aEJyb3dzZXJcbiAgICB0aGlzLl9yb3V0ZXIub25TYW1lVXJsTmF2aWdhdGlvbiA9ICdyZWxvYWQnO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHB1YmxpYyBuYXZpZ2F0ZShjb21tYW5kczogQ29tbWFuZHMsIGV4dHJhcz86IFdvcmtiZW5jaE5hdmlnYXRpb25FeHRyYXMpOiBQcm9taXNlPGJvb2xlYW4+O1xuICBwdWJsaWMgbmF2aWdhdGUobmF2aWdhdGVGbjogybVOYXZpZ2F0ZUZuLCBleHRyYXM/OiBPbWl0PE5hdmlnYXRpb25FeHRyYXMsICdyZWxhdGl2ZVRvJyB8ICdzdGF0ZSc+KTogUHJvbWlzZTxib29sZWFuPjtcbiAgcHVibGljIG5hdmlnYXRlKGNvbW1hbmRzT3JOYXZpZ2F0ZUZuOiBDb21tYW5kcyB8IMm1TmF2aWdhdGVGbiwgZXh0cmFzPzogV29ya2JlbmNoTmF2aWdhdGlvbkV4dHJhcyB8IE9taXQ8TmF2aWdhdGlvbkV4dHJhcywgJ3JlbGF0aXZlVG8nIHwgJ3N0YXRlJz4pOiBQcm9taXNlPGJvb2xlYW4+O1xuICBwdWJsaWMgYXN5bmMgbmF2aWdhdGUoY29tbWFuZHNPck5hdmlnYXRlRm46IENvbW1hbmRzIHwgybVOYXZpZ2F0ZUZuLCBleHRyYXM/OiBXb3JrYmVuY2hOYXZpZ2F0aW9uRXh0cmFzIHwgT21pdDxOYXZpZ2F0aW9uRXh0cmFzLCAncmVsYXRpdmVUbycgfCAnc3RhdGUnPik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGFzc2VydE5vdEluUmVhY3RpdmVDb250ZXh0KHRoaXMubmF2aWdhdGUsICdDYWxsIFdvcmtiZW5jaFJvdXRlci5uYXZpZ2F0ZSgpIGluIGEgbm9uLXJlYWN0aXZlIChub24tdHJhY2tpbmcpIGNvbnRleHQsIHN1Y2ggYXMgd2l0aGluIHRoZSB1bnRyYWNrZWQoKSBmdW5jdGlvbi4nKTtcblxuICAgIC8vIEVuc3VyZSB0byBydW4gaW4gQW5ndWxhciB6b25lLlxuICAgIGlmICghTmdab25lLmlzSW5Bbmd1bGFyWm9uZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fem9uZS5ydW4oKCkgPT4gdGhpcy5uYXZpZ2F0ZShjb21tYW5kc09yTmF2aWdhdGVGbiwgZXh0cmFzKSk7XG4gICAgfVxuXG4gICAgY29uc3QgbmF2aWdhdGVGbiA9IHR5cGVvZiBjb21tYW5kc09yTmF2aWdhdGVGbiA9PT0gJ2Z1bmN0aW9uJyA/IGNvbW1hbmRzT3JOYXZpZ2F0ZUZuIDogY3JlYXRlTmF2aWdhdGlvbkZyb21Db21tYW5kcyhjb21tYW5kc09yTmF2aWdhdGVGbiwgZXh0cmFzID8/IHt9KTtcblxuICAgIC8vIFNlcmlhbGl6ZSBuYXZpZ2F0aW9uIHJlcXVlc3RzIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyB3aGVuIG1vZGlmeWluZyB0aGUgYWN0aXZlIHdvcmtiZW5jaCBsYXlvdXQsIGVuc3VyaW5nIGxheW91dCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgb24gdGhlIG1vc3QtcmVjZW50IGxheW91dC5cbiAgICBjb25zdCBuZXdMYXlvdXQgPSBhd2FpdCB0aGlzLl93b3JrYmVuY2hSb3V0ZXJNdXRleC5zdWJtaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgaW5pdGlhbCBsYXlvdXQgaXMgYXZhaWxhYmxlLCBpLmUuLCBhZnRlciBjb21wbGV0aW9uIG9mIEFuZ3VsYXIncyBpbml0aWFsIG5hdmlnYXRpb24uXG4gICAgICAvLyBPdGhlcndpc2UsIHRoaXMgbmF2aWdhdGlvbiB3b3VsZCBvdmVycmlkZSB0aGUgaW5pdGlhbCBsYXlvdXQgYXMgZ2l2ZW4gaW4gdGhlIFVSTC5cbiAgICAgIGlmICghdGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JJbml0aWFsTGF5b3V0KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIExldCB0aGUgbmF2aWdhdG9yIGNvbXB1dGUgdGhlIG5ldyB3b3JrYmVuY2ggbGF5b3V0LlxuICAgICAgY29uc3QgY3VycmVudExheW91dCA9IHRoaXMuX3dvcmtiZW5jaExheW91dFNlcnZpY2UubGF5b3V0KCkhO1xuICAgICAgbGV0IG5ld0xheW91dDogybVXb3JrYmVuY2hMYXlvdXQgfCBudWxsID0gYXdhaXQgcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuX2luamVjdG9yLCAoKSA9PiBuYXZpZ2F0ZUZuKGN1cnJlbnRMYXlvdXQpKSBhcyDJtVdvcmtiZW5jaExheW91dDtcbiAgICAgIGlmICghbmV3TGF5b3V0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgdmlld3MgbWFya2VkIGZvciByZW1vdmFsIHRoYXQgaGF2ZSBubyBgQ2FuQ2xvc2VgIGd1YXJkLlxuICAgICAgLy8gVmlld3Mgd2l0aCBhIGBDYW5DbG9zZWAgZ3VhcmQgYXJlIHJlbW92ZWQgbGF0ZXIsIG91dHNpZGUgdGhlIG5hdmlnYXRpb24gbXV0ZXgsIHRvIGF2b2lkIGJsb2NraW5nIHRoZSB3b3JrYmVuY2ggcm91dGVyLlxuICAgICAgbmV3TGF5b3V0ID0gdGhpcy5yZW1vdmVWaWV3c1dpdGhvdXRHdWFyZChuZXdMYXlvdXQpO1xuXG4gICAgICAvLyBTa2lwIG5hdmlnYXRpb24gaWYgdGhlIGxheW91dCBoYXMgbm90IGNoYW5nZWQsIHN1Y2ggYXMgd2hlbiBvbmx5IGNsb3Npbmcgdmlld3Mgd2l0aCBhIGBDYW5DbG9zZWAgZ3VhcmQuXG4gICAgICBpZiAobmV3TGF5b3V0LmVxdWFscyhjdXJyZW50TGF5b3V0LCB7ZXhjbHVkZVZpZXdNYXJrZWRGb3JSZW1vdmFsOiB0cnVlfSkpIHtcbiAgICAgICAgcmV0dXJuIG5ld0xheW91dDtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGV4dHJhcyB3aXRoIHdvcmtiZW5jaCBuYXZpZ2F0aW9uIGluc3RydWN0aW9ucy5cbiAgICAgIGV4dHJhcyA9IGNyZWF0ZU5hdmlnYXRpb25FeHRyYXMoe25ld0xheW91dCwgY3VycmVudExheW91dH0sIGV4dHJhcyk7XG5cbiAgICAgIC8vIFBlcmZvcm0gdGhlIG5hdmlnYXRpb24uXG4gICAgICBjb25zdCBjb21tYW5kczogQ29tbWFuZHMgPSBjb21wdXRlTmF2aWdhdGlvbkNvbW1hbmRzKGN1cnJlbnRMYXlvdXQudmlld091dGxldHMoKSwgbmV3TGF5b3V0LnZpZXdPdXRsZXRzKCkpO1xuICAgICAgaWYgKCFhd2FpdCB0aGlzLl9hbmd1bGFyUm91dGVyTXV0ZXguc3VibWl0KCgpID0+IHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShjb21tYW5kcywgZXh0cmFzKSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIEJsb2NrIHN1YnNlcXVlbnQgbmF2aWdhdGlvbihzKSB1bnRpbCBBbmd1bGFyIGhhcyBmbHVzaGVkIHRoZSBjaGFuZ2VkIGxheW91dCB0byB0aGUgRE9NLlxuICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5fem9uZS5vblN0YWJsZSk7XG4gICAgICByZXR1cm4gbmV3TGF5b3V0O1xuICAgIH0pO1xuXG4gICAgaWYgKCFuZXdMYXlvdXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgdmlld3MgbWFya2VkIGZvciByZW1vdmFsLCBjb25maXJtaW5nIGNsb3NpbmcgYnkgY2FsbGluZyBlYWNoIHZpZXcncyBgQ2FuQ2xvc2VgIGd1YXJkLlxuICAgIHJldHVybiB0aGlzLnNjaGVkdWxlVmlld1JlbW92YWwobmV3TGF5b3V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IHdvcmtiZW5jaCBsYXlvdXQuXG4gICAqXG4gICAqIFVubGlrZSB7QGxpbmsgbmF2aWdhdGV9LCBkb2VzIG5vdCBwZXJmb3JtIHRoZSBuYXZpZ2F0aW9uIGJ1dCByZXR1cm5zIHRoZSBVUkwgdHJlZSBpbnN0ZWFkLlxuICAgKlxuICAgKiBUaGUgcm91dGVyIHdpbGwgaW52b2tlIHRoZSBjYWxsYmFjayBhbmQgcGFzcyB0aGUgY3VycmVudCBsYXlvdXQgZm9yIG1vZGlmaWNhdGlvbi4gVGhlIGNhbGxiYWNrIGNhbiBjYWxsIGBpbmplY3RgIHRvIGdldCBhbnkgcmVxdWlyZWQgZGVwZW5kZW5jaWVzLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgYWRkcyBhIHBhcnQgdG8gdGhlIGxlZnQgb2YgdGhlIG1haW4gYXJlYSwgaW5zZXJ0cyBhIHZpZXcgYW5kIG5hdmlnYXRlcyBpdC5cbiAgICpcbiAgICogYGBgdHNcbiAgICogaW5qZWN0KFdvcmtiZW5jaFJvdXRlcikuY3JlYXRlVXJsVHJlZShsYXlvdXQgPT4gbGF5b3V0XG4gICAqICAgLmFkZFBhcnQoJ2xlZnQnLCB7cmVsYXRpdmVUbzogTUFJTl9BUkVBLCBhbGlnbjogJ2xlZnQnfSlcbiAgICogICAuYWRkVmlldygnbmF2aWdhdG9yJywge3BhcnRJZDogJ2xlZnQnfSlcbiAgICogICAubmF2aWdhdGVWaWV3KCduYXZpZ2F0b3InLCBbJ3BhdGgvdG8vdmlldyddKVxuICAgKiAgIC5hY3RpdmF0ZVZpZXcoJ25hdmlnYXRvcicpLFxuICAgKiApO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIG9uTmF2aWdhdGUgLSBTcGVjaWZpZXMgdGhlIGNhbGxiYWNrIHRvIG1vZGlmeSB0aGUgbGF5b3V0LlxuICAgKiBAcGFyYW0gZXh0cmFzIC0gQ29udHJvbHMgaG93IHRvIHBlcmZvcm0gdGhlIG5hdmlnYXRpb24uXG4gICAqIEBzZWUgTmF2aWdhdGVGblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZVVybFRyZWUob25OYXZpZ2F0ZTogKGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpID0+IFByb21pc2U8ybVXb3JrYmVuY2hMYXlvdXQgfCBudWxsPiB8IMm1V29ya2JlbmNoTGF5b3V0IHwgbnVsbCwgZXh0cmFzPzogT21pdDxOYXZpZ2F0aW9uRXh0cmFzLCAncmVsYXRpdmVUbycgfCAnc3RhdGUnPik6IFByb21pc2U8VXJsVHJlZSB8IG51bGw+IHtcbiAgICBhc3NlcnROb3RJblJlYWN0aXZlQ29udGV4dCh0aGlzLmNyZWF0ZVVybFRyZWUsICdDYWxsIFdvcmtiZW5jaFJvdXRlci5jcmVhdGVVcmxUcmVlKCkgaW4gYSBub24tcmVhY3RpdmUgKG5vbi10cmFja2luZykgY29udGV4dCwgc3VjaCBhcyB3aXRoaW4gdGhlIHVudHJhY2tlZCgpIGZ1bmN0aW9uLicpO1xuXG4gICAgLy8gRW5zdXJlIHRvIHJ1biBpbiBBbmd1bGFyIHpvbmUuXG4gICAgaWYgKCFOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl96b25lLnJ1bigoKSA9PiB0aGlzLmNyZWF0ZVVybFRyZWUob25OYXZpZ2F0ZSwgZXh0cmFzKSk7XG4gICAgfVxuXG4gICAgLy8gU2VyaWFsaXplIG5hdmlnYXRpb24gcmVxdWVzdHMgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zIHdoZW4gbW9kaWZ5aW5nIHRoZSBhY3RpdmUgd29ya2JlbmNoIGxheW91dCwgZW5zdXJpbmcgbGF5b3V0IG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBvbiB0aGUgbW9zdC1yZWNlbnQgbGF5b3V0LlxuICAgIHJldHVybiB0aGlzLl93b3JrYmVuY2hSb3V0ZXJNdXRleC5zdWJtaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgaW5pdGlhbCBsYXlvdXQgaXMgYXZhaWxhYmxlLCBpLmUuLCBhZnRlciBjb21wbGV0aW9uIG9mIEFuZ3VsYXIncyBpbml0aWFsIG5hdmlnYXRpb24uXG4gICAgICAvLyBPdGhlcndpc2UsIHdvdWxkIG92ZXJyaWRlIHRoZSBpbml0aWFsIGxheW91dCBhcyBnaXZlbiBpbiB0aGUgVVJMLlxuICAgICAgaWYgKCF0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dCgpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckluaXRpYWxMYXlvdXQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gTGV0IHRoZSBuYXZpZ2F0b3IgY29tcHV0ZSB0aGUgbmV3IHdvcmtiZW5jaCBsYXlvdXQuXG4gICAgICBjb25zdCBjdXJyZW50TGF5b3V0ID0gdGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQoKSE7XG4gICAgICBsZXQgbmV3TGF5b3V0OiDJtVdvcmtiZW5jaExheW91dCB8IG51bGwgPSBhd2FpdCBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5faW5qZWN0b3IsICgpID0+IG9uTmF2aWdhdGUoY3VycmVudExheW91dCkpO1xuICAgICAgaWYgKCFuZXdMYXlvdXQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSB2aWV3cyBtYXJrZWQgZm9yIHJlbW92YWwuXG4gICAgICBuZXdMYXlvdXQudmlld3Moe21hcmtlZEZvclJlbW92YWw6IHRydWV9KS5mb3JFYWNoKHZpZXcgPT4ge1xuICAgICAgICBuZXdMYXlvdXQgPSBuZXdMYXlvdXQhLnJlbW92ZVZpZXcodmlldy5pZCwge2ZvcmNlOiB0cnVlfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQ3JlYXRlIGV4dHJhcyB3aXRoIHdvcmtiZW5jaCBuYXZpZ2F0aW9uIGluc3RydWN0aW9ucy5cbiAgICAgIGV4dHJhcyA9IGNyZWF0ZU5hdmlnYXRpb25FeHRyYXMoe25ld0xheW91dCwgY3VycmVudExheW91dH0sIGV4dHJhcyk7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IFVSTCB0cmVlLlxuICAgICAgY29uc3QgY29tbWFuZHM6IENvbW1hbmRzID0gY29tcHV0ZU5hdmlnYXRpb25Db21tYW5kcyhjdXJyZW50TGF5b3V0LnZpZXdPdXRsZXRzKCksIG5ld0xheW91dC52aWV3T3V0bGV0cygpKTtcbiAgICAgIHJldHVybiB0aGlzLl9yb3V0ZXIuY3JlYXRlVXJsVHJlZShjb21tYW5kcywgZXh0cmFzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdmlld3MgbWFya2VkIGZvciByZW1vdmFsIHRoYXQgaGF2ZSBubyBgQ2FuQ2xvc2VgIGd1YXJkLlxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVWaWV3c1dpdGhvdXRHdWFyZChsYXlvdXQ6IMm1V29ya2JlbmNoTGF5b3V0KTogybVXb3JrYmVuY2hMYXlvdXQge1xuICAgIHJldHVybiBsYXlvdXQudmlld3Moe21hcmtlZEZvclJlbW92YWw6IHRydWV9KS5yZWR1Y2UoKGxheW91dCwgbVZpZXcpID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLl93b3JrYmVuY2hWaWV3UmVnaXN0cnkuZ2V0KG1WaWV3LmlkLCB7b3JFbHNlOiBudWxsfSk7XG4gICAgICBpZiAoIXZpZXcgfHwgKHZpZXcuY2xvc2FibGUoKSAmJiAhdmlldy5jYW5DbG9zZUd1YXJkKSkge1xuICAgICAgICByZXR1cm4gbGF5b3V0LnJlbW92ZVZpZXcobVZpZXcuaWQsIHtmb3JjZTogdHJ1ZX0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxheW91dDtcbiAgICB9LCBsYXlvdXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdmlld3MgbWFya2VkIGZvciByZW1vdmFsLCBjb25maXJtaW5nIGNsb3NpbmcgYnkgY2FsbGluZyBlYWNoIHZpZXcncyBgQ2FuQ2xvc2VgIGd1YXJkLlxuICAgKlxuICAgKiBHdWFyZHMgYXJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLCBhbmQgdmlld3MgYXJlIHJlbW92ZWQgaW4gc2VwYXJhdGUgbmF2aWdhdGlvbnMuXG4gICAqXG4gICAqIEByZXR1cm4gYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYHRydWVgIHdoZW4gYWxsIG1hcmtlZCB2aWV3cyB3ZXJlIHN1Y2Nlc3NmdWxseSBjbG9zZWQgb3IgZGVjbGluZWQgY2xvc2luZy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2NoZWR1bGVWaWV3UmVtb3ZhbChsYXlvdXQ6IMm1V29ya2JlbmNoTGF5b3V0KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgbmF2aWdhdGlvbnMgPSBsYXlvdXQudmlld3Moe21hcmtlZEZvclJlbW92YWw6IHRydWV9KVxuICAgICAgLm1hcChtVmlldyA9PiB0aGlzLl93b3JrYmVuY2hWaWV3UmVnaXN0cnkuZ2V0KG1WaWV3LmlkLCB7b3JFbHNlOiBudWxsfSkpXG4gICAgICAuZmlsdGVyKCh2aWV3KTogdmlldyBpcyDJtVdvcmtiZW5jaFZpZXcgPT4gISF2aWV3ICYmIHZpZXcuY2xvc2FibGUoKSlcbiAgICAgIC5tYXAoYXN5bmMgdmlldyA9PiB7XG4gICAgICAgIC8vIENhcHR1cmUgY3VycmVudCBuYXZpZ2F0aW9uIGlkIHRvIG5vdCBwcm9jZWVkIGNsb3NpbmcgaWYgbmF2aWdhdGVkIGluIHRoZSBtZWFudGltZS5cbiAgICAgICAgY29uc3QgbmF2aWdhdGlvbklkID0gdmlldy5uYXZpZ2F0aW9uSWQ7XG4gICAgICAgIC8vIE1ha2UgdmlldyBub24tY2xvc2FibGUgdG8gcHJldmVudCBjbG9zaW5nIHRoZSB2aWV3IGFnYWluIHdoaWxlIGF3YWl0aW5nIGNsb3NpbmcgY29uZmlybWF0aW9uLlxuICAgICAgICB2aWV3LmNsb3NhYmxlID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgY2xvc2UgPSBhd2FpdCB2aWV3LmNhbkNsb3NlR3VhcmQhKCk7XG4gICAgICAgICAgaWYgKGNsb3NlICYmIHZpZXcubmF2aWdhdGlvbklkID09PSBuYXZpZ2F0aW9uSWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRlKGxheW91dCA9PiBsYXlvdXQucmVtb3ZlVmlldyh2aWV3LmlkLCB7Zm9yY2U6IHRydWV9KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgIHZpZXcuY2xvc2FibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIC8vIFdhaXQgZm9yIGFsbCBgQ2FuQ2xvc2VgIGd1YXJkcyB0byByZXNvbHZlIGFuZCBzdWJzZXF1ZW50IG5hdmlnYXRpb25zIHRvIGNvbXBsZXRlLlxuICAgIHJldHVybiAoYXdhaXQgUHJvbWlzZS5hbGwobmF2aWdhdGlvbnMpKS5ldmVyeShCb29sZWFuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHdvcmtiZW5jaCBuYXZpZ2F0aW9uLCB3aGVuIGJlaW5nIGludm9rZWQgZHVyaW5nIG5hdmlnYXRpb24sIG9yIHRocm93cyBhbiBlcnJvciBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KCk6IFdvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0IHtcbiAgICBpZiAoIXRoaXMuX2N1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1tOYXZpZ2F0ZUVycm9yXSBOYXZpZ2F0aW9uIGNvbnRleHQgbm90IGF2YWlsYWJsZSBiZWNhdXNlIG5vIG5hdmlnYXRpb24gaXMgaW4gcHJvZ3Jlc3MuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50TmF2aWdhdGlvbkNvbnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBuYXZpZ2F0aW9uYWwgY29udGV4dHVhbCBkYXRhLlxuICAgKi9cbiAgcHVibGljIHNldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dChjb250ZXh0OiBXb3JrYmVuY2hOYXZpZ2F0aW9uQ29udGV4dCB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJyZW50TmF2aWdhdGlvbkNvbnRleHQgPSBjb250ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEJsb2NrcyB1bnRpbCB0aGUgaW5pdGlhbCBsYXlvdXQgaXMgYXZhaWxhYmxlLCBpLmUuIGFmdGVyIGNvbXBsZXRpb24gb2YgQW5ndWxhcidzIGluaXRpYWwgbmF2aWdhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckluaXRpYWxMYXlvdXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQkKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuYXZpZ2F0aW9uIHRvIG5hdmlnYXRlIHZpZXcocykgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGFycmF5IG9mIGNvbW1hbmRzIGFuZCBleHRyYXMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU5hdmlnYXRpb25Gcm9tQ29tbWFuZHMoY29tbWFuZHM6IENvbW1hbmRzLCBleHRyYXM6IFdvcmtiZW5jaE5hdmlnYXRpb25FeHRyYXMpOiDJtU5hdmlnYXRlRm4ge1xuICByZXR1cm4gKGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpOiDJtVdvcmtiZW5jaExheW91dCB8IG51bGwgPT4ge1xuICAgIGlmIChleHRyYXMuY2xvc2UpIHtcbiAgICAgIGlmIChleHRyYXMudGFyZ2V0KSB7XG4gICAgICAgIGlmIChjb21tYW5kcy5sZW5ndGggfHwgZXh0cmFzLmhpbnQgfHwgZXh0cmFzLnBhcnRJZCB8fCBleHRyYXMucmVsYXRpdmVUbykge1xuICAgICAgICAgIHRocm93IEVycm9yKCdbTmF2aWdhdGVFcnJvcl0gQ29tbWFuZHMsIGhpbnQsIHBhcnQgb3IgcmVsYXRpdmVUbyBtdXN0IG5vdCBiZSBzZXQgd2hlbiBjbG9zaW5nIGEgdmlldyBieSBpZC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF5b3V0LnJlbW92ZVZpZXcoZXh0cmFzLnRhcmdldCk7XG4gICAgICB9XG4gICAgICBjb25zdCB1cmxTZWdtZW50cyA9IFJvdXRpbmcuY29tbWFuZHNUb1NlZ21lbnRzKGNvbW1hbmRzLCB7cmVsYXRpdmVUbzogZXh0cmFzLnJlbGF0aXZlVG99KTtcbiAgICAgIHJldHVybiBsYXlvdXRcbiAgICAgICAgLnZpZXdzKHtcbiAgICAgICAgICBwYXJ0SWQ6IGV4dHJhcy5wYXJ0SWQsXG4gICAgICAgICAgc2VnbWVudHM6IG5ldyBVcmxTZWdtZW50TWF0Y2hlcih1cmxTZWdtZW50cywge21hdGNoTWF0cml4UGFyYW1zOiBmYWxzZSwgbWF0Y2hXaWxkY2FyZFBhdGg6IHRydWV9KSxcbiAgICAgICAgICBuYXZpZ2F0aW9uSGludDogZXh0cmFzLmhpbnQgPz8gbnVsbCxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlZHVjZSgobGF5b3V0LCB2aWV3KSA9PiBsYXlvdXQucmVtb3ZlVmlldyh2aWV3LmlkKSwgbGF5b3V0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzd2l0Y2ggKGV4dHJhcy50YXJnZXQgPz8gJ2F1dG8nKSB7XG4gICAgICAgIGNhc2UgJ2JsYW5rJzoge1xuICAgICAgICAgIHJldHVybiBhZGRWaWV3KGxheW91dC5jb21wdXRlTmV4dFZpZXdJZCgpLCBsYXlvdXQpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2F1dG8nOiB7XG4gICAgICAgICAgY29uc3QgdXJsU2VnbWVudHMgPSBSb3V0aW5nLmNvbW1hbmRzVG9TZWdtZW50cyhjb21tYW5kcywge3JlbGF0aXZlVG86IGV4dHJhcy5yZWxhdGl2ZVRvfSk7XG4gICAgICAgICAgY29uc3Qgdmlld3MgPSBsYXlvdXQudmlld3Moe1xuICAgICAgICAgICAgcGFydElkOiBleHRyYXMucGFydElkLFxuICAgICAgICAgICAgc2VnbWVudHM6IG5ldyBVcmxTZWdtZW50TWF0Y2hlcih1cmxTZWdtZW50cywge21hdGNoTWF0cml4UGFyYW1zOiBmYWxzZSwgbWF0Y2hXaWxkY2FyZFBhdGg6IGZhbHNlfSksXG4gICAgICAgICAgICBuYXZpZ2F0aW9uSGludDogZXh0cmFzLmhpbnQgPz8gbnVsbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAodmlld3MubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlld3MucmVkdWNlKChsYXlvdXQsIHZpZXcpID0+IHVwZGF0ZVZpZXcodmlldy5pZCwgbGF5b3V0KSwgbGF5b3V0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYWRkVmlldyhsYXlvdXQuY29tcHV0ZU5leHRWaWV3SWQoKSwgbGF5b3V0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IHZpZXdJZCA9IGV4dHJhcy50YXJnZXQhO1xuICAgICAgICAgIGlmIChsYXlvdXQuaGFzVmlldyh2aWV3SWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlVmlldyh2aWV3SWQsIGxheW91dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGFkZFZpZXcodmlld0lkLCBsYXlvdXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQWRkcyB0aGUgc3BlY2lmaWVkIHZpZXcgdG8gdGhlIGxheW91dC5cbiAgICovXG4gIGZ1bmN0aW9uIGFkZFZpZXcodmlld0lkOiBzdHJpbmcsIGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpOiDJtVdvcmtiZW5jaExheW91dCB7XG4gICAgLy8gRGVmYXVsdCB0byB0aGUgYWN0aXZlIHBhcnQgaWYgbm90IHNwZWNpZmllZCBvciBub3QgaW4gdGhlIGxheW91dCwgd2l0aCB0aGUgYWN0aXZlIHBhcnQgb2YgdGhlIG1haW4gYXJlYSB0YWtpbmcgcHJlY2VkZW5jZS5cbiAgICBjb25zdCBwYXJ0SWQgPSAoKCk6IHN0cmluZyA9PiB7XG4gICAgICBpZiAoZXh0cmFzLnBhcnRJZCAmJiBsYXlvdXQuaGFzUGFydChleHRyYXMucGFydElkKSkge1xuICAgICAgICByZXR1cm4gZXh0cmFzLnBhcnRJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsYXlvdXQuYWN0aXZlUGFydCh7Z3JpZDogJ21haW5BcmVhJ30pPy5pZCA/PyBsYXlvdXQuYWN0aXZlUGFydCh7Z3JpZDogJ3dvcmtiZW5jaCd9KS5pZDtcbiAgICB9KSgpO1xuXG4gICAgcmV0dXJuIGxheW91dFxuICAgICAgLmFkZFZpZXcodmlld0lkLCB7XG4gICAgICAgIHBhcnRJZDogcGFydElkLFxuICAgICAgICBwb3NpdGlvbjogZXh0cmFzLnBvc2l0aW9uID8/ICdhZnRlci1hY3RpdmUtdmlldycsXG4gICAgICAgIGFjdGl2YXRlVmlldzogZXh0cmFzLmFjdGl2YXRlID8/IHRydWUsXG4gICAgICAgIGFjdGl2YXRlUGFydDogZXh0cmFzLmFjdGl2YXRlID8/IHRydWUsXG4gICAgICB9KVxuICAgICAgLm5hdmlnYXRlVmlldyh2aWV3SWQsIGNvbW1hbmRzLCB7XG4gICAgICAgIHJlbGF0aXZlVG86IGV4dHJhcy5yZWxhdGl2ZVRvLFxuICAgICAgICBoaW50OiBleHRyYXMuaGludCxcbiAgICAgICAgY3NzQ2xhc3M6IGV4dHJhcy5jc3NDbGFzcyxcbiAgICAgICAgZGF0YTogZXh0cmFzLmRhdGEsXG4gICAgICAgIHN0YXRlOiBleHRyYXMuc3RhdGUsXG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBzcGVjaWZpZWQgdmlldy5cbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVZpZXcodmlld0lkOiBzdHJpbmcsIGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpOiDJtVdvcmtiZW5jaExheW91dCB7XG4gICAgaWYgKGV4dHJhcy5hY3RpdmF0ZSA/PyB0cnVlKSB7XG4gICAgICBsYXlvdXQgPSBsYXlvdXQuYWN0aXZhdGVWaWV3KHZpZXdJZCwge2FjdGl2YXRlUGFydDogdHJ1ZX0pO1xuICAgIH1cblxuICAgIHJldHVybiBsYXlvdXQubmF2aWdhdGVWaWV3KHZpZXdJZCwgY29tbWFuZHMsIHtcbiAgICAgIHJlbGF0aXZlVG86IGV4dHJhcy5yZWxhdGl2ZVRvLFxuICAgICAgaGludDogZXh0cmFzLmhpbnQsXG4gICAgICBjc3NDbGFzczogZXh0cmFzLmNzc0NsYXNzLFxuICAgICAgZGF0YTogZXh0cmFzLmRhdGEsXG4gICAgICBzdGF0ZTogZXh0cmFzLnN0YXRlLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBuYXZpZ2F0aW9uIGV4dHJhcyB3aXRoIHdvcmtiZW5jaCBuYXZpZ2F0aW9uIGluc3RydWN0aW9ucy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlTmF2aWdhdGlvbkV4dHJhcyhsYXlvdXRzOiB7bmV3TGF5b3V0OiDJtVdvcmtiZW5jaExheW91dDsgY3VycmVudExheW91dD86IMm1V29ya2JlbmNoTGF5b3V0IHwgdW5kZWZpbmVkfSwgZXh0cmFzPzogT21pdDxOYXZpZ2F0aW9uRXh0cmFzLCAncmVsYXRpdmVUbycgfCAnc3RhdGUnPik6IE5hdmlnYXRpb25FeHRyYXMge1xuICBjb25zdCB7bmV3TGF5b3V0LCBjdXJyZW50TGF5b3V0fSA9IGxheW91dHM7XG4gIGNvbnN0IHt3b3JrYmVuY2hHcmlkLCBtYWluQXJlYUdyaWR9ID0gbmV3TGF5b3V0LnNlcmlhbGl6ZSh7ZXhjbHVkZVZpZXdNYXJrZWRGb3JSZW1vdmFsOiB0cnVlfSk7XG5cbiAgLy8gSU1QT1JUQU5UOiBVcGRhdGUgYMm1V29ya2JlbmNoTGF5b3V0LmVxdWFsc2AgZnVuY3Rpb24gd2hlbiBhZGRpbmcgbmV3IHN0YXRlIHByb3BlcnRpZXMuXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5leHRyYXMsXG4gICAgLy8gSW5zdHJ1Y3QgdGhlIEFuZ3VsYXIgcm91dGVyIHRvIHByb2Nlc3MgdGhlIG5hdmlnYXRpb24gZXZlbiBpZiB0aGUgVVJMIGRvZXMgbm90IGNoYW5nZSwgZS5nLiwgd2hlbiBjaGFuZ2luZyB0aGUgd29ya2JlbmNoIGdyaWQgd2hpY2ggaXMgbm90IGNvbnRhaW5lZCBpbiB0aGUgVVJMLlxuICAgIG9uU2FtZVVybE5hdmlnYXRpb246ICdyZWxvYWQnLFxuICAgIC8vIFVuc2V0IGByZWxhdGl2ZVRvYCBiZWNhdXNlIGNvbW1hbmRzIGFyZSBhbHJlYWR5IG5vcm1hbGl6ZWQgdG8gdGhlaXIgYWJzb2x1dGUgZm9ybS5cbiAgICByZWxhdGl2ZVRvOiBudWxsLFxuICAgIC8vIEFzc29jaWF0ZSB3b3JrYmVuY2gtc3BlY2lmaWMgc3RhdGUgd2l0aCB0aGUgbmF2aWdhdGlvbi5cbiAgICBzdGF0ZTogV29ya2JlbmNoTmF2aWdhdGlvbmFsU3RhdGVzLmNyZWF0ZSh7XG4gICAgICB3b3JrYmVuY2hHcmlkOiB3b3JrYmVuY2hHcmlkLFxuICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGxheW91dCdzIHBlcnNwZWN0aXZlIGlmIG5vdCBzcGVjaWZpZWQgYnkgdGhlIG5ldyBsYXlvdXQsXG4gICAgICAvLyBlLmcuLCB0aGUgbmF2aWdhdG9yIHByb3ZpZGVzIGEgbmV3IGxheW91dCB0byByZXBsYWNlIHRoZSBjdXJyZW50IGxheW91dC5cbiAgICAgIHBlcnNwZWN0aXZlSWQ6IG5ld0xheW91dC5wZXJzcGVjdGl2ZUlkID8/IGN1cnJlbnRMYXlvdXQ/LnBlcnNwZWN0aXZlSWQsXG4gICAgICBtYXhpbWl6ZWQ6IG5ld0xheW91dC5tYXhpbWl6ZWQsXG4gICAgICBuYXZpZ2F0aW9uU3RhdGVzOiBuZXdMYXlvdXQubmF2aWdhdGlvblN0YXRlcygpLFxuICAgIH0pLFxuICAgIC8vIEFkZCB0aGUgbWFpbiBhcmVhIGFzIHF1ZXJ5IHBhcmFtZXRlci5cbiAgICBxdWVyeVBhcmFtczogey4uLmV4dHJhcz8ucXVlcnlQYXJhbXMsIFtNQUlOX0FSRUFfTEFZT1VUX1FVRVJZX1BBUkFNXTogbWFpbkFyZWFHcmlkfSxcbiAgICAvLyBNZXJnZSB3aXRoIGV4aXN0aW5nIHF1ZXJ5IHBhcmFtcyB1bmxlc3Mgc3BlY2lmaWVkIGFuIGV4cGxpY2l0IHN0cmF0ZWd5LCBlLmcuLCBmb3IgbWlncmF0aW5nIGFuIG91dGRhdGVkIGxheW91dCBVUkwuXG4gICAgLy8gTm90ZSB0aGF0IGBudWxsYCBpcyBhIHZhbGlkIHN0cmF0ZWd5IGZvciBjbGVhcmluZyBleGlzdGluZyBxdWVyeSBwYXJhbXMsIHNvIGRvIG5vdCB1c2UgdGhlIG51bGxpc2ggY29hbGVzY2luZyBvcGVyYXRvciAoPz8pLlxuICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IERlZmluZWQub3JFbHNlKGV4dHJhcz8ucXVlcnlQYXJhbXNIYW5kbGluZywgJ21lcmdlJyksXG4gIH07XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgY29tbWFuZHMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBBbmd1bGFyIHJvdXRlciB0byBuYXZpZ2F0ZSB2aWV3IG91dGxldHMgYW5kIHRvIHJlbW92ZSB2aWV3IG91dGxldHMgb2YgcmVtb3ZlZCB2aWV3cy5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZU5hdmlnYXRpb25Db21tYW5kcyhwcmV2aW91c1ZpZXdPdXRsZXRzOiBWaWV3T3V0bGV0cywgbmV4dFZpZXdPdXRsZXRzOiBWaWV3T3V0bGV0cyk6IFt7b3V0bGV0czoge1tvdXRsZXQ6IFZpZXdJZF06IENvbW1hbmRzIHwgbnVsbH19XSB8IFtdIHtcbiAgY29uc3QgcHJldmlvdXNWaWV3T3V0bGV0TWFwID0gbmV3IE1hcDxWaWV3SWQsIFVybFNlZ21lbnRbXT4oT2JqZWN0cy5lbnRyaWVzKHByZXZpb3VzVmlld091dGxldHMpKTtcbiAgY29uc3QgbmV4dFZpZXdPdXRsZXRNYXAgPSBuZXcgTWFwPFZpZXdJZCwgVXJsU2VnbWVudFtdPihPYmplY3RzLmVudHJpZXMobmV4dFZpZXdPdXRsZXRzKSk7XG5cbiAgY29uc3QgY29tbWFuZHMgPSBuZXcgTWFwPFZpZXdJZCwgQ29tbWFuZHMgfCBudWxsPigpO1xuICBjb25zdCB2aWV3SWRzID0gbmV3IFNldDxWaWV3SWQ+KFsuLi5wcmV2aW91c1ZpZXdPdXRsZXRNYXAua2V5cygpLCAuLi5uZXh0Vmlld091dGxldE1hcC5rZXlzKCldKTtcblxuICB2aWV3SWRzLmZvckVhY2godmlld0lkID0+IHtcbiAgICAvLyBUZXN0IGlmIHRoZSB2aWV3IHdhcyBhZGRlZCB0byB0aGUgbGF5b3V0LlxuICAgIGlmICghcHJldmlvdXNWaWV3T3V0bGV0TWFwLmhhcyh2aWV3SWQpKSB7XG4gICAgICBjb21tYW5kcy5zZXQodmlld0lkLCBSb3V0aW5nLnNlZ21lbnRzVG9Db21tYW5kcyhuZXh0Vmlld091dGxldE1hcC5nZXQodmlld0lkKSEpKTtcbiAgICB9XG4gICAgLy8gVGVzdCBpZiB0aGUgdmlldyB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBsYXlvdXQuXG4gICAgZWxzZSBpZiAoIW5leHRWaWV3T3V0bGV0TWFwLmhhcyh2aWV3SWQpKSB7XG4gICAgICBjb21tYW5kcy5zZXQodmlld0lkLCBudWxsKTtcbiAgICB9XG4gICAgLy8gVGVzdCBpZiB0aGUgdmlldyB3YXMgdXBkYXRlZC5cbiAgICBlbHNlIGlmICghbmV3IFVybFNlZ21lbnRNYXRjaGVyKHByZXZpb3VzVmlld091dGxldE1hcC5nZXQodmlld0lkKSEsIHttYXRjaE1hdHJpeFBhcmFtczogdHJ1ZSwgbWF0Y2hXaWxkY2FyZFBhdGg6IGZhbHNlfSkubWF0Y2hlcyhuZXh0Vmlld091dGxldE1hcC5nZXQodmlld0lkKSEpKSB7XG4gICAgICBjb21tYW5kcy5zZXQodmlld0lkLCBSb3V0aW5nLnNlZ21lbnRzVG9Db21tYW5kcyhuZXh0Vmlld091dGxldE1hcC5nZXQodmlld0lkKSEpKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEFkZCB2aWV3IGNvbW1hbmRzIHRvIHRoZSAnb3V0bGV0cycgcHJvcGVydHkgdG8gYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIEFuZ3VsYXIgcm91dGVyLlxuICByZXR1cm4gY29tbWFuZHMuc2l6ZSA/IFt7b3V0bGV0czogT2JqZWN0LmZyb21FbnRyaWVzKGNvbW1hbmRzKX1dIDogW107XG59XG5cbi8qKlxuICogQGluaGVyaXREb2NcbiAqIEBzZWUgTmF2aWdhdGVGblxuICovXG5leHBvcnQgdHlwZSDJtU5hdmlnYXRlRm4gPSAobGF5b3V0OiDJtVdvcmtiZW5jaExheW91dCkgPT4gUHJvbWlzZTzJtVdvcmtiZW5jaExheW91dCB8IG51bGw+IHwgybVXb3JrYmVuY2hMYXlvdXQgfCBudWxsO1xuIl19
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2018-2023 Swiss Federal Railways
|
|
3
|
-
*
|
|
4
|
-
* This program and the accompanying materials are made
|
|
5
|
-
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
-
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
-
*
|
|
8
|
-
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
-
*/
|
|
10
|
-
export { WorkbenchLauncher, WorkbenchStartup } from './workbench-launcher.service';
|
|
11
|
-
export { WORKBENCH_STARTUP, WORKBENCH_PRE_STARTUP, MICROFRONTEND_PLATFORM_PRE_STARTUP, MICROFRONTEND_PLATFORM_POST_STARTUP, WORKBENCH_POST_STARTUP } from './workbench-initializer';
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3N0YXJ0dXAvcHVibGljX2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ2pGLE9BQU8sRUFBdUIsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsa0NBQWtDLEVBQUUsbUNBQW1DLEVBQUUsc0JBQXNCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMyBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuZXhwb3J0IHtXb3JrYmVuY2hMYXVuY2hlciwgV29ya2JlbmNoU3RhcnR1cH0gZnJvbSAnLi93b3JrYmVuY2gtbGF1bmNoZXIuc2VydmljZSc7XG5leHBvcnQge1dvcmtiZW5jaEluaXRpYWxpemVyLCBXT1JLQkVOQ0hfU1RBUlRVUCwgV09SS0JFTkNIX1BSRV9TVEFSVFVQLCBNSUNST0ZST05URU5EX1BMQVRGT1JNX1BSRV9TVEFSVFVQLCBNSUNST0ZST05URU5EX1BMQVRGT1JNX1BPU1RfU1RBUlRVUCwgV09SS0JFTkNIX1BPU1RfU1RBUlRVUH0gZnJvbSAnLi93b3JrYmVuY2gtaW5pdGlhbGl6ZXInO1xuIl19
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2018-2022 Swiss Federal Railways
|
|
3
|
-
*
|
|
4
|
-
* This program and the accompanying materials are made
|
|
5
|
-
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
-
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
-
*
|
|
8
|
-
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
-
*/
|
|
10
|
-
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
|
11
|
-
import { SciThrobberComponent } from '@scion/components/throbber';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
/**
|
|
14
|
-
* Default splash displayed while starting the workbench.
|
|
15
|
-
*/
|
|
16
|
-
export class SplashComponent {
|
|
17
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: SplashComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
18
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.2", type: SplashComponent, isStandalone: true, selector: "wb-splash", ngImport: i0, template: "<sci-throbber type=\"ellipsis\"/>\n", styles: [":host{display:grid;justify-content:center;margin-top:3em}:host>sci-throbber{--sci-throbber-size: 80px}\n"], dependencies: [{ kind: "component", type: SciThrobberComponent, selector: "sci-throbber", inputs: ["type"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
19
|
-
}
|
|
20
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: SplashComponent, decorators: [{
|
|
21
|
-
type: Component,
|
|
22
|
-
args: [{ selector: 'wb-splash', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [SciThrobberComponent], template: "<sci-throbber type=\"ellipsis\"/>\n", styles: [":host{display:grid;justify-content:center;margin-top:3em}:host>sci-throbber{--sci-throbber-size: 80px}\n"] }]
|
|
23
|
-
}] });
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsYXNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3N0YXJ0dXAvc3BsYXNoL3NwbGFzaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9zdGFydHVwL3NwbGFzaC9zcGxhc2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDOztBQUVoRTs7R0FFRztBQVNILE1BQU0sT0FBTyxlQUFlOzhHQUFmLGVBQWU7a0dBQWYsZUFBZSxxRUN4QjVCLHFDQUNBLGtLRHFCWSxvQkFBb0I7OzJGQUVuQixlQUFlO2tCQVIzQixTQUFTOytCQUNFLFdBQVcsbUJBR0osdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1AsQ0FBQyxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMiBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U2NpVGhyb2JiZXJDb21wb25lbnR9IGZyb20gJ0BzY2lvbi9jb21wb25lbnRzL3Rocm9iYmVyJztcblxuLyoqXG4gKiBEZWZhdWx0IHNwbGFzaCBkaXNwbGF5ZWQgd2hpbGUgc3RhcnRpbmcgdGhlIHdvcmtiZW5jaC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnd2Itc3BsYXNoJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NwbGFzaC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NwbGFzaC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1NjaVRocm9iYmVyQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgU3BsYXNoQ29tcG9uZW50IHtcbn1cbiIsIjxzY2ktdGhyb2JiZXIgdHlwZT1cImVsbGlwc2lzXCIvPlxuIl19
|