@ngxs/router-plugin 3.7.3-dev.master-5175b98 → 3.7.3

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.
@@ -1,552 +1,523 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import * as tslib_1 from "tslib";
6
- import { NgZone, Injectable, OnDestroy } from '@angular/core';
7
- import { NavigationCancel, NavigationError, Router, RouterStateSnapshot, RoutesRecognized, ResolveEnd, UrlSerializer, NavigationStart, NavigationEnd } from '@angular/router';
8
- import { LocationStrategy, Location } from '@angular/common';
9
- import { Action, Selector, State, StateContext, Store } from '@ngxs/store';
10
- import { isAngularInTestMode } from '@ngxs/store/internals';
11
- import { Subscription } from 'rxjs';
12
- import { first } from 'rxjs/operators';
13
- import { Navigate, RouterCancel, RouterError, RouterNavigation, RouterDataResolved } from './router.actions';
14
- import { RouterStateSerializer } from './serializer';
15
- /**
16
- * @record
17
- * @template T
18
- */
19
- export function RouterStateModel() { }
20
- if (false) {
21
- /** @type {?|undefined} */
22
- RouterStateModel.prototype.state;
23
- /** @type {?|undefined} */
24
- RouterStateModel.prototype.navigationId;
25
- /** @type {?} */
26
- RouterStateModel.prototype.trigger;
27
- }
28
- var RouterState = /** @class */ (function () {
29
- function RouterState(_store, _router, _serializer, _ngZone, _urlSerializer, _locationStrategy, _location) {
30
- this._store = _store;
31
- this._router = _router;
32
- this._serializer = _serializer;
33
- this._ngZone = _ngZone;
34
- this._urlSerializer = _urlSerializer;
35
- this._locationStrategy = _locationStrategy;
36
- this._location = _location;
37
- /**
38
- * Determines how navigation was performed by the `RouterState` itself
39
- * or outside via `new Navigate(...)`
40
- */
41
- this._trigger = 'none';
42
- /**
43
- * That's the serialized state from the `Router` class
44
- */
45
- this._routerState = null;
46
- /**
47
- * That's the value of the `RouterState` state
48
- */
49
- this._storeState = null;
50
- this._lastRoutesRecognized = (/** @type {?} */ (null));
51
- this._subscription = new Subscription();
52
- this.setUpStoreListener();
53
- this.setUpRouterEventsListener();
54
- this.checkInitialNavigationOnce();
55
- }
56
- RouterState_1 = RouterState;
57
- /**
58
- * @template T
59
- * @param {?} state
60
- * @return {?}
61
- */
62
- RouterState.state = /**
63
- * @template T
64
- * @param {?} state
65
- * @return {?}
66
- */
67
- function (state) {
68
- return state && state.state;
69
- };
70
- /**
71
- * @param {?} state
72
- * @return {?}
73
- */
74
- RouterState.url = /**
75
- * @param {?} state
76
- * @return {?}
77
- */
78
- function (state) {
79
- return state && state.state && state.state.url;
80
- };
81
- /**
82
- * @return {?}
83
- */
84
- RouterState.prototype.ngOnDestroy = /**
85
- * @return {?}
86
- */
87
- function () {
88
- this._subscription.unsubscribe();
89
- };
90
- /**
91
- * @param {?} _
92
- * @param {?} action
93
- * @return {?}
94
- */
95
- RouterState.prototype.navigate = /**
96
- * @param {?} _
97
- * @param {?} action
98
- * @return {?}
99
- */
100
- function (_, action) {
101
- var _this = this;
102
- return this._ngZone.run((/**
103
- * @return {?}
104
- */
105
- function () {
106
- return _this._router.navigate(action.path, tslib_1.__assign({ queryParams: action.queryParams }, action.extras));
107
- }));
108
- };
109
- /**
110
- * @param {?} ctx
111
- * @param {?} action
112
- * @return {?}
113
- */
114
- RouterState.prototype.angularRouterAction = /**
115
- * @param {?} ctx
116
- * @param {?} action
117
- * @return {?}
118
- */
119
- function (ctx, action) {
120
- ctx.setState(tslib_1.__assign({}, ctx.getState(), { trigger: action.trigger, state: action.routerState, navigationId: action.event.id }));
121
- };
122
- /**
123
- * @private
124
- * @return {?}
125
- */
126
- RouterState.prototype.setUpStoreListener = /**
127
- * @private
128
- * @return {?}
129
- */
130
- function () {
131
- var _this = this;
132
- /** @type {?} */
133
- var subscription = this._store
134
- .select(RouterState_1)
135
- .subscribe((/**
136
- * @param {?} state
137
- * @return {?}
138
- */
139
- function (state) {
140
- _this.navigateIfNeeded(state);
141
- }));
142
- this._subscription.add(subscription);
143
- };
144
- /**
145
- * @private
146
- * @return {?}
147
- */
148
- RouterState.prototype.setUpRouterEventsListener = /**
149
- * @private
150
- * @return {?}
151
- */
152
- function () {
153
- var _this = this;
154
- /** @type {?} */
155
- var subscription = this._router.events.subscribe((/**
156
- * @param {?} event
157
- * @return {?}
158
- */
159
- function (event) {
160
- if (event instanceof NavigationStart) {
161
- _this.navigationStart();
162
- }
163
- else if (event instanceof RoutesRecognized) {
164
- _this._lastRoutesRecognized = event;
165
- }
166
- else if (event instanceof ResolveEnd) {
167
- _this.dispatchRouterDataResolved(event);
168
- }
169
- else if (event instanceof NavigationCancel) {
170
- _this.dispatchRouterCancel(event);
171
- _this.reset();
172
- }
173
- else if (event instanceof NavigationError) {
174
- _this.dispatchRouterError(event);
175
- _this.reset();
176
- }
177
- else if (event instanceof NavigationEnd) {
178
- _this.navigationEnd();
179
- _this.reset();
180
- }
181
- }));
182
- this._subscription.add(subscription);
183
- };
184
- /**
185
- * @private
186
- * @return {?}
187
- */
188
- RouterState.prototype.navigationStart = /**
189
- * @private
190
- * @return {?}
191
- */
192
- function () {
193
- this._routerState = this._serializer.serialize(this._router.routerState.snapshot);
194
- if (this._trigger !== 'none') {
195
- this._storeState = this._store.selectSnapshot(RouterState_1);
196
- }
197
- };
198
- /**
199
- * @private
200
- * @return {?}
201
- */
202
- RouterState.prototype.navigationEnd = /**
203
- * @private
204
- * @return {?}
205
- */
206
- function () {
207
- if (this.shouldDispatchRouterNavigation()) {
208
- this.dispatchRouterNavigation();
209
- }
210
- };
211
- /**
212
- * @private
213
- * @return {?}
214
- */
215
- RouterState.prototype.shouldDispatchRouterNavigation = /**
216
- * @private
217
- * @return {?}
218
- */
219
- function () {
220
- if (!this._storeState)
221
- return true;
222
- return this._trigger !== 'store';
223
- };
224
- /**
225
- * @private
226
- * @param {?} state
227
- * @return {?}
228
- */
229
- RouterState.prototype.navigateIfNeeded = /**
230
- * @private
231
- * @param {?} state
232
- * @return {?}
233
- */
234
- function (state) {
235
- var _this = this;
236
- /** @type {?} */
237
- var canSkipNavigation = !this._storeState ||
238
- !this._storeState.state ||
239
- !state ||
240
- state.trigger === 'router' ||
241
- this._router.url === this._storeState.state.url;
242
- if (canSkipNavigation) {
243
- return;
244
- }
245
- this._trigger = 'store';
246
- this._ngZone.run((/**
247
- * @return {?}
248
- */
249
- function () {
250
- _this._router.navigateByUrl((/** @type {?} */ ((/** @type {?} */ (_this._storeState)).state)).url);
251
- }));
252
- };
253
- /**
254
- * @private
255
- * @return {?}
256
- */
257
- RouterState.prototype.dispatchRouterNavigation = /**
258
- * @private
259
- * @return {?}
260
- */
261
- function () {
262
- /** @type {?} */
263
- var nextRouterState = this._serializer.serialize(this._lastRoutesRecognized.state);
264
- this.dispatchRouterAction(new RouterNavigation(nextRouterState, new RoutesRecognized(this._lastRoutesRecognized.id, this._lastRoutesRecognized.url, this._lastRoutesRecognized.urlAfterRedirects, nextRouterState), this._trigger));
265
- };
266
- /**
267
- * @private
268
- * @param {?} event
269
- * @return {?}
270
- */
271
- RouterState.prototype.dispatchRouterCancel = /**
272
- * @private
273
- * @param {?} event
274
- * @return {?}
275
- */
276
- function (event) {
277
- this.dispatchRouterAction(new RouterCancel((/** @type {?} */ (this._routerState)), this._storeState, event, this._trigger));
278
- };
279
- /**
280
- * @private
281
- * @param {?} event
282
- * @return {?}
283
- */
284
- RouterState.prototype.dispatchRouterError = /**
285
- * @private
286
- * @param {?} event
287
- * @return {?}
288
- */
289
- function (event) {
290
- this.dispatchRouterAction(new RouterError((/** @type {?} */ (this._routerState)), this._storeState, new NavigationError(event.id, event.url, "" + event), this._trigger));
291
- };
292
- /**
293
- * @private
294
- * @template T
295
- * @param {?} action
296
- * @return {?}
297
- */
298
- RouterState.prototype.dispatchRouterAction = /**
299
- * @private
300
- * @template T
301
- * @param {?} action
302
- * @return {?}
303
- */
304
- function (action) {
305
- this._trigger = 'router';
306
- try {
307
- this._store.dispatch(action);
308
- }
309
- finally {
310
- this._trigger = 'none';
311
- }
312
- };
313
- /**
314
- * @private
315
- * @param {?} event
316
- * @return {?}
317
- */
318
- RouterState.prototype.dispatchRouterDataResolved = /**
319
- * @private
320
- * @param {?} event
321
- * @return {?}
322
- */
323
- function (event) {
324
- /** @type {?} */
325
- var routerState = this._serializer.serialize(event.state);
326
- this.dispatchRouterAction(new RouterDataResolved(routerState, event, this._trigger));
327
- };
328
- /**
329
- * @private
330
- * @return {?}
331
- */
332
- RouterState.prototype.reset = /**
333
- * @private
334
- * @return {?}
335
- */
336
- function () {
337
- this._trigger = 'none';
338
- this._storeState = null;
339
- this._routerState = null;
340
- };
341
- /**
342
- * No sense to mess up the `setUpRouterEventsListener` method as we have
343
- * to perform this check only once and unsubscribe after the first event
344
- * is triggered
345
- */
346
- /**
347
- * No sense to mess up the `setUpRouterEventsListener` method as we have
348
- * to perform this check only once and unsubscribe after the first event
349
- * is triggered
350
- * @private
351
- * @return {?}
352
- */
353
- RouterState.prototype.checkInitialNavigationOnce = /**
354
- * No sense to mess up the `setUpRouterEventsListener` method as we have
355
- * to perform this check only once and unsubscribe after the first event
356
- * is triggered
357
- * @private
358
- * @return {?}
359
- */
360
- function () {
361
- var _this = this;
362
- // Caretaker note: we have still left the `typeof` condition in order to avoid
363
- // creating a breaking change for projects that still use the View Engine.
364
- if ((typeof ngDevMode === 'undefined' || ngDevMode) &&
365
- // Angular is running tests in development mode thus we can be sure that this method will be
366
- // skipped in tests.
367
- isAngularInTestMode()) {
368
- return;
369
- }
370
- /** @type {?} */
371
- var subscription = this._router.events
372
- .pipe(first((/**
373
- * @param {?} event
374
- * @return {?}
375
- */
376
- function (event) { return event instanceof RoutesRecognized; })))
377
- .subscribe((/**
378
- * @param {?} __0
379
- * @return {?}
380
- */
381
- function (_a) {
382
- // `location.pathname` always equals manually entered URL in the address bar
383
- // e.g. `location.pathname === '/foo'`, but the `router` state has been initialized
384
- // with another URL (e.g. used in combination with `NgxsStoragePlugin`), thus the
385
- // `RouterNavigation` action will be dispatched and the user will be redirected to the
386
- // previously saved URL. We want to prevent such behavior, so we perform this check
387
- var url = _a.url;
388
- // `location.pathname` always equals manually entered URL in the address bar
389
- // e.g. `location.pathname === '/foo'`, but the `router` state has been initialized
390
- // with another URL (e.g. used in combination with `NgxsStoragePlugin`), thus the
391
- // `RouterNavigation` action will be dispatched and the user will be redirected to the
392
- // previously saved URL. We want to prevent such behavior, so we perform this check
393
- // `url` is a recognized URL by the Angular's router, while `currentUrl` is an actual URL
394
- // entered in the browser's address bar
395
- // `PathLocationStrategy.prototype.path()` returns a concatenation of
396
- // `PlatformLocation.pathname` and normalized `PlatformLocation.search`.
397
- // `Location.prototype.normalize` strips base href from the URL,
398
- // if `baseHref` (declared in angular.json) for example is `/en`
399
- // and the URL is `/test#anchor` - then `_locationStrategy.path(true)` will return `/en/test#anchor`,
400
- // but `/en/test#anchor` is not known to the Angular's router, so we have to strip `/en`
401
- // from the URL
402
- /** @type {?} */
403
- var currentUrl = _this._location.normalize(_this._locationStrategy.path(true));
404
- /** @type {?} */
405
- var currentUrlTree = _this._urlSerializer.parse(currentUrl);
406
- // We need to serialize the URL because in that example `/test/?redirect=https://google.com/`
407
- // Angular will recognize it as `/test?redirect=https:%2F%2Fwww.google.com%2F`
408
- // so we have to run the `currentUrl` via the `UrlSerializer` that will encode characters
409
- /** @type {?} */
410
- var currentSerializedUrl = _this._urlSerializer.serialize(currentUrlTree);
411
- // If URLs differ from each other - we've got to perform a redirect to the manually entered URL
412
- // in the address bar, as it must have a priority
413
- if (currentSerializedUrl !== url) {
414
- _this._router.navigateByUrl(currentUrl);
415
- }
416
- }));
417
- this._subscription.add(subscription);
418
- };
419
- var RouterState_1;
420
- RouterState.ctorParameters = function () { return [
421
- { type: Store },
422
- { type: Router },
423
- { type: RouterStateSerializer },
424
- { type: NgZone },
425
- { type: UrlSerializer },
426
- { type: LocationStrategy },
427
- { type: Location }
428
- ]; };
429
- RouterState.decorators = [
430
- { type: Injectable }
431
- ];
432
- /** @nocollapse */
433
- RouterState.ctorParameters = function () { return [
434
- { type: Store },
435
- { type: Router },
436
- { type: RouterStateSerializer },
437
- { type: NgZone },
438
- { type: UrlSerializer },
439
- { type: LocationStrategy },
440
- { type: Location }
441
- ]; };
442
- tslib_1.__decorate([
443
- Action(Navigate),
444
- tslib_1.__metadata("design:type", Function),
445
- tslib_1.__metadata("design:paramtypes", [Object, Navigate]),
446
- tslib_1.__metadata("design:returntype", void 0)
447
- ], RouterState.prototype, "navigate", null);
448
- tslib_1.__decorate([
449
- Action([RouterNavigation, RouterError, RouterCancel, RouterDataResolved]),
450
- tslib_1.__metadata("design:type", Function),
451
- tslib_1.__metadata("design:paramtypes", [Object, Object]),
452
- tslib_1.__metadata("design:returntype", void 0)
453
- ], RouterState.prototype, "angularRouterAction", null);
454
- tslib_1.__decorate([
455
- Selector(),
456
- tslib_1.__metadata("design:type", Function),
457
- tslib_1.__metadata("design:paramtypes", [Object]),
458
- tslib_1.__metadata("design:returntype", void 0)
459
- ], RouterState, "state", null);
460
- tslib_1.__decorate([
461
- Selector(),
462
- tslib_1.__metadata("design:type", Function),
463
- tslib_1.__metadata("design:paramtypes", [Object]),
464
- tslib_1.__metadata("design:returntype", Object)
465
- ], RouterState, "url", null);
466
- RouterState = RouterState_1 = tslib_1.__decorate([
467
- State({
468
- name: 'router',
469
- defaults: {
470
- state: undefined,
471
- navigationId: undefined,
472
- trigger: 'none'
473
- }
474
- }),
475
- tslib_1.__metadata("design:paramtypes", [Store,
476
- Router,
477
- RouterStateSerializer,
478
- NgZone,
479
- UrlSerializer,
480
- LocationStrategy,
481
- Location])
482
- ], RouterState);
483
- return RouterState;
484
- }());
485
- export { RouterState };
486
- if (false) {
487
- /**
488
- * Determines how navigation was performed by the `RouterState` itself
489
- * or outside via `new Navigate(...)`
490
- * @type {?}
491
- * @private
492
- */
493
- RouterState.prototype._trigger;
494
- /**
495
- * That's the serialized state from the `Router` class
496
- * @type {?}
497
- * @private
498
- */
499
- RouterState.prototype._routerState;
500
- /**
501
- * That's the value of the `RouterState` state
502
- * @type {?}
503
- * @private
504
- */
505
- RouterState.prototype._storeState;
506
- /**
507
- * @type {?}
508
- * @private
509
- */
510
- RouterState.prototype._lastRoutesRecognized;
511
- /**
512
- * @type {?}
513
- * @private
514
- */
515
- RouterState.prototype._subscription;
516
- /**
517
- * @type {?}
518
- * @private
519
- */
520
- RouterState.prototype._store;
521
- /**
522
- * @type {?}
523
- * @private
524
- */
525
- RouterState.prototype._router;
526
- /**
527
- * @type {?}
528
- * @private
529
- */
530
- RouterState.prototype._serializer;
531
- /**
532
- * @type {?}
533
- * @private
534
- */
535
- RouterState.prototype._ngZone;
536
- /**
537
- * @type {?}
538
- * @private
539
- */
540
- RouterState.prototype._urlSerializer;
541
- /**
542
- * @type {?}
543
- * @private
544
- */
545
- RouterState.prototype._locationStrategy;
546
- /**
547
- * @type {?}
548
- * @private
549
- */
550
- RouterState.prototype._location;
551
- }
552
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLnN0YXRlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5neHMvcm91dGVyLXBsdWdpbi8iLCJzb3VyY2VzIjpbInNyYy9yb3V0ZXIuc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsTUFBTSxFQUNOLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLGFBQWEsRUFDYixlQUFlLEVBQ2YsYUFBYSxFQUNkLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZDLE9BQU8sRUFDTCxRQUFRLEVBRVIsWUFBWSxFQUNaLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ25CLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sY0FBYyxDQUFDOzs7OztBQUVyRCxzQ0FJQzs7O0lBSEMsaUNBQVU7O0lBQ1Ysd0NBQXNCOztJQUN0QixtQ0FBdUI7OztJQW1EdkIscUJBQ1UsTUFBYSxFQUNiLE9BQWUsRUFDZixXQUF1RCxFQUN2RCxPQUFlLEVBQ2YsY0FBNkIsRUFDN0IsaUJBQW1DLEVBQ25DLFNBQW1CO1FBTm5CLFdBQU0sR0FBTixNQUFNLENBQU87UUFDYixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsZ0JBQVcsR0FBWCxXQUFXLENBQTRDO1FBQ3ZELFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUM3QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBQ25DLGNBQVMsR0FBVCxTQUFTLENBQVU7Ozs7O1FBakNyQixhQUFRLEdBQWtCLE1BQU0sQ0FBQzs7OztRQUtqQyxpQkFBWSxHQUErQixJQUFJLENBQUM7Ozs7UUFLaEQsZ0JBQVcsR0FBNEIsSUFBSSxDQUFDO1FBRTVDLDBCQUFxQixHQUFxQixtQkFBQSxJQUFJLEVBQUMsQ0FBQztRQUVoRCxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFxQnpDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO0lBQ3BDLENBQUM7b0JBM0NVLFdBQVc7Ozs7OztJQXNCZixpQkFBSzs7Ozs7SUFBWixVQUFzQyxLQUEwQjtRQUM5RCxPQUFPLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQzlCLENBQUM7Ozs7O0lBR00sZUFBRzs7OztJQUFWLFVBQVcsS0FBdUI7UUFDaEMsT0FBTyxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztJQUNqRCxDQUFDOzs7O0lBZ0JELGlDQUFXOzs7SUFBWDtRQUNFLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbkMsQ0FBQzs7Ozs7O0lBR0QsOEJBQVE7Ozs7O0lBQVIsVUFBUyxDQUFpQyxFQUFFLE1BQWdCO1FBRDVELGlCQVFDO1FBTkMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUc7OztRQUFDO1lBQ3RCLE9BQUEsS0FBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUkscUJBQy9CLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxJQUM1QixNQUFNLENBQUMsTUFBTSxFQUNoQjtRQUhGLENBR0UsRUFDSCxDQUFDO0lBQ0osQ0FBQzs7Ozs7O0lBR0QseUNBQW1COzs7OztJQUFuQixVQUNFLEdBQW1DLEVBQ25DLE1BQTJEO1FBRTNELEdBQUcsQ0FBQyxRQUFRLHNCQUNQLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFDakIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQ3ZCLEtBQUssRUFBRSxNQUFNLENBQUMsV0FBVyxFQUN6QixZQUFZLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQzdCLENBQUM7SUFDTCxDQUFDOzs7OztJQUVPLHdDQUFrQjs7OztJQUExQjtRQUFBLGlCQVFDOztZQVBPLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTTthQUM3QixNQUFNLENBQUMsYUFBVyxDQUFDO2FBQ25CLFNBQVM7Ozs7UUFBQyxVQUFDLEtBQW1DO1lBQzdDLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixDQUFDLEVBQUM7UUFFSixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN2QyxDQUFDOzs7OztJQUVPLCtDQUF5Qjs7OztJQUFqQztRQUFBLGlCQXFCQzs7WUFwQk8sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVM7Ozs7UUFBQyxVQUFBLEtBQUs7WUFDdEQsSUFBSSxLQUFLLFlBQVksZUFBZSxFQUFFO2dCQUNwQyxLQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7YUFDeEI7aUJBQU0sSUFBSSxLQUFLLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQzVDLEtBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7YUFDcEM7aUJBQU0sSUFBSSxLQUFLLFlBQVksVUFBVSxFQUFFO2dCQUN0QyxLQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDeEM7aUJBQU0sSUFBSSxLQUFLLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQzVDLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDakMsS0FBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ2Q7aUJBQU0sSUFBSSxLQUFLLFlBQVksZUFBZSxFQUFFO2dCQUMzQyxLQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hDLEtBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNkO2lCQUFNLElBQUksS0FBSyxZQUFZLGFBQWEsRUFBRTtnQkFDekMsS0FBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNyQixLQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDZDtRQUNILENBQUMsRUFBQztRQUVGLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Ozs7O0lBRU8scUNBQWU7Ozs7SUFBdkI7UUFDRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWxGLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxNQUFNLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxhQUFXLENBQUMsQ0FBQztTQUM1RDtJQUNILENBQUM7Ozs7O0lBRU8sbUNBQWE7Ozs7SUFBckI7UUFDRSxJQUFJLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxFQUFFO1lBQ3pDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQzs7Ozs7SUFFTyxvREFBOEI7Ozs7SUFBdEM7UUFDRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNuQyxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDO0lBQ25DLENBQUM7Ozs7OztJQUVPLHNDQUFnQjs7Ozs7SUFBeEIsVUFBeUIsS0FBbUM7UUFBNUQsaUJBZ0JDOztZQWZPLGlCQUFpQixHQUNyQixDQUFDLElBQUksQ0FBQyxXQUFXO1lBQ2pCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLO1lBQ3ZCLENBQUMsS0FBSztZQUNOLEtBQUssQ0FBQyxPQUFPLEtBQUssUUFBUTtZQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHO1FBRWpELElBQUksaUJBQWlCLEVBQUU7WUFDckIsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHOzs7UUFBQztZQUNmLEtBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLG1CQUFBLG1CQUFBLEtBQUksQ0FBQyxXQUFXLEVBQUMsQ0FBQyxLQUFLLEVBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzRCxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7O0lBRU8sOENBQXdCOzs7O0lBQWhDOztZQUNRLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDO1FBRXBGLElBQUksQ0FBQyxvQkFBb0IsQ0FDdkIsSUFBSSxnQkFBZ0IsQ0FDbEIsZUFBZSxFQUNmLElBQUksZ0JBQWdCLENBQ2xCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLEVBQzdCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLEVBQzlCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsRUFDNUMsZUFBZSxDQUNoQixFQUNELElBQUksQ0FBQyxRQUFRLENBQ2QsQ0FDRixDQUFDO0lBQ0osQ0FBQzs7Ozs7O0lBRU8sMENBQW9COzs7OztJQUE1QixVQUE2QixLQUF1QjtRQUNsRCxJQUFJLENBQUMsb0JBQW9CLENBQ3ZCLElBQUksWUFBWSxDQUFDLG1CQUFBLElBQUksQ0FBQyxZQUFZLEVBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQzdFLENBQUM7SUFDSixDQUFDOzs7Ozs7SUFFTyx5Q0FBbUI7Ozs7O0lBQTNCLFVBQTRCLEtBQXNCO1FBQ2hELElBQUksQ0FBQyxvQkFBb0IsQ0FDdkIsSUFBSSxXQUFXLENBQ2IsbUJBQUEsSUFBSSxDQUFDLFlBQVksRUFBQyxFQUNsQixJQUFJLENBQUMsV0FBVyxFQUNoQixJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBRyxLQUFPLENBQUMsRUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FDZCxDQUNGLENBQUM7SUFDSixDQUFDOzs7Ozs7O0lBRU8sMENBQW9COzs7Ozs7SUFBNUIsVUFBZ0MsTUFBdUI7UUFDckQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFFekIsSUFBSTtZQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzlCO2dCQUFTO1lBQ1IsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7U0FDeEI7SUFDSCxDQUFDOzs7Ozs7SUFFTyxnREFBMEI7Ozs7O0lBQWxDLFVBQW1DLEtBQWlCOztZQUM1QyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUMzRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7Ozs7O0lBRU8sMkJBQUs7Ozs7SUFBYjtRQUNFLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7OztPQUlHOzs7Ozs7OztJQUNLLGdEQUEwQjs7Ozs7OztJQUFsQztRQUFBLGlCQThDQztRQTdDQyw4RUFBOEU7UUFDOUUsMEVBQTBFO1FBQzFFLElBQ0UsQ0FBQyxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksU0FBUyxDQUFDO1lBQy9DLDRGQUE0RjtZQUM1RixvQkFBb0I7WUFDcEIsbUJBQW1CLEVBQUUsRUFDckI7WUFDQSxPQUFPO1NBQ1I7O1lBRUssWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTthQUNyQyxJQUFJLENBQUMsS0FBSzs7OztRQUFDLFVBQUMsS0FBSyxJQUFnQyxPQUFBLEtBQUssWUFBWSxnQkFBZ0IsRUFBakMsQ0FBaUMsRUFBQyxDQUFDO2FBQ3BGLFNBQVM7Ozs7UUFBQyxVQUFDLEVBQU87WUFDakIsNEVBQTRFO1lBQzVFLG1GQUFtRjtZQUNuRixpRkFBaUY7WUFDakYsc0ZBQXNGO1lBQ3RGLG1GQUFtRjtnQkFMdkUsWUFBRzs7Ozs7Ozs7Ozs7Ozs7OztnQkFpQlQsVUFBVSxHQUFHLEtBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7O2dCQUN4RSxjQUFjLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDOzs7OztnQkFJdEQsb0JBQW9CLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDO1lBRTFFLCtGQUErRjtZQUMvRixpREFBaUQ7WUFDakQsSUFBSSxvQkFBb0IsS0FBSyxHQUFHLEVBQUU7Z0JBQ2hDLEtBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3hDO1FBQ0gsQ0FBQyxFQUFDO1FBRUosSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdkMsQ0FBQzs7O2dCQXhOaUIsS0FBSztnQkFDSixNQUFNO2dCQUNGLHFCQUFxQjtnQkFDekIsTUFBTTtnQkFDQyxhQUFhO2dCQUNWLGdCQUFnQjtnQkFDeEIsUUFBUTs7O2dCQXZDOUIsVUFBVTs7OztnQkFyQ3FDLEtBQUs7Z0JBVG5ELE1BQU07Z0JBc0JDLHFCQUFxQjtnQkExQnJCLE1BQU07Z0JBUWIsYUFBYTtnQkFJTixnQkFBZ0I7Z0JBQUUsUUFBUTs7SUF5RmpDO1FBREMsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7eURBQ21DLFFBQVE7OytDQU8zRDtJQUdEO1FBREMsTUFBTSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDOzs7OzBEQVd6RTtJQWhERDtRQURDLFFBQVEsRUFBRTs7OztrQ0FHVjtJQUdEO1FBREMsUUFBUSxFQUFFOzs7O2dDQUdWO0lBN0JVLFdBQVc7UUFUdkIsS0FBSyxDQUFtQjtZQUN2QixJQUFJLEVBQUUsUUFBUTtZQUNkLFFBQVEsRUFBRTtnQkFDUixLQUFLLEVBQUUsU0FBUztnQkFDaEIsWUFBWSxFQUFFLFNBQVM7Z0JBQ3ZCLE9BQU8sRUFBRSxNQUFNO2FBQ2hCO1NBQ0YsQ0FBQztpREFrQ2tCLEtBQUs7WUFDSixNQUFNO1lBQ0YscUJBQXFCO1lBQ3pCLE1BQU07WUFDQyxhQUFhO1lBQ1YsZ0JBQWdCO1lBQ3hCLFFBQVE7T0F0Q2xCLFdBQVcsQ0F5UHZCO0lBQUQsa0JBQUM7Q0FBQSxJQUFBO1NBelBZLFdBQVc7Ozs7Ozs7O0lBS3RCLCtCQUF5Qzs7Ozs7O0lBS3pDLG1DQUF3RDs7Ozs7O0lBS3hELGtDQUFvRDs7Ozs7SUFFcEQsNENBQXdEOzs7OztJQUV4RCxvQ0FBMkM7Ozs7O0lBYXpDLDZCQUFxQjs7Ozs7SUFDckIsOEJBQXVCOzs7OztJQUN2QixrQ0FBK0Q7Ozs7O0lBQy9ELDhCQUF1Qjs7Ozs7SUFDdkIscUNBQXFDOzs7OztJQUNyQyx3Q0FBMkM7Ozs7O0lBQzNDLGdDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nWm9uZSwgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBOYXZpZ2F0aW9uQ2FuY2VsLFxuICBOYXZpZ2F0aW9uRXJyb3IsXG4gIFJvdXRlcixcbiAgUm91dGVyU3RhdGVTbmFwc2hvdCxcbiAgUm91dGVzUmVjb2duaXplZCxcbiAgUmVzb2x2ZUVuZCxcbiAgVXJsU2VyaWFsaXplcixcbiAgTmF2aWdhdGlvblN0YXJ0LFxuICBOYXZpZ2F0aW9uRW5kXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBMb2NhdGlvblN0cmF0ZWd5LCBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBY3Rpb24sIFNlbGVjdG9yLCBTdGF0ZSwgU3RhdGVDb250ZXh0LCBTdG9yZSB9IGZyb20gJ0BuZ3hzL3N0b3JlJztcbmltcG9ydCB7IGlzQW5ndWxhckluVGVzdE1vZGUgfSBmcm9tICdAbmd4cy9zdG9yZS9pbnRlcm5hbHMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgTmF2aWdhdGUsXG4gIFJvdXRlckFjdGlvbixcbiAgUm91dGVyQ2FuY2VsLFxuICBSb3V0ZXJFcnJvcixcbiAgUm91dGVyTmF2aWdhdGlvbixcbiAgUm91dGVyRGF0YVJlc29sdmVkXG59IGZyb20gJy4vcm91dGVyLmFjdGlvbnMnO1xuaW1wb3J0IHsgUm91dGVyU3RhdGVTZXJpYWxpemVyIH0gZnJvbSAnLi9zZXJpYWxpemVyJztcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZXJTdGF0ZU1vZGVsPFQgPSBSb3V0ZXJTdGF0ZVNuYXBzaG90PiB7XG4gIHN0YXRlPzogVDtcbiAgbmF2aWdhdGlvbklkPzogbnVtYmVyO1xuICB0cmlnZ2VyOiBSb3V0ZXJUcmlnZ2VyO1xufVxuXG5leHBvcnQgdHlwZSBSb3V0ZXJUcmlnZ2VyID0gJ25vbmUnIHwgJ3JvdXRlcicgfCAnc3RvcmUnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBXaWxsIGJlIHByb3ZpZGVkIHRocm91Z2ggVGVyc2VyIGdsb2JhbCBkZWZpbml0aW9ucyBieSBBbmd1bGFyIENMSVxuICogZHVyaW5nIHRoZSBwcm9kdWN0aW9uIGJ1aWxkLiBUaGlzIGlzIGhvdyBBbmd1bGFyIGRvZXMgdHJlZS1zaGFraW5nIGludGVybmFsbHkuXG4gKi9cbmRlY2xhcmUgY29uc3QgbmdEZXZNb2RlOiBib29sZWFuO1xuXG5AU3RhdGU8Um91dGVyU3RhdGVNb2RlbD4oe1xuICBuYW1lOiAncm91dGVyJyxcbiAgZGVmYXVsdHM6IHtcbiAgICBzdGF0ZTogdW5kZWZpbmVkLFxuICAgIG5hdmlnYXRpb25JZDogdW5kZWZpbmVkLFxuICAgIHRyaWdnZXI6ICdub25lJ1xuICB9XG59KVxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJvdXRlclN0YXRlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIERldGVybWluZXMgaG93IG5hdmlnYXRpb24gd2FzIHBlcmZvcm1lZCBieSB0aGUgYFJvdXRlclN0YXRlYCBpdHNlbGZcbiAgICogb3Igb3V0c2lkZSB2aWEgYG5ldyBOYXZpZ2F0ZSguLi4pYFxuICAgKi9cbiAgcHJpdmF0ZSBfdHJpZ2dlcjogUm91dGVyVHJpZ2dlciA9ICdub25lJztcblxuICAvKipcbiAgICogVGhhdCdzIHRoZSBzZXJpYWxpemVkIHN0YXRlIGZyb20gdGhlIGBSb3V0ZXJgIGNsYXNzXG4gICAqL1xuICBwcml2YXRlIF9yb3V0ZXJTdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGF0J3MgdGhlIHZhbHVlIG9mIHRoZSBgUm91dGVyU3RhdGVgIHN0YXRlXG4gICAqL1xuICBwcml2YXRlIF9zdG9yZVN0YXRlOiBSb3V0ZXJTdGF0ZU1vZGVsIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBfbGFzdFJvdXRlc1JlY29nbml6ZWQ6IFJvdXRlc1JlY29nbml6ZWQgPSBudWxsITtcblxuICBwcml2YXRlIF9zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgQFNlbGVjdG9yKClcbiAgc3RhdGljIHN0YXRlPFQgPSBSb3V0ZXJTdGF0ZVNuYXBzaG90PihzdGF0ZTogUm91dGVyU3RhdGVNb2RlbDxUPikge1xuICAgIHJldHVybiBzdGF0ZSAmJiBzdGF0ZS5zdGF0ZTtcbiAgfVxuXG4gIEBTZWxlY3RvcigpXG4gIHN0YXRpYyB1cmwoc3RhdGU6IFJvdXRlclN0YXRlTW9kZWwpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBzdGF0ZSAmJiBzdGF0ZS5zdGF0ZSAmJiBzdGF0ZS5zdGF0ZS51cmw7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9zdG9yZTogU3RvcmUsXG4gICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBfc2VyaWFsaXplcjogUm91dGVyU3RhdGVTZXJpYWxpemVyPFJvdXRlclN0YXRlU25hcHNob3Q+LFxuICAgIHByaXZhdGUgX25nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgX3VybFNlcmlhbGl6ZXI6IFVybFNlcmlhbGl6ZXIsXG4gICAgcHJpdmF0ZSBfbG9jYXRpb25TdHJhdGVneTogTG9jYXRpb25TdHJhdGVneSxcbiAgICBwcml2YXRlIF9sb2NhdGlvbjogTG9jYXRpb25cbiAgKSB7XG4gICAgdGhpcy5zZXRVcFN0b3JlTGlzdGVuZXIoKTtcbiAgICB0aGlzLnNldFVwUm91dGVyRXZlbnRzTGlzdGVuZXIoKTtcbiAgICB0aGlzLmNoZWNrSW5pdGlhbE5hdmlnYXRpb25PbmNlKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIEBBY3Rpb24oTmF2aWdhdGUpXG4gIG5hdmlnYXRlKF86IFN0YXRlQ29udGV4dDxSb3V0ZXJTdGF0ZU1vZGVsPiwgYWN0aW9uOiBOYXZpZ2F0ZSkge1xuICAgIHJldHVybiB0aGlzLl9uZ1pvbmUucnVuKCgpID0+XG4gICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoYWN0aW9uLnBhdGgsIHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IGFjdGlvbi5xdWVyeVBhcmFtcyxcbiAgICAgICAgLi4uYWN0aW9uLmV4dHJhc1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgQEFjdGlvbihbUm91dGVyTmF2aWdhdGlvbiwgUm91dGVyRXJyb3IsIFJvdXRlckNhbmNlbCwgUm91dGVyRGF0YVJlc29sdmVkXSlcbiAgYW5ndWxhclJvdXRlckFjdGlvbihcbiAgICBjdHg6IFN0YXRlQ29udGV4dDxSb3V0ZXJTdGF0ZU1vZGVsPixcbiAgICBhY3Rpb246IFJvdXRlckFjdGlvbjxSb3V0ZXJTdGF0ZU1vZGVsLCBSb3V0ZXJTdGF0ZVNuYXBzaG90PlxuICApOiB2b2lkIHtcbiAgICBjdHguc2V0U3RhdGUoe1xuICAgICAgLi4uY3R4LmdldFN0YXRlKCksXG4gICAgICB0cmlnZ2VyOiBhY3Rpb24udHJpZ2dlcixcbiAgICAgIHN0YXRlOiBhY3Rpb24ucm91dGVyU3RhdGUsXG4gICAgICBuYXZpZ2F0aW9uSWQ6IGFjdGlvbi5ldmVudC5pZFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRVcFN0b3JlTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5fc3RvcmVcbiAgICAgIC5zZWxlY3QoUm91dGVyU3RhdGUpXG4gICAgICAuc3Vic2NyaWJlKChzdGF0ZTogUm91dGVyU3RhdGVNb2RlbCB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICB0aGlzLm5hdmlnYXRlSWZOZWVkZWQoc3RhdGUpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHN1YnNjcmlwdGlvbik7XG4gIH1cblxuICBwcml2YXRlIHNldFVwUm91dGVyRXZlbnRzTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5fcm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvblN0YXJ0KCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgUm91dGVzUmVjb2duaXplZCkge1xuICAgICAgICB0aGlzLl9sYXN0Um91dGVzUmVjb2duaXplZCA9IGV2ZW50O1xuICAgICAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFJlc29sdmVFbmQpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaFJvdXRlckRhdGFSZXNvbHZlZChldmVudCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkNhbmNlbCkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoUm91dGVyQ2FuY2VsKGV2ZW50KTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FcnJvcikge1xuICAgICAgICB0aGlzLmRpc3BhdGNoUm91dGVyRXJyb3IoZXZlbnQpO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25FbmQoKTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChzdWJzY3JpcHRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uU3RhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5fcm91dGVyU3RhdGUgPSB0aGlzLl9zZXJpYWxpemVyLnNlcmlhbGl6ZSh0aGlzLl9yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QpO1xuXG4gICAgaWYgKHRoaXMuX3RyaWdnZXIgIT09ICdub25lJykge1xuICAgICAgdGhpcy5fc3RvcmVTdGF0ZSA9IHRoaXMuX3N0b3JlLnNlbGVjdFNuYXBzaG90KFJvdXRlclN0YXRlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5hdmlnYXRpb25FbmQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2hvdWxkRGlzcGF0Y2hSb3V0ZXJOYXZpZ2F0aW9uKCkpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hSb3V0ZXJOYXZpZ2F0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGREaXNwYXRjaFJvdXRlck5hdmlnYXRpb24oKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9zdG9yZVN0YXRlKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5fdHJpZ2dlciAhPT0gJ3N0b3JlJztcbiAgfVxuXG4gIHByaXZhdGUgbmF2aWdhdGVJZk5lZWRlZChzdGF0ZTogUm91dGVyU3RhdGVNb2RlbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGNvbnN0IGNhblNraXBOYXZpZ2F0aW9uID1cbiAgICAgICF0aGlzLl9zdG9yZVN0YXRlIHx8XG4gICAgICAhdGhpcy5fc3RvcmVTdGF0ZS5zdGF0ZSB8fFxuICAgICAgIXN0YXRlIHx8XG4gICAgICBzdGF0ZS50cmlnZ2VyID09PSAncm91dGVyJyB8fFxuICAgICAgdGhpcy5fcm91dGVyLnVybCA9PT0gdGhpcy5fc3RvcmVTdGF0ZS5zdGF0ZS51cmw7XG5cbiAgICBpZiAoY2FuU2tpcE5hdmlnYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl90cmlnZ2VyID0gJ3N0b3JlJztcbiAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMuX3N0b3JlU3RhdGUhLnN0YXRlIS51cmwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaFJvdXRlck5hdmlnYXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dFJvdXRlclN0YXRlID0gdGhpcy5fc2VyaWFsaXplci5zZXJpYWxpemUodGhpcy5fbGFzdFJvdXRlc1JlY29nbml6ZWQuc3RhdGUpO1xuXG4gICAgdGhpcy5kaXNwYXRjaFJvdXRlckFjdGlvbihcbiAgICAgIG5ldyBSb3V0ZXJOYXZpZ2F0aW9uKFxuICAgICAgICBuZXh0Um91dGVyU3RhdGUsXG4gICAgICAgIG5ldyBSb3V0ZXNSZWNvZ25pemVkKFxuICAgICAgICAgIHRoaXMuX2xhc3RSb3V0ZXNSZWNvZ25pemVkLmlkLFxuICAgICAgICAgIHRoaXMuX2xhc3RSb3V0ZXNSZWNvZ25pemVkLnVybCxcbiAgICAgICAgICB0aGlzLl9sYXN0Um91dGVzUmVjb2duaXplZC51cmxBZnRlclJlZGlyZWN0cyxcbiAgICAgICAgICBuZXh0Um91dGVyU3RhdGVcbiAgICAgICAgKSxcbiAgICAgICAgdGhpcy5fdHJpZ2dlclxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGRpc3BhdGNoUm91dGVyQ2FuY2VsKGV2ZW50OiBOYXZpZ2F0aW9uQ2FuY2VsKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaFJvdXRlckFjdGlvbihcbiAgICAgIG5ldyBSb3V0ZXJDYW5jZWwodGhpcy5fcm91dGVyU3RhdGUhLCB0aGlzLl9zdG9yZVN0YXRlLCBldmVudCwgdGhpcy5fdHJpZ2dlcilcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaFJvdXRlckVycm9yKGV2ZW50OiBOYXZpZ2F0aW9uRXJyb3IpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoUm91dGVyQWN0aW9uKFxuICAgICAgbmV3IFJvdXRlckVycm9yKFxuICAgICAgICB0aGlzLl9yb3V0ZXJTdGF0ZSEsXG4gICAgICAgIHRoaXMuX3N0b3JlU3RhdGUsXG4gICAgICAgIG5ldyBOYXZpZ2F0aW9uRXJyb3IoZXZlbnQuaWQsIGV2ZW50LnVybCwgYCR7ZXZlbnR9YCksXG4gICAgICAgIHRoaXMuX3RyaWdnZXJcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaFJvdXRlckFjdGlvbjxUPihhY3Rpb246IFJvdXRlckFjdGlvbjxUPik6IHZvaWQge1xuICAgIHRoaXMuX3RyaWdnZXIgPSAncm91dGVyJztcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaChhY3Rpb24pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl90cmlnZ2VyID0gJ25vbmUnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGlzcGF0Y2hSb3V0ZXJEYXRhUmVzb2x2ZWQoZXZlbnQ6IFJlc29sdmVFbmQpOiB2b2lkIHtcbiAgICBjb25zdCByb3V0ZXJTdGF0ZSA9IHRoaXMuX3NlcmlhbGl6ZXIuc2VyaWFsaXplKGV2ZW50LnN0YXRlKTtcbiAgICB0aGlzLmRpc3BhdGNoUm91dGVyQWN0aW9uKG5ldyBSb3V0ZXJEYXRhUmVzb2x2ZWQocm91dGVyU3RhdGUsIGV2ZW50LCB0aGlzLl90cmlnZ2VyKSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3RyaWdnZXIgPSAnbm9uZSc7XG4gICAgdGhpcy5fc3RvcmVTdGF0ZSA9IG51bGw7XG4gICAgdGhpcy5fcm91dGVyU3RhdGUgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vIHNlbnNlIHRvIG1lc3MgdXAgdGhlIGBzZXRVcFJvdXRlckV2ZW50c0xpc3RlbmVyYCBtZXRob2QgYXMgd2UgaGF2ZVxuICAgKiB0byBwZXJmb3JtIHRoaXMgY2hlY2sgb25seSBvbmNlIGFuZCB1bnN1YnNjcmliZSBhZnRlciB0aGUgZmlyc3QgZXZlbnRcbiAgICogaXMgdHJpZ2dlcmVkXG4gICAqL1xuICBwcml2YXRlIGNoZWNrSW5pdGlhbE5hdmlnYXRpb25PbmNlKCk6IHZvaWQge1xuICAgIC8vIENhcmV0YWtlciBub3RlOiB3ZSBoYXZlIHN0aWxsIGxlZnQgdGhlIGB0eXBlb2ZgIGNvbmRpdGlvbiBpbiBvcmRlciB0byBhdm9pZFxuICAgIC8vIGNyZWF0aW5nIGEgYnJlYWtpbmcgY2hhbmdlIGZvciBwcm9qZWN0cyB0aGF0IHN0aWxsIHVzZSB0aGUgVmlldyBFbmdpbmUuXG4gICAgaWYgKFxuICAgICAgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkgJiZcbiAgICAgIC8vIEFuZ3VsYXIgaXMgcnVubmluZyB0ZXN0cyBpbiBkZXZlbG9wbWVudCBtb2RlIHRodXMgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGlzIG1ldGhvZCB3aWxsIGJlXG4gICAgICAvLyBza2lwcGVkIGluIHRlc3RzLlxuICAgICAgaXNBbmd1bGFySW5UZXN0TW9kZSgpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5fcm91dGVyLmV2ZW50c1xuICAgICAgLnBpcGUoZmlyc3QoKGV2ZW50KTogZXZlbnQgaXMgUm91dGVzUmVjb2duaXplZCA9PiBldmVudCBpbnN0YW5jZW9mIFJvdXRlc1JlY29nbml6ZWQpKVxuICAgICAgLnN1YnNjcmliZSgoeyB1cmwgfSkgPT4ge1xuICAgICAgICAvLyBgbG9jYXRpb24ucGF0aG5hbWVgIGFsd2F5cyBlcXVhbHMgbWFudWFsbHkgZW50ZXJlZCBVUkwgaW4gdGhlIGFkZHJlc3MgYmFyXG4gICAgICAgIC8vIGUuZy4gYGxvY2F0aW9uLnBhdGhuYW1lID09PSAnL2ZvbydgLCBidXQgdGhlIGByb3V0ZXJgIHN0YXRlIGhhcyBiZWVuIGluaXRpYWxpemVkXG4gICAgICAgIC8vIHdpdGggYW5vdGhlciBVUkwgKGUuZy4gdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIGBOZ3hzU3RvcmFnZVBsdWdpbmApLCB0aHVzIHRoZVxuICAgICAgICAvLyBgUm91dGVyTmF2aWdhdGlvbmAgYWN0aW9uIHdpbGwgYmUgZGlzcGF0Y2hlZCBhbmQgdGhlIHVzZXIgd2lsbCBiZSByZWRpcmVjdGVkIHRvIHRoZVxuICAgICAgICAvLyBwcmV2aW91c2x5IHNhdmVkIFVSTC4gV2Ugd2FudCB0byBwcmV2ZW50IHN1Y2ggYmVoYXZpb3IsIHNvIHdlIHBlcmZvcm0gdGhpcyBjaGVja1xuXG4gICAgICAgIC8vIGB1cmxgIGlzIGEgcmVjb2duaXplZCBVUkwgYnkgdGhlIEFuZ3VsYXIncyByb3V0ZXIsIHdoaWxlIGBjdXJyZW50VXJsYCBpcyBhbiBhY3R1YWwgVVJMXG4gICAgICAgIC8vIGVudGVyZWQgaW4gdGhlIGJyb3dzZXIncyBhZGRyZXNzIGJhclxuICAgICAgICAvLyBgUGF0aExvY2F0aW9uU3RyYXRlZ3kucHJvdG90eXBlLnBhdGgoKWAgcmV0dXJucyBhIGNvbmNhdGVuYXRpb24gb2ZcbiAgICAgICAgLy8gYFBsYXRmb3JtTG9jYXRpb24ucGF0aG5hbWVgIGFuZCBub3JtYWxpemVkIGBQbGF0Zm9ybUxvY2F0aW9uLnNlYXJjaGAuXG5cbiAgICAgICAgLy8gYExvY2F0aW9uLnByb3RvdHlwZS5ub3JtYWxpemVgIHN0cmlwcyBiYXNlIGhyZWYgZnJvbSB0aGUgVVJMLFxuICAgICAgICAvLyBpZiBgYmFzZUhyZWZgIChkZWNsYXJlZCBpbiBhbmd1bGFyLmpzb24pIGZvciBleGFtcGxlIGlzIGAvZW5gXG4gICAgICAgIC8vIGFuZCB0aGUgVVJMIGlzIGAvdGVzdCNhbmNob3JgIC0gdGhlbiBgX2xvY2F0aW9uU3RyYXRlZ3kucGF0aCh0cnVlKWAgd2lsbCByZXR1cm4gYC9lbi90ZXN0I2FuY2hvcmAsXG4gICAgICAgIC8vIGJ1dCBgL2VuL3Rlc3QjYW5jaG9yYCBpcyBub3Qga25vd24gdG8gdGhlIEFuZ3VsYXIncyByb3V0ZXIsIHNvIHdlIGhhdmUgdG8gc3RyaXAgYC9lbmBcbiAgICAgICAgLy8gZnJvbSB0aGUgVVJMXG4gICAgICAgIGNvbnN0IGN1cnJlbnRVcmwgPSB0aGlzLl9sb2NhdGlvbi5ub3JtYWxpemUodGhpcy5fbG9jYXRpb25TdHJhdGVneS5wYXRoKHRydWUpKTtcbiAgICAgICAgY29uc3QgY3VycmVudFVybFRyZWUgPSB0aGlzLl91cmxTZXJpYWxpemVyLnBhcnNlKGN1cnJlbnRVcmwpO1xuICAgICAgICAvLyBXZSBuZWVkIHRvIHNlcmlhbGl6ZSB0aGUgVVJMIGJlY2F1c2UgaW4gdGhhdCBleGFtcGxlIGAvdGVzdC8/cmVkaXJlY3Q9aHR0cHM6Ly9nb29nbGUuY29tL2BcbiAgICAgICAgLy8gQW5ndWxhciB3aWxsIHJlY29nbml6ZSBpdCBhcyBgL3Rlc3Q/cmVkaXJlY3Q9aHR0cHM6JTJGJTJGd3d3Lmdvb2dsZS5jb20lMkZgXG4gICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gcnVuIHRoZSBgY3VycmVudFVybGAgdmlhIHRoZSBgVXJsU2VyaWFsaXplcmAgdGhhdCB3aWxsIGVuY29kZSBjaGFyYWN0ZXJzXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZXJpYWxpemVkVXJsID0gdGhpcy5fdXJsU2VyaWFsaXplci5zZXJpYWxpemUoY3VycmVudFVybFRyZWUpO1xuXG4gICAgICAgIC8vIElmIFVSTHMgZGlmZmVyIGZyb20gZWFjaCBvdGhlciAtIHdlJ3ZlIGdvdCB0byBwZXJmb3JtIGEgcmVkaXJlY3QgdG8gdGhlIG1hbnVhbGx5IGVudGVyZWQgVVJMXG4gICAgICAgIC8vIGluIHRoZSBhZGRyZXNzIGJhciwgYXMgaXQgbXVzdCBoYXZlIGEgcHJpb3JpdHlcbiAgICAgICAgaWYgKGN1cnJlbnRTZXJpYWxpemVkVXJsICE9PSB1cmwpIHtcbiAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGVCeVVybChjdXJyZW50VXJsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHN1YnNjcmlwdGlvbik7XG4gIH1cbn1cbiJdfQ==
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import * as tslib_1 from "tslib";
6
+ import { NgZone, Injectable } from '@angular/core';
7
+ import { NavigationCancel, NavigationError, Router, RouterStateSnapshot, RoutesRecognized, ResolveEnd, UrlSerializer, NavigationStart, NavigationEnd } from '@angular/router';
8
+ import { LocationStrategy, Location } from '@angular/common';
9
+ import { Action, Selector, State, StateContext, Store } from '@ngxs/store';
10
+ import { isAngularInTestMode } from '@ngxs/store/internals';
11
+ import { first } from 'rxjs/operators';
12
+ import { Navigate, RouterCancel, RouterError, RouterNavigation, RouterDataResolved } from './router.actions';
13
+ import { RouterStateSerializer } from './serializer';
14
+ /**
15
+ * @record
16
+ * @template T
17
+ */
18
+ export function RouterStateModel() { }
19
+ if (false) {
20
+ /** @type {?|undefined} */
21
+ RouterStateModel.prototype.state;
22
+ /** @type {?|undefined} */
23
+ RouterStateModel.prototype.navigationId;
24
+ /** @type {?} */
25
+ RouterStateModel.prototype.trigger;
26
+ }
27
+ var RouterState = /** @class */ (function () {
28
+ function RouterState(_store, _router, _serializer, _ngZone, _urlSerializer, _locationStrategy, _location) {
29
+ this._store = _store;
30
+ this._router = _router;
31
+ this._serializer = _serializer;
32
+ this._ngZone = _ngZone;
33
+ this._urlSerializer = _urlSerializer;
34
+ this._locationStrategy = _locationStrategy;
35
+ this._location = _location;
36
+ /**
37
+ * Determines how navigation was performed by the `RouterState` itself
38
+ * or outside via `new Navigate(...)`
39
+ */
40
+ this._trigger = 'none';
41
+ /**
42
+ * That's the serialized state from the `Router` class
43
+ */
44
+ this._routerState = null;
45
+ /**
46
+ * That's the value of the `RouterState` state
47
+ */
48
+ this._storeState = null;
49
+ this._lastRoutesRecognized = (/** @type {?} */ (null));
50
+ this.setUpStoreListener();
51
+ this.setUpRouterEventsListener();
52
+ this.checkInitialNavigationOnce();
53
+ }
54
+ RouterState_1 = RouterState;
55
+ /**
56
+ * @template T
57
+ * @param {?} state
58
+ * @return {?}
59
+ */
60
+ RouterState.state = /**
61
+ * @template T
62
+ * @param {?} state
63
+ * @return {?}
64
+ */
65
+ function (state) {
66
+ return state && state.state;
67
+ };
68
+ /**
69
+ * @param {?} state
70
+ * @return {?}
71
+ */
72
+ RouterState.url = /**
73
+ * @param {?} state
74
+ * @return {?}
75
+ */
76
+ function (state) {
77
+ return state && state.state && state.state.url;
78
+ };
79
+ /**
80
+ * @param {?} _
81
+ * @param {?} action
82
+ * @return {?}
83
+ */
84
+ RouterState.prototype.navigate = /**
85
+ * @param {?} _
86
+ * @param {?} action
87
+ * @return {?}
88
+ */
89
+ function (_, action) {
90
+ var _this = this;
91
+ return this._ngZone.run((/**
92
+ * @return {?}
93
+ */
94
+ function () {
95
+ return _this._router.navigate(action.path, tslib_1.__assign({ queryParams: action.queryParams }, action.extras));
96
+ }));
97
+ };
98
+ /**
99
+ * @param {?} ctx
100
+ * @param {?} action
101
+ * @return {?}
102
+ */
103
+ RouterState.prototype.angularRouterAction = /**
104
+ * @param {?} ctx
105
+ * @param {?} action
106
+ * @return {?}
107
+ */
108
+ function (ctx, action) {
109
+ ctx.setState(tslib_1.__assign({}, ctx.getState(), { trigger: action.trigger, state: action.routerState, navigationId: action.event.id }));
110
+ };
111
+ /**
112
+ * @private
113
+ * @return {?}
114
+ */
115
+ RouterState.prototype.setUpStoreListener = /**
116
+ * @private
117
+ * @return {?}
118
+ */
119
+ function () {
120
+ var _this = this;
121
+ this._store.select(RouterState_1).subscribe((/**
122
+ * @param {?} state
123
+ * @return {?}
124
+ */
125
+ function (state) {
126
+ _this.navigateIfNeeded(state);
127
+ }));
128
+ };
129
+ /**
130
+ * @private
131
+ * @return {?}
132
+ */
133
+ RouterState.prototype.setUpRouterEventsListener = /**
134
+ * @private
135
+ * @return {?}
136
+ */
137
+ function () {
138
+ var _this = this;
139
+ this._router.events.subscribe((/**
140
+ * @param {?} event
141
+ * @return {?}
142
+ */
143
+ function (event) {
144
+ if (event instanceof NavigationStart) {
145
+ _this.navigationStart();
146
+ }
147
+ else if (event instanceof RoutesRecognized) {
148
+ _this._lastRoutesRecognized = event;
149
+ }
150
+ else if (event instanceof ResolveEnd) {
151
+ _this.dispatchRouterDataResolved(event);
152
+ }
153
+ else if (event instanceof NavigationCancel) {
154
+ _this.dispatchRouterCancel(event);
155
+ _this.reset();
156
+ }
157
+ else if (event instanceof NavigationError) {
158
+ _this.dispatchRouterError(event);
159
+ _this.reset();
160
+ }
161
+ else if (event instanceof NavigationEnd) {
162
+ _this.navigationEnd();
163
+ _this.reset();
164
+ }
165
+ }));
166
+ };
167
+ /**
168
+ * @private
169
+ * @return {?}
170
+ */
171
+ RouterState.prototype.navigationStart = /**
172
+ * @private
173
+ * @return {?}
174
+ */
175
+ function () {
176
+ this._routerState = this._serializer.serialize(this._router.routerState.snapshot);
177
+ if (this._trigger !== 'none') {
178
+ this._storeState = this._store.selectSnapshot(RouterState_1);
179
+ }
180
+ };
181
+ /**
182
+ * @private
183
+ * @return {?}
184
+ */
185
+ RouterState.prototype.navigationEnd = /**
186
+ * @private
187
+ * @return {?}
188
+ */
189
+ function () {
190
+ if (this.shouldDispatchRouterNavigation()) {
191
+ this.dispatchRouterNavigation();
192
+ }
193
+ };
194
+ /**
195
+ * @private
196
+ * @return {?}
197
+ */
198
+ RouterState.prototype.shouldDispatchRouterNavigation = /**
199
+ * @private
200
+ * @return {?}
201
+ */
202
+ function () {
203
+ if (!this._storeState)
204
+ return true;
205
+ return this._trigger !== 'store';
206
+ };
207
+ /**
208
+ * @private
209
+ * @param {?} state
210
+ * @return {?}
211
+ */
212
+ RouterState.prototype.navigateIfNeeded = /**
213
+ * @private
214
+ * @param {?} state
215
+ * @return {?}
216
+ */
217
+ function (state) {
218
+ var _this = this;
219
+ /** @type {?} */
220
+ var canSkipNavigation = !this._storeState ||
221
+ !this._storeState.state ||
222
+ !state ||
223
+ state.trigger === 'router' ||
224
+ this._router.url === this._storeState.state.url;
225
+ if (canSkipNavigation) {
226
+ return;
227
+ }
228
+ this._trigger = 'store';
229
+ this._ngZone.run((/**
230
+ * @return {?}
231
+ */
232
+ function () {
233
+ _this._router.navigateByUrl((/** @type {?} */ ((/** @type {?} */ (_this._storeState)).state)).url);
234
+ }));
235
+ };
236
+ /**
237
+ * @private
238
+ * @return {?}
239
+ */
240
+ RouterState.prototype.dispatchRouterNavigation = /**
241
+ * @private
242
+ * @return {?}
243
+ */
244
+ function () {
245
+ /** @type {?} */
246
+ var nextRouterState = this._serializer.serialize(this._lastRoutesRecognized.state);
247
+ this.dispatchRouterAction(new RouterNavigation(nextRouterState, new RoutesRecognized(this._lastRoutesRecognized.id, this._lastRoutesRecognized.url, this._lastRoutesRecognized.urlAfterRedirects, nextRouterState), this._trigger));
248
+ };
249
+ /**
250
+ * @private
251
+ * @param {?} event
252
+ * @return {?}
253
+ */
254
+ RouterState.prototype.dispatchRouterCancel = /**
255
+ * @private
256
+ * @param {?} event
257
+ * @return {?}
258
+ */
259
+ function (event) {
260
+ this.dispatchRouterAction(new RouterCancel((/** @type {?} */ (this._routerState)), this._storeState, event, this._trigger));
261
+ };
262
+ /**
263
+ * @private
264
+ * @param {?} event
265
+ * @return {?}
266
+ */
267
+ RouterState.prototype.dispatchRouterError = /**
268
+ * @private
269
+ * @param {?} event
270
+ * @return {?}
271
+ */
272
+ function (event) {
273
+ this.dispatchRouterAction(new RouterError((/** @type {?} */ (this._routerState)), this._storeState, new NavigationError(event.id, event.url, "" + event), this._trigger));
274
+ };
275
+ /**
276
+ * @private
277
+ * @template T
278
+ * @param {?} action
279
+ * @return {?}
280
+ */
281
+ RouterState.prototype.dispatchRouterAction = /**
282
+ * @private
283
+ * @template T
284
+ * @param {?} action
285
+ * @return {?}
286
+ */
287
+ function (action) {
288
+ this._trigger = 'router';
289
+ try {
290
+ this._store.dispatch(action);
291
+ }
292
+ finally {
293
+ this._trigger = 'none';
294
+ }
295
+ };
296
+ /**
297
+ * @private
298
+ * @param {?} event
299
+ * @return {?}
300
+ */
301
+ RouterState.prototype.dispatchRouterDataResolved = /**
302
+ * @private
303
+ * @param {?} event
304
+ * @return {?}
305
+ */
306
+ function (event) {
307
+ /** @type {?} */
308
+ var routerState = this._serializer.serialize(event.state);
309
+ this.dispatchRouterAction(new RouterDataResolved(routerState, event, this._trigger));
310
+ };
311
+ /**
312
+ * @private
313
+ * @return {?}
314
+ */
315
+ RouterState.prototype.reset = /**
316
+ * @private
317
+ * @return {?}
318
+ */
319
+ function () {
320
+ this._trigger = 'none';
321
+ this._storeState = null;
322
+ this._routerState = null;
323
+ };
324
+ /**
325
+ * No sense to mess up the `setUpRouterEventsListener` method as we have
326
+ * to perform this check only once and unsubscribe after the first event
327
+ * is triggered
328
+ */
329
+ /**
330
+ * No sense to mess up the `setUpRouterEventsListener` method as we have
331
+ * to perform this check only once and unsubscribe after the first event
332
+ * is triggered
333
+ * @private
334
+ * @return {?}
335
+ */
336
+ RouterState.prototype.checkInitialNavigationOnce = /**
337
+ * No sense to mess up the `setUpRouterEventsListener` method as we have
338
+ * to perform this check only once and unsubscribe after the first event
339
+ * is triggered
340
+ * @private
341
+ * @return {?}
342
+ */
343
+ function () {
344
+ var _this = this;
345
+ if (isAngularInTestMode()) {
346
+ return;
347
+ }
348
+ this._router.events
349
+ .pipe(first((/**
350
+ * @param {?} event
351
+ * @return {?}
352
+ */
353
+ function (event) { return event instanceof RoutesRecognized; })))
354
+ .subscribe((/**
355
+ * @param {?} __0
356
+ * @return {?}
357
+ */
358
+ function (_a) {
359
+ // `location.pathname` always equals manually entered URL in the address bar
360
+ // e.g. `location.pathname === '/foo'`, but the `router` state has been initialized
361
+ // with another URL (e.g. used in combination with `NgxsStoragePlugin`), thus the
362
+ // `RouterNavigation` action will be dispatched and the user will be redirected to the
363
+ // previously saved URL. We want to prevent such behavior, so we perform this check
364
+ var url = _a.url;
365
+ // `location.pathname` always equals manually entered URL in the address bar
366
+ // e.g. `location.pathname === '/foo'`, but the `router` state has been initialized
367
+ // with another URL (e.g. used in combination with `NgxsStoragePlugin`), thus the
368
+ // `RouterNavigation` action will be dispatched and the user will be redirected to the
369
+ // previously saved URL. We want to prevent such behavior, so we perform this check
370
+ // `url` is a recognized URL by the Angular's router, while `currentUrl` is an actual URL
371
+ // entered in the browser's address bar
372
+ // `PathLocationStrategy.prototype.path()` returns a concatenation of
373
+ // `PlatformLocation.pathname` and normalized `PlatformLocation.search`.
374
+ // `Location.prototype.normalize` strips base href from the URL,
375
+ // if `baseHref` (declared in angular.json) for example is `/en`
376
+ // and the URL is `/test#anchor` - then `_locationStrategy.path(true)` will return `/en/test#anchor`,
377
+ // but `/en/test#anchor` is not known to the Angular's router, so we have to strip `/en`
378
+ // from the URL
379
+ /** @type {?} */
380
+ var currentUrl = _this._location.normalize(_this._locationStrategy.path(true));
381
+ /** @type {?} */
382
+ var currentUrlTree = _this._urlSerializer.parse(currentUrl);
383
+ // We need to serialize the URL because in that example `/test/?redirect=https://google.com/`
384
+ // Angular will recognize it as `/test?redirect=https:%2F%2Fwww.google.com%2F`
385
+ // so we have to run the `currentUrl` via the `UrlSerializer` that will encode characters
386
+ /** @type {?} */
387
+ var currentSerializedUrl = _this._urlSerializer.serialize(currentUrlTree);
388
+ // If URLs differ from each other - we've got to perform a redirect to the manually entered URL
389
+ // in the address bar, as it must have a priority
390
+ if (currentSerializedUrl !== url) {
391
+ _this._router.navigateByUrl(currentUrl);
392
+ }
393
+ }));
394
+ };
395
+ var RouterState_1;
396
+ RouterState.ctorParameters = function () { return [
397
+ { type: Store },
398
+ { type: Router },
399
+ { type: RouterStateSerializer },
400
+ { type: NgZone },
401
+ { type: UrlSerializer },
402
+ { type: LocationStrategy },
403
+ { type: Location }
404
+ ]; };
405
+ RouterState.decorators = [
406
+ { type: Injectable }
407
+ ];
408
+ /** @nocollapse */
409
+ RouterState.ctorParameters = function () { return [
410
+ { type: Store },
411
+ { type: Router },
412
+ { type: RouterStateSerializer },
413
+ { type: NgZone },
414
+ { type: UrlSerializer },
415
+ { type: LocationStrategy },
416
+ { type: Location }
417
+ ]; };
418
+ tslib_1.__decorate([
419
+ Action(Navigate),
420
+ tslib_1.__metadata("design:type", Function),
421
+ tslib_1.__metadata("design:paramtypes", [Object, Navigate]),
422
+ tslib_1.__metadata("design:returntype", void 0)
423
+ ], RouterState.prototype, "navigate", null);
424
+ tslib_1.__decorate([
425
+ Action([RouterNavigation, RouterError, RouterCancel, RouterDataResolved]),
426
+ tslib_1.__metadata("design:type", Function),
427
+ tslib_1.__metadata("design:paramtypes", [Object, Object]),
428
+ tslib_1.__metadata("design:returntype", void 0)
429
+ ], RouterState.prototype, "angularRouterAction", null);
430
+ tslib_1.__decorate([
431
+ Selector(),
432
+ tslib_1.__metadata("design:type", Function),
433
+ tslib_1.__metadata("design:paramtypes", [Object]),
434
+ tslib_1.__metadata("design:returntype", void 0)
435
+ ], RouterState, "state", null);
436
+ tslib_1.__decorate([
437
+ Selector(),
438
+ tslib_1.__metadata("design:type", Function),
439
+ tslib_1.__metadata("design:paramtypes", [Object]),
440
+ tslib_1.__metadata("design:returntype", Object)
441
+ ], RouterState, "url", null);
442
+ RouterState = RouterState_1 = tslib_1.__decorate([
443
+ State({
444
+ name: 'router',
445
+ defaults: {
446
+ state: undefined,
447
+ navigationId: undefined,
448
+ trigger: 'none'
449
+ }
450
+ }),
451
+ tslib_1.__metadata("design:paramtypes", [Store,
452
+ Router,
453
+ RouterStateSerializer,
454
+ NgZone,
455
+ UrlSerializer,
456
+ LocationStrategy,
457
+ Location])
458
+ ], RouterState);
459
+ return RouterState;
460
+ }());
461
+ export { RouterState };
462
+ if (false) {
463
+ /**
464
+ * Determines how navigation was performed by the `RouterState` itself
465
+ * or outside via `new Navigate(...)`
466
+ * @type {?}
467
+ * @private
468
+ */
469
+ RouterState.prototype._trigger;
470
+ /**
471
+ * That's the serialized state from the `Router` class
472
+ * @type {?}
473
+ * @private
474
+ */
475
+ RouterState.prototype._routerState;
476
+ /**
477
+ * That's the value of the `RouterState` state
478
+ * @type {?}
479
+ * @private
480
+ */
481
+ RouterState.prototype._storeState;
482
+ /**
483
+ * @type {?}
484
+ * @private
485
+ */
486
+ RouterState.prototype._lastRoutesRecognized;
487
+ /**
488
+ * @type {?}
489
+ * @private
490
+ */
491
+ RouterState.prototype._store;
492
+ /**
493
+ * @type {?}
494
+ * @private
495
+ */
496
+ RouterState.prototype._router;
497
+ /**
498
+ * @type {?}
499
+ * @private
500
+ */
501
+ RouterState.prototype._serializer;
502
+ /**
503
+ * @type {?}
504
+ * @private
505
+ */
506
+ RouterState.prototype._ngZone;
507
+ /**
508
+ * @type {?}
509
+ * @private
510
+ */
511
+ RouterState.prototype._urlSerializer;
512
+ /**
513
+ * @type {?}
514
+ * @private
515
+ */
516
+ RouterState.prototype._locationStrategy;
517
+ /**
518
+ * @type {?}
519
+ * @private
520
+ */
521
+ RouterState.prototype._location;
522
+ }
523
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLnN0YXRlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5neHMvcm91dGVyLXBsdWdpbi8iLCJzb3VyY2VzIjpbInNyYy9yb3V0ZXIuc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZixNQUFNLEVBQ04sbUJBQW1CLEVBQ25CLGdCQUFnQixFQUNoQixVQUFVLEVBQ1YsYUFBYSxFQUNiLGVBQWUsRUFDZixhQUFhLEVBQ2QsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZDLE9BQU8sRUFDTCxRQUFRLEVBRVIsWUFBWSxFQUNaLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ25CLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sY0FBYyxDQUFDOzs7OztBQUVyRCxzQ0FJQzs7O0lBSEMsaUNBQVU7O0lBQ1Ysd0NBQXNCOztJQUN0QixtQ0FBdUI7OztJQTJDdkIscUJBQ1UsTUFBYSxFQUNiLE9BQWUsRUFDZixXQUF1RCxFQUN2RCxPQUFlLEVBQ2YsY0FBNkIsRUFDN0IsaUJBQW1DLEVBQ25DLFNBQW1CO1FBTm5CLFdBQU0sR0FBTixNQUFNLENBQU87UUFDYixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsZ0JBQVcsR0FBWCxXQUFXLENBQTRD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RSxTQUFTO2dCQUN2QixPQUFPLEVBQUUsTUFBTTthQUNoQjtTQUNGLENBQUM7aURBZ0NrQixLQUFLO1lBQ0osTUFBTTtZQUNGLHFCQUFxQjtZQUN6QixNQUFNO1lBQ0MsYUFBYTtZQUNWLGdCQUFnQjtZQUN4QixRQUFRO09BcENsQixXQUFXLENBb092QjtJQUFELGtCQUFDO0NBQUEsSUFBQTtTQXBPWSxXQUFXOzs7Ozs7OztJQUt0QiwrQkFBeUM7Ozs7OztJQUt6QyxtQ0FBd0Q7Ozs7OztJQUt4RCxrQ0FBb0Q7Ozs7O0lBRXBELDRDQUF3RDs7Ozs7SUFhdEQsNkJBQXFCOzs7OztJQUNyQiw4QkFBdUI7Ozs7O0lBQ3ZCLGtDQUErRDs7Ozs7SUFDL0QsOEJBQXVCOzs7OztJQUN2QixxQ0FBcUM7Ozs7O0lBQ3JDLHdDQUEyQzs7Ozs7SUFDM0MsZ0NBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdab25lLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgTmF2aWdhdGlvbkNhbmNlbCxcclxuICBOYXZpZ2F0aW9uRXJyb3IsXHJcbiAgUm91dGVyLFxyXG4gIFJvdXRlclN0YXRlU25hcHNob3QsXHJcbiAgUm91dGVzUmVjb2duaXplZCxcclxuICBSZXNvbHZlRW5kLFxyXG4gIFVybFNlcmlhbGl6ZXIsXHJcbiAgTmF2aWdhdGlvblN0YXJ0LFxyXG4gIE5hdmlnYXRpb25FbmRcclxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBMb2NhdGlvblN0cmF0ZWd5LCBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEFjdGlvbiwgU2VsZWN0b3IsIFN0YXRlLCBTdGF0ZUNvbnRleHQsIFN0b3JlIH0gZnJvbSAnQG5neHMvc3RvcmUnO1xyXG5pbXBvcnQgeyBpc0FuZ3VsYXJJblRlc3RNb2RlIH0gZnJvbSAnQG5neHMvc3RvcmUvaW50ZXJuYWxzJztcclxuaW1wb3J0IHsgZmlyc3QgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIE5hdmlnYXRlLFxyXG4gIFJvdXRlckFjdGlvbixcclxuICBSb3V0ZXJDYW5jZWwsXHJcbiAgUm91dGVyRXJyb3IsXHJcbiAgUm91dGVyTmF2aWdhdGlvbixcclxuICBSb3V0ZXJEYXRhUmVzb2x2ZWRcclxufSBmcm9tICcuL3JvdXRlci5hY3Rpb25zJztcclxuaW1wb3J0IHsgUm91dGVyU3RhdGVTZXJpYWxpemVyIH0gZnJvbSAnLi9zZXJpYWxpemVyJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVyU3RhdGVNb2RlbDxUID0gUm91dGVyU3RhdGVTbmFwc2hvdD4ge1xyXG4gIHN0YXRlPzogVDtcclxuICBuYXZpZ2F0aW9uSWQ/OiBudW1iZXI7XHJcbiAgdHJpZ2dlcjogUm91dGVyVHJpZ2dlcjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgUm91dGVyVHJpZ2dlciA9ICdub25lJyB8ICdyb3V0ZXInIHwgJ3N0b3JlJztcclxuXHJcbkBTdGF0ZTxSb3V0ZXJTdGF0ZU1vZGVsPih7XHJcbiAgbmFtZTogJ3JvdXRlcicsXHJcbiAgZGVmYXVsdHM6IHtcclxuICAgIHN0YXRlOiB1bmRlZmluZWQsXHJcbiAgICBuYXZpZ2F0aW9uSWQ6IHVuZGVmaW5lZCxcclxuICAgIHRyaWdnZXI6ICdub25lJ1xyXG4gIH1cclxufSlcclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUm91dGVyU3RhdGUge1xyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgaG93IG5hdmlnYXRpb24gd2FzIHBlcmZvcm1lZCBieSB0aGUgYFJvdXRlclN0YXRlYCBpdHNlbGZcclxuICAgKiBvciBvdXRzaWRlIHZpYSBgbmV3IE5hdmlnYXRlKC4uLilgXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfdHJpZ2dlcjogUm91dGVyVHJpZ2dlciA9ICdub25lJztcclxuXHJcbiAgLyoqXHJcbiAgICogVGhhdCdzIHRoZSBzZXJpYWxpemVkIHN0YXRlIGZyb20gdGhlIGBSb3V0ZXJgIGNsYXNzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfcm91dGVyU3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhhdCdzIHRoZSB2YWx1ZSBvZiB0aGUgYFJvdXRlclN0YXRlYCBzdGF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3N0b3JlU3RhdGU6IFJvdXRlclN0YXRlTW9kZWwgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfbGFzdFJvdXRlc1JlY29nbml6ZWQ6IFJvdXRlc1JlY29nbml6ZWQgPSBudWxsITtcclxuXHJcbiAgQFNlbGVjdG9yKClcclxuICBzdGF0aWMgc3RhdGU8VCA9IFJvdXRlclN0YXRlU25hcHNob3Q+KHN0YXRlOiBSb3V0ZXJTdGF0ZU1vZGVsPFQ+KSB7XHJcbiAgICByZXR1cm4gc3RhdGUgJiYgc3RhdGUuc3RhdGU7XHJcbiAgfVxyXG5cclxuICBAU2VsZWN0b3IoKVxyXG4gIHN0YXRpYyB1cmwoc3RhdGU6IFJvdXRlclN0YXRlTW9kZWwpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHN0YXRlICYmIHN0YXRlLnN0YXRlICYmIHN0YXRlLnN0YXRlLnVybDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfc3RvcmU6IFN0b3JlLFxyXG4gICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIF9zZXJpYWxpemVyOiBSb3V0ZXJTdGF0ZVNlcmlhbGl6ZXI8Um91dGVyU3RhdGVTbmFwc2hvdD4sXHJcbiAgICBwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSxcclxuICAgIHByaXZhdGUgX3VybFNlcmlhbGl6ZXI6IFVybFNlcmlhbGl6ZXIsXHJcbiAgICBwcml2YXRlIF9sb2NhdGlvblN0cmF0ZWd5OiBMb2NhdGlvblN0cmF0ZWd5LFxyXG4gICAgcHJpdmF0ZSBfbG9jYXRpb246IExvY2F0aW9uXHJcbiAgKSB7XHJcbiAgICB0aGlzLnNldFVwU3RvcmVMaXN0ZW5lcigpO1xyXG4gICAgdGhpcy5zZXRVcFJvdXRlckV2ZW50c0xpc3RlbmVyKCk7XHJcbiAgICB0aGlzLmNoZWNrSW5pdGlhbE5hdmlnYXRpb25PbmNlKCk7XHJcbiAgfVxyXG5cclxuICBAQWN0aW9uKE5hdmlnYXRlKVxyXG4gIG5hdmlnYXRlKF86IFN0YXRlQ29udGV4dDxSb3V0ZXJTdGF0ZU1vZGVsPiwgYWN0aW9uOiBOYXZpZ2F0ZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuX25nWm9uZS5ydW4oKCkgPT5cclxuICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKGFjdGlvbi5wYXRoLCB7XHJcbiAgICAgICAgcXVlcnlQYXJhbXM6IGFjdGlvbi5xdWVyeVBhcmFtcyxcclxuICAgICAgICAuLi5hY3Rpb24uZXh0cmFzXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgQEFjdGlvbihbUm91dGVyTmF2aWdhdGlvbiwgUm91dGVyRXJyb3IsIFJvdXRlckNhbmNlbCwgUm91dGVyRGF0YVJlc29sdmVkXSlcclxuICBhbmd1bGFyUm91dGVyQWN0aW9uKFxyXG4gICAgY3R4OiBTdGF0ZUNvbnRleHQ8Um91dGVyU3RhdGVNb2RlbD4sXHJcbiAgICBhY3Rpb246IFJvdXRlckFjdGlvbjxSb3V0ZXJTdGF0ZU1vZGVsLCBSb3V0ZXJTdGF0ZVNuYXBzaG90PlxyXG4gICk6IHZvaWQge1xyXG4gICAgY3R4LnNldFN0YXRlKHtcclxuICAgICAgLi4uY3R4LmdldFN0YXRlKCksXHJcbiAgICAgIHRyaWdnZXI6IGFjdGlvbi50cmlnZ2VyLFxyXG4gICAgICBzdGF0ZTogYWN0aW9uLnJvdXRlclN0YXRlLFxyXG4gICAgICBuYXZpZ2F0aW9uSWQ6IGFjdGlvbi5ldmVudC5pZFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFVwU3RvcmVMaXN0ZW5lcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX3N0b3JlLnNlbGVjdChSb3V0ZXJTdGF0ZSkuc3Vic2NyaWJlKChzdGF0ZTogUm91dGVyU3RhdGVNb2RlbCB8IHVuZGVmaW5lZCkgPT4ge1xyXG4gICAgICB0aGlzLm5hdmlnYXRlSWZOZWVkZWQoc3RhdGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFVwUm91dGVyRXZlbnRzTGlzdGVuZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvblN0YXJ0KCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBSb3V0ZXNSZWNvZ25pemVkKSB7XHJcbiAgICAgICAgdGhpcy5fbGFzdFJvdXRlc1JlY29nbml6ZWQgPSBldmVudDtcclxuICAgICAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFJlc29sdmVFbmQpIHtcclxuICAgICAgICB0aGlzLmRpc3BhdGNoUm91dGVyRGF0YVJlc29sdmVkKGV2ZW50KTtcclxuICAgICAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25DYW5jZWwpIHtcclxuICAgICAgICB0aGlzLmRpc3BhdGNoUm91dGVyQ2FuY2VsKGV2ZW50KTtcclxuICAgICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRXJyb3IpIHtcclxuICAgICAgICB0aGlzLmRpc3BhdGNoUm91dGVyRXJyb3IoZXZlbnQpO1xyXG4gICAgICAgIHRoaXMucmVzZXQoKTtcclxuICAgICAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRpb25FbmQoKTtcclxuICAgICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uU3RhcnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yb3V0ZXJTdGF0ZSA9IHRoaXMuX3NlcmlhbGl6ZXIuc2VyaWFsaXplKHRoaXMuX3JvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3RyaWdnZXIgIT09ICdub25lJykge1xyXG4gICAgICB0aGlzLl9zdG9yZVN0YXRlID0gdGhpcy5fc3RvcmUuc2VsZWN0U25hcHNob3QoUm91dGVyU3RhdGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uRW5kKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc2hvdWxkRGlzcGF0Y2hSb3V0ZXJOYXZpZ2F0aW9uKCkpIHtcclxuICAgICAgdGhpcy5kaXNwYXRjaFJvdXRlck5hdmlnYXRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2hvdWxkRGlzcGF0Y2hSb3V0ZXJOYXZpZ2F0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLl9zdG9yZVN0YXRlKSByZXR1cm4gdHJ1ZTtcclxuICAgIHJldHVybiB0aGlzLl90cmlnZ2VyICE9PSAnc3RvcmUnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZUlmTmVlZGVkKHN0YXRlOiBSb3V0ZXJTdGF0ZU1vZGVsIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICBjb25zdCBjYW5Ta2lwTmF2aWdhdGlvbiA9XHJcbiAgICAgICF0aGlzLl9zdG9yZVN0YXRlIHx8XHJcbiAgICAgICF0aGlzLl9zdG9yZVN0YXRlLnN0YXRlIHx8XHJcbiAgICAgICFzdGF0ZSB8fFxyXG4gICAgICBzdGF0ZS50cmlnZ2VyID09PSAncm91dGVyJyB8fFxyXG4gICAgICB0aGlzLl9yb3V0ZXIudXJsID09PSB0aGlzLl9zdG9yZVN0YXRlLnN0YXRlLnVybDtcclxuXHJcbiAgICBpZiAoY2FuU2tpcE5hdmlnYXRpb24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3RyaWdnZXIgPSAnc3RvcmUnO1xyXG4gICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMuX3N0b3JlU3RhdGUhLnN0YXRlIS51cmwpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRpc3BhdGNoUm91dGVyTmF2aWdhdGlvbigpOiB2b2lkIHtcclxuICAgIGNvbnN0IG5leHRSb3V0ZXJTdGF0ZSA9IHRoaXMuX3NlcmlhbGl6ZXIuc2VyaWFsaXplKHRoaXMuX2xhc3RSb3V0ZXNSZWNvZ25pemVkLnN0YXRlKTtcclxuXHJcbiAgICB0aGlzLmRpc3BhdGNoUm91dGVyQWN0aW9uKFxyXG4gICAgICBuZXcgUm91dGVyTmF2aWdhdGlvbihcclxuICAgICAgICBuZXh0Um91dGVyU3RhdGUsXHJcbiAgICAgICAgbmV3IFJvdXRlc1JlY29nbml6ZWQoXHJcbiAgICAgICAgICB0aGlzLl9sYXN0Um91dGVzUmVjb2duaXplZC5pZCxcclxuICAgICAgICAgIHRoaXMuX2xhc3RSb3V0ZXNSZWNvZ25pemVkLnVybCxcclxuICAgICAgICAgIHRoaXMuX2xhc3RSb3V0ZXNSZWNvZ25pemVkLnVybEFmdGVyUmVkaXJlY3RzLFxyXG4gICAgICAgICAgbmV4dFJvdXRlclN0YXRlXHJcbiAgICAgICAgKSxcclxuICAgICAgICB0aGlzLl90cmlnZ2VyXHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRpc3BhdGNoUm91dGVyQ2FuY2VsKGV2ZW50OiBOYXZpZ2F0aW9uQ2FuY2VsKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc3BhdGNoUm91dGVyQWN0aW9uKFxyXG4gICAgICBuZXcgUm91dGVyQ2FuY2VsKHRoaXMuX3JvdXRlclN0YXRlISwgdGhpcy5fc3RvcmVTdGF0ZSwgZXZlbnQsIHRoaXMuX3RyaWdnZXIpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkaXNwYXRjaFJvdXRlckVycm9yKGV2ZW50OiBOYXZpZ2F0aW9uRXJyb3IpOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzcGF0Y2hSb3V0ZXJBY3Rpb24oXHJcbiAgICAgIG5ldyBSb3V0ZXJFcnJvcihcclxuICAgICAgICB0aGlzLl9yb3V0ZXJTdGF0ZSEsXHJcbiAgICAgICAgdGhpcy5fc3RvcmVTdGF0ZSxcclxuICAgICAgICBuZXcgTmF2aWdhdGlvbkVycm9yKGV2ZW50LmlkLCBldmVudC51cmwsIGAke2V2ZW50fWApLFxyXG4gICAgICAgIHRoaXMuX3RyaWdnZXJcclxuICAgICAgKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGlzcGF0Y2hSb3V0ZXJBY3Rpb248VD4oYWN0aW9uOiBSb3V0ZXJBY3Rpb248VD4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3RyaWdnZXIgPSAncm91dGVyJztcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaChhY3Rpb24pO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5fdHJpZ2dlciA9ICdub25lJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGlzcGF0Y2hSb3V0ZXJEYXRhUmVzb2x2ZWQoZXZlbnQ6IFJlc29sdmVFbmQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJvdXRlclN0YXRlID0gdGhpcy5fc2VyaWFsaXplci5zZXJpYWxpemUoZXZlbnQuc3RhdGUpO1xyXG4gICAgdGhpcy5kaXNwYXRjaFJvdXRlckFjdGlvbihuZXcgUm91dGVyRGF0YVJlc29sdmVkKHJvdXRlclN0YXRlLCBldmVudCwgdGhpcy5fdHJpZ2dlcikpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3RyaWdnZXIgPSAnbm9uZSc7XHJcbiAgICB0aGlzLl9zdG9yZVN0YXRlID0gbnVsbDtcclxuICAgIHRoaXMuX3JvdXRlclN0YXRlID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5vIHNlbnNlIHRvIG1lc3MgdXAgdGhlIGBzZXRVcFJvdXRlckV2ZW50c0xpc3RlbmVyYCBtZXRob2QgYXMgd2UgaGF2ZVxyXG4gICAqIHRvIHBlcmZvcm0gdGhpcyBjaGVjayBvbmx5IG9uY2UgYW5kIHVuc3Vic2NyaWJlIGFmdGVyIHRoZSBmaXJzdCBldmVudFxyXG4gICAqIGlzIHRyaWdnZXJlZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2hlY2tJbml0aWFsTmF2aWdhdGlvbk9uY2UoKTogdm9pZCB7XHJcbiAgICBpZiAoaXNBbmd1bGFySW5UZXN0TW9kZSgpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9yb3V0ZXIuZXZlbnRzXHJcbiAgICAgIC5waXBlKGZpcnN0KChldmVudCk6IGV2ZW50IGlzIFJvdXRlc1JlY29nbml6ZWQgPT4gZXZlbnQgaW5zdGFuY2VvZiBSb3V0ZXNSZWNvZ25pemVkKSlcclxuICAgICAgLnN1YnNjcmliZSgoeyB1cmwgfSkgPT4ge1xyXG4gICAgICAgIC8vIGBsb2NhdGlvbi5wYXRobmFtZWAgYWx3YXlzIGVxdWFscyBtYW51YWxseSBlbnRlcmVkIFVSTCBpbiB0aGUgYWRkcmVzcyBiYXJcclxuICAgICAgICAvLyBlLmcuIGBsb2NhdGlvbi5wYXRobmFtZSA9PT0gJy9mb28nYCwgYnV0IHRoZSBgcm91dGVyYCBzdGF0ZSBoYXMgYmVlbiBpbml0aWFsaXplZFxyXG4gICAgICAgIC8vIHdpdGggYW5vdGhlciBVUkwgKGUuZy4gdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIGBOZ3hzU3RvcmFnZVBsdWdpbmApLCB0aHVzIHRoZVxyXG4gICAgICAgIC8vIGBSb3V0ZXJOYXZpZ2F0aW9uYCBhY3Rpb24gd2lsbCBiZSBkaXNwYXRjaGVkIGFuZCB0aGUgdXNlciB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gdGhlXHJcbiAgICAgICAgLy8gcHJldmlvdXNseSBzYXZlZCBVUkwuIFdlIHdhbnQgdG8gcHJldmVudCBzdWNoIGJlaGF2aW9yLCBzbyB3ZSBwZXJmb3JtIHRoaXMgY2hlY2tcclxuXHJcbiAgICAgICAgLy8gYHVybGAgaXMgYSByZWNvZ25pemVkIFVSTCBieSB0aGUgQW5ndWxhcidzIHJvdXRlciwgd2hpbGUgYGN1cnJlbnRVcmxgIGlzIGFuIGFjdHVhbCBVUkxcclxuICAgICAgICAvLyBlbnRlcmVkIGluIHRoZSBicm93c2VyJ3MgYWRkcmVzcyBiYXJcclxuICAgICAgICAvLyBgUGF0aExvY2F0aW9uU3RyYXRlZ3kucHJvdG90eXBlLnBhdGgoKWAgcmV0dXJucyBhIGNvbmNhdGVuYXRpb24gb2ZcclxuICAgICAgICAvLyBgUGxhdGZvcm1Mb2NhdGlvbi5wYXRobmFtZWAgYW5kIG5vcm1hbGl6ZWQgYFBsYXRmb3JtTG9jYXRpb24uc2VhcmNoYC5cclxuXHJcbiAgICAgICAgLy8gYExvY2F0aW9uLnByb3RvdHlwZS5ub3JtYWxpemVgIHN0cmlwcyBiYXNlIGhyZWYgZnJvbSB0aGUgVVJMLFxyXG4gICAgICAgIC8vIGlmIGBiYXNlSHJlZmAgKGRlY2xhcmVkIGluIGFuZ3VsYXIuanNvbikgZm9yIGV4YW1wbGUgaXMgYC9lbmBcclxuICAgICAgICAvLyBhbmQgdGhlIFVSTCBpcyBgL3Rlc3QjYW5jaG9yYCAtIHRoZW4gYF9sb2NhdGlvblN0cmF0ZWd5LnBhdGgodHJ1ZSlgIHdpbGwgcmV0dXJuIGAvZW4vdGVzdCNhbmNob3JgLFxyXG4gICAgICAgIC8vIGJ1dCBgL2VuL3Rlc3QjYW5jaG9yYCBpcyBub3Qga25vd24gdG8gdGhlIEFuZ3VsYXIncyByb3V0ZXIsIHNvIHdlIGhhdmUgdG8gc3RyaXAgYC9lbmBcclxuICAgICAgICAvLyBmcm9tIHRoZSBVUkxcclxuICAgICAgICBjb25zdCBjdXJyZW50VXJsID0gdGhpcy5fbG9jYXRpb24ubm9ybWFsaXplKHRoaXMuX2xvY2F0aW9uU3RyYXRlZ3kucGF0aCh0cnVlKSk7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFVybFRyZWUgPSB0aGlzLl91cmxTZXJpYWxpemVyLnBhcnNlKGN1cnJlbnRVcmwpO1xyXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gc2VyaWFsaXplIHRoZSBVUkwgYmVjYXVzZSBpbiB0aGF0IGV4YW1wbGUgYC90ZXN0Lz9yZWRpcmVjdD1odHRwczovL2dvb2dsZS5jb20vYFxyXG4gICAgICAgIC8vIEFuZ3VsYXIgd2lsbCByZWNvZ25pemUgaXQgYXMgYC90ZXN0P3JlZGlyZWN0PWh0dHBzOiUyRiUyRnd3dy5nb29nbGUuY29tJTJGYFxyXG4gICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gcnVuIHRoZSBgY3VycmVudFVybGAgdmlhIHRoZSBgVXJsU2VyaWFsaXplcmAgdGhhdCB3aWxsIGVuY29kZSBjaGFyYWN0ZXJzXHJcbiAgICAgICAgY29uc3QgY3VycmVudFNlcmlhbGl6ZWRVcmwgPSB0aGlzLl91cmxTZXJpYWxpemVyLnNlcmlhbGl6ZShjdXJyZW50VXJsVHJlZSk7XHJcblxyXG4gICAgICAgIC8vIElmIFVSTHMgZGlmZmVyIGZyb20gZWFjaCBvdGhlciAtIHdlJ3ZlIGdvdCB0byBwZXJmb3JtIGEgcmVkaXJlY3QgdG8gdGhlIG1hbnVhbGx5IGVudGVyZWQgVVJMXHJcbiAgICAgICAgLy8gaW4gdGhlIGFkZHJlc3MgYmFyLCBhcyBpdCBtdXN0IGhhdmUgYSBwcmlvcml0eVxyXG4gICAgICAgIGlmIChjdXJyZW50U2VyaWFsaXplZFVybCAhPT0gdXJsKSB7XHJcbiAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGVCeVVybChjdXJyZW50VXJsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=