@angular-architects/ngrx-toolkit 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,7 +1,220 @@
1
- # ngrx-toolkit
2
-
3
- This library was generated with [Nx](https://nx.dev).
4
-
5
- ## Running unit tests
6
-
7
- Run `nx test ngrx-toolkit` to execute the unit tests.
1
+ # NgRx Toolkit
2
+
3
+ <p align="center">
4
+ <img src="https://raw.githubusercontent.com/angular-architects/ngrx-toolkit/main/logo.png" width="320" style="text-align: center">
5
+ </p>
6
+
7
+ NgRx Toolkit is an extension to the NgRx Signals Store. **It is still in beta** but already offers following features:
8
+
9
+ - Devtools: Integration into Redux Devtools
10
+ - Redux: Possibility to use the Redux Pattern (Reducer, Actions, Effects)
11
+
12
+ To install it, run
13
+
14
+ ```shell
15
+ npm i @angular-architects/ngrx-toolkit
16
+ ```
17
+
18
+ ## Devtools: `withDevtools()`
19
+
20
+ This extension is very easy to use. Just add it to a `signalStore`. Example:
21
+
22
+ ```typescript
23
+ export const FlightStore = signalStore(
24
+ { providedIn: 'root' },
25
+ withDevtools('flights'), // <-- add this
26
+ withState({ flights: [] as Flight[] }),
27
+ // ...
28
+ );
29
+ ```
30
+
31
+ ## Redux: `withRedux()`
32
+
33
+ `withRedux()` bring back the Redux pattern into the Signal Store.
34
+
35
+ It can be combined with any other extension of the Signal Store.
36
+
37
+ Example:
38
+
39
+ ```typescript
40
+ export const FlightStore = signalStore(
41
+ { providedIn: 'root' },
42
+ withState({ flights: [] as Flight[] }),
43
+ withRedux({
44
+ actions: {
45
+ public: {
46
+ load: payload<{ from: string; to: string }>(),
47
+ },
48
+ private: {
49
+ loaded: payload<{ flights: Flight[] }>(),
50
+ },
51
+ },
52
+ reducer(actions, on) {
53
+ on(actions.loaded, ({ flights }, state) => {
54
+ patchState(state, 'flights loaded', { flights });
55
+ });
56
+ },
57
+ effects(actions, create) {
58
+ const httpClient = inject(HttpClient);
59
+ return {
60
+ load$: create(actions.load).pipe(
61
+ switchMap(({ from, to }) =>
62
+ httpClient.get<Flight[]>(
63
+ 'https://demo.angulararchitects.io/api/flight',
64
+ {
65
+ params: new HttpParams().set('from', from).set('to', to),
66
+ },
67
+ ),
68
+ ),
69
+ tap((flights) => actions.loaded({ flights })),
70
+ ),
71
+ };
72
+ },
73
+ }),
74
+ );
75
+ ```
76
+
77
+ ## DataService `withDataService()`
78
+
79
+ `withDataService()` allows to connect a Data Service to the store:
80
+
81
+ This gives you a store for a CRUD use case:
82
+
83
+ ```typescript
84
+ export const SimpleFlightBookingStore = signalStore(
85
+ { providedIn: 'root' },
86
+ withCallState(),
87
+ withEntities<Flight>(),
88
+ withDataService({
89
+ dataServiceType: FlightService,
90
+ filter: { from: 'Paris', to: 'New York' },
91
+ }),
92
+ withUndoRedo(),
93
+ );
94
+ ```
95
+
96
+ The features ``withCallState`` and ``withUndoRedo`` are optional, but when present, they enrich each other.
97
+
98
+ The Data Service needs to implement the ``DataService`` interface:
99
+
100
+ ```typescript
101
+ @Injectable({
102
+ providedIn: 'root'
103
+ })
104
+ export class FlightService implements DataService<Flight, FlightFilter> {
105
+ loadById(id: EntityId): Promise<Flight> { ... }
106
+ load(filter: FlightFilter): Promise<Flight[]> { ... }
107
+
108
+ create(entity: Flight): Promise<Flight> { ... }
109
+ update(entity: Flight): Promise<Flight> { ... }
110
+ delete(entity: Flight): Promise<void> { ... }
111
+ [...]
112
+ }
113
+ ```
114
+
115
+ Once the store is defined, it gives its consumers numerous signals and methods they just need to delegate to:
116
+
117
+ ```typescript
118
+ @Component(...)
119
+ export class FlightSearchSimpleComponent {
120
+ private store = inject(SimpleFlightBookingStore);
121
+
122
+ from = this.store.filter.from;
123
+ to = this.store.filter.to;
124
+ flights = this.store.entities;
125
+ selected = this.store.selectedEntities;
126
+ selectedIds = this.store.selectedIds;
127
+
128
+ loading = this.store.loading;
129
+
130
+ canUndo = this.store.canUndo;
131
+ canRedo = this.store.canRedo;
132
+
133
+ async search() {
134
+ this.store.load();
135
+ }
136
+
137
+ undo(): void {
138
+ this.store.undo();
139
+ }
140
+
141
+ redo(): void {
142
+ this.store.redo();
143
+ }
144
+
145
+ updateCriteria(from: string, to: string): void {
146
+ this.store.updateFilter({ from, to });
147
+ }
148
+
149
+ updateBasket(id: number, selected: boolean): void {
150
+ this.store.updateSelected(id, selected);
151
+ }
152
+
153
+ }
154
+ ```
155
+
156
+ ## DataService with Dynamic Properties
157
+
158
+ To avoid naming conflicts, the properties set up by ``withDataService`` and the connected features can be configured in a typesafe way:
159
+
160
+ ```typescript
161
+ export const FlightBookingStore = signalStore(
162
+ { providedIn: 'root' },
163
+ withCallState({
164
+ collection: 'flight'
165
+ }),
166
+ withEntities({
167
+ entity: type<Flight>(),
168
+ collection: 'flight'
169
+ }),
170
+ withDataService({
171
+ dataServiceType: FlightService,
172
+ filter: { from: 'Graz', to: 'Hamburg' },
173
+ collection: 'flight'
174
+ }),
175
+ withUndoRedo({
176
+ collections: ['flight'],
177
+ }),
178
+ );
179
+ ```
180
+
181
+ This setup makes them use ``flight`` as part of the used property names. As these implementations respect the Type Script type system, the compiler will make sure these properties are used in a typesafe way:
182
+
183
+ ```typescript
184
+ @Component(...)
185
+ export class FlightSearchDynamicComponent {
186
+ private store = inject(FlightBookingStore);
187
+
188
+ from = this.store.flightFilter.from;
189
+ to = this.store.flightFilter.to;
190
+ flights = this.store.flightEntities;
191
+ selected = this.store.selectedFlightEntities;
192
+ selectedIds = this.store.selectedFlightIds;
193
+
194
+ loading = this.store.flightLoading;
195
+
196
+ canUndo = this.store.canUndo;
197
+ canRedo = this.store.canRedo;
198
+
199
+ async search() {
200
+ this.store.loadFlightEntities();
201
+ }
202
+
203
+ undo(): void {
204
+ this.store.undo();
205
+ }
206
+
207
+ redo(): void {
208
+ this.store.redo();
209
+ }
210
+
211
+ updateCriteria(from: string, to: string): void {
212
+ this.store.updateFlightFilter({ from, to });
213
+ }
214
+
215
+ updateBasket(id: number, selected: boolean): void {
216
+ this.store.updateSelectedFlightEntities(id, selected);
217
+ }
218
+
219
+ }
220
+ ```
package/esm2022/index.mjs CHANGED
@@ -1,3 +1,6 @@
1
1
  export { withDevtools, patchState } from './lib/with-devtools';
2
2
  export * from './lib/with-redux';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RSxjQUFjLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgd2l0aERldnRvb2xzLCBwYXRjaFN0YXRlLCBBY3Rpb24gfSBmcm9tICcuL2xpYi93aXRoLWRldnRvb2xzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3dpdGgtcmVkdXgnO1xuIl19
3
+ export * from './lib/with-call-state';
4
+ export * from './lib/with-undo-redo';
5
+ export * from './lib/with-data-service';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RSxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgd2l0aERldnRvb2xzLCBwYXRjaFN0YXRlLCBBY3Rpb24gfSBmcm9tICcuL2xpYi93aXRoLWRldnRvb2xzJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvd2l0aC1yZWR1eCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3dpdGgtY2FsbC1zdGF0ZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3dpdGgtdW5kby1yZWRvJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvd2l0aC1kYXRhLXNlcnZpY2UnO1xyXG4iXX0=
@@ -3,4 +3,4 @@ export function assertActionFnSpecs(obj) {
3
3
  throw new Error('%o is not an Action Specification');
4
4
  }
5
5
  }
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmdyeC10b29sa2l0L3NyYy9saWIvYXNzZXJ0aW9ucy9hc3NlcnRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsR0FBWTtJQUVaLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztLQUN0RDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY3Rpb25zRm5TcGVjcyB9IGZyb20gJy4uL3dpdGgtcmVkdXgnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QWN0aW9uRm5TcGVjcyhcbiAgb2JqOiB1bmtub3duXG4pOiBhc3NlcnRzIG9iaiBpcyBBY3Rpb25zRm5TcGVjcyB7XG4gIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCclbyBpcyBub3QgYW4gQWN0aW9uIFNwZWNpZmljYXRpb24nKTtcbiAgfVxufVxuIl19
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmdyeC10b29sa2l0L3NyYy9saWIvYXNzZXJ0aW9ucy9hc3NlcnRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsR0FBWTtJQUVaLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztLQUN0RDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY3Rpb25zRm5TcGVjcyB9IGZyb20gJy4uL3dpdGgtcmVkdXgnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFjdGlvbkZuU3BlY3MoXHJcbiAgb2JqOiB1bmtub3duXHJcbik6IGFzc2VydHMgb2JqIGlzIEFjdGlvbnNGblNwZWNzIHtcclxuICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCclbyBpcyBub3QgYW4gQWN0aW9uIFNwZWNpZmljYXRpb24nKTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1wdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvbGliL3NoYXJlZC9lbXB0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcclxuZXhwb3J0IHR5cGUgRW10cHkgPSB7fTsiXX0=
@@ -0,0 +1,58 @@
1
+ import { computed } from '@angular/core';
2
+ import { signalStoreFeature, withComputed, withState, } from '@ngrx/signals';
3
+ export function getCallStateKeys(config) {
4
+ const prop = config?.collection;
5
+ return {
6
+ callStateKey: prop ? `${config.collection}CallState` : 'callState',
7
+ loadingKey: prop ? `${config.collection}Loading` : 'loading',
8
+ loadedKey: prop ? `${config.collection}Loaded` : 'loaded',
9
+ errorKey: prop ? `${config.collection}Error` : 'error',
10
+ };
11
+ }
12
+ export function withCallState(config) {
13
+ const { callStateKey, errorKey, loadedKey, loadingKey } = getCallStateKeys(config);
14
+ return signalStoreFeature(withState({ [callStateKey]: 'init' }), withComputed((state) => {
15
+ const callState = state[callStateKey];
16
+ return {
17
+ [loadingKey]: computed(() => callState() === 'loading'),
18
+ [loadedKey]: computed(() => callState() === 'loaded'),
19
+ [errorKey]: computed(() => {
20
+ const v = callState();
21
+ return typeof v === 'object' ? v.error : null;
22
+ })
23
+ };
24
+ }));
25
+ }
26
+ export function setLoading(prop) {
27
+ if (prop) {
28
+ return { [`${prop}CallState`]: 'loading' };
29
+ }
30
+ return { callState: 'loading' };
31
+ }
32
+ export function setLoaded(prop) {
33
+ if (prop) {
34
+ return { [`${prop}CallState`]: 'loaded' };
35
+ }
36
+ else {
37
+ return { callState: 'loaded' };
38
+ }
39
+ }
40
+ export function setError(error, prop) {
41
+ let errorMessage = '';
42
+ if (!error) {
43
+ errorMessage = '';
44
+ }
45
+ else if (typeof error === 'object' && 'message' in error) {
46
+ errorMessage = String(error.message);
47
+ }
48
+ else {
49
+ errorMessage = String(error);
50
+ }
51
+ if (prop) {
52
+ return { [`${prop}CallState`]: { error: errorMessage } };
53
+ }
54
+ else {
55
+ return { callState: { error: errorMessage } };
56
+ }
57
+ }
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1jYWxsLXN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3J4LXRvb2xraXQvc3JjL2xpYi93aXRoLWNhbGwtc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBRUwsa0JBQWtCLEVBQ2xCLFlBQVksRUFDWixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUEyQnZCLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFnQztJQUMvRCxNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsVUFBVSxDQUFDO0lBQ2hDLE9BQU87UUFDTCxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBRSxHQUFHLE1BQU0sQ0FBQyxVQUFVLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVztRQUNuRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUM1RCxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUTtRQUN6RCxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTztLQUN2RCxDQUFDO0FBQ0osQ0FBQztBQW9CRCxNQUFNLFVBQVUsYUFBYSxDQUE0QixNQUV4RDtJQUNDLE1BQU0sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsR0FDckQsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFM0IsT0FBTyxrQkFBa0IsQ0FDdkIsU0FBUyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUNyQyxZQUFZLENBQUMsQ0FBQyxLQUFzQyxFQUFFLEVBQUU7UUFFdEQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBc0IsQ0FBQztRQUUzRCxPQUFPO1lBQ0wsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLEtBQUssU0FBUyxDQUFDO1lBQ3ZELENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxLQUFLLFFBQVEsQ0FBQztZQUNyRCxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3hCLE1BQU0sQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDO2dCQUN0QixPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ2hELENBQUMsQ0FBQztTQUNILENBQUE7SUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxVQUFVLENBQ3hCLElBQVc7SUFFWCxJQUFJLElBQUksRUFBRTtRQUNSLE9BQU8sRUFBRSxDQUFDLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxTQUFTLEVBQStCLENBQUM7S0FDekU7SUFFRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDO0FBQ2xDLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUN2QixJQUFXO0lBR1gsSUFBSSxJQUFJLEVBQUU7UUFDUixPQUFPLEVBQUUsQ0FBQyxHQUFHLElBQUksV0FBVyxDQUFDLEVBQUUsUUFBUSxFQUErQixDQUFDO0tBQ3hFO1NBQ0k7UUFDSCxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDO0tBRWhDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxRQUFRLENBQ3RCLEtBQWMsRUFDZCxJQUFXO0lBR1QsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO0lBRXRCLElBQUksQ0FBQyxLQUFLLEVBQUU7UUFDVixZQUFZLEdBQUcsRUFBRSxDQUFDO0tBQ25CO1NBQ0ksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksU0FBUyxJQUFJLEtBQUssRUFBRTtRQUN4RCxZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUN0QztTQUNJO1FBQ0gsWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM5QjtJQUdELElBQUksSUFBSSxFQUFFO1FBQ1IsT0FBTyxFQUFFLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxFQUErQixDQUFDO0tBQ3ZGO1NBQ0k7UUFDSCxPQUFPLEVBQUUsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxFQUFFLENBQUM7S0FDL0M7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2lnbmFsLCBjb21wdXRlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIFNpZ25hbFN0b3JlRmVhdHVyZSxcclxuICBzaWduYWxTdG9yZUZlYXR1cmUsXHJcbiAgd2l0aENvbXB1dGVkLFxyXG4gIHdpdGhTdGF0ZSxcclxufSBmcm9tICdAbmdyeC9zaWduYWxzJztcclxuaW1wb3J0IHsgRW10cHkgfSBmcm9tICcuL3NoYXJlZC9lbXB0eSc7XHJcblxyXG5leHBvcnQgdHlwZSBDYWxsU3RhdGUgPSAnaW5pdCcgfCAnbG9hZGluZycgfCAnbG9hZGVkJyB8IHsgZXJyb3I6IHN0cmluZyB9O1xyXG5cclxuZXhwb3J0IHR5cGUgTmFtZWRDYWxsU3RhdGVTbGljZTxDb2xsZWN0aW9uIGV4dGVuZHMgc3RyaW5nPiA9IHtcclxuICBbSyBpbiBDb2xsZWN0aW9uIGFzIGAke0t9Q2FsbFN0YXRlYF06IENhbGxTdGF0ZTtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIENhbGxTdGF0ZVNsaWNlID0ge1xyXG4gIGNhbGxTdGF0ZTogQ2FsbFN0YXRlXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIE5hbWVkQ2FsbFN0YXRlU2lnbmFsczxQcm9wIGV4dGVuZHMgc3RyaW5nPiA9IHtcclxuICBbSyBpbiBQcm9wIGFzIGAke0t9TG9hZGluZ2BdOiBTaWduYWw8Ym9vbGVhbj47XHJcbn0gJiB7XHJcbiAgICBbSyBpbiBQcm9wIGFzIGAke0t9TG9hZGVkYF06IFNpZ25hbDxib29sZWFuPjtcclxuICB9ICYge1xyXG4gICAgW0sgaW4gUHJvcCBhcyBgJHtLfUVycm9yYF06IFNpZ25hbDxzdHJpbmcgfCBudWxsPjtcclxuICB9IFxyXG5cclxuZXhwb3J0IHR5cGUgQ2FsbFN0YXRlU2lnbmFscyA9IHtcclxuICBsb2FkaW5nOiBTaWduYWw8Ym9vbGVhbj47XHJcbiAgbG9hZGVkOiBTaWduYWw8Ym9vbGVhbj47XHJcbiAgZXJyb3I6IFNpZ25hbDxzdHJpbmcgfCBudWxsPlxyXG59IFxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENhbGxTdGF0ZUtleXMoY29uZmlnPzogeyBjb2xsZWN0aW9uPzogc3RyaW5nIH0pIHtcclxuICBjb25zdCBwcm9wID0gY29uZmlnPy5jb2xsZWN0aW9uO1xyXG4gIHJldHVybiB7XHJcbiAgICBjYWxsU3RhdGVLZXk6IHByb3AgPyAgYCR7Y29uZmlnLmNvbGxlY3Rpb259Q2FsbFN0YXRlYCA6ICdjYWxsU3RhdGUnLFxyXG4gICAgbG9hZGluZ0tleTogcHJvcCA/IGAke2NvbmZpZy5jb2xsZWN0aW9ufUxvYWRpbmdgIDogJ2xvYWRpbmcnLFxyXG4gICAgbG9hZGVkS2V5OiBwcm9wID8gYCR7Y29uZmlnLmNvbGxlY3Rpb259TG9hZGVkYCA6ICdsb2FkZWQnLFxyXG4gICAgZXJyb3JLZXk6IHByb3AgPyBgJHtjb25maWcuY29sbGVjdGlvbn1FcnJvcmAgOiAnZXJyb3InLFxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB3aXRoQ2FsbFN0YXRlPENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmc+KGNvbmZpZzoge1xyXG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb247XHJcbn0pOiBTaWduYWxTdG9yZUZlYXR1cmU8XHJcbiAgeyBzdGF0ZTogRW10cHksIHNpZ25hbHM6IEVtdHB5LCBtZXRob2RzOiBFbXRweSB9LFxyXG4gIHtcclxuICAgIHN0YXRlOiBOYW1lZENhbGxTdGF0ZVNsaWNlPENvbGxlY3Rpb24+LFxyXG4gICAgc2lnbmFsczogTmFtZWRDYWxsU3RhdGVTaWduYWxzPENvbGxlY3Rpb24+LFxyXG4gICAgbWV0aG9kczogRW10cHlcclxuICB9XHJcbj47XHJcbmV4cG9ydCBmdW5jdGlvbiB3aXRoQ2FsbFN0YXRlKCk6IFNpZ25hbFN0b3JlRmVhdHVyZTxcclxuICB7IHN0YXRlOiBFbXRweSwgc2lnbmFsczogRW10cHksIG1ldGhvZHM6IEVtdHB5IH0sXHJcbiAge1xyXG4gICAgc3RhdGU6IENhbGxTdGF0ZVNsaWNlLFxyXG4gICAgc2lnbmFsczogQ2FsbFN0YXRlU2lnbmFscyxcclxuICAgIG1ldGhvZHM6IEVtdHB5XHJcbiAgfVxyXG4+O1xyXG5leHBvcnQgZnVuY3Rpb24gd2l0aENhbGxTdGF0ZTxDb2xsZWN0aW9uIGV4dGVuZHMgc3RyaW5nPihjb25maWc/OiB7XHJcbiAgY29sbGVjdGlvbjogQ29sbGVjdGlvbjtcclxufSk6IFNpZ25hbFN0b3JlRmVhdHVyZSB7XHJcbiAgY29uc3QgeyBjYWxsU3RhdGVLZXksIGVycm9yS2V5LCBsb2FkZWRLZXksIGxvYWRpbmdLZXkgfSA9XHJcbiAgICBnZXRDYWxsU3RhdGVLZXlzKGNvbmZpZyk7XHJcblxyXG4gIHJldHVybiBzaWduYWxTdG9yZUZlYXR1cmUoXHJcbiAgICB3aXRoU3RhdGUoeyBbY2FsbFN0YXRlS2V5XTogJ2luaXQnIH0pLFxyXG4gICAgd2l0aENvbXB1dGVkKChzdGF0ZTogUmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+PikgPT4ge1xyXG5cclxuICAgICAgY29uc3QgY2FsbFN0YXRlID0gc3RhdGVbY2FsbFN0YXRlS2V5XSBhcyBTaWduYWw8Q2FsbFN0YXRlPjtcclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgW2xvYWRpbmdLZXldOiBjb21wdXRlZCgoKSA9PiBjYWxsU3RhdGUoKSA9PT0gJ2xvYWRpbmcnKSxcclxuICAgICAgICBbbG9hZGVkS2V5XTogY29tcHV0ZWQoKCkgPT4gY2FsbFN0YXRlKCkgPT09ICdsb2FkZWQnKSxcclxuICAgICAgICBbZXJyb3JLZXldOiBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCB2ID0gY2FsbFN0YXRlKCk7XHJcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIHYgPT09ICdvYmplY3QnID8gdi5lcnJvciA6IG51bGw7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0TG9hZGluZzxQcm9wIGV4dGVuZHMgc3RyaW5nPihcclxuICBwcm9wPzogUHJvcFxyXG4pOiBOYW1lZENhbGxTdGF0ZVNsaWNlPFByb3A+IHwgQ2FsbFN0YXRlU2xpY2Uge1xyXG4gIGlmIChwcm9wKSB7XHJcbiAgICByZXR1cm4geyBbYCR7cHJvcH1DYWxsU3RhdGVgXTogJ2xvYWRpbmcnIH0gYXMgTmFtZWRDYWxsU3RhdGVTbGljZTxQcm9wPjtcclxuICB9XHJcblxyXG4gIHJldHVybiB7IGNhbGxTdGF0ZTogJ2xvYWRpbmcnIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2FkZWQ8UHJvcCBleHRlbmRzIHN0cmluZz4oXHJcbiAgcHJvcD86IFByb3BcclxuKTogTmFtZWRDYWxsU3RhdGVTbGljZTxQcm9wPiB8IENhbGxTdGF0ZVNsaWNlIHtcclxuXHJcbiAgaWYgKHByb3ApIHtcclxuICAgIHJldHVybiB7IFtgJHtwcm9wfUNhbGxTdGF0ZWBdOiAnbG9hZGVkJyB9IGFzIE5hbWVkQ2FsbFN0YXRlU2xpY2U8UHJvcD47XHJcbiAgfVxyXG4gIGVsc2Uge1xyXG4gICAgcmV0dXJuIHsgY2FsbFN0YXRlOiAnbG9hZGVkJyB9O1xyXG5cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRFcnJvcjxQcm9wIGV4dGVuZHMgc3RyaW5nPihcclxuICBlcnJvcjogdW5rbm93bixcclxuICBwcm9wPzogUHJvcCxcclxuICApOiBOYW1lZENhbGxTdGF0ZVNsaWNlPFByb3A+IHwgQ2FsbFN0YXRlU2xpY2Uge1xyXG5cclxuICAgIGxldCBlcnJvck1lc3NhZ2UgPSAnJztcclxuXHJcbiAgICBpZiAoIWVycm9yKSB7XHJcbiAgICAgIGVycm9yTWVzc2FnZSA9ICcnO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiAnbWVzc2FnZScgaW4gZXJyb3IpIHtcclxuICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nKGVycm9yLm1lc3NhZ2UpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZyhlcnJvcik7XHJcbiAgICB9XHJcbiAgICBcclxuXHJcbiAgICBpZiAocHJvcCkge1xyXG4gICAgICByZXR1cm4geyBbYCR7cHJvcH1DYWxsU3RhdGVgXTogeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0gfSBhcyBOYW1lZENhbGxTdGF0ZVNsaWNlPFByb3A+O1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiB7IGNhbGxTdGF0ZTogeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0gfTtcclxuICAgIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,147 @@
1
+ import { computed, inject } from "@angular/core";
2
+ import { patchState, signalStoreFeature, withComputed, withMethods, withState } from "@ngrx/signals";
3
+ import { getCallStateKeys, setError, setLoaded, setLoading } from "./with-call-state";
4
+ import { setAllEntities, addEntity, updateEntity, removeEntity } from "@ngrx/signals/entities";
5
+ export function capitalize(str) {
6
+ return str ? str[0].toUpperCase() + str.substring(1) : str;
7
+ }
8
+ export function getDataServiceKeys(options) {
9
+ const filterKey = options.collection ? `${options.collection}Filter` : 'filter';
10
+ const selectedIdsKey = options.collection ? `selected${capitalize(options.collection)}Ids` : 'selectedIds';
11
+ const selectedEntitiesKey = options.collection ? `selected${capitalize(options.collection)}Entities` : 'selectedEntities';
12
+ const updateFilterKey = options.collection ? `update${capitalize(options.collection)}Filter` : 'updateFilter';
13
+ const updateSelectedKey = options.collection ? `updateSelected${capitalize(options.collection)}Entities` : 'updateSelected';
14
+ const loadKey = options.collection ? `load${capitalize(options.collection)}Entities` : 'load';
15
+ const currentKey = options.collection ? `current${capitalize(options.collection)}` : 'current';
16
+ const loadByIdKey = options.collection ? `load${capitalize(options.collection)}ById` : 'loadById';
17
+ const setCurrentKey = options.collection ? `setCurrent${capitalize(options.collection)}` : 'setCurrent';
18
+ const createKey = options.collection ? `create${capitalize(options.collection)}` : 'create';
19
+ const updateKey = options.collection ? `update${capitalize(options.collection)}` : 'update';
20
+ const deleteKey = options.collection ? `delete${capitalize(options.collection)}` : 'delete';
21
+ // TODO: Take these from @ngrx/signals/entities, when they are exported
22
+ const entitiesKey = options.collection ? `${options.collection}Entities` : 'entities';
23
+ const entityMapKey = options.collection ? `${options.collection}EntityMap` : 'entityMap';
24
+ const idsKey = options.collection ? `${options.collection}Ids` : 'ids';
25
+ return {
26
+ filterKey,
27
+ selectedIdsKey,
28
+ selectedEntitiesKey,
29
+ updateFilterKey,
30
+ updateSelectedKey,
31
+ loadKey,
32
+ entitiesKey,
33
+ entityMapKey,
34
+ idsKey,
35
+ currentKey,
36
+ loadByIdKey,
37
+ setCurrentKey,
38
+ createKey,
39
+ updateKey,
40
+ deleteKey
41
+ };
42
+ }
43
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
44
+ export function withDataService(options) {
45
+ const { dataServiceType, filter, collection: prefix } = options;
46
+ const { entitiesKey, filterKey, loadKey, selectedEntitiesKey, selectedIdsKey, updateFilterKey, updateSelectedKey, currentKey, createKey, updateKey, deleteKey, loadByIdKey, setCurrentKey } = getDataServiceKeys(options);
47
+ const { callStateKey } = getCallStateKeys({ collection: prefix });
48
+ return signalStoreFeature(withState(() => ({
49
+ [filterKey]: filter,
50
+ [selectedIdsKey]: {},
51
+ [currentKey]: undefined
52
+ })), withComputed((store) => {
53
+ const entities = store[entitiesKey];
54
+ const selectedIds = store[selectedIdsKey];
55
+ return {
56
+ [selectedEntitiesKey]: computed(() => entities().filter(e => selectedIds()[e.id]))
57
+ };
58
+ }), withMethods((store) => {
59
+ const dataService = inject(dataServiceType);
60
+ return {
61
+ [updateFilterKey]: (filter) => {
62
+ patchState(store, { [filterKey]: filter });
63
+ },
64
+ [updateSelectedKey]: (id, selected) => {
65
+ patchState(store, (state) => ({
66
+ [selectedIdsKey]: {
67
+ ...state[selectedIdsKey],
68
+ [id]: selected,
69
+ }
70
+ }));
71
+ },
72
+ [loadKey]: async () => {
73
+ const filter = store[filterKey];
74
+ store[callStateKey] && patchState(store, setLoading(prefix));
75
+ try {
76
+ const result = await dataService.load(filter());
77
+ patchState(store, prefix ? setAllEntities(result, { collection: prefix }) : setAllEntities(result));
78
+ store[callStateKey] && patchState(store, setLoaded(prefix));
79
+ }
80
+ catch (e) {
81
+ store[callStateKey] && patchState(store, setError(e, prefix));
82
+ throw e;
83
+ }
84
+ },
85
+ [loadByIdKey]: async (id) => {
86
+ store[callStateKey] && patchState(store, setLoading(prefix));
87
+ try {
88
+ const current = await dataService.loadById(id);
89
+ store[callStateKey] && patchState(store, setLoaded(prefix));
90
+ patchState(store, { [currentKey]: current });
91
+ }
92
+ catch (e) {
93
+ store[callStateKey] && patchState(store, setError(e, prefix));
94
+ throw e;
95
+ }
96
+ },
97
+ [setCurrentKey]: (current) => {
98
+ patchState(store, { [currentKey]: current });
99
+ },
100
+ [createKey]: async (entity) => {
101
+ patchState(store, { [currentKey]: entity });
102
+ store[callStateKey] && patchState(store, setLoading(prefix));
103
+ try {
104
+ const created = await dataService.create(entity);
105
+ patchState(store, { [currentKey]: created });
106
+ patchState(store, prefix ? addEntity(created, { collection: prefix }) : addEntity(created));
107
+ store[callStateKey] && patchState(store, setLoaded(prefix));
108
+ }
109
+ catch (e) {
110
+ store[callStateKey] && patchState(store, setError(e, prefix));
111
+ throw e;
112
+ }
113
+ },
114
+ [updateKey]: async (entity) => {
115
+ patchState(store, { [currentKey]: entity });
116
+ store[callStateKey] && patchState(store, setLoading(prefix));
117
+ try {
118
+ const updated = await dataService.update(entity);
119
+ patchState(store, { [currentKey]: updated });
120
+ // Why do we need this cast to Partial<Entity>?
121
+ const updateArg = { id: updated.id, changes: updated };
122
+ patchState(store, prefix ? updateEntity(updateArg, { collection: prefix }) : updateEntity(updateArg));
123
+ store[callStateKey] && patchState(store, setLoaded(prefix));
124
+ }
125
+ catch (e) {
126
+ store[callStateKey] && patchState(store, setError(e, prefix));
127
+ throw e;
128
+ }
129
+ },
130
+ [deleteKey]: async (entity) => {
131
+ patchState(store, { [currentKey]: entity });
132
+ store[callStateKey] && patchState(store, setLoading(prefix));
133
+ try {
134
+ await dataService.delete(entity);
135
+ patchState(store, { [currentKey]: undefined });
136
+ patchState(store, prefix ? removeEntity(entity.id, { collection: prefix }) : removeEntity(entity.id));
137
+ store[callStateKey] && patchState(store, setLoaded(prefix));
138
+ }
139
+ catch (e) {
140
+ store[callStateKey] && patchState(store, setError(e, prefix));
141
+ throw e;
142
+ }
143
+ },
144
+ };
145
+ }));
146
+ }
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1kYXRhLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvbGliL3dpdGgtZGF0YS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBeUIsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQXNCLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6SCxPQUFPLEVBQWEsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRyxPQUFPLEVBQUUsY0FBYyxFQUFZLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFnQnpHLE1BQU0sVUFBVSxVQUFVLENBQUMsR0FBVztJQUNsQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE9BQWdDO0lBQy9ELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVUsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDaEYsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztJQUMzRyxNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxVQUFVLENB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QUFZLENBQUMsSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2lCQUMvRDtnQkFDRCxPQUFPLENBQUMsRUFBRTtvQkFDTixLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQzlELE1BQU0sQ0FBQyxDQUFDO2lCQUNYO1lBQ0wsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDLENBQUMsQ0FDTCxDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb3ZpZGVyVG9rZW4sIFNpZ25hbCwgY29tcHV0ZWQsIGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFNpZ25hbFN0b3JlRmVhdHVyZSwgcGF0Y2hTdGF0ZSwgc2lnbmFsU3RvcmVGZWF0dXJlLCB3aXRoQ29tcHV0ZWQsIHdpdGhNZXRob2RzLCB3aXRoU3RhdGUgfSBmcm9tIFwiQG5ncngvc2lnbmFsc1wiO1xyXG5pbXBvcnQgeyBDYWxsU3RhdGUsIGdldENhbGxTdGF0ZUtleXMsIHNldEVycm9yLCBzZXRMb2FkZWQsIHNldExvYWRpbmcgfSBmcm9tIFwiLi93aXRoLWNhbGwtc3RhdGVcIjtcclxuaW1wb3J0IHsgc2V0QWxsRW50aXRpZXMsIEVudGl0eUlkLCBhZGRFbnRpdHksIHVwZGF0ZUVudGl0eSwgcmVtb3ZlRW50aXR5IH0gZnJvbSBcIkBuZ3J4L3NpZ25hbHMvZW50aXRpZXNcIjtcclxuaW1wb3J0IHsgRW50aXR5U3RhdGUsIE5hbWVkRW50aXR5U2lnbmFscyB9IGZyb20gXCJAbmdyeC9zaWduYWxzL2VudGl0aWVzL3NyYy9tb2RlbHNcIjtcclxuaW1wb3J0IHsgU3RhdGVTaWduYWwgfSBmcm9tIFwiQG5ncngvc2lnbmFscy9zcmMvc3RhdGUtc2lnbmFsXCI7XHJcbmltcG9ydCB7IEVtdHB5IH0gZnJvbSBcIi4vc2hhcmVkL2VtcHR5XCI7XHJcblxyXG5leHBvcnQgdHlwZSBGaWx0ZXIgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuZXhwb3J0IHR5cGUgRW50aXR5ID0geyBpZDogRW50aXR5SWQgfTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVNlcnZpY2U8RSBleHRlbmRzIEVudGl0eSwgRiBleHRlbmRzIEZpbHRlcj4ge1xyXG4gICAgbG9hZChmaWx0ZXI6IEYpOiBQcm9taXNlPEVbXT47XHJcbiAgICBsb2FkQnlJZChpZDogRW50aXR5SWQpOiBQcm9taXNlPEU+O1xyXG4gICAgY3JlYXRlKGVudGl0eTogRSk6IFByb21pc2U8RT47XHJcbiAgICB1cGRhdGUoZW50aXR5OiBFKTogUHJvbWlzZTxFPjtcclxuICAgIGRlbGV0ZShlbnRpdHk6IEUpOiBQcm9taXNlPHZvaWQ+O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gc3RyID8gc3RyWzBdLnRvVXBwZXJDYXNlKCkgKyBzdHIuc3Vic3RyaW5nKDEpIDogc3RyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YVNlcnZpY2VLZXlzKG9wdGlvbnM6IHsgY29sbGVjdGlvbj86IHN0cmluZyB9KSB7XHJcbiAgICBjb25zdCBmaWx0ZXJLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgJHtvcHRpb25zLmNvbGxlY3Rpb259RmlsdGVyYCA6ICdmaWx0ZXInO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRJZHNLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgc2VsZWN0ZWQke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1JZHNgIDogJ3NlbGVjdGVkSWRzJztcclxuICAgIGNvbnN0IHNlbGVjdGVkRW50aXRpZXNLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgc2VsZWN0ZWQke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1FbnRpdGllc2AgOiAnc2VsZWN0ZWRFbnRpdGllcyc7XHJcblxyXG4gICAgY29uc3QgdXBkYXRlRmlsdGVyS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYHVwZGF0ZSR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfUZpbHRlcmAgOiAndXBkYXRlRmlsdGVyJztcclxuICAgIGNvbnN0IHVwZGF0ZVNlbGVjdGVkS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYHVwZGF0ZVNlbGVjdGVkJHtjYXBpdGFsaXplKG9wdGlvbnMuY29sbGVjdGlvbil9RW50aXRpZXNgIDogJ3VwZGF0ZVNlbGVjdGVkJztcclxuICAgIGNvbnN0IGxvYWRLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgbG9hZCR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfUVudGl0aWVzYCA6ICdsb2FkJztcclxuXHJcbiAgICBjb25zdCBjdXJyZW50S2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYGN1cnJlbnQke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1gIDogJ2N1cnJlbnQnO1xyXG4gICAgY29uc3QgbG9hZEJ5SWRLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgbG9hZCR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfUJ5SWRgIDogJ2xvYWRCeUlkJztcclxuICAgIGNvbnN0IHNldEN1cnJlbnRLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgc2V0Q3VycmVudCR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfWAgOiAnc2V0Q3VycmVudCc7XHJcbiAgICBjb25zdCBjcmVhdGVLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgY3JlYXRlJHtjYXBpdGFsaXplKG9wdGlvbnMuY29sbGVjdGlvbil9YCA6ICdjcmVhdGUnO1xyXG4gICAgY29uc3QgdXBkYXRlS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYHVwZGF0ZSR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfWAgOiAndXBkYXRlJztcclxuICAgIGNvbnN0IGRlbGV0ZUtleSA9IG9wdGlvbnMuY29sbGVjdGlvbiA/IGBkZWxldGUke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1gIDogJ2RlbGV0ZSc7XHJcblxyXG4gICAgLy8gVE9ETzogVGFrZSB0aGVzZSBmcm9tIEBuZ3J4L3NpZ25hbHMvZW50aXRpZXMsIHdoZW4gdGhleSBhcmUgZXhwb3J0ZWRcclxuICAgIGNvbnN0IGVudGl0aWVzS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYCR7b3B0aW9ucy5jb2xsZWN0aW9ufUVudGl0aWVzYCA6ICdlbnRpdGllcyc7XHJcbiAgICBjb25zdCBlbnRpdHlNYXBLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb24gPyBgJHtvcHRpb25zLmNvbGxlY3Rpb259RW50aXR5TWFwYCA6ICdlbnRpdHlNYXAnO1xyXG4gICAgY29uc3QgaWRzS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uID8gYCR7b3B0aW9ucy5jb2xsZWN0aW9ufUlkc2AgOiAnaWRzJztcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGZpbHRlcktleSxcclxuICAgICAgICBzZWxlY3RlZElkc0tleSxcclxuICAgICAgICBzZWxlY3RlZEVudGl0aWVzS2V5LFxyXG4gICAgICAgIHVwZGF0ZUZpbHRlcktleSxcclxuICAgICAgICB1cGRhdGVTZWxlY3RlZEtleSxcclxuICAgICAgICBsb2FkS2V5LFxyXG4gICAgICAgIGVudGl0aWVzS2V5LFxyXG4gICAgICAgIGVudGl0eU1hcEtleSxcclxuICAgICAgICBpZHNLZXksXHJcblxyXG4gICAgICAgIGN1cnJlbnRLZXksXHJcbiAgICAgICAgbG9hZEJ5SWRLZXksXHJcbiAgICAgICAgc2V0Q3VycmVudEtleSxcclxuICAgICAgICBjcmVhdGVLZXksXHJcbiAgICAgICAgdXBkYXRlS2V5LFxyXG4gICAgICAgIGRlbGV0ZUtleVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTmFtZWREYXRhU2VydmljZVN0YXRlPEUgZXh0ZW5kcyBFbnRpdHksIEYgZXh0ZW5kcyBGaWx0ZXIsIENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmc+ID1cclxuICAgIHtcclxuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGAke0t9RmlsdGVyYF06IEY7XHJcbiAgICB9ICYge1xyXG4gICAgICAgIFtLIGluIENvbGxlY3Rpb24gYXMgYHNlbGVjdGVkJHtDYXBpdGFsaXplPEs+fUlkc2BdOiBSZWNvcmQ8RW50aXR5SWQsIGJvb2xlYW4+O1xyXG4gICAgfSAmIHtcclxuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGBjdXJyZW50JHtDYXBpdGFsaXplPEs+fWBdOiBFO1xyXG4gICAgfVxyXG5cclxuZXhwb3J0IHR5cGUgRGF0YVNlcnZpY2VTdGF0ZTxFIGV4dGVuZHMgRW50aXR5LCBGIGV4dGVuZHMgRmlsdGVyPiA9IHtcclxuICAgIGZpbHRlcjogRjtcclxuICAgIHNlbGVjdGVkSWRzOiBSZWNvcmQ8RW50aXR5SWQsIGJvb2xlYW4+O1xyXG4gICAgY3VycmVudDogRTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTmFtZWREYXRhU2VydmljZVNpZ25hbHM8RSBleHRlbmRzIEVudGl0eSwgQ29sbGVjdGlvbiBleHRlbmRzIHN0cmluZz4gPVxyXG4gICAge1xyXG4gICAgICAgIFtLIGluIENvbGxlY3Rpb24gYXMgYHNlbGVjdGVkJHtDYXBpdGFsaXplPEs+fUVudGl0aWVzYF06IFNpZ25hbDxFW10+O1xyXG4gICAgfVxyXG5cclxuZXhwb3J0IHR5cGUgRGF0YVNlcnZpY2VTaWduYWxzPEUgZXh0ZW5kcyBFbnRpdHk+ID1cclxuICAgIHtcclxuICAgICAgICBzZWxlY3RlZEVudGl0aWVzOiBTaWduYWw8RVtdPjtcclxuICAgIH1cclxuXHJcbmV4cG9ydCB0eXBlIE5hbWVkRGF0YVNlcnZpY2VNZXRob2RzPEUgZXh0ZW5kcyBFbnRpdHksIEYgZXh0ZW5kcyBGaWx0ZXIsIENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmc+ID1cclxuICAgIHtcclxuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGB1cGRhdGUke0NhcGl0YWxpemU8Sz59RmlsdGVyYF06IChmaWx0ZXI6IEYpID0+IHZvaWQ7XHJcbiAgICB9ICZcclxuICAgIHtcclxuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGB1cGRhdGVTZWxlY3RlZCR7Q2FwaXRhbGl6ZTxLPn1FbnRpdGllc2BdOiAoaWQ6IEVudGl0eUlkLCBzZWxlY3RlZDogYm9vbGVhbikgPT4gdm9pZDtcclxuICAgIH0gJlxyXG4gICAge1xyXG4gICAgICAgIFtLIGluIENvbGxlY3Rpb24gYXMgYGxvYWQke0NhcGl0YWxpemU8Sz59RW50aXRpZXNgXTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcclxuICAgIH0gJlxyXG5cclxuICAgIHtcclxuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGBzZXRDdXJyZW50JHtDYXBpdGFsaXplPEs+fWBdOiAoZW50aXR5OiBFKSA9PiB2b2lkO1xyXG4gICAgfSAmXHJcbiAgICB7XHJcbiAgICAgICAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgbG9hZCR7Q2FwaXRhbGl6ZTxLPn1CeUlkYF06IChpZDogRW50aXR5SWQpID0+IFByb21pc2U8dm9pZD47XHJcbiAgICB9ICZcclxuICAgIHtcclxuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGBjcmVhdGUke0NhcGl0YWxpemU8Sz59YF06IChlbnRpdHk6IEUpID0+IFByb21pc2U8dm9pZD47XHJcbiAgICB9ICZcclxuICAgIHtcclxuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGB1cGRhdGUke0NhcGl0YWxpemU8Sz59YF06IChlbnRpdHk6IEUpID0+IFByb21pc2U8dm9pZD47XHJcbiAgICB9ICZcclxuICAgIHtcclxuICAgICAgICBbSyBpbiBDb2xsZWN0aW9uIGFzIGBkZWxldGUke0NhcGl0YWxpemU8Sz59YF06IChlbnRpdHk6IEUpID0+IFByb21pc2U8dm9pZD47XHJcbiAgICB9O1xyXG5cclxuXHJcbmV4cG9ydCB0eXBlIERhdGFTZXJ2aWNlTWV0aG9kczxFIGV4dGVuZHMgRW50aXR5LCBGIGV4dGVuZHMgRmlsdGVyPiA9XHJcbiAgICB7XHJcbiAgICAgICAgdXBkYXRlRmlsdGVyOiAoZmlsdGVyOiBGKSA9PiB2b2lkO1xyXG4gICAgICAgIHVwZGF0ZVNlbGVjdGVkOiAoaWQ6IEVudGl0eUlkLCBzZWxlY3RlZDogYm9vbGVhbikgPT4gdm9pZDtcclxuICAgICAgICBsb2FkOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xyXG5cclxuICAgICAgICBzZXRDdXJyZW50KGVudGl0eTogRSk6IHZvaWQ7XHJcbiAgICAgICAgbG9hZEJ5SWQoaWQ6IEVudGl0eUlkKTogUHJvbWlzZTx2b2lkPjtcclxuICAgICAgICBjcmVhdGUoZW50aXR5OiBFKTogUHJvbWlzZTx2b2lkPjtcclxuICAgICAgICB1cGRhdGUoZW50aXR5OiBFKTogUHJvbWlzZTx2b2lkPjtcclxuICAgICAgICBkZWxldGUoZW50aXR5OiBFKTogUHJvbWlzZTx2b2lkPjtcclxuICAgIH1cclxuXHJcbmV4cG9ydCB0eXBlIEVtcHR5ID0gUmVjb3JkPHN0cmluZywgbmV2ZXI+XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gd2l0aERhdGFTZXJ2aWNlPEUgZXh0ZW5kcyBFbnRpdHksIEYgZXh0ZW5kcyBGaWx0ZXIsIENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmc+KG9wdGlvbnM6IHsgZGF0YVNlcnZpY2VUeXBlOiBQcm92aWRlclRva2VuPERhdGFTZXJ2aWNlPEUsIEY+PiwgZmlsdGVyOiBGLCBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uIH0pOiBTaWduYWxTdG9yZUZlYXR1cmU8XHJcbiAgICB7XHJcbiAgICAgICAgc3RhdGU6IEVtdHB5LFxyXG4gICAgICAgIC8vIFRoZXNlIGFsdGVybmF0aXZlcyBicmVhayB0eXBlIGluZmVyZW5jZTogXHJcbiAgICAgICAgLy8gc3RhdGU6IHsgY2FsbFN0YXRlOiBDYWxsU3RhdGUgfSAmIE5hbWVkRW50aXR5U3RhdGU8RSwgQ29sbGVjdGlvbj4sXHJcbiAgICAgICAgLy8gc3RhdGU6IE5hbWVkRW50aXR5U3RhdGU8RSwgQ29sbGVjdGlvbj4sXHJcblxyXG4gICAgICAgIHNpZ25hbHM6IE5hbWVkRW50aXR5U2lnbmFsczxFLCBDb2xsZWN0aW9uPixcclxuICAgICAgICBtZXRob2RzOiBFbXRweSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgc3RhdGU6IE5hbWVkRGF0YVNlcnZpY2VTdGF0ZTxFLCBGLCBDb2xsZWN0aW9uPlxyXG4gICAgICAgIHNpZ25hbHM6IE5hbWVkRGF0YVNlcnZpY2VTaWduYWxzPEUsIENvbGxlY3Rpb24+XHJcbiAgICAgICAgbWV0aG9kczogTmFtZWREYXRhU2VydmljZU1ldGhvZHM8RSwgRiwgQ29sbGVjdGlvbj5cclxuICAgIH1cclxuPjtcclxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEYXRhU2VydmljZTxFIGV4dGVuZHMgRW50aXR5LCBGIGV4dGVuZHMgRmlsdGVyPihvcHRpb25zOiB7IGRhdGFTZXJ2aWNlVHlwZTogUHJvdmlkZXJUb2tlbjxEYXRhU2VydmljZTxFLCBGPj4sIGZpbHRlcjogRiB9KTogU2lnbmFsU3RvcmVGZWF0dXJlPFxyXG4gICAge1xyXG4gICAgICAgIHN0YXRlOiB7IGNhbGxTdGF0ZTogQ2FsbFN0YXRlIH0gJiBFbnRpdHlTdGF0ZTxFPlxyXG4gICAgICAgIHNpZ25hbHM6IEVtdHB5LFxyXG4gICAgICAgIG1ldGhvZHM6IEVtdHB5LFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBzdGF0ZTogRGF0YVNlcnZpY2VTdGF0ZTxFLCBGPlxyXG4gICAgICAgIHNpZ25hbHM6IERhdGFTZXJ2aWNlU2lnbmFsczxFPlxyXG4gICAgICAgIG1ldGhvZHM6IERhdGFTZXJ2aWNlTWV0aG9kczxFLCBGPlxyXG4gICAgfT47XHJcblxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG5leHBvcnQgZnVuY3Rpb24gd2l0aERhdGFTZXJ2aWNlPEUgZXh0ZW5kcyBFbnRpdHksIEYgZXh0ZW5kcyBGaWx0ZXIsIENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmc+KG9wdGlvbnM6IHsgZGF0YVNlcnZpY2VUeXBlOiBQcm92aWRlclRva2VuPERhdGFTZXJ2aWNlPEUsIEY+PiwgZmlsdGVyOiBGLCBjb2xsZWN0aW9uPzogQ29sbGVjdGlvbiB9KTogU2lnbmFsU3RvcmVGZWF0dXJlPGFueSwgYW55PiB7XHJcbiAgICBjb25zdCB7IGRhdGFTZXJ2aWNlVHlwZSwgZmlsdGVyLCBjb2xsZWN0aW9uOiBwcmVmaXggfSA9IG9wdGlvbnM7XHJcbiAgICBjb25zdCB7XHJcbiAgICAgICAgZW50aXRpZXNLZXksXHJcbiAgICAgICAgZmlsdGVyS2V5LFxyXG4gICAgICAgIGxvYWRLZXksXHJcbiAgICAgICAgc2VsZWN0ZWRFbnRpdGllc0tleSxcclxuICAgICAgICBzZWxlY3RlZElkc0tleSxcclxuICAgICAgICB1cGRhdGVGaWx0ZXJLZXksXHJcbiAgICAgICAgdXBkYXRlU2VsZWN0ZWRLZXksXHJcblxyXG4gICAgICAgIGN1cnJlbnRLZXksXHJcbiAgICAgICAgY3JlYXRlS2V5LFxyXG4gICAgICAgIHVwZGF0ZUtleSxcclxuICAgICAgICBkZWxldGVLZXksXHJcbiAgICAgICAgbG9hZEJ5SWRLZXksXHJcbiAgICAgICAgc2V0Q3VycmVudEtleVxyXG4gICAgfSA9IGdldERhdGFTZXJ2aWNlS2V5cyhvcHRpb25zKTtcclxuXHJcbiAgICBjb25zdCB7IGNhbGxTdGF0ZUtleSB9ID0gZ2V0Q2FsbFN0YXRlS2V5cyh7IGNvbGxlY3Rpb246IHByZWZpeCB9KTtcclxuXHJcbiAgICByZXR1cm4gc2lnbmFsU3RvcmVGZWF0dXJlKFxyXG4gICAgICAgIHdpdGhTdGF0ZSgoKSA9PiAoe1xyXG4gICAgICAgICAgICBbZmlsdGVyS2V5XTogZmlsdGVyLFxyXG4gICAgICAgICAgICBbc2VsZWN0ZWRJZHNLZXldOiB7fSBhcyBSZWNvcmQ8RW50aXR5SWQsIGJvb2xlYW4+LFxyXG4gICAgICAgICAgICBbY3VycmVudEtleV06IHVuZGVmaW5lZCBhcyBFIHwgdW5kZWZpbmVkXHJcbiAgICAgICAgfSkpLFxyXG4gICAgICAgIHdpdGhDb21wdXRlZCgoc3RvcmU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVudGl0aWVzID0gc3RvcmVbZW50aXRpZXNLZXldIGFzIFNpZ25hbDxFW10+O1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZElkcyA9IHN0b3JlW3NlbGVjdGVkSWRzS2V5XSBhcyBTaWduYWw8UmVjb3JkPEVudGl0eUlkLCBib29sZWFuPj47XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgW3NlbGVjdGVkRW50aXRpZXNLZXldOiBjb21wdXRlZCgoKSA9PiBlbnRpdGllcygpLmZpbHRlcihlID0+IHNlbGVjdGVkSWRzKClbZS5pZF0pKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgd2l0aE1ldGhvZHMoKHN0b3JlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiAmIFN0YXRlU2lnbmFsPG9iamVjdD4pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YVNlcnZpY2UgPSBpbmplY3QoZGF0YVNlcnZpY2VUeXBlKVxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgW3VwZGF0ZUZpbHRlcktleV06IChmaWx0ZXI6IEYpOiB2b2lkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCB7IFtmaWx0ZXJLZXldOiBmaWx0ZXIgfSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgW3VwZGF0ZVNlbGVjdGVkS2V5XTogKGlkOiBFbnRpdHlJZCwgc2VsZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCAoc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRJZHNLZXldOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZVtzZWxlY3RlZElkc0tleV0gYXMgUmVjb3JkPEVudGl0eUlkLCBib29sZWFuPixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF06IHNlbGVjdGVkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIFtsb2FkS2V5XTogYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IHN0b3JlW2ZpbHRlcktleV0gYXMgU2lnbmFsPEY+O1xyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0TG9hZGluZyhwcmVmaXgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGF0YVNlcnZpY2UubG9hZChmaWx0ZXIoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHByZWZpeCA/IHNldEFsbEVudGl0aWVzKHJlc3VsdCwgeyBjb2xsZWN0aW9uOiBwcmVmaXggfSkgOiBzZXRBbGxFbnRpdGllcyhyZXN1bHQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkZWQocHJlZml4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0RXJyb3IoZSwgcHJlZml4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIFtsb2FkQnlJZEtleV06IGFzeW5jIChpZDogRW50aXR5SWQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldExvYWRpbmcocHJlZml4KSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBkYXRhU2VydmljZS5sb2FkQnlJZChpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0TG9hZGVkKHByZWZpeCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCB7IFtjdXJyZW50S2V5XTogY3VycmVudCB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRFcnJvcihlLCBwcmVmaXgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgW3NldEN1cnJlbnRLZXldOiAoY3VycmVudDogRSk6IHZvaWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHsgW2N1cnJlbnRLZXldOiBjdXJyZW50IH0pO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIFtjcmVhdGVLZXldOiBhc3luYyAoZW50aXR5OiBFKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgeyBbY3VycmVudEtleV06IGVudGl0eSB9KTtcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldExvYWRpbmcocHJlZml4KSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBkYXRhU2VydmljZS5jcmVhdGUoZW50aXR5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgeyBbY3VycmVudEtleV06IGNyZWF0ZWQgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHByZWZpeCA/IGFkZEVudGl0eShjcmVhdGVkLCB7IGNvbGxlY3Rpb246IHByZWZpeCB9KSA6IGFkZEVudGl0eShjcmVhdGVkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0TG9hZGVkKHByZWZpeCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldEVycm9yKGUsIHByZWZpeCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBbdXBkYXRlS2V5XTogYXN5bmMgKGVudGl0eTogRSk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHsgW2N1cnJlbnRLZXldOiBlbnRpdHkgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkaW5nKHByZWZpeCkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgZGF0YVNlcnZpY2UudXBkYXRlKGVudGl0eSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHsgW2N1cnJlbnRLZXldOiB1cGRhdGVkIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaHkgZG8gd2UgbmVlZCB0aGlzIGNhc3QgdG8gUGFydGlhbDxFbnRpdHk+P1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVBcmcgPSB7IGlkOiB1cGRhdGVkLmlkLCBjaGFuZ2VzOiB1cGRhdGVkIGFzIFBhcnRpYWw8RW50aXR5PiB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCBwcmVmaXggPyB1cGRhdGVFbnRpdHkodXBkYXRlQXJnLCB7IGNvbGxlY3Rpb246IHByZWZpeCB9KSA6IHVwZGF0ZUVudGl0eSh1cGRhdGVBcmcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkZWQocHJlZml4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0RXJyb3IoZSwgcHJlZml4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIFtkZWxldGVLZXldOiBhc3luYyAoZW50aXR5OiBFKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgeyBbY3VycmVudEtleV06IGVudGl0eSB9KTtcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldExvYWRpbmcocHJlZml4KSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGRhdGFTZXJ2aWNlLmRlbGV0ZShlbnRpdHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCB7IFtjdXJyZW50S2V5XTogdW5kZWZpbmVkIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCBwcmVmaXggPyByZW1vdmVFbnRpdHkoZW50aXR5LmlkLCB7IGNvbGxlY3Rpb246IHByZWZpeCB9KSA6IHJlbW92ZUVudGl0eShlbnRpdHkuaWQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkZWQocHJlZml4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0RXJyb3IoZSwgcHJlZml4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxufSJdfQ==
@@ -76,4 +76,4 @@ export const patchState = (state, action, ...rest) => {
76
76
  currentActionNames.add(action);
77
77
  return originalPatchState(state, ...rest);
78
78
  };
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1kZXZ0b29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmdyeC10b29sa2l0L3NyYy9saWIvd2l0aC1kZXZ0b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxJQUFJLGtCQUFrQixHQUVqQyxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBaUJuRCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQWtDLEVBQUUsQ0FBQyxDQUFDO0FBRWxFLElBQUksa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztBQUUzQyxJQUFJLDBCQUEwQixHQUFHLEtBQUssQ0FBQztBQUV2QyxTQUFTLG1CQUFtQjtJQUMxQixNQUFNLENBQUMsR0FBRyxFQUFFO1FBQ1YsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLE9BQU87U0FDUjtRQUVELE1BQU0sTUFBTSxHQUFHLGFBQWEsRUFBRSxDQUFDO1FBQy9CLE1BQU0sU0FBUyxHQUE0QixFQUFFLENBQUM7UUFDOUMsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLEVBQUU7WUFDekIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQztTQUMzQjtRQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7UUFDOUQsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUV2QyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxHQUFZLEVBQUUsTUFBYztJQUN0RCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLElBQUksTUFBTSxJQUFJLEdBQUcsRUFBRTtRQUNuRCxPQUFRLEdBQThCLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDaEQ7QUFDSCxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsS0FBYztJQUNwQyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdELElBQUksQ0FBQyxjQUFjLEVBQUU7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0tBQzdDO0lBRUQsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUtELElBQUksVUFBdUMsQ0FBQztBQUU1Qzs7R0FFRztBQUNILE1BQU0sVUFBVSxLQUFLO0lBQ25CLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDdkIsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO0lBQ25DLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FDMUIsSUFBWTtJQUVaLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNmLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksUUFBUSxFQUFFO1lBQ1osT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQztRQUN2RCxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2YsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixVQUFVLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztnQkFDOUIsSUFBSSxFQUFFLG1CQUFtQjthQUMxQixDQUFDLENBQUM7U0FDSjtRQUVELE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLEdBQUcsS0FBSztZQUNSLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVztTQUNwQixDQUFDLENBQUMsQ0FBQztRQUVKLElBQUksQ0FBQywwQkFBMEIsRUFBRTtZQUMvQixtQkFBbUIsRUFBRSxDQUFDO1lBQ3RCLDBCQUEwQixHQUFHLElBQUksQ0FBQztTQUNuQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQVNELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBWSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRTtJQUM1RCxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUM1QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBwYXRjaFN0YXRlIGFzIG9yaWdpbmFsUGF0Y2hTdGF0ZSxcbiAgU2lnbmFsU3RvcmVGZWF0dXJlLFxufSBmcm9tICdAbmdyeC9zaWduYWxzJztcbmltcG9ydCB7IFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCB9IGZyb20gJ0BuZ3J4L3NpZ25hbHMvc3JjL3NpZ25hbC1zdG9yZS1tb2RlbHMnO1xuaW1wb3J0IHsgZWZmZWN0LCBpbmplY3QsIFBMQVRGT1JNX0lELCBzaWduYWwsIFNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybVNlcnZlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXzpcbiAgICAgIHwge1xuICAgICAgICAgIGNvbm5lY3Q6IChvcHRpb25zOiB7IG5hbWU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgICBzZW5kOiAoYWN0aW9uOiBBY3Rpb24sIHN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZDtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxufVxuXG50eXBlIEVtcHR5RmVhdHVyZVJlc3VsdCA9IHsgc3RhdGU6IHt9OyBzaWduYWxzOiB7fTsgbWV0aG9kczoge30gfTtcbmV4cG9ydCB0eXBlIEFjdGlvbiA9IHsgdHlwZTogc3RyaW5nIH07XG5cbmNvbnN0IHN0b3JlUmVnaXN0cnkgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+Pj4oe30pO1xuXG5sZXQgY3VycmVudEFjdGlvbk5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbmxldCBzeW5jaHJvbml6YXRpb25Jbml0aWFsaXplZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBpbml0U3luY2hyb25pemF0aW9uKCkge1xuICBlZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY29ubmVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlcyA9IHN0b3JlUmVnaXN0cnkoKTtcbiAgICBjb25zdCByb290U3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBuYW1lIGluIHN0b3Jlcykge1xuICAgICAgY29uc3Qgc3RvcmUgPSBzdG9yZXNbbmFtZV07XG4gICAgICByb290U3RhdGVbbmFtZV0gPSBzdG9yZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWVzID0gQXJyYXkuZnJvbShjdXJyZW50QWN0aW9uTmFtZXMpO1xuICAgIGNvbnN0IHR5cGUgPSBuYW1lcy5sZW5ndGggPyBuYW1lcy5qb2luKCcsICcpIDogJ1N0b3JlIFVwZGF0ZSc7XG4gICAgY3VycmVudEFjdGlvbk5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25uZWN0aW9uLnNlbmQoeyB0eXBlIH0sIHJvb3RTdGF0ZSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZUZyb21TeW1ib2wob2JqOiB1bmtub3duLCBzeW1ib2w6IHN5bWJvbCkge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICYmIHN5bWJvbCBpbiBvYmopIHtcbiAgICByZXR1cm4gKG9iaiBhcyB7IFtrZXk6IHN5bWJvbF06IGFueSB9KVtzeW1ib2xdO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0b3JlU2lnbmFsKHN0b3JlOiB1bmtub3duKTogU2lnbmFsPHVua25vd24+IHtcbiAgY29uc3QgW3NpZ25hbFN0YXRlS2V5XSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc3RvcmUpO1xuICBpZiAoIXNpZ25hbFN0YXRlS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCBTdGF0ZSBTaWduYWwnKTtcbiAgfVxuXG4gIHJldHVybiBnZXRWYWx1ZUZyb21TeW1ib2woc3RvcmUsIHNpZ25hbFN0YXRlS2V5KTtcbn1cblxudHlwZSBDb25uZWN0UmVzcG9uc2UgPSB7XG4gIHNlbmQ6IChhY3Rpb246IEFjdGlvbiwgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xufTtcbmxldCBjb25uZWN0aW9uOiBDb25uZWN0UmVzcG9uc2UgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogcmVxdWlyZWQgZm9yIHRlc3RpbmcuIGlzIG5vdCBleHBvcnRlZCBkdXJpbmcgYnVpbGRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0KCkge1xuICBjb25uZWN0aW9uID0gdW5kZWZpbmVkO1xuICBzeW5jaHJvbml6YXRpb25Jbml0aWFsaXplZCA9IGZhbHNlO1xuICBzdG9yZVJlZ2lzdHJ5LnNldCh7fSk7XG59XG5cbi8qKlxuICogQHBhcmFtIG5hbWUgc3RvcmUncyBuYW1lIGFzIGl0IHNob3VsZCBhcHBlYXIgaW4gdGhlIERldlRvb2xzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoRGV2dG9vbHM8SW5wdXQgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQ+KFxuICBuYW1lOiBzdHJpbmdcbik6IFNpZ25hbFN0b3JlRmVhdHVyZTxJbnB1dCwgRW1wdHlGZWF0dXJlUmVzdWx0PiB7XG4gIHJldHVybiAoc3RvcmUpID0+IHtcbiAgICBjb25zdCBpc1NlcnZlciA9IGlzUGxhdGZvcm1TZXJ2ZXIoaW5qZWN0KFBMQVRGT1JNX0lEKSk7XG4gICAgaWYgKGlzU2VydmVyKSB7XG4gICAgICByZXR1cm4gc3RvcmU7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fO1xuICAgIGlmICghZXh0ZW5zaW9ucykge1xuICAgICAgcmV0dXJuIHN0b3JlO1xuICAgIH1cblxuICAgIGlmICghY29ubmVjdGlvbikge1xuICAgICAgY29ubmVjdGlvbiA9IGV4dGVuc2lvbnMuY29ubmVjdCh7XG4gICAgICAgIG5hbWU6ICdOZ1J4IFNpZ25hbCBTdG9yZScsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZVNpZ25hbCA9IGdldFN0b3JlU2lnbmFsKHN0b3JlKTtcbiAgICBzdG9yZVJlZ2lzdHJ5LnVwZGF0ZSgodmFsdWUpID0+ICh7XG4gICAgICAuLi52YWx1ZSxcbiAgICAgIFtuYW1lXTogc3RvcmVTaWduYWwsXG4gICAgfSkpO1xuXG4gICAgaWYgKCFzeW5jaHJvbml6YXRpb25Jbml0aWFsaXplZCkge1xuICAgICAgaW5pdFN5bmNocm9uaXphdGlvbigpO1xuICAgICAgc3luY2hyb25pemF0aW9uSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzdG9yZTtcbiAgfTtcbn1cblxudHlwZSBQYXRjaEZuID0gdHlwZW9mIG9yaWdpbmFsUGF0Y2hTdGF0ZSBleHRlbmRzIChcbiAgYXJnMTogaW5mZXIgRmlyc3QsXG4gIC4uLmFyZ3M6IGluZmVyIFJlc3RcbikgPT4gaW5mZXIgUmV0dXJuZXJcbiAgPyAoc3RhdGU6IEZpcnN0LCBhY3Rpb246IHN0cmluZywgLi4ucmVzdDogUmVzdCkgPT4gUmV0dXJuZXJcbiAgOiBuZXZlcjtcblxuZXhwb3J0IGNvbnN0IHBhdGNoU3RhdGU6IFBhdGNoRm4gPSAoc3RhdGUsIGFjdGlvbiwgLi4ucmVzdCkgPT4ge1xuICBjdXJyZW50QWN0aW9uTmFtZXMuYWRkKGFjdGlvbik7XG4gIHJldHVybiBvcmlnaW5hbFBhdGNoU3RhdGUoc3RhdGUsIC4uLnJlc3QpO1xufTtcbiJdfQ==
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1kZXZ0b29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmdyeC10b29sa2l0L3NyYy9saWIvd2l0aC1kZXZ0b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxJQUFJLGtCQUFrQixHQUVqQyxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBaUJuRCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQWtDLEVBQUUsQ0FBQyxDQUFDO0FBRWxFLElBQUksa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztBQUUzQyxJQUFJLDBCQUEwQixHQUFHLEtBQUssQ0FBQztBQUV2QyxTQUFTLG1CQUFtQjtJQUMxQixNQUFNLENBQUMsR0FBRyxFQUFFO1FBQ1YsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLE9BQU87U0FDUjtRQUVELE1BQU0sTUFBTSxHQUFHLGFBQWEsRUFBRSxDQUFDO1FBQy9CLE1BQU0sU0FBUyxHQUE0QixFQUFFLENBQUM7UUFDOUMsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLEVBQUU7WUFDekIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQztTQUMzQjtRQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7UUFDOUQsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUV2QyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxHQUFZLEVBQUUsTUFBYztJQUN0RCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLElBQUksTUFBTSxJQUFJLEdBQUcsRUFBRTtRQUNuRCxPQUFRLEdBQThCLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDaEQ7QUFDSCxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsS0FBYztJQUNwQyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdELElBQUksQ0FBQyxjQUFjLEVBQUU7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0tBQzdDO0lBRUQsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUtELElBQUksVUFBdUMsQ0FBQztBQUU1Qzs7R0FFRztBQUNILE1BQU0sVUFBVSxLQUFLO0lBQ25CLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDdkIsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO0lBQ25DLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FDMUIsSUFBWTtJQUVaLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNmLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksUUFBUSxFQUFFO1lBQ1osT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQztRQUN2RCxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2YsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixVQUFVLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztnQkFDOUIsSUFBSSxFQUFFLG1CQUFtQjthQUMxQixDQUFDLENBQUM7U0FDSjtRQUVELE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLEdBQUcsS0FBSztZQUNSLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVztTQUNwQixDQUFDLENBQUMsQ0FBQztRQUVKLElBQUksQ0FBQywwQkFBMEIsRUFBRTtZQUMvQixtQkFBbUIsRUFBRSxDQUFDO1lBQ3RCLDBCQUEwQixHQUFHLElBQUksQ0FBQztTQUNuQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQVNELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBWSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRTtJQUM1RCxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUM1QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIHBhdGNoU3RhdGUgYXMgb3JpZ2luYWxQYXRjaFN0YXRlLFxyXG4gIFNpZ25hbFN0b3JlRmVhdHVyZSxcclxufSBmcm9tICdAbmdyeC9zaWduYWxzJztcclxuaW1wb3J0IHsgU2lnbmFsU3RvcmVGZWF0dXJlUmVzdWx0IH0gZnJvbSAnQG5ncngvc2lnbmFscy9zcmMvc2lnbmFsLXN0b3JlLW1vZGVscyc7XHJcbmltcG9ydCB7IGVmZmVjdCwgaW5qZWN0LCBQTEFURk9STV9JRCwgc2lnbmFsLCBTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgaXNQbGF0Zm9ybVNlcnZlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5kZWNsYXJlIGdsb2JhbCB7XHJcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XHJcbiAgICBfX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fOlxyXG4gICAgICB8IHtcclxuICAgICAgICAgIGNvbm5lY3Q6IChvcHRpb25zOiB7IG5hbWU6IHN0cmluZyB9KSA9PiB7XHJcbiAgICAgICAgICAgIHNlbmQ6IChhY3Rpb246IEFjdGlvbiwgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgIHwgdW5kZWZpbmVkO1xyXG4gIH1cclxufVxyXG5cclxudHlwZSBFbXB0eUZlYXR1cmVSZXN1bHQgPSB7IHN0YXRlOiB7fTsgc2lnbmFsczoge307IG1ldGhvZHM6IHt9IH07XHJcbmV4cG9ydCB0eXBlIEFjdGlvbiA9IHsgdHlwZTogc3RyaW5nIH07XHJcblxyXG5jb25zdCBzdG9yZVJlZ2lzdHJ5ID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KHt9KTtcclxuXHJcbmxldCBjdXJyZW50QWN0aW9uTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuXHJcbmxldCBzeW5jaHJvbml6YXRpb25Jbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cclxuZnVuY3Rpb24gaW5pdFN5bmNocm9uaXphdGlvbigpIHtcclxuICBlZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKCFjb25uZWN0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzdG9yZXMgPSBzdG9yZVJlZ2lzdHJ5KCk7XHJcbiAgICBjb25zdCByb290U3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XHJcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gc3RvcmVzKSB7XHJcbiAgICAgIGNvbnN0IHN0b3JlID0gc3RvcmVzW25hbWVdO1xyXG4gICAgICByb290U3RhdGVbbmFtZV0gPSBzdG9yZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5hbWVzID0gQXJyYXkuZnJvbShjdXJyZW50QWN0aW9uTmFtZXMpO1xyXG4gICAgY29uc3QgdHlwZSA9IG5hbWVzLmxlbmd0aCA/IG5hbWVzLmpvaW4oJywgJykgOiAnU3RvcmUgVXBkYXRlJztcclxuICAgIGN1cnJlbnRBY3Rpb25OYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG5cclxuICAgIGNvbm5lY3Rpb24uc2VuZCh7IHR5cGUgfSwgcm9vdFN0YXRlKTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0VmFsdWVGcm9tU3ltYm9sKG9iajogdW5rbm93biwgc3ltYm9sOiBzeW1ib2wpIHtcclxuICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICYmIHN5bWJvbCBpbiBvYmopIHtcclxuICAgIHJldHVybiAob2JqIGFzIHsgW2tleTogc3ltYm9sXTogYW55IH0pW3N5bWJvbF07XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRTdG9yZVNpZ25hbChzdG9yZTogdW5rbm93bik6IFNpZ25hbDx1bmtub3duPiB7XHJcbiAgY29uc3QgW3NpZ25hbFN0YXRlS2V5XSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc3RvcmUpO1xyXG4gIGlmICghc2lnbmFsU3RhdGVLZXkpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZpbmQgU3RhdGUgU2lnbmFsJyk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZ2V0VmFsdWVGcm9tU3ltYm9sKHN0b3JlLCBzaWduYWxTdGF0ZUtleSk7XHJcbn1cclxuXHJcbnR5cGUgQ29ubmVjdFJlc3BvbnNlID0ge1xyXG4gIHNlbmQ6IChhY3Rpb246IEFjdGlvbiwgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xyXG59O1xyXG5sZXQgY29ubmVjdGlvbjogQ29ubmVjdFJlc3BvbnNlIHwgdW5kZWZpbmVkO1xyXG5cclxuLyoqXHJcbiAqIHJlcXVpcmVkIGZvciB0ZXN0aW5nLiBpcyBub3QgZXhwb3J0ZWQgZHVyaW5nIGJ1aWxkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVzZXQoKSB7XHJcbiAgY29ubmVjdGlvbiA9IHVuZGVmaW5lZDtcclxuICBzeW5jaHJvbml6YXRpb25Jbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gIHN0b3JlUmVnaXN0cnkuc2V0KHt9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSBuYW1lIHN0b3JlJ3MgbmFtZSBhcyBpdCBzaG91bGQgYXBwZWFyIGluIHRoZSBEZXZUb29sc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEZXZ0b29sczxJbnB1dCBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdD4oXHJcbiAgbmFtZTogc3RyaW5nXHJcbik6IFNpZ25hbFN0b3JlRmVhdHVyZTxJbnB1dCwgRW1wdHlGZWF0dXJlUmVzdWx0PiB7XHJcbiAgcmV0dXJuIChzdG9yZSkgPT4ge1xyXG4gICAgY29uc3QgaXNTZXJ2ZXIgPSBpc1BsYXRmb3JtU2VydmVyKGluamVjdChQTEFURk9STV9JRCkpO1xyXG4gICAgaWYgKGlzU2VydmVyKSB7XHJcbiAgICAgIHJldHVybiBzdG9yZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBleHRlbnNpb25zID0gd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX187XHJcbiAgICBpZiAoIWV4dGVuc2lvbnMpIHtcclxuICAgICAgcmV0dXJuIHN0b3JlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29ubmVjdGlvbikge1xyXG4gICAgICBjb25uZWN0aW9uID0gZXh0ZW5zaW9ucy5jb25uZWN0KHtcclxuICAgICAgICBuYW1lOiAnTmdSeCBTaWduYWwgU3RvcmUnLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzdG9yZVNpZ25hbCA9IGdldFN0b3JlU2lnbmFsKHN0b3JlKTtcclxuICAgIHN0b3JlUmVnaXN0cnkudXBkYXRlKCh2YWx1ZSkgPT4gKHtcclxuICAgICAgLi4udmFsdWUsXHJcbiAgICAgIFtuYW1lXTogc3RvcmVTaWduYWwsXHJcbiAgICB9KSk7XHJcblxyXG4gICAgaWYgKCFzeW5jaHJvbml6YXRpb25Jbml0aWFsaXplZCkge1xyXG4gICAgICBpbml0U3luY2hyb25pemF0aW9uKCk7XHJcbiAgICAgIHN5bmNocm9uaXphdGlvbkluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc3RvcmU7XHJcbiAgfTtcclxufVxyXG5cclxudHlwZSBQYXRjaEZuID0gdHlwZW9mIG9yaWdpbmFsUGF0Y2hTdGF0ZSBleHRlbmRzIChcclxuICBhcmcxOiBpbmZlciBGaXJzdCxcclxuICAuLi5hcmdzOiBpbmZlciBSZXN0XHJcbikgPT4gaW5mZXIgUmV0dXJuZXJcclxuICA/IChzdGF0ZTogRmlyc3QsIGFjdGlvbjogc3RyaW5nLCAuLi5yZXN0OiBSZXN0KSA9PiBSZXR1cm5lclxyXG4gIDogbmV2ZXI7XHJcblxyXG5leHBvcnQgY29uc3QgcGF0Y2hTdGF0ZTogUGF0Y2hGbiA9IChzdGF0ZSwgYWN0aW9uLCAuLi5yZXN0KSA9PiB7XHJcbiAgY3VycmVudEFjdGlvbk5hbWVzLmFkZChhY3Rpb24pO1xyXG4gIHJldHVybiBvcmlnaW5hbFBhdGNoU3RhdGUoc3RhdGUsIC4uLnJlc3QpO1xyXG59O1xyXG4iXX0=
@@ -92,4 +92,4 @@ export function withRedux(redux) {
92
92
  };
93
93
  };
94
94
  }
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1yZWR1eC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmdyeC10b29sa2l0L3NyYy9saWIvd2l0aC1yZWR1eC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQU96RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQXlDOUQsTUFBTSxVQUFVLE9BQU87SUFDckIsT0FBTyxFQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUEwQjVCLFNBQVMsZUFBZSxDQUN0QixhQUFtQixFQUNuQixlQUdDLEVBQ0QsZUFBa0UsRUFDbEUsS0FBYztJQUVkLE1BQU0sU0FBUyxHQUE2QixFQUFFLENBQUM7SUFFL0MsS0FBSyxNQUFNLElBQUksSUFBSSxhQUFhLEVBQUU7UUFDaEMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxPQUFnQixFQUFFLEVBQUU7WUFDcEMsTUFBTSxXQUFXLEdBQUcsRUFBRSxHQUFHLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUN6QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsSUFBSSxPQUFPLEVBQUU7Z0JBQ1YsT0FBc0QsQ0FDckQsV0FBc0IsRUFDdEIsS0FBSyxDQUNOLENBQUM7YUFDSDtZQUNELE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxJQUFJLGFBQWEsRUFBRTtnQkFDaEIsYUFBNkMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDbEU7WUFDRCxPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDLENBQUM7UUFDRixRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcs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QUFPLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFNUQsT0FBTztRQUNMLE9BQU8sRUFBRSxnQkFBOEI7UUFDdkMsYUFBYSxFQUFFLGFBQWE7S0FDN0IsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUt2QixLQUlEO0lBSUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ2YsTUFBTSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsR0FBRyxZQUFZLENBQzdDLEtBQUssQ0FBQyxPQUFPLEVBQ2IsS0FBSyxDQUFDLE9BQTZDLEVBQ25ELEtBQUssQ0FBQyxPQUFvQyxFQUMxQyxLQUFLLENBQ04sQ0FBQztRQUNGLE9BQU87WUFDTCxHQUFHLEtBQUs7WUFDUixPQUFPO1NBQ1IsQ0FBQztJQUNKLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFNpZ25hbFN0b3JlRmVhdHVyZSB9IGZyb20gJ0BuZ3J4L3NpZ25hbHMnO1xuaW1wb3J0IHtcbiAgRW1wdHlGZWF0dXJlUmVzdWx0LFxuICBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG59IGZyb20gJ0BuZ3J4L3NpZ25hbHMvc3JjL3NpZ25hbC1zdG9yZS1tb2RlbHMnO1xuaW1wb3J0IHsgU3RhdGVTaWduYWwgfSBmcm9tICdAbmdyeC9zaWduYWxzL3NyYy9zdGF0ZS1zaWduYWwnO1xuaW1wb3J0IHsgYXNzZXJ0QWN0aW9uRm5TcGVjcyB9IGZyb20gJy4vYXNzZXJ0aW9ucy9hc3NlcnRpb25zJztcbmltcG9ydCB7IGVmZmVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKiogQWN0aW9ucyAqKi9cblxudHlwZSBQYXlsb2FkID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbnR5cGUgQWN0aW9uRm48XG4gIFR5cGUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIEFjdGlvblBheWxvYWQgZXh0ZW5kcyBQYXlsb2FkID0gUGF5bG9hZFxuPiA9ICgocGF5bG9hZDogQWN0aW9uUGF5bG9hZCkgPT4gQWN0aW9uUGF5bG9hZCAmIHsgdHlwZTogVHlwZSB9KSAmIHtcbiAgdHlwZTogVHlwZTtcbn07XG5cbnR5cGUgQWN0aW9uRm5zID0gUmVjb3JkPHN0cmluZywgQWN0aW9uRm4+O1xuXG5leHBvcnQgdHlwZSBBY3Rpb25zRm5TcGVjcyA9IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+O1xuXG50eXBlIEFjdGlvbkZuQ3JlYXRvcjxTcGVjIGV4dGVuZHMgQWN0aW9uc0ZuU3BlY3M+ID0ge1xuICBbQWN0aW9uTmFtZSBpbiBrZXlvZiBTcGVjXTogKChcbiAgICBwYXlsb2FkOiBTcGVjW0FjdGlvbk5hbWVdXG4gICkgPT4gU3BlY1tBY3Rpb25OYW1lXSAmIHsgdHlwZTogQWN0aW9uTmFtZSB9KSAmIHsgdHlwZTogQWN0aW9uTmFtZSAmIHN0cmluZyB9O1xufTtcblxudHlwZSBBY3Rpb25GblBheWxvYWQ8QWN0aW9uPiA9IEFjdGlvbiBleHRlbmRzIChwYXlsb2FkOiBpbmZlciBQYXlsb2FkKSA9PiB2b2lkXG4gID8gUGF5bG9hZFxuICA6IG5ldmVyO1xuXG50eXBlIEFjdGlvbkZuc0NyZWF0b3I8U3BlYyBleHRlbmRzIEFjdGlvbnNGblNwZWNzPiA9IFNwZWMgZXh0ZW5kcyB7XG4gIHByaXZhdGU6IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+O1xuICBwdWJsaWM6IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+O1xufVxuICA/IEFjdGlvbkZuQ3JlYXRvcjxTcGVjWydwcml2YXRlJ10+ICYgQWN0aW9uRm5DcmVhdG9yPFNwZWNbJ3B1YmxpYyddPlxuICA6IEFjdGlvbkZuQ3JlYXRvcjxTcGVjPjtcblxudHlwZSBQdWJsaWNBY3Rpb25GbnM8U3BlYyBleHRlbmRzIEFjdGlvbnNGblNwZWNzPiA9IFNwZWMgZXh0ZW5kcyB7XG4gIHB1YmxpYzogUmVjb3JkPHN0cmluZywgUGF5bG9hZD47XG59XG4gID8gQWN0aW9uRm5DcmVhdG9yPFNwZWNbJ3B1YmxpYyddPlxuICA6IEFjdGlvbkZuQ3JlYXRvcjxTcGVjPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHBheWxvYWQ8VHlwZSBleHRlbmRzIFBheWxvYWQ+KCk6IFR5cGUge1xuICByZXR1cm4ge30gYXMgVHlwZTtcbn1cblxuZXhwb3J0IGNvbnN0IG5vUGF5bG9hZCA9IHt9O1xuXG4vKiogUmVkdWNlciAqKi9cblxudHlwZSBSZWR1Y2VyRnVuY3Rpb248UmVkdWNlckFjdGlvbiwgU3RhdGU+ID0gKFxuICBhY3Rpb246IEFjdGlvbkZuUGF5bG9hZDxSZWR1Y2VyQWN0aW9uPixcbiAgc3RhdGU6IFN0YXRlXG4pID0+IHZvaWQ7XG5cbnR5cGUgUmVkdWNlckZhY3Rvcnk8U3RhdGVBY3Rpb25GbnMgZXh0ZW5kcyBBY3Rpb25GbnMsIFN0YXRlPiA9IChcbiAgYWN0aW9uczogU3RhdGVBY3Rpb25GbnMsXG4gIG9uOiA8UmVkdWNlckFjdGlvbiBleHRlbmRzIHsgdHlwZTogc3RyaW5nIH0+KFxuICAgIGFjdGlvbjogUmVkdWNlckFjdGlvbixcbiAgICByZWR1Y2VyRm46IFJlZHVjZXJGdW5jdGlvbjxBY3Rpb25GblBheWxvYWQ8UmVkdWNlckFjdGlvbj4sIFN0YXRlPlxuICApID0+IHZvaWRcbikgPT4gdm9pZDtcblxuLyoqIEVmZmVjdCAqKi9cblxudHlwZSBFZmZlY3RzRmFjdG9yeTxTdGF0ZUFjdGlvbkZucyBleHRlbmRzIEFjdGlvbkZucz4gPSAoXG4gIGFjdGlvbnM6IFN0YXRlQWN0aW9uRm5zLFxuICBjcmVhdGU6IDxFZmZlY3RBY3Rpb24gZXh0ZW5kcyB7IHR5cGU6IHN0cmluZyB9PihcbiAgICBhY3Rpb246IEVmZmVjdEFjdGlvblxuICApID0+IE9ic2VydmFibGU8QWN0aW9uRm5QYXlsb2FkPEVmZmVjdEFjdGlvbj4+XG4pID0+IFJlY29yZDxzdHJpbmcsIE9ic2VydmFibGU8dW5rbm93bj4+O1xuXG5mdW5jdGlvbiBjcmVhdGVBY3Rpb25GbnM8U3BlYyBleHRlbmRzIEFjdGlvbnNGblNwZWNzPihcbiAgYWN0aW9uRm5TcGVjczogU3BlYyxcbiAgcmVkdWNlclJlZ2lzdHJ5OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIChwYXlsb2FkOiBBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4sIHN0YXRlOiB1bmtub3duKSA9PiB2b2lkXG4gID4sXG4gIGVmZmVjdHNSZWdpc3RyeTogUmVjb3JkPHN0cmluZywgU3ViamVjdDxBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4+PixcbiAgc3RhdGU6IHVua25vd25cbikge1xuICBjb25zdCBhY3Rpb25GbnM6IFJlY29yZDxzdHJpbmcsIEFjdGlvbkZuPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgdHlwZSBpbiBhY3Rpb25GblNwZWNzKSB7XG4gICAgY29uc3QgYWN0aW9uRm4gPSAocGF5bG9hZDogUGF5bG9hZCkgPT4ge1xuICAgICAgY29uc3QgZnVsbFBheWxvYWQgPSB7IC4uLnBheWxvYWQsIHR5cGUgfTtcbiAgICAgIGNvbnN0IHJlZHVjZXIgPSByZWR1Y2VyUmVnaXN0cnlbdHlwZV07XG4gICAgICBpZiAocmVkdWNlcikge1xuICAgICAgICAocmVkdWNlciBhcyAocGF5bG9hZDogdW5rbm93biwgc3RhdGU6IHVua25vd24pID0+IHZvaWQpKFxuICAgICAgICAgIGZ1bGxQYXlsb2FkIGFzIHVua25vd24sXG4gICAgICAgICAgc3RhdGVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVmZmVjdFN1YmplY3QgPSBlZmZlY3RzUmVnaXN0cnlbdHlwZV07XG4gICAgICBpZiAoZWZmZWN0U3ViamVjdCkge1xuICAgICAgICAoZWZmZWN0U3ViamVjdCBhcyB1bmtub3duIGFzIFN1YmplY3Q8dW5rbm93bj4pLm5leHQoZnVsbFBheWxvYWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bGxQYXlsb2FkO1xuICAgIH07XG4gICAgYWN0aW9uRm4udHlwZSA9IHR5cGUudG9TdHJpbmcoKTtcbiAgICBhY3Rpb25GbnNbdHlwZV0gPSBhY3Rpb25GbjtcbiAgfVxuXG4gIHJldHVybiBhY3Rpb25GbnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVB1YmxpY0FuZEFsbEFjdGlvbnNGbnM8U3BlYyBleHRlbmRzIEFjdGlvbnNGblNwZWNzPihcbiAgYWN0aW9uRm5TcGVjczogU3BlYyxcbiAgcmVkdWNlclJlZ2lzdHJ5OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIChwYXlsb2FkOiBBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4sIHN0YXRlOiB1bmtub3duKSA9PiB2b2lkXG4gID4sXG4gIGVmZmVjdHNSZWdpc3RyeTogUmVjb3JkPHN0cmluZywgU3ViamVjdDxBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4+PixcbiAgc3RhdGU6IHVua25vd25cbik6IHsgYWxsOiBBY3Rpb25GbnM7IHB1YmxpY3M6IEFjdGlvbkZucyB9IHtcbiAgaWYgKCdwdWJsaWMnIGluIGFjdGlvbkZuU3BlY3MgfHwgJ3ByaXZhdGUnIGluIGFjdGlvbkZuU3BlY3MpIHtcbiAgICBjb25zdCBwcml2YXRlcyA9IGFjdGlvbkZuU3BlY3NbJ3ByaXZhdGUnXSB8fCB7fTtcbiAgICBjb25zdCBwdWJsaWNzID0gYWN0aW9uRm5TcGVjc1sncHVibGljJ10gfHwge307XG5cbiAgICBhc3NlcnRBY3Rpb25GblNwZWNzKHByaXZhdGVzKTtcbiAgICBhc3NlcnRBY3Rpb25GblNwZWNzKHB1YmxpY3MpO1xuXG4gICAgY29uc3QgcHJpdmF0ZUFjdGlvbkZucyA9IGNyZWF0ZUFjdGlvbkZucyhcbiAgICAgIHByaXZhdGVzLFxuICAgICAgcmVkdWNlclJlZ2lzdHJ5LFxuICAgICAgZWZmZWN0c1JlZ2lzdHJ5LFxuICAgICAgc3RhdGVcbiAgICApO1xuICAgIGNvbnN0IHB1YmxpY0FjdGlvbkZucyA9IGNyZWF0ZUFjdGlvbkZucyhcbiAgICAgIHB1YmxpY3MsXG4gICAgICByZWR1Y2VyUmVnaXN0cnksXG4gICAgICBlZmZlY3RzUmVnaXN0cnksXG4gICAgICBzdGF0ZVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWxsOiB7IC4uLnByaXZhdGVBY3Rpb25GbnMsIC4uLnB1YmxpY0FjdGlvbkZucyB9LFxuICAgICAgcHVibGljczogcHVibGljQWN0aW9uRm5zLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBhY3Rpb25GbnMgPSBjcmVhdGVBY3Rpb25GbnMoXG4gICAgYWN0aW9uRm5TcGVjcyxcbiAgICByZWR1Y2VyUmVnaXN0cnksXG4gICAgZWZmZWN0c1JlZ2lzdHJ5LFxuICAgIHN0YXRlXG4gICk7XG5cbiAgcmV0dXJuIHsgYWxsOiBhY3Rpb25GbnMsIHB1YmxpY3M6IGFjdGlvbkZucyB9O1xufVxuXG5mdW5jdGlvbiBmaWxsUmVkdWNlclJlZ2lzdHJ5KFxuICByZWR1Y2VyOiBSZWR1Y2VyRmFjdG9yeTxBY3Rpb25GbnMsIHVua25vd24+LFxuICBhY3Rpb25GbnM6IEFjdGlvbkZucyxcbiAgcmVkdWNlclJlZ2lzdHJ5OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIChwYXlsb2FkOiBBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4sIHN0YXRlOiB1bmtub3duKSA9PiB2b2lkXG4gID5cbikge1xuICBmdW5jdGlvbiBvbihcbiAgICBhY3Rpb246IHsgdHlwZTogc3RyaW5nIH0sXG4gICAgcmVkdWNlckZuOiAocGF5bG9hZDogQWN0aW9uRm5QYXlsb2FkPHVua25vd24+LCBzdGF0ZTogdW5rbm93bikgPT4gdm9pZFxuICApIHtcbiAgICByZWR1Y2VyUmVnaXN0cnlbYWN0aW9uLnR5cGVdID0gcmVkdWNlckZuO1xuICB9XG5cbiAgcmVkdWNlcihhY3Rpb25GbnMsIG9uKTtcblxuICByZXR1cm4gcmVkdWNlclJlZ2lzdHJ5O1xufVxuXG5mdW5jdGlvbiBmaWxsRWZmZWN0cyhcbiAgZWZmZWN0czogRWZmZWN0c0ZhY3Rvcnk8QWN0aW9uRm5zPixcbiAgYWN0aW9uRm5zOiBBY3Rpb25GbnMsXG4gIGVmZmVjdHNSZWdpc3RyeTogUmVjb3JkPHN0cmluZywgU3ViamVjdDxBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4+PiA9IHt9XG4pOiBPYnNlcnZhYmxlPHVua25vd24+W10ge1xuICBmdW5jdGlvbiBjcmVhdGUoYWN0aW9uOiB7IHR5cGU6IHN0cmluZyB9KSB7XG4gICAgY29uc3Qgc3ViamVjdCA9IG5ldyBTdWJqZWN0PEFjdGlvbkZuUGF5bG9hZDx1bmtub3duPj4oKTtcbiAgICBlZmZlY3RzUmVnaXN0cnlbYWN0aW9uLnR5cGVdID0gc3ViamVjdDtcbiAgICByZXR1cm4gc3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGNvbnN0IGVmZmVjdE9ic2VydmFibGVzID0gZWZmZWN0cyhhY3Rpb25GbnMsIGNyZWF0ZSk7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGVmZmVjdE9ic2VydmFibGVzKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRTdWJzY3JpcHRpb25zKG9ic2VydmFibGVzOiBPYnNlcnZhYmxlPHVua25vd24+W10pIHtcbiAgcmV0dXJuIG9ic2VydmFibGVzLm1hcCgob2JzZXJ2YWJsZSkgPT4gb2JzZXJ2YWJsZS5zdWJzY3JpYmUoKSk7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NSZWR1eDxTcGVjIGV4dGVuZHMgQWN0aW9uc0ZuU3BlY3MsIFJldHVyblR5cGU+KFxuICBhY3Rpb25GblNwZWNzOiBTcGVjLFxuICByZWR1Y2VyOiBSZWR1Y2VyRmFjdG9yeTxBY3Rpb25GbnMsIHVua25vd24+LFxuICBlZmZlY3RzOiBFZmZlY3RzRmFjdG9yeTxBY3Rpb25GbnM+LFxuICBzdG9yZTogdW5rbm93blxuKSB7XG4gIGNvbnN0IHJlZHVjZXJSZWdpc3RyeTogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICAocGF5bG9hZDogQWN0aW9uRm5QYXlsb2FkPHVua25vd24+LCBzdGF0ZTogdW5rbm93bikgPT4gdm9pZFxuICA+ID0ge307XG4gIGNvbnN0IGVmZmVjdHNSZWdpc3RyeTogUmVjb3JkPHN0cmluZywgU3ViamVjdDxBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4+PiA9IHt9O1xuICBjb25zdCBhY3Rpb25zTWFwID0gY3JlYXRlUHVibGljQW5kQWxsQWN0aW9uc0ZucyhcbiAgICBhY3Rpb25GblNwZWNzLFxuICAgIHJlZHVjZXJSZWdpc3RyeSxcbiAgICBlZmZlY3RzUmVnaXN0cnksXG4gICAgc3RvcmVcbiAgKTtcbiAgY29uc3QgYWN0aW9uRm5zID0gYWN0aW9uc01hcC5hbGw7XG4gIGNvbnN0IHB1YmxpY0FjdGlvbnNGbnMgPSBhY3Rpb25zTWFwLnB1YmxpY3M7XG5cbiAgZmlsbFJlZHVjZXJSZWdpc3RyeShyZWR1Y2VyLCBhY3Rpb25GbnMsIHJlZHVjZXJSZWdpc3RyeSk7XG4gIGNvbnN0IGVmZmVjdE9ic2VydmFibGVzID0gZmlsbEVmZmVjdHMoZWZmZWN0cywgYWN0aW9uRm5zLCBlZmZlY3RzUmVnaXN0cnkpO1xuICBjb25zdCBzdWJzY3JpcHRpb25zID0gc3RhcnRTdWJzY3JpcHRpb25zKGVmZmVjdE9ic2VydmFibGVzKTtcblxuICByZXR1cm4ge1xuICAgIG1ldGhvZHM6IHB1YmxpY0FjdGlvbnNGbnMgYXMgUmV0dXJuVHlwZSxcbiAgICBzdWJzY3JpcHRpb25zOiBzdWJzY3JpcHRpb25zLFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSByZWR1eCByZWR1eFxuICpcbiAqIHByb3BlcnRpZXMgZG8gbm90IHN0YXJ0IHdpdGggYHdpdGhgIHNpbmNlIHRoZXkgYXJlIG5vdCBleHRlbnNpb24gZnVuY3Rpb25zIG9uIHRoZWlyIG93bi5cbiAqXG4gKiBubyBkZXBlbmRlbmN5IHRvIE5nUnhcbiAqXG4gKiBhY3Rpb25zIGFyZSBwYXNzZWQgdG8gcmVkdWNlciBhbmQgZWZmZWN0cywgYnV0IGl0IGlzIGFsc28gcG9zc2libGUgdG8gdXNlIG90aGVyIGFjdGlvbnMuXG4gKiBlZmZlY3RzIHByb3ZpZGUgZm9yQWN0aW9uIGFuZCBkbyBub3QgcmV0dXJuIGFueXRoaW5nLiB0aGF0IGlzIGltcG9ydGFudCBiZWNhdXNlIGVmZmVjdHMgc2hvdWxkIHN0YXkgaW5hY2Nlc3NpYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUmVkdXg8XG4gIFNwZWMgZXh0ZW5kcyBBY3Rpb25zRm5TcGVjcyxcbiAgSW5wdXQgZXh0ZW5kcyBTaWduYWxTdG9yZUZlYXR1cmVSZXN1bHQsXG4gIFN0YXRlQWN0aW9uRm5zIGV4dGVuZHMgQWN0aW9uRm5zQ3JlYXRvcjxTcGVjPiA9IEFjdGlvbkZuc0NyZWF0b3I8U3BlYz4sXG4gIFB1YmxpY1N0b3JlQWN0aW9uRm5zIGV4dGVuZHMgUHVibGljQWN0aW9uRm5zPFNwZWM+ID0gUHVibGljQWN0aW9uRm5zPFNwZWM+XG4+KHJlZHV4OiB7XG4gIGFjdGlvbnM6IFNwZWM7XG4gIHJlZHVjZXI6IFJlZHVjZXJGYWN0b3J5PFN0YXRlQWN0aW9uRm5zLCBTdGF0ZVNpZ25hbDxJbnB1dFsnc3RhdGUnXT4+O1xuICBlZmZlY3RzOiBFZmZlY3RzRmFjdG9yeTxTdGF0ZUFjdGlvbkZucz47XG59KTogU2lnbmFsU3RvcmVGZWF0dXJlPFxuICBJbnB1dCxcbiAgRW1wdHlGZWF0dXJlUmVzdWx0ICYgeyBtZXRob2RzOiBQdWJsaWNTdG9yZUFjdGlvbkZucyB9XG4+IHtcbiAgcmV0dXJuIChzdG9yZSkgPT4ge1xuICAgIGNvbnN0IHsgbWV0aG9kcywgc3Vic2NyaXB0aW9ucyB9ID0gcHJvY2Vzc1JlZHV4PFNwZWMsIFB1YmxpY1N0b3JlQWN0aW9uRm5zPihcbiAgICAgIHJlZHV4LmFjdGlvbnMsXG4gICAgICByZWR1eC5yZWR1Y2VyIGFzIFJlZHVjZXJGYWN0b3J5PEFjdGlvbkZucywgdW5rbm93bj4sXG4gICAgICByZWR1eC5lZmZlY3RzIGFzIEVmZmVjdHNGYWN0b3J5PEFjdGlvbkZucz4sXG4gICAgICBzdG9yZVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0b3JlLFxuICAgICAgbWV0aG9kcyxcbiAgICB9O1xuICB9O1xufVxuIl19
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1yZWR1eC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmdyeC10b29sa2l0L3NyYy9saWIvd2l0aC1yZWR1eC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQU96RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQXlDOUQsTUFBTSxVQUFVLE9BQU87SUFDckIsT0FBTyxFQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUEwQjVCLFNBQVMsZUFBZSxDQUN0QixhQUFtQixFQUNuQixlQUdDLEVBQ0QsZUFBa0UsRUFDbEUsS0FBYztJQUVkLE1BQU0sU0FBUyxHQUE2QixFQUFFLENBQUM7SUFFL0MsS0FBSyxNQUFNLElBQUksSUFBSSxhQUFhLEVBQUU7UUFDaEMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxPQUFnQixFQUFFLEVBQUU7WUFDcEMsTUFBTSxXQUFXLEdBQUcsRUFBRSxHQUFHLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUN6QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsSUFBSSxPQUFPLEVBQUU7Z0JBQ1YsT0FBc0QsQ0FDckQsV0FBc0IsRUFDdEIsS0FBSyxDQUNOLENBQUM7YUFDSDtZQUNELE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxJQUFJLGFBQWEsRUFBRTtnQkFDaEIsYUFBNkMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDbEU7WUFDRCxPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDLENBQUM7UUFDRixRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcs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QUFPLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFNUQsT0FBTztRQUNMLE9BQU8sRUFBRSxnQkFBOEI7UUFDdkMsYUFBYSxFQUFFLGFBQWE7S0FDN0IsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUt2QixLQUlEO0lBSUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ2YsTUFBTSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsR0FBRyxZQUFZLENBQzdDLEtBQUssQ0FBQyxPQUFPLEVBQ2IsS0FBSyxDQUFDLE9BQTZDLEVBQ25ELEtBQUssQ0FBQyxPQUFvQyxFQUMxQyxLQUFLLENBQ04sQ0FBQztRQUNGLE9BQU87WUFDTCxHQUFHLEtBQUs7WUFDUixPQUFPO1NBQ1IsQ0FBQztJQUNKLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU2lnbmFsU3RvcmVGZWF0dXJlIH0gZnJvbSAnQG5ncngvc2lnbmFscyc7XHJcbmltcG9ydCB7XHJcbiAgRW1wdHlGZWF0dXJlUmVzdWx0LFxyXG4gIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcclxufSBmcm9tICdAbmdyeC9zaWduYWxzL3NyYy9zaWduYWwtc3RvcmUtbW9kZWxzJztcclxuaW1wb3J0IHsgU3RhdGVTaWduYWwgfSBmcm9tICdAbmdyeC9zaWduYWxzL3NyYy9zdGF0ZS1zaWduYWwnO1xyXG5pbXBvcnQgeyBhc3NlcnRBY3Rpb25GblNwZWNzIH0gZnJvbSAnLi9hc3NlcnRpb25zL2Fzc2VydGlvbnMnO1xyXG5pbXBvcnQgeyBlZmZlY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8qKiBBY3Rpb25zICoqL1xyXG5cclxudHlwZSBQYXlsb2FkID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcblxyXG50eXBlIEFjdGlvbkZuPFxyXG4gIFR5cGUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXHJcbiAgQWN0aW9uUGF5bG9hZCBleHRlbmRzIFBheWxvYWQgPSBQYXlsb2FkXHJcbj4gPSAoKHBheWxvYWQ6IEFjdGlvblBheWxvYWQpID0+IEFjdGlvblBheWxvYWQgJiB7IHR5cGU6IFR5cGUgfSkgJiB7XHJcbiAgdHlwZTogVHlwZTtcclxufTtcclxuXHJcbnR5cGUgQWN0aW9uRm5zID0gUmVjb3JkPHN0cmluZywgQWN0aW9uRm4+O1xyXG5cclxuZXhwb3J0IHR5cGUgQWN0aW9uc0ZuU3BlY3MgPSBSZWNvcmQ8c3RyaW5nLCBQYXlsb2FkPjtcclxuXHJcbnR5cGUgQWN0aW9uRm5DcmVhdG9yPFNwZWMgZXh0ZW5kcyBBY3Rpb25zRm5TcGVjcz4gPSB7XHJcbiAgW0FjdGlvbk5hbWUgaW4ga2V5b2YgU3BlY106ICgoXHJcbiAgICBwYXlsb2FkOiBTcGVjW0FjdGlvbk5hbWVdXHJcbiAgKSA9PiBTcGVjW0FjdGlvbk5hbWVdICYgeyB0eXBlOiBBY3Rpb25OYW1lIH0pICYgeyB0eXBlOiBBY3Rpb25OYW1lICYgc3RyaW5nIH07XHJcbn07XHJcblxyXG50eXBlIEFjdGlvbkZuUGF5bG9hZDxBY3Rpb24+ID0gQWN0aW9uIGV4dGVuZHMgKHBheWxvYWQ6IGluZmVyIFBheWxvYWQpID0+IHZvaWRcclxuICA/IFBheWxvYWRcclxuICA6IG5ldmVyO1xyXG5cclxudHlwZSBBY3Rpb25GbnNDcmVhdG9yPFNwZWMgZXh0ZW5kcyBBY3Rpb25zRm5TcGVjcz4gPSBTcGVjIGV4dGVuZHMge1xyXG4gIHByaXZhdGU6IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+O1xyXG4gIHB1YmxpYzogUmVjb3JkPHN0cmluZywgUGF5bG9hZD47XHJcbn1cclxuICA/IEFjdGlvbkZuQ3JlYXRvcjxTcGVjWydwcml2YXRlJ10+ICYgQWN0aW9uRm5DcmVhdG9yPFNwZWNbJ3B1YmxpYyddPlxyXG4gIDogQWN0aW9uRm5DcmVhdG9yPFNwZWM+O1xyXG5cclxudHlwZSBQdWJsaWNBY3Rpb25GbnM8U3BlYyBleHRlbmRzIEFjdGlvbnNGblNwZWNzPiA9IFNwZWMgZXh0ZW5kcyB7XHJcbiAgcHVibGljOiBSZWNvcmQ8c3RyaW5nLCBQYXlsb2FkPjtcclxufVxyXG4gID8gQWN0aW9uRm5DcmVhdG9yPFNwZWNbJ3B1YmxpYyddPlxyXG4gIDogQWN0aW9uRm5DcmVhdG9yPFNwZWM+O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBheWxvYWQ8VHlwZSBleHRlbmRzIFBheWxvYWQ+KCk6IFR5cGUge1xyXG4gIHJldHVybiB7fSBhcyBUeXBlO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgbm9QYXlsb2FkID0ge307XHJcblxyXG4vKiogUmVkdWNlciAqKi9cclxuXHJcbnR5cGUgUmVkdWNlckZ1bmN0aW9uPFJlZHVjZXJBY3Rpb24sIFN0YXRlPiA9IChcclxuICBhY3Rpb246IEFjdGlvbkZuUGF5bG9hZDxSZWR1Y2VyQWN0aW9uPixcclxuICBzdGF0ZTogU3RhdGVcclxuKSA9PiB2b2lkO1xyXG5cclxudHlwZSBSZWR1Y2VyRmFjdG9yeTxTdGF0ZUFjdGlvbkZucyBleHRlbmRzIEFjdGlvbkZucywgU3RhdGU+ID0gKFxyXG4gIGFjdGlvbnM6IFN0YXRlQWN0aW9uRm5zLFxyXG4gIG9uOiA8UmVkdWNlckFjdGlvbiBleHRlbmRzIHsgdHlwZTogc3RyaW5nIH0+KFxyXG4gICAgYWN0aW9uOiBSZWR1Y2VyQWN0aW9uLFxyXG4gICAgcmVkdWNlckZuOiBSZWR1Y2VyRnVuY3Rpb248QWN0aW9uRm5QYXlsb2FkPFJlZHVjZXJBY3Rpb24+LCBTdGF0ZT5cclxuICApID0+IHZvaWRcclxuKSA9PiB2b2lkO1xyXG5cclxuLyoqIEVmZmVjdCAqKi9cclxuXHJcbnR5cGUgRWZmZWN0c0ZhY3Rvcnk8U3RhdGVBY3Rpb25GbnMgZXh0ZW5kcyBBY3Rpb25GbnM+ID0gKFxyXG4gIGFjdGlvbnM6IFN0YXRlQWN0aW9uRm5zLFxyXG4gIGNyZWF0ZTogPEVmZmVjdEFjdGlvbiBleHRlbmRzIHsgdHlwZTogc3RyaW5nIH0+KFxyXG4gICAgYWN0aW9uOiBFZmZlY3RBY3Rpb25cclxuICApID0+IE9ic2VydmFibGU8QWN0aW9uRm5QYXlsb2FkPEVmZmVjdEFjdGlvbj4+XHJcbikgPT4gUmVjb3JkPHN0cmluZywgT2JzZXJ2YWJsZTx1bmtub3duPj47XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVBY3Rpb25GbnM8U3BlYyBleHRlbmRzIEFjdGlvbnNGblNwZWNzPihcclxuICBhY3Rpb25GblNwZWNzOiBTcGVjLFxyXG4gIHJlZHVjZXJSZWdpc3RyeTogUmVjb3JkPFxyXG4gICAgc3RyaW5nLFxyXG4gICAgKHBheWxvYWQ6IEFjdGlvbkZuUGF5bG9hZDx1bmtub3duPiwgc3RhdGU6IHVua25vd24pID0+IHZvaWRcclxuICA+LFxyXG4gIGVmZmVjdHNSZWdpc3RyeTogUmVjb3JkPHN0cmluZywgU3ViamVjdDxBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4+PixcclxuICBzdGF0ZTogdW5rbm93blxyXG4pIHtcclxuICBjb25zdCBhY3Rpb25GbnM6IFJlY29yZDxzdHJpbmcsIEFjdGlvbkZuPiA9IHt9O1xyXG5cclxuICBmb3IgKGNvbnN0IHR5cGUgaW4gYWN0aW9uRm5TcGVjcykge1xyXG4gICAgY29uc3QgYWN0aW9uRm4gPSAocGF5bG9hZDogUGF5bG9hZCkgPT4ge1xyXG4gICAgICBjb25zdCBmdWxsUGF5bG9hZCA9IHsgLi4ucGF5bG9hZCwgdHlwZSB9O1xyXG4gICAgICBjb25zdCByZWR1Y2VyID0gcmVkdWNlclJlZ2lzdHJ5W3R5cGVdO1xyXG4gICAgICBpZiAocmVkdWNlcikge1xyXG4gICAgICAgIChyZWR1Y2VyIGFzIChwYXlsb2FkOiB1bmtub3duLCBzdGF0ZTogdW5rbm93bikgPT4gdm9pZCkoXHJcbiAgICAgICAgICBmdWxsUGF5bG9hZCBhcyB1bmtub3duLFxyXG4gICAgICAgICAgc3RhdGVcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGVmZmVjdFN1YmplY3QgPSBlZmZlY3RzUmVnaXN0cnlbdHlwZV07XHJcbiAgICAgIGlmIChlZmZlY3RTdWJqZWN0KSB7XHJcbiAgICAgICAgKGVmZmVjdFN1YmplY3QgYXMgdW5rbm93biBhcyBTdWJqZWN0PHVua25vd24+KS5uZXh0KGZ1bGxQYXlsb2FkKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZnVsbFBheWxvYWQ7XHJcbiAgICB9O1xyXG4gICAgYWN0aW9uRm4udHlwZSA9IHR5cGUudG9TdHJpbmcoKTtcclxuICAgIGFjdGlvbkZuc1t0eXBlXSA9IGFjdGlvbkZuO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGFjdGlvbkZucztcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlUHVibGljQW5kQWxsQWN0aW9uc0ZuczxTcGVjIGV4dGVuZHMgQWN0aW9uc0ZuU3BlY3M+KFxyXG4gIGFjdGlvbkZuU3BlY3M6IFNwZWMsXHJcbiAgcmVkdWNlclJlZ2lzdHJ5OiBSZWNvcmQ8XHJcbiAgICBzdHJpbmcsXHJcbiAgICAocGF5bG9hZDogQWN0aW9uRm5QYXlsb2FkPHVua25vd24+LCBzdGF0ZTogdW5rbm93bikgPT4gdm9pZFxyXG4gID4sXHJcbiAgZWZmZWN0c1JlZ2lzdHJ5OiBSZWNvcmQ8c3RyaW5nLCBTdWJqZWN0PEFjdGlvbkZuUGF5bG9hZDx1bmtub3duPj4+LFxyXG4gIHN0YXRlOiB1bmtub3duXHJcbik6IHsgYWxsOiBBY3Rpb25GbnM7IHB1YmxpY3M6IEFjdGlvbkZucyB9IHtcclxuICBpZiAoJ3B1YmxpYycgaW4gYWN0aW9uRm5TcGVjcyB8fCAncHJpdmF0ZScgaW4gYWN0aW9uRm5TcGVjcykge1xyXG4gICAgY29uc3QgcHJpdmF0ZXMgPSBhY3Rpb25GblNwZWNzWydwcml2YXRlJ10gfHwge307XHJcbiAgICBjb25zdCBwdWJsaWNzID0gYWN0aW9uRm5TcGVjc1sncHVibGljJ10gfHwge307XHJcblxyXG4gICAgYXNzZXJ0QWN0aW9uRm5TcGVjcyhwcml2YXRlcyk7XHJcbiAgICBhc3NlcnRBY3Rpb25GblNwZWNzKHB1YmxpY3MpO1xyXG5cclxuICAgIGNvbnN0IHByaXZhdGVBY3Rpb25GbnMgPSBjcmVhdGVBY3Rpb25GbnMoXHJcbiAgICAgIHByaXZhdGVzLFxyXG4gICAgICByZWR1Y2VyUmVnaXN0cnksXHJcbiAgICAgIGVmZmVjdHNSZWdpc3RyeSxcclxuICAgICAgc3RhdGVcclxuICAgICk7XHJcbiAgICBjb25zdCBwdWJsaWNBY3Rpb25GbnMgPSBjcmVhdGVBY3Rpb25GbnMoXHJcbiAgICAgIHB1YmxpY3MsXHJcbiAgICAgIHJlZHVjZXJSZWdpc3RyeSxcclxuICAgICAgZWZmZWN0c1JlZ2lzdHJ5LFxyXG4gICAgICBzdGF0ZVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhbGw6IHsgLi4ucHJpdmF0ZUFjdGlvbkZucywgLi4ucHVibGljQWN0aW9uRm5zIH0sXHJcbiAgICAgIHB1YmxpY3M6IHB1YmxpY0FjdGlvbkZucyxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjb25zdCBhY3Rpb25GbnMgPSBjcmVhdGVBY3Rpb25GbnMoXHJcbiAgICBhY3Rpb25GblNwZWNzLFxyXG4gICAgcmVkdWNlclJlZ2lzdHJ5LFxyXG4gICAgZWZmZWN0c1JlZ2lzdHJ5LFxyXG4gICAgc3RhdGVcclxuICApO1xyXG5cclxuICByZXR1cm4geyBhbGw6IGFjdGlvbkZucywgcHVibGljczogYWN0aW9uRm5zIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGZpbGxSZWR1Y2VyUmVnaXN0cnkoXHJcbiAgcmVkdWNlcjogUmVkdWNlckZhY3Rvcnk8QWN0aW9uRm5zLCB1bmtub3duPixcclxuICBhY3Rpb25GbnM6IEFjdGlvbkZucyxcclxuICByZWR1Y2VyUmVnaXN0cnk6IFJlY29yZDxcclxuICAgIHN0cmluZyxcclxuICAgIChwYXlsb2FkOiBBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4sIHN0YXRlOiB1bmtub3duKSA9PiB2b2lkXHJcbiAgPlxyXG4pIHtcclxuICBmdW5jdGlvbiBvbihcclxuICAgIGFjdGlvbjogeyB0eXBlOiBzdHJpbmcgfSxcclxuICAgIHJlZHVjZXJGbjogKHBheWxvYWQ6IEFjdGlvbkZuUGF5bG9hZDx1bmtub3duPiwgc3RhdGU6IHVua25vd24pID0+IHZvaWRcclxuICApIHtcclxuICAgIHJlZHVjZXJSZWdpc3RyeVthY3Rpb24udHlwZV0gPSByZWR1Y2VyRm47XHJcbiAgfVxyXG5cclxuICByZWR1Y2VyKGFjdGlvbkZucywgb24pO1xyXG5cclxuICByZXR1cm4gcmVkdWNlclJlZ2lzdHJ5O1xyXG59XHJcblxyXG5mdW5jdGlvbiBmaWxsRWZmZWN0cyhcclxuICBlZmZlY3RzOiBFZmZlY3RzRmFjdG9yeTxBY3Rpb25GbnM+LFxyXG4gIGFjdGlvbkZuczogQWN0aW9uRm5zLFxyXG4gIGVmZmVjdHNSZWdpc3RyeTogUmVjb3JkPHN0cmluZywgU3ViamVjdDxBY3Rpb25GblBheWxvYWQ8dW5rbm93bj4+PiA9IHt9XHJcbik6IE9ic2VydmFibGU8dW5rbm93bj5bXSB7XHJcbiAgZnVuY3Rpb24gY3JlYXRlKGFjdGlvbjogeyB0eXBlOiBzdHJpbmcgfSkge1xyXG4gICAgY29uc3Qgc3ViamVjdCA9IG5ldyBTdWJqZWN0PEFjdGlvbkZuUGF5bG9hZDx1bmtub3duPj4oKTtcclxuICAgIGVmZmVjdHNSZWdpc3RyeVthY3Rpb24udHlwZV0gPSBzdWJqZWN0O1xyXG4gICAgcmV0dXJuIHN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBlZmZlY3RPYnNlcnZhYmxlcyA9IGVmZmVjdHMoYWN0aW9uRm5zLCBjcmVhdGUpO1xyXG4gIHJldHVybiBPYmplY3QudmFsdWVzKGVmZmVjdE9ic2VydmFibGVzKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc3RhcnRTdWJzY3JpcHRpb25zKG9ic2VydmFibGVzOiBPYnNlcnZhYmxlPHVua25vd24+W10pIHtcclxuICByZXR1cm4gb2JzZXJ2YWJsZXMubWFwKChvYnNlcnZhYmxlKSA9PiBvYnNlcnZhYmxlLnN1YnNjcmliZSgpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJvY2Vzc1JlZHV4PFNwZWMgZXh0ZW5kcyBBY3Rpb25zRm5TcGVjcywgUmV0dXJuVHlwZT4oXHJcbiAgYWN0aW9uRm5TcGVjczogU3BlYyxcclxuICByZWR1Y2VyOiBSZWR1Y2VyRmFjdG9yeTxBY3Rpb25GbnMsIHVua25vd24+LFxyXG4gIGVmZmVjdHM6IEVmZmVjdHNGYWN0b3J5PEFjdGlvbkZucz4sXHJcbiAgc3RvcmU6IHVua25vd25cclxuKSB7XHJcbiAgY29uc3QgcmVkdWNlclJlZ2lzdHJ5OiBSZWNvcmQ8XHJcbiAgICBzdHJpbmcsXHJcbiAgICAocGF5bG9hZDogQWN0aW9uRm5QYXlsb2FkPHVua25vd24+LCBzdGF0ZTogdW5rbm93bikgPT4gdm9pZFxyXG4gID4gPSB7fTtcclxuICBjb25zdCBlZmZlY3RzUmVnaXN0cnk6IFJlY29yZDxzdHJpbmcsIFN1YmplY3Q8QWN0aW9uRm5QYXlsb2FkPHVua25vd24+Pj4gPSB7fTtcclxuICBjb25zdCBhY3Rpb25zTWFwID0gY3JlYXRlUHVibGljQW5kQWxsQWN0aW9uc0ZucyhcclxuICAgIGFjdGlvbkZuU3BlY3MsXHJcbiAgICByZWR1Y2VyUmVnaXN0cnksXHJcbiAgICBlZmZlY3RzUmVnaXN0cnksXHJcbiAgICBzdG9yZVxyXG4gICk7XHJcbiAgY29uc3QgYWN0aW9uRm5zID0gYWN0aW9uc01hcC5hbGw7XHJcbiAgY29uc3QgcHVibGljQWN0aW9uc0ZucyA9IGFjdGlvbnNNYXAucHVibGljcztcclxuXHJcbiAgZmlsbFJlZHVjZXJSZWdpc3RyeShyZWR1Y2VyLCBhY3Rpb25GbnMsIHJlZHVjZXJSZWdpc3RyeSk7XHJcbiAgY29uc3QgZWZmZWN0T2JzZXJ2YWJsZXMgPSBmaWxsRWZmZWN0cyhlZmZlY3RzLCBhY3Rpb25GbnMsIGVmZmVjdHNSZWdpc3RyeSk7XHJcbiAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IHN0YXJ0U3Vic2NyaXB0aW9ucyhlZmZlY3RPYnNlcnZhYmxlcyk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBtZXRob2RzOiBwdWJsaWNBY3Rpb25zRm5zIGFzIFJldHVyblR5cGUsXHJcbiAgICBzdWJzY3JpcHRpb25zOiBzdWJzY3JpcHRpb25zLFxyXG4gIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0gcmVkdXggcmVkdXhcclxuICpcclxuICogcHJvcGVydGllcyBkbyBub3Qgc3RhcnQgd2l0aCBgd2l0aGAgc2luY2UgdGhleSBhcmUgbm90IGV4dGVuc2lvbiBmdW5jdGlvbnMgb24gdGhlaXIgb3duLlxyXG4gKlxyXG4gKiBubyBkZXBlbmRlbmN5IHRvIE5nUnhcclxuICpcclxuICogYWN0aW9ucyBhcmUgcGFzc2VkIHRvIHJlZHVjZXIgYW5kIGVmZmVjdHMsIGJ1dCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBvdGhlciBhY3Rpb25zLlxyXG4gKiBlZmZlY3RzIHByb3ZpZGUgZm9yQWN0aW9uIGFuZCBkbyBub3QgcmV0dXJuIGFueXRoaW5nLiB0aGF0IGlzIGltcG9ydGFudCBiZWNhdXNlIGVmZmVjdHMgc2hvdWxkIHN0YXkgaW5hY2Nlc3NpYmxlXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gd2l0aFJlZHV4PFxyXG4gIFNwZWMgZXh0ZW5kcyBBY3Rpb25zRm5TcGVjcyxcclxuICBJbnB1dCBleHRlbmRzIFNpZ25hbFN0b3JlRmVhdHVyZVJlc3VsdCxcclxuICBTdGF0ZUFjdGlvbkZucyBleHRlbmRzIEFjdGlvbkZuc0NyZWF0b3I8U3BlYz4gPSBBY3Rpb25GbnNDcmVhdG9yPFNwZWM+LFxyXG4gIFB1YmxpY1N0b3JlQWN0aW9uRm5zIGV4dGVuZHMgUHVibGljQWN0aW9uRm5zPFNwZWM+ID0gUHVibGljQWN0aW9uRm5zPFNwZWM+XHJcbj4ocmVkdXg6IHtcclxuICBhY3Rpb25zOiBTcGVjO1xyXG4gIHJlZHVjZXI6IFJlZHVjZXJGYWN0b3J5PFN0YXRlQWN0aW9uRm5zLCBTdGF0ZVNpZ25hbDxJbnB1dFsnc3RhdGUnXT4+O1xyXG4gIGVmZmVjdHM6IEVmZmVjdHNGYWN0b3J5PFN0YXRlQWN0aW9uRm5zPjtcclxufSk6IFNpZ25hbFN0b3JlRmVhdHVyZTxcclxuICBJbnB1dCxcclxuICBFbXB0eUZlYXR1cmVSZXN1bHQgJiB7IG1ldGhvZHM6IFB1YmxpY1N0b3JlQWN0aW9uRm5zIH1cclxuPiB7XHJcbiAgcmV0dXJuIChzdG9yZSkgPT4ge1xyXG4gICAgY29uc3QgeyBtZXRob2RzLCBzdWJzY3JpcHRpb25zIH0gPSBwcm9jZXNzUmVkdXg8U3BlYywgUHVibGljU3RvcmVBY3Rpb25GbnM+KFxyXG4gICAgICByZWR1eC5hY3Rpb25zLFxyXG4gICAgICByZWR1eC5yZWR1Y2VyIGFzIFJlZHVjZXJGYWN0b3J5PEFjdGlvbkZucywgdW5rbm93bj4sXHJcbiAgICAgIHJlZHV4LmVmZmVjdHMgYXMgRWZmZWN0c0ZhY3Rvcnk8QWN0aW9uRm5zPixcclxuICAgICAgc3RvcmVcclxuICAgICk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5zdG9yZSxcclxuICAgICAgbWV0aG9kcyxcclxuICAgIH07XHJcbiAgfTtcclxufVxyXG4iXX0=