@sumaris-net/ngx-components 0.18.11 → 0.18.16

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.
@@ -6,6 +6,7 @@ import { EntitiesService } from './entity-service.class';
6
6
  import { Directive } from '@angular/core';
7
7
  import { EntityUtils } from '../../core/services/model/entity.model';
8
8
  import { EntityFilter, EntityFilterUtils } from '../../core/services/model/filter.model';
9
+ import { waitFor } from '../observables';
9
10
  // @dynamic
10
11
  // eslint-disable-next-line @angular-eslint/directive-class-suffix
11
12
  export class InMemoryEntitiesService extends EntitiesService {
@@ -15,6 +16,7 @@ export class InMemoryEntitiesService extends EntitiesService {
15
16
  this.filterType = filterType;
16
17
  this.debug = false;
17
18
  this.dirty = false;
19
+ this._saving = false;
18
20
  this._onChange = new BehaviorSubject(true);
19
21
  options = Object.assign({ onSort: this.sort, equals: this.equals }, options);
20
22
  this._sortFn = options.onSort;
@@ -32,7 +34,6 @@ export class InMemoryEntitiesService extends EntitiesService {
32
34
  // Detect rankOrder on the entity class
33
35
  id: (Object.getOwnPropertyNames(new dataType()).findIndex(key => key === 'rankOrder') !== -1) ? 'rankOrder' : undefined }, options.sortByReplacement);
34
36
  }
35
- // TODO add test see sub-batches.modal.ts onLoadData & _hiddenData
36
37
  set value(data) {
37
38
  this.setValue(data);
38
39
  }
@@ -63,78 +64,90 @@ export class InMemoryEntitiesService extends EntitiesService {
63
64
  console.warn('[memory-data-service] Waiting value to be set...');
64
65
  }
65
66
  return this._onChange
66
- .pipe(filter(isNotNil), mergeMap((_) => __awaiter(this, void 0, void 0, function* () {
67
- this._hiddenData = [];
68
- if (isEmptyArray(this.data)) {
69
- return { data: [], total: 0 };
70
- }
71
- // Apply sort
72
- let data = this._sortFn(this.data || [], sortBy, sortDirection);
73
- if (this._onLoad) {
74
- const promiseOrData = this._onLoad(data);
75
- data = ((promiseOrData instanceof Promise)) ? yield promiseOrData : promiseOrData;
76
- }
77
- // Apply filter (will update hiddenData)
78
- data = this.filter(data, filterData, this._hiddenData);
79
- // Compute the total length
80
- const total = data.length;
81
- // If page size=0 (e.g. only need total)
82
- if (size === 0) {
83
- this._hiddenData.push(...data);
84
- return { data: [], total };
85
- }
86
- // Slice in a page (using offset and size)
87
- if (offset > 0) {
88
- // Offset after the end: no result
89
- if (offset >= data.length) {
90
- this._hiddenData.push(...data);
91
- data = [];
67
+ .pipe(filter(isNotNil), mergeMap(_ => waitFor(() => !this._saving)), mergeMap((_) => __awaiter(this, void 0, void 0, function* () {
68
+ const excludedDataByFilter = [];
69
+ let excludedDataByPagination;
70
+ try {
71
+ if (isEmptyArray(this.data)) {
72
+ return { data: [], total: 0 };
92
73
  }
93
- else {
94
- const hiddenData = (size > 0 && ((offset + size) < data.length)) ?
95
- // Slice using limit to size
96
- data.slice(0, offset - 1).concat(data.slice(offset + size)) :
97
- // Slice without limit
98
- data.slice(0, offset - 1);
99
- this._hiddenData.push(...hiddenData);
100
- data = (size > 0 && ((offset + size) < data.length)) ?
101
- // Slice using limit to size
102
- data.slice(offset, offset + size) :
103
- // Slice without limit
104
- data.slice(offset);
74
+ // Apply sort
75
+ let data = this._sortFn(this.data || [], sortBy, sortDirection);
76
+ if (this._onLoad) {
77
+ const promiseOrData = this._onLoad(data);
78
+ data = ((promiseOrData instanceof Promise)) ? yield promiseOrData : promiseOrData;
105
79
  }
80
+ // Apply filter (will update hiddenData)
81
+ data = this.filter(data, filterData, excludedDataByFilter);
82
+ // Compute the total length
83
+ const total = data.length;
84
+ // If page size=0 (e.g. only need total)
85
+ if (size === 0) {
86
+ excludedDataByPagination = data;
87
+ return { data: [], total };
88
+ }
89
+ // Slice in a page (using offset and size)
90
+ if (offset > 0) {
91
+ // Offset after the end: no result
92
+ if (offset >= data.length) {
93
+ excludedDataByPagination = data;
94
+ data = [];
95
+ }
96
+ else {
97
+ excludedDataByPagination = (size > 0 && ((offset + size) < data.length)) ?
98
+ // Slice using limit to size
99
+ data.slice(0, offset - 1).concat(data.slice(offset + size)) :
100
+ // Slice without limit
101
+ data.slice(0, offset - 1);
102
+ data = (size > 0 && ((offset + size) < data.length)) ?
103
+ // Slice using limit to size
104
+ data.slice(offset, offset + size) :
105
+ // Slice without limit
106
+ data.slice(offset);
107
+ }
108
+ }
109
+ // Apply a limit
110
+ else if (size > 0) {
111
+ excludedDataByPagination = data.slice(size);
112
+ data = data.slice(0, size);
113
+ }
114
+ // No limit:
115
+ else if (size === -1) {
116
+ // Keep all data
117
+ }
118
+ // /!\ If already observed, then always create a copy of the original array
119
+ // Because datasource will only update if the array changed
120
+ if (data === this.data) {
121
+ data = data.slice();
122
+ }
123
+ return { data, total };
106
124
  }
107
- // Apply a limit
108
- else if (size > 0) {
109
- this._hiddenData.push(...data.slice(size));
110
- data = data.slice(0, size);
111
- }
112
- // No limit:
113
- else if (size === -1) {
114
- // Keep all data
115
- }
116
- // /!\ If already observed, then always create a copy of the original array
117
- // Because datasource will only update if the array changed
118
- if (data === this.data) {
119
- data = data.slice(0);
125
+ finally {
126
+ // Remember hidden data
127
+ this._hiddenData = !excludedDataByPagination ? excludedDataByFilter : excludedDataByFilter.concat(...excludedDataByPagination);
120
128
  }
121
- return { data, total };
122
129
  })));
123
130
  }
124
131
  saveAll(data, options) {
125
132
  return __awaiter(this, void 0, void 0, function* () {
126
133
  if (!this.data)
127
134
  throw new Error('[memory-service] Could not save, because value not set');
128
- // Restore hidden data
129
- if (isNotEmptyArray(this._hiddenData))
130
- data = data.concat(this._hiddenData);
131
- if (this._onSaveFn) {
132
- const res = this._onSaveFn(data);
133
- data = ((res instanceof Promise)) ? yield res : res;
135
+ this.markAsSaving();
136
+ try {
137
+ // Restore hidden data
138
+ if (isNotEmptyArray(this._hiddenData))
139
+ data = data.concat(...this._hiddenData);
140
+ if (this._onSaveFn) {
141
+ const res = this._onSaveFn(data);
142
+ data = ((res instanceof Promise)) ? yield res : res;
143
+ }
144
+ this.data = data;
145
+ this.dirty = true;
146
+ return this.data;
147
+ }
148
+ finally {
149
+ this.markAsSaved();
134
150
  }
135
- this.data = data;
136
- this.dirty = true;
137
- return this.data;
138
151
  });
139
152
  }
140
153
  deleteAll(dataToRemove, options) {
@@ -143,8 +156,8 @@ export class InMemoryEntitiesService extends EntitiesService {
143
156
  throw new Error('[memory-service] Could not delete, because value not set');
144
157
  // Remove deleted item, from data
145
158
  const updatedData = this.data.filter(entity => {
146
- const shouldRemoved = dataToRemove.findIndex(entityToRemove => this._equalsFn(entityToRemove, entity)) !== -1;
147
- return !shouldRemoved;
159
+ const removed = dataToRemove.findIndex(entityToRemove => this.equals(entityToRemove, entity)) !== -1;
160
+ return !removed;
148
161
  });
149
162
  const deleteCount = this.data.length - updatedData.length;
150
163
  if (deleteCount > 0) {
@@ -166,6 +179,11 @@ export class InMemoryEntitiesService extends EntitiesService {
166
179
  addSortByReplacement(source, target) {
167
180
  this._sortByReplacement[source] = target;
168
181
  }
182
+ equals(d1, d2) {
183
+ if (this._equalsFn)
184
+ return this._equalsFn(d1, d2);
185
+ return d1 && d1.equals ? d1.equals(d2) : EntityUtils.equals(d1, d2, 'id');
186
+ }
169
187
  /* -- protected methods -- */
170
188
  filter(data, _filter, hiddenData) {
171
189
  // if filter is DataFilter instance, use its test function
@@ -190,8 +208,11 @@ export class InMemoryEntitiesService extends EntitiesService {
190
208
  return { data, total };
191
209
  }));
192
210
  }
193
- equals(d1, d2) {
194
- return d1 && d1.equals ? d1.equals(d2) : EntityUtils.equals(d1, d2, 'id');
211
+ markAsSaving() {
212
+ this._saving = true;
213
+ }
214
+ markAsSaved() {
215
+ this._saving = false;
195
216
  }
196
217
  }
197
218
  InMemoryEntitiesService.decorators = [
@@ -202,4 +223,4 @@ InMemoryEntitiesService.ctorParameters = () => [
202
223
  { type: Function },
203
224
  { type: undefined }
204
225
  ];
205
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvc2VydmljZXMvbWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsZUFBZSxFQUFhLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNyRSxPQUFPLEVBQUMsZUFBZSxFQUF1RixNQUFNLHdCQUF3QixDQUFDO0FBRTdJLE9BQU8sRUFBQyxTQUFTLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFDLFdBQVcsRUFBVSxNQUFNLHdDQUF3QyxDQUFDO0FBQzVFLE9BQU8sRUFBQyxZQUFZLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQWN2RixXQUFXO0FBRVgsa0VBQWtFO0FBQ2xFLE1BQU0sT0FBTyx1QkFLWCxTQUFRLGVBQXlCO0lBMkJqQyxZQUNZLFFBQW9CLEVBQ3BCLFVBQXNCLEVBQ2hDLE9BQThDO1FBRTlDLEtBQUssRUFBRSxDQUFDO1FBSkUsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQUNwQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBMUJsQyxVQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2QsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUtHLGNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQXdCckQsT0FBTyxtQkFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksRUFDakIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQ2hCLE9BQU8sQ0FDWCxDQUFDO1FBRUYsSUFBSSxD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bGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtmaWx0ZXIsIG1hcCwgbWVyZ2VNYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7aXNFbXB0eUFycmF5LCBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsfSBmcm9tICcuLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHtFbnRpdGllc1NlcnZpY2UsIEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucywgRmlsdGVyRm4sIEZpbHRlckZuRmFjdG9yeSwgSUVudGl0aWVzU2VydmljZSwgTG9hZFJlc3VsdH0gZnJvbSAnLi9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQge1NvcnREaXJlY3Rpb259IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHtEaXJlY3RpdmUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0VudGl0eVV0aWxzLCBJRW50aXR5fSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL21vZGVsL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQge0VudGl0eUZpbHRlciwgRW50aXR5RmlsdGVyVXRpbHN9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvZmlsdGVyLm1vZGVsJztcblxuZXhwb3J0IGludGVyZmFjZSBJbk1lbW9yeUVudGl0aWVzU2VydmljZU9wdGlvbnM8VCwgRj4ge1xuICBvblNvcnQ/OiAoZGF0YTogVFtdLCBzb3J0Qnk/OiBzdHJpbmcsIHNvcnREaXJlY3Rpb24/OiBTb3J0RGlyZWN0aW9uKSA9PiBUW107XG4gIG9uTG9hZD86IChkYXRhOiBUW10pID0+IFRbXSB8IFByb21pc2U8VFtdPjtcbiAgb25TYXZlPzogKGRhdGE6IFRbXSkgPT4gVFtdIHwgUHJvbWlzZTxUW10+O1xuICBlcXVhbHM/OiAoZDE6IFQsIGQyOiBUKSA9PiBib29sZWFuO1xuXG4gIGZpbHRlckZuRmFjdG9yeT86IEZpbHRlckZuRmFjdG9yeTxULCBGPjtcbiAgZmlsdGVyRm4/OiBGaWx0ZXJGbjxUPjtcblxuICBzb3J0QnlSZXBsYWNlbWVudD86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8vIEBkeW5hbWljXG5ARGlyZWN0aXZlKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGNsYXNzIEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlPFxuICBUIGV4dGVuZHMgSUVudGl0eTxULCBJRD4sXG4gIEYgPSBhbnksXG4gIElEID0gbnVtYmVyLFxuICBPIGV4dGVuZHMgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zID0gRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zPlxuICBleHRlbmRzIEVudGl0aWVzU2VydmljZTxULCBGLCBJRD5cbiAgaW1wbGVtZW50cyBJRW50aXRpZXNTZXJ2aWNlPFQsIEYsIE8+LCBPbkRlc3Ryb3kge1xuXG4gIGRlYnVnID0gZmFsc2U7XG4gIGRpcnR5ID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGRhdGE6IFRbXTtcbiAgcHJpdmF0ZSBfaGlkZGVuRGF0YTogVFtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQ2hhbmdlID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc29ydEZuOiAoZGF0YTogVFtdLCBzb3J0Qnk/OiBzdHJpbmcsIHNvcnREaXJlY3Rpb24/OiBTb3J0RGlyZWN0aW9uKSA9PiBUW107XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uTG9hZDogKGRhdGE6IFRbXSkgPT4gVFtdIHwgUHJvbWlzZTxUW10+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblNhdmVGbjogKGRhdGE6IFRbXSkgPT4gVFtdIHwgUHJvbWlzZTxUW10+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9lcXVhbHNGbjogKGQxOiBULCBkMjogVCkgPT4gYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVyRm5GYWN0b3J5OiBGaWx0ZXJGbkZhY3Rvcnk8VCwgRj47XG4gIHByaXZhdGUgcmVhZG9ubHkgX3NvcnRCeVJlcGxhY2VtZW50OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8vIFRPRE8gYWRkIHRlc3QgIHNlZSBzdWItYmF0Y2hlcy5tb2RhbC50cyBvbkxvYWREYXRhICYgX2hpZGRlbkRhdGFcblxuICBzZXQgdmFsdWUoZGF0YTogVFtdKSB7XG4gICAgdGhpcy5zZXRWYWx1ZShkYXRhKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBUW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGE7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZGF0YVR5cGU6IG5ldygpID0+IFQsXG4gICAgcHJvdGVjdGVkIGZpbHRlclR5cGU6IG5ldygpID0+IEYsXG4gICAgb3B0aW9ucz86IEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlT3B0aW9uczxULCBGPlxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICBvblNvcnQ6IHRoaXMuc29ydCxcbiAgICAgIGVxdWFsczogdGhpcy5lcXVhbHMsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcblxuICAgIHRoaXMuX3NvcnRGbiA9IG9wdGlvbnMub25Tb3J0O1xuICAgIHRoaXMuX29uTG9hZCA9IG9wdGlvbnMub25Mb2FkO1xuICAgIHRoaXMuX29uU2F2ZUZuID0gb3B0aW9ucy5vblNhdmU7XG4gICAgdGhpcy5fZXF1YWxzRm4gPSBvcHRpb25zLmVxdWFscztcbiAgICB0aGlzLl9maWx0ZXJGbkZhY3RvcnkgPSBvcHRpb25zLmZpbHRlckZuRmFjdG9yeSB8fCAoKGYpID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuYXNGaWx0ZXIoZikgYXMgRjtcbiAgICAgIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBFbnRpdHlGaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlci5hc0ZpbHRlckZuKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fc29ydEJ5UmVwbGFjZW1lbnQgPSB7XG4gICAgICAvLyBEZXRlY3QgcmFua09yZGVyIG9uIHRoZSBlbnRpdHkgY2xhc3NcbiAgICAgIGlkOiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobmV3IGRhdGFUeXBlKCkpLmZpbmRJbmRleChrZXkgPT4ga2V5ID09PSAncmFua09yZGVyJykgIT09IC0xKSA/ICdyYW5rT3JkZXInIDogdW5kZWZpbmVkLFxuICAgICAgLi4ub3B0aW9ucy5zb3J0QnlSZXBsYWNlbWVudFxuICAgIH07XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW21lbW9yeS1kYXRhLXNlcnZpY2VdIERlc3Ryb3lpbmcuLi4nKTtcbiAgICB0aGlzLl9vbkNoYW5nZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX29uQ2hhbmdlLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBzZXRWYWx1ZShkYXRhOiBUW10sIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLmRhdGEgIT09IGRhdGEpIHtcbiAgICAgIHRoaXMuX2hpZGRlbkRhdGEgPSBbXTtcbiAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG5cbiAgICAgIC8vIFNlbmQgdG8gb2JzZXJ2ZXJzXG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlLm5leHQodHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgfVxuXG4gIHdhdGNoQWxsKFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIHNpemU6IG51bWJlcixcbiAgICBzb3J0Qnk/OiBzdHJpbmcsXG4gICAgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24sXG4gICAgZmlsdGVyRGF0YT86IEYsXG4gICAgb3B0aW9ucz86IGFueVxuICApOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VD4+IHtcblxuICAgIG9mZnNldCA9IG9mZnNldCA+PSAwID8gb2Zmc2V0IDogMDtcbiAgICBzaXplID0gc2l6ZSA+PSAwID8gc2l6ZSA6IC0xO1xuXG4gICAgaWYgKCF0aGlzLmRhdGEpIHtcbiAgICAgIGNvbnNvbGUud2FybignW21lbW9yeS1kYXRhLXNlcnZpY2VdIFdhaXRpbmcgdmFsdWUgdG8gYmUgc2V0Li4uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX29uQ2hhbmdlXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKGlzTm90TmlsKSxcbiAgICAgICAgbWVyZ2VNYXAoYXN5bmMgKF8pID0+IHtcbiAgICAgICAgICB0aGlzLl9oaWRkZW5EYXRhID0gW107XG5cbiAgICAgICAgICBpZiAoaXNFbXB0eUFycmF5KHRoaXMuZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7ZGF0YTogW10sIHRvdGFsOiAwfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBBcHBseSBzb3J0XG4gICAgICAgICAgbGV0IGRhdGEgPSB0aGlzLl9zb3J0Rm4odGhpcy5kYXRhIHx8IFtdLCBzb3J0QnksIHNvcnREaXJlY3Rpb24pIDtcblxuICAgICAgICAgIGlmICh0aGlzLl9vbkxvYWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VPckRhdGEgPSB0aGlzLl9vbkxvYWQoZGF0YSk7XG4gICAgICAgICAgICBkYXRhID0gKChwcm9taXNlT3JEYXRhIGluc3RhbmNlb2YgUHJvbWlzZSkpID8gYXdhaXQgcHJvbWlzZU9yRGF0YSA6IHByb21pc2VPckRhdGE7XG4gICAgICAgICAgfVxuXG5cbiAgICAgICAgICAvLyBBcHBseSBmaWx0ZXIgKHdpbGwgdXBkYXRlIGhpZGRlbkRhdGEpXG4gICAgICAgICAgZGF0YSA9IHRoaXMuZmlsdGVyKGRhdGEsIGZpbHRlckRhdGEsIHRoaXMuX2hpZGRlbkRhdGEpO1xuXG4gICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgdG90YWwgbGVuZ3RoXG4gICAgICAgICAgY29uc3QgdG90YWwgPSBkYXRhLmxlbmd0aDtcblxuICAgICAgICAgIC8vIElmIHBhZ2Ugc2l6ZT0wIChlLmcuIG9ubHkgbmVlZCB0b3RhbClcbiAgICAgICAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5faGlkZGVuRGF0YS5wdXNoKC4uLmRhdGEpO1xuICAgICAgICAgICAgcmV0dXJuIHtkYXRhOiBbXSwgdG90YWx9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNsaWNlIGluIGEgcGFnZSAodXNpbmcgb2Zmc2V0IGFuZCBzaXplKVxuICAgICAgICAgIGlmIChvZmZzZXQgPiAwKSB7XG5cbiAgICAgICAgICAgIC8vIE9mZnNldCBhZnRlciB0aGUgZW5kOiBubyByZXN1bHRcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5faGlkZGVuRGF0YS5wdXNoKC4uLmRhdGEpO1xuICAgICAgICAgICAgICBkYXRhID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgaGlkZGVuRGF0YSA9IChzaXplID4gMCAmJiAoKG9mZnNldCArIHNpemUpIDwgZGF0YS5sZW5ndGgpKSA/XG4gICAgICAgICAgICAgICAgLy8gU2xpY2UgdXNpbmcgbGltaXQgdG8gc2l6ZVxuICAgICAgICAgICAgICAgIGRhdGEuc2xpY2UoMCwgb2Zmc2V0IC0xKS5jb25jYXQoZGF0YS5zbGljZShvZmZzZXQgKyBzaXplKSkgOlxuICAgICAgICAgICAgICAgIC8vIFNsaWNlIHdpdGhvdXQgbGltaXRcbiAgICAgICAgICAgICAgICBkYXRhLnNsaWNlKDAsIG9mZnNldC0xKTtcbiAgICAgICAgICAgICAgdGhpcy5faGlkZGVuRGF0YS5wdXNoKC4uLmhpZGRlbkRhdGEpO1xuICAgICAgICAgICAgICBkYXRhID0gKHNpemUgPiAwICYmICgob2Zmc2V0ICsgc2l6ZSkgPCBkYXRhLmxlbmd0aCkpID9cbiAgICAgICAgICAgICAgICAvLyBTbGljZSB1c2luZyBsaW1pdCB0byBzaXplXG4gICAgICAgICAgICAgICAgZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIHNpemUpIDpcbiAgICAgICAgICAgICAgICAvLyBTbGljZSB3aXRob3V0IGxpbWl0XG4gICAgICAgICAgICAgICAgZGF0YS5zbGljZShvZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFwcGx5IGEgbGltaXRcbiAgICAgICAgICBlbHNlIGlmIChzaXplID4gMCl7XG4gICAgICAgICAgICB0aGlzLl9oaWRkZW5EYXRhLnB1c2goLi4uZGF0YS5zbGljZShzaXplKSk7XG4gICAgICAgICAgICBkYXRhID0gZGF0YS5zbGljZSgwLCBzaXplKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTm8gbGltaXQ6XG4gICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PT0gLTEpe1xuICAgICAgICAgICAgLy8gS2VlcCBhbGwgZGF0YVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIC8hXFwgSWYgYWxyZWFkeSBvYnNlcnZlZCwgdGhlbiBhbHdheXMgY3JlYXRlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgYXJyYXlcbiAgICAgICAgICAvLyBCZWNhdXNlIGRhdGFzb3VyY2Ugd2lsbCBvbmx5IHVwZGF0ZSBpZiB0aGUgYXJyYXkgY2hhbmdlZFxuICAgICAgICAgIGlmIChkYXRhID09PSB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgIGRhdGEgPSBkYXRhLnNsaWNlKDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7ZGF0YSwgdG90YWx9O1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmVBbGwoZGF0YTogVFtdLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTxUW10+IHtcbiAgICBpZiAoIXRoaXMuZGF0YSkgdGhyb3cgbmV3IEVycm9yKCdbbWVtb3J5LXNlcnZpY2VdIENvdWxkIG5vdCBzYXZlLCBiZWNhdXNlIHZhbHVlIG5vdCBzZXQnKTtcblxuICAgIC8vIFJlc3RvcmUgaGlkZGVuIGRhdGFcbiAgICBpZiAoaXNOb3RFbXB0eUFycmF5KHRoaXMuX2hpZGRlbkRhdGEpKVxuICAgICAgZGF0YSA9IGRhdGEuY29uY2F0KHRoaXMuX2hpZGRlbkRhdGEpO1xuXG4gICAgaWYgKHRoaXMuX29uU2F2ZUZuKSB7XG4gICAgICBjb25zdCByZXMgPSB0aGlzLl9vblNhdmVGbihkYXRhKTtcbiAgICAgIGRhdGEgPSAoKHJlcyBpbnN0YW5jZW9mIFByb21pc2UpKSA/IGF3YWl0IHJlcyA6IHJlcztcbiAgICB9XG5cbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLmRhdGE7XG4gIH1cblxuICBhc3luYyBkZWxldGVBbGwoZGF0YVRvUmVtb3ZlOiBUW10sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghdGhpcy5kYXRhKSB0aHJvdyBuZXcgRXJyb3IoJ1ttZW1vcnktc2VydmljZV0gQ291bGQgbm90IGRlbGV0ZSwgYmVjYXVzZSB2YWx1ZSBub3Qgc2V0Jyk7XG5cbiAgICAvLyBSZW1vdmUgZGVsZXRlZCBpdGVtLCBmcm9tIGRhdGFcbiAgICBjb25zdCB1cGRhdGVkRGF0YSA9IHRoaXMuZGF0YS5maWx0ZXIoZW50aXR5ID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZFJlbW92ZWQgPSBkYXRhVG9SZW1vdmUuZmluZEluZGV4KGVudGl0eVRvUmVtb3ZlID0+IHRoaXMuX2VxdWFsc0ZuKGVudGl0eVRvUmVtb3ZlLCBlbnRpdHkpKSAhPT0gLTE7XG4gICAgICByZXR1cm4gIXNob3VsZFJlbW92ZWQ7XG4gICAgfSk7XG4gICAgY29uc3QgZGVsZXRlQ291bnQgPSB0aGlzLmRhdGEubGVuZ3RoIC0gdXBkYXRlZERhdGEubGVuZ3RoO1xuICAgIGlmIChkZWxldGVDb3VudCA+IDApIHtcbiAgICAgIHRoaXMuZGF0YSA9IHVwZGF0ZWREYXRhO1xuICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICB0aGlzLl9vbkNoYW5nZS5uZXh0KHRydWUpO1xuICAgIH1cblxuICB9XG5cbiAgc29ydChkYXRhOiBUW10sIHNvcnRCeT86IHN0cmluZywgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24pOiBUW10ge1xuICAgIC8vIFJlcGxhY2Ugc29ydEJ5LCB1c2luZyB0aGUgcmVwbGFjZW1lbnQgbWFwXG4gICAgc29ydEJ5ID0gc29ydEJ5ICYmIHRoaXMuX3NvcnRCeVJlcGxhY2VtZW50W3NvcnRCeV0gfHwgc29ydEJ5IHx8ICdpZCc7XG5cbiAgICAvLyBFeGVjdXRlIHRoZSBzb3J0XG4gICAgcmV0dXJuIEVudGl0eVV0aWxzLnNvcnQoZGF0YSwgc29ydEJ5LCBzb3J0RGlyZWN0aW9uKTtcbiAgfVxuXG4gIGFzRmlsdGVyKHNvdXJjZTogUGFydGlhbDxGPik6IEYge1xuICAgIHJldHVybiBFbnRpdHlGaWx0ZXJVdGlscy5mcm9tT2JqZWN0KHNvdXJjZSwgdGhpcy5maWx0ZXJUeXBlKTtcbiAgfVxuXG4gIGFkZFNvcnRCeVJlcGxhY2VtZW50KHNvdXJjZTogc3RyaW5nLCB0YXJnZXQ6IHN0cmluZykge1xuICAgIHRoaXMuX3NvcnRCeVJlcGxhY2VtZW50W3NvdXJjZV0gPSB0YXJnZXQ7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xuXG4gIHByb3RlY3RlZCBmaWx0ZXIoZGF0YTogVFtdLCBfZmlsdGVyOiBGLCBoaWRkZW5EYXRhOiBUW10pOiBUW10ge1xuXG4gICAgLy8gaWYgZmlsdGVyIGlzIERhdGFGaWx0ZXIgaW5zdGFuY2UsIHVzZSBpdHMgdGVzdCBmdW5jdGlvblxuICAgIGNvbnN0IGZpbHRlckZuID0gdGhpcy5fZmlsdGVyRm5GYWN0b3J5ICYmIHRoaXMuX2ZpbHRlckZuRmFjdG9yeShfZmlsdGVyKTtcbiAgICBpZiAoZmlsdGVyRm4pIHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IFtdO1xuXG4gICAgICBkYXRhLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyRm4odmFsdWUpKVxuICAgICAgICAgIGZpbHRlcmVkRGF0YS5wdXNoKHZhbHVlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGhpZGRlbkRhdGEucHVzaCh2YWx1ZSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGZpbHRlcmVkRGF0YTtcbiAgICB9XG5cbiAgICAvLyBkZWZhdWx0LCBubyBmaWx0ZXJcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25uZWN0KCk6IE9ic2VydmFibGU8TG9hZFJlc3VsdDxUPj4ge1xuICAgIHJldHVybiB0aGlzLl9vbkNoYW5nZS5waXBlKFxuICAgICAgbWFwKF8gPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhIHx8IFtdO1xuICAgICAgICBjb25zdCB0b3RhbCA9IGRhdGEubGVuZ3RoO1xuICAgICAgICByZXR1cm4ge2RhdGEsIHRvdGFsfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlcXVhbHMoZDE6IFQsIGQyOiBUKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGQxICYmIGQxLmVxdWFscyA/IGQxLmVxdWFscyhkMikgOiBFbnRpdHlVdGlscy5lcXVhbHMoZDEsIGQyLCAnaWQnKTtcbiAgfVxufVxuXG4iXX0=
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvc2VydmljZXMvbWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsZUFBZSxFQUFhLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNyRSxPQUFPLEVBQUMsZUFBZSxFQUF1RixNQUFNLHdCQUF3QixDQUFDO0FBRTdJLE9BQU8sRUFBQyxTQUFTLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFDLFdBQVcsRUFBVSxNQUFNLHdDQUF3QyxDQUFDO0FBQzVFLE9BQU8sRUFBQyxZQUFZLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUN2RixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFjdkMsV0FBVztBQUVYLGtFQUFrRTtBQUNsRSxNQUFNLE9BQU8sdUJBS1gsU0FBUSxlQUF5QjtJQTJCakMsWUFDWSxRQUFvQixFQUNwQixVQUFzQixFQUNoQyxPQUE4QztRQUU5QyxLQUFLLEVBQUUsQ0FBQztRQUpFLGFBQVEsR0FBUixRQUFRLENBQVk7UUFDcEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQTFCbEMsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUNkLFVBQUssR0FBRyxLQUFLLENBQUM7UUFJTixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRVAsY0FBUyxHQUFHLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBdUJyRCxPQUFPLG1CQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMs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TyxZQUFZLENBQUM7U0FDckI7UUFFRCxxQkFBcUI7UUFDckIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRVMsT0FBTztRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQ3hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNOLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzdCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDMUIsT0FBTyxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUlTLFlBQVk7UUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQztJQUVTLFdBQVc7UUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQzs7O1lBNVJGLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpbHRlciwgbWFwLCBtZXJnZU1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtpc0VtcHR5QXJyYXksIGlzTm90RW1wdHlBcnJheSwgaXNOb3ROaWx9IGZyb20gJy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQge0VudGl0aWVzU2VydmljZSwgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zLCBGaWx0ZXJGbiwgRmlsdGVyRm5GYWN0b3J5LCBJRW50aXRpZXNTZXJ2aWNlLCBMb2FkUmVzdWx0fSBmcm9tICcuL2VudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7U29ydERpcmVjdGlvbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQge0RpcmVjdGl2ZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RW50aXR5VXRpbHMsIElFbnRpdHl9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7RW50aXR5RmlsdGVyLCBFbnRpdHlGaWx0ZXJVdGlsc30gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9tb2RlbC9maWx0ZXIubW9kZWwnO1xuaW1wb3J0IHt3YWl0Rm9yfSBmcm9tICcuLi9vYnNlcnZhYmxlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5NZW1vcnlFbnRpdGllc1NlcnZpY2VPcHRpb25zPFQsIEY+IHtcbiAgb25Tb3J0PzogKGRhdGE6IFRbXSwgc29ydEJ5Pzogc3RyaW5nLCBzb3J0RGlyZWN0aW9uPzogU29ydERpcmVjdGlvbikgPT4gVFtdO1xuICBvbkxvYWQ/OiAoZGF0YTogVFtdKSA9PiBUW10gfCBQcm9taXNlPFRbXT47XG4gIG9uU2F2ZT86IChkYXRhOiBUW10pID0+IFRbXSB8IFByb21pc2U8VFtdPjtcbiAgZXF1YWxzPzogKGQxOiBULCBkMjogVCkgPT4gYm9vbGVhbjtcblxuICBmaWx0ZXJGbkZhY3Rvcnk/OiBGaWx0ZXJGbkZhY3Rvcnk8VCwgRj47XG4gIGZpbHRlckZuPzogRmlsdGVyRm48VD47XG5cbiAgc29ydEJ5UmVwbGFjZW1lbnQ/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vLyBAZHluYW1pY1xuQERpcmVjdGl2ZSgpXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1jbGFzcy1zdWZmaXhcbmV4cG9ydCBjbGFzcyBJbk1lbW9yeUVudGl0aWVzU2VydmljZTxcbiAgVCBleHRlbmRzIElFbnRpdHk8VCwgSUQ+LFxuICBGID0gYW55LFxuICBJRCA9IG51bWJlcixcbiAgTyBleHRlbmRzIEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyA9IEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucz5cbiAgZXh0ZW5kcyBFbnRpdGllc1NlcnZpY2U8VCwgRiwgSUQ+XG4gIGltcGxlbWVudHMgSUVudGl0aWVzU2VydmljZTxULCBGLCBPPiwgT25EZXN0cm95IHtcblxuICBkZWJ1ZyA9IGZhbHNlO1xuICBkaXJ0eSA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBkYXRhOiBUW107XG4gIHByaXZhdGUgX2hpZGRlbkRhdGE6IFRbXTtcbiAgcHJpdmF0ZSBfc2F2aW5nID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25DaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zb3J0Rm46IChkYXRhOiBUW10sIHNvcnRCeT86IHN0cmluZywgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24pID0+IFRbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25Mb2FkOiAoZGF0YTogVFtdKSA9PiBUW10gfCBQcm9taXNlPFRbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uU2F2ZUZuOiAoZGF0YTogVFtdKSA9PiBUW10gfCBQcm9taXNlPFRbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2VxdWFsc0ZuOiAoZDE6IFQsIGQyOiBUKSA9PiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IF9maWx0ZXJGbkZhY3Rvcnk6IEZpbHRlckZuRmFjdG9yeTxULCBGPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfc29ydEJ5UmVwbGFjZW1lbnQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cblxuICBzZXQgdmFsdWUoZGF0YTogVFtdKSB7XG4gICAgdGhpcy5zZXRWYWx1ZShkYXRhKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBUW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGE7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZGF0YVR5cGU6IG5ldygpID0+IFQsXG4gICAgcHJvdGVjdGVkIGZpbHRlclR5cGU6IG5ldygpID0+IEYsXG4gICAgb3B0aW9ucz86IEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlT3B0aW9uczxULCBGPlxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICBvblNvcnQ6IHRoaXMuc29ydCxcbiAgICAgIGVxdWFsczogdGhpcy5lcXVhbHMsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcblxuICAgIHRoaXMuX3NvcnRGbiA9IG9wdGlvbnMub25Tb3J0O1xuICAgIHRoaXMuX29uTG9hZCA9IG9wdGlvbnMub25Mb2FkO1xuICAgIHRoaXMuX29uU2F2ZUZuID0gb3B0aW9ucy5vblNhdmU7XG4gICAgdGhpcy5fZXF1YWxzRm4gPSBvcHRpb25zLmVxdWFscztcbiAgICB0aGlzLl9maWx0ZXJGbkZhY3RvcnkgPSBvcHRpb25zLmZpbHRlckZuRmFjdG9yeSB8fCAoKGYpID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuYXNGaWx0ZXIoZikgYXMgRjtcbiAgICAgIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBFbnRpdHlGaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlci5hc0ZpbHRlckZuKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fc29ydEJ5UmVwbGFjZW1lbnQgPSB7XG4gICAgICAvLyBEZXRlY3QgcmFua09yZGVyIG9uIHRoZSBlbnRpdHkgY2xhc3NcbiAgICAgIGlkOiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobmV3IGRhdGFUeXBlKCkpLmZpbmRJbmRleChrZXkgPT4ga2V5ID09PSAncmFua09yZGVyJykgIT09IC0xKSA/ICdyYW5rT3JkZXInIDogdW5kZWZpbmVkLFxuICAgICAgLi4ub3B0aW9ucy5zb3J0QnlSZXBsYWNlbWVudFxuICAgIH07XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW21lbW9yeS1kYXRhLXNlcnZpY2VdIERlc3Ryb3lpbmcuLi4nKTtcbiAgICB0aGlzLl9vbkNoYW5nZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX29uQ2hhbmdlLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBzZXRWYWx1ZShkYXRhOiBUW10sIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLmRhdGEgIT09IGRhdGEpIHtcbiAgICAgIHRoaXMuX2hpZGRlbkRhdGEgPSBbXTtcbiAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG5cbiAgICAgIC8vIFNlbmQgdG8gb2JzZXJ2ZXJzXG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlLm5leHQodHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgfVxuXG4gIHdhdGNoQWxsKFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIHNpemU6IG51bWJlcixcbiAgICBzb3J0Qnk/OiBzdHJpbmcsXG4gICAgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24sXG4gICAgZmlsdGVyRGF0YT86IEYsXG4gICAgb3B0aW9ucz86IGFueVxuICApOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VD4+IHtcblxuICAgIG9mZnNldCA9IG9mZnNldCA+PSAwID8gb2Zmc2V0IDogMDtcbiAgICBzaXplID0gc2l6ZSA+PSAwID8gc2l6ZSA6IC0xO1xuXG4gICAgaWYgKCF0aGlzLmRhdGEpIHtcbiAgICAgIGNvbnNvbGUud2FybignW21lbW9yeS1kYXRhLXNlcnZpY2VdIFdhaXRpbmcgdmFsdWUgdG8gYmUgc2V0Li4uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX29uQ2hhbmdlXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKGlzTm90TmlsKSxcbiAgICAgICAgbWVyZ2VNYXAoXyA9PiB3YWl0Rm9yKCgpID0+ICF0aGlzLl9zYXZpbmcpKSxcbiAgICAgICAgbWVyZ2VNYXAoYXN5bmMgKF8pID0+IHtcbiAgICAgICAgICBjb25zdCBleGNsdWRlZERhdGFCeUZpbHRlcjogVFtdID0gW107XG4gICAgICAgICAgbGV0IGV4Y2x1ZGVkRGF0YUJ5UGFnaW5hdGlvbjogVFtdO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChpc0VtcHR5QXJyYXkodGhpcy5kYXRhKSkge1xuICAgICAgICAgICAgICByZXR1cm4ge2RhdGE6IFtdLCB0b3RhbDogMH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFwcGx5IHNvcnRcbiAgICAgICAgICAgIGxldCBkYXRhID0gdGhpcy5fc29ydEZuKHRoaXMuZGF0YSB8fCBbXSwgc29ydEJ5LCBzb3J0RGlyZWN0aW9uKSA7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9vbkxvYWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZU9yRGF0YSA9IHRoaXMuX29uTG9hZChkYXRhKTtcbiAgICAgICAgICAgICAgZGF0YSA9ICgocHJvbWlzZU9yRGF0YSBpbnN0YW5jZW9mIFByb21pc2UpKSA/IGF3YWl0IHByb21pc2VPckRhdGEgOiBwcm9taXNlT3JEYXRhO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBcHBseSBmaWx0ZXIgKHdpbGwgdXBkYXRlIGhpZGRlbkRhdGEpXG4gICAgICAgICAgICBkYXRhID0gdGhpcy5maWx0ZXIoZGF0YSwgZmlsdGVyRGF0YSwgZXhjbHVkZWREYXRhQnlGaWx0ZXIpO1xuXG4gICAgICAgICAgICAvLyBDb21wdXRlIHRoZSB0b3RhbCBsZW5ndGhcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsID0gZGF0YS5sZW5ndGg7XG5cbiAgICAgICAgICAgIC8vIElmIHBhZ2Ugc2l6ZT0wIChlLmcuIG9ubHkgbmVlZCB0b3RhbClcbiAgICAgICAgICAgIGlmIChzaXplID09PSAwKSB7XG4gICAgICAgICAgICAgIGV4Y2x1ZGVkRGF0YUJ5UGFnaW5hdGlvbiA9IGRhdGE7XG4gICAgICAgICAgICAgIHJldHVybiB7ZGF0YTogW10sIHRvdGFsfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2xpY2UgaW4gYSBwYWdlICh1c2luZyBvZmZzZXQgYW5kIHNpemUpXG4gICAgICAgICAgICBpZiAob2Zmc2V0ID4gMCkge1xuXG4gICAgICAgICAgICAgIC8vIE9mZnNldCBhZnRlciB0aGUgZW5kOiBubyByZXN1bHRcbiAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGV4Y2x1ZGVkRGF0YUJ5UGFnaW5hdGlvbiA9IGRhdGE7XG4gICAgICAgICAgICAgICAgZGF0YSA9IFtdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGV4Y2x1ZGVkRGF0YUJ5UGFnaW5hdGlvbiA9IChzaXplID4gMCAmJiAoKG9mZnNldCArIHNpemUpIDwgZGF0YS5sZW5ndGgpKSA/XG4gICAgICAgICAgICAgICAgICAvLyBTbGljZSB1c2luZyBsaW1pdCB0byBzaXplXG4gICAgICAgICAgICAgICAgICBkYXRhLnNsaWNlKDAsIG9mZnNldCAtMSkuY29uY2F0KGRhdGEuc2xpY2Uob2Zmc2V0ICsgc2l6ZSkpIDpcbiAgICAgICAgICAgICAgICAgIC8vIFNsaWNlIHdpdGhvdXQgbGltaXRcbiAgICAgICAgICAgICAgICAgIGRhdGEuc2xpY2UoMCwgb2Zmc2V0LTEpO1xuICAgICAgICAgICAgICAgIGRhdGEgPSAoc2l6ZSA+IDAgJiYgKChvZmZzZXQgKyBzaXplKSA8IGRhdGEubGVuZ3RoKSkgP1xuICAgICAgICAgICAgICAgICAgLy8gU2xpY2UgdXNpbmcgbGltaXQgdG8gc2l6ZVxuICAgICAgICAgICAgICAgICAgZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIHNpemUpIDpcbiAgICAgICAgICAgICAgICAgIC8vIFNsaWNlIHdpdGhvdXQgbGltaXRcbiAgICAgICAgICAgICAgICAgIGRhdGEuc2xpY2Uob2Zmc2V0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBcHBseSBhIGxpbWl0XG4gICAgICAgICAgICBlbHNlIGlmIChzaXplID4gMCl7XG4gICAgICAgICAgICAgIGV4Y2x1ZGVkRGF0YUJ5UGFnaW5hdGlvbiA9IGRhdGEuc2xpY2Uoc2l6ZSk7XG4gICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnNsaWNlKDAsIHNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTm8gbGltaXQ6XG4gICAgICAgICAgICBlbHNlIGlmIChzaXplID09PSAtMSl7XG4gICAgICAgICAgICAgIC8vIEtlZXAgYWxsIGRhdGFcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gLyFcXCBJZiBhbHJlYWR5IG9ic2VydmVkLCB0aGVuIGFsd2F5cyBjcmVhdGUgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBhcnJheVxuICAgICAgICAgICAgLy8gQmVjYXVzZSBkYXRhc291cmNlIHdpbGwgb25seSB1cGRhdGUgaWYgdGhlIGFycmF5IGNoYW5nZWRcbiAgICAgICAgICAgIGlmIChkYXRhID09PSB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuc2xpY2UoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtkYXRhLCB0b3RhbH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgLy8gUmVtZW1iZXIgaGlkZGVuIGRhdGFcbiAgICAgICAgICAgIHRoaXMuX2hpZGRlbkRhdGEgPSAhZXhjbHVkZWREYXRhQnlQYWdpbmF0aW9uID8gZXhjbHVkZWREYXRhQnlGaWx0ZXIgOiBleGNsdWRlZERhdGFCeUZpbHRlci5jb25jYXQoLi4uZXhjbHVkZWREYXRhQnlQYWdpbmF0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgYXN5bmMgc2F2ZUFsbChkYXRhOiBUW10sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPFRbXT4ge1xuICAgIGlmICghdGhpcy5kYXRhKSB0aHJvdyBuZXcgRXJyb3IoJ1ttZW1vcnktc2VydmljZV0gQ291bGQgbm90IHNhdmUsIGJlY2F1c2UgdmFsdWUgbm90IHNldCcpO1xuXG4gICAgdGhpcy5tYXJrQXNTYXZpbmcoKTtcblxuICAgIHRyeSB7XG5cbiAgICAgIC8vIFJlc3RvcmUgaGlkZGVuIGRhdGFcbiAgICAgIGlmIChpc05vdEVtcHR5QXJyYXkodGhpcy5faGlkZGVuRGF0YSkpXG4gICAgICAgIGRhdGEgPSBkYXRhLmNvbmNhdCguLi50aGlzLl9oaWRkZW5EYXRhKTtcblxuICAgICAgaWYgKHRoaXMuX29uU2F2ZUZuKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuX29uU2F2ZUZuKGRhdGEpO1xuICAgICAgICBkYXRhID0gKChyZXMgaW5zdGFuY2VvZiBQcm9taXNlKSkgPyBhd2FpdCByZXMgOiByZXM7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLmRhdGE7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgdGhpcy5tYXJrQXNTYXZlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbChkYXRhVG9SZW1vdmU6IFRbXSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCF0aGlzLmRhdGEpIHRocm93IG5ldyBFcnJvcignW21lbW9yeS1zZXJ2aWNlXSBDb3VsZCBub3QgZGVsZXRlLCBiZWNhdXNlIHZhbHVlIG5vdCBzZXQnKTtcblxuICAgIC8vIFJlbW92ZSBkZWxldGVkIGl0ZW0sIGZyb20gZGF0YVxuICAgIGNvbnN0IHVwZGF0ZWREYXRhID0gdGhpcy5kYXRhLmZpbHRlcihlbnRpdHkgPT4ge1xuICAgICAgY29uc3QgcmVtb3ZlZCA9IGRhdGFUb1JlbW92ZS5maW5kSW5kZXgoZW50aXR5VG9SZW1vdmUgPT4gdGhpcy5lcXVhbHMoZW50aXR5VG9SZW1vdmUsIGVudGl0eSkpICE9PSAtMTtcbiAgICAgIHJldHVybiAhcmVtb3ZlZDtcbiAgICB9KTtcbiAgICBjb25zdCBkZWxldGVDb3VudCA9IHRoaXMuZGF0YS5sZW5ndGggLSB1cGRhdGVkRGF0YS5sZW5ndGg7XG4gICAgaWYgKGRlbGV0ZUNvdW50ID4gMCkge1xuICAgICAgdGhpcy5kYXRhID0gdXBkYXRlZERhdGE7XG4gICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuX29uQ2hhbmdlLm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgc29ydChkYXRhOiBUW10sIHNvcnRCeT86IHN0cmluZywgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24pOiBUW10ge1xuICAgIC8vIFJlcGxhY2Ugc29ydEJ5LCB1c2luZyB0aGUgcmVwbGFjZW1lbnQgbWFwXG4gICAgc29ydEJ5ID0gc29ydEJ5ICYmIHRoaXMuX3NvcnRCeVJlcGxhY2VtZW50W3NvcnRCeV0gfHwgc29ydEJ5IHx8ICdpZCc7XG5cbiAgICAvLyBFeGVjdXRlIHRoZSBzb3J0XG4gICAgcmV0dXJuIEVudGl0eVV0aWxzLnNvcnQoZGF0YSwgc29ydEJ5LCBzb3J0RGlyZWN0aW9uKTtcbiAgfVxuXG4gIGFzRmlsdGVyKHNvdXJjZTogUGFydGlhbDxGPik6IEYge1xuICAgIHJldHVybiBFbnRpdHlGaWx0ZXJVdGlscy5mcm9tT2JqZWN0KHNvdXJjZSwgdGhpcy5maWx0ZXJUeXBlKTtcbiAgfVxuXG4gIGFkZFNvcnRCeVJlcGxhY2VtZW50KHNvdXJjZTogc3RyaW5nLCB0YXJnZXQ6IHN0cmluZykge1xuICAgIHRoaXMuX3NvcnRCeVJlcGxhY2VtZW50W3NvdXJjZV0gPSB0YXJnZXQ7XG4gIH1cblxuICBlcXVhbHMoZDE6IFQsIGQyOiBUKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2VxdWFsc0ZuKSByZXR1cm4gdGhpcy5fZXF1YWxzRm4oZDEsIGQyKTtcbiAgICByZXR1cm4gZDEgJiYgZDEuZXF1YWxzID8gZDEuZXF1YWxzKGQyKSA6IEVudGl0eVV0aWxzLmVxdWFscyhkMSwgZDIsICdpZCcpO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuICBwcm90ZWN0ZWQgZmlsdGVyKGRhdGE6IFRbXSwgX2ZpbHRlcjogRiwgaGlkZGVuRGF0YTogVFtdKTogVFtdIHtcblxuICAgIC8vIGlmIGZpbHRlciBpcyBEYXRhRmlsdGVyIGluc3RhbmNlLCB1c2UgaXRzIHRlc3QgZnVuY3Rpb25cbiAgICBjb25zdCBmaWx0ZXJGbiA9IHRoaXMuX2ZpbHRlckZuRmFjdG9yeSAmJiB0aGlzLl9maWx0ZXJGbkZhY3RvcnkoX2ZpbHRlcik7XG4gICAgaWYgKGZpbHRlckZuKSB7XG4gICAgICBjb25zdCBmaWx0ZXJlZERhdGEgPSBbXTtcblxuICAgICAgZGF0YS5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgaWYgKGZpbHRlckZuKHZhbHVlKSlcbiAgICAgICAgICBmaWx0ZXJlZERhdGEucHVzaCh2YWx1ZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBoaWRkZW5EYXRhLnB1c2godmFsdWUpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBmaWx0ZXJlZERhdGE7XG4gICAgfVxuXG4gICAgLy8gZGVmYXVsdCwgbm8gZmlsdGVyXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29ubmVjdCgpOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5fb25DaGFuZ2UucGlwZShcbiAgICAgIG1hcChfID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YSB8fCBbXTtcbiAgICAgICAgY29uc3QgdG90YWwgPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHtkYXRhLCB0b3RhbH07XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuXG5cbiAgcHJvdGVjdGVkIG1hcmtBc1NhdmluZygpIHtcbiAgICB0aGlzLl9zYXZpbmcgPSB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtBc1NhdmVkKCkge1xuICAgIHRoaXMuX3NhdmluZyA9IGZhbHNlO1xuICB9XG59XG4iXX0=