@elderbyte/ngx-starter 16.3.4 → 16.4.1

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 (48) hide show
  1. package/esm2022/lib/common/data/data-context/data-context-active-page.mjs +5 -5
  2. package/esm2022/lib/common/data/data-context/data-context-auto-starter.mjs +2 -2
  3. package/esm2022/lib/common/data/data-context/data-context-base.mjs +58 -28
  4. package/esm2022/lib/common/data/data-context/data-context-continuable-base.mjs +7 -7
  5. package/esm2022/lib/common/data/data-context/data-context-continuable-paged.mjs +10 -10
  6. package/esm2022/lib/common/data/data-context/data-context-continuable-token.mjs +8 -8
  7. package/esm2022/lib/common/data/data-context/data-context-simple.mjs +6 -5
  8. package/esm2022/lib/common/data/data-context/data-context-source-event-binding.mjs +2 -2
  9. package/esm2022/lib/common/data/data-context/data-context.mjs +1 -1
  10. package/esm2022/lib/common/data/filters/filter-context.mjs +12 -26
  11. package/esm2022/lib/common/data/required-filter-evaluator.mjs +2 -3
  12. package/esm2022/lib/common/data/sort-context.mjs +2 -2
  13. package/esm2022/lib/common/utils/filter-util.mjs +19 -1
  14. package/esm2022/lib/components/data-view/table/elder-table/elder-table.component.mjs +2 -2
  15. package/esm2022/lib/components/forms/search/domain/context/search-context.mjs +57 -0
  16. package/esm2022/lib/components/forms/search/domain/context/search-context.service.mjs +42 -0
  17. package/esm2022/lib/components/forms/search/domain/input/search-input-state.mjs +81 -0
  18. package/esm2022/lib/components/forms/search/domain/input/search-input.mjs +2 -0
  19. package/esm2022/lib/components/forms/search/domain/url/elder-search-url.directive.mjs +74 -0
  20. package/esm2022/lib/components/forms/search/domain/url/elder-search-url.service.mjs +162 -0
  21. package/esm2022/lib/components/forms/search/domain/url/search-query-params-parser.mjs +81 -0
  22. package/esm2022/lib/components/forms/search/elder-search-context.directive.mjs +88 -50
  23. package/esm2022/lib/components/forms/search/elder-search-input.directive.mjs +6 -5
  24. package/esm2022/lib/components/forms/search/elder-search.module.mjs +30 -9
  25. package/fesm2022/elderbyte-ngx-starter.mjs +663 -432
  26. package/fesm2022/elderbyte-ngx-starter.mjs.map +1 -1
  27. package/lib/common/data/data-context/data-context-base.d.ts +10 -3
  28. package/lib/common/data/data-context/data-context.d.ts +6 -1
  29. package/lib/common/data/filters/filter-context.d.ts +1 -6
  30. package/lib/common/utils/filter-util.d.ts +1 -0
  31. package/lib/components/forms/search/domain/context/search-context.d.ts +38 -0
  32. package/lib/components/forms/search/domain/context/search-context.service.d.ts +25 -0
  33. package/lib/components/forms/search/{elder-search-context-url-binding.directive.d.ts → domain/url/elder-search-url.directive.d.ts} +12 -13
  34. package/lib/components/forms/search/domain/url/elder-search-url.service.d.ts +60 -0
  35. package/lib/components/forms/search/domain/url/search-query-params-parser.d.ts +36 -0
  36. package/lib/components/forms/search/elder-search-context.directive.d.ts +29 -16
  37. package/lib/components/forms/search/elder-search-input.directive.d.ts +2 -2
  38. package/lib/components/forms/search/elder-search.module.d.ts +5 -3
  39. package/package.json +1 -1
  40. package/esm2022/lib/components/forms/search/elder-search-context-url-binding.directive.mjs +0 -71
  41. package/esm2022/lib/components/forms/search/model/search-input-state.mjs +0 -81
  42. package/esm2022/lib/components/forms/search/model/search-input.mjs +0 -2
  43. package/esm2022/lib/components/forms/search/search-box/elder-search-context-filters.mjs +0 -10
  44. package/esm2022/lib/components/forms/search/search-box/elder-search-url-binding.service.mjs +0 -184
  45. package/lib/components/forms/search/search-box/elder-search-context-filters.d.ts +0 -7
  46. package/lib/components/forms/search/search-box/elder-search-url-binding.service.d.ts +0 -74
  47. /package/lib/components/forms/search/{model → domain/input}/search-input-state.d.ts +0 -0
  48. /package/lib/components/forms/search/{model → domain/input}/search-input.d.ts +0 -0
@@ -0,0 +1,162 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { LoggerFactory } from '@elderbyte/ts-logger';
3
+ import { filter, map } from 'rxjs/operators';
4
+ import { SearchQueryParamsParser } from './search-query-params-parser';
5
+ import { BehaviorSubject } from 'rxjs';
6
+ import { FilterUtil } from '../../../../../common/utils/filter-util';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/router";
9
+ export class UrlFilterByContext {
10
+ constructor(urlFiltersByContext) {
11
+ this.byContext = urlFiltersByContext ?? new Map();
12
+ }
13
+ filtersOf(contextId) {
14
+ return this.byContext.get(contextId);
15
+ }
16
+ static empty() {
17
+ return new UrlFilterByContext();
18
+ }
19
+ withUrlFilters(current) {
20
+ const copy = new Map(this.byContext);
21
+ current
22
+ .forEach((v, k) => copy.set(k, new UrlFilters(v)));
23
+ return new UrlFilterByContext(copy);
24
+ }
25
+ }
26
+ export class UrlFilters {
27
+ constructor(filters) {
28
+ this.consumed = false;
29
+ this.filters = [...filters];
30
+ }
31
+ consumeFilters() {
32
+ this.consumed = true;
33
+ return this.filters;
34
+ }
35
+ }
36
+ export class ElderSearchUrlService {
37
+ /***************************************************************************
38
+ * *
39
+ * Constructor *
40
+ * *
41
+ **************************************************************************/
42
+ constructor(router) {
43
+ this.router = router;
44
+ /***************************************************************************
45
+ * *
46
+ * Fields *
47
+ * *
48
+ **************************************************************************/
49
+ this.log = LoggerFactory.getLogger(this.constructor.name);
50
+ this.SEARCH_QUERY_KEY = 'q';
51
+ this.paramsParser = new SearchQueryParamsParser(this.SEARCH_QUERY_KEY);
52
+ this.urlFiltersByContext$ = new BehaviorSubject(UrlFilterByContext.empty());
53
+ }
54
+ /***************************************************************************
55
+ * *
56
+ * Public API *
57
+ * *
58
+ **************************************************************************/
59
+ init() {
60
+ // this.logRouterEvents();
61
+ this.router.events.pipe(filter(event => event.type === 1 /* EventType.NavigationEnd */), map(event => this.extractUrlFilters(this.router.routerState.snapshot))).subscribe(currentContextFilters => this.updateSeenUrlFilters(currentContextFilters));
62
+ }
63
+ urlFiltersOfContext$(contextId) {
64
+ if (!contextId) {
65
+ throw new Error('Illegal contextId Argument: ' + contextId);
66
+ }
67
+ return this.urlFiltersByContext$.pipe(map(byContext => byContext.filtersOf(contextId)), filter(filters => !!filters));
68
+ }
69
+ updateQueryParams(contextId, filters) {
70
+ if (!contextId)
71
+ throw new Error('Illegal searchContextId Argument: ' + contextId);
72
+ if (!filters)
73
+ throw new Error('Illegal filters Argument: ' + contextId);
74
+ filters = filters.filter(f => f.value !== null && f.value !== undefined);
75
+ const currentUrlAll = this.extractUrlFilters(this.router.routerState.snapshot);
76
+ const currentUrl = currentUrlAll.get(contextId) ?? [];
77
+ if (!FilterUtil.equals(filters, currentUrl)) {
78
+ const resetParams = this.resetSearchParams(contextId, currentUrl);
79
+ const queryParams = { ...resetParams, ...this.buildQueryParams(contextId, filters) };
80
+ this.log.info('writeUrlQueryParams: ' + contextId, {
81
+ searchMap: filters,
82
+ queryParams: queryParams
83
+ });
84
+ this.router.navigate([], {
85
+ queryParams: queryParams,
86
+ replaceUrl: true,
87
+ queryParamsHandling: 'merge'
88
+ });
89
+ }
90
+ else {
91
+ // this.log.info('writeUrlQueryParams PREVENTED')
92
+ }
93
+ }
94
+ /***************************************************************************
95
+ * *
96
+ * Private methods *
97
+ * *
98
+ **************************************************************************/
99
+ updateSeenUrlFilters(current) {
100
+ if (current.size > 0) {
101
+ const filtersByContext = this.urlFiltersByContext$.getValue();
102
+ const newUrlFilters = filtersByContext.withUrlFilters(current);
103
+ this.log.info('updateSeenUrlFilters:', newUrlFilters);
104
+ this.urlFiltersByContext$.next(newUrlFilters);
105
+ }
106
+ }
107
+ logRouterEvents() {
108
+ this.router.events.pipe(map(e => e)).subscribe(e => this.log.debug('ROUTER-EVENT [' + (e.constructor.name) + ']#' + e.id + ': ' + e.url));
109
+ }
110
+ parseUrlFilters(params) {
111
+ return this.paramsParser.parse(params);
112
+ }
113
+ collectAllRouteParams(routerState) {
114
+ return this.collectRouteQueryParams(routerState.root);
115
+ }
116
+ collectRouteQueryParams(root) {
117
+ let params = {};
118
+ let stack = [root];
119
+ while (stack.length > 0) {
120
+ const route = stack.pop();
121
+ params = { ...params, ...route.queryParams };
122
+ stack.push(...route.children);
123
+ }
124
+ return params;
125
+ }
126
+ extractUrlFilters(routerState) {
127
+ const params = this.collectAllRouteParams(routerState);
128
+ return this.parseUrlFilters(params);
129
+ }
130
+ resetSearchParams(searchContextId, urlFiltersOf) {
131
+ if (urlFiltersOf && urlFiltersOf.length > 0) {
132
+ const params = {};
133
+ urlFiltersOf.forEach(toRemove => {
134
+ params[this.queryParamKey(searchContextId, toRemove)] = null;
135
+ });
136
+ return params;
137
+ }
138
+ return {};
139
+ }
140
+ buildQueryParams(searchContextId, filters) {
141
+ const params = {};
142
+ for (const filter of filters) {
143
+ params[this.queryParamKey(searchContextId, filter)] = this.convertValueToArrayOrSingleValue(filter.value);
144
+ }
145
+ return params;
146
+ }
147
+ queryParamKey(searchContextId, filter) {
148
+ return `${this.SEARCH_QUERY_KEY}-${searchContextId}-${filter.key}`;
149
+ }
150
+ convertValueToArrayOrSingleValue(value) {
151
+ return Array.isArray(value) ? `(${value.toString()})` : value;
152
+ }
153
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchUrlService, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
154
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchUrlService, providedIn: 'root' }); }
155
+ }
156
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchUrlService, decorators: [{
157
+ type: Injectable,
158
+ args: [{
159
+ providedIn: 'root'
160
+ }]
161
+ }], ctorParameters: function () { return [{ type: i1.Router }]; } });
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItc2VhcmNoLXVybC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWxkZXJieXRlL25neC1zdGFydGVyL3NyYy9saWIvY29tcG9uZW50cy9mb3Jtcy9zZWFyY2gvZG9tYWluL3VybC9lbGRlci1zZWFyY2gtdXJsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFbkQsT0FBTyxFQUFDLE1BQU0sRUFBRSxHQUFHLEVBQU0sTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRCxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUNyRSxPQUFPLEVBQUMsZUFBZSxFQUFhLE1BQU0sTUFBTSxDQUFDO0FBRWpELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx5Q0FBeUMsQ0FBQzs7O0FBRW5FLE1BQU0sT0FBTyxrQkFBa0I7SUFHN0IsWUFDRSxtQkFBNkM7UUFFN0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxtQkFBbUIsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFTSxTQUFTLENBQUMsU0FBaUI7UUFDaEMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBR00sTUFBTSxDQUFDLEtBQUs7UUFDakIsT0FBTyxJQUFJLGtCQUFrQixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVNLGNBQWMsQ0FBQyxPQUE4QjtRQUNsRCxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckMsT0FBTzthQUNKLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFB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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtMb2dnZXJGYWN0b3J5fSBmcm9tICdAZWxkZXJieXRlL3RzLWxvZ2dlcic7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBFdmVudFR5cGUsIFBhcmFtcywgUm91dGVyLCBSb3V0ZXJFdmVudCwgUm91dGVyU3RhdGVTbmFwc2hvdH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7ZmlsdGVyLCBtYXAsIHRhcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtGaWx0ZXJ9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvbW1vbi9kYXRhL2ZpbHRlcnMvZmlsdGVyJztcbmltcG9ydCB7U2VhcmNoUXVlcnlQYXJhbXNQYXJzZXJ9IGZyb20gJy4vc2VhcmNoLXF1ZXJ5LXBhcmFtcy1wYXJzZXInO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtieX0gZnJvbSAnbmctcGFja2Fnci9saWIvZ3JhcGgvc2VsZWN0JztcbmltcG9ydCB7RmlsdGVyVXRpbH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29tbW9uL3V0aWxzL2ZpbHRlci11dGlsJztcblxuZXhwb3J0IGNsYXNzIFVybEZpbHRlckJ5Q29udGV4dCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnlDb250ZXh0OiBNYXA8c3RyaW5nLCBVcmxGaWx0ZXJzPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICB1cmxGaWx0ZXJzQnlDb250ZXh0PzogTWFwPHN0cmluZywgVXJsRmlsdGVycz5cbiAgKSB7XG4gICAgdGhpcy5ieUNvbnRleHQgPSB1cmxGaWx0ZXJzQnlDb250ZXh0ID8/IG5ldyBNYXAoKTtcbiAgfVxuXG4gIHB1YmxpYyBmaWx0ZXJzT2YoY29udGV4dElkOiBzdHJpbmcpOiBVcmxGaWx0ZXJzIHtcbiAgICByZXR1cm4gdGhpcy5ieUNvbnRleHQuZ2V0KGNvbnRleHRJZCk7XG4gIH1cblxuXG4gIHB1YmxpYyBzdGF0aWMgZW1wdHkoKTogVXJsRmlsdGVyQnlDb250ZXh0IHtcbiAgICByZXR1cm4gbmV3IFVybEZpbHRlckJ5Q29udGV4dCgpO1xuICB9XG5cbiAgcHVibGljIHdpdGhVcmxGaWx0ZXJzKGN1cnJlbnQ6IE1hcDxzdHJpbmcsIEZpbHRlcltdPik6IFVybEZpbHRlckJ5Q29udGV4dCB7XG4gICAgY29uc3QgY29weSA9IG5ldyBNYXAodGhpcy5ieUNvbnRleHQpO1xuICAgIGN1cnJlbnRcbiAgICAgIC5mb3JFYWNoKCh2LCBrKSA9PiBjb3B5LnNldChrLCBuZXcgVXJsRmlsdGVycyh2KSkpO1xuICAgIHJldHVybiBuZXcgVXJsRmlsdGVyQnlDb250ZXh0KGNvcHkpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVcmxGaWx0ZXJzIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IGZpbHRlcnM6IEZpbHRlcltdO1xuICBwdWJsaWMgY29uc3VtZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBmaWx0ZXJzOiBGaWx0ZXJbXVxuICApIHtcbiAgICB0aGlzLmZpbHRlcnMgPSBbLi4uZmlsdGVyc107XG4gIH1cblxuICBwdWJsaWMgY29uc3VtZUZpbHRlcnMoKTogRmlsdGVyW10ge1xuICAgIHRoaXMuY29uc3VtZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLmZpbHRlcnM7XG4gIH1cblxufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBFbGRlclNlYXJjaFVybFNlcnZpY2Uge1xuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBGaWVsZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIodGhpcy5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgcHJpdmF0ZSByZWFkb25seSBTRUFSQ0hfUVVFUllfS0VZID0gJ3EnO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmFtc1BhcnNlciA9IG5ldyBTZWFyY2hRdWVyeVBhcmFtc1BhcnNlcih0aGlzLlNFQVJDSF9RVUVSWV9LRVkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdXJsRmlsdGVyc0J5Q29udGV4dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFVybEZpbHRlckJ5Q29udGV4dD4oVXJsRmlsdGVyQnlDb250ZXh0LmVtcHR5KCkpO1xuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBDb25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXJcbiAgKSB7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHVibGljIEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcbiAgICAvLyB0aGlzLmxvZ1JvdXRlckV2ZW50cygpO1xuICAgIHRoaXMucm91dGVyLmV2ZW50cy5waXBlKFxuICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50LnR5cGUgPT09IEV2ZW50VHlwZS5OYXZpZ2F0aW9uRW5kKSxcbiAgICAgIG1hcChldmVudCA9PiB0aGlzLmV4dHJhY3RVcmxGaWx0ZXJzKHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90KSksXG4gICAgKS5zdWJzY3JpYmUoXG4gICAgICBjdXJyZW50Q29udGV4dEZpbHRlcnMgPT4gdGhpcy51cGRhdGVTZWVuVXJsRmlsdGVycyhjdXJyZW50Q29udGV4dEZpbHRlcnMpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB1cmxGaWx0ZXJzT2ZDb250ZXh0JChjb250ZXh0SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8VXJsRmlsdGVycz4ge1xuICAgIGlmICghY29udGV4dElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgY29udGV4dElkIEFyZ3VtZW50OiAnICsgY29udGV4dElkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudXJsRmlsdGVyc0J5Q29udGV4dCQucGlwZShcbiAgICAgIG1hcChieUNvbnRleHQgPT4gYnlDb250ZXh0LmZpbHRlcnNPZihjb250ZXh0SWQpKSxcbiAgICAgIGZpbHRlcihmaWx0ZXJzID0+ICEhZmlsdGVycylcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVF1ZXJ5UGFyYW1zKGNvbnRleHRJZDogc3RyaW5nLCBmaWx0ZXJzOiBGaWx0ZXJbXSk6IHZvaWQge1xuXG4gICAgaWYoIWNvbnRleHRJZClcbiAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBzZWFyY2hDb250ZXh0SWQgQXJndW1lbnQ6ICcgKyBjb250ZXh0SWQpO1xuICAgIGlmKCFmaWx0ZXJzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGZpbHRlcnMgQXJndW1lbnQ6ICcgKyBjb250ZXh0SWQpO1xuXG4gICAgZmlsdGVycyA9IGZpbHRlcnMuZmlsdGVyKGYgPT4gZi52YWx1ZSAhPT0gbnVsbCAmJiBmLnZhbHVlICE9PSB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGN1cnJlbnRVcmxBbGwgPSB0aGlzLmV4dHJhY3RVcmxGaWx0ZXJzKHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90KTtcbiAgICBjb25zdCBjdXJyZW50VXJsID0gY3VycmVudFVybEFsbC5nZXQoY29udGV4dElkKSA/PyBbXTtcblxuICAgIGlmKCFGaWx0ZXJVdGlsLmVxdWFscyhmaWx0ZXJzLCBjdXJyZW50VXJsKSl7XG4gICAgICBjb25zdCByZXNldFBhcmFtcyA9IHRoaXMucmVzZXRTZWFyY2hQYXJhbXMoY29udGV4dElkLCBjdXJyZW50VXJsKTtcbiAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gey4uLnJlc2V0UGFyYW1zLCAuLi50aGlzLmJ1aWxkUXVlcnlQYXJhbXMoY29udGV4dElkLCBmaWx0ZXJzKX07XG5cbiAgICAgIHRoaXMubG9nLmluZm8oJ3dyaXRlVXJsUXVlcnlQYXJhbXM6ICcgKyBjb250ZXh0SWQsIHtcbiAgICAgICAgc2VhcmNoTWFwOiBmaWx0ZXJzLFxuICAgICAgICBxdWVyeVBhcmFtczogcXVlcnlQYXJhbXNcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShcbiAgICAgICAgW10sXG4gICAgICAgIHtcbiAgICAgICAgICBxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMsXG4gICAgICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcbiAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnXG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGlzLmxvZy5pbmZvKCd3cml0ZVVybFF1ZXJ5UGFyYW1zIFBSRVZFTlRFRCcpXG4gICAgfVxuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIFByaXZhdGUgbWV0aG9kcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSB1cGRhdGVTZWVuVXJsRmlsdGVycyhjdXJyZW50OiBNYXA8c3RyaW5nLCBGaWx0ZXJbXT4pOiB2b2lkIHtcbiAgICBpZiAoY3VycmVudC5zaXplID4gMCkge1xuICAgICAgY29uc3QgZmlsdGVyc0J5Q29udGV4dCA9IHRoaXMudXJsRmlsdGVyc0J5Q29udGV4dCQuZ2V0VmFsdWUoKTtcbiAgICAgIGNvbnN0IG5ld1VybEZpbHRlcnMgPSBmaWx0ZXJzQnlDb250ZXh0LndpdGhVcmxGaWx0ZXJzKGN1cnJlbnQpO1xuICAgICAgdGhpcy5sb2cuaW5mbygndXBkYXRlU2VlblVybEZpbHRlcnM6JywgbmV3VXJsRmlsdGVycyk7XG4gICAgICB0aGlzLnVybEZpbHRlcnNCeUNvbnRleHQkLm5leHQobmV3VXJsRmlsdGVycyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2dSb3V0ZXJFdmVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoXG4gICAgICBtYXAoZSA9PiBlIGFzIFJvdXRlckV2ZW50KVxuICAgICkuc3Vic2NyaWJlKFxuICAgICAgZSA9PiB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgJ1JPVVRFUi1FVkVOVCBbJyArIChlLmNvbnN0cnVjdG9yLm5hbWUpICsgJ10jJyArIGUuaWQgKyAnOiAnICsgZS51cmxcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVVybEZpbHRlcnMocGFyYW1zOiBQYXJhbXMpOiBNYXA8c3RyaW5nLCBGaWx0ZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnBhcmFtc1BhcnNlci5wYXJzZShwYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0QWxsUm91dGVQYXJhbXMocm91dGVyU3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpOiBQYXJhbXMge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RSb3V0ZVF1ZXJ5UGFyYW1zKHJvdXRlclN0YXRlLnJvb3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0Um91dGVRdWVyeVBhcmFtcyhyb290OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogUGFyYW1zIHtcbiAgICBsZXQgcGFyYW1zOiBQYXJhbXMgPSB7fTtcbiAgICBsZXQgc3RhY2s6IEFjdGl2YXRlZFJvdXRlU25hcHNob3RbXSA9IFtyb290XTtcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgcm91dGUgPSBzdGFjay5wb3AoKSE7XG4gICAgICBwYXJhbXMgPSB7Li4ucGFyYW1zLCAuLi5yb3V0ZS5xdWVyeVBhcmFtc307XG4gICAgICBzdGFjay5wdXNoKC4uLnJvdXRlLmNoaWxkcmVuKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdFVybEZpbHRlcnMocm91dGVyU3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpOiBNYXA8c3RyaW5nLCBGaWx0ZXJbXT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuY29sbGVjdEFsbFJvdXRlUGFyYW1zKHJvdXRlclN0YXRlKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVVybEZpbHRlcnMocGFyYW1zKTtcbiAgfVxuXG5cbiAgcHJpdmF0ZSByZXNldFNlYXJjaFBhcmFtcyhzZWFyY2hDb250ZXh0SWQ6IHN0cmluZywgdXJsRmlsdGVyc09mOiBGaWx0ZXJbXSk6IFBhcmFtcyB7XG4gICAgaWYgKHVybEZpbHRlcnNPZiAmJiB1cmxGaWx0ZXJzT2YubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcGFyYW1zOiBQYXJhbXMgPSB7fTtcbiAgICAgIHVybEZpbHRlcnNPZi5mb3JFYWNoKFxuICAgICAgICB0b1JlbW92ZSA9PiB7XG4gICAgICAgICAgcGFyYW1zW3RoaXMucXVlcnlQYXJhbUtleShzZWFyY2hDb250ZXh0SWQsIHRvUmVtb3ZlKV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFF1ZXJ5UGFyYW1zKHNlYXJjaENvbnRleHRJZDogc3RyaW5nLCBmaWx0ZXJzOiBGaWx0ZXJbXSk6IFBhcmFtcyB7XG4gICAgY29uc3QgcGFyYW1zOiBQYXJhbXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBmaWx0ZXJzKSB7XG4gICAgICBwYXJhbXNbdGhpcy5xdWVyeVBhcmFtS2V5KHNlYXJjaENvbnRleHRJZCwgZmlsdGVyKV0gPSB0aGlzLmNvbnZlcnRWYWx1ZVRvQXJyYXlPclNpbmdsZVZhbHVlKGZpbHRlci52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIHF1ZXJ5UGFyYW1LZXkoc2VhcmNoQ29udGV4dElkOiBzdHJpbmcsIGZpbHRlcjogRmlsdGVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5TRUFSQ0hfUVVFUllfS0VZfS0ke3NlYXJjaENvbnRleHRJZH0tJHtmaWx0ZXIua2V5fWA7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRWYWx1ZVRvQXJyYXlPclNpbmdsZVZhbHVlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gYCgke3ZhbHVlLnRvU3RyaW5nKCl9KWAgOiB2YWx1ZTtcbiAgfVxuXG5cbn1cbiJdfQ==
@@ -0,0 +1,81 @@
1
+ import { LoggerFactory } from '@elderbyte/ts-logger';
2
+ import { Filter } from '../../../../../common/data/filters/filter';
3
+ import { convertToParamMap } from '@angular/router';
4
+ export class SearchQueryParamsParser {
5
+ /***************************************************************************
6
+ * *
7
+ * Constructor *
8
+ * *
9
+ **************************************************************************/
10
+ constructor(queryPrefix) {
11
+ /***************************************************************************
12
+ * *
13
+ * Fields *
14
+ * *
15
+ **************************************************************************/
16
+ this.log = LoggerFactory.getLogger(this.constructor.name);
17
+ this.queryPrefix = queryPrefix;
18
+ }
19
+ /***************************************************************************
20
+ * *
21
+ * Public API *
22
+ * *
23
+ **************************************************************************/
24
+ parse(params) {
25
+ const paramMap = convertToParamMap(params);
26
+ const searchParamKeys = this.extractSearchParameters(paramMap);
27
+ return this.buildSearchContextMap(paramMap, searchParamKeys);
28
+ }
29
+ /***************************************************************************
30
+ * *
31
+ * Private methods *
32
+ * *
33
+ **************************************************************************/
34
+ extractSearchParameters(paramMap) {
35
+ return paramMap.keys.filter(param => param.startsWith(this.queryPrefix + '-'));
36
+ }
37
+ buildSearchContextMap(paramMap, searchParamKeys) {
38
+ const filtersByContextId = new Map();
39
+ for (const key of searchParamKeys) {
40
+ const filterValues = paramMap.getAll(key);
41
+ const filterValue = filterValues[0]; // TODO Support multiple values
42
+ const filterParamData = this.extractFilterParam(key, filterValue);
43
+ const filter = this.convertFilterStringToFilter(filterValue, filterParamData);
44
+ this.checkAndSetFilter(filtersByContextId, filterParamData.searchContextId, filter);
45
+ }
46
+ return filtersByContextId;
47
+ }
48
+ checkAndSetFilter(filtersByContextId, searchContextId, filter) {
49
+ let filtersInContext = filtersByContextId.get(searchContextId);
50
+ if (!filtersInContext) {
51
+ filtersInContext = [];
52
+ filtersByContextId.set(searchContextId, filtersInContext);
53
+ }
54
+ filtersInContext.push(filter);
55
+ }
56
+ extractFilterParam(key, filterValue) {
57
+ const splitParams = key.split('-');
58
+ return {
59
+ searchContextId: splitParams[1],
60
+ filterId: splitParams[2],
61
+ isArray: this.checkIfParamIsArray(filterValue)
62
+ };
63
+ }
64
+ convertFilterStringToFilter(paramValue, filterParamData) {
65
+ let value = paramValue;
66
+ if (this.isSingularArrayValue(value, filterParamData)) {
67
+ value = this.convertValueToArray(value);
68
+ }
69
+ return new Filter(filterParamData.filterId, value);
70
+ }
71
+ isSingularArrayValue(value, filterParamData) {
72
+ return !Array.isArray(value) && filterParamData.isArray;
73
+ }
74
+ convertValueToArray(value) {
75
+ return value.slice(1).slice(0, -1).split(',');
76
+ }
77
+ checkIfParamIsArray(filterValue) {
78
+ return filterValue.startsWith('(') && filterValue.endsWith(')');
79
+ }
80
+ }
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLXF1ZXJ5LXBhcmFtcy1wYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbGRlcmJ5dGUvbmd4LXN0YXJ0ZXIvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm1zL3NlYXJjaC9kb21haW4vdXJsL3NlYXJjaC1xdWVyeS1wYXJhbXMtcGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFDakUsT0FBTyxFQUFDLGlCQUFpQixFQUFtQixNQUFNLGlCQUFpQixDQUFDO0FBUXBFLE1BQU0sT0FBTyx1QkFBdUI7SUFXbEM7Ozs7Z0ZBSTRFO0lBRTVFLFlBQ0UsV0FBbUI7UUFoQnJCOzs7O29GQUk0RTtRQUUzRCxRQUFHLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBWXBFLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7OztnRkFJNEU7SUFFckUsS0FBSyxDQUFDLE1BQWM7UUFDekIsTUFBTSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0MsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7Ozs7Z0ZBSTRFO0lBRXBFLHVCQUF1QixDQUFDLFFBQWtCO1FBQ2hELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRU8scUJBQXFCLENBQUMsUUFBa0IsRUFBRSxlQUF5QjtRQUN6RSxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO1FBQ3ZELEtBQUssTUFBTSxHQUFHLElBQUksZUFBZSxFQUFFO1lBQ2pDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUMsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsK0JBQStCO1lBQ3BFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUM5RSxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsZUFBZSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNyRjtRQUNELE9BQU8sa0JBQWtCLENBQUM7SUFDNUIsQ0FBQztJQUVPLGlCQUFpQixDQUN2QixrQkFBeUMsRUFDekMsZUFBdUIsRUFDdkIsTUFBYztRQUVkLElBQUksZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUNyQixnQkFBZ0IsR0FBRyxFQUFFLENBQUM7WUFDdEIsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1NBQzNEO1FBQ0QsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFHTyxrQkFBa0IsQ0FBQyxHQUFXLEVBQUUsV0FBbUI7UUFDekQsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVuQyxPQUFPO1lBQ0wsZUFBZSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDeEIsT0FBTyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUM7U0FDL0MsQ0FBQztJQUNKLENBQUM7SUFFTywyQkFBMkIsQ0FBQyxVQUFrQixFQUFFLGVBQWdDO1FBQ3RGLElBQUksS0FBSyxHQUFzQixVQUFVLENBQUM7UUFFMUMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxFQUFFO1lBQ3JELEtBQUssR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDekM7UUFFRCxPQUFPLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVPLG9CQUFvQixDQUFDLEtBQXdCLEVBQUUsZUFBZ0M7UUFDckYsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQztJQUMxRCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsS0FBYTtRQUN2QyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsV0FBbUI7UUFDN0MsT0FBTyxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEUsQ0FBQztDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtMb2dnZXJGYWN0b3J5fSBmcm9tICdAZWxkZXJieXRlL3RzLWxvZ2dlcic7XG5pbXBvcnQge0ZpbHRlcn0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29tbW9uL2RhdGEvZmlsdGVycy9maWx0ZXInO1xuaW1wb3J0IHtjb252ZXJ0VG9QYXJhbU1hcCwgUGFyYW1NYXAsIFBhcmFtc30gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW50ZXJmYWNlIEZpbHRlclBhcmFtRGF0YSB7XG4gIHNlYXJjaENvbnRleHRJZDogc3RyaW5nLFxuICBmaWx0ZXJJZDogc3RyaW5nLFxuICBpc0FycmF5OiBib29sZWFuXG59XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hRdWVyeVBhcmFtc1BhcnNlciB7XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIEZpZWxkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSByZWFkb25seSBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICBwcml2YXRlIHJlYWRvbmx5IHF1ZXJ5UHJlZml4OiBzdHJpbmc7IC8vIFwicVwiXG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIENvbnN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcXVlcnlQcmVmaXg6IHN0cmluZ1xuICApIHtcbiAgICB0aGlzLnF1ZXJ5UHJlZml4ID0gcXVlcnlQcmVmaXg7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHVibGljIEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwdWJsaWMgcGFyc2UocGFyYW1zOiBQYXJhbXMpOiBNYXA8c3RyaW5nLCBGaWx0ZXJbXT4ge1xuICAgIGNvbnN0IHBhcmFtTWFwID0gY29udmVydFRvUGFyYW1NYXAocGFyYW1zKTtcbiAgICBjb25zdCBzZWFyY2hQYXJhbUtleXMgPSB0aGlzLmV4dHJhY3RTZWFyY2hQYXJhbWV0ZXJzKHBhcmFtTWFwKTtcbiAgICByZXR1cm4gdGhpcy5idWlsZFNlYXJjaENvbnRleHRNYXAocGFyYW1NYXAsIHNlYXJjaFBhcmFtS2V5cyk7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHJpdmF0ZSBtZXRob2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIGV4dHJhY3RTZWFyY2hQYXJhbWV0ZXJzKHBhcmFtTWFwOiBQYXJhbU1hcCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gcGFyYW1NYXAua2V5cy5maWx0ZXIocGFyYW0gPT4gcGFyYW0uc3RhcnRzV2l0aCh0aGlzLnF1ZXJ5UHJlZml4ICsgJy0nKSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2VhcmNoQ29udGV4dE1hcChwYXJhbU1hcDogUGFyYW1NYXAsIHNlYXJjaFBhcmFtS2V5czogc3RyaW5nW10pOiBNYXA8c3RyaW5nLCBGaWx0ZXJbXT4ge1xuICAgIGNvbnN0IGZpbHRlcnNCeUNvbnRleHRJZCA9IG5ldyBNYXA8c3RyaW5nLCBGaWx0ZXJbXT4oKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBzZWFyY2hQYXJhbUtleXMpIHtcbiAgICAgIGNvbnN0IGZpbHRlclZhbHVlcyA9IHBhcmFtTWFwLmdldEFsbChrZXkpO1xuICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSBmaWx0ZXJWYWx1ZXNbMF07IC8vIFRPRE8gU3VwcG9ydCBtdWx0aXBsZSB2YWx1ZXNcbiAgICAgIGNvbnN0IGZpbHRlclBhcmFtRGF0YSA9IHRoaXMuZXh0cmFjdEZpbHRlclBhcmFtKGtleSwgZmlsdGVyVmFsdWUpO1xuICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5jb252ZXJ0RmlsdGVyU3RyaW5nVG9GaWx0ZXIoZmlsdGVyVmFsdWUsIGZpbHRlclBhcmFtRGF0YSk7XG4gICAgICB0aGlzLmNoZWNrQW5kU2V0RmlsdGVyKGZpbHRlcnNCeUNvbnRleHRJZCwgZmlsdGVyUGFyYW1EYXRhLnNlYXJjaENvbnRleHRJZCwgZmlsdGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlcnNCeUNvbnRleHRJZDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tBbmRTZXRGaWx0ZXIoXG4gICAgZmlsdGVyc0J5Q29udGV4dElkOiBNYXA8c3RyaW5nLCBGaWx0ZXJbXT4sXG4gICAgc2VhcmNoQ29udGV4dElkOiBzdHJpbmcsXG4gICAgZmlsdGVyOiBGaWx0ZXJcbiAgKTogdm9pZCB7XG4gICAgbGV0IGZpbHRlcnNJbkNvbnRleHQgPSBmaWx0ZXJzQnlDb250ZXh0SWQuZ2V0KHNlYXJjaENvbnRleHRJZCk7XG4gICAgaWYgKCFmaWx0ZXJzSW5Db250ZXh0KSB7XG4gICAgICBmaWx0ZXJzSW5Db250ZXh0ID0gW107XG4gICAgICBmaWx0ZXJzQnlDb250ZXh0SWQuc2V0KHNlYXJjaENvbnRleHRJZCwgZmlsdGVyc0luQ29udGV4dCk7XG4gICAgfVxuICAgIGZpbHRlcnNJbkNvbnRleHQucHVzaChmaWx0ZXIpO1xuICB9XG5cblxuICBwcml2YXRlIGV4dHJhY3RGaWx0ZXJQYXJhbShrZXk6IHN0cmluZywgZmlsdGVyVmFsdWU6IHN0cmluZyk6IEZpbHRlclBhcmFtRGF0YSB7XG4gICAgY29uc3Qgc3BsaXRQYXJhbXMgPSBrZXkuc3BsaXQoJy0nKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZWFyY2hDb250ZXh0SWQ6IHNwbGl0UGFyYW1zWzFdLFxuICAgICAgZmlsdGVySWQ6IHNwbGl0UGFyYW1zWzJdLFxuICAgICAgaXNBcnJheTogdGhpcy5jaGVja0lmUGFyYW1Jc0FycmF5KGZpbHRlclZhbHVlKVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRGaWx0ZXJTdHJpbmdUb0ZpbHRlcihwYXJhbVZhbHVlOiBzdHJpbmcsIGZpbHRlclBhcmFtRGF0YTogRmlsdGVyUGFyYW1EYXRhKTogRmlsdGVyIHtcbiAgICBsZXQgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdID0gcGFyYW1WYWx1ZTtcblxuICAgIGlmICh0aGlzLmlzU2luZ3VsYXJBcnJheVZhbHVlKHZhbHVlLCBmaWx0ZXJQYXJhbURhdGEpKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuY29udmVydFZhbHVlVG9BcnJheSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBGaWx0ZXIoZmlsdGVyUGFyYW1EYXRhLmZpbHRlcklkLCB2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGlzU2luZ3VsYXJBcnJheVZhbHVlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgZmlsdGVyUGFyYW1EYXRhOiBGaWx0ZXJQYXJhbURhdGEpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIGZpbHRlclBhcmFtRGF0YS5pc0FycmF5O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0VmFsdWVUb0FycmF5KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHZhbHVlLnNsaWNlKDEpLnNsaWNlKDAsIC0xKS5zcGxpdCgnLCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0lmUGFyYW1Jc0FycmF5KGZpbHRlclZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmlsdGVyVmFsdWUuc3RhcnRzV2l0aCgnKCcpICYmIGZpbHRlclZhbHVlLmVuZHNXaXRoKCcpJyk7XG4gIH1cblxufVxuIl19
@@ -1,16 +1,19 @@
1
- import { Directive, Input } from "@angular/core";
2
- import { LoggerFactory } from "@elderbyte/ts-logger";
3
- import { combineLatestWith, debounceTime, map, switchMap, takeUntil } from "rxjs/operators";
4
- import { BehaviorSubject } from "rxjs/internal/BehaviorSubject";
5
- import { Subject } from "rxjs/internal/Subject";
6
- import { Filter } from "../../../common/data/filters/filter";
7
- import { FilterContext } from "../../../common/data/filters/filter-context";
8
- import { combineLatest } from 'rxjs';
1
+ import { Directive, Input } from '@angular/core';
2
+ import { LoggerFactory } from '@elderbyte/ts-logger';
3
+ import { combineLatestWith, debounceTime, filter, map, switchMap, takeUntil, tap } from 'rxjs/operators';
4
+ import { BehaviorSubject, Subject, combineLatest } from 'rxjs';
5
+ import { Filter } from '../../../common/data/filters/filter';
6
+ import { FilterContext } from '../../../common/data/filters/filter-context';
7
+ import { SearchContext } from './domain/context/search-context';
9
8
  import { FilterUtil } from '../../../common/utils/filter-util';
10
9
  import * as i0 from "@angular/core";
10
+ import * as i1 from "./domain/context/search-context.service";
11
11
  /**
12
- * The search container manages a group of search-inputs
13
- * and holds their values in a central search model.
12
+ * The SearchContextDirective binds a group of search-inputs
13
+ * to a SearchContext with a two-way binding.
14
+ *
15
+ * It also binds the SearchContext to a FilterContext (DataContext).
16
+ * TODO Maybe separate this??
14
17
  */
15
18
  export class ElderSearchContextDirective {
16
19
  /***************************************************************************
@@ -18,50 +21,35 @@ export class ElderSearchContextDirective {
18
21
  * Constructor *
19
22
  * *
20
23
  **************************************************************************/
21
- constructor() {
24
+ constructor(searchContextService) {
22
25
  /***************************************************************************
23
26
  * *
24
27
  * Fields *
25
28
  * *
26
29
  **************************************************************************/
27
- this._forcedFilters$ = new BehaviorSubject([]);
28
30
  this.log = LoggerFactory.getLogger(this.constructor.name);
29
31
  this.destroy$ = new Subject();
30
32
  this._searchInputs$ = new BehaviorSubject([]);
31
33
  this._searchStates$ = new BehaviorSubject([]);
32
34
  this._filterContext$ = new BehaviorSubject(null);
33
- this.userFilters$ = this._filterContext$.pipe(switchMap(ctx => ctx.filters), combineLatestWith(this._forcedFilters$), map(([allFilters, forcedFilters]) => {
34
- return FilterUtil.strip(allFilters, forcedFilters);
35
- }));
35
+ this._searchContext$ = new BehaviorSubject(SearchContext.standalone());
36
+ this.searchContextId$ = new BehaviorSubject(null);
37
+ this.searchContextId$.pipe(takeUntil(this.destroy$), filter(contextId => !!contextId), map(contextId => searchContextService.context(contextId))).subscribe(ctx => this._searchContext$.next(ctx));
36
38
  }
37
39
  /***************************************************************************
38
40
  * *
39
41
  * Life Cycle *
40
42
  * *
41
43
  **************************************************************************/
42
- ngAfterContentInit() {
43
- this._searchInputs$.pipe(takeUntil(this.destroy$), switchMap(inputs => combineLatest(inputs.map(i => i.state$))), combineLatestWith(this._forcedFilters$), debounceTime(5)).subscribe(([states, forcedFilters]) => {
44
- this._searchStates$.next(states);
45
- const userFilters = this.convertToFilters(states);
46
- this.applyFilters(userFilters, forcedFilters);
47
- });
44
+ ngOnInit() {
45
+ this.applyDefaultFiltersToSearchContext();
46
+ this.syncSearchContextToBoundFilterContext();
48
47
  }
49
- applyFilters(userFilters, forcedFilters) {
50
- const context = this.filterContext;
51
- if (context) {
52
- context.updateFilters(userFilters);
53
- context.mergeFilters(forcedFilters);
54
- this.log.trace("Search-Model filters updated:", Array.from(context.filtersSnapshot));
55
- }
56
- else {
57
- this.log.warn("Failed to apply filters since no FilterContext is available!", {
58
- userFilters: userFilters,
59
- forcedFilters: forcedFilters
60
- });
61
- }
48
+ ngAfterContentInit() {
49
+ this.syncSearchInputsToSearchContext();
62
50
  }
63
51
  ngAfterViewInit() {
64
- this.applyModelToInputs();
52
+ this.applySearchContextToInputs();
65
53
  }
66
54
  ngOnDestroy() {
67
55
  this.destroy$.next();
@@ -72,15 +60,27 @@ export class ElderSearchContextDirective {
72
60
  * Properties *
73
61
  * *
74
62
  **************************************************************************/
63
+ set searchContextId(contextId) {
64
+ this.searchContextId$.next(contextId);
65
+ }
66
+ get searchContextId() {
67
+ return this.searchContextId$.getValue();
68
+ }
69
+ get searchContext$() {
70
+ return this._searchContext$.asObservable();
71
+ }
72
+ get searchContext() {
73
+ return this._searchContext$.getValue();
74
+ }
75
75
  set filterContext(value) {
76
76
  let context;
77
77
  if (value) {
78
- if (typeof value !== "string") {
78
+ if (typeof value !== 'string') {
79
79
  context = value;
80
80
  }
81
81
  else {
82
- this.log.warn("Illegal value provided for property filterContext: ", JSON.stringify(value));
83
- throw new Error("Illegal value provided for property filterContext! " + value);
82
+ this.log.warn('Illegal value provided for property filterContext: ', JSON.stringify(value));
83
+ throw new Error('Illegal value provided for property filterContext! ' + value);
84
84
  }
85
85
  }
86
86
  else {
@@ -98,10 +98,10 @@ export class ElderSearchContextDirective {
98
98
  * to also keep the users intent (by merging) them.
99
99
  */
100
100
  set forcedFilters(filters) {
101
- this._forcedFilters$.next(filters);
101
+ this.searchContext.replaceForcedFilters(filters);
102
102
  }
103
103
  get forcedFilters() {
104
- return this._forcedFilters$.getValue();
104
+ return this.searchContext.forcedFilters.filtersSnapshot;
105
105
  }
106
106
  get attributes() {
107
107
  return this._searchInputs$.asObservable();
@@ -130,7 +130,7 @@ export class ElderSearchContextDirective {
130
130
  * Register a new search name in this container
131
131
  */
132
132
  register(searchInput) {
133
- this.log.debug("Registering search input [" + searchInput.name + "]");
133
+ this.log.debug('Registering search input [' + searchInput.name + ']');
134
134
  const current = this._searchInputs$.getValue();
135
135
  this._searchInputs$.next([...current, searchInput]);
136
136
  }
@@ -146,8 +146,44 @@ export class ElderSearchContextDirective {
146
146
  * Private *
147
147
  * *
148
148
  **************************************************************************/
149
- applyModelToInputs() {
150
- this.applyFiltersToInputs(this.filterContext.filtersSnapshot);
149
+ applyDefaultFiltersToSearchContext() {
150
+ const dcFilters = this.filterContext;
151
+ const searchContext = this.searchContext;
152
+ if (searchContext.userFilters.isEmpty) {
153
+ if (!dcFilters.isEmpty) {
154
+ // Consider all filters in DC as defaults, expect for foced filters.
155
+ searchContext.updateUserFilters(FilterUtil.strip(dcFilters.filtersSnapshot, this.forcedFilters));
156
+ }
157
+ }
158
+ else {
159
+ dcFilters.replaceFilters(searchContext.userFilters.filtersSnapshot);
160
+ }
161
+ }
162
+ syncSearchInputsToSearchContext() {
163
+ const inputFilters$ = this._searchInputs$.pipe(switchMap(inputs => combineLatest(inputs.map(i => i.state$))), debounceTime(5), tap(states => this._searchStates$.next(states)), map(states => this.convertToFilters(states)));
164
+ inputFilters$
165
+ .pipe(takeUntil(this.destroy$), combineLatestWith(this._searchContext$))
166
+ .subscribe(([inputFilters, searchContext]) => {
167
+ searchContext.updateUserFilters(inputFilters);
168
+ });
169
+ }
170
+ syncSearchContextToBoundFilterContext() {
171
+ this._searchContext$.pipe(takeUntil(this.destroy$), switchMap(context => context.allFiltersChanged)).subscribe(allFilters => this.applyToBoundFilterContext(allFilters));
172
+ }
173
+ applyToBoundFilterContext(filters) {
174
+ const filterCtx = this.filterContext;
175
+ if (filterCtx) {
176
+ filterCtx.replaceFilters(filters);
177
+ this.log.debug('Applied Filters of SearchContext ' + this.searchContextId + ' to DataContext FilterContext.', filters);
178
+ }
179
+ else {
180
+ this.log.warn('Failed to apply filters since no FilterContext is available!', filters);
181
+ }
182
+ }
183
+ applySearchContextToInputs() {
184
+ const ctx = this.searchContext;
185
+ this.applyFiltersToInputs(ctx.userFilters.filtersSnapshot // this.filterContext.filtersSnapshot (old)
186
+ );
151
187
  }
152
188
  applyFiltersToInputs(filters) {
153
189
  this.log.warn('applyFiltersToInputs', filters);
@@ -171,19 +207,21 @@ export class ElderSearchContextDirective {
171
207
  .filter(s => !!s.queryKey)
172
208
  .map(s => new Filter(s.queryKey, s.queryValue));
173
209
  }
174
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchContextDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
175
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: ElderSearchContextDirective, selector: "[elderSearchContext]", inputs: { filterContext: ["elderSearchContext", "filterContext"], forcedFilters: "forcedFilters" }, exportAs: ["elderSearchContext"], ngImport: i0 }); }
210
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchContextDirective, deps: [{ token: i1.SearchContextService }], target: i0.ɵɵFactoryTarget.Directive }); }
211
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: ElderSearchContextDirective, selector: "[elderSearchContext]", inputs: { searchContextId: "searchContextId", filterContext: ["elderSearchContext", "filterContext"], forcedFilters: "forcedFilters" }, exportAs: ["elderSearchContext"], ngImport: i0 }); }
176
212
  }
177
213
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ElderSearchContextDirective, decorators: [{
178
214
  type: Directive,
179
215
  args: [{
180
- selector: "[elderSearchContext]",
181
- exportAs: "elderSearchContext"
216
+ selector: '[elderSearchContext]',
217
+ exportAs: 'elderSearchContext'
182
218
  }]
183
- }], ctorParameters: function () { return []; }, propDecorators: { filterContext: [{
219
+ }], ctorParameters: function () { return [{ type: i1.SearchContextService }]; }, propDecorators: { searchContextId: [{
220
+ type: Input
221
+ }], filterContext: [{
184
222
  type: Input,
185
- args: ["elderSearchContext"]
223
+ args: ['elderSearchContext']
186
224
  }], forcedFilters: [{
187
225
  type: Input
188
226
  }] } });
189
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItc2VhcmNoLWNvbnRleHQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWxkZXJieXRlL25neC1zdGFydGVyL3NyYy9saWIvY29tcG9uZW50cy9mb3Jtcy9zZWFyY2gvZWxkZXItc2VhcmNoLWNvbnRleHQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBbUMsU0FBUyxFQUFFLEtBQUssRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUM3RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUU1RSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQzs7QUFFN0Q7OztHQUdHO0FBS0gsTUFBTSxPQUFPLDJCQUEyQjtJQW9CdEM7Ozs7Z0ZBSTRFO0lBRTVFO1FBeEJBOzs7O29GQUk0RTtRQUVwRSxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRTNDLFFBQUcsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckQsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFL0Is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QUM5RCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtZQUM1QixJQUFJLE1BQU0sQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLElBQUksRUFBRTtnQkFDN0IsT0FBTyxNQUFNLENBQUM7YUFDZjtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsTUFBMEI7UUFDakQsT0FBTyxNQUFNO2FBQ1YsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7YUFDekIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDOytHQTdNVSwyQkFBMkI7bUdBQTNCLDJCQUEyQjs7NEZBQTNCLDJCQUEyQjtrQkFKdkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsc0JBQXNCO29CQUNoQyxRQUFRLEVBQUUsb0JBQW9CO2lCQUMvQjswRUF5RlksYUFBYTtzQkFEdkIsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBMkJoQixhQUFhO3NCQUR2QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgRGlyZWN0aXZlLCBJbnB1dCwgT25EZXN0cm95IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IExvZ2dlckZhY3RvcnkgfSBmcm9tIFwiQGVsZGVyYnl0ZS90cy1sb2dnZXJcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqcy9pbnRlcm5hbC9PYnNlcnZhYmxlXCI7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0V2l0aCwgZGVib3VuY2VUaW1lLCBtYXAsIHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBTZWFyY2hJbnB1dCB9IGZyb20gXCIuL21vZGVsL3NlYXJjaC1pbnB1dFwiO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSBcInJ4anMvaW50ZXJuYWwvQmVoYXZpb3JTdWJqZWN0XCI7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcInJ4anMvaW50ZXJuYWwvU3ViamVjdFwiO1xuaW1wb3J0IHsgRmlsdGVyIH0gZnJvbSBcIi4uLy4uLy4uL2NvbW1vbi9kYXRhL2ZpbHRlcnMvZmlsdGVyXCI7XG5pbXBvcnQgeyBGaWx0ZXJDb250ZXh0IH0gZnJvbSBcIi4uLy4uLy4uL2NvbW1vbi9kYXRhL2ZpbHRlcnMvZmlsdGVyLWNvbnRleHRcIjtcbmltcG9ydCB7IFNlYXJjaElucHV0U3RhdGUgfSBmcm9tIFwiLi9tb2RlbC9zZWFyY2gtaW5wdXQtc3RhdGVcIjtcbmltcG9ydCB7Y29tYmluZUxhdGVzdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0ZpbHRlclV0aWx9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi91dGlscy9maWx0ZXItdXRpbCc7XG5cbi8qKlxuICogVGhlIHNlYXJjaCBjb250YWluZXIgbWFuYWdlcyBhIGdyb3VwIG9mIHNlYXJjaC1pbnB1dHNcbiAqIGFuZCBob2xkcyB0aGVpciB2YWx1ZXMgaW4gYSBjZW50cmFsIHNlYXJjaCBtb2RlbC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBcIltlbGRlclNlYXJjaENvbnRleHRdXCIsXG4gIGV4cG9ydEFzOiBcImVsZGVyU2VhcmNoQ29udGV4dFwiXG59KVxuZXhwb3J0IGNsYXNzIEVsZGVyU2VhcmNoQ29udGV4dERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCB7XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIEZpZWxkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSBfZm9yY2VkRmlsdGVycyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZpbHRlcltdPihbXSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlYXJjaElucHV0cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNlYXJjaElucHV0W10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2VhcmNoU3RhdGVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2VhcmNoSW5wdXRTdGF0ZVtdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZpbHRlckNvbnRleHQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGaWx0ZXJDb250ZXh0PihudWxsKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgdXNlckZpbHRlcnMkOiBPYnNlcnZhYmxlPEZpbHRlcltdPjtcblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogQ29uc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnVzZXJGaWx0ZXJzJCA9IHRoaXMuX2ZpbHRlckNvbnRleHQkLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoY3R4ID0+IGN0eC5maWx0ZXJzKSxcbiAgICAgIGNvbWJpbmVMYXRlc3RXaXRoKHRoaXMuX2ZvcmNlZEZpbHRlcnMkKSxcbiAgICAgIG1hcCgoW2FsbEZpbHRlcnMsIGZvcmNlZEZpbHRlcnNdKSA9PiB7XG4gICAgICAgIHJldHVybiBGaWx0ZXJVdGlsLnN0cmlwKGFsbEZpbHRlcnMsIGZvcmNlZEZpbHRlcnMpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIExpZmUgQ3ljbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLl9zZWFyY2hJbnB1dHMkLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICBzd2l0Y2hNYXAoaW5wdXRzID0+IGNvbWJpbmVMYXRlc3QoaW5wdXRzLm1hcChpID0+IGkuc3RhdGUkKSkpLFxuICAgICAgY29tYmluZUxhdGVzdFdpdGgodGhpcy5fZm9yY2VkRmlsdGVycyQpLFxuICAgICAgZGVib3VuY2VUaW1lKDUpXG4gICAgKS5zdWJzY3JpYmUoKFtzdGF0ZXMsIGZvcmNlZEZpbHRlcnNdKSA9PiB7XG4gICAgICB0aGlzLl9zZWFyY2hTdGF0ZXMkLm5leHQoc3RhdGVzKTtcbiAgICAgIGNvbnN0IHVzZXJGaWx0ZXJzID0gdGhpcy5jb252ZXJ0VG9GaWx0ZXJzKHN0YXRlcyk7XG4gICAgICB0aGlzLmFwcGx5RmlsdGVycyh1c2VyRmlsdGVycywgZm9yY2VkRmlsdGVycyk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5RmlsdGVycyhcbiAgICB1c2VyRmlsdGVyczogRmlsdGVyW10sXG4gICAgZm9yY2VkRmlsdGVyczogRmlsdGVyW11cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZmlsdGVyQ29udGV4dDtcbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgY29udGV4dC51cGRhdGVGaWx0ZXJzKHVzZXJGaWx0ZXJzKTtcbiAgICAgIGNvbnRleHQubWVyZ2VGaWx0ZXJzKGZvcmNlZEZpbHRlcnMpO1xuICAgICAgdGhpcy5sb2cudHJhY2UoXCJTZWFyY2gtTW9kZWwgZmlsdGVycyB1cGRhdGVkOlwiLCBBcnJheS5mcm9tKGNvbnRleHQuZmlsdGVyc1NuYXBzaG90KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJGYWlsZWQgdG8gYXBwbHkgZmlsdGVycyBzaW5jZSBubyBGaWx0ZXJDb250ZXh0IGlzIGF2YWlsYWJsZSFcIiwge1xuICAgICAgICB1c2VyRmlsdGVyczogdXNlckZpbHRlcnMsXG4gICAgICAgIGZvcmNlZEZpbHRlcnM6IGZvcmNlZEZpbHRlcnNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5hcHBseU1vZGVsVG9JbnB1dHMoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBASW5wdXQoXCJlbGRlclNlYXJjaENvbnRleHRcIilcbiAgcHVibGljIHNldCBmaWx0ZXJDb250ZXh0KHZhbHVlOiBGaWx0ZXJDb250ZXh0IHwgXCJcIikge1xuICAgIGxldCBjb250ZXh0OiBGaWx0ZXJDb250ZXh0O1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb250ZXh0ID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy53YXJuKFwiSWxsZWdhbCB2YWx1ZSBwcm92aWRlZCBmb3IgcHJvcGVydHkgZmlsdGVyQ29udGV4dDogXCIsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIklsbGVnYWwgdmFsdWUgcHJvdmlkZWQgZm9yIHByb3BlcnR5IGZpbHRlckNvbnRleHQhIFwiICsgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0ID0gRmlsdGVyQ29udGV4dC5lbXB0eSgpO1xuICAgIH1cbiAgICB0aGlzLl9maWx0ZXJDb250ZXh0JC5uZXh0KGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWx0ZXJDb250ZXh0KCk6IEZpbHRlckNvbnRleHQge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJDb250ZXh0JC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlZCBmaWx0ZXJzIGFyZSBhbHdheXMgbWVyZ2VkIGludG8gdGhlIGZpbmFsIEZpbHRlckNvbnRleHQuXG4gICAqXG4gICAqIFRoaXMgbWVhbnMgdGhleSBvdmVycmlkZSB1c2VyIGRlZmluZWQgZmlsdGVycywgYnV0IGF0dGVtcHRcbiAgICogdG8gYWxzbyBrZWVwIHRoZSB1c2VycyBpbnRlbnQgKGJ5IG1lcmdpbmcpIHRoZW0uXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGZvcmNlZEZpbHRlcnMoZmlsdGVyczogRmlsdGVyW10pIHtcbiAgICB0aGlzLl9mb3JjZWRGaWx0ZXJzJC5uZXh0KGZpbHRlcnMpO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JjZWRGaWx0ZXJzKCk6IEZpbHRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fZm9yY2VkRmlsdGVycyQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXR0cmlidXRlcygpOiBPYnNlcnZhYmxlPFNlYXJjaElucHV0W10+IHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoSW5wdXRzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXR0cmlidXRlc1NuYXBzaG90KCk6IFNlYXJjaElucHV0W10ge1xuICAgIHJldHVybiB0aGlzLl9zZWFyY2hJbnB1dHMkLmdldFZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN0YXRlcyQoKTogT2JzZXJ2YWJsZTxTZWFyY2hJbnB1dFN0YXRlW10+IHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoU3RhdGVzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc3RhdGVzU25hcHNob3QoKTogU2VhcmNoSW5wdXRTdGF0ZVtdIHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoU3RhdGVzJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdXNlciB0b3VjaGVkIGF0dHJpYnV0ZXMuIChpZ25vcmluZyBmYWxsYmFja3MpXG4gICAqL1xuICBwdWJsaWMgZ2V0IHVzZXJEZWZpbmVkQXR0cmlidXRlcyQoKTogT2JzZXJ2YWJsZTxTZWFyY2hJbnB1dFN0YXRlW10+IHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZXMkLnBpcGUoXG4gICAgICBtYXAoc3RhdGVzID0+IHN0YXRlcy5maWx0ZXIocyA9PiAhcy5wcmlzdGluZSkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQdWJsaWMgQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIG5ldyBzZWFyY2ggbmFtZSBpbiB0aGlzIGNvbnRhaW5lclxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyKHNlYXJjaElucHV0OiBTZWFyY2hJbnB1dCk6IHZvaWQge1xuICAgIHRoaXMubG9nLmRlYnVnKFwiUmVnaXN0ZXJpbmcgc2VhcmNoIGlucHV0IFtcIiArIHNlYXJjaElucHV0Lm5hbWUgKyBcIl1cIik7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuX3NlYXJjaElucHV0cyQuZ2V0VmFsdWUoKTtcbiAgICB0aGlzLl9zZWFyY2hJbnB1dHMkLm5leHQoWy4uLmN1cnJlbnQsIHNlYXJjaElucHV0XSk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5hdHRyaWJ1dGVzU25hcHNob3RcbiAgICAgIC5maWx0ZXIoYXR0ciA9PiAhYXR0ci5yZWFkb25seSlcbiAgICAgIC5mb3JFYWNoKGEgPT4ge1xuICAgICAgICBhLnJlc2V0KCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQcml2YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHB1YmxpYyBhcHBseU1vZGVsVG9JbnB1dHMoKTogdm9pZCB7XG4gICAgdGhpcy5hcHBseUZpbHRlcnNUb0lucHV0cyhcbiAgICAgICAgdGhpcy5maWx0ZXJDb250ZXh0LmZpbHRlcnNTbmFwc2hvdFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5RmlsdGVyc1RvSW5wdXRzKGZpbHRlcnM6IEZpbHRlcltdKTogdm9pZCB7XG4gICAgdGhpcy5sb2cud2FybignYXBwbHlGaWx0ZXJzVG9JbnB1dHMnLCBmaWx0ZXJzKTtcbiAgICB0aGlzLl9zZWFyY2hJbnB1dHMkLmdldFZhbHVlKCkuZm9yRWFjaChpbnB1dCA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmZpbmRGaWx0ZXJGb3JJbnB1dChpbnB1dCwgZmlsdGVycyk7XG4gICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgIGlucHV0LmFwcGx5SW5pdGlhbFZhbHVlKGZpbHRlci52YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRGaWx0ZXJGb3JJbnB1dChpbnB1dDogU2VhcmNoSW5wdXQsIGZpbHRlcnM6IEZpbHRlcltdKTogRmlsdGVyIHtcbiAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBmaWx0ZXJzKSB7XG4gICAgICBpZiAoZmlsdGVyLmtleSA9PT0gaW5wdXQubmFtZSkge1xuICAgICAgICByZXR1cm4gZmlsdGVyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFRvRmlsdGVycyhzdGF0ZXM6IFNlYXJjaElucHV0U3RhdGVbXSk6IEZpbHRlcltdIHtcbiAgICByZXR1cm4gc3RhdGVzXG4gICAgICAuZmlsdGVyKHMgPT4gISFzLnF1ZXJ5S2V5KVxuICAgICAgLm1hcChzID0+IG5ldyBGaWx0ZXIocy5xdWVyeUtleSwgcy5xdWVyeVZhbHVlKSk7XG4gIH1cbn1cblxuIl19
227
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItc2VhcmNoLWNvbnRleHQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWxkZXJieXRlL25neC1zdGFydGVyL3NyYy9saWIvY29tcG9uZW50cy9mb3Jtcy9zZWFyY2gvZWxkZXItc2VhcmNoLWNvbnRleHQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBa0MsU0FBUyxFQUFFLEtBQUssRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDbkcsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZHLE9BQU8sRUFBQyxlQUFlLEVBQUUsT0FBTyxFQUFjLGFBQWEsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUV6RSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDM0QsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDZDQUE2QyxDQUFDO0FBRzFFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sbUNBQW1DLENBQUM7OztBQUU3RDs7Ozs7O0dBTUc7QUFLSCxNQUFNLE9BQU8sMkJBQTJCO0lBbUJ0Qzs7OztnRkFJNEU7SUFFNUUsWUFDRSxvQkFBMEM7UUF4QjVDOzs7O29GQUk0RTtRQUUzRCxRQUFHLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXJELGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRS9CLG1CQUFjLEdBQUcsSUFBSSxlQUFlLENBQWdCLEVBQUUs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ZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0xvZ2dlckZhY3Rvcnl9IGZyb20gJ0BlbGRlcmJ5dGUvdHMtbG9nZ2VyJztcbmltcG9ydCB7Y29tYmluZUxhdGVzdFdpdGgsIGRlYm91bmNlVGltZSwgZmlsdGVyLCBtYXAsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7U2VhcmNoSW5wdXR9IGZyb20gJy4vZG9tYWluL2lucHV0L3NlYXJjaC1pbnB1dCc7XG5pbXBvcnQge0ZpbHRlcn0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2RhdGEvZmlsdGVycy9maWx0ZXInO1xuaW1wb3J0IHtGaWx0ZXJDb250ZXh0fSBmcm9tICcuLi8uLi8uLi9jb21tb24vZGF0YS9maWx0ZXJzL2ZpbHRlci1jb250ZXh0JztcbmltcG9ydCB7U2VhcmNoSW5wdXRTdGF0ZX0gZnJvbSAnLi9kb21haW4vaW5wdXQvc2VhcmNoLWlucHV0LXN0YXRlJztcbmltcG9ydCB7U2VhcmNoQ29udGV4dFNlcnZpY2V9IGZyb20gJy4vZG9tYWluL2NvbnRleHQvc2VhcmNoLWNvbnRleHQuc2VydmljZSc7XG5pbXBvcnQge1NlYXJjaENvbnRleHR9IGZyb20gJy4vZG9tYWluL2NvbnRleHQvc2VhcmNoLWNvbnRleHQnO1xuaW1wb3J0IHtGaWx0ZXJVdGlsfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdXRpbHMvZmlsdGVyLXV0aWwnO1xuXG4vKipcbiAqIFRoZSBTZWFyY2hDb250ZXh0RGlyZWN0aXZlIGJpbmRzIGEgZ3JvdXAgb2Ygc2VhcmNoLWlucHV0c1xuICogdG8gYSBTZWFyY2hDb250ZXh0IHdpdGggYSB0d28td2F5IGJpbmRpbmcuXG4gKlxuICogSXQgYWxzbyBiaW5kcyB0aGUgU2VhcmNoQ29udGV4dCB0byBhIEZpbHRlckNvbnRleHQgKERhdGFDb250ZXh0KS5cbiAqIFRPRE8gTWF5YmUgc2VwYXJhdGUgdGhpcz8/XG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tlbGRlclNlYXJjaENvbnRleHRdJyxcbiAgZXhwb3J0QXM6ICdlbGRlclNlYXJjaENvbnRleHQnXG59KVxuZXhwb3J0IGNsYXNzIEVsZGVyU2VhcmNoQ29udGV4dERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBBZnRlckNvbnRlbnRJbml0IHtcblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogRmllbGRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIHJlYWRvbmx5IGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc2VhcmNoSW5wdXRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2VhcmNoSW5wdXRbXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZWFyY2hTdGF0ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZWFyY2hJbnB1dFN0YXRlW10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVyQ29udGV4dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZpbHRlckNvbnRleHQ+KG51bGwpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlYXJjaENvbnRleHQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZWFyY2hDb250ZXh0PihTZWFyY2hDb250ZXh0LnN0YW5kYWxvbmUoKSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VhcmNoQ29udGV4dElkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihudWxsKTtcblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogQ29uc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBjb25zdHJ1Y3RvcihcbiAgICBzZWFyY2hDb250ZXh0U2VydmljZTogU2VhcmNoQ29udGV4dFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5zZWFyY2hDb250ZXh0SWQkLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICBmaWx0ZXIoY29udGV4dElkID0+ICEhY29udGV4dElkKSxcbiAgICAgIG1hcChjb250ZXh0SWQgPT4gc2VhcmNoQ29udGV4dFNlcnZpY2UuY29udGV4dChjb250ZXh0SWQpKSxcbiAgICApLnN1YnNjcmliZShjdHggPT4gdGhpcy5fc2VhcmNoQ29udGV4dCQubmV4dChjdHgpKTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBMaWZlIEN5Y2xlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFwcGx5RGVmYXVsdEZpbHRlcnNUb1NlYXJjaENvbnRleHQoKTtcbiAgICB0aGlzLnN5bmNTZWFyY2hDb250ZXh0VG9Cb3VuZEZpbHRlckNvbnRleHQoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zeW5jU2VhcmNoSW5wdXRzVG9TZWFyY2hDb250ZXh0KCk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYXBwbHlTZWFyY2hDb250ZXh0VG9JbnB1dHMoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2VhcmNoQ29udGV4dElkKGNvbnRleHRJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWFyY2hDb250ZXh0SWQkLm5leHQoY29udGV4dElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VhcmNoQ29udGV4dElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoQ29udGV4dElkJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWFyY2hDb250ZXh0JCgpOiBPYnNlcnZhYmxlPFNlYXJjaENvbnRleHQ+IHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoQ29udGV4dCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlYXJjaENvbnRleHQoKTogU2VhcmNoQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuX3NlYXJjaENvbnRleHQkLmdldFZhbHVlKCk7XG4gIH1cblxuICBASW5wdXQoJ2VsZGVyU2VhcmNoQ29udGV4dCcpXG4gIHB1YmxpYyBzZXQgZmlsdGVyQ29udGV4dCh2YWx1ZTogRmlsdGVyQ29udGV4dCB8ICcnKSB7XG4gICAgbGV0IGNvbnRleHQ6IEZpbHRlckNvbnRleHQ7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICBjb250ZXh0ID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy53YXJuKCdJbGxlZ2FsIHZhbHVlIHByb3ZpZGVkIGZvciBwcm9wZXJ0eSBmaWx0ZXJDb250ZXh0OiAnLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgdmFsdWUgcHJvdmlkZWQgZm9yIHByb3BlcnR5IGZpbHRlckNvbnRleHQhICcgKyB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQgPSBGaWx0ZXJDb250ZXh0LmVtcHR5KCk7XG4gICAgfVxuICAgIHRoaXMuX2ZpbHRlckNvbnRleHQkLm5leHQoY29udGV4dCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlckNvbnRleHQoKTogRmlsdGVyQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlckNvbnRleHQkLmdldFZhbHVlKCk7XG4gIH1cblxuICAvKipcbiAgICogRm9yY2VkIGZpbHRlcnMgYXJlIGFsd2F5cyBtZXJnZWQgaW50byB0aGUgZmluYWwgRmlsdGVyQ29udGV4dC5cbiAgICpcbiAgICogVGhpcyBtZWFucyB0aGV5IG92ZXJyaWRlIHVzZXIgZGVmaW5lZCBmaWx0ZXJzLCBidXQgYXR0ZW1wdFxuICAgKiB0byBhbHNvIGtlZXAgdGhlIHVzZXJzIGludGVudCAoYnkgbWVyZ2luZykgdGhlbS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZm9yY2VkRmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJbXSkge1xuICAgIHRoaXMuc2VhcmNoQ29udGV4dC5yZXBsYWNlRm9yY2VkRmlsdGVycyhmaWx0ZXJzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9yY2VkRmlsdGVycygpOiBGaWx0ZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoQ29udGV4dC5mb3JjZWRGaWx0ZXJzLmZpbHRlcnNTbmFwc2hvdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXR0cmlidXRlcygpOiBPYnNlcnZhYmxlPFNlYXJjaElucHV0W10+IHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoSW5wdXRzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXR0cmlidXRlc1NuYXBzaG90KCk6IFNlYXJjaElucHV0W10ge1xuICAgIHJldHVybiB0aGlzLl9zZWFyY2hJbnB1dHMkLmdldFZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN0YXRlcyQoKTogT2JzZXJ2YWJsZTxTZWFyY2hJbnB1dFN0YXRlW10+IHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoU3RhdGVzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc3RhdGVzU25hcHNob3QoKTogU2VhcmNoSW5wdXRTdGF0ZVtdIHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoU3RhdGVzJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdXNlciB0b3VjaGVkIGF0dHJpYnV0ZXMuIChpZ25vcmluZyBmYWxsYmFja3MpXG4gICAqL1xuICBwdWJsaWMgZ2V0IHVzZXJEZWZpbmVkQXR0cmlidXRlcyQoKTogT2JzZXJ2YWJsZTxTZWFyY2hJbnB1dFN0YXRlW10+IHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZXMkLnBpcGUoXG4gICAgICBtYXAoc3RhdGVzID0+IHN0YXRlcy5maWx0ZXIocyA9PiAhcy5wcmlzdGluZSkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQdWJsaWMgQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIG5ldyBzZWFyY2ggbmFtZSBpbiB0aGlzIGNvbnRhaW5lclxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyKHNlYXJjaElucHV0OiBTZWFyY2hJbnB1dCk6IHZvaWQge1xuICAgIHRoaXMubG9nLmRlYnVnKCdSZWdpc3RlcmluZyBzZWFyY2ggaW5wdXQgWycgKyBzZWFyY2hJbnB1dC5uYW1lICsgJ10nKTtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fc2VhcmNoSW5wdXRzJC5nZXRWYWx1ZSgpO1xuICAgIHRoaXMuX3NlYXJjaElucHV0cyQubmV4dChbLi4uY3VycmVudCwgc2VhcmNoSW5wdXRdKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmF0dHJpYnV0ZXNTbmFwc2hvdFxuICAgICAgLmZpbHRlcihhdHRyID0+ICFhdHRyLnJlYWRvbmx5KVxuICAgICAgLmZvckVhY2goYSA9PiB7XG4gICAgICAgIGEucmVzZXQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIFByaXZhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSBhcHBseURlZmF1bHRGaWx0ZXJzVG9TZWFyY2hDb250ZXh0KCk6IHZvaWQge1xuICAgIGNvbnN0IGRjRmlsdGVycyA9IHRoaXMuZmlsdGVyQ29udGV4dDtcbiAgICBjb25zdCBzZWFyY2hDb250ZXh0ID0gdGhpcy5zZWFyY2hDb250ZXh0O1xuICAgIGlmIChzZWFyY2hDb250ZXh0LnVzZXJGaWx0ZXJzLmlzRW1wdHkpIHtcbiAgICAgIGlmICghZGNGaWx0ZXJzLmlzRW1wdHkpIHtcbiAgICAgICAgLy8gQ29uc2lkZXIgYWxsIGZpbHRlcnMgaW4gREMgYXMgZGVmYXVsdHMsIGV4cGVjdCBmb3IgZm9jZWQgZmlsdGVycy5cbiAgICAgICAgc2VhcmNoQ29udGV4dC51cGRhdGVVc2VyRmlsdGVycyhcbiAgICAgICAgICBGaWx0ZXJVdGlsLnN0cmlwKFxuICAgICAgICAgICAgZGNGaWx0ZXJzLmZpbHRlcnNTbmFwc2hvdCxcbiAgICAgICAgICAgIHRoaXMuZm9yY2VkRmlsdGVyc1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZGNGaWx0ZXJzLnJlcGxhY2VGaWx0ZXJzKFxuICAgICAgICBzZWFyY2hDb250ZXh0LnVzZXJGaWx0ZXJzLmZpbHRlcnNTbmFwc2hvdFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN5bmNTZWFyY2hJbnB1dHNUb1NlYXJjaENvbnRleHQoKTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXRGaWx0ZXJzJCA9IHRoaXMuX3NlYXJjaElucHV0cyQucGlwZShcbiAgICAgIHN3aXRjaE1hcChpbnB1dHMgPT4gY29tYmluZUxhdGVzdChpbnB1dHMubWFwKGkgPT4gaS5zdGF0ZSQpKSksXG4gICAgICBkZWJvdW5jZVRpbWUoNSksXG4gICAgICB0YXAoc3RhdGVzID0+IHRoaXMuX3NlYXJjaFN0YXRlcyQubmV4dChzdGF0ZXMpKSxcbiAgICAgIG1hcChzdGF0ZXMgPT4gdGhpcy5jb252ZXJ0VG9GaWx0ZXJzKHN0YXRlcykpXG4gICAgKTtcblxuICAgIGlucHV0RmlsdGVycyRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgIGNvbWJpbmVMYXRlc3RXaXRoKHRoaXMuX3NlYXJjaENvbnRleHQkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoW2lucHV0RmlsdGVycywgc2VhcmNoQ29udGV4dF0pID0+IHtcbiAgICAgICAgc2VhcmNoQ29udGV4dC51cGRhdGVVc2VyRmlsdGVycyhpbnB1dEZpbHRlcnMpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN5bmNTZWFyY2hDb250ZXh0VG9Cb3VuZEZpbHRlckNvbnRleHQoKTogdm9pZCB7XG4gICAgdGhpcy5fc2VhcmNoQ29udGV4dCQucGlwZShcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgIHN3aXRjaE1hcChjb250ZXh0ID0+IGNvbnRleHQuYWxsRmlsdGVyc0NoYW5nZWQpXG4gICAgKS5zdWJzY3JpYmUoYWxsRmlsdGVycyA9PiB0aGlzLmFwcGx5VG9Cb3VuZEZpbHRlckNvbnRleHQoYWxsRmlsdGVycykpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVRvQm91bmRGaWx0ZXJDb250ZXh0KGZpbHRlcnM6IEZpbHRlcltdKTogdm9pZCB7XG4gICAgY29uc3QgZmlsdGVyQ3R4ID0gdGhpcy5maWx0ZXJDb250ZXh0O1xuICAgIGlmIChmaWx0ZXJDdHgpIHtcbiAgICAgIGZpbHRlckN0eC5yZXBsYWNlRmlsdGVycyhmaWx0ZXJzKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdBcHBsaWVkIEZpbHRlcnMgb2YgU2VhcmNoQ29udGV4dCAnK3RoaXMuc2VhcmNoQ29udGV4dElkKycgdG8gRGF0YUNvbnRleHQgRmlsdGVyQ29udGV4dC4nLCBmaWx0ZXJzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2cud2FybignRmFpbGVkIHRvIGFwcGx5IGZpbHRlcnMgc2luY2Ugbm8gRmlsdGVyQ29udGV4dCBpcyBhdmFpbGFibGUhJywgZmlsdGVycyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFwcGx5U2VhcmNoQ29udGV4dFRvSW5wdXRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuc2VhcmNoQ29udGV4dDtcbiAgICB0aGlzLmFwcGx5RmlsdGVyc1RvSW5wdXRzKFxuICAgICAgY3R4LnVzZXJGaWx0ZXJzLmZpbHRlcnNTbmFwc2hvdCAvLyB0aGlzLmZpbHRlckNvbnRleHQuZmlsdGVyc1NuYXBzaG90IChvbGQpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXJzVG9JbnB1dHMoZmlsdGVyczogRmlsdGVyW10pOiB2b2lkIHtcbiAgICB0aGlzLmxvZy53YXJuKCdhcHBseUZpbHRlcnNUb0lucHV0cycsIGZpbHRlcnMpO1xuICAgIHRoaXMuX3NlYXJjaElucHV0cyQuZ2V0VmFsdWUoKS5mb3JFYWNoKGlucHV0ID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZmluZEZpbHRlckZvcklucHV0KGlucHV0LCBmaWx0ZXJzKTtcbiAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgaW5wdXQuYXBwbHlJbml0aWFsVmFsdWUoZmlsdGVyLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEZpbHRlckZvcklucHV0KGlucHV0OiBTZWFyY2hJbnB1dCwgZmlsdGVyczogRmlsdGVyW10pOiBGaWx0ZXIge1xuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGZpbHRlcnMpIHtcbiAgICAgIGlmIChmaWx0ZXIua2V5ID09PSBpbnB1dC5uYW1lKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0VG9GaWx0ZXJzKHN0YXRlczogU2VhcmNoSW5wdXRTdGF0ZVtdKTogRmlsdGVyW10ge1xuICAgIHJldHVybiBzdGF0ZXNcbiAgICAgIC5maWx0ZXIocyA9PiAhIXMucXVlcnlLZXkpXG4gICAgICAubWFwKHMgPT4gbmV3IEZpbHRlcihzLnF1ZXJ5S2V5LCBzLnF1ZXJ5VmFsdWUpKTtcbiAgfVxuXG5cbn1cblxuIl19