active-connect-ng2 0.2.50 → 0.3.0
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/fesm2022/active-connect-ng2.mjs +1186 -0
- package/fesm2022/active-connect-ng2.mjs.map +1 -0
- package/package.json +11 -17
- package/types/active-connect-ng2.d.ts +254 -0
- package/esm2020/active-connect-ng2.mjs +0 -5
- package/esm2020/lib/active-connect-ng2.module.mjs +0 -42
- package/esm2020/lib/websocket/client.mjs +0 -442
- package/esm2020/lib/websocket/decorators/function.mjs +0 -40
- package/esm2020/lib/websocket/decorators/websocket/handle.mjs +0 -9
- package/esm2020/lib/websocket/decorators/websocket/on-reconnect.mjs +0 -6
- package/esm2020/lib/websocket/decorators/websocket/on-success.mjs +0 -8
- package/esm2020/lib/websocket/decorators/websocket/outbound.mjs +0 -213
- package/esm2020/lib/websocket/decorators/websocket/route.mjs +0 -31
- package/esm2020/lib/websocket/decorators/websocket/shared.mjs +0 -10
- package/esm2020/lib/websocket/decorators/websocket/websocket-route-service.mjs +0 -2
- package/esm2020/lib/websocket/index.mjs +0 -11
- package/esm2020/lib/websocket/json/json-parser.mjs +0 -23
- package/esm2020/lib/websocket/lifecycle/loading-status.mjs +0 -31
- package/esm2020/lib/websocket/objects/outbound-object.mjs +0 -410
- package/esm2020/public-api.mjs +0 -7
- package/fesm2015/active-connect-ng2.mjs +0 -1285
- package/fesm2015/active-connect-ng2.mjs.map +0 -1
- package/fesm2020/active-connect-ng2.mjs +0 -1267
- package/fesm2020/active-connect-ng2.mjs.map +0 -1
- package/index.d.ts +0 -5
- package/lib/active-connect-ng2.module.d.ts +0 -7
- package/lib/websocket/client.d.ts +0 -65
- package/lib/websocket/decorators/function.d.ts +0 -30
- package/lib/websocket/decorators/websocket/handle.d.ts +0 -1
- package/lib/websocket/decorators/websocket/on-reconnect.d.ts +0 -1
- package/lib/websocket/decorators/websocket/on-success.d.ts +0 -1
- package/lib/websocket/decorators/websocket/outbound.d.ts +0 -1
- package/lib/websocket/decorators/websocket/route.d.ts +0 -1
- package/lib/websocket/decorators/websocket/shared.d.ts +0 -4
- package/lib/websocket/decorators/websocket/websocket-route-service.d.ts +0 -5
- package/lib/websocket/index.d.ts +0 -10
- package/lib/websocket/json/json-parser.d.ts +0 -5
- package/lib/websocket/lifecycle/loading-status.d.ts +0 -9
- package/lib/websocket/objects/outbound-object.d.ts +0 -50
- package/public-api.d.ts +0 -3
|
@@ -1,410 +0,0 @@
|
|
|
1
|
-
import { Observable } from 'rxjs';
|
|
2
|
-
import { WebsocketClient } from '../client';
|
|
3
|
-
export class OutboundObject {
|
|
4
|
-
constructor(client, method, lazyLoaded, cached, initialLoadingCount, sortBy) {
|
|
5
|
-
this.client = client;
|
|
6
|
-
this.method = method;
|
|
7
|
-
this.lazyLoaded = lazyLoaded;
|
|
8
|
-
this.cached = cached;
|
|
9
|
-
this.initialLoadingCount = initialLoadingCount;
|
|
10
|
-
this.sortBy = sortBy;
|
|
11
|
-
this.dataMap = new Map();
|
|
12
|
-
this.data = undefined;
|
|
13
|
-
this.requested = false;
|
|
14
|
-
this._loading = false;
|
|
15
|
-
this._length = undefined;
|
|
16
|
-
this.requestedId = null;
|
|
17
|
-
this.requestedIdConnectionId = null;
|
|
18
|
-
this.loadedObservable = null;
|
|
19
|
-
this.loadedId = null;
|
|
20
|
-
this.loadedIdData = null;
|
|
21
|
-
this.loadedIdChanged = null;
|
|
22
|
-
this.requestedGroupId = null;
|
|
23
|
-
this.requestedGroupIdConnectionId = null;
|
|
24
|
-
this.loadedGroupObservable = null;
|
|
25
|
-
this.loadedGroupId = null;
|
|
26
|
-
this.loadedGroupData = null;
|
|
27
|
-
this.loadedGroupChanged = null;
|
|
28
|
-
this.target.loading = new Map();
|
|
29
|
-
if (this.client.dbService) {
|
|
30
|
-
try {
|
|
31
|
-
this.client.dbService
|
|
32
|
-
.getByKey('outbound', method)
|
|
33
|
-
.subscribe((result) => {
|
|
34
|
-
if (result) {
|
|
35
|
-
this.previouslyCachedCount = result.data?.length || null;
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
catch (e) {
|
|
40
|
-
console.error('ActiveConnect: Unable to read cached data');
|
|
41
|
-
console.error(e);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
const _this = this;
|
|
45
|
-
WebsocketClient.expectOutbound(method, function setOutbound(data, specificHash, insertedOrGroupData, updatedOrGroupId, deleted, length, _client) {
|
|
46
|
-
if (!cached) {
|
|
47
|
-
if (_client.dbService) {
|
|
48
|
-
try {
|
|
49
|
-
_client.dbService
|
|
50
|
-
.deleteByKey('outbound', method)
|
|
51
|
-
.subscribe(() => { });
|
|
52
|
-
}
|
|
53
|
-
catch (e) {
|
|
54
|
-
console.error('ActiveConnect: Unable to delete cached data');
|
|
55
|
-
console.error(e);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
if (data == 'cache_restore') {
|
|
60
|
-
if (_client.dbService) {
|
|
61
|
-
try {
|
|
62
|
-
_client.dbService
|
|
63
|
-
.getByKey('outbound', method)
|
|
64
|
-
.subscribe((result) => {
|
|
65
|
-
_this.setData(result.data);
|
|
66
|
-
if (result.length)
|
|
67
|
-
_this._length = result.length;
|
|
68
|
-
_this.loading = false;
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
catch (e) {
|
|
72
|
-
console.error('ActiveConnect: Unable to restore cached data');
|
|
73
|
-
console.error(e);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
console.error('ActiveConnect: Caching / restore not possible as the indexedDB is not accessible');
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
else if (data == 'cache_delete') {
|
|
81
|
-
if (_client.dbService) {
|
|
82
|
-
try {
|
|
83
|
-
_client.dbService
|
|
84
|
-
.deleteByKey('outbound', method)
|
|
85
|
-
.subscribe(() => { });
|
|
86
|
-
}
|
|
87
|
-
catch (e) {
|
|
88
|
-
console.error('ActiveConnect: Unable to delete cached data');
|
|
89
|
-
console.error(e);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
console.error('ActiveConnect: Caching / restore not possible as the indexedDB is not accessible');
|
|
94
|
-
}
|
|
95
|
-
_this.loading = false;
|
|
96
|
-
_this.requested = false;
|
|
97
|
-
}
|
|
98
|
-
else if (data == 'data_delete') {
|
|
99
|
-
_this.data = undefined;
|
|
100
|
-
_this.dataMap = new Map();
|
|
101
|
-
_this.requested = false;
|
|
102
|
-
_this.loadedGroupData = null;
|
|
103
|
-
_this.loadedGroupId = null;
|
|
104
|
-
_this._length = undefined;
|
|
105
|
-
_this.loading = false;
|
|
106
|
-
}
|
|
107
|
-
else if (data == 'data_group') {
|
|
108
|
-
if (_this.requestedGroupId ==
|
|
109
|
-
(updatedOrGroupId ? updatedOrGroupId[0] : 0)) {
|
|
110
|
-
_this.loadedGroupData = insertedOrGroupData;
|
|
111
|
-
_this.loadedGroupId = updatedOrGroupId ? updatedOrGroupId[0] : 0;
|
|
112
|
-
_this.requestedGroupIdConnectionId = _this.target.___connectionId;
|
|
113
|
-
_this.loadedGroupChanged?.next(insertedOrGroupData);
|
|
114
|
-
_this.loading = false;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
else if (data == 'data_id') {
|
|
118
|
-
if (_this.requestedId == (updatedOrGroupId ? updatedOrGroupId[0] : 0)) {
|
|
119
|
-
_this.loadedIdData =
|
|
120
|
-
(insertedOrGroupData?.length || 0) > 0
|
|
121
|
-
? insertedOrGroupData[0]
|
|
122
|
-
: null;
|
|
123
|
-
_this.loadedId = updatedOrGroupId ? updatedOrGroupId[0] : 0;
|
|
124
|
-
_this.requestedIdConnectionId = _this.target.___connectionId;
|
|
125
|
-
_this.loadedIdChanged?.next(_this.loadedIdData);
|
|
126
|
-
_this.loading = false;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
else if (data == 'data_diff') {
|
|
130
|
-
insertedOrGroupData?.forEach((e) => {
|
|
131
|
-
_this.dataMap.set(e.id, e);
|
|
132
|
-
if (e.id == _this.loadedId) {
|
|
133
|
-
_this.loadedIdChanged?.next(e);
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
updatedOrGroupId?.forEach((e) => {
|
|
137
|
-
_this.dataMap.set(e.id, e);
|
|
138
|
-
if (e.id == _this.loadedId) {
|
|
139
|
-
_this.loadedIdChanged?.next(e);
|
|
140
|
-
}
|
|
141
|
-
});
|
|
142
|
-
deleted?.forEach((e) => {
|
|
143
|
-
_this.dataMap.delete(e.id);
|
|
144
|
-
if (e.id == _this.loadedId) {
|
|
145
|
-
_this.loadedIdChanged?.next(null);
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
_this.data = Array.from(_this.dataMap.values());
|
|
149
|
-
if (_this.data && _this.sortBy)
|
|
150
|
-
_this.data = _this.data.sort(_this.sortBy);
|
|
151
|
-
_this.loading = false;
|
|
152
|
-
if (cached && specificHash) {
|
|
153
|
-
if (_client.dbService) {
|
|
154
|
-
try {
|
|
155
|
-
if (_this.data && _this.data?.length > 0) {
|
|
156
|
-
_client.dbService
|
|
157
|
-
.update('outbound', {
|
|
158
|
-
method,
|
|
159
|
-
data: _this.data,
|
|
160
|
-
specificHash,
|
|
161
|
-
length
|
|
162
|
-
})
|
|
163
|
-
.subscribe(() => { });
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
_client.dbService
|
|
167
|
-
.deleteByKey('outbound', method)
|
|
168
|
-
.subscribe(() => { });
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
catch (e) {
|
|
172
|
-
console.error('ActiveConnect: Unable to update cached data.');
|
|
173
|
-
console.error(e);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
console.error('ActiveConnect: Caching not possible as the indexedDB has not been initialized');
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
182
|
-
_this.setData(data);
|
|
183
|
-
if (_this.loadedId) {
|
|
184
|
-
const loadedValue = _this.dataMap.get(_this.loadedId);
|
|
185
|
-
if (loadedValue) {
|
|
186
|
-
_this.loadedIdData = loadedValue;
|
|
187
|
-
_this.loadedIdChanged?.next(_this.loadedIdData);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
_this.loading = false;
|
|
191
|
-
if (cached && specificHash) {
|
|
192
|
-
if (_client.dbService) {
|
|
193
|
-
try {
|
|
194
|
-
if (data && data?.length > 0) {
|
|
195
|
-
_client.dbService
|
|
196
|
-
.update('outbound', {
|
|
197
|
-
method,
|
|
198
|
-
data,
|
|
199
|
-
specificHash,
|
|
200
|
-
length
|
|
201
|
-
})
|
|
202
|
-
.subscribe(() => { });
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
_client.dbService
|
|
206
|
-
.deleteByKey('outbound', method)
|
|
207
|
-
.subscribe(() => { });
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
catch (e) {
|
|
211
|
-
console.error('ActiveConnect: Unable to update cached data.');
|
|
212
|
-
console.error(e);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
else {
|
|
216
|
-
console.error('ActiveConnect: Caching not possible as the indexedDB has not been initialized');
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
if (length)
|
|
221
|
-
_this._length = length;
|
|
222
|
-
});
|
|
223
|
-
WebsocketClient.addResetRequestingStateCallback(() => {
|
|
224
|
-
this.afterServerReconnected();
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
get target() {
|
|
228
|
-
return this.client.__proto__;
|
|
229
|
-
}
|
|
230
|
-
get(id) {
|
|
231
|
-
if (this.requestedId == id &&
|
|
232
|
-
this.target.___connectionId == this.requestedIdConnectionId &&
|
|
233
|
-
this.loadedObservable &&
|
|
234
|
-
this.loadedIdData) {
|
|
235
|
-
if (this.loadedIdData)
|
|
236
|
-
setTimeout(() => {
|
|
237
|
-
if (this.loadedIdData)
|
|
238
|
-
this.loadedIdChanged?.next(this.loadedIdData);
|
|
239
|
-
}, 50);
|
|
240
|
-
return this.loadedObservable;
|
|
241
|
-
}
|
|
242
|
-
let observablePromise;
|
|
243
|
-
if (this.requestedId != id ||
|
|
244
|
-
this.target.___connectionId != this.requestedIdConnectionId ||
|
|
245
|
-
!this.loadedObservable) {
|
|
246
|
-
observablePromise = new Promise((resolve) => {
|
|
247
|
-
this.loadedObservable = new Observable((observer) => {
|
|
248
|
-
this.loadedIdChanged = observer;
|
|
249
|
-
resolve();
|
|
250
|
-
});
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
Promise.all([observablePromise]).then(() => {
|
|
254
|
-
new Promise(async (resolve) => {
|
|
255
|
-
if (!this.requested && this.lazyLoaded) {
|
|
256
|
-
this.load().then();
|
|
257
|
-
}
|
|
258
|
-
if (this.data) {
|
|
259
|
-
const res = this.dataMap.get(id);
|
|
260
|
-
if (res) {
|
|
261
|
-
this.loadedIdChanged?.next(res);
|
|
262
|
-
resolve();
|
|
263
|
-
return;
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
if (this.loadedId == id) {
|
|
267
|
-
this.loadedIdChanged?.next(this.loadedIdData);
|
|
268
|
-
}
|
|
269
|
-
else {
|
|
270
|
-
await this.requestById(id);
|
|
271
|
-
}
|
|
272
|
-
resolve();
|
|
273
|
-
}).then();
|
|
274
|
-
});
|
|
275
|
-
return this.loadedObservable;
|
|
276
|
-
}
|
|
277
|
-
getForGroup(groupId) {
|
|
278
|
-
if (this.requestedGroupId == groupId &&
|
|
279
|
-
this.target.___connectionId == this.requestedGroupIdConnectionId &&
|
|
280
|
-
this.loadedGroupObservable &&
|
|
281
|
-
this.loadedGroupData) {
|
|
282
|
-
setTimeout(() => {
|
|
283
|
-
if (this.loadedGroupData)
|
|
284
|
-
this.loadedGroupChanged?.next(this.loadedGroupData);
|
|
285
|
-
}, 50);
|
|
286
|
-
return this.loadedGroupObservable;
|
|
287
|
-
}
|
|
288
|
-
let observablePromise;
|
|
289
|
-
if (this.requestedGroupId != groupId ||
|
|
290
|
-
this.target.___connectionId != this.requestedGroupIdConnectionId ||
|
|
291
|
-
!this.loadedGroupObservable) {
|
|
292
|
-
observablePromise = new Promise((resolve) => {
|
|
293
|
-
this.loadedGroupObservable = new Observable((observer) => {
|
|
294
|
-
this.loadedGroupChanged = observer;
|
|
295
|
-
resolve();
|
|
296
|
-
});
|
|
297
|
-
});
|
|
298
|
-
}
|
|
299
|
-
Promise.all([observablePromise]).then(() => {
|
|
300
|
-
new Promise(async (resolve) => {
|
|
301
|
-
if (!this.requested && this.lazyLoaded) {
|
|
302
|
-
this.load().then();
|
|
303
|
-
}
|
|
304
|
-
if (this.loadedGroupId == groupId && this.loadedGroupData) {
|
|
305
|
-
this.loadedGroupChanged?.next(this.loadedGroupData);
|
|
306
|
-
}
|
|
307
|
-
else {
|
|
308
|
-
await this.requestForGroup(groupId);
|
|
309
|
-
}
|
|
310
|
-
resolve();
|
|
311
|
-
}).then();
|
|
312
|
-
});
|
|
313
|
-
return this.loadedGroupObservable;
|
|
314
|
-
}
|
|
315
|
-
get all() {
|
|
316
|
-
if (!this.requested && this.lazyLoaded) {
|
|
317
|
-
this.load().then();
|
|
318
|
-
}
|
|
319
|
-
return this.data;
|
|
320
|
-
}
|
|
321
|
-
async load(count) {
|
|
322
|
-
if (this.lazyLoaded) {
|
|
323
|
-
const hasBeenRequestedBefore = this.requested;
|
|
324
|
-
this._loading = true;
|
|
325
|
-
if (!this.requested) {
|
|
326
|
-
this.loading = true;
|
|
327
|
-
}
|
|
328
|
-
this.requested = true;
|
|
329
|
-
await this.client.send('request.' + this.method, {
|
|
330
|
-
count: hasBeenRequestedBefore
|
|
331
|
-
? this.data
|
|
332
|
-
? count || this.initialLoadingCount
|
|
333
|
-
? (count || this.initialLoadingCount) +
|
|
334
|
-
this.loadedLength
|
|
335
|
-
: undefined
|
|
336
|
-
: undefined
|
|
337
|
-
: this.previouslyCachedCount || this.initialLoadingCount,
|
|
338
|
-
loaded: this.loadedLength
|
|
339
|
-
});
|
|
340
|
-
}
|
|
341
|
-
else {
|
|
342
|
-
throw Error('Active-Connect: Cannot run loading request as this outbound is not lazy-loaded.');
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
set loading(value) {
|
|
346
|
-
this._loading = value;
|
|
347
|
-
this.target.loading.set(this.method, value);
|
|
348
|
-
}
|
|
349
|
-
get loading() {
|
|
350
|
-
return this._loading;
|
|
351
|
-
}
|
|
352
|
-
get loadedLength() {
|
|
353
|
-
return this.data?.length || 0;
|
|
354
|
-
}
|
|
355
|
-
get length() {
|
|
356
|
-
return this._length;
|
|
357
|
-
}
|
|
358
|
-
requestById(id) {
|
|
359
|
-
this.loading = true;
|
|
360
|
-
this.requestedId = id;
|
|
361
|
-
return this.client.send('request.' + this.method, { id });
|
|
362
|
-
}
|
|
363
|
-
requestForGroup(groupId) {
|
|
364
|
-
this.loading = true;
|
|
365
|
-
this.requestedGroupId = groupId;
|
|
366
|
-
return this.client.send('request.' + this.method, { groupId });
|
|
367
|
-
}
|
|
368
|
-
setData(data) {
|
|
369
|
-
this.data = data;
|
|
370
|
-
if (this.data && this.sortBy)
|
|
371
|
-
this.data = this.data.sort(this.sortBy);
|
|
372
|
-
this._length = data.length;
|
|
373
|
-
this.dataMap = new Map();
|
|
374
|
-
this.data.forEach((d) => {
|
|
375
|
-
this.dataMap.set(d.id, d);
|
|
376
|
-
});
|
|
377
|
-
}
|
|
378
|
-
get isEmpty() {
|
|
379
|
-
return this.data == undefined;
|
|
380
|
-
}
|
|
381
|
-
/**
|
|
382
|
-
* The contained data can be modified within the callback method
|
|
383
|
-
*/
|
|
384
|
-
update(callback) {
|
|
385
|
-
if (this.data) {
|
|
386
|
-
const updateLengthVariable = this.data.length == this._length;
|
|
387
|
-
const length = this.length;
|
|
388
|
-
callback(this.data);
|
|
389
|
-
this.setData(this.data);
|
|
390
|
-
if (!updateLengthVariable) {
|
|
391
|
-
this._length = length;
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
afterServerReconnected() {
|
|
396
|
-
if (this.requested && this.lazyLoaded) {
|
|
397
|
-
this.requested = false;
|
|
398
|
-
this.load(this.loadedLength).then();
|
|
399
|
-
}
|
|
400
|
-
if (this.loadedId) {
|
|
401
|
-
this.loadedIdData = null;
|
|
402
|
-
this.requestById(this.loadedId).catch(() => { });
|
|
403
|
-
}
|
|
404
|
-
if (this.loadedGroupId) {
|
|
405
|
-
this.loadedGroupData = null;
|
|
406
|
-
this.requestForGroup(this.loadedGroupId).catch(() => { });
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0Ym91bmQtb2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWN0aXZlLWNvbm5lY3QtbmcyL3NyYy9saWIvd2Vic29ja2V0L29iamVjdHMvb3V0Ym91bmQtb2JqZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQVksTUFBTSxNQUFNLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQU01QyxNQUFNLE9BQU8sY0FBYztJQUV6QixZQUNVLE1BQXVCLEVBQ3ZCLE1BQWMsRUFDZCxVQUFvQixFQUNaLE1BQWdCLEVBQ3hCLG1CQUE0QixFQUM1QixNQUErQjtRQUwvQixXQUFNLEdBQU4sTUFBTSxDQUFpQjtRQUN2QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsZUFBVSxHQUFWLFVBQVUsQ0FBVTtRQUNaLFdBQU0sR0FBTixNQUFNLENBQVU7UUFDeEIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFTO1FBQzVCLFdBQU0sR0FBTixNQUFNLENBQXlCO1FBc05qQyxZQUFPLEdBQXNDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdkQsU0FBSSxHQUFvQixTQUFTLENBQUM7UUEyR2xDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUEyQjNCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFXakIsWUFBTyxHQUF1QixTQUFTLENBQUM7UUFLeEMsZ0JBQVcsR0FBa0IsSUFBSSxDQUFDO1FBQ2xDLDRCQUF1QixHQUFrQixJQUFJLENBQUM7UUFDOUMscUJBQWdCLEdBQXlCLElBQUksQ0FBQztRQUM5QyxhQUFRLEdBQWtCLElBQUksQ0FBQztRQUMvQixpQkFBWSxHQUFhLElBQUksQ0FBQztRQUM5QixvQkFBZSxHQUF1QixJQUFJLENBQUM7UUFPM0MscUJBQWdCLEdBQWtCLElBQUksQ0FBQztRQUN2QyxpQ0FBNEIsR0FBa0IsSUFBSSxDQUFDO1FBQ25E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QUFlLEdBQUcsSUFBSSxDQUFDO1lBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztTQUMxRDtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmVyIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFdlYnNvY2tldENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElkT2JqZWN0IHtcclxuICBpZDogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE91dGJvdW5kT2JqZWN0PFQgZXh0ZW5kcyBJZE9iamVjdD4ge1xyXG4gIHByaXZhdGUgcHJldmlvdXNseUNhY2hlZENvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNsaWVudDogV2Vic29ja2V0Q2xpZW50LFxyXG4gICAgcHJpdmF0ZSBtZXRob2Q6IHN0cmluZyxcclxuICAgIHByaXZhdGUgbGF6eUxvYWRlZD86IGJvb2xlYW4sXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2FjaGVkPzogYm9vbGVhbixcclxuICAgIHByaXZhdGUgaW5pdGlhbExvYWRpbmdDb3VudD86IG51bWJlcixcclxuICAgIHByaXZhdGUgc29ydEJ5PzogKGE6IFQsIGI6IFQpID0+IG51bWJlclxyXG4gICkge1xyXG4gICAgdGhpcy50YXJnZXQubG9hZGluZyA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xyXG5cclxuICAgIGlmICh0aGlzLmNsaWVudC5kYlNlcnZpY2UpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLmNsaWVudC5kYlNlcnZpY2VcclxuICAgICAgICAgIC5nZXRCeUtleSgnb3V0Ym91bmQnLCBtZXRob2QpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5wcmV2aW91c2x5Q2FjaGVkQ291bnQgPSByZXN1bHQuZGF0YT8ubGVuZ3RoIHx8IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignQWN0aXZlQ29ubmVjdDogVW5hYmxlIHRvIHJlYWQgY2FjaGVkIGRhdGEnKTtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgX3RoaXMgPSB0aGlzO1xyXG4gICAgV2Vic29ja2V0Q2xpZW50LmV4cGVjdE91dGJvdW5kKFxyXG4gICAgICBtZXRob2QsXHJcbiAgICAgIGZ1bmN0aW9uIHNldE91dGJvdW5kKFxyXG4gICAgICAgIGRhdGE6IGFueSxcclxuICAgICAgICBzcGVjaWZpY0hhc2g6IG51bWJlciB8IG51bGwsXHJcbiAgICAgICAgaW5zZXJ0ZWRPckdyb3VwRGF0YTogYW55W10gfCBudWxsLFxyXG4gICAgICAgIHVwZGF0ZWRPckdyb3VwSWQ6IGFueVtdIHwgbnVsbCxcclxuICAgICAgICBkZWxldGVkOiBhbnlbXSB8IG51bGwsXHJcbiAgICAgICAgbGVuZ3RoOiBudW1iZXIgfCBudWxsLFxyXG4gICAgICAgIF9jbGllbnQ6IFdlYnNvY2tldENsaWVudFxyXG4gICAgICApIHtcclxuICAgICAgICBpZiAoIWNhY2hlZCkge1xyXG4gICAgICAgICAgaWYgKF9jbGllbnQuZGJTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgX2NsaWVudC5kYlNlcnZpY2VcclxuICAgICAgICAgICAgICAgIC5kZWxldGVCeUtleSgnb3V0Ym91bmQnLCBtZXRob2QpXHJcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHt9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FjdGl2ZUNvbm5lY3Q6IFVuYWJsZSB0byBkZWxldGUgY2FjaGVkIGRhdGEnKTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZGF0YSA9PSAnY2FjaGVfcmVzdG9yZScpIHtcclxuICAgICAgICAgIGlmIChfY2xpZW50LmRiU2VydmljZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIF9jbGllbnQuZGJTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgICAuZ2V0QnlLZXkoJ291dGJvdW5kJywgbWV0aG9kKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgX3RoaXMuc2V0RGF0YShyZXN1bHQuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoKSBfdGhpcy5fbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgX3RoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdBY3RpdmVDb25uZWN0OiBVbmFibGUgdG8gcmVzdG9yZSBjYWNoZWQgZGF0YScpO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICAgICAgJ0FjdGl2ZUNvbm5lY3Q6IENhY2hpbmcgLyByZXN0b3JlIG5vdCBwb3NzaWJsZSBhcyB0aGUgaW5kZXhlZERCIGlzIG5vdCBhY2Nlc3NpYmxlJ1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PSAnY2FjaGVfZGVsZXRlJykge1xyXG4gICAgICAgICAgaWYgKF9jbGllbnQuZGJTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgX2NsaWVudC5kYlNlcnZpY2VcclxuICAgICAgICAgICAgICAgIC5kZWxldGVCeUtleSgnb3V0Ym91bmQnLCBtZXRob2QpXHJcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHt9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FjdGl2ZUNvbm5lY3Q6IFVuYWJsZSB0byBkZWxldGUgY2FjaGVkIGRhdGEnKTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICAgICAgICdBY3RpdmVDb25uZWN0OiBDYWNoaW5nIC8gcmVzdG9yZSBub3QgcG9zc2libGUgYXMgdGhlIGluZGV4ZWREQiBpcyBub3QgYWNjZXNzaWJsZSdcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIF90aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIF90aGlzLnJlcXVlc3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PSAnZGF0YV9kZWxldGUnKSB7XHJcbiAgICAgICAgICBfdGhpcy5kYXRhID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgX3RoaXMuZGF0YU1hcCA9IG5ldyBNYXAoKTtcclxuICAgICAgICAgIF90aGlzLnJlcXVlc3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgX3RoaXMubG9hZGVkR3JvdXBEYXRhID0gbnVsbDtcclxuICAgICAgICAgIF90aGlzLmxvYWRlZEdyb3VwSWQgPSBudWxsO1xyXG4gICAgICAgICAgX3RoaXMuX2xlbmd0aCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIF90aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgPT0gJ2RhdGFfZ3JvdXAnKSB7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIF90aGlzLnJlcXVlc3RlZEdyb3VwSWQgPT1cclxuICAgICAgICAgICAgKHVwZGF0ZWRPckdyb3VwSWQgPyB1cGRhdGVkT3JHcm91cElkWzBdIDogMClcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBfdGhpcy5sb2FkZWRHcm91cERhdGEgPSBpbnNlcnRlZE9yR3JvdXBEYXRhO1xyXG4gICAgICAgICAgICBfdGhpcy5sb2FkZWRHcm91cElkID0gdXBkYXRlZE9yR3JvdXBJZCA/IHVwZGF0ZWRPckdyb3VwSWRbMF0gOiAwO1xyXG4gICAgICAgICAgICBfdGhpcy5yZXF1ZXN0ZWRHcm91cElkQ29ubmVjdGlvbklkID0gX3RoaXMudGFyZ2V0Ll9fX2Nvbm5lY3Rpb25JZDtcclxuICAgICAgICAgICAgX3RoaXMubG9hZGVkR3JvdXBDaGFuZ2VkPy5uZXh0KGluc2VydGVkT3JHcm91cERhdGEgYXMgVFtdKTtcclxuICAgICAgICAgICAgX3RoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PSAnZGF0YV9pZCcpIHtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgX3RoaXMucmVxdWVzdGVkSWQgPT0gKHVwZGF0ZWRPckdyb3VwSWQgPyB1cGRhdGVkT3JHcm91cElkWzBdIDogMClcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBfdGhpcy5sb2FkZWRJZERhdGEgPVxyXG4gICAgICAgICAgICAgIChpbnNlcnRlZE9yR3JvdXBEYXRhPy5sZW5ndGggfHwgMCkgPiAwXHJcbiAgICAgICAgICAgICAgICA/IChpbnNlcnRlZE9yR3JvdXBEYXRhIGFzIGFueVtdKVswXVxyXG4gICAgICAgICAgICAgICAgOiBudWxsO1xyXG4gICAgICAgICAgICBfdGhpcy5sb2FkZWRJZCA9IHVwZGF0ZWRPckdyb3VwSWQgPyB1cGRhdGVkT3JHcm91cElkWzBdIDogMDtcclxuICAgICAgICAgICAgX3RoaXMucmVxdWVzdGVkSWRDb25uZWN0aW9uSWQgPSBfdGhpcy50YXJnZXQuX19fY29ubmVjdGlvbklkO1xyXG4gICAgICAgICAgICBfdGhpcy5sb2FkZWRJZENoYW5nZWQ/Lm5leHQoX3RoaXMubG9hZGVkSWREYXRhIGFzIFQpO1xyXG4gICAgICAgICAgICBfdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhID09ICdkYXRhX2RpZmYnKSB7XHJcbiAgICAgICAgICBpbnNlcnRlZE9yR3JvdXBEYXRhPy5mb3JFYWNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgIF90aGlzLmRhdGFNYXAuc2V0KGUuaWQsIGUpO1xyXG4gICAgICAgICAgICBpZiAoZS5pZCA9PSBfdGhpcy5sb2FkZWRJZCkge1xyXG4gICAgICAgICAgICAgIF90aGlzLmxvYWRlZElkQ2hhbmdlZD8ubmV4dChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB1cGRhdGVkT3JHcm91cElkPy5mb3JFYWNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgIF90aGlzLmRhdGFNYXAuc2V0KGUuaWQsIGUpO1xyXG4gICAgICAgICAgICBpZiAoZS5pZCA9PSBfdGhpcy5sb2FkZWRJZCkge1xyXG4gICAgICAgICAgICAgIF90aGlzLmxvYWRlZElkQ2hhbmdlZD8ubmV4dChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBkZWxldGVkPy5mb3JFYWNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgIF90aGlzLmRhdGFNYXAuZGVsZXRlKGUuaWQpO1xyXG4gICAgICAgICAgICBpZiAoZS5pZCA9PSBfdGhpcy5sb2FkZWRJZCkge1xyXG4gICAgICAgICAgICAgIF90aGlzLmxvYWRlZElkQ2hhbmdlZD8ubmV4dChudWxsIGFzIGFueSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgX3RoaXMuZGF0YSA9IEFycmF5LmZyb20oX3RoaXMuZGF0YU1hcC52YWx1ZXMoKSk7XHJcbiAgICAgICAgICBpZiAoX3RoaXMuZGF0YSAmJiBfdGhpcy5zb3J0QnkpXHJcbiAgICAgICAgICAgIF90aGlzLmRhdGEgPSBfdGhpcy5kYXRhLnNvcnQoX3RoaXMuc29ydEJ5KTtcclxuICAgICAgICAgIF90aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAoY2FjaGVkICYmIHNwZWNpZmljSGFzaCkge1xyXG4gICAgICAgICAgICBpZiAoX2NsaWVudC5kYlNlcnZpY2UpIHtcclxuICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmRhdGEgJiYgX3RoaXMuZGF0YT8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICBfY2xpZW50LmRiU2VydmljZVxyXG4gICAgICAgICAgICAgICAgICAgIC51cGRhdGUoJ291dGJvdW5kJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YTogX3RoaXMuZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljSGFzaCxcclxuICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7fSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBfY2xpZW50LmRiU2VydmljZVxyXG4gICAgICAgICAgICAgICAgICAgIC5kZWxldGVCeUtleSgnb3V0Ym91bmQnLCBtZXRob2QpXHJcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7fSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQWN0aXZlQ29ubmVjdDogVW5hYmxlIHRvIHVwZGF0ZSBjYWNoZWQgZGF0YS4nKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICAgICAgICAnQWN0aXZlQ29ubmVjdDogQ2FjaGluZyBub3QgcG9zc2libGUgYXMgdGhlIGluZGV4ZWREQiBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQnXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBfdGhpcy5zZXREYXRhKGRhdGEpO1xyXG4gICAgICAgICAgaWYgKF90aGlzLmxvYWRlZElkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlZFZhbHVlID0gX3RoaXMuZGF0YU1hcC5nZXQoX3RoaXMubG9hZGVkSWQpO1xyXG4gICAgICAgICAgICBpZiAobG9hZGVkVmFsdWUpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5sb2FkZWRJZERhdGEgPSBsb2FkZWRWYWx1ZTtcclxuICAgICAgICAgICAgICBfdGhpcy5sb2FkZWRJZENoYW5nZWQ/Lm5leHQoX3RoaXMubG9hZGVkSWREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgX3RoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKGNhY2hlZCAmJiBzcGVjaWZpY0hhc2gpIHtcclxuICAgICAgICAgICAgaWYgKF9jbGllbnQuZGJTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGE/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgX2NsaWVudC5kYlNlcnZpY2VcclxuICAgICAgICAgICAgICAgICAgICAudXBkYXRlKCdvdXRib3VuZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpY0hhc2gsXHJcbiAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge30pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgX2NsaWVudC5kYlNlcnZpY2VcclxuICAgICAgICAgICAgICAgICAgICAuZGVsZXRlQnlLZXkoJ291dGJvdW5kJywgbWV0aG9kKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge30pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FjdGl2ZUNvbm5lY3Q6IFVuYWJsZSB0byB1cGRhdGUgY2FjaGVkIGRhdGEuJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICAgICAgICAgJ0FjdGl2ZUNvbm5lY3Q6IENhY2hpbmcgbm90IHBvc3NpYmxlIGFzIHRoZSBpbmRleGVkREIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkJ1xyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxlbmd0aCkgX3RoaXMuX2xlbmd0aCA9IGxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBXZWJzb2NrZXRDbGllbnQuYWRkUmVzZXRSZXF1ZXN0aW5nU3RhdGVDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgIHRoaXMuYWZ0ZXJTZXJ2ZXJSZWNvbm5lY3RlZCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgdGFyZ2V0KCk6IGFueSB7XHJcbiAgICByZXR1cm4gKHRoaXMuY2xpZW50IGFzIGFueSkuX19wcm90b19fO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkYXRhTWFwOiBNYXA8bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgVD4gPSBuZXcgTWFwKCk7XHJcbiAgcHJpdmF0ZSBkYXRhOiBUW10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcblxyXG4gIHB1YmxpYyBnZXQoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnJlcXVlc3RlZElkID09IGlkICYmXHJcbiAgICAgIHRoaXMudGFyZ2V0Ll9fX2Nvbm5lY3Rpb25JZCA9PSB0aGlzLnJlcXVlc3RlZElkQ29ubmVjdGlvbklkICYmXHJcbiAgICAgIHRoaXMubG9hZGVkT2JzZXJ2YWJsZSAmJlxyXG4gICAgICB0aGlzLmxvYWRlZElkRGF0YVxyXG4gICAgKSB7XHJcbiAgICAgIGlmICh0aGlzLmxvYWRlZElkRGF0YSlcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmxvYWRlZElkRGF0YSkgdGhpcy5sb2FkZWRJZENoYW5nZWQ/Lm5leHQodGhpcy5sb2FkZWRJZERhdGEpO1xyXG4gICAgICAgIH0sIDUwKTtcclxuICAgICAgcmV0dXJuIHRoaXMubG9hZGVkT2JzZXJ2YWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgb2JzZXJ2YWJsZVByb21pc2U6IFByb21pc2U8YW55PiB8IHVuZGVmaW5lZDtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5yZXF1ZXN0ZWRJZCAhPSBpZCB8fFxyXG4gICAgICB0aGlzLnRhcmdldC5fX19jb25uZWN0aW9uSWQgIT0gdGhpcy5yZXF1ZXN0ZWRJZENvbm5lY3Rpb25JZCB8fFxyXG4gICAgICAhdGhpcy5sb2FkZWRPYnNlcnZhYmxlXHJcbiAgICApIHtcclxuICAgICAgb2JzZXJ2YWJsZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGVkT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPFQ+KChvYnNlcnZlcjogT2JzZXJ2ZXI8VD4pID0+IHtcclxuICAgICAgICAgIHRoaXMubG9hZGVkSWRDaGFuZ2VkID0gb2JzZXJ2ZXI7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIFByb21pc2UuYWxsKFtvYnNlcnZhYmxlUHJvbWlzZV0pLnRoZW4oKCkgPT4ge1xyXG4gICAgICBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5yZXF1ZXN0ZWQgJiYgdGhpcy5sYXp5TG9hZGVkKSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWQoKS50aGVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmRhdGEpIHtcclxuICAgICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuZGF0YU1hcC5nZXQoaWQpO1xyXG4gICAgICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRlZElkQ2hhbmdlZD8ubmV4dChyZXMpO1xyXG4gICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubG9hZGVkSWQgPT0gaWQpIHtcclxuICAgICAgICAgIHRoaXMubG9hZGVkSWRDaGFuZ2VkPy5uZXh0KHRoaXMubG9hZGVkSWREYXRhIGFzIFQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3RCeUlkKGlkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9KS50aGVuKCk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0aGlzLmxvYWRlZE9ic2VydmFibGUgYXMgT2JzZXJ2YWJsZTxUPjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGb3JHcm91cChncm91cElkOiBudW1iZXIpOiBPYnNlcnZhYmxlPFRbXT4ge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnJlcXVlc3RlZEdyb3VwSWQgPT0gZ3JvdXBJZCAmJlxyXG4gICAgICB0aGlzLnRhcmdldC5fX19jb25uZWN0aW9uSWQgPT0gdGhpcy5yZXF1ZXN0ZWRHcm91cElkQ29ubmVjdGlvbklkICYmXHJcbiAgICAgIHRoaXMubG9hZGVkR3JvdXBPYnNlcnZhYmxlICYmXHJcbiAgICAgIHRoaXMubG9hZGVkR3JvdXBEYXRhXHJcbiAgICApIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMubG9hZGVkR3JvdXBEYXRhKVxyXG4gICAgICAgICAgdGhpcy5sb2FkZWRHcm91cENoYW5nZWQ/Lm5leHQodGhpcy5sb2FkZWRHcm91cERhdGEpO1xyXG4gICAgICB9LCA1MCk7XHJcbiAgICAgIHJldHVybiB0aGlzLmxvYWRlZEdyb3VwT2JzZXJ2YWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgb2JzZXJ2YWJsZVByb21pc2U6IFByb21pc2U8YW55PiB8IHVuZGVmaW5lZDtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5yZXF1ZXN0ZWRHcm91cElkICE9IGdyb3VwSWQgfHxcclxuICAgICAgdGhpcy50YXJnZXQuX19fY29ubmVjdGlvbklkICE9IHRoaXMucmVxdWVzdGVkR3JvdXBJZENvbm5lY3Rpb25JZCB8fFxyXG4gICAgICAhdGhpcy5sb2FkZWRHcm91cE9ic2VydmFibGVcclxuICAgICkge1xyXG4gICAgICBvYnNlcnZhYmxlUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkZWRHcm91cE9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZTxUW10+KFxyXG4gICAgICAgICAgKG9ic2VydmVyOiBPYnNlcnZlcjxUW10+KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGVkR3JvdXBDaGFuZ2VkID0gb2JzZXJ2ZXI7XHJcbiAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBQcm9taXNlLmFsbChbb2JzZXJ2YWJsZVByb21pc2VdKS50aGVuKCgpID0+IHtcclxuICAgICAgbmV3IFByb21pc2U8dm9pZD4oYXN5bmMgKHJlc29sdmUpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMucmVxdWVzdGVkICYmIHRoaXMubGF6eUxvYWRlZCkge1xyXG4gICAgICAgICAgdGhpcy5sb2FkKCkudGhlbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5sb2FkZWRHcm91cElkID09IGdyb3VwSWQgJiYgdGhpcy5sb2FkZWRHcm91cERhdGEpIHtcclxuICAgICAgICAgIHRoaXMubG9hZGVkR3JvdXBDaGFuZ2VkPy5uZXh0KHRoaXMubG9hZGVkR3JvdXBEYXRhIGFzIFRbXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdEZvckdyb3VwKGdyb3VwSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH0pLnRoZW4oKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXMubG9hZGVkR3JvdXBPYnNlcnZhYmxlIGFzIE9ic2VydmFibGU8VFtdPjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgYWxsKCk6IFRbXSB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAoIXRoaXMucmVxdWVzdGVkICYmIHRoaXMubGF6eUxvYWRlZCkge1xyXG4gICAgICB0aGlzLmxvYWQoKS50aGVuKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXF1ZXN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgYXN5bmMgbG9hZChjb3VudD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMubGF6eUxvYWRlZCkge1xyXG4gICAgICBjb25zdCBoYXNCZWVuUmVxdWVzdGVkQmVmb3JlID0gdGhpcy5yZXF1ZXN0ZWQ7XHJcbiAgICAgIHRoaXMuX2xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICBpZiAoIXRoaXMucmVxdWVzdGVkKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlcXVlc3RlZCA9IHRydWU7XHJcbiAgICAgIGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoJ3JlcXVlc3QuJyArIHRoaXMubWV0aG9kLCB7XHJcbiAgICAgICAgY291bnQ6IGhhc0JlZW5SZXF1ZXN0ZWRCZWZvcmVcclxuICAgICAgICAgID8gdGhpcy5kYXRhXHJcbiAgICAgICAgICAgID8gY291bnQgfHwgdGhpcy5pbml0aWFsTG9hZGluZ0NvdW50XHJcbiAgICAgICAgICAgICAgPyAoY291bnQgfHwgKHRoaXMuaW5pdGlhbExvYWRpbmdDb3VudCBhcyBudW1iZXIpKSArXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZExlbmd0aFxyXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICA6IHRoaXMucHJldmlvdXNseUNhY2hlZENvdW50IHx8ICh0aGlzLmluaXRpYWxMb2FkaW5nQ291bnQgYXMgbnVtYmVyKSxcclxuICAgICAgICBsb2FkZWQ6IHRoaXMubG9hZGVkTGVuZ3RoXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgRXJyb3IoXHJcbiAgICAgICAgJ0FjdGl2ZS1Db25uZWN0OiBDYW5ub3QgcnVuIGxvYWRpbmcgcmVxdWVzdCBhcyB0aGlzIG91dGJvdW5kIGlzIG5vdCBsYXp5LWxvYWRlZC4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9sb2FkaW5nID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBzZXQgbG9hZGluZyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fbG9hZGluZyA9IHZhbHVlO1xyXG4gICAgdGhpcy50YXJnZXQubG9hZGluZy5zZXQodGhpcy5tZXRob2QsIHZhbHVlKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xvYWRpbmc7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgbG9hZGVkTGVuZ3RoKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhPy5sZW5ndGggfHwgMDtcclxuICB9XHJcbiAgcHJpdmF0ZSBfbGVuZ3RoOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgcHVibGljIGdldCBsZW5ndGgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlcXVlc3RlZElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHJlcXVlc3RlZElkQ29ubmVjdGlvbklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGxvYWRlZE9ic2VydmFibGU6IE9ic2VydmFibGU8VD4gfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGxvYWRlZElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGxvYWRlZElkRGF0YTogVCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgbG9hZGVkSWRDaGFuZ2VkOiBPYnNlcnZlcjxUPiB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcmVxdWVzdEJ5SWQoaWQ6IG51bWJlcik6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5yZXF1ZXN0ZWRJZCA9IGlkO1xyXG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmQoJ3JlcXVlc3QuJyArIHRoaXMubWV0aG9kLCB7IGlkIH0pIGFzIFByb21pc2U8YW55PjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVxdWVzdGVkR3JvdXBJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSByZXF1ZXN0ZWRHcm91cElkQ29ubmVjdGlvbklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGxvYWRlZEdyb3VwT2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxUW10+IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBsb2FkZWRHcm91cElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGxvYWRlZEdyb3VwRGF0YTogVFtdIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBsb2FkZWRHcm91cENoYW5nZWQ6IE9ic2VydmVyPFRbXT4gfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHJlcXVlc3RGb3JHcm91cChncm91cElkOiBudW1iZXIpOiBQcm9taXNlPFRbXT4ge1xyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMucmVxdWVzdGVkR3JvdXBJZCA9IGdyb3VwSWQ7XHJcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZCgncmVxdWVzdC4nICsgdGhpcy5tZXRob2QsIHsgZ3JvdXBJZCB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0RGF0YShkYXRhOiBUW10gfCB7IGFkZGVkOiBUW10gfCB1bmRlZmluZWQ7IGxlbmd0aDogbnVtYmVyIH0pIHtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGEgYXMgVFtdO1xyXG4gICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLnNvcnRCeSkgdGhpcy5kYXRhID0gdGhpcy5kYXRhLnNvcnQodGhpcy5zb3J0QnkpO1xyXG4gICAgdGhpcy5fbGVuZ3RoID0gZGF0YS5sZW5ndGg7XHJcbiAgICB0aGlzLmRhdGFNYXAgPSBuZXcgTWFwKCk7XHJcbiAgICB0aGlzLmRhdGEuZm9yRWFjaCgoZCkgPT4ge1xyXG4gICAgICB0aGlzLmRhdGFNYXAuc2V0KGQuaWQsIGQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNFbXB0eSgpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGEgPT0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGNvbnRhaW5lZCBkYXRhIGNhbiBiZSBtb2RpZmllZCB3aXRoaW4gdGhlIGNhbGxiYWNrIG1ldGhvZFxyXG4gICAqL1xyXG4gIHB1YmxpYyB1cGRhdGUoY2FsbGJhY2s6IChkYXRhOiBUW10pID0+IHZvaWQpIHtcclxuICAgIGlmICh0aGlzLmRhdGEpIHtcclxuICAgICAgY29uc3QgdXBkYXRlTGVuZ3RoVmFyaWFibGUgPSB0aGlzLmRhdGEubGVuZ3RoID09IHRoaXMuX2xlbmd0aDtcclxuICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XHJcbiAgICAgIGNhbGxiYWNrKHRoaXMuZGF0YSk7XHJcbiAgICAgIHRoaXMuc2V0RGF0YSh0aGlzLmRhdGEpO1xyXG4gICAgICBpZiAoIXVwZGF0ZUxlbmd0aFZhcmlhYmxlKSB7XHJcbiAgICAgICAgdGhpcy5fbGVuZ3RoID0gbGVuZ3RoO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyU2VydmVyUmVjb25uZWN0ZWQoKSB7XHJcbiAgICBpZiAodGhpcy5yZXF1ZXN0ZWQgJiYgdGhpcy5sYXp5TG9hZGVkKSB7XHJcbiAgICAgIHRoaXMucmVxdWVzdGVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMubG9hZCh0aGlzLmxvYWRlZExlbmd0aCkudGhlbigpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubG9hZGVkSWQpIHtcclxuICAgICAgdGhpcy5sb2FkZWRJZERhdGEgPSBudWxsO1xyXG4gICAgICB0aGlzLnJlcXVlc3RCeUlkKHRoaXMubG9hZGVkSWQpLmNhdGNoKCgpID0+IHt9KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmxvYWRlZEdyb3VwSWQpIHtcclxuICAgICAgdGhpcy5sb2FkZWRHcm91cERhdGEgPSBudWxsO1xyXG4gICAgICB0aGlzLnJlcXVlc3RGb3JHcm91cCh0aGlzLmxvYWRlZEdyb3VwSWQpLmNhdGNoKCgpID0+IHt9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|
package/esm2020/public-api.mjs
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Public API Surface of active-connect-ng2
|
|
3
|
-
*/
|
|
4
|
-
export * from './lib/active-connect-ng2.module';
|
|
5
|
-
export * from './lib/websocket';
|
|
6
|
-
export { NgxIndexedDBService } from 'ngx-indexed-db';
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FjdGl2ZS1jb25uZWN0LW5nMi9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBhY3RpdmUtY29ubmVjdC1uZzJcclxuICovXHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9hY3RpdmUtY29ubmVjdC1uZzIubW9kdWxlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvd2Vic29ja2V0JztcclxuZXhwb3J0IHsgTmd4SW5kZXhlZERCU2VydmljZSB9IGZyb20gJ25neC1pbmRleGVkLWRiJztcclxuIl19
|