db-wrapper 0.0.8 → 0.0.9
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/LICENSE +201 -201
- package/README.md +24 -24
- package/bundles/db-wrapper.umd.js +510 -508
- package/bundles/db-wrapper.umd.js.map +1 -1
- package/bundles/db-wrapper.umd.min.js +1 -1
- package/bundles/db-wrapper.umd.min.js.map +1 -1
- package/db-wrapper.d.ts +4 -4
- package/db-wrapper.metadata.json +1 -1
- package/esm2015/db-wrapper.js +4 -4
- package/esm2015/lib/db-wrapper.models.js +45 -45
- package/esm2015/lib/db-wrapper.module.js +21 -21
- package/esm2015/lib/db-wrapper.service.js +410 -408
- package/esm2015/lib/window.service.js +16 -16
- package/esm2015/public-api.js +7 -7
- package/esm5/db-wrapper.js +4 -4
- package/esm5/lib/db-wrapper.models.js +45 -45
- package/esm5/lib/db-wrapper.module.js +25 -25
- package/esm5/lib/db-wrapper.service.js +436 -434
- package/esm5/lib/window.service.js +23 -23
- package/esm5/public-api.js +7 -7
- package/fesm2015/db-wrapper.js +478 -476
- package/fesm2015/db-wrapper.js.map +1 -1
- package/fesm5/db-wrapper.js +514 -512
- package/fesm5/db-wrapper.js.map +1 -1
- package/lib/db-wrapper.models.d.ts +123 -119
- package/lib/db-wrapper.module.d.ts +5 -5
- package/lib/db-wrapper.service.d.ts +40 -39
- package/lib/window.service.d.ts +3 -3
- package/package.json +1 -1
- package/public-api.d.ts +3 -3
|
@@ -1,434 +1,436 @@
|
|
|
1
|
-
import { __awaiter, __generator } from "tslib";
|
|
2
|
-
import { InjectionToken } from '@angular/core';
|
|
3
|
-
import { WindowService } from './window.service';
|
|
4
|
-
var DbWrapperService = /** @class */ (function () {
|
|
5
|
-
function DbWrapperService(dbConfig, dbSchema) {
|
|
6
|
-
var _this = this;
|
|
7
|
-
this._dbName = dbConfig.dbName;
|
|
8
|
-
this._location = dbConfig.location || 'default';
|
|
9
|
-
this._iosDatabaseLocation = dbConfig.iosDatabaseLocation || 'Library';
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
var
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
console.
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
console.
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
})
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
})
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
})
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
})
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
var
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
export
|
|
423
|
-
export
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGItd3JhcHBlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGItd3JhcHBlci8iLCJzb3VyY2VzIjpbImxpYi9kYi13cmFwcGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSWpEO0lBUUUsMEJBQVksUUFBa0IsRUFBRSxRQUFtQjtRQUFuRCxpQkF5QkM7UUF2QkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUM7UUFDaEQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsSUFBSSxTQUFTLENBQUM7UUFDdEUsSUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLGFBQWEsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQ2xELElBQUksUUFBUSxFQUFFO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7U0FBRTtRQUN6QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksT0FBTyxDQUFHLFVBQUMsT0FBTyxFQUFFLE1BQU07WUFDakQsSUFBSSxPQUFPLE1BQU0sQ0FBQyxPQUFPLEtBQUssV0FBVyxFQUFFO2dCQUN6QyxVQUFVLENBQUU7b0JBQ1YsS0FBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQ3RCO3dCQUNFLE9BQU8sRUFBRSxDQUFDO29CQUNaLENBQUMsQ0FBRTt5QkFDRixLQUFLLENBQUcsVUFBQyxHQUFHO3dCQUNYLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDZCxDQUFDLENBQUUsQ0FBQztnQkFDUixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDVDtpQkFBTTtnQkFDTCxRQUFRLENB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QUVPLG9DQUFTLEdBQWpCLFVBQWtCLEtBQWEsRUFBRSxHQUFhO1FBQzVDLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsSUFBTSxLQUFLLEdBQUcsY0FBYyxHQUFHLEtBQUssR0FBRyxjQUFjLEdBQUcsTUFBTSxDQUFDO1FBQy9ELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUgsdUJBQUM7QUFBRCxDQUFDLEFBamJELElBaWJDOztBQUlELE1BQU0sQ0FBQyxJQUFNLFNBQVMsR0FBRyxJQUFJLGNBQWMsQ0FBVyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3pFLE1BQU0sQ0FBQyxJQUFNLFNBQVMsR0FBRyxJQUFJLGNBQWMsQ0FBVyxpQkFBaUIsQ0FBQyxDQUFDO0FBRXpFLE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsT0FBTztRQUNMLE1BQU0sRUFBRSxXQUFXO1FBQ25CLFFBQVEsRUFBRSxTQUFTO1FBQ25CLG1CQUFtQixFQUFFLFNBQVM7S0FDL0IsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsUUFBa0IsRUFBRSxRQUFtQjtJQUN0RSxJQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUQsT0FBTyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNoRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgV2luZG93U2VydmljZSB9IGZyb20gJy4vd2luZG93LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEQlRhYmxlLCBEYkNvbmZpZywgREJTY2hlbWEsIERCVmlldyxcclxuICBEQkNvbHVtbiwgREJVbmlxdWUsIERCRm9yZWlnbiwgU3FsVHJhbnNhY3Rpb24sIFNxbFJlc3VsdFNldCwgU3FsRXJyb3IsIERlZmF1bHRUeXBlIH0gZnJvbSAnLi9kYi13cmFwcGVyLm1vZGVscyc7XHJcblxyXG5leHBvcnQgY2xhc3MgRGJXcmFwcGVyU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBfZGJOYW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfbG9jYXRpb246IHN0cmluZztcclxuICBwcml2YXRlIF9pb3NEYXRhYmFzZUxvY2F0aW9uOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfcmVhZHlQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xyXG4gIHNjaGVtYTogREJTY2hlbWE7XHJcbiAgZGI6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoZGJDb25maWc6IERiQ29uZmlnLCBkYlNjaGVtYT86IERCU2NoZW1hKSB7XHJcblxyXG4gICAgdGhpcy5fZGJOYW1lID0gZGJDb25maWcuZGJOYW1lO1xyXG4gICAgdGhpcy5fbG9jYXRpb24gPSBkYkNvbmZpZy5sb2NhdGlvbiB8fCAnZGVmYXVsdCc7XHJcbiAgICB0aGlzLl9pb3NEYXRhYmFzZUxvY2F0aW9uID0gZGJDb25maWcuaW9zRGF0YWJhc2VMb2NhdGlvbiB8fCAnTGlicmFyeSc7XHJcbiAgICBjb25zdCB3aW5kb3cgPSAobmV3IFdpbmRvd1NlcnZpY2UoKSkubmF0aXZlV2luZG93O1xyXG4gICAgaWYgKGRiU2NoZW1hKSB7IHRoaXMuc2NoZW1hID0gZGJTY2hlbWE7IH1cclxuICAgIHRoaXMuX3JlYWR5UHJvbWlzZSA9IG5ldyBQcm9taXNlICggKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5jb3Jkb3ZhID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHNldFRpbWVvdXQoICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuaW5pdChkYlNjaGVtYSkudGhlbiAoXHJcbiAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH0gKVxyXG4gICAgICAgICAgICAuY2F0Y2ggKCAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgIH0gKTtcclxuICAgICAgICB9LCA1MDApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZXJlYWR5JywgKCkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ2RiV3JhcHBlcjogZGV2aWNlIHJlYWR5LicpO1xyXG4gICAgICAgICAgdGhpcy5pbml0RGV2aWNlKGRiU2NoZW1hKS50aGVuICggKCkgPT4gcmVzb2x2ZSgpICkuY2F0Y2ggKCAoZXJyKSA9PiByZWplY3QoZXJyKSApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlYWR5UHJvbWlzZTtcclxuICB9XHJcblxyXG4gIGluaXREZXZpY2UoZGJTY2hlbWE6IERCU2NoZW1hKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB3aW5kb3cgPSAobmV3IFdpbmRvd1NlcnZpY2UoKSkubmF0aXZlV2luZG93O1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKCAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZGIgPSB3aW5kb3cuc3FsaXRlUGx1Z2luLm9wZW5EYXRhYmFzZSh7XHJcbiAgICAgICAgbmFtZTogdGhpcy5fZGJOYW1lLFxyXG4gICAgICAgIGxvY2F0aW9uOiB0aGlzLl9sb2NhdGlvbixcclxuICAgICAgICBhbmRyb2lkTG9ja1dvcmthcm91bmQ6IDFcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAoZGJTY2hlbWEpIHtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlKGRiU2NoZW1hKS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgfSkudGhlbigoKSA9PiB7IHJlc29sdmUoKTsgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGluaXQoZGJTY2hlbWE6IERCU2NoZW1hKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB3aW5kb3cgPSAobmV3IFdpbmRvd1NlcnZpY2UoKSkubmF0aXZlV2luZG93O1xyXG4gICAgcmV0dXJuICBuZXcgUHJvbWlzZSAoIChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5kYiA9IHdpbmRvdy5vcGVuRGF0YWJhc2UodGhpcy5fZGJOYW1lLCAnMS4wJywgJ2RhdGFiYXNlJywgLTEpO1xyXG4gICAgICBpZiAoZGJTY2hlbWEpIHtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlKGRiU2NoZW1hKS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICB9KS50aGVuKCAoKSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdlbmVyYXRlKHNjaGVtYTogREJTY2hlbWEpOiBQcm9taXNlPGFueT4ge1xyXG5cclxuICAgIGNvbnN0IHNlbnRlbmNlcyA9IFtdO1xyXG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XHJcblxyXG4gICAgaWYgKHNjaGVtYS50YWJsZXMpIHtcclxuICAgICAgc2NoZW1hLnRhYmxlcy5mb3JFYWNoKHRhYmxlID0+IHtcclxuICAgICAgICBzZW50ZW5jZXMucHVzaCh0aGlzLmNyZWF0ZVRhYmxlKHRhYmxlKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHNjaGVtYS52aWV3cykge1xyXG4gICAgICBzY2hlbWEudmlld3MuZm9yRWFjaCggdmlldyA9PiB7XHJcbiAgICAgICAgc2VudGVuY2VzLnB1c2godGhpcy5jcmVhdGVWaWV3KHZpZXcpKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAoc2VudGVuY2VzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VzcXVlbWEgZGUgbGEgYmFzZSBkZSBkYXRvcyB2YWNpYS4nKTtcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLmFsbChzZW50ZW5jZXMpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY3JlYXRlVGFibGUodGFibGU6IERCVGFibGUpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgbGV0IHNxbCA9ICcnLCAgb25Db25mbGljdFByaW1hcnk7XHJcbiAgICBjb25zdCBzZW50ZW5jZXMgPSBbXSwgIG5ld0NvbHVtbnMgPSBbXVxyXG5cclxuICAgIGNvbnN0IHRhYmxlRERMID0gYXdhaXQgdGhpcy5fdGFibGVFeGlzdHModGFibGUubmFtZSk7XHJcbiAgICBpZiAodGFibGVEREwpIHtcclxuICAgICAgICB0YWJsZS5jb2x1bW5zLmZvckVhY2goIGNvbCA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX2NvbHVtbkV4aXN0cyh0YWJsZURETCBhcyBzdHJpbmcsIGNvbC5uYW1lKSApIHtcclxuICAgICAgICAgICAgbmV3Q29sdW1ucy5wdXNoKHRoaXMuYWRkQ29sdW1uKHRhYmxlLm5hbWUsIGNvbCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGFibGUuY29sdW1ucy5mb3JFYWNoKCBjb2wgPT4ge1xyXG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuZGVmQ29sdW1uKGNvbCkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIG9uQ29uZmxpY3RQcmltYXJ5ID0gJ29uIGNvbmZsaWN0IGZhaWwnO1xyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRhYmxlLnByaW1hcnkpICkgIHtcclxuICAgICAgc2VudGVuY2VzLnB1c2ggKCcgQ09OU1RSQUlOVCBpZGVudGlmaWNhZG9yIFBSSU1BUlkgS0VZICgnICsgdGFibGUucHJpbWFyeS5qb2luKCcsJykgKyAnKSAnICsgb25Db25mbGljdFByaW1hcnkgKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgdGFibGUucHJpbWFyeSA9PT0gJ3N0cmluZycpICAge1xyXG4gICAgICBzZW50ZW5jZXMucHVzaCAoJyBDT05TVFJBSU5UIGlkZW50aWZpY2Fkb3IgUFJJTUFSWSBLRVkgKCcgKyB0YWJsZS5wcmltYXJ5ICsgJykgJyArIG9uQ29uZmxpY3RQcmltYXJ5ICk7XHJcbiAgICB9XHJcbiAgICBpZiAodGFibGUudW5pcXVlcykge1xyXG4gICAgICB0YWJsZS51bmlxdWVzLmZvckVhY2goIHVuaXEgPT4ge1xyXG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuZGVmVW5pcXVlKHVuaXEpKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRhYmxlLmZvcmVpZ25zKSB7XHJcbiAgICAgIHRhYmxlLmZvcmVpZ25zLmZvckVhY2ggKCBmb3JlID0+IHtcclxuICAgICAgICBzZW50ZW5jZXMucHVzaCh0aGlzLmRlZkZvcmVpZ24oZm9yZSkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGFibGVEREwgJiYgbmV3Q29sdW1ucy5sZW5ndGggIT09IDApIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG5ld0NvbHVtbnMpXHJcbiAgICAgIC50aGVuKCAoKSA9PiB7IGNvbnNvbGUubG9nKGBUYWJsZSAke3RhYmxlLm5hbWV9IGFsdGVyZWQuYCk7IH0gKVxyXG4gICAgICAuY2F0Y2goIChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yIChgVGFibGUgJHt0YWJsZS5uYW1lfTogJHtlcnIubWVzc2FnZX1gKTtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlICR7dGFibGUubmFtZX06ICR7ZXJyLm1lc3NhZ2V9YCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0gZWxzZSBpZiAoIXRhYmxlRERMKSB7XHJcbiAgICAgIHNxbCA9ICdDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAnICsgdGFibGUubmFtZSArICcgKCcgKyBzZW50ZW5jZXMuam9pbignLCcpICsgJyknO1xyXG4gICAgICByZXR1cm4gdGhpcy5xdWVyeShzcWwpXHJcbiAgICAgIC50aGVuKCAoKSA9PiB7IGNvbnNvbGUubG9nKGBUYWJsZSAke3RhYmxlLm5hbWV9IGNyZWF0ZWQuYCk7IH0pXHJcbiAgICAgIC5jYXRjaCggKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IgKGBUYWJsZSAke3RhYmxlLm5hbWV9OiAke2Vyci5tZXNzYWdlfWApO1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgJHt0YWJsZS5uYW1lfTogJHtlcnIubWVzc2FnZX1gKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbiggKCkgPT4geyBjb25zb2xlLmxvZyhgVGFibGUgJHt0YWJsZS5uYW1lfSBpbml0aWFsaXplZC5gKTsgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgY3JlYXRlVmlldyh2aWV3OiBEQlZpZXcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgbGV0IHNxbDogc3RyaW5nO1xyXG5cclxuICAgIHNxbCA9ICdDUkVBVEUgVklFVyBJRiBOT1QgRVhJU1RTICcgKyB2aWV3Lm5hbWVcclxuICAgICAgKyAnIEFTICcgKyB2aWV3LnNxbDtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5xdWVyeShzcWwpO1xyXG5cclxuICB9XHJcblxyXG4gIGdldFNjaGVtYVRhYmxlKHRhYmxlTmFtZTogc3RyaW5nKTogREJUYWJsZSB7XHJcbiAgICBsZXQgcmVzOiBEQlRhYmxlO1xyXG5cclxuICAgIHRoaXMuc2NoZW1hLnRhYmxlcy5mb3JFYWNoKCB0YWJsZSA9PiB7XHJcbiAgICAgIGlmICh0YWJsZS5uYW1lID09PSB0YWJsZU5hbWUpIHtcclxuICAgICAgICByZXMgPSB0YWJsZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzO1xyXG5cclxuICB9XHJcblxyXG4gIGdldFVuaXF1ZXNUYWJsZSh0YWJsZTogREJUYWJsZSk6IG9iamVjdCB7XHJcbiAgICBsZXQgcmVzOiB7fTtcclxuICAgIHRhYmxlLnVuaXF1ZXMuZm9yRWFjaCh1bmlxID0+IHtcclxuICAgICAgcmVzW3VuaXEubmFtZV0gPSB1bmlxO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgcXVlcnkocXVlcnk6IHN0cmluZywgYmluZGluZ3M6IGFueVtdPSBbXSk6IFByb21pc2U8U3FsUmVzdWx0U2V0PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBpZiAocXVlcnkuaW5kZXhPZignc2VsZWN0JykgPT09IDApIHtcclxuICAgICAgICB0aGlzLmRiLnJlYWRUcmFuc2FjdGlvbigodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwocXVlcnksIGJpbmRpbmdzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9LCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCBlcnJvcjogU3FsRXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sIChlcnI6IFNxbEVycm9yKSA9PiByZWplY3QoZXJyKSApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZGIudHJhbnNhY3Rpb24oKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbikgPT4ge1xyXG4gICAgICAgICAgICB0cmFuc2FjdGlvbi5leGVjdXRlU3FsKHF1ZXJ5LCBiaW5kaW5ncywgKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbiwgcmVzdWx0OiBTcWxSZXN1bHRTZXQpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgfSwgKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbiwgZXJyb3I6IFNxbEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LCAoZXJyOiBTcWxFcnJvcikgPT4gcmVqZWN0KGVycikgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBDb3VudChxdWVyeTogc3RyaW5nLCBiaW5kaW5nczogYW55W109IFtdKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5KHF1ZXJ5LCBiaW5kaW5ncykudGhlbihyb3dzID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb3dzQ291bnQocm93cyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGluc2VydCh0YWJsZTogc3RyaW5nLCBiaW5kaW5nczoge30pOiBQcm9taXNlPFNxbFJlc3VsdFNldD4ge1xyXG4gICAgbGV0IHNxbCA9ICcnLCBzcWxCaW5kcyA9IFtdLCBzcWxLZXlzID0gW10sIHNxbFZhbHVlcyA9IFtdIDtcclxuXHJcbiAgICBzcWwgPSBzcWwgKyAnaW5zZXJ0IGludG8gJyArIHRhYmxlICsgJyAnO1xyXG5cclxuICAgIGZvciAoY29uc3QgaW5kZXggaW4gYmluZGluZ3MpIHtcclxuICAgICAgIGlmIChiaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eShpbmRleCkpIHtcclxuICAgICAgICAgICAgc3FsS2V5cy5wdXNoKGluZGV4KTtcclxuICAgICAgICAgICAgc3FsVmFsdWVzLnB1c2goYmluZGluZ3NbaW5kZXhdKTtcclxuICAgICAgICAgICAgc3FsQmluZHMucHVzaCgnPycpO1xyXG4gICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNxbCA9IHNxbCArICcoJyArIHNxbEtleXMuam9pbignLCcpICsgJykgdmFsdWVzICgnICsgc3FsQmluZHMuam9pbignLCcpICsgJyknO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5kYi50cmFuc2FjdGlvbih0cmFuc2FjdGlvbiA9PiB7XHJcbiAgICAgICAgICB0cmFuc2FjdGlvbi5leGVjdXRlU3FsKHNxbCwgc3FsVmFsdWVzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xyXG4gICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgIH0sICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIGVycm9yOiBTcWxFcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZSh0YWJsZTogc3RyaW5nLCBiaW5kaW5nczoge30sIHdoZXJlOiB7fSk6IFByb21pc2U8U3FsUmVzdWx0U2V0PiB7XHJcbiAgICBsZXQgc3FsID0gJycsIHNxbEJpbmRzID0gW10sIHNxbEtleXMgPVtdLCBzcWxWYWx1ZXMgPSBbXSA7XHJcblxyXG4gICAgc3FsID0gc3FsICsgJ3VwZGF0ZSAnICsgdGFibGUgKyAnIHNldCAnO1xyXG5cclxuICAgIGZvciAobGV0IGluZGV4IGluIGJpbmRpbmdzKSB7XHJcbiAgICAgICBpZiAoYmluZGluZ3MuaGFzT3duUHJvcGVydHkoaW5kZXgpKSB7XHJcbiAgICAgICAgICAgIGxldCBuZXdPYmogPSBiaW5kaW5nc1tpbmRleF07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmV3T2JqID09PSAnb2JqZWN0JyAmJiBuZXdPYmogIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHNxbFZhbHVlcy5wdXNoKG5ld09iai52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV3T2JqLmlmbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNxbEJpbmRzLnB1c2goaW5kZXggKyAnID0gaWZudWxsKCAnICsgaW5kZXggKyAnLDApICsgPycpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdPYmoub3BlcmF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBzcWxCaW5kcy5wdXNoKGluZGV4ICsgJyA9ICcgKyBpbmRleCArIG5ld09iai5vcGVyYXRvciArICcgPycpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzcWxCaW5kcy5wdXNoKGluZGV4ICsgJyA9ID8nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzcWxCaW5kcy5wdXNoKGluZGV4ICsgJyA9ID8nKTtcclxuICAgICAgICAgICAgICAgIHNxbFZhbHVlcy5wdXNoKGJpbmRpbmdzW2luZGV4XSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaW5kZXggaW4gd2hlcmUpIHtcclxuICAgICAgIGlmICh3aGVyZS5oYXNPd25Qcm9wZXJ0eShpbmRleCkpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aGVyZVtpbmRleF0gPT09ICdvYmplY3QnICAmJiB3aGVyZVtpbmRleF0gIT09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgc3FsS2V5cy5wdXNoKGluZGV4ICsgJyAnICsgd2hlcmVbaW5kZXhdLm9wZXJhdG9yICsgJyA/Jyk7XHJcbiAgICAgICAgICAgICAgICBzcWxWYWx1ZXMucHVzaCh3aGVyZVtpbmRleF0udmFsdWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3FsS2V5cy5wdXNoKGluZGV4ICsgJyA9ID8nKTtcclxuICAgICAgICAgICAgICAgIHNxbFZhbHVlcy5wdXNoKHdoZXJlW2luZGV4XSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzcWwgPSBzcWwgKyBzcWxCaW5kcy5qb2luKCcsJykgKyAnIHdoZXJlICcgKyBzcWxLZXlzLmpvaW4oJyBhbmQgJyk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmRiLnRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uID0+IHtcclxuICAgICAgICB0cmFuc2FjdGlvbi5leGVjdXRlU3FsKHNxbCwgc3FsVmFsdWVzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSwgKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbiwgZXJyb3I6IFNxbEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkcm9wVGFibGUgKHRhYmxlczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjb250ID0gMTtcclxuXHJcbiAgICBjb250ID0gdGFibGVzLmxlbmd0aDtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRhYmxlcy5zb21lKCB0YWJsZSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbnQgIT09IDApIHtcclxuICAgICAgICAgIHRoaXMucXVlcnkoJ0RST1AgVEFCTEUgJyArIHRhYmxlKVxyXG4gICAgICAgICAgLnRoZW4oICgpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoY29udCA9PT0gMSApIHsgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7IGNvbnQtLTsgfVxyXG4gICAgICAgICAgfSwgZXJyID0+IHtcclxuICAgICAgICAgICAgY29udCA9IDA7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZmV0Y2hBbGwocmVzdWx0OiBTcWxSZXN1bHRTZXQpOiBvYmplY3RbXSB7XHJcbiAgICBsZXQgb3V0cHV0ID0gW107XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG91dHB1dC5wdXNoKHJlc3VsdC5yb3dzLml0ZW0oaSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgfVxyXG5cclxuICBmZXRjaChyZXN1bHQ6IFNxbFJlc3VsdFNldCk6IG9iamVjdCB7XHJcbiAgICAgIGxldCBvYmpldG8gPSB1bmRlZmluZWQsIG5ld09iaj0gdW5kZWZpbmVkO1xyXG4gICAgICBpZiAocmVzdWx0LnJvd3MubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICBvYmpldG8gPSByZXN1bHQucm93cy5pdGVtKDApO1xyXG4gICAgICAgICAgbmV3T2JqID0ge307XHJcbiAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZXRvKTtcclxuICAgICAgICAgIGZvciAobGV0IGtleSBpbiBrZXlzKSB7XHJcbiAgICAgICAgICAgICAgbmV3T2JqW2tleXNba2V5XV0gPSBvYmpldG9ba2V5c1trZXldXTtcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3T2JqO1xyXG4gIH1cclxuXHJcblxyXG4gIHJvd3NDb3VudChyZXN1bHQ6IFNxbFJlc3VsdFNldCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiByZXN1bHQucm93cy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICB0YWJsZUV4aXN0cyh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgnc2VsZWN0ICBzcWwgZnJvbSBzcWxpdGVfbWFzdGVyICcgK1xyXG4gICAgICAgICd3aGVyZSB0eXBlPVxcJ3RhYmxlXFwnIGFuZCBuYW1lPVxcJycgKyB0YWJsZSArICdcXCcnKVxyXG4gICAgLnRoZW4ocmVzdWx0ID0+ICAodGhpcy5yb3dzQ291bnQocmVzdWx0KSA9PT0gMSkgKTtcclxuICB9ICBcclxuXHJcbiAgY29sdW1uRXhpc3RzKHRhYmxlOiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFibGVFeGlzdHModGFibGUpXHJcbiAgICAgIC50aGVuKCh0YWJsZURETCkgPT4ge1xyXG4gICAgICAgIGlmICh0YWJsZURETCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbkV4aXN0cygodGFibGVEREwgYXMgc3RyaW5nKSwgY29sdW1uKTtcclxuICAgICAgICB9IGVsc2UgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuLyogUHJpdmF0ZSAqL1xyXG5cclxuICBwcml2YXRlIGRlZkNvbHVtbihjb2w6IERCQ29sdW1uKTogc3RyaW5nIHtcclxuICAgIGxldCBjb2xTcWw6IHN0cmluZztcclxuXHJcbiAgICBjb2xTcWwgPSBjb2wubmFtZSArICcgJyArIGNvbC50eXBlO1xyXG4gICAgaWYgKCFjb2wuaXNOdWxsYWJsZSkge1xyXG4gICAgICBjb2xTcWwgKz0gICcgTk9UIE5VTEwgJztcclxuICAgIH1cclxuICAgIGlmIChjb2wuZGVmYXVsdCkge1xyXG4gICAgICBjb2xTcWwgKz0gJyBERUZBVUxUICcgKyBjb2wuZGVmYXVsdCArICcgJztcclxuICAgIH1cclxuICAgIGlmIChjb2wudHlwZSA9PT0gJ3RleHQnICYmIGNvbC5sZW5ndGgpIHtcclxuICAgICAgY29sU3FsICs9IGAgQ09OU1RSQUlOVCAke2NvbC5uYW1lfV9sZW5ndGggQ0hFQ0sgKCBgO1xyXG4gICAgICBpZiAoY29sLmlzTnVsbGFibGUpIHtcclxuICAgICAgICBjb2xTcWwgKz0gYCR7Y29sLm5hbWV9IGlzIG51bGwgT1IgYDtcclxuICAgICAgfVxyXG4gICAgICBjb2xTcWwgKz0gYGxlbmd0aCgke2NvbC5uYW1lfSkgPD0gJHtjb2wubGVuZ3RofSApYDtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbFNxbDtcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlZlVuaXF1ZSh1bmlxdWU6IERCVW5pcXVlKTogc3RyaW5nIHtcclxuICAgIGxldCB1bmlxU3FsOiBzdHJpbmc7XHJcblxyXG4gICAgLy8gZGVwZW5kZSBkZWwgZW50b3JubywgcHJvZHVjY2nDs24gbyBkZXNhcnJvbGxvXHJcbiAgICBjb25zdCBvbkNvbmZsaWN0VW5pcXVlID0gJ29uIGNvbmZsaWN0IHJlcGxhY2UnO1xyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KHVuaXF1ZS5maWVsZHMpICkgIHtcclxuICAgICAgdW5pcVNxbCA9IGAgQ09OU1RSQUlOVCAke3VuaXF1ZS5uYW1lfSBVTklRVUUgKCAke3VuaXF1ZS5maWVsZHMuam9pbignLCcpfSApICR7b25Db25mbGljdFVuaXF1ZX0gYDtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgdW5pcXVlLmZpZWxkcyA9PT0gJ3N0cmluZycpICAge1xyXG4gICAgICB1bmlxU3FsID0gYCBDT05TVFJBSU5UICR7dW5pcXVlLm5hbWV9IFVOSVFVRSAoICR7dW5pcXVlLmZpZWxkc30gKSAke29uQ29uZmxpY3RVbmlxdWV9IGA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVuaXFTcWw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlZkZvcmVpZ24oZm9yZTogREJGb3JlaWduKTogc3RyaW5nIHtcclxuICAgIGxldCBmb3JlU3FsOiBzdHJpbmc7XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9yZS5mb3JlaWduS2V5KSApICB7XHJcbiAgICAgIGZvcmVTcWwgPSBgIEZPUkVJR04gS0VZICggICR7Zm9yZS5mb3JlaWduS2V5LmpvaW4oJywnKX0gKSBgO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgZm9yZS5mb3JlaWduS2V5ID09PSAnc3RyaW5nJykgICB7XHJcbiAgICAgIGZvcmVTcWwgPSBgIEZPUkVJR04gS0VZICggICR7Zm9yZS5mb3JlaWduS2V5fSApIGA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9yZS5wcmltYXJ5S2V5KSApICB7XHJcbiAgICAgIGZvcmVTcWwgPSBgIFJFRkVSRU5DRVMgJHtmb3JlLnJlZmVyZW5jZVRhYmxlfSAoICAke2ZvcmUucHJpbWFyeUtleS5qb2luKCcsJyl9ICkgYDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIGZvcmUucHJpbWFyeUtleSA9PT0gJ3N0cmluZycpICAge1xyXG4gICAgICBmb3JlU3FsID0gYCBSRUZFUkVOQ0VTICR7Zm9yZS5yZWZlcmVuY2VUYWJsZX0gKCAgJHtmb3JlLnByaW1hcnlLZXl9ICkgYDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm9yZVNxbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3RhYmxlRXhpc3RzKHRhYmxlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5KCdzZWxlY3QgIHNxbCBmcm9tIHNxbGl0ZV9tYXN0ZXIgJyArXHJcbiAgICAgICAgJ3doZXJlIHR5cGU9XFwndGFibGVcXCcgYW5kIG5hbWU9XFwnJyArIHRhYmxlICsgJ1xcJycpXHJcbiAgICAudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnJvd3NDb3VudChyZXN1bHQpID09PSAxKSB7IHJldHVybiAodGhpcy5mZXRjaChyZXN1bHQpIGFzIGFueSkuc3FsIGFzIHN0cmluZzsgfSBlbHNlIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbHVtbkV4aXN0cyh0YWJsZURETDogc3RyaW5nLCBjb2x1bW46IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICh0YWJsZURETC5pbmRleE9mKGNvbHVtbikgPT09IC0xKSB7IHJldHVybiBmYWxzZTsgfSBlbHNlIHsgIHJldHVybiB0cnVlOyB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZENvbHVtbih0YWJsZTogc3RyaW5nLCBjb2w6IERCQ29sdW1uKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IGNvbFNxbCA9IHRoaXMuZGVmQ29sdW1uKGNvbCk7XHJcbiAgICBjb25zdCBxdWVyeSA9ICdhbHRlciBUQUJMRSAnICsgdGFibGUgKyAnIGFkZCBDT0xVTU4gJyArIGNvbFNxbDtcclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5KHF1ZXJ5KTtcclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBEQl9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48RGJDb25maWc+KCdkYldyYXBwZXJDb25maWcnKTtcclxuZXhwb3J0IGNvbnN0IERCX1NDSEVNQSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxEQlNjaGVtYT4oJ2RiV3JhcHBlclNjaGVtYScpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHREYkNvbmZpZygpOiBEYkNvbmZpZyB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGRiTmFtZTogJ2RiLnNxbGl0ZScsXHJcbiAgICBsb2NhdGlvbjogJ2RlZmF1bHQnLFxyXG4gICAgaW9zRGF0YWJhc2VMb2NhdGlvbjogJ0xpYnJhcnknXHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVEYldyYXBwZXIoZGJDb25maWc6IERiQ29uZmlnLCBkYlNjaGVtYT86IERCU2NoZW1hKTogRGJXcmFwcGVyU2VydmljZSB7XHJcbiAgY29uc3QgY29uZmlnID0gISFkYkNvbmZpZyA/IGRiQ29uZmlnIDogZ2V0RGVmYXVsdERiQ29uZmlnKCk7XHJcbiAgcmV0dXJuIG5ldyBEYldyYXBwZXJTZXJ2aWNlKGNvbmZpZywgZGJTY2hlbWEpO1xyXG59XHJcblxyXG5cclxuXHJcbiJdfQ==
|
|
1
|
+
import { __awaiter, __generator } from "tslib";
|
|
2
|
+
import { InjectionToken } from '@angular/core';
|
|
3
|
+
import { WindowService } from './window.service';
|
|
4
|
+
var DbWrapperService = /** @class */ (function () {
|
|
5
|
+
function DbWrapperService(dbConfig, dbSchema) {
|
|
6
|
+
var _this = this;
|
|
7
|
+
this._dbName = dbConfig.dbName;
|
|
8
|
+
this._location = dbConfig.location || 'default';
|
|
9
|
+
this._iosDatabaseLocation = dbConfig.iosDatabaseLocation || 'Library';
|
|
10
|
+
this._androidDatabaseProvider = dbConfig.androidDatabaseProvider || 'default';
|
|
11
|
+
var window = (new WindowService()).nativeWindow;
|
|
12
|
+
if (dbSchema) {
|
|
13
|
+
this.schema = dbSchema;
|
|
14
|
+
}
|
|
15
|
+
this._readyPromise = new Promise(function (resolve, reject) {
|
|
16
|
+
if (typeof window.cordova === 'undefined') {
|
|
17
|
+
setTimeout(function () {
|
|
18
|
+
_this.init(dbSchema).then(function () {
|
|
19
|
+
resolve();
|
|
20
|
+
})
|
|
21
|
+
.catch(function (err) {
|
|
22
|
+
reject(err);
|
|
23
|
+
});
|
|
24
|
+
}, 500);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
document.addEventListener('deviceready', function () {
|
|
28
|
+
console.log('dbWrapper: device ready.');
|
|
29
|
+
_this.initDevice(dbSchema).then(function () { return resolve(); }).catch(function (err) { return reject(err); });
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
DbWrapperService.prototype.ready = function () {
|
|
35
|
+
return this._readyPromise;
|
|
36
|
+
};
|
|
37
|
+
DbWrapperService.prototype.initDevice = function (dbSchema) {
|
|
38
|
+
var _this = this;
|
|
39
|
+
var window = (new WindowService()).nativeWindow;
|
|
40
|
+
return new Promise(function (resolve, reject) {
|
|
41
|
+
_this.db = window.sqlitePlugin.openDatabase({
|
|
42
|
+
name: _this._dbName,
|
|
43
|
+
location: _this._location,
|
|
44
|
+
androidLockWorkaround: 1,
|
|
45
|
+
androidDatabaseProvider: _this._androidDatabaseProvider,
|
|
46
|
+
});
|
|
47
|
+
if (dbSchema) {
|
|
48
|
+
_this.generate(dbSchema).catch(function (err) {
|
|
49
|
+
reject(err);
|
|
50
|
+
}).then(function () { resolve(); });
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
resolve();
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
DbWrapperService.prototype.init = function (dbSchema) {
|
|
58
|
+
var _this = this;
|
|
59
|
+
var window = (new WindowService()).nativeWindow;
|
|
60
|
+
return new Promise(function (resolve, reject) {
|
|
61
|
+
_this.db = window.openDatabase(_this._dbName, '1.0', 'database', -1);
|
|
62
|
+
if (dbSchema) {
|
|
63
|
+
_this.generate(dbSchema).catch(function (err) {
|
|
64
|
+
reject(err);
|
|
65
|
+
}).then(function () {
|
|
66
|
+
resolve();
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
resolve();
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
DbWrapperService.prototype.generate = function (schema) {
|
|
75
|
+
var _this = this;
|
|
76
|
+
var sentences = [];
|
|
77
|
+
this.schema = schema;
|
|
78
|
+
if (schema.tables) {
|
|
79
|
+
schema.tables.forEach(function (table) {
|
|
80
|
+
sentences.push(_this.createTable(table));
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
if (schema.views) {
|
|
84
|
+
schema.views.forEach(function (view) {
|
|
85
|
+
sentences.push(_this.createView(view));
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
if (sentences.length === 0) {
|
|
89
|
+
throw new Error('Esquema de la base de datos vacia.');
|
|
90
|
+
}
|
|
91
|
+
return Promise.all(sentences);
|
|
92
|
+
};
|
|
93
|
+
DbWrapperService.prototype.createTable = function (table) {
|
|
94
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
95
|
+
var sql, onConflictPrimary, sentences, newColumns, tableDDL;
|
|
96
|
+
var _this = this;
|
|
97
|
+
return __generator(this, function (_a) {
|
|
98
|
+
switch (_a.label) {
|
|
99
|
+
case 0:
|
|
100
|
+
sql = '';
|
|
101
|
+
sentences = [], newColumns = [];
|
|
102
|
+
return [4 /*yield*/, this._tableExists(table.name)];
|
|
103
|
+
case 1:
|
|
104
|
+
tableDDL = _a.sent();
|
|
105
|
+
if (tableDDL) {
|
|
106
|
+
table.columns.forEach(function (col) {
|
|
107
|
+
if (!_this._columnExists(tableDDL, col.name)) {
|
|
108
|
+
newColumns.push(_this.addColumn(table.name, col));
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
table.columns.forEach(function (col) {
|
|
114
|
+
sentences.push(_this.defColumn(col));
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
onConflictPrimary = 'on conflict fail';
|
|
118
|
+
if (Array.isArray(table.primary)) {
|
|
119
|
+
sentences.push(' CONSTRAINT identificador PRIMARY KEY (' + table.primary.join(',') + ') ' + onConflictPrimary);
|
|
120
|
+
}
|
|
121
|
+
if (typeof table.primary === 'string') {
|
|
122
|
+
sentences.push(' CONSTRAINT identificador PRIMARY KEY (' + table.primary + ') ' + onConflictPrimary);
|
|
123
|
+
}
|
|
124
|
+
if (table.uniques) {
|
|
125
|
+
table.uniques.forEach(function (uniq) {
|
|
126
|
+
sentences.push(_this.defUnique(uniq));
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
if (table.foreigns) {
|
|
130
|
+
table.foreigns.forEach(function (fore) {
|
|
131
|
+
sentences.push(_this.defForeign(fore));
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
if (tableDDL && newColumns.length !== 0) {
|
|
135
|
+
return [2 /*return*/, Promise.all(newColumns)
|
|
136
|
+
.then(function () { console.log("Table " + table.name + " altered."); })
|
|
137
|
+
.catch(function (err) {
|
|
138
|
+
console.error("Table " + table.name + ": " + err.message);
|
|
139
|
+
throw new Error("Table " + table.name + ": " + err.message);
|
|
140
|
+
})];
|
|
141
|
+
}
|
|
142
|
+
else if (!tableDDL) {
|
|
143
|
+
sql = 'CREATE TABLE IF NOT EXISTS ' + table.name + ' (' + sentences.join(',') + ')';
|
|
144
|
+
return [2 /*return*/, this.query(sql)
|
|
145
|
+
.then(function () { console.log("Table " + table.name + " created."); })
|
|
146
|
+
.catch(function (err) {
|
|
147
|
+
console.error("Table " + table.name + ": " + err.message);
|
|
148
|
+
throw new Error("Table " + table.name + ": " + err.message);
|
|
149
|
+
})];
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
return [2 /*return*/, Promise.resolve().then(function () { console.log("Table " + table.name + " initialized."); })];
|
|
153
|
+
}
|
|
154
|
+
return [2 /*return*/];
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
};
|
|
159
|
+
DbWrapperService.prototype.createView = function (view) {
|
|
160
|
+
var sql;
|
|
161
|
+
sql = 'CREATE VIEW IF NOT EXISTS ' + view.name
|
|
162
|
+
+ ' AS ' + view.sql;
|
|
163
|
+
return this.query(sql);
|
|
164
|
+
};
|
|
165
|
+
DbWrapperService.prototype.getSchemaTable = function (tableName) {
|
|
166
|
+
var res;
|
|
167
|
+
this.schema.tables.forEach(function (table) {
|
|
168
|
+
if (table.name === tableName) {
|
|
169
|
+
res = table;
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
return res;
|
|
173
|
+
};
|
|
174
|
+
DbWrapperService.prototype.getUniquesTable = function (table) {
|
|
175
|
+
var res;
|
|
176
|
+
table.uniques.forEach(function (uniq) {
|
|
177
|
+
res[uniq.name] = uniq;
|
|
178
|
+
});
|
|
179
|
+
return res;
|
|
180
|
+
};
|
|
181
|
+
DbWrapperService.prototype.query = function (query, bindings) {
|
|
182
|
+
var _this = this;
|
|
183
|
+
if (bindings === void 0) { bindings = []; }
|
|
184
|
+
return new Promise(function (resolve, reject) {
|
|
185
|
+
if (query.indexOf('select') === 0) {
|
|
186
|
+
_this.db.readTransaction(function (transaction) {
|
|
187
|
+
transaction.executeSql(query, bindings, function (transaction, result) {
|
|
188
|
+
resolve(result);
|
|
189
|
+
}, function (transaction, error) {
|
|
190
|
+
reject(error);
|
|
191
|
+
});
|
|
192
|
+
}, function (err) { return reject(err); });
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
_this.db.transaction(function (transaction) {
|
|
196
|
+
transaction.executeSql(query, bindings, function (transaction, result) {
|
|
197
|
+
resolve(result);
|
|
198
|
+
}, function (transaction, error) {
|
|
199
|
+
reject(error);
|
|
200
|
+
});
|
|
201
|
+
}, function (err) { return reject(err); });
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
};
|
|
205
|
+
DbWrapperService.prototype.Count = function (query, bindings) {
|
|
206
|
+
var _this = this;
|
|
207
|
+
if (bindings === void 0) { bindings = []; }
|
|
208
|
+
return this.query(query, bindings).then(function (rows) {
|
|
209
|
+
return _this.rowsCount(rows);
|
|
210
|
+
});
|
|
211
|
+
};
|
|
212
|
+
DbWrapperService.prototype.insert = function (table, bindings) {
|
|
213
|
+
var _this = this;
|
|
214
|
+
var sql = '', sqlBinds = [], sqlKeys = [], sqlValues = [];
|
|
215
|
+
sql = sql + 'insert into ' + table + ' ';
|
|
216
|
+
for (var index in bindings) {
|
|
217
|
+
if (bindings.hasOwnProperty(index)) {
|
|
218
|
+
sqlKeys.push(index);
|
|
219
|
+
sqlValues.push(bindings[index]);
|
|
220
|
+
sqlBinds.push('?');
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
sql = sql + '(' + sqlKeys.join(',') + ') values (' + sqlBinds.join(',') + ')';
|
|
224
|
+
return new Promise(function (resolve, reject) {
|
|
225
|
+
_this.db.transaction(function (transaction) {
|
|
226
|
+
transaction.executeSql(sql, sqlValues, function (transaction, result) {
|
|
227
|
+
resolve(result);
|
|
228
|
+
}, function (transaction, error) {
|
|
229
|
+
reject(error);
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
};
|
|
234
|
+
DbWrapperService.prototype.update = function (table, bindings, where) {
|
|
235
|
+
var _this = this;
|
|
236
|
+
var sql = '', sqlBinds = [], sqlKeys = [], sqlValues = [];
|
|
237
|
+
sql = sql + 'update ' + table + ' set ';
|
|
238
|
+
for (var index in bindings) {
|
|
239
|
+
if (bindings.hasOwnProperty(index)) {
|
|
240
|
+
var newObj = bindings[index];
|
|
241
|
+
if (typeof newObj === 'object' && newObj !== null) {
|
|
242
|
+
sqlValues.push(newObj.value);
|
|
243
|
+
if (newObj.ifnull) {
|
|
244
|
+
sqlBinds.push(index + ' = ifnull( ' + index + ',0) + ?');
|
|
245
|
+
}
|
|
246
|
+
else if (newObj.operator) {
|
|
247
|
+
sqlBinds.push(index + ' = ' + index + newObj.operator + ' ?');
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
sqlBinds.push(index + ' = ?');
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
sqlBinds.push(index + ' = ?');
|
|
255
|
+
sqlValues.push(bindings[index]);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
for (var index in where) {
|
|
260
|
+
if (where.hasOwnProperty(index)) {
|
|
261
|
+
if (typeof where[index] === 'object' && where[index] !== null) {
|
|
262
|
+
sqlKeys.push(index + ' ' + where[index].operator + ' ?');
|
|
263
|
+
sqlValues.push(where[index].value);
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
sqlKeys.push(index + ' = ?');
|
|
267
|
+
sqlValues.push(where[index]);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
sql = sql + sqlBinds.join(',') + ' where ' + sqlKeys.join(' and ');
|
|
272
|
+
return new Promise(function (resolve, reject) {
|
|
273
|
+
_this.db.transaction(function (transaction) {
|
|
274
|
+
transaction.executeSql(sql, sqlValues, function (transaction, result) {
|
|
275
|
+
resolve(result);
|
|
276
|
+
}, function (transaction, error) {
|
|
277
|
+
reject(error);
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
};
|
|
282
|
+
DbWrapperService.prototype.dropTable = function (tables) {
|
|
283
|
+
var _this = this;
|
|
284
|
+
var cont = 1;
|
|
285
|
+
cont = tables.length;
|
|
286
|
+
return new Promise(function (resolve, reject) {
|
|
287
|
+
tables.some(function (table) {
|
|
288
|
+
if (cont !== 0) {
|
|
289
|
+
_this.query('DROP TABLE ' + table)
|
|
290
|
+
.then(function () {
|
|
291
|
+
if (cont === 1) {
|
|
292
|
+
resolve();
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
cont--;
|
|
296
|
+
}
|
|
297
|
+
}, function (err) {
|
|
298
|
+
cont = 0;
|
|
299
|
+
reject(err);
|
|
300
|
+
return true;
|
|
301
|
+
});
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
};
|
|
307
|
+
DbWrapperService.prototype.fetchAll = function (result) {
|
|
308
|
+
var output = [];
|
|
309
|
+
for (var i = 0; i < result.rows.length; i++) {
|
|
310
|
+
output.push(result.rows.item(i));
|
|
311
|
+
}
|
|
312
|
+
return output;
|
|
313
|
+
};
|
|
314
|
+
DbWrapperService.prototype.fetch = function (result) {
|
|
315
|
+
var objeto = undefined, newObj = undefined;
|
|
316
|
+
if (result.rows.length !== 0) {
|
|
317
|
+
objeto = result.rows.item(0);
|
|
318
|
+
newObj = {};
|
|
319
|
+
var keys = Object.keys(objeto);
|
|
320
|
+
for (var key in keys) {
|
|
321
|
+
newObj[keys[key]] = objeto[keys[key]];
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return newObj;
|
|
325
|
+
};
|
|
326
|
+
DbWrapperService.prototype.rowsCount = function (result) {
|
|
327
|
+
return result.rows.length;
|
|
328
|
+
};
|
|
329
|
+
DbWrapperService.prototype.tableExists = function (table) {
|
|
330
|
+
var _this = this;
|
|
331
|
+
return this.query('select sql from sqlite_master ' +
|
|
332
|
+
'where type=\'table\' and name=\'' + table + '\'')
|
|
333
|
+
.then(function (result) { return (_this.rowsCount(result) === 1); });
|
|
334
|
+
};
|
|
335
|
+
DbWrapperService.prototype.columnExists = function (table, column) {
|
|
336
|
+
var _this = this;
|
|
337
|
+
return this._tableExists(table)
|
|
338
|
+
.then(function (tableDDL) {
|
|
339
|
+
if (tableDDL) {
|
|
340
|
+
return _this._columnExists(tableDDL, column);
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
};
|
|
347
|
+
/* Private */
|
|
348
|
+
DbWrapperService.prototype.defColumn = function (col) {
|
|
349
|
+
var colSql;
|
|
350
|
+
colSql = col.name + ' ' + col.type;
|
|
351
|
+
if (!col.isNullable) {
|
|
352
|
+
colSql += ' NOT NULL ';
|
|
353
|
+
}
|
|
354
|
+
if (col.default) {
|
|
355
|
+
colSql += ' DEFAULT ' + col.default + ' ';
|
|
356
|
+
}
|
|
357
|
+
if (col.type === 'text' && col.length) {
|
|
358
|
+
colSql += " CONSTRAINT " + col.name + "_length CHECK ( ";
|
|
359
|
+
if (col.isNullable) {
|
|
360
|
+
colSql += col.name + " is null OR ";
|
|
361
|
+
}
|
|
362
|
+
colSql += "length(" + col.name + ") <= " + col.length + " )";
|
|
363
|
+
}
|
|
364
|
+
return colSql;
|
|
365
|
+
};
|
|
366
|
+
DbWrapperService.prototype.defUnique = function (unique) {
|
|
367
|
+
var uniqSql;
|
|
368
|
+
// depende del entorno, producción o desarrollo
|
|
369
|
+
var onConflictUnique = 'on conflict replace';
|
|
370
|
+
if (Array.isArray(unique.fields)) {
|
|
371
|
+
uniqSql = " CONSTRAINT " + unique.name + " UNIQUE ( " + unique.fields.join(',') + " ) " + onConflictUnique + " ";
|
|
372
|
+
}
|
|
373
|
+
if (typeof unique.fields === 'string') {
|
|
374
|
+
uniqSql = " CONSTRAINT " + unique.name + " UNIQUE ( " + unique.fields + " ) " + onConflictUnique + " ";
|
|
375
|
+
}
|
|
376
|
+
return uniqSql;
|
|
377
|
+
};
|
|
378
|
+
DbWrapperService.prototype.defForeign = function (fore) {
|
|
379
|
+
var foreSql;
|
|
380
|
+
if (Array.isArray(fore.foreignKey)) {
|
|
381
|
+
foreSql = " FOREIGN KEY ( " + fore.foreignKey.join(',') + " ) ";
|
|
382
|
+
}
|
|
383
|
+
if (typeof fore.foreignKey === 'string') {
|
|
384
|
+
foreSql = " FOREIGN KEY ( " + fore.foreignKey + " ) ";
|
|
385
|
+
}
|
|
386
|
+
if (Array.isArray(fore.primaryKey)) {
|
|
387
|
+
foreSql = " REFERENCES " + fore.referenceTable + " ( " + fore.primaryKey.join(',') + " ) ";
|
|
388
|
+
}
|
|
389
|
+
if (typeof fore.primaryKey === 'string') {
|
|
390
|
+
foreSql = " REFERENCES " + fore.referenceTable + " ( " + fore.primaryKey + " ) ";
|
|
391
|
+
}
|
|
392
|
+
return foreSql;
|
|
393
|
+
};
|
|
394
|
+
DbWrapperService.prototype._tableExists = function (table) {
|
|
395
|
+
var _this = this;
|
|
396
|
+
return this.query('select sql from sqlite_master ' +
|
|
397
|
+
'where type=\'table\' and name=\'' + table + '\'')
|
|
398
|
+
.then(function (result) {
|
|
399
|
+
if (_this.rowsCount(result) === 1) {
|
|
400
|
+
return _this.fetch(result).sql;
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
return false;
|
|
404
|
+
}
|
|
405
|
+
});
|
|
406
|
+
};
|
|
407
|
+
DbWrapperService.prototype._columnExists = function (tableDDL, column) {
|
|
408
|
+
if (tableDDL.indexOf(column) === -1) {
|
|
409
|
+
return false;
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
return true;
|
|
413
|
+
}
|
|
414
|
+
};
|
|
415
|
+
DbWrapperService.prototype.addColumn = function (table, col) {
|
|
416
|
+
var colSql = this.defColumn(col);
|
|
417
|
+
var query = 'alter TABLE ' + table + ' add COLUMN ' + colSql;
|
|
418
|
+
return this.query(query);
|
|
419
|
+
};
|
|
420
|
+
return DbWrapperService;
|
|
421
|
+
}());
|
|
422
|
+
export { DbWrapperService };
|
|
423
|
+
export var DB_CONFIG = new InjectionToken('dbWrapperConfig');
|
|
424
|
+
export var DB_SCHEMA = new InjectionToken('dbWrapperSchema');
|
|
425
|
+
export function getDefaultDbConfig() {
|
|
426
|
+
return {
|
|
427
|
+
dbName: 'db.sqlite',
|
|
428
|
+
location: 'default',
|
|
429
|
+
iosDatabaseLocation: 'Library'
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
export function provideDbWrapper(dbConfig, dbSchema) {
|
|
433
|
+
var config = !!dbConfig ? dbConfig : getDefaultDbConfig();
|
|
434
|
+
return new DbWrapperService(config, dbSchema);
|
|
435
|
+
}
|
|
436
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGItd3JhcHBlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGItd3JhcHBlci8iLCJzb3VyY2VzIjpbImxpYi9kYi13cmFwcGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSWpEO0lBU0UsMEJBQVksUUFBa0IsRUFBRSxRQUFtQjtRQUFuRCxpQkEwQkM7UUF4QkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUM7UUFDaEQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsSUFBSSxTQUFTLENBQUM7UUFDdEUsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFFBQVEsQ0FBQyx1QkFBdUIsSUFBSSxTQUFTLENBQUM7UUFDOUUsSUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLGFBQWEsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQ2xELElBQUksUUFBUSxFQUFFO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7U0FBRTtRQUN6QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksT0FBTyxDQUFHLFVBQUMsT0FBTyxFQUFFLE1BQU07WUFDakQsSUFBSSxPQUFPLE1BQU0sQ0FBQyxPQUFPLEtBQUssV0FBVyxFQUFFO2dCQUN6QyxVQUFVLENBQUU7b0JBQ1YsS0FBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQ3RCO3dCQUNFLE9BQU8sRUFBRSxDQUFDO29CQUNaLENBQUMsQ0FBRTt5QkFDRixLQUFLLENBQUcsVUFBQyxHQUFHO3dCQUNYLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDZCxDQUFDLENBQUUsQ0FBQztnQkFDUixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDVDtpQkFBTTtnQkFDTCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFO29CQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUM7b0JBQ3hDLEtBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFHLGNBQU0sT0FBQSxPQUFPLEVBQUUsRUFBVCxDQUFTLENBQUUsQ0FBQyxLQUFLLENBQUcsVUFBQyxHQUFHLElBQUssT0FBQSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQVgsQ0FBVyxDQUFFLENBQUM7Z0JBQ3BGLENBQUMsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxnQ0FBSyxHQUFMO1FBQ0UsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRCxxQ0FBVSxHQUFWLFVBQVcsUUFBa0I7UUFBN0IsaUJBa0JDO1FBakJDLElBQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxhQUFhLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUNsRCxPQUFPLElBQUksT0FBTyxDQUFFLFVBQUMsT0FBTyxFQUFFLE1BQU07WUFDbEMsS0FBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztnQkFDekMsSUFBSSxFQUFFLEtBQUksQ0FBQyxPQUFPO2dCQUNsQixRQUFRLEVBQUUsS0FBSSxDQUFDLFNBQVM7Z0JBQ3hCLHFCQUFxQixFQUFFLENBQUM7Z0JBQ3hCLHVCQUF1QixFQUFFLEtBQUksQ0FBQyx3QkFBd0I7YUFDdkQsQ0FBQyxDQUFDO1lBRUgsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osS0FBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBQSxHQUFHO29CQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2QsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQVEsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMvQjtpQkFBTTtnQkFDTCxPQUFPLEVBQUUsQ0FBQzthQUNYO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsK0JBQUksR0FBSixVQUFLLFFBQWtCO1FBQXZCLGlCQWNDO1FBYkMsSUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLGFBQWEsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQ2xELE9BQVEsSUFBSSxPQUFPLENBQUcsVUFBQyxPQUFPLEVBQUUsTUFBTTtZQUNwQyxLQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkUsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osS0FBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBQSxHQUFHO29CQUNoQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFFO29CQUNQLE9BQU8sRUFBRSxDQUFDO2dCQUNaLENBQUMsQ0FBQyxDQUFDO2FBQ0o7aUJBQU07Z0JBQ0wsT0FBTyxFQUFFLENBQUM7YUFDWDtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG1DQUFRLEdBQVIsVUFBUyxNQUFnQjtRQUF6QixpQkFtQkM7UUFqQkMsSUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBRXJCLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNqQixNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFBLEtBQUs7Z0JBQ3pCLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzFDLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDaEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUUsVUFBQSxJQUFJO2dCQUN4QixTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7U0FDdkQ7UUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVLLHNDQUFXLEdBQWpCLFVBQWtCLEtBQWM7Ozs7Ozs7d0JBQzFCLEdBQUcsR0FBRyxFQUFFLENBQXFCO3dCQUMzQixTQUFTLEdBQUcsRUFBRSxFQUFHLFVBQVUsR0FBRyxFQUFFLENBQUE7d0JBRXJCLHFCQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFBOzt3QkFBOUMsUUFBUSxHQUFHLFNBQW1DO3dCQUNwRCxJQUFJLFFBQVEsRUFBRTs0QkFDVixLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBRSxVQUFBLEdBQUc7Z0NBQ3hCLElBQUksQ0FBQyxLQUFJLENBQUMsYUFBYSxDQUFDLFFBQWtCLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFHO29DQUN0RCxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2lDQUNsRDs0QkFDSCxDQUFDLENBQUMsQ0FBQzt5QkFDTjs2QkFBTTs0QkFDTCxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBRSxVQUFBLEdBQUc7Z0NBQ3hCLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOzRCQUN0QyxDQUFDLENBQUMsQ0FBQzt5QkFDSjt3QkFDRCxpQkFBaUIsR0FBRyxrQkFBa0IsQ0FBQzt3QkFFdkMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBSTs0QkFDbEMsU0FBUyxDQUFDLElBQUksQ0FBRSx5Q0FBeUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsaUJBQWlCLENBQUUsQ0FBQzt5QkFDbEg7d0JBQ0QsSUFBSSxPQUFPLEtBQUssQ0FBQyxPQUFPLEtBQUssUUFBUSxFQUFJOzRCQUN2QyxTQUFTLENBQUMsSUFBSSxDQUFFLHlDQUF5QyxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxHQUFHLGlCQUFpQixDQUFFLENBQUM7eUJBQ3hHO3dCQUNELElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTs0QkFDakIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUUsVUFBQSxJQUFJO2dDQUN6QixTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzs0QkFDdkMsQ0FBQyxDQUFDLENBQUM7eUJBQ0o7d0JBRUQsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFOzRCQUNsQixLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBRyxVQUFBLElBQUk7Z0NBQzNCLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDOzRCQUN4QyxDQUFDLENBQUMsQ0FBQzt5QkFDSjt3QkFFRCxJQUFJLFFBQVEsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTs0QkFDdkMsc0JBQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7cUNBQzdCLElBQUksQ0FBRSxjQUFRLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBUyxLQUFLLENBQUMsSUFBSSxjQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBRTtxQ0FDOUQsS0FBSyxDQUFFLFVBQUMsR0FBRztvQ0FDVixPQUFPLENBQUMsS0FBSyxDQUFFLFdBQVMsS0FBSyxDQUFDLElBQUksVUFBSyxHQUFHLENBQUMsT0FBUyxDQUFDLENBQUM7b0NBQ3RELE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBUyxLQUFLLENBQUMsSUFBSSxVQUFLLEdBQUcsQ0FBQyxPQUFTLENBQUMsQ0FBQztnQ0FDekQsQ0FBQyxDQUFDLEVBQUM7eUJBRUo7NkJBQU0sSUFBSSxDQUFDLFFBQVEsRUFBRTs0QkFDcEIsR0FBRyxHQUFHLDZCQUE2QixHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDOzRCQUNwRixzQkFBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztxQ0FDckIsSUFBSSxDQUFFLGNBQVEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFTLEtBQUssQ0FBQyxJQUFJLGNBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FDQUM3RCxLQUFLLENBQUUsVUFBQyxHQUFHO29DQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUUsV0FBUyxLQUFLLENBQUMsSUFBSSxVQUFLLEdBQUcsQ0FBQyxPQUFTLENBQUMsQ0FBQztvQ0FDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFTLEtBQUssQ0FBQyxJQUFJLFVBQUssR0FBRyxDQUFDLE9BQVMsQ0FBQyxDQUFDO2dDQUN6RCxDQUFDLENBQUMsRUFBQzt5QkFDSjs2QkFBTTs0QkFDTCxzQkFBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFFLGNBQVEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFTLEtBQUssQ0FBQyxJQUFJLGtCQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDO3lCQUM1Rjs7Ozs7S0FDRjtJQUdELHFDQUFVLEdBQVYsVUFBVyxJQUFZO1FBQ3JCLElBQUksR0FBVyxDQUFDO1FBRWhCLEdBQUcsR0FBRyw0QkFBNEIsR0FBRyxJQUFJLENBQUMsSUFBSTtjQUMxQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUV0QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFekIsQ0FBQztJQUVELHlDQUFjLEdBQWQsVUFBZSxTQUFpQjtRQUM5QixJQUFJLEdBQVksQ0FBQztRQUVqQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUUsVUFBQSxLQUFLO1lBQy9CLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7Z0JBQzVCLEdBQUcsR0FBRyxLQUFLLENBQUM7YUFDYjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxHQUFHLENBQUM7SUFFYixDQUFDO0lBRUQsMENBQWUsR0FBZixVQUFnQixLQUFjO1FBQzVCLElBQUksR0FBTyxDQUFDO1FBQ1osS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBQSxJQUFJO1lBQ3hCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsZ0NBQUssR0FBTCxVQUFNLEtBQWEsRUFBRSxRQUFtQjtRQUF4QyxpQkFvQkM7UUFwQm9CLHlCQUFBLEVBQUEsYUFBbUI7UUFDdEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO1lBQ2pDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2pDLEtBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLFVBQUMsV0FBMkI7b0JBQ2hELFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFDLFdBQTJCLEVBQUUsTUFBb0I7d0JBQ3RGLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDcEIsQ0FBQyxFQUFFLFVBQUMsV0FBMkIsRUFBRSxLQUFlO3dCQUM1QyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2xCLENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUMsRUFBRSxVQUFDLEdBQWEsSUFBSyxPQUFBLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBWCxDQUFXLENBQUUsQ0FBQzthQUNyQztpQkFBTTtnQkFDTCxLQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxVQUFDLFdBQTJCO29CQUM1QyxXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBQyxXQUEyQixFQUFFLE1BQW9CO3dCQUN0RixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ3BCLENBQUMsRUFBRSxVQUFDLFdBQTJCLEVBQUUsS0FBZTt3QkFDNUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNsQixDQUFDLENBQUMsQ0FBQztnQkFDUCxDQUFDLEVBQUUsVUFBQyxHQUFhLElBQUssT0FBQSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQVgsQ0FBVyxDQUFFLENBQUM7YUFDckM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxnQ0FBSyxHQUFMLFVBQU0sS0FBYSxFQUFFLFFBQW1CO1FBQXhDLGlCQUlDO1FBSm9CLHlCQUFBLEVBQUEsYUFBbUI7UUFDdEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxJQUFJO1lBQ3hDLE9BQU8sS0FBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxpQ0FBTSxHQUFOLFVBQU8sS0FBYSxFQUFFLFFBQVk7UUFBbEMsaUJBdUJDO1FBdEJDLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxRQUFRLEdBQUcsRUFBRSxFQUFFLE9BQU8sR0FBRyxFQUFFLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBRTtRQUUzRCxHQUFHLEdBQUcsR0FBRyxHQUFHLGNBQWMsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBRXpDLEtBQUssSUFBTSxLQUFLLElBQUksUUFBUSxFQUFFO1lBQzNCLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDcEIsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN2QjtTQUNIO1FBRUQsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxZQUFZLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDOUUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO1lBQ2pDLEtBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLFVBQUEsV0FBVztnQkFDM0IsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFVBQUMsV0FBMkIsRUFBRSxNQUFvQjtvQkFDckYsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNwQixDQUFDLEVBQUUsVUFBQyxXQUEyQixFQUFFLEtBQWU7b0JBQzVDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbEIsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGlDQUFNLEdBQU4sVUFBTyxLQUFhLEVBQUUsUUFBWSxFQUFFLEtBQVM7UUFBN0MsaUJBZ0RDO1FBL0NDLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxRQUFRLEdBQUcsRUFBRSxFQUFFLE9BQU8sR0FBRSxFQUFFLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBRTtRQUUxRCxHQUFHLEdBQUcsR0FBRyxHQUFHLFNBQVMsR0FBRyxLQUFLLEdBQUcsT0FBTyxDQUFDO1FBRXhDLEtBQUssSUFBSSxLQUFLLElBQUksUUFBUSxFQUFFO1lBQ3pCLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDL0IsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3QixJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO29CQUMvQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDN0IsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO3dCQUNmLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLGFBQWEsR0FBRyxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUM7cUJBQzVEO3lCQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTt3QkFDeEIsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDO3FCQUNqRTt5QkFBTTt3QkFDSCxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQztxQkFDakM7aUJBRUo7cUJBQU07b0JBQ0gsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7b0JBQzlCLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7aUJBRW5DO2FBQ0w7U0FDSDtRQUVELEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxFQUFFO1lBQ3RCLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDNUIsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxRQUFRLElBQUssS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBQztvQkFDM0QsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUM7b0JBQ3pELFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUN0QztxQkFBTTtvQkFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQztvQkFDN0IsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDaEM7YUFDTDtTQUNIO1FBRUQsR0FBRyxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25FLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtZQUNqQyxLQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxVQUFBLFdBQVc7Z0JBQzdCLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxVQUFDLFdBQTJCLEVBQUUsTUFBb0I7b0JBQ3JGLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEIsQ0FBQyxFQUFFLFVBQUMsV0FBMkIsRUFBRSxLQUFlO29CQUM1QyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xCLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxvQ0FBUyxHQUFULFVBQVcsTUFBZ0I7UUFBM0IsaUJBb0JDO1FBbkJDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztRQUViLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3JCLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtZQUNqQyxNQUFNLENBQUMsSUFBSSxDQUFFLFVBQUEsS0FBSztnQkFDaEIsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO29CQUNkLEtBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQzt5QkFDaEMsSUFBSSxDQUFFO3dCQUNILElBQUksSUFBSSxLQUFLLENBQUMsRUFBRzs0QkFBRSxPQUFPLEVBQUUsQ0FBQzt5QkFDNUI7NkJBQU07NEJBQUUsSUFBSSxFQUFFLENBQUM7eUJBQUU7b0JBQ3RCLENBQUMsRUFBRSxVQUFBLEdBQUc7d0JBQ0osSUFBSSxHQUFHLENBQUMsQ0FBQzt3QkFDVCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ1osT0FBTyxJQUFJLENBQUM7b0JBQ2QsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELG1DQUFRLEdBQVIsVUFBUyxNQUFvQjtRQUMzQixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFFaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNwQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxnQ0FBSyxHQUFMLFVBQU0sTUFBb0I7UUFDdEIsSUFBSSxNQUFNLEdBQUcsU0FBUyxFQUFFLE1BQU0sR0FBRSxTQUFTLENBQUM7UUFDMUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDMUIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDWixJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pDLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO2dCQUNsQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3pDO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBR0Qsb0NBQVMsR0FBVCxVQUFVLE1BQW9CO1FBQzFCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDOUIsQ0FBQztJQUVELHNDQUFXLEdBQVgsVUFBWSxLQUFhO1FBQXpCLGlCQUlDO1FBSEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGlDQUFpQztZQUMvQyxrQ0FBa0MsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO2FBQ3JELElBQUksQ0FBQyxVQUFBLE1BQU0sSUFBSyxPQUFBLENBQUMsS0FBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBOUIsQ0FBOEIsQ0FBRSxDQUFDO0lBQ3BELENBQUM7SUFFRCx1Q0FBWSxHQUFaLFVBQWEsS0FBYSxFQUFFLE1BQWM7UUFBMUMsaUJBT0M7UUFOQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO2FBQzVCLElBQUksQ0FBQyxVQUFDLFFBQVE7WUFDYixJQUFJLFFBQVEsRUFBRTtnQkFDWixPQUFPLEtBQUksQ0FBQyxhQUFhLENBQUUsUUFBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQzthQUN6RDtpQkFBTTtnQkFBRSxPQUFPLEtBQUssQ0FBQzthQUFFO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVILGFBQWE7SUFFSCxvQ0FBUyxHQUFqQixVQUFrQixHQUFhO1FBQzdCLElBQUksTUFBYyxDQUFDO1FBRW5CLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO1lBQ25CLE1BQU0sSUFBSyxZQUFZLENBQUM7U0FDekI7UUFDRCxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUU7WUFDZixNQUFNLElBQUksV0FBVyxHQUFHLEdBQUcsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO1NBQzNDO1FBQ0QsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFO1lBQ3JDLE1BQU0sSUFBSSxpQkFBZSxHQUFHLENBQUMsSUFBSSxxQkFBa0IsQ0FBQztZQUNwRCxJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUU7Z0JBQ2xCLE1BQU0sSUFBTyxHQUFHLENBQUMsSUFBSSxpQkFBYyxDQUFDO2FBQ3JDO1lBQ0QsTUFBTSxJQUFJLFlBQVUsR0FBRyxDQUFDLElBQUksYUFBUSxHQUFHLENBQUMsTUFBTSxPQUFJLENBQUM7U0FFcEQ7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUVoQixDQUFDO0lBRU8sb0NBQVMsR0FBakIsVUFBa0IsTUFBZ0I7UUFDaEMsSUFBSSxPQUFlLENBQUM7UUFFcEIsK0NBQStDO1FBQy9DLElBQU0sZ0JBQWdCLEdBQUcscUJBQXFCLENBQUM7UUFFL0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBSTtZQUNsQyxPQUFPLEdBQUcsaUJBQWUsTUFBTSxDQUFDLElBQUksa0JBQWEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQU0sZ0JBQWdCLE1BQUcsQ0FBQztTQUNuRztRQUNELElBQUksT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBSTtZQUN2QyxPQUFPLEdBQUcsaUJBQWUsTUFBTSxDQUFDLElBQUksa0JBQWEsTUFBTSxDQUFDLE1BQU0sV0FBTSxnQkFBZ0IsTUFBRyxDQUFDO1NBQ3pGO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVPLHFDQUFVLEdBQWxCLFVBQW1CLElBQWU7UUFDaEMsSUFBSSxPQUFlLENBQUM7UUFFcEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBSTtZQUNwQyxPQUFPLEdBQUcscUJBQW1CLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFLLENBQUM7U0FDN0Q7UUFFRCxJQUFJLE9BQU8sSUFBSSxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUk7WUFDekMsT0FBTyxHQUFHLHFCQUFtQixJQUFJLENBQUMsVUFBVSxRQUFLLENBQUM7U0FDbkQ7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFJO1lBQ3BDLE9BQU8sR0FBRyxpQkFBZSxJQUFJLENBQUMsY0FBYyxZQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFLLENBQUM7U0FDbkY7UUFFRCxJQUFJLE9BQU8sSUFBSSxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUk7WUFDekMsT0FBTyxHQUFHLGlCQUFlLElBQUksQ0FBQyxjQUFjLFlBQU8sSUFBSSxDQUFDLFVBQVUsUUFBSyxDQUFDO1NBQ3pFO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVPLHVDQUFZLEdBQXBCLFVBQXFCLEtBQWE7UUFBbEMsaUJBTUM7UUFMQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsaUNBQWlDO1lBQy9DLGtDQUFrQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUM7YUFDckQsSUFBSSxDQUFDLFVBQUEsTUFBTTtZQUNSLElBQUksS0FBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQUUsT0FBUSxLQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBUyxDQUFDLEdBQWEsQ0FBQzthQUFFO2lCQUFNO2dCQUFFLE9BQU8sS0FBSyxDQUFDO2FBQUU7UUFDbEgsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sd0NBQWEsR0FBckIsVUFBc0IsUUFBZ0IsRUFBRSxNQUFjO1FBRXBELElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFDO1NBQUU7YUFBTTtZQUFHLE9BQU8sSUFBSSxDQUFDO1NBQUU7SUFDL0UsQ0FBQztJQUVPLG9DQUFTLEdBQWpCLFVBQWtCLEtBQWEsRUFBRSxHQUFhO1FBQzVDLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsSUFBTSxLQUFLLEdBQUcsY0FBYyxHQUFHLEtBQUssR0FBRyxjQUFjLEdBQUcsTUFBTSxDQUFDO1FBQy9ELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUgsdUJBQUM7QUFBRCxDQUFDLEFBcGJELElBb2JDOztBQUlELE1BQU0sQ0FBQyxJQUFNLFNBQVMsR0FBRyxJQUFJLGNBQWMsQ0FBVyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3pFLE1BQU0sQ0FBQyxJQUFNLFNBQVMsR0FBRyxJQUFJLGNBQWMsQ0FBVyxpQkFBaUIsQ0FBQyxDQUFDO0FBRXpFLE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsT0FBTztRQUNMLE1BQU0sRUFBRSxXQUFXO1FBQ25CLFFBQVEsRUFBRSxTQUFTO1FBQ25CLG1CQUFtQixFQUFFLFNBQVM7S0FDL0IsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsUUFBa0IsRUFBRSxRQUFtQjtJQUN0RSxJQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUQsT0FBTyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNoRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFdpbmRvd1NlcnZpY2UgfSBmcm9tICcuL3dpbmRvdy5zZXJ2aWNlJztcbmltcG9ydCB7IERCVGFibGUsIERiQ29uZmlnLCBEQlNjaGVtYSwgREJWaWV3LFxuICBEQkNvbHVtbiwgREJVbmlxdWUsIERCRm9yZWlnbiwgU3FsVHJhbnNhY3Rpb24sIFNxbFJlc3VsdFNldCwgU3FsRXJyb3IsIERlZmF1bHRUeXBlIH0gZnJvbSAnLi9kYi13cmFwcGVyLm1vZGVscyc7XG5cbmV4cG9ydCBjbGFzcyBEYldyYXBwZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfZGJOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgX2xvY2F0aW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgX2lvc0RhdGFiYXNlTG9jYXRpb246IHN0cmluZztcbiAgcHJpdmF0ZSBfYW5kcm9pZERhdGFiYXNlUHJvdmlkZXI6IHN0cmluZztcbiAgcHJpdmF0ZSBfcmVhZHlQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICBzY2hlbWE6IERCU2NoZW1hO1xuICBkYjogYW55O1xuXG4gIGNvbnN0cnVjdG9yKGRiQ29uZmlnOiBEYkNvbmZpZywgZGJTY2hlbWE/OiBEQlNjaGVtYSkge1xuXG4gICAgdGhpcy5fZGJOYW1lID0gZGJDb25maWcuZGJOYW1lO1xuICAgIHRoaXMuX2xvY2F0aW9uID0gZGJDb25maWcubG9jYXRpb24gfHwgJ2RlZmF1bHQnO1xuICAgIHRoaXMuX2lvc0RhdGFiYXNlTG9jYXRpb24gPSBkYkNvbmZpZy5pb3NEYXRhYmFzZUxvY2F0aW9uIHx8ICdMaWJyYXJ5JztcbiAgICB0aGlzLl9hbmRyb2lkRGF0YWJhc2VQcm92aWRlciA9IGRiQ29uZmlnLmFuZHJvaWREYXRhYmFzZVByb3ZpZGVyIHx8ICdkZWZhdWx0JztcbiAgICBjb25zdCB3aW5kb3cgPSAobmV3IFdpbmRvd1NlcnZpY2UoKSkubmF0aXZlV2luZG93O1xuICAgIGlmIChkYlNjaGVtYSkgeyB0aGlzLnNjaGVtYSA9IGRiU2NoZW1hOyB9XG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gbmV3IFByb21pc2UgKCAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5jb3Jkb3ZhID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbml0KGRiU2NoZW1hKS50aGVuIChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSApXG4gICAgICAgICAgICAuY2F0Y2ggKCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSApO1xuICAgICAgICB9LCA1MDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGV2aWNlcmVhZHknLCAoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2RiV3JhcHBlcjogZGV2aWNlIHJlYWR5LicpO1xuICAgICAgICAgIHRoaXMuaW5pdERldmljZShkYlNjaGVtYSkudGhlbiAoICgpID0+IHJlc29sdmUoKSApLmNhdGNoICggKGVycikgPT4gcmVqZWN0KGVycikgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZHlQcm9taXNlO1xuICB9XG5cbiAgaW5pdERldmljZShkYlNjaGVtYTogREJTY2hlbWEpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB3aW5kb3cgPSAobmV3IFdpbmRvd1NlcnZpY2UoKSkubmF0aXZlV2luZG93O1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSggKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYiA9IHdpbmRvdy5zcWxpdGVQbHVnaW4ub3BlbkRhdGFiYXNlKHtcbiAgICAgICAgbmFtZTogdGhpcy5fZGJOYW1lLFxuICAgICAgICBsb2NhdGlvbjogdGhpcy5fbG9jYXRpb24sXG4gICAgICAgIGFuZHJvaWRMb2NrV29ya2Fyb3VuZDogMSxcbiAgICAgICAgYW5kcm9pZERhdGFiYXNlUHJvdmlkZXI6IHRoaXMuX2FuZHJvaWREYXRhYmFzZVByb3ZpZGVyLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChkYlNjaGVtYSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRlKGRiU2NoZW1hKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KS50aGVuKCgpID0+IHsgcmVzb2x2ZSgpOyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGluaXQoZGJTY2hlbWE6IERCU2NoZW1hKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd2luZG93ID0gKG5ldyBXaW5kb3dTZXJ2aWNlKCkpLm5hdGl2ZVdpbmRvdztcbiAgICByZXR1cm4gIG5ldyBQcm9taXNlICggKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYiA9IHdpbmRvdy5vcGVuRGF0YWJhc2UodGhpcy5fZGJOYW1lLCAnMS4wJywgJ2RhdGFiYXNlJywgLTEpO1xuICAgICAgaWYgKGRiU2NoZW1hKSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGUoZGJTY2hlbWEpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSkudGhlbiggKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZW5lcmF0ZShzY2hlbWE6IERCU2NoZW1hKTogUHJvbWlzZTxhbnk+IHtcblxuICAgIGNvbnN0IHNlbnRlbmNlcyA9IFtdO1xuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuXG4gICAgaWYgKHNjaGVtYS50YWJsZXMpIHtcbiAgICAgIHNjaGVtYS50YWJsZXMuZm9yRWFjaCh0YWJsZSA9PiB7XG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuY3JlYXRlVGFibGUodGFibGUpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc2NoZW1hLnZpZXdzKSB7XG4gICAgICBzY2hlbWEudmlld3MuZm9yRWFjaCggdmlldyA9PiB7XG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuY3JlYXRlVmlldyh2aWV3KSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHNlbnRlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXNxdWVtYSBkZSBsYSBiYXNlIGRlIGRhdG9zIHZhY2lhLicpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoc2VudGVuY2VzKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVRhYmxlKHRhYmxlOiBEQlRhYmxlKTogUHJvbWlzZTxhbnk+IHtcbiAgICBsZXQgc3FsID0gJycsICBvbkNvbmZsaWN0UHJpbWFyeTtcbiAgICBjb25zdCBzZW50ZW5jZXMgPSBbXSwgIG5ld0NvbHVtbnMgPSBbXVxuXG4gICAgY29uc3QgdGFibGVEREwgPSBhd2FpdCB0aGlzLl90YWJsZUV4aXN0cyh0YWJsZS5uYW1lKTtcbiAgICBpZiAodGFibGVEREwpIHtcbiAgICAgICAgdGFibGUuY29sdW1ucy5mb3JFYWNoKCBjb2wgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5fY29sdW1uRXhpc3RzKHRhYmxlRERMIGFzIHN0cmluZywgY29sLm5hbWUpICkge1xuICAgICAgICAgICAgbmV3Q29sdW1ucy5wdXNoKHRoaXMuYWRkQ29sdW1uKHRhYmxlLm5hbWUsIGNvbCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhYmxlLmNvbHVtbnMuZm9yRWFjaCggY29sID0+IHtcbiAgICAgICAgc2VudGVuY2VzLnB1c2godGhpcy5kZWZDb2x1bW4oY29sKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgb25Db25mbGljdFByaW1hcnkgPSAnb24gY29uZmxpY3QgZmFpbCc7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0YWJsZS5wcmltYXJ5KSApICB7XG4gICAgICBzZW50ZW5jZXMucHVzaCAoJyBDT05TVFJBSU5UIGlkZW50aWZpY2Fkb3IgUFJJTUFSWSBLRVkgKCcgKyB0YWJsZS5wcmltYXJ5LmpvaW4oJywnKSArICcpICcgKyBvbkNvbmZsaWN0UHJpbWFyeSApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRhYmxlLnByaW1hcnkgPT09ICdzdHJpbmcnKSAgIHtcbiAgICAgIHNlbnRlbmNlcy5wdXNoICgnIENPTlNUUkFJTlQgaWRlbnRpZmljYWRvciBQUklNQVJZIEtFWSAoJyArIHRhYmxlLnByaW1hcnkgKyAnKSAnICsgb25Db25mbGljdFByaW1hcnkgKTtcbiAgICB9XG4gICAgaWYgKHRhYmxlLnVuaXF1ZXMpIHtcbiAgICAgIHRhYmxlLnVuaXF1ZXMuZm9yRWFjaCggdW5pcSA9PiB7XG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuZGVmVW5pcXVlKHVuaXEpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0YWJsZS5mb3JlaWducykge1xuICAgICAgdGFibGUuZm9yZWlnbnMuZm9yRWFjaCAoIGZvcmUgPT4ge1xuICAgICAgICBzZW50ZW5jZXMucHVzaCh0aGlzLmRlZkZvcmVpZ24oZm9yZSkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRhYmxlRERMICYmIG5ld0NvbHVtbnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwobmV3Q29sdW1ucylcbiAgICAgIC50aGVuKCAoKSA9PiB7IGNvbnNvbGUubG9nKGBUYWJsZSAke3RhYmxlLm5hbWV9IGFsdGVyZWQuYCk7IH0gKVxuICAgICAgLmNhdGNoKCAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IgKGBUYWJsZSAke3RhYmxlLm5hbWV9OiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlICR7dGFibGUubmFtZX06ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB9KTtcblxuICAgIH0gZWxzZSBpZiAoIXRhYmxlRERMKSB7XG4gICAgICBzcWwgPSAnQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJyArIHRhYmxlLm5hbWUgKyAnICgnICsgc2VudGVuY2VzLmpvaW4oJywnKSArICcpJztcbiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5KHNxbClcbiAgICAgIC50aGVuKCAoKSA9PiB7IGNvbnNvbGUubG9nKGBUYWJsZSAke3RhYmxlLm5hbWV9IGNyZWF0ZWQuYCk7IH0pXG4gICAgICAuY2F0Y2goIChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvciAoYFRhYmxlICR7dGFibGUubmFtZX06ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgJHt0YWJsZS5uYW1lfTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbiggKCkgPT4geyBjb25zb2xlLmxvZyhgVGFibGUgJHt0YWJsZS5uYW1lfSBpbml0aWFsaXplZC5gKTsgfSk7XG4gICAgfVxuICB9XG5cblxuICBjcmVhdGVWaWV3KHZpZXc6IERCVmlldyk6IFByb21pc2U8YW55PiB7XG4gICAgbGV0IHNxbDogc3RyaW5nO1xuXG4gICAgc3FsID0gJ0NSRUFURSBWSUVXIElGIE5PVCBFWElTVFMgJyArIHZpZXcubmFtZVxuICAgICAgKyAnIEFTICcgKyB2aWV3LnNxbDtcblxuICAgIHJldHVybiB0aGlzLnF1ZXJ5KHNxbCk7XG5cbiAgfVxuXG4gIGdldFNjaGVtYVRhYmxlKHRhYmxlTmFtZTogc3RyaW5nKTogREJUYWJsZSB7XG4gICAgbGV0IHJlczogREJUYWJsZTtcblxuICAgIHRoaXMuc2NoZW1hLnRhYmxlcy5mb3JFYWNoKCB0YWJsZSA9PiB7XG4gICAgICBpZiAodGFibGUubmFtZSA9PT0gdGFibGVOYW1lKSB7XG4gICAgICAgIHJlcyA9IHRhYmxlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXM7XG5cbiAgfVxuXG4gIGdldFVuaXF1ZXNUYWJsZSh0YWJsZTogREJUYWJsZSk6IG9iamVjdCB7XG4gICAgbGV0IHJlczoge307XG4gICAgdGFibGUudW5pcXVlcy5mb3JFYWNoKHVuaXEgPT4ge1xuICAgICAgcmVzW3VuaXEubmFtZV0gPSB1bmlxO1xuICAgIH0pO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBxdWVyeShxdWVyeTogc3RyaW5nLCBiaW5kaW5nczogYW55W109IFtdKTogUHJvbWlzZTxTcWxSZXN1bHRTZXQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHF1ZXJ5LmluZGV4T2YoJ3NlbGVjdCcpID09PSAwKSB7XG4gICAgICAgIHRoaXMuZGIucmVhZFRyYW5zYWN0aW9uKCh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24pID0+IHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwocXVlcnksIGJpbmRpbmdzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgIH0sICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIGVycm9yOiBTcWxFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgKGVycjogU3FsRXJyb3IpID0+IHJlamVjdChlcnIpICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRiLnRyYW5zYWN0aW9uKCh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24pID0+IHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwocXVlcnksIGJpbmRpbmdzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgIH0sICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIGVycm9yOiBTcWxFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgKGVycjogU3FsRXJyb3IpID0+IHJlamVjdChlcnIpICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBDb3VudChxdWVyeTogc3RyaW5nLCBiaW5kaW5nczogYW55W109IFtdKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeShxdWVyeSwgYmluZGluZ3MpLnRoZW4ocm93cyA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd3NDb3VudChyb3dzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGluc2VydCh0YWJsZTogc3RyaW5nLCBiaW5kaW5nczoge30pOiBQcm9taXNlPFNxbFJlc3VsdFNldD4ge1xuICAgIGxldCBzcWwgPSAnJywgc3FsQmluZHMgPSBbXSwgc3FsS2V5cyA9IFtdLCBzcWxWYWx1ZXMgPSBbXSA7XG5cbiAgICBzcWwgPSBzcWwgKyAnaW5zZXJ0IGludG8gJyArIHRhYmxlICsgJyAnO1xuXG4gICAgZm9yIChjb25zdCBpbmRleCBpbiBiaW5kaW5ncykge1xuICAgICAgIGlmIChiaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eShpbmRleCkpIHtcbiAgICAgICAgICAgIHNxbEtleXMucHVzaChpbmRleCk7XG4gICAgICAgICAgICBzcWxWYWx1ZXMucHVzaChiaW5kaW5nc1tpbmRleF0pO1xuICAgICAgICAgICAgc3FsQmluZHMucHVzaCgnPycpO1xuICAgICAgIH1cbiAgICB9XG5cbiAgICBzcWwgPSBzcWwgKyAnKCcgKyBzcWxLZXlzLmpvaW4oJywnKSArICcpIHZhbHVlcyAoJyArIHNxbEJpbmRzLmpvaW4oJywnKSArICcpJztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYi50cmFuc2FjdGlvbih0cmFuc2FjdGlvbiA9PiB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uZXhlY3V0ZVNxbChzcWwsIHNxbFZhbHVlcywgKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbiwgcmVzdWx0OiBTcWxSZXN1bHRTZXQpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgIH0sICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIGVycm9yOiBTcWxFcnJvcikgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGUodGFibGU6IHN0cmluZywgYmluZGluZ3M6IHt9LCB3aGVyZToge30pOiBQcm9taXNlPFNxbFJlc3VsdFNldD4ge1xuICAgIGxldCBzcWwgPSAnJywgc3FsQmluZHMgPSBbXSwgc3FsS2V5cyA9W10sIHNxbFZhbHVlcyA9IFtdIDtcblxuICAgIHNxbCA9IHNxbCArICd1cGRhdGUgJyArIHRhYmxlICsgJyBzZXQgJztcblxuICAgIGZvciAobGV0IGluZGV4IGluIGJpbmRpbmdzKSB7XG4gICAgICAgaWYgKGJpbmRpbmdzLmhhc093blByb3BlcnR5KGluZGV4KSkge1xuICAgICAgICAgICAgbGV0IG5ld09iaiA9IGJpbmRpbmdzW2luZGV4XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmV3T2JqID09PSAnb2JqZWN0JyAmJiBuZXdPYmogIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzcWxWYWx1ZXMucHVzaChuZXdPYmoudmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChuZXdPYmouaWZudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNxbEJpbmRzLnB1c2goaW5kZXggKyAnID0gaWZudWxsKCAnICsgaW5kZXggKyAnLDApICsgPycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3T2JqLm9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHNxbEJpbmRzLnB1c2goaW5kZXggKyAnID0gJyArIGluZGV4ICsgbmV3T2JqLm9wZXJhdG9yICsgJyA/Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3FsQmluZHMucHVzaChpbmRleCArICcgPSA/Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNxbEJpbmRzLnB1c2goaW5kZXggKyAnID0gPycpO1xuICAgICAgICAgICAgICAgIHNxbFZhbHVlcy5wdXNoKGJpbmRpbmdzW2luZGV4XSk7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaW5kZXggaW4gd2hlcmUpIHtcbiAgICAgICBpZiAod2hlcmUuaGFzT3duUHJvcGVydHkoaW5kZXgpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHdoZXJlW2luZGV4XSA9PT0gJ29iamVjdCcgICYmIHdoZXJlW2luZGV4XSAhPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgc3FsS2V5cy5wdXNoKGluZGV4ICsgJyAnICsgd2hlcmVbaW5kZXhdLm9wZXJhdG9yICsgJyA/Jyk7XG4gICAgICAgICAgICAgICAgc3FsVmFsdWVzLnB1c2god2hlcmVbaW5kZXhdLnZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3FsS2V5cy5wdXNoKGluZGV4ICsgJyA9ID8nKTtcbiAgICAgICAgICAgICAgICBzcWxWYWx1ZXMucHVzaCh3aGVyZVtpbmRleF0pO1xuICAgICAgICAgICAgfVxuICAgICAgIH1cbiAgICB9XG5cbiAgICBzcWwgPSBzcWwgKyBzcWxCaW5kcy5qb2luKCcsJykgKyAnIHdoZXJlICcgKyBzcWxLZXlzLmpvaW4oJyBhbmQgJyk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGIudHJhbnNhY3Rpb24odHJhbnNhY3Rpb24gPT4ge1xuICAgICAgICB0cmFuc2FjdGlvbi5leGVjdXRlU3FsKHNxbCwgc3FsVmFsdWVzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCBlcnJvcjogU3FsRXJyb3IpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBkcm9wVGFibGUgKHRhYmxlczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgY29udCA9IDE7XG5cbiAgICBjb250ID0gdGFibGVzLmxlbmd0aDtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGFibGVzLnNvbWUoIHRhYmxlID0+IHtcbiAgICAgICAgaWYgKGNvbnQgIT09IDApIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5KCdEUk9QIFRBQkxFICcgKyB0YWJsZSlcbiAgICAgICAgICAudGhlbiggKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29udCA9PT0gMSApIHsgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICB9IGVsc2UgeyBjb250LS07IH1cbiAgICAgICAgICB9LCBlcnIgPT4ge1xuICAgICAgICAgICAgY29udCA9IDA7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSlcbiAgfVxuXG4gIGZldGNoQWxsKHJlc3VsdDogU3FsUmVzdWx0U2V0KTogb2JqZWN0W10ge1xuICAgIGxldCBvdXRwdXQgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0LnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb3V0cHV0LnB1c2gocmVzdWx0LnJvd3MuaXRlbShpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIGZldGNoKHJlc3VsdDogU3FsUmVzdWx0U2V0KTogb2JqZWN0IHtcbiAgICAgIGxldCBvYmpldG8gPSB1bmRlZmluZWQsIG5ld09iaj0gdW5kZWZpbmVkO1xuICAgICAgaWYgKHJlc3VsdC5yb3dzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgIG9iamV0byA9IHJlc3VsdC5yb3dzLml0ZW0oMCk7XG4gICAgICAgICAgbmV3T2JqID0ge307XG4gICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iamV0byk7XG4gICAgICAgICAgZm9yIChsZXQga2V5IGluIGtleXMpIHtcbiAgICAgICAgICAgICAgbmV3T2JqW2tleXNba2V5XV0gPSBvYmpldG9ba2V5c1trZXldXTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3T2JqO1xuICB9XG5cblxuICByb3dzQ291bnQocmVzdWx0OiBTcWxSZXN1bHRTZXQpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHJlc3VsdC5yb3dzLmxlbmd0aDtcbiAgfVxuXG4gIHRhYmxlRXhpc3RzKHRhYmxlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgnc2VsZWN0ICBzcWwgZnJvbSBzcWxpdGVfbWFzdGVyICcgK1xuICAgICAgICAnd2hlcmUgdHlwZT1cXCd0YWJsZVxcJyBhbmQgbmFtZT1cXCcnICsgdGFibGUgKyAnXFwnJylcbiAgICAudGhlbihyZXN1bHQgPT4gICh0aGlzLnJvd3NDb3VudChyZXN1bHQpID09PSAxKSApO1xuICB9ICBcblxuICBjb2x1bW5FeGlzdHModGFibGU6IHN0cmluZywgY29sdW1uOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVFeGlzdHModGFibGUpXG4gICAgICAudGhlbigodGFibGVEREwpID0+IHtcbiAgICAgICAgaWYgKHRhYmxlRERMKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbkV4aXN0cygodGFibGVEREwgYXMgc3RyaW5nKSwgY29sdW1uKTtcbiAgICAgICAgfSBlbHNlIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICB9KTtcbiAgfVxuXG4vKiBQcml2YXRlICovXG5cbiAgcHJpdmF0ZSBkZWZDb2x1bW4oY29sOiBEQkNvbHVtbik6IHN0cmluZyB7XG4gICAgbGV0IGNvbFNxbDogc3RyaW5nO1xuXG4gICAgY29sU3FsID0gY29sLm5hbWUgKyAnICcgKyBjb2wudHlwZTtcbiAgICBpZiAoIWNvbC5pc051bGxhYmxlKSB7XG4gICAgICBjb2xTcWwgKz0gICcgTk9UIE5VTEwgJztcbiAgICB9XG4gICAgaWYgKGNvbC5kZWZhdWx0KSB7XG4gICAgICBjb2xTcWwgKz0gJyBERUZBVUxUICcgKyBjb2wuZGVmYXVsdCArICcgJztcbiAgICB9XG4gICAgaWYgKGNvbC50eXBlID09PSAndGV4dCcgJiYgY29sLmxlbmd0aCkge1xuICAgICAgY29sU3FsICs9IGAgQ09OU1RSQUlOVCAke2NvbC5uYW1lfV9sZW5ndGggQ0hFQ0sgKCBgO1xuICAgICAgaWYgKGNvbC5pc051bGxhYmxlKSB7XG4gICAgICAgIGNvbFNxbCArPSBgJHtjb2wubmFtZX0gaXMgbnVsbCBPUiBgO1xuICAgICAgfVxuICAgICAgY29sU3FsICs9IGBsZW5ndGgoJHtjb2wubmFtZX0pIDw9ICR7Y29sLmxlbmd0aH0gKWA7XG5cbiAgICB9XG5cbiAgICByZXR1cm4gY29sU3FsO1xuXG4gIH1cblxuICBwcml2YXRlIGRlZlVuaXF1ZSh1bmlxdWU6IERCVW5pcXVlKTogc3RyaW5nIHtcbiAgICBsZXQgdW5pcVNxbDogc3RyaW5nO1xuXG4gICAgLy8gZGVwZW5kZSBkZWwgZW50b3JubywgcHJvZHVjY2nDs24gbyBkZXNhcnJvbGxvXG4gICAgY29uc3Qgb25Db25mbGljdFVuaXF1ZSA9ICdvbiBjb25mbGljdCByZXBsYWNlJztcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHVuaXF1ZS5maWVsZHMpICkgIHtcbiAgICAgIHVuaXFTcWwgPSBgIENPTlNUUkFJTlQgJHt1bmlxdWUubmFtZX0gVU5JUVVFICggJHt1bmlxdWUuZmllbGRzLmpvaW4oJywnKX0gKSAke29uQ29uZmxpY3RVbmlxdWV9IGA7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdW5pcXVlLmZpZWxkcyA9PT0gJ3N0cmluZycpICAge1xuICAgICAgdW5pcVNxbCA9IGAgQ09OU1RSQUlOVCAke3VuaXF1ZS5uYW1lfSBVTklRVUUgKCAke3VuaXF1ZS5maWVsZHN9ICkgJHtvbkNvbmZsaWN0VW5pcXVlfSBgO1xuICAgIH1cblxuICAgIHJldHVybiB1bmlxU3FsO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZGb3JlaWduKGZvcmU6IERCRm9yZWlnbik6IHN0cmluZyB7XG4gICAgbGV0IGZvcmVTcWw6IHN0cmluZztcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGZvcmUuZm9yZWlnbktleSkgKSAge1xuICAgICAgZm9yZVNxbCA9IGAgRk9SRUlHTiBLRVkgKCAgJHtmb3JlLmZvcmVpZ25LZXkuam9pbignLCcpfSApIGA7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmb3JlLmZvcmVpZ25LZXkgPT09ICdzdHJpbmcnKSAgIHtcbiAgICAgIGZvcmVTcWwgPSBgIEZPUkVJR04gS0VZICggICR7Zm9yZS5mb3JlaWduS2V5fSApIGA7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9yZS5wcmltYXJ5S2V5KSApICB7XG4gICAgICBmb3JlU3FsID0gYCBSRUZFUkVOQ0VTICR7Zm9yZS5yZWZlcmVuY2VUYWJsZX0gKCAgJHtmb3JlLnByaW1hcnlLZXkuam9pbignLCcpfSApIGA7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmb3JlLnByaW1hcnlLZXkgPT09ICdzdHJpbmcnKSAgIHtcbiAgICAgIGZvcmVTcWwgPSBgIFJFRkVSRU5DRVMgJHtmb3JlLnJlZmVyZW5jZVRhYmxlfSAoICAke2ZvcmUucHJpbWFyeUtleX0gKSBgO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JlU3FsO1xuICB9XG5cbiAgcHJpdmF0ZSBfdGFibGVFeGlzdHModGFibGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5KCdzZWxlY3QgIHNxbCBmcm9tIHNxbGl0ZV9tYXN0ZXIgJyArXG4gICAgICAgICd3aGVyZSB0eXBlPVxcJ3RhYmxlXFwnIGFuZCBuYW1lPVxcJycgKyB0YWJsZSArICdcXCcnKVxuICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIGlmICh0aGlzLnJvd3NDb3VudChyZXN1bHQpID09PSAxKSB7IHJldHVybiAodGhpcy5mZXRjaChyZXN1bHQpIGFzIGFueSkuc3FsIGFzIHN0cmluZzsgfSBlbHNlIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9jb2x1bW5FeGlzdHModGFibGVEREw6IHN0cmluZywgY29sdW1uOiBzdHJpbmcpOiBib29sZWFuIHtcblxuICAgIGlmICh0YWJsZURETC5pbmRleE9mKGNvbHVtbikgPT09IC0xKSB7IHJldHVybiBmYWxzZTsgfSBlbHNlIHsgIHJldHVybiB0cnVlOyB9XG4gIH1cblxuICBwcml2YXRlIGFkZENvbHVtbih0YWJsZTogc3RyaW5nLCBjb2w6IERCQ29sdW1uKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBjb2xTcWwgPSB0aGlzLmRlZkNvbHVtbihjb2wpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gJ2FsdGVyIFRBQkxFICcgKyB0YWJsZSArICcgYWRkIENPTFVNTiAnICsgY29sU3FsO1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5KHF1ZXJ5KTtcbiAgfVxuXG59XG5cblxuXG5leHBvcnQgY29uc3QgREJfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPERiQ29uZmlnPignZGJXcmFwcGVyQ29uZmlnJyk7XG5leHBvcnQgY29uc3QgREJfU0NIRU1BID0gbmV3IEluamVjdGlvblRva2VuPERCU2NoZW1hPignZGJXcmFwcGVyU2NoZW1hJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0RGJDb25maWcoKTogRGJDb25maWcge1xuICByZXR1cm4ge1xuICAgIGRiTmFtZTogJ2RiLnNxbGl0ZScsXG4gICAgbG9jYXRpb246ICdkZWZhdWx0JyxcbiAgICBpb3NEYXRhYmFzZUxvY2F0aW9uOiAnTGlicmFyeSdcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVEYldyYXBwZXIoZGJDb25maWc6IERiQ29uZmlnLCBkYlNjaGVtYT86IERCU2NoZW1hKTogRGJXcmFwcGVyU2VydmljZSB7XG4gIGNvbnN0IGNvbmZpZyA9ICEhZGJDb25maWcgPyBkYkNvbmZpZyA6IGdldERlZmF1bHREYkNvbmZpZygpO1xuICByZXR1cm4gbmV3IERiV3JhcHBlclNlcnZpY2UoY29uZmlnLCBkYlNjaGVtYSk7XG59XG5cblxuXG4iXX0=
|