db-wrapper 0.0.7 → 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.
@@ -1,895 +1,436 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import * as tslib_1 from "tslib";
6
- import { InjectionToken } from '@angular/core';
7
- import { WindowService } from './window.service';
8
- var DbWrapperService = /** @class */ (function () {
9
- function DbWrapperService(dbConfig, dbSchema) {
10
- var _this = this;
11
- this._dbName = dbConfig.dbName;
12
- this._location = dbConfig.location || 'default';
13
- this._iosDatabaseLocation = dbConfig.iosDatabaseLocation || 'Library';
14
- /** @type {?} */
15
- var window = (new WindowService()).nativeWindow;
16
- if (dbSchema) {
17
- this.schema = dbSchema;
18
- }
19
- this._readyPromise = new Promise((/**
20
- * @param {?} resolve
21
- * @param {?} reject
22
- * @return {?}
23
- */
24
- function (resolve, reject) {
25
- if (typeof window.cordova === 'undefined') {
26
- setTimeout((/**
27
- * @return {?}
28
- */
29
- function () {
30
- _this.init(dbSchema).then((/**
31
- * @return {?}
32
- */
33
- function () {
34
- resolve();
35
- }))
36
- .catch((/**
37
- * @param {?} err
38
- * @return {?}
39
- */
40
- function (err) {
41
- reject(err);
42
- }));
43
- }), 500);
44
- }
45
- else {
46
- document.addEventListener('deviceready', (/**
47
- * @return {?}
48
- */
49
- function () {
50
- console.log('dbWrapper: device ready.');
51
- _this.initDevice(dbSchema).then((/**
52
- * @return {?}
53
- */
54
- function () { return resolve(); })).catch((/**
55
- * @param {?} err
56
- * @return {?}
57
- */
58
- function (err) { return reject(err); }));
59
- }));
60
- }
61
- }));
62
- }
63
- /**
64
- * @return {?}
65
- */
66
- DbWrapperService.prototype.ready = /**
67
- * @return {?}
68
- */
69
- function () {
70
- return this._readyPromise;
71
- };
72
- /**
73
- * @param {?} dbSchema
74
- * @return {?}
75
- */
76
- DbWrapperService.prototype.initDevice = /**
77
- * @param {?} dbSchema
78
- * @return {?}
79
- */
80
- function (dbSchema) {
81
- var _this = this;
82
- /** @type {?} */
83
- var window = (new WindowService()).nativeWindow;
84
- return new Promise((/**
85
- * @param {?} resolve
86
- * @param {?} reject
87
- * @return {?}
88
- */
89
- function (resolve, reject) {
90
- _this.db = window.sqlitePlugin.openDatabase({
91
- name: _this._dbName,
92
- location: _this._location,
93
- androidLockWorkaround: 1
94
- });
95
- if (dbSchema) {
96
- _this.generate(dbSchema).catch((/**
97
- * @param {?} err
98
- * @return {?}
99
- */
100
- function (err) {
101
- reject(err);
102
- })).then((/**
103
- * @return {?}
104
- */
105
- function () { resolve(); }));
106
- }
107
- else {
108
- resolve();
109
- }
110
- }));
111
- };
112
- /**
113
- * @param {?} dbSchema
114
- * @return {?}
115
- */
116
- DbWrapperService.prototype.init = /**
117
- * @param {?} dbSchema
118
- * @return {?}
119
- */
120
- function (dbSchema) {
121
- var _this = this;
122
- /** @type {?} */
123
- var window = (new WindowService()).nativeWindow;
124
- return new Promise((/**
125
- * @param {?} resolve
126
- * @param {?} reject
127
- * @return {?}
128
- */
129
- function (resolve, reject) {
130
- _this.db = window.openDatabase(_this._dbName, '1.0', 'database', -1);
131
- if (dbSchema) {
132
- _this.generate(dbSchema).catch((/**
133
- * @param {?} err
134
- * @return {?}
135
- */
136
- function (err) {
137
- reject(err);
138
- })).then((/**
139
- * @return {?}
140
- */
141
- function () {
142
- resolve();
143
- }));
144
- }
145
- else {
146
- resolve();
147
- }
148
- }));
149
- };
150
- /**
151
- * @param {?} schema
152
- * @return {?}
153
- */
154
- DbWrapperService.prototype.generate = /**
155
- * @param {?} schema
156
- * @return {?}
157
- */
158
- function (schema) {
159
- var _this = this;
160
- /** @type {?} */
161
- var sentences = [];
162
- this.schema = schema;
163
- if (schema.tables) {
164
- schema.tables.forEach((/**
165
- * @param {?} table
166
- * @return {?}
167
- */
168
- function (table) {
169
- sentences.push(_this.createTable(table));
170
- }));
171
- }
172
- if (schema.views) {
173
- schema.views.forEach((/**
174
- * @param {?} view
175
- * @return {?}
176
- */
177
- function (view) {
178
- sentences.push(_this.createView(view));
179
- }));
180
- }
181
- if (sentences.length === 0) {
182
- throw new Error('Esquema de la base de datos vacia.');
183
- }
184
- return Promise.all(sentences);
185
- };
186
- /**
187
- * @param {?} table
188
- * @return {?}
189
- */
190
- DbWrapperService.prototype.createTable = /**
191
- * @param {?} table
192
- * @return {?}
193
- */
194
- function (table) {
195
- return tslib_1.__awaiter(this, void 0, void 0, function () {
196
- var sql, onConflictPrimary, sentences, newColumns, tableDDL;
197
- var _this = this;
198
- return tslib_1.__generator(this, function (_a) {
199
- switch (_a.label) {
200
- case 0:
201
- sql = '';
202
- sentences = [];
203
- newColumns = [];
204
- return [4 /*yield*/, this.tableExists(table.name)];
205
- case 1:
206
- tableDDL = _a.sent();
207
- if (tableDDL) {
208
- table.columns.forEach((/**
209
- * @param {?} col
210
- * @return {?}
211
- */
212
- function (col) {
213
- if (!_this.columnExists((/** @type {?} */ (tableDDL)), col.name)) {
214
- newColumns.push(_this.addColumn(table.name, col));
215
- }
216
- }));
217
- }
218
- else {
219
- table.columns.forEach((/**
220
- * @param {?} col
221
- * @return {?}
222
- */
223
- function (col) {
224
- sentences.push(_this.defColumn(col));
225
- }));
226
- }
227
- onConflictPrimary = 'on conflict fail';
228
- if (Array.isArray(table.primary)) {
229
- sentences.push(' CONSTRAINT identificador PRIMARY KEY (' + table.primary.join(',') + ') ' + onConflictPrimary);
230
- }
231
- if (typeof table.primary === 'string') {
232
- sentences.push(' CONSTRAINT identificador PRIMARY KEY (' + table.primary + ') ' + onConflictPrimary);
233
- }
234
- if (table.uniques) {
235
- table.uniques.forEach((/**
236
- * @param {?} uniq
237
- * @return {?}
238
- */
239
- function (uniq) {
240
- sentences.push(_this.defUnique(uniq));
241
- }));
242
- }
243
- if (table.foreigns) {
244
- table.foreigns.forEach((/**
245
- * @param {?} fore
246
- * @return {?}
247
- */
248
- function (fore) {
249
- sentences.push(_this.defForeign(fore));
250
- }));
251
- }
252
- if (tableDDL && newColumns.length !== 0) {
253
- return [2 /*return*/, Promise.all(newColumns)
254
- .then((/**
255
- * @return {?}
256
- */
257
- function () { console.log("Table " + table.name + " altered."); }))
258
- .catch((/**
259
- * @param {?} err
260
- * @return {?}
261
- */
262
- function (err) {
263
- console.error("Table " + table.name + ": " + err.message);
264
- throw new Error("Table " + table.name + ": " + err.message);
265
- }))];
266
- }
267
- else if (!tableDDL) {
268
- sql = 'CREATE TABLE IF NOT EXISTS ' + table.name + ' (' + sentences.join(',') + ')';
269
- return [2 /*return*/, this.query(sql)
270
- .then((/**
271
- * @return {?}
272
- */
273
- function () { console.log("Table " + table.name + " created."); }))
274
- .catch((/**
275
- * @param {?} err
276
- * @return {?}
277
- */
278
- function (err) {
279
- console.error("Table " + table.name + ": " + err.message);
280
- throw new Error("Table " + table.name + ": " + err.message);
281
- }))];
282
- }
283
- else {
284
- return [2 /*return*/, Promise.resolve().then((/**
285
- * @return {?}
286
- */
287
- function () { console.log("Table " + table.name + " initialized."); }))];
288
- }
289
- return [2 /*return*/];
290
- }
291
- });
292
- });
293
- };
294
- /**
295
- * @param {?} view
296
- * @return {?}
297
- */
298
- DbWrapperService.prototype.createView = /**
299
- * @param {?} view
300
- * @return {?}
301
- */
302
- function (view) {
303
- /** @type {?} */
304
- var sql;
305
- sql = 'CREATE VIEW IF NOT EXISTS ' + view.name
306
- + ' AS ' + view.sql;
307
- return this.query(sql);
308
- };
309
- /**
310
- * @param {?} tableName
311
- * @return {?}
312
- */
313
- DbWrapperService.prototype.getSchemaTable = /**
314
- * @param {?} tableName
315
- * @return {?}
316
- */
317
- function (tableName) {
318
- /** @type {?} */
319
- var res;
320
- this.schema.tables.forEach((/**
321
- * @param {?} table
322
- * @return {?}
323
- */
324
- function (table) {
325
- if (table.name === tableName) {
326
- res = table;
327
- }
328
- }));
329
- return res;
330
- };
331
- /**
332
- * @param {?} table
333
- * @return {?}
334
- */
335
- DbWrapperService.prototype.getUniquesTable = /**
336
- * @param {?} table
337
- * @return {?}
338
- */
339
- function (table) {
340
- /** @type {?} */
341
- var res;
342
- table.uniques.forEach((/**
343
- * @param {?} uniq
344
- * @return {?}
345
- */
346
- function (uniq) {
347
- res[uniq.name] = uniq;
348
- }));
349
- return res;
350
- };
351
- /**
352
- * @param {?} query
353
- * @param {?=} bindings
354
- * @return {?}
355
- */
356
- DbWrapperService.prototype.query = /**
357
- * @param {?} query
358
- * @param {?=} bindings
359
- * @return {?}
360
- */
361
- function (query, bindings) {
362
- var _this = this;
363
- if (bindings === void 0) { bindings = []; }
364
- return new Promise((/**
365
- * @param {?} resolve
366
- * @param {?} reject
367
- * @return {?}
368
- */
369
- function (resolve, reject) {
370
- if (query.indexOf('select') === 0) {
371
- _this.db.readTransaction((/**
372
- * @param {?} transaction
373
- * @return {?}
374
- */
375
- function (transaction) {
376
- transaction.executeSql(query, bindings, (/**
377
- * @param {?} transaction
378
- * @param {?} result
379
- * @return {?}
380
- */
381
- function (transaction, result) {
382
- resolve(result);
383
- }), (/**
384
- * @param {?} transaction
385
- * @param {?} error
386
- * @return {?}
387
- */
388
- function (transaction, error) {
389
- reject(error);
390
- }));
391
- }), (/**
392
- * @param {?} err
393
- * @return {?}
394
- */
395
- function (err) { return reject(err); }));
396
- }
397
- else {
398
- _this.db.transaction((/**
399
- * @param {?} transaction
400
- * @return {?}
401
- */
402
- function (transaction) {
403
- transaction.executeSql(query, bindings, (/**
404
- * @param {?} transaction
405
- * @param {?} result
406
- * @return {?}
407
- */
408
- function (transaction, result) {
409
- resolve(result);
410
- }), (/**
411
- * @param {?} transaction
412
- * @param {?} error
413
- * @return {?}
414
- */
415
- function (transaction, error) {
416
- reject(error);
417
- }));
418
- }), (/**
419
- * @param {?} err
420
- * @return {?}
421
- */
422
- function (err) { return reject(err); }));
423
- }
424
- }));
425
- };
426
- /**
427
- * @param {?} query
428
- * @param {?=} bindings
429
- * @return {?}
430
- */
431
- DbWrapperService.prototype.Count = /**
432
- * @param {?} query
433
- * @param {?=} bindings
434
- * @return {?}
435
- */
436
- function (query, bindings) {
437
- var _this = this;
438
- if (bindings === void 0) { bindings = []; }
439
- return this.query(query, bindings).then((/**
440
- * @param {?} rows
441
- * @return {?}
442
- */
443
- function (rows) {
444
- return _this.rowsCount(rows);
445
- }));
446
- };
447
- /**
448
- * @param {?} table
449
- * @param {?} bindings
450
- * @return {?}
451
- */
452
- DbWrapperService.prototype.insert = /**
453
- * @param {?} table
454
- * @param {?} bindings
455
- * @return {?}
456
- */
457
- function (table, bindings) {
458
- var _this = this;
459
- /** @type {?} */
460
- var sql = '';
461
- /** @type {?} */
462
- var sqlBinds = [];
463
- /** @type {?} */
464
- var sqlKeys = [];
465
- /** @type {?} */
466
- var sqlValues = [];
467
- sql = sql + 'insert into ' + table + ' ';
468
- for (var index in bindings) {
469
- if (bindings.hasOwnProperty(index)) {
470
- sqlKeys.push(index);
471
- sqlValues.push(bindings[index]);
472
- sqlBinds.push('?');
473
- }
474
- }
475
- sql = sql + '(' + sqlKeys.join(',') + ') values (' + sqlBinds.join(',') + ')';
476
- return new Promise((/**
477
- * @param {?} resolve
478
- * @param {?} reject
479
- * @return {?}
480
- */
481
- function (resolve, reject) {
482
- _this.db.transaction((/**
483
- * @param {?} transaction
484
- * @return {?}
485
- */
486
- function (transaction) {
487
- transaction.executeSql(sql, sqlValues, (/**
488
- * @param {?} transaction
489
- * @param {?} result
490
- * @return {?}
491
- */
492
- function (transaction, result) {
493
- resolve(result);
494
- }), (/**
495
- * @param {?} transaction
496
- * @param {?} error
497
- * @return {?}
498
- */
499
- function (transaction, error) {
500
- reject(error);
501
- }));
502
- }));
503
- }));
504
- };
505
- /**
506
- * @param {?} table
507
- * @param {?} bindings
508
- * @param {?} where
509
- * @return {?}
510
- */
511
- DbWrapperService.prototype.update = /**
512
- * @param {?} table
513
- * @param {?} bindings
514
- * @param {?} where
515
- * @return {?}
516
- */
517
- function (table, bindings, where) {
518
- var _this = this;
519
- /** @type {?} */
520
- var sql = '';
521
- /** @type {?} */
522
- var sqlBinds = [];
523
- /** @type {?} */
524
- var sqlKeys = [];
525
- /** @type {?} */
526
- var sqlValues = [];
527
- sql = sql + 'update ' + table + ' set ';
528
- for (var index in bindings) {
529
- if (bindings.hasOwnProperty(index)) {
530
- /** @type {?} */
531
- var newObj = bindings[index];
532
- if (typeof newObj === 'object' && newObj !== null) {
533
- sqlValues.push(newObj.value);
534
- if (newObj.ifnull) {
535
- sqlBinds.push(index + ' = ifnull( ' + index + ',0) + ?');
536
- }
537
- else if (newObj.operator) {
538
- sqlBinds.push(index + ' = ' + index + newObj.operator + ' ?');
539
- }
540
- else {
541
- sqlBinds.push(index + ' = ?');
542
- }
543
- }
544
- else {
545
- sqlBinds.push(index + ' = ?');
546
- sqlValues.push(bindings[index]);
547
- }
548
- }
549
- }
550
- for (var index in where) {
551
- if (where.hasOwnProperty(index)) {
552
- if (typeof where[index] === 'object' && where[index] !== null) {
553
- sqlKeys.push(index + ' ' + where[index].operator + ' ?');
554
- sqlValues.push(where[index].value);
555
- }
556
- else {
557
- sqlKeys.push(index + ' = ?');
558
- sqlValues.push(where[index]);
559
- }
560
- }
561
- }
562
- sql = sql + sqlBinds.join(',') + ' where ' + sqlKeys.join(' and ');
563
- return new Promise((/**
564
- * @param {?} resolve
565
- * @param {?} reject
566
- * @return {?}
567
- */
568
- function (resolve, reject) {
569
- _this.db.transaction((/**
570
- * @param {?} transaction
571
- * @return {?}
572
- */
573
- function (transaction) {
574
- transaction.executeSql(sql, sqlValues, (/**
575
- * @param {?} transaction
576
- * @param {?} result
577
- * @return {?}
578
- */
579
- function (transaction, result) {
580
- resolve(result);
581
- }), (/**
582
- * @param {?} transaction
583
- * @param {?} error
584
- * @return {?}
585
- */
586
- function (transaction, error) {
587
- reject(error);
588
- }));
589
- }));
590
- }));
591
- };
592
- /**
593
- * @param {?} tables
594
- * @return {?}
595
- */
596
- DbWrapperService.prototype.dropTable = /**
597
- * @param {?} tables
598
- * @return {?}
599
- */
600
- function (tables) {
601
- var _this = this;
602
- /** @type {?} */
603
- var cont = 1;
604
- cont = tables.length;
605
- return new Promise((/**
606
- * @param {?} resolve
607
- * @param {?} reject
608
- * @return {?}
609
- */
610
- function (resolve, reject) {
611
- tables.some((/**
612
- * @param {?} table
613
- * @return {?}
614
- */
615
- function (table) {
616
- if (cont !== 0) {
617
- _this.query('DROP TABLE ' + table)
618
- .then((/**
619
- * @return {?}
620
- */
621
- function () {
622
- if (cont === 1) {
623
- resolve();
624
- }
625
- else {
626
- cont--;
627
- }
628
- }), (/**
629
- * @param {?} err
630
- * @return {?}
631
- */
632
- function (err) {
633
- cont = 0;
634
- reject(err);
635
- return true;
636
- }));
637
- return false;
638
- }
639
- }));
640
- }));
641
- };
642
- /**
643
- * @param {?} result
644
- * @return {?}
645
- */
646
- DbWrapperService.prototype.fetchAll = /**
647
- * @param {?} result
648
- * @return {?}
649
- */
650
- function (result) {
651
- /** @type {?} */
652
- var output = [];
653
- for (var i = 0; i < result.rows.length; i++) {
654
- output.push(result.rows.item(i));
655
- }
656
- return output;
657
- };
658
- /**
659
- * @param {?} result
660
- * @return {?}
661
- */
662
- DbWrapperService.prototype.fetch = /**
663
- * @param {?} result
664
- * @return {?}
665
- */
666
- function (result) {
667
- /** @type {?} */
668
- var objeto = undefined;
669
- /** @type {?} */
670
- var newObj = undefined;
671
- if (result.rows.length !== 0) {
672
- objeto = result.rows.item(0);
673
- newObj = {};
674
- /** @type {?} */
675
- var keys = Object.keys(objeto);
676
- for (var key in keys) {
677
- newObj[keys[key]] = objeto[keys[key]];
678
- }
679
- }
680
- return newObj;
681
- };
682
- /**
683
- * @param {?} result
684
- * @return {?}
685
- */
686
- DbWrapperService.prototype.rowsCount = /**
687
- * @param {?} result
688
- * @return {?}
689
- */
690
- function (result) {
691
- return result.rows.length;
692
- };
693
- /* Private */
694
- /* Private */
695
- /**
696
- * @private
697
- * @param {?} col
698
- * @return {?}
699
- */
700
- DbWrapperService.prototype.defColumn = /* Private */
701
- /**
702
- * @private
703
- * @param {?} col
704
- * @return {?}
705
- */
706
- function (col) {
707
- /** @type {?} */
708
- var colSql;
709
- colSql = col.name + ' ' + col.type;
710
- if (!col.isNullable) {
711
- colSql += ' NOT NULL ';
712
- }
713
- if (col.default) {
714
- colSql += ' DEFAULT ' + col.default + ' ';
715
- }
716
- if (col.type === 'text' && col.length) {
717
- colSql += " CONSTRAINT " + col.name + "_length CHECK ( ";
718
- if (col.isNullable) {
719
- colSql += col.name + " is null OR ";
720
- }
721
- colSql += "length(" + col.name + ") <= " + col.length + " )";
722
- }
723
- return colSql;
724
- };
725
- /**
726
- * @private
727
- * @param {?} unique
728
- * @return {?}
729
- */
730
- DbWrapperService.prototype.defUnique = /**
731
- * @private
732
- * @param {?} unique
733
- * @return {?}
734
- */
735
- function (unique) {
736
- /** @type {?} */
737
- var uniqSql;
738
- // depende del entorno, producción o desarrollo
739
- /** @type {?} */
740
- var onConflictUnique = 'on conflict fail';
741
- if (Array.isArray(unique.fields)) {
742
- uniqSql = " CONSTRAINT " + unique.name + " UNIQUE ( " + unique.fields.join(',') + " ) " + onConflictUnique + " ";
743
- }
744
- if (typeof unique.fields === 'string') {
745
- uniqSql = " CONSTRAINT " + unique.name + " UNIQUE ( " + unique.fields + " ) " + onConflictUnique + " ";
746
- }
747
- return uniqSql;
748
- };
749
- /**
750
- * @private
751
- * @param {?} fore
752
- * @return {?}
753
- */
754
- DbWrapperService.prototype.defForeign = /**
755
- * @private
756
- * @param {?} fore
757
- * @return {?}
758
- */
759
- function (fore) {
760
- /** @type {?} */
761
- var foreSql;
762
- if (Array.isArray(fore.foreignKey)) {
763
- foreSql = " FOREIGN KEY ( " + fore.foreignKey.join(',') + " ) ";
764
- }
765
- if (typeof fore.foreignKey === 'string') {
766
- foreSql = " FOREIGN KEY ( " + fore.foreignKey + " ) ";
767
- }
768
- if (Array.isArray(fore.primaryKey)) {
769
- foreSql = " REFERENCES " + fore.referenceTable + " ( " + fore.primaryKey.join(',') + " ) ";
770
- }
771
- if (typeof fore.primaryKey === 'string') {
772
- foreSql = " REFERENCES " + fore.referenceTable + " ( " + fore.primaryKey + " ) ";
773
- }
774
- return foreSql;
775
- };
776
- /**
777
- * @private
778
- * @param {?} table
779
- * @return {?}
780
- */
781
- DbWrapperService.prototype.tableExists = /**
782
- * @private
783
- * @param {?} table
784
- * @return {?}
785
- */
786
- function (table) {
787
- var _this = this;
788
- return this.query('select sql from sqlite_master ' +
789
- 'where type=\'table\' and name=\'' + table + '\'')
790
- .then((/**
791
- * @param {?} result
792
- * @return {?}
793
- */
794
- function (result) {
795
- if (_this.rowsCount(result) === 1) {
796
- return (/** @type {?} */ (((/** @type {?} */ (_this.fetch(result)))).sql));
797
- }
798
- else {
799
- return false;
800
- }
801
- }));
802
- };
803
- /**
804
- * @private
805
- * @param {?} tableDDL
806
- * @param {?} column
807
- * @return {?}
808
- */
809
- DbWrapperService.prototype.columnExists = /**
810
- * @private
811
- * @param {?} tableDDL
812
- * @param {?} column
813
- * @return {?}
814
- */
815
- function (tableDDL, column) {
816
- if (tableDDL.indexOf(column) === -1) {
817
- return false;
818
- }
819
- else {
820
- return true;
821
- }
822
- };
823
- /**
824
- * @private
825
- * @param {?} table
826
- * @param {?} col
827
- * @return {?}
828
- */
829
- DbWrapperService.prototype.addColumn = /**
830
- * @private
831
- * @param {?} table
832
- * @param {?} col
833
- * @return {?}
834
- */
835
- function (table, col) {
836
- /** @type {?} */
837
- var colSql = this.defColumn(col);
838
- /** @type {?} */
839
- var query = 'alter TABLE ' + table + ' add COLUMN ' + colSql;
840
- return this.query(query);
841
- };
842
- return DbWrapperService;
843
- }());
844
- export { DbWrapperService };
845
- if (false) {
846
- /**
847
- * @type {?}
848
- * @private
849
- */
850
- DbWrapperService.prototype._dbName;
851
- /**
852
- * @type {?}
853
- * @private
854
- */
855
- DbWrapperService.prototype._location;
856
- /**
857
- * @type {?}
858
- * @private
859
- */
860
- DbWrapperService.prototype._iosDatabaseLocation;
861
- /**
862
- * @type {?}
863
- * @private
864
- */
865
- DbWrapperService.prototype._readyPromise;
866
- /** @type {?} */
867
- DbWrapperService.prototype.schema;
868
- /** @type {?} */
869
- DbWrapperService.prototype.db;
870
- }
871
- /** @type {?} */
872
- export var DB_CONFIG = new InjectionToken('dbWrapperConfig');
873
- /** @type {?} */
874
- export var DB_SCHEMA = new InjectionToken('dbWrapperSchema');
875
- /**
876
- * @return {?}
877
- */
878
- export function getDefaultDbConfig() {
879
- return {
880
- dbName: 'db.sqlite',
881
- location: 'default',
882
- iosDatabaseLocation: 'Library'
883
- };
884
- }
885
- /**
886
- * @param {?} dbConfig
887
- * @param {?=} dbSchema
888
- * @return {?}
889
- */
890
- export function provideDbWrapper(dbConfig, dbSchema) {
891
- /** @type {?} */
892
- var config = !!dbConfig ? dbConfig : getDefaultDbConfig();
893
- return new DbWrapperService(config, dbSchema);
894
- }
895
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGItd3JhcHBlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGItd3JhcHBlci8iLCJzb3VyY2VzIjpbImxpYi9kYi13cmFwcGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUlqRDtJQVFFLDBCQUFZLFFBQWtCLEVBQUUsUUFBbUI7UUFBbkQsaUJBeUJDO1FBdkJDLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDO1FBQ2hELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxRQUFRLENBQUMsbUJBQW1CLElBQUksU0FBUyxDQUFDOztZQUNoRSxNQUFNLEdBQUcsQ0FBQyxJQUFJLGFBQWEsRUFBRSxDQUFDLENBQUMsWUFBWTtRQUNqRCxJQUFJLFFBQVEsRUFBRTtZQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO1NBQUU7UUFDekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLE9BQU87Ozs7O1FBQUcsVUFBQyxPQUFPLEVBQUUsTUFBTTtZQUNqRCxJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxXQUFXLEVBQUU7Z0JBQ3pDLFVBQVU7OztnQkFBRTtvQkFDVixLQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUk7OztvQkFDdEI7d0JBQ0UsT0FBTyxFQUFFLENBQUM7b0JBQ1osQ0FBQyxFQUFFO3lCQUNGLEtBQUs7Ozs7b0JBQUcsVUFBQyxHQUFHO3dCQUNYLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDZCxDQUFDLEVBQUUsQ0FBQztnQkFDUixDQUFDLEdBQUUsR0FBRyxDQUFDLENBQUM7YUFDVDtpQkFBTTtnQkFD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Ozs7OztJQUMxQixnREFBcUM7Ozs7O0lBQ3JDLHlDQUFxQzs7SUFDckMsa0NBQWlCOztJQUNqQiw4QkFBUTs7O0FBZ2FWLE1BQU0sS0FBTyxTQUFTLEdBQUcsSUFBSSxjQUFjLENBQVcsaUJBQWlCLENBQUM7O0FBQ3hFLE1BQU0sS0FBTyxTQUFTLEdBQUcsSUFBSSxjQUFjLENBQVcsaUJBQWlCLENBQUM7Ozs7QUFFeEUsTUFBTSxVQUFVLGtCQUFrQjtJQUNoQyxPQUFPO1FBQ0wsTUFBTSxFQUFFLFdBQVc7UUFDbkIsUUFBUSxFQUFFLFNBQVM7UUFDbkIsbUJBQW1CLEVBQUUsU0FBUztLQUMvQixDQUFDO0FBQ0osQ0FBQzs7Ozs7O0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFFBQWtCLEVBQUUsUUFBbUI7O1FBQ2hFLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFO0lBQzNELE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFdpbmRvd1NlcnZpY2UgfSBmcm9tICcuL3dpbmRvdy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgREJUYWJsZSwgRGJDb25maWcsIERCU2NoZW1hLCBEQlZpZXcsXHJcbiAgREJDb2x1bW4sIERCVW5pcXVlLCBEQkZvcmVpZ24sIFNxbFRyYW5zYWN0aW9uLCBTcWxSZXN1bHRTZXQsIFNxbEVycm9yLCBEZWZhdWx0VHlwZSB9IGZyb20gJy4vZGItd3JhcHBlci5tb2RlbHMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIERiV3JhcHBlclNlcnZpY2Uge1xyXG4gIHByaXZhdGUgX2RiTmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgX2xvY2F0aW9uOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfaW9zRGF0YWJhc2VMb2NhdGlvbjogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3JlYWR5UHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcclxuICBzY2hlbWE6IERCU2NoZW1hO1xyXG4gIGRiOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGRiQ29uZmlnOiBEYkNvbmZpZywgZGJTY2hlbWE/OiBEQlNjaGVtYSkge1xyXG5cclxuICAgIHRoaXMuX2RiTmFtZSA9IGRiQ29uZmlnLmRiTmFtZTtcclxuICAgIHRoaXMuX2xvY2F0aW9uID0gZGJDb25maWcubG9jYXRpb24gfHwgJ2RlZmF1bHQnO1xyXG4gICAgdGhpcy5faW9zRGF0YWJhc2VMb2NhdGlvbiA9IGRiQ29uZmlnLmlvc0RhdGFiYXNlTG9jYXRpb24gfHwgJ0xpYnJhcnknO1xyXG4gICAgY29uc3Qgd2luZG93ID0gKG5ldyBXaW5kb3dTZXJ2aWNlKCkpLm5hdGl2ZVdpbmRvdztcclxuICAgIGlmIChkYlNjaGVtYSkgeyB0aGlzLnNjaGVtYSA9IGRiU2NoZW1hOyB9XHJcbiAgICB0aGlzLl9yZWFkeVByb21pc2UgPSBuZXcgUHJvbWlzZSAoIChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuY29yZG92YSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmluaXQoZGJTY2hlbWEpLnRoZW4gKFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9IClcclxuICAgICAgICAgICAgLmNhdGNoICggKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICB9ICk7XHJcbiAgICAgICAgfSwgNTAwKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkZXZpY2VyZWFkeScsICgpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdkYldyYXBwZXI6IGRldmljZSByZWFkeS4nKTtcclxuICAgICAgICAgIHRoaXMuaW5pdERldmljZShkYlNjaGVtYSkudGhlbiAoICgpID0+IHJlc29sdmUoKSApLmNhdGNoICggKGVycikgPT4gcmVqZWN0KGVycikgKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLl9yZWFkeVByb21pc2U7XHJcbiAgfVxyXG5cclxuICBpbml0RGV2aWNlKGRiU2NoZW1hOiBEQlNjaGVtYSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgd2luZG93ID0gKG5ldyBXaW5kb3dTZXJ2aWNlKCkpLm5hdGl2ZVdpbmRvdztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSggKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmRiID0gd2luZG93LnNxbGl0ZVBsdWdpbi5vcGVuRGF0YWJhc2Uoe1xyXG4gICAgICAgIG5hbWU6IHRoaXMuX2RiTmFtZSxcclxuICAgICAgICBsb2NhdGlvbjogdGhpcy5fbG9jYXRpb24sXHJcbiAgICAgICAgYW5kcm9pZExvY2tXb3JrYXJvdW5kOiAxXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKGRiU2NoZW1hKSB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZShkYlNjaGVtYSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgIH0pLnRoZW4oKCkgPT4geyByZXNvbHZlKCk7IH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpbml0KGRiU2NoZW1hOiBEQlNjaGVtYSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgd2luZG93ID0gKG5ldyBXaW5kb3dTZXJ2aWNlKCkpLm5hdGl2ZVdpbmRvdztcclxuICAgIHJldHVybiAgbmV3IFByb21pc2UgKCAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZGIgPSB3aW5kb3cub3BlbkRhdGFiYXNlKHRoaXMuX2RiTmFtZSwgJzEuMCcsICdkYXRhYmFzZScsIC0xKTtcclxuICAgICAgaWYgKGRiU2NoZW1hKSB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZShkYlNjaGVtYSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgfSkudGhlbiggKCkgPT4ge1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZShzY2hlbWE6IERCU2NoZW1hKTogUHJvbWlzZTxhbnk+IHtcclxuXHJcbiAgICBjb25zdCBzZW50ZW5jZXMgPSBbXTtcclxuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xyXG5cclxuICAgIGlmIChzY2hlbWEudGFibGVzKSB7XHJcbiAgICAgIHNjaGVtYS50YWJsZXMuZm9yRWFjaCh0YWJsZSA9PiB7XHJcbiAgICAgICAgc2VudGVuY2VzLnB1c2godGhpcy5jcmVhdGVUYWJsZSh0YWJsZSkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmIChzY2hlbWEudmlld3MpIHtcclxuICAgICAgc2NoZW1hLnZpZXdzLmZvckVhY2goIHZpZXcgPT4ge1xyXG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuY3JlYXRlVmlldyh2aWV3KSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHNlbnRlbmNlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFc3F1ZW1hIGRlIGxhIGJhc2UgZGUgZGF0b3MgdmFjaWEuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoc2VudGVuY2VzKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNyZWF0ZVRhYmxlKHRhYmxlOiBEQlRhYmxlKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGxldCBzcWwgPSAnJywgIG9uQ29uZmxpY3RQcmltYXJ5O1xyXG4gICAgY29uc3Qgc2VudGVuY2VzID0gW10sICBuZXdDb2x1bW5zID0gW11cclxuXHJcbiAgICBjb25zdCB0YWJsZURETCA9IGF3YWl0IHRoaXMudGFibGVFeGlzdHModGFibGUubmFtZSk7XHJcbiAgICBpZiAodGFibGVEREwpIHtcclxuICAgICAgICB0YWJsZS5jb2x1bW5zLmZvckVhY2goIGNvbCA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuY29sdW1uRXhpc3RzKHRhYmxlRERMIGFzIHN0cmluZywgY29sLm5hbWUpICkge1xyXG4gICAgICAgICAgICBuZXdDb2x1bW5zLnB1c2godGhpcy5hZGRDb2x1bW4odGFibGUubmFtZSwgY29sKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0YWJsZS5jb2x1bW5zLmZvckVhY2goIGNvbCA9PiB7XHJcbiAgICAgICAgc2VudGVuY2VzLnB1c2godGhpcy5kZWZDb2x1bW4oY29sKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgb25Db25mbGljdFByaW1hcnkgPSAnb24gY29uZmxpY3QgZmFpbCc7XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGFibGUucHJpbWFyeSkgKSAge1xyXG4gICAgICBzZW50ZW5jZXMucHVzaCAoJyBDT05TVFJBSU5UIGlkZW50aWZpY2Fkb3IgUFJJTUFSWSBLRVkgKCcgKyB0YWJsZS5wcmltYXJ5LmpvaW4oJywnKSArICcpICcgKyBvbkNvbmZsaWN0UHJpbWFyeSApO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiB0YWJsZS5wcmltYXJ5ID09PSAnc3RyaW5nJykgICB7XHJcbiAgICAgIHNlbnRlbmNlcy5wdXNoICgnIENPTlNUUkFJTlQgaWRlbnRpZmljYWRvciBQUklNQVJZIEtFWSAoJyArIHRhYmxlLnByaW1hcnkgKyAnKSAnICsgb25Db25mbGljdFByaW1hcnkgKTtcclxuICAgIH1cclxuICAgIGlmICh0YWJsZS51bmlxdWVzKSB7XHJcbiAgICAgIHRhYmxlLnVuaXF1ZXMuZm9yRWFjaCggdW5pcSA9PiB7XHJcbiAgICAgICAgc2VudGVuY2VzLnB1c2godGhpcy5kZWZVbmlxdWUodW5pcSkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGFibGUuZm9yZWlnbnMpIHtcclxuICAgICAgdGFibGUuZm9yZWlnbnMuZm9yRWFjaCAoIGZvcmUgPT4ge1xyXG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuZGVmRm9yZWlnbihmb3JlKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0YWJsZURETCAmJiBuZXdDb2x1bW5zLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwobmV3Q29sdW1ucylcclxuICAgICAgLnRoZW4oICgpID0+IHsgY29uc29sZS5sb2coYFRhYmxlICR7dGFibGUubmFtZX0gYWx0ZXJlZC5gKTsgfSApXHJcbiAgICAgIC5jYXRjaCggKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IgKGBUYWJsZSAke3RhYmxlLm5hbWV9OiAke2Vyci5tZXNzYWdlfWApO1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgJHt0YWJsZS5uYW1lfTogJHtlcnIubWVzc2FnZX1gKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfSBlbHNlIGlmICghdGFibGVEREwpIHtcclxuICAgICAgc3FsID0gJ0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICcgKyB0YWJsZS5uYW1lICsgJyAoJyArIHNlbnRlbmNlcy5qb2luKCcsJykgKyAnKSc7XHJcbiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5KHNxbClcclxuICAgICAgLnRoZW4oICgpID0+IHsgY29uc29sZS5sb2coYFRhYmxlICR7dGFibGUubmFtZX0gY3JlYXRlZC5gKTsgfSlcclxuICAgICAgLmNhdGNoKCAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvciAoYFRhYmxlICR7dGFibGUubmFtZX06ICR7ZXJyLm1lc3NhZ2V9YCk7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSAke3RhYmxlLm5hbWV9OiAke2Vyci5tZXNzYWdlfWApO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCAoKSA9PiB7IGNvbnNvbGUubG9nKGBUYWJsZSAke3RhYmxlLm5hbWV9IGluaXRpYWxpemVkLmApOyB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBjcmVhdGVWaWV3KHZpZXc6IERCVmlldyk6IFByb21pc2U8YW55PiB7XHJcbiAgICBsZXQgc3FsOiBzdHJpbmc7XHJcblxyXG4gICAgc3FsID0gJ0NSRUFURSBWSUVXIElGIE5PVCBFWElTVFMgJyArIHZpZXcubmFtZVxyXG4gICAgICArICcgQVMgJyArIHZpZXcuc3FsO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5KHNxbCk7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0U2NoZW1hVGFibGUodGFibGVOYW1lOiBzdHJpbmcpOiBEQlRhYmxlIHtcclxuICAgIGxldCByZXM6IERCVGFibGU7XHJcblxyXG4gICAgdGhpcy5zY2hlbWEudGFibGVzLmZvckVhY2goIHRhYmxlID0+IHtcclxuICAgICAgaWYgKHRhYmxlLm5hbWUgPT09IHRhYmxlTmFtZSkge1xyXG4gICAgICAgIHJlcyA9IHRhYmxlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZXM7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0VW5pcXVlc1RhYmxlKHRhYmxlOiBEQlRhYmxlKTogb2JqZWN0IHtcclxuICAgIGxldCByZXM6IHt9O1xyXG4gICAgdGFibGUudW5pcXVlcy5mb3JFYWNoKHVuaXEgPT4ge1xyXG4gICAgICByZXNbdW5pcS5uYW1lXSA9IHVuaXE7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBxdWVyeShxdWVyeTogc3RyaW5nLCBiaW5kaW5nczogYW55W109IFtdKTogUHJvbWlzZTxTcWxSZXN1bHRTZXQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmIChxdWVyeS5pbmRleE9mKCdzZWxlY3QnKSA9PT0gMCkge1xyXG4gICAgICAgIHRoaXMuZGIucmVhZFRyYW5zYWN0aW9uKCh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24pID0+IHtcclxuICAgICAgICAgICAgdHJhbnNhY3Rpb24uZXhlY3V0ZVNxbChxdWVyeSwgYmluZGluZ3MsICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIHJlc3VsdDogU3FsUmVzdWx0U2V0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH0sICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIGVycm9yOiBTcWxFcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSwgKGVycjogU3FsRXJyb3IpID0+IHJlamVjdChlcnIpICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kYi50cmFuc2FjdGlvbigodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwocXVlcnksIGJpbmRpbmdzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9LCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCBlcnJvcjogU3FsRXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sIChlcnI6IFNxbEVycm9yKSA9PiByZWplY3QoZXJyKSApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIENvdW50KHF1ZXJ5OiBzdHJpbmcsIGJpbmRpbmdzOiBhbnlbXT0gW10pOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIHRoaXMucXVlcnkocXVlcnksIGJpbmRpbmdzKS50aGVuKHJvd3MgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvd3NDb3VudChyb3dzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5zZXJ0KHRhYmxlOiBzdHJpbmcsIGJpbmRpbmdzOiB7fSk6IFByb21pc2U8U3FsUmVzdWx0U2V0PiB7XHJcbiAgICBsZXQgc3FsID0gJycsIHNxbEJpbmRzID0gW10sIHNxbEtleXMgPSBbXSwgc3FsVmFsdWVzID0gW10gO1xyXG5cclxuICAgIHNxbCA9IHNxbCArICdpbnNlcnQgaW50byAnICsgdGFibGUgKyAnICc7XHJcblxyXG4gICAgZm9yIChjb25zdCBpbmRleCBpbiBiaW5kaW5ncykge1xyXG4gICAgICAgaWYgKGJpbmRpbmdzLmhhc093blByb3BlcnR5KGluZGV4KSkge1xyXG4gICAgICAgICAgICBzcWxLZXlzLnB1c2goaW5kZXgpO1xyXG4gICAgICAgICAgICBzcWxWYWx1ZXMucHVzaChiaW5kaW5nc1tpbmRleF0pO1xyXG4gICAgICAgICAgICBzcWxCaW5kcy5wdXNoKCc/Jyk7XHJcbiAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3FsID0gc3FsICsgJygnICsgc3FsS2V5cy5qb2luKCcsJykgKyAnKSB2YWx1ZXMgKCcgKyBzcWxCaW5kcy5qb2luKCcsJykgKyAnKSc7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmRiLnRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uID0+IHtcclxuICAgICAgICAgIHRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwoc3FsLCBzcWxWYWx1ZXMsICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIHJlc3VsdDogU3FsUmVzdWx0U2V0KSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgfSwgKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbiwgZXJyb3I6IFNxbEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlKHRhYmxlOiBzdHJpbmcsIGJpbmRpbmdzOiB7fSwgd2hlcmU6IHt9KTogUHJvbWlzZTxTcWxSZXN1bHRTZXQ+IHtcclxuICAgIGxldCBzcWwgPSAnJywgc3FsQmluZHMgPSBbXSwgc3FsS2V5cyA9W10sIHNxbFZhbHVlcyA9IFtdIDtcclxuXHJcbiAgICBzcWwgPSBzcWwgKyAndXBkYXRlICcgKyB0YWJsZSArICcgc2V0ICc7XHJcblxyXG4gICAgZm9yIChsZXQgaW5kZXggaW4gYmluZGluZ3MpIHtcclxuICAgICAgIGlmIChiaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eShpbmRleCkpIHtcclxuICAgICAgICAgICAgbGV0IG5ld09iaiA9IGJpbmRpbmdzW2luZGV4XTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdPYmogPT09ICdvYmplY3QnICYmIG5ld09iaiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgc3FsVmFsdWVzLnB1c2gobmV3T2JqLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdPYmouaWZudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3FsQmluZHMucHVzaChpbmRleCArICcgPSBpZm51bGwoICcgKyBpbmRleCArICcsMCkgKyA/Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld09iai5vcGVyYXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHNxbEJpbmRzLnB1c2goaW5kZXggKyAnID0gJyArIGluZGV4ICsgbmV3T2JqLm9wZXJhdG9yICsgJyA/Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHNxbEJpbmRzLnB1c2goaW5kZXggKyAnID0gPycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNxbEJpbmRzLnB1c2goaW5kZXggKyAnID0gPycpO1xyXG4gICAgICAgICAgICAgICAgc3FsVmFsdWVzLnB1c2goYmluZGluZ3NbaW5kZXhdKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpbmRleCBpbiB3aGVyZSkge1xyXG4gICAgICAgaWYgKHdoZXJlLmhhc093blByb3BlcnR5KGluZGV4KSkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHdoZXJlW2luZGV4XSA9PT0gJ29iamVjdCcgICYmIHdoZXJlW2luZGV4XSAhPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICBzcWxLZXlzLnB1c2goaW5kZXggKyAnICcgKyB3aGVyZVtpbmRleF0ub3BlcmF0b3IgKyAnID8nKTtcclxuICAgICAgICAgICAgICAgIHNxbFZhbHVlcy5wdXNoKHdoZXJlW2luZGV4XS52YWx1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzcWxLZXlzLnB1c2goaW5kZXggKyAnID0gPycpO1xyXG4gICAgICAgICAgICAgICAgc3FsVmFsdWVzLnB1c2god2hlcmVbaW5kZXhdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNxbCA9IHNxbCArIHNxbEJpbmRzLmpvaW4oJywnKSArICcgd2hlcmUgJyArIHNxbEtleXMuam9pbignIGFuZCAnKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZGIudHJhbnNhY3Rpb24odHJhbnNhY3Rpb24gPT4ge1xyXG4gICAgICAgIHRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwoc3FsLCBzcWxWYWx1ZXMsICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIHJlc3VsdDogU3FsUmVzdWx0U2V0KSA9PiB7XHJcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICB9LCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCBlcnJvcjogU3FsRXJyb3IpID0+IHtcclxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRyb3BUYWJsZSAodGFibGVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGNvbnQgPSAxO1xyXG5cclxuICAgIGNvbnQgPSB0YWJsZXMubGVuZ3RoO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGFibGVzLnNvbWUoIHRhYmxlID0+IHtcclxuICAgICAgICBpZiAoY29udCAhPT0gMCkge1xyXG4gICAgICAgICAgdGhpcy5xdWVyeSgnRFJPUCBUQUJMRSAnICsgdGFibGUpXHJcbiAgICAgICAgICAudGhlbiggKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChjb250ID09PSAxICkgeyByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHsgY29udC0tOyB9XHJcbiAgICAgICAgICB9LCBlcnIgPT4ge1xyXG4gICAgICAgICAgICBjb250ID0gMDtcclxuICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBmZXRjaEFsbChyZXN1bHQ6IFNxbFJlc3VsdFNldCk6IG9iamVjdFtdIHtcclxuICAgIGxldCBvdXRwdXQgPSBbXTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgb3V0cHV0LnB1c2gocmVzdWx0LnJvd3MuaXRlbShpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dHB1dDtcclxuICB9XHJcblxyXG4gIGZldGNoKHJlc3VsdDogU3FsUmVzdWx0U2V0KTogb2JqZWN0IHtcclxuICAgICAgbGV0IG9iamV0byA9IHVuZGVmaW5lZCwgbmV3T2JqPSB1bmRlZmluZWQ7XHJcbiAgICAgIGlmIChyZXN1bHQucm93cy5sZW5ndGggIT09IDApIHtcclxuICAgICAgICAgIG9iamV0byA9IHJlc3VsdC5yb3dzLml0ZW0oMCk7XHJcbiAgICAgICAgICBuZXdPYmogPSB7fTtcclxuICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmpldG8pO1xyXG4gICAgICAgICAgZm9yIChsZXQga2V5IGluIGtleXMpIHtcclxuICAgICAgICAgICAgICBuZXdPYmpba2V5c1trZXldXSA9IG9iamV0b1trZXlzW2tleV1dO1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBuZXdPYmo7XHJcbiAgfVxyXG5cclxuXHJcbiAgcm93c0NvdW50KHJlc3VsdDogU3FsUmVzdWx0U2V0KTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHJlc3VsdC5yb3dzLmxlbmd0aDtcclxuICB9XHJcblxyXG4vKiBQcml2YXRlICovXHJcblxyXG4gIHByaXZhdGUgZGVmQ29sdW1uKGNvbDogREJDb2x1bW4pOiBzdHJpbmcge1xyXG4gICAgbGV0IGNvbFNxbDogc3RyaW5nO1xyXG5cclxuICAgIGNvbFNxbCA9IGNvbC5uYW1lICsgJyAnICsgY29sLnR5cGU7XHJcbiAgICBpZiAoIWNvbC5pc051bGxhYmxlKSB7XHJcbiAgICAgIGNvbFNxbCArPSAgJyBOT1QgTlVMTCAnO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbC5kZWZhdWx0KSB7XHJcbiAgICAgIGNvbFNxbCArPSAnIERFRkFVTFQgJyArIGNvbC5kZWZhdWx0ICsgJyAnO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbC50eXBlID09PSAndGV4dCcgJiYgY29sLmxlbmd0aCkge1xyXG4gICAgICBjb2xTcWwgKz0gYCBDT05TVFJBSU5UICR7Y29sLm5hbWV9X2xlbmd0aCBDSEVDSyAoIGA7XHJcbiAgICAgIGlmIChjb2wuaXNOdWxsYWJsZSkge1xyXG4gICAgICAgIGNvbFNxbCArPSBgJHtjb2wubmFtZX0gaXMgbnVsbCBPUiBgO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbFNxbCArPSBgbGVuZ3RoKCR7Y29sLm5hbWV9KSA8PSAke2NvbC5sZW5ndGh9IClgO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29sU3FsO1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVmVW5pcXVlKHVuaXF1ZTogREJVbmlxdWUpOiBzdHJpbmcge1xyXG4gICAgbGV0IHVuaXFTcWw6IHN0cmluZztcclxuXHJcbiAgICAvLyBkZXBlbmRlIGRlbCBlbnRvcm5vLCBwcm9kdWNjacOzbiBvIGRlc2Fycm9sbG9cclxuICAgIGNvbnN0IG9uQ29uZmxpY3RVbmlxdWUgPSAnb24gY29uZmxpY3QgZmFpbCc7XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodW5pcXVlLmZpZWxkcykgKSAge1xyXG4gICAgICB1bmlxU3FsID0gYCBDT05TVFJBSU5UICR7dW5pcXVlLm5hbWV9IFVOSVFVRSAoICR7dW5pcXVlLmZpZWxkcy5qb2luKCcsJyl9ICkgJHtvbkNvbmZsaWN0VW5pcXVlfSBgO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiB1bmlxdWUuZmllbGRzID09PSAnc3RyaW5nJykgICB7XHJcbiAgICAgIHVuaXFTcWwgPSBgIENPTlNUUkFJTlQgJHt1bmlxdWUubmFtZX0gVU5JUVVFICggJHt1bmlxdWUuZmllbGRzfSApICR7b25Db25mbGljdFVuaXF1ZX0gYDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdW5pcVNxbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVmRm9yZWlnbihmb3JlOiBEQkZvcmVpZ24pOiBzdHJpbmcge1xyXG4gICAgbGV0IGZvcmVTcWw6IHN0cmluZztcclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmb3JlLmZvcmVpZ25LZXkpICkgIHtcclxuICAgICAgZm9yZVNxbCA9IGAgRk9SRUlHTiBLRVkgKCAgJHtmb3JlLmZvcmVpZ25LZXkuam9pbignLCcpfSApIGA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBmb3JlLmZvcmVpZ25LZXkgPT09ICdzdHJpbmcnKSAgIHtcclxuICAgICAgZm9yZVNxbCA9IGAgRk9SRUlHTiBLRVkgKCAgJHtmb3JlLmZvcmVpZ25LZXl9ICkgYDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmb3JlLnByaW1hcnlLZXkpICkgIHtcclxuICAgICAgZm9yZVNxbCA9IGAgUkVGRVJFTkNFUyAke2ZvcmUucmVmZXJlbmNlVGFibGV9ICggICR7Zm9yZS5wcmltYXJ5S2V5LmpvaW4oJywnKX0gKSBgO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgZm9yZS5wcmltYXJ5S2V5ID09PSAnc3RyaW5nJykgICB7XHJcbiAgICAgIGZvcmVTcWwgPSBgIFJFRkVSRU5DRVMgJHtmb3JlLnJlZmVyZW5jZVRhYmxlfSAoICAke2ZvcmUucHJpbWFyeUtleX0gKSBgO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmb3JlU3FsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0YWJsZUV4aXN0cyh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgnc2VsZWN0ICBzcWwgZnJvbSBzcWxpdGVfbWFzdGVyICcgK1xyXG4gICAgICAgICd3aGVyZSB0eXBlPVxcJ3RhYmxlXFwnIGFuZCBuYW1lPVxcJycgKyB0YWJsZSArICdcXCcnKVxyXG4gICAgLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICBpZiAodGhpcy5yb3dzQ291bnQocmVzdWx0KSA9PT0gMSkgeyByZXR1cm4gKHRoaXMuZmV0Y2gocmVzdWx0KSBhcyBhbnkpLnNxbCBhcyBzdHJpbmc7IH0gZWxzZSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbHVtbkV4aXN0cyh0YWJsZURETDogc3RyaW5nLCBjb2x1bW46IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICh0YWJsZURETC5pbmRleE9mKGNvbHVtbikgPT09IC0xKSB7IHJldHVybiBmYWxzZTsgfSBlbHNlIHsgIHJldHVybiB0cnVlOyB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZENvbHVtbih0YWJsZTogc3RyaW5nLCBjb2w6IERCQ29sdW1uKTogUHJvbWlzZTxhbnk+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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGItd3JhcHBlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGItd3JhcHBlci8iLCJzb3VyY2VzIjpbImxpYi9kYi13cmFwcGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSWpEO0lBU0UsMEJBQVksUUFBa0IsRUFBRSxRQUFtQjtRQUFuRCxpQkEwQkM7UUF4QkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUM7UUFDaEQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsSUFBSSxTQUFTLENBQUM7UUFDdEUsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFFBQVEsQ0FBQyx1QkFBdUIsSUFBSSxTQUFTLENBQUM7UUFDOUUsSUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLGFBQWEsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQ2xELElBQUksUUFBUSxFQUFFO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7U0FBRTtRQUN6QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksT0FBTyxDQUFHLFVBQUMsT0FBTyxFQUFFLE1BQU07WUFDakQsSUFBSSxPQUFPLE1BQU0sQ0FBQyxPQUFPLEtBQUssV0FBVyxFQUFFO2dCQUN6QyxVQUFVLENBQUU7b0JBQ1YsS0FBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQ3RCO3dCQUNFLE9BQU8sRUFBRSxDQUFDO29CQUNaLENBQUMsQ0FBRTt5QkFDRixLQUFLLENBQUcsVUFBQyxHQUFHO3dCQUNYLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDZCxDQUFDLENBQUUs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QUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFDO1NBQUU7YUFBTTtZQUFHLE9BQU8sSUFBSSxDQUFDO1NBQUU7SUFDL0UsQ0FBQztJQUVPLG9DQUFTLEdBQWpCLFVBQWtCLEtBQWEsRUFBRSxHQUFhO1FBQzVDLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsSUFBTSxLQUFLLEdBQUcsY0FBYyxHQUFHLEtBQUssR0FBRyxjQUFjLEdBQUcsTUFBTSxDQUFDO1FBQy9ELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUgsdUJBQUM7QUFBRCxDQUFDLEFBcGJELElBb2JDOztBQUlELE1BQU0sQ0FBQyxJQUFNLFNBQVMsR0FBRyxJQUFJLGNBQWMsQ0FBVyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3pFLE1BQU0sQ0FBQyxJQUFNLFNBQVMsR0FBRyxJQUFJLGNBQWMsQ0FBVyxpQkFBaUIsQ0FBQyxDQUFDO0FBRXpFLE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsT0FBTztRQUNMLE1BQU0sRUFBRSxXQUFXO1FBQ25CLFFBQVEsRUFBRSxTQUFTO1FBQ25CLG1CQUFtQixFQUFFLFNBQVM7S0FDL0IsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsUUFBa0IsRUFBRSxRQUFtQjtJQUN0RSxJQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUQsT0FBTyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNoRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFdpbmRvd1NlcnZpY2UgfSBmcm9tICcuL3dpbmRvdy5zZXJ2aWNlJztcbmltcG9ydCB7IERCVGFibGUsIERiQ29uZmlnLCBEQlNjaGVtYSwgREJWaWV3LFxuICBEQkNvbHVtbiwgREJVbmlxdWUsIERCRm9yZWlnbiwgU3FsVHJhbnNhY3Rpb24sIFNxbFJlc3VsdFNldCwgU3FsRXJyb3IsIERlZmF1bHRUeXBlIH0gZnJvbSAnLi9kYi13cmFwcGVyLm1vZGVscyc7XG5cbmV4cG9ydCBjbGFzcyBEYldyYXBwZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfZGJOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgX2xvY2F0aW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgX2lvc0RhdGFiYXNlTG9jYXRpb246IHN0cmluZztcbiAgcHJpdmF0ZSBfYW5kcm9pZERhdGFiYXNlUHJvdmlkZXI6IHN0cmluZztcbiAgcHJpdmF0ZSBfcmVhZHlQcm9taXNlOiBQcm9taXNlPHZvaWQ+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=