@coolon/angular-ui-powerups 0.0.50 → 0.0.53

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 (38) hide show
  1. package/bundles/coolon-angular-ui-powerups.umd.js +392 -745
  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.metadata.json +1 -1
  6. package/esm2015/coolon-angular-ui-powerups.js +2 -2
  7. package/esm2015/index.js +2 -2
  8. package/esm2015/lib/place/components/place-outlet/place-outlet.component.js +2 -2
  9. package/esm2015/lib/place/guards/place-route.guard.js +2 -2
  10. package/esm2015/lib/place/index.js +2 -2
  11. package/esm2015/lib/place/route/parameter-definition.class.js +17 -36
  12. package/esm2015/lib/place/route/parameter-sanitiser.js +3 -4
  13. package/esm2015/lib/place/route/parameter-snapshot.js +66 -208
  14. package/esm2015/lib/place/route/route-parameter-value.js +223 -0
  15. package/esm2015/public_api.js +2 -2
  16. package/esm5/coolon-angular-ui-powerups.js +2 -2
  17. package/esm5/index.js +2 -2
  18. package/esm5/lib/place/components/place-outlet/place-outlet.component.js +2 -2
  19. package/esm5/lib/place/guards/place-route.guard.js +2 -2
  20. package/esm5/lib/place/index.js +2 -2
  21. package/esm5/lib/place/route/parameter-definition.class.js +18 -45
  22. package/esm5/lib/place/route/parameter-sanitiser.js +3 -4
  23. package/esm5/lib/place/route/parameter-snapshot.js +73 -273
  24. package/esm5/lib/place/route/route-parameter-value.js +309 -0
  25. package/esm5/public_api.js +2 -2
  26. package/fesm2015/coolon-angular-ui-powerups.js +304 -537
  27. package/fesm2015/coolon-angular-ui-powerups.js.map +1 -1
  28. package/fesm5/coolon-angular-ui-powerups.js +394 -746
  29. package/fesm5/coolon-angular-ui-powerups.js.map +1 -1
  30. package/lib/place/index.d.ts +1 -1
  31. package/lib/place/route/parameter-definition.class.d.ts +2 -2
  32. package/lib/place/route/parameter-sanitiser.d.ts +2 -2
  33. package/lib/place/route/parameter-snapshot.d.ts +6 -27
  34. package/lib/place/route/route-parameter-value.d.ts +42 -0
  35. package/package.json +1 -1
  36. package/esm2015/lib/place/route/route-parameter-sanitiser.js +0 -296
  37. package/esm5/lib/place/route/route-parameter-sanitiser.js +0 -435
  38. package/lib/place/route/route-parameter-sanitiser.d.ts +0 -44
@@ -24,4 +24,4 @@ export * from "./route/parameter-definition.class";
24
24
  export * from "./route/parameter-sanitiser";
25
25
  export * from "./route/parameter-snapshot";
26
26
  export * from "./route/parameter-type";
27
- export * from "./route/route-parameter-sanitiser";
27
+ export * from "./route/route-parameter-value";
@@ -3,6 +3,7 @@ import { PlaceHistory } from '../place-history';
3
3
  import { Visit } from '../visit';
4
4
  import { ParameterSanitiser } from './parameter-sanitiser';
5
5
  import { ParameterType } from './parameter-type';
6
+ import { RouteParameterValue } from './route-parameter-value';
6
7
  export declare abstract class ParameterDefinition<T, S = T> {
7
8
  readonly propertyName: string;
8
9
  readonly type: ParameterType<T>;
@@ -38,7 +39,6 @@ export declare namespace ParameterDefinition {
38
39
  readonly defaultValue: S;
39
40
  readonly placeHistory: PlaceHistory;
40
41
  constructor(remember: boolean, defaultValue: S, placeHistory: PlaceHistory);
41
- sanitise(parameterDef: ParameterDefinition<T, S>, value: S, visit?: Visit): Promise<S> | S;
42
- private isBlank;
42
+ sanitise(parameter: RouteParameterValue<S, any, any>, visit?: Visit): Promise<S> | S;
43
43
  }
44
44
  }
@@ -1,5 +1,5 @@
1
1
  import { Visit } from '../visit';
2
- import { ParameterDefinition } from './parameter-definition.class';
2
+ import { RouteParameterValue } from './route-parameter-value';
3
3
  export interface ParameterSanitiser<S> {
4
- sanitise(parameterDef: ParameterDefinition<any, S>, value: S, visit?: Visit): Promise<S> | S;
4
+ sanitise(paramter: RouteParameterValue<S, any, any>, visit?: Visit): Promise<S> | S;
5
5
  }
@@ -3,12 +3,13 @@ import { ParamMap, UrlSegment } from '@angular/router';
3
3
  import { PlaceDefinition } from '../place-definition';
4
4
  import { Visit } from '../visit';
5
5
  import { ParameterDefinition } from './parameter-definition.class';
6
+ import { RouteParameterValue } from './route-parameter-value';
6
7
  export declare class ParameterSnapshot implements Visit {
7
8
  readonly placeDefinition: PlaceDefinition;
8
- private readonly resolved;
9
- constructor(placeDefinition: PlaceDefinition, resolved: ParameterSnapshot.ResolvedParameter<any, any>[]);
9
+ private readonly parameters;
10
+ constructor(placeDefinition: PlaceDefinition, parameters: RouteParameterValue<any, any, any>[]);
10
11
  hasChanged(other: ParameterSnapshot, debug?: boolean): boolean;
11
- getParameter<T, S>(parameterDef: ParameterDefinition<T, S>): ParameterSnapshot.ResolvedParameter<T, S>;
12
+ getParameter<T, S>(parameterDef: ParameterDefinition<T, S>): RouteParameterValue<S, T, any>;
12
13
  getValueOf<T, S>(parameterDef: ParameterDefinition<T, S>): S;
13
14
  getRouteIdValue(): any;
14
15
  getParameterValue(name: string): any;
@@ -16,34 +17,12 @@ export declare class ParameterSnapshot implements Visit {
16
17
  private getRouteParameters;
17
18
  hasRouteId(): boolean;
18
19
  getFormattedRouteId(): string;
20
+ getNonEmptyParameters(): RouteParameterValue<any, any, any>[];
19
21
  getFormattedParameters(): {};
20
- getAllFormattedParameters(): {};
22
+ getAllParameters(): {};
21
23
  replace<T, S>(parameter: ParameterDefinition<T, S>, value: S): ParameterSnapshot;
22
24
  sanitise(injector: Injector): Promise<ParameterSnapshot>;
23
25
  }
24
26
  export declare namespace ParameterSnapshot {
25
27
  function create(placeDef: PlaceDefinition, params: ParamMap, urlSegments: UrlSegment[]): ParameterSnapshot;
26
- abstract class ResolvedParameter<T, S = T> {
27
- readonly parameterDef: ParameterDefinition<T, S>;
28
- readonly value: S;
29
- constructor(parameterDef: ParameterDefinition<T, S>, value: S);
30
- abstract injectRouteParam(dest: {}): void;
31
- abstract isSame(otherValue: S): boolean;
32
- isRouteId(): boolean;
33
- abstract formattedValue(): string | string[];
34
- abstract replace(value: S): ResolvedParameter<T, S>;
35
- sanitise(visit: Visit, injector: Injector): Promise<S>;
36
- }
37
- class ResolvedValueParameter<T> extends ResolvedParameter<T, T> {
38
- isSame(otherValue: T): boolean;
39
- injectRouteParam(dest: {}): void;
40
- replace(value: T): ParameterSnapshot.ResolvedParameter<T, T>;
41
- formattedValue(): string;
42
- }
43
- class ResolvedArrayParameter<T> extends ResolvedParameter<T, T[]> {
44
- isSame(otherValue: T[]): boolean;
45
- injectRouteParam(dest: {}): void;
46
- replace(value: T[]): ParameterSnapshot.ResolvedParameter<T, T[]>;
47
- formattedValue(): string[];
48
- }
49
28
  }
@@ -0,0 +1,42 @@
1
+ import { Injector } from '@angular/core';
2
+ import { ParamMap } from '@angular/router';
3
+ import { Visit } from '../visit';
4
+ import { ParameterDefinition } from './parameter-definition.class';
5
+ export declare abstract class RouteParameterValue<S, T, R extends string | string[]> {
6
+ readonly definition: ParameterDefinition<T, S>;
7
+ protected readonly rawValue: R;
8
+ constructor(definition: ParameterDefinition<T, S>, rawValue: R);
9
+ abstract readonly value: S;
10
+ isRouteId(): boolean;
11
+ hasChanged(otherValue: S): boolean;
12
+ /**
13
+ * Return's true if the current value is empty.
14
+ */
15
+ isEmpty(): boolean;
16
+ /**
17
+ * Returns true if the rawValue is undefined. This
18
+ */
19
+ isMissing(): boolean;
20
+ abstract isSameValue(otherValue: S): boolean;
21
+ abstract formattedValue(): string | string[];
22
+ abstract replace(value: S): RouteParameterValue<S, T, any>;
23
+ abstract isEmptyValue(value: S): boolean;
24
+ sanitise(visit: Visit, injector: Injector): Promise<S>;
25
+ }
26
+ export declare namespace RouteParameterValue {
27
+ function create<T>(def: ParameterDefinition<T, any>, paramMap: ParamMap): RouteParameterValue<any, any, any>;
28
+ class Scalar<T> extends RouteParameterValue<T, T, string> {
29
+ readonly value: T;
30
+ isSameValue(otherValue: T): boolean;
31
+ replace(value: T): RouteParameterValue<T, T, string>;
32
+ formattedValue(): string;
33
+ isEmptyValue(value: T): boolean;
34
+ }
35
+ class Array<T> extends RouteParameterValue<T[], T, string[]> {
36
+ readonly value: T[];
37
+ isSameValue(otherValue: T[]): boolean;
38
+ replace(value: T[]): RouteParameterValue<T[], T, string[]>;
39
+ formattedValue(): string[];
40
+ isEmptyValue(value: T[]): boolean;
41
+ }
42
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coolon/angular-ui-powerups",
3
- "version": "0.0.50",
3
+ "version": "0.0.53",
4
4
  "schematics": "./schematics/collection.json",
5
5
  "dependencies": {
6
6
  "ts-morph": "^3.1.3",
@@ -1,296 +0,0 @@
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 { assert, lang } from '@coolon/pectin';
7
- import { Memoize } from '@typescript-plus/fast-memoize-decorator/dist/src';
8
- import _ from 'lodash';
9
- import { ParameterDefinition } from './parameter-definition.class';
10
- /**
11
- * @template T, S
12
- */
13
- export class Sanitiser {
14
- /**
15
- * @param {?} parameterDef
16
- * @param {?} snapshot
17
- * @param {?} sanitiser
18
- */
19
- constructor(parameterDef, snapshot, sanitiser) {
20
- this.parameterDef = parameterDef;
21
- this.snapshot = snapshot;
22
- this.sanitiser = sanitiser;
23
- }
24
- /**
25
- * @return {?}
26
- */
27
- isRouteId() {
28
- return this.parameterDef.isRouteId;
29
- }
30
- /**
31
- * @return {?}
32
- */
33
- get valueChanged() {
34
- return !_.isNil(this.initialValue) && this.hasChanged(this.initialValue, this.sanitisedValue);
35
- }
36
- /**
37
- * @return {?}
38
- */
39
- get sanitisedValue() {
40
- return this._sanitisedValue;
41
- }
42
- /**
43
- * @protected
44
- * @param {?} snapshot
45
- * @return {?}
46
- */
47
- readFrom(snapshot) {
48
- return lang.abstractMethod(this.constructor);
49
- }
50
- /**
51
- * @protected
52
- * @param {?} initialValue
53
- * @param {?} sanitisedValue
54
- * @return {?}
55
- */
56
- hasChanged(initialValue, sanitisedValue) {
57
- return lang.abstractMethod(this.constructor);
58
- }
59
- /**
60
- * @param {?} dest
61
- * @return {?}
62
- */
63
- injectRouteParam(dest) {
64
- lang.abstractMethod(this.constructor);
65
- }
66
- /**
67
- * @return {?}
68
- */
69
- sanitize() {
70
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
71
- if (this.sanitiser) {
72
- this.initialValue = this.readFrom(this.snapshot);
73
- this._sanitisedValue = yield this.sanitiser.sanitise(null, this.initialValue);
74
- if (this.initialValue !== this._sanitisedValue) {
75
- return false;
76
- }
77
- }
78
- return true;
79
- });
80
- }
81
- }
82
- if (false) {
83
- /**
84
- * @type {?}
85
- * @private
86
- */
87
- Sanitiser.prototype.initialValue;
88
- /**
89
- * @type {?}
90
- * @private
91
- */
92
- Sanitiser.prototype._sanitisedValue;
93
- /** @type {?} */
94
- Sanitiser.prototype.parameterDef;
95
- /** @type {?} */
96
- Sanitiser.prototype.snapshot;
97
- /** @type {?} */
98
- Sanitiser.prototype.sanitiser;
99
- }
100
- export class RouteParameterSanitiser {
101
- /**
102
- * @param {?} parameterDefs
103
- * @param {?} snapshot
104
- * @param {?} injector
105
- */
106
- constructor(parameterDefs, snapshot, injector) {
107
- this.parameterDefs = parameterDefs;
108
- this.snapshot = snapshot;
109
- this.injector = injector;
110
- this.parameterSanitisers = [];
111
- /** @type {?} */
112
- const sanitisers = parameterDefs.map((/**
113
- * @param {?} def
114
- * @return {?}
115
- */
116
- def => {
117
- return def.isArray ?
118
- new Sanitiser.Array(def, snapshot, this.getSanitiser(def)) :
119
- new Sanitiser.Value(def, snapshot, this.getSanitiser(def));
120
- }));
121
- this.routeIdSanitiser = sanitisers.find((/**
122
- * @param {?} p
123
- * @return {?}
124
- */
125
- p => p.isRouteId()));
126
- this.parameterSanitisers = sanitisers.filter((/**
127
- * @param {?} p
128
- * @return {?}
129
- */
130
- p => !p.isRouteId()));
131
- }
132
- /**
133
- * @return {?}
134
- */
135
- sanitise() {
136
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
137
- if (this.routeIdSanitiser) {
138
- yield this.routeIdSanitiser.sanitize();
139
- if (this.routeIdSanitiser.valueChanged) {
140
- // if the route id isn't ok we redirect immediately as the query params may need to be sanitised in the
141
- // context of the route id.
142
- return false;
143
- }
144
- }
145
- for (const sanitiser of this.parameterSanitisers) {
146
- yield sanitiser.sanitize();
147
- }
148
- return !this.parameterSanitisers.find((/**
149
- * @param {?} s
150
- * @return {?}
151
- */
152
- s => s.valueChanged));
153
- });
154
- }
155
- /**
156
- * @private
157
- * @template T, S
158
- * @param {?} def
159
- * @return {?}
160
- */
161
- getSanitiser(def) {
162
- return def.getSanitiser(this.injector);
163
- }
164
- /**
165
- * @return {?}
166
- */
167
- routeIdHasChanged() {
168
- assert.isTruthy(this.parameterSanitisers.length !== 0);
169
- return this.routeIdSanitiser && this.routeIdSanitiser.valueChanged;
170
- }
171
- // @Trace()
172
- /**
173
- * @return {?}
174
- */
175
- getRedirectParams() {
176
- if (this.routeIdHasChanged()) {
177
- return [this.routeIdSanitiser.sanitisedValue];
178
- }
179
- else {
180
- /** @type {?} */
181
- const routeParams = {};
182
- this.parameterSanitisers.forEach((/**
183
- * @param {?} s
184
- * @return {?}
185
- */
186
- s => s.injectRouteParam(routeParams)));
187
- return [routeParams];
188
- }
189
- }
190
- /**
191
- * @private
192
- * @template S
193
- * @param {?} value
194
- * @return {?}
195
- */
196
- isSanitiserContructor(value) {
197
- return _.isFunction(value) && lang.constructorChain((/** @type {?} */ ((/** @type {?} */ (value))))).includes(Sanitiser);
198
- }
199
- }
200
- tslib_1.__decorate([
201
- Memoize(),
202
- tslib_1.__metadata("design:type", Function),
203
- tslib_1.__metadata("design:paramtypes", [ParameterDefinition]),
204
- tslib_1.__metadata("design:returntype", Object)
205
- ], RouteParameterSanitiser.prototype, "getSanitiser", null);
206
- if (false) {
207
- /**
208
- * @type {?}
209
- * @private
210
- */
211
- RouteParameterSanitiser.prototype.routeIdSanitiser;
212
- /**
213
- * @type {?}
214
- * @private
215
- */
216
- RouteParameterSanitiser.prototype.parameterSanitisers;
217
- /** @type {?} */
218
- RouteParameterSanitiser.prototype.parameterDefs;
219
- /** @type {?} */
220
- RouteParameterSanitiser.prototype.snapshot;
221
- /** @type {?} */
222
- RouteParameterSanitiser.prototype.injector;
223
- }
224
- (function (Sanitiser) {
225
- /**
226
- * @template T
227
- */
228
- class Value extends Sanitiser {
229
- /**
230
- * @param {?} snapshot
231
- * @return {?}
232
- */
233
- readFrom(snapshot) {
234
- /** @type {?} */
235
- const rawValue = snapshot.paramMap.get(this.parameterDef.name);
236
- return this.parameterDef.type.parse(rawValue);
237
- }
238
- /**
239
- * @protected
240
- * @param {?} initialValue
241
- * @param {?} sanitisedValue
242
- * @return {?}
243
- */
244
- hasChanged(initialValue, sanitisedValue) {
245
- return initialValue !== sanitisedValue;
246
- }
247
- /**
248
- * @param {?} dest
249
- * @return {?}
250
- */
251
- injectRouteParam(dest) {
252
- dest[this.parameterDef.name] = this.parameterDef.type.format(this.sanitisedValue);
253
- }
254
- }
255
- Sanitiser.Value = Value;
256
- /**
257
- * @template T
258
- */
259
- class Array extends Sanitiser {
260
- /**
261
- * @param {?} snapshot
262
- * @return {?}
263
- */
264
- readFrom(snapshot) {
265
- /** @type {?} */
266
- const rawValues = snapshot.paramMap.getAll(this.parameterDef.name);
267
- return rawValues.map((/**
268
- * @param {?} value
269
- * @return {?}
270
- */
271
- value => this.parameterDef.type.parse(value)));
272
- }
273
- /**
274
- * @protected
275
- * @param {?} initialValue
276
- * @param {?} sanitisedValue
277
- * @return {?}
278
- */
279
- hasChanged(initialValue, sanitisedValue) {
280
- return initialValue !== sanitisedValue;
281
- }
282
- /**
283
- * @param {?} dest
284
- * @return {?}
285
- */
286
- injectRouteParam(dest) {
287
- dest[this.parameterDef.name] = this.sanitisedValue.map((/**
288
- * @param {?} v
289
- * @return {?}
290
- */
291
- v => this.parameterDef.type.format(v)));
292
- }
293
- }
294
- Sanitiser.Array = Array;
295
- })(Sanitiser || (Sanitiser = {}));
296
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtcGFyYW1ldGVyLXNhbml0aXNlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb29sb24vYW5ndWxhci11aS1wb3dlcnVwcy8iLCJzb3VyY2VzIjpbImxpYi9wbGFjZS9yb3V0ZS9yb3V0ZS1wYXJhbWV0ZXItc2FuaXRpc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsT0FBTyxFQUFFLE1BQU0sRUFBaUIsSUFBSSxFQUFTLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQzNFLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7OztBQUduRSxNQUFNLE9BQU8sU0FBUzs7Ozs7O0lBS3BCLFlBQXFCLFlBQXVDLEVBQVcsUUFBZ0MsRUFBVyxTQUFnQztRQUE3SCxpQkFBWSxHQUFaLFlBQVksQ0FBMkI7UUFBVyxhQUFRLEdBQVIsUUFBUSxDQUF3QjtRQUFXLGNBQVMsR0FBVCxTQUFTLENBQXVCO0lBQ2xKLENBQUM7Ozs7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztJQUNyQyxDQUFDOzs7O0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDaEcsQ0FBQzs7OztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQzs7Ozs7O0lBRVMsUUFBUSxDQUFDLFFBQWdDO1FBQ2pELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDL0MsQ0FBQzs7Ozs7OztJQUVT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Z0IsU0FBUyxLQUFULFNBQVMsUUFxQ3pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0b3IsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgYXNzZXJ0LCBDb25zdHJ1Y3RhYmxlLCBsYW5nLCBUcmFjZSB9IGZyb20gJ0Bjb29sb24vcGVjdGluJztcbmltcG9ydCB7IE1lbW9pemUgfSBmcm9tICdAdHlwZXNjcmlwdC1wbHVzL2Zhc3QtbWVtb2l6ZS1kZWNvcmF0b3IvZGlzdC9zcmMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFBhcmFtZXRlckRlZmluaXRpb24gfSBmcm9tICcuL3BhcmFtZXRlci1kZWZpbml0aW9uLmNsYXNzJztcbmltcG9ydCB7IFBhcmFtZXRlclNhbml0aXNlciB9IGZyb20gJy4vcGFyYW1ldGVyLXNhbml0aXNlcic7XG5cbmV4cG9ydCBjbGFzcyBTYW5pdGlzZXI8VCwgUz4ge1xuXG4gIHByaXZhdGUgaW5pdGlhbFZhbHVlOiBTO1xuICBwcml2YXRlIF9zYW5pdGlzZWRWYWx1ZTogUztcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBwYXJhbWV0ZXJEZWY6IFBhcmFtZXRlckRlZmluaXRpb248VCwgUz4sIHJlYWRvbmx5IHNuYXBzaG90OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCByZWFkb25seSBzYW5pdGlzZXI6IFBhcmFtZXRlclNhbml0aXNlcjxTPikge1xuICB9XG5cbiAgaXNSb3V0ZUlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckRlZi5pc1JvdXRlSWQ7XG4gIH1cblxuICBnZXQgdmFsdWVDaGFuZ2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhXy5pc05pbCh0aGlzLmluaXRpYWxWYWx1ZSkgJiYgdGhpcy5oYXNDaGFuZ2VkKHRoaXMuaW5pdGlhbFZhbHVlLCB0aGlzLnNhbml0aXNlZFZhbHVlKTtcbiAgfVxuXG4gIGdldCBzYW5pdGlzZWRWYWx1ZSgpOiBTIHtcbiAgICByZXR1cm4gdGhpcy5fc2FuaXRpc2VkVmFsdWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZEZyb20oc25hcHNob3Q6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBTIHtcbiAgICByZXR1cm4gbGFuZy5hYnN0cmFjdE1ldGhvZCh0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYXNDaGFuZ2VkKGluaXRpYWxWYWx1ZTogUywgc2FuaXRpc2VkVmFsdWU6IFMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbGFuZy5hYnN0cmFjdE1ldGhvZCh0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfVxuXG4gIGluamVjdFJvdXRlUGFyYW0oZGVzdDoge30pIHtcbiAgICBsYW5nLmFic3RyYWN0TWV0aG9kKHRoaXMuY29uc3RydWN0b3IpO1xuICB9XG5cbiAgYXN5bmMgc2FuaXRpemUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuc2FuaXRpc2VyKSB7XG4gICAgICB0aGlzLmluaXRpYWxWYWx1ZSA9IHRoaXMucmVhZEZyb20odGhpcy5zbmFwc2hvdCk7XG4gICAgICB0aGlzLl9zYW5pdGlzZWRWYWx1ZSA9IGF3YWl0IHRoaXMuc2FuaXRpc2VyLnNhbml0aXNlKG51bGwsIHRoaXMuaW5pdGlhbFZhbHVlKTtcbiAgICAgIGlmICh0aGlzLmluaXRpYWxWYWx1ZSAhPT0gdGhpcy5fc2FuaXRpc2VkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5cbmV4cG9ydCBjbGFzcyBSb3V0ZVBhcmFtZXRlclNhbml0aXNlciB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSByb3V0ZUlkU2FuaXRpc2VyOiBTYW5pdGlzZXI8YW55LCBhbnk+O1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmFtZXRlclNhbml0aXNlcnM6IFNhbml0aXNlcjxhbnksIGFueT5bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHBhcmFtZXRlckRlZnM6IFBhcmFtZXRlckRlZmluaXRpb248YW55PltdLFxuICAgICAgICAgICAgICByZWFkb25seSBzbmFwc2hvdDogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcbiAgICAgICAgICAgICAgcmVhZG9ubHkgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgY29uc3Qgc2FuaXRpc2VycyA9IHBhcmFtZXRlckRlZnMubWFwKGRlZiA9PiB7XG4gICAgICByZXR1cm4gZGVmLmlzQXJyYXkgP1xuICAgICAgICBuZXcgU2FuaXRpc2VyLkFycmF5KGRlZiwgc25hcHNob3QsIHRoaXMuZ2V0U2FuaXRpc2VyKGRlZikpIDpcbiAgICAgICAgbmV3IFNhbml0aXNlci5WYWx1ZShkZWYsIHNuYXBzaG90LCB0aGlzLmdldFNhbml0aXNlcihkZWYpKTtcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlSWRTYW5pdGlzZXIgPSBzYW5pdGlzZXJzLmZpbmQocCA9PiBwLmlzUm91dGVJZCgpKTtcbiAgICB0aGlzLnBhcmFtZXRlclNhbml0aXNlcnMgPSBzYW5pdGlzZXJzLmZpbHRlcihwID0+ICFwLmlzUm91dGVJZCgpKTtcbiAgfVxuXG4gIGFzeW5jIHNhbml0aXNlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLnJvdXRlSWRTYW5pdGlzZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMucm91dGVJZFNhbml0aXNlci5zYW5pdGl6ZSgpO1xuICAgICAgaWYgKHRoaXMucm91dGVJZFNhbml0aXNlci52YWx1ZUNoYW5nZWQpIHtcbiAgICAgICAgLy8gaWYgdGhlIHJvdXRlIGlkIGlzbid0IG9rIHdlIHJlZGlyZWN0IGltbWVkaWF0ZWx5IGFzIHRoZSBxdWVyeSBwYXJhbXMgbWF5IG5lZWQgdG8gYmUgc2FuaXRpc2VkIGluIHRoZVxuICAgICAgICAvLyBjb250ZXh0IG9mIHRoZSByb3V0ZSBpZC5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHNhbml0aXNlciBvZiB0aGlzLnBhcmFtZXRlclNhbml0aXNlcnMpIHtcbiAgICAgIGF3YWl0IHNhbml0aXNlci5zYW5pdGl6ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gIXRoaXMucGFyYW1ldGVyU2FuaXRpc2Vycy5maW5kKHMgPT4gcy52YWx1ZUNoYW5nZWQpO1xuICB9XG5cbiAgQE1lbW9pemUoKVxuICBwcml2YXRlIGdldFNhbml0aXNlcjxULCBTPihkZWY6IFBhcmFtZXRlckRlZmluaXRpb248VCwgUz4pOiBQYXJhbWV0ZXJTYW5pdGlzZXI8Uz4ge1xuICAgIHJldHVybiBkZWYuZ2V0U2FuaXRpc2VyKHRoaXMuaW5qZWN0b3IpO1xuICB9XG5cbiAgcm91dGVJZEhhc0NoYW5nZWQoKTogYm9vbGVhbiB7XG4gICAgYXNzZXJ0LmlzVHJ1dGh5KHRoaXMucGFyYW1ldGVyU2FuaXRpc2Vycy5sZW5ndGggIT09IDApO1xuICAgIHJldHVybiB0aGlzLnJvdXRlSWRTYW5pdGlzZXIgJiYgdGhpcy5yb3V0ZUlkU2FuaXRpc2VyLnZhbHVlQ2hhbmdlZDtcbiAgfVxuXG4gIC8vIEBUcmFjZSgpXG4gIGdldFJlZGlyZWN0UGFyYW1zKCk6IGFueVtdIHtcbiAgICBpZiAodGhpcy5yb3V0ZUlkSGFzQ2hhbmdlZCgpKSB7XG4gICAgICByZXR1cm4gW3RoaXMucm91dGVJZFNhbml0aXNlci5zYW5pdGlzZWRWYWx1ZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJvdXRlUGFyYW1zID0ge307XG4gICAgICB0aGlzLnBhcmFtZXRlclNhbml0aXNlcnMuZm9yRWFjaChzID0+IHMuaW5qZWN0Um91dGVQYXJhbShyb3V0ZVBhcmFtcykpO1xuICAgICAgcmV0dXJuIFtyb3V0ZVBhcmFtc107XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1Nhbml0aXNlckNvbnRydWN0b3I8Uz4odmFsdWU6IGFueSk6IHZhbHVlIGlzIFR5cGU8UGFyYW1ldGVyU2FuaXRpc2VyPFM+PiB7XG4gICAgcmV0dXJuIF8uaXNGdW5jdGlvbih2YWx1ZSkgJiYgbGFuZy5jb25zdHJ1Y3RvckNoYWluKHZhbHVlIGFzIHVua25vd24gYXMgQ29uc3RydWN0YWJsZTxhbnk+KS5pbmNsdWRlcyhTYW5pdGlzZXIpO1xuICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgU2FuaXRpc2VyIHtcblxuICBleHBvcnQgY2xhc3MgVmFsdWU8VD4gZXh0ZW5kcyBTYW5pdGlzZXI8VCwgVD4ge1xuXG4gICAgcmVhZEZyb20oc25hcHNob3Q6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBUIHtcbiAgICAgIGNvbnN0IHJhd1ZhbHVlID0gc25hcHNob3QucGFyYW1NYXAuZ2V0KHRoaXMucGFyYW1ldGVyRGVmLm5hbWUpO1xuICAgICAgcmV0dXJuIHRoaXMucGFyYW1ldGVyRGVmLnR5cGUucGFyc2UocmF3VmFsdWUpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYXNDaGFuZ2VkKGluaXRpYWxWYWx1ZTogVCwgc2FuaXRpc2VkVmFsdWU6IFQpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBpbml0aWFsVmFsdWUgIT09IHNhbml0aXNlZFZhbHVlO1xuICAgIH1cblxuICAgIGluamVjdFJvdXRlUGFyYW0oZGVzdDoge30pIHtcbiAgICAgIGRlc3RbdGhpcy5wYXJhbWV0ZXJEZWYubmFtZV0gPSB0aGlzLnBhcmFtZXRlckRlZi50eXBlLmZvcm1hdCh0aGlzLnNhbml0aXNlZFZhbHVlKTtcbiAgICB9XG5cbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBBcnJheTxUPiBleHRlbmRzIFNhbml0aXNlcjxULCBUW10+IHtcblxuICAgIHJlYWRGcm9tKHNuYXBzaG90OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogVFtdIHtcbiAgICAgIGNvbnN0IHJhd1ZhbHVlcyA9IHNuYXBzaG90LnBhcmFtTWFwLmdldEFsbCh0aGlzLnBhcmFtZXRlckRlZi5uYW1lKTtcbiAgICAgIHJldHVybiByYXdWYWx1ZXMubWFwKHZhbHVlID0+IHRoaXMucGFyYW1ldGVyRGVmLnR5cGUucGFyc2UodmFsdWUpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFzQ2hhbmdlZChpbml0aWFsVmFsdWU6IFRbXSwgc2FuaXRpc2VkVmFsdWU6IFRbXSk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGluaXRpYWxWYWx1ZSAhPT0gc2FuaXRpc2VkVmFsdWU7XG4gICAgfVxuXG4gICAgaW5qZWN0Um91dGVQYXJhbShkZXN0OiB7fSkge1xuICAgICAgZGVzdFt0aGlzLnBhcmFtZXRlckRlZi5uYW1lXSA9IHRoaXMuc2FuaXRpc2VkVmFsdWUubWFwKHYgPT4gdGhpcy5wYXJhbWV0ZXJEZWYudHlwZS5mb3JtYXQodikpO1xuICAgIH1cblxuXG4gIH1cblxufVxuIl19