@coolon/angular-ui-powerups 0.0.51 → 0.0.54

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 +382 -746
  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 +11 -35
  12. package/esm2015/lib/place/route/parameter-sanitiser.js +3 -4
  13. package/esm2015/lib/place/route/parameter-snapshot.js +65 -209
  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 +12 -44
  22. package/esm5/lib/place/route/parameter-sanitiser.js +3 -4
  23. package/esm5/lib/place/route/parameter-snapshot.js +69 -274
  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 +298 -539
  27. package/fesm2015/coolon-angular-ui-powerups.js.map +1 -1
  28. package/fesm5/coolon-angular-ui-powerups.js +385 -748
  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 +5 -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
@@ -142,49 +142,25 @@ if (false) {
142
142
  this.placeHistory = placeHistory;
143
143
  }
144
144
  /**
145
- * @param {?} parameterDef
146
- * @param {?} value
145
+ * @param {?} parameter
147
146
  * @param {?=} visit
148
147
  * @return {?}
149
148
  */
150
- sanitise(parameterDef, value, visit) {
151
- if (this.isBlank(parameterDef, value)) {
152
- if (this.remember) {
153
- /** @type {?} */
154
- const visits = this.placeHistory.getHistory(visit.placeDefinition);
155
- value = visits.map((/**
156
- * @param {?} v
157
- * @return {?}
158
- */
159
- v => v.getValueOf(parameterDef)))
160
- .filter((/**
161
- * @param {?} v
162
- * @return {?}
163
- */
164
- v => !_.isNil(v)))
165
- .find((/**
166
- * @param {?} v
167
- * @return {?}
168
- */
169
- v => !this.isBlank(parameterDef, v)));
149
+ sanitise(parameter, visit) {
150
+ /** @type {?} */
151
+ let value = parameter.value;
152
+ if (parameter.isMissing()) {
153
+ /** @type {?} */
154
+ const previousVisit = _.first(this.placeHistory.getHistory(visit.placeDefinition));
155
+ if (this.remember && previousVisit) {
156
+ value = previousVisit.getValueOf(parameter.definition);
170
157
  }
171
- return this.isBlank(parameterDef, value) ? this.defaultValue : value;
158
+ return parameter.isEmptyValue(value) ? this.defaultValue : value;
172
159
  }
173
160
  else {
174
161
  return value;
175
162
  }
176
163
  }
177
- /**
178
- * @private
179
- * @param {?} def
180
- * @param {?} value
181
- * @return {?}
182
- */
183
- isBlank(def, value) {
184
- /** @type {?} */
185
- const isNil = _.isNil(value);
186
- return isNil ? true : def.isArray ? value['length'] < 1 : false;
187
- }
188
164
  }
189
165
  ParameterDefinition.DefaultParameterSanitiser = DefaultParameterSanitiser;
190
166
  if (false) {
@@ -196,4 +172,4 @@ if (false) {
196
172
  DefaultParameterSanitiser.prototype.placeHistory;
197
173
  }
198
174
  })(ParameterDefinition || (ParameterDefinition = {}));
199
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1ldGVyLWRlZmluaXRpb24uY2xhc3MuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY29vbG9uL2FuZ3VsYXItdWktcG93ZXJ1cHMvIiwic291cmNlcyI6WyJsaWIvcGxhY2Uvcm91dGUvcGFyYW1ldGVyLWRlZmluaXRpb24uY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUVBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRCxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7OztBQU1oRCxNQUFNLE9BQWdCLG1CQUFtQjs7Ozs7O0lBUXZDLFlBQXFCLFlBQW9CLEVBQVcsSUFBc0IsRUFBRSxPQUF1QztRQUE5RixpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUFXLFNBQUksR0FBSixJQUFJLENBQWtCOztjQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDOUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0QsQ0FBQzs7Ozs7SUFFRCxZQUFZLENBQUMsUUFBa0I7UUFDN0IsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDaEQsT0FBTyxJQUFJLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsR0FB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O1FBckJhLDZDQUEwQjs7UUFBRSxpREFBd0I7O1FBQUUsaURBQW1DOztBQXVCekcsQ0FBQyxFQW5EZ0IsbUJBQW1CLEtBQW5CLG1CQUFtQixRQW1EbkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhY2UgfSBmcm9tICdAY29vbG9uL3BlY3Rpbic7XG5pbXBvcnQgeyBPcHRzIH0gZnJvbSAnQGNvb2xvbi90eXBlc2NyaXB0LXV0aWxpdGllcyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgUGxhY2VIaXN0b3J5IH0gZnJvbSAnLi4vcGxhY2UtaGlzdG9yeSc7XG5pbXBvcnQgeyBWaXNpdCB9IGZyb20gJy4uL3Zpc2l0JztcbmltcG9ydCB7IFBhcmFtZXRlclNhbml0aXNlciB9IGZyb20gJy4vcGFyYW1ldGVyLXNhbml0aXNlcic7XG5pbXBvcnQgeyBQYXJhbWV0ZXJUeXBlIH0gZnJvbSAnLi9wYXJhbWV0ZXItdHlwZSc7XG5cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBhcmFtZXRlckRlZmluaXRpb248VCwgUyA9IFQ+IHtcbiAgYWJzdHJhY3QgcmVhZG9ubHkgaXNSb3V0ZUlkOiBib29sZWFuO1xuICBhYnN0cmFjdCByZWFkb25seSBpc0FycmF5OiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZW1lbWJlcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSBkZWZhdWx0VmFsdWU6IFM7XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHJlYWRvbmx5IHR5cGU6IFBhcmFtZXRlclR5cGU8VD4sIG9wdGlvbnM6IFBhcmFtZXRlckRlZmluaXRpb24uT3B0aW9uczxTPikge1xuICAgIGNvbnN0IG9wdHMgPSBPcHRzLmdldChvcHRpb25zKTtcbiAgICB0aGlzLm5hbWUgPSBvcHRzLmdldE9wdGlvbmFsKCdhcycsIHByb3BlcnR5TmFtZSk7XG4gICAgdGhpcy5yZW1lbWJlciA9IG9wdHMuZ2V0T3B0aW9uYWwoJ3JlbWVtYmVyJywgZmFsc2UpO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gb3B0cy5nZXRPcHRpb25hbCgnZGVmYXVsdFZhbHVlJywgbnVsbCk7XG4gIH1cblxuICBnZXRTYW5pdGlzZXIoaW5qZWN0b3I6IEluamVjdG9yKTogUGFyYW1ldGVyU2FuaXRpc2VyPFM+IHtcbiAgICBpZiAodGhpcy5yZW1lbWJlciB8fCAhXy5pc05pbCh0aGlzLmRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyRGVmaW5pdGlvbi5EZWZhdWx0UGFyYW1ldGVyU2FuaXRpc2VyKHRoaXMucmVtZW1iZXIsIHRoaXMuZGVmYXVsdFZhbHVlLCBpbmplY3Rvci5nZXQoUGxhY2VIaXN0b3J5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgbmFtZXNwYWNlIFBhcmFtZXRlckRlZmluaXRpb24ge1xuXG4gIGV4cG9ydCBpbnRlcmZhY2UgT3B0aW9uczxUPiB7XG4gICAgYXM/OiBzdHJpbmc7XG4gICAgb3B0aW9uYWw/OiBib29sZWFuO1xuICAgIHJlbWVtYmVyPzogYm9vbGVhbjtcbiAgICBkZWZhdWx0VmFsdWU/OiBUO1xuICAgIC8vIHNhbml0aXNlcj86IENvbnN0cnVjdGFibGU8UGFyYW1ldGVyU2FuaXRpc2VyPFQ+PiB8IFBhcmFtZXRlclNhbml0aXNlci5PcHRpb25zPFQ+O1xuICB9XG5cbiAgZXhwb3J0IGNsYXNzIFJvdXRlSWQ8VD4gZXh0ZW5kcyBQYXJhbWV0ZXJEZWZpbml0aW9uPFQ+IHtcbiAgICByZWFkb25seSBpc1JvdXRlSWQgPSB0cnVlO1xuICAgIHJlYWRvbmx5IGlzQXJyYXkgPSBmYWxzZTtcbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBWYWx1ZVBhcmFtZXRlcjxUPiBleHRlbmRzIFBhcmFtZXRlckRlZmluaXRpb248VD4ge1xuICAgIHJlYWRvbmx5IGlzUm91dGVJZCA9IGZhbHNlO1xuICAgIHJlYWRvbmx5IGlzQXJyYXkgPSBmYWxzZTtcbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBBcnJheVBhcmFtZXRlcjxUPiBleHRlbmRzIFBhcmFtZXRlckRlZmluaXRpb248VCwgVFtdPiB7XG4gICAgcmVhZG9ubHkgaXNSb3V0ZUlkID0gZmFsc2U7XG4gICAgcmVhZG9ubHkgaXNBcnJheSA9IHRydWU7XG4gIH1cblxuXG4gIGV4cG9ydCBjbGFzcyBEZWZhdWx0UGFyYW1ldGVyU2FuaXRpc2VyPFQsIFM+IGltcGxlbWVudHMgUGFyYW1ldGVyU2FuaXRpc2VyPFM+IHtcblxuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHJlbWVtYmVyOiBib29sZWFuLCByZWFkb25seSBkZWZhdWx0VmFsdWU6IFMsIHJlYWRvbmx5IHBsYWNlSGlzdG9yeTogUGxhY2VIaXN0b3J5KSB7XG4gICAgfVxuXG4gICAgc2FuaXRpc2UocGFyYW1ldGVyRGVmOiBQYXJhbWV0ZXJEZWZpbml0aW9uPFQsIFM+LCB2YWx1ZTogUywgdmlzaXQ/OiBWaXNpdCk6IFByb21pc2U8Uz4gfCBTIHtcbiAgICAgIGlmICh0aGlzLmlzQmxhbmsocGFyYW1ldGVyRGVmLCB2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHRoaXMucmVtZW1iZXIpIHtcbiAgICAgICAgICBjb25zdCB2aXNpdHMgPSB0aGlzLnBsYWNlSGlzdG9yeS5nZXRIaXN0b3J5KHZpc2l0LnBsYWNlRGVmaW5pdGlvbik7XG4gICAgICAgICAgdmFsdWUgPSB2aXNpdHMubWFwKHYgPT4gdi5nZXRWYWx1ZU9mKHBhcmFtZXRlckRlZikpXG4gICAgICAgICAgICAuZmlsdGVyKHYgPT4gIV8uaXNOaWwodikpXG4gICAgICAgICAgICAuZmluZCh2ID0+ICF0aGlzLmlzQmxhbmsocGFyYW1ldGVyRGVmLCB2KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNCbGFuayhwYXJhbWV0ZXJEZWYsIHZhbHVlKSA/IHRoaXMuZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0JsYW5rKGRlZjogUGFyYW1ldGVyRGVmaW5pdGlvbjxULCBTPiwgdmFsdWU6IFMpIHtcbiAgICAgIGNvbnN0IGlzTmlsID0gXy5pc05pbCh2YWx1ZSk7XG4gICAgICByZXR1cm4gaXNOaWwgPyB0cnVlIDogZGVmLmlzQXJyYXkgPyB2YWx1ZVsnbGVuZ3RoJ10gPCAxIDogZmFsc2U7XG4gICAgfVxuICB9XG5cbn1cbiJdfQ==
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1ldGVyLWRlZmluaXRpb24uY2xhc3MuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY29vbG9uL2FuZ3VsYXItdWktcG93ZXJ1cHMvIiwic291cmNlcyI6WyJsaWIvcGxhY2Uvcm91dGUvcGFyYW1ldGVyLWRlZmluaXRpb24uY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUVBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRCxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7OztBQU9oRCxNQUFNLE9BQWdCLG1CQUFtQjs7Ozs7O0lBUXZDLFlBQXFCLFlBQW9CLEVBQVcsSUFBc0IsRUFBRSxPQUF1QztRQUE5RixpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUFXLFNBQUksR0FBSixJQUFJLENBQWtCOztjQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDOUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0QsQ0FBQzs7Ozs7SUFFRCxZQUFZLENBQUMsUUFBa0I7UUFDN0IsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDaEQsT0FBTyxJQUFJLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7U0FDeEg7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDO0NBQ0Y7OztJQXJCQyx3Q0FBcUM7O0lBQ3JDLHNDQUFtQzs7SUFFbkMsbUNBQXNCOzs7OztJQUN0Qix1Q0FBMEI7Ozs7O0lBQzFCLDJDQUF3Qjs7SUFFWiwyQ0FBNkI7O0lBQUUsbUNBQStCOztBQWdCNUUsV0FBaUIsbUJBQW1COzs7OztJQUVsQyxzQkFNQzs7OztRQUxDLHFCQUFZOztRQUNaLDJCQUFtQjs7UUFDbkIsMkJBQW1COztRQUNuQiwrQkFBaUI7Ozs7O0lBSW5CLE1BQWEsT0FBVyxTQUFRLG1CQUFzQjtRQUF0RDs7WUFDVyxjQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ2pCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDM0IsQ0FBQztLQUFBO0lBSFksMkJBQU8sVUFHbkIsQ0FBQTs7O1FBRkMsNEJBQTBCOztRQUMxQiwwQkFBeUI7Ozs7O0lBRzNCLE1BQWEsY0FBa0IsU0FBUSxtQkFBc0I7UUFBN0Q7O1lBQ1csY0FBUyxHQUFHLEtBQUssQ0FBQztZQUNsQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQzNCLENBQUM7S0FBQTtJQUhZLGtDQUFjLGlCQUcxQixDQUFBOzs7UUFGQyxtQ0FBMkI7O1FBQzNCLGlDQUF5Qjs7Ozs7SUFHM0IsTUFBYSxjQUFrQixTQUFRLG1CQUEyQjtRQUFsRTs7WUFDVyxjQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ2xCLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFDMUIsQ0FBQztLQUFBO0lBSFksa0NBQWMsaUJBRzFCLENBQUE7OztRQUZDLG1DQUEyQjs7UUFDM0IsaUNBQXdCOzs7OztJQUkxQixNQUFhLHlCQUF5Qjs7Ozs7O1FBRXBDLFlBQXFCLFFBQWlCLEVBQVcsWUFBZSxFQUFXLFlBQTBCO1lBQWhGLGFBQVEsR0FBUixRQUFRLENBQVM7WUFBVyxpQkFBWSxHQUFaLFlBQVksQ0FBRztZQUFXLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQ3JHLENBQUM7Ozs7OztRQUVELFFBQVEsQ0FBQyxTQUEyQyxFQUFFLEtBQWE7O2dCQUM3RCxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUs7WUFDM0IsSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFLEVBQUU7O3NCQUNuQixhQUFhLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ2xGLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxhQUFhLEVBQUU7b0JBQ2xDLEtBQUssR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDeEQ7Z0JBQ0QsT0FBTyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7YUFDbEU7aUJBQU07Z0JBQ0wsT0FBTyxLQUFLLENBQUM7YUFDZDtRQUNILENBQUM7S0FDRjtJQWpCWSw2Q0FBeUIsNEJBaUJyQyxDQUFBOzs7UUFmYSw2Q0FBMEI7O1FBQUUsaURBQXdCOztRQUFFLGlEQUFtQzs7QUFpQnpHLENBQUMsRUE3Q2dCLG1CQUFtQixLQUFuQixtQkFBbUIsUUE2Q25DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYWNlIH0gZnJvbSAnQGNvb2xvbi9wZWN0aW4nO1xuaW1wb3J0IHsgT3B0cyB9IGZyb20gJ0Bjb29sb24vdHlwZXNjcmlwdC11dGlsaXRpZXMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFBsYWNlSGlzdG9yeSB9IGZyb20gJy4uL3BsYWNlLWhpc3RvcnknO1xuaW1wb3J0IHsgVmlzaXQgfSBmcm9tICcuLi92aXNpdCc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJTYW5pdGlzZXIgfSBmcm9tICcuL3BhcmFtZXRlci1zYW5pdGlzZXInO1xuaW1wb3J0IHsgUGFyYW1ldGVyVHlwZSB9IGZyb20gJy4vcGFyYW1ldGVyLXR5cGUnO1xuaW1wb3J0IHsgUm91dGVQYXJhbWV0ZXJWYWx1ZSB9IGZyb20gJy4vcm91dGUtcGFyYW1ldGVyLXZhbHVlJztcblxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUGFyYW1ldGVyRGVmaW5pdGlvbjxULCBTID0gVD4ge1xuICBhYnN0cmFjdCByZWFkb25seSBpc1JvdXRlSWQ6IGJvb2xlYW47XG4gIGFic3RyYWN0IHJlYWRvbmx5IGlzQXJyYXk6IGJvb2xlYW47XG5cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlbWVtYmVyOiBib29sZWFuO1xuICBwcml2YXRlIGRlZmF1bHRWYWx1ZTogUztcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcmVhZG9ubHkgdHlwZTogUGFyYW1ldGVyVHlwZTxUPiwgb3B0aW9uczogUGFyYW1ldGVyRGVmaW5pdGlvbi5PcHRpb25zPFM+KSB7XG4gICAgY29uc3Qgb3B0cyA9IE9wdHMuZ2V0KG9wdGlvbnMpO1xuICAgIHRoaXMubmFtZSA9IG9wdHMuZ2V0T3B0aW9uYWwoJ2FzJywgcHJvcGVydHlOYW1lKTtcbiAgICB0aGlzLnJlbWVtYmVyID0gb3B0cy5nZXRPcHRpb25hbCgncmVtZW1iZXInLCBmYWxzZSk7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBvcHRzLmdldE9wdGlvbmFsKCdkZWZhdWx0VmFsdWUnLCBudWxsKTtcbiAgfVxuXG4gIGdldFNhbml0aXNlcihpbmplY3RvcjogSW5qZWN0b3IpOiBQYXJhbWV0ZXJTYW5pdGlzZXI8Uz4ge1xuICAgIGlmICh0aGlzLnJlbWVtYmVyIHx8ICFfLmlzTmlsKHRoaXMuZGVmYXVsdFZhbHVlKSkge1xuICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJEZWZpbml0aW9uLkRlZmF1bHRQYXJhbWV0ZXJTYW5pdGlzZXIodGhpcy5yZW1lbWJlciwgdGhpcy5kZWZhdWx0VmFsdWUsIGluamVjdG9yLmdldChQbGFjZUhpc3RvcnkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUGFyYW1ldGVyRGVmaW5pdGlvbiB7XG5cbiAgZXhwb3J0IGludGVyZmFjZSBPcHRpb25zPFQ+IHtcbiAgICBhcz86IHN0cmluZztcbiAgICBvcHRpb25hbD86IGJvb2xlYW47XG4gICAgcmVtZW1iZXI/OiBib29sZWFuO1xuICAgIGRlZmF1bHRWYWx1ZT86IFQ7XG4gICAgLy8gc2FuaXRpc2VyPzogQ29uc3RydWN0YWJsZTxQYXJhbWV0ZXJTYW5pdGlzZXI8VD4+IHwgUGFyYW1ldGVyU2FuaXRpc2VyLk9wdGlvbnM8VD47XG4gIH1cblxuICBleHBvcnQgY2xhc3MgUm91dGVJZDxUPiBleHRlbmRzIFBhcmFtZXRlckRlZmluaXRpb248VD4ge1xuICAgIHJlYWRvbmx5IGlzUm91dGVJZCA9IHRydWU7XG4gICAgcmVhZG9ubHkgaXNBcnJheSA9IGZhbHNlO1xuICB9XG5cbiAgZXhwb3J0IGNsYXNzIFZhbHVlUGFyYW1ldGVyPFQ+IGV4dGVuZHMgUGFyYW1ldGVyRGVmaW5pdGlvbjxUPiB7XG4gICAgcmVhZG9ubHkgaXNSb3V0ZUlkID0gZmFsc2U7XG4gICAgcmVhZG9ubHkgaXNBcnJheSA9IGZhbHNlO1xuICB9XG5cbiAgZXhwb3J0IGNsYXNzIEFycmF5UGFyYW1ldGVyPFQ+IGV4dGVuZHMgUGFyYW1ldGVyRGVmaW5pdGlvbjxULCBUW10+IHtcbiAgICByZWFkb25seSBpc1JvdXRlSWQgPSBmYWxzZTtcbiAgICByZWFkb25seSBpc0FycmF5ID0gdHJ1ZTtcbiAgfVxuXG5cbiAgZXhwb3J0IGNsYXNzIERlZmF1bHRQYXJhbWV0ZXJTYW5pdGlzZXI8VCwgUz4gaW1wbGVtZW50cyBQYXJhbWV0ZXJTYW5pdGlzZXI8Uz4ge1xuXG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgcmVtZW1iZXI6IGJvb2xlYW4sIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZTogUywgcmVhZG9ubHkgcGxhY2VIaXN0b3J5OiBQbGFjZUhpc3RvcnkpIHtcbiAgICB9XG5cbiAgICBzYW5pdGlzZShwYXJhbWV0ZXI6IFJvdXRlUGFyYW1ldGVyVmFsdWU8UywgYW55LCBhbnk+LCB2aXNpdD86IFZpc2l0KTogUHJvbWlzZTxTPiB8IFMge1xuICAgICAgbGV0IHZhbHVlID0gcGFyYW1ldGVyLnZhbHVlO1xuICAgICAgaWYgKHBhcmFtZXRlci5pc01pc3NpbmcoKSkge1xuICAgICAgICBjb25zdCBwcmV2aW91c1Zpc2l0ID0gXy5maXJzdCh0aGlzLnBsYWNlSGlzdG9yeS5nZXRIaXN0b3J5KHZpc2l0LnBsYWNlRGVmaW5pdGlvbikpO1xuICAgICAgICBpZiAodGhpcy5yZW1lbWJlciAmJiBwcmV2aW91c1Zpc2l0KSB7XG4gICAgICAgICAgdmFsdWUgPSBwcmV2aW91c1Zpc2l0LmdldFZhbHVlT2YocGFyYW1ldGVyLmRlZmluaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJhbWV0ZXIuaXNFbXB0eVZhbHVlKHZhbHVlKSA/IHRoaXMuZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn1cbiJdfQ==
@@ -9,11 +9,10 @@
9
9
  export function ParameterSanitiser() { }
10
10
  if (false) {
11
11
  /**
12
- * @param {?} parameterDef
13
- * @param {?} value
12
+ * @param {?} paramter
14
13
  * @param {?=} visit
15
14
  * @return {?}
16
15
  */
17
- ParameterSanitiser.prototype.sanitise = function (parameterDef, value, visit) { };
16
+ ParameterSanitiser.prototype.sanitise = function (paramter, visit) { };
18
17
  }
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1ldGVyLXNhbml0aXNlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb29sb24vYW5ndWxhci11aS1wb3dlcnVwcy8iLCJzb3VyY2VzIjpbImxpYi9wbGFjZS9yb3V0ZS9wYXJhbWV0ZXItc2FuaXRpc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBR0Esd0NBRUM7Ozs7Ozs7O0lBREMsa0ZBQTZGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmlzaXQgfSBmcm9tICcuLi92aXNpdCc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJEZWZpbml0aW9uIH0gZnJvbSAnLi9wYXJhbWV0ZXItZGVmaW5pdGlvbi5jbGFzcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyYW1ldGVyU2FuaXRpc2VyPFM+IHtcbiAgc2FuaXRpc2UocGFyYW1ldGVyRGVmOiBQYXJhbWV0ZXJEZWZpbml0aW9uPGFueSwgUz4sIHZhbHVlOiBTLCB2aXNpdD86IFZpc2l0KTogUHJvbWlzZTxTPiB8IFM7XG59XG4iXX0=
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1ldGVyLXNhbml0aXNlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb29sb24vYW5ndWxhci11aS1wb3dlcnVwcy8iLCJzb3VyY2VzIjpbImxpYi9wbGFjZS9yb3V0ZS9wYXJhbWV0ZXItc2FuaXRpc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBR0Esd0NBRUM7Ozs7Ozs7SUFEQyx1RUFBb0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWaXNpdCB9IGZyb20gJy4uL3Zpc2l0JztcbmltcG9ydCB7IFJvdXRlUGFyYW1ldGVyVmFsdWUgfSBmcm9tICcuL3JvdXRlLXBhcmFtZXRlci12YWx1ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyYW1ldGVyU2FuaXRpc2VyPFM+IHtcbiAgc2FuaXRpc2UocGFyYW10ZXI6IFJvdXRlUGFyYW1ldGVyVmFsdWU8UywgYW55LCBhbnk+LCB2aXNpdD86IFZpc2l0KTogUHJvbWlzZTxTPiB8IFM7XG59XG4iXX0=
@@ -4,17 +4,18 @@ var _a;
4
4
  * @fileoverview added by tsickle
5
5
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
6
6
  */
7
+ import { Trace } from '@coolon/pectin';
7
8
  import { Memoize } from '@typescript-plus/fast-memoize-decorator/dist/src';
8
- import _ from 'lodash';
9
9
  import { ParameterDefinition } from './parameter-definition.class';
10
+ import { RouteParameterValue } from './route-parameter-value';
10
11
  export class ParameterSnapshot {
11
12
  /**
12
13
  * @param {?} placeDefinition
13
- * @param {?} resolved
14
+ * @param {?} parameters
14
15
  */
15
- constructor(placeDefinition, resolved) {
16
+ constructor(placeDefinition, parameters) {
16
17
  this.placeDefinition = placeDefinition;
17
- this.resolved = resolved;
18
+ this.parameters = parameters;
18
19
  }
19
20
  /**
20
21
  * @param {?} other
@@ -23,18 +24,18 @@ export class ParameterSnapshot {
23
24
  */
24
25
  hasChanged(other, debug = false) {
25
26
  /** @type {?} */
26
- const changed = this.resolved.find((/**
27
+ const changed = this.parameters.find((/**
27
28
  * @param {?} r
28
29
  * @return {?}
29
30
  */
30
31
  (r) => {
31
- return !r.isSame(other.getValueOf(r.parameterDef));
32
+ return r.hasChanged(other.getValueOf(r.definition));
32
33
  }));
33
34
  if (changed && debug) {
34
35
  console.log({
35
- name: changed.parameterDef.name,
36
+ name: changed.definition.name,
36
37
  mine: changed.value,
37
- theirs: other.getValueOf(changed.parameterDef)
38
+ theirs: other.getValueOf(changed.definition)
38
39
  });
39
40
  }
40
41
  return !!changed;
@@ -45,11 +46,11 @@ export class ParameterSnapshot {
45
46
  * @return {?}
46
47
  */
47
48
  getParameter(parameterDef) {
48
- return this.resolved.find((/**
49
+ return this.parameters.find((/**
49
50
  * @param {?} r
50
51
  * @return {?}
51
52
  */
52
- r => r.parameterDef === parameterDef));
53
+ r => r.definition === parameterDef));
53
54
  }
54
55
  /**
55
56
  * @template T, S
@@ -73,11 +74,11 @@ export class ParameterSnapshot {
73
74
  */
74
75
  getParameterValue(name) {
75
76
  /** @type {?} */
76
- const resolvedParameter = this.resolved.find((/**
77
+ const resolvedParameter = this.parameters.find((/**
77
78
  * @param {?} r
78
79
  * @return {?}
79
80
  */
80
- r => r.parameterDef.name === name));
81
+ r => r.definition.name === name));
81
82
  return resolvedParameter ? resolvedParameter.value : null;
82
83
  }
83
84
  /**
@@ -87,22 +88,22 @@ export class ParameterSnapshot {
87
88
  getRouteIdParameter() {
88
89
  // RouteId's are never arrays: see parameter-decorators.ts createDefinition methods. It would be nice to
89
90
  // capture this in the type system though
90
- return (/** @type {?} */ (this.resolved.find((/**
91
+ return (/** @type {?} */ (this.parameters.find((/**
91
92
  * @param {?} p
92
93
  * @return {?}
93
94
  */
94
- p => p.parameterDef.isRouteId))));
95
+ p => p.definition.isRouteId))));
95
96
  }
96
97
  /**
97
98
  * @private
98
99
  * @return {?}
99
100
  */
100
101
  getRouteParameters() {
101
- return this.resolved.filter((/**
102
+ return this.parameters.filter((/**
102
103
  * @param {?} r
103
104
  * @return {?}
104
105
  */
105
- r => !r.parameterDef.isRouteId));
106
+ r => !r.definition.isRouteId));
106
107
  }
107
108
  /**
108
109
  * @return {?}
@@ -121,37 +122,31 @@ export class ParameterSnapshot {
121
122
  /**
122
123
  * @return {?}
123
124
  */
124
- getFormattedParameters() {
125
- /** @type {?} */
126
- const params = {};
127
- /** @type {?} */
128
- const routeIdParam = this.resolved.filter((/**
129
- * @param {?} p
130
- * @return {?}
131
- */
132
- p => !p.parameterDef.isRouteId)).forEach((/**
125
+ getNonEmptyParameters() {
126
+ return this.parameters.filter((/**
133
127
  * @param {?} p
134
128
  * @return {?}
135
129
  */
136
- p => {
137
- params[p.parameterDef.name] = p.formattedValue();
138
- }));
139
- return params;
130
+ p => !p.isEmpty()));
140
131
  }
141
132
  /**
142
133
  * @return {?}
143
134
  */
144
- getAllFormattedParameters() {
135
+ getFormattedParameters() {
145
136
  /** @type {?} */
146
137
  const params = {};
147
138
  /** @type {?} */
148
- const routeIdParam = this.resolved.forEach((/**
139
+ const routeIdParam = this.getNonEmptyParameters()
140
+ .filter((/**
149
141
  * @param {?} p
150
142
  * @return {?}
151
143
  */
152
- p => {
153
- params[p.parameterDef.name] = p.formattedValue();
154
- }));
144
+ p => !p.definition.isRouteId))
145
+ .forEach((/**
146
+ * @param {?} p
147
+ * @return {?}
148
+ */
149
+ p => params[p.definition.name] = p.formattedValue()));
155
150
  return params;
156
151
  }
157
152
  /**
@@ -161,12 +156,12 @@ export class ParameterSnapshot {
161
156
  /** @type {?} */
162
157
  const params = {};
163
158
  /** @type {?} */
164
- const routeIdParam = this.resolved.forEach((/**
159
+ const routeIdParam = this.parameters.forEach((/**
165
160
  * @param {?} p
166
161
  * @return {?}
167
162
  */
168
163
  p => {
169
- params[p.parameterDef.name] = p.value;
164
+ params[p.definition.name] = p.value;
170
165
  }));
171
166
  return params;
172
167
  }
@@ -177,12 +172,12 @@ export class ParameterSnapshot {
177
172
  * @return {?}
178
173
  */
179
174
  replace(parameter, value) {
180
- return new ParameterSnapshot(this.placeDefinition, this.resolved.map((/**
175
+ return new ParameterSnapshot(this.placeDefinition, this.parameters.map((/**
181
176
  * @param {?} p
182
177
  * @return {?}
183
178
  */
184
179
  p => {
185
- return p.parameterDef === parameter ? p.replace(value) : p;
180
+ return p.definition === parameter ? p.replace(value) : p;
186
181
  })));
187
182
  }
188
183
  /**
@@ -196,10 +191,10 @@ export class ParameterSnapshot {
196
191
  const routeId = this.getRouteIdParameter();
197
192
  /** @type {?} */
198
193
  const sanitisedValue = yield routeId.sanitise(this, injector);
199
- if (!routeId.isSame(sanitisedValue)) {
194
+ if (routeId.hasChanged(sanitisedValue)) {
200
195
  // if the route id has changed we redirect immediately as other
201
196
  // parameter sanitisers might use it.
202
- return this.replace(routeId.parameterDef, sanitisedValue);
197
+ return this.replace(routeId.definition, sanitisedValue);
203
198
  }
204
199
  }
205
200
  /** @type {?} */
@@ -211,8 +206,8 @@ export class ParameterSnapshot {
211
206
  const routeParameter = routeParameters[i];
212
207
  /** @type {?} */
213
208
  const sanitisedValue = yield routeParameter.sanitise(this, injector);
214
- if (!routeParameter.isSame(sanitisedValue)) {
215
- result = result.replace(routeParameter.parameterDef, sanitisedValue);
209
+ if (routeParameter.hasChanged(sanitisedValue)) {
210
+ result = result.replace(routeParameter.definition, sanitisedValue);
216
211
  }
217
212
  }
218
213
  return result;
@@ -223,7 +218,7 @@ tslib_1.__decorate([
223
218
  Memoize(),
224
219
  tslib_1.__metadata("design:type", Function),
225
220
  tslib_1.__metadata("design:paramtypes", [ParameterDefinition]),
226
- tslib_1.__metadata("design:returntype", ParameterSnapshot.ResolvedParameter)
221
+ tslib_1.__metadata("design:returntype", RouteParameterValue)
227
222
  ], ParameterSnapshot.prototype, "getParameter", null);
228
223
  tslib_1.__decorate([
229
224
  Memoize(),
@@ -241,7 +236,7 @@ tslib_1.__decorate([
241
236
  Memoize(),
242
237
  tslib_1.__metadata("design:type", Function),
243
238
  tslib_1.__metadata("design:paramtypes", []),
244
- tslib_1.__metadata("design:returntype", ParameterSnapshot.ResolvedValueParameter)
239
+ tslib_1.__metadata("design:returntype", RouteParameterValue.Scalar)
245
240
  ], ParameterSnapshot.prototype, "getRouteIdParameter", null);
246
241
  tslib_1.__decorate([
247
242
  Memoize(),
@@ -249,6 +244,12 @@ tslib_1.__decorate([
249
244
  tslib_1.__metadata("design:paramtypes", []),
250
245
  tslib_1.__metadata("design:returntype", Array)
251
246
  ], ParameterSnapshot.prototype, "getRouteParameters", null);
247
+ tslib_1.__decorate([
248
+ Trace(),
249
+ tslib_1.__metadata("design:type", Function),
250
+ tslib_1.__metadata("design:paramtypes", []),
251
+ tslib_1.__metadata("design:returntype", void 0)
252
+ ], ParameterSnapshot.prototype, "getFormattedParameters", null);
252
253
  if (false) {
253
254
  /** @type {?} */
254
255
  ParameterSnapshot.prototype.placeDefinition;
@@ -256,7 +257,7 @@ if (false) {
256
257
  * @type {?}
257
258
  * @private
258
259
  */
259
- ParameterSnapshot.prototype.resolved;
260
+ ParameterSnapshot.prototype.parameters;
260
261
  }
261
262
  (function (ParameterSnapshot) {
262
263
  /**
@@ -269,31 +270,11 @@ if (false) {
269
270
  /** @type {?} */
270
271
  const paramMap = new ConsolidatedParameterMap(params, urlSegments);
271
272
  /** @type {?} */
272
- const resolvedParameters = placeDef.getRouteParameters()
273
- .map((/**
273
+ const resolvedParameters = placeDef.getRouteParameters().map((/**
274
274
  * @param {?} def
275
275
  * @return {?}
276
276
  */
277
- def => {
278
- if (def.isArray) {
279
- /** @type {?} */
280
- const value = paramMap.has(def.name) ? paramMap.getAll(def.name).filter((/**
281
- * @param {?} s
282
- * @return {?}
283
- */
284
- s => !_.isEmpty(s))).map((/**
285
- * @param {?} raw
286
- * @return {?}
287
- */
288
- raw => def.type.parse(raw))) : null;
289
- return new ResolvedArrayParameter(def, value);
290
- }
291
- else {
292
- /** @type {?} */
293
- const value = paramMap.has(def.name) ? def.type.parse(paramMap.get(def.name)) : null;
294
- return new ResolvedValueParameter(def, value);
295
- }
296
- }));
277
+ def => RouteParameterValue.create(def, paramMap)));
297
278
  return new ParameterSnapshot(placeDef, resolvedParameters);
298
279
  }
299
280
  ParameterSnapshot.create = create;
@@ -351,7 +332,23 @@ if (false) {
351
332
  */
352
333
  m => m.has(name)));
353
334
  }
335
+ /**
336
+ * @return {?}
337
+ */
338
+ get keys() {
339
+ return this.paramMaps.reduce((/**
340
+ * @param {?} result
341
+ * @param {?} params
342
+ * @return {?}
343
+ */
344
+ (result, params) => result.concat(params.keys)), []);
345
+ }
354
346
  }
347
+ tslib_1.__decorate([
348
+ Memoize(),
349
+ tslib_1.__metadata("design:type", Array),
350
+ tslib_1.__metadata("design:paramtypes", [])
351
+ ], ConsolidatedParameterMap.prototype, "keys", null);
355
352
  if (false) {
356
353
  /**
357
354
  * @type {?}
@@ -403,146 +400,5 @@ if (false) {
403
400
  */
404
401
  ParamMapAdapter.prototype.params;
405
402
  }
406
- /**
407
- * @abstract
408
- * @template T, S
409
- */
410
- class ResolvedParameter {
411
- /**
412
- * @param {?} parameterDef
413
- * @param {?} value
414
- */
415
- constructor(parameterDef, value) {
416
- this.parameterDef = parameterDef;
417
- this.value = value;
418
- }
419
- /**
420
- * @return {?}
421
- */
422
- isRouteId() {
423
- return this.parameterDef.isRouteId;
424
- }
425
- /**
426
- * @param {?} visit
427
- * @param {?} injector
428
- * @return {?}
429
- */
430
- sanitise(visit, injector) {
431
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
432
- /** @type {?} */
433
- const sanitiser = this.parameterDef.getSanitiser(injector);
434
- if (sanitiser) {
435
- return sanitiser.sanitise(this.parameterDef, this.value, visit);
436
- }
437
- else {
438
- return this.value;
439
- }
440
- });
441
- }
442
- }
443
- ParameterSnapshot.ResolvedParameter = ResolvedParameter;
444
- if (false) {
445
- /** @type {?} */
446
- ResolvedParameter.prototype.parameterDef;
447
- /** @type {?} */
448
- ResolvedParameter.prototype.value;
449
- /**
450
- * @abstract
451
- * @param {?} dest
452
- * @return {?}
453
- */
454
- ResolvedParameter.prototype.injectRouteParam = function (dest) { };
455
- /**
456
- * @abstract
457
- * @param {?} otherValue
458
- * @return {?}
459
- */
460
- ResolvedParameter.prototype.isSame = function (otherValue) { };
461
- /**
462
- * @abstract
463
- * @return {?}
464
- */
465
- ResolvedParameter.prototype.formattedValue = function () { };
466
- /**
467
- * @abstract
468
- * @param {?} value
469
- * @return {?}
470
- */
471
- ResolvedParameter.prototype.replace = function (value) { };
472
- }
473
- /**
474
- * @template T
475
- */
476
- class ResolvedValueParameter extends ResolvedParameter {
477
- /**
478
- * @param {?} otherValue
479
- * @return {?}
480
- */
481
- isSame(otherValue) {
482
- return this.value === otherValue;
483
- }
484
- /**
485
- * @param {?} dest
486
- * @return {?}
487
- */
488
- injectRouteParam(dest) {
489
- dest[this.parameterDef.name] = this.parameterDef.type.format(this.value);
490
- }
491
- /**
492
- * @param {?} value
493
- * @return {?}
494
- */
495
- replace(value) {
496
- return new ResolvedValueParameter(this.parameterDef, value);
497
- }
498
- /**
499
- * @return {?}
500
- */
501
- formattedValue() {
502
- return !_.isNil(this.value) ? this.parameterDef.type.format(this.value) : null;
503
- }
504
- }
505
- ParameterSnapshot.ResolvedValueParameter = ResolvedValueParameter;
506
- /**
507
- * @template T
508
- */
509
- class ResolvedArrayParameter extends ResolvedParameter {
510
- /**
511
- * @param {?} otherValue
512
- * @return {?}
513
- */
514
- isSame(otherValue) {
515
- return _.isEqual(this.value, otherValue);
516
- }
517
- /**
518
- * @param {?} dest
519
- * @return {?}
520
- */
521
- injectRouteParam(dest) {
522
- dest[this.parameterDef.name] = this.value.map((/**
523
- * @param {?} v
524
- * @return {?}
525
- */
526
- v => this.parameterDef.type.format(v)));
527
- }
528
- /**
529
- * @param {?} value
530
- * @return {?}
531
- */
532
- replace(value) {
533
- return new ResolvedArrayParameter(this.parameterDef, value);
534
- }
535
- /**
536
- * @return {?}
537
- */
538
- formattedValue() {
539
- return this.value ? this.value.map((/**
540
- * @param {?} v
541
- * @return {?}
542
- */
543
- v => this.parameterDef.type.format(v))) : [];
544
- }
545
- }
546
- ParameterSnapshot.ResolvedArrayParameter = ResolvedArrayParameter;
547
403
  })(ParameterSnapshot || (ParameterSnapshot = {}));
548
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1ldGVyLXNuYXBzaG90LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvb2xvbi9hbmd1bGFyLXVpLXBvd2VydXBzLyIsInNvdXJjZXMiOlsibGliL3BsYWNlL3JvdXRlL3BhcmFtZXRlci1zbmFwc2hvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDM0UsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRW5FLE1BQU0sT0FBTyxpQkFBaUI7Ozs7O0lBRTVCLFlBQXFCLGVBQWdDLEVBQW1CLFFBQXlEO1FBQTVHLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUFtQixhQUFRLEdBQVIsUUFBUSxDQUFpRDtJQUNqSSxDQUFDOzs7Ozs7SUFFRCxVQUFVLENBQUMsS0FBd0IsRUFBRSxLQUFLLEdBQUcsS0FBSzs7Y0FDMUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSTs7OztRQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDdkMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUNyRCxDQUFDLEVBQUM7UUFDRixJQUFJLE9BQU8sSUFBSSxLQUFLLEVBQUU7WUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDVixJQUFJLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJO2dCQUMvQixJQUFJLEVBQUUsT0FBTyxDQUFDLEtBQUs7Z0JBQ25CLE1BQU0sRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7YUFDL0MsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDbkIsQ0FBQzs7Ozs7O0lBR0QsWUFBWSxDQUFP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QUUsQ0FBQztRQUNqRixDQUFDO0tBRUY7SUFsQlksd0NBQXNCLHlCQWtCbEMsQ0FBQTtBQUVILENBQUMsRUF0SWdCLGlCQUFpQixLQUFqQixpQkFBaUIsUUFzSWpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIFBhcmFtTWFwLCBVcmxTZWdtZW50IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFRyYWNlIH0gZnJvbSAnQGNvb2xvbi9wZWN0aW4nO1xuaW1wb3J0IHsgTWVtb2l6ZSB9IGZyb20gJ0B0eXBlc2NyaXB0LXBsdXMvZmFzdC1tZW1vaXplLWRlY29yYXRvci9kaXN0L3NyYyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgUGxhY2VEZWZpbml0aW9uIH0gZnJvbSAnLi4vcGxhY2UtZGVmaW5pdGlvbic7XG5pbXBvcnQgeyBWaXNpdCB9IGZyb20gJy4uL3Zpc2l0JztcbmltcG9ydCB7IFBhcmFtZXRlckRlZmluaXRpb24gfSBmcm9tICcuL3BhcmFtZXRlci1kZWZpbml0aW9uLmNsYXNzJztcblxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlclNuYXBzaG90IGltcGxlbWVudHMgVmlzaXQge1xuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHBsYWNlRGVmaW5pdGlvbjogUGxhY2VEZWZpbml0aW9uLCBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVkOiBQYXJhbWV0ZXJTbmFwc2hvdC5SZXNvbHZlZFBhcmFtZXRlcjxhbnksIGFueT5bXSkge1xuICB9XG5cbiAgaGFzQ2hhbmdlZChvdGhlcjogUGFyYW1ldGVyU25hcHNob3QsIGRlYnVnID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBjb25zdCBjaGFuZ2VkID0gdGhpcy5yZXNvbHZlZC5maW5kKChyKSA9PiB7XG4gICAgICByZXR1cm4gIXIuaXNTYW1lKG90aGVyLmdldFZhbHVlT2Yoci5wYXJhbWV0ZXJEZWYpKTtcbiAgICB9KTtcbiAgICBpZiAoY2hhbmdlZCAmJiBkZWJ1Zykge1xuICAgICAgY29uc29sZS5sb2coe1xuICAgICAgICBuYW1lOiBjaGFuZ2VkLnBhcmFtZXRlckRlZi5uYW1lLFxuICAgICAgICBtaW5lOiBjaGFuZ2VkLnZhbHVlLFxuICAgICAgICB0aGVpcnM6IG90aGVyLmdldFZhbHVlT2YoY2hhbmdlZC5wYXJhbWV0ZXJEZWYpXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuICEhY2hhbmdlZDtcbiAgfVxuXG4gIEBNZW1vaXplKClcbiAgZ2V0UGFyYW1ldGVyPFQsIFM+KHBhcmFtZXRlckRlZjogUGFyYW1ldGVyRGVmaW5pdGlvbjxULCBTPik6IFBhcmFtZXRlclNuYXBzaG90LlJlc29sdmVkUGFyYW1ldGVyPFQsIFM+IHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZC5maW5kKHIgPT4gci5wYXJhbWV0ZXJEZWYgPT09IHBhcmFtZXRlckRlZik7XG4gIH1cblxuICBATWVtb2l6ZSgpXG4gIGdldFZhbHVlT2Y8VCwgUz4ocGFyYW1ldGVyRGVmOiBQYXJhbWV0ZXJEZWZpbml0aW9uPFQsIFM+KTogUyB7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXJhbWV0ZXIgPSB0aGlzLmdldFBhcmFtZXRlcihwYXJhbWV0ZXJEZWYpO1xuICAgIHJldHVybiByZXNvbHZlZFBhcmFtZXRlciA/IHJlc29sdmVkUGFyYW1ldGVyLnZhbHVlIDogbnVsbDtcbiAgfVxuXG4gIGdldFJvdXRlSWRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFJvdXRlSWRQYXJhbWV0ZXIoKSA/IHRoaXMuZ2V0Um91dGVJZFBhcmFtZXRlcigpLnZhbHVlIDogbnVsbDtcbiAgfVxuXG4gIEBNZW1vaXplKClcbiAgZ2V0UGFyYW1ldGVyVmFsdWUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCByZXNvbHZlZFBhcmFtZXRlciA9IHRoaXMucmVzb2x2ZWQuZmluZChyID0+IHIucGFyYW1ldGVyRGVmLm5hbWUgPT09IG5hbWUpO1xuICAgIHJldHVybiByZXNvbHZlZFBhcmFtZXRlciA/IHJlc29sdmVkUGFyYW1ldGVyLnZhbHVlIDogbnVsbDtcbiAgfVxuXG4gIEBNZW1vaXplKClcbiAgcHJpdmF0ZSBnZXRSb3V0ZUlkUGFyYW1ldGVyKCk6IFBhcmFtZXRlclNuYXBzaG90LlJlc29sdmVkVmFsdWVQYXJhbWV0ZXI8YW55PiB7XG4gICAgLy8gUm91dGVJZCdzIGFyZSBuZXZlciBhcnJheXM6IHNlZSBwYXJhbWV0ZXItZGVjb3JhdG9ycy50cyBjcmVhdGVEZWZpbml0aW9uIG1ldGhvZHMuIEl0IHdvdWxkIGJlIG5pY2UgdG9cbiAgICAvLyBjYXB0dXJlIHRoaXMgaW4gdGhlIHR5cGUgc3lzdGVtIHRob3VnaFxuICAgIHJldHVybiB0aGlzLnJlc29sdmVkLmZpbmQocCA9PiBwLnBhcmFtZXRlckRlZi5pc1JvdXRlSWQpIGFzIFBhcmFtZXRlclNuYXBzaG90LlJlc29sdmVkVmFsdWVQYXJhbWV0ZXI8YW55PjtcbiAgfVxuXG4gIEBNZW1vaXplKClcbiAgcHJpdmF0ZSBnZXRSb3V0ZVBhcmFtZXRlcnMoKTogUGFyYW1ldGVyU25hcHNob3QuUmVzb2x2ZWRQYXJhbWV0ZXI8YW55LCBhbnk+W10ge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkLmZpbHRlcihyID0+ICFyLnBhcmFtZXRlckRlZi5pc1JvdXRlSWQpO1xuICB9XG5cbiAgaGFzUm91dGVJZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmdldFJvdXRlSWRQYXJhbWV0ZXIoKTtcbiAgfVxuXG4gIGdldEZvcm1hdHRlZFJvdXRlSWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCByb3V0ZUlkUGFyYW0gPSB0aGlzLmdldFJvdXRlSWRQYXJhbWV0ZXIoKTtcbiAgICByZXR1cm4gcm91dGVJZFBhcmFtID8gcm91dGVJZFBhcmFtLmZvcm1hdHRlZFZhbHVlKCkgOiBudWxsO1xuICB9XG5cbiAgZ2V0Rm9ybWF0dGVkUGFyYW1ldGVycygpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7fTtcbiAgICBjb25zdCByb3V0ZUlkUGFyYW0gPSB0aGlzLnJlc29sdmVkLmZpbHRlcihwID0+ICFwLnBhcmFtZXRlckRlZi5pc1JvdXRlSWQpLmZvckVhY2gocCA9PiB7XG4gICAgICBwYXJhbXNbcC5wYXJhbWV0ZXJEZWYubmFtZV0gPSBwLmZvcm1hdHRlZFZhbHVlKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIGdldEFsbEZvcm1hdHRlZFBhcmFtZXRlcnMoKSB7XG4gICAgY29uc3QgcGFyYW1zID0ge307XG4gICAgY29uc3Qgcm91dGVJZFBhcmFtID0gdGhpcy5yZXNvbHZlZC5mb3JFYWNoKHAgPT4ge1xuICAgICAgcGFyYW1zW3AucGFyYW1ldGVyRGVmLm5hbWVdID0gcC5mb3JtYXR0ZWRWYWx1ZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBnZXRBbGxQYXJhbWV0ZXJzKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuICAgIGNvbnN0IHJvdXRlSWRQYXJhbSA9IHRoaXMucmVzb2x2ZWQuZm9yRWFjaChwID0+IHtcbiAgICAgIHBhcmFtc1twLnBhcmFtZXRlckRlZi5uYW1lXSA9IHAudmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHJlcGxhY2U8VCwgUz4ocGFyYW1ldGVyOiBQYXJhbWV0ZXJEZWZpbml0aW9uPFQsIFM+LCB2YWx1ZTogUyk6IFBhcmFtZXRlclNuYXBzaG90IHtcbiAgICByZXR1cm4gbmV3IFBhcmFtZXRlclNuYXBzaG90KHRoaXMucGxhY2VEZWZpbml0aW9uLCB0aGlzLnJlc29sdmVkLm1hcChwID0+IHtcbiAgICAgIHJldHVybiBwLnBhcmFtZXRlckRlZiA9PT0gcGFyYW1ldGVyID8gcC5yZXBsYWNlKHZhbHVlKSA6IHA7XG4gICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgc2FuaXRpc2UoaW5qZWN0b3I6IEluamVjdG9yKTogUHJvbWlzZTxQYXJhbWV0ZXJTbmFwc2hvdD4ge1xuICAgIGlmICh0aGlzLmhhc1JvdXRlSWQoKSkge1xuICAgICAgY29uc3Qgcm91dGVJZCA9IHRoaXMuZ2V0Um91dGVJZFBhcmFtZXRlcigpO1xuICAgICAgY29uc3Qgc2FuaXRpc2VkVmFsdWUgPSBhd2FpdCByb3V0ZUlkLnNhbml0aXNlKHRoaXMsIGluamVjdG9yKTtcbiAgICAgIGlmICghcm91dGVJZC5pc1NhbWUoc2FuaXRpc2VkVmFsdWUpKSB7XG4gICAgICAgIC8vIGlmIHRoZSByb3V0ZSBpZCBoYXMgY2hhbmdlZCB3ZSByZWRpcmVjdCBpbW1lZGlhdGVseSBhcyBvdGhlclxuICAgICAgICAvLyBwYXJhbWV0ZXIgc2FuaXRpc2VycyBtaWdodCB1c2UgaXQuXG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2Uocm91dGVJZC5wYXJhbWV0ZXJEZWYsIHNhbml0aXNlZFZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IHJlc3VsdDogUGFyYW1ldGVyU25hcHNob3QgPSB0aGlzO1xuICAgIGNvbnN0IHJvdXRlUGFyYW1ldGVycyA9IHRoaXMuZ2V0Um91dGVQYXJhbWV0ZXJzKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0ZVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJvdXRlUGFyYW1ldGVyID0gcm91dGVQYXJhbWV0ZXJzW2ldO1xuICAgICAgY29uc3Qgc2FuaXRpc2VkVmFsdWUgPSBhd2FpdCByb3V0ZVBhcmFtZXRlci5zYW5pdGlzZSh0aGlzLCBpbmplY3Rvcik7XG4gICAgICBpZiAoIXJvdXRlUGFyYW1ldGVyLmlzU2FtZShzYW5pdGlzZWRWYWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2Uocm91dGVQYXJhbWV0ZXIucGFyYW1ldGVyRGVmLCBzYW5pdGlzZWRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxufVxuXG5leHBvcnQgbmFtZXNwYWNlIFBhcmFtZXRlclNuYXBzaG90IHtcblxuICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlKHBsYWNlRGVmOiBQbGFjZURlZmluaXRpb24sIHBhcmFtczogUGFyYW1NYXAsIHVybFNlZ21lbnRzOlVybFNlZ21lbnRbXSk6IFBhcmFtZXRlclNuYXBzaG90IHtcbiAgICBjb25zdCBwYXJhbU1hcCA9IG5ldyBDb25zb2xpZGF0ZWRQYXJhbWV0ZXJNYXAocGFyYW1zLCB1cmxTZWdtZW50cyk7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXJhbWV0ZXJzOiBSZXNvbHZlZFBhcmFtZXRlcjxhbnksIGFueT5bXSA9IHBsYWNlRGVmLmdldFJvdXRlUGFyYW1ldGVycygpXG4gICAgICAubWFwKGRlZiA9PiB7XG4gICAgICAgIGlmIChkZWYuaXNBcnJheSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1NYXAuaGFzKGRlZi5uYW1lKSA/IHBhcmFtTWFwLmdldEFsbChkZWYubmFtZSkuZmlsdGVyKHMgPT4gIV8uaXNFbXB0eShzKSkubWFwKHJhdyA9PiBkZWYudHlwZS5wYXJzZShyYXcpKSA6IG51bGw7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZEFycmF5UGFyYW1ldGVyKGRlZiwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1NYXAuaGFzKGRlZi5uYW1lKSA/IGRlZi50eXBlLnBhcnNlKHBhcmFtTWFwLmdldChkZWYubmFtZSkpIDogbnVsbDtcbiAgICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkVmFsdWVQYXJhbWV0ZXIoZGVmLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHJldHVybiBuZXcgUGFyYW1ldGVyU25hcHNob3QocGxhY2VEZWYsIHJlc29sdmVkUGFyYW1ldGVycyk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBhIHdvcmsgYXJvdW5kIGZvciB0aGUgZmFjdCB0aGF0IGFuIGFjdGl2YXRlZCByb3V0ZSB3aXRoIG11bHRpcGxlIHNlZ21lbnRzIGRvZXNuJ3RcbiAgICogaW5jbHVkZSB0aGUgc2VnbWVudCBwYXJhbXMgaW4gdGhlIHBhcmFtTWFwIGFzIHdlbGwgYXMgZWFjaCBzZWdtZW50IHJldHVybnMgYW4gZW1wdHlcbiAgICogcGFyYW0gbWFwIGV2ZW4gd2hlbiBgcGFyYW1ldGVyYHMgaGFzIGNvbnRlbnQuXG4gICAqL1xuICBjbGFzcyBDb25zb2xpZGF0ZWRQYXJhbWV0ZXJNYXAge1xuXG4gICAgcHJpdmF0ZSBwYXJhbU1hcHM6IFBhcmFtTWFwW107XG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbU1hcDpQYXJhbU1hcCwgdXJsU2VnbWVudHM6VXJsU2VnbWVudFtdKSB7XG4gICAgICB0aGlzLnBhcmFtTWFwcyA9IFtwYXJhbU1hcF0uY29uY2F0KFxuICAgICAgICAodXJsU2VnbWVudHMgfHwgW10pLm1hcChzID0+IG5ldyBQYXJhbU1hcEFkYXB0ZXIocy5wYXJhbWV0ZXJzKSlcbiAgICAgICkuZmlsdGVyKG0gPT4gISFtKTsgLy8gdGhlIGFjdGl2YXRlZCByb3V0ZSBwYXJhbSBtYXAgY2FuIGJlIG51bGxcbiAgICB9XG5cbiAgICBnZXQobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJhbU1hcHMuZmluZChtID0+IG0uaGFzKG5hbWUpKS5nZXQobmFtZSk7XG4gICAgfVxuXG4gICAgZ2V0QWxsKG5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmFtTWFwcy5maW5kKG0gPT4gbS5oYXMobmFtZSkpLmdldEFsbChuYW1lKTtcbiAgICB9XG5cbiAgICBoYXMobmFtZTpzdHJpbmcpOmJvb2xlYW4ge1xuICAgICAgcmV0dXJuICEhdGhpcy5wYXJhbU1hcHMuZmluZChtID0+IG0uaGFzKG5hbWUpKTtcbiAgICB9XG4gIH1cblxuICBjbGFzcyBQYXJhbU1hcEFkYXB0ZXIgaW1wbGVtZW50cyBQYXJhbU1hcCB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwYXJhbXM6IHsgW3A6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgfVxuXG4gICAgZ2V0KG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgICAgcmV0dXJuIHRoaXMucGFyYW1zW25hbWVdO1xuICAgIH1cblxuICAgIGdldEFsbChuYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KG5hbWUpO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgIH1cblxuICAgIGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmtleXMuaW5jbHVkZXMobmFtZSk7XG4gICAgfVxuXG4gICAgZ2V0IGtleXMoKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICB9XG5cbiAgfVxuXG5cbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlc29sdmVkUGFyYW1ldGVyPFQsIFMgPSBUPiB7XG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgcGFyYW1ldGVyRGVmOiBQYXJhbWV0ZXJEZWZpbml0aW9uPFQsIFM+LCByZWFkb25seSB2YWx1ZTogUykge1xuICAgIH1cblxuICAgIGFic3RyYWN0IGluamVjdFJvdXRlUGFyYW0oZGVzdDoge30pOiB2b2lkO1xuXG4gICAgYWJzdHJhY3QgaXNTYW1lKG90aGVyVmFsdWU6IFMpOiBib29sZWFuO1xuXG4gICAgaXNSb3V0ZUlkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMucGFyYW1ldGVyRGVmLmlzUm91dGVJZDtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBmb3JtYXR0ZWRWYWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAgIGFic3RyYWN0IHJlcGxhY2UodmFsdWU6IFMpOiBSZXNvbHZlZFBhcmFtZXRlcjxULCBTPjtcblxuICAgIGFzeW5jIHNhbml0aXNlKHZpc2l0OiBWaXNpdCwgaW5qZWN0b3I6IEluamVjdG9yKTogUHJvbWlzZTxTPiB7XG4gICAgICBjb25zdCBzYW5pdGlzZXIgPSB0aGlzLnBhcmFtZXRlckRlZi5nZXRTYW5pdGlzZXIoaW5qZWN0b3IpO1xuICAgICAgaWYgKHNhbml0aXNlcikge1xuICAgICAgICByZXR1cm4gc2FuaXRpc2VyLnNhbml0aXNlKHRoaXMucGFyYW1ldGVyRGVmLCB0aGlzLnZhbHVlLCB2aXNpdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleHBvcnQgY2xhc3MgUmVzb2x2ZWRWYWx1ZVBhcmFtZXRlcjxUPiBleHRlbmRzIFJlc29sdmVkUGFyYW1ldGVyPFQsIFQ+IHtcblxuICAgIGlzU2FtZShvdGhlclZhbHVlOiBUKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gb3RoZXJWYWx1ZTtcbiAgICB9XG5cbiAgICBpbmplY3RSb3V0ZVBhcmFtKGRlc3Q6IHt9KTogdm9pZCB7XG4gICAgICBkZXN0W3RoaXMucGFyYW1ldGVyRGVmLm5hbWVdID0gdGhpcy5wYXJhbWV0ZXJEZWYudHlwZS5mb3JtYXQodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgcmVwbGFjZSh2YWx1ZTogVCk6IFBhcmFtZXRlclNuYXBzaG90LlJlc29sdmVkUGFyYW1ldGVyPFQsIFQ+IHtcbiAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRWYWx1ZVBhcmFtZXRlcjxUPih0aGlzLnBhcmFtZXRlckRlZiwgdmFsdWUpO1xuICAgIH1cblxuICAgIGZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gIV8uaXNOaWwodGhpcy52YWx1ZSkgPyB0aGlzLnBhcmFtZXRlckRlZi50eXBlLmZvcm1hdCh0aGlzLnZhbHVlKSA6IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGNsYXNzIFJlc29sdmVkQXJyYXlQYXJhbWV0ZXI8VD4gZXh0ZW5kcyBSZXNvbHZlZFBhcmFtZXRlcjxULCBUW10+IHtcblxuICAgIGlzU2FtZShvdGhlclZhbHVlOiBUW10pOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBfLmlzRXF1YWwodGhpcy52YWx1ZSwgb3RoZXJWYWx1ZSk7XG4gICAgfVxuXG4gICAgaW5qZWN0Um91dGVQYXJhbShkZXN0OiB7fSk6IHZvaWQge1xuICAgICAgZGVzdFt0aGlzLnBhcmFtZXRlckRlZi5uYW1lXSA9IHRoaXMudmFsdWUubWFwKHYgPT4gdGhpcy5wYXJhbWV0ZXJEZWYudHlwZS5mb3JtYXQodikpO1xuICAgIH1cblxuICAgIHJlcGxhY2UodmFsdWU6IFRbXSk6IFBhcmFtZXRlclNuYXBzaG90LlJlc29sdmVkUGFyYW1ldGVyPFQsIFRbXT4ge1xuICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZEFycmF5UGFyYW1ldGVyPFQ+KHRoaXMucGFyYW1ldGVyRGVmLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgZm9ybWF0dGVkVmFsdWUoKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlLm1hcCh2ID0+IHRoaXMucGFyYW1ldGVyRGVmLnR5cGUuZm9ybWF0KHYpKSA6IFtdO1xuICAgIH1cblxuICB9XG5cbn1cbiJdfQ==
404
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1ldGVyLXNuYXBzaG90LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvb2xvbi9hbmd1bGFyLXVpLXBvd2VydXBzLyIsInNvdXJjZXMiOlsibGliL3BsYWNlL3JvdXRlL3BhcmFtZXRlci1zbmFwc2hvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBRzNFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTlELE1BQU0sT0FBTyxpQkFBaUI7Ozs7O0lBRTVCLFlBQXFCLGVBQWdDLEVBQW1CLFVBQWdEO1FBQW5HLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUFtQixlQUFVLEdBQVYsVUFBVSxDQUFzQztJQUN4SCxDQUFDOzs7Ozs7SUFFRCxVQUFVLENBQUMsS0FBd0IsRUFBRSxLQUFLLEdBQUcsS0FBSzs7Y0FDMUMsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSTs7OztRQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDekMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxFQUFDO1FBQ0YsSUFBSSxPQUFPLElBQUksS0FBSyxFQUFFO1lBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQ1YsSUFBSSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSTtnQkFDN0IsSUFBSSxFQUFFLE9BQU8sQ0FBQyxLQUFLO2dCQUNuQixNQUFNLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO2FBQzdDLENBQUMsQ0FBQztTQUNKO1FBQ0QsT0FB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TUFBK0I7WUFBL0IsV0FBTSxHQUFOLE1BQU0sQ0FBeUI7UUFDNUQsQ0FBQzs7Ozs7UUFFRCxHQUFHLENBQUMsSUFBWTtZQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixDQUFDOzs7OztRQUVELE1BQU0sQ0FBQyxJQUFZOztrQkFDWCxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDNUIsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsQ0FBQzs7Ozs7UUFFRCxHQUFHLENBQUMsSUFBWTtZQUNkLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQzs7OztRQUVELElBQUksSUFBSTtZQUNOLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsQ0FBQztLQUVGOzs7Ozs7UUFwQmEsaUNBQWdEOztBQXVCaEUsQ0FBQyxFQWpFZ0IsaUJBQWlCLEtBQWpCLGlCQUFpQixRQWlFakMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGFyYW1NYXAsIFVybFNlZ21lbnQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVHJhY2UgfSBmcm9tICdAY29vbG9uL3BlY3Rpbic7XG5pbXBvcnQgeyBNZW1vaXplIH0gZnJvbSAnQHR5cGVzY3JpcHQtcGx1cy9mYXN0LW1lbW9pemUtZGVjb3JhdG9yL2Rpc3Qvc3JjJztcbmltcG9ydCB7IFBsYWNlRGVmaW5pdGlvbiB9IGZyb20gJy4uL3BsYWNlLWRlZmluaXRpb24nO1xuaW1wb3J0IHsgVmlzaXQgfSBmcm9tICcuLi92aXNpdCc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJEZWZpbml0aW9uIH0gZnJvbSAnLi9wYXJhbWV0ZXItZGVmaW5pdGlvbi5jbGFzcyc7XG5pbXBvcnQgeyBSb3V0ZVBhcmFtZXRlclZhbHVlIH0gZnJvbSAnLi9yb3V0ZS1wYXJhbWV0ZXItdmFsdWUnO1xuXG5leHBvcnQgY2xhc3MgUGFyYW1ldGVyU25hcHNob3QgaW1wbGVtZW50cyBWaXNpdCB7XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgcGxhY2VEZWZpbml0aW9uOiBQbGFjZURlZmluaXRpb24sIHByaXZhdGUgcmVhZG9ubHkgcGFyYW1ldGVyczogUm91dGVQYXJhbWV0ZXJWYWx1ZTxhbnksIGFueSwgYW55PltdKSB7XG4gIH1cblxuICBoYXNDaGFuZ2VkKG90aGVyOiBQYXJhbWV0ZXJTbmFwc2hvdCwgZGVidWcgPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLnBhcmFtZXRlcnMuZmluZCgocikgPT4ge1xuICAgICAgcmV0dXJuIHIuaGFzQ2hhbmdlZChvdGhlci5nZXRWYWx1ZU9mKHIuZGVmaW5pdGlvbikpO1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkICYmIGRlYnVnKSB7XG4gICAgICBjb25zb2xlLmxvZyh7XG4gICAgICAgIG5hbWU6IGNoYW5nZWQuZGVmaW5pdGlvbi5uYW1lLFxuICAgICAgICBtaW5lOiBjaGFuZ2VkLnZhbHVlLFxuICAgICAgICB0aGVpcnM6IG90aGVyLmdldFZhbHVlT2YoY2hhbmdlZC5kZWZpbml0aW9uKVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiAhIWNoYW5nZWQ7XG4gIH1cblxuICBATWVtb2l6ZSgpXG4gIGdldFBhcmFtZXRlcjxULCBTPihwYXJhbWV0ZXJEZWY6IFBhcmFtZXRlckRlZmluaXRpb248VCwgUz4pOiBSb3V0ZVBhcmFtZXRlclZhbHVlPFMsIFQsIGFueT4ge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlcnMuZmluZChyID0+IHIuZGVmaW5pdGlvbiA9PT0gcGFyYW1ldGVyRGVmKTtcbiAgfVxuXG4gIEBNZW1vaXplKClcbiAgZ2V0VmFsdWVPZjxULCBTPihwYXJhbWV0ZXJEZWY6IFBhcmFtZXRlckRlZmluaXRpb248VCwgUz4pOiBTIHtcbiAgICBjb25zdCByZXNvbHZlZFBhcmFtZXRlciA9IHRoaXMuZ2V0UGFyYW1ldGVyKHBhcmFtZXRlckRlZik7XG4gICAgcmV0dXJuIHJlc29sdmVkUGFyYW1ldGVyID8gcmVzb2x2ZWRQYXJhbWV0ZXIudmFsdWUgOiBudWxsO1xuICB9XG5cbiAgZ2V0Um91dGVJZFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um91dGVJZFBhcmFtZXRlcigpID8gdGhpcy5nZXRSb3V0ZUlkUGFyYW1ldGVyKCkudmFsdWUgOiBudWxsO1xuICB9XG5cbiAgQE1lbW9pemUoKVxuICBnZXRQYXJhbWV0ZXJWYWx1ZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IHJlc29sdmVkUGFyYW1ldGVyID0gdGhpcy5wYXJhbWV0ZXJzLmZpbmQociA9PiByLmRlZmluaXRpb24ubmFtZSA9PT0gbmFtZSk7XG4gICAgcmV0dXJuIHJlc29sdmVkUGFyYW1ldGVyID8gcmVzb2x2ZWRQYXJhbWV0ZXIudmFsdWUgOiBudWxsO1xuICB9XG5cbiAgQE1lbW9pemUoKVxuICBwcml2YXRlIGdldFJvdXRlSWRQYXJhbWV0ZXIoKTogUm91dGVQYXJhbWV0ZXJWYWx1ZS5TY2FsYXI8YW55PiB7XG4gICAgLy8gUm91dGVJZCdzIGFyZSBuZXZlciBhcnJheXM6IHNlZSBwYXJhbWV0ZXItZGVjb3JhdG9ycy50cyBjcmVhdGVEZWZpbml0aW9uIG1ldGhvZHMuIEl0IHdvdWxkIGJlIG5pY2UgdG9cbiAgICAvLyBjYXB0dXJlIHRoaXMgaW4gdGhlIHR5cGUgc3lzdGVtIHRob3VnaFxuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlcnMuZmluZChwID0+IHAuZGVmaW5pdGlvbi5pc1JvdXRlSWQpIGFzIFJvdXRlUGFyYW1ldGVyVmFsdWUuU2NhbGFyPGFueT47XG4gIH1cblxuICBATWVtb2l6ZSgpXG4gIHByaXZhdGUgZ2V0Um91dGVQYXJhbWV0ZXJzKCk6IFJvdXRlUGFyYW1ldGVyVmFsdWU8YW55LCBhbnksIGFueT5bXSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVycy5maWx0ZXIociA9PiAhci5kZWZpbml0aW9uLmlzUm91dGVJZCk7XG4gIH1cblxuICBoYXNSb3V0ZUlkKCkge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0Um91dGVJZFBhcmFtZXRlcigpO1xuICB9XG5cbiAgZ2V0Rm9ybWF0dGVkUm91dGVJZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJvdXRlSWRQYXJhbSA9IHRoaXMuZ2V0Um91dGVJZFBhcmFtZXRlcigpO1xuICAgIHJldHVybiByb3V0ZUlkUGFyYW0gPyByb3V0ZUlkUGFyYW0uZm9ybWF0dGVkVmFsdWUoKSA6IG51bGw7XG4gIH1cblxuICBnZXROb25FbXB0eVBhcmFtZXRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVycy5maWx0ZXIocCA9PiAhcC5pc0VtcHR5KCkpO1xuICB9XG5cbiAgQFRyYWNlKClcbiAgZ2V0Rm9ybWF0dGVkUGFyYW1ldGVycygpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7fTtcbiAgICBjb25zdCByb3V0ZUlkUGFyYW0gPSB0aGlzLmdldE5vbkVtcHR5UGFyYW1ldGVycygpXG4gICAgICAuZmlsdGVyKHAgPT4gIXAuZGVmaW5pdGlvbi5pc1JvdXRlSWQpXG4gICAgICAuZm9yRWFjaChwID0+IHBhcmFtc1twLmRlZmluaXRpb24ubmFtZV0gPSBwLmZvcm1hdHRlZFZhbHVlKCkpO1xuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBnZXRBbGxQYXJhbWV0ZXJzKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuICAgIGNvbnN0IHJvdXRlSWRQYXJhbSA9IHRoaXMucGFyYW1ldGVycy5mb3JFYWNoKHAgPT4ge1xuICAgICAgcGFyYW1zW3AuZGVmaW5pdGlvbi5uYW1lXSA9IHAudmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHJlcGxhY2U8VCwgUz4ocGFyYW1ldGVyOiBQYXJhbWV0ZXJEZWZpbml0aW9uPFQsIFM+LCB2YWx1ZTogUyk6IFBhcmFtZXRlclNuYXBzaG90IHtcbiAgICByZXR1cm4gbmV3IFBhcmFtZXRlclNuYXBzaG90KHRoaXMucGxhY2VEZWZpbml0aW9uLCB0aGlzLnBhcmFtZXRlcnMubWFwKHAgPT4ge1xuICAgICAgcmV0dXJuIHAuZGVmaW5pdGlvbiA9PT0gcGFyYW1ldGVyID8gcC5yZXBsYWNlKHZhbHVlKSA6IHA7XG4gICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgc2FuaXRpc2UoaW5qZWN0b3I6IEluamVjdG9yKTogUHJvbWlzZTxQYXJhbWV0ZXJTbmFwc2hvdD4ge1xuICAgIGlmICh0aGlzLmhhc1JvdXRlSWQoKSkge1xuICAgICAgY29uc3Qgcm91dGVJZCA9IHRoaXMuZ2V0Um91dGVJZFBhcmFtZXRlcigpO1xuICAgICAgY29uc3Qgc2FuaXRpc2VkVmFsdWUgPSBhd2FpdCByb3V0ZUlkLnNhbml0aXNlKHRoaXMsIGluamVjdG9yKTtcbiAgICAgIGlmIChyb3V0ZUlkLmhhc0NoYW5nZWQoc2FuaXRpc2VkVmFsdWUpKSB7XG4gICAgICAgIC8vIGlmIHRoZSByb3V0ZSBpZCBoYXMgY2hhbmdlZCB3ZSByZWRpcmVjdCBpbW1lZGlhdGVseSBhcyBvdGhlclxuICAgICAgICAvLyBwYXJhbWV0ZXIgc2FuaXRpc2VycyBtaWdodCB1c2UgaXQuXG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2Uocm91dGVJZC5kZWZpbml0aW9uLCBzYW5pdGlzZWRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCByZXN1bHQ6IFBhcmFtZXRlclNuYXBzaG90ID0gdGhpcztcbiAgICBjb25zdCByb3V0ZVBhcmFtZXRlcnMgPSB0aGlzLmdldFJvdXRlUGFyYW1ldGVycygpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGVQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByb3V0ZVBhcmFtZXRlciA9IHJvdXRlUGFyYW1ldGVyc1tpXTtcbiAgICAgIGNvbnN0IHNhbml0aXNlZFZhbHVlID0gYXdhaXQgcm91dGVQYXJhbWV0ZXIuc2FuaXRpc2UodGhpcywgaW5qZWN0b3IpO1xuICAgICAgaWYgKHJvdXRlUGFyYW1ldGVyLmhhc0NoYW5nZWQoc2FuaXRpc2VkVmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKHJvdXRlUGFyYW1ldGVyLmRlZmluaXRpb24sIHNhbml0aXNlZFZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUGFyYW1ldGVyU25hcHNob3Qge1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGUocGxhY2VEZWY6IFBsYWNlRGVmaW5pdGlvbiwgcGFyYW1zOiBQYXJhbU1hcCwgdXJsU2VnbWVudHM6IFVybFNlZ21lbnRbXSk6IFBhcmFtZXRlclNuYXBzaG90IHtcbiAgICBjb25zdCBwYXJhbU1hcCA9IG5ldyBDb25zb2xpZGF0ZWRQYXJhbWV0ZXJNYXAocGFyYW1zLCB1cmxTZWdtZW50cyk7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXJhbWV0ZXJzID0gcGxhY2VEZWYuZ2V0Um91dGVQYXJhbWV0ZXJzKCkubWFwKGRlZiA9PiBSb3V0ZVBhcmFtZXRlclZhbHVlLmNyZWF0ZShkZWYsIHBhcmFtTWFwKSk7XG4gICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJTbmFwc2hvdChwbGFjZURlZiwgcmVzb2x2ZWRQYXJhbWV0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGEgd29yayBhcm91bmQgZm9yIHRoZSBmYWN0IHRoYXQgYW4gYWN0aXZhdGVkIHJvdXRlIHdpdGggbXVsdGlwbGUgc2VnbWVudHMgZG9lc24ndFxuICAgKiBpbmNsdWRlIHRoZSBzZWdtZW50IHBhcmFtcyBpbiB0aGUgcGFyYW1NYXAgYXMgd2VsbCBhcyBlYWNoIHNlZ21lbnQgcmV0dXJucyBhbiBlbXB0eVxuICAgKiBwYXJhbSBtYXAgZXZlbiB3aGVuIGBwYXJhbWV0ZXJgcyBoYXMgY29udGVudC5cbiAgICovXG4gIGNsYXNzIENvbnNvbGlkYXRlZFBhcmFtZXRlck1hcCBpbXBsZW1lbnRzIFBhcmFtTWFwIHtcblxuICAgIHByaXZhdGUgcGFyYW1NYXBzOiBQYXJhbU1hcFtdO1xuXG4gICAgY29uc3RydWN0b3IocGFyYW1NYXA6IFBhcmFtTWFwLCB1cmxTZWdtZW50czogVXJsU2VnbWVudFtdKSB7XG4gICAgICB0aGlzLnBhcmFtTWFwcyA9IFtwYXJhbU1hcF0uY29uY2F0KFxuICAgICAgICAodXJsU2VnbWVudHMgfHwgW10pLm1hcChzID0+IG5ldyBQYXJhbU1hcEFkYXB0ZXIocy5wYXJhbWV0ZXJzKSlcbiAgICAgICkuZmlsdGVyKG0gPT4gISFtKTsgLy8gdGhlIGFjdGl2YXRlZCByb3V0ZSBwYXJhbSBtYXAgY2FuIGJlIG51bGxcbiAgICB9XG5cbiAgICBnZXQobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJhbU1hcHMuZmluZChtID0+IG0uaGFzKG5hbWUpKS5nZXQobmFtZSk7XG4gICAgfVxuXG4gICAgZ2V0QWxsKG5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmFtTWFwcy5maW5kKG0gPT4gbS5oYXMobmFtZSkpLmdldEFsbChuYW1lKTtcbiAgICB9XG5cbiAgICBoYXMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gISF0aGlzLnBhcmFtTWFwcy5maW5kKG0gPT4gbS5oYXMobmFtZSkpO1xuICAgIH1cblxuICAgIEBNZW1vaXplKClcbiAgICBnZXQga2V5cygpOiBzdHJpbmdbXSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJhbU1hcHMucmVkdWNlKChyZXN1bHQsIHBhcmFtcykgPT4gcmVzdWx0LmNvbmNhdChwYXJhbXMua2V5cyksIFtdKTtcbiAgICB9XG4gIH1cblxuICBjbGFzcyBQYXJhbU1hcEFkYXB0ZXIgaW1wbGVtZW50cyBQYXJhbU1hcCB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwYXJhbXM6IHsgW3A6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgfVxuXG4gICAgZ2V0KG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgICAgcmV0dXJuIHRoaXMucGFyYW1zW25hbWVdO1xuICAgIH1cblxuICAgIGdldEFsbChuYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KG5hbWUpO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgIH1cblxuICAgIGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmtleXMuaW5jbHVkZXMobmFtZSk7XG4gICAgfVxuXG4gICAgZ2V0IGtleXMoKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICB9XG5cbiAgfVxuXG5cbn1cbiJdfQ==