db-wrapper 0.0.5 → 0.0.8

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,352 +1,196 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
1
+ import { __awaiter } from "tslib";
5
2
  import { InjectionToken } from '@angular/core';
6
3
  import { WindowService } from './window.service';
7
4
  export class DbWrapperService {
8
- /**
9
- * @param {?} dbConfig
10
- * @param {?=} dbSchema
11
- */
12
5
  constructor(dbConfig, dbSchema) {
13
6
  this._dbName = dbConfig.dbName;
14
7
  this._location = dbConfig.location || 'default';
15
8
  this._iosDatabaseLocation = dbConfig.iosDatabaseLocation || 'Library';
16
- /** @type {?} */
17
9
  const window = (new WindowService()).nativeWindow;
18
10
  if (dbSchema) {
19
11
  this.schema = dbSchema;
20
12
  }
21
- this._readyPromise = new Promise((/**
22
- * @param {?} resolve
23
- * @param {?} reject
24
- * @return {?}
25
- */
26
- (resolve, reject) => {
13
+ this._readyPromise = new Promise((resolve, reject) => {
27
14
  if (typeof window.cordova === 'undefined') {
28
- setTimeout((/**
29
- * @return {?}
30
- */
31
- () => {
32
- this.init(dbSchema).then((/**
33
- * @return {?}
34
- */
35
- () => resolve())).catch((/**
36
- * @param {?} err
37
- * @return {?}
38
- */
39
- (err) => reject(err)));
40
- }), 500);
15
+ setTimeout(() => {
16
+ this.init(dbSchema).then(() => {
17
+ resolve();
18
+ })
19
+ .catch((err) => {
20
+ reject(err);
21
+ });
22
+ }, 500);
41
23
  }
42
24
  else {
43
- document.addEventListener('deviceready', (/**
44
- * @return {?}
45
- */
46
- () => {
25
+ document.addEventListener('deviceready', () => {
47
26
  console.log('dbWrapper: device ready.');
48
- this.initDevice(dbSchema).then((/**
49
- * @return {?}
50
- */
51
- () => resolve())).catch((/**
52
- * @param {?} err
53
- * @return {?}
54
- */
55
- (err) => reject(err)));
56
- }));
27
+ this.initDevice(dbSchema).then(() => resolve()).catch((err) => reject(err));
28
+ });
57
29
  }
58
- }));
30
+ });
59
31
  }
60
- /**
61
- * @return {?}
62
- */
63
32
  ready() {
64
33
  return this._readyPromise;
65
34
  }
66
- /**
67
- * @param {?} dbSchema
68
- * @return {?}
69
- */
70
35
  initDevice(dbSchema) {
71
- /** @type {?} */
72
36
  const window = (new WindowService()).nativeWindow;
73
- return new Promise((/**
74
- * @param {?} resolve
75
- * @param {?} reject
76
- * @return {?}
77
- */
78
- (resolve, reject) => {
37
+ return new Promise((resolve, reject) => {
79
38
  this.db = window.sqlitePlugin.openDatabase({
80
39
  name: this._dbName,
81
40
  location: this._location,
82
41
  androidLockWorkaround: 1
83
42
  });
84
43
  if (dbSchema) {
85
- this.generate(dbSchema).catch((/**
86
- * @param {?} err
87
- * @return {?}
88
- */
89
- err => {
44
+ this.generate(dbSchema).catch(err => {
90
45
  reject(err);
91
- })).then((/**
92
- * @return {?}
93
- */
94
- () => { resolve(); }));
46
+ }).then(() => { resolve(); });
95
47
  }
96
48
  else {
97
49
  resolve();
98
50
  }
99
- }));
51
+ });
100
52
  }
101
- /**
102
- * @param {?} dbSchema
103
- * @return {?}
104
- */
105
53
  init(dbSchema) {
106
- /** @type {?} */
107
54
  const window = (new WindowService()).nativeWindow;
108
- return new Promise((/**
109
- * @param {?} resolve
110
- * @param {?} reject
111
- * @return {?}
112
- */
113
- (resolve, reject) => {
55
+ return new Promise((resolve, reject) => {
114
56
  this.db = window.openDatabase(this._dbName, '1.0', 'database', -1);
115
57
  if (dbSchema) {
116
- this.generate(dbSchema).catch((/**
117
- * @param {?} err
118
- * @return {?}
119
- */
120
- err => {
58
+ this.generate(dbSchema).catch(err => {
121
59
  reject(err);
122
- })).then((/**
123
- * @return {?}
124
- */
125
- () => { resolve(); }));
60
+ }).then(() => {
61
+ resolve();
62
+ });
126
63
  }
127
64
  else {
128
65
  resolve();
129
66
  }
130
- }));
67
+ });
131
68
  }
132
- /**
133
- * @param {?} schema
134
- * @return {?}
135
- */
136
69
  generate(schema) {
137
- /** @type {?} */
138
70
  const sentences = [];
139
71
  this.schema = schema;
140
72
  if (schema.tables) {
141
- schema.tables.forEach((/**
142
- * @param {?} table
143
- * @return {?}
144
- */
145
- table => {
73
+ schema.tables.forEach(table => {
146
74
  sentences.push(this.createTable(table));
147
- }));
75
+ });
148
76
  }
149
77
  if (schema.views) {
150
- schema.views.forEach((/**
151
- * @param {?} view
152
- * @return {?}
153
- */
154
- view => {
78
+ schema.views.forEach(view => {
155
79
  sentences.push(this.createView(view));
156
- }));
80
+ });
157
81
  }
158
82
  if (sentences.length === 0) {
159
83
  throw new Error('Esquema de la base de datos vacia.');
160
84
  }
161
85
  return Promise.all(sentences);
162
86
  }
163
- /**
164
- * @param {?} table
165
- * @return {?}
166
- */
167
87
  createTable(table) {
168
- /** @type {?} */
169
- let sql = '';
170
- /** @type {?} */
171
- let sentences = [];
172
- /** @type {?} */
173
- let onConflictPrimary;
174
- table.columns.forEach((/**
175
- * @param {?} col
176
- * @return {?}
177
- */
178
- col => {
179
- sentences.push(this.defColumn(col));
180
- }));
181
- onConflictPrimary = 'on conflict fail';
182
- if (Array.isArray(table.primary)) {
183
- sentences.push(' CONSTRAINT identificador PRIMARY KEY (' + table.primary.join(',') + ') ' + onConflictPrimary);
184
- }
185
- if (typeof table.primary === 'string') {
186
- sentences.push(' CONSTRAINT identificador PRIMARY KEY (' + table.primary + ') ' + onConflictPrimary);
187
- }
188
- if (table.uniques) {
189
- table.uniques.forEach((/**
190
- * @param {?} uniq
191
- * @return {?}
192
- */
193
- uniq => {
194
- sentences.push(this.defUnique(uniq));
195
- }));
196
- }
197
- if (table.foreigns) {
198
- table.foreigns.forEach((/**
199
- * @param {?} fore
200
- * @return {?}
201
- */
202
- fore => {
203
- sentences.push(this.defForeign(fore));
204
- }));
205
- }
206
- sql = 'CREATE TABLE IF NOT EXISTS ' + table.name + ' (' + sentences.join(',') + ')';
207
- return this.query(sql);
88
+ return __awaiter(this, void 0, void 0, function* () {
89
+ let sql = '', onConflictPrimary;
90
+ const sentences = [], newColumns = [];
91
+ const tableDDL = yield this._tableExists(table.name);
92
+ if (tableDDL) {
93
+ table.columns.forEach(col => {
94
+ if (!this._columnExists(tableDDL, col.name)) {
95
+ newColumns.push(this.addColumn(table.name, col));
96
+ }
97
+ });
98
+ }
99
+ else {
100
+ table.columns.forEach(col => {
101
+ sentences.push(this.defColumn(col));
102
+ });
103
+ }
104
+ onConflictPrimary = 'on conflict fail';
105
+ if (Array.isArray(table.primary)) {
106
+ sentences.push(' CONSTRAINT identificador PRIMARY KEY (' + table.primary.join(',') + ') ' + onConflictPrimary);
107
+ }
108
+ if (typeof table.primary === 'string') {
109
+ sentences.push(' CONSTRAINT identificador PRIMARY KEY (' + table.primary + ') ' + onConflictPrimary);
110
+ }
111
+ if (table.uniques) {
112
+ table.uniques.forEach(uniq => {
113
+ sentences.push(this.defUnique(uniq));
114
+ });
115
+ }
116
+ if (table.foreigns) {
117
+ table.foreigns.forEach(fore => {
118
+ sentences.push(this.defForeign(fore));
119
+ });
120
+ }
121
+ if (tableDDL && newColumns.length !== 0) {
122
+ return Promise.all(newColumns)
123
+ .then(() => { console.log(`Table ${table.name} altered.`); })
124
+ .catch((err) => {
125
+ console.error(`Table ${table.name}: ${err.message}`);
126
+ throw new Error(`Table ${table.name}: ${err.message}`);
127
+ });
128
+ }
129
+ else if (!tableDDL) {
130
+ sql = 'CREATE TABLE IF NOT EXISTS ' + table.name + ' (' + sentences.join(',') + ')';
131
+ return this.query(sql)
132
+ .then(() => { console.log(`Table ${table.name} created.`); })
133
+ .catch((err) => {
134
+ console.error(`Table ${table.name}: ${err.message}`);
135
+ throw new Error(`Table ${table.name}: ${err.message}`);
136
+ });
137
+ }
138
+ else {
139
+ return Promise.resolve().then(() => { console.log(`Table ${table.name} initialized.`); });
140
+ }
141
+ });
208
142
  }
209
- /**
210
- * @param {?} view
211
- * @return {?}
212
- */
213
143
  createView(view) {
214
- /** @type {?} */
215
144
  let sql;
216
145
  sql = 'CREATE VIEW IF NOT EXISTS ' + view.name
217
146
  + ' AS ' + view.sql;
218
147
  return this.query(sql);
219
148
  }
220
- /**
221
- * @param {?} tableName
222
- * @return {?}
223
- */
224
149
  getSchemaTable(tableName) {
225
- /** @type {?} */
226
150
  let res;
227
- this.schema.tables.forEach((/**
228
- * @param {?} table
229
- * @return {?}
230
- */
231
- table => {
151
+ this.schema.tables.forEach(table => {
232
152
  if (table.name === tableName) {
233
153
  res = table;
234
154
  }
235
- }));
155
+ });
236
156
  return res;
237
157
  }
238
- /**
239
- * @param {?} table
240
- * @return {?}
241
- */
242
158
  getUniquesTable(table) {
243
- /** @type {?} */
244
159
  let res;
245
- table.uniques.forEach((/**
246
- * @param {?} uniq
247
- * @return {?}
248
- */
249
- uniq => {
160
+ table.uniques.forEach(uniq => {
250
161
  res[uniq.name] = uniq;
251
- }));
162
+ });
252
163
  return res;
253
164
  }
254
- /**
255
- * @param {?} query
256
- * @param {?=} bindings
257
- * @return {?}
258
- */
259
165
  query(query, bindings = []) {
260
- return new Promise((/**
261
- * @param {?} resolve
262
- * @param {?} reject
263
- * @return {?}
264
- */
265
- (resolve, reject) => {
166
+ return new Promise((resolve, reject) => {
266
167
  if (query.indexOf('select') === 0) {
267
- this.db.readTransaction((/**
268
- * @param {?} transaction
269
- * @return {?}
270
- */
271
- (transaction) => {
272
- transaction.executeSql(query, bindings, (/**
273
- * @param {?} transaction
274
- * @param {?} result
275
- * @return {?}
276
- */
277
- (transaction, result) => {
168
+ this.db.readTransaction((transaction) => {
169
+ transaction.executeSql(query, bindings, (transaction, result) => {
278
170
  resolve(result);
279
- }), (/**
280
- * @param {?} transaction
281
- * @param {?} error
282
- * @return {?}
283
- */
284
- (transaction, error) => {
171
+ }, (transaction, error) => {
285
172
  reject(error);
286
- }));
287
- }), (/**
288
- * @param {?} err
289
- * @return {?}
290
- */
291
- (err) => reject(err)));
173
+ });
174
+ }, (err) => reject(err));
292
175
  }
293
176
  else {
294
- this.db.transaction((/**
295
- * @param {?} transaction
296
- * @return {?}
297
- */
298
- (transaction) => {
299
- transaction.executeSql(query, bindings, (/**
300
- * @param {?} transaction
301
- * @param {?} result
302
- * @return {?}
303
- */
304
- (transaction, result) => {
177
+ this.db.transaction((transaction) => {
178
+ transaction.executeSql(query, bindings, (transaction, result) => {
305
179
  resolve(result);
306
- }), (/**
307
- * @param {?} transaction
308
- * @param {?} error
309
- * @return {?}
310
- */
311
- (transaction, error) => {
180
+ }, (transaction, error) => {
312
181
  reject(error);
313
- }));
314
- }), (/**
315
- * @param {?} err
316
- * @return {?}
317
- */
318
- (err) => reject(err)));
182
+ });
183
+ }, (err) => reject(err));
319
184
  }
320
- }));
185
+ });
321
186
  }
322
- /**
323
- * @param {?} query
324
- * @param {?=} bindings
325
- * @return {?}
326
- */
327
187
  Count(query, bindings = []) {
328
- return this.query(query, bindings).then((/**
329
- * @param {?} rows
330
- * @return {?}
331
- */
332
- rows => {
188
+ return this.query(query, bindings).then(rows => {
333
189
  return this.rowsCount(rows);
334
- }));
190
+ });
335
191
  }
336
- /**
337
- * @param {?} table
338
- * @param {?} bindings
339
- * @return {?}
340
- */
341
192
  insert(table, bindings) {
342
- /** @type {?} */
343
- let sql = '';
344
- /** @type {?} */
345
- let sqlBinds = [];
346
- /** @type {?} */
347
- let sqlKeys = [];
348
- /** @type {?} */
349
- let sqlValues = [];
193
+ let sql = '', sqlBinds = [], sqlKeys = [], sqlValues = [];
350
194
  sql = sql + 'insert into ' + table + ' ';
351
195
  for (const index in bindings) {
352
196
  if (bindings.hasOwnProperty(index)) {
@@ -356,54 +200,21 @@ export class DbWrapperService {
356
200
  }
357
201
  }
358
202
  sql = sql + '(' + sqlKeys.join(',') + ') values (' + sqlBinds.join(',') + ')';
359
- return new Promise((/**
360
- * @param {?} resolve
361
- * @param {?} reject
362
- * @return {?}
363
- */
364
- (resolve, reject) => {
365
- this.db.transaction((/**
366
- * @param {?} transaction
367
- * @return {?}
368
- */
369
- transaction => {
370
- transaction.executeSql(sql, sqlValues, (/**
371
- * @param {?} transaction
372
- * @param {?} result
373
- * @return {?}
374
- */
375
- (transaction, result) => {
203
+ return new Promise((resolve, reject) => {
204
+ this.db.transaction(transaction => {
205
+ transaction.executeSql(sql, sqlValues, (transaction, result) => {
376
206
  resolve(result);
377
- }), (/**
378
- * @param {?} transaction
379
- * @param {?} error
380
- * @return {?}
381
- */
382
- (transaction, error) => {
207
+ }, (transaction, error) => {
383
208
  reject(error);
384
- }));
385
- }));
386
- }));
209
+ });
210
+ });
211
+ });
387
212
  }
388
- /**
389
- * @param {?} table
390
- * @param {?} bindings
391
- * @param {?} where
392
- * @return {?}
393
- */
394
213
  update(table, bindings, where) {
395
- /** @type {?} */
396
- let sql = '';
397
- /** @type {?} */
398
- let sqlBinds = [];
399
- /** @type {?} */
400
- let sqlKeys = [];
401
- /** @type {?} */
402
- let sqlValues = [];
214
+ let sql = '', sqlBinds = [], sqlKeys = [], sqlValues = [];
403
215
  sql = sql + 'update ' + table + ' set ';
404
216
  for (let index in bindings) {
405
217
  if (bindings.hasOwnProperty(index)) {
406
- /** @type {?} */
407
218
  let newObj = bindings[index];
408
219
  if (typeof newObj === 'object' && newObj !== null) {
409
220
  sqlValues.push(newObj.value);
@@ -436,105 +247,52 @@ export class DbWrapperService {
436
247
  }
437
248
  }
438
249
  sql = sql + sqlBinds.join(',') + ' where ' + sqlKeys.join(' and ');
439
- return new Promise((/**
440
- * @param {?} resolve
441
- * @param {?} reject
442
- * @return {?}
443
- */
444
- (resolve, reject) => {
445
- this.db.transaction((/**
446
- * @param {?} transaction
447
- * @return {?}
448
- */
449
- transaction => {
450
- transaction.executeSql(sql, sqlValues, (/**
451
- * @param {?} transaction
452
- * @param {?} result
453
- * @return {?}
454
- */
455
- (transaction, result) => {
250
+ return new Promise((resolve, reject) => {
251
+ this.db.transaction(transaction => {
252
+ transaction.executeSql(sql, sqlValues, (transaction, result) => {
456
253
  resolve(result);
457
- }), (/**
458
- * @param {?} transaction
459
- * @param {?} error
460
- * @return {?}
461
- */
462
- (transaction, error) => {
254
+ }, (transaction, error) => {
463
255
  reject(error);
464
- }));
465
- }));
466
- }));
256
+ });
257
+ });
258
+ });
467
259
  }
468
- /**
469
- * @param {?} tables
470
- * @return {?}
471
- */
472
260
  dropTable(tables) {
473
- /** @type {?} */
474
261
  let cont = 1;
475
262
  cont = tables.length;
476
- return new Promise((/**
477
- * @param {?} resolve
478
- * @param {?} reject
479
- * @return {?}
480
- */
481
- (resolve, reject) => {
482
- tables.some((/**
483
- * @param {?} table
484
- * @return {?}
485
- */
486
- table => {
263
+ return new Promise((resolve, reject) => {
264
+ tables.some(table => {
487
265
  if (cont !== 0) {
488
266
  this.query('DROP TABLE ' + table)
489
- .then((/**
490
- * @return {?}
491
- */
492
- () => {
267
+ .then(() => {
493
268
  if (cont === 1) {
494
269
  resolve();
495
270
  }
496
271
  else {
497
272
  cont--;
498
273
  }
499
- }), (/**
500
- * @param {?} err
501
- * @return {?}
502
- */
503
- err => {
274
+ }, err => {
504
275
  cont = 0;
505
276
  reject(err);
506
277
  return true;
507
- }));
278
+ });
508
279
  return false;
509
280
  }
510
- }));
511
- }));
281
+ });
282
+ });
512
283
  }
513
- /**
514
- * @param {?} result
515
- * @return {?}
516
- */
517
284
  fetchAll(result) {
518
- /** @type {?} */
519
285
  let output = [];
520
286
  for (let i = 0; i < result.rows.length; i++) {
521
287
  output.push(result.rows.item(i));
522
288
  }
523
289
  return output;
524
290
  }
525
- /**
526
- * @param {?} result
527
- * @return {?}
528
- */
529
291
  fetch(result) {
530
- /** @type {?} */
531
- let objeto = undefined;
532
- /** @type {?} */
533
- let newObj = undefined;
292
+ let objeto = undefined, newObj = undefined;
534
293
  if (result.rows.length !== 0) {
535
294
  objeto = result.rows.item(0);
536
295
  newObj = {};
537
- /** @type {?} */
538
296
  const keys = Object.keys(objeto);
539
297
  for (let key in keys) {
540
298
  newObj[keys[key]] = objeto[keys[key]];
@@ -542,21 +300,27 @@ export class DbWrapperService {
542
300
  }
543
301
  return newObj;
544
302
  }
545
- /**
546
- * @param {?} result
547
- * @return {?}
548
- */
549
303
  rowsCount(result) {
550
304
  return result.rows.length;
551
305
  }
306
+ tableExists(table) {
307
+ return this.query('select sql from sqlite_master ' +
308
+ 'where type=\'table\' and name=\'' + table + '\'')
309
+ .then(result => (this.rowsCount(result) === 1));
310
+ }
311
+ columnExists(table, column) {
312
+ return this._tableExists(table)
313
+ .then((tableDDL) => {
314
+ if (tableDDL) {
315
+ return this._columnExists(tableDDL, column);
316
+ }
317
+ else {
318
+ return false;
319
+ }
320
+ });
321
+ }
552
322
  /* Private */
553
- /**
554
- * @private
555
- * @param {?} col
556
- * @return {?}
557
- */
558
323
  defColumn(col) {
559
- /** @type {?} */
560
324
  let colSql;
561
325
  colSql = col.name + ' ' + col.type;
562
326
  if (!col.isNullable) {
@@ -574,16 +338,9 @@ export class DbWrapperService {
574
338
  }
575
339
  return colSql;
576
340
  }
577
- /**
578
- * @private
579
- * @param {?} unique
580
- * @return {?}
581
- */
582
341
  defUnique(unique) {
583
- /** @type {?} */
584
342
  let uniqSql;
585
343
  // depende del entorno, producción o desarrollo
586
- /** @type {?} */
587
344
  const onConflictUnique = 'on conflict replace';
588
345
  if (Array.isArray(unique.fields)) {
589
346
  uniqSql = ` CONSTRAINT ${unique.name} UNIQUE ( ${unique.fields.join(',')} ) ${onConflictUnique} `;
@@ -593,13 +350,7 @@ export class DbWrapperService {
593
350
  }
594
351
  return uniqSql;
595
352
  }
596
- /**
597
- * @private
598
- * @param {?} fore
599
- * @return {?}
600
- */
601
353
  defForeign(fore) {
602
- /** @type {?} */
603
354
  let foreSql;
604
355
  if (Array.isArray(fore.foreignKey)) {
605
356
  foreSql = ` FOREIGN KEY ( ${fore.foreignKey.join(',')} ) `;
@@ -615,40 +366,34 @@ export class DbWrapperService {
615
366
  }
616
367
  return foreSql;
617
368
  }
369
+ _tableExists(table) {
370
+ return this.query('select sql from sqlite_master ' +
371
+ 'where type=\'table\' and name=\'' + table + '\'')
372
+ .then(result => {
373
+ if (this.rowsCount(result) === 1) {
374
+ return this.fetch(result).sql;
375
+ }
376
+ else {
377
+ return false;
378
+ }
379
+ });
380
+ }
381
+ _columnExists(tableDDL, column) {
382
+ if (tableDDL.indexOf(column) === -1) {
383
+ return false;
384
+ }
385
+ else {
386
+ return true;
387
+ }
388
+ }
389
+ addColumn(table, col) {
390
+ const colSql = this.defColumn(col);
391
+ const query = 'alter TABLE ' + table + ' add COLUMN ' + colSql;
392
+ return this.query(query);
393
+ }
618
394
  }
619
- if (false) {
620
- /**
621
- * @type {?}
622
- * @private
623
- */
624
- DbWrapperService.prototype._dbName;
625
- /**
626
- * @type {?}
627
- * @private
628
- */
629
- DbWrapperService.prototype._location;
630
- /**
631
- * @type {?}
632
- * @private
633
- */
634
- DbWrapperService.prototype._iosDatabaseLocation;
635
- /**
636
- * @type {?}
637
- * @private
638
- */
639
- DbWrapperService.prototype._readyPromise;
640
- /** @type {?} */
641
- DbWrapperService.prototype.schema;
642
- /** @type {?} */
643
- DbWrapperService.prototype.db;
644
- }
645
- /** @type {?} */
646
395
  export const DB_CONFIG = new InjectionToken('dbWrapperConfig');
647
- /** @type {?} */
648
396
  export const DB_SCHEMA = new InjectionToken('dbWrapperSchema');
649
- /**
650
- * @return {?}
651
- */
652
397
  export function getDefaultDbConfig() {
653
398
  return {
654
399
  dbName: 'db.sqlite',
@@ -656,14 +401,8 @@ export function getDefaultDbConfig() {
656
401
  iosDatabaseLocation: 'Library'
657
402
  };
658
403
  }
659
- /**
660
- * @param {?} dbConfig
661
- * @param {?=} dbSchema
662
- * @return {?}
663
- */
664
404
  export function provideDbWrapper(dbConfig, dbSchema) {
665
- /** @type {?} */
666
405
  const config = !!dbConfig ? dbConfig : getDefaultDbConfig();
667
406
  return new DbWrapperService(config, dbSchema);
668
407
  }
669
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGItd3JhcHBlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGItd3JhcHBlci8iLCJzb3VyY2VzIjpbImxpYi9kYi13cmFwcGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSWpELE1BQU0sT0FBTyxnQkFBZ0I7Ozs7O0lBUTNCLFlBQVksUUFBa0IsRUFBRSxRQUFtQjtRQUVqRCxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQztRQUNoRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsUUFBUSxDQUFDLG1CQUFtQixJQUFJLFNBQVMsQ0FBQzs7Y0FDaEUsTUFBTSxHQUFHLENBQUMsSUFBSSxhQUFhLEVBQUUsQ0FBQyxDQUFDLFlBQVk7UUFDakQsSUFBSSxRQUFRLEVBQUU7WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztTQUFFO1FBQ3pDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxPQUFPOzs7OztRQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JELElBQUksT0FBTyxNQUFNLENBQUMsT0FBTyxLQUFLLFdBQVcsRUFBRTtnQkFDekMsVUFBVTs7O2dCQUFFLEdBQUcsRUFBRTtvQkFDZixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUk7OztvQkFBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEtBQUs7Ozs7b0JBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM5RSxDQUFDLEdBQUUsR0FBRyxDQUFDLENBQUM7YUFD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QUUsUUFBbUI7O1VBQ2hFLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFO0lBQzNELE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFdpbmRvd1NlcnZpY2UgfSBmcm9tICcuL3dpbmRvdy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgREJUYWJsZSwgRGJDb25maWcsIERCU2NoZW1hLCBEQlZpZXcsXHJcbiAgREJDb2x1bW4sIERCVW5pcXVlLCBEQkZvcmVpZ24sIFNxbFRyYW5zYWN0aW9uLCBTcWxSZXN1bHRTZXQsIFNxbEVycm9yLCBEZWZhdWx0VHlwZSB9IGZyb20gJy4vZGItd3JhcHBlci5tb2RlbHMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIERiV3JhcHBlclNlcnZpY2Uge1xyXG4gIHByaXZhdGUgX2RiTmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgX2xvY2F0aW9uOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfaW9zRGF0YWJhc2VMb2NhdGlvbjogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3JlYWR5UHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcclxuICBzY2hlbWE6IERCU2NoZW1hO1xyXG4gIGRiOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGRiQ29uZmlnOiBEYkNvbmZpZywgZGJTY2hlbWE/OiBEQlNjaGVtYSkge1xyXG5cclxuICAgIHRoaXMuX2RiTmFtZSA9IGRiQ29uZmlnLmRiTmFtZTtcclxuICAgIHRoaXMuX2xvY2F0aW9uID0gZGJDb25maWcubG9jYXRpb24gfHwgJ2RlZmF1bHQnO1xyXG4gICAgdGhpcy5faW9zRGF0YWJhc2VMb2NhdGlvbiA9IGRiQ29uZmlnLmlvc0RhdGFiYXNlTG9jYXRpb24gfHwgJ0xpYnJhcnknO1xyXG4gICAgY29uc3Qgd2luZG93ID0gKG5ldyBXaW5kb3dTZXJ2aWNlKCkpLm5hdGl2ZVdpbmRvdztcclxuICAgIGlmIChkYlNjaGVtYSkgeyB0aGlzLnNjaGVtYSA9IGRiU2NoZW1hOyB9XHJcbiAgICB0aGlzLl9yZWFkeVByb21pc2UgPSBuZXcgUHJvbWlzZSAoIChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuY29yZG92YSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmluaXQoZGJTY2hlbWEpLnRoZW4gKCAoKSA9PiByZXNvbHZlKCkgKS5jYXRjaCAoIChlcnIpID0+IHJlamVjdChlcnIpICk7XHJcbiAgICAgICAgfSwgNTAwKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkZXZpY2VyZWFkeScsICgpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdkYldyYXBwZXI6IGRldmljZSByZWFkeS4nKTtcclxuICAgICAgICAgIHRoaXMuaW5pdERldmljZShkYlNjaGVtYSkudGhlbiAoICgpID0+IHJlc29sdmUoKSApLmNhdGNoICggKGVycikgPT4gcmVqZWN0KGVycikgKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLl9yZWFkeVByb21pc2U7XHJcbiAgfVxyXG5cclxuICBpbml0RGV2aWNlKGRiU2NoZW1hOiBEQlNjaGVtYSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgd2luZG93ID0gKG5ldyBXaW5kb3dTZXJ2aWNlKCkpLm5hdGl2ZVdpbmRvdztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSggKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmRiID0gd2luZG93LnNxbGl0ZVBsdWdpbi5vcGVuRGF0YWJhc2Uoe1xyXG4gICAgICAgIG5hbWU6IHRoaXMuX2RiTmFtZSxcclxuICAgICAgICBsb2NhdGlvbjogdGhpcy5fbG9jYXRpb24sXHJcbiAgICAgICAgYW5kcm9pZExvY2tXb3JrYXJvdW5kOiAxXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKGRiU2NoZW1hKSB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZShkYlNjaGVtYSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgIH0pLnRoZW4oKCkgPT4geyByZXNvbHZlKCk7IH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpbml0KGRiU2NoZW1hOiBEQlNjaGVtYSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgd2luZG93ID0gKG5ldyBXaW5kb3dTZXJ2aWNlKCkpLm5hdGl2ZVdpbmRvdztcclxuICAgIHJldHVybiAgbmV3IFByb21pc2UgKCAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZGIgPSB3aW5kb3cub3BlbkRhdGFiYXNlKHRoaXMuX2RiTmFtZSwgJzEuMCcsICdkYXRhYmFzZScsIC0xKTtcclxuICAgICAgaWYgKGRiU2NoZW1hKSB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZShkYlNjaGVtYSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgfSkudGhlbiggKCkgPT4geyByZXNvbHZlKCk7IH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZShzY2hlbWE6IERCU2NoZW1hKTogUHJvbWlzZTxhbnk+IHtcclxuXHJcbiAgICBjb25zdCBzZW50ZW5jZXMgPSBbXTtcclxuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xyXG5cclxuICAgIGlmIChzY2hlbWEudGFibGVzKSB7XHJcbiAgICAgIHNjaGVtYS50YWJsZXMuZm9yRWFjaCh0YWJsZSA9PiB7XHJcbiAgICAgICAgc2VudGVuY2VzLnB1c2godGhpcy5jcmVhdGVUYWJsZSh0YWJsZSkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmIChzY2hlbWEudmlld3MpIHtcclxuICAgICAgc2NoZW1hLnZpZXdzLmZvckVhY2goIHZpZXcgPT4ge1xyXG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuY3JlYXRlVmlldyh2aWV3KSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHNlbnRlbmNlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFc3F1ZW1hIGRlIGxhIGJhc2UgZGUgZGF0b3MgdmFjaWEuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoc2VudGVuY2VzKTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVRhYmxlKHRhYmxlOiBEQlRhYmxlKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGxldCBzcWwgPSAnJywgc2VudGVuY2VzID0gW10sIG9uQ29uZmxpY3RQcmltYXJ5O1xyXG5cclxuICAgIHRhYmxlLmNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICBzZW50ZW5jZXMucHVzaCh0aGlzLmRlZkNvbHVtbihjb2wpKTtcclxuICAgIH0pO1xyXG5cclxuICAgIG9uQ29uZmxpY3RQcmltYXJ5ID0gJ29uIGNvbmZsaWN0IGZhaWwnO1xyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRhYmxlLnByaW1hcnkpICkgIHtcclxuICAgICAgc2VudGVuY2VzLnB1c2ggKCcgQ09OU1RSQUlOVCBpZGVudGlmaWNhZG9yIFBSSU1BUlkgS0VZICgnICsgdGFibGUucHJpbWFyeS5qb2luKCcsJykgKyAnKSAnICsgb25Db25mbGljdFByaW1hcnkgKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgdGFibGUucHJpbWFyeSA9PT0gJ3N0cmluZycpICAge1xyXG4gICAgICBzZW50ZW5jZXMucHVzaCAoJyBDT05TVFJBSU5UIGlkZW50aWZpY2Fkb3IgUFJJTUFSWSBLRVkgKCcgKyB0YWJsZS5wcmltYXJ5ICsgJykgJyArIG9uQ29uZmxpY3RQcmltYXJ5ICk7XHJcbiAgICB9XHJcbiAgICBpZiAodGFibGUudW5pcXVlcykge1xyXG4gICAgICB0YWJsZS51bmlxdWVzLmZvckVhY2goIHVuaXEgPT4ge1xyXG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuZGVmVW5pcXVlKHVuaXEpKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRhYmxlLmZvcmVpZ25zKSB7XHJcbiAgICAgIHRhYmxlLmZvcmVpZ25zLmZvckVhY2ggKCBmb3JlID0+IHtcclxuICAgICAgICBzZW50ZW5jZXMucHVzaCh0aGlzLmRlZkZvcmVpZ24oZm9yZSkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzcWwgPSAnQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJyArIHRhYmxlLm5hbWUgKyAnICgnICsgc2VudGVuY2VzLmpvaW4oJywnKSArJyknO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5KHNxbCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgY3JlYXRlVmlldyh2aWV3OiBEQlZpZXcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgbGV0IHNxbDogc3RyaW5nO1xyXG5cclxuICAgIHNxbCA9ICdDUkVBVEUgVklFVyBJRiBOT1QgRVhJU1RTICcgKyB2aWV3Lm5hbWVcclxuICAgICAgKyAnIEFTICcgKyB2aWV3LnNxbDtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5xdWVyeShzcWwpO1xyXG5cclxuICB9XHJcblxyXG4gIGdldFNjaGVtYVRhYmxlKHRhYmxlTmFtZTogc3RyaW5nKTogREJUYWJsZSB7XHJcbiAgICBsZXQgcmVzOiBEQlRhYmxlO1xyXG5cclxuICAgIHRoaXMuc2NoZW1hLnRhYmxlcy5mb3JFYWNoKCB0YWJsZSA9PiB7XHJcbiAgICAgIGlmICh0YWJsZS5uYW1lID09PSB0YWJsZU5hbWUpIHtcclxuICAgICAgICByZXMgPSB0YWJsZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzO1xyXG5cclxuICB9XHJcblxyXG4gIGdldFVuaXF1ZXNUYWJsZSh0YWJsZTogREJUYWJsZSk6IG9iamVjdCB7XHJcbiAgICBsZXQgcmVzOiB7fTtcclxuICAgIHRhYmxlLnVuaXF1ZXMuZm9yRWFjaCh1bmlxID0+IHtcclxuICAgICAgcmVzW3VuaXEubmFtZV0gPSB1bmlxO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgcXVlcnkocXVlcnk6IHN0cmluZywgYmluZGluZ3M6IGFueVtdPSBbXSk6IFByb21pc2U8U3FsUmVzdWx0U2V0PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBpZiAocXVlcnkuaW5kZXhPZignc2VsZWN0JykgPT09IDApIHtcclxuICAgICAgICB0aGlzLmRiLnJlYWRUcmFuc2FjdGlvbigodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwocXVlcnksIGJpbmRpbmdzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9LCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCBlcnJvcjogU3FsRXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sIChlcnI6IFNxbEVycm9yKSA9PiByZWplY3QoZXJyKSApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZGIudHJhbnNhY3Rpb24oKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbikgPT4ge1xyXG4gICAgICAgICAgICB0cmFuc2FjdGlvbi5leGVjdXRlU3FsKHF1ZXJ5LCBiaW5kaW5ncywgKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbiwgcmVzdWx0OiBTcWxSZXN1bHRTZXQpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgfSwgKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbiwgZXJyb3I6IFNxbEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LCAoZXJyOiBTcWxFcnJvcikgPT4gcmVqZWN0KGVycikgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBDb3VudChxdWVyeTogc3RyaW5nLCBiaW5kaW5nczogYW55W109IFtdKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5KHF1ZXJ5LCBiaW5kaW5ncykudGhlbihyb3dzID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb3dzQ291bnQocm93cyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGluc2VydCh0YWJsZTogc3RyaW5nLCBiaW5kaW5nczoge30pOiBQcm9taXNlPFNxbFJlc3VsdFNldD4ge1xyXG4gICAgbGV0IHNxbCA9ICcnLCBzcWxCaW5kcyA9IFtdLCBzcWxLZXlzID0gW10sIHNxbFZhbHVlcyA9IFtdIDtcclxuXHJcbiAgICBzcWwgPSBzcWwgKyAnaW5zZXJ0IGludG8gJyArIHRhYmxlICsgJyAnO1xyXG5cclxuICAgIGZvciAoY29uc3QgaW5kZXggaW4gYmluZGluZ3MpIHtcclxuICAgICAgIGlmIChiaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eShpbmRleCkpIHtcclxuICAgICAgICAgICAgc3FsS2V5cy5wdXNoKGluZGV4KTtcclxuICAgICAgICAgICAgc3FsVmFsdWVzLnB1c2goYmluZGluZ3NbaW5kZXhdKTtcclxuICAgICAgICAgICAgc3FsQmluZHMucHVzaCgnPycpO1xyXG4gICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNxbCA9IHNxbCArICcoJyArIHNxbEtleXMuam9pbignLCcpICsgJykgdmFsdWVzICgnICsgc3FsQmluZHMuam9pbignLCcpICsgJyknO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5kYi50cmFuc2FjdGlvbih0cmFuc2FjdGlvbiA9PiB7XHJcbiAgICAgICAgICB0cmFuc2FjdGlvbi5leGVjdXRlU3FsKHNxbCwgc3FsVmFsdWVzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xyXG4gICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgIH0sICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIGVycm9yOiBTcWxFcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZSh0YWJsZTogc3RyaW5nLCBiaW5kaW5nczoge30sIHdoZXJlOiB7fSk6IFByb21pc2U8U3FsUmVzdWx0U2V0PiB7XHJcbiAgICBsZXQgc3FsID0gJycsIHNxbEJpbmRzID0gW10sIHNxbEtleXMgPVtdLCBzcWxWYWx1ZXMgPSBbXSA7XHJcblxyXG4gICAgc3FsID0gc3FsICsgJ3VwZGF0ZSAnICsgdGFibGUgKyAnIHNldCAnO1xyXG5cclxuICAgIGZvciAobGV0IGluZGV4IGluIGJpbmRpbmdzKSB7XHJcbiAgICAgICBpZiAoYmluZGluZ3MuaGFzT3duUHJvcGVydHkoaW5kZXgpKSB7XHJcbiAgICAgICAgICAgIGxldCBuZXdPYmogPSBiaW5kaW5nc1tpbmRleF07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmV3T2JqID09PSAnb2JqZWN0JyAmJiBuZXdPYmogIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHNxbFZhbHVlcy5wdXNoKG5ld09iai52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV3T2JqLmlmbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNxbEJpbmRzLnB1c2goaW5kZXggKyAnID0gaWZudWxsKCAnICsgaW5kZXggKyAnLDApICsgPycpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdPYmoub3BlcmF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBzcWxCaW5kcy5wdXNoKGluZGV4ICsgJyA9ICcgKyBpbmRleCArIG5ld09iai5vcGVyYXRvciArICcgPycpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzcWxCaW5kcy5wdXNoKGluZGV4ICsgJyA9ID8nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzcWxCaW5kcy5wdXNoKGluZGV4ICsgJyA9ID8nKTtcclxuICAgICAgICAgICAgICAgIHNxbFZhbHVlcy5wdXNoKGJpbmRpbmdzW2luZGV4XSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaW5kZXggaW4gd2hlcmUpIHtcclxuICAgICAgIGlmICh3aGVyZS5oYXNPd25Qcm9wZXJ0eShpbmRleCkpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aGVyZVtpbmRleF0gPT09ICdvYmplY3QnICAmJiB3aGVyZVtpbmRleF0gIT09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgc3FsS2V5cy5wdXNoKGluZGV4ICsgJyAnICsgd2hlcmVbaW5kZXhdLm9wZXJhdG9yICsgJyA/Jyk7XHJcbiAgICAgICAgICAgICAgICBzcWxWYWx1ZXMucHVzaCh3aGVyZVtpbmRleF0udmFsdWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3FsS2V5cy5wdXNoKGluZGV4ICsgJyA9ID8nKTtcclxuICAgICAgICAgICAgICAgIHNxbFZhbHVlcy5wdXNoKHdoZXJlW2luZGV4XSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzcWwgPSBzcWwgKyBzcWxCaW5kcy5qb2luKCcsJykgKyAnIHdoZXJlICcgKyBzcWxLZXlzLmpvaW4oJyBhbmQgJyk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmRiLnRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uID0+IHtcclxuICAgICAgICB0cmFuc2FjdGlvbi5leGVjdXRlU3FsKHNxbCwgc3FsVmFsdWVzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSwgKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbiwgZXJyb3I6IFNxbEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkcm9wVGFibGUgKHRhYmxlczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjb250ID0gMTtcclxuXHJcbiAgICBjb250ID0gdGFibGVzLmxlbmd0aDtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRhYmxlcy5zb21lKCB0YWJsZSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbnQgIT09IDApIHtcclxuICAgICAgICAgIHRoaXMucXVlcnkoJ0RST1AgVEFCTEUgJyArIHRhYmxlKVxyXG4gICAgICAgICAgLnRoZW4oICgpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoY29udCA9PT0gMSApIHsgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7IGNvbnQtLTsgfVxyXG4gICAgICAgICAgfSwgZXJyID0+IHtcclxuICAgICAgICAgICAgY29udCA9IDA7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZmV0Y2hBbGwocmVzdWx0OiBTcWxSZXN1bHRTZXQpOiBvYmplY3RbXSB7XHJcbiAgICBsZXQgb3V0cHV0ID0gW107XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG91dHB1dC5wdXNoKHJlc3VsdC5yb3dzLml0ZW0oaSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgfVxyXG5cclxuICBmZXRjaChyZXN1bHQ6IFNxbFJlc3VsdFNldCk6IG9iamVjdCB7XHJcbiAgICAgIGxldCBvYmpldG8gPSB1bmRlZmluZWQsIG5ld09iaj0gdW5kZWZpbmVkO1xyXG4gICAgICBpZiAocmVzdWx0LnJvd3MubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICBvYmpldG8gPSByZXN1bHQucm93cy5pdGVtKDApO1xyXG4gICAgICAgICAgbmV3T2JqID0ge307XHJcbiAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZXRvKTtcclxuICAgICAgICAgIGZvciAobGV0IGtleSBpbiBrZXlzKSB7XHJcbiAgICAgICAgICAgICAgbmV3T2JqW2tleXNba2V5XV0gPSBvYmpldG9ba2V5c1trZXldXTtcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3T2JqO1xyXG4gIH1cclxuXHJcblxyXG4gIHJvd3NDb3VudChyZXN1bHQ6IFNxbFJlc3VsdFNldCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiByZXN1bHQucm93cy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuLyogUHJpdmF0ZSAqL1xyXG5cclxuICBwcml2YXRlIGRlZkNvbHVtbihjb2w6IERCQ29sdW1uKTogc3RyaW5nIHtcclxuICAgIGxldCBjb2xTcWw6IHN0cmluZztcclxuXHJcbiAgICBjb2xTcWwgPSBjb2wubmFtZSArICcgJyArIGNvbC50eXBlO1xyXG4gICAgaWYgKCFjb2wuaXNOdWxsYWJsZSkge1xyXG4gICAgICBjb2xTcWwgKz0gICcgTk9UIE5VTEwgJztcclxuICAgIH1cclxuICAgIGlmIChjb2wuZGVmYXVsdCkge1xyXG4gICAgICBjb2xTcWwgKz0gJyBERUZBVUxUICcgKyBjb2wuZGVmYXVsdCArICcgJztcclxuICAgIH1cclxuICAgIGlmIChjb2wudHlwZSA9PT0gJ3RleHQnICYmIGNvbC5sZW5ndGgpIHtcclxuICAgICAgY29sU3FsICs9IGAgQ09OU1RSQUlOVCAke2NvbC5uYW1lfV9sZW5ndGggQ0hFQ0sgKCBgO1xyXG4gICAgICBpZiAoY29sLmlzTnVsbGFibGUpIHtcclxuICAgICAgICBjb2xTcWwgKz0gYCR7Y29sLm5hbWV9IGlzIG51bGwgT1IgYDtcclxuICAgICAgfVxyXG4gICAgICBjb2xTcWwgKz0gYGxlbmd0aCgke2NvbC5uYW1lfSkgPD0gJHtjb2wubGVuZ3RofSApYDtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbFNxbDtcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlZlVuaXF1ZSh1bmlxdWU6IERCVW5pcXVlKTogc3RyaW5nIHtcclxuICAgIGxldCB1bmlxU3FsOiBzdHJpbmc7XHJcblxyXG4gICAgLy8gZGVwZW5kZSBkZWwgZW50b3JubywgcHJvZHVjY2nDs24gbyBkZXNhcnJvbGxvXHJcbiAgICBjb25zdCBvbkNvbmZsaWN0VW5pcXVlID0gJ29uIGNvbmZsaWN0IHJlcGxhY2UnO1xyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KHVuaXF1ZS5maWVsZHMpICkgIHtcclxuICAgICAgdW5pcVNxbCA9IGAgQ09OU1RSQUlOVCAke3VuaXF1ZS5uYW1lfSBVTklRVUUgKCAke3VuaXF1ZS5maWVsZHMuam9pbignLCcpfSApICR7b25Db25mbGljdFVuaXF1ZX0gYDtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgdW5pcXVlLmZpZWxkcyA9PT0gJ3N0cmluZycpICAge1xyXG4gICAgICB1bmlxU3FsID0gYCBDT05TVFJBSU5UICR7dW5pcXVlLm5hbWV9IFVOSVFVRSAoICR7dW5pcXVlLmZpZWxkc30gKSAke29uQ29uZmxpY3RVbmlxdWV9IGA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVuaXFTcWw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlZkZvcmVpZ24oZm9yZTogREJGb3JlaWduKTogc3RyaW5nIHtcclxuICAgIGxldCBmb3JlU3FsOiBzdHJpbmc7XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9yZS5mb3JlaWduS2V5KSApICB7XHJcbiAgICAgIGZvcmVTcWwgPSBgIEZPUkVJR04gS0VZICggICR7Zm9yZS5mb3JlaWduS2V5LmpvaW4oJywnKX0gKSBgO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgZm9yZS5mb3JlaWduS2V5ID09PSAnc3RyaW5nJykgICB7XHJcbiAgICAgIGZvcmVTcWwgPSBgIEZPUkVJR04gS0VZICggICR7Zm9yZS5mb3JlaWduS2V5fSApIGA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9yZS5wcmltYXJ5S2V5KSApICB7XHJcbiAgICAgIGZvcmVTcWwgPSBgIFJFRkVSRU5DRVMgJHtmb3JlLnJlZmVyZW5jZVRhYmxlfSAoICAke2ZvcmUucHJpbWFyeUtleS5qb2luKCcsJyl9ICkgYDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIGZvcmUucHJpbWFyeUtleSA9PT0gJ3N0cmluZycpICAge1xyXG4gICAgICBmb3JlU3FsID0gYCBSRUZFUkVOQ0VTICR7Zm9yZS5yZWZlcmVuY2VUYWJsZX0gKCAgJHtmb3JlLnByaW1hcnlLZXl9ICkgYDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm9yZVNxbDtcclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBEQl9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48RGJDb25maWc+KCdkYldyYXBwZXJDb25maWcnKTtcclxuZXhwb3J0IGNvbnN0IERCX1NDSEVNQSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxEQlNjaGVtYT4oJ2RiV3JhcHBlclNjaGVtYScpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHREYkNvbmZpZygpOiBEYkNvbmZpZyB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGRiTmFtZTogJ2RiLnNxbGl0ZScsXHJcbiAgICBsb2NhdGlvbjogJ2RlZmF1bHQnLFxyXG4gICAgaW9zRGF0YWJhc2VMb2NhdGlvbjogJ0xpYnJhcnknXHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVEYldyYXBwZXIoZGJDb25maWc6IERiQ29uZmlnLCBkYlNjaGVtYT86IERCU2NoZW1hKTogRGJXcmFwcGVyU2VydmljZSB7XHJcbiAgY29uc3QgY29uZmlnID0gISFkYkNvbmZpZyA/IGRiQ29uZmlnIDogZ2V0RGVmYXVsdERiQ29uZmlnKCk7XHJcbiAgcmV0dXJuIG5ldyBEYldyYXBwZXJTZXJ2aWNlKGNvbmZpZywgZGJTY2hlbWEpO1xyXG59XHJcblxyXG5cclxuXHJcbiJdfQ==
408
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGItd3JhcHBlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGItd3JhcHBlci8iLCJzb3VyY2VzIjpbImxpYi9kYi13cmFwcGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSWpELE1BQU0sT0FBTyxnQkFBZ0I7SUFRM0IsWUFBWSxRQUFrQixFQUFFLFFBQW1CO1FBRWpELElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDO1FBQ2hELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxRQUFRLENBQUMsbUJBQW1CLElBQUksU0FBUyxDQUFDO1FBQ3RFLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxhQUFhLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUNsRCxJQUFJLFFBQVEsRUFBRTtZQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO1NBQUU7UUFDekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLE9BQU8sQ0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyRCxJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxXQUFXLEVBQUU7Z0JBQ3pDLFVBQVUsQ0FBRSxHQUFHLEVBQUU7b0JBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQ3RCLEdBQUcsRUFBRTt3QkFDSCxPQUFPLEVBQUUsQ0FBQztvQkFDWixDQUFDLENBQUU7eUJBQ0YsS0FBSyxDQUFHLENBQUMsR0FBRyxFQUFFLEVBQUU7d0JBQ2YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNkLENBQUMsQ0FBRSxDQUFDO2dCQUNSLENBQUMs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WUFBRyxPQUFPLElBQUksQ0FBQztTQUFFO0lBQy9FLENBQUM7SUFFTyxTQUFTLENBQUMsS0FBYSxFQUFFLEdBQWE7UUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxNQUFNLEtBQUssR0FBRyxjQUFjLEdBQUcsS0FBSyxHQUFHLGNBQWMsR0FBRyxNQUFNLENBQUM7UUFDL0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLENBQUM7Q0FFRjtBQUlELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxJQUFJLGNBQWMsQ0FBVyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3pFLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxJQUFJLGNBQWMsQ0FBVyxpQkFBaUIsQ0FBQyxDQUFDO0FBRXpFLE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsT0FBTztRQUNMLE1BQU0sRUFBRSxXQUFXO1FBQ25CLFFBQVEsRUFBRSxTQUFTO1FBQ25CLG1CQUFtQixFQUFFLFNBQVM7S0FDL0IsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsUUFBa0IsRUFBRSxRQUFtQjtJQUN0RSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUQsT0FBTyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNoRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgV2luZG93U2VydmljZSB9IGZyb20gJy4vd2luZG93LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEQlRhYmxlLCBEYkNvbmZpZywgREJTY2hlbWEsIERCVmlldyxcclxuICBEQkNvbHVtbiwgREJVbmlxdWUsIERCRm9yZWlnbiwgU3FsVHJhbnNhY3Rpb24sIFNxbFJlc3VsdFNldCwgU3FsRXJyb3IsIERlZmF1bHRUeXBlIH0gZnJvbSAnLi9kYi13cmFwcGVyLm1vZGVscyc7XHJcblxyXG5leHBvcnQgY2xhc3MgRGJXcmFwcGVyU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBfZGJOYW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfbG9jYXRpb246IHN0cmluZztcclxuICBwcml2YXRlIF9pb3NEYXRhYmFzZUxvY2F0aW9uOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfcmVhZHlQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xyXG4gIHNjaGVtYTogREJTY2hlbWE7XHJcbiAgZGI6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoZGJDb25maWc6IERiQ29uZmlnLCBkYlNjaGVtYT86IERCU2NoZW1hKSB7XHJcblxyXG4gICAgdGhpcy5fZGJOYW1lID0gZGJDb25maWcuZGJOYW1lO1xyXG4gICAgdGhpcy5fbG9jYXRpb24gPSBkYkNvbmZpZy5sb2NhdGlvbiB8fCAnZGVmYXVsdCc7XHJcbiAgICB0aGlzLl9pb3NEYXRhYmFzZUxvY2F0aW9uID0gZGJDb25maWcuaW9zRGF0YWJhc2VMb2NhdGlvbiB8fCAnTGlicmFyeSc7XHJcbiAgICBjb25zdCB3aW5kb3cgPSAobmV3IFdpbmRvd1NlcnZpY2UoKSkubmF0aXZlV2luZG93O1xyXG4gICAgaWYgKGRiU2NoZW1hKSB7IHRoaXMuc2NoZW1hID0gZGJTY2hlbWE7IH1cclxuICAgIHRoaXMuX3JlYWR5UHJvbWlzZSA9IG5ldyBQcm9taXNlICggKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5jb3Jkb3ZhID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHNldFRpbWVvdXQoICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuaW5pdChkYlNjaGVtYSkudGhlbiAoXHJcbiAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH0gKVxyXG4gICAgICAgICAgICAuY2F0Y2ggKCAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgIH0gKTtcclxuICAgICAgICB9LCA1MDApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZXJlYWR5JywgKCkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ2RiV3JhcHBlcjogZGV2aWNlIHJlYWR5LicpO1xyXG4gICAgICAgICAgdGhpcy5pbml0RGV2aWNlKGRiU2NoZW1hKS50aGVuICggKCkgPT4gcmVzb2x2ZSgpICkuY2F0Y2ggKCAoZXJyKSA9PiByZWplY3QoZXJyKSApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlYWR5UHJvbWlzZTtcclxuICB9XHJcblxyXG4gIGluaXREZXZpY2UoZGJTY2hlbWE6IERCU2NoZW1hKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB3aW5kb3cgPSAobmV3IFdpbmRvd1NlcnZpY2UoKSkubmF0aXZlV2luZG93O1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKCAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZGIgPSB3aW5kb3cuc3FsaXRlUGx1Z2luLm9wZW5EYXRhYmFzZSh7XHJcbiAgICAgICAgbmFtZTogdGhpcy5fZGJOYW1lLFxyXG4gICAgICAgIGxvY2F0aW9uOiB0aGlzLl9sb2NhdGlvbixcclxuICAgICAgICBhbmRyb2lkTG9ja1dvcmthcm91bmQ6IDFcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAoZGJTY2hlbWEpIHtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlKGRiU2NoZW1hKS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgfSkudGhlbigoKSA9PiB7IHJlc29sdmUoKTsgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGluaXQoZGJTY2hlbWE6IERCU2NoZW1hKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB3aW5kb3cgPSAobmV3IFdpbmRvd1NlcnZpY2UoKSkubmF0aXZlV2luZG93O1xyXG4gICAgcmV0dXJuICBuZXcgUHJvbWlzZSAoIChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5kYiA9IHdpbmRvdy5vcGVuRGF0YWJhc2UodGhpcy5fZGJOYW1lLCAnMS4wJywgJ2RhdGFiYXNlJywgLTEpO1xyXG4gICAgICBpZiAoZGJTY2hlbWEpIHtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlKGRiU2NoZW1hKS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICB9KS50aGVuKCAoKSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdlbmVyYXRlKHNjaGVtYTogREJTY2hlbWEpOiBQcm9taXNlPGFueT4ge1xyXG5cclxuICAgIGNvbnN0IHNlbnRlbmNlcyA9IFtdO1xyXG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XHJcblxyXG4gICAgaWYgKHNjaGVtYS50YWJsZXMpIHtcclxuICAgICAgc2NoZW1hLnRhYmxlcy5mb3JFYWNoKHRhYmxlID0+IHtcclxuICAgICAgICBzZW50ZW5jZXMucHVzaCh0aGlzLmNyZWF0ZVRhYmxlKHRhYmxlKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHNjaGVtYS52aWV3cykge1xyXG4gICAgICBzY2hlbWEudmlld3MuZm9yRWFjaCggdmlldyA9PiB7XHJcbiAgICAgICAgc2VudGVuY2VzLnB1c2godGhpcy5jcmVhdGVWaWV3KHZpZXcpKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAoc2VudGVuY2VzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VzcXVlbWEgZGUgbGEgYmFzZSBkZSBkYXRvcyB2YWNpYS4nKTtcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLmFsbChzZW50ZW5jZXMpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY3JlYXRlVGFibGUodGFibGU6IERCVGFibGUpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgbGV0IHNxbCA9ICcnLCAgb25Db25mbGljdFByaW1hcnk7XHJcbiAgICBjb25zdCBzZW50ZW5jZXMgPSBbXSwgIG5ld0NvbHVtbnMgPSBbXVxyXG5cclxuICAgIGNvbnN0IHRhYmxlRERMID0gYXdhaXQgdGhpcy5fdGFibGVFeGlzdHModGFibGUubmFtZSk7XHJcbiAgICBpZiAodGFibGVEREwpIHtcclxuICAgICAgICB0YWJsZS5jb2x1bW5zLmZvckVhY2goIGNvbCA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX2NvbHVtbkV4aXN0cyh0YWJsZURETCBhcyBzdHJpbmcsIGNvbC5uYW1lKSApIHtcclxuICAgICAgICAgICAgbmV3Q29sdW1ucy5wdXNoKHRoaXMuYWRkQ29sdW1uKHRhYmxlLm5hbWUsIGNvbCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGFibGUuY29sdW1ucy5mb3JFYWNoKCBjb2wgPT4ge1xyXG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuZGVmQ29sdW1uKGNvbCkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIG9uQ29uZmxpY3RQcmltYXJ5ID0gJ29uIGNvbmZsaWN0IGZhaWwnO1xyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRhYmxlLnByaW1hcnkpICkgIHtcclxuICAgICAgc2VudGVuY2VzLnB1c2ggKCcgQ09OU1RSQUlOVCBpZGVudGlmaWNhZG9yIFBSSU1BUlkgS0VZICgnICsgdGFibGUucHJpbWFyeS5qb2luKCcsJykgKyAnKSAnICsgb25Db25mbGljdFByaW1hcnkgKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgdGFibGUucHJpbWFyeSA9PT0gJ3N0cmluZycpICAge1xyXG4gICAgICBzZW50ZW5jZXMucHVzaCAoJyBDT05TVFJBSU5UIGlkZW50aWZpY2Fkb3IgUFJJTUFSWSBLRVkgKCcgKyB0YWJsZS5wcmltYXJ5ICsgJykgJyArIG9uQ29uZmxpY3RQcmltYXJ5ICk7XHJcbiAgICB9XHJcbiAgICBpZiAodGFibGUudW5pcXVlcykge1xyXG4gICAgICB0YWJsZS51bmlxdWVzLmZvckVhY2goIHVuaXEgPT4ge1xyXG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuZGVmVW5pcXVlKHVuaXEpKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRhYmxlLmZvcmVpZ25zKSB7XHJcbiAgICAgIHRhYmxlLmZvcmVpZ25zLmZvckVhY2ggKCBmb3JlID0+IHtcclxuICAgICAgICBzZW50ZW5jZXMucHVzaCh0aGlzLmRlZkZvcmVpZ24oZm9yZSkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGFibGVEREwgJiYgbmV3Q29sdW1ucy5sZW5ndGggIT09IDApIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG5ld0NvbHVtbnMpXHJcbiAgICAgIC50aGVuKCAoKSA9PiB7IGNvbnNvbGUubG9nKGBUYWJsZSAke3RhYmxlLm5hbWV9IGFsdGVyZWQuYCk7IH0gKVxyXG4gICAgICAuY2F0Y2goIChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yIChgVGFibGUgJHt0YWJsZS5uYW1lfTogJHtlcnIubWVzc2FnZX1gKTtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlICR7dGFibGUubmFtZX06ICR7ZXJyLm1lc3NhZ2V9YCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0gZWxzZSBpZiAoIXRhYmxlRERMKSB7XHJcbiAgICAgIHNxbCA9ICdDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAnICsgdGFibGUubmFtZSArICcgKCcgKyBzZW50ZW5jZXMuam9pbignLCcpICsgJyknO1xyXG4gICAgICByZXR1cm4gdGhpcy5xdWVyeShzcWwpXHJcbiAgICAgIC50aGVuKCAoKSA9PiB7IGNvbnNvbGUubG9nKGBUYWJsZSAke3RhYmxlLm5hbWV9IGNyZWF0ZWQuYCk7IH0pXHJcbiAgICAgIC5jYXRjaCggKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IgKGBUYWJsZSAke3RhYmxlLm5hbWV9OiAke2Vyci5tZXNzYWdlfWApO1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgJHt0YWJsZS5uYW1lfTogJHtlcnIubWVzc2FnZX1gKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbiggKCkgPT4geyBjb25zb2xlLmxvZyhgVGFibGUgJHt0YWJsZS5uYW1lfSBpbml0aWFsaXplZC5gKTsgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgY3JlYXRlVmlldyh2aWV3OiBEQlZpZXcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgbGV0IHNxbDogc3RyaW5nO1xyXG5cclxuICAgIHNxbCA9ICdDUkVBVEUgVklFVyBJRiBOT1QgRVhJU1RTICcgKyB2aWV3Lm5hbWVcclxuICAgICAgKyAnIEFTICcgKyB2aWV3LnNxbDtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5xdWVyeShzcWwpO1xyXG5cclxuICB9XHJcblxyXG4gIGdldFNjaGVtYVRhYmxlKHRhYmxlTmFtZTogc3RyaW5nKTogREJUYWJsZSB7XHJcbiAgICBsZXQgcmVzOiBEQlRhYmxlO1xyXG5cclxuICAgIHRoaXMuc2NoZW1hLnRhYmxlcy5mb3JFYWNoKCB0YWJsZSA9PiB7XHJcbiAgICAgIGlmICh0YWJsZS5uYW1lID09PSB0YWJsZU5hbWUpIHtcclxuICAgICAgICByZXMgPSB0YWJsZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzO1xyXG5cclxuICB9XHJcblxyXG4gIGdldFVuaXF1ZXNUYWJsZSh0YWJsZTogREJUYWJsZSk6IG9iamVjdCB7XHJcbiAgICBsZXQgcmVzOiB7fTtcclxuICAgIHRhYmxlLnVuaXF1ZXMuZm9yRWFjaCh1bmlxID0+IHtcclxuICAgICAgcmVzW3VuaXEubmFtZV0gPSB1bmlxO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgcXVlcnkocXVlcnk6IHN0cmluZywgYmluZGluZ3M6IGFueVtdPSBbXSk6IFByb21pc2U8U3FsUmVzdWx0U2V0PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBpZiAocXVlcnkuaW5kZXhPZignc2VsZWN0JykgPT09IDApIHtcclxuICAgICAgICB0aGlzLmRiLnJlYWRUcmFuc2FjdGlvbigodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwocXVlcnksIGJpbmRpbmdzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9LCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCBlcnJvcjogU3FsRXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sIChlcnI6IFNxbEVycm9yKSA9PiByZWplY3QoZXJyKSApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZGIudHJhbnNhY3Rpb24oKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbikgPT4ge1xyXG4gICAgICAgICAgICB0cmFuc2FjdGlvbi5leGVjdXRlU3FsKHF1ZXJ5LCBiaW5kaW5ncywgKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbiwgcmVzdWx0OiBTcWxSZXN1bHRTZXQpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgfSwgKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbiwgZXJyb3I6IFNxbEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LCAoZXJyOiBTcWxFcnJvcikgPT4gcmVqZWN0KGVycikgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBDb3VudChxdWVyeTogc3RyaW5nLCBiaW5kaW5nczogYW55W109IFtdKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5KHF1ZXJ5LCBiaW5kaW5ncykudGhlbihyb3dzID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb3dzQ291bnQocm93cyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGluc2VydCh0YWJsZTogc3RyaW5nLCBiaW5kaW5nczoge30pOiBQcm9taXNlPFNxbFJlc3VsdFNldD4ge1xyXG4gICAgbGV0IHNxbCA9ICcnLCBzcWxCaW5kcyA9IFtdLCBzcWxLZXlzID0gW10sIHNxbFZhbHVlcyA9IFtdIDtcclxuXHJcbiAgICBzcWwgPSBzcWwgKyAnaW5zZXJ0IGludG8gJyArIHRhYmxlICsgJyAnO1xyXG5cclxuICAgIGZvciAoY29uc3QgaW5kZXggaW4gYmluZGluZ3MpIHtcclxuICAgICAgIGlmIChiaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eShpbmRleCkpIHtcclxuICAgICAgICAgICAgc3FsS2V5cy5wdXNoKGluZGV4KTtcclxuICAgICAgICAgICAgc3FsVmFsdWVzLnB1c2goYmluZGluZ3NbaW5kZXhdKTtcclxuICAgICAgICAgICAgc3FsQmluZHMucHVzaCgnPycpO1xyXG4gICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNxbCA9IHNxbCArICcoJyArIHNxbEtleXMuam9pbignLCcpICsgJykgdmFsdWVzICgnICsgc3FsQmluZHMuam9pbignLCcpICsgJyknO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5kYi50cmFuc2FjdGlvbih0cmFuc2FjdGlvbiA9PiB7XHJcbiAgICAgICAgICB0cmFuc2FjdGlvbi5leGVjdXRlU3FsKHNxbCwgc3FsVmFsdWVzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xyXG4gICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgIH0sICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIGVycm9yOiBTcWxFcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZSh0YWJsZTogc3RyaW5nLCBiaW5kaW5nczoge30sIHdoZXJlOiB7fSk6IFByb21pc2U8U3FsUmVzdWx0U2V0PiB7XHJcbiAgICBsZXQgc3FsID0gJycsIHNxbEJpbmRzID0gW10sIHNxbEtleXMgPVtdLCBzcWxWYWx1ZXMgPSBbXSA7XHJcblxyXG4gICAgc3FsID0gc3FsICsgJ3VwZGF0ZSAnICsgdGFibGUgKyAnIHNldCAnO1xyXG5cclxuICAgIGZvciAobGV0IGluZGV4IGluIGJpbmRpbmdzKSB7XHJcbiAgICAgICBpZiAoYmluZGluZ3MuaGFzT3duUHJvcGVydHkoaW5kZXgpKSB7XHJcbiAgICAgICAgICAgIGxldCBuZXdPYmogPSBiaW5kaW5nc1tpbmRleF07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmV3T2JqID09PSAnb2JqZWN0JyAmJiBuZXdPYmogIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHNxbFZhbHVlcy5wdXNoKG5ld09iai52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV3T2JqLmlmbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNxbEJpbmRzLnB1c2goaW5kZXggKyAnID0gaWZudWxsKCAnICsgaW5kZXggKyAnLDApICsgPycpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdPYmoub3BlcmF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBzcWxCaW5kcy5wdXNoKGluZGV4ICsgJyA9ICcgKyBpbmRleCArIG5ld09iai5vcGVyYXRvciArICcgPycpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzcWxCaW5kcy5wdXNoKGluZGV4ICsgJyA9ID8nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzcWxCaW5kcy5wdXNoKGluZGV4ICsgJyA9ID8nKTtcclxuICAgICAgICAgICAgICAgIHNxbFZhbHVlcy5wdXNoKGJpbmRpbmdzW2luZGV4XSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaW5kZXggaW4gd2hlcmUpIHtcclxuICAgICAgIGlmICh3aGVyZS5oYXNPd25Qcm9wZXJ0eShpbmRleCkpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aGVyZVtpbmRleF0gPT09ICdvYmplY3QnICAmJiB3aGVyZVtpbmRleF0gIT09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgc3FsS2V5cy5wdXNoKGluZGV4ICsgJyAnICsgd2hlcmVbaW5kZXhdLm9wZXJhdG9yICsgJyA/Jyk7XHJcbiAgICAgICAgICAgICAgICBzcWxWYWx1ZXMucHVzaCh3aGVyZVtpbmRleF0udmFsdWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3FsS2V5cy5wdXNoKGluZGV4ICsgJyA9ID8nKTtcclxuICAgICAgICAgICAgICAgIHNxbFZhbHVlcy5wdXNoKHdoZXJlW2luZGV4XSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzcWwgPSBzcWwgKyBzcWxCaW5kcy5qb2luKCcsJykgKyAnIHdoZXJlICcgKyBzcWxLZXlzLmpvaW4oJyBhbmQgJyk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmRiLnRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uID0+IHtcclxuICAgICAgICB0cmFuc2FjdGlvbi5leGVjdXRlU3FsKHNxbCwgc3FsVmFsdWVzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSwgKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbiwgZXJyb3I6IFNxbEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkcm9wVGFibGUgKHRhYmxlczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjb250ID0gMTtcclxuXHJcbiAgICBjb250ID0gdGFibGVzLmxlbmd0aDtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRhYmxlcy5zb21lKCB0YWJsZSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbnQgIT09IDApIHtcclxuICAgICAgICAgIHRoaXMucXVlcnkoJ0RST1AgVEFCTEUgJyArIHRhYmxlKVxyXG4gICAgICAgICAgLnRoZW4oICgpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoY29udCA9PT0gMSApIHsgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7IGNvbnQtLTsgfVxyXG4gICAgICAgICAgfSwgZXJyID0+IHtcclxuICAgICAgICAgICAgY29udCA9IDA7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZmV0Y2hBbGwocmVzdWx0OiBTcWxSZXN1bHRTZXQpOiBvYmplY3RbXSB7XHJcbiAgICBsZXQgb3V0cHV0ID0gW107XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG91dHB1dC5wdXNoKHJlc3VsdC5yb3dzLml0ZW0oaSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgfVxyXG5cclxuICBmZXRjaChyZXN1bHQ6IFNxbFJlc3VsdFNldCk6IG9iamVjdCB7XHJcbiAgICAgIGxldCBvYmpldG8gPSB1bmRlZmluZWQsIG5ld09iaj0gdW5kZWZpbmVkO1xyXG4gICAgICBpZiAocmVzdWx0LnJvd3MubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICBvYmpldG8gPSByZXN1bHQucm93cy5pdGVtKDApO1xyXG4gICAgICAgICAgbmV3T2JqID0ge307XHJcbiAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZXRvKTtcclxuICAgICAgICAgIGZvciAobGV0IGtleSBpbiBrZXlzKSB7XHJcbiAgICAgICAgICAgICAgbmV3T2JqW2tleXNba2V5XV0gPSBvYmpldG9ba2V5c1trZXldXTtcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3T2JqO1xyXG4gIH1cclxuXHJcblxyXG4gIHJvd3NDb3VudChyZXN1bHQ6IFNxbFJlc3VsdFNldCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiByZXN1bHQucm93cy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICB0YWJsZUV4aXN0cyh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgnc2VsZWN0ICBzcWwgZnJvbSBzcWxpdGVfbWFzdGVyICcgK1xyXG4gICAgICAgICd3aGVyZSB0eXBlPVxcJ3RhYmxlXFwnIGFuZCBuYW1lPVxcJycgKyB0YWJsZSArICdcXCcnKVxyXG4gICAgLnRoZW4ocmVzdWx0ID0+ICAodGhpcy5yb3dzQ291bnQocmVzdWx0KSA9PT0gMSkgKTtcclxuICB9ICBcclxuXHJcbiAgY29sdW1uRXhpc3RzKHRhYmxlOiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFibGVFeGlzdHModGFibGUpXHJcbiAgICAgIC50aGVuKCh0YWJsZURETCkgPT4ge1xyXG4gICAgICAgIGlmICh0YWJsZURETCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbkV4aXN0cygodGFibGVEREwgYXMgc3RyaW5nKSwgY29sdW1uKTtcclxuICAgICAgICB9IGVsc2UgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuLyogUHJpdmF0ZSAqL1xyXG5cclxuICBwcml2YXRlIGRlZkNvbHVtbihjb2w6IERCQ29sdW1uKTogc3RyaW5nIHtcclxuICAgIGxldCBjb2xTcWw6IHN0cmluZztcclxuXHJcbiAgICBjb2xTcWwgPSBjb2wubmFtZSArICcgJyArIGNvbC50eXBlO1xyXG4gICAgaWYgKCFjb2wuaXNOdWxsYWJsZSkge1xyXG4gICAgICBjb2xTcWwgKz0gICcgTk9UIE5VTEwgJztcclxuICAgIH1cclxuICAgIGlmIChjb2wuZGVmYXVsdCkge1xyXG4gICAgICBjb2xTcWwgKz0gJyBERUZBVUxUICcgKyBjb2wuZGVmYXVsdCArICcgJztcclxuICAgIH1cclxuICAgIGlmIChjb2wudHlwZSA9PT0gJ3RleHQnICYmIGNvbC5sZW5ndGgpIHtcclxuICAgICAgY29sU3FsICs9IGAgQ09OU1RSQUlOVCAke2NvbC5uYW1lfV9sZW5ndGggQ0hFQ0sgKCBgO1xyXG4gICAgICBpZiAoY29sLmlzTnVsbGFibGUpIHtcclxuICAgICAgICBjb2xTcWwgKz0gYCR7Y29sLm5hbWV9IGlzIG51bGwgT1IgYDtcclxuICAgICAgfVxyXG4gICAgICBjb2xTcWwgKz0gYGxlbmd0aCgke2NvbC5uYW1lfSkgPD0gJHtjb2wubGVuZ3RofSApYDtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbFNxbDtcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlZlVuaXF1ZSh1bmlxdWU6IERCVW5pcXVlKTogc3RyaW5nIHtcclxuICAgIGxldCB1bmlxU3FsOiBzdHJpbmc7XHJcblxyXG4gICAgLy8gZGVwZW5kZSBkZWwgZW50b3JubywgcHJvZHVjY2nDs24gbyBkZXNhcnJvbGxvXHJcbiAgICBjb25zdCBvbkNvbmZsaWN0VW5pcXVlID0gJ29uIGNvbmZsaWN0IHJlcGxhY2UnO1xyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KHVuaXF1ZS5maWVsZHMpICkgIHtcclxuICAgICAgdW5pcVNxbCA9IGAgQ09OU1RSQUlOVCAke3VuaXF1ZS5uYW1lfSBVTklRVUUgKCAke3VuaXF1ZS5maWVsZHMuam9pbignLCcpfSApICR7b25Db25mbGljdFVuaXF1ZX0gYDtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgdW5pcXVlLmZpZWxkcyA9PT0gJ3N0cmluZycpICAge1xyXG4gICAgICB1bmlxU3FsID0gYCBDT05TVFJBSU5UICR7dW5pcXVlLm5hbWV9IFVOSVFVRSAoICR7dW5pcXVlLmZpZWxkc30gKSAke29uQ29uZmxpY3RVbmlxdWV9IGA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVuaXFTcWw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlZkZvcmVpZ24oZm9yZTogREJGb3JlaWduKTogc3RyaW5nIHtcclxuICAgIGxldCBmb3JlU3FsOiBzdHJpbmc7XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9yZS5mb3JlaWduS2V5KSApICB7XHJcbiAgICAgIGZvcmVTcWwgPSBgIEZPUkVJR04gS0VZICggICR7Zm9yZS5mb3JlaWduS2V5LmpvaW4oJywnKX0gKSBgO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgZm9yZS5mb3JlaWduS2V5ID09PSAnc3RyaW5nJykgICB7XHJcbiAgICAgIGZvcmVTcWwgPSBgIEZPUkVJR04gS0VZICggICR7Zm9yZS5mb3JlaWduS2V5fSApIGA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9yZS5wcmltYXJ5S2V5KSApICB7XHJcbiAgICAgIGZvcmVTcWwgPSBgIFJFRkVSRU5DRVMgJHtmb3JlLnJlZmVyZW5jZVRhYmxlfSAoICAke2ZvcmUucHJpbWFyeUtleS5qb2luKCcsJyl9ICkgYDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIGZvcmUucHJpbWFyeUtleSA9PT0gJ3N0cmluZycpICAge1xyXG4gICAgICBmb3JlU3FsID0gYCBSRUZFUkVOQ0VTICR7Zm9yZS5yZWZlcmVuY2VUYWJsZX0gKCAgJHtmb3JlLnByaW1hcnlLZXl9ICkgYDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm9yZVNxbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3RhYmxlRXhpc3RzKHRhYmxlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5KCdzZWxlY3QgIHNxbCBmcm9tIHNxbGl0ZV9tYXN0ZXIgJyArXHJcbiAgICAgICAgJ3doZXJlIHR5cGU9XFwndGFibGVcXCcgYW5kIG5hbWU9XFwnJyArIHRhYmxlICsgJ1xcJycpXHJcbiAgICAudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnJvd3NDb3VudChyZXN1bHQpID09PSAxKSB7IHJldHVybiAodGhpcy5mZXRjaChyZXN1bHQpIGFzIGFueSkuc3FsIGFzIHN0cmluZzsgfSBlbHNlIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbHVtbkV4aXN0cyh0YWJsZURETDogc3RyaW5nLCBjb2x1bW46IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICh0YWJsZURETC5pbmRleE9mKGNvbHVtbikgPT09IC0xKSB7IHJldHVybiBmYWxzZTsgfSBlbHNlIHsgIHJldHVybiB0cnVlOyB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZENvbHVtbih0YWJsZTogc3RyaW5nLCBjb2w6IERCQ29sdW1uKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IGNvbFNxbCA9IHRoaXMuZGVmQ29sdW1uKGNvbCk7XHJcbiAgICBjb25zdCBxdWVyeSA9ICdhbHRlciBUQUJMRSAnICsgdGFibGUgKyAnIGFkZCBDT0xVTU4gJyArIGNvbFNxbDtcclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5KHF1ZXJ5KTtcclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBEQl9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48RGJDb25maWc+KCdkYldyYXBwZXJDb25maWcnKTtcclxuZXhwb3J0IGNvbnN0IERCX1NDSEVNQSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxEQlNjaGVtYT4oJ2RiV3JhcHBlclNjaGVtYScpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHREYkNvbmZpZygpOiBEYkNvbmZpZyB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGRiTmFtZTogJ2RiLnNxbGl0ZScsXHJcbiAgICBsb2NhdGlvbjogJ2RlZmF1bHQnLFxyXG4gICAgaW9zRGF0YWJhc2VMb2NhdGlvbjogJ0xpYnJhcnknXHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVEYldyYXBwZXIoZGJDb25maWc6IERiQ29uZmlnLCBkYlNjaGVtYT86IERCU2NoZW1hKTogRGJXcmFwcGVyU2VydmljZSB7XHJcbiAgY29uc3QgY29uZmlnID0gISFkYkNvbmZpZyA/IGRiQ29uZmlnIDogZ2V0RGVmYXVsdERiQ29uZmlnKCk7XHJcbiAgcmV0dXJuIG5ldyBEYldyYXBwZXJTZXJ2aWNlKGNvbmZpZywgZGJTY2hlbWEpO1xyXG59XHJcblxyXG5cclxuXHJcbiJdfQ==