@coolon/angular-ui-powerups 0.0.96 → 0.0.98
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/bundles/coolon-angular-ui-powerups.umd.js +2960 -2288
- package/bundles/coolon-angular-ui-powerups.umd.js.map +1 -1
- package/bundles/coolon-angular-ui-powerups.umd.min.js +1 -1
- package/bundles/coolon-angular-ui-powerups.umd.min.js.map +1 -1
- package/coolon-angular-ui-powerups.d.ts +17 -20
- package/coolon-angular-ui-powerups.metadata.json +1 -1
- package/esm2015/coolon-angular-ui-powerups.js +17 -20
- package/esm2015/index.js +2 -2
- package/esm2015/lib/interaction/components/activity-container/activity-container.component.js +16 -52
- package/esm2015/lib/interaction/components/inplace-interaction-context/inplace-interaction-context.component.js +16 -47
- package/esm2015/lib/interaction/index.js +4 -2
- package/esm2015/lib/interaction/interaction-context-base.js +158 -0
- package/esm2015/lib/interaction/interaction-context.js +58 -78
- package/esm2015/lib/interaction/interaction.module.js +1 -1
- package/esm2015/lib/interaction/services/dialog-interaction-context.js +163 -0
- package/esm2015/lib/interaction/services/dialog-interaction.service.js +68 -181
- package/esm2015/lib/interaction/services/modal-interaction.service.js +109 -0
- package/esm2015/lib/place/components/place-outlet/place-outlet.component.js +9 -43
- package/esm2015/lib/place/guards/abstract-place.guard.js +165 -0
- package/esm2015/lib/place/guards/consolidated-param-map.js +133 -0
- package/esm2015/lib/place/guards/interaction.guard.js +113 -0
- package/esm2015/lib/place/guards/navigation-state.js +613 -0
- package/esm2015/lib/place/guards/place-component-deactivation-handler.js +87 -0
- package/esm2015/lib/place/index.js +7 -5
- package/esm2015/lib/place/place-component.js +1 -1
- package/esm2015/lib/place/place-router.js +162 -236
- package/esm2015/lib/place/place.module.js +2 -4
- package/esm2015/lib/place/route/visit-sanitiser.js +2 -2
- package/esm2015/lib/place/url-snapshot.js +96 -0
- package/esm2015/public_api.js +3 -3
- package/esm5/coolon-angular-ui-powerups.js +17 -20
- package/esm5/index.js +2 -2
- package/esm5/lib/interaction/components/activity-container/activity-container.component.js +23 -74
- package/esm5/lib/interaction/components/inplace-interaction-context/inplace-interaction-context.component.js +26 -76
- package/esm5/lib/interaction/index.js +4 -2
- package/esm5/lib/interaction/interaction-context-base.js +211 -0
- package/esm5/lib/interaction/interaction-context.js +72 -94
- package/esm5/lib/interaction/interaction.module.js +1 -1
- package/esm5/lib/interaction/services/dialog-interaction-context.js +188 -0
- package/esm5/lib/interaction/services/dialog-interaction.service.js +83 -232
- package/esm5/lib/interaction/services/modal-interaction.service.js +153 -0
- package/esm5/lib/place/components/place-outlet/place-outlet.component.js +9 -43
- package/esm5/lib/place/guards/abstract-place.guard.js +212 -0
- package/esm5/lib/place/guards/consolidated-param-map.js +161 -0
- package/esm5/lib/place/guards/interaction.guard.js +125 -0
- package/esm5/lib/place/guards/navigation-state.js +764 -0
- package/esm5/lib/place/guards/place-component-deactivation-handler.js +104 -0
- package/esm5/lib/place/index.js +7 -5
- package/esm5/lib/place/place-component.js +1 -1
- package/esm5/lib/place/place-router.js +191 -294
- package/esm5/lib/place/place.module.js +2 -4
- package/esm5/lib/place/route/visit-sanitiser.js +2 -2
- package/esm5/lib/place/url-snapshot.js +120 -0
- package/esm5/public_api.js +3 -3
- package/fesm2015/coolon-angular-ui-powerups.js +2135 -1587
- package/fesm2015/coolon-angular-ui-powerups.js.map +1 -1
- package/fesm5/coolon-angular-ui-powerups.js +3083 -2412
- package/fesm5/coolon-angular-ui-powerups.js.map +1 -1
- package/lib/interaction/components/activity-container/activity-container.component.d.ts +6 -11
- package/lib/interaction/components/inplace-interaction-context/inplace-interaction-context.component.d.ts +4 -9
- package/lib/interaction/index.d.ts +3 -1
- package/lib/interaction/interaction-context-base.d.ts +27 -0
- package/lib/interaction/interaction-context.d.ts +18 -15
- package/lib/interaction/services/dialog-interaction-context.d.ts +18 -0
- package/lib/interaction/services/dialog-interaction.service.d.ts +14 -23
- package/lib/interaction/services/modal-interaction.service.d.ts +15 -0
- package/lib/place/components/place-outlet/place-outlet.component.d.ts +1 -4
- package/lib/place/guards/abstract-place.guard.d.ts +19 -0
- package/lib/place/guards/consolidated-param-map.d.ts +14 -0
- package/lib/{interaction/guards/interaction-guard.service.d.ts → place/guards/interaction.guard.d.ts} +8 -4
- package/lib/place/guards/navigation-state.d.ts +96 -0
- package/lib/place/guards/place-component-deactivation-handler.d.ts +12 -0
- package/lib/place/index.d.ts +6 -4
- package/lib/place/place-component.d.ts +1 -1
- package/lib/place/place-router.d.ts +25 -33
- package/lib/place/url-snapshot.d.ts +16 -0
- package/package.json +1 -1
- package/schematics/place-routes/place-def.js +2 -2
- package/schematics/place-routes/templates/place-routes.ts.template +9 -16
- package/esm2015/lib/interaction/guards/interaction-guard.service.js +0 -85
- package/esm2015/lib/place/guards/abstract-enter-place.guard.js +0 -315
- package/esm2015/lib/place/guards/leave-place.guard.js +0 -47
- package/esm2015/lib/place/navigation-session.js +0 -279
- package/esm2015/lib/place/places/noop-gateway-place.component.js +0 -58
- package/esm5/lib/interaction/guards/interaction-guard.service.js +0 -94
- package/esm5/lib/place/guards/abstract-enter-place.guard.js +0 -387
- package/esm5/lib/place/guards/leave-place.guard.js +0 -55
- package/esm5/lib/place/navigation-session.js +0 -353
- package/esm5/lib/place/places/noop-gateway-place.component.js +0 -61
- package/lib/place/guards/abstract-enter-place.guard.d.ts +0 -33
- package/lib/place/guards/leave-place.guard.d.ts +0 -8
- package/lib/place/navigation-session.d.ts +0 -43
- package/lib/place/places/noop-gateway-place.component.d.ts +0 -10
|
@@ -5,52 +5,47 @@
|
|
|
5
5
|
import * as tslib_1 from "tslib";
|
|
6
6
|
import { Location } from '@angular/common';
|
|
7
7
|
import { Injectable } from '@angular/core';
|
|
8
|
-
import { NavigationEnd, NavigationError, NavigationStart, Router,
|
|
9
|
-
import { assert, Dsl, GarbageCollector, Logger, MutableListModel, MutableValueModel
|
|
8
|
+
import { NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Router, UrlSerializer } from '@angular/router';
|
|
9
|
+
import { assert, Dsl, GarbageCollector, lang, Logger, MutableListModel, MutableValueModel } from '@coolon/pectin';
|
|
10
10
|
import _ from 'lodash';
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { PlaceComponent } from './place-component';
|
|
11
|
+
import { ModalInteractionService } from '../interaction/services/modal-interaction.service';
|
|
12
|
+
import { NavigationState } from './guards/navigation-state';
|
|
14
13
|
import { PlaceHistory } from './place-history';
|
|
15
|
-
import {
|
|
16
|
-
import { Visit } from './visit';
|
|
14
|
+
import { UrlSnapshot } from './url-snapshot';
|
|
17
15
|
import * as i0 from "@angular/core";
|
|
18
16
|
import * as i1 from "@angular/router";
|
|
19
|
-
import * as i2 from "
|
|
20
|
-
import * as i3 from "
|
|
21
|
-
import * as i4 from "
|
|
22
|
-
/** @type {?} */
|
|
23
|
-
const noopPlaceDef = PlaceComponent.getDefinition(NoopGatewayPlace);
|
|
17
|
+
import * as i2 from "@angular/common";
|
|
18
|
+
import * as i3 from "./place-history";
|
|
19
|
+
import * as i4 from "../interaction/services/modal-interaction.service";
|
|
24
20
|
export class PlaceRouter extends GarbageCollector {
|
|
25
21
|
/**
|
|
26
22
|
* @param {?} router
|
|
27
23
|
* @param {?} urlSerializer
|
|
28
|
-
* @param {?} interactionContext
|
|
29
24
|
* @param {?} angularLocation
|
|
30
25
|
* @param {?} placeHistory
|
|
26
|
+
* @param {?} modalInteractionService
|
|
31
27
|
*/
|
|
32
|
-
constructor(router, urlSerializer,
|
|
28
|
+
constructor(router, urlSerializer, angularLocation, placeHistory, modalInteractionService) {
|
|
33
29
|
super();
|
|
34
30
|
this.router = router;
|
|
35
31
|
this.urlSerializer = urlSerializer;
|
|
36
|
-
this.interactionContext = interactionContext;
|
|
37
32
|
this.angularLocation = angularLocation;
|
|
38
33
|
this.placeHistory = placeHistory;
|
|
34
|
+
this.modalInteractionService = modalInteractionService;
|
|
39
35
|
this.firstRoute = true;
|
|
40
36
|
this._navigationSessionModel = new MutableValueModel();
|
|
41
37
|
this._activeVisits = new MutableListModel();
|
|
42
|
-
this.initialRedirectStarted = false;
|
|
43
|
-
this.initialRedirectFinished = false;
|
|
44
38
|
const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
|
|
45
39
|
this.activeVisitIndex = chain(this._activeVisits).indexBy('placeDefinition');
|
|
46
|
-
this.
|
|
47
|
-
|
|
48
|
-
* @param {?}
|
|
40
|
+
this.navigationSessionActive = chain(this.navigationSessionModel).pluck('active');
|
|
41
|
+
this._navigationSessionContext = new NavigationState.Context(this.router, this.modalInteractionService, this.angularLocation, (/**
|
|
42
|
+
* @param {?} session
|
|
49
43
|
* @return {?}
|
|
50
44
|
*/
|
|
51
|
-
|
|
52
|
-
|
|
45
|
+
session => {
|
|
46
|
+
this.processNavigationSuccess(session);
|
|
53
47
|
}));
|
|
48
|
+
this._navigationSessionModel.value = new NavigationState.Idle(this._navigationSessionContext);
|
|
54
49
|
// TODO: make setup the callbacks in during module initiation to make this testable.
|
|
55
50
|
this.router.events.subscribe((/**
|
|
56
51
|
* @param {?} event
|
|
@@ -61,28 +56,76 @@ export class PlaceRouter extends GarbageCollector {
|
|
|
61
56
|
// ======================
|
|
62
57
|
// NavigationStart -> .... -> NavigationCancel --> redirect, go around again in the same session
|
|
63
58
|
// NavigationStart -> .... -> NavigationEnd --> navigation complete, end session.
|
|
64
|
-
// NavigationStart -> .... -> NavigationError --> navigation
|
|
59
|
+
// NavigationStart -> .... -> NavigationError --> navigation aborted, end session.
|
|
65
60
|
// =======================
|
|
66
61
|
if (event instanceof NavigationStart) {
|
|
67
|
-
this.
|
|
62
|
+
this.runStateTransition((/**
|
|
63
|
+
* @param {?} session
|
|
64
|
+
* @return {?}
|
|
65
|
+
*/
|
|
66
|
+
session => session.onStart(event)));
|
|
68
67
|
}
|
|
69
68
|
if (event instanceof NavigationEnd) {
|
|
70
|
-
this.
|
|
69
|
+
this.runStateTransition((/**
|
|
70
|
+
* @param {?} session
|
|
71
|
+
* @return {?}
|
|
72
|
+
*/
|
|
73
|
+
session => session.onEnd(event)));
|
|
71
74
|
}
|
|
72
75
|
if (event instanceof NavigationError) {
|
|
73
|
-
this.
|
|
76
|
+
this.runStateTransition((/**
|
|
77
|
+
* @param {?} session
|
|
78
|
+
* @return {?}
|
|
79
|
+
*/
|
|
80
|
+
session => session.onError(event)));
|
|
81
|
+
}
|
|
82
|
+
if (event instanceof NavigationCancel) {
|
|
83
|
+
this.runStateTransition((/**
|
|
84
|
+
* @param {?} session
|
|
85
|
+
* @return {?}
|
|
86
|
+
*/
|
|
87
|
+
session => session.onCancel(event)));
|
|
74
88
|
}
|
|
75
89
|
}));
|
|
76
|
-
|
|
77
|
-
this.
|
|
78
|
-
|
|
90
|
+
// Push dialog state to the url so we can capture the back button.
|
|
91
|
+
this.modalInteractionService.addActivityListener(new PlaceRouter.InteractionRouteMediator(this.navigationSessionActive, this.router));
|
|
92
|
+
// The angular router doesn't always fire router events when the back button is pushed while a navigation
|
|
93
|
+
// session is in progress. Sometimes we only know about it from the url change.
|
|
94
|
+
angularLocation.onUrlChange((/**
|
|
95
|
+
* @param {?} url
|
|
79
96
|
* @return {?}
|
|
80
97
|
*/
|
|
81
|
-
|
|
82
|
-
console.log(
|
|
98
|
+
url => {
|
|
99
|
+
console.log(`#### url changed ->`, { url, navIsActive: this.navigationSessionActive.value });
|
|
100
|
+
/** @type {?} */
|
|
101
|
+
const interactionContext = this.navigationSessionActive.value && this.navigationSession.interactionContext;
|
|
102
|
+
if (interactionContext && interactionContext.isActive()) {
|
|
103
|
+
Logger.get(this).info(`back button pressed during navigation session interaction`);
|
|
104
|
+
this.runStateTransition((/**
|
|
105
|
+
* @param {?} navigationSession
|
|
106
|
+
* @return {?}
|
|
107
|
+
*/
|
|
108
|
+
navigationSession => navigationSession.onBackClickedDuringNavigationInteraction(url)));
|
|
109
|
+
}
|
|
83
110
|
}));
|
|
84
|
-
|
|
85
|
-
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* @private
|
|
114
|
+
* @param {?} session
|
|
115
|
+
* @return {?}
|
|
116
|
+
*/
|
|
117
|
+
processNavigationSuccess(session) {
|
|
118
|
+
// We need to update the visits before the session finishes. This allows the placeOutets to ignore visit
|
|
119
|
+
// changes that occur while routerNavigationActive is true.
|
|
120
|
+
assert.isTruthy(this.navigationSessionActive.value);
|
|
121
|
+
/** @type {?} */
|
|
122
|
+
const visits = session.getVisits();
|
|
123
|
+
visits.forEach((/**
|
|
124
|
+
* @param {?} v
|
|
125
|
+
* @return {?}
|
|
126
|
+
*/
|
|
127
|
+
v => this.placeHistory.add(v)));
|
|
128
|
+
this._activeVisits.value = visits;
|
|
86
129
|
}
|
|
87
130
|
/**
|
|
88
131
|
* @return {?}
|
|
@@ -126,14 +169,6 @@ export class PlaceRouter extends GarbageCollector {
|
|
|
126
169
|
})));
|
|
127
170
|
});
|
|
128
171
|
}
|
|
129
|
-
/**
|
|
130
|
-
* @param {?} visit
|
|
131
|
-
* @param {?=} navigationExtras
|
|
132
|
-
* @return {?}
|
|
133
|
-
*/
|
|
134
|
-
createRedirectFor(visit, navigationExtras) {
|
|
135
|
-
return this.router.createUrlTree(this.createRouteParameters(visit), navigationExtras);
|
|
136
|
-
}
|
|
137
172
|
// @Trace()
|
|
138
173
|
/**
|
|
139
174
|
* @param {?} activatedRoute
|
|
@@ -155,15 +190,6 @@ export class PlaceRouter extends GarbageCollector {
|
|
|
155
190
|
router => {
|
|
156
191
|
/** @type {?} */
|
|
157
192
|
const commands = this.parseUrl(this.router.routerState.snapshot).createRedirectCommandsFor(next);
|
|
158
|
-
// // we have to to use the definition for route id as our redirection always includes
|
|
159
|
-
// // the id in the url segements (but leaves it blank when there's no id). I.e. in the
|
|
160
|
-
// // no id case we're doing the following redirect [<placePath>, ""] -> ["..", <id>]
|
|
161
|
-
// const relativePath = !!previous.placeDefinition.hasRouteId() ? '..' : '.';
|
|
162
|
-
// const commands = [
|
|
163
|
-
// relativePath,
|
|
164
|
-
// ...this.createRouteParameters(next),
|
|
165
|
-
// ...this.extractChildPath(activatedRoute.snapshot)
|
|
166
|
-
// ];
|
|
167
193
|
console.log('### Push Changes to route Redirect', { commands });
|
|
168
194
|
return router.navigate(commands);
|
|
169
195
|
}));
|
|
@@ -172,84 +198,67 @@ export class PlaceRouter extends GarbageCollector {
|
|
|
172
198
|
}
|
|
173
199
|
/**
|
|
174
200
|
* @param {?} visit
|
|
175
|
-
* @param {?}
|
|
201
|
+
* @param {?} runNavigationCommands
|
|
176
202
|
* @return {?}
|
|
177
203
|
*/
|
|
178
|
-
doNavigation(visit,
|
|
204
|
+
doNavigation(visit, runNavigationCommands) {
|
|
179
205
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
180
|
-
this.
|
|
206
|
+
if (this.navigationSessionActive.value) {
|
|
207
|
+
lang.illegalState('Navigation already in progress');
|
|
208
|
+
}
|
|
209
|
+
this.runStateTransition((/**
|
|
210
|
+
* @param {?} current
|
|
211
|
+
* @return {?}
|
|
212
|
+
*/
|
|
213
|
+
current => {
|
|
214
|
+
/** @type {?} */
|
|
215
|
+
const session = new NavigationState.Active(this._navigationSessionContext, false, this.router.routerState.snapshot.url);
|
|
216
|
+
session.storeVisit(visit);
|
|
217
|
+
return session;
|
|
218
|
+
}));
|
|
181
219
|
try {
|
|
182
|
-
yield
|
|
220
|
+
yield runNavigationCommands(this.router);
|
|
183
221
|
}
|
|
184
222
|
finally {
|
|
185
223
|
// Router has finished (since there was no router change required) so we
|
|
186
224
|
// need to end the navigation session.
|
|
187
|
-
if (this.navigationSession && !this.router.getCurrentNavigation()) {
|
|
188
|
-
this.
|
|
225
|
+
if (this.navigationSession.active && !this.router.getCurrentNavigation()) {
|
|
226
|
+
this.runStateTransition((/**
|
|
227
|
+
* @param {?} session
|
|
228
|
+
* @return {?}
|
|
229
|
+
*/
|
|
230
|
+
session => session.onEnd(new NavigationEnd(-1, '', ''))));
|
|
189
231
|
}
|
|
190
232
|
}
|
|
191
233
|
});
|
|
192
234
|
}
|
|
193
235
|
/**
|
|
194
|
-
* @
|
|
195
|
-
* @param {?}
|
|
236
|
+
* @protected
|
|
237
|
+
* @param {?} transition
|
|
196
238
|
* @return {?}
|
|
197
239
|
*/
|
|
198
|
-
|
|
240
|
+
runStateTransition(transition) {
|
|
199
241
|
/** @type {?} */
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
* @private
|
|
208
|
-
* @param {?} event
|
|
209
|
-
* @return {?}
|
|
210
|
-
*/
|
|
211
|
-
onAngularRouterStarted(event) {
|
|
212
|
-
if (!this.navigationSession) { // We been activated by an external route rather than placeRouter.go(visit)
|
|
213
|
-
console.log('navigation started', { firstTime: this.firstRoute });
|
|
214
|
-
/** @type {?} */
|
|
215
|
-
const session = this.navigationSessionFactory.createExternal(this.firstRoute);
|
|
216
|
-
if (event.navigationTrigger === 'popstate') {
|
|
217
|
-
session.setPopstateReturnUrl(this.router.routerState.snapshot.url);
|
|
218
|
-
}
|
|
219
|
-
this._navigationSessionModel.value = session;
|
|
242
|
+
const previous = this._navigationSessionModel.value;
|
|
243
|
+
/** @type {?} */
|
|
244
|
+
const next = transition(this.navigationSession);
|
|
245
|
+
this._navigationSessionModel.value = next;
|
|
246
|
+
if (next !== previous) {
|
|
247
|
+
previous.dispose();
|
|
248
|
+
Logger.get(this).info(`Router State Transition: ${previous.toString()} -> ${next.toString()}`);
|
|
220
249
|
}
|
|
221
|
-
this.firstRoute = false;
|
|
222
250
|
}
|
|
223
|
-
// @Trace()
|
|
224
251
|
/**
|
|
225
252
|
* @private
|
|
226
|
-
* @param {?}
|
|
253
|
+
* @param {?} visit
|
|
227
254
|
* @return {?}
|
|
228
255
|
*/
|
|
229
|
-
|
|
256
|
+
createRouteParameters(visit) {
|
|
230
257
|
/** @type {?} */
|
|
231
|
-
const
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
/** @type {?} */
|
|
236
|
-
const visits = session.getVisits();
|
|
237
|
-
visits.forEach((/**
|
|
238
|
-
* @param {?} v
|
|
239
|
-
* @return {?}
|
|
240
|
-
*/
|
|
241
|
-
v => this.placeHistory.add(v)));
|
|
242
|
-
this._activeVisits.value = visits;
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
// Angular doesn't preserve the url when a guard cancels the back button.
|
|
246
|
-
// See https://github.com/angular/angular/issues/13586#issuecomment-432795720
|
|
247
|
-
if (session.isPopState) {
|
|
248
|
-
console.log('cancelled during popstate');
|
|
249
|
-
this.angularLocation.go(session.popStateReturnUrl);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
this._navigationSessionModel.value = null;
|
|
258
|
+
const def = visit.placeDefinition;
|
|
259
|
+
return visit.hasRouteId() ?
|
|
260
|
+
[def.getFormattedRouteId(visit), def.getFormattedRouteParameters(visit)] :
|
|
261
|
+
[def.getFormattedRouteParameters(visit)];
|
|
253
262
|
}
|
|
254
263
|
/**
|
|
255
264
|
* @param {?} activatedRoute
|
|
@@ -267,35 +276,7 @@ export class PlaceRouter extends GarbageCollector {
|
|
|
267
276
|
* @return {?}
|
|
268
277
|
*/
|
|
269
278
|
parseUrl(snapshot) {
|
|
270
|
-
return new
|
|
271
|
-
}
|
|
272
|
-
// TODO: this all only sort of works. Opening dialogs and clicking back multiple times breaks things.
|
|
273
|
-
// TODO: next stage is to investigate tracking dialog state in a different placeoutlet and keeping those
|
|
274
|
-
// TODO: urls out of the history.
|
|
275
|
-
/**
|
|
276
|
-
* @param {?} activatedRoute
|
|
277
|
-
* @param {?} state
|
|
278
|
-
* @return {?}
|
|
279
|
-
*/
|
|
280
|
-
performInitialNavigationIntercept(activatedRoute, state) {
|
|
281
|
-
assert.isTruthy(this.isInitialNavigation());
|
|
282
|
-
Logger.get(this).info(`Redirecting to: ${noopPlaceDef.path}`, { returnUrl: state.url });
|
|
283
|
-
if (!this.initialRedirectFinished) {
|
|
284
|
-
this.initialRedirectFinished = true;
|
|
285
|
-
return this.router.createUrlTree([noopPlaceDef.path, {
|
|
286
|
-
returnUrl: state.url
|
|
287
|
-
}], {
|
|
288
|
-
replaceUrl: true,
|
|
289
|
-
// make sure we update our history
|
|
290
|
-
skipLocationChange: false
|
|
291
|
-
});
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* @return {?}
|
|
296
|
-
*/
|
|
297
|
-
isInitialNavigation() {
|
|
298
|
-
return this.navigationSession.firstNavigation && !this.initialRedirectFinished;
|
|
279
|
+
return new UrlSnapshot(this.urlSerializer.parse(snapshot.url));
|
|
299
280
|
}
|
|
300
281
|
}
|
|
301
282
|
PlaceRouter.decorators = [
|
|
@@ -307,17 +288,11 @@ PlaceRouter.decorators = [
|
|
|
307
288
|
PlaceRouter.ctorParameters = () => [
|
|
308
289
|
{ type: Router },
|
|
309
290
|
{ type: UrlSerializer },
|
|
310
|
-
{ type: InteractionContext },
|
|
311
291
|
{ type: Location },
|
|
312
|
-
{ type: PlaceHistory }
|
|
292
|
+
{ type: PlaceHistory },
|
|
293
|
+
{ type: ModalInteractionService }
|
|
313
294
|
];
|
|
314
|
-
/** @nocollapse */ PlaceRouter.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function PlaceRouter_Factory() { return new PlaceRouter(i0.ɵɵinject(i1.Router), i0.ɵɵinject(i1.UrlSerializer), i0.ɵɵinject(i2.
|
|
315
|
-
tslib_1.__decorate([
|
|
316
|
-
Trace(),
|
|
317
|
-
tslib_1.__metadata("design:type", Function),
|
|
318
|
-
tslib_1.__metadata("design:paramtypes", [Visit, Object]),
|
|
319
|
-
tslib_1.__metadata("design:returntype", Promise)
|
|
320
|
-
], PlaceRouter.prototype, "navigate", null);
|
|
295
|
+
/** @nocollapse */ PlaceRouter.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function PlaceRouter_Factory() { return new PlaceRouter(i0.ɵɵinject(i1.Router), i0.ɵɵinject(i1.UrlSerializer), i0.ɵɵinject(i2.Location), i0.ɵɵinject(i3.PlaceHistory), i0.ɵɵinject(i4.ModalInteractionService)); }, token: PlaceRouter, providedIn: "root" });
|
|
321
296
|
if (false) {
|
|
322
297
|
/**
|
|
323
298
|
* @type {?}
|
|
@@ -342,137 +317,88 @@ if (false) {
|
|
|
342
317
|
* @type {?}
|
|
343
318
|
* @private
|
|
344
319
|
*/
|
|
345
|
-
PlaceRouter.prototype.
|
|
320
|
+
PlaceRouter.prototype._navigationSessionContext;
|
|
346
321
|
/**
|
|
347
322
|
* @type {?}
|
|
348
323
|
* @private
|
|
349
324
|
*/
|
|
350
|
-
PlaceRouter.prototype.
|
|
325
|
+
PlaceRouter.prototype.router;
|
|
351
326
|
/**
|
|
352
327
|
* @type {?}
|
|
353
328
|
* @private
|
|
354
329
|
*/
|
|
355
|
-
PlaceRouter.prototype.
|
|
330
|
+
PlaceRouter.prototype.urlSerializer;
|
|
356
331
|
/**
|
|
357
332
|
* @type {?}
|
|
358
333
|
* @private
|
|
359
334
|
*/
|
|
360
|
-
PlaceRouter.prototype.
|
|
335
|
+
PlaceRouter.prototype.angularLocation;
|
|
361
336
|
/**
|
|
362
337
|
* @type {?}
|
|
363
338
|
* @private
|
|
364
339
|
*/
|
|
365
|
-
PlaceRouter.prototype.
|
|
340
|
+
PlaceRouter.prototype.placeHistory;
|
|
366
341
|
/**
|
|
367
342
|
* @type {?}
|
|
368
343
|
* @private
|
|
369
344
|
*/
|
|
370
|
-
PlaceRouter.prototype.
|
|
371
|
-
/** @type {?} */
|
|
372
|
-
PlaceRouter.prototype.angularLocation;
|
|
373
|
-
/** @type {?} */
|
|
374
|
-
PlaceRouter.prototype.placeHistory;
|
|
345
|
+
PlaceRouter.prototype.modalInteractionService;
|
|
375
346
|
}
|
|
376
347
|
(function (PlaceRouter) {
|
|
377
|
-
|
|
348
|
+
PlaceRouter.INTERACTION_ROUTER_OUTLET = 'aup-interaction';
|
|
349
|
+
class InteractionRouteMediator {
|
|
378
350
|
/**
|
|
379
|
-
* @param {?}
|
|
351
|
+
* @param {?} navigationSessionModelActive
|
|
352
|
+
* @param {?} router
|
|
380
353
|
*/
|
|
381
|
-
constructor(
|
|
382
|
-
this.
|
|
383
|
-
|
|
354
|
+
constructor(navigationSessionModelActive, router) {
|
|
355
|
+
this.navigationSessionModelActive = navigationSessionModelActive;
|
|
356
|
+
this.router = router;
|
|
384
357
|
}
|
|
385
358
|
/**
|
|
386
359
|
* @return {?}
|
|
387
360
|
*/
|
|
388
|
-
|
|
389
|
-
return
|
|
361
|
+
get isNavigating() {
|
|
362
|
+
return this.navigationSessionModelActive.value;
|
|
390
363
|
}
|
|
364
|
+
// If we're not in a navigation we push
|
|
365
|
+
// @Trace()
|
|
391
366
|
/**
|
|
392
|
-
* @param {?} visit
|
|
393
367
|
* @return {?}
|
|
394
368
|
*/
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
*/
|
|
406
|
-
segment => segment.path === visitSegments[0].path));
|
|
407
|
-
// do not use the return value, it's the items that were removed!
|
|
408
|
-
segments.splice(replaceAt, visitSegments.length, ...visitSegments);
|
|
409
|
-
return segments;
|
|
410
|
-
}
|
|
411
|
-
/**
|
|
412
|
-
* Converts the visit into segments. Please not that these segments are not e
|
|
413
|
-
* @param {?} visit
|
|
414
|
-
* @return {?}
|
|
415
|
-
*/
|
|
416
|
-
convertToUrlSegments(visit) {
|
|
417
|
-
return visit.placeDefinition.hasRouteId() ?
|
|
418
|
-
[
|
|
419
|
-
// NOTE:
|
|
420
|
-
// It's important to attach the params to the root path and not the id. If we attach them
|
|
421
|
-
// to an empty id then the angular router won't match the pattern.
|
|
422
|
-
new UrlSegment(visit.placeDefinition.path, visit.placeDefinition.getFormattedRouteParameters(visit)),
|
|
423
|
-
new UrlSegment(visit.placeDefinition.getFormattedRouteId(visit), {})
|
|
424
|
-
]
|
|
425
|
-
:
|
|
426
|
-
[
|
|
427
|
-
new UrlSegment(visit.placeDefinition.path, visit.placeDefinition.getFormattedRouteParameters(visit))
|
|
428
|
-
];
|
|
429
|
-
}
|
|
430
|
-
/**
|
|
431
|
-
* @param {?} visit
|
|
432
|
-
* @return {?}
|
|
433
|
-
*/
|
|
434
|
-
createRedirectCommandsFor(visit) {
|
|
435
|
-
/** @type {?} */
|
|
436
|
-
const segments = this.updateVisitSegments(visit);
|
|
437
|
-
/** @type {?} */
|
|
438
|
-
const commands = [];
|
|
439
|
-
segments.forEach((/**
|
|
440
|
-
* @param {?} s
|
|
441
|
-
* @return {?}
|
|
442
|
-
*/
|
|
443
|
-
s => {
|
|
444
|
-
commands.push(s.path);
|
|
445
|
-
if (s.parameterMap.keys.length > 0) {
|
|
446
|
-
commands.push(s.parameters);
|
|
447
|
-
}
|
|
448
|
-
}));
|
|
449
|
-
return commands;
|
|
369
|
+
onActivityStarted() {
|
|
370
|
+
if (!this.isNavigating) {
|
|
371
|
+
this.router.navigate(['.', {
|
|
372
|
+
outlets: {
|
|
373
|
+
[PlaceRouter.INTERACTION_ROUTER_OUTLET]: ['modal'] // "open" must be a valid route for this outlet.
|
|
374
|
+
}
|
|
375
|
+
}], {
|
|
376
|
+
replaceUrl: false
|
|
377
|
+
});
|
|
378
|
+
}
|
|
450
379
|
}
|
|
380
|
+
// @Trace()
|
|
451
381
|
/**
|
|
452
|
-
* @param {?} placeDef
|
|
453
382
|
* @return {?}
|
|
454
383
|
*/
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
384
|
+
onActivityFinished() {
|
|
385
|
+
if (!this.isNavigating) {
|
|
386
|
+
this.router.navigate(['.', {
|
|
387
|
+
outlets: {
|
|
388
|
+
[PlaceRouter.INTERACTION_ROUTER_OUTLET]: null
|
|
389
|
+
}
|
|
390
|
+
}], {
|
|
391
|
+
replaceUrl: true // remove the interaction from the history.
|
|
392
|
+
});
|
|
393
|
+
}
|
|
461
394
|
}
|
|
462
395
|
}
|
|
463
|
-
|
|
464
|
-
Trace(),
|
|
465
|
-
tslib_1.__metadata("design:type", Function),
|
|
466
|
-
tslib_1.__metadata("design:paramtypes", [Visit]),
|
|
467
|
-
tslib_1.__metadata("design:returntype", Array)
|
|
468
|
-
], UrlHelper.prototype, "createRedirectCommandsFor", null);
|
|
469
|
-
PlaceRouter.UrlHelper = UrlHelper;
|
|
396
|
+
PlaceRouter.InteractionRouteMediator = InteractionRouteMediator;
|
|
470
397
|
if (false) {
|
|
471
|
-
/**
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
UrlHelper.prototype.urlTree;
|
|
398
|
+
/** @type {?} */
|
|
399
|
+
InteractionRouteMediator.prototype.navigationSessionModelActive;
|
|
400
|
+
/** @type {?} */
|
|
401
|
+
InteractionRouteMediator.prototype.router;
|
|
476
402
|
}
|
|
477
403
|
})(PlaceRouter || (PlaceRouter = {}));
|
|
478
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Utcm91dGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvb2xvbi9hbmd1bGFyLXVpLXBvd2VydXBzLyIsInNvdXJjZXMiOlsibGliL3BsYWNlL3BsYWNlLXJvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFHTCxhQUFhLEVBQ2IsZUFBZSxFQUNmLGVBQWUsRUFDZixNQUFNLEVBRU4sVUFBVSxFQUNWLGFBQWEsRUFFZCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxNQUFNLEVBRU4sR0FBRyxFQUNILGdCQUFnQixFQUdoQixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixLQUFLLEVBRU4sTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDOzs7Ozs7O01BRzFCLFlBQVksR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDO0FBS25FLE1BQU0sT0FBTyxXQUFZLFNBQVEsZ0JBQWdCOzs7Ozs7OztJQWEvQyxZQUE2QixNQUFjLEVBQ2QsYUFBNEIsRUFDckMsa0JBQXNDLEVBQ3JDLGVBQXlCLEVBQ3pCLFlBQTBCO1FBQzdD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QyxJQUFJLEVBQUMsQ0FBQztRQUN4RSxDQUFDO0tBRUY7SUFqQkM7UUFEQyxLQUFLLEVBQUU7O2lEQUN5QixLQUFLOzs4REFXckM7SUFuRFUscUJBQVMsWUF5RHJCLENBQUE7Ozs7OztRQXZEYSw0QkFBd0I7O0FBd0R4QyxDQUFDLEVBN0RnQixXQUFXLEtBQVgsV0FBVyxRQTZEM0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBY3RpdmF0ZWRSb3V0ZSxcbiAgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcbiAgTmF2aWdhdGlvbkVuZCxcbiAgTmF2aWdhdGlvbkVycm9yLCBOYXZpZ2F0aW9uRXh0cmFzLFxuICBOYXZpZ2F0aW9uU3RhcnQsXG4gIFJvdXRlcixcbiAgUm91dGVyU3RhdGVTbmFwc2hvdCxcbiAgVXJsU2VnbWVudCxcbiAgVXJsU2VyaWFsaXplcixcbiAgVXJsVHJlZVxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgYXNzZXJ0LFxuICBCb29sZWFuVmFsdWVNb2RlbENoYWluLFxuICBEc2wsXG4gIEdhcmJhZ2VDb2xsZWN0b3IsXG4gIEhhc09uZUluZGV4Q2hhaW4sXG4gIExpc3RNb2RlbCxcbiAgTG9nZ2VyLFxuICBNdXRhYmxlTGlzdE1vZGVsLFxuICBNdXRhYmxlVmFsdWVNb2RlbCxcbiAgVHJhY2UsXG4gIFZhbHVlTW9kZWxcbn0gZnJvbSAnQGNvb2xvbi9wZWN0aW4nO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEludGVyYWN0aW9uQ29udGV4dCB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLWNvbnRleHQnO1xuaW1wb3J0IHsgTmF2aWdhdGlvblNlc3Npb24gfSBmcm9tICcuL25hdmlnYXRpb24tc2Vzc2lvbic7XG5pbXBvcnQgeyBQbGFjZUNvbXBvbmVudCB9IGZyb20gJy4vcGxhY2UtY29tcG9uZW50JztcbmltcG9ydCB7IFBsYWNlRGVmaW5pdGlvbiB9IGZyb20gJy4vcGxhY2UtZGVmaW5pdGlvbic7XG5pbXBvcnQgeyBQbGFjZUhpc3RvcnkgfSBmcm9tICcuL3BsYWNlLWhpc3RvcnknO1xuaW1wb3J0IHsgTm9vcEdhdGV3YXlQbGFjZSB9IGZyb20gJy4vcGxhY2VzL25vb3AtZ2F0ZXdheS1wbGFjZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVmlzaXQgfSBmcm9tICcuL3Zpc2l0JztcblxuXG5jb25zdCBub29wUGxhY2VEZWYgPSBQbGFjZUNvbXBvbmVudC5nZXREZWZpbml0aW9uKE5vb3BHYXRld2F5UGxhY2UpO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQbGFjZVJvdXRlciBleHRlbmRzIEdhcmJhZ2VDb2xsZWN0b3Ige1xuXG4gIHByaXZhdGUgZmlyc3RSb3V0ZSA9IHRydWU7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbmF2aWdhdGlvblNlc3Npb25Nb2RlbCA9IG5ldyBNdXRhYmxlVmFsdWVNb2RlbDxOYXZpZ2F0aW9uU2Vzc2lvbj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWN0aXZlVmlzaXRzID0gbmV3IE11dGFibGVMaXN0TW9kZWw8VmlzaXQ+KCk7XG5cbiAgcmVhZG9ubHkgbmF2aWdhdGlvblNlc3Npb25BY3RpdmU6IEJvb2xlYW5WYWx1ZU1vZGVsQ2hhaW47XG4gIHJlYWRvbmx5IGFjdGl2ZVZpc2l0SW5kZXg6IEhhc09uZUluZGV4Q2hhaW48J3BsYWNlRGVmaW5pdGlvbicsIFZpc2l0PjtcbiAgcHJpdmF0ZSByZWFkb25seSBuYXZpZ2F0aW9uU2Vzc2lvbkZhY3Rvcnk6IE5hdmlnYXRpb25TZXNzaW9uLkZhY3Rvcnk7XG4gIHByaXZhdGUgaW5pdGlhbFJlZGlyZWN0U3RhcnRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGluaXRpYWxSZWRpcmVjdEZpbmlzaGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSB1cmxTZXJpYWxpemVyOiBVcmxTZXJpYWxpemVyLFxuICAgICAgICAgICAgICBwcml2YXRlIGludGVyYWN0aW9uQ29udGV4dDogSW50ZXJhY3Rpb25Db250ZXh0LFxuICAgICAgICAgICAgICByZWFkb25seSBhbmd1bGFyTG9jYXRpb246IExvY2F0aW9uLFxuICAgICAgICAgICAgICByZWFkb25seSBwbGFjZUhpc3Rvcnk6IFBsYWNlSGlzdG9yeSkge1xuICAgIHN1cGVyKCk7XG4gICAgY29uc3QgeyBjaGFpbiwgdmFsdWVPZiwgYmVmb3JlLCB3aGVuLCBhZnRlciwgb2JzZXJ2ZSwgc3dpdGNoT24gfSA9IERzbC5kaXNwb3NlV2l0aCh0aGlzKTtcbiAgICB0aGlzLmFjdGl2ZVZpc2l0SW5kZXggPSBjaGFpbih0aGlzLl9hY3RpdmVWaXNpdHMpLmluZGV4QnkoJ3BsYWNlRGVmaW5pdGlvbicpO1xuICAgIHRoaXMubmF2aWdhdGlvblNlc3Npb25GYWN0b3J5ID0gbmV3IE5hdmlnYXRpb25TZXNzaW9uLkZhY3RvcnkoaW50ZXJhY3Rpb25Db250ZXh0KTtcbiAgICBhbmd1bGFyTG9jYXRpb24ub25VcmxDaGFuZ2UodXJsID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGBsb2NhdGlvbi5vblVybENoYW5nZSAtPiAke3VybH1gKTtcbiAgICB9KTtcblxuICAgIC8vIFRPRE86IG1ha2Ugc2V0dXAgdGhlIGNhbGxiYWNrcyBpbiBkdXJpbmcgbW9kdWxlIGluaXRpYXRpb24gdG8gbWFrZSB0aGlzIHRlc3RhYmxlLlxuICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgLy8gUm91dGluZyBldmVudCBzZXF1ZW5jZVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gTmF2aWdhdGlvblN0YXJ0IC0+IC4uLi4gLT4gTmF2aWdhdGlvbkNhbmNlbCAtLT4gcmVkaXJlY3QsIGdvIGFyb3VuZCBhZ2FpbiBpbiB0aGUgc2FtZSBzZXNzaW9uXG4gICAgICAvLyBOYXZpZ2F0aW9uU3RhcnQgLT4gLi4uLiAtPiBOYXZpZ2F0aW9uRW5kIC0tPiBuYXZpZ2F0aW9uIGNvbXBsZXRlLCBlbmQgc2Vzc2lvbi5cbiAgICAgIC8vIE5hdmlnYXRpb25TdGFydCAtPiAuLi4uIC0+IE5hdmlnYXRpb25FcnJvciAtLT4gbmF2aWdhdGlvbiBjYW5jZWxlZCwgZW5kIHNlc3Npb24uXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KSB7XG4gICAgICAgIHRoaXMub25Bbmd1bGFyUm91dGVyU3RhcnRlZChldmVudCk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgIHRoaXMub25Bbmd1bGFyUm91dGVyRmluaXNoZWQoZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVycm9yKSB7XG4gICAgICAgIHRoaXMub25Bbmd1bGFyUm91dGVyRmluaXNoZWQodHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm5hdmlnYXRpb25TZXNzaW9uQWN0aXZlID0gY2hhaW4odGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsKS5pc05vdE5pbCgpO1xuICAgIHRoaXMubmF2aWdhdGlvblNlc3Npb25BY3RpdmUuc3Vic2NyaWJlKGFjdGl2ZSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygnbmF2aWdhdGlvblNlc3Npb25BY3RpdmUnLCBhY3RpdmUpO1xuICAgIH0pO1xuICAgIC8vIGNvbnN0IHR4byA9IG5ldyBUcmFuc2FjdGlvbk9ic2VydmVyKCkub25FdmVudChlID0+IGNvbnNvbGUubG9nKGUudG9TdHJpbmcoKSkpO1xuICAgIC8vIHR4by5vYnNlcnZlKCd0aGlzLm5hdmlnYXRpb25TZXNzaW9uTW9kZWwnLCB0aGlzLm5hdmlnYXRpb25TZXNzaW9uTW9kZWwpO1xuICB9XG5cbiAgZ2V0IG5hdmlnYXRpb25TZXNzaW9uKCk6IE5hdmlnYXRpb25TZXNzaW9uIHtcbiAgICByZXR1cm4gdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC52YWx1ZTtcbiAgfVxuXG4gIGdldCBuYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsKCk6IFZhbHVlTW9kZWw8TmF2aWdhdGlvblNlc3Npb24+IHtcbiAgICByZXR1cm4gdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC5yZWFkb25seTtcbiAgfVxuXG4gIGdldCBhY3RpdmVWaXNpdHMoKTogTGlzdE1vZGVsPFZpc2l0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVZpc2l0cy5yZWFkb25seTtcbiAgfVxuXG4gIC8qKlxuICAgKiAgcGxhY2VSb3V0ZXIubmF2aWdhdGUocGxhY2VEZXN0aW5hdGlvbnMuc29tZVBsYWNlLmNyZWF0ZVZpc2l0KHJvdXRlSWQsIC4uLnZpc2l0UGFyYW1zKSk7XG4gICAqIEBwYXJhbSB2aXNpdFxuICAgKi9cbiAgQFRyYWNlKClcbiAgYXN5bmMgbmF2aWdhdGUodmlzaXQ6IFZpc2l0LCBvcHRpb25zPzogeyByZWxhdGl2ZVRvOiBBY3RpdmF0ZWRSb3V0ZSB9KSB7XG4gICAgdGhpcy5kb05hdmlnYXRpb24odmlzaXQsIGFzeW5jIHJvdXRlciA9PiB7XG4gICAgICBjb25zdCBjb21tYW5kcyA9IFtcbiAgICAgICAgdmlzaXQucGxhY2VEZWZpbml0aW9uLnBhdGgsXG4gICAgICAgIC4uLnRoaXMuY3JlYXRlUm91dGVQYXJhbWV0ZXJzKHZpc2l0KVxuICAgICAgXTtcbiAgICAgIGF3YWl0IHRoaXMucm91dGVyLm5hdmlnYXRlKGNvbW1hbmRzLCB7XG4gICAgICAgIHJlbGF0aXZlVG86IG9wdGlvbnMgPyBvcHRpb25zLnJlbGF0aXZlVG8gOiBudWxsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZVJlZGlyZWN0Rm9yKHZpc2l0OlZpc2l0LCBuYXZpZ2F0aW9uRXh0cmFzPzogTmF2aWdhdGlvbkV4dHJhcykge1xuICAgIHJldHVybiB0aGlzLnJvdXRlci5jcmVhdGVVcmxUcmVlKHRoaXMuY3JlYXRlUm91dGVQYXJhbWV0ZXJzKHZpc2l0KSwgbmF2aWdhdGlvbkV4dHJhcyk7XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuICBhc3luYyBwdXNoVmlzaXRDaGFuZ2VzVG9Sb3V0ZShhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsIHByZXZpb3VzOiBWaXNpdCwgbmV4dDogVmlzaXQpIHtcblxuICAgIC8vIHdlIGhhdmUgdG8gcHVzaCB0byBoaXN0b3J5IHNvIG91ciByZW1lbWJlciBzYW5pdGlzZXJzIGRvbid0IHBpY2sgdXAgdGhlIHByZXZpb3VzIHZhbHVlXG4gICAgLy8gd2hlbiBpdCdzIGJlZW4gY2xlYXJlZCBieSB0aGUgdXNlci5cbiAgICB0aGlzLnBsYWNlSGlzdG9yeS5hZGQobmV4dCk7XG5cbiAgICAvLyBGSVhNRTogbm8gcm91dGUgaWQgLT4gcm91dGUgaWQgZHVwbGljYXRlcyByb3V0ZSBwYXJhbWV0ZXJzXG4gICAgaWYgKG5leHQuaGFzUm91dGluZ0NoYW5nZWRGcm9tKHByZXZpb3VzKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZG9OYXZpZ2F0aW9uKG5leHQsIHJvdXRlciA9PiB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmRzID0gdGhpcy5wYXJzZVVybCh0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdCkuY3JlYXRlUmVkaXJlY3RDb21tYW5kc0ZvcihuZXh0KTtcbiAgICAgICAgLy8gLy8gd2UgaGF2ZSB0byB0byB1c2UgdGhlIGRlZmluaXRpb24gZm9yIHJvdXRlIGlkIGFzIG91ciByZWRpcmVjdGlvbiBhbHdheXMgaW5jbHVkZXNcbiAgICAgICAgLy8gLy8gdGhlIGlkIGluIHRoZSB1cmwgc2VnZW1lbnRzIChidXQgbGVhdmVzIGl0IGJsYW5rIHdoZW4gdGhlcmUncyBubyBpZCkuIEkuZS4gaW4gdGhlXG4gICAgICAgIC8vIC8vIG5vIGlkIGNhc2Ugd2UncmUgZG9pbmcgdGhlIGZvbGxvd2luZyByZWRpcmVjdCBbPHBsYWNlUGF0aD4sIFwiXCJdIC0+IFtcIi4uXCIsIDxpZD5dXG4gICAgICAgIC8vIGNvbnN0IHJlbGF0aXZlUGF0aCA9ICEhcHJldmlvdXMucGxhY2VEZWZpbml0aW9uLmhhc1JvdXRlSWQoKSA/ICcuLicgOiAnLic7XG4gICAgICAgIC8vIGNvbnN0IGNvbW1hbmRzID0gW1xuICAgICAgICAvLyAgIHJlbGF0aXZlUGF0aCxcbiAgICAgICAgLy8gICAuLi50aGlzLmNyZWF0ZVJvdXRlUGFyYW1ldGVycyhuZXh0KSxcbiAgICAgICAgLy8gICAuLi50aGlzLmV4dHJhY3RDaGlsZFBhdGgoYWN0aXZhdGVkUm91dGUuc25hcHNob3QpXG4gICAgICAgIC8vIF07XG4gICAgICAgIGNvbnNvbGUubG9nKCcjIyMgUHVzaCBDaGFuZ2VzIHRvIHJvdXRlIFJlZGlyZWN0JywgeyBjb21tYW5kcyB9KTtcbiAgICAgICAgcmV0dXJuIHJvdXRlci5uYXZpZ2F0ZShjb21tYW5kcyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkb05hdmlnYXRpb24odmlzaXQ6IFZpc2l0LCBjdXN0b21OYXZpZ2F0aW9uOiAocm91dGVyOiBSb3V0ZXIpID0+IGFueSkge1xuICAgIHRoaXMuX25hdmlnYXRpb25TZXNzaW9uTW9kZWwudmFsdWUgPSB0aGlzLm5hdmlnYXRpb25TZXNzaW9uRmFjdG9yeS5jcmVhdGVJbnRlcm5hbCh2aXNpdCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGN1c3RvbU5hdmlnYXRpb24odGhpcy5yb3V0ZXIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSb3V0ZXIgaGFzIGZpbmlzaGVkIChzaW5jZSB0aGVyZSB3YXMgbm8gcm91dGVyIGNoYW5nZSByZXF1aXJlZCkgc28gd2VcbiAgICAgIC8vIG5lZWQgdG8gZW5kIHRoZSBuYXZpZ2F0aW9uIHNlc3Npb24uXG4gICAgICBpZiAodGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbiAmJiAhdGhpcy5yb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb24oKSkge1xuICAgICAgICB0aGlzLm9uQW5ndWxhclJvdXRlckZpbmlzaGVkKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJvdXRlUGFyYW1ldGVycyh2aXNpdDogVmlzaXQpIHtcbiAgICBjb25zdCBkZWYgPSB2aXNpdC5wbGFjZURlZmluaXRpb247XG4gICAgcmV0dXJuIHZpc2l0Lmhhc1JvdXRlSWQoKSA/XG4gICAgICBbZGVmLmdldEZvcm1hdHRlZFJvdXRlSWQodmlzaXQpLCBkZWYuZ2V0Rm9ybWF0dGVkUm91dGVQYXJhbWV0ZXJzKHZpc2l0KV0gOlxuICAgICAgW2RlZi5nZXRGb3JtYXR0ZWRSb3V0ZVBhcmFtZXRlcnModmlzaXQpXTtcbiAgfVxuXG4gIC8vIEBUcmFjZSgpXG4gIHByaXZhdGUgb25Bbmd1bGFyUm91dGVyU3RhcnRlZChldmVudDogTmF2aWdhdGlvblN0YXJ0KSB7XG4gICAgaWYgKCF0aGlzLm5hdmlnYXRpb25TZXNzaW9uKSB7IC8vIFdlIGJlZW4gYWN0aXZhdGVkIGJ5IGFuIGV4dGVybmFsIHJvdXRlIHJhdGhlciB0aGFuIHBsYWNlUm91dGVyLmdvKHZpc2l0KVxuICAgICAgY29uc29sZS5sb2coJ25hdmlnYXRpb24gc3RhcnRlZCcsIHsgZmlyc3RUaW1lOiB0aGlzLmZpcnN0Um91dGUgfSk7XG4gICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbkZhY3RvcnkuY3JlYXRlRXh0ZXJuYWwodGhpcy5maXJzdFJvdXRlKTtcbiAgICAgIGlmIChldmVudC5uYXZpZ2F0aW9uVHJpZ2dlciA9PT0gJ3BvcHN0YXRlJykge1xuICAgICAgICBzZXNzaW9uLnNldFBvcHN0YXRlUmV0dXJuVXJsKHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90LnVybCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsLnZhbHVlID0gc2Vzc2lvbjtcbiAgICB9XG4gICAgdGhpcy5maXJzdFJvdXRlID0gZmFsc2U7XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuICBwcml2YXRlIG9uQW5ndWxhclJvdXRlckZpbmlzaGVkKGNhbmNlbGxlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsLnZhbHVlO1xuICAgIGlmICghY2FuY2VsbGVkKSB7XG4gICAgICAvLyBVcGRhdGUgdmlzaXRzIGJlZm9yZSB3ZSBlbmQgdGhlIG5hdmlnYXRpb24gc2Vzc2lvbi4gIFRoaXMgYWxsb3dzIHRoZSBwbGFjZU91dGV0cyB0b1xuICAgICAgLy8gaWdub3JlIHZpc2l0IGNoYW5nZXMgdGhhdCBvY2N1ciB3aGlsZSB0aGUgbmF2aWdhdGlvbiBpcyBpbiBwcm9ncmVzc1xuICAgICAgY29uc3QgdmlzaXRzID0gc2Vzc2lvbi5nZXRWaXNpdHMoKTtcbiAgICAgIHZpc2l0cy5mb3JFYWNoKHYgPT4gdGhpcy5wbGFjZUhpc3RvcnkuYWRkKHYpKTtcbiAgICAgIHRoaXMuX2FjdGl2ZVZpc2l0cy52YWx1ZSA9IHZpc2l0cztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQW5ndWxhciBkb2Vzbid0IHByZXNlcnZlIHRoZSB1cmwgd2hlbiBhIGd1YXJkIGNhbmNlbHMgdGhlIGJhY2sgYnV0dG9uLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzEzNTg2I2lzc3VlY29tbWVudC00MzI3OTU3MjBcbiAgICAgIGlmIChzZXNzaW9uLmlzUG9wU3RhdGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2NhbmNlbGxlZCBkdXJpbmcgcG9wc3RhdGUnKTtcbiAgICAgICAgdGhpcy5hbmd1bGFyTG9jYXRpb24uZ28oc2Vzc2lvbi5wb3BTdGF0ZVJldHVyblVybCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX25hdmlnYXRpb25TZXNzaW9uTW9kZWwudmFsdWUgPSBudWxsO1xuICB9XG5cbiAgZXh0cmFjdENoaWxkUGF0aChhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IGFueVtdIHtcbiAgICByZXR1cm4gXy5mbGF0dGVuKGFjdGl2YXRlZFJvdXRlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiBjaGlsZC51cmwpKTtcbiAgfVxuXG4gIHBhcnNlVXJsKHNuYXBzaG90OiBSb3V0ZXJTdGF0ZVNuYXBzaG90KTogUGxhY2VSb3V0ZXIuVXJsSGVscGVyIHtcbiAgICByZXR1cm4gbmV3IFBsYWNlUm91dGVyLlVybEhlbHBlcih0aGlzLnVybFNlcmlhbGl6ZXIucGFyc2Uoc25hcHNob3QudXJsKSk7XG4gIH1cblxuICAvLyBUT0RPOiB0aGlzIGFsbCBvbmx5IHNvcnQgb2Ygd29ya3MuICBPcGVuaW5nIGRpYWxvZ3MgYW5kIGNsaWNraW5nIGJhY2sgbXVsdGlwbGUgdGltZXMgYnJlYWtzIHRoaW5ncy5cbiAgLy8gVE9ETzogbmV4dCBzdGFnZSBpcyB0byBpbnZlc3RpZ2F0ZSB0cmFja2luZyBkaWFsb2cgc3RhdGUgaW4gYSBkaWZmZXJlbnQgcGxhY2VvdXRsZXQgYW5kIGtlZXBpbmcgdGhvc2VcbiAgLy8gVE9ETzogdXJscyBvdXQgb2YgdGhlIGhpc3RvcnkuXG4gIHBlcmZvcm1Jbml0aWFsTmF2aWdhdGlvbkludGVyY2VwdChhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpIHtcbiAgICBhc3NlcnQuaXNUcnV0aHkodGhpcy5pc0luaXRpYWxOYXZpZ2F0aW9uKCkpO1xuICAgIExvZ2dlci5nZXQodGhpcykuaW5mbyhgUmVkaXJlY3RpbmcgdG86ICR7bm9vcFBsYWNlRGVmLnBhdGh9YCwgeyByZXR1cm5Vcmw6IHN0YXRlLnVybCB9KTtcbiAgICBpZiAoIXRoaXMuaW5pdGlhbFJlZGlyZWN0RmluaXNoZWQpIHtcbiAgICAgIHRoaXMuaW5pdGlhbFJlZGlyZWN0RmluaXNoZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUoW25vb3BQbGFjZURlZi5wYXRoLCB7XG4gICAgICAgIHJldHVyblVybDogc3RhdGUudXJsXG4gICAgICB9XSwge1xuICAgICAgICByZXBsYWNlVXJsOiB0cnVlLCAvLyBtYWtlIHN1cmUgd2UgdXBkYXRlIG91ciBoaXN0b3J5XG4gICAgICAgIHNraXBMb2NhdGlvbkNoYW5nZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlzSW5pdGlhbE5hdmlnYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlc3Npb24uZmlyc3ROYXZpZ2F0aW9uICYmICF0aGlzLmluaXRpYWxSZWRpcmVjdEZpbmlzaGVkO1xuICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUGxhY2VSb3V0ZXIge1xuXG5cbiAgZXhwb3J0IGNsYXNzIFVybEhlbHBlciB7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHVybFRyZWU6IFVybFRyZWUpIHtcbiAgICAgIGNvbnNvbGUubG9nKHsgc2VnbWVudHM6IHRoaXMudXJsVHJlZS5yb290LmNoaWxkcmVuLnByaW1hcnkuc2VnbWVudHMgfSk7XG4gICAgfVxuXG4gICAgY2xvbmVVcmxTZWdtZW50TGlzdCgpOiBVcmxTZWdtZW50W10ge1xuICAgICAgcmV0dXJuIFsuLi50aGlzLnVybFRyZWUucm9vdC5jaGlsZHJlbi5wcmltYXJ5LnNlZ21lbnRzXTtcbiAgICB9XG5cbiAgICB1cGRhdGVWaXNpdFNlZ21lbnRzKHZpc2l0OiBWaXNpdCk6IFVybFNlZ21lbnRbXSB7XG4gICAgICAvLyBVZ2x5LCBidXQgaXQgd29ya3MgZm9yIG5vdy5cbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5jbG9uZVVybFNlZ21lbnRMaXN0KCk7XG4gICAgICBjb25zdCB2aXNpdFNlZ21lbnRzID0gdGhpcy5jb252ZXJ0VG9VcmxTZWdtZW50cyh2aXNpdCk7XG4gICAgICBjb25zdCByZXBsYWNlQXQgPSBzZWdtZW50cy5maW5kSW5kZXgoc2VnbWVudCA9PiBzZWdtZW50LnBhdGggPT09IHZpc2l0U2VnbWVudHNbMF0ucGF0aCk7XG4gICAgICAvLyBkbyBub3QgdXNlIHRoZSByZXR1cm4gdmFsdWUsIGl0J3MgdGhlIGl0ZW1zIHRoYXQgd2VyZSByZW1vdmVkIVxuICAgICAgc2VnbWVudHMuc3BsaWNlKHJlcGxhY2VBdCwgdmlzaXRTZWdtZW50cy5sZW5ndGgsIC4uLnZpc2l0U2VnbWVudHMpO1xuICAgICAgcmV0dXJuIHNlZ21lbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSB2aXNpdCBpbnRvIHNlZ21lbnRzLiAgUGxlYXNlIG5vdCB0aGF0IHRoZXNlIHNlZ21lbnRzIGFyZSBub3QgZVxuICAgICAqIEBwYXJhbSB2aXNpdFxuICAgICAqL1xuICAgIGNvbnZlcnRUb1VybFNlZ21lbnRzKHZpc2l0OiBWaXNpdCk6IFVybFNlZ21lbnRbXSB7XG4gICAgICByZXR1cm4gdmlzaXQucGxhY2VEZWZpbml0aW9uLmhhc1JvdXRlSWQoKSA/XG4gICAgICAgIFtcbiAgICAgICAgICAvLyBOT1RFOlxuICAgICAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIGF0dGFjaCB0aGUgcGFyYW1zIHRvIHRoZSByb290IHBhdGggYW5kIG5vdCB0aGUgaWQuICBJZiB3ZSBhdHRhY2ggdGhlbVxuICAgICAgICAgIC8vIHRvIGFuIGVtcHR5IGlkIHRoZW4gdGhlIGFuZ3VsYXIgcm91dGVyIHdvbid0IG1hdGNoIHRoZSBwYXR0ZXJuLlxuICAgICAgICAgIG5ldyBVcmxTZWdtZW50KHZpc2l0LnBsYWNlRGVmaW5pdGlvbi5wYXRoLCB2aXNpdC5wbGFjZURlZmluaXRpb24uZ2V0Rm9ybWF0dGVkUm91dGVQYXJhbWV0ZXJzKHZpc2l0KSksXG4gICAgICAgICAgbmV3IFVybFNlZ21lbnQodmlzaXQucGxhY2VEZWZpbml0aW9uLmdldEZvcm1hdHRlZFJvdXRlSWQodmlzaXQpLCB7fSldXG4gICAgICAgIDpcbiAgICAgICAgW1xuICAgICAgICAgIG5ldyBVcmxTZWdtZW50KHZpc2l0LnBsYWNlRGVmaW5pdGlvbi5wYXRoLCB2aXNpdC5wbGFjZURlZmluaXRpb24uZ2V0Rm9ybWF0dGVkUm91dGVQYXJhbWV0ZXJzKHZpc2l0KSlcbiAgICAgICAgXTtcbiAgICB9XG5cblxuICAgIEBUcmFjZSgpXG4gICAgY3JlYXRlUmVkaXJlY3RDb21tYW5kc0Zvcih2aXNpdDogVmlzaXQpOiBhbnlbXSB7XG5cbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy51cGRhdGVWaXNpdFNlZ21lbnRzKHZpc2l0KTtcbiAgICAgIGNvbnN0IGNvbW1hbmRzID0gW107XG4gICAgICBzZWdtZW50cy5mb3JFYWNoKHMgPT4ge1xuICAgICAgICBjb21tYW5kcy5wdXNoKHMucGF0aCk7XG4gICAgICAgIGlmIChzLnBhcmFtZXRlck1hcC5rZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKHMucGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNvbW1hbmRzO1xuICAgIH1cblxuICAgIGluY2x1ZGVzUGF0aE9mKHBsYWNlRGVmOiBQbGFjZURlZmluaXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLmNsb25lVXJsU2VnbWVudExpc3QoKS5maW5kKHMgPT4gcy5wYXRoID09PSBwbGFjZURlZi5wYXRoKTtcbiAgICB9XG5cbiAgfVxufVxuIl19
|
|
404
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Utcm91dGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvb2xvbi9hbmd1bGFyLXVpLXBvd2VydXBzLyIsInNvdXJjZXMiOlsibGliL3BsYWNlL3BsYWNlLXJvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFHTCxnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGVBQWUsRUFDZixlQUFlLEVBQ2YsTUFBTSxFQUVOLGFBQWEsRUFDZCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxNQUFNLEVBQ04sR0FBRyxFQUNILGdCQUFnQixFQUVoQixJQUFJLEVBRUosTUFBTSxFQUNOLGdCQUFnQixFQUNoQixpQkFBaUIsRUFFbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFFdkIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDNUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7OztBQU83QyxNQUFNLE9BQU8sV0FBWSxTQUFRLGdCQUFnQjs7Ozs7Ozs7SUFXL0MsWUFBNkIsTUFBYyxFQUNkLGFBQTRCLEVBQzVCLGVBQXlCLEVBQ3pCLFlBQTBCLEVBQzFCLHVCQUFnRDtRQUMzRSxLQUFLLEVBQUUsQ0FBQztRQUxtQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2Qsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsb0JBQWUsR0FBZixlQUFlLENBQVU7UUFDekIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsNEJBQXVC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eUIsR0FBRyxpQkFBaUI7SUFFMUQsTUFBYSx3QkFBd0I7Ozs7O1FBQ25DLFlBQXFCLDRCQUFpRCxFQUFXLE1BQWM7WUFBMUUsaUNBQTRCLEdBQTVCLDRCQUE0QixDQUFxQjtZQUFXLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDL0YsQ0FBQzs7OztRQUVELElBQUksWUFBWTtZQUNkLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLEtBQUssQ0FBQztRQUNqRCxDQUFDOzs7Ozs7UUFJRCxpQkFBaUI7WUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUU7d0JBQ3pCLE9BQU8sRUFBRTs0QkFDUCxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsZ0RBQWdEO3lCQUNwRztxQkFDRixDQUFDLEVBQUU7b0JBQ0YsVUFBVSxFQUFFLEtBQUs7aUJBQ2xCLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQzs7Ozs7UUFHRCxrQkFBa0I7WUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFO3dCQUN6QixPQUFPLEVBQUU7NEJBQ1AsQ0FBQyxXQUFXLENBQUMseUJBQXlCLENBQUMsRUFBRSxJQUFJO3lCQUM5QztxQkFDRixDQUFDLEVBQUU7b0JBQ0YsVUFBVSxFQUFFLElBQUksQ0FBQywyQ0FBMkM7aUJBQzdELENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQztLQUVGO0lBbkNZLG9DQUF3QiwyQkFtQ3BDLENBQUE7OztRQWxDYSxnRUFBMEQ7O1FBQUUsMENBQXVCOztBQW9DbkcsQ0FBQyxFQXpDZ0IsV0FBVyxLQUFYLFdBQVcsUUF5QzNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWN0aXZhdGVkUm91dGUsXG4gIEFjdGl2YXRlZFJvdXRlU25hcHNob3QsXG4gIE5hdmlnYXRpb25DYW5jZWwsXG4gIE5hdmlnYXRpb25FbmQsXG4gIE5hdmlnYXRpb25FcnJvcixcbiAgTmF2aWdhdGlvblN0YXJ0LFxuICBSb3V0ZXIsXG4gIFJvdXRlclN0YXRlU25hcHNob3QsXG4gIFVybFNlcmlhbGl6ZXJcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIGFzc2VydCxcbiAgRHNsLFxuICBHYXJiYWdlQ29sbGVjdG9yLFxuICBIYXNPbmVJbmRleENoYWluLFxuICBsYW5nLFxuICBMaXN0TW9kZWwsXG4gIExvZ2dlcixcbiAgTXV0YWJsZUxpc3RNb2RlbCxcbiAgTXV0YWJsZVZhbHVlTW9kZWwsXG4gIFZhbHVlTW9kZWxcbn0gZnJvbSAnQGNvb2xvbi9wZWN0aW4nO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEludGVyYWN0aW9uQ29udGV4dCB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLWNvbnRleHQnO1xuaW1wb3J0IHsgTW9kYWxJbnRlcmFjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9zZXJ2aWNlcy9tb2RhbC1pbnRlcmFjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE5hdmlnYXRpb25TdGF0ZSB9IGZyb20gJy4vZ3VhcmRzL25hdmlnYXRpb24tc3RhdGUnO1xuaW1wb3J0IHsgUGxhY2VIaXN0b3J5IH0gZnJvbSAnLi9wbGFjZS1oaXN0b3J5JztcbmltcG9ydCB7IFVybFNuYXBzaG90IH0gZnJvbSAnLi91cmwtc25hcHNob3QnO1xuaW1wb3J0IHsgVmlzaXQgfSBmcm9tICcuL3Zpc2l0JztcblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQbGFjZVJvdXRlciBleHRlbmRzIEdhcmJhZ2VDb2xsZWN0b3Ige1xuXG4gIHByaXZhdGUgZmlyc3RSb3V0ZSA9IHRydWU7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbmF2aWdhdGlvblNlc3Npb25Nb2RlbCA9IG5ldyBNdXRhYmxlVmFsdWVNb2RlbDxOYXZpZ2F0aW9uU3RhdGU+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FjdGl2ZVZpc2l0cyA9IG5ldyBNdXRhYmxlTGlzdE1vZGVsPFZpc2l0PigpO1xuXG4gIHJlYWRvbmx5IG5hdmlnYXRpb25TZXNzaW9uQWN0aXZlOiBWYWx1ZU1vZGVsPGJvb2xlYW4+O1xuICByZWFkb25seSBhY3RpdmVWaXNpdEluZGV4OiBIYXNPbmVJbmRleENoYWluPCdwbGFjZURlZmluaXRpb24nLCBWaXNpdD47XG4gIHByaXZhdGUgX25hdmlnYXRpb25TZXNzaW9uQ29udGV4dDogTmF2aWdhdGlvblN0YXRlLkNvbnRleHQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSB1cmxTZXJpYWxpemVyOiBVcmxTZXJpYWxpemVyLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGFuZ3VsYXJMb2NhdGlvbjogTG9jYXRpb24sXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcGxhY2VIaXN0b3J5OiBQbGFjZUhpc3RvcnksXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbW9kYWxJbnRlcmFjdGlvblNlcnZpY2U6IE1vZGFsSW50ZXJhY3Rpb25TZXJ2aWNlKSB7XG4gICAgc3VwZXIoKTtcbiAgICBjb25zdCB7IGNoYWluLCB2YWx1ZU9mLCBiZWZvcmUsIHdoZW4sIGFmdGVyLCBvYnNlcnZlLCBzd2l0Y2hPbiB9ID0gRHNsLmRpc3Bvc2VXaXRoKHRoaXMpO1xuICAgIHRoaXMuYWN0aXZlVmlzaXRJbmRleCA9IGNoYWluKHRoaXMuX2FjdGl2ZVZpc2l0cykuaW5kZXhCeSgncGxhY2VEZWZpbml0aW9uJyk7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbkFjdGl2ZSA9IGNoYWluKHRoaXMubmF2aWdhdGlvblNlc3Npb25Nb2RlbCkucGx1Y2soJ2FjdGl2ZScpO1xuICAgIHRoaXMuX25hdmlnYXRpb25TZXNzaW9uQ29udGV4dCA9IG5ldyBOYXZpZ2F0aW9uU3RhdGUuQ29udGV4dCh0aGlzLnJvdXRlciwgdGhpcy5tb2RhbEludGVyYWN0aW9uU2VydmljZSwgdGhpcy5hbmd1bGFyTG9jYXRpb24sIHNlc3Npb24gPT4ge1xuICAgICAgdGhpcy5wcm9jZXNzTmF2aWdhdGlvblN1Y2Nlc3Moc2Vzc2lvbik7XG4gICAgfSk7XG4gICAgdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC52YWx1ZSA9IG5ldyBOYXZpZ2F0aW9uU3RhdGUuSWRsZSh0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbkNvbnRleHQpO1xuXG4gICAgLy8gVE9ETzogbWFrZSBzZXR1cCB0aGUgY2FsbGJhY2tzIGluIGR1cmluZyBtb2R1bGUgaW5pdGlhdGlvbiB0byBtYWtlIHRoaXMgdGVzdGFibGUuXG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAvLyBSb3V0aW5nIGV2ZW50IHNlcXVlbmNlXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBOYXZpZ2F0aW9uU3RhcnQgLT4gLi4uLiAtPiBOYXZpZ2F0aW9uQ2FuY2VsIC0tPiByZWRpcmVjdCwgZ28gYXJvdW5kIGFnYWluIGluIHRoZSBzYW1lIHNlc3Npb25cbiAgICAgIC8vIE5hdmlnYXRpb25TdGFydCAtPiAuLi4uIC0+IE5hdmlnYXRpb25FbmQgLS0+IG5hdmlnYXRpb24gY29tcGxldGUsIGVuZCBzZXNzaW9uLlxuICAgICAgLy8gTmF2aWdhdGlvblN0YXJ0IC0+IC4uLi4gLT4gTmF2aWdhdGlvbkVycm9yIC0tPiBuYXZpZ2F0aW9uIGFib3J0ZWQsIGVuZCBzZXNzaW9uLlxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkge1xuICAgICAgICB0aGlzLnJ1blN0YXRlVHJhbnNpdGlvbihzZXNzaW9uID0+IHNlc3Npb24ub25TdGFydChldmVudCkpO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xuICAgICAgICB0aGlzLnJ1blN0YXRlVHJhbnNpdGlvbihzZXNzaW9uID0+IHNlc3Npb24ub25FbmQoZXZlbnQpKTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FcnJvcikge1xuICAgICAgICB0aGlzLnJ1blN0YXRlVHJhbnNpdGlvbihzZXNzaW9uID0+IHNlc3Npb24ub25FcnJvcihldmVudCkpO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkNhbmNlbCkge1xuICAgICAgICB0aGlzLnJ1blN0YXRlVHJhbnNpdGlvbihzZXNzaW9uID0+IHNlc3Npb24ub25DYW5jZWwoZXZlbnQpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFB1c2ggZGlhbG9nIHN0YXRlIHRvIHRoZSB1cmwgc28gd2UgY2FuIGNhcHR1cmUgdGhlIGJhY2sgYnV0dG9uLlxuICAgIHRoaXMubW9kYWxJbnRlcmFjdGlvblNlcnZpY2UuYWRkQWN0aXZpdHlMaXN0ZW5lcihuZXcgUGxhY2VSb3V0ZXIuSW50ZXJhY3Rpb25Sb3V0ZU1lZGlhdG9yKHRoaXMubmF2aWdhdGlvblNlc3Npb25BY3RpdmUsIHRoaXMucm91dGVyKSk7XG5cbiAgICAvLyBUaGUgYW5ndWxhciByb3V0ZXIgZG9lc24ndCBhbHdheXMgZmlyZSByb3V0ZXIgZXZlbnRzIHdoZW4gdGhlIGJhY2sgYnV0dG9uIGlzIHB1c2hlZCB3aGlsZSBhIG5hdmlnYXRpb25cbiAgICAvLyBzZXNzaW9uIGlzIGluIHByb2dyZXNzLiAgU29tZXRpbWVzIHdlIG9ubHkga25vdyBhYm91dCBpdCBmcm9tIHRoZSB1cmwgY2hhbmdlLlxuICAgIGFuZ3VsYXJMb2NhdGlvbi5vblVybENoYW5nZSh1cmwgPT4ge1xuICAgICAgY29uc29sZS5sb2coYCMjIyMgdXJsIGNoYW5nZWQgLT5gLCB7IHVybCwgbmF2SXNBY3RpdmU6IHRoaXMubmF2aWdhdGlvblNlc3Npb25BY3RpdmUudmFsdWUgfSk7XG4gICAgICBjb25zdCBpbnRlcmFjdGlvbkNvbnRleHQgPSB0aGlzLm5hdmlnYXRpb25TZXNzaW9uQWN0aXZlLnZhbHVlICYmIHRoaXMubmF2aWdhdGlvblNlc3Npb24uaW50ZXJhY3Rpb25Db250ZXh0O1xuICAgICAgaWYgKGludGVyYWN0aW9uQ29udGV4dCAmJiBpbnRlcmFjdGlvbkNvbnRleHQuaXNBY3RpdmUoKSkge1xuICAgICAgICBMb2dnZXIuZ2V0KHRoaXMpLmluZm8oYGJhY2sgYnV0dG9uIHByZXNzZWQgZHVyaW5nIG5hdmlnYXRpb24gc2Vzc2lvbiBpbnRlcmFjdGlvbmApO1xuICAgICAgICB0aGlzLnJ1blN0YXRlVHJhbnNpdGlvbihuYXZpZ2F0aW9uU2Vzc2lvbiA9PiBuYXZpZ2F0aW9uU2Vzc2lvbi5vbkJhY2tDbGlja2VkRHVyaW5nTmF2aWdhdGlvbkludGVyYWN0aW9uKHVybCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzTmF2aWdhdGlvblN1Y2Nlc3Moc2Vzc2lvbjogTmF2aWdhdGlvblN0YXRlKSB7XG4gICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIHZpc2l0cyBiZWZvcmUgdGhlIHNlc3Npb24gZmluaXNoZXMuICBUaGlzIGFsbG93cyB0aGUgcGxhY2VPdXRldHMgdG8gaWdub3JlIHZpc2l0XG4gICAgLy8gY2hhbmdlcyB0aGF0IG9jY3VyIHdoaWxlIHJvdXRlck5hdmlnYXRpb25BY3RpdmUgaXMgdHJ1ZS5cbiAgICBhc3NlcnQuaXNUcnV0aHkodGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbkFjdGl2ZS52YWx1ZSk7XG4gICAgY29uc3QgdmlzaXRzID0gc2Vzc2lvbi5nZXRWaXNpdHMoKTtcbiAgICB2aXNpdHMuZm9yRWFjaCh2ID0+IHRoaXMucGxhY2VIaXN0b3J5LmFkZCh2KSk7XG4gICAgdGhpcy5fYWN0aXZlVmlzaXRzLnZhbHVlID0gdmlzaXRzO1xuICB9XG5cbiAgZ2V0IG5hdmlnYXRpb25TZXNzaW9uKCk6IE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb25TZXNzaW9uTW9kZWwudmFsdWU7XG4gIH1cblxuICBnZXQgbmF2aWdhdGlvblNlc3Npb25Nb2RlbCgpOiBWYWx1ZU1vZGVsPE5hdmlnYXRpb25TdGF0ZT4ge1xuICAgIHJldHVybiB0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsLnJlYWRvbmx5O1xuICB9XG5cbiAgZ2V0IGFjdGl2ZVZpc2l0cygpOiBMaXN0TW9kZWw8VmlzaXQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlVmlzaXRzLnJlYWRvbmx5O1xuICB9XG5cbiAgLyoqXG4gICAqICBwbGFjZVJvdXRlci5uYXZpZ2F0ZShwbGFjZURlc3RpbmF0aW9ucy5zb21lUGxhY2UuY3JlYXRlVmlzaXQocm91dGVJZCwgLi4udmlzaXRQYXJhbXMpKTtcbiAgICogQHBhcmFtIHZpc2l0XG4gICAqL1xuICBhc3luYyBuYXZpZ2F0ZSh2aXNpdDogVmlzaXQsIG9wdGlvbnM/OiB7IHJlbGF0aXZlVG86IEFjdGl2YXRlZFJvdXRlIH0pIHtcbiAgICB0aGlzLmRvTmF2aWdhdGlvbih2aXNpdCwgYXN5bmMgcm91dGVyID0+IHtcbiAgICAgIGNvbnN0IGNvbW1hbmRzID0gW1xuICAgICAgICB2aXNpdC5wbGFjZURlZmluaXRpb24ucGF0aCxcbiAgICAgICAgLi4udGhpcy5jcmVhdGVSb3V0ZVBhcmFtZXRlcnModmlzaXQpXG4gICAgICBdO1xuICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGUoY29tbWFuZHMsIHtcbiAgICAgICAgcmVsYXRpdmVUbzogb3B0aW9ucyA/IG9wdGlvbnMucmVsYXRpdmVUbyA6IG51bGxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQFRyYWNlKClcbiAgYXN5bmMgcHVzaFZpc2l0Q2hhbmdlc1RvUm91dGUoYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLCBwcmV2aW91czogVmlzaXQsIG5leHQ6IFZpc2l0KSB7XG4gICAgLy8gd2UgaGF2ZSB0byBwdXNoIHRvIGhpc3Rvcnkgc28gb3VyIHJlbWVtYmVyIHNhbml0aXNlcnMgZG9uJ3QgcGljayB1cCB0aGUgcHJldmlvdXMgdmFsdWVcbiAgICAvLyB3aGVuIGl0J3MgYmVlbiBjbGVhcmVkIGJ5IHRoZSB1c2VyLlxuICAgIHRoaXMucGxhY2VIaXN0b3J5LmFkZChuZXh0KTtcblxuICAgIC8vIEZJWE1FOiBubyByb3V0ZSBpZCAtPiByb3V0ZSBpZCBkdXBsaWNhdGVzIHJvdXRlIHBhcmFtZXRlcnNcbiAgICBpZiAobmV4dC5oYXNSb3V0aW5nQ2hhbmdlZEZyb20ocHJldmlvdXMpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kb05hdmlnYXRpb24obmV4dCwgcm91dGVyID0+IHtcbiAgICAgICAgY29uc3QgY29tbWFuZHMgPSB0aGlzLnBhcnNlVXJsKHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90KS5jcmVhdGVSZWRpcmVjdENvbW1hbmRzRm9yKG5leHQpO1xuICAgICAgICBjb25zb2xlLmxvZygnIyMjIFB1c2ggQ2hhbmdlcyB0byByb3V0ZSBSZWRpcmVjdCcsIHsgY29tbWFuZHMgfSk7XG4gICAgICAgIHJldHVybiByb3V0ZXIubmF2aWdhdGUoY29tbWFuZHMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZG9OYXZpZ2F0aW9uKHZpc2l0OiBWaXNpdCwgcnVuTmF2aWdhdGlvbkNvbW1hbmRzOiAocm91dGVyOiBSb3V0ZXIpID0+IGFueSkge1xuICAgIGlmICh0aGlzLm5hdmlnYXRpb25TZXNzaW9uQWN0aXZlLnZhbHVlKSB7XG4gICAgICBsYW5nLmlsbGVnYWxTdGF0ZSgnTmF2aWdhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzJyk7XG4gICAgfVxuXG4gICAgdGhpcy5ydW5TdGF0ZVRyYW5zaXRpb24oY3VycmVudCA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gbmV3IE5hdmlnYXRpb25TdGF0ZS5BY3RpdmUodGhpcy5fbmF2aWdhdGlvblNlc3Npb25Db250ZXh0LCBmYWxzZSwgdGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QudXJsKTtcbiAgICAgIHNlc3Npb24uc3RvcmVWaXNpdCh2aXNpdCk7XG4gICAgICByZXR1cm4gc2Vzc2lvbjtcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcnVuTmF2aWdhdGlvbkNvbW1hbmRzKHRoaXMucm91dGVyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gUm91dGVyIGhhcyBmaW5pc2hlZCAoc2luY2UgdGhlcmUgd2FzIG5vIHJvdXRlciBjaGFuZ2UgcmVxdWlyZWQpIHNvIHdlXG4gICAgICAvLyBuZWVkIHRvIGVuZCB0aGUgbmF2aWdhdGlvbiBzZXNzaW9uLlxuICAgICAgaWYgKHRoaXMubmF2aWdhdGlvblNlc3Npb24uYWN0aXZlICYmICF0aGlzLnJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbigpKSB7XG4gICAgICAgIHRoaXMucnVuU3RhdGVUcmFuc2l0aW9uKHNlc3Npb24gPT4gc2Vzc2lvbi5vbkVuZChuZXcgTmF2aWdhdGlvbkVuZCgtMSwgJycsICcnKSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBydW5TdGF0ZVRyYW5zaXRpb24odHJhbnNpdGlvbjogKG5hdmlnYXRpb25TZXNzaW9uOiBOYXZpZ2F0aW9uU3RhdGUpID0+IE5hdmlnYXRpb25TdGF0ZSkge1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC52YWx1ZTtcbiAgICBjb25zdCBuZXh0ID0gdHJhbnNpdGlvbih0aGlzLm5hdmlnYXRpb25TZXNzaW9uKTtcbiAgICB0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsLnZhbHVlID0gbmV4dDtcbiAgICBpZiAobmV4dCAhPT0gcHJldmlvdXMpIHtcbiAgICAgIHByZXZpb3VzLmRpc3Bvc2UoKTtcbiAgICAgIExvZ2dlci5nZXQodGhpcykuaW5mbyhgUm91dGVyIFN0YXRlIFRyYW5zaXRpb246ICR7cHJldmlvdXMudG9TdHJpbmcoKX0gLT4gJHtuZXh0LnRvU3RyaW5nKCl9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVSb3V0ZVBhcmFtZXRlcnModmlzaXQ6IFZpc2l0KSB7XG4gICAgY29uc3QgZGVmID0gdmlzaXQucGxhY2VEZWZpbml0aW9uO1xuICAgIHJldHVybiB2aXNpdC5oYXNSb3V0ZUlkKCkgP1xuICAgICAgW2RlZi5nZXRGb3JtYXR0ZWRSb3V0ZUlkKHZpc2l0KSwgZGVmLmdldEZvcm1hdHRlZFJvdXRlUGFyYW1ldGVycyh2aXNpdCldIDpcbiAgICAgIFtkZWYuZ2V0Rm9ybWF0dGVkUm91dGVQYXJhbWV0ZXJzKHZpc2l0KV07XG4gIH1cblxuICBleHRyYWN0Q2hpbGRQYXRoKGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogYW55W10ge1xuICAgIHJldHVybiBfLmZsYXR0ZW4oYWN0aXZhdGVkUm91dGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IGNoaWxkLnVybCkpO1xuICB9XG5cbiAgcGFyc2VVcmwoc25hcHNob3Q6IFJvdXRlclN0YXRlU25hcHNob3QpOiBVcmxTbmFwc2hvdCB7XG4gICAgcmV0dXJuIG5ldyBVcmxTbmFwc2hvdCh0aGlzLnVybFNlcmlhbGl6ZXIucGFyc2Uoc25hcHNob3QudXJsKSk7XG4gIH1cblxufVxuXG5leHBvcnQgbmFtZXNwYWNlIFBsYWNlUm91dGVyIHtcblxuICBleHBvcnQgY29uc3QgSU5URVJBQ1RJT05fUk9VVEVSX09VVExFVCA9ICdhdXAtaW50ZXJhY3Rpb24nO1xuXG4gIGV4cG9ydCBjbGFzcyBJbnRlcmFjdGlvblJvdXRlTWVkaWF0b3IgaW1wbGVtZW50cyBJbnRlcmFjdGlvbkNvbnRleHQuTGlzdGVuZXIge1xuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IG5hdmlnYXRpb25TZXNzaW9uTW9kZWxBY3RpdmU6IFZhbHVlTW9kZWw8Ym9vbGVhbj4sIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyKSB7XG4gICAgfVxuXG4gICAgZ2V0IGlzTmF2aWdhdGluZygpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXNzaW9uTW9kZWxBY3RpdmUudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UncmUgbm90IGluIGEgbmF2aWdhdGlvbiB3ZSBwdXNoXG4gICAgLy8gQFRyYWNlKClcbiAgICBvbkFjdGl2aXR5U3RhcnRlZCgpOiB2b2lkIHtcbiAgICAgIGlmICghdGhpcy5pc05hdmlnYXRpbmcpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuJywge1xuICAgICAgICAgIG91dGxldHM6IHtcbiAgICAgICAgICAgIFtQbGFjZVJvdXRlci5JTlRFUkFDVElPTl9ST1VURVJfT1VUTEVUXTogWydtb2RhbCddIC8vIFwib3BlblwiIG11c3QgYmUgYSB2YWxpZCByb3V0ZSBmb3IgdGhpcyBvdXRsZXQuXG4gICAgICAgICAgfVxuICAgICAgICB9XSwge1xuICAgICAgICAgIHJlcGxhY2VVcmw6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEBUcmFjZSgpXG4gICAgb25BY3Rpdml0eUZpbmlzaGVkKCk6IHZvaWQge1xuICAgICAgaWYgKCF0aGlzLmlzTmF2aWdhdGluZykge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4nLCB7XG4gICAgICAgICAgb3V0bGV0czoge1xuICAgICAgICAgICAgW1BsYWNlUm91dGVyLklOVEVSQUNUSU9OX1JPVVRFUl9PVVRMRVRdOiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICB9XSwge1xuICAgICAgICAgIHJlcGxhY2VVcmw6IHRydWUgLy8gcmVtb3ZlIHRoZSBpbnRlcmFjdGlvbiBmcm9tIHRoZSBoaXN0b3J5LlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG59XG4iXX0=
|