@sochdb/sochdb 0.5.1 → 0.5.3

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.
@@ -10,6 +10,7 @@ exports.EmbeddedDatabase = void 0;
10
10
  const errors_1 = require("../errors");
11
11
  const bindings_1 = require("./ffi/bindings");
12
12
  const transaction_1 = require("./transaction");
13
+ const namespace_1 = require("../namespace");
13
14
  /**
14
15
  * Embedded Database using direct FFI
15
16
  *
@@ -44,6 +45,9 @@ class EmbeddedDatabase {
44
45
  * @returns EmbeddedDatabase instance
45
46
  */
46
47
  static open(path, config) {
48
+ if (path.includes('\x00')) {
49
+ throw new errors_1.DatabaseError('Database path must not contain null bytes');
50
+ }
47
51
  const bindings = bindings_1.NativeBindings.getInstance();
48
52
  let handle;
49
53
  if (config) {
@@ -115,6 +119,9 @@ class EmbeddedDatabase {
115
119
  * @returns EmbeddedDatabase instance in concurrent mode
116
120
  */
117
121
  static openConcurrent(path, options) {
122
+ if (path.includes('\x00')) {
123
+ throw new errors_1.DatabaseError('Database path must not contain null bytes');
124
+ }
118
125
  const bindings = bindings_1.NativeBindings.getInstance();
119
126
  const fallbackToStandard = options?.fallbackToStandard ?? false;
120
127
  if (!bindings.isConcurrentModeAvailable()) {
@@ -325,6 +332,277 @@ class EmbeddedDatabase {
325
332
  getBindings() {
326
333
  return this.bindings;
327
334
  }
335
+ // ========================================================================
336
+ // Namespace Operations
337
+ // ========================================================================
338
+ /**
339
+ * Create a new namespace
340
+ */
341
+ async createNamespace(name, config) {
342
+ this.ensureOpen();
343
+ const metaKey = `_namespace/${name}/metadata`;
344
+ const existing = await this.get(Buffer.from(metaKey));
345
+ if (existing) {
346
+ throw new namespace_1.NamespaceExistsError(name);
347
+ }
348
+ const nsConfig = {
349
+ name,
350
+ displayName: config?.displayName,
351
+ labels: config?.labels,
352
+ readOnly: config?.readOnly ?? false,
353
+ };
354
+ await this.put(Buffer.from(metaKey), Buffer.from(JSON.stringify(nsConfig)));
355
+ return new namespace_1.Namespace(this, name, nsConfig);
356
+ }
357
+ /**
358
+ * Get an existing namespace
359
+ */
360
+ async namespace(name) {
361
+ this.ensureOpen();
362
+ const metaKey = `_namespace/${name}/metadata`;
363
+ const data = await this.get(Buffer.from(metaKey));
364
+ if (!data) {
365
+ throw new namespace_1.NamespaceNotFoundError(name);
366
+ }
367
+ const nsConfig = JSON.parse(data.toString());
368
+ return new namespace_1.Namespace(this, name, nsConfig);
369
+ }
370
+ /**
371
+ * Get or create a namespace
372
+ */
373
+ async getOrCreateNamespace(name, config) {
374
+ try {
375
+ return await this.namespace(name);
376
+ }
377
+ catch (error) {
378
+ if (error instanceof namespace_1.NamespaceNotFoundError) {
379
+ return await this.createNamespace(name, config);
380
+ }
381
+ throw error;
382
+ }
383
+ }
384
+ /**
385
+ * Delete a namespace and all its data
386
+ */
387
+ async deleteNamespace(name) {
388
+ this.ensureOpen();
389
+ const prefix = Buffer.from(`_namespace/${name}/`);
390
+ const collPrefix = Buffer.from(`_collection/${name}/`);
391
+ const toDelete = [];
392
+ try {
393
+ for await (const [keyBuf] of this.scanPrefix(prefix)) {
394
+ toDelete.push(keyBuf);
395
+ }
396
+ for await (const [keyBuf] of this.scanPrefix(collPrefix)) {
397
+ toDelete.push(keyBuf);
398
+ }
399
+ }
400
+ catch { /* scan not available */ }
401
+ for (const key of toDelete) {
402
+ await this.delete(key);
403
+ }
404
+ return toDelete.length > 0;
405
+ }
406
+ /**
407
+ * List all namespace names
408
+ */
409
+ async listNamespaces() {
410
+ this.ensureOpen();
411
+ const prefix = Buffer.from('_namespace/');
412
+ const names = new Set();
413
+ try {
414
+ for await (const [keyBuf] of this.scanPrefix(prefix)) {
415
+ const key = keyBuf.toString();
416
+ const afterPrefix = key.substring('_namespace/'.length);
417
+ const nsName = afterPrefix.split('/')[0];
418
+ if (nsName)
419
+ names.add(nsName);
420
+ }
421
+ }
422
+ catch { /* scan not available */ }
423
+ return Array.from(names);
424
+ }
425
+ // ========================================================================
426
+ // Graph Overlay Operations (thin wrappers using KV)
427
+ // ========================================================================
428
+ /**
429
+ * Add a node to the graph overlay
430
+ */
431
+ async addNode(namespace, nodeId, nodeType, properties) {
432
+ this.ensureOpen();
433
+ const key = `_graph/${namespace}/nodes/${nodeId}`;
434
+ const value = JSON.stringify({ id: nodeId, node_type: nodeType, properties: properties || {} });
435
+ await this.put(Buffer.from(key), Buffer.from(value));
436
+ }
437
+ /**
438
+ * Add an edge between nodes
439
+ */
440
+ async addEdge(namespace, fromId, edgeType, toId, properties) {
441
+ this.ensureOpen();
442
+ const key = `_graph/${namespace}/edges/${fromId}/${edgeType}/${toId}`;
443
+ const value = JSON.stringify({ from_id: fromId, edge_type: edgeType, to_id: toId, properties: properties || {} });
444
+ await this.put(Buffer.from(key), Buffer.from(value));
445
+ }
446
+ /**
447
+ * Traverse the graph from a starting node
448
+ */
449
+ async traverse(namespace, startNode, maxDepth = 10, order = 'bfs') {
450
+ this.ensureOpen();
451
+ const visited = new Set();
452
+ const nodes = [];
453
+ const edges = [];
454
+ const frontier = [[startNode, 0]];
455
+ while (frontier.length > 0) {
456
+ const [currentNode, depth] = order === 'bfs' ? frontier.shift() : frontier.pop();
457
+ if (depth > maxDepth || visited.has(currentNode))
458
+ continue;
459
+ visited.add(currentNode);
460
+ const nodeData = await this.get(Buffer.from(`_graph/${namespace}/nodes/${currentNode}`));
461
+ if (nodeData)
462
+ nodes.push(JSON.parse(nodeData.toString()));
463
+ const edgePrefix = Buffer.from(`_graph/${namespace}/edges/${currentNode}/`);
464
+ try {
465
+ for await (const [, valueBuf] of this.scanPrefix(edgePrefix)) {
466
+ const edge = JSON.parse(valueBuf.toString());
467
+ edges.push(edge);
468
+ if (!visited.has(edge.to_id))
469
+ frontier.push([edge.to_id, depth + 1]);
470
+ }
471
+ }
472
+ catch { /* scan not available */ }
473
+ }
474
+ return { nodes, edges };
475
+ }
476
+ // ========================================================================
477
+ // Semantic Cache Operations (thin wrappers using KV)
478
+ // ========================================================================
479
+ /**
480
+ * Put a value in the semantic cache
481
+ */
482
+ async cachePut(cacheName, key, value, embedding, ttlSeconds = 0) {
483
+ this.ensureOpen();
484
+ const keyHash = Buffer.from(key).toString('hex').slice(0, 16);
485
+ const cacheKey = `_cache/${cacheName}/${keyHash}`;
486
+ const expiresAt = ttlSeconds > 0 ? Math.floor(Date.now() / 1000) + ttlSeconds : 0;
487
+ const cacheValue = JSON.stringify({ key, value, embedding, expires_at: expiresAt });
488
+ await this.put(Buffer.from(cacheKey), Buffer.from(cacheValue));
489
+ }
490
+ /**
491
+ * Get a value from the semantic cache by embedding similarity
492
+ */
493
+ async cacheGet(cacheName, queryEmbedding, threshold = 0.85) {
494
+ this.ensureOpen();
495
+ const prefix = Buffer.from(`_cache/${cacheName}/`);
496
+ const now = Math.floor(Date.now() / 1000);
497
+ let bestMatch = null;
498
+ try {
499
+ for await (const [, valueBuf] of this.scanPrefix(prefix)) {
500
+ const entry = JSON.parse(valueBuf.toString());
501
+ if (entry.expires_at > 0 && now > entry.expires_at)
502
+ continue;
503
+ if (entry.embedding && entry.embedding.length === queryEmbedding.length) {
504
+ const similarity = EmbeddedDatabase.cosineSimilarity(queryEmbedding, entry.embedding);
505
+ if (similarity >= threshold) {
506
+ if (!bestMatch || similarity > bestMatch.similarity) {
507
+ bestMatch = { similarity, value: entry.value };
508
+ }
509
+ }
510
+ }
511
+ }
512
+ }
513
+ catch { /* scan not available */ }
514
+ return bestMatch?.value ?? null;
515
+ }
516
+ /**
517
+ * Delete a cache entry
518
+ */
519
+ async cacheDelete(cacheName, key) {
520
+ this.ensureOpen();
521
+ const keyHash = Buffer.from(key).toString('hex').slice(0, 16);
522
+ await this.delete(Buffer.from(`_cache/${cacheName}/${keyHash}`));
523
+ }
524
+ /**
525
+ * Clear all entries in a semantic cache
526
+ */
527
+ async cacheClear(cacheName) {
528
+ this.ensureOpen();
529
+ const prefix = Buffer.from(`_cache/${cacheName}/`);
530
+ let deleted = 0;
531
+ try {
532
+ const toDelete = [];
533
+ for await (const [keyBuf] of this.scanPrefix(prefix)) {
534
+ toDelete.push(keyBuf);
535
+ }
536
+ for (const k of toDelete) {
537
+ await this.delete(k);
538
+ deleted++;
539
+ }
540
+ }
541
+ catch { /* scan not available */ }
542
+ return deleted;
543
+ }
544
+ // ========================================================================
545
+ // Static Format Utilities
546
+ // ========================================================================
547
+ /**
548
+ * Convert records to TOON format
549
+ */
550
+ static toToon(tableName, records, fields) {
551
+ if (!records || records.length === 0)
552
+ return `${tableName}[0]{}:`;
553
+ const useFields = fields ?? Object.keys(records[0]);
554
+ const header = `${tableName}[${records.length}]{${useFields.join(',')}}:`;
555
+ const escapeValue = (v) => {
556
+ const s = v != null ? String(v) : '';
557
+ if (s.includes(',') || s.includes(';') || s.includes('\n'))
558
+ return `"${s}"`;
559
+ return s;
560
+ };
561
+ const rows = records.map(r => useFields.map(f => escapeValue(r[f])).join(',')).join(';');
562
+ return header + rows;
563
+ }
564
+ /**
565
+ * Convert records to JSON format
566
+ */
567
+ static toJson(tableName, records, fields, compact = true) {
568
+ if (!records || records.length === 0) {
569
+ return JSON.stringify({ table: tableName, count: 0, records: [] });
570
+ }
571
+ const filteredRecords = fields
572
+ ? records.map(r => {
573
+ const filtered = {};
574
+ for (const f of fields)
575
+ filtered[f] = r[f];
576
+ return filtered;
577
+ })
578
+ : records;
579
+ const output = { table: tableName, count: filteredRecords.length, records: filteredRecords };
580
+ return compact ? JSON.stringify(output) : JSON.stringify(output, null, 2);
581
+ }
582
+ /**
583
+ * Parse JSON format
584
+ */
585
+ static fromJson(jsonStr) {
586
+ const data = JSON.parse(jsonStr);
587
+ const table = data.table ?? 'unknown';
588
+ const records = data.records ?? [];
589
+ const fields = records.length > 0 ? Object.keys(records[0]) : [];
590
+ return { table, fields, records };
591
+ }
592
+ // ========================================================================
593
+ // Private Helpers
594
+ // ========================================================================
595
+ static cosineSimilarity(a, b) {
596
+ let dot = 0, normA = 0, normB = 0;
597
+ for (let i = 0; i < a.length; i++) {
598
+ dot += a[i] * b[i];
599
+ normA += a[i] * a[i];
600
+ normB += b[i] * b[i];
601
+ }
602
+ normA = Math.sqrt(normA);
603
+ normB = Math.sqrt(normB);
604
+ return normA === 0 || normB === 0 ? 0 : dot / (normA * normB);
605
+ }
328
606
  }
329
607
  exports.EmbeddedDatabase = EmbeddedDatabase;
330
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZW1iZWRkZWQvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFFSCxzQ0FBMEM7QUFDMUMsNkNBQWdEO0FBQ2hELCtDQUFvRDtBQVdwRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLGdCQUFnQjtJQVF6QixZQUFvQixJQUFZLEVBQUUsTUFBVyxFQUFFLFVBQVUsR0FBRyxLQUFLLEVBQUUsUUFBUSxHQUFHLEtBQUs7UUFMM0UsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUVmLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsNEJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBR3BDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxRQUFRLENBQUM7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyx5QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBWSxFQUFFLE1BQStCO1FBQ3JELE1BQU0sUUFBUSxHQUFHLHlCQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUMsSUFBSSxNQUFNLENBQUM7UUFFWCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1QsTUFBTSxPQUFPLEdBQUc7Z0JBQ1osV0FBVyxFQUFFLE1BQU0sQ0FBQyxVQUFVLElBQUksS0FBSztnQkFDdkMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEtBQUssU0FBUztnQkFDaEQsU0FBUyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsRixhQUFhLEVBQUUsTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTO2dCQUM1QyxtQkFBbUIsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLGlCQUFpQixJQUFJLENBQUMsQ0FBQztnQkFDMUQsWUFBWSxFQUFFLE1BQU0sQ0FBQyxXQUFXLElBQUksS0FBSztnQkFDekMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLFdBQVcsS0FBSyxTQUFTO2dCQUNsRCxvQkFBb0IsRUFBRSxDQUFDLEVBQUUsc0JBQXNCO2dCQUMvQyx3QkFBd0IsRUFBRSxLQUFLO2FBQ2xDLENBQUM7WUFDRixNQUFNLEdBQUcsUUFBUSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM3RCxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksc0JBQWEsQ0FBQyw4QkFBOEIsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBRUQsT0FBTyxJQUFJLGdCQUFnQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0E2Q0c7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQVksRUFBRSxPQUEwQztRQUMxRSxNQUFNLFFBQVEsR0FBRyx5QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlDLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxFQUFFLGtCQUFrQixJQUFJLEtBQUssQ0FBQztRQUVoRSxJQUFJLENBQUMsUUFBUSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsQ0FBQztZQUN4QyxJQUFJLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQ1IsK0VBQStFO29CQUMvRSwyRUFBMkU7b0JBQzNFLDJDQUEyQyxDQUM5QyxDQUFDO2dCQUNGLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDVixNQUFNLElBQUksc0JBQWEsQ0FBQyw4QkFBOEIsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDbEUsQ0FBQztnQkFDRCxPQUFPLElBQUksZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDM0QsQ0FBQztZQUNELE1BQU0sSUFBSSxzQkFBYSxDQUNuQixxRkFBcUY7Z0JBQ3JGLDBGQUEwRixDQUM3RixDQUFDO1FBQ04sQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksc0JBQWEsQ0FBQyxpREFBaUQsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNyRixDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25FLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLFlBQVk7UUFDWixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxvQkFBb0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLHlCQUF5QjtRQUM1QixPQUFPLHlCQUFjLENBQUMsV0FBVyxFQUFFLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNwRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQVcsRUFBRSxLQUFhO1FBQ2hDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDO1lBQ0QsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMxQixNQUFNLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN2QixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNiLE1BQU0sR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xCLE1BQU0sS0FBSyxDQUFDO1FBQ2hCLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQVc7UUFDakIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUM7WUFDRCxNQUFNLEtBQUssR0FBRyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakMsTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixNQUFNLEtBQUssQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFXO1FBQ3BCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDO1lBQ0QsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2IsTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLENBQUM7UUFDaEIsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBWSxFQUFFLEtBQWE7UUFDckMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUM7WUFDRCxNQUFNLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQy9CLE1BQU0sR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2IsTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLENBQUM7UUFDaEIsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBWTtRQUN0QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QyxNQUFNLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNiLE1BQU0sR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xCLE1BQU0sS0FBSyxDQUFDO1FBQ2hCLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBYztRQUM1QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQztZQUNELElBQUksS0FBSyxFQUFFLE1BQU0sS0FBSyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDL0MsTUFBTSxLQUFLLENBQUM7WUFDaEIsQ0FBQztZQUNELE1BQU0sR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2IsTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLENBQUM7UUFDaEIsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDUCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUQsT0FBTyxJQUFJLGlDQUFtQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxlQUFlLENBQUksRUFBNEM7UUFDakUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2IsTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLENBQUM7UUFDaEIsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxVQUFVO1FBQ1osSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxLQUFLO1FBT1AsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxCLGtEQUFrRDtRQUNsRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdEQsTUFBTSxNQUFNLEdBQUc7WUFDWCxpQkFBaUIsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1lBQ3BELFlBQVksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUMxQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsbUJBQW1CO1lBQzdDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7WUFDcEQsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztTQUN2RCxDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDdkIsQ0FBQztJQUNMLENBQUM7SUFFTyxVQUFVO1FBQ2QsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksc0JBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBUztRQUNMLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0NBQ0o7QUF2VkQsNENBdVZDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbWJlZGRlZCBEYXRhYmFzZSAtIEZGSSBNb2RlXG4gKiBcbiAqIERpcmVjdCBGRkkgYWNjZXNzIHRvIFNvY2hEQiBuYXRpdmUgbGlicmFyeS5cbiAqIE5vIHNlcnZlciByZXF1aXJlZCAtIHNpbWlsYXIgdG8gUHl0aG9uIFNESydzIERhdGFiYXNlIGNsYXNzLlxuICovXG5cbmltcG9ydCB7IERhdGFiYXNlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgTmF0aXZlQmluZGluZ3MgfSBmcm9tICcuL2ZmaS9iaW5kaW5ncyc7XG5pbXBvcnQgeyBFbWJlZGRlZFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgKiBhcyBrb2ZmaSBmcm9tICdrb2ZmaSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1iZWRkZWREYXRhYmFzZUNvbmZpZyB7XG4gICAgd2FsRW5hYmxlZD86IGJvb2xlYW47XG4gICAgc3luY01vZGU/OiAnZnVsbCcgfCAnbm9ybWFsJyB8ICdvZmYnO1xuICAgIG1lbXRhYmxlU2l6ZUJ5dGVzPzogbnVtYmVyO1xuICAgIGdyb3VwQ29tbWl0PzogYm9vbGVhbjtcbiAgICBpbmRleFBvbGljeT86ICd3cml0ZV9vcHRpbWl6ZWQnIHwgJ2JhbGFuY2VkJyB8ICdzY2FuX29wdGltaXplZCcgfCAnYXBwZW5kX29ubHknO1xufVxuXG4vKipcbiAqIEVtYmVkZGVkIERhdGFiYXNlIHVzaW5nIGRpcmVjdCBGRklcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEVtYmVkZGVkRGF0YWJhc2UgfSBmcm9tICdAc29jaGRiL3NvY2hkYic7XG4gKiBcbiAqIGNvbnN0IGRiID0gYXdhaXQgRW1iZWRkZWREYXRhYmFzZS5vcGVuKCcuL215ZGInKTtcbiAqIGF3YWl0IGRiLnB1dChCdWZmZXIuZnJvbSgna2V5JyksIEJ1ZmZlci5mcm9tKCd2YWx1ZScpKTtcbiAqIGNvbnN0IHZhbHVlID0gYXdhaXQgZGIuZ2V0KEJ1ZmZlci5mcm9tKCdrZXknKSk7XG4gKiBhd2FpdCBkYi5jbG9zZSgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBFbWJlZGRlZERhdGFiYXNlIHtcbiAgICBwcml2YXRlIGhhbmRsZTogYW55O1xuICAgIHByaXZhdGUgYmluZGluZ3M6IE5hdGl2ZUJpbmRpbmdzO1xuICAgIHByaXZhdGUgY2xvc2VkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBwYXRoOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBjb25jdXJyZW50ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfY29uY3VycmVudE1vZGVGYWxsYmFjayA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwYXRoOiBzdHJpbmcsIGhhbmRsZTogYW55LCBjb25jdXJyZW50ID0gZmFsc2UsIGZhbGxiYWNrID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy5oYW5kbGUgPSBoYW5kbGU7XG4gICAgICAgIHRoaXMuY29uY3VycmVudCA9IGNvbmN1cnJlbnQ7XG4gICAgICAgIHRoaXMuX2NvbmN1cnJlbnRNb2RlRmFsbGJhY2sgPSBmYWxsYmFjaztcbiAgICAgICAgdGhpcy5iaW5kaW5ncyA9IE5hdGl2ZUJpbmRpbmdzLmdldEluc3RhbmNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbiBhIGRhdGFiYXNlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCBpbiBzdGFuZGFyZCBtb2RlXG4gICAgICogXG4gICAgICogRm9yIHdlYiBhcHBsaWNhdGlvbnMgd2l0aCBtdWx0aXBsZSBwcm9jZXNzZXMsIHVzZSBgb3BlbkNvbmN1cnJlbnQoKWAgaW5zdGVhZC5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gcGF0aCAtIFBhdGggdG8gZGF0YWJhc2UgZGlyZWN0b3J5XG4gICAgICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAcmV0dXJucyBFbWJlZGRlZERhdGFiYXNlIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIG9wZW4ocGF0aDogc3RyaW5nLCBjb25maWc/OiBFbWJlZGRlZERhdGFiYXNlQ29uZmlnKTogRW1iZWRkZWREYXRhYmFzZSB7XG4gICAgICAgIGNvbnN0IGJpbmRpbmdzID0gTmF0aXZlQmluZGluZ3MuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgbGV0IGhhbmRsZTtcblxuICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgICBjb25zdCBjQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIHdhbF9lbmFibGVkOiBjb25maWcud2FsRW5hYmxlZCA/PyBmYWxzZSxcbiAgICAgICAgICAgICAgICB3YWxfZW5hYmxlZF9zZXQ6IGNvbmZpZy53YWxFbmFibGVkICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc3luY19tb2RlOiBjb25maWcuc3luY01vZGUgPT09ICdmdWxsJyA/IDIgOiAoY29uZmlnLnN5bmNNb2RlID09PSAnbm9ybWFsJyA/IDEgOiAwKSxcbiAgICAgICAgICAgICAgICBzeW5jX21vZGVfc2V0OiBjb25maWcuc3luY01vZGUgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBtZW10YWJsZV9zaXplX2J5dGVzOiBCaWdJbnQoY29uZmlnLm1lbXRhYmxlU2l6ZUJ5dGVzID8/IDApLFxuICAgICAgICAgICAgICAgIGdyb3VwX2NvbW1pdDogY29uZmlnLmdyb3VwQ29tbWl0ID8/IGZhbHNlLFxuICAgICAgICAgICAgICAgIGdyb3VwX2NvbW1pdF9zZXQ6IGNvbmZpZy5ncm91cENvbW1pdCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRfaW5kZXhfcG9saWN5OiAxLCAvLyBEZWZhdWx0IHRvIEJhbGFuY2VkXG4gICAgICAgICAgICAgICAgZGVmYXVsdF9pbmRleF9wb2xpY3lfc2V0OiBmYWxzZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGhhbmRsZSA9IGJpbmRpbmdzLnNvY2hkYl9vcGVuX3dpdGhfY29uZmlnKHBhdGgsIGNDb25maWcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlID0gYmluZGluZ3Muc29jaGRiX29wZW4ocGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFiYXNlRXJyb3IoYEZhaWxlZCB0byBvcGVuIGRhdGFiYXNlIGF0ICR7cGF0aH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRW1iZWRkZWREYXRhYmFzZShwYXRoLCBoYW5kbGUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVuIGEgZGF0YWJhc2UgaW4gY29uY3VycmVudCBtb2RlIGZvciBtdWx0aS1wcm9jZXNzIHdlYiBhcHBsaWNhdGlvbnNcbiAgICAgKiBcbiAgICAgKiBUaGlzIG1vZGUgYWxsb3dzIG11bHRpcGxlIE5vZGUuanMgcHJvY2Vzc2VzIChlLmcuLCBQTTIgY2x1c3RlciB3b3JrZXJzLFxuICAgICAqIG11bHRpcGxlIEV4cHJlc3MgaW5zdGFuY2VzKSB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlIHNpbXVsdGFuZW91c2x5LlxuICAgICAqIFxuICAgICAqIEZlYXR1cmVzOlxuICAgICAqIC0gTG9jay1mcmVlIHJlYWRzIHdpdGggfjEwMG5zIGxhdGVuY3lcbiAgICAgKiAtIE11bHRpLXJlYWRlciwgc2luZ2xlLXdyaXRlciBjb29yZGluYXRpb25cbiAgICAgKiAtIEF1dG9tYXRpYyB3cml0ZSBzZXJpYWxpemF0aW9uXG4gICAgICogXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogaW1wb3J0IHsgRW1iZWRkZWREYXRhYmFzZSB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAgICAgKiBpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbiAgICAgKiBcbiAgICAgKiAvLyBPcGVuIGluIGNvbmN1cnJlbnQgbW9kZSAtIG11bHRpcGxlIHdvcmtlcnMgY2FuIGFjY2Vzc1xuICAgICAqIGNvbnN0IGRiID0gRW1iZWRkZWREYXRhYmFzZS5vcGVuQ29uY3VycmVudCgnLi93ZWJfZGInKTtcbiAgICAgKiBcbiAgICAgKiBjb25zdCBhcHAgPSBleHByZXNzKCk7XG4gICAgICogXG4gICAgICogYXBwLmdldCgnL3VzZXIvOmlkJywgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICogICAvLyBNdWx0aXBsZSBjb25jdXJyZW50IHJlcXVlc3RzIGNhbiByZWFkIHNpbXVsdGFuZW91c2x5XG4gICAgICogICBjb25zdCBkYXRhID0gYXdhaXQgZGIuZ2V0KEJ1ZmZlci5mcm9tKGB1c2VyOiR7cmVxLnBhcmFtcy5pZH1gKSk7XG4gICAgICogICBpZiAoIWRhdGEpIHtcbiAgICAgKiAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogJ25vdCBmb3VuZCcgfSk7XG4gICAgICogICAgIHJldHVybjtcbiAgICAgKiAgIH1cbiAgICAgKiAgIHJlcy5zZW5kKGRhdGEpO1xuICAgICAqIH0pO1xuICAgICAqIFxuICAgICAqIGFwcC5wb3N0KCcvdXNlci86aWQnLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgKiAgIC8vIFdyaXRlcyBhcmUgc2VyaWFsaXplZCBhdXRvbWF0aWNhbGx5XG4gICAgICogICBhd2FpdCBkYi5wdXQoQnVmZmVyLmZyb20oYHVzZXI6JHtyZXEucGFyYW1zLmlkfWApLCByZXEuYm9keSk7XG4gICAgICogICByZXMuanNvbih7IHN0YXR1czogJ29rJyB9KTtcbiAgICAgKiB9KTtcbiAgICAgKiBcbiAgICAgKiAvLyBTdGFydCB3aXRoIFBNMiBjbHVzdGVyIG1vZGU6XG4gICAgICogLy8gcG0yIHN0YXJ0IGFwcC5qcyAtaSBtYXhcbiAgICAgKiBhcHAubGlzdGVuKDMwMDApO1xuICAgICAqIGBgYFxuICAgICAqIFxuICAgICAqIEBwYXJhbSBwYXRoIC0gUGF0aCB0byBkYXRhYmFzZSBkaXJlY3RvcnlcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIGNvbmN1cnJlbnQgbW9kZVxuICAgICAqIEByZXR1cm5zIEVtYmVkZGVkRGF0YWJhc2UgaW5zdGFuY2UgaW4gY29uY3VycmVudCBtb2RlXG4gICAgICovXG4gICAgc3RhdGljIG9wZW5Db25jdXJyZW50KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IHsgZmFsbGJhY2tUb1N0YW5kYXJkPzogYm9vbGVhbiB9KTogRW1iZWRkZWREYXRhYmFzZSB7XG4gICAgICAgIGNvbnN0IGJpbmRpbmdzID0gTmF0aXZlQmluZGluZ3MuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgY29uc3QgZmFsbGJhY2tUb1N0YW5kYXJkID0gb3B0aW9ucz8uZmFsbGJhY2tUb1N0YW5kYXJkID8/IGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFiaW5kaW5ncy5pc0NvbmN1cnJlbnRNb2RlQXZhaWxhYmxlKCkpIHtcbiAgICAgICAgICAgIGlmIChmYWxsYmFja1RvU3RhbmRhcmQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICdbU29jaERCXSBDb25jdXJyZW50IG1vZGUgbm90IGF2YWlsYWJsZSBpbiBuYXRpdmUgbGlicmFyeSAocmVxdWlyZXMgdjAuNC44KykuICcgK1xuICAgICAgICAgICAgICAgICAgICAnRmFsbGluZyBiYWNrIHRvIHN0YW5kYXJkIG1vZGUuIEZvciBwcm9kdWN0aW9uIG11bHRpLXByb2Nlc3MgZGVwbG95bWVudHMsICcgK1xuICAgICAgICAgICAgICAgICAgICAncGxlYXNlIHVwZ3JhZGUgdGhlIFNvY2hEQiBuYXRpdmUgbGlicmFyeS4nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBiaW5kaW5ncy5zb2NoZGJfb3BlbihwYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcihgRmFpbGVkIHRvIG9wZW4gZGF0YWJhc2UgYXQgJHtwYXRofWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVtYmVkZGVkRGF0YWJhc2UocGF0aCwgaGFuZGxlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcihcbiAgICAgICAgICAgICAgICAnQ29uY3VycmVudCBtb2RlIG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1cGdyYWRlIHRoZSBTb2NoREIgbmF0aXZlIGxpYnJhcnkgdG8gdjAuNC44KyAnICtcbiAgICAgICAgICAgICAgICAnb3IgdXNlIG9wZW5Db25jdXJyZW50KHBhdGgsIHsgZmFsbGJhY2tUb1N0YW5kYXJkOiB0cnVlIH0pIHRvIGZhbGwgYmFjayB0byBzdGFuZGFyZCBtb2RlLidcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGUgPSBiaW5kaW5ncy5zb2NoZGJfb3Blbl9jb25jdXJyZW50KHBhdGgpO1xuICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFiYXNlRXJyb3IoYEZhaWxlZCB0byBvcGVuIGRhdGFiYXNlIGluIGNvbmN1cnJlbnQgbW9kZSBhdCAke3BhdGh9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0NvbmN1cnJlbnQgPSBiaW5kaW5ncy5zb2NoZGJfaXNfY29uY3VycmVudD8uKGhhbmRsZSkgPT09IDE7XG4gICAgICAgIHJldHVybiBuZXcgRW1iZWRkZWREYXRhYmFzZShwYXRoLCBoYW5kbGUsIGlzQ29uY3VycmVudCwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGRhdGFiYXNlIGlzIG9wZW5lZCBpbiBjb25jdXJyZW50IG1vZGVcbiAgICAgKi9cbiAgICBnZXQgaXNDb25jdXJyZW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25jdXJyZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGNvbmN1cnJlbnQgbW9kZSBmZWxsIGJhY2sgdG8gc3RhbmRhcmQgbW9kZVxuICAgICAqL1xuICAgIGdldCBpc0NvbmN1cnJlbnRGYWxsYmFjaygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmN1cnJlbnRNb2RlRmFsbGJhY2s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgY29uY3VycmVudCBtb2RlIGlzIGF2YWlsYWJsZSBpbiB0aGUgbmF0aXZlIGxpYnJhcnlcbiAgICAgKi9cbiAgICBzdGF0aWMgaXNDb25jdXJyZW50TW9kZUF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIE5hdGl2ZUJpbmRpbmdzLmdldEluc3RhbmNlKCkuaXNDb25jdXJyZW50TW9kZUF2YWlsYWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1dCBhIGtleS12YWx1ZSBwYWlyIChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIHB1dChrZXk6IEJ1ZmZlciwgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4ucHV0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHZhbHVlIGJ5IGtleSAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBnZXQoa2V5OiBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlciB8IG51bGw+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0eG4uZ2V0KGtleSk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIGEga2V5IChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZShrZXk6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uZGVsZXRlKGtleSk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHV0IHZhbHVlIGF0IHBhdGggKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgcHV0UGF0aChwYXRoOiBzdHJpbmcsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdHhuLnB1dFBhdGgocGF0aCwgdmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB2YWx1ZSBhdCBwYXRoIChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIGdldFBhdGgocGF0aDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdHhuLmdldFBhdGgocGF0aCk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2NhbiBrZXlzIHdpdGggcHJlZml4XG4gICAgICovXG4gICAgYXN5bmMgKnNjYW5QcmVmaXgocHJlZml4OiBCdWZmZXIpOiBBc3luY0dlbmVyYXRvcjxbQnVmZmVyLCBCdWZmZXJdPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgZW50cnkgb2YgdHhuLnNjYW5QcmVmaXgocHJlZml4KSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJlZ2luIGEgdHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbigpOiBFbWJlZGRlZFRyYW5zYWN0aW9uIHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuSGFuZGxlID0gdGhpcy5iaW5kaW5ncy5zb2NoZGJfYmVnaW5fdHhuKHRoaXMuaGFuZGxlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbWJlZGRlZFRyYW5zYWN0aW9uKHRoaXMsIHRoaXMuaGFuZGxlLCB0eG5IYW5kbGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgb3BlcmF0aW9ucyB3aXRoaW4gYSB0cmFuc2FjdGlvbiAod2l0aCBhdXRvLWNvbW1pdC9hYm9ydClcbiAgICAgKi9cbiAgICBhc3luYyB3aXRoVHJhbnNhY3Rpb248VD4oZm46ICh0eG46IEVtYmVkZGVkVHJhbnNhY3Rpb24pID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4odHhuKTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yY2UgYSBjaGVja3BvaW50XG4gICAgICovXG4gICAgYXN5bmMgY2hlY2twb2ludCgpOiBQcm9taXNlPGJpZ2ludD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcbiAgICAgICAgY29uc3QgbHNuID0gdGhpcy5iaW5kaW5ncy5zb2NoZGJfY2hlY2twb2ludCh0aGlzLmhhbmRsZSk7XG4gICAgICAgIHJldHVybiBCaWdJbnQobHNuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc3RvcmFnZSBzdGF0aXN0aWNzXG4gICAgICovXG4gICAgYXN5bmMgc3RhdHMoKTogUHJvbWlzZTx7XG4gICAgICAgIG1lbXRhYmxlU2l6ZUJ5dGVzOiBiaWdpbnQ7XG4gICAgICAgIHdhbFNpemVCeXRlczogYmlnaW50O1xuICAgICAgICBhY3RpdmVUcmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAgICAgbWluQWN0aXZlU25hcHNob3Q6IGJpZ2ludDtcbiAgICAgICAgbGFzdENoZWNrcG9pbnRMc246IGJpZ2ludDtcbiAgICB9PiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIC8vIFJldHVybnMgc3RydWN0IGJ5IHZhbHVlIChhdXRvbWF0aWNhbGx5IGRlY29kZWQpXG4gICAgICAgIGNvbnN0IHN0YXRzID0gdGhpcy5iaW5kaW5ncy5zb2NoZGJfc3RhdHModGhpcy5oYW5kbGUpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG1lbXRhYmxlU2l6ZUJ5dGVzOiBCaWdJbnQoc3RhdHMubWVtdGFibGVfc2l6ZV9ieXRlcyksXG4gICAgICAgICAgICB3YWxTaXplQnl0ZXM6IEJpZ0ludChzdGF0cy53YWxfc2l6ZV9ieXRlcyksXG4gICAgICAgICAgICBhY3RpdmVUcmFuc2FjdGlvbnM6IHN0YXRzLmFjdGl2ZV90cmFuc2FjdGlvbnMsXG4gICAgICAgICAgICBtaW5BY3RpdmVTbmFwc2hvdDogQmlnSW50KHN0YXRzLm1pbl9hY3RpdmVfc25hcHNob3QpLFxuICAgICAgICAgICAgbGFzdENoZWNrcG9pbnRMc246IEJpZ0ludChzdGF0cy5sYXN0X2NoZWNrcG9pbnRfbHNuKSxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBkYXRhYmFzZVxuICAgICAqL1xuICAgIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRpbmdzLnNvY2hkYl9jbG9zZSh0aGlzLmhhbmRsZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGVuc3VyZU9wZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFiYXNlRXJyb3IoJ0RhdGFiYXNlIGlzIGNsb3NlZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGludGVybmFsIGhhbmRsZSAoZm9yIHRyYW5zYWN0aW9ucylcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXRIYW5kbGUoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBiaW5kaW5ncyBpbnN0YW5jZSAoZm9yIHRyYW5zYWN0aW9ucylcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXRCaW5kaW5ncygpOiBOYXRpdmVCaW5kaW5ncyB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmRpbmdzO1xuICAgIH1cbn1cbiJdfQ==
608
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZW1iZWRkZWQvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFFSCxzQ0FBMEM7QUFDMUMsNkNBQWdEO0FBQ2hELCtDQUFvRDtBQUNwRCw0Q0FBd0c7QUFXeEc7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBYSxnQkFBZ0I7SUFRekIsWUFBb0IsSUFBWSxFQUFFLE1BQVcsRUFBRSxVQUFVLEdBQUcsS0FBSyxFQUFFLFFBQVEsR0FBRyxLQUFLO1FBTDNFLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFZixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLDRCQUF1QixHQUFHLEtBQUssQ0FBQztRQUdwQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsUUFBUSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcseUJBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQVksRUFBRSxNQUErQjtRQUNyRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksc0JBQWEsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyx5QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlDLElBQUksTUFBTSxDQUFDO1FBRVgsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNULE1BQU0sT0FBTyxHQUFHO2dCQUNaLFdBQVcsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLEtBQUs7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T0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNqRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLGtCQUFrQjtJQUNsQiwyRUFBMkU7SUFFbkUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQVcsRUFBRSxDQUFXO1FBQ3BELElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNoQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkQsT0FBTyxLQUFLLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQ2xFLENBQUM7Q0FDSjtBQWpwQkQsNENBaXBCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRW1iZWRkZWQgRGF0YWJhc2UgLSBGRkkgTW9kZVxuICogXG4gKiBEaXJlY3QgRkZJIGFjY2VzcyB0byBTb2NoREIgbmF0aXZlIGxpYnJhcnkuXG4gKiBObyBzZXJ2ZXIgcmVxdWlyZWQgLSBzaW1pbGFyIHRvIFB5dGhvbiBTREsncyBEYXRhYmFzZSBjbGFzcy5cbiAqL1xuXG5pbXBvcnQgeyBEYXRhYmFzZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IE5hdGl2ZUJpbmRpbmdzIH0gZnJvbSAnLi9mZmkvYmluZGluZ3MnO1xuaW1wb3J0IHsgRW1iZWRkZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgTmFtZXNwYWNlLCBOYW1lc3BhY2VDb25maWcsIE5hbWVzcGFjZU5vdEZvdW5kRXJyb3IsIE5hbWVzcGFjZUV4aXN0c0Vycm9yIH0gZnJvbSAnLi4vbmFtZXNwYWNlJztcbmltcG9ydCAqIGFzIGtvZmZpIGZyb20gJ2tvZmZpJztcblxuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRlZERhdGFiYXNlQ29uZmlnIHtcbiAgICB3YWxFbmFibGVkPzogYm9vbGVhbjtcbiAgICBzeW5jTW9kZT86ICdmdWxsJyB8ICdub3JtYWwnIHwgJ29mZic7XG4gICAgbWVtdGFibGVTaXplQnl0ZXM/OiBudW1iZXI7XG4gICAgZ3JvdXBDb21taXQ/OiBib29sZWFuO1xuICAgIGluZGV4UG9saWN5PzogJ3dyaXRlX29wdGltaXplZCcgfCAnYmFsYW5jZWQnIHwgJ3NjYW5fb3B0aW1pemVkJyB8ICdhcHBlbmRfb25seSc7XG59XG5cbi8qKlxuICogRW1iZWRkZWQgRGF0YWJhc2UgdXNpbmcgZGlyZWN0IEZGSVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgRW1iZWRkZWREYXRhYmFzZSB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqIFxuICogY29uc3QgZGIgPSBhd2FpdCBFbWJlZGRlZERhdGFiYXNlLm9wZW4oJy4vbXlkYicpO1xuICogYXdhaXQgZGIucHV0KEJ1ZmZlci5mcm9tKCdrZXknKSwgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogY29uc3QgdmFsdWUgPSBhd2FpdCBkYi5nZXQoQnVmZmVyLmZyb20oJ2tleScpKTtcbiAqIGF3YWl0IGRiLmNsb3NlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEVtYmVkZGVkRGF0YWJhc2Uge1xuICAgIHByaXZhdGUgaGFuZGxlOiBhbnk7XG4gICAgcHJpdmF0ZSBiaW5kaW5nczogTmF0aXZlQmluZGluZ3M7XG4gICAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIHBhdGg6IHN0cmluZztcbiAgICBwcml2YXRlIGNvbmN1cnJlbnQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jb25jdXJyZW50TW9kZUZhbGxiYWNrID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKHBhdGg6IHN0cmluZywgaGFuZGxlOiBhbnksIGNvbmN1cnJlbnQgPSBmYWxzZSwgZmFsbGJhY2sgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLmhhbmRsZSA9IGhhbmRsZTtcbiAgICAgICAgdGhpcy5jb25jdXJyZW50ID0gY29uY3VycmVudDtcbiAgICAgICAgdGhpcy5fY29uY3VycmVudE1vZGVGYWxsYmFjayA9IGZhbGxiYWNrO1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0gTmF0aXZlQmluZGluZ3MuZ2V0SW5zdGFuY2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVuIGEgZGF0YWJhc2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoIGluIHN0YW5kYXJkIG1vZGVcbiAgICAgKiBcbiAgICAgKiBGb3Igd2ViIGFwcGxpY2F0aW9ucyB3aXRoIG11bHRpcGxlIHByb2Nlc3NlcywgdXNlIGBvcGVuQ29uY3VycmVudCgpYCBpbnN0ZWFkLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBwYXRoIC0gUGF0aCB0byBkYXRhYmFzZSBkaXJlY3RvcnlcbiAgICAgKiBAcGFyYW0gY29uZmlnIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvblxuICAgICAqIEByZXR1cm5zIEVtYmVkZGVkRGF0YWJhc2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgb3BlbihwYXRoOiBzdHJpbmcsIGNvbmZpZz86IEVtYmVkZGVkRGF0YWJhc2VDb25maWcpOiBFbWJlZGRlZERhdGFiYXNlIHtcbiAgICAgICAgaWYgKHBhdGguaW5jbHVkZXMoJ1xceDAwJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKCdEYXRhYmFzZSBwYXRoIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJpbmRpbmdzID0gTmF0aXZlQmluZGluZ3MuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgbGV0IGhhbmRsZTtcblxuICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgICBjb25zdCBjQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIHdhbF9lbmFibGVkOiBjb25maWcud2FsRW5hYmxlZCA/PyBmYWxzZSxcbiAgICAgICAgICAgICAgICB3YWxfZW5hYmxlZF9zZXQ6IGNvbmZpZy53YWxFbmFibGVkICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc3luY19tb2RlOiBjb25maWcuc3luY01vZGUgPT09ICdmdWxsJyA/IDIgOiAoY29uZmlnLnN5bmNNb2RlID09PSAnbm9ybWFsJyA/IDEgOiAwKSxcbiAgICAgICAgICAgICAgICBzeW5jX21vZGVfc2V0OiBjb25maWcuc3luY01vZGUgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBtZW10YWJsZV9zaXplX2J5dGVzOiBCaWdJbnQoY29uZmlnLm1lbXRhYmxlU2l6ZUJ5dGVzID8/IDApLFxuICAgICAgICAgICAgICAgIGdyb3VwX2NvbW1pdDogY29uZmlnLmdyb3VwQ29tbWl0ID8/IGZhbHNlLFxuICAgICAgICAgICAgICAgIGdyb3VwX2NvbW1pdF9zZXQ6IGNvbmZpZy5ncm91cENvbW1pdCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRfaW5kZXhfcG9saWN5OiAxLCAvLyBEZWZhdWx0IHRvIEJhbGFuY2VkXG4gICAgICAgICAgICAgICAgZGVmYXVsdF9pbmRleF9wb2xpY3lfc2V0OiBmYWxzZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGhhbmRsZSA9IGJpbmRpbmdzLnNvY2hkYl9vcGVuX3dpdGhfY29uZmlnKHBhdGgsIGNDb25maWcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlID0gYmluZGluZ3Muc29jaGRiX29wZW4ocGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFiYXNlRXJyb3IoYEZhaWxlZCB0byBvcGVuIGRhdGFiYXNlIGF0ICR7cGF0aH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRW1iZWRkZWREYXRhYmFzZShwYXRoLCBoYW5kbGUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVuIGEgZGF0YWJhc2UgaW4gY29uY3VycmVudCBtb2RlIGZvciBtdWx0aS1wcm9jZXNzIHdlYiBhcHBsaWNhdGlvbnNcbiAgICAgKiBcbiAgICAgKiBUaGlzIG1vZGUgYWxsb3dzIG11bHRpcGxlIE5vZGUuanMgcHJvY2Vzc2VzIChlLmcuLCBQTTIgY2x1c3RlciB3b3JrZXJzLFxuICAgICAqIG11bHRpcGxlIEV4cHJlc3MgaW5zdGFuY2VzKSB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlIHNpbXVsdGFuZW91c2x5LlxuICAgICAqIFxuICAgICAqIEZlYXR1cmVzOlxuICAgICAqIC0gTG9jay1mcmVlIHJlYWRzIHdpdGggfjEwMG5zIGxhdGVuY3lcbiAgICAgKiAtIE11bHRpLXJlYWRlciwgc2luZ2xlLXdyaXRlciBjb29yZGluYXRpb25cbiAgICAgKiAtIEF1dG9tYXRpYyB3cml0ZSBzZXJpYWxpemF0aW9uXG4gICAgICogXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogaW1wb3J0IHsgRW1iZWRkZWREYXRhYmFzZSB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAgICAgKiBpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbiAgICAgKiBcbiAgICAgKiAvLyBPcGVuIGluIGNvbmN1cnJlbnQgbW9kZSAtIG11bHRpcGxlIHdvcmtlcnMgY2FuIGFjY2Vzc1xuICAgICAqIGNvbnN0IGRiID0gRW1iZWRkZWREYXRhYmFzZS5vcGVuQ29uY3VycmVudCgnLi93ZWJfZGInKTtcbiAgICAgKiBcbiAgICAgKiBjb25zdCBhcHAgPSBleHByZXNzKCk7XG4gICAgICogXG4gICAgICogYXBwLmdldCgnL3VzZXIvOmlkJywgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICogICAvLyBNdWx0aXBsZSBjb25jdXJyZW50IHJlcXVlc3RzIGNhbiByZWFkIHNpbXVsdGFuZW91c2x5XG4gICAgICogICBjb25zdCBkYXRhID0gYXdhaXQgZGIuZ2V0KEJ1ZmZlci5mcm9tKGB1c2VyOiR7cmVxLnBhcmFtcy5pZH1gKSk7XG4gICAgICogICBpZiAoIWRhdGEpIHtcbiAgICAgKiAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogJ25vdCBmb3VuZCcgfSk7XG4gICAgICogICAgIHJldHVybjtcbiAgICAgKiAgIH1cbiAgICAgKiAgIHJlcy5zZW5kKGRhdGEpO1xuICAgICAqIH0pO1xuICAgICAqIFxuICAgICAqIGFwcC5wb3N0KCcvdXNlci86aWQnLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgKiAgIC8vIFdyaXRlcyBhcmUgc2VyaWFsaXplZCBhdXRvbWF0aWNhbGx5XG4gICAgICogICBhd2FpdCBkYi5wdXQoQnVmZmVyLmZyb20oYHVzZXI6JHtyZXEucGFyYW1zLmlkfWApLCByZXEuYm9keSk7XG4gICAgICogICByZXMuanNvbih7IHN0YXR1czogJ29rJyB9KTtcbiAgICAgKiB9KTtcbiAgICAgKiBcbiAgICAgKiAvLyBTdGFydCB3aXRoIFBNMiBjbHVzdGVyIG1vZGU6XG4gICAgICogLy8gcG0yIHN0YXJ0IGFwcC5qcyAtaSBtYXhcbiAgICAgKiBhcHAubGlzdGVuKDMwMDApO1xuICAgICAqIGBgYFxuICAgICAqIFxuICAgICAqIEBwYXJhbSBwYXRoIC0gUGF0aCB0byBkYXRhYmFzZSBkaXJlY3RvcnlcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIGNvbmN1cnJlbnQgbW9kZVxuICAgICAqIEByZXR1cm5zIEVtYmVkZGVkRGF0YWJhc2UgaW5zdGFuY2UgaW4gY29uY3VycmVudCBtb2RlXG4gICAgICovXG4gICAgc3RhdGljIG9wZW5Db25jdXJyZW50KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IHsgZmFsbGJhY2tUb1N0YW5kYXJkPzogYm9vbGVhbiB9KTogRW1iZWRkZWREYXRhYmFzZSB7XG4gICAgICAgIGlmIChwYXRoLmluY2x1ZGVzKCdcXHgwMCcpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcignRGF0YWJhc2UgcGF0aCBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiaW5kaW5ncyA9IE5hdGl2ZUJpbmRpbmdzLmdldEluc3RhbmNlKCk7XG4gICAgICAgIGNvbnN0IGZhbGxiYWNrVG9TdGFuZGFyZCA9IG9wdGlvbnM/LmZhbGxiYWNrVG9TdGFuZGFyZCA/PyBmYWxzZTtcbiAgICAgICAgXG4gICAgICAgIGlmICghYmluZGluZ3MuaXNDb25jdXJyZW50TW9kZUF2YWlsYWJsZSgpKSB7XG4gICAgICAgICAgICBpZiAoZmFsbGJhY2tUb1N0YW5kYXJkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICAnW1NvY2hEQl0gQ29uY3VycmVudCBtb2RlIG5vdCBhdmFpbGFibGUgaW4gbmF0aXZlIGxpYnJhcnkgKHJlcXVpcmVzIHYwLjQuOCspLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ0ZhbGxpbmcgYmFjayB0byBzdGFuZGFyZCBtb2RlLiBGb3IgcHJvZHVjdGlvbiBtdWx0aS1wcm9jZXNzIGRlcGxveW1lbnRzLCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3BsZWFzZSB1cGdyYWRlIHRoZSBTb2NoREIgbmF0aXZlIGxpYnJhcnkuJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gYmluZGluZ3Muc29jaGRiX29wZW4ocGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFiYXNlRXJyb3IoYEZhaWxlZCB0byBvcGVuIGRhdGFiYXNlIGF0ICR7cGF0aH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbWJlZGRlZERhdGFiYXNlKHBhdGgsIGhhbmRsZSwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFiYXNlRXJyb3IoXG4gICAgICAgICAgICAgICAgJ0NvbmN1cnJlbnQgbW9kZSBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgdXBncmFkZSB0aGUgU29jaERCIG5hdGl2ZSBsaWJyYXJ5IHRvIHYwLjQuOCsgJyArXG4gICAgICAgICAgICAgICAgJ29yIHVzZSBvcGVuQ29uY3VycmVudChwYXRoLCB7IGZhbGxiYWNrVG9TdGFuZGFyZDogdHJ1ZSB9KSB0byBmYWxsIGJhY2sgdG8gc3RhbmRhcmQgbW9kZS4nXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlID0gYmluZGluZ3Muc29jaGRiX29wZW5fY29uY3VycmVudChwYXRoKTtcbiAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKGBGYWlsZWQgdG8gb3BlbiBkYXRhYmFzZSBpbiBjb25jdXJyZW50IG1vZGUgYXQgJHtwYXRofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNDb25jdXJyZW50ID0gYmluZGluZ3Muc29jaGRiX2lzX2NvbmN1cnJlbnQ/LihoYW5kbGUpID09PSAxO1xuICAgICAgICByZXR1cm4gbmV3IEVtYmVkZGVkRGF0YWJhc2UocGF0aCwgaGFuZGxlLCBpc0NvbmN1cnJlbnQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBkYXRhYmFzZSBpcyBvcGVuZWQgaW4gY29uY3VycmVudCBtb2RlXG4gICAgICovXG4gICAgZ2V0IGlzQ29uY3VycmVudCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uY3VycmVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBjb25jdXJyZW50IG1vZGUgZmVsbCBiYWNrIHRvIHN0YW5kYXJkIG1vZGVcbiAgICAgKi9cbiAgICBnZXQgaXNDb25jdXJyZW50RmFsbGJhY2soKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25jdXJyZW50TW9kZUZhbGxiYWNrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGNvbmN1cnJlbnQgbW9kZSBpcyBhdmFpbGFibGUgaW4gdGhlIG5hdGl2ZSBsaWJyYXJ5XG4gICAgICovXG4gICAgc3RhdGljIGlzQ29uY3VycmVudE1vZGVBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBOYXRpdmVCaW5kaW5ncy5nZXRJbnN0YW5jZSgpLmlzQ29uY3VycmVudE1vZGVBdmFpbGFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQdXQgYSBrZXktdmFsdWUgcGFpciAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBwdXQoa2V5OiBCdWZmZXIsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdHhuLnB1dChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSB2YWx1ZSBieSBrZXkgKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgZ2V0KGtleTogQnVmZmVyKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdHhuLmdldChrZXkpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhIGtleSAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGUoa2V5OiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1dCB2YWx1ZSBhdCBwYXRoIChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIHB1dFBhdGgocGF0aDogc3RyaW5nLCB2YWx1ZTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5wdXRQYXRoKHBhdGgsIHZhbHVlKTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdmFsdWUgYXQgcGF0aCAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBnZXRQYXRoKHBhdGg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHR4bi5nZXRQYXRoKHBhdGgpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNjYW4ga2V5cyB3aXRoIHByZWZpeFxuICAgICAqL1xuICAgIGFzeW5jICpzY2FuUHJlZml4KHByZWZpeDogQnVmZmVyKTogQXN5bmNHZW5lcmF0b3I8W0J1ZmZlciwgQnVmZmVyXT4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGVudHJ5IG9mIHR4bi5zY2FuUHJlZml4KHByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBlbnRyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCZWdpbiBhIHRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb24oKTogRW1iZWRkZWRUcmFuc2FjdGlvbiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4bkhhbmRsZSA9IHRoaXMuYmluZGluZ3Muc29jaGRiX2JlZ2luX3R4bih0aGlzLmhhbmRsZSk7XG4gICAgICAgIHJldHVybiBuZXcgRW1iZWRkZWRUcmFuc2FjdGlvbih0aGlzLCB0aGlzLmhhbmRsZSwgdHhuSGFuZGxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIG9wZXJhdGlvbnMgd2l0aGluIGEgdHJhbnNhY3Rpb24gKHdpdGggYXV0by1jb21taXQvYWJvcnQpXG4gICAgICovXG4gICAgYXN5bmMgd2l0aFRyYW5zYWN0aW9uPFQ+KGZuOiAodHhuOiBFbWJlZGRlZFRyYW5zYWN0aW9uKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKHR4bik7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcmNlIGEgY2hlY2twb2ludFxuICAgICAqL1xuICAgIGFzeW5jIGNoZWNrcG9pbnQoKTogUHJvbWlzZTxiaWdpbnQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgICAgIGNvbnN0IGxzbiA9IHRoaXMuYmluZGluZ3Muc29jaGRiX2NoZWNrcG9pbnQodGhpcy5oYW5kbGUpO1xuICAgICAgICByZXR1cm4gQmlnSW50KGxzbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHN0b3JhZ2Ugc3RhdGlzdGljc1xuICAgICAqL1xuICAgIGFzeW5jIHN0YXRzKCk6IFByb21pc2U8e1xuICAgICAgICBtZW10YWJsZVNpemVCeXRlczogYmlnaW50O1xuICAgICAgICB3YWxTaXplQnl0ZXM6IGJpZ2ludDtcbiAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgICAgIG1pbkFjdGl2ZVNuYXBzaG90OiBiaWdpbnQ7XG4gICAgICAgIGxhc3RDaGVja3BvaW50THNuOiBiaWdpbnQ7XG4gICAgfT4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICAvLyBSZXR1cm5zIHN0cnVjdCBieSB2YWx1ZSAoYXV0b21hdGljYWxseSBkZWNvZGVkKVxuICAgICAgICBjb25zdCBzdGF0cyA9IHRoaXMuYmluZGluZ3Muc29jaGRiX3N0YXRzKHRoaXMuaGFuZGxlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBtZW10YWJsZVNpemVCeXRlczogQmlnSW50KHN0YXRzLm1lbXRhYmxlX3NpemVfYnl0ZXMpLFxuICAgICAgICAgICAgd2FsU2l6ZUJ5dGVzOiBCaWdJbnQoc3RhdHMud2FsX3NpemVfYnl0ZXMpLFxuICAgICAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb25zOiBzdGF0cy5hY3RpdmVfdHJhbnNhY3Rpb25zLFxuICAgICAgICAgICAgbWluQWN0aXZlU25hcHNob3Q6IEJpZ0ludChzdGF0cy5taW5fYWN0aXZlX3NuYXBzaG90KSxcbiAgICAgICAgICAgIGxhc3RDaGVja3BvaW50THNuOiBCaWdJbnQoc3RhdHMubGFzdF9jaGVja3BvaW50X2xzbiksXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZSB0aGUgZGF0YWJhc2VcbiAgICAgKi9cbiAgICBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5iaW5kaW5ncy5zb2NoZGJfY2xvc2UodGhpcy5oYW5kbGUpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbnN1cmVPcGVuKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKCdEYXRhYmFzZSBpcyBjbG9zZWQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBpbnRlcm5hbCBoYW5kbGUgKGZvciB0cmFuc2FjdGlvbnMpXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0SGFuZGxlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYmluZGluZ3MgaW5zdGFuY2UgKGZvciB0cmFuc2FjdGlvbnMpXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0QmluZGluZ3MoKTogTmF0aXZlQmluZGluZ3Mge1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5kaW5ncztcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBOYW1lc3BhY2UgT3BlcmF0aW9uc1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IG5hbWVzcGFjZVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZU5hbWVzcGFjZShuYW1lOiBzdHJpbmcsIGNvbmZpZz86IFBhcnRpYWw8TmFtZXNwYWNlQ29uZmlnPik6IFByb21pc2U8TmFtZXNwYWNlPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuICAgICAgICBjb25zdCBtZXRhS2V5ID0gYF9uYW1lc3BhY2UvJHtuYW1lfS9tZXRhZGF0YWA7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5nZXQoQnVmZmVyLmZyb20obWV0YUtleSkpO1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOYW1lc3BhY2VFeGlzdHNFcnJvcihuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5zQ29uZmlnOiBOYW1lc3BhY2VDb25maWcgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGNvbmZpZz8uZGlzcGxheU5hbWUsXG4gICAgICAgICAgICBsYWJlbHM6IGNvbmZpZz8ubGFiZWxzLFxuICAgICAgICAgICAgcmVhZE9ubHk6IGNvbmZpZz8ucmVhZE9ubHkgPz8gZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHRoaXMucHV0KEJ1ZmZlci5mcm9tKG1ldGFLZXkpLCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShuc0NvbmZpZykpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBOYW1lc3BhY2UodGhpcywgbmFtZSwgbnNDb25maWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbiBleGlzdGluZyBuYW1lc3BhY2VcbiAgICAgKi9cbiAgICBhc3luYyBuYW1lc3BhY2UobmFtZTogc3RyaW5nKTogUHJvbWlzZTxOYW1lc3BhY2U+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgICAgIGNvbnN0IG1ldGFLZXkgPSBgX25hbWVzcGFjZS8ke25hbWV9L21ldGFkYXRhYDtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZ2V0KEJ1ZmZlci5mcm9tKG1ldGFLZXkpKTtcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTmFtZXNwYWNlTm90Rm91bmRFcnJvcihuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuc0NvbmZpZyA9IEpTT04ucGFyc2UoZGF0YS50b1N0cmluZygpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBOYW1lc3BhY2UodGhpcywgbmFtZSwgbnNDb25maWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBvciBjcmVhdGUgYSBuYW1lc3BhY2VcbiAgICAgKi9cbiAgICBhc3luYyBnZXRPckNyZWF0ZU5hbWVzcGFjZShuYW1lOiBzdHJpbmcsIGNvbmZpZz86IFBhcnRpYWw8TmFtZXNwYWNlQ29uZmlnPik6IFByb21pc2U8TmFtZXNwYWNlPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5uYW1lc3BhY2UobmFtZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOYW1lc3BhY2VOb3RGb3VuZEVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlTmFtZXNwYWNlKG5hbWUsIGNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhIG5hbWVzcGFjZSBhbmQgYWxsIGl0cyBkYXRhXG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlTmFtZXNwYWNlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gQnVmZmVyLmZyb20oYF9uYW1lc3BhY2UvJHtuYW1lfS9gKTtcbiAgICAgICAgY29uc3QgY29sbFByZWZpeCA9IEJ1ZmZlci5mcm9tKGBfY29sbGVjdGlvbi8ke25hbWV9L2ApO1xuXG4gICAgICAgIGNvbnN0IHRvRGVsZXRlOiBCdWZmZXJbXSA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBba2V5QnVmXSBvZiB0aGlzLnNjYW5QcmVmaXgocHJlZml4KSkge1xuICAgICAgICAgICAgICAgIHRvRGVsZXRlLnB1c2goa2V5QnVmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgW2tleUJ1Zl0gb2YgdGhpcy5zY2FuUHJlZml4KGNvbGxQcmVmaXgpKSB7XG4gICAgICAgICAgICAgICAgdG9EZWxldGUucHVzaChrZXlCdWYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHsgLyogc2NhbiBub3QgYXZhaWxhYmxlICovIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0b0RlbGV0ZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9EZWxldGUubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBuYW1lc3BhY2UgbmFtZXNcbiAgICAgKi9cbiAgICBhc3luYyBsaXN0TmFtZXNwYWNlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuICAgICAgICBjb25zdCBwcmVmaXggPSBCdWZmZXIuZnJvbSgnX25hbWVzcGFjZS8nKTtcbiAgICAgICAgY29uc3QgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgW2tleUJ1Zl0gb2YgdGhpcy5zY2FuUHJlZml4KHByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBrZXlCdWYudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhZnRlclByZWZpeCA9IGtleS5zdWJzdHJpbmcoJ19uYW1lc3BhY2UvJy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5zTmFtZSA9IGFmdGVyUHJlZml4LnNwbGl0KCcvJylbMF07XG4gICAgICAgICAgICAgICAgaWYgKG5zTmFtZSkgbmFtZXMuYWRkKG5zTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBzY2FuIG5vdCBhdmFpbGFibGUgKi8gfVxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShuYW1lcyk7XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gR3JhcGggT3ZlcmxheSBPcGVyYXRpb25zICh0aGluIHdyYXBwZXJzIHVzaW5nIEtWKVxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgbm9kZSB0byB0aGUgZ3JhcGggb3ZlcmxheVxuICAgICAqL1xuICAgIGFzeW5jIGFkZE5vZGUoXG4gICAgICAgIG5hbWVzcGFjZTogc3RyaW5nLCBub2RlSWQ6IHN0cmluZywgbm9kZVR5cGU6IHN0cmluZyxcbiAgICAgICAgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgICAgIGNvbnN0IGtleSA9IGBfZ3JhcGgvJHtuYW1lc3BhY2V9L25vZGVzLyR7bm9kZUlkfWA7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gSlNPTi5zdHJpbmdpZnkoeyBpZDogbm9kZUlkLCBub2RlX3R5cGU6IG5vZGVUeXBlLCBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzIHx8IHt9IH0pO1xuICAgICAgICBhd2FpdCB0aGlzLnB1dChCdWZmZXIuZnJvbShrZXkpLCBCdWZmZXIuZnJvbSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhbiBlZGdlIGJldHdlZW4gbm9kZXNcbiAgICAgKi9cbiAgICBhc3luYyBhZGRFZGdlKFxuICAgICAgICBuYW1lc3BhY2U6IHN0cmluZywgZnJvbUlkOiBzdHJpbmcsIGVkZ2VUeXBlOiBzdHJpbmcsIHRvSWQ6IHN0cmluZyxcbiAgICAgICAgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgICAgIGNvbnN0IGtleSA9IGBfZ3JhcGgvJHtuYW1lc3BhY2V9L2VkZ2VzLyR7ZnJvbUlkfS8ke2VkZ2VUeXBlfS8ke3RvSWR9YDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh7IGZyb21faWQ6IGZyb21JZCwgZWRnZV90eXBlOiBlZGdlVHlwZSwgdG9faWQ6IHRvSWQsIHByb3BlcnRpZXM6IHByb3BlcnRpZXMgfHwge30gfSk7XG4gICAgICAgIGF3YWl0IHRoaXMucHV0KEJ1ZmZlci5mcm9tKGtleSksIEJ1ZmZlci5mcm9tKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhdmVyc2UgdGhlIGdyYXBoIGZyb20gYSBzdGFydGluZyBub2RlXG4gICAgICovXG4gICAgYXN5bmMgdHJhdmVyc2UoXG4gICAgICAgIG5hbWVzcGFjZTogc3RyaW5nLCBzdGFydE5vZGU6IHN0cmluZywgbWF4RGVwdGggPSAxMCxcbiAgICAgICAgb3JkZXI6ICdiZnMnIHwgJ2RmcycgPSAnYmZzJ1xuICAgICk6IFByb21pc2U8eyBub2RlczogYW55W107IGVkZ2VzOiBhbnlbXSB9PiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuICAgICAgICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGNvbnN0IG5vZGVzOiBhbnlbXSA9IFtdO1xuICAgICAgICBjb25zdCBlZGdlczogYW55W10gPSBbXTtcbiAgICAgICAgY29uc3QgZnJvbnRpZXI6IEFycmF5PFtzdHJpbmcsIG51bWJlcl0+ID0gW1tzdGFydE5vZGUsIDBdXTtcblxuICAgICAgICB3aGlsZSAoZnJvbnRpZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgW2N1cnJlbnROb2RlLCBkZXB0aF0gPSBvcmRlciA9PT0gJ2JmcycgPyBmcm9udGllci5zaGlmdCgpISA6IGZyb250aWVyLnBvcCgpITtcbiAgICAgICAgICAgIGlmIChkZXB0aCA+IG1heERlcHRoIHx8IHZpc2l0ZWQuaGFzKGN1cnJlbnROb2RlKSkgY29udGludWU7XG4gICAgICAgICAgICB2aXNpdGVkLmFkZChjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRhID0gYXdhaXQgdGhpcy5nZXQoQnVmZmVyLmZyb20oYF9ncmFwaC8ke25hbWVzcGFjZX0vbm9kZXMvJHtjdXJyZW50Tm9kZX1gKSk7XG4gICAgICAgICAgICBpZiAobm9kZURhdGEpIG5vZGVzLnB1c2goSlNPTi5wYXJzZShub2RlRGF0YS50b1N0cmluZygpKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGVkZ2VQcmVmaXggPSBCdWZmZXIuZnJvbShgX2dyYXBoLyR7bmFtZXNwYWNlfS9lZGdlcy8ke2N1cnJlbnROb2RlfS9gKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBbLCB2YWx1ZUJ1Zl0gb2YgdGhpcy5zY2FuUHJlZml4KGVkZ2VQcmVmaXgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2UgPSBKU09OLnBhcnNlKHZhbHVlQnVmLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICBlZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzKGVkZ2UudG9faWQpKSBmcm9udGllci5wdXNoKFtlZGdlLnRvX2lkLCBkZXB0aCArIDFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHsgLyogc2NhbiBub3QgYXZhaWxhYmxlICovIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBub2RlcywgZWRnZXMgfTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBTZW1hbnRpYyBDYWNoZSBPcGVyYXRpb25zICh0aGluIHdyYXBwZXJzIHVzaW5nIEtWKVxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogUHV0IGEgdmFsdWUgaW4gdGhlIHNlbWFudGljIGNhY2hlXG4gICAgICovXG4gICAgYXN5bmMgY2FjaGVQdXQoXG4gICAgICAgIGNhY2hlTmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyxcbiAgICAgICAgZW1iZWRkaW5nOiBudW1iZXJbXSwgdHRsU2Vjb25kcyA9IDBcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgICAgIGNvbnN0IGtleUhhc2ggPSBCdWZmZXIuZnJvbShrZXkpLnRvU3RyaW5nKCdoZXgnKS5zbGljZSgwLCAxNik7XG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYF9jYWNoZS8ke2NhY2hlTmFtZX0vJHtrZXlIYXNofWA7XG4gICAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IHR0bFNlY29uZHMgPiAwID8gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkgKyB0dGxTZWNvbmRzIDogMDtcbiAgICAgICAgY29uc3QgY2FjaGVWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHsga2V5LCB2YWx1ZSwgZW1iZWRkaW5nLCBleHBpcmVzX2F0OiBleHBpcmVzQXQgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMucHV0KEJ1ZmZlci5mcm9tKGNhY2hlS2V5KSwgQnVmZmVyLmZyb20oY2FjaGVWYWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHZhbHVlIGZyb20gdGhlIHNlbWFudGljIGNhY2hlIGJ5IGVtYmVkZGluZyBzaW1pbGFyaXR5XG4gICAgICovXG4gICAgYXN5bmMgY2FjaGVHZXQoXG4gICAgICAgIGNhY2hlTmFtZTogc3RyaW5nLCBxdWVyeUVtYmVkZGluZzogbnVtYmVyW10sIHRocmVzaG9sZCA9IDAuODVcbiAgICApOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5mcm9tKGBfY2FjaGUvJHtjYWNoZU5hbWV9L2ApO1xuICAgICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgICAgbGV0IGJlc3RNYXRjaDogeyBzaW1pbGFyaXR5OiBudW1iZXI7IHZhbHVlOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IFssIHZhbHVlQnVmXSBvZiB0aGlzLnNjYW5QcmVmaXgocHJlZml4KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gSlNPTi5wYXJzZSh2YWx1ZUJ1Zi50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkuZXhwaXJlc19hdCA+IDAgJiYgbm93ID4gZW50cnkuZXhwaXJlc19hdCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LmVtYmVkZGluZyAmJiBlbnRyeS5lbWJlZGRpbmcubGVuZ3RoID09PSBxdWVyeUVtYmVkZGluZy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2ltaWxhcml0eSA9IEVtYmVkZGVkRGF0YWJhc2UuY29zaW5lU2ltaWxhcml0eShxdWVyeUVtYmVkZGluZywgZW50cnkuZW1iZWRkaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpbWlsYXJpdHkgPj0gdGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJlc3RNYXRjaCB8fCBzaW1pbGFyaXR5ID4gYmVzdE1hdGNoLnNpbWlsYXJpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2ggPSB7IHNpbWlsYXJpdHksIHZhbHVlOiBlbnRyeS52YWx1ZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHsgLyogc2NhbiBub3QgYXZhaWxhYmxlICovIH1cblxuICAgICAgICByZXR1cm4gYmVzdE1hdGNoPy52YWx1ZSA/PyBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhIGNhY2hlIGVudHJ5XG4gICAgICovXG4gICAgYXN5bmMgY2FjaGVEZWxldGUoY2FjaGVOYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuICAgICAgICBjb25zdCBrZXlIYXNoID0gQnVmZmVyLmZyb20oa2V5KS50b1N0cmluZygnaGV4Jykuc2xpY2UoMCwgMTYpO1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZShCdWZmZXIuZnJvbShgX2NhY2hlLyR7Y2FjaGVOYW1lfS8ke2tleUhhc2h9YCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIGFsbCBlbnRyaWVzIGluIGEgc2VtYW50aWMgY2FjaGVcbiAgICAgKi9cbiAgICBhc3luYyBjYWNoZUNsZWFyKGNhY2hlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5mcm9tKGBfY2FjaGUvJHtjYWNoZU5hbWV9L2ApO1xuICAgICAgICBsZXQgZGVsZXRlZCA9IDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB0b0RlbGV0ZTogQnVmZmVyW10gPSBbXTtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgW2tleUJ1Zl0gb2YgdGhpcy5zY2FuUHJlZml4KHByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICB0b0RlbGV0ZS5wdXNoKGtleUJ1Zik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGsgb2YgdG9EZWxldGUpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZShrKTtcbiAgICAgICAgICAgICAgICBkZWxldGVkKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBzY2FuIG5vdCBhdmFpbGFibGUgKi8gfVxuICAgICAgICByZXR1cm4gZGVsZXRlZDtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBTdGF0aWMgRm9ybWF0IFV0aWxpdGllc1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCByZWNvcmRzIHRvIFRPT04gZm9ybWF0XG4gICAgICovXG4gICAgc3RhdGljIHRvVG9vbihcbiAgICAgICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgICAgIHJlY29yZHM6IEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+LFxuICAgICAgICBmaWVsZHM/OiBzdHJpbmdbXVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIGlmICghcmVjb3JkcyB8fCByZWNvcmRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGAke3RhYmxlTmFtZX1bMF17fTpgO1xuICAgICAgICBjb25zdCB1c2VGaWVsZHMgPSBmaWVsZHMgPz8gT2JqZWN0LmtleXMocmVjb3Jkc1swXSk7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IGAke3RhYmxlTmFtZX1bJHtyZWNvcmRzLmxlbmd0aH1deyR7dXNlRmllbGRzLmpvaW4oJywnKX19OmA7XG4gICAgICAgIGNvbnN0IGVzY2FwZVZhbHVlID0gKHY6IGFueSk6IHN0cmluZyA9PiB7XG4gICAgICAgICAgICBjb25zdCBzID0gdiAhPSBudWxsID8gU3RyaW5nKHYpIDogJyc7XG4gICAgICAgICAgICBpZiAocy5pbmNsdWRlcygnLCcpIHx8IHMuaW5jbHVkZXMoJzsnKSB8fCBzLmluY2x1ZGVzKCdcXG4nKSkgcmV0dXJuIGBcIiR7c31cImA7XG4gICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgcm93cyA9IHJlY29yZHMubWFwKHIgPT4gdXNlRmllbGRzLm1hcChmID0+IGVzY2FwZVZhbHVlKHJbZl0pKS5qb2luKCcsJykpLmpvaW4oJzsnKTtcbiAgICAgICAgcmV0dXJuIGhlYWRlciArIHJvd3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCByZWNvcmRzIHRvIEpTT04gZm9ybWF0XG4gICAgICovXG4gICAgc3RhdGljIHRvSnNvbihcbiAgICAgICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgICAgIHJlY29yZHM6IEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+LFxuICAgICAgICBmaWVsZHM/OiBzdHJpbmdbXSxcbiAgICAgICAgY29tcGFjdCA9IHRydWVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXJlY29yZHMgfHwgcmVjb3Jkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHRhYmxlOiB0YWJsZU5hbWUsIGNvdW50OiAwLCByZWNvcmRzOiBbXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWx0ZXJlZFJlY29yZHMgPSBmaWVsZHNcbiAgICAgICAgICAgID8gcmVjb3Jkcy5tYXAociA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGYgb2YgZmllbGRzKSBmaWx0ZXJlZFtmXSA9IHJbZl07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogcmVjb3JkcztcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0geyB0YWJsZTogdGFibGVOYW1lLCBjb3VudDogZmlsdGVyZWRSZWNvcmRzLmxlbmd0aCwgcmVjb3JkczogZmlsdGVyZWRSZWNvcmRzIH07XG4gICAgICAgIHJldHVybiBjb21wYWN0ID8gSlNPTi5zdHJpbmdpZnkob3V0cHV0KSA6IEpTT04uc3RyaW5naWZ5KG91dHB1dCwgbnVsbCwgMik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgSlNPTiBmb3JtYXRcbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUpzb24oanNvblN0cjogc3RyaW5nKToge1xuICAgICAgICB0YWJsZTogc3RyaW5nOyBmaWVsZHM6IHN0cmluZ1tdOyByZWNvcmRzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcbiAgICB9IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoanNvblN0cik7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gZGF0YS50YWJsZSA/PyAndW5rbm93bic7XG4gICAgICAgIGNvbnN0IHJlY29yZHMgPSBkYXRhLnJlY29yZHMgPz8gW107XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IHJlY29yZHMubGVuZ3RoID4gMCA/IE9iamVjdC5rZXlzKHJlY29yZHNbMF0pIDogW107XG4gICAgICAgIHJldHVybiB7IHRhYmxlLCBmaWVsZHMsIHJlY29yZHMgfTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBQcml2YXRlIEhlbHBlcnNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHByaXZhdGUgc3RhdGljIGNvc2luZVNpbWlsYXJpdHkoYTogbnVtYmVyW10sIGI6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGRvdCA9IDAsIG5vcm1BID0gMCwgbm9ybUIgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRvdCArPSBhW2ldICogYltpXTsgbm9ybUEgKz0gYVtpXSAqIGFbaV07IG5vcm1CICs9IGJbaV0gKiBiW2ldO1xuICAgICAgICB9XG4gICAgICAgIG5vcm1BID0gTWF0aC5zcXJ0KG5vcm1BKTsgbm9ybUIgPSBNYXRoLnNxcnQobm9ybUIpO1xuICAgICAgICByZXR1cm4gbm9ybUEgPT09IDAgfHwgbm9ybUIgPT09IDAgPyAwIDogZG90IC8gKG5vcm1BICogbm9ybUIpO1xuICAgIH1cbn1cbiJdfQ==
package/dist/cjs/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /**
3
- * SochDB Node.js SDK v0.5.1
3
+ * SochDB Node.js SDK v0.5.3
4
4
  *
5
5
  * Dual-mode architecture: Embedded (FFI) + Server (gRPC/IPC)
6
6
  *
@@ -55,7 +55,7 @@ exports.GrpcClient = exports.SplitBrainError = exports.EpochMismatchError = expo
55
55
  exports.openConcurrent = openConcurrent;
56
56
  exports.open = open;
57
57
  // Version
58
- exports.VERSION = '0.5.1';
58
+ exports.VERSION = '0.5.3';
59
59
  // Embedded mode (FFI) - NEW
60
60
  var embedded_1 = require("./embedded");
61
61
  Object.defineProperty(exports, "EmbeddedDatabase", { enumerable: true, get: function () { return embedded_1.EmbeddedDatabase; } });
@@ -152,4 +152,4 @@ Object.defineProperty(exports, "SplitBrainError", { enumerable: true, get: funct
152
152
  // Convenience alias
153
153
  var grpc_client_2 = require("./grpc-client");
154
154
  Object.defineProperty(exports, "GrpcClient", { enumerable: true, get: function () { return grpc_client_2.SochDBClient; } });
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERzs7O0FBcUJILHdDQUVDO0FBTUQsb0JBRUM7QUE3QkQsVUFBVTtBQUNHLFFBQUEsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUUvQiw0QkFBNEI7QUFDNUIsdUNBQXNFO0FBQTdELDRHQUFBLGdCQUFnQixPQUFBO0FBQ3pCLHVDQUFpRDtBQUF4QywrR0FBQSxtQkFBbUIsT0FBQTtBQUM1Qix1Q0FBaUU7QUFBeEQscUdBQUEsU0FBUyxPQUFBO0FBQWMsd0dBQUEsWUFBWSxPQUFBO0FBRzVDLDBDQUEwQztBQUMxQyx1Q0FBMEQ7QUFBakQsb0dBQUEsZ0JBQWdCLE9BQVk7QUFFckMsa0VBQWtFO0FBQ2xFLHlDQUFzRTtBQUV0RTs7O0dBR0c7QUFDSCxTQUFnQixjQUFjLENBQUMsSUFBWSxFQUFFLE9BQTBDO0lBQ3JGLE9BQU8sMkJBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsSUFBSSxDQUFDLElBQVksRUFBRSxNQUErQjtJQUNoRSxPQUFPLDJCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELHlCQUF5QjtBQUN6Qix5Q0FRcUI7QUFQbkIsc0dBQUEsU0FBUyxPQUFBO0FBQ1QsdUdBQUEsVUFBVSxPQUFBO0FBQ1YsMkdBQUEsY0FBYyxPQUFBO0FBQ2QsbUhBQUEsc0JBQXNCLE9BQUE7QUFDdEIsaUhBQUEsb0JBQW9CLE9BQUE7QUFDcEIsb0hBQUEsdUJBQXVCLE9BQUE7QUFDdkIsa0hBQUEscUJBQXFCLE9BQUE7QUFTdkIscUJBQXFCO0FBQ3JCLGlDQUlpQjtBQUhmLHNHQUFBLGFBQWEsT0FBQTtBQUNiLGtHQUFBLFNBQVMsT0FBQTtBQUNULG9HQUFBLFdBQVcsT0FBQTtBQVNiLDBCQUEwQjtBQUMxQixtREFFMEI7QUFEeEIsK0dBQUEsYUFBYSxPQUFBO0FBUWYsMkJBQTJCO0FBQzNCLHFEQUsyQjtBQUp6QixzSEFBQSxtQkFBbUIsT0FBQTtBQUNuQixzSEFBQSxtQkFBbUIsT0FBQTtBQUNuQixxSEFBQSxrQkFBa0IsT0FBQTtBQUNsQix1SEFBQSxvQkFBb0IsT0FBQTtBQU10Qix5QkFBeUI7QUFDekIsbUNBS2tCO0FBSmhCLDRHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHNHQUFBLFlBQVksT0FBQTtBQUNaLHlHQUFBLGVBQWUsT0FBQTtBQUNmLG9HQUFBLFVBQVUsT0FBQTtBQWdCWix3Q0FBd0M7QUFDeEMsNkJBS2U7QUFKYixnR0FBQSxTQUFTLE9BQUE7QUFDVCxnR0FBQSxTQUFTLE9BQUE7QUFDVCwrRkFBQSxRQUFRLE9BQUE7QUFDUixzR0FBQSxlQUFlLE9BQUE7QUFpQmpCLDBCQUEwQjtBQUMxQixtQ0FFa0I7QUFEaEIsdUdBQUEsYUFBYSxPQUFBO0FBZWYseUJBQXlCO0FBQ3pCLDZDQUE2QztBQUFwQywyR0FBQSxZQUFZLE9BQUE7QUFRckIsMkNBQXlDO0FBQWhDLHVHQUFBLFNBQVMsT0FBQTtBQUVsQixtQkFBbUI7QUFDbkIsbUNBTWtCO0FBTGhCLG9HQUFBLFVBQVUsT0FBQTtBQUNWLHVHQUFBLGFBQWEsT0FBQTtBQUNiLHlHQUFBLGVBQWUsT0FBQTtBQUNmLDRHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLCtHQUFBLHFCQUFxQixPQUFBO0FBR3ZCLG1CQUFtQjtBQUNuQixpQ0FBZ0M7QUFBdkIsOEZBQUEsS0FBSyxPQUFBO0FBR2QsbUNBYWtCO0FBWmhCLHFHQUFBLFdBQVcsT0FBQTtBQUNYLHlHQUFBLGVBQWUsT0FBQTtBQUNmLDBHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLHVHQUFBLGFBQWEsT0FBQTtBQUNiLHVHQUFBLGFBQWEsT0FBQTtBQUNiLHVCQUF1QjtBQUN2QixtR0FBQSxTQUFTLE9BQUE7QUFDVCxtR0FBQSxTQUFTLE9BQUE7QUFDVCw2R0FBQSxtQkFBbUIsT0FBQTtBQUNuQiwwR0FBQSxnQkFBZ0IsT0FBQTtBQUNoQiw0R0FBQSxrQkFBa0IsT0FBQTtBQUNsQix5R0FBQSxlQUFlLE9BQUE7QUFHakIsb0JBQW9CO0FBQ3BCLDZDQUEyRDtBQUFsRCx5R0FBQSxZQUFZLE9BQWMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNvY2hEQiBOb2RlLmpzIFNESyB2MC41LjFcbiAqIFxuICogRHVhbC1tb2RlIGFyY2hpdGVjdHVyZTogRW1iZWRkZWQgKEZGSSkgKyBTZXJ2ZXIgKGdSUEMvSVBDKVxuICogXG4gKiBBcmNoaXRlY3R1cmU6IEZsZXhpYmxlIERlcGxveW1lbnRcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFRoaXMgU0RLIHN1cHBvcnRzIEJPVEggbW9kZXM6XG4gKiBcbiAqIDEuIEVtYmVkZGVkIE1vZGUgKEZGSSkgLSBGb3Igc2luZ2xlLXByb2Nlc3MgYXBwczpcbiAqICAgIC0gRGlyZWN0IEZGSSBiaW5kaW5ncyB0byBSdXN0IGxpYnJhcmllc1xuICogICAgLSBObyBzZXJ2ZXIgcmVxdWlyZWQgLSBqdXN0IG5wbSBpbnN0YWxsIGFuZCBydW5cbiAqICAgIC0gQmVzdCBmb3I6IExvY2FsIGRldmVsb3BtZW50LCBzaW1wbGUgYXBwc1xuICogXG4gKiAyLiBDb25jdXJyZW50IE1vZGUgKEZGSSkgLSBGb3IgbXVsdGktcHJvY2VzcyBhcHBzOlxuICogICAgLSBTYW1lIEZGSSBiaW5kaW5ncyB3aXRoIE1WQ0MgZm9yIGNvbmN1cnJlbnQgYWNjZXNzXG4gKiAgICAtIE11bHRpcGxlIE5vZGUuanMgcHJvY2Vzc2VzIGNhbiBhY2Nlc3Mgc2FtZSBkYXRhYmFzZVxuICogICAgLSBCZXN0IGZvcjogUE0yIGNsdXN0ZXIsIEV4cHJlc3Mgd29ya2Vyc1xuICogXG4gKiAzLiBTZXJ2ZXIgTW9kZSAoZ1JQQy9JUEMpIC0gRm9yIGRpc3RyaWJ1dGVkIHN5c3RlbXM6XG4gKiAgICAtIFRoaW4gY2xpZW50IGNvbm5lY3RpbmcgdG8gc29jaGRiLWdycGMgc2VydmVyXG4gKiAgICAtIEJlc3QgZm9yOiBQcm9kdWN0aW9uLCBtdWx0aS1sYW5ndWFnZSwgc2NhbGFiaWxpdHlcbiAqIFxuICogQGV4YW1wbGUgRW1iZWRkZWQgTW9kZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tICdAc29jaGRiL3NvY2hkYic7XG4gKiBcbiAqIC8vIERpcmVjdCBGRkkgLSBubyBzZXJ2ZXIgbmVlZGVkXG4gKiBjb25zdCBkYiA9IGF3YWl0IERhdGFiYXNlLm9wZW4oJy4vbXlkYicpO1xuICogYXdhaXQgZGIucHV0KEJ1ZmZlci5mcm9tKCdrZXknKSwgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogYXdhaXQgZGIuY2xvc2UoKTtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZSBDb25jdXJyZW50IE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IERhdGFiYXNlIH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICogXG4gKiAvLyBNdWx0aXBsZSBwcm9jZXNzZXMgY2FuIGFjY2VzcyBzaW11bHRhbmVvdXNseVxuICogY29uc3QgZGIgPSBEYXRhYmFzZS5vcGVuQ29uY3VycmVudCgnLi9teWRiJyk7XG4gKiBjb25zb2xlLmxvZyhgQ29uY3VycmVudDogJHtkYi5pc0NvbmN1cnJlbnR9YCk7XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGUgU2VydmVyIE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFNvY2hEQkNsaWVudCB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqIFxuICogLy8gQ29ubmVjdCB0byBzZXJ2ZXJcbiAqIGNvbnN0IGNsaWVudCA9IG5ldyBTb2NoREJDbGllbnQoeyBhZGRyZXNzOiAnbG9jYWxob3N0OjUwMDUxJyB9KTtcbiAqIGF3YWl0IGNsaWVudC5wdXRLdigna2V5JywgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogYGBgXG4gKi9cblxuLy8gVmVyc2lvblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnMC41LjEnO1xuXG4vLyBFbWJlZGRlZCBtb2RlIChGRkkpIC0gTkVXXG5leHBvcnQgeyBFbWJlZGRlZERhdGFiYXNlLCBFbWJlZGRlZERhdGFiYXNlQ29uZmlnIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5leHBvcnQgeyBFbWJlZGRlZFRyYW5zYWN0aW9uIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5leHBvcnQgeyBIbnN3SW5kZXgsIEhuc3dDb25maWcsIEhuc3dCaW5kaW5ncyB9IGZyb20gJy4vZW1iZWRkZWQnO1xuZXhwb3J0IHsgU2VhcmNoUmVzdWx0IGFzIEhuc3dTZWFyY2hSZXN1bHQgfSBmcm9tICcuL2VtYmVkZGVkJztcblxuLy8gRW1iZWRkZWQgbW9kZSAoRkZJKSAtIENvbnZlbmllbmNlIGFsaWFzXG5leHBvcnQgeyBFbWJlZGRlZERhdGFiYXNlIGFzIERhdGFiYXNlIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5cbi8vIEVtYmVkZGVkIG1vZGUgKEZGSSkgLSBDb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIGNvbmN1cnJlbnQgbW9kZVxuaW1wb3J0IHsgRW1iZWRkZWREYXRhYmFzZSwgRW1iZWRkZWREYXRhYmFzZUNvbmZpZyB9IGZyb20gJy4vZW1iZWRkZWQnO1xuXG4vKipcbiAqIE9wZW4gYSBkYXRhYmFzZSBpbiBjb25jdXJyZW50IG1vZGUgKG11bHRpLXByb2Nlc3Mgc2FmZSkuXG4gKiBBbGlhcyBmb3IgRW1iZWRkZWREYXRhYmFzZS5vcGVuQ29uY3VycmVudCgpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcGVuQ29uY3VycmVudChwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGZhbGxiYWNrVG9TdGFuZGFyZD86IGJvb2xlYW4gfSk6IEVtYmVkZGVkRGF0YWJhc2Uge1xuICByZXR1cm4gRW1iZWRkZWREYXRhYmFzZS5vcGVuQ29uY3VycmVudChwYXRoLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBPcGVuIGEgZGF0YWJhc2UgaW4gc3RhbmRhcmQgbW9kZS5cbiAqIEFsaWFzIGZvciBFbWJlZGRlZERhdGFiYXNlLm9wZW4oKVxuICovXG5leHBvcnQgZnVuY3Rpb24gb3BlbihwYXRoOiBzdHJpbmcsIGNvbmZpZz86IEVtYmVkZGVkRGF0YWJhc2VDb25maWcpOiBFbWJlZGRlZERhdGFiYXNlIHtcbiAgcmV0dXJuIEVtYmVkZGVkRGF0YWJhc2Uub3BlbihwYXRoLCBjb25maWcpO1xufVxuXG4vLyBOYW1lc3BhY2UgQVBJICh2MC40LjEpXG5leHBvcnQge1xuICBOYW1lc3BhY2UsXG4gIENvbGxlY3Rpb24sXG4gIERpc3RhbmNlTWV0cmljLFxuICBOYW1lc3BhY2VOb3RGb3VuZEVycm9yLFxuICBOYW1lc3BhY2VFeGlzdHNFcnJvcixcbiAgQ29sbGVjdGlvbk5vdEZvdW5kRXJyb3IsXG4gIENvbGxlY3Rpb25FeGlzdHNFcnJvcixcbn0gZnJvbSAnLi9uYW1lc3BhY2UnO1xuZXhwb3J0IHR5cGUge1xuICBOYW1lc3BhY2VDb25maWcsXG4gIENvbGxlY3Rpb25Db25maWcsXG4gIFNlYXJjaFJlcXVlc3QsXG4gIFNlYXJjaFJlc3VsdCBhcyBOYW1lc3BhY2VTZWFyY2hSZXN1bHQsXG59IGZyb20gJy4vbmFtZXNwYWNlJztcblxuLy8gUXVldWUgQVBJICh2MC40LjEpXG5leHBvcnQge1xuICBQcmlvcml0eVF1ZXVlLFxuICBUYXNrU3RhdGUsXG4gIGNyZWF0ZVF1ZXVlLFxufSBmcm9tICcuL3F1ZXVlJztcbmV4cG9ydCB0eXBlIHtcbiAgUXVldWVDb25maWcsXG4gIFF1ZXVlS2V5LFxuICBUYXNrLFxuICBRdWV1ZVN0YXRzLFxufSBmcm9tICcuL3F1ZXVlJztcblxuLy8gU2VtYW50aWMgQ2FjaGUgKHYwLjQuMSlcbmV4cG9ydCB7XG4gIFNlbWFudGljQ2FjaGUsXG59IGZyb20gJy4vc2VtYW50aWMtY2FjaGUnO1xuZXhwb3J0IHR5cGUge1xuICBDYWNoZUVudHJ5LFxuICBDYWNoZUhpdCxcbiAgQ2FjaGVTdGF0cyxcbn0gZnJvbSAnLi9zZW1hbnRpYy1jYWNoZSc7XG5cbi8vIENvbnRleHQgQnVpbGRlciAodjAuNC4xKVxuZXhwb3J0IHtcbiAgQ29udGV4dFF1ZXJ5QnVpbGRlcixcbiAgQ29udGV4dE91dHB1dEZvcm1hdCxcbiAgVHJ1bmNhdGlvblN0cmF0ZWd5LFxuICBjcmVhdGVDb250ZXh0QnVpbGRlcixcbn0gZnJvbSAnLi9jb250ZXh0LWJ1aWxkZXInO1xuZXhwb3J0IHR5cGUge1xuICBDb250ZXh0UmVzdWx0LFxufSBmcm9tICcuL2NvbnRleHQtYnVpbGRlcic7XG5cbi8vIE1lbW9yeSBTeXN0ZW0gKHYwLjQuMilcbmV4cG9ydCB7XG4gIEV4dHJhY3Rpb25QaXBlbGluZSxcbiAgQ29uc29saWRhdG9yLFxuICBIeWJyaWRSZXRyaWV2ZXIsXG4gIEFsbG93ZWRTZXQsXG59IGZyb20gJy4vbWVtb3J5JztcbmV4cG9ydCB0eXBlIHtcbiAgRW50aXR5LFxuICBSZWxhdGlvbixcbiAgQXNzZXJ0aW9uLFxuICBSYXdBc3NlcnRpb24sXG4gIENhbm9uaWNhbEZhY3QsXG4gIEV4dHJhY3Rpb25SZXN1bHQsXG4gIEV4dHJhY3Rpb25TY2hlbWEsXG4gIENvbnNvbGlkYXRpb25Db25maWcsXG4gIFJldHJpZXZhbENvbmZpZyxcbiAgUmV0cmlldmFsUmVzdWx0LFxuICBSZXRyaWV2YWxSZXNwb25zZSxcbn0gZnJvbSAnLi9tZW1vcnknO1xuXG4vLyBNQ1AgLSBNb2RlbCBDb250ZXh0IFByb3RvY29sICh2MC40LjMpXG5leHBvcnQge1xuICBNY3BTZXJ2ZXIsXG4gIE1jcENsaWVudCxcbiAgTWNwRXJyb3IsXG4gIE1DUF9FUlJPUl9DT0RFUyxcbn0gZnJvbSAnLi9tY3AnO1xuZXhwb3J0IHR5cGUge1xuICBNY3BUb29sLFxuICBNY3BUb29sQ2FsbCxcbiAgTWNwVG9vbFJlc3VsdCxcbiAgTWNwUmVzb3VyY2UsXG4gIE1jcFJlc291cmNlQ29udGVudCxcbiAgTWNwUHJvbXB0LFxuICBNY3BQcm9tcHRBcmd1bWVudCxcbiAgTWNwUHJvbXB0TWVzc2FnZSxcbiAgTWNwU2VydmVyQ2FwYWJpbGl0aWVzLFxuICBNY3BTZXJ2ZXJDb25maWcsXG4gIE1jcENsaWVudENvbmZpZyxcbiAgTWNwVHJhbnNwb3J0LFxufSBmcm9tICcuL21jcCc7XG5cbi8vIFBvbGljeSBTZXJ2aWNlICh2MC40LjMpXG5leHBvcnQge1xuICBQb2xpY3lTZXJ2aWNlLFxufSBmcm9tICcuL3BvbGljeSc7XG5leHBvcnQgdHlwZSB7XG4gIFBvbGljeVJ1bGUsXG4gIFBvbGljeUNvbmRpdGlvbixcbiAgUG9saWN5RXZhbHVhdGlvbixcbiAgTmFtZXNwYWNlUG9saWN5LFxuICBOYW1lc3BhY2VHcmFudCxcbiAgTmFtZXNwYWNlUGVybWlzc2lvbixcbiAgUG9saWN5QWN0aW9uLFxuICBQb2xpY3lSZXF1ZXN0LFxuICBQb2xpY3lTZXQsXG4gIFBvbGljeUF1ZGl0RW50cnksXG59IGZyb20gJy4vcG9saWN5JztcblxuLy8gU2VydmVyIG1vZGUgKGdSUEMvSVBDKVxuZXhwb3J0IHsgU29jaERCQ2xpZW50IH0gZnJvbSAnLi9ncnBjLWNsaWVudCc7XG5leHBvcnQgdHlwZSB7XG4gIFNlYXJjaFJlc3VsdCxcbiAgRG9jdW1lbnQsXG4gIEdyYXBoTm9kZSxcbiAgR3JhcGhFZGdlLFxufSBmcm9tICcuL2dycGMtY2xpZW50JztcblxuZXhwb3J0IHsgSXBjQ2xpZW50IH0gZnJvbSAnLi9pcGMtY2xpZW50JztcblxuLy8gRm9ybWF0IHV0aWxpdGllc1xuZXhwb3J0IHtcbiAgV2lyZUZvcm1hdCxcbiAgQ29udGV4dEZvcm1hdCxcbiAgQ2Fub25pY2FsRm9ybWF0LFxuICBGb3JtYXRDYXBhYmlsaXRpZXMsXG4gIEZvcm1hdENvbnZlcnNpb25FcnJvcixcbn0gZnJvbSAnLi9mb3JtYXQnO1xuXG4vLyBUeXBlIGRlZmluaXRpb25zXG5leHBvcnQgeyBRdWVyeSB9IGZyb20gJy4vcXVlcnknO1xuZXhwb3J0IHR5cGUgeyBRdWVyeVJlc3VsdCB9IGZyb20gJy4vcXVlcnknO1xuXG5leHBvcnQge1xuICBTb2NoREJFcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBUcmFuc2FjdGlvbkVycm9yLFxuICBQcm90b2NvbEVycm9yLFxuICBEYXRhYmFzZUVycm9yLFxuICAvLyBMb2NrIGVycm9ycyAodjAuNC4xKVxuICBFcnJvckNvZGUsXG4gIExvY2tFcnJvcixcbiAgRGF0YWJhc2VMb2NrZWRFcnJvcixcbiAgTG9ja1RpbWVvdXRFcnJvcixcbiAgRXBvY2hNaXNtYXRjaEVycm9yLFxuICBTcGxpdEJyYWluRXJyb3IsXG59IGZyb20gJy4vZXJyb3JzJztcblxuLy8gQ29udmVuaWVuY2UgYWxpYXNcbmV4cG9ydCB7IFNvY2hEQkNsaWVudCBhcyBHcnBjQ2xpZW50IH0gZnJvbSAnLi9ncnBjLWNsaWVudCc7XG4iXX0=
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERzs7O0FBcUJILHdDQUVDO0FBTUQsb0JBRUM7QUE3QkQsVUFBVTtBQUNHLFFBQUEsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUUvQiw0QkFBNEI7QUFDNUIsdUNBQXNFO0FBQTdELDRHQUFBLGdCQUFnQixPQUFBO0FBQ3pCLHVDQUFpRDtBQUF4QywrR0FBQSxtQkFBbUIsT0FBQTtBQUM1Qix1Q0FBaUU7QUFBeEQscUdBQUEsU0FBUyxPQUFBO0FBQWMsd0dBQUEsWUFBWSxPQUFBO0FBRzVDLDBDQUEwQztBQUMxQyx1Q0FBMEQ7QUFBakQsb0dBQUEsZ0JBQWdCLE9BQVk7QUFFckMsa0VBQWtFO0FBQ2xFLHlDQUFzRTtBQUV0RTs7O0dBR0c7QUFDSCxTQUFnQixjQUFjLENBQUMsSUFBWSxFQUFFLE9BQTBDO0lBQ3JGLE9BQU8sMkJBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsSUFBSSxDQUFDLElBQVksRUFBRSxNQUErQjtJQUNoRSxPQUFPLDJCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELHlCQUF5QjtBQUN6Qix5Q0FRcUI7QUFQbkIsc0dBQUEsU0FBUyxPQUFBO0FBQ1QsdUdBQUEsVUFBVSxPQUFBO0FBQ1YsMkdBQUEsY0FBYyxPQUFBO0FBQ2QsbUhBQUEsc0JBQXNCLE9BQUE7QUFDdEIsaUhBQUEsb0JBQW9CLE9BQUE7QUFDcEIsb0hBQUEsdUJBQXVCLE9BQUE7QUFDdkIsa0hBQUEscUJBQXFCLE9BQUE7QUFTdkIscUJBQXFCO0FBQ3JCLGlDQUlpQjtBQUhmLHNHQUFBLGFBQWEsT0FBQTtBQUNiLGtHQUFBLFNBQVMsT0FBQTtBQUNULG9HQUFBLFdBQVcsT0FBQTtBQVNiLDBCQUEwQjtBQUMxQixtREFFMEI7QUFEeEIsK0dBQUEsYUFBYSxPQUFBO0FBUWYsMkJBQTJCO0FBQzNCLHFEQUsyQjtBQUp6QixzSEFBQSxtQkFBbUIsT0FBQTtBQUNuQixzSEFBQSxtQkFBbUIsT0FBQTtBQUNuQixxSEFBQSxrQkFBa0IsT0FBQTtBQUNsQix1SEFBQSxvQkFBb0IsT0FBQTtBQU10Qix5QkFBeUI7QUFDekIsbUNBS2tCO0FBSmhCLDRHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHNHQUFBLFlBQVksT0FBQTtBQUNaLHlHQUFBLGVBQWUsT0FBQTtBQUNmLG9HQUFBLFVBQVUsT0FBQTtBQWdCWix3Q0FBd0M7QUFDeEMsNkJBS2U7QUFKYixnR0FBQSxTQUFTLE9BQUE7QUFDVCxnR0FBQSxTQUFTLE9BQUE7QUFDVCwrRkFBQSxRQUFRLE9BQUE7QUFDUixzR0FBQSxlQUFlLE9BQUE7QUFpQmpCLDBCQUEwQjtBQUMxQixtQ0FFa0I7QUFEaEIsdUdBQUEsYUFBYSxPQUFBO0FBZWYseUJBQXlCO0FBQ3pCLDZDQUE2QztBQUFwQywyR0FBQSxZQUFZLE9BQUE7QUFRckIsMkNBQXlDO0FBQWhDLHVHQUFBLFNBQVMsT0FBQTtBQUVsQixtQkFBbUI7QUFDbkIsbUNBTWtCO0FBTGhCLG9HQUFBLFVBQVUsT0FBQTtBQUNWLHVHQUFBLGFBQWEsT0FBQTtBQUNiLHlHQUFBLGVBQWUsT0FBQTtBQUNmLDRHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLCtHQUFBLHFCQUFxQixPQUFBO0FBR3ZCLG1CQUFtQjtBQUNuQixpQ0FBZ0M7QUFBdkIsOEZBQUEsS0FBSyxPQUFBO0FBR2QsbUNBYWtCO0FBWmhCLHFHQUFBLFdBQVcsT0FBQTtBQUNYLHlHQUFBLGVBQWUsT0FBQTtBQUNmLDBHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLHVHQUFBLGFBQWEsT0FBQTtBQUNiLHVHQUFBLGFBQWEsT0FBQTtBQUNiLHVCQUF1QjtBQUN2QixtR0FBQSxTQUFTLE9BQUE7QUFDVCxtR0FBQSxTQUFTLE9BQUE7QUFDVCw2R0FBQSxtQkFBbUIsT0FBQTtBQUNuQiwwR0FBQSxnQkFBZ0IsT0FBQTtBQUNoQiw0R0FBQSxrQkFBa0IsT0FBQTtBQUNsQix5R0FBQSxlQUFlLE9BQUE7QUFHakIsb0JBQW9CO0FBQ3BCLDZDQUEyRDtBQUFsRCx5R0FBQSxZQUFZLE9BQWMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNvY2hEQiBOb2RlLmpzIFNESyB2MC41LjNcbiAqIFxuICogRHVhbC1tb2RlIGFyY2hpdGVjdHVyZTogRW1iZWRkZWQgKEZGSSkgKyBTZXJ2ZXIgKGdSUEMvSVBDKVxuICogXG4gKiBBcmNoaXRlY3R1cmU6IEZsZXhpYmxlIERlcGxveW1lbnRcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFRoaXMgU0RLIHN1cHBvcnRzIEJPVEggbW9kZXM6XG4gKiBcbiAqIDEuIEVtYmVkZGVkIE1vZGUgKEZGSSkgLSBGb3Igc2luZ2xlLXByb2Nlc3MgYXBwczpcbiAqICAgIC0gRGlyZWN0IEZGSSBiaW5kaW5ncyB0byBSdXN0IGxpYnJhcmllc1xuICogICAgLSBObyBzZXJ2ZXIgcmVxdWlyZWQgLSBqdXN0IG5wbSBpbnN0YWxsIGFuZCBydW5cbiAqICAgIC0gQmVzdCBmb3I6IExvY2FsIGRldmVsb3BtZW50LCBzaW1wbGUgYXBwc1xuICogXG4gKiAyLiBDb25jdXJyZW50IE1vZGUgKEZGSSkgLSBGb3IgbXVsdGktcHJvY2VzcyBhcHBzOlxuICogICAgLSBTYW1lIEZGSSBiaW5kaW5ncyB3aXRoIE1WQ0MgZm9yIGNvbmN1cnJlbnQgYWNjZXNzXG4gKiAgICAtIE11bHRpcGxlIE5vZGUuanMgcHJvY2Vzc2VzIGNhbiBhY2Nlc3Mgc2FtZSBkYXRhYmFzZVxuICogICAgLSBCZXN0IGZvcjogUE0yIGNsdXN0ZXIsIEV4cHJlc3Mgd29ya2Vyc1xuICogXG4gKiAzLiBTZXJ2ZXIgTW9kZSAoZ1JQQy9JUEMpIC0gRm9yIGRpc3RyaWJ1dGVkIHN5c3RlbXM6XG4gKiAgICAtIFRoaW4gY2xpZW50IGNvbm5lY3RpbmcgdG8gc29jaGRiLWdycGMgc2VydmVyXG4gKiAgICAtIEJlc3QgZm9yOiBQcm9kdWN0aW9uLCBtdWx0aS1sYW5ndWFnZSwgc2NhbGFiaWxpdHlcbiAqIFxuICogQGV4YW1wbGUgRW1iZWRkZWQgTW9kZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tICdAc29jaGRiL3NvY2hkYic7XG4gKiBcbiAqIC8vIERpcmVjdCBGRkkgLSBubyBzZXJ2ZXIgbmVlZGVkXG4gKiBjb25zdCBkYiA9IGF3YWl0IERhdGFiYXNlLm9wZW4oJy4vbXlkYicpO1xuICogYXdhaXQgZGIucHV0KEJ1ZmZlci5mcm9tKCdrZXknKSwgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogYXdhaXQgZGIuY2xvc2UoKTtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZSBDb25jdXJyZW50IE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IERhdGFiYXNlIH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICogXG4gKiAvLyBNdWx0aXBsZSBwcm9jZXNzZXMgY2FuIGFjY2VzcyBzaW11bHRhbmVvdXNseVxuICogY29uc3QgZGIgPSBEYXRhYmFzZS5vcGVuQ29uY3VycmVudCgnLi9teWRiJyk7XG4gKiBjb25zb2xlLmxvZyhgQ29uY3VycmVudDogJHtkYi5pc0NvbmN1cnJlbnR9YCk7XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGUgU2VydmVyIE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFNvY2hEQkNsaWVudCB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqIFxuICogLy8gQ29ubmVjdCB0byBzZXJ2ZXJcbiAqIGNvbnN0IGNsaWVudCA9IG5ldyBTb2NoREJDbGllbnQoeyBhZGRyZXNzOiAnbG9jYWxob3N0OjUwMDUxJyB9KTtcbiAqIGF3YWl0IGNsaWVudC5wdXRLdigna2V5JywgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogYGBgXG4gKi9cblxuLy8gVmVyc2lvblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnMC41LjMnO1xuXG4vLyBFbWJlZGRlZCBtb2RlIChGRkkpIC0gTkVXXG5leHBvcnQgeyBFbWJlZGRlZERhdGFiYXNlLCBFbWJlZGRlZERhdGFiYXNlQ29uZmlnIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5leHBvcnQgeyBFbWJlZGRlZFRyYW5zYWN0aW9uIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5leHBvcnQgeyBIbnN3SW5kZXgsIEhuc3dDb25maWcsIEhuc3dCaW5kaW5ncyB9IGZyb20gJy4vZW1iZWRkZWQnO1xuZXhwb3J0IHsgU2VhcmNoUmVzdWx0IGFzIEhuc3dTZWFyY2hSZXN1bHQgfSBmcm9tICcuL2VtYmVkZGVkJztcblxuLy8gRW1iZWRkZWQgbW9kZSAoRkZJKSAtIENvbnZlbmllbmNlIGFsaWFzXG5leHBvcnQgeyBFbWJlZGRlZERhdGFiYXNlIGFzIERhdGFiYXNlIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5cbi8vIEVtYmVkZGVkIG1vZGUgKEZGSSkgLSBDb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIGNvbmN1cnJlbnQgbW9kZVxuaW1wb3J0IHsgRW1iZWRkZWREYXRhYmFzZSwgRW1iZWRkZWREYXRhYmFzZUNvbmZpZyB9IGZyb20gJy4vZW1iZWRkZWQnO1xuXG4vKipcbiAqIE9wZW4gYSBkYXRhYmFzZSBpbiBjb25jdXJyZW50IG1vZGUgKG11bHRpLXByb2Nlc3Mgc2FmZSkuXG4gKiBBbGlhcyBmb3IgRW1iZWRkZWREYXRhYmFzZS5vcGVuQ29uY3VycmVudCgpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcGVuQ29uY3VycmVudChwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGZhbGxiYWNrVG9TdGFuZGFyZD86IGJvb2xlYW4gfSk6IEVtYmVkZGVkRGF0YWJhc2Uge1xuICByZXR1cm4gRW1iZWRkZWREYXRhYmFzZS5vcGVuQ29uY3VycmVudChwYXRoLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBPcGVuIGEgZGF0YWJhc2UgaW4gc3RhbmRhcmQgbW9kZS5cbiAqIEFsaWFzIGZvciBFbWJlZGRlZERhdGFiYXNlLm9wZW4oKVxuICovXG5leHBvcnQgZnVuY3Rpb24gb3BlbihwYXRoOiBzdHJpbmcsIGNvbmZpZz86IEVtYmVkZGVkRGF0YWJhc2VDb25maWcpOiBFbWJlZGRlZERhdGFiYXNlIHtcbiAgcmV0dXJuIEVtYmVkZGVkRGF0YWJhc2Uub3BlbihwYXRoLCBjb25maWcpO1xufVxuXG4vLyBOYW1lc3BhY2UgQVBJICh2MC40LjEpXG5leHBvcnQge1xuICBOYW1lc3BhY2UsXG4gIENvbGxlY3Rpb24sXG4gIERpc3RhbmNlTWV0cmljLFxuICBOYW1lc3BhY2VOb3RGb3VuZEVycm9yLFxuICBOYW1lc3BhY2VFeGlzdHNFcnJvcixcbiAgQ29sbGVjdGlvbk5vdEZvdW5kRXJyb3IsXG4gIENvbGxlY3Rpb25FeGlzdHNFcnJvcixcbn0gZnJvbSAnLi9uYW1lc3BhY2UnO1xuZXhwb3J0IHR5cGUge1xuICBOYW1lc3BhY2VDb25maWcsXG4gIENvbGxlY3Rpb25Db25maWcsXG4gIFNlYXJjaFJlcXVlc3QsXG4gIFNlYXJjaFJlc3VsdCBhcyBOYW1lc3BhY2VTZWFyY2hSZXN1bHQsXG59IGZyb20gJy4vbmFtZXNwYWNlJztcblxuLy8gUXVldWUgQVBJICh2MC40LjEpXG5leHBvcnQge1xuICBQcmlvcml0eVF1ZXVlLFxuICBUYXNrU3RhdGUsXG4gIGNyZWF0ZVF1ZXVlLFxufSBmcm9tICcuL3F1ZXVlJztcbmV4cG9ydCB0eXBlIHtcbiAgUXVldWVDb25maWcsXG4gIFF1ZXVlS2V5LFxuICBUYXNrLFxuICBRdWV1ZVN0YXRzLFxufSBmcm9tICcuL3F1ZXVlJztcblxuLy8gU2VtYW50aWMgQ2FjaGUgKHYwLjQuMSlcbmV4cG9ydCB7XG4gIFNlbWFudGljQ2FjaGUsXG59IGZyb20gJy4vc2VtYW50aWMtY2FjaGUnO1xuZXhwb3J0IHR5cGUge1xuICBDYWNoZUVudHJ5LFxuICBDYWNoZUhpdCxcbiAgQ2FjaGVTdGF0cyxcbn0gZnJvbSAnLi9zZW1hbnRpYy1jYWNoZSc7XG5cbi8vIENvbnRleHQgQnVpbGRlciAodjAuNC4xKVxuZXhwb3J0IHtcbiAgQ29udGV4dFF1ZXJ5QnVpbGRlcixcbiAgQ29udGV4dE91dHB1dEZvcm1hdCxcbiAgVHJ1bmNhdGlvblN0cmF0ZWd5LFxuICBjcmVhdGVDb250ZXh0QnVpbGRlcixcbn0gZnJvbSAnLi9jb250ZXh0LWJ1aWxkZXInO1xuZXhwb3J0IHR5cGUge1xuICBDb250ZXh0UmVzdWx0LFxufSBmcm9tICcuL2NvbnRleHQtYnVpbGRlcic7XG5cbi8vIE1lbW9yeSBTeXN0ZW0gKHYwLjQuMilcbmV4cG9ydCB7XG4gIEV4dHJhY3Rpb25QaXBlbGluZSxcbiAgQ29uc29saWRhdG9yLFxuICBIeWJyaWRSZXRyaWV2ZXIsXG4gIEFsbG93ZWRTZXQsXG59IGZyb20gJy4vbWVtb3J5JztcbmV4cG9ydCB0eXBlIHtcbiAgRW50aXR5LFxuICBSZWxhdGlvbixcbiAgQXNzZXJ0aW9uLFxuICBSYXdBc3NlcnRpb24sXG4gIENhbm9uaWNhbEZhY3QsXG4gIEV4dHJhY3Rpb25SZXN1bHQsXG4gIEV4dHJhY3Rpb25TY2hlbWEsXG4gIENvbnNvbGlkYXRpb25Db25maWcsXG4gIFJldHJpZXZhbENvbmZpZyxcbiAgUmV0cmlldmFsUmVzdWx0LFxuICBSZXRyaWV2YWxSZXNwb25zZSxcbn0gZnJvbSAnLi9tZW1vcnknO1xuXG4vLyBNQ1AgLSBNb2RlbCBDb250ZXh0IFByb3RvY29sICh2MC40LjMpXG5leHBvcnQge1xuICBNY3BTZXJ2ZXIsXG4gIE1jcENsaWVudCxcbiAgTWNwRXJyb3IsXG4gIE1DUF9FUlJPUl9DT0RFUyxcbn0gZnJvbSAnLi9tY3AnO1xuZXhwb3J0IHR5cGUge1xuICBNY3BUb29sLFxuICBNY3BUb29sQ2FsbCxcbiAgTWNwVG9vbFJlc3VsdCxcbiAgTWNwUmVzb3VyY2UsXG4gIE1jcFJlc291cmNlQ29udGVudCxcbiAgTWNwUHJvbXB0LFxuICBNY3BQcm9tcHRBcmd1bWVudCxcbiAgTWNwUHJvbXB0TWVzc2FnZSxcbiAgTWNwU2VydmVyQ2FwYWJpbGl0aWVzLFxuICBNY3BTZXJ2ZXJDb25maWcsXG4gIE1jcENsaWVudENvbmZpZyxcbiAgTWNwVHJhbnNwb3J0LFxufSBmcm9tICcuL21jcCc7XG5cbi8vIFBvbGljeSBTZXJ2aWNlICh2MC40LjMpXG5leHBvcnQge1xuICBQb2xpY3lTZXJ2aWNlLFxufSBmcm9tICcuL3BvbGljeSc7XG5leHBvcnQgdHlwZSB7XG4gIFBvbGljeVJ1bGUsXG4gIFBvbGljeUNvbmRpdGlvbixcbiAgUG9saWN5RXZhbHVhdGlvbixcbiAgTmFtZXNwYWNlUG9saWN5LFxuICBOYW1lc3BhY2VHcmFudCxcbiAgTmFtZXNwYWNlUGVybWlzc2lvbixcbiAgUG9saWN5QWN0aW9uLFxuICBQb2xpY3lSZXF1ZXN0LFxuICBQb2xpY3lTZXQsXG4gIFBvbGljeUF1ZGl0RW50cnksXG59IGZyb20gJy4vcG9saWN5JztcblxuLy8gU2VydmVyIG1vZGUgKGdSUEMvSVBDKVxuZXhwb3J0IHsgU29jaERCQ2xpZW50IH0gZnJvbSAnLi9ncnBjLWNsaWVudCc7XG5leHBvcnQgdHlwZSB7XG4gIFNlYXJjaFJlc3VsdCxcbiAgRG9jdW1lbnQsXG4gIEdyYXBoTm9kZSxcbiAgR3JhcGhFZGdlLFxufSBmcm9tICcuL2dycGMtY2xpZW50JztcblxuZXhwb3J0IHsgSXBjQ2xpZW50IH0gZnJvbSAnLi9pcGMtY2xpZW50JztcblxuLy8gRm9ybWF0IHV0aWxpdGllc1xuZXhwb3J0IHtcbiAgV2lyZUZvcm1hdCxcbiAgQ29udGV4dEZvcm1hdCxcbiAgQ2Fub25pY2FsRm9ybWF0LFxuICBGb3JtYXRDYXBhYmlsaXRpZXMsXG4gIEZvcm1hdENvbnZlcnNpb25FcnJvcixcbn0gZnJvbSAnLi9mb3JtYXQnO1xuXG4vLyBUeXBlIGRlZmluaXRpb25zXG5leHBvcnQgeyBRdWVyeSB9IGZyb20gJy4vcXVlcnknO1xuZXhwb3J0IHR5cGUgeyBRdWVyeVJlc3VsdCB9IGZyb20gJy4vcXVlcnknO1xuXG5leHBvcnQge1xuICBTb2NoREJFcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBUcmFuc2FjdGlvbkVycm9yLFxuICBQcm90b2NvbEVycm9yLFxuICBEYXRhYmFzZUVycm9yLFxuICAvLyBMb2NrIGVycm9ycyAodjAuNC4xKVxuICBFcnJvckNvZGUsXG4gIExvY2tFcnJvcixcbiAgRGF0YWJhc2VMb2NrZWRFcnJvcixcbiAgTG9ja1RpbWVvdXRFcnJvcixcbiAgRXBvY2hNaXNtYXRjaEVycm9yLFxuICBTcGxpdEJyYWluRXJyb3IsXG59IGZyb20gJy4vZXJyb3JzJztcblxuLy8gQ29udmVuaWVuY2UgYWxpYXNcbmV4cG9ydCB7IFNvY2hEQkNsaWVudCBhcyBHcnBjQ2xpZW50IH0gZnJvbSAnLi9ncnBjLWNsaWVudCc7XG4iXX0=