@coolon/angular-ui-powerups 0.0.95 → 0.0.97

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.
Files changed (93) hide show
  1. package/bundles/coolon-angular-ui-powerups.umd.js +3108 -2277
  2. package/bundles/coolon-angular-ui-powerups.umd.js.map +1 -1
  3. package/bundles/coolon-angular-ui-powerups.umd.min.js +1 -1
  4. package/bundles/coolon-angular-ui-powerups.umd.min.js.map +1 -1
  5. package/coolon-angular-ui-powerups.d.ts +17 -20
  6. package/coolon-angular-ui-powerups.metadata.json +1 -1
  7. package/esm2015/coolon-angular-ui-powerups.js +17 -20
  8. package/esm2015/index.js +2 -2
  9. package/esm2015/lib/interaction/components/activity-container/activity-container.component.js +15 -51
  10. package/esm2015/lib/interaction/components/inplace-interaction-context/inplace-interaction-context.component.js +15 -47
  11. package/esm2015/lib/interaction/index.js +4 -2
  12. package/esm2015/lib/interaction/interaction-context-base.js +158 -0
  13. package/esm2015/lib/interaction/interaction-context.js +58 -78
  14. package/esm2015/lib/interaction/interaction.module.js +1 -1
  15. package/esm2015/lib/interaction/services/dialog-interaction-context.js +163 -0
  16. package/esm2015/lib/interaction/services/dialog-interaction.service.js +68 -181
  17. package/esm2015/lib/interaction/services/modal-interaction.service.js +109 -0
  18. package/esm2015/lib/place/components/place-outlet/place-outlet.component.js +9 -43
  19. package/esm2015/lib/place/guards/abstract-place.guard.js +165 -0
  20. package/esm2015/lib/place/guards/consolidated-param-map.js +133 -0
  21. package/esm2015/lib/place/guards/interaction.guard.js +113 -0
  22. package/esm2015/lib/place/guards/navigation-session.js +590 -0
  23. package/esm2015/lib/place/guards/place-component-deactivation-handler.js +110 -0
  24. package/esm2015/lib/place/index.js +7 -5
  25. package/esm2015/lib/place/place-component.js +1 -1
  26. package/esm2015/lib/place/place-router.js +205 -236
  27. package/esm2015/lib/place/place.module.js +2 -4
  28. package/esm2015/lib/place/route/visit-sanitiser.js +2 -2
  29. package/esm2015/lib/place/url-snapshot.js +96 -0
  30. package/esm2015/public_api.js +3 -3
  31. package/esm5/coolon-angular-ui-powerups.js +17 -20
  32. package/esm5/index.js +2 -2
  33. package/esm5/lib/interaction/components/activity-container/activity-container.component.js +22 -73
  34. package/esm5/lib/interaction/components/inplace-interaction-context/inplace-interaction-context.component.js +25 -76
  35. package/esm5/lib/interaction/index.js +4 -2
  36. package/esm5/lib/interaction/interaction-context-base.js +211 -0
  37. package/esm5/lib/interaction/interaction-context.js +72 -94
  38. package/esm5/lib/interaction/interaction.module.js +1 -1
  39. package/esm5/lib/interaction/services/dialog-interaction-context.js +188 -0
  40. package/esm5/lib/interaction/services/dialog-interaction.service.js +83 -232
  41. package/esm5/lib/interaction/services/modal-interaction.service.js +153 -0
  42. package/esm5/lib/place/components/place-outlet/place-outlet.component.js +9 -43
  43. package/esm5/lib/place/guards/abstract-place.guard.js +212 -0
  44. package/esm5/lib/place/guards/consolidated-param-map.js +161 -0
  45. package/esm5/lib/place/guards/interaction.guard.js +125 -0
  46. package/esm5/lib/place/guards/navigation-session.js +741 -0
  47. package/esm5/lib/place/guards/place-component-deactivation-handler.js +138 -0
  48. package/esm5/lib/place/index.js +7 -5
  49. package/esm5/lib/place/place-component.js +1 -1
  50. package/esm5/lib/place/place-router.js +324 -295
  51. package/esm5/lib/place/place.module.js +2 -4
  52. package/esm5/lib/place/route/visit-sanitiser.js +2 -2
  53. package/esm5/lib/place/url-snapshot.js +120 -0
  54. package/esm5/public_api.js +3 -3
  55. package/fesm2015/coolon-angular-ui-powerups.js +2250 -1642
  56. package/fesm2015/coolon-angular-ui-powerups.js.map +1 -1
  57. package/fesm5/coolon-angular-ui-powerups.js +3228 -2398
  58. package/fesm5/coolon-angular-ui-powerups.js.map +1 -1
  59. package/lib/interaction/components/activity-container/activity-container.component.d.ts +5 -10
  60. package/lib/interaction/components/inplace-interaction-context/inplace-interaction-context.component.d.ts +4 -9
  61. package/lib/interaction/index.d.ts +3 -1
  62. package/lib/interaction/interaction-context-base.d.ts +27 -0
  63. package/lib/interaction/interaction-context.d.ts +18 -15
  64. package/lib/interaction/services/dialog-interaction-context.d.ts +18 -0
  65. package/lib/interaction/services/dialog-interaction.service.d.ts +14 -23
  66. package/lib/interaction/services/modal-interaction.service.d.ts +15 -0
  67. package/lib/place/components/place-outlet/place-outlet.component.d.ts +1 -4
  68. package/lib/place/guards/abstract-place.guard.d.ts +19 -0
  69. package/lib/place/guards/consolidated-param-map.d.ts +14 -0
  70. package/lib/{interaction/guards/interaction-guard.service.d.ts → place/guards/interaction.guard.d.ts} +8 -4
  71. package/lib/place/guards/navigation-session.d.ts +96 -0
  72. package/lib/place/guards/place-component-deactivation-handler.d.ts +14 -0
  73. package/lib/place/index.d.ts +6 -4
  74. package/lib/place/place-component.d.ts +1 -1
  75. package/lib/place/place-router.d.ts +23 -31
  76. package/lib/place/url-snapshot.d.ts +16 -0
  77. package/package.json +1 -1
  78. package/schematics/place-routes/place-def.js +2 -2
  79. package/schematics/place-routes/templates/place-routes.ts.template +9 -16
  80. package/esm2015/lib/interaction/guards/interaction-guard.service.js +0 -85
  81. package/esm2015/lib/place/guards/abstract-enter-place.guard.js +0 -296
  82. package/esm2015/lib/place/guards/leave-place.guard.js +0 -47
  83. package/esm2015/lib/place/navigation-session.js +0 -279
  84. package/esm2015/lib/place/places/noop-gateway-place.component.js +0 -58
  85. package/esm5/lib/interaction/guards/interaction-guard.service.js +0 -94
  86. package/esm5/lib/place/guards/abstract-enter-place.guard.js +0 -372
  87. package/esm5/lib/place/guards/leave-place.guard.js +0 -55
  88. package/esm5/lib/place/navigation-session.js +0 -353
  89. package/esm5/lib/place/places/noop-gateway-place.component.js +0 -61
  90. package/lib/place/guards/abstract-enter-place.guard.d.ts +0 -33
  91. package/lib/place/guards/leave-place.guard.d.ts +0 -8
  92. package/lib/place/navigation-session.d.ts +0 -43
  93. package/lib/place/places/noop-gateway-place.component.d.ts +0 -10
@@ -0,0 +1,590 @@
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 { NavigationCancel, NavigationEnd, NavigationStart } from '@angular/router';
7
+ import { GarbageCollector, lang, Logger, Trace } from '@coolon/pectin';
8
+ import { PlaceComponentDeactivationHandler } from './place-component-deactivation-handler';
9
+ /**
10
+ * @abstract
11
+ */
12
+ export class NavigationSession extends GarbageCollector {
13
+ /**
14
+ * @param {?} context
15
+ */
16
+ constructor(context) {
17
+ super();
18
+ this.context = context;
19
+ this._visits = new Map();
20
+ }
21
+ /**
22
+ * @return {?}
23
+ */
24
+ get interactionContext() {
25
+ return null;
26
+ }
27
+ /**
28
+ * @param {?} visit
29
+ * @return {?}
30
+ */
31
+ storeVisit(visit) {
32
+ this._visits.set(visit.placeDefinition, visit);
33
+ }
34
+ /**
35
+ * @param {?} placeDef
36
+ * @return {?}
37
+ */
38
+ getVisitFor(placeDef) {
39
+ return this._visits.get(placeDef);
40
+ }
41
+ /**
42
+ * @param {?} newUrl
43
+ * @return {?}
44
+ */
45
+ onBackClickedDuringNavigationInteraction(newUrl) {
46
+ return this.illegalTransition('onBackClickedDuringNavigationInteraction');
47
+ }
48
+ /**
49
+ * @return {?}
50
+ */
51
+ getVisits() {
52
+ return Array.from(this._visits.values());
53
+ }
54
+ /**
55
+ * @protected
56
+ * @template R
57
+ * @param {?} message
58
+ * @return {?}
59
+ */
60
+ illegalTransition(message) {
61
+ return lang.illegalState(`${message.toString()} not supported by ${this.toString()}`);
62
+ }
63
+ /**
64
+ * @protected
65
+ * @return {?}
66
+ */
67
+ currentRouterUrl() {
68
+ return this.context.router.routerState ? this.context.router.routerState.snapshot.url : null;
69
+ }
70
+ /**
71
+ * @protected
72
+ * @param {?} event
73
+ * @return {?}
74
+ */
75
+ createActiveSession(event) {
76
+ // TODO: check if the event is purely for interaction context changes.
77
+ return new NavigationSession.Active(this.context, event.navigationTrigger === 'popstate', this.currentRouterUrl());
78
+ }
79
+ /**
80
+ * @protected
81
+ * @param {?} url
82
+ * @return {?}
83
+ */
84
+ updateLocation(url) {
85
+ this.context.angularLocation.go(url);
86
+ }
87
+ /**
88
+ * @return {?}
89
+ */
90
+ toString() {
91
+ return this.constructor.name;
92
+ }
93
+ }
94
+ tslib_1.__decorate([
95
+ Trace(),
96
+ tslib_1.__metadata("design:type", Function),
97
+ tslib_1.__metadata("design:paramtypes", [Object]),
98
+ tslib_1.__metadata("design:returntype", void 0)
99
+ ], NavigationSession.prototype, "updateLocation", null);
100
+ if (false) {
101
+ /**
102
+ * @type {?}
103
+ * @private
104
+ */
105
+ NavigationSession.prototype._visits;
106
+ /** @type {?} */
107
+ NavigationSession.prototype.isPopState;
108
+ /** @type {?} */
109
+ NavigationSession.prototype.active;
110
+ /** @type {?} */
111
+ NavigationSession.prototype.startingUrl;
112
+ /**
113
+ * @type {?}
114
+ * @protected
115
+ */
116
+ NavigationSession.prototype.context;
117
+ /**
118
+ * @abstract
119
+ * @param {?} event
120
+ * @return {?}
121
+ */
122
+ NavigationSession.prototype.onStart = function (event) { };
123
+ /**
124
+ * @abstract
125
+ * @param {?} event
126
+ * @return {?}
127
+ */
128
+ NavigationSession.prototype.onCancel = function (event) { };
129
+ /**
130
+ * @abstract
131
+ * @param {?} event
132
+ * @return {?}
133
+ */
134
+ NavigationSession.prototype.onError = function (event) { };
135
+ /**
136
+ * @abstract
137
+ * @param {?} event
138
+ * @return {?}
139
+ */
140
+ NavigationSession.prototype.onEnd = function (event) { };
141
+ /**
142
+ * @abstract
143
+ * @param {?} component
144
+ * @param {?} nextState
145
+ * @return {?}
146
+ */
147
+ NavigationSession.prototype.canDeactivatePlace = function (component, nextState) { };
148
+ }
149
+ (function (NavigationSession) {
150
+ class Context {
151
+ /**
152
+ * @param {?} router
153
+ * @param {?} modalInteractionService
154
+ * @param {?} angularLocation
155
+ * @param {?} notifySuccess
156
+ */
157
+ constructor(router, modalInteractionService, angularLocation, notifySuccess) {
158
+ this.router = router;
159
+ this.modalInteractionService = modalInteractionService;
160
+ this.angularLocation = angularLocation;
161
+ this.notifySuccess = notifySuccess;
162
+ }
163
+ }
164
+ NavigationSession.Context = Context;
165
+ if (false) {
166
+ /** @type {?} */
167
+ Context.prototype.router;
168
+ /** @type {?} */
169
+ Context.prototype.modalInteractionService;
170
+ /** @type {?} */
171
+ Context.prototype.angularLocation;
172
+ /** @type {?} */
173
+ Context.prototype.notifySuccess;
174
+ }
175
+ class Idle extends NavigationSession {
176
+ /**
177
+ * @param {?} context
178
+ */
179
+ constructor(context) {
180
+ super(context);
181
+ this.active = false;
182
+ this.startingUrl = null;
183
+ }
184
+ /**
185
+ * @param {?} component
186
+ * @param {?} nextState
187
+ * @return {?}
188
+ */
189
+ canDeactivatePlace(component, nextState) {
190
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
191
+ return this.illegalTransition('canDeactivatePlace');
192
+ });
193
+ }
194
+ /**
195
+ * @param {?} event
196
+ * @return {?}
197
+ */
198
+ onStart(event) {
199
+ // calling angularLocation.go() to clear back state can trigger router cycles to the current url if we don't ignore them
200
+ if (event.url === this.currentRouterUrl()) {
201
+ Logger.get(this).info(`navigation started to same url -> ${event.url}`);
202
+ return this;
203
+ }
204
+ if (event.url === (`${this.currentRouterUrl()}(aup-interaction:modal)`)) {
205
+ Logger.get(this).info(`navigation started with interaction outlet -> ${event.url}`);
206
+ return new ModalInteractionSession(this.context, event.url);
207
+ }
208
+ return this.createActiveSession(event);
209
+ }
210
+ /**
211
+ * @param {?} event
212
+ * @return {?}
213
+ */
214
+ onCancel(event) {
215
+ return this.illegalTransition(event);
216
+ }
217
+ /**
218
+ * @param {?} event
219
+ * @return {?}
220
+ */
221
+ onEnd(event) {
222
+ return this.illegalTransition(event);
223
+ }
224
+ /**
225
+ * @param {?} event
226
+ * @return {?}
227
+ */
228
+ onError(event) {
229
+ return this.illegalTransition(event);
230
+ }
231
+ }
232
+ NavigationSession.Idle = Idle;
233
+ if (false) {
234
+ /** @type {?} */
235
+ Idle.prototype.isPopState;
236
+ /** @type {?} */
237
+ Idle.prototype.active;
238
+ /** @type {?} */
239
+ Idle.prototype.startingUrl;
240
+ }
241
+ class Active extends NavigationSession {
242
+ /**
243
+ * @param {?} context
244
+ * @param {?} isPopState
245
+ * @param {?} startingUrl
246
+ */
247
+ constructor(context, isPopState, startingUrl) {
248
+ super(context);
249
+ this.isPopState = isPopState;
250
+ this.startingUrl = startingUrl;
251
+ this.active = true;
252
+ this.componentDeactivationHandlers = new Map();
253
+ this._interactionContext = this.context.modalInteractionService.createExclusiveInteractionContext();
254
+ this.onDispose((/**
255
+ * @return {?}
256
+ */
257
+ () => {
258
+ // the interaction context can be detached during the back button cancellation state transition
259
+ // as the transition is synchronous and activityCancellation isn't. Otherwise dispose will be
260
+ // called before the context has been cancelled. It might be work having the interaction context
261
+ // automatically cancel if the context is disposed.
262
+ if (this._interactionContext) {
263
+ this._interactionContext.dispose();
264
+ }
265
+ }));
266
+ }
267
+ /**
268
+ * @return {?}
269
+ */
270
+ get interactionContext() {
271
+ return this._interactionContext;
272
+ }
273
+ /**
274
+ * @param {?} event
275
+ * @return {?}
276
+ */
277
+ onStart(event) {
278
+ // active sessions can have many cancel start cycles.
279
+ return this;
280
+ }
281
+ /**
282
+ * @param {?} event
283
+ * @return {?}
284
+ */
285
+ onEnd(event) {
286
+ // navigation succeeded
287
+ this.context.notifySuccess(this);
288
+ return new Idle(this.context);
289
+ }
290
+ /**
291
+ * @param {?} event
292
+ * @return {?}
293
+ */
294
+ onCancel(event) {
295
+ // active sessions can have many cancel start cycles.
296
+ return this;
297
+ }
298
+ /**
299
+ * @param {?} event
300
+ * @return {?}
301
+ */
302
+ onError(event) {
303
+ // navigation was aborted.
304
+ if (this.isPopState && this.currentRouterUrl() !== this.startingUrl) {
305
+ // Angular doesn't preserve the url when a guard cancels the back button.
306
+ // See https://github.com/angular/angular/issues/13586#issuecomment-432795720
307
+ Logger.get(this).info('WORK-AROUND: Updating browser location after pop state - see angular issue #13586');
308
+ this.updateLocation(this.startingUrl);
309
+ }
310
+ return new Idle(this.context);
311
+ }
312
+ /**
313
+ * @param {?} locationTriggerUrl
314
+ * @return {?}
315
+ */
316
+ onBackClickedDuringNavigationInteraction(locationTriggerUrl) {
317
+ /** @type {?} */
318
+ const context = this.detachInteractionContext();
319
+ context.getCurrentActivity().then((/**
320
+ * @param {?} activity
321
+ * @return {?}
322
+ */
323
+ activity => {
324
+ context.addActivityListener({
325
+ /**
326
+ * @return {?}
327
+ */
328
+ onActivityFinished() {
329
+ context.dispose();
330
+ },
331
+ /**
332
+ * @return {?}
333
+ */
334
+ onActivityStarted() {
335
+ }
336
+ });
337
+ activity.cancel(null);
338
+ }));
339
+ return new CancelledDuringNavigationInteraction(this.context, this.startingUrl, locationTriggerUrl);
340
+ }
341
+ /**
342
+ * @param {?} component
343
+ * @param {?} nextState
344
+ * @return {?}
345
+ */
346
+ canDeactivatePlace(component, nextState) {
347
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
348
+ // lookup the handler and create it if we've not seen it yet
349
+ /** @type {?} */
350
+ let handler = this.componentDeactivationHandlers.get(component);
351
+ if (!handler) {
352
+ /** @type {?} */
353
+ const isPrimaryHandler = this.componentDeactivationHandlers.size === 0;
354
+ handler = new PlaceComponentDeactivationHandler(component, this);
355
+ this.componentDeactivationHandlers.set(component, handler);
356
+ }
357
+ return handler.canDeactivate(nextState);
358
+ });
359
+ }
360
+ /**
361
+ * @private
362
+ * @return {?}
363
+ */
364
+ detachInteractionContext() {
365
+ /** @type {?} */
366
+ const context = this._interactionContext;
367
+ this._interactionContext = null;
368
+ return context;
369
+ }
370
+ /**
371
+ * @return {?}
372
+ */
373
+ toString() {
374
+ return `${this.constructor.name}(startingUrl: ${this.startingUrl}, isPopState:${this.isPopState})`;
375
+ }
376
+ }
377
+ NavigationSession.Active = Active;
378
+ if (false) {
379
+ /** @type {?} */
380
+ Active.prototype.active;
381
+ /**
382
+ * @type {?}
383
+ * @private
384
+ */
385
+ Active.prototype.componentDeactivationHandlers;
386
+ /**
387
+ * @type {?}
388
+ * @private
389
+ */
390
+ Active.prototype._interactionContext;
391
+ /** @type {?} */
392
+ Active.prototype.isPopState;
393
+ /** @type {?} */
394
+ Active.prototype.startingUrl;
395
+ }
396
+ class ModalInteractionSession extends NavigationSession {
397
+ /**
398
+ * @param {?} context
399
+ * @param {?} startingUrl
400
+ */
401
+ constructor(context, startingUrl) {
402
+ super(context);
403
+ this.startingUrl = startingUrl;
404
+ this.active = false;
405
+ this.isPopState = false;
406
+ }
407
+ /**
408
+ * @param {?} url
409
+ * @return {?}
410
+ */
411
+ static hasInteraction(url) {
412
+ return url.endsWith('(aup-interaction:modal)');
413
+ }
414
+ /**
415
+ * @param {?} event
416
+ * @return {?}
417
+ */
418
+ onStart(event) {
419
+ // VERY VERY IMPORTANT BACK BUTTON NOTE:
420
+ // When the back button is clicked we'll enter here first, and push the url
421
+ // back to the browser. Angular seems to ignore it from a routing perspective
422
+ // and then the InteractionGuard will cancel the navigation. This process seems
423
+ // to keep the brower history in a sane state.
424
+ if (this.context.modalInteractionService.isActive()) {
425
+ if (!ModalInteractionSession.hasInteraction(event.url)) {
426
+ // this capture the case where
427
+ this.updateLocation(this.startingUrl);
428
+ }
429
+ }
430
+ return this;
431
+ }
432
+ /**
433
+ * @param {?} event
434
+ * @return {?}
435
+ */
436
+ onCancel(event) {
437
+ // this.updateLocation(this.startingUrl);
438
+ return this;
439
+ }
440
+ /**
441
+ * @param {?} event
442
+ * @return {?}
443
+ */
444
+ onEnd(event) {
445
+ if (this.context.modalInteractionService.isActive()) {
446
+ return this;
447
+ }
448
+ else {
449
+ return new Idle(this.context);
450
+ }
451
+ }
452
+ /**
453
+ * @param {?} event
454
+ * @return {?}
455
+ */
456
+ onError(event) {
457
+ return this.illegalTransition(event);
458
+ }
459
+ /**
460
+ * @param {?} component
461
+ * @param {?} nextState
462
+ * @return {?}
463
+ */
464
+ canDeactivatePlace(component, nextState) {
465
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
466
+ return true;
467
+ });
468
+ }
469
+ }
470
+ tslib_1.__decorate([
471
+ Trace(),
472
+ tslib_1.__metadata("design:type", Function),
473
+ tslib_1.__metadata("design:paramtypes", [NavigationStart]),
474
+ tslib_1.__metadata("design:returntype", NavigationSession)
475
+ ], ModalInteractionSession.prototype, "onStart", null);
476
+ tslib_1.__decorate([
477
+ Trace(),
478
+ tslib_1.__metadata("design:type", Function),
479
+ tslib_1.__metadata("design:paramtypes", [NavigationCancel]),
480
+ tslib_1.__metadata("design:returntype", NavigationSession)
481
+ ], ModalInteractionSession.prototype, "onCancel", null);
482
+ tslib_1.__decorate([
483
+ Trace(),
484
+ tslib_1.__metadata("design:type", Function),
485
+ tslib_1.__metadata("design:paramtypes", [NavigationEnd]),
486
+ tslib_1.__metadata("design:returntype", NavigationSession)
487
+ ], ModalInteractionSession.prototype, "onEnd", null);
488
+ NavigationSession.ModalInteractionSession = ModalInteractionSession;
489
+ if (false) {
490
+ /** @type {?} */
491
+ ModalInteractionSession.prototype.active;
492
+ /** @type {?} */
493
+ ModalInteractionSession.prototype.isPopState;
494
+ /** @type {?} */
495
+ ModalInteractionSession.prototype.startingUrl;
496
+ }
497
+ class CancelledDuringNavigationInteraction extends NavigationSession {
498
+ /**
499
+ * @param {?} context
500
+ * @param {?} startingUrl
501
+ * @param {?} locationChangeTriggerUrl
502
+ */
503
+ constructor(context, startingUrl, locationChangeTriggerUrl) {
504
+ super(context);
505
+ this.startingUrl = startingUrl;
506
+ this.locationChangeTriggerUrl = locationChangeTriggerUrl;
507
+ this.active = false;
508
+ this.capturedFauxRouterStart = false;
509
+ // This will trigger a return to the route we originally started with.
510
+ // this.angularLocation.go(this.startingUrl);
511
+ }
512
+ /**
513
+ * @param {?} component
514
+ * @param {?} nextState
515
+ * @return {?}
516
+ */
517
+ canDeactivatePlace(component, nextState) {
518
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
519
+ return false;
520
+ });
521
+ }
522
+ /**
523
+ * @param {?} event
524
+ * @return {?}
525
+ */
526
+ onCancel(event) {
527
+ return this.ignore(event);
528
+ }
529
+ /**
530
+ * @param {?} event
531
+ * @return {?}
532
+ */
533
+ onEnd(event) {
534
+ return this.ignore(event);
535
+ }
536
+ /**
537
+ * @param {?} event
538
+ * @return {?}
539
+ */
540
+ onError(event) {
541
+ return this.ignore(event);
542
+ }
543
+ /**
544
+ * @param {?} event
545
+ * @return {?}
546
+ */
547
+ onStart(event) {
548
+ if (event.url === this.locationChangeTriggerUrl && !this.capturedFauxRouterStart) {
549
+ this.capturedFauxRouterStart = true;
550
+ return this.ignore(event, 'url matched back button location change');
551
+ }
552
+ else {
553
+ return this.createActiveSession(event);
554
+ }
555
+ }
556
+ /**
557
+ * @param {?} event
558
+ * @param {?=} reason
559
+ * @return {?}
560
+ */
561
+ ignore(event, reason) {
562
+ reason = reason ? ` (${reason})` : '';
563
+ Logger.get(this).info(`ignoring router event${reason}: ${event.constructor.name} -> ${event.url}`);
564
+ return this;
565
+ }
566
+ /**
567
+ * @return {?}
568
+ */
569
+ toString() {
570
+ return `${this.constructor.name}(startingUrl: ${this.startingUrl}, locationChangeTriggerUrl:${this.locationChangeTriggerUrl})`;
571
+ }
572
+ }
573
+ NavigationSession.CancelledDuringNavigationInteraction = CancelledDuringNavigationInteraction;
574
+ if (false) {
575
+ /** @type {?} */
576
+ CancelledDuringNavigationInteraction.prototype.active;
577
+ /** @type {?} */
578
+ CancelledDuringNavigationInteraction.prototype.isPopState;
579
+ /**
580
+ * @type {?}
581
+ * @private
582
+ */
583
+ CancelledDuringNavigationInteraction.prototype.capturedFauxRouterStart;
584
+ /** @type {?} */
585
+ CancelledDuringNavigationInteraction.prototype.startingUrl;
586
+ /** @type {?} */
587
+ CancelledDuringNavigationInteraction.prototype.locationChangeTriggerUrl;
588
+ }
589
+ })(NavigationSession || (NavigationSession = {}));
590
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi1zZXNzaW9uLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvb2xvbi9hbmd1bGFyLXVpLXBvd2VydXBzLyIsInNvdXJjZXMiOlsibGliL3BsYWNlL2d1YXJkcy9uYXZpZ2F0aW9uLXNlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFFYixlQUFlLEVBR2hCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFPdkUsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7Ozs7QUFFM0YsTUFBTSxPQUFnQixpQkFBa0IsU0FBUSxnQkFBZ0I7Ozs7SUFROUQsWUFBK0IsT0FBa0M7UUFDL0QsS0FBSyxFQUFFLENBQUM7UUFEcUIsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUFOekQsWUFBTyxHQUFHLElBQUksR0FBRyxFQUEwQixDQUFDO0lBUXBELENBQUM7Ozs7SUFFRCxJQUFJLGtCQUFrQjtRQUNwQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Ozs7O0lBRUQsVUFBVSxDQUFDLEtBQVk7UUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDOzs7OztJQUVELFdBQVcsQ0FBQyxRQUF5QjtRQUNuQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7Ozs7O0lBVUQsd0NBQXdDLENBQUMsTUFBYztRQUNyRCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7Ozs7SUFJRCxTQUFTO1FBQ1AsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUks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UUFDNUIsd0VBQXlDOztBQTBDekQsQ0FBQyxFQW5QZ0IsaUJBQWlCLEtBQWpCLGlCQUFpQixRQW1QakMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBOYXZpZ2F0aW9uQ2FuY2VsLFxuICBOYXZpZ2F0aW9uRW5kLFxuICBOYXZpZ2F0aW9uRXJyb3IsXG4gIE5hdmlnYXRpb25TdGFydCxcbiAgUm91dGVyLFxuICBSb3V0ZXJFdmVudFxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgR2FyYmFnZUNvbGxlY3RvciwgbGFuZywgTG9nZ2VyLCBUcmFjZSB9IGZyb20gJ0Bjb29sb24vcGVjdGluJztcbmltcG9ydCB7IEludGVyYWN0aW9uQ29udGV4dCB9IGZyb20gJy4uLy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLWNvbnRleHQnO1xuaW1wb3J0IHsgTW9kYWxJbnRlcmFjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9pbnRlcmFjdGlvbi9zZXJ2aWNlcy9tb2RhbC1pbnRlcmFjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYWNlQ29tcG9uZW50IH0gZnJvbSAnLi4vcGxhY2UtY29tcG9uZW50JztcbmltcG9ydCB7IFBsYWNlRGVmaW5pdGlvbiB9IGZyb20gJy4uL3BsYWNlLWRlZmluaXRpb24nO1xuaW1wb3J0IHsgVXJsU25hcHNob3QgfSBmcm9tICcuLi91cmwtc25hcHNob3QnO1xuaW1wb3J0IHsgVmlzaXQgfSBmcm9tICcuLi92aXNpdCc7XG5pbXBvcnQgeyBQbGFjZUNvbXBvbmVudERlYWN0aXZhdGlvbkhhbmRsZXIgfSBmcm9tICcuL3BsYWNlLWNvbXBvbmVudC1kZWFjdGl2YXRpb24taGFuZGxlcic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOYXZpZ2F0aW9uU2Vzc2lvbiBleHRlbmRzIEdhcmJhZ2VDb2xsZWN0b3Ige1xuXG4gIHByaXZhdGUgX3Zpc2l0cyA9IG5ldyBNYXA8UGxhY2VEZWZpbml0aW9uLCBWaXNpdD4oKTtcblxuICBhYnN0cmFjdCByZWFkb25seSBpc1BvcFN0YXRlOiBib29sZWFuO1xuICBhYnN0cmFjdCByZWFkb25seSBhY3RpdmU6IGJvb2xlYW47XG4gIGFic3RyYWN0IHJlYWRvbmx5IHN0YXJ0aW5nVXJsOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IGNvbnRleHQ6IE5hdmlnYXRpb25TZXNzaW9uLkNvbnRleHQpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgZ2V0IGludGVyYWN0aW9uQ29udGV4dCgpOiBJbnRlcmFjdGlvbkNvbnRleHQge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RvcmVWaXNpdCh2aXNpdDogVmlzaXQpIHtcbiAgICB0aGlzLl92aXNpdHMuc2V0KHZpc2l0LnBsYWNlRGVmaW5pdGlvbiwgdmlzaXQpO1xuICB9XG5cbiAgZ2V0VmlzaXRGb3IocGxhY2VEZWY6IFBsYWNlRGVmaW5pdGlvbikge1xuICAgIHJldHVybiB0aGlzLl92aXNpdHMuZ2V0KHBsYWNlRGVmKTtcbiAgfVxuXG4gIGFic3RyYWN0IG9uU3RhcnQoZXZlbnQ6IE5hdmlnYXRpb25TdGFydCk6IE5hdmlnYXRpb25TZXNzaW9uO1xuXG4gIGFic3RyYWN0IG9uQ2FuY2VsKGV2ZW50OiBOYXZpZ2F0aW9uQ2FuY2VsKTogTmF2aWdhdGlvblNlc3Npb247XG5cbiAgYWJzdHJhY3Qgb25FcnJvcihldmVudDogTmF2aWdhdGlvbkVycm9yKTogTmF2aWdhdGlvblNlc3Npb247XG5cbiAgYWJzdHJhY3Qgb25FbmQoZXZlbnQ6IE5hdmlnYXRpb25FbmQpOiBOYXZpZ2F0aW9uU2Vzc2lvbjtcblxuICBvbkJhY2tDbGlja2VkRHVyaW5nTmF2aWdhdGlvbkludGVyYWN0aW9uKG5ld1VybDogc3RyaW5nKTogTmF2aWdhdGlvblNlc3Npb24ge1xuICAgIHJldHVybiB0aGlzLmlsbGVnYWxUcmFuc2l0aW9uKCdvbkJhY2tDbGlja2VkRHVyaW5nTmF2aWdhdGlvbkludGVyYWN0aW9uJyk7XG4gIH1cblxuICBhYnN0cmFjdCBhc3luYyBjYW5EZWFjdGl2YXRlUGxhY2UoY29tcG9uZW50OiBQbGFjZUNvbXBvbmVudCwgbmV4dFN0YXRlOiBVcmxTbmFwc2hvdCk6IFByb21pc2U8Ym9vbGVhbj47XG5cbiAgZ2V0VmlzaXRzKCk6IFZpc2l0W10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX3Zpc2l0cy52YWx1ZXMoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaWxsZWdhbFRyYW5zaXRpb248Uj4obWVzc2FnZTogc3RyaW5nIHwgUm91dGVyRXZlbnQpOiBSIHtcbiAgICByZXR1cm4gbGFuZy5pbGxlZ2FsU3RhdGUoYCR7bWVzc2FnZS50b1N0cmluZygpfSBub3Qgc3VwcG9ydGVkIGJ5ICR7dGhpcy50b1N0cmluZygpfWApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGN1cnJlbnRSb3V0ZXJVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0LnJvdXRlci5yb3V0ZXJTdGF0ZSA/IHRoaXMuY29udGV4dC5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QudXJsIDogbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVBY3RpdmVTZXNzaW9uKGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpIHtcbiAgICAvLyBUT0RPOiBjaGVjayBpZiB0aGUgZXZlbnQgaXMgcHVyZWx5IGZvciBpbnRlcmFjdGlvbiBjb250ZXh0IGNoYW5nZXMuXG4gICAgcmV0dXJuIG5ldyBOYXZpZ2F0aW9uU2Vzc2lvbi5BY3RpdmUodGhpcy5jb250ZXh0LCBldmVudC5uYXZpZ2F0aW9uVHJpZ2dlciA9PT0gJ3BvcHN0YXRlJywgdGhpcy5jdXJyZW50Um91dGVyVXJsKCkpO1xuICB9XG5cbiAgQFRyYWNlKClcbiAgcHJvdGVjdGVkIHVwZGF0ZUxvY2F0aW9uKHVybCkge1xuICAgIHRoaXMuY29udGV4dC5hbmd1bGFyTG9jYXRpb24uZ28odXJsKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuXG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgTmF2aWdhdGlvblNlc3Npb24ge1xuXG4gIGV4cG9ydCBjbGFzcyBDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgICAgcmVhZG9ubHkgbW9kYWxJbnRlcmFjdGlvblNlcnZpY2U6IE1vZGFsSW50ZXJhY3Rpb25TZXJ2aWNlLFxuICAgICAgcmVhZG9ubHkgYW5ndWxhckxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICAgIHJlYWRvbmx5IG5vdGlmeVN1Y2Nlc3M6IChzdWNjZXNzOiBOYXZpZ2F0aW9uU2Vzc2lvbikgPT4gdm9pZCkge1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBJZGxlIGV4dGVuZHMgTmF2aWdhdGlvblNlc3Npb24ge1xuICAgIHJlYWRvbmx5IGlzUG9wU3RhdGU6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgYWN0aXZlID0gZmFsc2U7XG4gICAgcmVhZG9ubHkgc3RhcnRpbmdVcmwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgc3VwZXIoY29udGV4dCk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2FuRGVhY3RpdmF0ZVBsYWNlKGNvbXBvbmVudDogUGxhY2VDb21wb25lbnQsIG5leHRTdGF0ZTogVXJsU25hcHNob3QpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIHJldHVybiB0aGlzLmlsbGVnYWxUcmFuc2l0aW9uKCdjYW5EZWFjdGl2YXRlUGxhY2UnKTtcbiAgICB9XG5cbiAgICBvblN0YXJ0KGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpOiBOYXZpZ2F0aW9uU2Vzc2lvbiB7XG4gICAgICAvLyBjYWxsaW5nIGFuZ3VsYXJMb2NhdGlvbi5nbygpIHRvIGNsZWFyIGJhY2sgc3RhdGUgY2FuIHRyaWdnZXIgcm91dGVyIGN5Y2xlcyB0byB0aGUgY3VycmVudCB1cmwgaWYgd2UgZG9uJ3QgaWdub3JlIHRoZW1cbiAgICAgIGlmIChldmVudC51cmwgPT09IHRoaXMuY3VycmVudFJvdXRlclVybCgpKSB7XG4gICAgICAgIExvZ2dlci5nZXQodGhpcykuaW5mbyhgbmF2aWdhdGlvbiBzdGFydGVkIHRvIHNhbWUgdXJsIC0+ICR7ZXZlbnQudXJsfWApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC51cmwgPT09IChgJHt0aGlzLmN1cnJlbnRSb3V0ZXJVcmwoKX0oYXVwLWludGVyYWN0aW9uOm1vZGFsKWApKSB7XG4gICAgICAgIExvZ2dlci5nZXQodGhpcykuaW5mbyhgbmF2aWdhdGlvbiBzdGFydGVkIHdpdGggaW50ZXJhY3Rpb24gb3V0bGV0IC0+ICR7ZXZlbnQudXJsfWApO1xuICAgICAgICByZXR1cm4gbmV3IE1vZGFsSW50ZXJhY3Rpb25TZXNzaW9uKHRoaXMuY29udGV4dCwgZXZlbnQudXJsKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUFjdGl2ZVNlc3Npb24oZXZlbnQpO1xuICAgIH1cblxuICAgIG9uQ2FuY2VsKGV2ZW50OiBOYXZpZ2F0aW9uQ2FuY2VsKTogTmF2aWdhdGlvblNlc3Npb24ge1xuICAgICAgcmV0dXJuIHRoaXMuaWxsZWdhbFRyYW5zaXRpb24oZXZlbnQpO1xuICAgIH1cblxuICAgIG9uRW5kKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKTogTmF2aWdhdGlvblNlc3Npb24ge1xuICAgICAgcmV0dXJuIHRoaXMuaWxsZWdhbFRyYW5zaXRpb24oZXZlbnQpO1xuICAgIH1cblxuICAgIG9uRXJyb3IoZXZlbnQ6IE5hdmlnYXRpb25FcnJvcik6IE5hdmlnYXRpb25TZXNzaW9uIHtcbiAgICAgIHJldHVybiB0aGlzLmlsbGVnYWxUcmFuc2l0aW9uKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBleHBvcnQgY2xhc3MgQWN0aXZlIGV4dGVuZHMgTmF2aWdhdGlvblNlc3Npb24ge1xuXG4gICAgcmVhZG9ubHkgYWN0aXZlID0gdHJ1ZTtcbiAgICBwcml2YXRlIGNvbXBvbmVudERlYWN0aXZhdGlvbkhhbmRsZXJzID0gbmV3IE1hcDxQbGFjZUNvbXBvbmVudCwgUGxhY2VDb21wb25lbnREZWFjdGl2YXRpb25IYW5kbGVyPigpO1xuICAgIHByaXZhdGUgX2ludGVyYWN0aW9uQ29udGV4dDogSW50ZXJhY3Rpb25Db250ZXh0O1xuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgcmVhZG9ubHkgaXNQb3BTdGF0ZTogYm9vbGVhbiwgcmVhZG9ubHkgc3RhcnRpbmdVcmw6IHN0cmluZykge1xuICAgICAgc3VwZXIoY29udGV4dCk7XG4gICAgICB0aGlzLl9pbnRlcmFjdGlvbkNvbnRleHQgPSB0aGlzLmNvbnRleHQubW9kYWxJbnRlcmFjdGlvblNlcnZpY2UuY3JlYXRlRXhjbHVzaXZlSW50ZXJhY3Rpb25Db250ZXh0KCk7XG4gICAgICB0aGlzLm9uRGlzcG9zZSgoKSA9PiB7XG4gICAgICAgIC8vIHRoZSBpbnRlcmFjdGlvbiBjb250ZXh0IGNhbiBiZSBkZXRhY2hlZCBkdXJpbmcgdGhlIGJhY2sgYnV0dG9uIGNhbmNlbGxhdGlvbiBzdGF0ZSB0cmFuc2l0aW9uXG4gICAgICAgIC8vIGFzIHRoZSB0cmFuc2l0aW9uIGlzIHN5bmNocm9ub3VzIGFuZCBhY3Rpdml0eUNhbmNlbGxhdGlvbiBpc24ndC4gIE90aGVyd2lzZSBkaXNwb3NlIHdpbGwgYmVcbiAgICAgICAgLy8gY2FsbGVkIGJlZm9yZSB0aGUgY29udGV4dCBoYXMgYmVlbiBjYW5jZWxsZWQuICBJdCBtaWdodCBiZSB3b3JrIGhhdmluZyB0aGUgaW50ZXJhY3Rpb24gY29udGV4dFxuICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGNhbmNlbCBpZiB0aGUgY29udGV4dCBpcyBkaXNwb3NlZC5cbiAgICAgICAgaWYgKHRoaXMuX2ludGVyYWN0aW9uQ29udGV4dCkge1xuICAgICAgICAgIHRoaXMuX2ludGVyYWN0aW9uQ29udGV4dC5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldCBpbnRlcmFjdGlvbkNvbnRleHQoKTogSW50ZXJhY3Rpb25Db250ZXh0IHtcbiAgICAgIHJldHVybiB0aGlzLl9pbnRlcmFjdGlvbkNvbnRleHQ7XG4gICAgfVxuXG4gICAgb25TdGFydChldmVudDogTmF2aWdhdGlvblN0YXJ0KTogTmF2aWdhdGlvblNlc3Npb24ge1xuICAgICAgLy8gYWN0aXZlIHNlc3Npb25zIGNhbiBoYXZlIG1hbnkgY2FuY2VsIHN0YXJ0IGN5Y2xlcy5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIG9uRW5kKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKTogTmF2aWdhdGlvblNlc3Npb24ge1xuICAgICAgLy8gbmF2aWdhdGlvbiBzdWNjZWVkZWRcbiAgICAgIHRoaXMuY29udGV4dC5ub3RpZnlTdWNjZXNzKHRoaXMpO1xuICAgICAgcmV0dXJuIG5ldyBJZGxlKHRoaXMuY29udGV4dCk7XG4gICAgfVxuXG4gICAgb25DYW5jZWwoZXZlbnQ6IE5hdmlnYXRpb25DYW5jZWwpOiBOYXZpZ2F0aW9uU2Vzc2lvbiB7XG4gICAgICAvLyBhY3RpdmUgc2Vzc2lvbnMgY2FuIGhhdmUgbWFueSBjYW5jZWwgc3RhcnQgY3ljbGVzLlxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgb25FcnJvcihldmVudDogTmF2aWdhdGlvbkVycm9yKTogTmF2aWdhdGlvblNlc3Npb24ge1xuICAgICAgLy8gbmF2aWdhdGlvbiB3YXMgYWJvcnRlZC5cbiAgICAgIGlmICh0aGlzLmlzUG9wU3RhdGUgJiYgdGhpcy5jdXJyZW50Um91dGVyVXJsKCkgIT09IHRoaXMuc3RhcnRpbmdVcmwpIHtcbiAgICAgICAgLy8gQW5ndWxhciBkb2Vzbid0IHByZXNlcnZlIHRoZSB1cmwgd2hlbiBhIGd1YXJkIGNhbmNlbHMgdGhlIGJhY2sgYnV0dG9uLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTM1ODYjaXNzdWVjb21tZW50LTQzMjc5NTcyMFxuICAgICAgICBMb2dnZXIuZ2V0KHRoaXMpLmluZm8oJ1dPUkstQVJPVU5EOiBVcGRhdGluZyBicm93c2VyIGxvY2F0aW9uIGFmdGVyIHBvcCBzdGF0ZSAtIHNlZSBhbmd1bGFyIGlzc3VlICMxMzU4NicpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxvY2F0aW9uKHRoaXMuc3RhcnRpbmdVcmwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBJZGxlKHRoaXMuY29udGV4dCk7XG4gICAgfVxuXG4gICAgb25CYWNrQ2xpY2tlZER1cmluZ05hdmlnYXRpb25JbnRlcmFjdGlvbihsb2NhdGlvblRyaWdnZXJVcmw6IHN0cmluZyk6IE5hdmlnYXRpb25TZXNzaW9uIHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmRldGFjaEludGVyYWN0aW9uQ29udGV4dCgpO1xuICAgICAgY29udGV4dC5nZXRDdXJyZW50QWN0aXZpdHkoKS50aGVuKGFjdGl2aXR5ID0+IHtcbiAgICAgICAgY29udGV4dC5hZGRBY3Rpdml0eUxpc3RlbmVyKHtcbiAgICAgICAgICBvbkFjdGl2aXR5RmluaXNoZWQoKTogdm9pZCB7XG4gICAgICAgICAgICBjb250ZXh0LmRpc3Bvc2UoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQWN0aXZpdHlTdGFydGVkKCk6IHZvaWQge1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGFjdGl2aXR5LmNhbmNlbChudWxsKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsZWREdXJpbmdOYXZpZ2F0aW9uSW50ZXJhY3Rpb24odGhpcy5jb250ZXh0LFxuICAgICAgICB0aGlzLnN0YXJ0aW5nVXJsLFxuICAgICAgICBsb2NhdGlvblRyaWdnZXJVcmwpO1xuICAgIH1cblxuICAgIGFzeW5jIGNhbkRlYWN0aXZhdGVQbGFjZShjb21wb25lbnQ6IFBsYWNlQ29tcG9uZW50LCBuZXh0U3RhdGU6IFVybFNuYXBzaG90KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAvLyBsb29rdXAgdGhlIGhhbmRsZXIgYW5kIGNyZWF0ZSBpdCBpZiB3ZSd2ZSBub3Qgc2VlbiBpdCB5ZXRcbiAgICAgIGxldCBoYW5kbGVyID0gdGhpcy5jb21wb25lbnREZWFjdGl2YXRpb25IYW5kbGVycy5nZXQoY29tcG9uZW50KTtcbiAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICBjb25zdCBpc1ByaW1hcnlIYW5kbGVyID0gdGhpcy5jb21wb25lbnREZWFjdGl2YXRpb25IYW5kbGVycy5zaXplID09PSAwOyAvLyBvbmx5IHByaW1hcnkgaGFuZGxlciBjYW5jZWxlIHRoZSBhcHAgbW9kZWwgaW50ZXJhdGlvbnNcbiAgICAgICAgaGFuZGxlciA9IG5ldyBQbGFjZUNvbXBvbmVudERlYWN0aXZhdGlvbkhhbmRsZXIoY29tcG9uZW50LCB0aGlzKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnREZWFjdGl2YXRpb25IYW5kbGVycy5zZXQoY29tcG9uZW50LCBoYW5kbGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYW5kbGVyLmNhbkRlYWN0aXZhdGUobmV4dFN0YXRlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRldGFjaEludGVyYWN0aW9uQ29udGV4dCgpOiBJbnRlcmFjdGlvbkNvbnRleHQge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2ludGVyYWN0aW9uQ29udGV4dDtcbiAgICAgIHRoaXMuX2ludGVyYWN0aW9uQ29udGV4dCA9IG51bGw7XG4gICAgICByZXR1cm4gY29udGV4dDtcbiAgICB9XG5cbiAgICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0oc3RhcnRpbmdVcmw6ICR7dGhpcy5zdGFydGluZ1VybH0sIGlzUG9wU3RhdGU6JHt0aGlzLmlzUG9wU3RhdGV9KWA7XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGNsYXNzIE1vZGFsSW50ZXJhY3Rpb25TZXNzaW9uIGV4dGVuZHMgTmF2aWdhdGlvblNlc3Npb24ge1xuICAgIHJlYWRvbmx5IGFjdGl2ZSA9IGZhbHNlO1xuICAgIHJlYWRvbmx5IGlzUG9wU3RhdGUgPSBmYWxzZTtcblxuICAgIHN0YXRpYyBoYXNJbnRlcmFjdGlvbih1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHVybC5lbmRzV2l0aCgnKGF1cC1pbnRlcmFjdGlvbjptb2RhbCknKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCByZWFkb25seSBzdGFydGluZ1VybDogc3RyaW5nKSB7XG4gICAgICBzdXBlcihjb250ZXh0KTtcbiAgICB9XG5cbiAgICBAVHJhY2UoKVxuICAgIG9uU3RhcnQoZXZlbnQ6IE5hdmlnYXRpb25TdGFydCk6IE5hdmlnYXRpb25TZXNzaW9uIHtcbiAgICAgIC8vIFZFUlkgVkVSWSBJTVBPUlRBTlQgQkFDSyBCVVRUT04gTk9URTpcbiAgICAgIC8vIFdoZW4gdGhlIGJhY2sgYnV0dG9uIGlzIGNsaWNrZWQgd2UnbGwgZW50ZXIgaGVyZSBmaXJzdCwgYW5kIHB1c2ggdGhlIHVybFxuICAgICAgLy8gYmFjayB0byB0aGUgYnJvd3Nlci4gIEFuZ3VsYXIgc2VlbXMgdG8gaWdub3JlIGl0IGZyb20gYSByb3V0aW5nIHBlcnNwZWN0aXZlXG4gICAgICAvLyBhbmQgdGhlbiB0aGUgSW50ZXJhY3Rpb25HdWFyZCB3aWxsIGNhbmNlbCB0aGUgbmF2aWdhdGlvbi4gIFRoaXMgcHJvY2VzcyBzZWVtc1xuICAgICAgLy8gdG8ga2VlcCB0aGUgYnJvd2VyIGhpc3RvcnkgaW4gYSBzYW5lIHN0YXRlLlxuICAgICAgaWYgKHRoaXMuY29udGV4dC5tb2RhbEludGVyYWN0aW9uU2VydmljZS5pc0FjdGl2ZSgpKSB7XG4gICAgICAgIGlmICghTW9kYWxJbnRlcmFjdGlvblNlc3Npb24uaGFzSW50ZXJhY3Rpb24oZXZlbnQudXJsKSkge1xuICAgICAgICAgIC8vIHRoaXMgY2FwdHVyZSB0aGUgY2FzZSB3aGVyZVxuICAgICAgICAgIHRoaXMudXBkYXRlTG9jYXRpb24odGhpcy5zdGFydGluZ1VybCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIEBUcmFjZSgpXG4gICAgb25DYW5jZWwoZXZlbnQ6IE5hdmlnYXRpb25DYW5jZWwpOiBOYXZpZ2F0aW9uU2Vzc2lvbiB7XG4gICAgICAvLyB0aGlzLnVwZGF0ZUxvY2F0aW9uKHRoaXMuc3RhcnRpbmdVcmwpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgQFRyYWNlKClcbiAgICBvbkVuZChldmVudDogTmF2aWdhdGlvbkVuZCk6IE5hdmlnYXRpb25TZXNzaW9uIHtcbiAgICAgIGlmICh0aGlzLmNvbnRleHQubW9kYWxJbnRlcmFjdGlvblNlcnZpY2UuaXNBY3RpdmUoKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgSWRsZSh0aGlzLmNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG9uRXJyb3IoZXZlbnQ6IE5hdmlnYXRpb25FcnJvcik6IE5hdmlnYXRpb25TZXNzaW9uIHtcbiAgICAgIHJldHVybiB0aGlzLmlsbGVnYWxUcmFuc2l0aW9uKGV2ZW50KTtcbiAgICB9XG5cbiAgICBhc3luYyBjYW5EZWFjdGl2YXRlUGxhY2UoY29tcG9uZW50OiBQbGFjZUNvbXBvbmVudCwgbmV4dFN0YXRlOiBVcmxTbmFwc2hvdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gIH1cblxuXG4gIGV4cG9ydCBjbGFzcyBDYW5jZWxsZWREdXJpbmdOYXZpZ2F0aW9uSW50ZXJhY3Rpb24gZXh0ZW5kcyBOYXZpZ2F0aW9uU2Vzc2lvbiB7XG4gICAgcmVhZG9ubHkgYWN0aXZlID0gZmFsc2U7XG4gICAgcmVhZG9ubHkgaXNQb3BTdGF0ZTogYm9vbGVhbjtcbiAgICBwcml2YXRlIGNhcHR1cmVkRmF1eFJvdXRlclN0YXJ0ID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHJlYWRvbmx5IHN0YXJ0aW5nVXJsOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcmVhZG9ubHkgbG9jYXRpb25DaGFuZ2VUcmlnZ2VyVXJsOiBzdHJpbmcpIHtcbiAgICAgIHN1cGVyKGNvbnRleHQpO1xuICAgICAgLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSByZXR1cm4gdG8gdGhlIHJvdXRlIHdlIG9yaWdpbmFsbHkgc3RhcnRlZCB3aXRoLlxuICAgICAgLy8gdGhpcy5hbmd1bGFyTG9jYXRpb24uZ28odGhpcy5zdGFydGluZ1VybCk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2FuRGVhY3RpdmF0ZVBsYWNlKGNvbXBvbmVudDogUGxhY2VDb21wb25lbnQsIG5leHRTdGF0ZTogVXJsU25hcHNob3QpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBvbkNhbmNlbChldmVudDogTmF2aWdhdGlvbkNhbmNlbCk6IE5hdmlnYXRpb25TZXNzaW9uIHtcbiAgICAgIHJldHVybiB0aGlzLmlnbm9yZShldmVudCk7XG4gICAgfVxuXG4gICAgb25FbmQoZXZlbnQ6IE5hdmlnYXRpb25FbmQpOiBOYXZpZ2F0aW9uU2Vzc2lvbiB7XG4gICAgICByZXR1cm4gdGhpcy5pZ25vcmUoZXZlbnQpO1xuICAgIH1cblxuICAgIG9uRXJyb3IoZXZlbnQ6IE5hdmlnYXRpb25FcnJvcik6IE5hdmlnYXRpb25TZXNzaW9uIHtcbiAgICAgIHJldHVybiB0aGlzLmlnbm9yZShldmVudCk7XG4gICAgfVxuXG4gICAgb25TdGFydChldmVudDogTmF2aWdhdGlvblN0YXJ0KTogTmF2aWdhdGlvblNlc3Npb24ge1xuICAgICAgaWYgKGV2ZW50LnVybCA9PT0gdGhpcy5sb2NhdGlvbkNoYW5nZVRyaWdnZXJVcmwgJiYgIXRoaXMuY2FwdHVyZWRGYXV4Um91dGVyU3RhcnQpIHtcbiAgICAgICAgdGhpcy5jYXB0dXJlZEZhdXhSb3V0ZXJTdGFydCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLmlnbm9yZShldmVudCwgJ3VybCBtYXRjaGVkIGJhY2sgYnV0dG9uIGxvY2F0aW9uIGNoYW5nZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQWN0aXZlU2Vzc2lvbihldmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWdub3JlKGV2ZW50OiBSb3V0ZXJFdmVudCwgcmVhc29uPzogc3RyaW5nKTogTmF2aWdhdGlvblNlc3Npb24ge1xuICAgICAgcmVhc29uID0gcmVhc29uID8gYCAoJHtyZWFzb259KWAgOiAnJztcbiAgICAgIExvZ2dlci5nZXQodGhpcykuaW5mbyhgaWdub3Jpbmcgcm91dGVyIGV2ZW50JHtyZWFzb259OiAke2V2ZW50LmNvbnN0cnVjdG9yLm5hbWV9IC0+ICR7ZXZlbnQudXJsfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9KHN0YXJ0aW5nVXJsOiAke3RoaXMuc3RhcnRpbmdVcmx9LCBsb2NhdGlvbkNoYW5nZVRyaWdnZXJVcmw6JHt0aGlzLmxvY2F0aW9uQ2hhbmdlVHJpZ2dlclVybH0pYDtcbiAgICB9XG5cbiAgfVxufVxuIl19