@pipeline-builder/pipeline-data 3.4.99 → 3.4.101

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.
@@ -187,12 +187,19 @@ export class Connection {
187
187
  async testConnection() {
188
188
  try {
189
189
  const client = await this.pool.connect();
190
- const result = await client.query('SELECT 1');
191
- client.release();
192
- if (this.options.enableLogging) {
193
- logger.info('Database connection test successful');
190
+ // Release even if the probe query throws — otherwise a flaky DB (the exact
191
+ // case this check exists for) leaks a pooled client each failure and can
192
+ // exhaust the pool on the retry path.
193
+ try {
194
+ const result = await client.query('SELECT 1');
195
+ if (this.options.enableLogging) {
196
+ logger.info('Database connection test successful');
197
+ }
198
+ return result.rows.length > 0;
199
+ }
200
+ finally {
201
+ client.release();
194
202
  }
195
- return result.rows.length > 0;
196
203
  }
197
204
  catch (error) {
198
205
  logger.error('Database connection test failed:', error);
@@ -380,7 +387,6 @@ export function getConnection() {
380
387
  export async function closeConnection() {
381
388
  const connection = Connection.getInstance();
382
389
  await connection.close();
383
- await closeReplicaPool(); // tear down the read-replica pool too (services only call this)
384
390
  _dbInstance = null; // Reset lazy instance
385
391
  }
386
392
  /**
@@ -404,93 +410,4 @@ export async function testConnection() {
404
410
  const connection = Connection.getInstance();
405
411
  return connection.testConnection();
406
412
  }
407
- /**
408
- * Initialize the database connection explicitly
409
- * Call this during application startup after environment is configured
410
- *
411
- * @example
412
- * ```typescript
413
- * import { initializeDatabase } from './connection';
414
- *
415
- * async function bootstrap() {
416
- * // Load environment variables first
417
- * dotenv.config();
418
- *
419
- * // Then initialize database
420
- * await initializeDatabase();
421
- * }
422
- * ```
423
- */
424
- export async function initializeDatabase() {
425
- const connection = Connection.getInstance();
426
- const healthy = await connection.testConnection();
427
- if (!healthy) {
428
- throw new Error('Database connection failed during initialization');
429
- }
430
- }
431
- let _replica = null;
432
- function getReplicaConfig() {
433
- const replicaHost = process.env.DB_REPLICA_HOST;
434
- if (!replicaHost)
435
- return null;
436
- const cfg = getDatabaseConfig();
437
- return {
438
- host: replicaHost,
439
- port: parseIntEnv(process.env.DB_REPLICA_PORT, cfg.port),
440
- database: cfg.database,
441
- user: cfg.user,
442
- password: cfg.password,
443
- max: parseIntEnv(process.env.DB_REPLICA_MAX_POOL, cfg.maxPoolSize),
444
- idleTimeoutMillis: cfg.idleTimeoutMillis,
445
- connectionTimeoutMillis: cfg.connectionTimeoutMillis,
446
- allowExitOnIdle: true,
447
- };
448
- }
449
- function getReplicaPool() {
450
- if (_replica)
451
- return _replica;
452
- const cfg = getReplicaConfig();
453
- if (!cfg)
454
- return null;
455
- const pool = new Pool(cfg);
456
- pool.on('error', (err) => logger.error('Replica pool error', { error: err.message }));
457
- _replica = { pool, db: drizzle(pool, { schema }) };
458
- logger.info('Read replica pool initialized', { host: cfg.host, port: cfg.port });
459
- return _replica;
460
- }
461
- /**
462
- * Proxy that resolves to the read-replica `db` when `DB_REPLICA_HOST` is
463
- * set, and to the primary `db` otherwise. Use for read-only queries that
464
- * tolerate replica lag (typically tens of ms). Writes and transactions
465
- * MUST stay on the primary `db`.
466
- *
467
- * Same lazy-initialization pattern as `db` — the replica pool is built on
468
- * first use, not on module import.
469
- */
470
- export const dbReplica = new Proxy({}, {
471
- get(_, prop) {
472
- const replica = getReplicaPool();
473
- const target = replica ? replica.db : getDbInstance();
474
- const value = target[prop];
475
- if (typeof value === 'function')
476
- return value.bind(target);
477
- return value;
478
- },
479
- });
480
- /** Close the replica pool. Called from `closeConnection()` so service
481
- * shutdown handlers don't have to know about both pools separately. */
482
- async function closeReplicaPool() {
483
- if (!_replica)
484
- return;
485
- try {
486
- await _replica.pool.end();
487
- logger.info('Read replica pool closed');
488
- }
489
- catch (err) {
490
- logger.error('Error closing replica pool', { error: err instanceof Error ? err.message : String(err) });
491
- }
492
- finally {
493
- _replica = null;
494
- }
495
- }
496
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXMtY29ubmVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wb3N0Z3Jlcy1jb25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsSUFBSSxFQUFtQixNQUFNLElBQUksQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFOUQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBRXhDOzs7R0FHRztBQUNILFNBQVMsV0FBVyxDQUFDLEtBQXlCLEVBQUUsUUFBZ0I7SUFDOUQsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM1QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDbEQsQ0FBQztBQUVELHFEQUFxRDtBQUNyRCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQztBQUV4RDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxRQUFtQztJQUM5RCxJQUFJLFFBQVEsS0FBSyxTQUFTO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFFNUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVB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RUFBRSxJQUFxQjtRQUMxQixNQUFNLE9BQU8sR0FBRyxjQUFjLEVBQUUsQ0FBQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3RELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUEyQixDQUFDLENBQUM7UUFDbEQsSUFBSSxPQUFPLEtBQUssS0FBSyxVQUFVO1lBQUUsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGLENBQUMsQ0FBQztBQUVIO3dFQUN3RTtBQUN4RSxLQUFLLFVBQVUsZ0JBQWdCO0lBQzdCLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTztJQUN0QixJQUFJLENBQUM7UUFDSCxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFHLENBQUM7WUFBUyxDQUFDO1FBQ1QsUUFBUSxHQUFHLElBQUksQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBkcml6emxlIH0gZnJvbSAnZHJpenpsZS1vcm0vbm9kZS1wb3N0Z3Jlcyc7XG5pbXBvcnQgeyBQb29sLCB0eXBlIFBvb2xDb25maWcgfSBmcm9tICdwZyc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuL2RyaXp6bGUtc2NoZW1hLmpzJztcbmltcG9ydCB7IENvbm5lY3Rpb25SZXRyeVN0cmF0ZWd5IH0gZnJvbSAnLi9yZXRyeS1zdHJhdGVneS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignZGF0YWJhc2UnKTtcblxuLyoqXG4gKiBHZXQgZGF0YWJhc2UgY29uZmlndXJhdGlvbiBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICogTm90ZTogVXNlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGlyZWN0bHkgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSB3aXRoIHBpcGVsaW5lLWNvcmVcbiAqL1xuZnVuY3Rpb24gcGFyc2VJbnRFbnYodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZmFsbGJhY2s6IG51bWJlcik6IG51bWJlciB7XG4gIGlmICghdmFsdWUpIHJldHVybiBmYWxsYmFjaztcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihwYXJzZWQpID8gZmFsbGJhY2sgOiBwYXJzZWQ7XG59XG5cbi8qKiBEZXRlY3QgTGFtYmRhIGVudmlyb25tZW50IGZvciBwb29sLXNpemUgdHVuaW5nICovXG5jb25zdCBpc0xhbWJkYSA9ICEhcHJvY2Vzcy5lbnYuQVdTX0xBTUJEQV9GVU5DVElPTl9OQU1FO1xuXG4vKipcbiAqIFJlc29sdmUgdGhlIHBnIFRMUy9TU0wgY29uZmlnIGZyb20gYW4gZXhwbGljaXQgb3B0aW9uIG9yIHRoZSBlbnZpcm9ubWVudCxcbiAqIGZvbGxvd2luZyB0aGUgc2FtZSBlbnYtdHVuYWJsZSBwYXR0ZXJuIGFzIHRoZSBwb29sIHNpemluZyBhYm92ZS5cbiAqXG4gKiBQcmVjZWRlbmNlOlxuICogICAxLiBBbiBleHBsaWNpdCBgb3B0aW9ucy5zc2xgIChjb25zdHJ1Y3RvciBhcmcpIGFsd2F5cyB3aW5zIOKAlCBpbmNsdWRpbmcgYW5cbiAqICAgICAgZXhwbGljaXQgYGZhbHNlYCB0byBmb3JjZSBwbGFpbnRleHQuXG4gKiAgIDIuIGBEQl9TU0xgIChgdHJ1ZWAvYDFgIG9uLCBgZmFsc2VgL2AwYCBvZmYpIG9yIFBvc3RncmVzJyBzdGFuZGFyZFxuICogICAgICBgUEdTU0xNT0RFYCAoYGRpc2FibGVgID0gb2ZmLCBhbnkgb3RoZXIgbW9kZSA9IG9uKS5cbiAqICAgMy4gRGVmYXVsdDogT04gaW4gcHJvZHVjdGlvbiAoUkRTIGNvbm5lY3Rpb25zIG11c3QgYmUgZW5jcnlwdGVkIGluIHRyYW5zaXQpLFxuICogICAgICBPRkYgZXZlcnl3aGVyZSBlbHNlIHNvIGEgbG9jYWwgUG9zdGdyZXMgd2l0aG91dCBUTFMga2VlcHMgd29ya2luZy5cbiAqXG4gKiBXaGVuIGVuYWJsZWQsIGByZWplY3RVbmF1dGhvcml6ZWRgIGZvbGxvd3MgYERCX1NTTF9SRUpFQ1RfVU5BVVRIT1JJWkVEYFxuICogKGRlZmF1bHQgYGZhbHNlYCk6IEFXUyBSRFMgcHJlc2VudHMgYSBjZXJ0IHNpZ25lZCBieSB0aGUgUkRTIENBLCB3aGljaCBpcyBub3RcbiAqIGluIE5vZGUncyBkZWZhdWx0IHRydXN0IHN0b3JlIHVubGVzcyB0aGUgQ0EgYnVuZGxlIGlzIG1vdW50ZWQsIHNvIGNlcnRpZmljYXRlXG4gKiBWRVJJRklDQVRJT04gaXMgb3B0LWluIHRvIGF2b2lkIGJyZWFraW5nIGEgc3RvY2sgUkRTIGRlcGxveSDigJQgdGhlIGNoYW5uZWwgaXNcbiAqIHN0aWxsIEVOQ1JZUFRFRC4gU2V0IGBEQl9TU0xfUkVKRUNUX1VOQVVUSE9SSVpFRD10cnVlYCBvbmNlIHRoZSBSRFMgQ0EgYnVuZGxlXG4gKiBpcyB3aXJlZCB0byBnZXQgZnVsbCB2ZXJpZmljYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTc2xDb25maWcoZXhwbGljaXQ/OiBDb25uZWN0aW9uT3B0aW9uc1snc3NsJ10pOiBib29sZWFuIHwgeyByZWplY3RVbmF1dGhvcml6ZWQ6IGJvb2xlYW4gfSB7XG4gIGlmIChleHBsaWNpdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZXhwbGljaXQ7XG5cbiAgY29uc3QgZGJTc2wgPSBwcm9jZXNzLmVudi5EQl9TU0w/LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHNzbE1vZGUgPSBwcm9jZXNzLmVudi5QR1NTTE1PREU/LnRvTG93ZXJDYXNlKCk7XG5cbiAgbGV0IGVuYWJsZWQ6IGJvb2xlYW47XG4gIGlmIChkYlNzbCA9PT0gJ3RydWUnIHx8IGRiU3NsID09PSAnMScpIGVuYWJsZWQgPSB0cnVlO1xuICBlbHNlIGlmIChkYlNzbCA9PT0gJ2ZhbHNlJyB8fCBkYlNzbCA9PT0gJzAnKSBlbmFibGVkID0gZmFsc2U7XG4gIGVsc2UgaWYgKHNzbE1vZGUpIGVuYWJsZWQgPSBzc2xNb2RlICE9PSAnZGlzYWJsZSc7XG4gIGVsc2UgZW5hYmxlZCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbic7XG5cbiAgaWYgKCFlbmFibGVkKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB7IHJlamVjdFVuYXV0aG9yaXplZDogcHJvY2Vzcy5lbnYuREJfU1NMX1JFSkVDVF9VTkFVVEhPUklaRUQgPT09ICd0cnVlJyB9O1xufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZUNvbmZpZygpIHtcbiAgLy8gTGFtYmRhOiBzbWFsbCBwb29sIChlYWNoIGludm9jYXRpb24gaXMgc2hvcnQtbGl2ZWQsIG1hbnkgY29uY3VycmVudCBpbnN0YW5jZXMpXG4gIC8vIEVDUy9sb25nLXJ1bm5pbmc6IGxhcmdlciBwb29sIGZvciBzdXN0YWluZWQgY29uY3VycmVuY3lcbiAgY29uc3QgZGVmYXVsdFBvb2xTaXplID0gaXNMYW1iZGEgPyAyIDogMjA7XG4gIGNvbnN0IGRlZmF1bHRJZGxlVGltZW91dCA9IGlzTGFtYmRhID8gMTAwMDAgOiAzMDAwMDtcblxuICByZXR1cm4ge1xuICAgIGhvc3Q6IHByb2Nlc3MuZW52LkRCX0hPU1QgfHwgJ3Bvc3RncmVzJyxcbiAgICBwb3J0OiBwYXJzZUludEVudihwcm9jZXNzLmVudi5EQl9QT1JULCA1NDMyKSxcbiAgICBkYXRhYmFzZTogcHJvY2Vzcy5lbnYuREFUQUJBU0UgfHwgJ3BpcGVsaW5lX2J1aWxkZXInLFxuICAgIHVzZXI6IHByb2Nlc3MuZW52LkRCX1VTRVIgfHwgJ3Bvc3RncmVzJyxcbiAgICBwYXNzd29yZDogcHJvY2Vzcy5lbnYuREJfUEFTU1dPUkQgfHwgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicgPyAoKCkgPT4geyB0aHJvdyBuZXcgRXJyb3IoJ0RCX1BBU1NXT1JEIGlzIHJlcXVpcmVkIGluIHByb2R1Y3Rpb24nKTsgfSkoKSBhcyBzdHJpbmcgOiAnJyksXG4gICAgbWF4UG9vbFNpemU6IHBhcnNlSW50RW52KHByb2Nlc3MuZW52LkRSSVpaTEVfTUFYX1BPT0xfU0laRSwgZGVmYXVsdFBvb2xTaXplKSxcbiAgICBpZGxlVGltZW91dE1pbGxpczogcGFyc2VJbnRFbnYocHJvY2Vzcy5lbnYuRFJJWlpMRV9JRExFX1RJTUVPVVRfTUlMTElTLCBkZWZhdWx0SWRsZVRpbWVvdXQpLFxuICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBwYXJzZUludEVudihwcm9jZXNzLmVudi5EUklaWkxFX0NPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMsIDUwMDApLFxuICB9O1xufVxuXG4vKipcbiAqIERhdGFiYXNlIGNvbm5lY3Rpb24gc3RhdGlzdGljcyBmb3IgbW9uaXRvcmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb25TdGF0cyB7XG4gIHRvdGFsQ291bnQ6IG51bWJlcjtcbiAgaWRsZUNvdW50OiBudW1iZXI7XG4gIHdhaXRpbmdDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvbk9wdGlvbnMge1xuICAvKiogV2hldGhlciB0byBlbmFibGUgY29ubmVjdGlvbiBsb2dnaW5nICovXG4gIGVuYWJsZUxvZ2dpbmc/OiBib29sZWFuO1xuXG4gIC8qKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgcmV0cnkgZmFpbGVkIGNvbm5lY3Rpb25zICovXG4gIGVuYWJsZUF1dG9SZXRyeT86IGJvb2xlYW47XG5cbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb24gcmV0cnkgYXR0ZW1wdHMgKi9cbiAgbWF4UmV0cmllcz86IG51bWJlcjtcblxuICAvKiogRGVsYXkgYmV0d2VlbiByZXRyeSBhdHRlbXB0cyBpbiBtaWxsaXNlY29uZHMgKi9cbiAgcmV0cnlEZWxheT86IG51bWJlcjtcblxuICAvKiogU1NMIGNvbmZpZ3VyYXRpb24gKi9cbiAgc3NsPzogYm9vbGVhbiB8IHsgcmVqZWN0VW5hdXRob3JpemVkOiBib29sZWFuIH07XG59XG5cbi8qKlxuICogU2luZ2xldG9uIGRhdGFiYXNlIGNvbm5lY3Rpb24gY2xhc3MuXG4gKiBNYW5hZ2VzIFBvc3RncmVTUUwgY29ubmVjdGlvbiBwb29saW5nIGFuZCBEcml6emxlIE9STSBpbnN0YW5jZS5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gU2luZ2xldG9uIHBhdHRlcm4gZm9yIHNpbmdsZSBjb25uZWN0aW9uIHBvb2xcbiAqIC0gQXV0b21hdGljIGNvbm5lY3Rpb24gcmV0cnkgd2l0aCBiYWNrb2ZmXG4gKiAtIENvbm5lY3Rpb24gaGVhbHRoIG1vbml0b3JpbmdcbiAqIC0gR3JhY2VmdWwgc2h1dGRvd24gaGFuZGxpbmdcbiAqIC0gQ29tcHJlaGVuc2l2ZSBlcnJvciBoYW5kbGluZ1xuICogLSBDb25uZWN0aW9uIHN0YXRpc3RpY3MgdHJhY2tpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gJy4vY29ubmVjdGlvbic7XG4gKlxuICogY29uc3QgY29ubmVjdGlvbiA9IENvbm5lY3Rpb24uZ2V0SW5zdGFuY2UoKTtcbiAqIGNvbnN0IHBsdWdpbnMgPSBhd2FpdCBjb25uZWN0aW9uLmRiLnNlbGVjdCgpLmZyb20oc2NoZW1hLnBsdWdpbik7XG4gKlxuICogLy8gRHVyaW5nIHNodXRkb3duXG4gKiBhd2FpdCBjb25uZWN0aW9uLmNsb3NlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIENvbm5lY3Rpb24ge1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQ29ubmVjdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBEcml6emxlIE9STSBkYXRhYmFzZSBpbnN0YW5jZSB3aXRoIHNjaGVtYVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRiOiBSZXR1cm5UeXBlPHR5cGVvZiBkcml6emxlPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IHBvb2w6IFBvb2w7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogUmVxdWlyZWQ8Q29ubmVjdGlvbk9wdGlvbnM+O1xuICBwcml2YXRlIHJlYWRvbmx5IHJldHJ5U3RyYXRlZ3k6IENvbm5lY3Rpb25SZXRyeVN0cmF0ZWd5O1xuICBwcml2YXRlIGlzU2h1dHRpbmdEb3duID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gZW5mb3JjZSBzaW5nbGV0b24gcGF0dGVybi5cbiAgICogSW5pdGlhbGl6ZXMgUG9zdGdyZVNRTCBjb25uZWN0aW9uIHBvb2wgYW5kIERyaXp6bGUgT1JNIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjb25uZWN0aW9uXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBkYXRhYmFzZSBpbml0aWFsaXphdGlvbiBmYWlscyBhZnRlciBhbGwgcmV0cmllc1xuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihvcHRpb25zOiBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgZW5hYmxlTG9nZ2luZzogb3B0aW9ucy5lbmFibGVMb2dnaW5nID8/IHRydWUsXG4gICAgICBlbmFibGVBdXRvUmV0cnk6IG9wdGlvbnMuZW5hYmxlQXV0b1JldHJ5ID8/IHRydWUsXG4gICAgICBtYXhSZXRyaWVzOiBvcHRpb25zLm1heFJldHJpZXMgPz8gcGFyc2VJbnQocHJvY2Vzcy5lbnYuREJfTUFYX1JFVFJJRVMgfHwgJzMnLCAxMCksXG4gICAgICByZXRyeURlbGF5OiBvcHRpb25zLnJldHJ5RGVsYXkgPz8gcGFyc2VJbnQocHJvY2Vzcy5lbnYuREJfUkVUUllfREVMQVlfTVMgfHwgJzEwMDAnLCAxMCksXG4gICAgICAvLyBFbnYtZHJpdmVuIFRMUzogb24tYnktZGVmYXVsdCBpbiBwcm9kdWN0aW9uLCBlbnYtZW5hYmxlYWJsZSBlbHNld2hlcmUuXG4gICAgICAvLyBnZXRJbnN0YW5jZSgpIGlzIG5vcm1hbGx5IGNhbGxlZCB3aXRoIG5vIG9wdGlvbnMsIHNvIHRoaXMgaXMgdGhlIG9ubHlcbiAgICAgIC8vIHBsYWNlIHByb2R1Y3Rpb24gUkRTIGNvbm5lY3Rpb25zIHBpY2sgdXAgU1NMIChmb3JtZXJseSBoYXJkLWNvZGVkIG9mZikuXG4gICAgICBzc2w6IGdldFNzbENvbmZpZyhvcHRpb25zLnNzbCksXG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgcmV0cnkgc3RyYXRlZ3lcbiAgICB0aGlzLnJldHJ5U3RyYXRlZ3kgPSBuZXcgQ29ubmVjdGlvblJldHJ5U3RyYXRlZ3koe1xuICAgICAgbWF4UmV0cmllczogdGhpcy5vcHRpb25zLm1heFJldHJpZXMsXG4gICAgICBiYXNlRGVsYXk6IHRoaXMub3B0aW9ucy5yZXRyeURlbGF5LFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGdldERhdGFiYXNlQ29uZmlnKCk7XG5cbiAgICAgIGNvbnN0IHBvb2xDb25maWc6IFBvb2xDb25maWcgPSB7XG4gICAgICAgIGhvc3Q6IGNvbmZpZy5ob3N0LFxuICAgICAgICBwb3J0OiBjb25maWcucG9ydCxcbiAgICAgICAgZGF0YWJhc2U6IGNvbmZpZy5kYXRhYmFzZSxcbiAgICAgICAgdXNlcjogY29uZmlnLnVzZXIsXG4gICAgICAgIHBhc3N3b3JkOiBjb25maWcucGFzc3dvcmQsXG4gICAgICAgIG1heDogY29uZmlnLm1heFBvb2xTaXplLFxuICAgICAgICBpZGxlVGltZW91dE1pbGxpczogY29uZmlnLmlkbGVUaW1lb3V0TWlsbGlzLFxuICAgICAgICBjb25uZWN0aW9uVGltZW91dE1pbGxpczogY29uZmlnLmNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzLFxuICAgICAgICBzc2w6IHRoaXMub3B0aW9ucy5zc2wsXG4gICAgICAgIGFsbG93RXhpdE9uSWRsZTogdHJ1ZSxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMucG9vbCA9IG5ldyBQb29sKHBvb2xDb25maWcpO1xuICAgICAgdGhpcy5zZXR1cEV2ZW50SGFuZGxlcnMoKTtcblxuICAgICAgdGhpcy5kYiA9IGRyaXp6bGUodGhpcy5wb29sLCB7IHNjaGVtYSB9KTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMb2dnaW5nKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdEYXRhYmFzZSBjb25uZWN0aW9uIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICB0aGlzLmxvZ0Nvbm5lY3Rpb25Db25maWcocG9vbENvbmZpZyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGluaXRpYWxpemUgZGF0YWJhc2UgY29ubmVjdGlvbjonLCBlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGFiYXNlIGluaXRpYWxpemF0aW9uIGZhaWxlZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIENvbm5lY3Rpb24gY2xhc3MuXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgaWYgb25lIGRvZXNuJ3QgZXhpc3QuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiAob25seSB1c2VkIG9uIGZpcnN0IGNhbGwpXG4gICAqIEByZXR1cm5zIFRoZSBzaW5nbGV0b24gQ29ubmVjdGlvbiBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZShvcHRpb25zPzogQ29ubmVjdGlvbk9wdGlvbnMpOiBDb25uZWN0aW9uIHtcbiAgICBpZiAoIUNvbm5lY3Rpb24uaW5zdGFuY2UpIHtcbiAgICAgIENvbm5lY3Rpb24uaW5zdGFuY2UgPSBuZXcgQ29ubmVjdGlvbihvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIENvbm5lY3Rpb24uaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuXG4gICAqIFVzZWZ1bCBmb3IgdGVzdGluZyBvciByZWNvbmZpZ3VyaW5nIHRoZSBjb25uZWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gY2xvc2VFeGlzdGluZyAtIFdoZXRoZXIgdG8gY2xvc2UgZXhpc3RpbmcgY29ubmVjdGlvbiBiZWZvcmUgcmVzZXRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgcmVzZXQoY2xvc2VFeGlzdGluZzogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoQ29ubmVjdGlvbi5pbnN0YW5jZSAmJiBjbG9zZUV4aXN0aW5nKSB7XG4gICAgICBhd2FpdCBDb25uZWN0aW9uLmluc3RhbmNlLmNsb3NlKCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb24uaW5zdGFuY2UgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlc3RzIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIGNvbm5lY3Rpb24gaXMgaGVhbHRoeVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHRlc3RDb25uZWN0aW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLnBvb2wuY29ubmVjdCgpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnF1ZXJ5KCdTRUxFQ1QgMScpO1xuICAgICAgY2xpZW50LnJlbGVhc2UoKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMb2dnaW5nKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdEYXRhYmFzZSBjb25uZWN0aW9uIHRlc3Qgc3VjY2Vzc2Z1bCcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0LnJvd3MubGVuZ3RoID4gMDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdEYXRhYmFzZSBjb25uZWN0aW9uIHRlc3QgZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBjb25uZWN0aW9uIHBvb2wgc3RhdGlzdGljc1xuICAgKlxuICAgKiBAcmV0dXJucyBDdXJyZW50IGNvbm5lY3Rpb24gcG9vbCBzdGF0aXN0aWNzXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhdHMoKTogQ29ubmVjdGlvblN0YXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxDb3VudDogdGhpcy5wb29sLnRvdGFsQ291bnQsXG4gICAgICBpZGxlQ291bnQ6IHRoaXMucG9vbC5pZGxlQ291bnQsXG4gICAgICB3YWl0aW5nQ291bnQ6IHRoaXMucG9vbC53YWl0aW5nQ291bnQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gcG9vbCBncmFjZWZ1bGx5LlxuICAgKiBTaG91bGQgYmUgY2FsbGVkIGR1cmluZyBhcHBsaWNhdGlvbiBzaHV0ZG93bi5cbiAgICpcbiAgICogQHBhcmFtIHRpbWVvdXQgLSBNYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgY29ubmVjdGlvbnMgdG8gY2xvc2UgKG1zKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBwb29sIGlzIGNsb3NlZFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNsb3NlKHRpbWVvdXQ6IG51bWJlciA9IHBhcnNlSW50RW52KHByb2Nlc3MuZW52LkRCX0NMT1NFX1RJTUVPVVRfTVMsIDUwMDApKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNTaHV0dGluZ0Rvd24pIHtcbiAgICAgIGxvZ2dlci53YXJuKCdDb25uZWN0aW9uIGlzIGFscmVhZHkgc2h1dHRpbmcgZG93bicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNTaHV0dGluZ0Rvd24gPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTG9nZ2luZykge1xuICAgICAgICBsb2dnZXIuaW5mbygnQ2xvc2luZyBkYXRhYmFzZSBjb25uZWN0aW9uIHBvb2wuLi4nKTtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSB0aGlzLmdldFN0YXRzKCk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBQb29sIHN0YXRzIC0gVG90YWw6ICR7c3RhdHMudG90YWxDb3VudH0sIElkbGU6ICR7c3RhdHMuaWRsZUNvdW50fSwgV2FpdGluZzogJHtzdGF0cy53YWl0aW5nQ291bnR9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBhIHRpbWVvdXQgZm9yIGdyYWNlZnVsIHNodXRkb3duXG4gICAgICBjb25zdCBjbG9zZVByb21pc2UgPSB0aGlzLnBvb2wuZW5kKCk7XG4gICAgICBjb25zdCB0aW1lb3V0UHJvbWlzZSA9IG5ldyBQcm9taXNlKChfLCByZWplY3QpID0+XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignQ29ubmVjdGlvbiBjbG9zZSB0aW1lb3V0JykpLCB0aW1lb3V0KSxcbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UucmFjZShbY2xvc2VQcm9taXNlLCB0aW1lb3V0UHJvbWlzZV0pO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxvZ2dpbmcpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0RhdGFiYXNlIGNvbm5lY3Rpb24gY2xvc2VkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGNsb3NpbmcgZGF0YWJhc2UgY29ubmVjdGlvbjonLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc1NodXR0aW5nRG93biA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGNvbm5lY3Rpb24gaXMgc2h1dHRpbmcgZG93blxuICAgKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGNvbm5lY3Rpb24gaXMgaW4gc2h1dGRvd24gc3RhdGVcbiAgICovXG4gIHB1YmxpYyBpc0Nsb3NpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNTaHV0dGluZ0Rvd247XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCBldmVudCBoYW5kbGVycyBmb3IgdGhlIGNvbm5lY3Rpb24gcG9vbFxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cEV2ZW50SGFuZGxlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5wb29sLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcignVW5leHBlY3RlZCBlcnJvciBvbiBpZGxlIGNsaWVudDonLCBlcnIpO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUF1dG9SZXRyeSAmJiB0aGlzLnJldHJ5U3RyYXRlZ3kuZ2V0QXR0ZW1wdHMoKSA8IHRoaXMub3B0aW9ucy5tYXhSZXRyaWVzKSB7XG4gICAgICAgIHZvaWQgdGhpcy5yZXRyeVN0cmF0ZWd5LmhhbmRsZUNvbm5lY3Rpb25FcnJvcihlcnIsICgpID0+IHRoaXMudGVzdENvbm5lY3Rpb24oKSkuY2F0Y2goKHJldHJ5RXJyKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdDb25uZWN0aW9uIHJldHJ5IGVycm9yOicsIHJldHJ5RXJyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnBvb2wub24oJ2Nvbm5lY3QnLCAoKSA9PiB7XG4gICAgICB0aGlzLnJldHJ5U3RyYXRlZ3kucmVzZXQoKTsgLy8gUmVzZXQgb24gc3VjY2Vzc2Z1bCBjb25uZWN0aW9uXG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTG9nZ2luZykge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ05ldyBkYXRhYmFzZSBjb25uZWN0aW9uIGVzdGFibGlzaGVkJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnBvb2wub24oJ3JlbW92ZScsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTG9nZ2luZykge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0NsaWVudCByZW1vdmVkIGZyb20gcG9vbCcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIChzYW5pdGl6ZWQpXG4gICAqL1xuICBwcml2YXRlIGxvZ0Nvbm5lY3Rpb25Db25maWcoY29uZmlnOiBQb29sQ29uZmlnKTogdm9pZCB7XG4gICAgbG9nZ2VyLmluZm8oJ0RhdGFiYXNlIENvbmZpZ3VyYXRpb246Jywge1xuICAgICAgaG9zdDogYCR7Y29uZmlnLmhvc3R9OiR7Y29uZmlnLnBvcnR9YCxcbiAgICAgIGRhdGFiYXNlOiBjb25maWcuZGF0YWJhc2UsXG4gICAgICB1c2VyOiBjb25maWcudXNlcixcbiAgICAgIG1heFBvb2xTaXplOiBjb25maWcubWF4LFxuICAgICAgaWRsZVRpbWVvdXRNczogY29uZmlnLmlkbGVUaW1lb3V0TWlsbGlzLFxuICAgICAgY29ubmVjdGlvblRpbWVvdXRNczogY29uZmlnLmNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzLFxuICAgICAgc3NsOiBjb25maWcuc3NsID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFNpbmdsZXRvbiBkYXRhYmFzZSBpbnN0YW5jZSBmb3IgdXNlIHRocm91Z2hvdXQgdGhlIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBkYiB9IGZyb20gJy4vY29ubmVjdGlvbic7XG4gKlxuICogLy8gU2VsZWN0IHF1ZXJpZXNcbiAqIGNvbnN0IHBsdWdpbnMgPSBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKHNjaGVtYS5wbHVnaW4pO1xuICpcbiAqIC8vIEluc2VydCBxdWVyaWVzXG4gKiBhd2FpdCBkYi5pbnNlcnQoc2NoZW1hLnBsdWdpbikudmFsdWVzKHsgbmFtZTogJ215LXBsdWdpbicgfSk7XG4gKlxuICogLy8gVHJhbnNhY3Rpb25zXG4gKiBhd2FpdCBkYi50cmFuc2FjdGlvbihhc3luYyAodHgpID0+IHtcbiAqICAgYXdhaXQgdHguaW5zZXJ0KHNjaGVtYS5wbHVnaW4pLnZhbHVlcyh7IC4uLiB9KTtcbiAqICAgYXdhaXQgdHgudXBkYXRlKHNjaGVtYS5wbHVnaW4pLnNldCh7IC4uLiB9KTtcbiAqIH0pO1xuICogYGBgXG4gKi9cblxuLy8gTGF6eSBpbml0aWFsaXphdGlvbiB0byBhdm9pZCByYWNlIGNvbmRpdGlvbiBvbiBtb2R1bGUgbG9hZFxubGV0IF9kYkluc3RhbmNlOiBSZXR1cm5UeXBlPHR5cGVvZiBkcml6emxlPiB8IG51bGwgPSBudWxsO1xuXG4vKipcbiAqIEdldCB0aGUgZGF0YWJhc2UgaW5zdGFuY2Ugd2l0aCBsYXp5IGluaXRpYWxpemF0aW9uXG4gKiBUaGlzIGF2b2lkcyB0aGUgcmFjZSBjb25kaXRpb24gd2hlcmUgdGhlIG1vZHVsZSBpcyBsb2FkZWQgYmVmb3JlIGVudmlyb25tZW50IGlzIGNvbmZpZ3VyZWRcbiAqL1xuZnVuY3Rpb24gZ2V0RGJJbnN0YW5jZSgpOiBSZXR1cm5UeXBlPHR5cGVvZiBkcml6emxlPiB7XG4gIGlmICghX2RiSW5zdGFuY2UpIHtcbiAgICBfZGJJbnN0YW5jZSA9IENvbm5lY3Rpb24uZ2V0SW5zdGFuY2UoKS5kYjtcbiAgfVxuICByZXR1cm4gX2RiSW5zdGFuY2U7XG59XG5cbi8qKlxuICogUHJveHktYmFzZWQgbGF6eSBkYXRhYmFzZSBpbnN0YW5jZVxuICogVGhlIGFjdHVhbCBjb25uZWN0aW9uIGlzIG9ubHkgY3JlYXRlZCB3aGVuIGZpcnN0IGFjY2Vzc2VkXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGRiIH0gZnJvbSAnLi9jb25uZWN0aW9uJztcbiAqXG4gKiAvLyBDb25uZWN0aW9uIGlzIGNyZWF0ZWQgaGVyZSBvbiBmaXJzdCB1c2UsIG5vdCBvbiBpbXBvcnRcbiAqIGNvbnN0IHBsdWdpbnMgPSBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKHNjaGVtYS5wbHVnaW4pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBkYiA9IG5ldyBQcm94eSh7fSBhcyBSZXR1cm5UeXBlPHR5cGVvZiBkcml6emxlPiwge1xuICBnZXQoXywgcHJvcDogc3RyaW5nIHwgc3ltYm9sKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXREYkluc3RhbmNlKCk7XG4gICAgY29uc3QgdmFsdWUgPSBpbnN0YW5jZVtwcm9wIGFzIGtleW9mIHR5cGVvZiBpbnN0YW5jZV07XG4gICAgLy8gQmluZCBtZXRob2RzIHRvIHRoZSBpbnN0YW5jZSB0byBwcmVzZXJ2ZSAndGhpcycgY29udGV4dFxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5iaW5kKGluc3RhbmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxufSk7XG5cbi8qKlxuICogR2V0cyB0aGUgQ29ubmVjdGlvbiBpbnN0YW5jZSBmb3IgYWR2YW5jZWQgb3BlcmF0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBnZXRDb25uZWN0aW9uIH0gZnJvbSAnLi9jb25uZWN0aW9uJztcbiAqXG4gKiBjb25zdCBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpO1xuICogY29uc3Qgc3RhdHMgPSBjb25uZWN0aW9uLmdldFN0YXRzKCk7XG4gKiBjb25zb2xlLmxvZyhgQWN0aXZlIGNvbm5lY3Rpb25zOiAke3N0YXRzLnRvdGFsQ291bnR9YCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbm5lY3Rpb24oKTogQ29ubmVjdGlvbiB7XG4gIHJldHVybiBDb25uZWN0aW9uLmdldEluc3RhbmNlKCk7XG59XG5cbi8qKlxuICogQ2xvc2VzIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uXG4gKiBTaG91bGQgYmUgY2FsbGVkIGR1cmluZyBhcHBsaWNhdGlvbiBzaHV0ZG93blxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBjbG9zZUNvbm5lY3Rpb24gfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuICpcbiAqIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBhc3luYyAoKSA9PiB7XG4gKiAgIGF3YWl0IGNsb3NlQ29ubmVjdGlvbigpO1xuICogICBwcm9jZXNzLmV4aXQoMCk7XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xvc2VDb25uZWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gQ29ubmVjdGlvbi5nZXRJbnN0YW5jZSgpO1xuICBhd2FpdCBjb25uZWN0aW9uLmNsb3NlKCk7XG4gIGF3YWl0IGNsb3NlUmVwbGljYVBvb2woKTsgLy8gdGVhciBkb3duIHRoZSByZWFkLXJlcGxpY2EgcG9vbCB0b28gKHNlcnZpY2VzIG9ubHkgY2FsbCB0aGlzKVxuICBfZGJJbnN0YW5jZSA9IG51bGw7IC8vIFJlc2V0IGxhenkgaW5zdGFuY2Vcbn1cblxuLyoqXG4gKiBUZXN0cyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvblxuICpcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIGNvbm5lY3Rpb24gaXMgaGVhbHRoeVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyB0ZXN0Q29ubmVjdGlvbiB9IGZyb20gJy4vY29ubmVjdGlvbic7XG4gKlxuICogaWYgKGF3YWl0IHRlc3RDb25uZWN0aW9uKCkpIHtcbiAqICAgY29uc29sZS5sb2coJ0RhdGFiYXNlIGlzIHJlYWR5Jyk7XG4gKiB9IGVsc2Uge1xuICogICBjb25zb2xlLmVycm9yKCdEYXRhYmFzZSBjb25uZWN0aW9uIGZhaWxlZCcpO1xuICogICBwcm9jZXNzLmV4aXQoMSk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RDb25uZWN0aW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gQ29ubmVjdGlvbi5nZXRJbnN0YW5jZSgpO1xuICByZXR1cm4gY29ubmVjdGlvbi50ZXN0Q29ubmVjdGlvbigpO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gZXhwbGljaXRseVxuICogQ2FsbCB0aGlzIGR1cmluZyBhcHBsaWNhdGlvbiBzdGFydHVwIGFmdGVyIGVudmlyb25tZW50IGlzIGNvbmZpZ3VyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgaW5pdGlhbGl6ZURhdGFiYXNlIH0gZnJvbSAnLi9jb25uZWN0aW9uJztcbiAqXG4gKiBhc3luYyBmdW5jdGlvbiBib290c3RyYXAoKSB7XG4gKiAgIC8vIExvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZpcnN0XG4gKiAgIGRvdGVudi5jb25maWcoKTtcbiAqXG4gKiAgIC8vIFRoZW4gaW5pdGlhbGl6ZSBkYXRhYmFzZVxuICogICBhd2FpdCBpbml0aWFsaXplRGF0YWJhc2UoKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZURhdGFiYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gQ29ubmVjdGlvbi5nZXRJbnN0YW5jZSgpO1xuICBjb25zdCBoZWFsdGh5ID0gYXdhaXQgY29ubmVjdGlvbi50ZXN0Q29ubmVjdGlvbigpO1xuICBpZiAoIWhlYWx0aHkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGFiYXNlIGNvbm5lY3Rpb24gZmFpbGVkIGR1cmluZyBpbml0aWFsaXphdGlvbicpO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVhZC1yZXBsaWNhIHByaW1pdGl2ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL1xuLy8gT3B0LWluIHJlYWQtb25seSBjbGllbnQuIFBvaW50ZWQgYXQgYSBQb3N0Z3JlcyByZXBsaWNhIHZpYSBgREJfUkVQTElDQV9IT1NUYFxuLy8gLyBgREJfUkVQTElDQV9QT1JUYCAob3RoZXIgREJfKiB2YXJzIGFyZSBpbmhlcml0ZWQgZnJvbSB0aGUgcHJpbWFyeSkuIFdoZW5cbi8vIGBEQl9SRVBMSUNBX0hPU1RgIGlzIHVuc2V0LCBgZGJSZXBsaWNhYCByZXNvbHZlcyB0byB0aGUgcHJpbWFyeSBgZGJgIHNvXG4vLyBleGlzdGluZyBjYWxsZXJzIHN0YXkgY29ycmVjdCBvbiBzaW5nbGUtaW5zdGFuY2UgZGVwbG95cy5cbi8vXG4vLyBVc2FnZSBwYXR0ZXJuOiByb3V0ZSByZWFkLW9ubHkgcXVlcmllcyAobGlzdCBlbmRwb2ludHMsIGRhc2hib2FyZHMsXG4vLyBhbmFseXRpY3MpIHRocm91Z2ggYGRiUmVwbGljYWAgdG8gb2ZmbG9hZCB0aGUgcHJpbWFyeS4gV3JpdGVzIGFuZFxuLy8gdHJhbnNhY3Rpb25zIE1VU1Qgc3RheSBvbiBgZGJgIOKAlCByZXBsaWNhIGxhZyB3b3VsZCBvdGhlcndpc2UgcHJvZHVjZVxuLy8gcmVhZC1hZnRlci13cml0ZSBzdXJwcmlzZXMuXG4vL1xuLy8gVGhpcyBpcyBhIHByaW1pdGl2ZSBvbmx5IOKAlCBubyBzZXJ2aWNlIGNvZGUgaGFzIGJlZW4gbWlncmF0ZWQgdG8gdXNlIGl0LlxuLy8gQ2FsbGVycyBvcHQgaW4gZXhwbGljaXRseTsgdGhlIG1pZ3JhdGlvbiBpcyBhIHBlci1xdWVyeSBkZWNpc2lvbiwgbm90IGFcbi8vIGJsYW5rZXQgc3dpdGNoIChyZXBsaWNhIGxhZyByaXNrcyB2YXJ5IGJ5IGNhbGwgc2l0ZSkuXG5cbmludGVyZmFjZSBSZXBsaWNhUG9vbCB7XG4gIHBvb2w6IFBvb2w7XG4gIGRiOiBSZXR1cm5UeXBlPHR5cGVvZiBkcml6emxlPjtcbn1cblxubGV0IF9yZXBsaWNhOiBSZXBsaWNhUG9vbCB8IG51bGwgPSBudWxsO1xuXG5mdW5jdGlvbiBnZXRSZXBsaWNhQ29uZmlnKCk6IFBvb2xDb25maWcgfCBudWxsIHtcbiAgY29uc3QgcmVwbGljYUhvc3QgPSBwcm9jZXNzLmVudi5EQl9SRVBMSUNBX0hPU1Q7XG4gIGlmICghcmVwbGljYUhvc3QpIHJldHVybiBudWxsO1xuICBjb25zdCBjZmcgPSBnZXREYXRhYmFzZUNvbmZpZygpO1xuICByZXR1cm4ge1xuICAgIGhvc3Q6IHJlcGxpY2FIb3N0LFxuICAgIHBvcnQ6IHBhcnNlSW50RW52KHByb2Nlc3MuZW52LkRCX1JFUExJQ0FfUE9SVCwgY2ZnLnBvcnQpLFxuICAgIGRhdGFiYXNlOiBjZmcuZGF0YWJhc2UsXG4gICAgdXNlcjogY2ZnLnVzZXIsXG4gICAgcGFzc3dvcmQ6IGNmZy5wYXNzd29yZCxcbiAgICBtYXg6IHBhcnNlSW50RW52KHByb2Nlc3MuZW52LkRCX1JFUExJQ0FfTUFYX1BPT0wsIGNmZy5tYXhQb29sU2l6ZSksXG4gICAgaWRsZVRpbWVvdXRNaWxsaXM6IGNmZy5pZGxlVGltZW91dE1pbGxpcyxcbiAgICBjb25uZWN0aW9uVGltZW91dE1pbGxpczogY2ZnLmNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzLFxuICAgIGFsbG93RXhpdE9uSWRsZTogdHJ1ZSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVwbGljYVBvb2woKTogUmVwbGljYVBvb2wgfCBudWxsIHtcbiAgaWYgKF9yZXBsaWNhKSByZXR1cm4gX3JlcGxpY2E7XG4gIGNvbnN0IGNmZyA9IGdldFJlcGxpY2FDb25maWcoKTtcbiAgaWYgKCFjZmcpIHJldHVybiBudWxsO1xuICBjb25zdCBwb29sID0gbmV3IFBvb2woY2ZnKTtcbiAgcG9vbC5vbignZXJyb3InLCAoZXJyKSA9PiBsb2dnZXIuZXJyb3IoJ1JlcGxpY2EgcG9vbCBlcnJvcicsIHsgZXJyb3I6IGVyci5tZXNzYWdlIH0pKTtcbiAgX3JlcGxpY2EgPSB7IHBvb2wsIGRiOiBkcml6emxlKHBvb2wsIHsgc2NoZW1hIH0pIH07XG4gIGxvZ2dlci5pbmZvKCdSZWFkIHJlcGxpY2EgcG9vbCBpbml0aWFsaXplZCcsIHsgaG9zdDogY2ZnLmhvc3QsIHBvcnQ6IGNmZy5wb3J0IH0pO1xuICByZXR1cm4gX3JlcGxpY2E7XG59XG5cbi8qKlxuICogUHJveHkgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVhZC1yZXBsaWNhIGBkYmAgd2hlbiBgREJfUkVQTElDQV9IT1NUYCBpc1xuICogc2V0LCBhbmQgdG8gdGhlIHByaW1hcnkgYGRiYCBvdGhlcndpc2UuIFVzZSBmb3IgcmVhZC1vbmx5IHF1ZXJpZXMgdGhhdFxuICogdG9sZXJhdGUgcmVwbGljYSBsYWcgKHR5cGljYWxseSB0ZW5zIG9mIG1zKS4gV3JpdGVzIGFuZCB0cmFuc2FjdGlvbnNcbiAqIE1VU1Qgc3RheSBvbiB0aGUgcHJpbWFyeSBgZGJgLlxuICpcbiAqIFNhbWUgbGF6eS1pbml0aWFsaXphdGlvbiBwYXR0ZXJuIGFzIGBkYmAg4oCUIHRoZSByZXBsaWNhIHBvb2wgaXMgYnVpbHQgb25cbiAqIGZpcnN0IHVzZSwgbm90IG9uIG1vZHVsZSBpbXBvcnQuXG4gKi9cbmV4cG9ydCBjb25zdCBkYlJlcGxpY2EgPSBuZXcgUHJveHkoe30gYXMgUmV0dXJuVHlwZTx0eXBlb2YgZHJpenpsZT4sIHtcbiAgZ2V0KF8sIHByb3A6IHN0cmluZyB8IHN5bWJvbCkge1xuICAgIGNvbnN0IHJlcGxpY2EgPSBnZXRSZXBsaWNhUG9vbCgpO1xuICAgIGNvbnN0IHRhcmdldCA9IHJlcGxpY2EgPyByZXBsaWNhLmRiIDogZ2V0RGJJbnN0YW5jZSgpO1xuICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0W3Byb3AgYXMga2V5b2YgdHlwZW9mIHRhcmdldF07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHZhbHVlLmJpbmQodGFyZ2V0KTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG59KTtcblxuLyoqIENsb3NlIHRoZSByZXBsaWNhIHBvb2wuIENhbGxlZCBmcm9tIGBjbG9zZUNvbm5lY3Rpb24oKWAgc28gc2VydmljZVxuICogIHNodXRkb3duIGhhbmRsZXJzIGRvbid0IGhhdmUgdG8ga25vdyBhYm91dCBib3RoIHBvb2xzIHNlcGFyYXRlbHkuICovXG5hc3luYyBmdW5jdGlvbiBjbG9zZVJlcGxpY2FQb29sKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIV9yZXBsaWNhKSByZXR1cm47XG4gIHRyeSB7XG4gICAgYXdhaXQgX3JlcGxpY2EucG9vbC5lbmQoKTtcbiAgICBsb2dnZXIuaW5mbygnUmVhZCByZXBsaWNhIHBvb2wgY2xvc2VkJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5lcnJvcignRXJyb3IgY2xvc2luZyByZXBsaWNhIHBvb2wnLCB7IGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgX3JlcGxpY2EgPSBudWxsO1xuICB9XG59XG4iXX0=
413
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXMtY29ubmVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wb3N0Z3Jlcy1jb25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsSUFBSSxFQUFtQixNQUFNLElBQUksQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFOUQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBRXhDOzs7R0FHRztBQUNILFNBQVMsV0FBVyxDQUFDLEtBQXlCLEVBQUUsUUFBZ0I7SUFDOUQsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM1QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDbEQsQ0FBQztBQUVELHFEQUFxRDtBQUNyRCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQztBQUV4RDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxRQUFtQztJQUM5RCxJQUFJLFFBQVEsS0FBSyxTQUFTO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFFNUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVB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QUMzQixPQUFPLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNsQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZTtJQUNuQyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDNUMsTUFBTSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDekIsV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLHNCQUFzQjtBQUM1QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWM7SUFDbEMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzVDLE9BQU8sVUFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgZHJpenpsZSB9IGZyb20gJ2RyaXp6bGUtb3JtL25vZGUtcG9zdGdyZXMnO1xuaW1wb3J0IHsgUG9vbCwgdHlwZSBQb29sQ29uZmlnIH0gZnJvbSAncGcnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi9kcml6emxlLXNjaGVtYS5qcyc7XG5pbXBvcnQgeyBDb25uZWN0aW9uUmV0cnlTdHJhdGVneSB9IGZyb20gJy4vcmV0cnktc3RyYXRlZ3kuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2RhdGFiYXNlJyk7XG5cbi8qKlxuICogR2V0IGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24gZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAqIE5vdGU6IFVzZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGRpcmVjdGx5IHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kgd2l0aCBwaXBlbGluZS1jb3JlXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSW50RW52KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gZmFsbGJhY2s7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4ocGFyc2VkKSA/IGZhbGxiYWNrIDogcGFyc2VkO1xufVxuXG4vKiogRGV0ZWN0IExhbWJkYSBlbnZpcm9ubWVudCBmb3IgcG9vbC1zaXplIHR1bmluZyAqL1xuY29uc3QgaXNMYW1iZGEgPSAhIXByb2Nlc3MuZW52LkFXU19MQU1CREFfRlVOQ1RJT05fTkFNRTtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBwZyBUTFMvU1NMIGNvbmZpZyBmcm9tIGFuIGV4cGxpY2l0IG9wdGlvbiBvciB0aGUgZW52aXJvbm1lbnQsXG4gKiBmb2xsb3dpbmcgdGhlIHNhbWUgZW52LXR1bmFibGUgcGF0dGVybiBhcyB0aGUgcG9vbCBzaXppbmcgYWJvdmUuXG4gKlxuICogUHJlY2VkZW5jZTpcbiAqICAgMS4gQW4gZXhwbGljaXQgYG9wdGlvbnMuc3NsYCAoY29uc3RydWN0b3IgYXJnKSBhbHdheXMgd2lucyDigJQgaW5jbHVkaW5nIGFuXG4gKiAgICAgIGV4cGxpY2l0IGBmYWxzZWAgdG8gZm9yY2UgcGxhaW50ZXh0LlxuICogICAyLiBgREJfU1NMYCAoYHRydWVgL2AxYCBvbiwgYGZhbHNlYC9gMGAgb2ZmKSBvciBQb3N0Z3Jlcycgc3RhbmRhcmRcbiAqICAgICAgYFBHU1NMTU9ERWAgKGBkaXNhYmxlYCA9IG9mZiwgYW55IG90aGVyIG1vZGUgPSBvbikuXG4gKiAgIDMuIERlZmF1bHQ6IE9OIGluIHByb2R1Y3Rpb24gKFJEUyBjb25uZWN0aW9ucyBtdXN0IGJlIGVuY3J5cHRlZCBpbiB0cmFuc2l0KSxcbiAqICAgICAgT0ZGIGV2ZXJ5d2hlcmUgZWxzZSBzbyBhIGxvY2FsIFBvc3RncmVzIHdpdGhvdXQgVExTIGtlZXBzIHdvcmtpbmcuXG4gKlxuICogV2hlbiBlbmFibGVkLCBgcmVqZWN0VW5hdXRob3JpemVkYCBmb2xsb3dzIGBEQl9TU0xfUkVKRUNUX1VOQVVUSE9SSVpFRGBcbiAqIChkZWZhdWx0IGBmYWxzZWApOiBBV1MgUkRTIHByZXNlbnRzIGEgY2VydCBzaWduZWQgYnkgdGhlIFJEUyBDQSwgd2hpY2ggaXMgbm90XG4gKiBpbiBOb2RlJ3MgZGVmYXVsdCB0cnVzdCBzdG9yZSB1bmxlc3MgdGhlIENBIGJ1bmRsZSBpcyBtb3VudGVkLCBzbyBjZXJ0aWZpY2F0ZVxuICogVkVSSUZJQ0FUSU9OIGlzIG9wdC1pbiB0byBhdm9pZCBicmVha2luZyBhIHN0b2NrIFJEUyBkZXBsb3kg4oCUIHRoZSBjaGFubmVsIGlzXG4gKiBzdGlsbCBFTkNSWVBURUQuIFNldCBgREJfU1NMX1JFSkVDVF9VTkFVVEhPUklaRUQ9dHJ1ZWAgb25jZSB0aGUgUkRTIENBIGJ1bmRsZVxuICogaXMgd2lyZWQgdG8gZ2V0IGZ1bGwgdmVyaWZpY2F0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3NsQ29uZmlnKGV4cGxpY2l0PzogQ29ubmVjdGlvbk9wdGlvbnNbJ3NzbCddKTogYm9vbGVhbiB8IHsgcmVqZWN0VW5hdXRob3JpemVkOiBib29sZWFuIH0ge1xuICBpZiAoZXhwbGljaXQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGV4cGxpY2l0O1xuXG4gIGNvbnN0IGRiU3NsID0gcHJvY2Vzcy5lbnYuREJfU1NMPy50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBzc2xNb2RlID0gcHJvY2Vzcy5lbnYuUEdTU0xNT0RFPy50b0xvd2VyQ2FzZSgpO1xuXG4gIGxldCBlbmFibGVkOiBib29sZWFuO1xuICBpZiAoZGJTc2wgPT09ICd0cnVlJyB8fCBkYlNzbCA9PT0gJzEnKSBlbmFibGVkID0gdHJ1ZTtcbiAgZWxzZSBpZiAoZGJTc2wgPT09ICdmYWxzZScgfHwgZGJTc2wgPT09ICcwJykgZW5hYmxlZCA9IGZhbHNlO1xuICBlbHNlIGlmIChzc2xNb2RlKSBlbmFibGVkID0gc3NsTW9kZSAhPT0gJ2Rpc2FibGUnO1xuICBlbHNlIGVuYWJsZWQgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nO1xuXG4gIGlmICghZW5hYmxlZCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4geyByZWplY3RVbmF1dGhvcml6ZWQ6IHByb2Nlc3MuZW52LkRCX1NTTF9SRUpFQ1RfVU5BVVRIT1JJWkVEID09PSAndHJ1ZScgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VDb25maWcoKSB7XG4gIC8vIExhbWJkYTogc21hbGwgcG9vbCAoZWFjaCBpbnZvY2F0aW9uIGlzIHNob3J0LWxpdmVkLCBtYW55IGNvbmN1cnJlbnQgaW5zdGFuY2VzKVxuICAvLyBFQ1MvbG9uZy1ydW5uaW5nOiBsYXJnZXIgcG9vbCBmb3Igc3VzdGFpbmVkIGNvbmN1cnJlbmN5XG4gIGNvbnN0IGRlZmF1bHRQb29sU2l6ZSA9IGlzTGFtYmRhID8gMiA6IDIwO1xuICBjb25zdCBkZWZhdWx0SWRsZVRpbWVvdXQgPSBpc0xhbWJkYSA/IDEwMDAwIDogMzAwMDA7XG5cbiAgcmV0dXJuIHtcbiAgICBob3N0OiBwcm9jZXNzLmVudi5EQl9IT1NUIHx8ICdwb3N0Z3JlcycsXG4gICAgcG9ydDogcGFyc2VJbnRFbnYocHJvY2Vzcy5lbnYuREJfUE9SVCwgNTQzMiksXG4gICAgZGF0YWJhc2U6IHByb2Nlc3MuZW52LkRBVEFCQVNFIHx8ICdwaXBlbGluZV9idWlsZGVyJyxcbiAgICB1c2VyOiBwcm9jZXNzLmVudi5EQl9VU0VSIHx8ICdwb3N0Z3JlcycsXG4gICAgcGFzc3dvcmQ6IHByb2Nlc3MuZW52LkRCX1BBU1NXT1JEIHx8IChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nID8gKCgpID0+IHsgdGhyb3cgbmV3IEVycm9yKCdEQl9QQVNTV09SRCBpcyByZXF1aXJlZCBpbiBwcm9kdWN0aW9uJyk7IH0pKCkgYXMgc3RyaW5nIDogJycpLFxuICAgIG1heFBvb2xTaXplOiBwYXJzZUludEVudihwcm9jZXNzLmVudi5EUklaWkxFX01BWF9QT09MX1NJWkUsIGRlZmF1bHRQb29sU2l6ZSksXG4gICAgaWRsZVRpbWVvdXRNaWxsaXM6IHBhcnNlSW50RW52KHByb2Nlc3MuZW52LkRSSVpaTEVfSURMRV9USU1FT1VUX01JTExJUywgZGVmYXVsdElkbGVUaW1lb3V0KSxcbiAgICBjb25uZWN0aW9uVGltZW91dE1pbGxpczogcGFyc2VJbnRFbnYocHJvY2Vzcy5lbnYuRFJJWlpMRV9DT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTLCA1MDAwKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBEYXRhYmFzZSBjb25uZWN0aW9uIHN0YXRpc3RpY3MgZm9yIG1vbml0b3JpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uU3RhdHMge1xuICB0b3RhbENvdW50OiBudW1iZXI7XG4gIGlkbGVDb3VudDogbnVtYmVyO1xuICB3YWl0aW5nQ291bnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb25PcHRpb25zIHtcbiAgLyoqIFdoZXRoZXIgdG8gZW5hYmxlIGNvbm5lY3Rpb24gbG9nZ2luZyAqL1xuICBlbmFibGVMb2dnaW5nPzogYm9vbGVhbjtcblxuICAvKiogV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IHJldHJ5IGZhaWxlZCBjb25uZWN0aW9ucyAqL1xuICBlbmFibGVBdXRvUmV0cnk/OiBib29sZWFuO1xuXG4gIC8qKiBNYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9uIHJldHJ5IGF0dGVtcHRzICovXG4gIG1heFJldHJpZXM/OiBudW1iZXI7XG5cbiAgLyoqIERlbGF5IGJldHdlZW4gcmV0cnkgYXR0ZW1wdHMgaW4gbWlsbGlzZWNvbmRzICovXG4gIHJldHJ5RGVsYXk/OiBudW1iZXI7XG5cbiAgLyoqIFNTTCBjb25maWd1cmF0aW9uICovXG4gIHNzbD86IGJvb2xlYW4gfCB7IHJlamVjdFVuYXV0aG9yaXplZDogYm9vbGVhbiB9O1xufVxuXG4vKipcbiAqIFNpbmdsZXRvbiBkYXRhYmFzZSBjb25uZWN0aW9uIGNsYXNzLlxuICogTWFuYWdlcyBQb3N0Z3JlU1FMIGNvbm5lY3Rpb24gcG9vbGluZyBhbmQgRHJpenpsZSBPUk0gaW5zdGFuY2UuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIFNpbmdsZXRvbiBwYXR0ZXJuIGZvciBzaW5nbGUgY29ubmVjdGlvbiBwb29sXG4gKiAtIEF1dG9tYXRpYyBjb25uZWN0aW9uIHJldHJ5IHdpdGggYmFja29mZlxuICogLSBDb25uZWN0aW9uIGhlYWx0aCBtb25pdG9yaW5nXG4gKiAtIEdyYWNlZnVsIHNodXRkb3duIGhhbmRsaW5nXG4gKiAtIENvbXByZWhlbnNpdmUgZXJyb3IgaGFuZGxpbmdcbiAqIC0gQ29ubmVjdGlvbiBzdGF0aXN0aWNzIHRyYWNraW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuICpcbiAqIGNvbnN0IGNvbm5lY3Rpb24gPSBDb25uZWN0aW9uLmdldEluc3RhbmNlKCk7XG4gKiBjb25zdCBwbHVnaW5zID0gYXdhaXQgY29ubmVjdGlvbi5kYi5zZWxlY3QoKS5mcm9tKHNjaGVtYS5wbHVnaW4pO1xuICpcbiAqIC8vIER1cmluZyBzaHV0ZG93blxuICogYXdhaXQgY29ubmVjdGlvbi5jbG9zZSgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IENvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogRHJpenpsZSBPUk0gZGF0YWJhc2UgaW5zdGFuY2Ugd2l0aCBzY2hlbWFcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkYjogUmV0dXJuVHlwZTx0eXBlb2YgZHJpenpsZT47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwb29sOiBQb29sO1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFJlcXVpcmVkPENvbm5lY3Rpb25PcHRpb25zPjtcbiAgcHJpdmF0ZSByZWFkb25seSByZXRyeVN0cmF0ZWd5OiBDb25uZWN0aW9uUmV0cnlTdHJhdGVneTtcbiAgcHJpdmF0ZSBpc1NodXR0aW5nRG93biA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIGVuZm9yY2Ugc2luZ2xldG9uIHBhdHRlcm4uXG4gICAqIEluaXRpYWxpemVzIFBvc3RncmVTUUwgY29ubmVjdGlvbiBwb29sIGFuZCBEcml6emxlIE9STSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0aGUgY29ubmVjdGlvblxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgZGF0YWJhc2UgaW5pdGlhbGl6YXRpb24gZmFpbHMgYWZ0ZXIgYWxsIHJldHJpZXNcbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3Iob3B0aW9uczogQ29ubmVjdGlvbk9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGVuYWJsZUxvZ2dpbmc6IG9wdGlvbnMuZW5hYmxlTG9nZ2luZyA/PyB0cnVlLFxuICAgICAgZW5hYmxlQXV0b1JldHJ5OiBvcHRpb25zLmVuYWJsZUF1dG9SZXRyeSA/PyB0cnVlLFxuICAgICAgbWF4UmV0cmllczogb3B0aW9ucy5tYXhSZXRyaWVzID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LkRCX01BWF9SRVRSSUVTIHx8ICczJywgMTApLFxuICAgICAgcmV0cnlEZWxheTogb3B0aW9ucy5yZXRyeURlbGF5ID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LkRCX1JFVFJZX0RFTEFZX01TIHx8ICcxMDAwJywgMTApLFxuICAgICAgLy8gRW52LWRyaXZlbiBUTFM6IG9uLWJ5LWRlZmF1bHQgaW4gcHJvZHVjdGlvbiwgZW52LWVuYWJsZWFibGUgZWxzZXdoZXJlLlxuICAgICAgLy8gZ2V0SW5zdGFuY2UoKSBpcyBub3JtYWxseSBjYWxsZWQgd2l0aCBubyBvcHRpb25zLCBzbyB0aGlzIGlzIHRoZSBvbmx5XG4gICAgICAvLyBwbGFjZSBwcm9kdWN0aW9uIFJEUyBjb25uZWN0aW9ucyBwaWNrIHVwIFNTTCAoZm9ybWVybHkgaGFyZC1jb2RlZCBvZmYpLlxuICAgICAgc3NsOiBnZXRTc2xDb25maWcob3B0aW9ucy5zc2wpLFxuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIHJldHJ5IHN0cmF0ZWd5XG4gICAgdGhpcy5yZXRyeVN0cmF0ZWd5ID0gbmV3IENvbm5lY3Rpb25SZXRyeVN0cmF0ZWd5KHtcbiAgICAgIG1heFJldHJpZXM6IHRoaXMub3B0aW9ucy5tYXhSZXRyaWVzLFxuICAgICAgYmFzZURlbGF5OiB0aGlzLm9wdGlvbnMucmV0cnlEZWxheSxcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWcgPSBnZXREYXRhYmFzZUNvbmZpZygpO1xuXG4gICAgICBjb25zdCBwb29sQ29uZmlnOiBQb29sQ29uZmlnID0ge1xuICAgICAgICBob3N0OiBjb25maWcuaG9zdCxcbiAgICAgICAgcG9ydDogY29uZmlnLnBvcnQsXG4gICAgICAgIGRhdGFiYXNlOiBjb25maWcuZGF0YWJhc2UsXG4gICAgICAgIHVzZXI6IGNvbmZpZy51c2VyLFxuICAgICAgICBwYXNzd29yZDogY29uZmlnLnBhc3N3b3JkLFxuICAgICAgICBtYXg6IGNvbmZpZy5tYXhQb29sU2l6ZSxcbiAgICAgICAgaWRsZVRpbWVvdXRNaWxsaXM6IGNvbmZpZy5pZGxlVGltZW91dE1pbGxpcyxcbiAgICAgICAgY29ubmVjdGlvblRpbWVvdXRNaWxsaXM6IGNvbmZpZy5jb25uZWN0aW9uVGltZW91dE1pbGxpcyxcbiAgICAgICAgc3NsOiB0aGlzLm9wdGlvbnMuc3NsLFxuICAgICAgICBhbGxvd0V4aXRPbklkbGU6IHRydWUsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnBvb2wgPSBuZXcgUG9vbChwb29sQ29uZmlnKTtcbiAgICAgIHRoaXMuc2V0dXBFdmVudEhhbmRsZXJzKCk7XG5cbiAgICAgIHRoaXMuZGIgPSBkcml6emxlKHRoaXMucG9vbCwgeyBzY2hlbWEgfSk7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTG9nZ2luZykge1xuICAgICAgICBsb2dnZXIuaW5mbygnRGF0YWJhc2UgY29ubmVjdGlvbiBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgdGhpcy5sb2dDb25uZWN0aW9uQ29uZmlnKHBvb2xDb25maWcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIGRhdGFiYXNlIGNvbm5lY3Rpb246JywgZXJyb3IpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhYmFzZSBpbml0aWFsaXphdGlvbiBmYWlsZWQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBDb25uZWN0aW9uIGNsYXNzLlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGlmIG9uZSBkb2Vzbid0IGV4aXN0LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gKG9ubHkgdXNlZCBvbiBmaXJzdCBjYWxsKVxuICAgKiBAcmV0dXJucyBUaGUgc2luZ2xldG9uIENvbm5lY3Rpb24gaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2Uob3B0aW9ucz86IENvbm5lY3Rpb25PcHRpb25zKTogQ29ubmVjdGlvbiB7XG4gICAgaWYgKCFDb25uZWN0aW9uLmluc3RhbmNlKSB7XG4gICAgICBDb25uZWN0aW9uLmluc3RhbmNlID0gbmV3IENvbm5lY3Rpb24ob3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBDb25uZWN0aW9uLmluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLlxuICAgKiBVc2VmdWwgZm9yIHRlc3Rpbmcgb3IgcmVjb25maWd1cmluZyB0aGUgY29ubmVjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGNsb3NlRXhpc3RpbmcgLSBXaGV0aGVyIHRvIGNsb3NlIGV4aXN0aW5nIGNvbm5lY3Rpb24gYmVmb3JlIHJlc2V0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIHJlc2V0KGNsb3NlRXhpc3Rpbmc6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKENvbm5lY3Rpb24uaW5zdGFuY2UgJiYgY2xvc2VFeGlzdGluZykge1xuICAgICAgYXdhaXQgQ29ubmVjdGlvbi5pbnN0YW5jZS5jbG9zZSgpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uLmluc3RhbmNlID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0cyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvblxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiBjb25uZWN0aW9uIGlzIGhlYWx0aHlcbiAgICovXG4gIHB1YmxpYyBhc3luYyB0ZXN0Q29ubmVjdGlvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5wb29sLmNvbm5lY3QoKTtcbiAgICAgIC8vIFJlbGVhc2UgZXZlbiBpZiB0aGUgcHJvYmUgcXVlcnkgdGhyb3dzIOKAlCBvdGhlcndpc2UgYSBmbGFreSBEQiAodGhlIGV4YWN0XG4gICAgICAvLyBjYXNlIHRoaXMgY2hlY2sgZXhpc3RzIGZvcikgbGVha3MgYSBwb29sZWQgY2xpZW50IGVhY2ggZmFpbHVyZSBhbmQgY2FuXG4gICAgICAvLyBleGhhdXN0IHRoZSBwb29sIG9uIHRoZSByZXRyeSBwYXRoLlxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnF1ZXJ5KCdTRUxFQ1QgMScpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxvZ2dpbmcpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbygnRGF0YWJhc2UgY29ubmVjdGlvbiB0ZXN0IHN1Y2Nlc3NmdWwnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LnJvd3MubGVuZ3RoID4gMDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNsaWVudC5yZWxlYXNlKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRGF0YWJhc2UgY29ubmVjdGlvbiB0ZXN0IGZhaWxlZDonLCBlcnJvcik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgY29ubmVjdGlvbiBwb29sIHN0YXRpc3RpY3NcbiAgICpcbiAgICogQHJldHVybnMgQ3VycmVudCBjb25uZWN0aW9uIHBvb2wgc3RhdGlzdGljc1xuICAgKi9cbiAgcHVibGljIGdldFN0YXRzKCk6IENvbm5lY3Rpb25TdGF0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsQ291bnQ6IHRoaXMucG9vbC50b3RhbENvdW50LFxuICAgICAgaWRsZUNvdW50OiB0aGlzLnBvb2wuaWRsZUNvdW50LFxuICAgICAgd2FpdGluZ0NvdW50OiB0aGlzLnBvb2wud2FpdGluZ0NvdW50LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHBvb2wgZ3JhY2VmdWxseS5cbiAgICogU2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcgYXBwbGljYXRpb24gc2h1dGRvd24uXG4gICAqXG4gICAqIEBwYXJhbSB0aW1lb3V0IC0gTWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGNvbm5lY3Rpb25zIHRvIGNsb3NlIChtcylcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gcG9vbCBpcyBjbG9zZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjbG9zZSh0aW1lb3V0OiBudW1iZXIgPSBwYXJzZUludEVudihwcm9jZXNzLmVudi5EQl9DTE9TRV9USU1FT1VUX01TLCA1MDAwKSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzU2h1dHRpbmdEb3duKSB7XG4gICAgICBsb2dnZXIud2FybignQ29ubmVjdGlvbiBpcyBhbHJlYWR5IHNodXR0aW5nIGRvd24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzU2h1dHRpbmdEb3duID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxvZ2dpbmcpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0Nsb3NpbmcgZGF0YWJhc2UgY29ubmVjdGlvbiBwb29sLi4uJyk7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gdGhpcy5nZXRTdGF0cygpO1xuICAgICAgICBsb2dnZXIuaW5mbyhgUG9vbCBzdGF0cyAtIFRvdGFsOiAke3N0YXRzLnRvdGFsQ291bnR9LCBJZGxlOiAke3N0YXRzLmlkbGVDb3VudH0sIFdhaXRpbmc6ICR7c3RhdHMud2FpdGluZ0NvdW50fWApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgYSB0aW1lb3V0IGZvciBncmFjZWZ1bCBzaHV0ZG93blxuICAgICAgY29uc3QgY2xvc2VQcm9taXNlID0gdGhpcy5wb29sLmVuZCgpO1xuICAgICAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZSgoXywgcmVqZWN0KSA9PlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHJlamVjdChuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gY2xvc2UgdGltZW91dCcpKSwgdGltZW91dCksXG4gICAgICApO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW2Nsb3NlUHJvbWlzZSwgdGltZW91dFByb21pc2VdKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMb2dnaW5nKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdEYXRhYmFzZSBjb25uZWN0aW9uIGNsb3NlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBjbG9zaW5nIGRhdGFiYXNlIGNvbm5lY3Rpb246JywgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaXNTaHV0dGluZ0Rvd24gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBjb25uZWN0aW9uIGlzIHNodXR0aW5nIGRvd25cbiAgICpcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBjb25uZWN0aW9uIGlzIGluIHNodXRkb3duIHN0YXRlXG4gICAqL1xuICBwdWJsaWMgaXNDbG9zaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzU2h1dHRpbmdEb3duO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBjb25uZWN0aW9uIHBvb2xcbiAgICovXG4gIHByaXZhdGUgc2V0dXBFdmVudEhhbmRsZXJzKCk6IHZvaWQge1xuICAgIHRoaXMucG9vbC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1VuZXhwZWN0ZWQgZXJyb3Igb24gaWRsZSBjbGllbnQ6JywgZXJyKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVBdXRvUmV0cnkgJiYgdGhpcy5yZXRyeVN0cmF0ZWd5LmdldEF0dGVtcHRzKCkgPCB0aGlzLm9wdGlvbnMubWF4UmV0cmllcykge1xuICAgICAgICB2b2lkIHRoaXMucmV0cnlTdHJhdGVneS5oYW5kbGVDb25uZWN0aW9uRXJyb3IoZXJyLCAoKSA9PiB0aGlzLnRlc3RDb25uZWN0aW9uKCkpLmNhdGNoKChyZXRyeUVycikgPT4ge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignQ29ubmVjdGlvbiByZXRyeSBlcnJvcjonLCByZXRyeUVycik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5wb29sLm9uKCdjb25uZWN0JywgKCkgPT4ge1xuICAgICAgdGhpcy5yZXRyeVN0cmF0ZWd5LnJlc2V0KCk7IC8vIFJlc2V0IG9uIHN1Y2Nlc3NmdWwgY29ubmVjdGlvblxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxvZ2dpbmcpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdOZXcgZGF0YWJhc2UgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCcpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5wb29sLm9uKCdyZW1vdmUnLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxvZ2dpbmcpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdDbGllbnQgcmVtb3ZlZCBmcm9tIHBvb2wnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbiAoc2FuaXRpemVkKVxuICAgKi9cbiAgcHJpdmF0ZSBsb2dDb25uZWN0aW9uQ29uZmlnKGNvbmZpZzogUG9vbENvbmZpZyk6IHZvaWQge1xuICAgIGxvZ2dlci5pbmZvKCdEYXRhYmFzZSBDb25maWd1cmF0aW9uOicsIHtcbiAgICAgIGhvc3Q6IGAke2NvbmZpZy5ob3N0fToke2NvbmZpZy5wb3J0fWAsXG4gICAgICBkYXRhYmFzZTogY29uZmlnLmRhdGFiYXNlLFxuICAgICAgdXNlcjogY29uZmlnLnVzZXIsXG4gICAgICBtYXhQb29sU2l6ZTogY29uZmlnLm1heCxcbiAgICAgIGlkbGVUaW1lb3V0TXM6IGNvbmZpZy5pZGxlVGltZW91dE1pbGxpcyxcbiAgICAgIGNvbm5lY3Rpb25UaW1lb3V0TXM6IGNvbmZpZy5jb25uZWN0aW9uVGltZW91dE1pbGxpcyxcbiAgICAgIHNzbDogY29uZmlnLnNzbCA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCcsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTaW5nbGV0b24gZGF0YWJhc2UgaW5zdGFuY2UgZm9yIHVzZSB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgZGIgfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuICpcbiAqIC8vIFNlbGVjdCBxdWVyaWVzXG4gKiBjb25zdCBwbHVnaW5zID0gYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShzY2hlbWEucGx1Z2luKTtcbiAqXG4gKiAvLyBJbnNlcnQgcXVlcmllc1xuICogYXdhaXQgZGIuaW5zZXJ0KHNjaGVtYS5wbHVnaW4pLnZhbHVlcyh7IG5hbWU6ICdteS1wbHVnaW4nIH0pO1xuICpcbiAqIC8vIFRyYW5zYWN0aW9uc1xuICogYXdhaXQgZGIudHJhbnNhY3Rpb24oYXN5bmMgKHR4KSA9PiB7XG4gKiAgIGF3YWl0IHR4Lmluc2VydChzY2hlbWEucGx1Z2luKS52YWx1ZXMoeyAuLi4gfSk7XG4gKiAgIGF3YWl0IHR4LnVwZGF0ZShzY2hlbWEucGx1Z2luKS5zZXQoeyAuLi4gfSk7XG4gKiB9KTtcbiAqIGBgYFxuICovXG5cbi8vIExhenkgaW5pdGlhbGl6YXRpb24gdG8gYXZvaWQgcmFjZSBjb25kaXRpb24gb24gbW9kdWxlIGxvYWRcbmxldCBfZGJJbnN0YW5jZTogUmV0dXJuVHlwZTx0eXBlb2YgZHJpenpsZT4gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBHZXQgdGhlIGRhdGFiYXNlIGluc3RhbmNlIHdpdGggbGF6eSBpbml0aWFsaXphdGlvblxuICogVGhpcyBhdm9pZHMgdGhlIHJhY2UgY29uZGl0aW9uIHdoZXJlIHRoZSBtb2R1bGUgaXMgbG9hZGVkIGJlZm9yZSBlbnZpcm9ubWVudCBpcyBjb25maWd1cmVkXG4gKi9cbmZ1bmN0aW9uIGdldERiSW5zdGFuY2UoKTogUmV0dXJuVHlwZTx0eXBlb2YgZHJpenpsZT4ge1xuICBpZiAoIV9kYkluc3RhbmNlKSB7XG4gICAgX2RiSW5zdGFuY2UgPSBDb25uZWN0aW9uLmdldEluc3RhbmNlKCkuZGI7XG4gIH1cbiAgcmV0dXJuIF9kYkluc3RhbmNlO1xufVxuXG4vKipcbiAqIFByb3h5LWJhc2VkIGxhenkgZGF0YWJhc2UgaW5zdGFuY2VcbiAqIFRoZSBhY3R1YWwgY29ubmVjdGlvbiBpcyBvbmx5IGNyZWF0ZWQgd2hlbiBmaXJzdCBhY2Nlc3NlZFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBkYiB9IGZyb20gJy4vY29ubmVjdGlvbic7XG4gKlxuICogLy8gQ29ubmVjdGlvbiBpcyBjcmVhdGVkIGhlcmUgb24gZmlyc3QgdXNlLCBub3Qgb24gaW1wb3J0XG4gKiBjb25zdCBwbHVnaW5zID0gYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShzY2hlbWEucGx1Z2luKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgZGIgPSBuZXcgUHJveHkoe30gYXMgUmV0dXJuVHlwZTx0eXBlb2YgZHJpenpsZT4sIHtcbiAgZ2V0KF8sIHByb3A6IHN0cmluZyB8IHN5bWJvbCkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0RGJJbnN0YW5jZSgpO1xuICAgIGNvbnN0IHZhbHVlID0gaW5zdGFuY2VbcHJvcCBhcyBrZXlvZiB0eXBlb2YgaW5zdGFuY2VdO1xuICAgIC8vIEJpbmQgbWV0aG9kcyB0byB0aGUgaW5zdGFuY2UgdG8gcHJlc2VydmUgJ3RoaXMnIGNvbnRleHRcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdmFsdWUuYmluZChpbnN0YW5jZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcbn0pO1xuXG4vKipcbiAqIEdldHMgdGhlIENvbm5lY3Rpb24gaW5zdGFuY2UgZm9yIGFkdmFuY2VkIG9wZXJhdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgZ2V0Q29ubmVjdGlvbiB9IGZyb20gJy4vY29ubmVjdGlvbic7XG4gKlxuICogY29uc3QgY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb24oKTtcbiAqIGNvbnN0IHN0YXRzID0gY29ubmVjdGlvbi5nZXRTdGF0cygpO1xuICogY29uc29sZS5sb2coYEFjdGl2ZSBjb25uZWN0aW9uczogJHtzdGF0cy50b3RhbENvdW50fWApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25uZWN0aW9uKCk6IENvbm5lY3Rpb24ge1xuICByZXR1cm4gQ29ubmVjdGlvbi5nZXRJbnN0YW5jZSgpO1xufVxuXG4vKipcbiAqIENsb3NlcyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvblxuICogU2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcgYXBwbGljYXRpb24gc2h1dGRvd25cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgY2xvc2VDb25uZWN0aW9uIH0gZnJvbSAnLi9jb25uZWN0aW9uJztcbiAqXG4gKiBwcm9jZXNzLm9uKCdTSUdURVJNJywgYXN5bmMgKCkgPT4ge1xuICogICBhd2FpdCBjbG9zZUNvbm5lY3Rpb24oKTtcbiAqICAgcHJvY2Vzcy5leGl0KDApO1xuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb3NlQ29ubmVjdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29ubmVjdGlvbiA9IENvbm5lY3Rpb24uZ2V0SW5zdGFuY2UoKTtcbiAgYXdhaXQgY29ubmVjdGlvbi5jbG9zZSgpO1xuICBfZGJJbnN0YW5jZSA9IG51bGw7IC8vIFJlc2V0IGxhenkgaW5zdGFuY2Vcbn1cblxuLyoqXG4gKiBUZXN0cyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvblxuICpcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIGNvbm5lY3Rpb24gaXMgaGVhbHRoeVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyB0ZXN0Q29ubmVjdGlvbiB9IGZyb20gJy4vY29ubmVjdGlvbic7XG4gKlxuICogaWYgKGF3YWl0IHRlc3RDb25uZWN0aW9uKCkpIHtcbiAqICAgY29uc29sZS5sb2coJ0RhdGFiYXNlIGlzIHJlYWR5Jyk7XG4gKiB9IGVsc2Uge1xuICogICBjb25zb2xlLmVycm9yKCdEYXRhYmFzZSBjb25uZWN0aW9uIGZhaWxlZCcpO1xuICogICBwcm9jZXNzLmV4aXQoMSk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RDb25uZWN0aW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gQ29ubmVjdGlvbi5nZXRJbnN0YW5jZSgpO1xuICByZXR1cm4gY29ubmVjdGlvbi50ZXN0Q29ubmVjdGlvbigpO1xufVxuIl19
package/package.json CHANGED
@@ -24,7 +24,7 @@
24
24
  "dependencies": {
25
25
  "drizzle-orm": "0.45.2",
26
26
  "pg": "8.22.0",
27
- "@pipeline-builder/api-core": "3.4.96"
27
+ "@pipeline-builder/api-core": "3.4.97"
28
28
  },
29
29
  "keywords": [
30
30
  "ci-cd",
@@ -80,7 +80,7 @@
80
80
  "access": "public",
81
81
  "registry": "https://registry.npmjs.org/"
82
82
  },
83
- "version": "3.4.99",
83
+ "version": "3.4.101",
84
84
  "bugs": {
85
85
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
86
86
  },