velocious 1.0.587 → 1.0.588
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/build/database/drivers/mysql/index.js +1 -1
- package/build/database/pool/async-tracked-multi-connection.js +25 -1
- package/build/database/pool/base.js +1 -0
- package/build/src/database/drivers/mysql/index.js +2 -2
- package/build/src/database/pool/async-tracked-multi-connection.d.ts +13 -0
- package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
- package/build/src/database/pool/async-tracked-multi-connection.js +23 -2
- package/build/src/database/pool/base.d.ts +10 -0
- package/build/src/database/pool/base.d.ts.map +1 -1
- package/build/src/database/pool/base.js +2 -1
- package/package.json +2 -1
- package/src/database/drivers/mysql/index.js +1 -1
- package/src/database/pool/async-tracked-multi-connection.js +25 -1
- package/src/database/pool/base.js +1 -0
|
@@ -95,6 +95,13 @@ export default class VelociousDatabasePoolAsyncTrackedMultiConnection extends Ba
|
|
|
95
95
|
* @type {WeakMap<object, Promise<void>>}
|
|
96
96
|
*/
|
|
97
97
|
connectionClosePromises = new WeakMap();
|
|
98
|
+
/** Cumulative low-cardinality pool telemetry. */
|
|
99
|
+
telemetry = {
|
|
100
|
+
checkoutWaitCount: 0,
|
|
101
|
+
checkoutWaitMaxMs: 0,
|
|
102
|
+
checkoutWaitTotalMs: 0,
|
|
103
|
+
idleReapDisposalCount: 0
|
|
104
|
+
};
|
|
98
105
|
idSeq = 0;
|
|
99
106
|
/**
|
|
100
107
|
* Runs constructor.
|
|
@@ -488,8 +495,20 @@ export default class VelociousDatabasePoolAsyncTrackedMultiConnection extends Ba
|
|
|
488
495
|
removePendingCheckoutAt(index) {
|
|
489
496
|
const checkout = this.pendingCheckouts.splice(index, 1)[0];
|
|
490
497
|
this.clearPendingCheckoutTimeout(checkout);
|
|
498
|
+
this.recordCheckoutWait(checkout);
|
|
491
499
|
return checkout;
|
|
492
500
|
}
|
|
501
|
+
/**
|
|
502
|
+
* Records a completed queue wait without retaining per-checkout labels or samples.
|
|
503
|
+
* @param {PendingCheckout} checkout - Checkout leaving the pending queue.
|
|
504
|
+
* @returns {void}
|
|
505
|
+
*/
|
|
506
|
+
recordCheckoutWait(checkout) {
|
|
507
|
+
const waitedForMs = Math.max(0, Date.now() - checkout.enqueuedAt);
|
|
508
|
+
this.telemetry.checkoutWaitCount++;
|
|
509
|
+
this.telemetry.checkoutWaitTotalMs += waitedForMs;
|
|
510
|
+
this.telemetry.checkoutWaitMaxMs = Math.max(this.telemetry.checkoutWaitMaxMs, waitedForMs);
|
|
511
|
+
}
|
|
493
512
|
/**
|
|
494
513
|
* Runs start pending checkout timeout.
|
|
495
514
|
* @param {PendingCheckout} checkout - Pending checkout to time out.
|
|
@@ -924,7 +943,8 @@ export default class VelociousDatabasePoolAsyncTrackedMultiConnection extends Ba
|
|
|
924
943
|
idleCount: this.connections.length + [...this.lifecycleRetainedConnections.values()].filter((connection) => connection.getIdSeq() === undefined).length,
|
|
925
944
|
inUseCount: Object.keys(this.connectionsInUse).length,
|
|
926
945
|
pendingCheckouts: this.pendingCheckoutDebugSnapshots(now),
|
|
927
|
-
pendingCheckoutCount: this.pendingCheckouts.length
|
|
946
|
+
pendingCheckoutCount: this.pendingCheckouts.length,
|
|
947
|
+
telemetry: { ...this.telemetry }
|
|
928
948
|
};
|
|
929
949
|
}
|
|
930
950
|
/**
|
|
@@ -1151,6 +1171,7 @@ export default class VelociousDatabasePoolAsyncTrackedMultiConnection extends Ba
|
|
|
1151
1171
|
async closeExpiredIdleConnections(expiredConnections) {
|
|
1152
1172
|
for (const connection of expiredConnections) {
|
|
1153
1173
|
await this.closeConnection(connection);
|
|
1174
|
+
this.telemetry.idleReapDisposalCount++;
|
|
1154
1175
|
}
|
|
1155
1176
|
}
|
|
1156
1177
|
/**
|
|
@@ -1348,4 +1369,4 @@ export default class VelociousDatabasePoolAsyncTrackedMultiConnection extends Ba
|
|
|
1348
1369
|
this.globalConnections.delete(configuration);
|
|
1349
1370
|
}
|
|
1350
1371
|
}
|
|
1351
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtdHJhY2tlZC1tdWx0aS1jb25uZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3Bvb2wvYXN5bmMtdHJhY2tlZC1tdWx0aS1jb25uZWN0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDN0MsT0FBTyxRQUFRLEVBQUUsRUFBQyxzQkFBc0IsRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUUxRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQTtBQUNwRSxNQUFNLDZCQUE2QixHQUFHLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFBO0FBQ2xGLE1BQU0seUJBQXlCLEdBQUcsTUFBTSxDQUFDLGlDQUFpQyxDQUFDLENBQUE7QUFDM0UsTUFBTSw2QkFBNkIsR0FBRyxNQUFNLENBQUMsc0NBQXNDLENBQUMsQ0FBQTtBQUNwRixNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQTtBQUNsQyxNQUFNLDJCQUEyQixHQUFHLElBQUksQ0FBQTtBQUN4QyxNQUFNLCtCQUErQixHQUFHLEtBQUssQ0FBQTtBQUU3QyxNQUFNLENBQUMsT0FBTyxPQUFPLGdEQUFpRCxTQUFRLFFBQVE7SUFDcEY7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLGlCQUFpQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7SUFFeEMsaUJBQWlCLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxDQUFBO0lBRTNDOzs7OztPQUtHO0lBQ0gscUJBQXFCLEdBQUcsU0FBUyxDQUFBO0lBRWpDOzs7T0FHRztJQUNILDZCQUE2QixHQUFHLFNBQVMsQ0FBQTtJQUV6Qzs7O09BR0c7SUFDSCxpQ0FBaUMsR0FBRyxTQUFTLENBQUE7SUFFN0M7O3dEQUVvRDtJQUNwRCxXQUFXLEdB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RSxDQUFDO1lBQ3hDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUMxQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFLGFBQWE7UUFDcEQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO1lBQ3RDLE9BQU07UUFDUixDQUFDO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQzlELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLHNCQUFzQixDQUFDLGFBQWE7UUFDekMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO1lBQ3RDLE9BQU07UUFDUixDQUFDO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtBc3luY0xvY2FsU3RvcmFnZX0gZnJvbSBcImFzeW5jX2hvb2tzXCJcbmltcG9ydCBCYXNlUG9vbCwge1BPT0xfQ09ORklHVVJBVElPTl9LRVl9IGZyb20gXCIuL2Jhc2UuanNcIlxuXG4vKipcbiAqIFBlbmRpbmdDaGVja291dCB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gUGVuZGluZ0NoZWNrb3V0XG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gZGF0YWJhc2VDb25maWcgLSBSZXNvbHZlZCBkYXRhYmFzZSBjb25maWd1cmF0aW9uIG5lZWRlZCBieSB0aGUgY2hlY2tvdXQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZW5xdWV1ZWRBdCAtIFRpbWVzdGFtcCB3aGVuIHRoZSBjaGVja291dCBzdGFydGVkIHdhaXRpbmcuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vYmFzZS5qc1wiKS5Db25uZWN0aW9uQ2hlY2tvdXRPcHRpb25zfSBvcHRpb25zIC0gQ2hlY2tvdXQgb3B0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZXVzZUtleSAtIERhdGFiYXNlIGNvbmZpZ3VyYXRpb24gcmV1c2Uga2V5IG5lZWRlZCBieSB0aGUgY2hlY2tvdXQuXG4gKiBAcHJvcGVydHkgeyhjb25uZWN0aW9uOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCkgPT4gdm9pZH0gcmVzb2x2ZSAtIFJlc29sdmVzIHdpdGggYW4gYWN0aXZhdGVkIGNvbm5lY3Rpb24uXG4gKiBAcHJvcGVydHkgeyhlcnJvcjogRXJyb3IpID0+IHZvaWR9IHJlamVjdCAtIFJlamVjdHMgd2hlbiBjaGVja291dCBjYW5ub3QgY29tcGxldGUuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHRpbWVvdXRBdCAtIFRpbWVzdGFtcCB3aGVuIHRoZSBjaGVja291dCB3aWxsIHRpbWUgb3V0LCBvciBudWxsIHdoZW4gZGlzYWJsZWQuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHRpbWVvdXRNaWxsaXMgLSBNaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgcmVqZWN0aW5nLCBvciBudWxsIHdoZW4gZGlzYWJsZWQuXG4gKiBAcHJvcGVydHkge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkfSB0aW1lb3V0VGltZXIgLSBUaW1lciB0aGF0IHJlamVjdHMgdGhlIHBlbmRpbmcgY2hlY2tvdXQuXG4gKi9cbmV4cG9ydCBjb25zdCBDTE9TRURfQ09OTkVDVElPTiA9IFN5bWJvbChcInZlbG9jaW91c0Nsb3NlZENvbm5lY3Rpb25cIilcbmNvbnN0IElETEVfQ09OTkVDVElPTl9DSEVDS0VEX0lOX0FUID0gU3ltYm9sKFwidmVsb2Npb3VzSWRsZUNvbm5lY3Rpb25DaGVja2VkSW5BdFwiKVxuY29uc3QgQ09OTkVDVElPTl9DSEVDS0VEX09VVF9BVCA9IFN5bWJvbChcInZlbG9jaW91c0Nvbm5lY3Rpb25DaGVja2VkT3V0QXRcIilcbmNvbnN0IFNVUFBSRVNTRURfQ09OTkVDVElPTl9DT05URVhUID0gU3ltYm9sKFwidmVsb2Npb3VzU3VwcHJlc3NlZENvbm5lY3Rpb25Db250ZXh0XCIpXG5jb25zdCBERUZBVUxUX01BWF9DT05ORUNUSU9OUyA9IDEwXG5jb25zdCBERUZBVUxUX0lETEVfVElNRU9VVF9NSUxMSVMgPSA1MDAwXG5jb25zdCBERUZBVUxUX0NIRUNLT1VUX1RJTUVPVVRfTUlMTElTID0gMTAwMDBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzRGF0YWJhc2VQb29sQXN5bmNUcmFja2VkTXVsdGlDb25uZWN0aW9uIGV4dGVuZHMgQmFzZVBvb2wge1xuICAvKipcbiAgICogR2xvYmFsIGZhbGxiYWNrIGNvbm5lY3Rpb25zIGtleWVkIGJ5IGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UgYW5kIHBvb2wgaWRlbnRpZmllci5cbiAgICogQHR5cGUge1dlYWtNYXA8aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD4+fVxuICAgKi9cbiAgc3RhdGljIGdsb2JhbENvbm5lY3Rpb25zID0gbmV3IFdlYWtNYXAoKVxuXG4gIGFzeW5jTG9jYWxTdG9yYWdlID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKClcblxuICAvKipcbiAgICogV2hlbiBzZXQsIHJldHVybmVkIGJ5IGdldEN1cnJlbnRDb250ZXh0Q29ubmVjdGlvbiB3aGVuIG5vIGFzeW5jIGNvbnRleHQgZXhpc3RzLlxuICAgKiBVc2VkIGJ5IHRoZSB0ZXN0IHJ1bm5lciB0byBzaGFyZSBhIGNvbm5lY3Rpb24gYmV0d2VlbiB0ZXN0IGNvZGUgYW5kIEhUVFAgaGFuZGxlcnNcbiAgICogcnVubmluZyBpbiB0aGUgc2FtZSBwcm9jZXNzIChpbi1wcm9jZXNzIHRlc3Qgc2VydmVyIG1vZGUpLlxuICAgKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9XG4gICAqL1xuICBfdGVzdFNoYXJlZENvbm5lY3Rpb24gPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogRHluYW1pY2FsbHkgcmVzb2x2ZXMgdGhlIGNvbm5lY3Rpb24gZWxpZ2libGUgZm9yIGluLXByb2Nlc3MgdGVzdCByZXF1ZXN0IHNoYXJpbmcuXG4gICAqIEB0eXBlIHsoKCkgPT4gaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWQpIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgX3Rlc3RTaGFyZWRDb25uZWN0aW9uUHJvdmlkZXIgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogSWRlbnRpZmllcyB0aGUgbGlmZWN5Y2xlIHRoYXQgaW5zdGFsbGVkIHRoZSBjdXJyZW50IHNoYXJlZCBjb25uZWN0aW9uIG9yIHByb3ZpZGVyLlxuICAgKiBAdHlwZSB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLlRlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9uIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgX3Rlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9uID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIENvbm5lY3Rpb25zLlxuICAgKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHRbXX0gKi9cbiAgY29ubmVjdGlvbnMgPSBbXVxuXG4gIC8qKlxuICAgKiBQaHlzaWNhbCBpZGVudGl0aWVzIHJlcXVlc3RlZCB0byByZW1haW4gcmVzaWRlbnQgYnkgdGhlIGZyb250ZW5kIHRlbmFudCBsaWZlY3ljbGUuXG4gICAqIEB0eXBlIHtTZXQ8c3RyaW5nPn1cbiAgICovXG4gIGxpZmVjeWNsZVJldGFpbmVkUmV1c2VLZXlzID0gbmV3IFNldCgpXG5cbiAgLyoqXG4gICAqIFBhcmtlZCBsaWZlY3ljbGUtb3duZWQgY29ubmVjdGlvbnMga2V5ZWQgYnkgcGh5c2ljYWwgaWRlbnRpdHkuXG4gICAqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59XG4gICAqL1xuICBsaWZlY3ljbGVSZXRhaW5lZENvbm5lY3Rpb25zID0gbmV3IE1hcCgpXG5cbiAgLyoqXG4gICAqIENvbm5lY3Rpb25zIGluIHVzZS5cbiAgICogQHR5cGUge1JlY29yZDxudW1iZXIsIGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn0gKi9cbiAgY29ubmVjdGlvbnNJblVzZSA9IHt9XG5cbiAgLyoqXG4gICAqIFBlbmRpbmcgY2hlY2tvdXRzLlxuICAgKiBAdHlwZSB7UGVuZGluZ0NoZWNrb3V0W119ICovXG4gIHBlbmRpbmdDaGVja291dHMgPSBbXVxuXG4gIC8qKlxuICAgKiBDb25uZWN0aW9ucyBiZWluZyBzcGF3bmVkLlxuICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICBjb25uZWN0aW9uc0JlaW5nU3Bhd25lZCA9IDBcblxuICAvKipcbiAgICogUGVuZGluZyBjaGVja291dCBkcmFpbiBwcm9taXNlLlxuICAgKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZH0gKi9cbiAgcGVuZGluZ0NoZWNrb3V0RHJhaW5Qcm9taXNlID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIElkbGUgY29ubmVjdGlvbiByZWFwZXIgdGltZXIuXG4gICAqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZH0gKi9cbiAgaWRsZUNvbm5lY3Rpb25SZWFwZXJUaW1lciA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBJbi1mbGlnaHQgY29ubmVjdGlvbi1jbG9zZSBwcm9taXNlcy4gVGhlIGlkbGUgcmVhcGVyIGlzIGFybWVkIG9uIGNoZWNrLWluXG4gICAqIGFuZCBydW5zIGZpcmUtYW5kLWZvcmdldCB3aGVuIGl0cyB0aW1lciBmaXJlcywgc28gYSBzY2hlZHVsZWQgcmVhcCBjYW4gYmVcbiAgICogY2xvc2luZyBhIGNvbm5lY3Rpb24gd2hpbGUgYW4gZXhwbGljaXQgYHJlYXBJZGxlQ29ubmVjdGlvbnMoKWAgKG9yXG4gICAqIGBjbGVhcklkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIoKWApIHJ1bnMuIFRyYWNraW5nIHRoZSBpbi1mbGlnaHQgY2xvc2VzIGxldHNcbiAgICogdGhvc2UgY2FsbGVycyBhd2FpdCB0aGVtLCBzbyBvbmNlIGEgcmVhcCByZXNvbHZlcyB0aGUgY29ubmVjdGlvbnMgaXRcbiAgICogZXhwaXJlZCBhcmUgZnVsbHkgY2xvc2VkIGluc3RlYWQgb2YgaGFsZi1jbG9zZWQgbWlkLWBjbG9zZSgpYC5cbiAgICogQHR5cGUge1NldDxQcm9taXNlPHZvaWQ+Pn1cbiAgICovXG4gIGluZmxpZ2h0Q29ubmVjdGlvbkNsb3NlcyA9IG5ldyBTZXQoKVxuXG4gIC8qKlxuICAgKiBJbi1mbGlnaHQgY2xvc2UgcHJvbWlzZSBwZXIgY29ubmVjdGlvbiwgc28gY29uY3VycmVudCBjbG9zZXMgb2YgdGhlIHNhbWVcbiAgICogY29ubmVjdGlvbiBhd2FpdCB0aGUgc2FtZSBjbG9zZSByYXRoZXIgdGhhbiBjbG9zaW5nIHRoZSBkcml2ZXIgaGFuZGxlIHR3aWNlLlxuICAgKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIFByb21pc2U8dm9pZD4+fVxuICAgKi9cbiAgY29ubmVjdGlvbkNsb3NlUHJvbWlzZXMgPSBuZXcgV2Vha01hcCgpXG5cbiAgaWRTZXEgPSAwXG5cbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5pZGVudGlmaWVyIC0gSWRlbnRpZmllci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBpZGVudGlmaWVyfSkge1xuICAgIHN1cGVyKHtjb25maWd1cmF0aW9uLCBpZGVudGlmaWVyfSlcbiAgICAvKipcbiAgICAgKiBSdW5zIGEgY2FsbGJhY2sgd2l0aG91dCB0aGUgaW5oZXJpdGVkIGN1cnJlbnQgY29ubmVjdGlvbiBjb250ZXh0LlxuICAgICAqIEB0eXBlIHsoY2FsbGJhY2s6ICgpID0+IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+KSA9PiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn1cbiAgICAgKi9cbiAgICBjb25zdCB3aXRob3V0Q3VycmVudENvbm5lY3Rpb25Db250ZXh0ID0gKGNhbGxiYWNrKSA9PiB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bihTVVBQUkVTU0VEX0NPTk5FQ1RJT05fQ09OVEVYVCwgY2FsbGJhY2spXG4gICAgdGhpcy5fd2l0aG91dEN1cnJlbnRDb25uZWN0aW9uQ29udGV4dCA9IHdpdGhvdXRDdXJyZW50Q29ubmVjdGlvbkNvbnRleHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNoZWNraW4uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBEYXRhYmFzZSBjb25uZWN0aW9uIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNoZWNrZWQgaW4gb3IgY2xvc2VkLlxuICAgKi9cbiAgYXN5bmMgY2hlY2tpbihjb25uZWN0aW9uKSB7XG4gICAgY29uc3QgaWQgPSBjb25uZWN0aW9uLmdldElkU2VxKClcbiAgICBjb25zdCB0cmFja2VkQ29ubmVjdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgJiB7W0NMT1NFRF9DT05ORUNUSU9OXT86IGJvb2xlYW4sIFtDT05ORUNUSU9OX0NIRUNLRURfT1VUX0FUXT86IG51bWJlciwgW0lETEVfQ09OTkVDVElPTl9DSEVDS0VEX0lOX0FUXT86IG51bWJlcn19ICovIChjb25uZWN0aW9uKVxuXG4gICAgaWYgKHRyYWNrZWRDb25uZWN0aW9uW0NMT1NFRF9DT05ORUNUSU9OXSkge1xuICAgICAgdGhpcy51bnRyYWNrQ29ubmVjdGlvbkluVXNlKGNvbm5lY3Rpb24sIGlkKVxuICAgICAgYXdhaXQgdGhpcy5kcmFpblBlbmRpbmdDaGVja291dHMoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucm9sbGJhY2tMZWZ0T3BlblRyYW5zYWN0aW9uKGNvbm5lY3Rpb24pXG4gICAgICBhd2FpdCBjb25uZWN0aW9uLnJlbGVhc2VIZWxkQWR2aXNvcnlMb2NrcygpXG4gICAgICBhd2FpdCBjb25uZWN0aW9uLmNsZWFyQ29ubmVjdGlvbkNoZWNrb3V0TmFtZSgpXG4gICAgICBhd2FpdCBjb25uZWN0aW9uLmNsZWFudXBTZXNzaW9uU3RhdGVBZnRlckNoZWNrb3V0KClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgdGhpcy5jbG9zZUNoZWNrZWRPdXRDb25uZWN0aW9uQWZ0ZXJDaGVja2luRmFpbHVyZShjb25uZWN0aW9uLCBpZCwgZXJyb3IpXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHRoaXMudW50cmFja0Nvbm5lY3Rpb25JblVzZShjb25uZWN0aW9uLCBpZClcbiAgICBkZWxldGUgdHJhY2tlZENvbm5lY3Rpb25bQ09OTkVDVElPTl9DSEVDS0VEX09VVF9BVF1cbiAgICBjb25zdCByZXVzZUtleSA9IHRoaXMuZ2V0Q29ubmVjdGlvbkNvbmZpZ3VyYXRpb25SZXVzZUtleShjb25uZWN0aW9uKVxuXG4gICAgaWYgKHRoaXMubGlmZWN5Y2xlUmV0YWluZWRSZXVzZUtleXMuaGFzKHJldXNlS2V5KSkge1xuICAgICAgY29uc3QgcmV0YWluZWRDb25uZWN0aW9uID0gdGhpcy5saWZlY3ljbGVSZXRhaW5lZENvbm5lY3Rpb25zLmdldChyZXVzZUtleSlcblxuICAgICAgaWYgKCFyZXRhaW5lZENvbm5lY3Rpb24gfHwgcmV0YWluZWRDb25uZWN0aW9uID09PSBjb25uZWN0aW9uIHx8IHJldGFpbmVkQ29ubmVjdGlvbi5nZXRJZFNlcSgpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVsZXRlIHRyYWNrZWRDb25uZWN0aW9uW0lETEVfQ09OTkVDVElPTl9DSEVDS0VEX0lOX0FUXVxuICAgICAgICB0aGlzLmxpZmVjeWNsZVJldGFpbmVkQ29ubmVjdGlvbnMuc2V0KHJldXNlS2V5LCBjb25uZWN0aW9uKVxuICAgICAgICBhd2FpdCB0aGlzLmRyYWluUGVuZGluZ0NoZWNrb3V0cygpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIHRyYWNrZWRDb25uZWN0aW9uW0lETEVfQ09OTkVDVElPTl9DSEVDS0VEX0lOX0FUXSA9IERhdGUubm93KClcbiAgICB0aGlzLmNvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbilcbiAgICBhd2FpdCB0aGlzLmRyYWluUGVuZGluZ0NoZWNrb3V0cygpXG4gICAgaWYgKHRoaXMuY29ubmVjdGlvbnMuaW5jbHVkZXMoY29ubmVjdGlvbikpIGF3YWl0IHRoaXMuaGFuZGxlQ2hlY2tlZEluSWRsZUNvbm5lY3Rpb24oKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xvc2UgY2hlY2tlZCBvdXQgY29ubmVjdGlvbiBhZnRlciBjaGVja2luIGZhaWx1cmUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBDb25uZWN0aW9uIHRoYXQgZmFpbGVkIGNoZWNrLWluIGNsZWFudXAuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBpZCAtIENvbm5lY3Rpb24gY2hlY2tvdXQgaWQuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IG9yaWdpbmFsRXJyb3IgLSBFcnJvciB0aGF0IGNhdXNlZCBjaGVjay1pbiBjbGVhbnVwIHRvIGZhaWwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY2xlYW51cCBoYXMgYmVlbiBhdHRlbXB0ZWQuXG4gICAqL1xuICBhc3luYyBjbG9zZUNoZWNrZWRPdXRDb25uZWN0aW9uQWZ0ZXJDaGVja2luRmFpbHVyZShjb25uZWN0aW9uLCBpZCwgb3JpZ2luYWxFcnJvcikge1xuICAgIHRoaXMudW50cmFja0Nvbm5lY3Rpb25JblVzZShjb25uZWN0aW9uLCBpZClcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNsb3NlQ29ubmVjdGlvbihjb25uZWN0aW9uKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFwiRmFpbGVkIHRvIGNsb3NlIGRhdGFiYXNlIGNvbm5lY3Rpb24gYWZ0ZXIgY2hlY2staW4gY2xlYW51cCBmYWlsZWRcIiwge2Vycm9yLCBvcmlnaW5hbEVycm9yfSlcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5kcmFpblBlbmRpbmdDaGVja291dHMoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFwiRmFpbGVkIHRvIGRyYWluIHBlbmRpbmcgZGF0YWJhc2UgY2hlY2tvdXRzIGFmdGVyIGNoZWNrLWluIGNsZWFudXAgZmFpbGVkXCIsIHtlcnJvciwgb3JpZ2luYWxFcnJvcn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdW50cmFjayBjb25uZWN0aW9uIGluIHVzZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIENvbm5lY3Rpb24gYmVpbmcgY2hlY2tlZCBpbi5cbiAgICogQHBhcmFtIHtudW1iZXIgfCB1bmRlZmluZWR9IGlkIC0gQ29ubmVjdGlvbiBjaGVja291dCBpZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICB1bnRyYWNrQ29ubmVjdGlvbkluVXNlKGNvbm5lY3Rpb24sIGlkKSB7XG4gICAgaWYgKHR5cGVvZiBpZCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpZFNlcSBvbiBjb25uZWN0aW9uIHdhc24ndCBzZXQ/ICcke3R5cGVvZiBpZH0nID0gJHtpZH1gKVxuICAgIH1cblxuICAgIGRlbGV0ZSB0aGlzLmNvbm5lY3Rpb25zSW5Vc2VbaWRdXG4gICAgY29ubmVjdGlvbi5zZXRJZFNlcSh1bmRlZmluZWQpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYW5kbGUgY2hlY2tlZCBpbiBpZGxlIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIG9uY2UgaWRsZSByZWFwaW5nIGhhcyBiZWVuIHNjaGVkdWxlZCBvciBydW4uXG4gICAqL1xuICBhc3luYyBoYW5kbGVDaGVja2VkSW5JZGxlQ29ubmVjdGlvbigpIHtcbiAgICBpZiAodGhpcy5pZGxlVGltZW91dE1pbGxpcygpID09PSAwKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlYXBJZGxlQ29ubmVjdGlvbnMoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjaGVkdWxlSWRsZUNvbm5lY3Rpb25SZWFwZXIoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNoZWNrb3V0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vYmFzZS5qc1wiKS5Db25uZWN0aW9uQ2hlY2tvdXRPcHRpb25zfSBbb3B0aW9uc10gLSBDaGVja291dCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY2hlY2tvdXQuXG4gICAqL1xuICBhc3luYyBjaGVja291dChvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBkYXRhYmFzZUNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpXG4gICAgY29uc3QgcmV1c2VLZXkgPSB0aGlzLmdldENvbmZpZ3VyYXRpb25SZXVzZUtleSgpXG4gICAgbGV0IGNvbm5lY3Rpb24gPSB0aGlzLnRha2VJZGxlQ29ubmVjdGlvbkZvclJldXNlS2V5KHJldXNlS2V5KVxuXG4gICAgaWYgKGNvbm5lY3Rpb24pIHJldHVybiBhd2FpdCB0aGlzLmFjdGl2YXRlQ29ubmVjdGlvbihjb25uZWN0aW9uLCBvcHRpb25zKVxuXG4gICAgYXdhaXQgdGhpcy5yZWFwSWRsZUNvbm5lY3Rpb25zKClcbiAgICBjb25uZWN0aW9uID0gdGhpcy50YWtlSWRsZUNvbm5lY3Rpb25Gb3JSZXVzZUtleShyZXVzZUtleSlcblxuICAgIGlmIChjb25uZWN0aW9uKSByZXR1cm4gYXdhaXQgdGhpcy5hY3RpdmF0ZUNvbm5lY3Rpb24oY29ubmVjdGlvbiwgb3B0aW9ucylcblxuICAgIGlmICh0aGlzLmNhblNwYXduQ29ubmVjdGlvbigpKSB7XG4gICAgICAvLyBTcGF3biB2aWEgc3Bhd25Db25uZWN0aW9uKCkgc28gdGhlIHRlbmFudC1hd2FyZSBjb25maWd1cmF0aW9uIGlzIHJlc29sdmVkIEZSRVNIIGF0XG4gICAgICAvLyBzcGF3biB0aW1lIGZvciB0aGUgY3VycmVudCBjYWxsZXIuIFJldXNpbmcgdGhlIGRhdGFiYXNlQ29uZmlnIGNhcHR1cmVkIGF0IHRoZSB0b3Agb2ZcbiAgICAgIC8vIGNoZWNrb3V0KCkgY291bGQgYmluZCB0aGUgY29ubmVjdGlvbiB0byBhIHN0YWxlIHRlbmFudC9kYXRhYmFzZSwgd2hpY2ggYnJlYWtzXG4gICAgICAvLyBwZXItcmVxdWVzdCBpc29sYXRpb24gKGUuZy4gdGVzdCB0cnVuY2F0aW9uIGFwcGVhcmluZyBub3QgdG8gdGFrZSBlZmZlY3QpLiBUaGUgcXVldWVkXG4gICAgICAvLyBwYXRoIGJlbG93IGtlZXBzIHRoZSB3YWl0aW5nIGNhbGxlcidzIGNhcHR1cmVkIGNvbmZpZyB2aWEgd2FpdEZvckNoZWNrb3V0KCkuXG4gICAgICBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy5zcGF3bkNvbm5lY3Rpb25Gb3JDaGVja291dCh0aGlzLmdldENvbmZpZ3VyYXRpb24oKSwgdGhpcy5nZXRDb25maWd1cmF0aW9uUmV1c2VLZXkoKSlcblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYWN0aXZhdGVDb25uZWN0aW9uKGNvbm5lY3Rpb24sIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMud2FpdEZvckNoZWNrb3V0KGRhdGFiYXNlQ29uZmlnLCByZXVzZUtleSwgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgb3V0IGEgY29ubmVjdGlvbiBmb3IgYW4gYWxyZWFkeS1yZXNvbHZlZCBwaHlzaWNhbCBjb25maWd1cmF0aW9uXG4gICAqIHdpdGhvdXQgY29uc3VsdGluZyBhbWJpZW50IHRlbmFudCBzdGF0ZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IGRhdGFiYXNlQ29uZmlnIC0gQ2FwdHVyZWQgZGF0YWJhc2UgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jhc2UuanNcIikuQ29ubmVjdGlvbkNoZWNrb3V0T3B0aW9uc30gW29wdGlvbnNdIC0gQ2hlY2tvdXQgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+fSAtIEFjdGl2YXRlZCBwb29sZWQgY29ubmVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGNoZWNrb3V0Rm9yQ29uZmlndXJhdGlvbihkYXRhYmFzZUNvbmZpZywgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgcmV1c2VLZXkgPSB0aGlzLmdldENvbmZpZ3VyYXRpb25SZXVzZUtleShkYXRhYmFzZUNvbmZpZylcbiAgICBjb25zdCBsaWZlY3ljbGVSZXRhaW5lZENvbm5lY3Rpb24gPSB0aGlzLmxpZmVjeWNsZVJldGFpbmVkQ29ubmVjdGlvbnMuZ2V0KHJldXNlS2V5KVxuXG4gICAgaWYgKGxpZmVjeWNsZVJldGFpbmVkQ29ubmVjdGlvbiAmJiBsaWZlY3ljbGVSZXRhaW5lZENvbm5lY3Rpb24uZ2V0SWRTZXEoKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5hY3RpdmF0ZUNvbm5lY3Rpb24obGlmZWN5Y2xlUmV0YWluZWRDb25uZWN0aW9uLCBvcHRpb25zKVxuICAgIH1cblxuICAgIGxldCBjb25uZWN0aW9uID0gdGhpcy50YWtlSWRsZUNvbm5lY3Rpb25Gb3JSZXVzZUtleShyZXVzZUtleSlcblxuICAgIGlmIChjb25uZWN0aW9uKSByZXR1cm4gYXdhaXQgdGhpcy5hY3RpdmF0ZUNvbm5lY3Rpb24oY29ubmVjdGlvbiwgb3B0aW9ucylcblxuICAgIGF3YWl0IHRoaXMucmVhcElkbGVDb25uZWN0aW9ucygpXG4gICAgY29ubmVjdGlvbiA9IHRoaXMudGFrZUlkbGVDb25uZWN0aW9uRm9yUmV1c2VLZXkocmV1c2VLZXkpXG5cbiAgICBpZiAoY29ubmVjdGlvbikgcmV0dXJuIGF3YWl0IHRoaXMuYWN0aXZhdGVDb25uZWN0aW9uKGNvbm5lY3Rpb24sIG9wdGlvbnMpXG5cbiAgICBpZiAodGhpcy5jYW5TcGF3bkNvbm5lY3Rpb24oZGF0YWJhc2VDb25maWcpKSB7XG4gICAgICBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy5zcGF3bkNvbm5lY3Rpb25Gb3JDaGVja291dChkYXRhYmFzZUNvbmZpZywgcmV1c2VLZXkpXG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFjdGl2YXRlQ29ubmVjdGlvbihjb25uZWN0aW9uLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLndhaXRGb3JDaGVja291dChkYXRhYmFzZUNvbmZpZywgcmV1c2VLZXksIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0YWtlIGlkbGUgY29ubmVjdGlvbiBmb3IgcmV1c2Uga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV1c2VLZXkgLSBEYXRhYmFzZSBjb25maWd1cmF0aW9uIHJldXNlIGtleS5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuaW5jbHVkZU9wZW5UcmFuc2FjdGlvbnNdIC0gV2hldGhlciBjb25uZWN0aW9ucyB3aXRoIG9wZW4gdHJhbnNhY3Rpb25zIG1heSBiZSByZXR1cm5lZC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAtIE1hdGNoaW5nIGlkbGUgY29ubmVjdGlvbi5cbiAgICovXG4gIHRha2VJZGxlQ29ubmVjdGlvbkZvclJldXNlS2V5KHJldXNlS2V5LCB7aW5jbHVkZU9wZW5UcmFuc2FjdGlvbnMgPSB0cnVlfSA9IHt9KSB7XG4gICAgY29uc3QgY29ubmVjdGlvbkluZGV4ID0gdGhpcy5jb25uZWN0aW9ucy5maW5kSW5kZXgoKHF1ZXVlZENvbm5lY3Rpb24pID0+IHtcbiAgICAgIGlmICghaW5jbHVkZU9wZW5UcmFuc2FjdGlvbnMgJiYgdGhpcy5jb25uZWN0aW9uSGFzT3BlblRyYW5zYWN0aW9uKHF1ZXVlZENvbm5lY3Rpb24pKSByZXR1cm4gZmFsc2VcblxuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbk1hdGNoZXNSZXVzZUtleShxdWV1ZWRDb25uZWN0aW9uLCByZXVzZUtleSlcbiAgICB9KVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uSW5kZXggPT09IC0xID8gdW5kZWZpbmVkIDogdGhpcy5jb25uZWN0aW9ucy5zcGxpY2UoY29ubmVjdGlvbkluZGV4LCAxKVswXVxuXG4gICAgcmV0dXJuIGNvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbm5lY3Rpb24gbWF0Y2hlcyByZXVzZSBrZXkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBDb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV1c2VLZXkgLSBEYXRhYmFzZSBjb25maWd1cmF0aW9uIHJldXNlIGtleS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgY29ubmVjdGlvbiBtYXRjaGVzIHRoZSByZXVzZSBrZXkuXG4gICAqL1xuICBjb25uZWN0aW9uTWF0Y2hlc1JldXNlS2V5KGNvbm5lY3Rpb24sIHJldXNlS2V5KSB7XG4gICAgY29uc3QgY29ubmVjdGlvbldpdGhQb29sS2V5ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCAmIHtbUE9PTF9DT05GSUdVUkFUSU9OX0tFWV0/OiBzdHJpbmd9fSAqLyAoY29ubmVjdGlvbilcblxuICAgIHJldHVybiBjb25uZWN0aW9uV2l0aFBvb2xLZXlbUE9PTF9DT05GSUdVUkFUSU9OX0tFWV0gPT09IHJldXNlS2V5XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhY3RpdmF0ZSBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gQ29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jhc2UuanNcIikuQ29ubmVjdGlvbkNoZWNrb3V0T3B0aW9uc30gW29wdGlvbnNdIC0gQ2hlY2tvdXQgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+fSAtIEFjdGl2YXRlZCBjb25uZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgYWN0aXZhdGVDb25uZWN0aW9uKGNvbm5lY3Rpb24sIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChjb25uZWN0aW9uLmdldElkU2VxKCkgIT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBDb25uZWN0aW9uIGFscmVhZHkgaGFzIGFuIElELXNlcSAtIGlzIGl0IGluIHVzZT8gJHtjb25uZWN0aW9uLmdldElkU2VxKCl9YClcblxuICAgIGNvbnN0IGlkID0gdGhpcy5pZFNlcSsrXG5cbiAgICBjb25zdCB0cmFja2VkQ29ubmVjdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgJiB7W0NPTk5FQ1RJT05fQ0hFQ0tFRF9PVVRfQVRdPzogbnVtYmVyLCBbSURMRV9DT05ORUNUSU9OX0NIRUNLRURfSU5fQVRdPzogbnVtYmVyfX0gKi8gKGNvbm5lY3Rpb24pXG4gICAgZGVsZXRlIHRyYWNrZWRDb25uZWN0aW9uW0lETEVfQ09OTkVDVElPTl9DSEVDS0VEX0lOX0FUXVxuICAgIHRyYWNrZWRDb25uZWN0aW9uW0NPTk5FQ1RJT05fQ0hFQ0tFRF9PVVRfQVRdID0gRGF0ZS5ub3coKVxuXG4gICAgY29ubmVjdGlvbi5zZXRJZFNlcShpZClcbiAgICB0aGlzLmNvbm5lY3Rpb25zSW5Vc2VbaWRdID0gY29ubmVjdGlvblxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2V0Q29ubmVjdGlvbkNoZWNrb3V0TmFtZShvcHRpb25zLm5hbWUpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmNvbm5lY3Rpb25zSW5Vc2VbaWRdXG4gICAgICBjb25uZWN0aW9uLnNldElkU2VxKHVuZGVmaW5lZClcbiAgICAgIGF3YWl0IHRoaXMuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3Rpb24pXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG1heCBjb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IFtkYXRhYmFzZUNvbmZpZ10gLSBDb25maWd1cmF0aW9uIHdob3NlIHBvb2wgbWF4aW11bSBhcHBsaWVzLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgbnVsbH0gLSBDb25maWd1cmVkIG1heCBsaXZlIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgbWF4Q29ubmVjdGlvbnMoZGF0YWJhc2VDb25maWcgPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKSkge1xuICAgIGNvbnN0IHZhbHVlID0gZGF0YWJhc2VDb25maWcucG9vbD8ubWF4XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBudWxsXG4gICAgaWYgKHRoaXMudmFsaWRNYXhDb25uZWN0aW9ucyh2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gICAgcmV0dXJuIERFRkFVTFRfTUFYX0NPTk5FQ1RJT05TXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjaGVja291dCB0aW1lb3V0IG1pbGxpcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IFtkYXRhYmFzZUNvbmZpZ10gLSBDb25maWd1cmF0aW9uIHdob3NlIHRpbWVvdXQgYXBwbGllcy5cbiAgICogQHJldHVybnMge251bWJlciB8IG51bGx9IC0gUGVuZGluZyBjaGVja291dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgbnVsbCB3aGVuIGRpc2FibGVkLlxuICAgKi9cbiAgY2hlY2tvdXRUaW1lb3V0TWlsbGlzKGRhdGFiYXNlQ29uZmlnID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGFiYXNlQ29uZmlnLnBvb2w/LmNoZWNrb3V0VGltZW91dE1pbGxpc1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gbnVsbFxuICAgIGlmICh0aGlzLnZhbGlkQ2hlY2tvdXRUaW1lb3V0TWlsbGlzKHZhbHVlKSkgcmV0dXJuIHZhbHVlXG5cbiAgICByZXR1cm4gREVGQVVMVF9DSEVDS09VVF9USU1FT1VUX01JTExJU1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdmFsaWQgY2hlY2tvdXQgdGltZW91dCBtaWxsaXMuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gQ2FuZGlkYXRlIGNoZWNrb3V0IHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHt2YWx1ZSBpcyBudW1iZXJ9IC0gV2hldGhlciB0aGUgdmFsdWUgaXMgYSB2YWxpZCB0aW1lb3V0LlxuICAgKi9cbiAgdmFsaWRDaGVja291dFRpbWVvdXRNaWxsaXModmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiYgdmFsdWUgPj0gMFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdmFsaWQgbWF4IGNvbm5lY3Rpb25zLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIENhbmRpZGF0ZSBtYXggY29ubmVjdGlvbiBjb3VudC5cbiAgICogQHJldHVybnMge3ZhbHVlIGlzIG51bWJlcn0gLSBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIG1heCBjb25uZWN0aW9uIGNvdW50LlxuICAgKi9cbiAgdmFsaWRNYXhDb25uZWN0aW9ucyh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSAmJiB2YWx1ZSA+PSAxXG4gIH1cblxuICAvKipcbiAgICogUnVucyBsaXZlIGNvbm5lY3Rpb24gY291bnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gTnVtYmVyIG9mIGxpdmUgYW5kIGluLXByb2dyZXNzIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgbGl2ZUNvbm5lY3Rpb25Db3VudCgpIHtcbiAgICBjb25zdCBjb25uZWN0aW9ucyA9IG5ldyBTZXQoW1xuICAgICAgLi4udGhpcy5jb25uZWN0aW9ucyxcbiAgICAgIC4uLk9iamVjdC52YWx1ZXModGhpcy5jb25uZWN0aW9uc0luVXNlKSxcbiAgICAgIC4uLnRoaXMubGlmZWN5Y2xlUmV0YWluZWRDb25uZWN0aW9ucy52YWx1ZXMoKSxcbiAgICAgIHRoaXMuZ2V0R2xvYmFsQ29ubmVjdGlvbkZvcklkZW50aWZpZXIoKVxuICAgIF0uZmlsdGVyKEJvb2xlYW4pKVxuXG4gICAgcmV0dXJuIGNvbm5lY3Rpb25zLnNpemUgKyB0aGlzLmNvbm5lY3Rpb25zQmVpbmdTcGF3bmVkXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjYW4gc3Bhd24gY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IFtkYXRhYmFzZUNvbmZpZ10gLSBDb25maWd1cmF0aW9uIHdob3NlIHBvb2wgbWF4aW11bSBhcHBsaWVzLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGEgbmV3IGNvbm5lY3Rpb24gY2FuIGJlIHNwYXduZWQuXG4gICAqL1xuICBjYW5TcGF3bkNvbm5lY3Rpb24oZGF0YWJhc2VDb25maWcgPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKSkge1xuICAgIGNvbnN0IG1heENvbm5lY3Rpb25zID0gdGhpcy5tYXhDb25uZWN0aW9ucyhkYXRhYmFzZUNvbmZpZylcblxuICAgIHJldHVybiBtYXhDb25uZWN0aW9ucyA9PT0gbnVsbCB8fCB0aGlzLmxpdmVDb25uZWN0aW9uQ291bnQoKSA8IG1heENvbm5lY3Rpb25zXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzcGF3biBjb25uZWN0aW9uIGZvciBjaGVja291dC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IGRhdGFiYXNlQ29uZmlnIC0gUmVzb2x2ZWQgZGF0YWJhc2UgY29uZmlnIGZvciB0aGUgY2hlY2tvdXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXVzZUtleSAtIERhdGFiYXNlIGNvbmZpZ3VyYXRpb24gcmV1c2Uga2V5IGZvciB0aGUgY2hlY2tvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn0gLSBTcGF3bmVkIGNvbm5lY3Rpb24uXG4gICAqL1xuICBhc3luYyBzcGF3bkNvbm5lY3Rpb25Gb3JDaGVja291dChkYXRhYmFzZUNvbmZpZywgcmV1c2VLZXkpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25zQmVpbmdTcGF3bmVkKytcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy5zcGF3bkNvbm5lY3Rpb25XaXRoQ29uZmlndXJhdGlvbihkYXRhYmFzZUNvbmZpZylcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb25XaXRoUG9vbEtleSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgJiB7W1BPT0xfQ09ORklHVVJBVElPTl9LRVldPzogc3RyaW5nfX0gKi8gKGNvbm5lY3Rpb24pXG5cbiAgICAgIGNvbm5lY3Rpb25XaXRoUG9vbEtleVtQT09MX0NPTkZJR1VSQVRJT05fS0VZXSA9IHJldXNlS2V5XG4gICAgICBjb25uZWN0aW9uLnNldFNjaGVtYUNhY2hlSW52YWxpZGF0b3IoKCkgPT4ge1xuICAgICAgICB0aGlzLmNsZWFyU2NoZW1hQ2FjaGUoKVxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uY2xlYXJTY2hlbWFDYWNoZXNGb3JSZXVzZUtleShyZXVzZUtleSlcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBjb25uZWN0aW9uXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbnNCZWluZ1NwYXduZWQtLVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdhaXQgZm9yIGNoZWNrb3V0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gZGF0YWJhc2VDb25maWcgLSBSZXNvbHZlZCBkYXRhYmFzZSBjb25maWcgZm9yIHRoZSBjaGVja291dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJldXNlS2V5IC0gRGF0YWJhc2UgY29uZmlndXJhdGlvbiByZXVzZSBrZXkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLkNvbm5lY3Rpb25DaGVja291dE9wdGlvbnN9IFtvcHRpb25zXSAtIENoZWNrb3V0IG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn0gLSBSZXNvbHZlcyB3aXRoIGFuIGFjdGl2YXRlZCBjb25uZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgd2FpdEZvckNoZWNrb3V0KGRhdGFiYXNlQ29uZmlnLCByZXVzZUtleSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGVucXVldWVkQXQgPSBEYXRlLm5vdygpXG4gICAgICBjb25zdCB0aW1lb3V0TWlsbGlzID0gdGhpcy5jaGVja291dFRpbWVvdXRNaWxsaXMoZGF0YWJhc2VDb25maWcpXG4gICAgICAvKiogQHR5cGUge1BlbmRpbmdDaGVja291dH0gKi9cbiAgICAgIGNvbnN0IGNoZWNrb3V0ID0ge1xuICAgICAgICBkYXRhYmFzZUNvbmZpZyxcbiAgICAgICAgZW5xdWV1ZWRBdCxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgcmVqZWN0LFxuICAgICAgICByZXNvbHZlLFxuICAgICAgICByZXVzZUtleSxcbiAgICAgICAgdGltZW91dEF0OiB0aW1lb3V0TWlsbGlzID09PSBudWxsID8gbnVsbCA6IGVucXVldWVkQXQgKyB0aW1lb3V0TWlsbGlzLFxuICAgICAgICB0aW1lb3V0TWlsbGlzLFxuICAgICAgICB0aW1lb3V0VGltZXI6IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICBjaGVja291dC50aW1lb3V0VGltZXIgPSB0aGlzLnN0YXJ0UGVuZGluZ0NoZWNrb3V0VGltZW91dChjaGVja291dClcbiAgICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0cy5wdXNoKGNoZWNrb3V0KVxuICAgICAgdm9pZCB0aGlzLmRyYWluUGVuZGluZ0NoZWNrb3V0cygpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zdCBjaGVja291dEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFwiRmFpbGVkIHRvIGRyYWluIHBlbmRpbmcgZGF0YWJhc2UgY29ubmVjdGlvbiBjaGVja291dHMuXCIsIHtjYXVzZTogZXJyb3J9KVxuXG4gICAgICAgIHRoaXMucmVqZWN0UGVuZGluZ0NoZWNrb3V0cyhjaGVja291dEVycm9yKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZHJhaW4gcGVuZGluZyBjaGVja291dHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gcGVuZGluZyBjaGVja291dHMgaGF2ZSBiZWVuIGRyYWluZWQgYXMgZmFyIGFzIHBvc3NpYmxlLlxuICAgKi9cbiAgYXN5bmMgZHJhaW5QZW5kaW5nQ2hlY2tvdXRzKCkge1xuICAgIGlmICh0aGlzLnBlbmRpbmdDaGVja291dERyYWluUHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5wZW5kaW5nQ2hlY2tvdXREcmFpblByb21pc2VcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0RHJhaW5Qcm9taXNlID0gdGhpcy5kcmFpblBlbmRpbmdDaGVja291dHNBY3R1YWwoKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucGVuZGluZ0NoZWNrb3V0RHJhaW5Qcm9taXNlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0RHJhaW5Qcm9taXNlID0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZHJhaW4gcGVuZGluZyBjaGVja291dHMgYWN0dWFsLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHBlbmRpbmcgY2hlY2tvdXRzIGhhdmUgYmVlbiBkcmFpbmVkIGFzIGZhciBhcyBwb3NzaWJsZS5cbiAgICovXG4gIGFzeW5jIGRyYWluUGVuZGluZ0NoZWNrb3V0c0FjdHVhbCgpIHtcbiAgICB3aGlsZSAodGhpcy5wZW5kaW5nQ2hlY2tvdXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnJlc29sdmVQZW5kaW5nQ2hlY2tvdXRXaXRoTWF0Y2hpbmdJZGxlQ29ubmVjdGlvbigpKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBjaGVja291dCA9IHRoaXMucGVuZGluZ0NoZWNrb3V0c1swXVxuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5jbG9zZUlkbGVDb25uZWN0aW9uRm9yUGVuZGluZ0NoZWNrb3V0Q2FwYWNpdHkoY2hlY2tvdXQpKSBjb250aW51ZVxuICAgICAgaWYgKCF0aGlzLnBlbmRpbmdDaGVja291dHMuaW5jbHVkZXMoY2hlY2tvdXQpKSBjb250aW51ZVxuICAgICAgaWYgKHRoaXMuY2FuU3Bhd25Db25uZWN0aW9uKGNoZWNrb3V0LmRhdGFiYXNlQ29uZmlnKSkge1xuICAgICAgICB0aGlzLnJlbW92ZVBlbmRpbmdDaGVja291dEF0KDApXG4gICAgICAgIGF3YWl0IHRoaXMuc3Bhd25BbmRSZXNvbHZlUGVuZGluZ0NoZWNrb3V0KGNoZWNrb3V0KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWFwZWRDb25uZWN0aW9uID0gYXdhaXQgdGhpcy5pZGxlQ29ubmVjdGlvbkZvclBlbmRpbmdDaGVja291dChjaGVja291dClcblxuICAgICAgaWYgKCF0aGlzLnBlbmRpbmdDaGVja291dHMuaW5jbHVkZXMoY2hlY2tvdXQpKSBjb250aW51ZVxuICAgICAgaWYgKCFyZWFwZWRDb25uZWN0aW9uKSByZXR1cm5cblxuICAgICAgdGhpcy5yZW1vdmVQZW5kaW5nQ2hlY2tvdXRBdCgwKVxuICAgICAgYXdhaXQgdGhpcy5yZXNvbHZlUGVuZGluZ0NoZWNrb3V0KGNoZWNrb3V0LCByZWFwZWRDb25uZWN0aW9uKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc29sdmUgcGVuZGluZyBjaGVja291dCB3aXRoIG1hdGNoaW5nIGlkbGUgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciBhIHBlbmRpbmcgY2hlY2tvdXQgd2FzIHJlc29sdmVkIHdpdGggYW4gaWRsZSBjb25uZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZVBlbmRpbmdDaGVja291dFdpdGhNYXRjaGluZ0lkbGVDb25uZWN0aW9uKCkge1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnBlbmRpbmdDaGVja291dHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBjaGVja291dCA9IHRoaXMucGVuZGluZ0NoZWNrb3V0c1tpbmRleF1cbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLnRha2VJZGxlQ29ubmVjdGlvbkZvclJldXNlS2V5KGNoZWNrb3V0LnJldXNlS2V5LCB7aW5jbHVkZU9wZW5UcmFuc2FjdGlvbnM6IGZhbHNlfSlcblxuICAgICAgaWYgKCFjb25uZWN0aW9uKSBjb250aW51ZVxuXG4gICAgICB0aGlzLnJlbW92ZVBlbmRpbmdDaGVja291dEF0KGluZGV4KVxuICAgICAgYXdhaXQgdGhpcy5yZXNvbHZlUGVuZGluZ0NoZWNrb3V0KGNoZWNrb3V0LCBjb25uZWN0aW9uKVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVtb3ZlIHBlbmRpbmcgY2hlY2tvdXQgYXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFBlbmRpbmcgY2hlY2tvdXQgaW5kZXguXG4gICAqIEByZXR1cm5zIHtQZW5kaW5nQ2hlY2tvdXR9IC0gUmVtb3ZlZCBjaGVja291dC5cbiAgICovXG4gIHJlbW92ZVBlbmRpbmdDaGVja291dEF0KGluZGV4KSB7XG4gICAgY29uc3QgY2hlY2tvdXQgPSB0aGlzLnBlbmRpbmdDaGVja291dHMuc3BsaWNlKGluZGV4LCAxKVswXVxuXG4gICAgdGhpcy5jbGVhclBlbmRpbmdDaGVja291dFRpbWVvdXQoY2hlY2tvdXQpXG5cbiAgICByZXR1cm4gY2hlY2tvdXRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHN0YXJ0IHBlbmRpbmcgY2hlY2tvdXQgdGltZW91dC5cbiAgICogQHBhcmFtIHtQZW5kaW5nQ2hlY2tvdXR9IGNoZWNrb3V0IC0gUGVuZGluZyBjaGVja291dCB0byB0aW1lIG91dC5cbiAgICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkfSAtIFRpbWVyLCBpZiB0aW1lb3V0IGlzIGVuYWJsZWQuXG4gICAqL1xuICBzdGFydFBlbmRpbmdDaGVja291dFRpbWVvdXQoY2hlY2tvdXQpIHtcbiAgICBpZiAoY2hlY2tvdXQudGltZW91dE1pbGxpcyA9PT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudGltZW91dFBlbmRpbmdDaGVja291dChjaGVja291dClcbiAgICB9LCBjaGVja291dC50aW1lb3V0TWlsbGlzKVxuXG4gICAgcmV0dXJuIHRpbWVyXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0aW1lb3V0IHBlbmRpbmcgY2hlY2tvdXQuXG4gICAqIEBwYXJhbSB7UGVuZGluZ0NoZWNrb3V0fSBjaGVja291dCAtIFBlbmRpbmcgY2hlY2tvdXQgdG8gcmVqZWN0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHRpbWVvdXRQZW5kaW5nQ2hlY2tvdXQoY2hlY2tvdXQpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMucGVuZGluZ0NoZWNrb3V0cy5pbmRleE9mKGNoZWNrb3V0KVxuXG4gICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuXG5cbiAgICB0aGlzLnJlbW92ZVBlbmRpbmdDaGVja291dEF0KGluZGV4KVxuICAgIGNoZWNrb3V0LnJlamVjdCh0aGlzLnBlbmRpbmdDaGVja291dFRpbWVvdXRFcnJvcihjaGVja291dCkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwZW5kaW5nIGNoZWNrb3V0IHRpbWVvdXQgZXJyb3IuXG4gICAqIEBwYXJhbSB7UGVuZGluZ0NoZWNrb3V0fSBjaGVja291dCAtIFRpbWVkLW91dCBjaGVja291dC5cbiAgICogQHJldHVybnMge0Vycm9yfSAtIFRpbWVvdXQgZXJyb3IuXG4gICAqL1xuICBwZW5kaW5nQ2hlY2tvdXRUaW1lb3V0RXJyb3IoY2hlY2tvdXQpIHtcbiAgICBjb25zdCBjaGVja291dE5hbWUgPSBjaGVja291dC5vcHRpb25zLm5hbWUgPyBgIENoZWNrb3V0IG5hbWU6ICR7SlNPTi5zdHJpbmdpZnkoY2hlY2tvdXQub3B0aW9ucy5uYW1lKX0uYCA6IFwiXCJcbiAgICBjb25zdCBkaWFnbm9zdGljcyA9IHRoaXMucGVuZGluZ0NoZWNrb3V0VGltZW91dERpYWdub3N0aWNzKGNoZWNrb3V0KVxuXG4gICAgcmV0dXJuIG5ldyBFcnJvcihgVGltZWQgb3V0IGFmdGVyICR7Y2hlY2tvdXQudGltZW91dE1pbGxpc31tcyB3YWl0aW5nIGZvciBkYXRhYmFzZSBjb25uZWN0aW9uIGNoZWNrb3V0IGZyb20gcG9vbCBcIiR7dGhpcy5pZGVudGlmaWVyfVwiLiR7Y2hlY2tvdXROYW1lfSAke2RpYWdub3N0aWNzfWApXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHNhbml0aXplZCBkaWFnbm9zdGljcyBmb3IgYSBjaGVja291dCB0aW1lb3V0LlxuICAgKiBAcGFyYW0ge1BlbmRpbmdDaGVja291dH0gY2hlY2tvdXQgLSBUaW1lZC1vdXQgY2hlY2tvdXQuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUG9vbCBzdGF0ZSBzdW1tYXJ5LlxuICAgKi9cbiAgcGVuZGluZ0NoZWNrb3V0VGltZW91dERpYWdub3N0aWNzKGNoZWNrb3V0KSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLmdldERlYnVnU25hcHNob3QoKVxuICAgIGNvbnN0IGNvbm5lY3Rpb25TdW1tYXJpZXMgPSBzbmFwc2hvdC5jb25uZWN0aW9uc1xuICAgICAgLm1hcCgoY29ubmVjdGlvbikgPT4gdGhpcy5wZW5kaW5nQ2hlY2tvdXRUaW1lb3V0Q29ubmVjdGlvblN1bW1hcnkoY29ubmVjdGlvbikpXG4gICAgICAuam9pbihcIiwgXCIpXG4gICAgY29uc3QgcGVuZGluZ1N1bW1hcmllcyA9IChzbmFwc2hvdC5wZW5kaW5nQ2hlY2tvdXRzIHx8IFtdKVxuICAgICAgLm1hcCgocGVuZGluZ0NoZWNrb3V0KSA9PiB0aGlzLnBlbmRpbmdDaGVja291dFRpbWVvdXRQZW5kaW5nU3VtbWFyeShwZW5kaW5nQ2hlY2tvdXQpKVxuICAgICAgLmpvaW4oXCIsIFwiKVxuICAgIGNvbnN0IHdhaXRlZEZvck1zID0gTWF0aC5tYXgoMCwgRGF0ZS5ub3coKSAtIGNoZWNrb3V0LmVucXVldWVkQXQpXG5cbiAgICByZXR1cm4gYFBvb2wgc3RhdGU6IG1heD0ke3RoaXMubWF4Q29ubmVjdGlvbnMoKSA/PyBcInVuYm91bmRlZFwifSwgaW5Vc2U9JHtzbmFwc2hvdC5pblVzZUNvdW50fSwgaWRsZT0ke3NuYXBzaG90LmlkbGVDb3VudH0sIHBlbmRpbmc9JHtzbmFwc2hvdC5wZW5kaW5nQ2hlY2tvdXRDb3VudH0sIHNwYXduaW5nPSR7c25hcHNob3QuY29ubmVjdGlvbnNCZWluZ1NwYXduZWR9LCB0aW1lZE91dFdhaXRpbmdGb3JNcz0ke3dhaXRlZEZvck1zfSwgaG9sZGVycz1bJHtjb25uZWN0aW9uU3VtbWFyaWVzfV0sIHdhaXRpbmc9WyR7cGVuZGluZ1N1bW1hcmllc31dLmBcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzYW5pdGl6ZWQgY29ubmVjdGlvbiBzdW1tYXJ5IGZvciBjaGVja291dCB0aW1lb3V0IGRpYWdub3N0aWNzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gY29ubmVjdGlvbiAtIENvbm5lY3Rpb24gZGVidWcgc25hcHNob3QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU2FuaXRpemVkIGNvbm5lY3Rpb24gc3RhdGUuXG4gICAqL1xuICBwZW5kaW5nQ2hlY2tvdXRUaW1lb3V0Q29ubmVjdGlvblN1bW1hcnkoY29ubmVjdGlvbikge1xuICAgIGNvbnN0IHBhcnRzID0gW2BzdGF0ZT0ke2Nvbm5lY3Rpb24uc3RhdGV9YF1cblxuICAgIGlmIChjb25uZWN0aW9uLmNoZWNrb3V0TmFtZSkgcGFydHMucHVzaChgY2hlY2tvdXQ9JHtKU09OLnN0cmluZ2lmeShjb25uZWN0aW9uLmNoZWNrb3V0TmFtZSl9YClcbiAgICBpZiAodHlwZW9mIGNvbm5lY3Rpb24uY2hlY2tlZE91dEZvck1zID09PSBcIm51bWJlclwiKSBwYXJ0cy5wdXNoKGBjaGVja2VkT3V0Rm9yTXM9JHtjb25uZWN0aW9uLmNoZWNrZWRPdXRGb3JNc31gKVxuICAgIGlmICh0eXBlb2YgY29ubmVjdGlvbi5pZGxlRm9yTXMgPT09IFwibnVtYmVyXCIpIHBhcnRzLnB1c2goYGlkbGVGb3JNcz0ke2Nvbm5lY3Rpb24uaWRsZUZvck1zfWApXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uLm9wZW5UcmFuc2FjdGlvbnMgPT09IFwibnVtYmVyXCIpIHBhcnRzLnB1c2goYG9wZW5UcmFuc2FjdGlvbnM9JHtjb25uZWN0aW9uLm9wZW5UcmFuc2FjdGlvbnN9YClcblxuICAgIGNvbnN0IGFjdGl2ZVF1ZXJ5ID0gY29ubmVjdGlvbi5hY3RpdmVRdWVyeVxuXG4gICAgaWYgKGFjdGl2ZVF1ZXJ5ICYmIHR5cGVvZiBhY3RpdmVRdWVyeSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShhY3RpdmVRdWVyeSkpIHtcbiAgICAgIGNvbnN0IHJ1bm5pbmdNcyA9ICgvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKGFjdGl2ZVF1ZXJ5KSkucnVubmluZ01zXG5cbiAgICAgIGlmICh0eXBlb2YgcnVubmluZ01zID09PSBcIm51bWJlclwiKSBwYXJ0cy5wdXNoKGBhY3RpdmVRdWVyeU1zPSR7cnVubmluZ01zfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGB7JHtwYXJ0cy5qb2luKFwiIFwiKX19YFxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNhbml0aXplZCBwZW5kaW5nIGNoZWNrb3V0IHN1bW1hcnkgZm9yIGNoZWNrb3V0IHRpbWVvdXQgZGlhZ25vc3RpY3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLkRhdGFiYXNlUG9vbFBlbmRpbmdDaGVja291dERlYnVnU25hcHNob3R9IHBlbmRpbmdDaGVja291dCAtIFdhaXRpbmcgY2hlY2tvdXQgc25hcHNob3QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU2FuaXRpemVkIHBlbmRpbmcgY2hlY2tvdXQgc3RhdGUuXG4gICAqL1xuICBwZW5kaW5nQ2hlY2tvdXRUaW1lb3V0UGVuZGluZ1N1bW1hcnkocGVuZGluZ0NoZWNrb3V0KSB7XG4gICAgY29uc3QgcGFydHMgPSBbYGluZGV4PSR7cGVuZGluZ0NoZWNrb3V0LmluZGV4fWAsIGB3YWl0aW5nRm9yTXM9JHtwZW5kaW5nQ2hlY2tvdXQud2FpdGluZ0Zvck1zfWBdXG5cbiAgICBpZiAocGVuZGluZ0NoZWNrb3V0LmNoZWNrb3V0TmFtZSkgcGFydHMucHVzaChgY2hlY2tvdXQ9JHtKU09OLnN0cmluZ2lmeShwZW5kaW5nQ2hlY2tvdXQuY2hlY2tvdXROYW1lKX1gKVxuICAgIGlmIChwZW5kaW5nQ2hlY2tvdXQucmVtYWluaW5nVGltZW91dE1zICE9PSBudWxsKSBwYXJ0cy5wdXNoKGByZW1haW5pbmdUaW1lb3V0TXM9JHtwZW5kaW5nQ2hlY2tvdXQucmVtYWluaW5nVGltZW91dE1zfWApXG5cbiAgICByZXR1cm4gYHske3BhcnRzLmpvaW4oXCIgXCIpfX1gXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGVhciBwZW5kaW5nIGNoZWNrb3V0IHRpbWVvdXQuXG4gICAqIEBwYXJhbSB7UGVuZGluZ0NoZWNrb3V0fSBjaGVja291dCAtIFBlbmRpbmcgY2hlY2tvdXQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgY2xlYXJQZW5kaW5nQ2hlY2tvdXRUaW1lb3V0KGNoZWNrb3V0KSB7XG4gICAgaWYgKCFjaGVja291dC50aW1lb3V0VGltZXIpIHJldHVyblxuXG4gICAgY2xlYXJUaW1lb3V0KGNoZWNrb3V0LnRpbWVvdXRUaW1lcilcbiAgICBjaGVja291dC50aW1lb3V0VGltZXIgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsb3NlIGlkbGUgY29ubmVjdGlvbiBmb3IgcGVuZGluZyBjaGVja291dCBjYXBhY2l0eS5cbiAgICogQHBhcmFtIHtQZW5kaW5nQ2hlY2tvdXR9IGNoZWNrb3V0IC0gQ2hlY2tvdXQgd2FpdGluZyBmb3IgYSBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIGFuIGlkbGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIHRvIGZyZWUgY2FwYWNpdHkuXG4gICAqL1xuICBhc3luYyBjbG9zZUlkbGVDb25uZWN0aW9uRm9yUGVuZGluZ0NoZWNrb3V0Q2FwYWNpdHkoY2hlY2tvdXQpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5maW5kSWRsZUNvbm5lY3Rpb25Gb3JSZXVzZUtleShjaGVja291dC5yZXVzZUtleSlcblxuICAgIGlmIChjb25uZWN0aW9uKSByZXR1cm4gZmFsc2VcblxuICAgIGF3YWl0IHRoaXMucmVhcElkbGVDb25uZWN0aW9ucygpXG5cbiAgICBpZiAodGhpcy5maW5kSWRsZUNvbm5lY3Rpb25Gb3JSZXVzZUtleShjaGVja291dC5yZXVzZUtleSkpIHJldHVybiBmYWxzZVxuXG4gICAgcmV0dXJuIHRoaXMuY2FuU3Bhd25Db25uZWN0aW9uKGNoZWNrb3V0LmRhdGFiYXNlQ29uZmlnKSA/IGZhbHNlIDogYXdhaXQgdGhpcy5jbG9zZU9uZUlkbGVDb25uZWN0aW9uRm9yQ2FwYWNpdHkoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmluZCBpZGxlIGNvbm5lY3Rpb24gZm9yIHJldXNlIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJldXNlS2V5IC0gRGF0YWJhc2UgY29uZmlndXJhdGlvbiByZXVzZSBrZXkuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gLSBNYXRjaGluZyBpZGxlIGNvbm5lY3Rpb24sIGlmIHByZXNlbnQuXG4gICAqL1xuICBmaW5kSWRsZUNvbm5lY3Rpb25Gb3JSZXVzZUtleShyZXVzZUtleSkge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25zLmZpbmQoKGNvbm5lY3Rpb24pID0+ICF0aGlzLmNvbm5lY3Rpb25IYXNPcGVuVHJhbnNhY3Rpb24oY29ubmVjdGlvbikgJiYgdGhpcy5jb25uZWN0aW9uTWF0Y2hlc1JldXNlS2V5KGNvbm5lY3Rpb24sIHJldXNlS2V5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlkbGUgY29ubmVjdGlvbiBmb3IgcGVuZGluZyBjaGVja291dC5cbiAgICogQHBhcmFtIHtQZW5kaW5nQ2hlY2tvdXR9IGNoZWNrb3V0IC0gQ2hlY2tvdXQgd2FpdGluZyBmb3IgYSBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZD59IC0gTWF0Y2hpbmcgaWRsZSBjb25uZWN0aW9uLCBpZiBvbmUgY2FuIGJlIHJldXNlZC5cbiAgICovXG4gIGFzeW5jIGlkbGVDb25uZWN0aW9uRm9yUGVuZGluZ0NoZWNrb3V0KGNoZWNrb3V0KSB7XG4gICAgbGV0IGNvbm5lY3Rpb24gPSB0aGlzLnRha2VJZGxlQ29ubmVjdGlvbkZvclJldXNlS2V5KGNoZWNrb3V0LnJldXNlS2V5LCB7aW5jbHVkZU9wZW5UcmFuc2FjdGlvbnM6IGZhbHNlfSlcblxuICAgIGlmIChjb25uZWN0aW9uKSByZXR1cm4gY29ubmVjdGlvblxuXG4gICAgYXdhaXQgdGhpcy5yZWFwSWRsZUNvbm5lY3Rpb25zKClcbiAgICBpZiAoIXRoaXMucGVuZGluZ0NoZWNrb3V0cy5pbmNsdWRlcyhjaGVja291dCkpIHJldHVyblxuXG4gICAgY29ubmVjdGlvbiA9IHRoaXMudGFrZUlkbGVDb25uZWN0aW9uRm9yUmV1c2VLZXkoY2hlY2tvdXQucmV1c2VLZXksIHtpbmNsdWRlT3BlblRyYW5zYWN0aW9uczogZmFsc2V9KVxuXG4gICAgcmV0dXJuIGNvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNwYXduIGFuZCByZXNvbHZlIHBlbmRpbmcgY2hlY2tvdXQuXG4gICAqIEBwYXJhbSB7UGVuZGluZ0NoZWNrb3V0fSBjaGVja291dCAtIENoZWNrb3V0IHJlcXVlc3QgdG8gcmVzb2x2ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0aGUgY2hlY2tvdXQgaGFzIGJlZW4gaGFuZGxlZC5cbiAgICovXG4gIGFzeW5jIHNwYXduQW5kUmVzb2x2ZVBlbmRpbmdDaGVja291dChjaGVja291dCkge1xuICAgIGxldCBjb25uZWN0aW9uXG5cbiAgICB0cnkge1xuICAgICAgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuc3Bhd25Db25uZWN0aW9uRm9yQ2hlY2tvdXQoY2hlY2tvdXQuZGF0YWJhc2VDb25maWcsIGNoZWNrb3V0LnJldXNlS2V5KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjaGVja291dC5yZWplY3QoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFwiRmFpbGVkIHRvIHNwYXduIGRhdGFiYXNlIGNvbm5lY3Rpb24uXCIsIHtjYXVzZTogZXJyb3J9KSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucmVzb2x2ZVBlbmRpbmdDaGVja291dChjaGVja291dCwgY29ubmVjdGlvbilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc29sdmUgcGVuZGluZyBjaGVja291dC5cbiAgICogQHBhcmFtIHtQZW5kaW5nQ2hlY2tvdXR9IGNoZWNrb3V0IC0gQ2hlY2tvdXQgcmVxdWVzdCB0byByZXNvbHZlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gQ29ubmVjdGlvbiB0byBhY3RpdmF0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0aGUgY2hlY2tvdXQgaGFzIGJlZW4gaGFuZGxlZC5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVQZW5kaW5nQ2hlY2tvdXQoY2hlY2tvdXQsIGNvbm5lY3Rpb24pIHtcbiAgICB0cnkge1xuICAgICAgY2hlY2tvdXQucmVzb2x2ZShhd2FpdCB0aGlzLmFjdGl2YXRlQ29ubmVjdGlvbihjb25uZWN0aW9uLCBjaGVja291dC5vcHRpb25zKSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2hlY2tvdXQucmVqZWN0KGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihcIkZhaWxlZCB0byBhY3RpdmF0ZSBkYXRhYmFzZSBjb25uZWN0aW9uLlwiLCB7Y2F1c2U6IGVycm9yfSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xvc2Ugb25lIGlkbGUgY29ubmVjdGlvbiBmb3IgY2FwYWNpdHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgYW4gaWRsZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgdG8gZnJlZSBjYXBhY2l0eS5cbiAgICovXG4gIGFzeW5jIGNsb3NlT25lSWRsZUNvbm5lY3Rpb25Gb3JDYXBhY2l0eSgpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9ucy5maW5kKChjYW5kaWRhdGUpID0+ICF0aGlzLmNvbm5lY3Rpb25IYXNPcGVuVHJhbnNhY3Rpb24oY2FuZGlkYXRlKSlcblxuICAgIGlmICghY29ubmVjdGlvbikgcmV0dXJuIGZhbHNlXG5cbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5jb25uZWN0aW9ucy5maWx0ZXIoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlICE9PSBjb25uZWN0aW9uKVxuICAgIGF3YWl0IHRoaXMuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3Rpb24pXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd2l0aCBjb25uZWN0aW9uLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vYmFzZS5qc1wiKS5Db25uZWN0aW9uQ2hlY2tvdXRPcHRpb25zIHwgKChhcmc6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0KSA9PiBQcm9taXNlPFQ+KX0gb3B0aW9uc09yQ2FsbGJhY2sgLSBDaGVja291dCBvcHRpb25zIG9yIGNhbGxiYWNrIHRvIGludm9rZSB3aXRoIHRoZSBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0geyhhcmc6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0KSA9PiBQcm9taXNlPFQ+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgdG8gaW52b2tlIHdpdGggdGhlIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIFJlc29sdmVzIHdpdGggdGhlIGNhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhDb25uZWN0aW9uKG9wdGlvbnNPckNhbGxiYWNrLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9uc09yQ2FsbGJhY2sgPT0gXCJmdW5jdGlvblwiID8ge30gOiBvcHRpb25zT3JDYWxsYmFja1xuICAgIGNvbnN0IGFjdHVhbENhbGxiYWNrID0gdHlwZW9mIG9wdGlvbnNPckNhbGxiYWNrID09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnNPckNhbGxiYWNrIDogY2FsbGJhY2tcblxuICAgIGlmICghYWN0dWFsQ2FsbGJhY2spIHRocm93IG5ldyBFcnJvcihcIndpdGhDb25uZWN0aW9uIHJlcXVpcmVzIGEgY2FsbGJhY2tcIilcblxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBhd2FpdCB0aGlzLmNoZWNrb3V0KG9wdGlvbnMpXG4gICAgY29uc3QgaWQgPSBjb25uZWN0aW9uLmdldElkU2VxKClcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bihpZCwgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGFjdHVhbENhbGxiYWNrKGNvbm5lY3Rpb24pXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNraW4oY29ubmVjdGlvbilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgb3BlbkNhcHR1cmVkQ29ubmVjdGlvbigvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gKi8gZGF0YWJhc2VDb25maWd1cmF0aW9uKSB7XG4gICAgY29uc3QgcmV1c2VLZXkgPSB0aGlzLmdldENvbmZpZ3VyYXRpb25SZXVzZUtleShkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgY29uc3Qgd2FzUmV0YWluZWQgPSB0aGlzLmxpZmVjeWNsZVJldGFpbmVkUmV1c2VLZXlzLmhhcyhyZXVzZUtleSlcblxuICAgIHRoaXMubGlmZWN5Y2xlUmV0YWluZWRSZXVzZUtleXMuYWRkKHJldXNlS2V5KVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy5jaGVja291dEZvckNvbmZpZ3VyYXRpb24oZGF0YWJhc2VDb25maWd1cmF0aW9uLCB7bmFtZTogXCJGcm9udGVuZCB0ZW5hbnQgU1FMaXRlIG9wZW5cIn0pXG4gICAgICBhd2FpdCB0aGlzLmNoZWNraW4oY29ubmVjdGlvbilcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCF3YXNSZXRhaW5lZCkgdGhpcy5saWZlY3ljbGVSZXRhaW5lZFJldXNlS2V5cy5kZWxldGUocmV1c2VLZXkpXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZsdXNoQ2FwdHVyZWRDb25uZWN0aW9uKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAqLyBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCByZXVzZUtleSA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5saWZlY3ljbGVSZXRhaW5lZENvbm5lY3Rpb25zLmdldChyZXVzZUtleSlcbiAgICAgIHx8IHRoaXMuY29ubmVjdGlvbnMuZmluZCgoY2FuZGlkYXRlKSA9PiB0aGlzLmdldENvbm5lY3Rpb25Db25maWd1cmF0aW9uUmV1c2VLZXkoY2FuZGlkYXRlKSA9PT0gcmV1c2VLZXkpXG4gICAgaWYgKGNvbm5lY3Rpb24pIGF3YWl0IGNvbm5lY3Rpb24uZmx1c2hQZW5kaW5nV3JpdGVzKClcbiAgfVxuXG4gIGFzeW5jIGNsb3NlQ2FwdHVyZWRDb25uZWN0aW9uKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAqLyBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCByZXVzZUtleSA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICBpZiAodGhpcy5jYXB0dXJlZENvbm5lY3Rpb25JblVzZShkYXRhYmFzZUNvbmZpZ3VyYXRpb24pKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY2xvc2UgYW4gaW4tdXNlIGZyb250ZW5kIHRlbmFudCBTUUxpdGUgaGFuZGxlXCIpXG4gICAgY29uc3QgcmV0YWluZWRDb25uZWN0aW9uID0gdGhpcy5saWZlY3ljbGVSZXRhaW5lZENvbm5lY3Rpb25zLmdldChyZXVzZUtleSlcbiAgICB0aGlzLmxpZmVjeWNsZVJldGFpbmVkUmV1c2VLZXlzLmRlbGV0ZShyZXVzZUtleSlcbiAgICB0aGlzLmxpZmVjeWNsZVJldGFpbmVkQ29ubmVjdGlvbnMuZGVsZXRlKHJldXNlS2V5KVxuICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gdGhpcy5jb25uZWN0aW9ucy5maWx0ZXIoKGNhbmRpZGF0ZSkgPT4gdGhpcy5nZXRDb25uZWN0aW9uQ29uZmlndXJhdGlvblJldXNlS2V5KGNhbmRpZGF0ZSkgPT09IHJldXNlS2V5KVxuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmNvbm5lY3Rpb25zLmZpbHRlcigoY2FuZGlkYXRlKSA9PiB0aGlzLmdldENvbm5lY3Rpb25Db25maWd1cmF0aW9uUmV1c2VLZXkoY2FuZGlkYXRlKSAhPT0gcmV1c2VLZXkpXG4gICAgaWYgKHJldGFpbmVkQ29ubmVjdGlvbikgY29ubmVjdGlvbnMucHVzaChyZXRhaW5lZENvbm5lY3Rpb24pXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGNvbm5lY3Rpb25zKSBhd2FpdCB0aGlzLmNsb3NlQ29ubmVjdGlvbihjb25uZWN0aW9uKVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlQ2FwdHVyZWREYXRhYmFzZSgvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gKi8gZGF0YWJhc2VDb25maWd1cmF0aW9uKSB7XG4gICAgYXdhaXQgdGhpcy5jbG9zZUNhcHR1cmVkQ29ubmVjdGlvbihkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgY29uc3QgRHJpdmVyQ2xhc3MgPSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24uZHJpdmVyIHx8IHRoaXMuZHJpdmVyQ2xhc3NcbiAgICBpZiAoIURyaXZlckNsYXNzKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBkcml2ZXIgY2xhc3MgY29uZmlndXJlZCBmb3IgZnJvbnRlbmQgdGVuYW50IFNRTGl0ZSBkZWxldGlvblwiKVxuICAgIGF3YWl0IG5ldyBEcml2ZXJDbGFzcyhkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIHRoaXMuY29uZmlndXJhdGlvbikuZGVsZXRlRGF0YWJhc2VTdG9yYWdlKClcbiAgfVxuXG4gIGNhcHR1cmVkQ29ubmVjdGlvbkluVXNlKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAqLyBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCByZXVzZUtleSA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmNvbm5lY3Rpb25zSW5Vc2UpLnNvbWUoKGNvbm5lY3Rpb24pID0+IHRoaXMuZ2V0Q29ubmVjdGlvbkNvbmZpZ3VyYXRpb25SZXVzZUtleShjb25uZWN0aW9uKSA9PT0gcmV1c2VLZXkpXG4gIH1cblxuICBjYXB0dXJlZENvbm5lY3Rpb25IYXNQZW5kaW5nV3JpdGVzKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAqLyBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCByZXVzZUtleSA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICBjb25zdCBjb25uZWN0aW9ucyA9IFsuLi50aGlzLmNvbm5lY3Rpb25zLCAuLi5PYmplY3QudmFsdWVzKHRoaXMuY29ubmVjdGlvbnNJblVzZSksIC4uLnRoaXMubGlmZWN5Y2xlUmV0YWluZWRDb25uZWN0aW9ucy52YWx1ZXMoKV1cbiAgICByZXR1cm4gY29ubmVjdGlvbnMuc29tZSgoY29ubmVjdGlvbikgPT4gdGhpcy5nZXRDb25uZWN0aW9uQ29uZmlndXJhdGlvblJldXNlS2V5KGNvbm5lY3Rpb24pID09PSByZXVzZUtleSAmJiBjb25uZWN0aW9uLmhhc1BlbmRpbmdXcml0ZXMoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgY2FwdHVyZWQgb3BlcmF0aW9uIHRocm91Z2ggdGhlIG5vcm1hbCBib3VuZGVkIHBvb2wgbGlmZWN5Y2xlLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vYmFzZS5qc1wiKS5DYXB0dXJlZENvbm5lY3Rpb25PcHRpb25zfSBvcHRpb25zIC0gQ2FwdHVyZWQgY2hlY2tvdXQgb3B0aW9ucy5cbiAgICogQHBhcmFtIHsoY29ubmVjdGlvbjogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQsIG93bmVyOiBzeW1ib2wpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gT3BlcmF0aW9uIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyB3aXRoQ2FwdHVyZWRPcGVyYXRpb25Db25uZWN0aW9uKHtkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIG5hbWV9LCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBhd2FpdCB0aGlzLmNoZWNrb3V0Rm9yQ29uZmlndXJhdGlvbihkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIHtuYW1lfSlcbiAgICBjb25zdCBpZCA9IGNvbm5lY3Rpb24uZ2V0SWRTZXEoKVxuICAgIGNvbnN0IG93bmVyID0gU3ltYm9sKFwiY2FwdHVyZWQtZGF0YWJhc2Utb3BlcmF0aW9uLW93bmVyXCIpXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oaWQsIGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjayhjb25uZWN0aW9uLCBvd25lcilcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tpbihjb25uZWN0aW9uKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgY3VycmVudCBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IC0gVGhlIGN1cnJlbnQgY29ubmVjdGlvbi5cbiAgICovXG4gIGdldEN1cnJlbnRDb25uZWN0aW9uKCkge1xuICAgIGNvbnN0IGlkID0gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5nZXRTdG9yZSgpXG5cbiAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuY3VycmVudEZhbGxiYWNrQ29ubmVjdGlvbk9yRmFpbCgpXG4gICAgaWYgKGlkID09PSBTVVBQUkVTU0VEX0NPTk5FQ1RJT05fQ09OVEVYVCkgcmV0dXJuIHRoaXMuY3VycmVudEZhbGxiYWNrQ29ubmVjdGlvbk9yRmFpbCgpXG5cbiAgICB0aGlzLmVuc3VyZUNvbm5lY3Rpb25Jc0luVXNlKGlkKVxuXG4gICAgY29uc3QgY3VycmVudENvbm5lY3Rpb24gPSB0aGlzLmNvbm5lY3Rpb25zSW5Vc2VbaWRdXG5cbiAgICBpZiAoIWN1cnJlbnRDb25uZWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGdldCBjdXJyZW50IGNvbm5lY3Rpb24gZnJvbSB0aGF0IElEOiAke2lkfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRDb25uZWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjdXJyZW50IGZhbGxiYWNrIGNvbm5lY3Rpb24gb3IgZmFpbC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSAtIEZhbGxiYWNrIGNvbm5lY3Rpb24sIGlmIHByZXNlbnQuXG4gICAqL1xuICBjdXJyZW50RmFsbGJhY2tDb25uZWN0aW9uT3JGYWlsKCkge1xuICAgIGNvbnN0IGZhbGxiYWNrQ29ubmVjdGlvbiA9IHRoaXMuZ2V0R2xvYmFsQ29ubmVjdGlvbigpXG5cbiAgICBpZiAoZmFsbGJhY2tDb25uZWN0aW9uKSByZXR1cm4gZmFsbGJhY2tDb25uZWN0aW9uXG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJRCBoYXNuJ3QgYmVlbiBzZXQgZm9yIHRoaXMgYXN5bmMgY29udGV4dFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZW5zdXJlIGNvbm5lY3Rpb24gaXMgaW4gdXNlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBDaGVja2VkLW91dCBjb25uZWN0aW9uIGlkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGVuc3VyZUNvbm5lY3Rpb25Jc0luVXNlKGlkKSB7XG4gICAgaWYgKCEoaWQgaW4gdGhpcy5jb25uZWN0aW9uc0luVXNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb25uZWN0aW9uICR7aWR9IGRvZXNuJ3QgZXhpc3QgYW55IG1vcmUgLSBoYXMgaXQgYmVlbiBjaGVja2VkIGluIGFnYWluP2ApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGZhbGxiYWNrIGNvbm5lY3Rpb24gZm9yIHRoaXMgcG9vbCBpZGVudGlmaWVyIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gbm8gYXN5bmMgY29udGV4dCBpcyBhdmFpbGFibGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBDb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRHbG9iYWxDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICBjb25zdCBrbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIFZlbG9jaW91c0RhdGFiYXNlUG9vbEFzeW5jVHJhY2tlZE11bHRpQ29ubmVjdGlvbn0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgbGV0IG1hcEZvckNvbmZpZ3VyYXRpb24gPSBrbGFzcy5nbG9iYWxDb25uZWN0aW9ucy5nZXQodGhpcy5jb25maWd1cmF0aW9uKVxuXG4gICAgaWYgKCFtYXBGb3JDb25maWd1cmF0aW9uKSB7XG4gICAgICBtYXBGb3JDb25maWd1cmF0aW9uID0ge31cbiAgICAgIGtsYXNzLmdsb2JhbENvbm5lY3Rpb25zLnNldCh0aGlzLmNvbmZpZ3VyYXRpb24sIG1hcEZvckNvbmZpZ3VyYXRpb24pXG4gICAgfVxuXG4gICAgbWFwRm9yQ29uZmlndXJhdGlvblt0aGlzLmlkZW50aWZpZXJdID0gY29ubmVjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgYSBnbG9iYWwgZmFsbGJhY2sgY29ubmVjdGlvbiBleGlzdHMgZm9yIHRoaXMgcG9vbCBpZGVudGlmaWVyIGFuZCByZXR1cm5zIGl0LlxuICAgKiBJZiBvbmUgaXMgYWxyZWFkeSBzZXQsIGl0IGlzIHJldHVybmVkIGFuZCBhbHNvIG1hZGUgYXZhaWxhYmxlIGluIHRoZSBwb29sIHF1ZXVlLlxuICAgKiBPdGhlcndpc2UgYSBuZXcgY29ubmVjdGlvbiBpcyBzcGF3bmVkLCByZWdpc3RlcmVkLCBhbmQgcXVldWVkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgZ2xvYmFsIGNvbm5lY3Rpb24uXG4gICAqL1xuICBhc3luYyBlbnN1cmVHbG9iYWxDb25uZWN0aW9uKCkge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5nZXRHbG9iYWxDb25uZWN0aW9uKClcblxuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nXG5cbiAgICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy5zcGF3bkNvbm5lY3Rpb24oKVxuXG4gICAgdGhpcy5zZXRHbG9iYWxDb25uZWN0aW9uKGNvbm5lY3Rpb24pXG5cbiAgICByZXR1cm4gY29ubmVjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIHNoYXJlZCBjb25uZWN0aW9uIGZvciB0ZXN0IG1vZGUgc28gdGhhdCBIVFRQIGhhbmRsZXJzIHJ1bm5pbmdcbiAgICogaW4gdGhlIHNhbWUgcHJvY2VzcyBjYW4gcmV1c2UgdGhlIHRlc3QgcnVubmVyJ3MgZGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIFNoYXJlZCBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLlRlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9ufSAtIE9wYXF1ZSByZWdpc3RyYXRpb24gaGFuZGxlLlxuICAgKi9cbiAgc2V0VGVzdFNoYXJlZENvbm5lY3Rpb24oY29ubmVjdGlvbikge1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IHtvd25lcjogU3ltYm9sKFwidGVzdC1zaGFyZWQtY29ubmVjdGlvblwiKX1cblxuICAgIHRoaXMuX3Rlc3RTaGFyZWRDb25uZWN0aW9uID0gY29ubmVjdGlvblxuICAgIHRoaXMuX3Rlc3RTaGFyZWRDb25uZWN0aW9uUHJvdmlkZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLl90ZXN0U2hhcmVkQ29ubmVjdGlvblJlZ2lzdHJhdGlvbiA9IHJlZ2lzdHJhdGlvblxuXG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBwcm92aWRlciB0aGF0IGlzIGV2YWx1YXRlZCB3aGVuIGFuIGluLXByb2Nlc3MgdGVzdCByZXF1ZXN0IGlzIGRpc3BhdGNoZWQuXG4gICAqIEBwYXJhbSB7KCkgPT4gaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IHByb3ZpZGVyIC0gU2hhcmVkIGNvbm5lY3Rpb24gcHJvdmlkZXIuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2Jhc2UuanNcIikuVGVzdFNoYXJlZENvbm5lY3Rpb25SZWdpc3RyYXRpb259IC0gT3BhcXVlIHJlZ2lzdHJhdGlvbiBoYW5kbGUuXG4gICAqL1xuICBzZXRUZXN0U2hhcmVkQ29ubmVjdGlvblByb3ZpZGVyKHByb3ZpZGVyKSB7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0ge293bmVyOiBTeW1ib2woXCJ0ZXN0LXNoYXJlZC1jb25uZWN0aW9uLXByb3ZpZGVyXCIpfVxuXG4gICAgdGhpcy5fdGVzdFNoYXJlZENvbm5lY3Rpb24gPSB1bmRlZmluZWRcbiAgICB0aGlzLl90ZXN0U2hhcmVkQ29ubmVjdGlvblByb3ZpZGVyID0gcHJvdmlkZXJcbiAgICB0aGlzLl90ZXN0U2hhcmVkQ29ubmVjdGlvblJlZ2lzdHJhdGlvbiA9IHJlZ2lzdHJhdGlvblxuXG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgY3VycmVudCBzaGFyZWQgY29ubmVjdGlvbiByZWdpc3RyYXRpb24uIEEgc3VwcGxpZWQgc3RhbGUgcmVnaXN0cmF0aW9uXG4gICAqIGNhbm5vdCBjbGVhciBhIHByb3ZpZGVyIGluc3RhbGxlZCBieSBhIG5ld2VyIGxpZmVjeWNsZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jhc2UuanNcIikuVGVzdFNoYXJlZENvbm5lY3Rpb25SZWdpc3RyYXRpb259IFtyZWdpc3RyYXRpb25dIC0gT3BhcXVlIHJlZ2lzdHJhdGlvbiBoYW5kbGUgdG8gY2xlYXIgY29uZGl0aW9uYWxseS5cbiAgICogQHJldHVybnMge3ZvaWR9ICovXG4gIGNsZWFyVGVzdFNoYXJlZENvbm5lY3Rpb24ocmVnaXN0cmF0aW9uKSB7XG4gICAgaWYgKHJlZ2lzdHJhdGlvbiAmJiByZWdpc3RyYXRpb24gIT09IHRoaXMuX3Rlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9uKSByZXR1cm5cblxuICAgIHRoaXMuX3Rlc3RTaGFyZWRDb25uZWN0aW9uID0gdW5kZWZpbmVkXG4gICAgdGhpcy5fdGVzdFNoYXJlZENvbm5lY3Rpb25Qcm92aWRlciA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX3Rlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9uID0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIGNhbGxiYWNrIGluc2lkZSB0aGUgdGVzdCBzaGFyZWQgY29ubmVjdGlvbidzIGFzeW5jIGNvbnRleHQsIHNvIG5lc3RlZFxuICAgKiBgZ2V0Q3VycmVudENvbm5lY3Rpb25gL2BlbnN1cmVDb25uZWN0aW9uc2AgcmV1c2UgaXQgKHdpdGggYSByZWFsIGNvbnRleHQpIHJhdGhlclxuICAgKiB0aGFuIGNoZWNraW5nIG91dCBhIGZyZXNoIHBvb2xlZCBjb25uZWN0aW9uLiBVc2VkIHRvIHJ1biBhbiBpbi1wcm9jZXNzIHJlcXVlc3RcbiAgICogaGFuZGxlciBvbiB0aGUgc2FtZSBjb25uZWN0aW9uIOKAlCBhbmQgb3BlbiB0cmFuc2FjdGlvbiDigJQgYXMgdGhlIHRlc3QgYm9keS4gTm8tb3BcbiAgICogKHJ1bnMgdGhlIGNhbGxiYWNrIGFzLWlzKSB3aGVuIG5vIHNoYXJlZCBjb25uZWN0aW9uIGlzIHNldC5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHsoKSA9PiBUfSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHJ1biBpbiB0aGUgc2hhcmVkIGNvbm5lY3Rpb24ncyBjb250ZXh0LlxuICAgKiBAcmV0dXJucyB7VH0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBydW5XaXRoVGVzdFNoYXJlZENvbm5lY3Rpb24oY2FsbGJhY2spIHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy50ZXN0U2hhcmVkQ29ubmVjdGlvbigpXG5cbiAgICBpZiAoIWNvbm5lY3Rpb24pIHJldHVybiBjYWxsYmFjaygpXG5cbiAgICByZXR1cm4gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oY29ubmVjdGlvbi5nZXRJZFNlcSgpLCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgY29ubmVjdGlvbiBjdXJyZW50bHkgZWxpZ2libGUgZm9yIGluLXByb2Nlc3MgdGVzdCByZXF1ZXN0IHNoYXJpbmcuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gLSBTaGFyZWQgY29ubmVjdGlvbi5cbiAgICovXG4gIHRlc3RTaGFyZWRDb25uZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl90ZXN0U2hhcmVkQ29ubmVjdGlvblByb3ZpZGVyXG4gICAgICA/IHRoaXMuX3Rlc3RTaGFyZWRDb25uZWN0aW9uUHJvdmlkZXIoKVxuICAgICAgOiB0aGlzLl90ZXN0U2hhcmVkQ29ubmVjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbm5lY3Rpb24gdGllZCB0byB0aGUgY3VycmVudCBhc3luYyBjb250ZXh0LCBpZiBhbnkuXG4gICAqIEZhbGxzIGJhY2sgdG8gdGhlIHRlc3Qgc2hhcmVkIGNvbm5lY3Rpb24gd2hlbiBubyBhc3luYyBjb250ZXh0IGV4aXN0cy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAtIFRoZSBjdXJyZW50IGNvbnRleHQgY29ubmVjdGlvbi5cbiAgICovXG4gIGdldEN1cnJlbnRDb250ZXh0Q29ubmVjdGlvbigpIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKVxuXG4gICAgaWYgKGlkID09PSBTVVBQUkVTU0VEX0NPTk5FQ1RJT05fQ09OVEVYVCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy50ZXN0U2hhcmVkQ29ubmVjdGlvbigpXG5cbiAgICByZXR1cm4gdGhpcy5nZXRDdXJyZW50Q29ubmVjdGlvbigpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcG9vbCBoYXMgYSByZWFsIGFzeW5jIGNvbnRleHQgZm9yIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgbmVzdGVkIGNvZGUgY2FuIHJldXNlIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gY29udGV4dC5cbiAgICovXG4gIGhhc0N1cnJlbnRDb25uZWN0aW9uQ29udGV4dCgpIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKVxuXG4gICAgcmV0dXJuIGlkICE9PSB1bmRlZmluZWQgJiYgaWQgIT09IFNVUFBSRVNTRURfQ09OTkVDVElPTl9DT05URVhUXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgZGVidWcgc25hcHNob3QuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2Jhc2UuanNcIikuRGF0YWJhc2VQb29sRGVidWdTbmFwc2hvdH0gLSBEaWFnbm9zdGljIHNuYXBzaG90IGZvciB0aGlzIHBvb2wuXG4gICAqL1xuICBnZXREZWJ1Z1NuYXBzaG90KCkge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gc3VwZXIuZ2V0RGVidWdTbmFwc2hvdCgpXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICAgIGNvbnN0IHtjb25uZWN0aW9uc30gPSB0aGlzLmRlYnVnQ29ubmVjdGlvblNuYXBzaG90cyhub3cpXG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc25hcHNob3QsXG4gICAgICBjb25uZWN0aW9ucyxcbiAgICAgIGNvbm5lY3Rpb25zQmVpbmdTcGF3bmVkOiB0aGlzLmNvbm5lY3Rpb25zQmVpbmdTcGF3bmVkLFxuICAgICAgaWRsZUNvdW50OiB0aGlzLmNvbm5lY3Rpb25zLmxlbmd0aCArIFsuLi50aGlzLmxpZmVjeWNsZVJldGFpbmVkQ29ubmVjdGlvbnMudmFsdWVzKCldLmZpbHRlcigoY29ubmVjdGlvbikgPT4gY29ubmVjdGlvbi5nZXRJZFNlcSgpID09PSB1bmRlZmluZWQpLmxlbmd0aCxcbiAgICAgIGluVXNlQ291bnQ6IE9iamVjdC5rZXlzKHRoaXMuY29ubmVjdGlvbnNJblVzZSkubGVuZ3RoLFxuICAgICAgcGVuZGluZ0NoZWNrb3V0czogdGhpcy5wZW5kaW5nQ2hlY2tvdXREZWJ1Z1NuYXBzaG90cyhub3cpLFxuICAgICAgcGVuZGluZ0NoZWNrb3V0Q291bnQ6IHRoaXMucGVuZGluZ0NoZWNrb3V0cy5sZW5ndGhcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBkZWJ1ZyBjb25uZWN0aW9uIHNuYXBzaG90cy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG5vdyAtIEN1cnJlbnQgdGltZXN0YW1wLlxuICAgKiBAcmV0dXJucyB7e2Nvbm5lY3Rpb25zOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+LCBzZWVuQ29ubmVjdGlvbnM6IFNldDxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59fSAtIENvbm5lY3Rpb24gc25hcHNob3RzIGFuZCBzZWVuIHNldC5cbiAgICovXG4gIGRlYnVnQ29ubmVjdGlvblNuYXBzaG90cyhub3cpIHtcbiAgICAvKipcbiAgICAgKiBDb25uZWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gKi9cbiAgICBjb25zdCBjb25uZWN0aW9ucyA9IFtdXG4gICAgY29uc3Qgc2VlbkNvbm5lY3Rpb25zID0gbmV3IFNldCgpXG5cbiAgICB0aGlzLmFkZEluVXNlRGVidWdDb25uZWN0aW9uU25hcHNob3RzKHtjb25uZWN0aW9ucywgbm93LCBzZWVuQ29ubmVjdGlvbnN9KVxuICAgIHRoaXMuYWRkSWRsZURlYnVnQ29ubmVjdGlvblNuYXBzaG90cyh7Y29ubmVjdGlvbnMsIG5vdywgc2VlbkNvbm5lY3Rpb25zfSlcbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgdGhpcy5saWZlY3ljbGVSZXRhaW5lZENvbm5lY3Rpb25zLnZhbHVlcygpKSB7XG4gICAgICB0aGlzLmFkZERlYnVnQ29ubmVjdGlvblNuYXBzaG90SWZVbnNlZW4oe2Nvbm5lY3Rpb24sIGNvbm5lY3Rpb25zLCByZWFwYWJsZTogZmFsc2UsIHNlZW5Db25uZWN0aW9ucywgc3RhdGU6IFwibGlmZWN5Y2xlLXJldGFpbmVkXCJ9KVxuICAgIH1cbiAgICB0aGlzLmFkZEZhbGxiYWNrRGVidWdDb25uZWN0aW9uU25hcHNob3RzKHtjb25uZWN0aW9ucywgc2VlbkNvbm5lY3Rpb25zfSlcblxuICAgIHJldHVybiB7Y29ubmVjdGlvbnMsIHNlZW5Db25uZWN0aW9uc31cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBpbiB1c2UgZGVidWcgY29ubmVjdGlvbiBzbmFwc2hvdHMuXG4gICAqIEBwYXJhbSB7e2Nvbm5lY3Rpb25zOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+LCBub3c6IG51bWJlciwgc2VlbkNvbm5lY3Rpb25zOiBTZXQ8aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+fX0gYXJncyAtIFNuYXBzaG90IGNvbGxlY3Rpb24gc3RhdGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYWRkSW5Vc2VEZWJ1Z0Nvbm5lY3Rpb25TbmFwc2hvdHMoe2Nvbm5lY3Rpb25zLCBub3csIHNlZW5Db25uZWN0aW9uc30pIHtcbiAgICBmb3IgKGNvbnN0IFtpZCwgY29ubmVjdGlvbl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5jb25uZWN0aW9uc0luVXNlKSkge1xuICAgICAgY29uc3QgdHJhY2tlZENvbm5lY3Rpb24gPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0ICYge1tDT05ORUNUSU9OX0NIRUNLRURfT1VUX0FUXT86IG51bWJlcn19ICovIChjb25uZWN0aW9uKVxuICAgICAgY29uc3QgY2hlY2tlZE91dEF0ID0gdHJhY2tlZENvbm5lY3Rpb25bQ09OTkVDVElPTl9DSEVDS0VEX09VVF9BVF1cbiAgICAgIGNvbnN0IGNoZWNrZWRPdXRGb3JNcyA9IHR5cGVvZiBjaGVja2VkT3V0QXQgPT09IFwibnVtYmVyXCIgPyBNYXRoLm1heCgwLCBub3cgLSBjaGVja2VkT3V0QXQpIDogdW5kZWZpbmVkXG5cbiAgICAgIHNlZW5Db25uZWN0aW9ucy5hZGQoY29ubmVjdGlvbilcbiAgICAgIGNvbm5lY3Rpb25zLnB1c2godGhpcy5kZWJ1Z0Nvbm5lY3Rpb25TbmFwc2hvdChjb25uZWN0aW9uLCB7Y2hlY2tlZE91dEF0LCBjaGVja2VkT3V0Rm9yTXMsIGNoZWNrb3V0SWQ6IGlkLCBzdGF0ZTogXCJpbi11c2VcIn0pKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBpZGxlIGRlYnVnIGNvbm5lY3Rpb24gc25hcHNob3RzLlxuICAgKiBAcGFyYW0ge3tjb25uZWN0aW9uczogQXJyYXk8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Piwgbm93OiBudW1iZXIsIHNlZW5Db25uZWN0aW9uczogU2V0PGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn19IGFyZ3MgLSBTbmFwc2hvdCBjb2xsZWN0aW9uIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFkZElkbGVEZWJ1Z0Nvbm5lY3Rpb25TbmFwc2hvdHMoe2Nvbm5lY3Rpb25zLCBub3csIHNlZW5Db25uZWN0aW9uc30pIHtcbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgdGhpcy5jb25uZWN0aW9ucykge1xuICAgICAgaWYgKHNlZW5Db25uZWN0aW9ucy5oYXMoY29ubmVjdGlvbikpIGNvbnRpbnVlXG5cbiAgICAgIHNlZW5Db25uZWN0aW9ucy5hZGQoY29ubmVjdGlvbilcblxuICAgICAgY29uc3QgdHJhY2tlZENvbm5lY3Rpb24gPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0ICYge1tJRExFX0NPTk5FQ1RJT05fQ0hFQ0tFRF9JTl9BVF0/OiBudW1iZXJ9fSAqLyAoY29ubmVjdGlvbilcbiAgICAgIGNvbnN0IGNoZWNrZWRJbkF0ID0gdHJhY2tlZENvbm5lY3Rpb25bSURMRV9DT05ORUNUSU9OX0NIRUNLRURfSU5fQVRdXG4gICAgICBjb25zdCBpZGxlRm9yTXMgPSB0eXBlb2YgY2hlY2tlZEluQXQgPT09IFwibnVtYmVyXCIgPyBNYXRoLm1heCgwLCBub3cgLSBjaGVja2VkSW5BdCkgOiB1bmRlZmluZWRcblxuICAgICAgY29ubmVjdGlvbnMucHVzaCh0aGlzLmRlYnVnQ29ubmVjdGlvblNuYXBzaG90KGNvbm5lY3Rpb24sIHtjaGVja2VkSW5BdCwgaWRsZUZvck1zLCBzdGF0ZTogXCJpZGxlXCJ9KSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhZGQgZmFsbGJhY2sgZGVidWcgY29ubmVjdGlvbiBzbmFwc2hvdHMuXG4gICAqIEBwYXJhbSB7e2Nvbm5lY3Rpb25zOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+LCBzZWVuQ29ubmVjdGlvbnM6IFNldDxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59fSBhcmdzIC0gU25hcHNob3QgY29sbGVjdGlvbiBzdGF0ZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhZGRGYWxsYmFja0RlYnVnQ29ubmVjdGlvblNuYXBzaG90cyh7Y29ubmVjdGlvbnMsIHNlZW5Db25uZWN0aW9uc30pIHtcbiAgICB0aGlzLmFkZERlYnVnQ29ubmVjdGlvblNuYXBzaG90SWZVbnNlZW4oe2Nvbm5lY3Rpb246IHRoaXMuZ2V0R2xvYmFsQ29ubmVjdGlvbkZvcklkZW50aWZpZXIoKSwgY29ubmVjdGlvbnMsIHJlYXBhYmxlOiBmYWxzZSwgc2VlbkNvbm5lY3Rpb25zLCBzdGF0ZTogXCJnbG9iYWxcIn0pXG4gICAgdGhpcy5hZGREZWJ1Z0Nvbm5lY3Rpb25TbmFwc2hvdElmVW5zZWVuKHtjb25uZWN0aW9uOiB0aGlzLl90ZXN0U2hhcmVkQ29ubmVjdGlvbiwgY29ubmVjdGlvbnMsIHJlYXBhYmxlOiBmYWxzZSwgc2VlbkNvbm5lY3Rpb25zLCBzdGF0ZTogXCJ0ZXN0LXNoYXJlZFwifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBkZWJ1ZyBjb25uZWN0aW9uIHNuYXBzaG90IGlmIHVuc2Vlbi5cbiAgICogQHBhcmFtIHt7Y29ubmVjdGlvbjogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWQsIGNvbm5lY3Rpb25zOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+LCByZWFwYWJsZT86IGJvb2xlYW4sIHNlZW5Db25uZWN0aW9uczogU2V0PGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Piwgc3RhdGU6IHN0cmluZ319IGFyZ3MgLSBTbmFwc2hvdCBjb2xsZWN0aW9uIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFkZERlYnVnQ29ubmVjdGlvblNuYXBzaG90SWZVbnNlZW4oe2Nvbm5lY3Rpb24sIGNvbm5lY3Rpb25zLCByZWFwYWJsZSwgc2VlbkNvbm5lY3Rpb25zLCBzdGF0ZX0pIHtcbiAgICBpZiAoIWNvbm5lY3Rpb24gfHwgc2VlbkNvbm5lY3Rpb25zLmhhcyhjb25uZWN0aW9uKSkgcmV0dXJuXG5cbiAgICBzZWVuQ29ubmVjdGlvbnMuYWRkKGNvbm5lY3Rpb24pXG4gICAgY29ubmVjdGlvbnMucHVzaCh0aGlzLmRlYnVnQ29ubmVjdGlvblNuYXBzaG90KGNvbm5lY3Rpb24sIHtyZWFwYWJsZSwgc3RhdGV9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHBlbmRpbmcgY2hlY2tvdXQgZGVidWcgc25hcHNob3RzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbm93IC0gQ3VycmVudCB0aW1lc3RhbXAuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2Jhc2UuanNcIikuRGF0YWJhc2VQb29sUGVuZGluZ0NoZWNrb3V0RGVidWdTbmFwc2hvdFtdfSAtIFBlbmRpbmcgY2hlY2tvdXQgc25hcHNob3RzLlxuICAgKi9cbiAgcGVuZGluZ0NoZWNrb3V0RGVidWdTbmFwc2hvdHMobm93KSB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ0NoZWNrb3V0cy5tYXAoKGNoZWNrb3V0LCBpbmRleCkgPT4gKHtcbiAgICAgIGNoZWNrb3V0TmFtZTogY2hlY2tvdXQub3B0aW9ucy5uYW1lLFxuICAgICAgZW5xdWV1ZWRBdDogY2hlY2tvdXQuZW5xdWV1ZWRBdCxcbiAgICAgIGluZGV4LFxuICAgICAgcmVtYWluaW5nVGltZW91dE1zOiBjaGVja291dC50aW1lb3V0QXQgPT09IG51bGwgPyBudWxsIDogTWF0aC5tYXgoMCwgY2hlY2tvdXQudGltZW91dEF0IC0gbm93KSxcbiAgICAgIHJldXNlS2V5OiBjaGVja291dC5yZXVzZUtleSxcbiAgICAgIHRpbWVvdXRBdDogY2hlY2tvdXQudGltZW91dEF0LFxuICAgICAgdGltZW91dE1pbGxpczogY2hlY2tvdXQudGltZW91dE1pbGxpcyxcbiAgICAgIHdhaXRpbmdGb3JNczogTWF0aC5tYXgoMCwgbm93IC0gY2hlY2tvdXQuZW5xdWV1ZWRBdClcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBnbG9iYWwgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAtIFRoZSBnbG9iYWwgY29ubmVjdGlvbi5cbiAgICovXG4gIGdldEdsb2JhbENvbm5lY3Rpb24oKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuZ2V0R2xvYmFsQ29ubmVjdGlvbkZvcklkZW50aWZpZXIoKVxuXG4gICAgaWYgKCFjb25uZWN0aW9uKSByZXR1cm5cbiAgICBpZiAoIXRoaXMuY29ubmVjdGlvbk1hdGNoZXNDdXJyZW50Q29uZmlndXJhdGlvbihjb25uZWN0aW9uKSkgcmV0dXJuXG5cbiAgICByZXR1cm4gY29ubmVjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGdsb2JhbCBjb25uZWN0aW9uIGZvciBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IC0gVGhlIGdsb2JhbCBjb25uZWN0aW9uIGZvciB0aGlzIHBvb2wgaWRlbnRpZmllci5cbiAgICovXG4gIGdldEdsb2JhbENvbm5lY3Rpb25Gb3JJZGVudGlmaWVyKCkge1xuICAgIGNvbnN0IGtsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgVmVsb2Npb3VzRGF0YWJhc2VQb29sQXN5bmNUcmFja2VkTXVsdGlDb25uZWN0aW9ufSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcbiAgICBjb25zdCBtYXBGb3JDb25maWd1cmF0aW9uID0ga2xhc3MuZ2xvYmFsQ29ubmVjdGlvbnMuZ2V0KHRoaXMuY29uZmlndXJhdGlvbilcblxuICAgIHJldHVybiBtYXBGb3JDb25maWd1cmF0aW9uPy5bdGhpcy5pZGVudGlmaWVyXVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xlYXIgZ2xvYmFsIGNvbm5lY3Rpb24gZm9yIGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGNsZWFyR2xvYmFsQ29ubmVjdGlvbkZvcklkZW50aWZpZXIoKSB7XG4gICAgY29uc3Qga2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBWZWxvY2lvdXNEYXRhYmFzZVBvb2xBc3luY1RyYWNrZWRNdWx0aUNvbm5lY3Rpb259ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICAgIGNvbnN0IG1hcEZvckNvbmZpZ3VyYXRpb24gPSBrbGFzcy5nbG9iYWxDb25uZWN0aW9ucy5nZXQodGhpcy5jb25maWd1cmF0aW9uKVxuXG4gICAgaWYgKCFtYXBGb3JDb25maWd1cmF0aW9uKSByZXR1cm5cblxuICAgIGRlbGV0ZSBtYXBGb3JDb25maWd1cmF0aW9uW3RoaXMuaWRlbnRpZmllcl1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgc2NoZW1hIG1ldGFkYXRhIGNhY2hlZCBieSBldmVyeSBsaXZlIGNvbm5lY3Rpb24gb3duZWQgYnkgdGhpcyBwb29sLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBjbGVhclNjaGVtYUNhY2hlKCkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gbmV3IFNldChbXG4gICAgICAuLi50aGlzLmNvbm5lY3Rpb25zLFxuICAgICAgLi4uT2JqZWN0LnZhbHVlcyh0aGlzLmNvbm5lY3Rpb25zSW5Vc2UpLFxuICAgICAgdGhpcy5nZXRHbG9iYWxDb25uZWN0aW9uKCksXG4gICAgICB0aGlzLl90ZXN0U2hhcmVkQ29ubmVjdGlvblxuICAgIF0uZmlsdGVyKEJvb2xlYW4pKVxuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGNvbm5lY3Rpb25zKSB7XG4gICAgICBpZiAoY29ubmVjdGlvbikgdGhpcy5fY2xlYXJDb25uZWN0aW9uU2NoZW1hQ2FjaGUoY29ubmVjdGlvbilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBpZGxlIHRpbWVvdXQgbWlsbGlzLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgbnVsbH0gLSBJZGxlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciBudWxsIHdoZW4gZGlzYWJsZWQuXG4gICAqL1xuICBpZGxlVGltZW91dE1pbGxpcygpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnBvb2w/LmlkbGVUaW1lb3V0TWlsbGlzXG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBudWxsXG4gICAgaWYgKHRoaXMudmFsaWRJZGxlVGltZW91dE1pbGxpcyh2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gICAgcmV0dXJuIERFRkFVTFRfSURMRV9USU1FT1VUX01JTExJU1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdmFsaWQgaWRsZSB0aW1lb3V0IG1pbGxpcy5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBDYW5kaWRhdGUgaWRsZSB0aW1lb3V0IHZhbHVlLlxuICAgKiBAcmV0dXJucyB7dmFsdWUgaXMgbnVtYmVyfSAtIFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgdmFsaWQgaWRsZSB0aW1lb3V0LlxuICAgKi9cbiAgdmFsaWRJZGxlVGltZW91dE1pbGxpcyh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSAmJiB2YWx1ZSA+PSAwXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzY2hlZHVsZSBpZGxlIGNvbm5lY3Rpb24gcmVhcGVyLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgc2NoZWR1bGVJZGxlQ29ubmVjdGlvblJlYXBlcigpIHtcbiAgICBpZiAodGhpcy5pZGxlQ29ubmVjdGlvblJlYXBlclRpbWVyKSByZXR1cm5cbiAgICBpZiAoIXRoaXMuaGFzSWRsZUNvbm5lY3Rpb25zVG9SZWFwKCkpIHJldHVyblxuXG4gICAgY29uc3QgZGVsYXkgPSB0aGlzLm5leHRJZGxlQ29ubmVjdGlvblJlYXBEZWxheSgvKiogQHR5cGUge251bWJlcn0gKi8gKHRoaXMuaWRsZVRpbWVvdXRNaWxsaXMoKSkpXG5cbiAgICB0aGlzLmlkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaWRsZUNvbm5lY3Rpb25SZWFwZXJUaW1lciA9IHVuZGVmaW5lZFxuICAgICAgdm9pZCB0aGlzLnJlYXBJZGxlQ29ubmVjdGlvbnMoKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbXCJGYWlsZWQgdG8gcmVhcCBpZGxlIGRhdGFiYXNlIGNvbm5lY3Rpb25zOlwiLCBlcnJvcl0pXG4gICAgICB9KVxuICAgIH0sIGRlbGF5KVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmlkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIudW5yZWYgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5pZGxlQ29ubmVjdGlvblJlYXBlclRpbWVyLnVucmVmKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYXMgaWRsZSBjb25uZWN0aW9ucyB0byByZWFwLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGFuIGlkbGUgcmVhcGVyIHRpbWVyIHNob3VsZCBiZSBzY2hlZHVsZWQuXG4gICAqL1xuICBoYXNJZGxlQ29ubmVjdGlvbnNUb1JlYXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbnMubGVuZ3RoID4gMCAmJiB0aGlzLmlkbGVUaW1lb3V0TWlsbGlzKCkgIT09IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG5leHQgaWRsZSBjb25uZWN0aW9uIHJlYXAgZGVsYXkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZGxlVGltZW91dE1pbGxpcyAtIElkbGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gRGVsYXkgYmVmb3JlIHRoZSBuZXh0IHJlYXAuXG4gICAqL1xuICBuZXh0SWRsZUNvbm5lY3Rpb25SZWFwRGVsYXkoaWRsZVRpbWVvdXRNaWxsaXMpIHtcbiAgICBsZXQgZGVsYXkgPSBpZGxlVGltZW91dE1pbGxpc1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcblxuICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLmNvbm5lY3Rpb25zKSB7XG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uSGFzT3BlblRyYW5zYWN0aW9uKGNvbm5lY3Rpb24pKSBjb250aW51ZVxuXG4gICAgICBjb25zdCB0cmFja2VkQ29ubmVjdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgJiB7W0lETEVfQ09OTkVDVElPTl9DSEVDS0VEX0lOX0FUXT86IG51bWJlcn19ICovIChjb25uZWN0aW9uKVxuICAgICAgY29uc3QgY2hlY2tlZEluQXQgPSB0cmFja2VkQ29ubmVjdGlvbltJRExFX0NPTk5FQ1RJT05fQ0hFQ0tFRF9JTl9BVF1cblxuICAgICAgaWYgKHR5cGVvZiBjaGVja2VkSW5BdCAhPT0gXCJudW1iZXJcIikgY29udGludWVcblxuICAgICAgZGVsYXkgPSBNYXRoLm1pbihkZWxheSwgTWF0aC5tYXgoMCwgaWRsZVRpbWVvdXRNaWxsaXMgLSAobm93IC0gY2hlY2tlZEluQXQpKSlcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsYXlcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgaWRsZSBjaGVja2VkLWluIGNvbm5lY3Rpb25zIHRoYXQgaGF2ZSBleGNlZWRlZCB0aGUgY29uZmlndXJlZCB0aW1lb3V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcmVhcElkbGVDb25uZWN0aW9ucygpIHtcbiAgICBpZiAodGhpcy5jb25uZWN0aW9ucy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgY29uc3QgaWRsZVRpbWVvdXRNaWxsaXMgPSB0aGlzLmlkbGVUaW1lb3V0TWlsbGlzKClcblxuICAgIGlmIChpZGxlVGltZW91dE1pbGxpcyA9PT0gbnVsbCkgcmV0dXJuXG5cbiAgICBjb25zdCB7ZXhwaXJlZENvbm5lY3Rpb25zLCBrZXB0Q29ubmVjdGlvbnN9ID0gdGhpcy5jbGFzc2lmeUlkbGVDb25uZWN0aW9uc0ZvclJlYXBpbmcoe2lkbGVUaW1lb3V0TWlsbGlzLCBub3c6IERhdGUubm93KCl9KVxuXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IGtlcHRDb25uZWN0aW9uc1xuICAgIGF3YWl0IHRoaXMuY2xvc2VFeHBpcmVkSWRsZUNvbm5lY3Rpb25zKGV4cGlyZWRDb25uZWN0aW9ucylcbiAgICBhd2FpdCB0aGlzLmF3YWl0SW5mbGlnaHRDb25uZWN0aW9uQ2xvc2VzKClcbiAgICBpZiAodGhpcy5jb25uZWN0aW9ucy5sZW5ndGggPiAwKSB0aGlzLnNjaGVkdWxlSWRsZUNvbm5lY3Rpb25SZWFwZXIoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xvc2UgZXhwaXJlZCBpZGxlIGNvbm5lY3Rpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0W119IGV4cGlyZWRDb25uZWN0aW9ucyAtIENvbm5lY3Rpb25zIHRvIGNsb3NlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNsb3NlZC5cbiAgICovXG4gIGFzeW5jIGNsb3NlRXhwaXJlZElkbGVDb25uZWN0aW9ucyhleHBpcmVkQ29ubmVjdGlvbnMpIHtcbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgZXhwaXJlZENvbm5lY3Rpb25zKSB7XG4gICAgICBhd2FpdCB0aGlzLmNsb3NlQ29ubmVjdGlvbihjb25uZWN0aW9uKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGF3YWl0IGluZmxpZ2h0IGNvbm5lY3Rpb24gY2xvc2VzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBvbmNlIGluLWZsaWdodCBjb25uZWN0aW9uIGNsb3NlcyBzZXR0bGUuXG4gICAqL1xuICBhc3luYyBhd2FpdEluZmxpZ2h0Q29ubmVjdGlvbkNsb3NlcygpIHtcbiAgICBpZiAodGhpcy5pbmZsaWdodENvbm5lY3Rpb25DbG9zZXMuc2l6ZSA+IDApIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbLi4udGhpcy5pbmZsaWdodENvbm5lY3Rpb25DbG9zZXNdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsYXNzaWZ5IGlkbGUgY29ubmVjdGlvbnMgZm9yIHJlYXBpbmcuXG4gICAqIEBwYXJhbSB7e2lkbGVUaW1lb3V0TWlsbGlzOiBudW1iZXIsIG5vdzogbnVtYmVyfX0gYXJncyAtIFJlYXBlciBjbGFzc2lmaWNhdGlvbiBpbnB1dHMuXG4gICAqIEByZXR1cm5zIHt7ZXhwaXJlZENvbm5lY3Rpb25zOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdFtdLCBrZXB0Q29ubmVjdGlvbnM6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0W119fSAtIENsYXNzaWZpZWQgaWRsZSBjb25uZWN0aW9ucy5cbiAgICovXG4gIGNsYXNzaWZ5SWRsZUNvbm5lY3Rpb25zRm9yUmVhcGluZyh7aWRsZVRpbWVvdXRNaWxsaXMsIG5vd30pIHtcbiAgICAvKipcbiAgICAgKiBLZXB0IGNvbm5lY3Rpb25zLlxuICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdFtdfSAqL1xuICAgIGNvbnN0IGtlcHRDb25uZWN0aW9ucyA9IFtdXG4gICAgLyoqXG4gICAgICogRXhwaXJlZCBjb25uZWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHRbXX0gKi9cbiAgICBjb25zdCBleHBpcmVkQ29ubmVjdGlvbnMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMuY29ubmVjdGlvbnMpIHtcbiAgICAgIHRoaXMuY2xhc3NpZnlJZGxlQ29ubmVjdGlvbkZvclJlYXBpbmcoe2Nvbm5lY3Rpb24sIGV4cGlyZWRDb25uZWN0aW9ucywgaWRsZVRpbWVvdXRNaWxsaXMsIGtlcHRDb25uZWN0aW9ucywgbm93fSlcbiAgICB9XG5cbiAgICByZXR1cm4ge2V4cGlyZWRDb25uZWN0aW9ucywga2VwdENvbm5lY3Rpb25zfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xhc3NpZnkgaWRsZSBjb25uZWN0aW9uIGZvciByZWFwaW5nLlxuICAgKiBAcGFyYW0ge3tjb25uZWN0aW9uOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCwgZXhwaXJlZENvbm5lY3Rpb25zOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdFtdLCBpZGxlVGltZW91dE1pbGxpczogbnVtYmVyLCBrZXB0Q29ubmVjdGlvbnM6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0W10sIG5vdzogbnVtYmVyfX0gYXJncyAtIENsYXNzaWZpY2F0aW9uIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGNsYXNzaWZ5SWRsZUNvbm5lY3Rpb25Gb3JSZWFwaW5nKHtjb25uZWN0aW9uLCBleHBpcmVkQ29ubmVjdGlvbnMsIGlkbGVUaW1lb3V0TWlsbGlzLCBrZXB0Q29ubmVjdGlvbnMsIG5vd30pIHtcbiAgICBpZiAodGhpcy5jb25uZWN0aW9uSXNDbG9zZWQoY29ubmVjdGlvbikpIHJldHVyblxuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25IYXNPcGVuVHJhbnNhY3Rpb24oY29ubmVjdGlvbikpIHtcbiAgICAgIGtlcHRDb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb24pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmlkbGVDb25uZWN0aW9uRXhwaXJlZCh7Y29ubmVjdGlvbiwgaWRsZVRpbWVvdXRNaWxsaXMsIG5vd30pID8gZXhwaXJlZENvbm5lY3Rpb25zIDoga2VwdENvbm5lY3Rpb25zXG5cbiAgICB0YXJnZXQucHVzaChjb25uZWN0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY29ubmVjdGlvbiBpcyBjbG9zZWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBDb25uZWN0aW9uIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaXMgbWFya2VkIGNsb3NlZC5cbiAgICovXG4gIGNvbm5lY3Rpb25Jc0Nsb3NlZChjb25uZWN0aW9uKSB7XG4gICAgY29uc3QgdHJhY2tlZENvbm5lY3Rpb24gPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0ICYge1tDTE9TRURfQ09OTkVDVElPTl0/OiBib29sZWFufX0gKi8gKGNvbm5lY3Rpb24pXG5cbiAgICByZXR1cm4gQm9vbGVhbih0cmFja2VkQ29ubmVjdGlvbltDTE9TRURfQ09OTkVDVElPTl0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpZGxlIGNvbm5lY3Rpb24gZXhwaXJlZC5cbiAgICogQHBhcmFtIHt7Y29ubmVjdGlvbjogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQsIGlkbGVUaW1lb3V0TWlsbGlzOiBudW1iZXIsIG5vdzogbnVtYmVyfX0gYXJncyAtIEV4cGlyeSBpbnB1dHMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGlkbGUgY29ubmVjdGlvbiBleHBpcmVkLlxuICAgKi9cbiAgaWRsZUNvbm5lY3Rpb25FeHBpcmVkKHtjb25uZWN0aW9uLCBpZGxlVGltZW91dE1pbGxpcywgbm93fSkge1xuICAgIGNvbnN0IHRyYWNrZWRDb25uZWN0aW9uID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCAmIHtbSURMRV9DT05ORUNUSU9OX0NIRUNLRURfSU5fQVRdPzogbnVtYmVyfX0gKi8gKGNvbm5lY3Rpb24pXG4gICAgY29uc3QgY2hlY2tlZEluQXQgPSB0cmFja2VkQ29ubmVjdGlvbltJRExFX0NPTk5FQ1RJT05fQ0hFQ0tFRF9JTl9BVF1cblxuICAgIHJldHVybiB0eXBlb2YgY2hlY2tlZEluQXQgPT09IFwibnVtYmVyXCIgJiYgbm93IC0gY2hlY2tlZEluQXQgPj0gaWRsZVRpbWVvdXRNaWxsaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbm5lY3Rpb24gaGFzIG9wZW4gdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBDb25uZWN0aW9uIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaGFzIGFuIG9wZW4gdHJhbnNhY3Rpb24uXG4gICAqL1xuICBjb25uZWN0aW9uSGFzT3BlblRyYW5zYWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICByZXR1cm4gY29ubmVjdGlvbi5fdHJhbnNhY3Rpb25zQ291bnQgPiAwXG4gIH1cblxuICAvKipcbiAgICogUm9sbHMgYmFjayBhbnkgdHJhbnNhY3Rpb24gYSBwcmV2aW91cyBob2xkZXIgbGVmdCBvcGVuIGJlZm9yZSBhIGNvbm5lY3Rpb25cbiAgICogcmUtZW50ZXJzIHRoZSBpZGxlIHBvb2wuIEEgY29ubmVjdGlvbiByZXR1cm5lZCB0byB0aGUgcG9vbCB3aXRoIGFuIG9wZW5cbiAgICogdHJhbnNhY3Rpb24gd291bGQgb3RoZXJ3aXNlIGJlIGhhbmRlZCB0byBhbiB1bnJlbGF0ZWQgY2hlY2tvdXQsIHdob3NlXG4gICAqIHN0YXJ0VHJhbnNhY3Rpb24oKSB0aGVuIGZhaWxzIHdpdGggXCJBIHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgcnVubmluZ1wiIGFuZFxuICAgKiBwb2lzb25zIGV2ZXJ5IGZvbGxvd2luZyBjYWxsZXIgdGhhdCByZXVzZXMgaXQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBDb25uZWN0aW9uIGJlaW5nIGNoZWNrZWQgaW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaG9sZHMgbm8gb3BlbiB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIHJvbGxiYWNrTGVmdE9wZW5UcmFuc2FjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmNvbm5lY3Rpb25IYXNPcGVuVHJhbnNhY3Rpb24oY29ubmVjdGlvbikpIHJldHVyblxuXG4gICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbYFJvbGxpbmcgYmFjayBhIHRyYW5zYWN0aW9uIGxlZnQgb3BlbiBvbiBhIGNvbm5lY3Rpb24gYmVpbmcgY2hlY2tlZCBpbiAoaWRlbnRpZmllcj0ke3RoaXMuaWRlbnRpZmllcn0pLmBdKVxuXG4gICAgd2hpbGUgKHRoaXMuY29ubmVjdGlvbkhhc09wZW5UcmFuc2FjdGlvbihjb25uZWN0aW9uKSkge1xuICAgICAgYXdhaXQgY29ubmVjdGlvbi5yb2xsYmFja1RyYW5zYWN0aW9uKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbG9zZSBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gQ29ubmVjdGlvbiB0byBjbG9zZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGNsb3NlQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgLy8gSWRlbXBvdGVudDogYSBmaXJlLWFuZC1mb3JnZXQgc2NoZWR1bGVkIHJlYXAgYW5kIGFuIGV4cGxpY2l0IHJlYXAgY2FuIGJvdGhcbiAgICAvLyB0YXJnZXQgdGhlIHNhbWUgY29ubmVjdGlvbi4gQXdhaXQgdGhlIGluLWZsaWdodCBjbG9zZSBpbnN0ZWFkIG9mIGNsb3NpbmdcbiAgICAvLyB0d2ljZSAod2hpY2ggY2FuIHRocm93IG9uIHRoZSBkcml2ZXIpIG9yIHJldHVybmluZyB3aGlsZSB0aGUgdW5kZXJseWluZ1xuICAgIC8vIGhhbmRsZSBpcyBzdGlsbCBvcGVuLlxuICAgIGNvbnN0IGV4aXN0aW5nQ2xvc2UgPSB0aGlzLmNvbm5lY3Rpb25DbG9zZVByb21pc2VzLmdldChjb25uZWN0aW9uKVxuXG4gICAgaWYgKGV4aXN0aW5nQ2xvc2UpIHtcbiAgICAgIHJldHVybiBhd2FpdCBleGlzdGluZ0Nsb3NlXG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tlZENvbm5lY3Rpb24gPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0ICYge1tDTE9TRURfQ09OTkVDVElPTl0/OiBib29sZWFuLCBbQ09OTkVDVElPTl9DSEVDS0VEX09VVF9BVF0/OiBudW1iZXIsIFtJRExFX0NPTk5FQ1RJT05fQ0hFQ0tFRF9JTl9BVF0/OiBudW1iZXJ9fSAqLyAoY29ubmVjdGlvbilcblxuICAgIGZvciAoY29uc3QgW3JldXNlS2V5LCByZXRhaW5lZENvbm5lY3Rpb25dIG9mIHRoaXMubGlmZWN5Y2xlUmV0YWluZWRDb25uZWN0aW9ucykge1xuICAgICAgaWYgKHJldGFpbmVkQ29ubmVjdGlvbiA9PT0gY29ubmVjdGlvbikgdGhpcy5saWZlY3ljbGVSZXRhaW5lZENvbm5lY3Rpb25zLmRlbGV0ZShyZXVzZUtleSlcbiAgICB9XG5cbiAgICB0cmFja2VkQ29ubmVjdGlvbltDTE9TRURfQ09OTkVDVElPTl0gPSB0cnVlXG4gICAgZGVsZXRlIHRyYWNrZWRDb25uZWN0aW9uW0NPTk5FQ1RJT05fQ0hFQ0tFRF9PVVRfQVRdXG4gICAgZGVsZXRlIHRyYWNrZWRDb25uZWN0aW9uW0lETEVfQ09OTkVDVElPTl9DSEVDS0VEX0lOX0FUXVxuXG4gICAgY29uc3QgY2xvc2VQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRyYWNrZWRDb25uZWN0aW9uLmNsb3NlKClcbiAgICB9KSgpXG5cbiAgICB0aGlzLmNvbm5lY3Rpb25DbG9zZVByb21pc2VzLnNldChjb25uZWN0aW9uLCBjbG9zZVByb21pc2UpXG4gICAgdGhpcy5pbmZsaWdodENvbm5lY3Rpb25DbG9zZXMuYWRkKGNsb3NlUHJvbWlzZSlcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjbG9zZVByb21pc2VcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pbmZsaWdodENvbm5lY3Rpb25DbG9zZXMuZGVsZXRlKGNsb3NlUHJvbWlzZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGVhciBpZGxlIGNvbm5lY3Rpb24gcmVhcGVyIHRpbWVyLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgY2xlYXJJZGxlQ29ubmVjdGlvblJlYXBlclRpbWVyKCkge1xuICAgIGlmICghdGhpcy5pZGxlQ29ubmVjdGlvblJlYXBlclRpbWVyKSByZXR1cm5cblxuICAgIGNsZWFyVGltZW91dCh0aGlzLmlkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIpXG4gICAgdGhpcy5pZGxlQ29ubmVjdGlvblJlYXBlclRpbWVyID0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGFsbCBhY3RpdmUgYW5kIGNhY2hlZCBjb25uZWN0aW9ucyBmb3IgdGhpcyBwb29sLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgY2xvc2VBbGwoKSB7XG4gICAgdGhpcy5jbGVhcklkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIoKVxuICAgIHRoaXMucmVqZWN0UGVuZGluZ0NoZWNrb3V0cyhuZXcgRXJyb3IoXCJEYXRhYmFzZSBwb29sIHdhcyBjbG9zZWQgYmVmb3JlIGNoZWNrb3V0IGNvbXBsZXRlZC5cIikpXG5cbiAgICBjb25zdCBjb25uZWN0aW9ucyA9IG5ldyBTZXQoW1xuICAgICAgLi4udGhpcy5jb25uZWN0aW9ucyxcbiAgICAgIC4uLk9iamVjdC52YWx1ZXModGhpcy5jb25uZWN0aW9uc0luVXNlKSxcbiAgICAgIC4uLnRoaXMubGlmZWN5Y2xlUmV0YWluZWRDb25uZWN0aW9ucy52YWx1ZXMoKSxcbiAgICAgIHRoaXMuZ2V0R2xvYmFsQ29ubmVjdGlvbkZvcklkZW50aWZpZXIoKSxcbiAgICAgIHRoaXMuX3Rlc3RTaGFyZWRDb25uZWN0aW9uXG4gICAgXS5maWx0ZXIoQm9vbGVhbikpXG5cbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gW11cbiAgICB0aGlzLmNvbm5lY3Rpb25zSW5Vc2UgPSB7fVxuICAgIHRoaXMubGlmZWN5Y2xlUmV0YWluZWRDb25uZWN0aW9ucy5jbGVhcigpXG4gICAgdGhpcy5saWZlY3ljbGVSZXRhaW5lZFJldXNlS2V5cy5jbGVhcigpXG4gICAgdGhpcy5jbGVhclRlc3RTaGFyZWRDb25uZWN0aW9uKClcbiAgICB0aGlzLmNsZWFyR2xvYmFsQ29ubmVjdGlvbkZvcklkZW50aWZpZXIoKVxuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGNvbm5lY3Rpb25zKSB7XG4gICAgICBpZiAoIWNvbm5lY3Rpb24pIGNvbnRpbnVlXG5cbiAgICAgIGF3YWl0IHRoaXMuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3Rpb24pXG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZWplY3QgcGVuZGluZyBjaGVja291dHMuXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gRXJyb3IgdG8gcmVqZWN0IHBlbmRpbmcgY2hlY2tvdXRzIHdpdGguXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcmVqZWN0UGVuZGluZ0NoZWNrb3V0cyhlcnJvcikge1xuICAgIGNvbnN0IHBlbmRpbmdDaGVja291dHMgPSB0aGlzLnBlbmRpbmdDaGVja291dHNcblxuICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0cyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGNoZWNrb3V0IG9mIHBlbmRpbmdDaGVja291dHMpIHtcbiAgICAgIHRoaXMuY2xlYXJQZW5kaW5nQ2hlY2tvdXRUaW1lb3V0KGNoZWNrb3V0KVxuICAgICAgY2hlY2tvdXQucmVqZWN0KGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgZ2xvYmFsbHkgcmVnaXN0ZXJlZCBmYWxsYmFjayBjb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IFtjb25uZWN0aW9uc10gLSBDb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFtjb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBzZXRHbG9iYWxDb25uZWN0aW9ucyhjb25uZWN0aW9ucywgY29uZmlndXJhdGlvbikge1xuICAgIGlmICghY29uZmlndXJhdGlvbikge1xuICAgICAgdGhpcy5nbG9iYWxDb25uZWN0aW9ucyA9IG5ldyBXZWFrTWFwKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuZ2xvYmFsQ29ubmVjdGlvbnMuc2V0KGNvbmZpZ3VyYXRpb24sIGNvbm5lY3Rpb25zIHx8IHt9KVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBnbG9iYWxseSByZWdpc3RlcmVkIGZhbGxiYWNrIGNvbm5lY3Rpb25zIGZvciBhbGwgY29uZmlndXJhdGlvbnMgb3IgYSBzaW5nbGUgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFtjb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBjbGVhckdsb2JhbENvbm5lY3Rpb25zKGNvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHRoaXMuZ2xvYmFsQ29ubmVjdGlvbnMgPSBuZXcgV2Vha01hcCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmdsb2JhbENvbm5lY3Rpb25zLmRlbGV0ZShjb25maWd1cmF0aW9uKVxuICB9XG59XG4iXX0=
|
|
1372
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtdHJhY2tlZC1tdWx0aS1jb25uZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3Bvb2wvYXN5bmMtdHJhY2tlZC1tdWx0aS1jb25uZWN0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDN0MsT0FBTyxRQUFRLEVBQUUsRUFBQyxzQkFBc0IsRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUUxRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQTtBQUNwRSxNQUFNLDZCQUE2QixHQUFHLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFBO0FBQ2xGLE1BQU0seUJBQXlCLEdBQUcsTUFBTSxDQUFDLGlDQUFpQyxDQUFDLENBQUE7QUFDM0UsTUFBTSw2QkFBNkIsR0FBRyxNQUFNLENBQUMsc0NBQXNDLENBQUMsQ0FBQTtBQUNwRixNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQTtBQUNsQyxNQUFNLDJCQUEyQixHQUFHLElBQUksQ0FBQTtBQUN4QyxNQUFNLCtCQUErQixHQUFHLEtBQUssQ0FBQTtBQUU3QyxNQUFNLENBQUMsT0FBTyxPQUFPLGdEQUFpRCxTQUFRLFFBQVE7SUFDcEY7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLGlCQUFpQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7SUFFeEMsaUJBQWlCLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxDQUFBO0lBRTNDOzs7OztPQUtHO0lBQ0gscUJBQXFCLEdBQUcsU0FBUyxDQUFBO0lBRWpDOzs7T0FHRztJQUNILDZCQUE2QixHQUFHLFNBQVMsQ0FBQTtJQUV6Qzs7O09BR0c7SUFDSCxpQ0FBaUMsR0FBRyxTQUFTLENBQUE7SUFFN0M7O3dEQUVvRDtJQUNwRCxXQUFXLEdB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R0FBRyxDQUFDLGFBQWEsRUFBRSxXQUFXLElBQUksRUFBRSxDQUFDLENBQUE7SUFDOUQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsc0JBQXNCLENBQUMsYUFBYTtRQUN6QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7WUFDdEMsT0FBTTtRQUNSLENBQUM7UUFFRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQzlDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge0FzeW5jTG9jYWxTdG9yYWdlfSBmcm9tIFwiYXN5bmNfaG9va3NcIlxuaW1wb3J0IEJhc2VQb29sLCB7UE9PTF9DT05GSUdVUkFUSU9OX0tFWX0gZnJvbSBcIi4vYmFzZS5qc1wiXG5cbi8qKlxuICogUGVuZGluZ0NoZWNrb3V0IHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQZW5kaW5nQ2hlY2tvdXRcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZyAtIFJlc29sdmVkIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24gbmVlZGVkIGJ5IHRoZSBjaGVja291dC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBlbnF1ZXVlZEF0IC0gVGltZXN0YW1wIHdoZW4gdGhlIGNoZWNrb3V0IHN0YXJ0ZWQgd2FpdGluZy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLkNvbm5lY3Rpb25DaGVja291dE9wdGlvbnN9IG9wdGlvbnMgLSBDaGVja291dCBvcHRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJldXNlS2V5IC0gRGF0YWJhc2UgY29uZmlndXJhdGlvbiByZXVzZSBrZXkgbmVlZGVkIGJ5IHRoZSBjaGVja291dC5cbiAqIEBwcm9wZXJ0eSB7KGNvbm5lY3Rpb246IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0KSA9PiB2b2lkfSByZXNvbHZlIC0gUmVzb2x2ZXMgd2l0aCBhbiBhY3RpdmF0ZWQgY29ubmVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7KGVycm9yOiBFcnJvcikgPT4gdm9pZH0gcmVqZWN0IC0gUmVqZWN0cyB3aGVuIGNoZWNrb3V0IGNhbm5vdCBjb21wbGV0ZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gdGltZW91dEF0IC0gVGltZXN0YW1wIHdoZW4gdGhlIGNoZWNrb3V0IHdpbGwgdGltZSBvdXQsIG9yIG51bGwgd2hlbiBkaXNhYmxlZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gdGltZW91dE1pbGxpcyAtIE1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSByZWplY3RpbmcsIG9yIG51bGwgd2hlbiBkaXNhYmxlZC5cbiAqIEBwcm9wZXJ0eSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWR9IHRpbWVvdXRUaW1lciAtIFRpbWVyIHRoYXQgcmVqZWN0cyB0aGUgcGVuZGluZyBjaGVja291dC5cbiAqL1xuZXhwb3J0IGNvbnN0IENMT1NFRF9DT05ORUNUSU9OID0gU3ltYm9sKFwidmVsb2Npb3VzQ2xvc2VkQ29ubmVjdGlvblwiKVxuY29uc3QgSURMRV9DT05ORUNUSU9OX0NIRUNLRURfSU5fQVQgPSBTeW1ib2woXCJ2ZWxvY2lvdXNJZGxlQ29ubmVjdGlvbkNoZWNrZWRJbkF0XCIpXG5jb25zdCBDT05ORUNUSU9OX0NIRUNLRURfT1VUX0FUID0gU3ltYm9sKFwidmVsb2Npb3VzQ29ubmVjdGlvbkNoZWNrZWRPdXRBdFwiKVxuY29uc3QgU1VQUFJFU1NFRF9DT05ORUNUSU9OX0NPTlRFWFQgPSBTeW1ib2woXCJ2ZWxvY2lvdXNTdXBwcmVzc2VkQ29ubmVjdGlvbkNvbnRleHRcIilcbmNvbnN0IERFRkFVTFRfTUFYX0NPTk5FQ1RJT05TID0gMTBcbmNvbnN0IERFRkFVTFRfSURMRV9USU1FT1VUX01JTExJUyA9IDUwMDBcbmNvbnN0IERFRkFVTFRfQ0hFQ0tPVVRfVElNRU9VVF9NSUxMSVMgPSAxMDAwMFxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNEYXRhYmFzZVBvb2xBc3luY1RyYWNrZWRNdWx0aUNvbm5lY3Rpb24gZXh0ZW5kcyBCYXNlUG9vbCB7XG4gIC8qKlxuICAgKiBHbG9iYWwgZmFsbGJhY2sgY29ubmVjdGlvbnMga2V5ZWQgYnkgY29uZmlndXJhdGlvbiBpbnN0YW5jZSBhbmQgcG9vbCBpZGVudGlmaWVyLlxuICAgKiBAdHlwZSB7V2Vha01hcDxpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIFJlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pj59XG4gICAqL1xuICBzdGF0aWMgZ2xvYmFsQ29ubmVjdGlvbnMgPSBuZXcgV2Vha01hcCgpXG5cbiAgYXN5bmNMb2NhbFN0b3JhZ2UgPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKVxuXG4gIC8qKlxuICAgKiBXaGVuIHNldCwgcmV0dXJuZWQgYnkgZ2V0Q3VycmVudENvbnRleHRDb25uZWN0aW9uIHdoZW4gbm8gYXN5bmMgY29udGV4dCBleGlzdHMuXG4gICAqIFVzZWQgYnkgdGhlIHRlc3QgcnVubmVyIHRvIHNoYXJlIGEgY29ubmVjdGlvbiBiZXR3ZWVuIHRlc3QgY29kZSBhbmQgSFRUUCBoYW5kbGVyc1xuICAgKiBydW5uaW5nIGluIHRoZSBzYW1lIHByb2Nlc3MgKGluLXByb2Nlc3MgdGVzdCBzZXJ2ZXIgbW9kZSkuXG4gICAqIEB0eXBlIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH1cbiAgICovXG4gIF90ZXN0U2hhcmVkQ29ubmVjdGlvbiA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBEeW5hbWljYWxseSByZXNvbHZlcyB0aGUgY29ubmVjdGlvbiBlbGlnaWJsZSBmb3IgaW4tcHJvY2VzcyB0ZXN0IHJlcXVlc3Qgc2hhcmluZy5cbiAgICogQHR5cGUgeygoKSA9PiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZCkgfCB1bmRlZmluZWR9XG4gICAqL1xuICBfdGVzdFNoYXJlZENvbm5lY3Rpb25Qcm92aWRlciA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBJZGVudGlmaWVzIHRoZSBsaWZlY3ljbGUgdGhhdCBpbnN0YWxsZWQgdGhlIGN1cnJlbnQgc2hhcmVkIGNvbm5lY3Rpb24gb3IgcHJvdmlkZXIuXG4gICAqIEB0eXBlIHtpbXBvcnQoXCIuL2Jhc2UuanNcIikuVGVzdFNoYXJlZENvbm5lY3Rpb25SZWdpc3RyYXRpb24gfCB1bmRlZmluZWR9XG4gICAqL1xuICBfdGVzdFNoYXJlZENvbm5lY3Rpb25SZWdpc3RyYXRpb24gPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogQ29ubmVjdGlvbnMuXG4gICAqIEB0eXBlIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdFtdfSAqL1xuICBjb25uZWN0aW9ucyA9IFtdXG5cbiAgLyoqXG4gICAqIFBoeXNpY2FsIGlkZW50aXRpZXMgcmVxdWVzdGVkIHRvIHJlbWFpbiByZXNpZGVudCBieSB0aGUgZnJvbnRlbmQgdGVuYW50IGxpZmVjeWNsZS5cbiAgICogQHR5cGUge1NldDxzdHJpbmc+fVxuICAgKi9cbiAgbGlmZWN5Y2xlUmV0YWluZWRSZXVzZUtleXMgPSBuZXcgU2V0KClcblxuICAvKipcbiAgICogUGFya2VkIGxpZmVjeWNsZS1vd25lZCBjb25uZWN0aW9ucyBrZXllZCBieSBwaHlzaWNhbCBpZGVudGl0eS5cbiAgICogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn1cbiAgICovXG4gIGxpZmVjeWNsZVJldGFpbmVkQ29ubmVjdGlvbnMgPSBuZXcgTWFwKClcblxuICAvKipcbiAgICogQ29ubmVjdGlvbnMgaW4gdXNlLlxuICAgKiBAdHlwZSB7UmVjb3JkPG51bWJlciwgaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+fSAqL1xuICBjb25uZWN0aW9uc0luVXNlID0ge31cblxuICAvKipcbiAgICogUGVuZGluZyBjaGVja291dHMuXG4gICAqIEB0eXBlIHtQZW5kaW5nQ2hlY2tvdXRbXX0gKi9cbiAgcGVuZGluZ0NoZWNrb3V0cyA9IFtdXG5cbiAgLyoqXG4gICAqIENvbm5lY3Rpb25zIGJlaW5nIHNwYXduZWQuXG4gICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gIGNvbm5lY3Rpb25zQmVpbmdTcGF3bmVkID0gMFxuXG4gIC8qKlxuICAgKiBQZW5kaW5nIGNoZWNrb3V0IGRyYWluIHByb21pc2UuXG4gICAqIEB0eXBlIHtQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkfSAqL1xuICBwZW5kaW5nQ2hlY2tvdXREcmFpblByb21pc2UgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogSWRsZSBjb25uZWN0aW9uIHJlYXBlciB0aW1lci5cbiAgICogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkfSAqL1xuICBpZGxlQ29ubmVjdGlvblJlYXBlclRpbWVyID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIEluLWZsaWdodCBjb25uZWN0aW9uLWNsb3NlIHByb21pc2VzLiBUaGUgaWRsZSByZWFwZXIgaXMgYXJtZWQgb24gY2hlY2staW5cbiAgICogYW5kIHJ1bnMgZmlyZS1hbmQtZm9yZ2V0IHdoZW4gaXRzIHRpbWVyIGZpcmVzLCBzbyBhIHNjaGVkdWxlZCByZWFwIGNhbiBiZVxuICAgKiBjbG9zaW5nIGEgY29ubmVjdGlvbiB3aGlsZSBhbiBleHBsaWNpdCBgcmVhcElkbGVDb25uZWN0aW9ucygpYCAob3JcbiAgICogYGNsZWFySWRsZUNvbm5lY3Rpb25SZWFwZXJUaW1lcigpYCkgcnVucy4gVHJhY2tpbmcgdGhlIGluLWZsaWdodCBjbG9zZXMgbGV0c1xuICAgKiB0aG9zZSBjYWxsZXJzIGF3YWl0IHRoZW0sIHNvIG9uY2UgYSByZWFwIHJlc29sdmVzIHRoZSBjb25uZWN0aW9ucyBpdFxuICAgKiBleHBpcmVkIGFyZSBmdWxseSBjbG9zZWQgaW5zdGVhZCBvZiBoYWxmLWNsb3NlZCBtaWQtYGNsb3NlKClgLlxuICAgKiBAdHlwZSB7U2V0PFByb21pc2U8dm9pZD4+fVxuICAgKi9cbiAgaW5mbGlnaHRDb25uZWN0aW9uQ2xvc2VzID0gbmV3IFNldCgpXG5cbiAgLyoqXG4gICAqIEluLWZsaWdodCBjbG9zZSBwcm9taXNlIHBlciBjb25uZWN0aW9uLCBzbyBjb25jdXJyZW50IGNsb3NlcyBvZiB0aGUgc2FtZVxuICAgKiBjb25uZWN0aW9uIGF3YWl0IHRoZSBzYW1lIGNsb3NlIHJhdGhlciB0aGFuIGNsb3NpbmcgdGhlIGRyaXZlciBoYW5kbGUgdHdpY2UuXG4gICAqIEB0eXBlIHtXZWFrTWFwPG9iamVjdCwgUHJvbWlzZTx2b2lkPj59XG4gICAqL1xuICBjb25uZWN0aW9uQ2xvc2VQcm9taXNlcyA9IG5ldyBXZWFrTWFwKClcblxuICAvKiogQ3VtdWxhdGl2ZSBsb3ctY2FyZGluYWxpdHkgcG9vbCB0ZWxlbWV0cnkuICovXG4gIHRlbGVtZXRyeSA9IHtcbiAgICBjaGVja291dFdhaXRDb3VudDogMCxcbiAgICBjaGVja291dFdhaXRNYXhNczogMCxcbiAgICBjaGVja291dFdhaXRUb3RhbE1zOiAwLFxuICAgIGlkbGVSZWFwRGlzcG9zYWxDb3VudDogMFxuICB9XG5cbiAgaWRTZXEgPSAwXG5cbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5pZGVudGlmaWVyIC0gSWRlbnRpZmllci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBpZGVudGlmaWVyfSkge1xuICAgIHN1cGVyKHtjb25maWd1cmF0aW9uLCBpZGVudGlmaWVyfSlcbiAgICAvKipcbiAgICAgKiBSdW5zIGEgY2FsbGJhY2sgd2l0aG91dCB0aGUgaW5oZXJpdGVkIGN1cnJlbnQgY29ubmVjdGlvbiBjb250ZXh0LlxuICAgICAqIEB0eXBlIHsoY2FsbGJhY2s6ICgpID0+IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+KSA9PiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn1cbiAgICAgKi9cbiAgICBjb25zdCB3aXRob3V0Q3VycmVudENvbm5lY3Rpb25Db250ZXh0ID0gKGNhbGxiYWNrKSA9PiB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bihTVVBQUkVTU0VEX0NPTk5FQ1RJT05fQ09OVEVYVCwgY2FsbGJhY2spXG4gICAgdGhpcy5fd2l0aG91dEN1cnJlbnRDb25uZWN0aW9uQ29udGV4dCA9IHdpdGhvdXRDdXJyZW50Q29ubmVjdGlvbkNvbnRleHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNoZWNraW4uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBEYXRhYmFzZSBjb25uZWN0aW9uIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNoZWNrZWQgaW4gb3IgY2xvc2VkLlxuICAgKi9cbiAgYXN5bmMgY2hlY2tpbihjb25uZWN0aW9uKSB7XG4gICAgY29uc3QgaWQgPSBjb25uZWN0aW9uLmdldElkU2VxKClcbiAgICBjb25zdCB0cmFja2VkQ29ubmVjdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgJiB7W0NMT1NFRF9DT05ORUNUSU9OXT86IGJvb2xlYW4sIFtDT05ORUNUSU9OX0NIRUNLRURfT1VUX0FUXT86IG51bWJlciwgW0lETEVfQ09OTkVDVElPTl9DSEVDS0VEX0lOX0FUXT86IG51bWJlcn19ICovIChjb25uZWN0aW9uKVxuXG4gICAgaWYgKHRyYWNrZWRDb25uZWN0aW9uW0NMT1NFRF9DT05ORUNUSU9OXSkge1xuICAgICAgdGhpcy51bnRyYWNrQ29ubmVjdGlvbkluVXNlKGNvbm5lY3Rpb24sIGlkKVxuICAgICAgYXdhaXQgdGhpcy5kcmFpblBlbmRpbmdDaGVja291dHMoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucm9sbGJhY2tMZWZ0T3BlblRyYW5zYWN0aW9uKGNvbm5lY3Rpb24pXG4gICAgICBhd2FpdCBjb25uZWN0aW9uLnJlbGVhc2VIZWxkQWR2aXNvcnlMb2NrcygpXG4gICAgICBhd2FpdCBjb25uZWN0aW9uLmNsZWFyQ29ubmVjdGlvbkNoZWNrb3V0TmFtZSgpXG4gICAgICBhd2FpdCBjb25uZWN0aW9uLmNsZWFudXBTZXNzaW9uU3RhdGVBZnRlckNoZWNrb3V0KClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgdGhpcy5jbG9zZUNoZWNrZWRPdXRDb25uZWN0aW9uQWZ0ZXJDaGVja2luRmFpbHVyZShjb25uZWN0aW9uLCBpZCwgZXJyb3IpXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHRoaXMudW50cmFja0Nvbm5lY3Rpb25JblVzZShjb25uZWN0aW9uLCBpZClcbiAgICBkZWxldGUgdHJhY2tlZENvbm5lY3Rpb25bQ09OTkVDVElPTl9DSEVDS0VEX09VVF9BVF1cbiAgICBjb25zdCByZXVzZUtleSA9IHRoaXMuZ2V0Q29ubmVjdGlvbkNvbmZpZ3VyYXRpb25SZXVzZUtleShjb25uZWN0aW9uKVxuXG4gICAgaWYgKHRoaXMubGlmZWN5Y2xlUmV0YWluZWRSZXVzZUtleXMuaGFzKHJldXNlS2V5KSkge1xuICAgICAgY29uc3QgcmV0YWluZWRDb25uZWN0aW9uID0gdGhpcy5saWZlY3ljbGVSZXRhaW5lZENvbm5lY3Rpb25zLmdldChyZXVzZUtleSlcblxuICAgICAgaWYgKCFyZXRhaW5lZENvbm5lY3Rpb24gfHwgcmV0YWluZWRDb25uZWN0aW9uID09PSBjb25uZWN0aW9uIHx8IHJldGFpbmVkQ29ubmVjdGlvbi5nZXRJZFNlcSgpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVsZXRlIHRyYWNrZWRDb25uZWN0aW9uW0lETEVfQ09OTkVDVElPTl9DSEVDS0VEX0lOX0FUXVxuICAgICAgICB0aGlzLmxpZmVjeWNsZVJldGFpbmVkQ29ubmVjdGlvbnMuc2V0KHJldXNlS2V5LCBjb25uZWN0aW9uKVxuICAgICAgICBhd2FpdCB0aGlzLmRyYWluUGVuZGluZ0NoZWNrb3V0cygpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIHRyYWNrZWRDb25uZWN0aW9uW0lETEVfQ09OTkVDVElPTl9DSEVDS0VEX0lOX0FUXSA9IERhdGUubm93KClcbiAgICB0aGlzLmNvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbilcbiAgICBhd2FpdCB0aGlzLmRyYWluUGVuZGluZ0NoZWNrb3V0cygpXG4gICAgaWYgKHRoaXMuY29ubmVjdGlvbnMuaW5jbHVkZXMoY29ubmVjdGlvbikpIGF3YWl0IHRoaXMuaGFuZGxlQ2hlY2tlZEluSWRsZUNvbm5lY3Rpb24oKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xvc2UgY2hlY2tlZCBvdXQgY29ubmVjdGlvbiBhZnRlciBjaGVja2luIGZhaWx1cmUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBDb25uZWN0aW9uIHRoYXQgZmFpbGVkIGNoZWNrLWluIGNsZWFudXAuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBpZCAtIENvbm5lY3Rpb24gY2hlY2tvdXQgaWQuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IG9yaWdpbmFsRXJyb3IgLSBFcnJvciB0aGF0IGNhdXNlZCBjaGVjay1pbiBjbGVhbnVwIHRvIGZhaWwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY2xlYW51cCBoYXMgYmVlbiBhdHRlbXB0ZWQuXG4gICAqL1xuICBhc3luYyBjbG9zZUNoZWNrZWRPdXRDb25uZWN0aW9uQWZ0ZXJDaGVja2luRmFpbHVyZShjb25uZWN0aW9uLCBpZCwgb3JpZ2luYWxFcnJvcikge1xuICAgIHRoaXMudW50cmFja0Nvbm5lY3Rpb25JblVzZShjb25uZWN0aW9uLCBpZClcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNsb3NlQ29ubmVjdGlvbihjb25uZWN0aW9uKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFwiRmFpbGVkIHRvIGNsb3NlIGRhdGFiYXNlIGNvbm5lY3Rpb24gYWZ0ZXIgY2hlY2staW4gY2xlYW51cCBmYWlsZWRcIiwge2Vycm9yLCBvcmlnaW5hbEVycm9yfSlcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5kcmFpblBlbmRpbmdDaGVja291dHMoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFwiRmFpbGVkIHRvIGRyYWluIHBlbmRpbmcgZGF0YWJhc2UgY2hlY2tvdXRzIGFmdGVyIGNoZWNrLWluIGNsZWFudXAgZmFpbGVkXCIsIHtlcnJvciwgb3JpZ2luYWxFcnJvcn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdW50cmFjayBjb25uZWN0aW9uIGluIHVzZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIENvbm5lY3Rpb24gYmVpbmcgY2hlY2tlZCBpbi5cbiAgICogQHBhcmFtIHtudW1iZXIgfCB1bmRlZmluZWR9IGlkIC0gQ29ubmVjdGlvbiBjaGVja291dCBpZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICB1bnRyYWNrQ29ubmVjdGlvbkluVXNlKGNvbm5lY3Rpb24sIGlkKSB7XG4gICAgaWYgKHR5cGVvZiBpZCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpZFNlcSBvbiBjb25uZWN0aW9uIHdhc24ndCBzZXQ/ICcke3R5cGVvZiBpZH0nID0gJHtpZH1gKVxuICAgIH1cblxuICAgIGRlbGV0ZSB0aGlzLmNvbm5lY3Rpb25zSW5Vc2VbaWRdXG4gICAgY29ubmVjdGlvbi5zZXRJZFNlcSh1bmRlZmluZWQpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYW5kbGUgY2hlY2tlZCBpbiBpZGxlIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIG9uY2UgaWRsZSByZWFwaW5nIGhhcyBiZWVuIHNjaGVkdWxlZCBvciBydW4uXG4gICAqL1xuICBhc3luYyBoYW5kbGVDaGVja2VkSW5JZGxlQ29ubmVjdGlvbigpIHtcbiAgICBpZiAodGhpcy5pZGxlVGltZW91dE1pbGxpcygpID09PSAwKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlYXBJZGxlQ29ubmVjdGlvbnMoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjaGVkdWxlSWRsZUNvbm5lY3Rpb25SZWFwZXIoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNoZWNrb3V0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vYmFzZS5qc1wiKS5Db25uZWN0aW9uQ2hlY2tvdXRPcHRpb25zfSBbb3B0aW9uc10gLSBDaGVja291dCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY2hlY2tvdXQuXG4gICAqL1xuICBhc3luYyBjaGVja291dChvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBkYXRhYmFzZUNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpXG4gICAgY29uc3QgcmV1c2VLZXkgPSB0aGlzLmdldENvbmZpZ3VyYXRpb25SZXVzZUtleSgpXG4gICAgbGV0IGNvbm5lY3Rpb24gPSB0aGlzLnRha2VJZGxlQ29ubmVjdGlvbkZvclJldXNlS2V5KHJldXNlS2V5KVxuXG4gICAgaWYgKGNvbm5lY3Rpb24pIHJldHVybiBhd2FpdCB0aGlzLmFjdGl2YXRlQ29ubmVjdGlvbihjb25uZWN0aW9uLCBvcHRpb25zKVxuXG4gICAgYXdhaXQgdGhpcy5yZWFwSWRsZUNvbm5lY3Rpb25zKClcbiAgICBjb25uZWN0aW9uID0gdGhpcy50YWtlSWRsZUNvbm5lY3Rpb25Gb3JSZXVzZUtleShyZXVzZUtleSlcblxuICAgIGlmIChjb25uZWN0aW9uKSByZXR1cm4gYXdhaXQgdGhpcy5hY3RpdmF0ZUNvbm5lY3Rpb24oY29ubmVjdGlvbiwgb3B0aW9ucylcblxuICAgIGlmICh0aGlzLmNhblNwYXduQ29ubmVjdGlvbigpKSB7XG4gICAgICAvLyBTcGF3biB2aWEgc3Bhd25Db25uZWN0aW9uKCkgc28gdGhlIHRlbmFudC1hd2FyZSBjb25maWd1cmF0aW9uIGlzIHJlc29sdmVkIEZSRVNIIGF0XG4gICAgICAvLyBzcGF3biB0aW1lIGZvciB0aGUgY3VycmVudCBjYWxsZXIuIFJldXNpbmcgdGhlIGRhdGFiYXNlQ29uZmlnIGNhcHR1cmVkIGF0IHRoZSB0b3Agb2ZcbiAgICAgIC8vIGNoZWNrb3V0KCkgY291bGQgYmluZCB0aGUgY29ubmVjdGlvbiB0byBhIHN0YWxlIHRlbmFudC9kYXRhYmFzZSwgd2hpY2ggYnJlYWtzXG4gICAgICAvLyBwZXItcmVxdWVzdCBpc29sYXRpb24gKGUuZy4gdGVzdCB0cnVuY2F0aW9uIGFwcGVhcmluZyBub3QgdG8gdGFrZSBlZmZlY3QpLiBUaGUgcXVldWVkXG4gICAgICAvLyBwYXRoIGJlbG93IGtlZXBzIHRoZSB3YWl0aW5nIGNhbGxlcidzIGNhcHR1cmVkIGNvbmZpZyB2aWEgd2FpdEZvckNoZWNrb3V0KCkuXG4gICAgICBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy5zcGF3bkNvbm5lY3Rpb25Gb3JDaGVja291dCh0aGlzLmdldENvbmZpZ3VyYXRpb24oKSwgdGhpcy5nZXRDb25maWd1cmF0aW9uUmV1c2VLZXkoKSlcblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYWN0aXZhdGVDb25uZWN0aW9uKGNvbm5lY3Rpb24sIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMud2FpdEZvckNoZWNrb3V0KGRhdGFiYXNlQ29uZmlnLCByZXVzZUtleSwgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgb3V0IGEgY29ubmVjdGlvbiBmb3IgYW4gYWxyZWFkeS1yZXNvbHZlZCBwaHlzaWNhbCBjb25maWd1cmF0aW9uXG4gICAqIHdpdGhvdXQgY29uc3VsdGluZyBhbWJpZW50IHRlbmFudCBzdGF0ZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IGRhdGFiYXNlQ29uZmlnIC0gQ2FwdHVyZWQgZGF0YWJhc2UgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jhc2UuanNcIikuQ29ubmVjdGlvbkNoZWNrb3V0T3B0aW9uc30gW29wdGlvbnNdIC0gQ2hlY2tvdXQgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+fSAtIEFjdGl2YXRlZCBwb29sZWQgY29ubmVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGNoZWNrb3V0Rm9yQ29uZmlndXJhdGlvbihkYXRhYmFzZUNvbmZpZywgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgcmV1c2VLZXkgPSB0aGlzLmdldENvbmZpZ3VyYXRpb25SZXVzZUtleShkYXRhYmFzZUNvbmZpZylcbiAgICBjb25zdCBsaWZlY3ljbGVSZXRhaW5lZENvbm5lY3Rpb24gPSB0aGlzLmxpZmVjeWNsZVJldGFpbmVkQ29ubmVjdGlvbnMuZ2V0KHJldXNlS2V5KVxuXG4gICAgaWYgKGxpZmVjeWNsZVJldGFpbmVkQ29ubmVjdGlvbiAmJiBsaWZlY3ljbGVSZXRhaW5lZENvbm5lY3Rpb24uZ2V0SWRTZXEoKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5hY3RpdmF0ZUNvbm5lY3Rpb24obGlmZWN5Y2xlUmV0YWluZWRDb25uZWN0aW9uLCBvcHRpb25zKVxuICAgIH1cblxuICAgIGxldCBjb25uZWN0aW9uID0gdGhpcy50YWtlSWRsZUNvbm5lY3Rpb25Gb3JSZXVzZUtleShyZXVzZUtleSlcblxuICAgIGlmIChjb25uZWN0aW9uKSByZXR1cm4gYXdhaXQgdGhpcy5hY3RpdmF0ZUNvbm5lY3Rpb24oY29ubmVjdGlvbiwgb3B0aW9ucylcblxuICAgIGF3YWl0IHRoaXMucmVhcElkbGVDb25uZWN0aW9ucygpXG4gICAgY29ubmVjdGlvbiA9IHRoaXMudGFrZUlkbGVDb25uZWN0aW9uRm9yUmV1c2VLZXkocmV1c2VLZXkpXG5cbiAgICBpZiAoY29ubmVjdGlvbikgcmV0dXJuIGF3YWl0IHRoaXMuYWN0aXZhdGVDb25uZWN0aW9uKGNvbm5lY3Rpb24sIG9wdGlvbnMpXG5cbiAgICBpZiAodGhpcy5jYW5TcGF3bkNvbm5lY3Rpb24oZGF0YWJhc2VDb25maWcpKSB7XG4gICAgICBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy5zcGF3bkNvbm5lY3Rpb25Gb3JDaGVja291dChkYXRhYmFzZUNvbmZpZywgcmV1c2VLZXkpXG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFjdGl2YXRlQ29ubmVjdGlvbihjb25uZWN0aW9uLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLndhaXRGb3JDaGVja291dChkYXRhYmFzZUNvbmZpZywgcmV1c2VLZXksIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0YWtlIGlkbGUgY29ubmVjdGlvbiBmb3IgcmV1c2Uga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV1c2VLZXkgLSBEYXRhYmFzZSBjb25maWd1cmF0aW9uIHJldXNlIGtleS5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuaW5jbHVkZU9wZW5UcmFuc2FjdGlvbnNdIC0gV2hldGhlciBjb25uZWN0aW9ucyB3aXRoIG9wZW4gdHJhbnNhY3Rpb25zIG1heSBiZSByZXR1cm5lZC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAtIE1hdGNoaW5nIGlkbGUgY29ubmVjdGlvbi5cbiAgICovXG4gIHRha2VJZGxlQ29ubmVjdGlvbkZvclJldXNlS2V5KHJldXNlS2V5LCB7aW5jbHVkZU9wZW5UcmFuc2FjdGlvbnMgPSB0cnVlfSA9IHt9KSB7XG4gICAgY29uc3QgY29ubmVjdGlvbkluZGV4ID0gdGhpcy5jb25uZWN0aW9ucy5maW5kSW5kZXgoKHF1ZXVlZENvbm5lY3Rpb24pID0+IHtcbiAgICAgIGlmICghaW5jbHVkZU9wZW5UcmFuc2FjdGlvbnMgJiYgdGhpcy5jb25uZWN0aW9uSGFzT3BlblRyYW5zYWN0aW9uKHF1ZXVlZENvbm5lY3Rpb24pKSByZXR1cm4gZmFsc2VcblxuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbk1hdGNoZXNSZXVzZUtleShxdWV1ZWRDb25uZWN0aW9uLCByZXVzZUtleSlcbiAgICB9KVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uSW5kZXggPT09IC0xID8gdW5kZWZpbmVkIDogdGhpcy5jb25uZWN0aW9ucy5zcGxpY2UoY29ubmVjdGlvbkluZGV4LCAxKVswXVxuXG4gICAgcmV0dXJuIGNvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbm5lY3Rpb24gbWF0Y2hlcyByZXVzZSBrZXkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBDb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV1c2VLZXkgLSBEYXRhYmFzZSBjb25maWd1cmF0aW9uIHJldXNlIGtleS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgY29ubmVjdGlvbiBtYXRjaGVzIHRoZSByZXVzZSBrZXkuXG4gICAqL1xuICBjb25uZWN0aW9uTWF0Y2hlc1JldXNlS2V5KGNvbm5lY3Rpb24sIHJldXNlS2V5KSB7XG4gICAgY29uc3QgY29ubmVjdGlvbldpdGhQb29sS2V5ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCAmIHtbUE9PTF9DT05GSUdVUkFUSU9OX0tFWV0/OiBzdHJpbmd9fSAqLyAoY29ubmVjdGlvbilcblxuICAgIHJldHVybiBjb25uZWN0aW9uV2l0aFBvb2xLZXlbUE9PTF9DT05GSUdVUkFUSU9OX0tFWV0gPT09IHJldXNlS2V5XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhY3RpdmF0ZSBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gQ29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jhc2UuanNcIikuQ29ubmVjdGlvbkNoZWNrb3V0T3B0aW9uc30gW29wdGlvbnNdIC0gQ2hlY2tvdXQgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+fSAtIEFjdGl2YXRlZCBjb25uZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgYWN0aXZhdGVDb25uZWN0aW9uKGNvbm5lY3Rpb24sIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChjb25uZWN0aW9uLmdldElkU2VxKCkgIT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBDb25uZWN0aW9uIGFscmVhZHkgaGFzIGFuIElELXNlcSAtIGlzIGl0IGluIHVzZT8gJHtjb25uZWN0aW9uLmdldElkU2VxKCl9YClcblxuICAgIGNvbnN0IGlkID0gdGhpcy5pZFNlcSsrXG5cbiAgICBjb25zdCB0cmFja2VkQ29ubmVjdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgJiB7W0NPTk5FQ1RJT05fQ0hFQ0tFRF9PVVRfQVRdPzogbnVtYmVyLCBbSURMRV9DT05ORUNUSU9OX0NIRUNLRURfSU5fQVRdPzogbnVtYmVyfX0gKi8gKGNvbm5lY3Rpb24pXG4gICAgZGVsZXRlIHRyYWNrZWRDb25uZWN0aW9uW0lETEVfQ09OTkVDVElPTl9DSEVDS0VEX0lOX0FUXVxuICAgIHRyYWNrZWRDb25uZWN0aW9uW0NPTk5FQ1RJT05fQ0hFQ0tFRF9PVVRfQVRdID0gRGF0ZS5ub3coKVxuXG4gICAgY29ubmVjdGlvbi5zZXRJZFNlcShpZClcbiAgICB0aGlzLmNvbm5lY3Rpb25zSW5Vc2VbaWRdID0gY29ubmVjdGlvblxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2V0Q29ubmVjdGlvbkNoZWNrb3V0TmFtZShvcHRpb25zLm5hbWUpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmNvbm5lY3Rpb25zSW5Vc2VbaWRdXG4gICAgICBjb25uZWN0aW9uLnNldElkU2VxKHVuZGVmaW5lZClcbiAgICAgIGF3YWl0IHRoaXMuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3Rpb24pXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG1heCBjb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IFtkYXRhYmFzZUNvbmZpZ10gLSBDb25maWd1cmF0aW9uIHdob3NlIHBvb2wgbWF4aW11bSBhcHBsaWVzLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgbnVsbH0gLSBDb25maWd1cmVkIG1heCBsaXZlIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgbWF4Q29ubmVjdGlvbnMoZGF0YWJhc2VDb25maWcgPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKSkge1xuICAgIGNvbnN0IHZhbHVlID0gZGF0YWJhc2VDb25maWcucG9vbD8ubWF4XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBudWxsXG4gICAgaWYgKHRoaXMudmFsaWRNYXhDb25uZWN0aW9ucyh2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gICAgcmV0dXJuIERFRkFVTFRfTUFYX0NPTk5FQ1RJT05TXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjaGVja291dCB0aW1lb3V0IG1pbGxpcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IFtkYXRhYmFzZUNvbmZpZ10gLSBDb25maWd1cmF0aW9uIHdob3NlIHRpbWVvdXQgYXBwbGllcy5cbiAgICogQHJldHVybnMge251bWJlciB8IG51bGx9IC0gUGVuZGluZyBjaGVja291dCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3IgbnVsbCB3aGVuIGRpc2FibGVkLlxuICAgKi9cbiAgY2hlY2tvdXRUaW1lb3V0TWlsbGlzKGRhdGFiYXNlQ29uZmlnID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGFiYXNlQ29uZmlnLnBvb2w/LmNoZWNrb3V0VGltZW91dE1pbGxpc1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gbnVsbFxuICAgIGlmICh0aGlzLnZhbGlkQ2hlY2tvdXRUaW1lb3V0TWlsbGlzKHZhbHVlKSkgcmV0dXJuIHZhbHVlXG5cbiAgICByZXR1cm4gREVGQVVMVF9DSEVDS09VVF9USU1FT1VUX01JTExJU1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdmFsaWQgY2hlY2tvdXQgdGltZW91dCBtaWxsaXMuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gQ2FuZGlkYXRlIGNoZWNrb3V0IHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHt2YWx1ZSBpcyBudW1iZXJ9IC0gV2hldGhlciB0aGUgdmFsdWUgaXMgYSB2YWxpZCB0aW1lb3V0LlxuICAgKi9cbiAgdmFsaWRDaGVja291dFRpbWVvdXRNaWxsaXModmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiYgdmFsdWUgPj0gMFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdmFsaWQgbWF4IGNvbm5lY3Rpb25zLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIENhbmRpZGF0ZSBtYXggY29ubmVjdGlvbiBjb3VudC5cbiAgICogQHJldHVybnMge3ZhbHVlIGlzIG51bWJlcn0gLSBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIG1heCBjb25uZWN0aW9uIGNvdW50LlxuICAgKi9cbiAgdmFsaWRNYXhDb25uZWN0aW9ucyh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSAmJiB2YWx1ZSA+PSAxXG4gIH1cblxuICAvKipcbiAgICogUnVucyBsaXZlIGNvbm5lY3Rpb24gY291bnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gTnVtYmVyIG9mIGxpdmUgYW5kIGluLXByb2dyZXNzIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgbGl2ZUNvbm5lY3Rpb25Db3VudCgpIHtcbiAgICBjb25zdCBjb25uZWN0aW9ucyA9IG5ldyBTZXQoW1xuICAgICAgLi4udGhpcy5jb25uZWN0aW9ucyxcbiAgICAgIC4uLk9iamVjdC52YWx1ZXModGhpcy5jb25uZWN0aW9uc0luVXNlKSxcbiAgICAgIC4uLnRoaXMubGlmZWN5Y2xlUmV0YWluZWRDb25uZWN0aW9ucy52YWx1ZXMoKSxcbiAgICAgIHRoaXMuZ2V0R2xvYmFsQ29ubmVjdGlvbkZvcklkZW50aWZpZXIoKVxuICAgIF0uZmlsdGVyKEJvb2xlYW4pKVxuXG4gICAgcmV0dXJuIGNvbm5lY3Rpb25zLnNpemUgKyB0aGlzLmNvbm5lY3Rpb25zQmVpbmdTcGF3bmVkXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjYW4gc3Bhd24gY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IFtkYXRhYmFzZUNvbmZpZ10gLSBDb25maWd1cmF0aW9uIHdob3NlIHBvb2wgbWF4aW11bSBhcHBsaWVzLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGEgbmV3IGNvbm5lY3Rpb24gY2FuIGJlIHNwYXduZWQuXG4gICAqL1xuICBjYW5TcGF3bkNvbm5lY3Rpb24oZGF0YWJhc2VDb25maWcgPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKSkge1xuICAgIGNvbnN0IG1heENvbm5lY3Rpb25zID0gdGhpcy5tYXhDb25uZWN0aW9ucyhkYXRhYmFzZUNvbmZpZylcblxuICAgIHJldHVybiBtYXhDb25uZWN0aW9ucyA9PT0gbnVsbCB8fCB0aGlzLmxpdmVDb25uZWN0aW9uQ291bnQoKSA8IG1heENvbm5lY3Rpb25zXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzcGF3biBjb25uZWN0aW9uIGZvciBjaGVja291dC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IGRhdGFiYXNlQ29uZmlnIC0gUmVzb2x2ZWQgZGF0YWJhc2UgY29uZmlnIGZvciB0aGUgY2hlY2tvdXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXVzZUtleSAtIERhdGFiYXNlIGNvbmZpZ3VyYXRpb24gcmV1c2Uga2V5IGZvciB0aGUgY2hlY2tvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn0gLSBTcGF3bmVkIGNvbm5lY3Rpb24uXG4gICAqL1xuICBhc3luYyBzcGF3bkNvbm5lY3Rpb25Gb3JDaGVja291dChkYXRhYmFzZUNvbmZpZywgcmV1c2VLZXkpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25zQmVpbmdTcGF3bmVkKytcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy5zcGF3bkNvbm5lY3Rpb25XaXRoQ29uZmlndXJhdGlvbihkYXRhYmFzZUNvbmZpZylcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb25XaXRoUG9vbEtleSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgJiB7W1BPT0xfQ09ORklHVVJBVElPTl9LRVldPzogc3RyaW5nfX0gKi8gKGNvbm5lY3Rpb24pXG5cbiAgICAgIGNvbm5lY3Rpb25XaXRoUG9vbEtleVtQT09MX0NPTkZJR1VSQVRJT05fS0VZXSA9IHJldXNlS2V5XG4gICAgICBjb25uZWN0aW9uLnNldFNjaGVtYUNhY2hlSW52YWxpZGF0b3IoKCkgPT4ge1xuICAgICAgICB0aGlzLmNsZWFyU2NoZW1hQ2FjaGUoKVxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uY2xlYXJTY2hlbWFDYWNoZXNGb3JSZXVzZUtleShyZXVzZUtleSlcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBjb25uZWN0aW9uXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbnNCZWluZ1NwYXduZWQtLVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdhaXQgZm9yIGNoZWNrb3V0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gZGF0YWJhc2VDb25maWcgLSBSZXNvbHZlZCBkYXRhYmFzZSBjb25maWcgZm9yIHRoZSBjaGVja291dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJldXNlS2V5IC0gRGF0YWJhc2UgY29uZmlndXJhdGlvbiByZXVzZSBrZXkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLkNvbm5lY3Rpb25DaGVja291dE9wdGlvbnN9IFtvcHRpb25zXSAtIENoZWNrb3V0IG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn0gLSBSZXNvbHZlcyB3aXRoIGFuIGFjdGl2YXRlZCBjb25uZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgd2FpdEZvckNoZWNrb3V0KGRhdGFiYXNlQ29uZmlnLCByZXVzZUtleSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGVucXVldWVkQXQgPSBEYXRlLm5vdygpXG4gICAgICBjb25zdCB0aW1lb3V0TWlsbGlzID0gdGhpcy5jaGVja291dFRpbWVvdXRNaWxsaXMoZGF0YWJhc2VDb25maWcpXG4gICAgICAvKiogQHR5cGUge1BlbmRpbmdDaGVja291dH0gKi9cbiAgICAgIGNvbnN0IGNoZWNrb3V0ID0ge1xuICAgICAgICBkYXRhYmFzZUNvbmZpZyxcbiAgICAgICAgZW5xdWV1ZWRBdCxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgcmVqZWN0LFxuICAgICAgICByZXNvbHZlLFxuICAgICAgICByZXVzZUtleSxcbiAgICAgICAgdGltZW91dEF0OiB0aW1lb3V0TWlsbGlzID09PSBudWxsID8gbnVsbCA6IGVucXVldWVkQXQgKyB0aW1lb3V0TWlsbGlzLFxuICAgICAgICB0aW1lb3V0TWlsbGlzLFxuICAgICAgICB0aW1lb3V0VGltZXI6IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICBjaGVja291dC50aW1lb3V0VGltZXIgPSB0aGlzLnN0YXJ0UGVuZGluZ0NoZWNrb3V0VGltZW91dChjaGVja291dClcbiAgICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0cy5wdXNoKGNoZWNrb3V0KVxuICAgICAgdm9pZCB0aGlzLmRyYWluUGVuZGluZ0NoZWNrb3V0cygpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zdCBjaGVja291dEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFwiRmFpbGVkIHRvIGRyYWluIHBlbmRpbmcgZGF0YWJhc2UgY29ubmVjdGlvbiBjaGVja291dHMuXCIsIHtjYXVzZTogZXJyb3J9KVxuXG4gICAgICAgIHRoaXMucmVqZWN0UGVuZGluZ0NoZWNrb3V0cyhjaGVja291dEVycm9yKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZHJhaW4gcGVuZGluZyBjaGVja291dHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gcGVuZGluZyBjaGVja291dHMgaGF2ZSBiZWVuIGRyYWluZWQgYXMgZmFyIGFzIHBvc3NpYmxlLlxuICAgKi9cbiAgYXN5bmMgZHJhaW5QZW5kaW5nQ2hlY2tvdXRzKCkge1xuICAgIGlmICh0aGlzLnBlbmRpbmdDaGVja291dERyYWluUHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5wZW5kaW5nQ2hlY2tvdXREcmFpblByb21pc2VcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0RHJhaW5Qcm9taXNlID0gdGhpcy5kcmFpblBlbmRpbmdDaGVja291dHNBY3R1YWwoKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucGVuZGluZ0NoZWNrb3V0RHJhaW5Qcm9taXNlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0RHJhaW5Qcm9taXNlID0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZHJhaW4gcGVuZGluZyBjaGVja291dHMgYWN0dWFsLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHBlbmRpbmcgY2hlY2tvdXRzIGhhdmUgYmVlbiBkcmFpbmVkIGFzIGZhciBhcyBwb3NzaWJsZS5cbiAgICovXG4gIGFzeW5jIGRyYWluUGVuZGluZ0NoZWNrb3V0c0FjdHVhbCgpIHtcbiAgICB3aGlsZSAodGhpcy5wZW5kaW5nQ2hlY2tvdXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnJlc29sdmVQZW5kaW5nQ2hlY2tvdXRXaXRoTWF0Y2hpbmdJZGxlQ29ubmVjdGlvbigpKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBjaGVja291dCA9IHRoaXMucGVuZGluZ0NoZWNrb3V0c1swXVxuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5jbG9zZUlkbGVDb25uZWN0aW9uRm9yUGVuZGluZ0NoZWNrb3V0Q2FwYWNpdHkoY2hlY2tvdXQpKSBjb250aW51ZVxuICAgICAgaWYgKCF0aGlzLnBlbmRpbmdDaGVja291dHMuaW5jbHVkZXMoY2hlY2tvdXQpKSBjb250aW51ZVxuICAgICAgaWYgKHRoaXMuY2FuU3Bhd25Db25uZWN0aW9uKGNoZWNrb3V0LmRhdGFiYXNlQ29uZmlnKSkge1xuICAgICAgICB0aGlzLnJlbW92ZVBlbmRpbmdDaGVja291dEF0KDApXG4gICAgICAgIGF3YWl0IHRoaXMuc3Bhd25BbmRSZXNvbHZlUGVuZGluZ0NoZWNrb3V0KGNoZWNrb3V0KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWFwZWRDb25uZWN0aW9uID0gYXdhaXQgdGhpcy5pZGxlQ29ubmVjdGlvbkZvclBlbmRpbmdDaGVja291dChjaGVja291dClcblxuICAgICAgaWYgKCF0aGlzLnBlbmRpbmdDaGVja291dHMuaW5jbHVkZXMoY2hlY2tvdXQpKSBjb250aW51ZVxuICAgICAgaWYgKCFyZWFwZWRDb25uZWN0aW9uKSByZXR1cm5cblxuICAgICAgdGhpcy5yZW1vdmVQZW5kaW5nQ2hlY2tvdXRBdCgwKVxuICAgICAgYXdhaXQgdGhpcy5yZXNvbHZlUGVuZGluZ0NoZWNrb3V0KGNoZWNrb3V0LCByZWFwZWRDb25uZWN0aW9uKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc29sdmUgcGVuZGluZyBjaGVja291dCB3aXRoIG1hdGNoaW5nIGlkbGUgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciBhIHBlbmRpbmcgY2hlY2tvdXQgd2FzIHJlc29sdmVkIHdpdGggYW4gaWRsZSBjb25uZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZVBlbmRpbmdDaGVja291dFdpdGhNYXRjaGluZ0lkbGVDb25uZWN0aW9uKCkge1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnBlbmRpbmdDaGVja291dHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBjaGVja291dCA9IHRoaXMucGVuZGluZ0NoZWNrb3V0c1tpbmRleF1cbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLnRha2VJZGxlQ29ubmVjdGlvbkZvclJldXNlS2V5KGNoZWNrb3V0LnJldXNlS2V5LCB7aW5jbHVkZU9wZW5UcmFuc2FjdGlvbnM6IGZhbHNlfSlcblxuICAgICAgaWYgKCFjb25uZWN0aW9uKSBjb250aW51ZVxuXG4gICAgICB0aGlzLnJlbW92ZVBlbmRpbmdDaGVja291dEF0KGluZGV4KVxuICAgICAgYXdhaXQgdGhpcy5yZXNvbHZlUGVuZGluZ0NoZWNrb3V0KGNoZWNrb3V0LCBjb25uZWN0aW9uKVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVtb3ZlIHBlbmRpbmcgY2hlY2tvdXQgYXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFBlbmRpbmcgY2hlY2tvdXQgaW5kZXguXG4gICAqIEByZXR1cm5zIHtQZW5kaW5nQ2hlY2tvdXR9IC0gUmVtb3ZlZCBjaGVja291dC5cbiAgICovXG4gIHJlbW92ZVBlbmRpbmdDaGVja291dEF0KGluZGV4KSB7XG4gICAgY29uc3QgY2hlY2tvdXQgPSB0aGlzLnBlbmRpbmdDaGVja291dHMuc3BsaWNlKGluZGV4LCAxKVswXVxuXG4gICAgdGhpcy5jbGVhclBlbmRpbmdDaGVja291dFRpbWVvdXQoY2hlY2tvdXQpXG4gICAgdGhpcy5yZWNvcmRDaGVja291dFdhaXQoY2hlY2tvdXQpXG5cbiAgICByZXR1cm4gY2hlY2tvdXRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIGEgY29tcGxldGVkIHF1ZXVlIHdhaXQgd2l0aG91dCByZXRhaW5pbmcgcGVyLWNoZWNrb3V0IGxhYmVscyBvciBzYW1wbGVzLlxuICAgKiBAcGFyYW0ge1BlbmRpbmdDaGVja291dH0gY2hlY2tvdXQgLSBDaGVja291dCBsZWF2aW5nIHRoZSBwZW5kaW5nIHF1ZXVlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJlY29yZENoZWNrb3V0V2FpdChjaGVja291dCkge1xuICAgIGNvbnN0IHdhaXRlZEZvck1zID0gTWF0aC5tYXgoMCwgRGF0ZS5ub3coKSAtIGNoZWNrb3V0LmVucXVldWVkQXQpXG5cbiAgICB0aGlzLnRlbGVtZXRyeS5jaGVja291dFdhaXRDb3VudCsrXG4gICAgdGhpcy50ZWxlbWV0cnkuY2hlY2tvdXRXYWl0VG90YWxNcyArPSB3YWl0ZWRGb3JNc1xuICAgIHRoaXMudGVsZW1ldHJ5LmNoZWNrb3V0V2FpdE1heE1zID0gTWF0aC5tYXgodGhpcy50ZWxlbWV0cnkuY2hlY2tvdXRXYWl0TWF4TXMsIHdhaXRlZEZvck1zKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3RhcnQgcGVuZGluZyBjaGVja291dCB0aW1lb3V0LlxuICAgKiBAcGFyYW0ge1BlbmRpbmdDaGVja291dH0gY2hlY2tvdXQgLSBQZW5kaW5nIGNoZWNrb3V0IHRvIHRpbWUgb3V0LlxuICAgKiBAcmV0dXJucyB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWR9IC0gVGltZXIsIGlmIHRpbWVvdXQgaXMgZW5hYmxlZC5cbiAgICovXG4gIHN0YXJ0UGVuZGluZ0NoZWNrb3V0VGltZW91dChjaGVja291dCkge1xuICAgIGlmIChjaGVja291dC50aW1lb3V0TWlsbGlzID09PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50aW1lb3V0UGVuZGluZ0NoZWNrb3V0KGNoZWNrb3V0KVxuICAgIH0sIGNoZWNrb3V0LnRpbWVvdXRNaWxsaXMpXG5cbiAgICByZXR1cm4gdGltZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRpbWVvdXQgcGVuZGluZyBjaGVja291dC5cbiAgICogQHBhcmFtIHtQZW5kaW5nQ2hlY2tvdXR9IGNoZWNrb3V0IC0gUGVuZGluZyBjaGVja291dCB0byByZWplY3QuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgdGltZW91dFBlbmRpbmdDaGVja291dChjaGVja291dCkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5wZW5kaW5nQ2hlY2tvdXRzLmluZGV4T2YoY2hlY2tvdXQpXG5cbiAgICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm5cblxuICAgIHRoaXMucmVtb3ZlUGVuZGluZ0NoZWNrb3V0QXQoaW5kZXgpXG4gICAgY2hlY2tvdXQucmVqZWN0KHRoaXMucGVuZGluZ0NoZWNrb3V0VGltZW91dEVycm9yKGNoZWNrb3V0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHBlbmRpbmcgY2hlY2tvdXQgdGltZW91dCBlcnJvci5cbiAgICogQHBhcmFtIHtQZW5kaW5nQ2hlY2tvdXR9IGNoZWNrb3V0IC0gVGltZWQtb3V0IGNoZWNrb3V0LlxuICAgKiBAcmV0dXJucyB7RXJyb3J9IC0gVGltZW91dCBlcnJvci5cbiAgICovXG4gIHBlbmRpbmdDaGVja291dFRpbWVvdXRFcnJvcihjaGVja291dCkge1xuICAgIGNvbnN0IGNoZWNrb3V0TmFtZSA9IGNoZWNrb3V0Lm9wdGlvbnMubmFtZSA/IGAgQ2hlY2tvdXQgbmFtZTogJHtKU09OLnN0cmluZ2lmeShjaGVja291dC5vcHRpb25zLm5hbWUpfS5gIDogXCJcIlxuICAgIGNvbnN0IGRpYWdub3N0aWNzID0gdGhpcy5wZW5kaW5nQ2hlY2tvdXRUaW1lb3V0RGlhZ25vc3RpY3MoY2hlY2tvdXQpXG5cbiAgICByZXR1cm4gbmV3IEVycm9yKGBUaW1lZCBvdXQgYWZ0ZXIgJHtjaGVja291dC50aW1lb3V0TWlsbGlzfW1zIHdhaXRpbmcgZm9yIGRhdGFiYXNlIGNvbm5lY3Rpb24gY2hlY2tvdXQgZnJvbSBwb29sIFwiJHt0aGlzLmlkZW50aWZpZXJ9XCIuJHtjaGVja291dE5hbWV9ICR7ZGlhZ25vc3RpY3N9YClcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgc2FuaXRpemVkIGRpYWdub3N0aWNzIGZvciBhIGNoZWNrb3V0IHRpbWVvdXQuXG4gICAqIEBwYXJhbSB7UGVuZGluZ0NoZWNrb3V0fSBjaGVja291dCAtIFRpbWVkLW91dCBjaGVja291dC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBQb29sIHN0YXRlIHN1bW1hcnkuXG4gICAqL1xuICBwZW5kaW5nQ2hlY2tvdXRUaW1lb3V0RGlhZ25vc3RpY3MoY2hlY2tvdXQpIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuZ2V0RGVidWdTbmFwc2hvdCgpXG4gICAgY29uc3QgY29ubmVjdGlvblN1bW1hcmllcyA9IHNuYXBzaG90LmNvbm5lY3Rpb25zXG4gICAgICAubWFwKChjb25uZWN0aW9uKSA9PiB0aGlzLnBlbmRpbmdDaGVja291dFRpbWVvdXRDb25uZWN0aW9uU3VtbWFyeShjb25uZWN0aW9uKSlcbiAgICAgIC5qb2luKFwiLCBcIilcbiAgICBjb25zdCBwZW5kaW5nU3VtbWFyaWVzID0gKHNuYXBzaG90LnBlbmRpbmdDaGVja291dHMgfHwgW10pXG4gICAgICAubWFwKChwZW5kaW5nQ2hlY2tvdXQpID0+IHRoaXMucGVuZGluZ0NoZWNrb3V0VGltZW91dFBlbmRpbmdTdW1tYXJ5KHBlbmRpbmdDaGVja291dCkpXG4gICAgICAuam9pbihcIiwgXCIpXG4gICAgY29uc3Qgd2FpdGVkRm9yTXMgPSBNYXRoLm1heCgwLCBEYXRlLm5vdygpIC0gY2hlY2tvdXQuZW5xdWV1ZWRBdClcblxuICAgIHJldHVybiBgUG9vbCBzdGF0ZTogbWF4PSR7dGhpcy5tYXhDb25uZWN0aW9ucygpID8/IFwidW5ib3VuZGVkXCJ9LCBpblVzZT0ke3NuYXBzaG90LmluVXNlQ291bnR9LCBpZGxlPSR7c25hcHNob3QuaWRsZUNvdW50fSwgcGVuZGluZz0ke3NuYXBzaG90LnBlbmRpbmdDaGVja291dENvdW50fSwgc3Bhd25pbmc9JHtzbmFwc2hvdC5jb25uZWN0aW9uc0JlaW5nU3Bhd25lZH0sIHRpbWVkT3V0V2FpdGluZ0Zvck1zPSR7d2FpdGVkRm9yTXN9LCBob2xkZXJzPVske2Nvbm5lY3Rpb25TdW1tYXJpZXN9XSwgd2FpdGluZz1bJHtwZW5kaW5nU3VtbWFyaWVzfV0uYFxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNhbml0aXplZCBjb25uZWN0aW9uIHN1bW1hcnkgZm9yIGNoZWNrb3V0IHRpbWVvdXQgZGlhZ25vc3RpY3MuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBjb25uZWN0aW9uIC0gQ29ubmVjdGlvbiBkZWJ1ZyBzbmFwc2hvdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTYW5pdGl6ZWQgY29ubmVjdGlvbiBzdGF0ZS5cbiAgICovXG4gIHBlbmRpbmdDaGVja291dFRpbWVvdXRDb25uZWN0aW9uU3VtbWFyeShjb25uZWN0aW9uKSB7XG4gICAgY29uc3QgcGFydHMgPSBbYHN0YXRlPSR7Y29ubmVjdGlvbi5zdGF0ZX1gXVxuXG4gICAgaWYgKGNvbm5lY3Rpb24uY2hlY2tvdXROYW1lKSBwYXJ0cy5wdXNoKGBjaGVja291dD0ke0pTT04uc3RyaW5naWZ5KGNvbm5lY3Rpb24uY2hlY2tvdXROYW1lKX1gKVxuICAgIGlmICh0eXBlb2YgY29ubmVjdGlvbi5jaGVja2VkT3V0Rm9yTXMgPT09IFwibnVtYmVyXCIpIHBhcnRzLnB1c2goYGNoZWNrZWRPdXRGb3JNcz0ke2Nvbm5lY3Rpb24uY2hlY2tlZE91dEZvck1zfWApXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uLmlkbGVGb3JNcyA9PT0gXCJudW1iZXJcIikgcGFydHMucHVzaChgaWRsZUZvck1zPSR7Y29ubmVjdGlvbi5pZGxlRm9yTXN9YClcbiAgICBpZiAodHlwZW9mIGNvbm5lY3Rpb24ub3BlblRyYW5zYWN0aW9ucyA9PT0gXCJudW1iZXJcIikgcGFydHMucHVzaChgb3BlblRyYW5zYWN0aW9ucz0ke2Nvbm5lY3Rpb24ub3BlblRyYW5zYWN0aW9uc31gKVxuXG4gICAgY29uc3QgYWN0aXZlUXVlcnkgPSBjb25uZWN0aW9uLmFjdGl2ZVF1ZXJ5XG5cbiAgICBpZiAoYWN0aXZlUXVlcnkgJiYgdHlwZW9mIGFjdGl2ZVF1ZXJ5ID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGFjdGl2ZVF1ZXJ5KSkge1xuICAgICAgY29uc3QgcnVubmluZ01zID0gKC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAoYWN0aXZlUXVlcnkpKS5ydW5uaW5nTXNcblxuICAgICAgaWYgKHR5cGVvZiBydW5uaW5nTXMgPT09IFwibnVtYmVyXCIpIHBhcnRzLnB1c2goYGFjdGl2ZVF1ZXJ5TXM9JHtydW5uaW5nTXN9YClcbiAgICB9XG5cbiAgICByZXR1cm4gYHske3BhcnRzLmpvaW4oXCIgXCIpfX1gXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc2FuaXRpemVkIHBlbmRpbmcgY2hlY2tvdXQgc3VtbWFyeSBmb3IgY2hlY2tvdXQgdGltZW91dCBkaWFnbm9zdGljcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jhc2UuanNcIikuRGF0YWJhc2VQb29sUGVuZGluZ0NoZWNrb3V0RGVidWdTbmFwc2hvdH0gcGVuZGluZ0NoZWNrb3V0IC0gV2FpdGluZyBjaGVja291dCBzbmFwc2hvdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTYW5pdGl6ZWQgcGVuZGluZyBjaGVja291dCBzdGF0ZS5cbiAgICovXG4gIHBlbmRpbmdDaGVja291dFRpbWVvdXRQZW5kaW5nU3VtbWFyeShwZW5kaW5nQ2hlY2tvdXQpIHtcbiAgICBjb25zdCBwYXJ0cyA9IFtgaW5kZXg9JHtwZW5kaW5nQ2hlY2tvdXQuaW5kZXh9YCwgYHdhaXRpbmdGb3JNcz0ke3BlbmRpbmdDaGVja291dC53YWl0aW5nRm9yTXN9YF1cblxuICAgIGlmIChwZW5kaW5nQ2hlY2tvdXQuY2hlY2tvdXROYW1lKSBwYXJ0cy5wdXNoKGBjaGVja291dD0ke0pTT04uc3RyaW5naWZ5KHBlbmRpbmdDaGVja291dC5jaGVja291dE5hbWUpfWApXG4gICAgaWYgKHBlbmRpbmdDaGVja291dC5yZW1haW5pbmdUaW1lb3V0TXMgIT09IG51bGwpIHBhcnRzLnB1c2goYHJlbWFpbmluZ1RpbWVvdXRNcz0ke3BlbmRpbmdDaGVja291dC5yZW1haW5pbmdUaW1lb3V0TXN9YClcblxuICAgIHJldHVybiBgeyR7cGFydHMuam9pbihcIiBcIil9fWBcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsZWFyIHBlbmRpbmcgY2hlY2tvdXQgdGltZW91dC5cbiAgICogQHBhcmFtIHtQZW5kaW5nQ2hlY2tvdXR9IGNoZWNrb3V0IC0gUGVuZGluZyBjaGVja291dC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBjbGVhclBlbmRpbmdDaGVja291dFRpbWVvdXQoY2hlY2tvdXQpIHtcbiAgICBpZiAoIWNoZWNrb3V0LnRpbWVvdXRUaW1lcikgcmV0dXJuXG5cbiAgICBjbGVhclRpbWVvdXQoY2hlY2tvdXQudGltZW91dFRpbWVyKVxuICAgIGNoZWNrb3V0LnRpbWVvdXRUaW1lciA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xvc2UgaWRsZSBjb25uZWN0aW9uIGZvciBwZW5kaW5nIGNoZWNrb3V0IGNhcGFjaXR5LlxuICAgKiBAcGFyYW0ge1BlbmRpbmdDaGVja291dH0gY2hlY2tvdXQgLSBDaGVja291dCB3YWl0aW5nIGZvciBhIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgYW4gaWRsZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgdG8gZnJlZSBjYXBhY2l0eS5cbiAgICovXG4gIGFzeW5jIGNsb3NlSWRsZUNvbm5lY3Rpb25Gb3JQZW5kaW5nQ2hlY2tvdXRDYXBhY2l0eShjaGVja291dCkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmZpbmRJZGxlQ29ubmVjdGlvbkZvclJldXNlS2V5KGNoZWNrb3V0LnJldXNlS2V5KVxuXG4gICAgaWYgKGNvbm5lY3Rpb24pIHJldHVybiBmYWxzZVxuXG4gICAgYXdhaXQgdGhpcy5yZWFwSWRsZUNvbm5lY3Rpb25zKClcblxuICAgIGlmICh0aGlzLmZpbmRJZGxlQ29ubmVjdGlvbkZvclJldXNlS2V5KGNoZWNrb3V0LnJldXNlS2V5KSkgcmV0dXJuIGZhbHNlXG5cbiAgICByZXR1cm4gdGhpcy5jYW5TcGF3bkNvbm5lY3Rpb24oY2hlY2tvdXQuZGF0YWJhc2VDb25maWcpID8gZmFsc2UgOiBhd2FpdCB0aGlzLmNsb3NlT25lSWRsZUNvbm5lY3Rpb25Gb3JDYXBhY2l0eSgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmaW5kIGlkbGUgY29ubmVjdGlvbiBmb3IgcmV1c2Uga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV1c2VLZXkgLSBEYXRhYmFzZSBjb25maWd1cmF0aW9uIHJldXNlIGtleS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAtIE1hdGNoaW5nIGlkbGUgY29ubmVjdGlvbiwgaWYgcHJlc2VudC5cbiAgICovXG4gIGZpbmRJZGxlQ29ubmVjdGlvbkZvclJldXNlS2V5KHJldXNlS2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbnMuZmluZCgoY29ubmVjdGlvbikgPT4gIXRoaXMuY29ubmVjdGlvbkhhc09wZW5UcmFuc2FjdGlvbihjb25uZWN0aW9uKSAmJiB0aGlzLmNvbm5lY3Rpb25NYXRjaGVzUmV1c2VLZXkoY29ubmVjdGlvbiwgcmV1c2VLZXkpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaWRsZSBjb25uZWN0aW9uIGZvciBwZW5kaW5nIGNoZWNrb3V0LlxuICAgKiBAcGFyYW0ge1BlbmRpbmdDaGVja291dH0gY2hlY2tvdXQgLSBDaGVja291dCB3YWl0aW5nIGZvciBhIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkPn0gLSBNYXRjaGluZyBpZGxlIGNvbm5lY3Rpb24sIGlmIG9uZSBjYW4gYmUgcmV1c2VkLlxuICAgKi9cbiAgYXN5bmMgaWRsZUNvbm5lY3Rpb25Gb3JQZW5kaW5nQ2hlY2tvdXQoY2hlY2tvdXQpIHtcbiAgICBsZXQgY29ubmVjdGlvbiA9IHRoaXMudGFrZUlkbGVDb25uZWN0aW9uRm9yUmV1c2VLZXkoY2hlY2tvdXQucmV1c2VLZXksIHtpbmNsdWRlT3BlblRyYW5zYWN0aW9uczogZmFsc2V9KVxuXG4gICAgaWYgKGNvbm5lY3Rpb24pIHJldHVybiBjb25uZWN0aW9uXG5cbiAgICBhd2FpdCB0aGlzLnJlYXBJZGxlQ29ubmVjdGlvbnMoKVxuICAgIGlmICghdGhpcy5wZW5kaW5nQ2hlY2tvdXRzLmluY2x1ZGVzKGNoZWNrb3V0KSkgcmV0dXJuXG5cbiAgICBjb25uZWN0aW9uID0gdGhpcy50YWtlSWRsZUNvbm5lY3Rpb25Gb3JSZXVzZUtleShjaGVja291dC5yZXVzZUtleSwge2luY2x1ZGVPcGVuVHJhbnNhY3Rpb25zOiBmYWxzZX0pXG5cbiAgICByZXR1cm4gY29ubmVjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3Bhd24gYW5kIHJlc29sdmUgcGVuZGluZyBjaGVja291dC5cbiAgICogQHBhcmFtIHtQZW5kaW5nQ2hlY2tvdXR9IGNoZWNrb3V0IC0gQ2hlY2tvdXQgcmVxdWVzdCB0byByZXNvbHZlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBjaGVja291dCBoYXMgYmVlbiBoYW5kbGVkLlxuICAgKi9cbiAgYXN5bmMgc3Bhd25BbmRSZXNvbHZlUGVuZGluZ0NoZWNrb3V0KGNoZWNrb3V0KSB7XG4gICAgbGV0IGNvbm5lY3Rpb25cblxuICAgIHRyeSB7XG4gICAgICBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy5zcGF3bkNvbm5lY3Rpb25Gb3JDaGVja291dChjaGVja291dC5kYXRhYmFzZUNvbmZpZywgY2hlY2tvdXQucmV1c2VLZXkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNoZWNrb3V0LnJlamVjdChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gc3Bhd24gZGF0YWJhc2UgY29ubmVjdGlvbi5cIiwge2NhdXNlOiBlcnJvcn0pKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5yZXNvbHZlUGVuZGluZ0NoZWNrb3V0KGNoZWNrb3V0LCBjb25uZWN0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb2x2ZSBwZW5kaW5nIGNoZWNrb3V0LlxuICAgKiBAcGFyYW0ge1BlbmRpbmdDaGVja291dH0gY2hlY2tvdXQgLSBDaGVja291dCByZXF1ZXN0IHRvIHJlc29sdmUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBDb25uZWN0aW9uIHRvIGFjdGl2YXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBjaGVja291dCBoYXMgYmVlbiBoYW5kbGVkLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZVBlbmRpbmdDaGVja291dChjaGVja291dCwgY29ubmVjdGlvbikge1xuICAgIHRyeSB7XG4gICAgICBjaGVja291dC5yZXNvbHZlKGF3YWl0IHRoaXMuYWN0aXZhdGVDb25uZWN0aW9uKGNvbm5lY3Rpb24sIGNoZWNrb3V0Lm9wdGlvbnMpKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjaGVja291dC5yZWplY3QoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFwiRmFpbGVkIHRvIGFjdGl2YXRlIGRhdGFiYXNlIGNvbm5lY3Rpb24uXCIsIHtjYXVzZTogZXJyb3J9KSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbG9zZSBvbmUgaWRsZSBjb25uZWN0aW9uIGZvciBjYXBhY2l0eS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciBhbiBpZGxlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCB0byBmcmVlIGNhcGFjaXR5LlxuICAgKi9cbiAgYXN5bmMgY2xvc2VPbmVJZGxlQ29ubmVjdGlvbkZvckNhcGFjaXR5KCkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmNvbm5lY3Rpb25zLmZpbmQoKGNhbmRpZGF0ZSkgPT4gIXRoaXMuY29ubmVjdGlvbkhhc09wZW5UcmFuc2FjdGlvbihjYW5kaWRhdGUpKVxuXG4gICAgaWYgKCFjb25uZWN0aW9uKSByZXR1cm4gZmFsc2VcblxuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmNvbm5lY3Rpb25zLmZpbHRlcigoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgIT09IGNvbm5lY3Rpb24pXG4gICAgYXdhaXQgdGhpcy5jbG9zZUNvbm5lY3Rpb24oY29ubmVjdGlvbilcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogUnVucyB3aXRoIGNvbm5lY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLkNvbm5lY3Rpb25DaGVja291dE9wdGlvbnMgfCAoKGFyZzogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQpID0+IFByb21pc2U8VD4pfSBvcHRpb25zT3JDYWxsYmFjayAtIENoZWNrb3V0IG9wdGlvbnMgb3IgY2FsbGJhY2sgdG8gaW52b2tlIHdpdGggdGhlIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7KGFyZzogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQpID0+IFByb21pc2U8VD59IFtjYWxsYmFja10gLSBDYWxsYmFjayB0byBpbnZva2Ugd2l0aCB0aGUgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgd2l0aENvbm5lY3Rpb24ob3B0aW9uc09yQ2FsbGJhY2ssIGNhbGxiYWNrKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zT3JDYWxsYmFjayA9PSBcImZ1bmN0aW9uXCIgPyB7fSA6IG9wdGlvbnNPckNhbGxiYWNrXG4gICAgY29uc3QgYWN0dWFsQ2FsbGJhY2sgPSB0eXBlb2Ygb3B0aW9uc09yQ2FsbGJhY2sgPT0gXCJmdW5jdGlvblwiID8gb3B0aW9uc09yQ2FsbGJhY2sgOiBjYWxsYmFja1xuXG4gICAgaWYgKCFhY3R1YWxDYWxsYmFjaykgdGhyb3cgbmV3IEVycm9yKFwid2l0aENvbm5lY3Rpb24gcmVxdWlyZXMgYSBjYWxsYmFja1wiKVxuXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuY2hlY2tvdXQob3B0aW9ucylcbiAgICBjb25zdCBpZCA9IGNvbm5lY3Rpb24uZ2V0SWRTZXEoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKGlkLCBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgYWN0dWFsQ2FsbGJhY2soY29ubmVjdGlvbilcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tpbihjb25uZWN0aW9uKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBvcGVuQ2FwdHVyZWRDb25uZWN0aW9uKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAqLyBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCByZXVzZUtleSA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICBjb25zdCB3YXNSZXRhaW5lZCA9IHRoaXMubGlmZWN5Y2xlUmV0YWluZWRSZXVzZUtleXMuaGFzKHJldXNlS2V5KVxuXG4gICAgdGhpcy5saWZlY3ljbGVSZXRhaW5lZFJldXNlS2V5cy5hZGQocmV1c2VLZXkpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBhd2FpdCB0aGlzLmNoZWNrb3V0Rm9yQ29uZmlndXJhdGlvbihkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIHtuYW1lOiBcIkZyb250ZW5kIHRlbmFudCBTUUxpdGUgb3BlblwifSlcbiAgICAgIGF3YWl0IHRoaXMuY2hlY2tpbihjb25uZWN0aW9uKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIXdhc1JldGFpbmVkKSB0aGlzLmxpZmVjeWNsZVJldGFpbmVkUmV1c2VLZXlzLmRlbGV0ZShyZXVzZUtleSlcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZmx1c2hDYXB0dXJlZENvbm5lY3Rpb24oLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIGRhdGFiYXNlQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IHJldXNlS2V5ID0gdGhpcy5nZXRDb25maWd1cmF0aW9uUmV1c2VLZXkoZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmxpZmVjeWNsZVJldGFpbmVkQ29ubmVjdGlvbnMuZ2V0KHJldXNlS2V5KVxuICAgICAgfHwgdGhpcy5jb25uZWN0aW9ucy5maW5kKChjYW5kaWRhdGUpID0+IHRoaXMuZ2V0Q29ubmVjdGlvbkNvbmZpZ3VyYXRpb25SZXVzZUtleShjYW5kaWRhdGUpID09PSByZXVzZUtleSlcbiAgICBpZiAoY29ubmVjdGlvbikgYXdhaXQgY29ubmVjdGlvbi5mbHVzaFBlbmRpbmdXcml0ZXMoKVxuICB9XG5cbiAgYXN5bmMgY2xvc2VDYXB0dXJlZENvbm5lY3Rpb24oLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIGRhdGFiYXNlQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IHJldXNlS2V5ID0gdGhpcy5nZXRDb25maWd1cmF0aW9uUmV1c2VLZXkoZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgIGlmICh0aGlzLmNhcHR1cmVkQ29ubmVjdGlvbkluVXNlKGRhdGFiYXNlQ29uZmlndXJhdGlvbikpIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjbG9zZSBhbiBpbi11c2UgZnJvbnRlbmQgdGVuYW50IFNRTGl0ZSBoYW5kbGVcIilcbiAgICBjb25zdCByZXRhaW5lZENvbm5lY3Rpb24gPSB0aGlzLmxpZmVjeWNsZVJldGFpbmVkQ29ubmVjdGlvbnMuZ2V0KHJldXNlS2V5KVxuICAgIHRoaXMubGlmZWN5Y2xlUmV0YWluZWRSZXVzZUtleXMuZGVsZXRlKHJldXNlS2V5KVxuICAgIHRoaXMubGlmZWN5Y2xlUmV0YWluZWRDb25uZWN0aW9ucy5kZWxldGUocmV1c2VLZXkpXG4gICAgY29uc3QgY29ubmVjdGlvbnMgPSB0aGlzLmNvbm5lY3Rpb25zLmZpbHRlcigoY2FuZGlkYXRlKSA9PiB0aGlzLmdldENvbm5lY3Rpb25Db25maWd1cmF0aW9uUmV1c2VLZXkoY2FuZGlkYXRlKSA9PT0gcmV1c2VLZXkpXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IHRoaXMuY29ubmVjdGlvbnMuZmlsdGVyKChjYW5kaWRhdGUpID0+IHRoaXMuZ2V0Q29ubmVjdGlvbkNvbmZpZ3VyYXRpb25SZXVzZUtleShjYW5kaWRhdGUpICE9PSByZXVzZUtleSlcbiAgICBpZiAocmV0YWluZWRDb25uZWN0aW9uKSBjb25uZWN0aW9ucy5wdXNoKHJldGFpbmVkQ29ubmVjdGlvbilcbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgY29ubmVjdGlvbnMpIGF3YWl0IHRoaXMuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3Rpb24pXG4gIH1cblxuICBhc3luYyBkZWxldGVDYXB0dXJlZERhdGFiYXNlKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAqLyBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBhd2FpdCB0aGlzLmNsb3NlQ2FwdHVyZWRDb25uZWN0aW9uKGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICBjb25zdCBEcml2ZXJDbGFzcyA9IGRhdGFiYXNlQ29uZmlndXJhdGlvbi5kcml2ZXIgfHwgdGhpcy5kcml2ZXJDbGFzc1xuICAgIGlmICghRHJpdmVyQ2xhc3MpIHRocm93IG5ldyBFcnJvcihcIk5vIGRyaXZlciBjbGFzcyBjb25maWd1cmVkIGZvciBmcm9udGVuZCB0ZW5hbnQgU1FMaXRlIGRlbGV0aW9uXCIpXG4gICAgYXdhaXQgbmV3IERyaXZlckNsYXNzKGRhdGFiYXNlQ29uZmlndXJhdGlvbiwgdGhpcy5jb25maWd1cmF0aW9uKS5kZWxldGVEYXRhYmFzZVN0b3JhZ2UoKVxuICB9XG5cbiAgY2FwdHVyZWRDb25uZWN0aW9uSW5Vc2UoLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIGRhdGFiYXNlQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IHJldXNlS2V5ID0gdGhpcy5nZXRDb25maWd1cmF0aW9uUmV1c2VLZXkoZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuY29ubmVjdGlvbnNJblVzZSkuc29tZSgoY29ubmVjdGlvbikgPT4gdGhpcy5nZXRDb25uZWN0aW9uQ29uZmlndXJhdGlvblJldXNlS2V5KGNvbm5lY3Rpb24pID09PSByZXVzZUtleSlcbiAgfVxuXG4gIGNhcHR1cmVkQ29ubmVjdGlvbkhhc1BlbmRpbmdXcml0ZXMoLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIGRhdGFiYXNlQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IHJldXNlS2V5ID0gdGhpcy5nZXRDb25maWd1cmF0aW9uUmV1c2VLZXkoZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gWy4uLnRoaXMuY29ubmVjdGlvbnMsIC4uLk9iamVjdC52YWx1ZXModGhpcy5jb25uZWN0aW9uc0luVXNlKSwgLi4udGhpcy5saWZlY3ljbGVSZXRhaW5lZENvbm5lY3Rpb25zLnZhbHVlcygpXVxuICAgIHJldHVybiBjb25uZWN0aW9ucy5zb21lKChjb25uZWN0aW9uKSA9PiB0aGlzLmdldENvbm5lY3Rpb25Db25maWd1cmF0aW9uUmV1c2VLZXkoY29ubmVjdGlvbikgPT09IHJldXNlS2V5ICYmIGNvbm5lY3Rpb24uaGFzUGVuZGluZ1dyaXRlcygpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBjYXB0dXJlZCBvcGVyYXRpb24gdGhyb3VnaCB0aGUgbm9ybWFsIGJvdW5kZWQgcG9vbCBsaWZlY3ljbGUuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLkNhcHR1cmVkQ29ubmVjdGlvbk9wdGlvbnN9IG9wdGlvbnMgLSBDYXB0dXJlZCBjaGVja291dCBvcHRpb25zLlxuICAgKiBAcGFyYW0geyhjb25uZWN0aW9uOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCwgb3duZXI6IHN5bWJvbCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBPcGVyYXRpb24gY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhDYXB0dXJlZE9wZXJhdGlvbkNvbm5lY3Rpb24oe2RhdGFiYXNlQ29uZmlndXJhdGlvbiwgbmFtZX0sIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuY2hlY2tvdXRGb3JDb25maWd1cmF0aW9uKGRhdGFiYXNlQ29uZmlndXJhdGlvbiwge25hbWV9KVxuICAgIGNvbnN0IGlkID0gY29ubmVjdGlvbi5nZXRJZFNlcSgpXG4gICAgY29uc3Qgb3duZXIgPSBTeW1ib2woXCJjYXB0dXJlZC1kYXRhYmFzZS1vcGVyYXRpb24tb3duZXJcIilcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bihpZCwgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKGNvbm5lY3Rpb24sIG93bmVyKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja2luKGNvbm5lY3Rpb24pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBjdXJyZW50IGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gLSBUaGUgY3VycmVudCBjb25uZWN0aW9uLlxuICAgKi9cbiAgZ2V0Q3VycmVudENvbm5lY3Rpb24oKSB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5jdXJyZW50RmFsbGJhY2tDb25uZWN0aW9uT3JGYWlsKClcbiAgICBpZiAoaWQgPT09IFNVUFBSRVNTRURfQ09OTkVDVElPTl9DT05URVhUKSByZXR1cm4gdGhpcy5jdXJyZW50RmFsbGJhY2tDb25uZWN0aW9uT3JGYWlsKClcblxuICAgIHRoaXMuZW5zdXJlQ29ubmVjdGlvbklzSW5Vc2UoaWQpXG5cbiAgICBjb25zdCBjdXJyZW50Q29ubmVjdGlvbiA9IHRoaXMuY29ubmVjdGlvbnNJblVzZVtpZF1cblxuICAgIGlmICghY3VycmVudENvbm5lY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZ2V0IGN1cnJlbnQgY29ubmVjdGlvbiBmcm9tIHRoYXQgSUQ6ICR7aWR9YClcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudENvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGN1cnJlbnQgZmFsbGJhY2sgY29ubmVjdGlvbiBvciBmYWlsLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IC0gRmFsbGJhY2sgY29ubmVjdGlvbiwgaWYgcHJlc2VudC5cbiAgICovXG4gIGN1cnJlbnRGYWxsYmFja0Nvbm5lY3Rpb25PckZhaWwoKSB7XG4gICAgY29uc3QgZmFsbGJhY2tDb25uZWN0aW9uID0gdGhpcy5nZXRHbG9iYWxDb25uZWN0aW9uKClcblxuICAgIGlmIChmYWxsYmFja0Nvbm5lY3Rpb24pIHJldHVybiBmYWxsYmFja0Nvbm5lY3Rpb25cblxuICAgIHRocm93IG5ldyBFcnJvcihcIklEIGhhc24ndCBiZWVuIHNldCBmb3IgdGhpcyBhc3luYyBjb250ZXh0XCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBlbnN1cmUgY29ubmVjdGlvbiBpcyBpbiB1c2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIENoZWNrZWQtb3V0IGNvbm5lY3Rpb24gaWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZW5zdXJlQ29ubmVjdGlvbklzSW5Vc2UoaWQpIHtcbiAgICBpZiAoIShpZCBpbiB0aGlzLmNvbm5lY3Rpb25zSW5Vc2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbm5lY3Rpb24gJHtpZH0gZG9lc24ndCBleGlzdCBhbnkgbW9yZSAtIGhhcyBpdCBiZWVuIGNoZWNrZWQgaW4gYWdhaW4/YClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgZmFsbGJhY2sgY29ubmVjdGlvbiBmb3IgdGhpcyBwb29sIGlkZW50aWZpZXIgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiBubyBhc3luYyBjb250ZXh0IGlzIGF2YWlsYWJsZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIENvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldEdsb2JhbENvbm5lY3Rpb24oY29ubmVjdGlvbikge1xuICAgIGNvbnN0IGtsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgVmVsb2Npb3VzRGF0YWJhc2VQb29sQXN5bmNUcmFja2VkTXVsdGlDb25uZWN0aW9ufSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcbiAgICBsZXQgbWFwRm9yQ29uZmlndXJhdGlvbiA9IGtsYXNzLmdsb2JhbENvbm5lY3Rpb25zLmdldCh0aGlzLmNvbmZpZ3VyYXRpb24pXG5cbiAgICBpZiAoIW1hcEZvckNvbmZpZ3VyYXRpb24pIHtcbiAgICAgIG1hcEZvckNvbmZpZ3VyYXRpb24gPSB7fVxuICAgICAga2xhc3MuZ2xvYmFsQ29ubmVjdGlvbnMuc2V0KHRoaXMuY29uZmlndXJhdGlvbiwgbWFwRm9yQ29uZmlndXJhdGlvbilcbiAgICB9XG5cbiAgICBtYXBGb3JDb25maWd1cmF0aW9uW3RoaXMuaWRlbnRpZmllcl0gPSBjb25uZWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyBhIGdsb2JhbCBmYWxsYmFjayBjb25uZWN0aW9uIGV4aXN0cyBmb3IgdGhpcyBwb29sIGlkZW50aWZpZXIgYW5kIHJldHVybnMgaXQuXG4gICAqIElmIG9uZSBpcyBhbHJlYWR5IHNldCwgaXQgaXMgcmV0dXJuZWQgYW5kIGFsc28gbWFkZSBhdmFpbGFibGUgaW4gdGhlIHBvb2wgcXVldWUuXG4gICAqIE90aGVyd2lzZSBhIG5ldyBjb25uZWN0aW9uIGlzIHNwYXduZWQsIHJlZ2lzdGVyZWQsIGFuZCBxdWV1ZWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBnbG9iYWwgY29ubmVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGVuc3VyZUdsb2JhbENvbm5lY3Rpb24oKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldEdsb2JhbENvbm5lY3Rpb24oKVxuXG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3RpbmdcblxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBhd2FpdCB0aGlzLnNwYXduQ29ubmVjdGlvbigpXG5cbiAgICB0aGlzLnNldEdsb2JhbENvbm5lY3Rpb24oY29ubmVjdGlvbilcblxuICAgIHJldHVybiBjb25uZWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgc2hhcmVkIGNvbm5lY3Rpb24gZm9yIHRlc3QgbW9kZSBzbyB0aGF0IEhUVFAgaGFuZGxlcnMgcnVubmluZ1xuICAgKiBpbiB0aGUgc2FtZSBwcm9jZXNzIGNhbiByZXVzZSB0aGUgdGVzdCBydW5uZXIncyBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gU2hhcmVkIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2Jhc2UuanNcIikuVGVzdFNoYXJlZENvbm5lY3Rpb25SZWdpc3RyYXRpb259IC0gT3BhcXVlIHJlZ2lzdHJhdGlvbiBoYW5kbGUuXG4gICAqL1xuICBzZXRUZXN0U2hhcmVkQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0ge293bmVyOiBTeW1ib2woXCJ0ZXN0LXNoYXJlZC1jb25uZWN0aW9uXCIpfVxuXG4gICAgdGhpcy5fdGVzdFNoYXJlZENvbm5lY3Rpb24gPSBjb25uZWN0aW9uXG4gICAgdGhpcy5fdGVzdFNoYXJlZENvbm5lY3Rpb25Qcm92aWRlciA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX3Rlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9uID0gcmVnaXN0cmF0aW9uXG5cbiAgICByZXR1cm4gcmVnaXN0cmF0aW9uXG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIHByb3ZpZGVyIHRoYXQgaXMgZXZhbHVhdGVkIHdoZW4gYW4gaW4tcHJvY2VzcyB0ZXN0IHJlcXVlc3QgaXMgZGlzcGF0Y2hlZC5cbiAgICogQHBhcmFtIHsoKSA9PiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gcHJvdmlkZXIgLSBTaGFyZWQgY29ubmVjdGlvbiBwcm92aWRlci5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vYmFzZS5qc1wiKS5UZXN0U2hhcmVkQ29ubmVjdGlvblJlZ2lzdHJhdGlvbn0gLSBPcGFxdWUgcmVnaXN0cmF0aW9uIGhhbmRsZS5cbiAgICovXG4gIHNldFRlc3RTaGFyZWRDb25uZWN0aW9uUHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSB7b3duZXI6IFN5bWJvbChcInRlc3Qtc2hhcmVkLWNvbm5lY3Rpb24tcHJvdmlkZXJcIil9XG5cbiAgICB0aGlzLl90ZXN0U2hhcmVkQ29ubmVjdGlvbiA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX3Rlc3RTaGFyZWRDb25uZWN0aW9uUHJvdmlkZXIgPSBwcm92aWRlclxuICAgIHRoaXMuX3Rlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9uID0gcmVnaXN0cmF0aW9uXG5cbiAgICByZXR1cm4gcmVnaXN0cmF0aW9uXG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIHRoZSBjdXJyZW50IHNoYXJlZCBjb25uZWN0aW9uIHJlZ2lzdHJhdGlvbi4gQSBzdXBwbGllZCBzdGFsZSByZWdpc3RyYXRpb25cbiAgICogY2Fubm90IGNsZWFyIGEgcHJvdmlkZXIgaW5zdGFsbGVkIGJ5IGEgbmV3ZXIgbGlmZWN5Y2xlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vYmFzZS5qc1wiKS5UZXN0U2hhcmVkQ29ubmVjdGlvblJlZ2lzdHJhdGlvbn0gW3JlZ2lzdHJhdGlvbl0gLSBPcGFxdWUgcmVnaXN0cmF0aW9uIGhhbmRsZSB0byBjbGVhciBjb25kaXRpb25hbGx5LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgY2xlYXJUZXN0U2hhcmVkQ29ubmVjdGlvbihyZWdpc3RyYXRpb24pIHtcbiAgICBpZiAocmVnaXN0cmF0aW9uICYmIHJlZ2lzdHJhdGlvbiAhPT0gdGhpcy5fdGVzdFNoYXJlZENvbm5lY3Rpb25SZWdpc3RyYXRpb24pIHJldHVyblxuXG4gICAgdGhpcy5fdGVzdFNoYXJlZENvbm5lY3Rpb24gPSB1bmRlZmluZWRcbiAgICB0aGlzLl90ZXN0U2hhcmVkQ29ubmVjdGlvblByb3ZpZGVyID0gdW5kZWZpbmVkXG4gICAgdGhpcy5fdGVzdFNoYXJlZENvbm5lY3Rpb25SZWdpc3RyYXRpb24gPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgY2FsbGJhY2sgaW5zaWRlIHRoZSB0ZXN0IHNoYXJlZCBjb25uZWN0aW9uJ3MgYXN5bmMgY29udGV4dCwgc28gbmVzdGVkXG4gICAqIGBnZXRDdXJyZW50Q29ubmVjdGlvbmAvYGVuc3VyZUNvbm5lY3Rpb25zYCByZXVzZSBpdCAod2l0aCBhIHJlYWwgY29udGV4dCkgcmF0aGVyXG4gICAqIHRoYW4gY2hlY2tpbmcgb3V0IGEgZnJlc2ggcG9vbGVkIGNvbm5lY3Rpb24uIFVzZWQgdG8gcnVuIGFuIGluLXByb2Nlc3MgcmVxdWVzdFxuICAgKiBoYW5kbGVyIG9uIHRoZSBzYW1lIGNvbm5lY3Rpb24g4oCUIGFuZCBvcGVuIHRyYW5zYWN0aW9uIOKAlCBhcyB0aGUgdGVzdCBib2R5LiBOby1vcFxuICAgKiAocnVucyB0aGUgY2FsbGJhY2sgYXMtaXMpIHdoZW4gbm8gc2hhcmVkIGNvbm5lY3Rpb24gaXMgc2V0LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0geygpID0+IFR9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gcnVuIGluIHRoZSBzaGFyZWQgY29ubmVjdGlvbidzIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIHtUfSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIHJ1bldpdGhUZXN0U2hhcmVkQ29ubmVjdGlvbihjYWxsYmFjaykge1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLnRlc3RTaGFyZWRDb25uZWN0aW9uKClcblxuICAgIGlmICghY29ubmVjdGlvbikgcmV0dXJuIGNhbGxiYWNrKClcblxuICAgIHJldHVybiB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bihjb25uZWN0aW9uLmdldElkU2VxKCksIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBjb25uZWN0aW9uIGN1cnJlbnRseSBlbGlnaWJsZSBmb3IgaW4tcHJvY2VzcyB0ZXN0IHJlcXVlc3Qgc2hhcmluZy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAtIFNoYXJlZCBjb25uZWN0aW9uLlxuICAgKi9cbiAgdGVzdFNoYXJlZENvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rlc3RTaGFyZWRDb25uZWN0aW9uUHJvdmlkZXJcbiAgICAgID8gdGhpcy5fdGVzdFNoYXJlZENvbm5lY3Rpb25Qcm92aWRlcigpXG4gICAgICA6IHRoaXMuX3Rlc3RTaGFyZWRDb25uZWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29ubmVjdGlvbiB0aWVkIHRvIHRoZSBjdXJyZW50IGFzeW5jIGNvbnRleHQsIGlmIGFueS5cbiAgICogRmFsbHMgYmFjayB0byB0aGUgdGVzdCBzaGFyZWQgY29ubmVjdGlvbiB3aGVuIG5vIGFzeW5jIGNvbnRleHQgZXhpc3RzLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IC0gVGhlIGN1cnJlbnQgY29udGV4dCBjb25uZWN0aW9uLlxuICAgKi9cbiAgZ2V0Q3VycmVudENvbnRleHRDb25uZWN0aW9uKCkge1xuICAgIGNvbnN0IGlkID0gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5nZXRTdG9yZSgpXG5cbiAgICBpZiAoaWQgPT09IFNVUFBSRVNTRURfQ09OTkVDVElPTl9DT05URVhUKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLnRlc3RTaGFyZWRDb25uZWN0aW9uKClcblxuICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRDb25uZWN0aW9uKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwb29sIGhhcyBhIHJlYWwgYXN5bmMgY29udGV4dCBmb3IgdGhlIGN1cnJlbnQgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBuZXN0ZWQgY29kZSBjYW4gcmV1c2UgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBjb250ZXh0LlxuICAgKi9cbiAgaGFzQ3VycmVudENvbm5lY3Rpb25Db250ZXh0KCkge1xuICAgIGNvbnN0IGlkID0gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5nZXRTdG9yZSgpXG5cbiAgICByZXR1cm4gaWQgIT09IHVuZGVmaW5lZCAmJiBpZCAhPT0gU1VQUFJFU1NFRF9DT05ORUNUSU9OX0NPTlRFWFRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBkZWJ1ZyBzbmFwc2hvdC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vYmFzZS5qc1wiKS5EYXRhYmFzZVBvb2xEZWJ1Z1NuYXBzaG90fSAtIERpYWdub3N0aWMgc25hcHNob3QgZm9yIHRoaXMgcG9vbC5cbiAgICovXG4gIGdldERlYnVnU25hcHNob3QoKSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBzdXBlci5nZXREZWJ1Z1NuYXBzaG90KClcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gICAgY29uc3Qge2Nvbm5lY3Rpb25zfSA9IHRoaXMuZGVidWdDb25uZWN0aW9uU25hcHNob3RzKG5vdylcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zbmFwc2hvdCxcbiAgICAgIGNvbm5lY3Rpb25zLFxuICAgICAgY29ubmVjdGlvbnNCZWluZ1NwYXduZWQ6IHRoaXMuY29ubmVjdGlvbnNCZWluZ1NwYXduZWQsXG4gICAgICBpZGxlQ291bnQ6IHRoaXMuY29ubmVjdGlvbnMubGVuZ3RoICsgWy4uLnRoaXMubGlmZWN5Y2xlUmV0YWluZWRDb25uZWN0aW9ucy52YWx1ZXMoKV0uZmlsdGVyKChjb25uZWN0aW9uKSA9PiBjb25uZWN0aW9uLmdldElkU2VxKCkgPT09IHVuZGVmaW5lZCkubGVuZ3RoLFxuICAgICAgaW5Vc2VDb3VudDogT2JqZWN0LmtleXModGhpcy5jb25uZWN0aW9uc0luVXNlKS5sZW5ndGgsXG4gICAgICBwZW5kaW5nQ2hlY2tvdXRzOiB0aGlzLnBlbmRpbmdDaGVja291dERlYnVnU25hcHNob3RzKG5vdyksXG4gICAgICBwZW5kaW5nQ2hlY2tvdXRDb3VudDogdGhpcy5wZW5kaW5nQ2hlY2tvdXRzLmxlbmd0aCxcbiAgICAgIHRlbGVtZXRyeTogey4uLnRoaXMudGVsZW1ldHJ5fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRlYnVnIGNvbm5lY3Rpb24gc25hcHNob3RzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbm93IC0gQ3VycmVudCB0aW1lc3RhbXAuXG4gICAqIEByZXR1cm5zIHt7Y29ubmVjdGlvbnM6IEFycmF5PFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj4sIHNlZW5Db25uZWN0aW9uczogU2V0PGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn19IC0gQ29ubmVjdGlvbiBzbmFwc2hvdHMgYW5kIHNlZW4gc2V0LlxuICAgKi9cbiAgZGVidWdDb25uZWN0aW9uU25hcHNob3RzKG5vdykge1xuICAgIC8qKlxuICAgICAqIENvbm5lY3Rpb25zLlxuICAgICAqIEB0eXBlIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSAqL1xuICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gW11cbiAgICBjb25zdCBzZWVuQ29ubmVjdGlvbnMgPSBuZXcgU2V0KClcblxuICAgIHRoaXMuYWRkSW5Vc2VEZWJ1Z0Nvbm5lY3Rpb25TbmFwc2hvdHMoe2Nvbm5lY3Rpb25zLCBub3csIHNlZW5Db25uZWN0aW9uc30pXG4gICAgdGhpcy5hZGRJZGxlRGVidWdDb25uZWN0aW9uU25hcHNob3RzKHtjb25uZWN0aW9ucywgbm93LCBzZWVuQ29ubmVjdGlvbnN9KVxuICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLmxpZmVjeWNsZVJldGFpbmVkQ29ubmVjdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIHRoaXMuYWRkRGVidWdDb25uZWN0aW9uU25hcHNob3RJZlVuc2Vlbih7Y29ubmVjdGlvbiwgY29ubmVjdGlvbnMsIHJlYXBhYmxlOiBmYWxzZSwgc2VlbkNvbm5lY3Rpb25zLCBzdGF0ZTogXCJsaWZlY3ljbGUtcmV0YWluZWRcIn0pXG4gICAgfVxuICAgIHRoaXMuYWRkRmFsbGJhY2tEZWJ1Z0Nvbm5lY3Rpb25TbmFwc2hvdHMoe2Nvbm5lY3Rpb25zLCBzZWVuQ29ubmVjdGlvbnN9KVxuXG4gICAgcmV0dXJuIHtjb25uZWN0aW9ucywgc2VlbkNvbm5lY3Rpb25zfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGluIHVzZSBkZWJ1ZyBjb25uZWN0aW9uIHNuYXBzaG90cy5cbiAgICogQHBhcmFtIHt7Y29ubmVjdGlvbnM6IEFycmF5PFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj4sIG5vdzogbnVtYmVyLCBzZWVuQ29ubmVjdGlvbnM6IFNldDxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59fSBhcmdzIC0gU25hcHNob3QgY29sbGVjdGlvbiBzdGF0ZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhZGRJblVzZURlYnVnQ29ubmVjdGlvblNuYXBzaG90cyh7Y29ubmVjdGlvbnMsIG5vdywgc2VlbkNvbm5lY3Rpb25zfSkge1xuICAgIGZvciAoY29uc3QgW2lkLCBjb25uZWN0aW9uXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmNvbm5lY3Rpb25zSW5Vc2UpKSB7XG4gICAgICBjb25zdCB0cmFja2VkQ29ubmVjdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgJiB7W0NPTk5FQ1RJT05fQ0hFQ0tFRF9PVVRfQVRdPzogbnVtYmVyfX0gKi8gKGNvbm5lY3Rpb24pXG4gICAgICBjb25zdCBjaGVja2VkT3V0QXQgPSB0cmFja2VkQ29ubmVjdGlvbltDT05ORUNUSU9OX0NIRUNLRURfT1VUX0FUXVxuICAgICAgY29uc3QgY2hlY2tlZE91dEZvck1zID0gdHlwZW9mIGNoZWNrZWRPdXRBdCA9PT0gXCJudW1iZXJcIiA/IE1hdGgubWF4KDAsIG5vdyAtIGNoZWNrZWRPdXRBdCkgOiB1bmRlZmluZWRcblxuICAgICAgc2VlbkNvbm5lY3Rpb25zLmFkZChjb25uZWN0aW9uKVxuICAgICAgY29ubmVjdGlvbnMucHVzaCh0aGlzLmRlYnVnQ29ubmVjdGlvblNuYXBzaG90KGNvbm5lY3Rpb24sIHtjaGVja2VkT3V0QXQsIGNoZWNrZWRPdXRGb3JNcywgY2hlY2tvdXRJZDogaWQsIHN0YXRlOiBcImluLXVzZVwifSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGlkbGUgZGVidWcgY29ubmVjdGlvbiBzbmFwc2hvdHMuXG4gICAqIEBwYXJhbSB7e2Nvbm5lY3Rpb25zOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+LCBub3c6IG51bWJlciwgc2VlbkNvbm5lY3Rpb25zOiBTZXQ8aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+fX0gYXJncyAtIFNuYXBzaG90IGNvbGxlY3Rpb24gc3RhdGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYWRkSWRsZURlYnVnQ29ubmVjdGlvblNuYXBzaG90cyh7Y29ubmVjdGlvbnMsIG5vdywgc2VlbkNvbm5lY3Rpb25zfSkge1xuICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLmNvbm5lY3Rpb25zKSB7XG4gICAgICBpZiAoc2VlbkNvbm5lY3Rpb25zLmhhcyhjb25uZWN0aW9uKSkgY29udGludWVcblxuICAgICAgc2VlbkNvbm5lY3Rpb25zLmFkZChjb25uZWN0aW9uKVxuXG4gICAgICBjb25zdCB0cmFja2VkQ29ubmVjdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgJiB7W0lETEVfQ09OTkVDVElPTl9DSEVDS0VEX0lOX0FUXT86IG51bWJlcn19ICovIChjb25uZWN0aW9uKVxuICAgICAgY29uc3QgY2hlY2tlZEluQXQgPSB0cmFja2VkQ29ubmVjdGlvbltJRExFX0NPTk5FQ1RJT05fQ0hFQ0tFRF9JTl9BVF1cbiAgICAgIGNvbnN0IGlkbGVGb3JNcyA9IHR5cGVvZiBjaGVja2VkSW5BdCA9PT0gXCJudW1iZXJcIiA/IE1hdGgubWF4KDAsIG5vdyAtIGNoZWNrZWRJbkF0KSA6IHVuZGVmaW5lZFxuXG4gICAgICBjb25uZWN0aW9ucy5wdXNoKHRoaXMuZGVidWdDb25uZWN0aW9uU25hcHNob3QoY29ubmVjdGlvbiwge2NoZWNrZWRJbkF0LCBpZGxlRm9yTXMsIHN0YXRlOiBcImlkbGVcIn0pKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBmYWxsYmFjayBkZWJ1ZyBjb25uZWN0aW9uIHNuYXBzaG90cy5cbiAgICogQHBhcmFtIHt7Y29ubmVjdGlvbnM6IEFycmF5PFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj4sIHNlZW5Db25uZWN0aW9uczogU2V0PGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn19IGFyZ3MgLSBTbmFwc2hvdCBjb2xsZWN0aW9uIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFkZEZhbGxiYWNrRGVidWdDb25uZWN0aW9uU25hcHNob3RzKHtjb25uZWN0aW9ucywgc2VlbkNvbm5lY3Rpb25zfSkge1xuICAgIHRoaXMuYWRkRGVidWdDb25uZWN0aW9uU25hcHNob3RJZlVuc2Vlbih7Y29ubmVjdGlvbjogdGhpcy5nZXRHbG9iYWxDb25uZWN0aW9uRm9ySWRlbnRpZmllcigpLCBjb25uZWN0aW9ucywgcmVhcGFibGU6IGZhbHNlLCBzZWVuQ29ubmVjdGlvbnMsIHN0YXRlOiBcImdsb2JhbFwifSlcbiAgICB0aGlzLmFkZERlYnVnQ29ubmVjdGlvblNuYXBzaG90SWZVbnNlZW4oe2Nvbm5lY3Rpb246IHRoaXMuX3Rlc3RTaGFyZWRDb25uZWN0aW9uLCBjb25uZWN0aW9ucywgcmVhcGFibGU6IGZhbHNlLCBzZWVuQ29ubmVjdGlvbnMsIHN0YXRlOiBcInRlc3Qtc2hhcmVkXCJ9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGRlYnVnIGNvbm5lY3Rpb24gc25hcHNob3QgaWYgdW5zZWVuLlxuICAgKiBAcGFyYW0ge3tjb25uZWN0aW9uOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZCwgY29ubmVjdGlvbnM6IEFycmF5PFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj4sIHJlYXBhYmxlPzogYm9vbGVhbiwgc2VlbkNvbm5lY3Rpb25zOiBTZXQ8aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+LCBzdGF0ZTogc3RyaW5nfX0gYXJncyAtIFNuYXBzaG90IGNvbGxlY3Rpb24gc3RhdGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYWRkRGVidWdDb25uZWN0aW9uU25hcHNob3RJZlVuc2Vlbih7Y29ubmVjdGlvbiwgY29ubmVjdGlvbnMsIHJlYXBhYmxlLCBzZWVuQ29ubmVjdGlvbnMsIHN0YXRlfSkge1xuICAgIGlmICghY29ubmVjdGlvbiB8fCBzZWVuQ29ubmVjdGlvbnMuaGFzKGNvbm5lY3Rpb24pKSByZXR1cm5cblxuICAgIHNlZW5Db25uZWN0aW9ucy5hZGQoY29ubmVjdGlvbilcbiAgICBjb25uZWN0aW9ucy5wdXNoKHRoaXMuZGVidWdDb25uZWN0aW9uU25hcHNob3QoY29ubmVjdGlvbiwge3JlYXBhYmxlLCBzdGF0ZX0pKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcGVuZGluZyBjaGVja291dCBkZWJ1ZyBzbmFwc2hvdHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBub3cgLSBDdXJyZW50IHRpbWVzdGFtcC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vYmFzZS5qc1wiKS5EYXRhYmFzZVBvb2xQZW5kaW5nQ2hlY2tvdXREZWJ1Z1NuYXBzaG90W119IC0gUGVuZGluZyBjaGVja291dCBzbmFwc2hvdHMuXG4gICAqL1xuICBwZW5kaW5nQ2hlY2tvdXREZWJ1Z1NuYXBzaG90cyhub3cpIHtcbiAgICByZXR1cm4gdGhpcy5wZW5kaW5nQ2hlY2tvdXRzLm1hcCgoY2hlY2tvdXQsIGluZGV4KSA9PiAoe1xuICAgICAgY2hlY2tvdXROYW1lOiBjaGVja291dC5vcHRpb25zLm5hbWUsXG4gICAgICBlbnF1ZXVlZEF0OiBjaGVja291dC5lbnF1ZXVlZEF0LFxuICAgICAgaW5kZXgsXG4gICAgICByZW1haW5pbmdUaW1lb3V0TXM6IGNoZWNrb3V0LnRpbWVvdXRBdCA9PT0gbnVsbCA/IG51bGwgOiBNYXRoLm1heCgwLCBjaGVja291dC50aW1lb3V0QXQgLSBub3cpLFxuICAgICAgcmV1c2VLZXk6IGNoZWNrb3V0LnJldXNlS2V5LFxuICAgICAgdGltZW91dEF0OiBjaGVja291dC50aW1lb3V0QXQsXG4gICAgICB0aW1lb3V0TWlsbGlzOiBjaGVja291dC50aW1lb3V0TWlsbGlzLFxuICAgICAgd2FpdGluZ0Zvck1zOiBNYXRoLm1heCgwLCBub3cgLSBjaGVja291dC5lbnF1ZXVlZEF0KVxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGdsb2JhbCBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IC0gVGhlIGdsb2JhbCBjb25uZWN0aW9uLlxuICAgKi9cbiAgZ2V0R2xvYmFsQ29ubmVjdGlvbigpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5nZXRHbG9iYWxDb25uZWN0aW9uRm9ySWRlbnRpZmllcigpXG5cbiAgICBpZiAoIWNvbm5lY3Rpb24pIHJldHVyblxuICAgIGlmICghdGhpcy5jb25uZWN0aW9uTWF0Y2hlc0N1cnJlbnRDb25maWd1cmF0aW9uKGNvbm5lY3Rpb24pKSByZXR1cm5cblxuICAgIHJldHVybiBjb25uZWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgZ2xvYmFsIGNvbm5lY3Rpb24gZm9yIGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gLSBUaGUgZ2xvYmFsIGNvbm5lY3Rpb24gZm9yIHRoaXMgcG9vbCBpZGVudGlmaWVyLlxuICAgKi9cbiAgZ2V0R2xvYmFsQ29ubmVjdGlvbkZvcklkZW50aWZpZXIoKSB7XG4gICAgY29uc3Qga2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBWZWxvY2lvdXNEYXRhYmFzZVBvb2xBc3luY1RyYWNrZWRNdWx0aUNvbm5lY3Rpb259ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICAgIGNvbnN0IG1hcEZvckNvbmZpZ3VyYXRpb24gPSBrbGFzcy5nbG9iYWxDb25uZWN0aW9ucy5nZXQodGhpcy5jb25maWd1cmF0aW9uKVxuXG4gICAgcmV0dXJuIG1hcEZvckNvbmZpZ3VyYXRpb24/Llt0aGlzLmlkZW50aWZpZXJdXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGVhciBnbG9iYWwgY29ubmVjdGlvbiBmb3IgaWRlbnRpZmllci5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgY2xlYXJHbG9iYWxDb25uZWN0aW9uRm9ySWRlbnRpZmllcigpIHtcbiAgICBjb25zdCBrbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIFZlbG9jaW91c0RhdGFiYXNlUG9vbEFzeW5jVHJhY2tlZE11bHRpQ29ubmVjdGlvbn0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgbWFwRm9yQ29uZmlndXJhdGlvbiA9IGtsYXNzLmdsb2JhbENvbm5lY3Rpb25zLmdldCh0aGlzLmNvbmZpZ3VyYXRpb24pXG5cbiAgICBpZiAoIW1hcEZvckNvbmZpZ3VyYXRpb24pIHJldHVyblxuXG4gICAgZGVsZXRlIG1hcEZvckNvbmZpZ3VyYXRpb25bdGhpcy5pZGVudGlmaWVyXVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBzY2hlbWEgbWV0YWRhdGEgY2FjaGVkIGJ5IGV2ZXJ5IGxpdmUgY29ubmVjdGlvbiBvd25lZCBieSB0aGlzIHBvb2wuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGNsZWFyU2NoZW1hQ2FjaGUoKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbnMgPSBuZXcgU2V0KFtcbiAgICAgIC4uLnRoaXMuY29ubmVjdGlvbnMsXG4gICAgICAuLi5PYmplY3QudmFsdWVzKHRoaXMuY29ubmVjdGlvbnNJblVzZSksXG4gICAgICB0aGlzLmdldEdsb2JhbENvbm5lY3Rpb24oKSxcbiAgICAgIHRoaXMuX3Rlc3RTaGFyZWRDb25uZWN0aW9uXG4gICAgXS5maWx0ZXIoQm9vbGVhbikpXG5cbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgY29ubmVjdGlvbnMpIHtcbiAgICAgIGlmIChjb25uZWN0aW9uKSB0aGlzLl9jbGVhckNvbm5lY3Rpb25TY2hlbWFDYWNoZShjb25uZWN0aW9uKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlkbGUgdGltZW91dCBtaWxsaXMuXG4gICAqIEByZXR1cm5zIHtudW1iZXIgfCBudWxsfSAtIElkbGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIG51bGwgd2hlbiBkaXNhYmxlZC5cbiAgICovXG4gIGlkbGVUaW1lb3V0TWlsbGlzKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkucG9vbD8uaWRsZVRpbWVvdXRNaWxsaXNcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGxcbiAgICBpZiAodGhpcy52YWxpZElkbGVUaW1lb3V0TWlsbGlzKHZhbHVlKSkgcmV0dXJuIHZhbHVlXG5cbiAgICByZXR1cm4gREVGQVVMVF9JRExFX1RJTUVPVVRfTUlMTElTXG4gIH1cblxuICAvKipcbiAgICogUnVucyB2YWxpZCBpZGxlIHRpbWVvdXQgbWlsbGlzLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIENhbmRpZGF0ZSBpZGxlIHRpbWVvdXQgdmFsdWUuXG4gICAqIEByZXR1cm5zIHt2YWx1ZSBpcyBudW1iZXJ9IC0gV2hldGhlciB0aGUgdmFsdWUgaXMgYSB2YWxpZCBpZGxlIHRpbWVvdXQuXG4gICAqL1xuICB2YWxpZElkbGVUaW1lb3V0TWlsbGlzKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID49IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNjaGVkdWxlIGlkbGUgY29ubmVjdGlvbiByZWFwZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBzY2hlZHVsZUlkbGVDb25uZWN0aW9uUmVhcGVyKCkge1xuICAgIGlmICh0aGlzLmlkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIpIHJldHVyblxuICAgIGlmICghdGhpcy5oYXNJZGxlQ29ubmVjdGlvbnNUb1JlYXAoKSkgcmV0dXJuXG5cbiAgICBjb25zdCBkZWxheSA9IHRoaXMubmV4dElkbGVDb25uZWN0aW9uUmVhcERlbGF5KC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAodGhpcy5pZGxlVGltZW91dE1pbGxpcygpKSlcblxuICAgIHRoaXMuaWRsZUNvbm5lY3Rpb25SZWFwZXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5pZGxlQ29ubmVjdGlvblJlYXBlclRpbWVyID0gdW5kZWZpbmVkXG4gICAgICB2b2lkIHRoaXMucmVhcElkbGVDb25uZWN0aW9ucygpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCgpID0+IFtcIkZhaWxlZCB0byByZWFwIGlkbGUgZGF0YWJhc2UgY29ubmVjdGlvbnM6XCIsIGVycm9yXSlcbiAgICAgIH0pXG4gICAgfSwgZGVsYXkpXG5cbiAgICBpZiAodHlwZW9mIHRoaXMuaWRsZUNvbm5lY3Rpb25SZWFwZXJUaW1lci51bnJlZiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLmlkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIudW5yZWYoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGhhcyBpZGxlIGNvbm5lY3Rpb25zIHRvIHJlYXAuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgYW4gaWRsZSByZWFwZXIgdGltZXIgc2hvdWxkIGJlIHNjaGVkdWxlZC5cbiAgICovXG4gIGhhc0lkbGVDb25uZWN0aW9uc1RvUmVhcCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9ucy5sZW5ndGggPiAwICYmIHRoaXMuaWRsZVRpbWVvdXRNaWxsaXMoKSAhPT0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbmV4dCBpZGxlIGNvbm5lY3Rpb24gcmVhcCBkZWxheS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkbGVUaW1lb3V0TWlsbGlzIC0gSWRsZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy5cbiAgICogQHJldHVybnMge251bWJlcn0gLSBEZWxheSBiZWZvcmUgdGhlIG5leHQgcmVhcC5cbiAgICovXG4gIG5leHRJZGxlQ29ubmVjdGlvblJlYXBEZWxheShpZGxlVGltZW91dE1pbGxpcykge1xuICAgIGxldCBkZWxheSA9IGlkbGVUaW1lb3V0TWlsbGlzXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMuY29ubmVjdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25IYXNPcGVuVHJhbnNhY3Rpb24oY29ubmVjdGlvbikpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHRyYWNrZWRDb25uZWN0aW9uID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCAmIHtbSURMRV9DT05ORUNUSU9OX0NIRUNLRURfSU5fQVRdPzogbnVtYmVyfX0gKi8gKGNvbm5lY3Rpb24pXG4gICAgICBjb25zdCBjaGVja2VkSW5BdCA9IHRyYWNrZWRDb25uZWN0aW9uW0lETEVfQ09OTkVDVElPTl9DSEVDS0VEX0lOX0FUXVxuXG4gICAgICBpZiAodHlwZW9mIGNoZWNrZWRJbkF0ICE9PSBcIm51bWJlclwiKSBjb250aW51ZVxuXG4gICAgICBkZWxheSA9IE1hdGgubWluKGRlbGF5LCBNYXRoLm1heCgwLCBpZGxlVGltZW91dE1pbGxpcyAtIChub3cgLSBjaGVja2VkSW5BdCkpKVxuICAgIH1cblxuICAgIHJldHVybiBkZWxheVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyBpZGxlIGNoZWNrZWQtaW4gY29ubmVjdGlvbnMgdGhhdCBoYXZlIGV4Y2VlZGVkIHRoZSBjb25maWd1cmVkIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyByZWFwSWRsZUNvbm5lY3Rpb25zKCkge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBpZGxlVGltZW91dE1pbGxpcyA9IHRoaXMuaWRsZVRpbWVvdXRNaWxsaXMoKVxuXG4gICAgaWYgKGlkbGVUaW1lb3V0TWlsbGlzID09PSBudWxsKSByZXR1cm5cblxuICAgIGNvbnN0IHtleHBpcmVkQ29ubmVjdGlvbnMsIGtlcHRDb25uZWN0aW9uc30gPSB0aGlzLmNsYXNzaWZ5SWRsZUNvbm5lY3Rpb25zRm9yUmVhcGluZyh7aWRsZVRpbWVvdXRNaWxsaXMsIG5vdzogRGF0ZS5ub3coKX0pXG5cbiAgICB0aGlzLmNvbm5lY3Rpb25zID0ga2VwdENvbm5lY3Rpb25zXG4gICAgYXdhaXQgdGhpcy5jbG9zZUV4cGlyZWRJZGxlQ29ubmVjdGlvbnMoZXhwaXJlZENvbm5lY3Rpb25zKVxuICAgIGF3YWl0IHRoaXMuYXdhaXRJbmZsaWdodENvbm5lY3Rpb25DbG9zZXMoKVxuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25zLmxlbmd0aCA+IDApIHRoaXMuc2NoZWR1bGVJZGxlQ29ubmVjdGlvblJlYXBlcigpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbG9zZSBleHBpcmVkIGlkbGUgY29ubmVjdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHRbXX0gZXhwaXJlZENvbm5lY3Rpb25zIC0gQ29ubmVjdGlvbnMgdG8gY2xvc2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY2xvc2VkLlxuICAgKi9cbiAgYXN5bmMgY2xvc2VFeHBpcmVkSWRsZUNvbm5lY3Rpb25zKGV4cGlyZWRDb25uZWN0aW9ucykge1xuICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiBleHBpcmVkQ29ubmVjdGlvbnMpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3Rpb24pXG4gICAgICB0aGlzLnRlbGVtZXRyeS5pZGxlUmVhcERpc3Bvc2FsQ291bnQrK1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGF3YWl0IGluZmxpZ2h0IGNvbm5lY3Rpb24gY2xvc2VzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBvbmNlIGluLWZsaWdodCBjb25uZWN0aW9uIGNsb3NlcyBzZXR0bGUuXG4gICAqL1xuICBhc3luYyBhd2FpdEluZmxpZ2h0Q29ubmVjdGlvbkNsb3NlcygpIHtcbiAgICBpZiAodGhpcy5pbmZsaWdodENvbm5lY3Rpb25DbG9zZXMuc2l6ZSA+IDApIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbLi4udGhpcy5pbmZsaWdodENvbm5lY3Rpb25DbG9zZXNdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsYXNzaWZ5IGlkbGUgY29ubmVjdGlvbnMgZm9yIHJlYXBpbmcuXG4gICAqIEBwYXJhbSB7e2lkbGVUaW1lb3V0TWlsbGlzOiBudW1iZXIsIG5vdzogbnVtYmVyfX0gYXJncyAtIFJlYXBlciBjbGFzc2lmaWNhdGlvbiBpbnB1dHMuXG4gICAqIEByZXR1cm5zIHt7ZXhwaXJlZENvbm5lY3Rpb25zOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdFtdLCBrZXB0Q29ubmVjdGlvbnM6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0W119fSAtIENsYXNzaWZpZWQgaWRsZSBjb25uZWN0aW9ucy5cbiAgICovXG4gIGNsYXNzaWZ5SWRsZUNvbm5lY3Rpb25zRm9yUmVhcGluZyh7aWRsZVRpbWVvdXRNaWxsaXMsIG5vd30pIHtcbiAgICAvKipcbiAgICAgKiBLZXB0IGNvbm5lY3Rpb25zLlxuICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdFtdfSAqL1xuICAgIGNvbnN0IGtlcHRDb25uZWN0aW9ucyA9IFtdXG4gICAgLyoqXG4gICAgICogRXhwaXJlZCBjb25uZWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHRbXX0gKi9cbiAgICBjb25zdCBleHBpcmVkQ29ubmVjdGlvbnMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMuY29ubmVjdGlvbnMpIHtcbiAgICAgIHRoaXMuY2xhc3NpZnlJZGxlQ29ubmVjdGlvbkZvclJlYXBpbmcoe2Nvbm5lY3Rpb24sIGV4cGlyZWRDb25uZWN0aW9ucywgaWRsZVRpbWVvdXRNaWxsaXMsIGtlcHRDb25uZWN0aW9ucywgbm93fSlcbiAgICB9XG5cbiAgICByZXR1cm4ge2V4cGlyZWRDb25uZWN0aW9ucywga2VwdENvbm5lY3Rpb25zfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xhc3NpZnkgaWRsZSBjb25uZWN0aW9uIGZvciByZWFwaW5nLlxuICAgKiBAcGFyYW0ge3tjb25uZWN0aW9uOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCwgZXhwaXJlZENvbm5lY3Rpb25zOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdFtdLCBpZGxlVGltZW91dE1pbGxpczogbnVtYmVyLCBrZXB0Q29ubmVjdGlvbnM6IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0W10sIG5vdzogbnVtYmVyfX0gYXJncyAtIENsYXNzaWZpY2F0aW9uIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGNsYXNzaWZ5SWRsZUNvbm5lY3Rpb25Gb3JSZWFwaW5nKHtjb25uZWN0aW9uLCBleHBpcmVkQ29ubmVjdGlvbnMsIGlkbGVUaW1lb3V0TWlsbGlzLCBrZXB0Q29ubmVjdGlvbnMsIG5vd30pIHtcbiAgICBpZiAodGhpcy5jb25uZWN0aW9uSXNDbG9zZWQoY29ubmVjdGlvbikpIHJldHVyblxuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25IYXNPcGVuVHJhbnNhY3Rpb24oY29ubmVjdGlvbikpIHtcbiAgICAgIGtlcHRDb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb24pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmlkbGVDb25uZWN0aW9uRXhwaXJlZCh7Y29ubmVjdGlvbiwgaWRsZVRpbWVvdXRNaWxsaXMsIG5vd30pID8gZXhwaXJlZENvbm5lY3Rpb25zIDoga2VwdENvbm5lY3Rpb25zXG5cbiAgICB0YXJnZXQucHVzaChjb25uZWN0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY29ubmVjdGlvbiBpcyBjbG9zZWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBDb25uZWN0aW9uIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaXMgbWFya2VkIGNsb3NlZC5cbiAgICovXG4gIGNvbm5lY3Rpb25Jc0Nsb3NlZChjb25uZWN0aW9uKSB7XG4gICAgY29uc3QgdHJhY2tlZENvbm5lY3Rpb24gPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0ICYge1tDTE9TRURfQ09OTkVDVElPTl0/OiBib29sZWFufX0gKi8gKGNvbm5lY3Rpb24pXG5cbiAgICByZXR1cm4gQm9vbGVhbih0cmFja2VkQ29ubmVjdGlvbltDTE9TRURfQ09OTkVDVElPTl0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpZGxlIGNvbm5lY3Rpb24gZXhwaXJlZC5cbiAgICogQHBhcmFtIHt7Y29ubmVjdGlvbjogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQsIGlkbGVUaW1lb3V0TWlsbGlzOiBudW1iZXIsIG5vdzogbnVtYmVyfX0gYXJncyAtIEV4cGlyeSBpbnB1dHMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGlkbGUgY29ubmVjdGlvbiBleHBpcmVkLlxuICAgKi9cbiAgaWRsZUNvbm5lY3Rpb25FeHBpcmVkKHtjb25uZWN0aW9uLCBpZGxlVGltZW91dE1pbGxpcywgbm93fSkge1xuICAgIGNvbnN0IHRyYWNrZWRDb25uZWN0aW9uID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCAmIHtbSURMRV9DT05ORUNUSU9OX0NIRUNLRURfSU5fQVRdPzogbnVtYmVyfX0gKi8gKGNvbm5lY3Rpb24pXG4gICAgY29uc3QgY2hlY2tlZEluQXQgPSB0cmFja2VkQ29ubmVjdGlvbltJRExFX0NPTk5FQ1RJT05fQ0hFQ0tFRF9JTl9BVF1cblxuICAgIHJldHVybiB0eXBlb2YgY2hlY2tlZEluQXQgPT09IFwibnVtYmVyXCIgJiYgbm93IC0gY2hlY2tlZEluQXQgPj0gaWRsZVRpbWVvdXRNaWxsaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbm5lY3Rpb24gaGFzIG9wZW4gdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBDb25uZWN0aW9uIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaGFzIGFuIG9wZW4gdHJhbnNhY3Rpb24uXG4gICAqL1xuICBjb25uZWN0aW9uSGFzT3BlblRyYW5zYWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICByZXR1cm4gY29ubmVjdGlvbi5fdHJhbnNhY3Rpb25zQ291bnQgPiAwXG4gIH1cblxuICAvKipcbiAgICogUm9sbHMgYmFjayBhbnkgdHJhbnNhY3Rpb24gYSBwcmV2aW91cyBob2xkZXIgbGVmdCBvcGVuIGJlZm9yZSBhIGNvbm5lY3Rpb25cbiAgICogcmUtZW50ZXJzIHRoZSBpZGxlIHBvb2wuIEEgY29ubmVjdGlvbiByZXR1cm5lZCB0byB0aGUgcG9vbCB3aXRoIGFuIG9wZW5cbiAgICogdHJhbnNhY3Rpb24gd291bGQgb3RoZXJ3aXNlIGJlIGhhbmRlZCB0byBhbiB1bnJlbGF0ZWQgY2hlY2tvdXQsIHdob3NlXG4gICAqIHN0YXJ0VHJhbnNhY3Rpb24oKSB0aGVuIGZhaWxzIHdpdGggXCJBIHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgcnVubmluZ1wiIGFuZFxuICAgKiBwb2lzb25zIGV2ZXJ5IGZvbGxvd2luZyBjYWxsZXIgdGhhdCByZXVzZXMgaXQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBDb25uZWN0aW9uIGJlaW5nIGNoZWNrZWQgaW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaG9sZHMgbm8gb3BlbiB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIHJvbGxiYWNrTGVmdE9wZW5UcmFuc2FjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmNvbm5lY3Rpb25IYXNPcGVuVHJhbnNhY3Rpb24oY29ubmVjdGlvbikpIHJldHVyblxuXG4gICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbYFJvbGxpbmcgYmFjayBhIHRyYW5zYWN0aW9uIGxlZnQgb3BlbiBvbiBhIGNvbm5lY3Rpb24gYmVpbmcgY2hlY2tlZCBpbiAoaWRlbnRpZmllcj0ke3RoaXMuaWRlbnRpZmllcn0pLmBdKVxuXG4gICAgd2hpbGUgKHRoaXMuY29ubmVjdGlvbkhhc09wZW5UcmFuc2FjdGlvbihjb25uZWN0aW9uKSkge1xuICAgICAgYXdhaXQgY29ubmVjdGlvbi5yb2xsYmFja1RyYW5zYWN0aW9uKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbG9zZSBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gQ29ubmVjdGlvbiB0byBjbG9zZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGNsb3NlQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgLy8gSWRlbXBvdGVudDogYSBmaXJlLWFuZC1mb3JnZXQgc2NoZWR1bGVkIHJlYXAgYW5kIGFuIGV4cGxpY2l0IHJlYXAgY2FuIGJvdGhcbiAgICAvLyB0YXJnZXQgdGhlIHNhbWUgY29ubmVjdGlvbi4gQXdhaXQgdGhlIGluLWZsaWdodCBjbG9zZSBpbnN0ZWFkIG9mIGNsb3NpbmdcbiAgICAvLyB0d2ljZSAod2hpY2ggY2FuIHRocm93IG9uIHRoZSBkcml2ZXIpIG9yIHJldHVybmluZyB3aGlsZSB0aGUgdW5kZXJseWluZ1xuICAgIC8vIGhhbmRsZSBpcyBzdGlsbCBvcGVuLlxuICAgIGNvbnN0IGV4aXN0aW5nQ2xvc2UgPSB0aGlzLmNvbm5lY3Rpb25DbG9zZVByb21pc2VzLmdldChjb25uZWN0aW9uKVxuXG4gICAgaWYgKGV4aXN0aW5nQ2xvc2UpIHtcbiAgICAgIHJldHVybiBhd2FpdCBleGlzdGluZ0Nsb3NlXG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tlZENvbm5lY3Rpb24gPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0ICYge1tDTE9TRURfQ09OTkVDVElPTl0/OiBib29sZWFuLCBbQ09OTkVDVElPTl9DSEVDS0VEX09VVF9BVF0/OiBudW1iZXIsIFtJRExFX0NPTk5FQ1RJT05fQ0hFQ0tFRF9JTl9BVF0/OiBudW1iZXJ9fSAqLyAoY29ubmVjdGlvbilcblxuICAgIGZvciAoY29uc3QgW3JldXNlS2V5LCByZXRhaW5lZENvbm5lY3Rpb25dIG9mIHRoaXMubGlmZWN5Y2xlUmV0YWluZWRDb25uZWN0aW9ucykge1xuICAgICAgaWYgKHJldGFpbmVkQ29ubmVjdGlvbiA9PT0gY29ubmVjdGlvbikgdGhpcy5saWZlY3ljbGVSZXRhaW5lZENvbm5lY3Rpb25zLmRlbGV0ZShyZXVzZUtleSlcbiAgICB9XG5cbiAgICB0cmFja2VkQ29ubmVjdGlvbltDTE9TRURfQ09OTkVDVElPTl0gPSB0cnVlXG4gICAgZGVsZXRlIHRyYWNrZWRDb25uZWN0aW9uW0NPTk5FQ1RJT05fQ0hFQ0tFRF9PVVRfQVRdXG4gICAgZGVsZXRlIHRyYWNrZWRDb25uZWN0aW9uW0lETEVfQ09OTkVDVElPTl9DSEVDS0VEX0lOX0FUXVxuXG4gICAgY29uc3QgY2xvc2VQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRyYWNrZWRDb25uZWN0aW9uLmNsb3NlKClcbiAgICB9KSgpXG5cbiAgICB0aGlzLmNvbm5lY3Rpb25DbG9zZVByb21pc2VzLnNldChjb25uZWN0aW9uLCBjbG9zZVByb21pc2UpXG4gICAgdGhpcy5pbmZsaWdodENvbm5lY3Rpb25DbG9zZXMuYWRkKGNsb3NlUHJvbWlzZSlcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjbG9zZVByb21pc2VcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pbmZsaWdodENvbm5lY3Rpb25DbG9zZXMuZGVsZXRlKGNsb3NlUHJvbWlzZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGVhciBpZGxlIGNvbm5lY3Rpb24gcmVhcGVyIHRpbWVyLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgY2xlYXJJZGxlQ29ubmVjdGlvblJlYXBlclRpbWVyKCkge1xuICAgIGlmICghdGhpcy5pZGxlQ29ubmVjdGlvblJlYXBlclRpbWVyKSByZXR1cm5cblxuICAgIGNsZWFyVGltZW91dCh0aGlzLmlkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIpXG4gICAgdGhpcy5pZGxlQ29ubmVjdGlvblJlYXBlclRpbWVyID0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGFsbCBhY3RpdmUgYW5kIGNhY2hlZCBjb25uZWN0aW9ucyBmb3IgdGhpcyBwb29sLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgY2xvc2VBbGwoKSB7XG4gICAgdGhpcy5jbGVhcklkbGVDb25uZWN0aW9uUmVhcGVyVGltZXIoKVxuICAgIHRoaXMucmVqZWN0UGVuZGluZ0NoZWNrb3V0cyhuZXcgRXJyb3IoXCJEYXRhYmFzZSBwb29sIHdhcyBjbG9zZWQgYmVmb3JlIGNoZWNrb3V0IGNvbXBsZXRlZC5cIikpXG5cbiAgICBjb25zdCBjb25uZWN0aW9ucyA9IG5ldyBTZXQoW1xuICAgICAgLi4udGhpcy5jb25uZWN0aW9ucyxcbiAgICAgIC4uLk9iamVjdC52YWx1ZXModGhpcy5jb25uZWN0aW9uc0luVXNlKSxcbiAgICAgIC4uLnRoaXMubGlmZWN5Y2xlUmV0YWluZWRDb25uZWN0aW9ucy52YWx1ZXMoKSxcbiAgICAgIHRoaXMuZ2V0R2xvYmFsQ29ubmVjdGlvbkZvcklkZW50aWZpZXIoKSxcbiAgICAgIHRoaXMuX3Rlc3RTaGFyZWRDb25uZWN0aW9uXG4gICAgXS5maWx0ZXIoQm9vbGVhbikpXG5cbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gW11cbiAgICB0aGlzLmNvbm5lY3Rpb25zSW5Vc2UgPSB7fVxuICAgIHRoaXMubGlmZWN5Y2xlUmV0YWluZWRDb25uZWN0aW9ucy5jbGVhcigpXG4gICAgdGhpcy5saWZlY3ljbGVSZXRhaW5lZFJldXNlS2V5cy5jbGVhcigpXG4gICAgdGhpcy5jbGVhclRlc3RTaGFyZWRDb25uZWN0aW9uKClcbiAgICB0aGlzLmNsZWFyR2xvYmFsQ29ubmVjdGlvbkZvcklkZW50aWZpZXIoKVxuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGNvbm5lY3Rpb25zKSB7XG4gICAgICBpZiAoIWNvbm5lY3Rpb24pIGNvbnRpbnVlXG5cbiAgICAgIGF3YWl0IHRoaXMuY2xvc2VDb25uZWN0aW9uKGNvbm5lY3Rpb24pXG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZWplY3QgcGVuZGluZyBjaGVja291dHMuXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gRXJyb3IgdG8gcmVqZWN0IHBlbmRpbmcgY2hlY2tvdXRzIHdpdGguXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcmVqZWN0UGVuZGluZ0NoZWNrb3V0cyhlcnJvcikge1xuICAgIGNvbnN0IHBlbmRpbmdDaGVja291dHMgPSB0aGlzLnBlbmRpbmdDaGVja291dHNcblxuICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0cyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGNoZWNrb3V0IG9mIHBlbmRpbmdDaGVja291dHMpIHtcbiAgICAgIHRoaXMuY2xlYXJQZW5kaW5nQ2hlY2tvdXRUaW1lb3V0KGNoZWNrb3V0KVxuICAgICAgY2hlY2tvdXQucmVqZWN0KGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgZ2xvYmFsbHkgcmVnaXN0ZXJlZCBmYWxsYmFjayBjb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IFtjb25uZWN0aW9uc10gLSBDb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFtjb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBzZXRHbG9iYWxDb25uZWN0aW9ucyhjb25uZWN0aW9ucywgY29uZmlndXJhdGlvbikge1xuICAgIGlmICghY29uZmlndXJhdGlvbikge1xuICAgICAgdGhpcy5nbG9iYWxDb25uZWN0aW9ucyA9IG5ldyBXZWFrTWFwKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuZ2xvYmFsQ29ubmVjdGlvbnMuc2V0KGNvbmZpZ3VyYXRpb24sIGNvbm5lY3Rpb25zIHx8IHt9KVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBnbG9iYWxseSByZWdpc3RlcmVkIGZhbGxiYWNrIGNvbm5lY3Rpb25zIGZvciBhbGwgY29uZmlndXJhdGlvbnMgb3IgYSBzaW5nbGUgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFtjb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBjbGVhckdsb2JhbENvbm5lY3Rpb25zKGNvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHRoaXMuZ2xvYmFsQ29ubmVjdGlvbnMgPSBuZXcgV2Vha01hcCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmdsb2JhbENvbm5lY3Rpb25zLmRlbGV0ZShjb25maWd1cmF0aW9uKVxuICB9XG59XG4iXX0=
|