@bitgo-beta/utxo-lib 8.0.3-beta.24 → 8.0.3-beta.26

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.
@@ -900,8 +900,8 @@ class UtxoPsbt extends __1.Psbt {
900
900
  if (Buffer.isBuffer(params.sessionId) && params.sessionId.length !== 32) {
901
901
  throw new Error(`Invalid sessionId size ${params.sessionId.length}`);
902
902
  }
903
- const inputs = inputIndex === undefined ? this.data.inputs : [utils_1.checkForInput(this.data.inputs, inputIndex)];
904
- inputs.forEach((input, index) => {
903
+ const inputIndexes = inputIndex === undefined ? [...Array(this.inputCount).keys()] : [inputIndex];
904
+ inputIndexes.forEach((index) => {
905
905
  if (!this.isTaprootKeyPathInput(index)) {
906
906
  return;
907
907
  }
@@ -964,4 +964,4 @@ class UtxoPsbt extends __1.Psbt {
964
964
  }
965
965
  }
966
966
  exports.UtxoPsbt = UtxoPsbt;
967
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXR4b1BzYnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYml0Z28vVXR4b1BzYnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQTBDO0FBTzFDLGdEQUFxRDtBQUNyRCwrREFBc0U7QUFFdEUsaUNBQXFEO0FBQ3JELHVDQUF1QztBQUN2Qyx3RUFBOEY7QUFFOUYsMEJBQTZHO0FBQzdHLHVEQUFvRDtBQUNwRCx1Q0FBZ0Q7QUFDaEQsb0RBQThDO0FBQzlDLDBEQUErQztBQUMvQyxtREFBd0U7QUFDeEUsNkNBQWtEO0FBQ2xELHFDQWtCa0I7QUFDbEIsbUNBQTJEO0FBQzNELHdDQUFpRDtBQUNqRCx5Q0FPb0I7QUFZcEIsTUFBTSxzQkFBc0IsR0FBRztJQUM3QixhQUFhLEVBQUUsS0FBSztJQUNwQixZQUFZLEVBQUUsQ0FBQyxlQUFXLENBQUMsZUFBZSxFQUFFLGVBQVcsQ0FBQyxXQUFXLENBQUM7Q0FDckUsQ0FBQztBQUVGLFNBQVMsaUJBQWlCLENBQUMsQ0FBc0M7SUFDL0QsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUN6RyxDQUFDO0FBb0RELDJFQUEyRTtBQUMzRSw4RUFBOEU7QUFDOUUsaUVBQWlFO0FBQ2pFLE1BQWEsUUFBdUUsU0FBUSxRQUFJO0lBQWhHOztRQUNVLGVBQVUsR0FBRyxJQUFJLHlCQUFnQixFQUFFLENBQUM7SUFxbEM5QyxDQUFDO0lBbmxDVyxNQUFNLENBQUMscUJBQXFCLENBQUMsTUFBYyxFQUFFLE9BQWdCO1FBQ3JFLE9BQU8saUNBQWUsQ0FBQyxVQUFVLENBQVMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBYyxFQUFFLElBQWU7UUFDL0MsT0FBTyxJQUFJLFFBQVEsQ0FDakIsSUFBSSxFQUNKLElBQUksSUFBSSxJQUFJLGFBQVEsQ0FBQyxJQUFJLG1CQUFlLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxpQ0FBZSxDQUFTLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDN0YsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQWMsRUFBRSxJQUFjO1FBQzlDLE1BQU0scUJBQXFCLEdBQTBCLENBQUMsTUFBYyxFQUFnQixFQUFFO1lBQ3BGLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzVELE9BQU8sSUFBSSxtQkFBZSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUM7UUFDRixNQUFNLFFBQVEsR0FBRyxhQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxxQkFBcUIsRUFBRTtZQUNsRSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCO1NBQzVDLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLGtGQUFrRjtRQUNsRixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQVksRUFBRSxJQUFjO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQXNCLEVBQUUsZ0JBQW1DO1FBQzlFLE1BQU0sbUJBQW1CLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDNUQsT0FBTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUU7WUFDL0IsdUJBQXVCO1lBQ3ZCLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBRUQsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQ2IscURBQXFELE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUNyRixtQkFBbUIsQ0FBQyxNQUN0QixFQUFFLENBQ0gsQ0FBQztTQUNIO1FBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLG1CQUFtQixDQUFDO1FBQ3pDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQ0FBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRTtZQUM1RyxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDekQ7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCwwQkFBMEI7UUFDeEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLHVDQUF1QztRQUN2RSxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRTtnQkFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO2FBQzFEO1lBQ0QsSUFBSSxDQUFDLHNCQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUMzRCxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUFtQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3hEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRUQsa0JBQWtCLENBQUMsTUFBOEI7UUFDL0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLHVDQUF1QztRQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUU7Z0JBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQzthQUMxRDtZQUNELElBQUksQ0FBQyxzQkFBUSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDM0QsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLDZCQUFtQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUU7b0JBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztpQkFDcEU7Z0JBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxjQUFjLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUMzRDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxXQUFvQyxFQUFFLFdBQStCO1FBQzFGLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRTtZQUNqRCxNQUFNLElBQUksS0FBSyxDQUNiLG1CQUFtQixXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sZ0JBQWdCLFdBQVcsQ0FBQyxNQUFNLDRCQUE0QixDQUN4RyxDQUFDO1NBQ0g7UUFDRCxNQUFNLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5QyxNQUFNLE9BQU8sR0FBRyx1QkFBTSxDQUFDLGlCQUFpQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRXZELE1BQU0sUUFBUSxHQUFHLElBQUksYUFBUSxDQUFDLElBQUksbUJBQWUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5RSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUV6RSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkgsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFUyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQWdCO1FBQzlDLE9BQU8sSUFBSSxpQ0FBZSxDQUFTLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxJQUFjLEVBQUU7UUFDZCxPQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQThCLENBQUMsRUFBUSxDQUFDO0lBQ3RFLENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxRQUFpQjtRQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTs7WUFDakMsSUFBSSxDQUFBLE1BQUEsS0FBSyxDQUFDLFlBQVksMENBQUUsTUFBTSxLQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUksTUFBQSxLQUFLLENBQUMsVUFBVSwwQ0FBRSxNQUFNLENBQUEsRUFBRTtnQkFDN0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsUUFBUSxhQUFSLFFBQVEsY0FBUixRQUFRLEdBQUksYUFBYSxzQkFBc0IsQ0FBQyxDQUFDO2FBQ25GO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gscUJBQXFCLENBQUMsVUFBa0I7O1FBQ3RDLE1BQU0sS0FBSyxHQUFHLHFCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsT0FBTyxDQUNMLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYztZQUN0QixDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWE7WUFDckIsQ0FBQyxDQUNDLENBQUEsTUFBQSxLQUFLLENBQUMsYUFBYSwwQ0FBRSxNQUFNO2lCQUMzQixNQUFBLEtBQUssQ0FBQyxZQUFZLDBDQUFFLE1BQU0sQ0FBQTtpQkFDMUIsTUFBQSxLQUFLLENBQUMsa0JBQWtCLDBDQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQSxDQUMzRCxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsd0JBQXdCLENBQUMsVUFBa0I7O1FBQ3pDLE1BQU0sS0FBSyxHQUFHLHFCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsT0FBTyxDQUNMLENBQUMsQ0FBQyxDQUFBLE1BQUEsS0FBSyxDQUFDLGFBQWEsMENBQUUsTUFBTSxDQUFBO1lBQzdCLENBQUMsQ0FDQyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFO2dCQUNyQyxVQUFVLEVBQUUsc0NBQTJCO2dCQUN2QyxPQUFPLEVBQUUsZ0NBQXFCLENBQUMsMkJBQTJCO2FBQzNELENBQUMsQ0FBQyxNQUFNO2dCQUNULElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUU7b0JBQ3JDLFVBQVUsRUFBRSxzQ0FBMkI7b0JBQ3ZDLE9BQU8sRUFBRSxnQ0FBcUIsQ0FBQyxnQkFBZ0I7aUJBQ2hELENBQUMsQ0FBQyxNQUFNO2dCQUNULElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUU7b0JBQ3JDLFVBQVUsRUFBRSxzQ0FBMkI7b0JBQ3ZDLE9BQU8sRUFBRSxnQ0FBcUIsQ0FBQyxrQkFBa0I7aUJBQ2xELENBQUMsQ0FBQyxNQUFNLENBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYyxDQUFDLFVBQWtCOztRQUMvQixNQUFNLEtBQUssR0FBRyxxQkFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFELE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBYyxFQUFXLEVBQUU7WUFDekMsSUFBSTtnQkFDRiw2QkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDNUIsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7UUFDSCxDQUFDLENBQUM7UUFDRixPQUFPLENBQUMsQ0FBQyxDQUNQLEtBQUssQ0FBQyxjQUFjO1lBQ3BCLEtBQUssQ0FBQyxhQUFhO2FBQ25CLE1BQUEsS0FBSyxDQUFDLGFBQWEsMENBQUUsTUFBTSxDQUFBO2FBQzNCLE1BQUEsS0FBSyxDQUFDLGtCQUFrQiwwQ0FBRSxNQUFNLENBQUE7YUFDaEMsTUFBQSxLQUFLLENBQUMsWUFBWSwwQ0FBRSxNQUFNLENBQUE7WUFDMUIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRTtnQkFDckMsVUFBVSxFQUFFLHNDQUEyQjtnQkFDdkMsT0FBTyxFQUFFLGdDQUFxQixDQUFDLDJCQUEyQjthQUMzRCxDQUFDLENBQUMsTUFBTTtZQUNULElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUU7Z0JBQ3JDLFVBQVUsRUFBRSxzQ0FBMkI7Z0JBQ3ZDLE9BQU8sRUFBRSxnQ0FBcUIsQ0FBQyxnQkFBZ0I7YUFDaEQsQ0FBQyxDQUFDLE1BQU07WUFDVCxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFO2dCQUNyQyxVQUFVLEVBQUUsc0NBQTJCO2dCQUN2QyxPQUFPLEVBQUUsZ0NBQXFCLENBQUMsa0JBQWtCO2FBQ2xELENBQUMsQ0FBQyxNQUFNO1lBQ1QsQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQ3hELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxpQkFBaUI7UUFDZixNQUFNLHVCQUF1QixHQUFHLENBQUMsTUFBYyxFQUFXLEVBQUU7WUFDMUQsSUFBSTtnQkFDRiwrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztnQkFDckQsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7UUFDSCxDQUFDLENBQUM7UUFDRixxQkFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsbUNBQW1DO1FBQ3ZFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTs7WUFDbEMsSUFBSSxNQUFBLEtBQUssQ0FBQyxhQUFhLDBDQUFFLE1BQU0sRUFBRTtnQkFDL0IsT0FBTyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztvQkFDM0QsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUM7b0JBQ2hDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0RBQWdELENBQUMsR0FBRyxDQUFDLENBQUM7YUFDaEU7aUJBQU0sSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzFDLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQzdDO1lBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsVUFBa0I7O1FBQ3JDLE1BQU0sS0FBSyxHQUFHLHFCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsc0RBQXNEO1FBQ3RELElBQUksQ0FBQSxNQUFBLEtBQUssQ0FBQyxhQUFhLDBDQUFFLE1BQU0sTUFBSyxDQUFDLEVBQUU7WUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1NBQ2xFO1FBQ0QsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sT0FBTyxHQUFhLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsK0JBQWtCLENBQUMsTUFBTSxFQUFFLHdCQUF3QixDQUFDLENBQUMsVUFBVSxDQUFDO1FBQzNGLEtBQUssTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUU7WUFDbkMsTUFBTSxHQUFHLEdBQUcsTUFBQSxLQUFLLENBQUMsWUFBWSwwQ0FBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDUixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDN0Q7WUFDRCxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNoQztRQUVELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxxQkFBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFbkcsTUFBTSxZQUFZLEdBQUcsMEJBQVksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDOUQsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxNQUFNLGtCQUFrQixHQUFHLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUU5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUxQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCwwQkFBMEIsQ0FBQyxVQUFrQjtRQUMzQyxNQUFNLEtBQUssR0FBRyxxQkFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFELE1BQU0sV0FBVyxHQUFHLG1DQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQSxXQUFXLGFBQVgsV0FBVyx1QkFBWCxXQUFXLENBQUUsTUFBTSxNQUFLLENBQUMsRUFBRTtZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDN0c7UUFDRCxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsR0FBRywrQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoRixNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUV6RSxNQUFNLE1BQU0sR0FBRyw0QkFBbUIsQ0FDaEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUNwQyxVQUFVLENBQ1gsQ0FBQztRQUVGLE1BQU0sR0FBRyxHQUFHLFdBQVcsS0FBSyxlQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkgsOEVBQThFO1FBQzlFLE1BQU0sWUFBWSxHQUFHLDBCQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxxQkFBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BHLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRTlDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFDLDhDQUE4QztRQUM5QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxFQUFFLEVBQUUsVUFBVSxFQUFFLHNDQUEyQixFQUFFLENBQUMsQ0FBQztRQUN2RixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxnREFBZ0QsQ0FBQyxVQUFrQjs7UUFDakUsTUFBTSxLQUFLLEdBQUcscUJBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUEsTUFBQSxLQUFLLENBQUMsYUFBYSwwQ0FBRSxNQUFNLE1BQUssQ0FBQyxFQUFFO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztTQUNsRTtRQUNELElBQUksQ0FBQSxNQUFBLEtBQUssQ0FBQyxZQUFZLDBDQUFFLE1BQU0sTUFBSyxDQUFDLEVBQUU7WUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1NBQzdEO1FBRUQsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sT0FBTyxHQUFhLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxxQkFBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFbkcsTUFBTSxZQUFZLEdBQUcsMEJBQVksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDOUQsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxNQUFNLGtCQUFrQixHQUFHLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUU5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUxQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCw2QkFBNkI7UUFDM0IscUJBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1DQUFtQztRQUN2RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDbEQsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRDs7T0FFRztJQUNILDJCQUEyQixDQUFDLFVBQWtCLEVBQUUsU0FBeUI7O1FBQ3ZFLE1BQU0sS0FBSyxHQUFHLHFCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsTUFBTSxNQUFNLEdBQUcsQ0FBQSxNQUFBLEtBQUssQ0FBQyxrQkFBa0IsMENBQUUsTUFBTTtZQUM3QyxDQUFDLENBQUMsTUFBQSxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsMENBQUUsU0FBUztZQUN4RSxDQUFDLENBQUMsQ0FBQSxNQUFBLEtBQUssQ0FBQyxlQUFlLDBDQUFFLE1BQU07Z0JBQy9CLENBQUMsQ0FBQyxNQUFBLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxlQUFlLENBQUMsMENBQUUsU0FBUztnQkFDckUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNkLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7U0FDcEQ7UUFDRCxPQUFPLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsK0JBQStCLENBQUMsVUFBa0IsRUFBRSxNQUFlO1FBQ2pFLElBQUk7WUFDRixJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDN0MsT0FBTyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ2xFO2lCQUFNLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUNqRCxPQUFPLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDeEU7WUFDRCxPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUN0RztRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1osZ0ZBQWdGO1lBQ2hGLElBQUksR0FBRyxDQUFDLE9BQU8sS0FBSywrQkFBK0IsRUFBRTtnQkFDbkQsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUNELE1BQU0sR0FBRyxDQUFDO1NBQ1g7SUFDSCxDQUFDO0lBRU8sbUJBQW1CLENBQ3pCLFVBQWtCLEVBQ2xCLFdBQW1CO1FBT25CLE1BQU0sS0FBSyxHQUFHLHFCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFO1lBQ2pELE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztTQUN2RTtRQUVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkcsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFOUQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBRXRFLE1BQU0sVUFBVSxHQUFHLG1DQUEwQixDQUFDO1lBQzVDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUNuRCxPQUFPLEVBQUUsWUFBWSxDQUFDLGtCQUFrQjtZQUN4QyxNQUFNLEVBQUUsSUFBSTtZQUNaLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYztZQUNwQyxXQUFXLEVBQUUsS0FBSyxDQUFDLGFBQWE7U0FDakMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsc0NBQXNDLENBQUMsVUFBa0IsRUFBRSxNQUFlO1FBQ3hFLE1BQU0sS0FBSyxHQUFHLHFCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsTUFBTSxXQUFXLEdBQUcsbUNBQTBCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7U0FDOUM7UUFFRCxJQUFJLGFBQWEsR0FBRyxXQUFXLENBQUM7UUFDaEMsSUFBSSxNQUFNLEVBQUU7WUFDVixtQ0FBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QixhQUFhLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQSxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUUsTUFBTSxJQUFHLENBQUMsRUFBRTtnQkFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2FBQ2xEO1NBQ0Y7UUFFRCxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRywrQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNuRixNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUVyRyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1lBQzFGLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2FBQ2xEO1lBQ0QsT0FBTywrQkFBc0IsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3pHLENBQUMsQ0FBQyxDQUFDO1FBRUgsNEZBQTRGO1FBQzVGLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDaEMsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUVELE1BQU0sTUFBTSxHQUFHLDRCQUFtQixDQUNoQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQ3ZDLFVBQVUsQ0FDWCxDQUFDO1FBRUYsT0FBTyxPQUFNLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxnQ0FBZ0MsQ0FBQyxVQUFrQixFQUFFLE1BQWU7UUFDbEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0MsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQzNDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsSUFBSSxNQUFNLENBQUM7UUFDWCxJQUFJLE1BQU0sRUFBRTtZQUNWLE1BQU0sV0FBVyxHQUFHLGdDQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQzthQUNsRDtTQUNGO2FBQU07WUFDTCxNQUFNLEdBQUcsT0FBTyxDQUFDO1NBQ2xCO1FBQ0QsTUFBTSxPQUFPLEdBQWMsRUFBRSxDQUFDO1FBRTlCLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxFQUFFO1lBQ3pCLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQztZQUM3QyxJQUFJLFdBQW1CLENBQUM7WUFDeEIsSUFBSSxHQUFXLENBQUM7WUFDaEIsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRTtnQkFDM0IsV0FBVyxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDNUIsR0FBRyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQzlCO2lCQUFNO2dCQUNMLFdBQVcsR0FBRyxlQUFXLENBQUMsZUFBZSxDQUFDO2dCQUMxQyxHQUFHLEdBQUcsU0FBUyxDQUFDO2FBQ2pCO1lBQ0QsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNoRixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3ZEO1FBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCwyQkFBMkIsQ0FDekIsVUFBa0IsRUFDbEIsRUFBRSxTQUFTLEtBQTZDLEVBQUU7O1FBRTFELElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUEsTUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLDBDQUFFLE1BQU0sQ0FBQSxJQUFJLENBQUMsZ0JBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFO1lBQ3hHLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztTQUNqRjtRQUVELE1BQU0sTUFBTSxHQUFHLFNBQVM7WUFDdEIsQ0FBQyxDQUFDLFNBQVM7WUFDWCxDQUFDLENBQUMsTUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLDBDQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQzNDLG9CQUFZLENBQUMsT0FBTSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQ3ZFLENBQUM7UUFFTixJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1NBQzlEO1FBRUQsTUFBTSxLQUFLLEdBQUcscUJBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMscUNBQTBCLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdEMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDOUI7UUFFRCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTs7WUFDMUIsTUFBTSxNQUFNLEdBQUcsQ0FBQSxNQUFBLEtBQUssQ0FBQyxrQkFBa0IsMENBQUUsTUFBTTtnQkFDN0MsQ0FBQyxDQUFDLE1BQUEsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLDBDQUFFLFNBQVM7Z0JBQ3BFLENBQUMsQ0FBQyxDQUFBLE1BQUEsS0FBSyxDQUFDLGVBQWUsMENBQUUsTUFBTTtvQkFDL0IsQ0FBQyxDQUFDLE1BQUEsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBQywwQ0FBRSxTQUFTO29CQUNqRSxDQUFDLENBQUMsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLFNBQVMsQ0FBQztZQUNyQixJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNYLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFDRCxJQUFJO2dCQUNGLE9BQU8sSUFBSSxDQUFDLCtCQUErQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQzthQUNqRTtZQUFDLE9BQU8sR0FBRyxFQUFFO2dCQUNaLGdGQUFnRjtnQkFDaEYsSUFBSSxHQUFHLENBQUMsT0FBTyxLQUFLLCtCQUErQixFQUFFO29CQUNuRCxPQUFPLEtBQUssQ0FBQztpQkFDZDtnQkFDRCxNQUFNLEdBQUcsQ0FBQzthQUNYO1FBQ0gsQ0FBQyxDQUFvQixDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWUsQ0FDYixTQUFrRCxFQUNsRCxTQUE4QyxzQkFBc0I7UUFFcEUsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFO1lBQ2hFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztTQUNoRDtRQUNELE1BQU0sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbEUsTUFBTSxPQUFPLEdBQWMsRUFBRSxDQUFDO1FBQzlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDaEQsSUFBSTtnQkFDRixJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztnQkFDaEUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNwQjtZQUFDLE9BQU8sR0FBRyxFQUFFO2dCQUNaLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDckI7U0FDRjtRQUNELElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7U0FDMUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQixDQUNoQixVQUFrQixFQUNsQixTQUFrRCxFQUNsRCxFQUFFLFlBQVksR0FBRyxDQUFDLGVBQVcsQ0FBQyxlQUFlLEVBQUUsZUFBVyxDQUFDLFdBQVcsQ0FBQyxFQUFFLGFBQWEsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFOztRQUVyRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7U0FDeEM7UUFDRCxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUU7WUFDaEUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1NBQ2hEO1FBQ0QsTUFBTSxLQUFLLEdBQUcscUJBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3RFLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztTQUNwRTtRQUNELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxrQkFBa0I7YUFDM0MsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDYixJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUN6RCxPQUFPLEtBQUssQ0FBQzthQUNkO1FBQ0gsQ0FBQyxDQUFDO2FBQ0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUF5QixDQUFDO1FBQzlDLElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRkFBaUYsQ0FBQyxDQUFDO1NBQ3BHO1FBRUQsU0FBUyxjQUFjLENBQUMsS0FBeUI7WUFDL0MsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2pELE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQzthQUM1RDtZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELElBQUksTUFBQSxLQUFLLENBQUMsYUFBYSwwQ0FBRSxNQUFNLEVBQUU7WUFDL0IsTUFBTSxPQUFPLEdBQW9CLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDM0QsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsQ0FBQyxhQUFhLElBQUksTUFBTSxDQUFDLEVBQUU7b0JBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztpQkFDbEU7Z0JBQ0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xELENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztTQUNsSDthQUFNLElBQUksTUFBQSxLQUFLLENBQUMsY0FBYywwQ0FBRSxNQUFNLEVBQUU7WUFDdkMsTUFBTSxPQUFPLEdBQW1CLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDMUQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO29CQUNuRCxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7aUJBQy9EO2dCQUNELE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQy9HO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsV0FBVyxDQUNULFVBQWtCLEVBQ2xCLFNBQWtELEVBQ2xELFNBQThDLHNCQUFzQjtRQUVwRSxNQUFNLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xFLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNuQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7U0FDeEY7YUFBTTtZQUNMLE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQy9EO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQixDQUFDLFVBQWtCLEVBQUUsY0FBc0IsRUFBRSxhQUFxQjtRQUM3RixNQUFNLHNCQUFzQixHQUFHLG9DQUEyQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDekYsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztTQUN4RTtRQUNELHFDQUE0QixDQUFDLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNwRixPQUFPLHNCQUFzQixDQUFDO0lBQ2hDLENBQUM7SUFFTyxlQUFlLENBQUMsVUFBa0IsRUFBRSxzQkFBOEM7UUFDeEYsTUFBTSxpQkFBaUIsR0FBRyw4QkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLGVBQU8sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1lBQ3JELE1BQU0sSUFBSSxLQUFLLENBQ2IsU0FBUyxDQUFBLGlCQUFpQixhQUFqQixpQkFBaUIsdUJBQWpCLGlCQUFpQixDQUFFLE1BQU0sRUFBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLHdDQUF3QyxDQUMxRyxDQUFDO1NBQ0g7UUFDRCwrQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsc0JBQXNCLENBQ3BCLFVBQWtCLEVBQ2xCLE1BQW9CLEVBQ3BCLEVBQUUsWUFBWSxHQUFHLENBQUMsZUFBVyxDQUFDLGVBQWUsRUFBRSxlQUFXLENBQUMsV0FBVyxDQUFDLEVBQUUsYUFBYSxHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUU7UUFFckcsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7U0FDL0M7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFDakQsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1NBQ2hEO1FBRUQseURBQXlEO1FBQ3pELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkcsTUFBTSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxHQUFHLFlBQVksQ0FBQztRQUMxRCxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7U0FDNUU7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM5RCxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFbEYsSUFBSSxVQUFrQixDQUFDO1FBQ3ZCLElBQUksYUFBYSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQzthQUMzRTtZQUVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0YsSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7YUFDbEQ7WUFFRCxVQUFVLEdBQUcsZ0NBQXVCLENBQUM7Z0JBQ25DLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtnQkFDN0IsVUFBVSxFQUFFLGdCQUFnQixDQUFDLFFBQVE7Z0JBQ3JDLFVBQVUsRUFBRSxrQkFBa0I7Z0JBQzlCLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYztnQkFDcEMsV0FBVyxFQUFFLEtBQUssQ0FBQyxhQUFhO2dCQUNoQyxJQUFJO2FBQ0wsQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUNSO2FBQU07WUFDTCxNQUFNLFVBQVUsR0FBRyxtQ0FBMEIsQ0FBQztnQkFDNUMsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO2dCQUNuRCxPQUFPLEVBQUUsa0JBQWtCO2dCQUMzQixNQUFNLEVBQUUsSUFBSTtnQkFDWixjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7Z0JBQ3BDLFdBQVcsRUFBRSxLQUFLLENBQUMsYUFBYTthQUNqQyxDQUFDLENBQUM7WUFFSCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDbkYsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO2FBQy9EO1lBQ0QsVUFBVSxHQUFHLDBCQUFpQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3RHO1FBRUQsSUFBSSxXQUFXLEtBQUssZUFBVyxDQUFDLGVBQWUsRUFBRTtZQUMvQyxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNsRTtRQUVELE1BQU0sR0FBRyxHQUFHLG1DQUEwQixDQUFDO1lBQ3JDLGlCQUFpQixFQUFFLFlBQVk7WUFDL0IsWUFBWTtZQUNaLFVBQVUsRUFBRSxVQUFVO1NBQ3ZCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsZ0JBQWdCLENBQ2QsVUFBa0IsRUFDbEIsTUFBcUIsRUFDckIsVUFBb0IsRUFDcEIsZUFBeUIsQ0FBQyxlQUFXLENBQUMsZUFBZSxFQUFFLGVBQVcsQ0FBQyxXQUFXLENBQUM7O1FBRS9FLE1BQU0sS0FBSyxHQUFHLHFCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsMEVBQTBFO1FBQzFFLElBQUksQ0FBQyxDQUFBLE1BQUEsS0FBSyxDQUFDLGFBQWEsMENBQUUsTUFBTSxDQUFBLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1NBQ25FO1FBQ0QsTUFBTSxNQUFNLEdBQUcsZ0NBQWdCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztTQUMvRDtRQUNELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsTUFBTSxrQkFBa0IsR0FBRyxXQUFPLENBQUMsaUJBQWlCLENBQUMsT0FBTSxFQUFFLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6RixNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsa0JBQWtCLENBQUM7UUFDM0MsSUFBSSxXQUFXLEtBQUssYUFBYSxDQUFDLFdBQVcsRUFBRTtZQUM3QyxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7U0FDeEU7UUFDRCxNQUFNLFFBQVEsR0FBRyxXQUFPLENBQUMsY0FBYyxDQUFDLE9BQU0sRUFBRSxrQkFBa0IsRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRTtZQUMvQyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNqRjtRQUNELE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUYsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxJQUFJLFdBQVcsS0FBSyxlQUFXLENBQUMsZUFBZSxFQUFFO1lBQy9DLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2hFO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFO1lBQ2hDLFlBQVksRUFBRTtnQkFDWjtvQkFDRSxNQUFNO29CQUNOLFNBQVM7b0JBQ1QsUUFBUTtpQkFDVDthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sc0JBQXNCLENBQUMsVUFBa0I7O1FBQy9DLE1BQU0sS0FBSyxHQUFHLHFCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsSUFBSSxNQUFBLEtBQUssQ0FBQyxhQUFhLDBDQUFFLE1BQU0sRUFBRTtZQUMvQixPQUFPLFdBQU8sQ0FBQyx5QkFBeUIsQ0FBQztnQkFDdkMsWUFBWSxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWTtnQkFDakQsVUFBVSxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTthQUMxQyxDQUFDLENBQUM7U0FDSjthQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFO1lBQ3RELE9BQU8sV0FBTyxDQUFDLHlCQUF5QixDQUFDO2dCQUN2QyxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7Z0JBQ3BDLFdBQVcsRUFBRSxLQUFLLENBQUMsYUFBYTthQUNqQyxDQUFDLENBQUM7U0FDSjtRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU8sb0JBQW9CLENBQzFCLFVBQWtCLEVBQ2xCLFlBQXVCLEVBQ3ZCLFFBQWlCO1FBS2pCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUN4QztRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFdBQVcsSUFBSSxlQUFXLENBQUMsZUFBZSxDQUFDO1FBQzVGLElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3pELE1BQU0sSUFBSSxLQUFLLENBQ2IsaUVBQWlFO2dCQUMvRCwwREFBMEQsV0FBVyxFQUFFLENBQzFFLENBQUM7U0FDSDtRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyx1Q0FBdUM7UUFDdkUsTUFBTSxjQUFjLEdBQWEsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sYUFBYSxHQUFhLEVBQUUsQ0FBQztRQUVuQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDcEMsSUFBSSxPQUFPLENBQUM7WUFDWixJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUU7Z0JBQ3hCLHNGQUFzRjtnQkFDdEYsTUFBTSxnQkFBZ0IsR0FBSSxJQUFJLENBQUMsV0FBK0IsQ0FBQyxxQkFBcUIsQ0FDbEYsS0FBSyxDQUFDLGNBQWMsRUFDcEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQ2hCLENBQUM7Z0JBRUYsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDckMsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBRTVDLDJGQUEyRjtnQkFDM0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsa0RBQWtELENBQUMsQ0FBQztpQkFDMUc7Z0JBRUQsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDdkMsT0FBTyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUMvQztpQkFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUU7Z0JBQzVCLE9BQU8sR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO2FBQzdCO2lCQUFNO2dCQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQzthQUN2RDtZQUNELGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFO1lBQ3BELE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLFVBQVUsZ0RBQWdELENBQUMsQ0FBQztTQUMxRztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hHLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILDJCQUEyQixDQUFDLFVBQWtCLEVBQUUsWUFBaUM7UUFDL0UsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxFQUFFO1lBQzlDLEdBQUcsRUFBRSx3Q0FBb0IsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDO1lBQzNDLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSztTQUMxQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsbUNBQW1DLENBQUMsVUFBa0IsRUFBRSxZQUFpQzs7UUFDdkYsTUFBTSxLQUFLLEdBQUcscUJBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRCxNQUFNLEdBQUcsR0FBRyx3Q0FBb0IsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkQsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksQ0FBQztRQUMvQixJQUFJLE1BQUEsS0FBSyxDQUFDLGNBQWMsMENBQUUsTUFBTSxFQUFFO1lBQ2hDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzlFLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNqQixLQUFLLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO2dCQUNoRCxPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7UUFDRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxFQUFFO1lBQ3ZDLEdBQUc7WUFDSCxLQUFLO1NBQ04sQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gscUJBQXFCLENBQUMsVUFBa0IsRUFBRSxTQUFnQztRQUN4RSxNQUFNLEtBQUssR0FBRyxxQkFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFELE9BQU8seUNBQThCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7O09BR0c7SUFDSCx3QkFBd0IsQ0FBQyxVQUFrQixFQUFFLFlBQW1DOztRQUM5RSxNQUFNLEtBQUssR0FBRyxxQkFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxDQUFBLE1BQUEsS0FBSyxDQUFDLGNBQWMsMENBQUUsTUFBTSxDQUFBLEVBQUU7WUFDakMsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQy9GLE1BQU0sSUFBSSxLQUFLLENBQUMsd0VBQXdFLENBQUMsQ0FBQztTQUMzRjtRQUNELEtBQUssQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakUsTUFBTSxHQUFHLEdBQUcsd0NBQW9CLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLE9BQU8sQ0FBQyxDQUNOLFlBQVksS0FBSyxTQUFTO2dCQUMxQixDQUFDLFlBQVksQ0FBQyxVQUFVLEtBQUssR0FBRyxDQUFDLFVBQVU7b0JBQ3pDLENBQUMsWUFBWSxDQUFDLE9BQU8sS0FBSyxTQUFTO3dCQUNqQyxDQUFDLFlBQVksQ0FBQyxPQUFPLEtBQUssR0FBRyxDQUFDLE9BQU87NEJBQ25DLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDOUYsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8seUJBQXlCLENBQy9CLFVBQWtCLEVBQ2xCLE9BQXVCLEVBQ3ZCLE9BQTJCLEVBQzNCLFNBQTBELEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRTtRQUVsRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRTtZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7U0FDL0Q7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxNQUFNLGlCQUFpQixHQUFHLEdBQW1CLEVBQUU7O1lBQzdDLElBQUksQ0FBQyxDQUFBLE1BQUEsS0FBSyxDQUFDLGtCQUFrQiwwQ0FBRSxNQUFNLENBQUEsRUFBRTtnQkFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO2FBQ25FO1lBQ0QsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDWixNQUFNLElBQUksS0FBSyxDQUFDLHlFQUF5RSxDQUFDLENBQUM7YUFDNUY7WUFDRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUM7UUFDRixNQUFNLGNBQWMsR0FBRyxPQUFPLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDMUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUU7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1NBQzNEO1FBQ0QsTUFBTSxZQUFZLEdBQUcsb0NBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7U0FDeEU7UUFDRCxxQ0FBNEIsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEYsTUFBTSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxHQUFHLFlBQVksQ0FBQztRQUUxRCxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN2RyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1lBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMsMEVBQTBFLENBQUMsQ0FBQztTQUM3RjtRQUVELE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFdkQsSUFBSSxRQUFnQixDQUFDO1FBQ3JCLElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRTtZQUN4QixJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUU7Z0JBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQzthQUNuRjtZQUNELG1FQUFtRTtZQUNuRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BELE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQzthQUMzRTtZQUNELE1BQU0sTUFBTSxHQUFHLDhCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsVUFBVSxFQUFFLENBQUMsQ0FBQzthQUM1RDtZQUNELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQzthQUNuRDtZQUNELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakcsSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLCtFQUErRSxDQUFDLENBQUM7YUFDbEc7WUFFRCxRQUFRLEdBQUcsdUNBQThCLENBQUM7Z0JBQ3hDLFVBQVUsRUFBRSxjQUFjLENBQUMsVUFBVTtnQkFDckMsVUFBVSxFQUFFLGdCQUFnQixDQUFDLFFBQVE7Z0JBQ3JDLFVBQVUsRUFBRSxrQkFBa0I7Z0JBQzlCLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYztnQkFDcEMsV0FBVyxFQUFFLEtBQUssQ0FBQyxhQUFhO2dCQUNoQyxJQUFJO2FBQ0wsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUMvQixjQUFjLENBQUMsVUFBVSxFQUN6QixpQkFBaUIsRUFDakIsWUFBWSxFQUNaLElBQUksRUFDSixNQUFNLENBQUMsU0FBUyxDQUNqQixDQUNGLENBQUM7U0FDSDtRQUVELE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVPLG9CQUFvQixDQUMxQixPQUF1QixFQUN2QixPQUEyQixFQUMzQixVQUFtQixFQUNuQixTQUEwRCxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUU7UUFFbEYsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1NBQzlEO1FBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7WUFDdkUsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1NBQ3RFO1FBRUQsTUFBTSxNQUFNLEdBQUcsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzNHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDdEMsT0FBTzthQUNSO1lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxLQUFLLEVBQUUsaUNBQXdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNuRixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILG1CQUFtQixDQUNqQixVQUFrQixFQUNsQixjQUE4QixFQUM5QixTQUEwRCxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUU7UUFFbEYsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILHFCQUFxQixDQUNuQixVQUFrQixFQUNsQixPQUF1QixFQUN2QixTQUEwRCxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUU7UUFFbEYscUJBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILHVCQUF1QixDQUNyQixPQUF1QixFQUN2QixTQUEwRCxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUU7UUFFbEYsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCx5QkFBeUIsQ0FDdkIsT0FBdUIsRUFDdkIsU0FBMEQsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFO1FBRWxGLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxLQUFLLENBQUMsS0FBSyxFQUFVLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBdGxDRCw0QkFzbENDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHNidCBhcyBQc2J0QmFzZSB9IGZyb20gJ2JpcDE3NCc7XG5pbXBvcnQge1xuICBCaXAzMkRlcml2YXRpb24sXG4gIFRhcEJpcDMyRGVyaXZhdGlvbixcbiAgVHJhbnNhY3Rpb24gYXMgSVRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvbkZyb21CdWZmZXIsXG59IGZyb20gJ2JpcDE3NC9zcmMvbGliL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgY2hlY2tGb3JJbnB1dCB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL3V0aWxzJztcbmltcG9ydCB7IEJ1ZmZlcldyaXRlciwgdmFydWludCB9IGZyb20gJ2JpdGNvaW5qcy1saWIvc3JjL2J1ZmZlcnV0aWxzJztcbmltcG9ydCB7IFNlc3Npb25LZXkgfSBmcm9tICdAYnJhbmRvbmJsYWNrL211c2lnJztcbmltcG9ydCB7IEJJUDMyRmFjdG9yeSwgQklQMzJJbnRlcmZhY2UgfSBmcm9tICdiaXAzMic7XG5pbXBvcnQgKiBhcyBiczU4Y2hlY2sgZnJvbSAnYnM1OGNoZWNrJztcbmltcG9ydCB7IGRlY29kZVByb3ByaWV0YXJ5S2V5LCBlbmNvZGVQcm9wcmlldGFyeUtleSB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL3Byb3ByaWV0YXJ5S2V5VmFsJztcblxuaW1wb3J0IHsgdGFwcm9vdCwgSERTaWduZXIsIFBzYnQsIFBzYnRUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb24sIFR4T3V0cHV0LCBOZXR3b3JrLCBlY2MgYXMgZWNjTGliIH0gZnJvbSAnLi4nO1xuaW1wb3J0IHsgVXR4b1RyYW5zYWN0aW9uIH0gZnJvbSAnLi9VdHhvVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgZ2V0T3V0cHV0SWRGb3JJbnB1dCB9IGZyb20gJy4vVW5zcGVudCc7XG5pbXBvcnQgeyBpc1NlZ3dpdCB9IGZyb20gJy4vcHNidC9zY3JpcHRUeXBlcyc7XG5pbXBvcnQgeyB1bnNpZ24gfSBmcm9tICcuL3BzYnQvZnJvbUhhbGZTaWduZWQnO1xuaW1wb3J0IHsgY2hlY2tQbGFpblB1YmxpY0tleSwgdG9YT25seVB1YmxpY0tleSB9IGZyb20gJy4vb3V0cHV0U2NyaXB0cyc7XG5pbXBvcnQgeyBwYXJzZVB1YlNjcmlwdDJPZjMgfSBmcm9tICcuL3BhcnNlSW5wdXQnO1xuaW1wb3J0IHtcbiAgY3JlYXRlTXVzaWcyU2lnbmluZ1Nlc3Npb24sXG4gIGVuY29kZVBzYnRNdXNpZzJQYXJ0aWFsU2lnLFxuICBlbmNvZGVQc2J0TXVzaWcyUHViTm9uY2UsXG4gIG11c2lnMlBhcnRpYWxTaWduLFxuICBwYXJzZVBzYnRNdXNpZzJOb25jZXMsXG4gIHBhcnNlUHNidE11c2lnMlBhcnRpY2lwYW50cyxcbiAgUHNidE11c2lnMlBhcnRpY2lwYW50cyxcbiAgYXNzZXJ0UHNidE11c2lnMk5vbmNlcyxcbiAgYXNzZXJ0UHNidE11c2lnMlBhcnRpY2lwYW50cyxcbiAgTXVzaWcyTm9uY2VTdG9yZSxcbiAgUHNidE11c2lnMlB1Yk5vbmNlLFxuICBwYXJzZVBzYnRNdXNpZzJQYXJ0aWFsU2lncyxcbiAgbXVzaWcyUGFydGlhbFNpZ1ZlcmlmeSxcbiAgbXVzaWcyQWdncmVnYXRlU2lncyxcbiAgZ2V0U2lnSGFzaFR5cGVGcm9tU2lncyxcbiAgbXVzaWcyRGV0ZXJtaW5pc3RpY1NpZ24sXG4gIGNyZWF0ZU11c2lnMkRldGVybWluaXN0aWNOb25jZSxcbn0gZnJvbSAnLi9NdXNpZzInO1xuaW1wb3J0IHsgaXNUcmlwbGUsIGlzVHVwbGUsIFRyaXBsZSwgVHVwbGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGdldFRhcHJvb3RPdXRwdXRLZXkgfSBmcm9tICcuLi90YXByb290JztcbmltcG9ydCB7XG4gIGdldFBzYnRJbnB1dFByb3ByaWV0YXJ5S2V5VmFscyxcbiAgZ2V0UHNidElucHV0U2lnbmF0dXJlQ291bnQsXG4gIFByb3ByaWV0YXJ5S2V5U2VhcmNoLFxuICBQcm9wcmlldGFyeUtleVN1YnR5cGUsXG4gIFByb3ByaWV0YXJ5S2V5VmFsdWUsXG4gIFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbn0gZnJvbSAnLi9Qc2J0VXRpbCc7XG5cbnR5cGUgU2lnbmF0dXJlUGFyYW1zID0ge1xuICAvKiogV2hlbiB0cnVlLCBhbmQgYWRkIHRoZSBzZWNvbmQgKGxhc3QpIG5vbmNlIGFuZCBzaWduYXR1cmUgZm9yIGEgdGFwcm9vdCBrZXlcbiAgICogcGF0aCBzcGVuZCBkZXRlcm1pbmlzdGljYWxseS4gVGhyb3dzIGFuIGVycm9yIGlmIGRvbmUgZm9yIHRoZSBmaXJzdCBub25jZS9zaWduYXR1cmVcbiAgICogb2YgYSB0YXByb290IGtleXBhdGggc3BlbmQuIElnbm9yZSBmb3IgYWxsIG90aGVyIGlucHV0IHR5cGVzLlxuICAgKi9cbiAgZGV0ZXJtaW5pc3RpYzogYm9vbGVhbjtcbiAgLyoqIEFsbG93ZWQgc2lnaGFzaCB0eXBlcyAqL1xuICBzaWdoYXNoVHlwZXM6IG51bWJlcltdO1xufTtcblxuY29uc3QgZGVmYXVsdFNpZ25hdHVyZVBhcmFtcyA9IHtcbiAgZGV0ZXJtaW5pc3RpYzogZmFsc2UsXG4gIHNpZ2hhc2hUeXBlczogW1RyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCwgVHJhbnNhY3Rpb24uU0lHSEFTSF9BTExdLFxufTtcblxuZnVuY3Rpb24gdG9TaWduYXR1cmVQYXJhbXModjogUGFydGlhbDxTaWduYXR1cmVQYXJhbXM+IHwgbnVtYmVyW10pOiBTaWduYXR1cmVQYXJhbXMge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KSA/IHRvU2lnbmF0dXJlUGFyYW1zKHsgc2lnaGFzaFR5cGVzOiB2IH0pIDogeyAuLi5kZWZhdWx0U2lnbmF0dXJlUGFyYW1zLCAuLi52IH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSERUYXByb290U2lnbmVyIGV4dGVuZHMgSERTaWduZXIge1xuICAvKipcbiAgICogVGhlIHBhdGggc3RyaW5nIG11c3QgbWF0Y2ggL15tKFxcL1xcZCsnPykrJC9cbiAgICogZXguIG0vNDQnLzAnLzAnLzEvMjMgbGV2ZWxzIHdpdGggJyBtdXN0IGJlIGhhcmQgZGVyaXZhdGlvbnNcbiAgICovXG4gIGRlcml2ZVBhdGgocGF0aDogc3RyaW5nKTogSERUYXByb290U2lnbmVyO1xuICAvKipcbiAgICogSW5wdXQgaGFzaCAodGhlIFwibWVzc2FnZSBkaWdlc3RcIikgZm9yIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtXG4gICAqIFJldHVybiBhIDY0IGJ5dGUgc2lnbmF0dXJlICgzMiBieXRlIHIgYW5kIDMyIGJ5dGUgcyBpbiB0aGF0IG9yZGVyKVxuICAgKi9cbiAgc2lnblNjaG5vcnIoaGFzaDogQnVmZmVyKTogQnVmZmVyO1xufVxuXG4vKipcbiAqIEhEIHNpZ25lciBvYmplY3QgZm9yIHRhcHJvb3QgcDJ0ciBtdXNpZzIga2V5IHBhdGggc2lnblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhEVGFwcm9vdE11c2lnMlNpZ25lciBleHRlbmRzIEhEU2lnbmVyIHtcbiAgLyoqXG4gICAqIE11c2lnMiByZXF1aXJlcyBzaWduZXIncyAzMi1ieXRlcyBwcml2YXRlIGtleSB0byBiZSBwYXNzZWQgdG8gaXQuXG4gICAqL1xuICBwcml2YXRlS2V5OiBCdWZmZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHN0cmluZyBtdXN0IG1hdGNoIC9ebShcXC9cXGQrJz8pKyQvXG4gICAqIGV4LiBtLzQ0Jy8wJy8wJy8xLzIzIGxldmVscyB3aXRoICcgbXVzdCBiZSBoYXJkIGRlcml2YXRpb25zXG4gICAqL1xuICBkZXJpdmVQYXRoKHBhdGg6IHN0cmluZyk6IEhEVGFwcm9vdE11c2lnMlNpZ25lcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hub3JyU2lnbmVyIHtcbiAgcHVibGljS2V5OiBCdWZmZXI7XG4gIHNpZ25TY2hub3JyKGhhc2g6IEJ1ZmZlcik6IEJ1ZmZlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNdXNpZzJTaWduZXIge1xuICBwdWJsaWNLZXk6IEJ1ZmZlcjtcbiAgcHJpdmF0ZUtleTogQnVmZmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhcHJvb3RTaWduZXIge1xuICBsZWFmSGFzaGVzOiBCdWZmZXJbXTtcbiAgc2lnbmVyOiBTY2hub3JyU2lnbmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBzYnRPcHRzIHtcbiAgbmV0d29yazogTmV0d29yaztcbiAgbWF4aW11bUZlZVJhdGU/OiBudW1iZXI7IC8vIFtzYXQvYnl0ZV1cbiAgYmlwMzJQYXRoc0Fic29sdXRlPzogYm9vbGVhbjtcbn1cblxuLy8gVE9ETzogdXBzdHJlYW0gZG9lcyBgY2hlY2tJbnB1dHNGb3JQYXJ0aWFsU2lnc2AgYmVmb3JlIGRvaW5nIHRoaW5ncyBsaWtlXG4vLyBgc2V0VmVyc2lvbmAuIE91ciBpbnB1dHMgY291bGQgaGF2ZSB0YXBzY3JpcHRzaWdzIChvciBpbiBmdXR1cmUgdGFwa2V5c2lncylcbi8vIGFuZCBub3QgZmFpbCB0aGF0IGNoZWNrLiBEbyB3ZSB3YW50IHRvIGRvIGFueXRoaW5nIGFib3V0IHRoYXQ/XG5leHBvcnQgY2xhc3MgVXR4b1BzYnQ8VHggZXh0ZW5kcyBVdHhvVHJhbnNhY3Rpb248YmlnaW50PiA9IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+PiBleHRlbmRzIFBzYnQge1xuICBwcml2YXRlIG5vbmNlU3RvcmUgPSBuZXcgTXVzaWcyTm9uY2VTdG9yZSgpO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgdHJhbnNhY3Rpb25Gcm9tQnVmZmVyKGJ1ZmZlcjogQnVmZmVyLCBuZXR3b3JrOiBOZXR3b3JrKTogVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4ge1xuICAgIHJldHVybiBVdHhvVHJhbnNhY3Rpb24uZnJvbUJ1ZmZlcjxiaWdpbnQ+KGJ1ZmZlciwgZmFsc2UsICdiaWdpbnQnLCBuZXR3b3JrKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVQc2J0KG9wdHM6IFBzYnRPcHRzLCBkYXRhPzogUHNidEJhc2UpOiBVdHhvUHNidCB7XG4gICAgcmV0dXJuIG5ldyBVdHhvUHNidChcbiAgICAgIG9wdHMsXG4gICAgICBkYXRhIHx8IG5ldyBQc2J0QmFzZShuZXcgUHNidFRyYW5zYWN0aW9uKHsgdHg6IG5ldyBVdHhvVHJhbnNhY3Rpb248YmlnaW50PihvcHRzLm5ldHdvcmspIH0pKVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUJ1ZmZlcihidWZmZXI6IEJ1ZmZlciwgb3B0czogUHNidE9wdHMpOiBVdHhvUHNidCB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25Gcm9tQnVmZmVyOiBUcmFuc2FjdGlvbkZyb21CdWZmZXIgPSAoYnVmZmVyOiBCdWZmZXIpOiBJVHJhbnNhY3Rpb24gPT4ge1xuICAgICAgY29uc3QgdHggPSB0aGlzLnRyYW5zYWN0aW9uRnJvbUJ1ZmZlcihidWZmZXIsIG9wdHMubmV0d29yayk7XG4gICAgICByZXR1cm4gbmV3IFBzYnRUcmFuc2FjdGlvbih7IHR4IH0pO1xuICAgIH07XG4gICAgY29uc3QgcHNidEJhc2UgPSBQc2J0QmFzZS5mcm9tQnVmZmVyKGJ1ZmZlciwgdHJhbnNhY3Rpb25Gcm9tQnVmZmVyLCB7XG4gICAgICBiaXAzMlBhdGhzQWJzb2x1dGU6IG9wdHMuYmlwMzJQYXRoc0Fic29sdXRlLFxuICAgIH0pO1xuICAgIGNvbnN0IHBzYnQgPSB0aGlzLmNyZWF0ZVBzYnQob3B0cywgcHNidEJhc2UpO1xuICAgIC8vIFVwc3RyZWFtIGNoZWNrcyBmb3IgZHVwbGljYXRlIGlucHV0cyBoZXJlLCBidXQgaXQgc2VlbXMgdG8gYmUgb2YgZHViaW91cyB2YWx1ZS5cbiAgICByZXR1cm4gcHNidDtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSGV4KGRhdGE6IHN0cmluZywgb3B0czogUHNidE9wdHMpOiBVdHhvUHNidCB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbUJ1ZmZlcihCdWZmZXIuZnJvbShkYXRhLCAnaGV4JyksIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXJlbnQgLSBQYXJlbnQga2V5LiBNYXRjaGVkIHdpdGggYGJpcDMyRGVyaXZhdGlvbnNgIHVzaW5nIGBmaW5nZXJwcmludGAgcHJvcGVydHkuXG4gICAqIEBwYXJhbSBiaXAzMkRlcml2YXRpb25zIC0gcG9zc2libGUgZGVyaXZhdGlvbnMgZm9yIGlucHV0IG9yIG91dHB1dFxuICAgKiBAcmV0dXJuIGRlcml2ZWQgYmlwMzIgbm9kZSBpZiBtYXRjaGluZyBkZXJpdmF0aW9uIGlzIGZvdW5kLCB1bmRlZmluZWQgaWYgbm9uZSBpcyBmb3VuZFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIG1vcmUgdGhhbiBvbmUgbWF0Y2ggaXMgZm91bmRcbiAgICovXG4gIHN0YXRpYyBkZXJpdmVLZXlQYWlyKHBhcmVudDogQklQMzJJbnRlcmZhY2UsIGJpcDMyRGVyaXZhdGlvbnM6IEJpcDMyRGVyaXZhdGlvbltdKTogQklQMzJJbnRlcmZhY2UgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1hdGNoaW5nRGVyaXZhdGlvbnMgPSBiaXAzMkRlcml2YXRpb25zLmZpbHRlcigoYmlwRHYpID0+IHtcbiAgICAgIHJldHVybiBiaXBEdi5tYXN0ZXJGaW5nZXJwcmludC5lcXVhbHMocGFyZW50LmZpbmdlcnByaW50KTtcbiAgICB9KTtcblxuICAgIGlmICghbWF0Y2hpbmdEZXJpdmF0aW9ucy5sZW5ndGgpIHtcbiAgICAgIC8vIE5vIGZpbmdlcnByaW50IG1hdGNoXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChtYXRjaGluZ0Rlcml2YXRpb25zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgbW9yZSB0aGFuIG9uZSBtYXRjaGluZyBkZXJpdmF0aW9uIGZvciBmaW5nZXJwcmludCAke3BhcmVudC5maW5nZXJwcmludC50b1N0cmluZygnaGV4Jyl9OiAke1xuICAgICAgICAgIG1hdGNoaW5nRGVyaXZhdGlvbnMubGVuZ3RoXG4gICAgICAgIH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IFtkZXJpdmF0aW9uXSA9IG1hdGNoaW5nRGVyaXZhdGlvbnM7XG4gICAgY29uc3Qgbm9kZSA9IHBhcmVudC5kZXJpdmVQYXRoKGRlcml2YXRpb24ucGF0aCk7XG5cbiAgICBpZiAoIWRlcml2YXRpb24ucHVia2V5LmVxdWFscyhub2RlLnB1YmxpY0tleSkgJiYgIWRlcml2YXRpb24ucHVia2V5LmVxdWFscyh0b1hPbmx5UHVibGljS2V5KG5vZGUucHVibGljS2V5KSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHVia2V5IGRpZCBub3QgbWF0Y2ggYmlwMzJEZXJpdmF0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBnZXQgbmV0d29yaygpOiBOZXR3b3JrIHtcbiAgICByZXR1cm4gdGhpcy50eC5uZXR3b3JrO1xuICB9XG5cbiAgdG9IZXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIGdldE5vbldpdG5lc3NQcmV2aW91c1R4aWRzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB0eElucHV0cyA9IHRoaXMudHhJbnB1dHM7IC8vIFRoZXNlIGFyZSBzb21ld2hhdCBjb3N0bHkgdG8gZXh0cmFjdFxuICAgIGNvbnN0IHR4aWRTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKCFpbnB1dC53aXRuZXNzVXR4bykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgaGF2ZSB3aXRuZXNzIFVUWE8gZm9yIGFsbCBpbnB1dHMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNTZWd3aXQoaW5wdXQud2l0bmVzc1V0eG8uc2NyaXB0LCBpbnB1dC5yZWRlZW1TY3JpcHQpKSB7XG4gICAgICAgIHR4aWRTZXQuYWRkKGdldE91dHB1dElkRm9ySW5wdXQodHhJbnB1dHNbaW5kZXhdKS50eGlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gWy4uLnR4aWRTZXRdO1xuICB9XG5cbiAgYWRkTm9uV2l0bmVzc1V0eG9zKHR4QnVmczogUmVjb3JkPHN0cmluZywgQnVmZmVyPik6IHRoaXMge1xuICAgIGNvbnN0IHR4SW5wdXRzID0gdGhpcy50eElucHV0czsgLy8gVGhlc2UgYXJlIHNvbWV3aGF0IGNvc3RseSB0byBleHRyYWN0XG4gICAgdGhpcy5kYXRhLmlucHV0cy5mb3JFYWNoKChpbnB1dCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghaW5wdXQud2l0bmVzc1V0eG8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGhhdmUgd2l0bmVzcyBVVFhPIGZvciBhbGwgaW5wdXRzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzU2Vnd2l0KGlucHV0LndpdG5lc3NVdHhvLnNjcmlwdCwgaW5wdXQucmVkZWVtU2NyaXB0KSkge1xuICAgICAgICBjb25zdCB7IHR4aWQgfSA9IGdldE91dHB1dElkRm9ySW5wdXQodHhJbnB1dHNbaW5kZXhdKTtcbiAgICAgICAgaWYgKHR4QnVmc1t0eGlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYWxsIHJlcXVpcmVkIHByZXZpb3VzIHRyYW5zYWN0aW9ucyBwcm92aWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlSW5wdXQoaW5kZXgsIHsgbm9uV2l0bmVzc1V0eG86IHR4QnVmc1t0eGlkXSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tVHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+LCBwcmV2T3V0cHV0czogVHhPdXRwdXQ8YmlnaW50PltdKTogVXR4b1BzYnQge1xuICAgIGlmIChwcmV2T3V0cHV0cy5sZW5ndGggIT09IHRyYW5zYWN0aW9uLmlucy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyYW5zYWN0aW9uIGhhcyAke3RyYW5zYWN0aW9uLmlucy5sZW5ndGh9IGlucHV0cywgYnV0ICR7cHJldk91dHB1dHMubGVuZ3RofSBwcmV2aW91cyBvdXRwdXRzIHByb3ZpZGVkYFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgY2xvbmVkVHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbi5jbG9uZSgpO1xuICAgIGNvbnN0IHVwZGF0ZXMgPSB1bnNpZ24oY2xvbmVkVHJhbnNhY3Rpb24sIHByZXZPdXRwdXRzKTtcblxuICAgIGNvbnN0IHBzYnRCYXNlID0gbmV3IFBzYnRCYXNlKG5ldyBQc2J0VHJhbnNhY3Rpb24oeyB0eDogY2xvbmVkVHJhbnNhY3Rpb24gfSkpO1xuICAgIGNsb25lZFRyYW5zYWN0aW9uLmlucy5mb3JFYWNoKCgpID0+IHBzYnRCYXNlLmlucHV0cy5wdXNoKHsgdW5rbm93bktleVZhbHM6IFtdIH0pKTtcbiAgICBjbG9uZWRUcmFuc2FjdGlvbi5vdXRzLmZvckVhY2goKCkgPT4gcHNidEJhc2Uub3V0cHV0cy5wdXNoKHsgdW5rbm93bktleVZhbHM6IFtdIH0pKTtcbiAgICBjb25zdCBwc2J0ID0gdGhpcy5jcmVhdGVQc2J0KHsgbmV0d29yazogdHJhbnNhY3Rpb24ubmV0d29yayB9LCBwc2J0QmFzZSk7XG5cbiAgICB1cGRhdGVzLmZvckVhY2goKHVwZGF0ZSwgaW5kZXgpID0+IHtcbiAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5kZXgsIHVwZGF0ZSk7XG4gICAgICBwc2J0LnVwZGF0ZUlucHV0KGluZGV4LCB7IHdpdG5lc3NVdHhvOiB7IHNjcmlwdDogcHJldk91dHB1dHNbaW5kZXhdLnNjcmlwdCwgdmFsdWU6IHByZXZPdXRwdXRzW2luZGV4XS52YWx1ZSB9IH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBzYnQ7XG4gIH1cblxuICBnZXRVbnNpZ25lZFR4KCk6IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+IHtcbiAgICByZXR1cm4gdGhpcy50eC5jbG9uZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBuZXdUcmFuc2FjdGlvbihuZXR3b3JrOiBOZXR3b3JrKTogVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4ge1xuICAgIHJldHVybiBuZXcgVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4obmV0d29yayk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHR4KCk6IFR4IHtcbiAgICByZXR1cm4gKHRoaXMuZGF0YS5nbG9iYWxNYXAudW5zaWduZWRUeCBhcyBQc2J0VHJhbnNhY3Rpb24pLnR4IGFzIFR4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrRm9yU2lnbmF0dXJlcyhwcm9wTmFtZT86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIGlmIChpbnB1dC50YXBTY3JpcHRTaWc/Lmxlbmd0aCB8fCBpbnB1dC50YXBLZXlTaWcgfHwgaW5wdXQucGFydGlhbFNpZz8ubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1vZGlmeSAke3Byb3BOYW1lID8/ICd0cmFuc2FjdGlvbid9IC0gc2lnbmF0dXJlcyBleGlzdC5gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCBhdCBpbnB1dEluZGV4IGlzIGEgdGFwcm9vdCBrZXkgcGF0aC5cbiAgICogQ2hlY2tzIGZvciBwcmVzZW5jZSBvZiBtaW5pbXVtIHJlcXVpcmVkIGtleSBwYXRoIGlucHV0IGZpZWxkcyBhbmQgYWJzZW5jZSBvZiBhbnkgc2NyaXB0IHBhdGggb25seSBpbnB1dCBmaWVsZHMuXG4gICAqL1xuICBpc1RhcHJvb3RLZXlQYXRoSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIHJldHVybiAoXG4gICAgICAhIWlucHV0LnRhcEludGVybmFsS2V5ICYmXG4gICAgICAhIWlucHV0LnRhcE1lcmtsZVJvb3QgJiZcbiAgICAgICEoXG4gICAgICAgIGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCB8fFxuICAgICAgICBpbnB1dC50YXBTY3JpcHRTaWc/Lmxlbmd0aCB8fFxuICAgICAgICBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24/LnNvbWUoKHYpID0+IHYubGVhZkhhc2hlcy5sZW5ndGgpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCBhdCBpbnB1dEluZGV4IGlzIGEgdGFwcm9vdCBzY3JpcHQgcGF0aC5cbiAgICogQ2hlY2tzIGZvciBwcmVzZW5jZSBvZiBtaW5pbXVtIHJlcXVpcmVkIHNjcmlwdCBwYXRoIGlucHV0IGZpZWxkcyBhbmQgYWJzZW5jZSBvZiBhbnkga2V5IHBhdGggb25seSBpbnB1dCBmaWVsZHMuXG4gICAqL1xuICBpc1RhcHJvb3RTY3JpcHRQYXRoSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIHJldHVybiAoXG4gICAgICAhIWlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCAmJlxuICAgICAgIShcbiAgICAgICAgdGhpcy5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgICAgICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTLFxuICAgICAgICB9KS5sZW5ndGggfHxcbiAgICAgICAgdGhpcy5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgICAgICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BVQl9OT05DRSxcbiAgICAgICAgfSkubGVuZ3RoIHx8XG4gICAgICAgIHRoaXMuZ2V0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXgsIHtcbiAgICAgICAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUFMX1NJRyxcbiAgICAgICAgfSkubGVuZ3RoXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCBhdCBpbnB1dEluZGV4IGlzIGEgdGFwcm9vdFxuICAgKi9cbiAgaXNUYXByb290SW5wdXQoaW5wdXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGNvbnN0IGlzUDJUUiA9IChzY3JpcHQ6IEJ1ZmZlcik6IGJvb2xlYW4gPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZ2V0VGFwcm9vdE91dHB1dEtleShzY3JpcHQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuICEhKFxuICAgICAgaW5wdXQudGFwSW50ZXJuYWxLZXkgfHxcbiAgICAgIGlucHV0LnRhcE1lcmtsZVJvb3QgfHxcbiAgICAgIGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCB8fFxuICAgICAgaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uPy5sZW5ndGggfHxcbiAgICAgIGlucHV0LnRhcFNjcmlwdFNpZz8ubGVuZ3RoIHx8XG4gICAgICB0aGlzLmdldFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7XG4gICAgICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUNJUEFOVF9QVUJfS0VZUyxcbiAgICAgIH0pLmxlbmd0aCB8fFxuICAgICAgdGhpcy5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgICAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUFVCX05PTkNFLFxuICAgICAgfSkubGVuZ3RoIHx8XG4gICAgICB0aGlzLmdldFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7XG4gICAgICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUFMX1NJRyxcbiAgICAgIH0pLmxlbmd0aCB8fFxuICAgICAgKGlucHV0LndpdG5lc3NVdHhvICYmIGlzUDJUUihpbnB1dC53aXRuZXNzVXR4by5zY3JpcHQpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTW9zdGx5IGNvcGllZCBmcm9tIGJpdGNvaW5qcy1saWIvdHNfc3JjL3BzYnQudHNcbiAgICovXG4gIGZpbmFsaXplQWxsSW5wdXRzKCk6IHRoaXMge1xuICAgIGNvbnN0IGlzTXVsdGlzaWdUYXByb290U2NyaXB0ID0gKHNjcmlwdDogQnVmZmVyKTogYm9vbGVhbiA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJzZVB1YlNjcmlwdDJPZjMoc2NyaXB0LCAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCcpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG4gICAgY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCAwKTsgLy8gbWFraW5nIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBvbmVcbiAgICB0aGlzLmRhdGEuaW5wdXRzLm1hcCgoaW5wdXQsIGlkeCkgPT4ge1xuICAgICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gaXNNdWx0aXNpZ1RhcHJvb3RTY3JpcHQoaW5wdXQudGFwTGVhZlNjcmlwdFswXS5zY3JpcHQpXG4gICAgICAgICAgPyB0aGlzLmZpbmFsaXplVGFwcm9vdElucHV0KGlkeClcbiAgICAgICAgICA6IHRoaXMuZmluYWxpemVUYXBJbnB1dFdpdGhTaW5nbGVMZWFmU2NyaXB0QW5kU2lnbmF0dXJlKGlkeCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUYXByb290S2V5UGF0aElucHV0KGlkeCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemVUYXByb290TXVzaWcySW5wdXQoaWR4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplSW5wdXQoaWR4KTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZpbmFsaXplVGFwcm9vdElucHV0KGlucHV0SW5kZXg6IG51bWJlcik6IHRoaXMge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICAvLyB3aXRuZXNzID0gY29udHJvbC1ibG9jayBzY3JpcHQgZmlyc3Qtc2lnIHNlY29uZC1zaWdcbiAgICBpZiAoaW5wdXQudGFwTGVhZlNjcmlwdD8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgb25lIGxlYWYgc2NyaXB0IHN1cHBvcnRlZCBmb3IgZmluYWxpemluZycpO1xuICAgIH1cbiAgICBjb25zdCB7IGNvbnRyb2xCbG9jaywgc2NyaXB0IH0gPSBpbnB1dC50YXBMZWFmU2NyaXB0WzBdO1xuICAgIGNvbnN0IHdpdG5lc3M6IEJ1ZmZlcltdID0gW3NjcmlwdCwgY29udHJvbEJsb2NrXTtcbiAgICBjb25zdCBbcHVia2V5MSwgcHVia2V5Ml0gPSBwYXJzZVB1YlNjcmlwdDJPZjMoc2NyaXB0LCAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCcpLnB1YmxpY0tleXM7XG4gICAgZm9yIChjb25zdCBwayBvZiBbcHVia2V5MSwgcHVia2V5Ml0pIHtcbiAgICAgIGNvbnN0IHNpZyA9IGlucHV0LnRhcFNjcmlwdFNpZz8uZmluZCgoeyBwdWJrZXkgfSkgPT4gcHVia2V5LmVxdWFscyhwaykpO1xuICAgICAgaWYgKCFzaWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBzaWduYXR1cmVzIGluIFNjcmlwdCBTaWcuJyk7XG4gICAgICB9XG4gICAgICB3aXRuZXNzLnVuc2hpZnQoc2lnLnNpZ25hdHVyZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2l0bmVzc0xlbmd0aCA9IHdpdG5lc3MucmVkdWNlKChzLCBiKSA9PiBzICsgYi5sZW5ndGggKyB2YXJ1aW50LmVuY29kaW5nTGVuZ3RoKGIubGVuZ3RoKSwgMSk7XG5cbiAgICBjb25zdCBidWZmZXJXcml0ZXIgPSBCdWZmZXJXcml0ZXIud2l0aENhcGFjaXR5KHdpdG5lc3NMZW5ndGgpO1xuICAgIGJ1ZmZlcldyaXRlci53cml0ZVZlY3Rvcih3aXRuZXNzKTtcbiAgICBjb25zdCBmaW5hbFNjcmlwdFdpdG5lc3MgPSBidWZmZXJXcml0ZXIuZW5kKCk7XG5cbiAgICB0aGlzLmRhdGEudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyBmaW5hbFNjcmlwdFdpdG5lc3MgfSk7XG4gICAgdGhpcy5kYXRhLmNsZWFyRmluYWxpemVkSW5wdXQoaW5wdXRJbmRleCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5hbGl6ZXMgYSB0YXByb290IG11c2lnMiBpbnB1dCBieSBhZ2dyZWdhdGluZyBhbGwgcGFydGlhbCBzaWdzLlxuICAgKiBJTVBPUlRBTlQ6IEFsd2F5cyBjYWxsIHZhbGlkYXRlKiBmdW5jdGlvbiBiZWZvcmUgZmluYWxpemluZy5cbiAgICovXG4gIGZpbmFsaXplVGFwcm9vdE11c2lnMklucHV0KGlucHV0SW5kZXg6IG51bWJlcik6IHRoaXMge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBjb25zdCBwYXJ0aWFsU2lncyA9IHBhcnNlUHNidE11c2lnMlBhcnRpYWxTaWdzKGlucHV0KTtcbiAgICBpZiAocGFydGlhbFNpZ3M/Lmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG51bWJlciBvZiBwYXJ0aWFsIHNpZ25hdHVyZXMgJHtwYXJ0aWFsU2lncyA/IHBhcnRpYWxTaWdzLmxlbmd0aCA6IDB9IHRvIGZpbmFsaXplYCk7XG4gICAgfVxuICAgIGNvbnN0IHsgcGFydGlhbFNpZ3M6IHBTaWdzLCBzaWdIYXNoVHlwZSB9ID0gZ2V0U2lnSGFzaFR5cGVGcm9tU2lncyhwYXJ0aWFsU2lncyk7XG4gICAgY29uc3QgeyBzZXNzaW9uS2V5IH0gPSB0aGlzLmdldE11c2lnMlNlc3Npb25LZXkoaW5wdXRJbmRleCwgc2lnSGFzaFR5cGUpO1xuXG4gICAgY29uc3QgYWdnU2lnID0gbXVzaWcyQWdncmVnYXRlU2lncyhcbiAgICAgIHBTaWdzLm1hcCgocFNpZykgPT4gcFNpZy5wYXJ0aWFsU2lnKSxcbiAgICAgIHNlc3Npb25LZXlcbiAgICApO1xuXG4gICAgY29uc3Qgc2lnID0gc2lnSGFzaFR5cGUgPT09IFRyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCA/IGFnZ1NpZyA6IEJ1ZmZlci5jb25jYXQoW2FnZ1NpZywgQnVmZmVyLm9mKHNpZ0hhc2hUeXBlKV0pO1xuXG4gICAgLy8gc2luZ2xlIHNpZ25hdHVyZSB3aXRoIDY0LzY1IGJ5dGVzIHNpemUgaXMgc2NyaXB0IHdpdG5lc3MgZm9yIGtleSBwYXRoIHNwZW5kXG4gICAgY29uc3QgYnVmZmVyV3JpdGVyID0gQnVmZmVyV3JpdGVyLndpdGhDYXBhY2l0eSgxICsgdmFydWludC5lbmNvZGluZ0xlbmd0aChzaWcubGVuZ3RoKSArIHNpZy5sZW5ndGgpO1xuICAgIGJ1ZmZlcldyaXRlci53cml0ZVZlY3Rvcihbc2lnXSk7XG4gICAgY29uc3QgZmluYWxTY3JpcHRXaXRuZXNzID0gYnVmZmVyV3JpdGVyLmVuZCgpO1xuXG4gICAgdGhpcy5kYXRhLnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHsgZmluYWxTY3JpcHRXaXRuZXNzIH0pO1xuICAgIHRoaXMuZGF0YS5jbGVhckZpbmFsaXplZElucHV0KGlucHV0SW5kZXgpO1xuICAgIC8vIGRlbGV0aW5nIG9ubHkgQml0R28gcHJvcHJpZXRhcnkga2V5IHZhbHVlcy5cbiAgICB0aGlzLmRlbGV0ZVByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7IGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZpbmFsaXplVGFwSW5wdXRXaXRoU2luZ2xlTGVhZlNjcmlwdEFuZFNpZ25hdHVyZShpbnB1dEluZGV4OiBudW1iZXIpOiB0aGlzIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPbmx5IG9uZSBsZWFmIHNjcmlwdCBzdXBwb3J0ZWQgZm9yIGZpbmFsaXppbmcnKTtcbiAgICB9XG4gICAgaWYgKGlucHV0LnRhcFNjcmlwdFNpZz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHNpZ25hdHVyZXMgaW4gU2NyaXB0IFNpZy4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvbnRyb2xCbG9jaywgc2NyaXB0IH0gPSBpbnB1dC50YXBMZWFmU2NyaXB0WzBdO1xuICAgIGNvbnN0IHdpdG5lc3M6IEJ1ZmZlcltdID0gW2lucHV0LnRhcFNjcmlwdFNpZ1swXS5zaWduYXR1cmUsIHNjcmlwdCwgY29udHJvbEJsb2NrXTtcbiAgICBjb25zdCB3aXRuZXNzTGVuZ3RoID0gd2l0bmVzcy5yZWR1Y2UoKHMsIGIpID0+IHMgKyBiLmxlbmd0aCArIHZhcnVpbnQuZW5jb2RpbmdMZW5ndGgoYi5sZW5ndGgpLCAxKTtcblxuICAgIGNvbnN0IGJ1ZmZlcldyaXRlciA9IEJ1ZmZlcldyaXRlci53aXRoQ2FwYWNpdHkod2l0bmVzc0xlbmd0aCk7XG4gICAgYnVmZmVyV3JpdGVyLndyaXRlVmVjdG9yKHdpdG5lc3MpO1xuICAgIGNvbnN0IGZpbmFsU2NyaXB0V2l0bmVzcyA9IGJ1ZmZlcldyaXRlci5lbmQoKTtcblxuICAgIHRoaXMuZGF0YS51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IGZpbmFsU2NyaXB0V2l0bmVzcyB9KTtcbiAgICB0aGlzLmRhdGEuY2xlYXJGaW5hbGl6ZWRJbnB1dChpbnB1dEluZGV4KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBjb3BpZWQgZnJvbSBiaXRjb2luanMtbGliL3RzX3NyYy9wc2J0LnRzXG4gICAqXG4gICAqIFVubGlrZSB0aGUgZnVuY3Rpb24gaXQgb3ZlcnJpZGVzLCB0aGlzIGRvZXMgbm90IHRha2UgYSB2YWxpZGF0b3IuIEluIEJpdEdvXG4gICAqIGNvbnRleHQsIHdlIGtub3cgaG93IHdlIHdhbnQgdG8gdmFsaWRhdGUgc28gd2UganVzdCBoYXJkIGNvZGUgdGhlIHJpZ2h0XG4gICAqIHZhbGlkYXRvci5cbiAgICovXG4gIHZhbGlkYXRlU2lnbmF0dXJlc09mQWxsSW5wdXRzKCk6IGJvb2xlYW4ge1xuICAgIGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgMCk7IC8vIG1ha2luZyBzdXJlIHdlIGhhdmUgYXQgbGVhc3Qgb25lXG4gICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZGF0YS5pbnB1dHMubWFwKChpbnB1dCwgaWR4KSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0Q29tbW9uKGlkeCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdHMucmVkdWNlKChmaW5hbCwgcmVzKSA9PiByZXMgJiYgZmluYWwsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRydWUgaWZmIGFueSBtYXRjaGluZyB2YWxpZCBzaWduYXR1cmUgaXMgZm91bmQgZm9yIGEgZGVyaXZlZCBwdWIga2V5IGZyb20gZ2l2ZW4gSEQga2V5IHBhaXIuXG4gICAqL1xuICB2YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0SEQoaW5wdXRJbmRleDogbnVtYmVyLCBoZEtleVBhaXI6IEJJUDMySW50ZXJmYWNlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGNvbnN0IHB1YktleSA9IGlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbj8ubGVuZ3RoXG4gICAgICA/IFV0eG9Qc2J0LmRlcml2ZUtleVBhaXIoaGRLZXlQYWlyLCBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24pPy5wdWJsaWNLZXlcbiAgICAgIDogaW5wdXQuYmlwMzJEZXJpdmF0aW9uPy5sZW5ndGhcbiAgICAgID8gVXR4b1BzYnQuZGVyaXZlS2V5UGFpcihoZEtleVBhaXIsIGlucHV0LmJpcDMyRGVyaXZhdGlvbik/LnB1YmxpY0tleVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFwdWJLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG5vdCBkZXJpdmUgZnJvbSBIRCBrZXkgcGFpcicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0Q29tbW9uKGlucHV0SW5kZXgsIHB1YktleSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBpZmYgYW55IHZhbGlkIHNpZ25hdHVyZShzKSBhcmUgZm91bmQgZnJvbSBiaXAzMiBkYXRhIG9mIFBTQlQgb3IgZm9yIGdpdmVuIHB1YiBrZXkuXG4gICAqL1xuICB2YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0Q29tbW9uKGlucHV0SW5kZXg6IG51bWJlciwgcHVia2V5PzogQnVmZmVyKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmlzVGFwcm9vdFNjcmlwdFBhdGhJbnB1dChpbnB1dEluZGV4KSkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVRhcHJvb3RTaWduYXR1cmVzT2ZJbnB1dChpbnB1dEluZGV4LCBwdWJrZXkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVGFwcm9vdEtleVBhdGhJbnB1dChpbnB1dEluZGV4KSkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVRhcHJvb3RNdXNpZzJTaWduYXR1cmVzT2ZJbnB1dChpbnB1dEluZGV4LCBwdWJrZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dChpbnB1dEluZGV4LCAocCwgbSwgcykgPT4gZWNjTGliLnZlcmlmeShtLCBwLCBzLCB0cnVlKSwgcHVia2V5KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIE5vdCBhbiBlbGVnYW50IHNvbHV0aW9uLiBNaWdodCBuZWVkIHVwc3RyZWFtIGNoYW5nZXMgbGlrZSBjdXN0b20gZXJyb3IgdHlwZXMuXG4gICAgICBpZiAoZXJyLm1lc3NhZ2UgPT09ICdObyBzaWduYXR1cmVzIGZvciB0aGlzIHB1YmtleScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TXVzaWcyU2Vzc2lvbktleShcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgc2lnSGFzaFR5cGU6IG51bWJlclxuICApOiB7XG4gICAgcGFydGljaXBhbnRzOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzO1xuICAgIG5vbmNlczogVHVwbGU8UHNidE11c2lnMlB1Yk5vbmNlPjtcbiAgICBoYXNoOiBCdWZmZXI7XG4gICAgc2Vzc2lvbktleTogU2Vzc2lvbktleTtcbiAgfSB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGlmICghaW5wdXQudGFwSW50ZXJuYWxLZXkgfHwgIWlucHV0LnRhcE1lcmtsZVJvb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYm90aCB0YXBJbnRlcm5hbEtleSBhbmQgdGFwTWVya2xlUm9vdCBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aWNpcGFudHMgPSB0aGlzLmdldE11c2lnMlBhcnRpY2lwYW50cyhpbnB1dEluZGV4LCBpbnB1dC50YXBJbnRlcm5hbEtleSwgaW5wdXQudGFwTWVya2xlUm9vdCk7XG4gICAgY29uc3Qgbm9uY2VzID0gdGhpcy5nZXRNdXNpZzJOb25jZXMoaW5wdXRJbmRleCwgcGFydGljaXBhbnRzKTtcblxuICAgIGNvbnN0IHsgaGFzaCB9ID0gdGhpcy5nZXRUYXByb290SGFzaEZvclNpZyhpbnB1dEluZGV4LCBbc2lnSGFzaFR5cGVdKTtcblxuICAgIGNvbnN0IHNlc3Npb25LZXkgPSBjcmVhdGVNdXNpZzJTaWduaW5nU2Vzc2lvbih7XG4gICAgICBwdWJOb25jZXM6IFtub25jZXNbMF0ucHViTm9uY2UsIG5vbmNlc1sxXS5wdWJOb25jZV0sXG4gICAgICBwdWJLZXlzOiBwYXJ0aWNpcGFudHMucGFydGljaXBhbnRQdWJLZXlzLFxuICAgICAgdHhIYXNoOiBoYXNoLFxuICAgICAgaW50ZXJuYWxQdWJLZXk6IGlucHV0LnRhcEludGVybmFsS2V5LFxuICAgICAgdGFwVHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcGFydGljaXBhbnRzLCBub25jZXMsIGhhc2gsIHNlc3Npb25LZXkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGZvciBmb2xsb3dpbmcgY2FzZXMuXG4gICAqIElmIHZhbGlkIG11c2lnMiBwYXJ0aWFsIHNpZ25hdHVyZXMgZXhpc3RzIGZvciBib3RoIDIga2V5cywgaXQgd2lsbCBhbHNvIHZlcmlmaWVzIGFnZ3JlZ2F0ZWQgc2lnXG4gICAqIGZvciBhZ2dyZWdhdGVkIHR3ZWFrZWQga2V5IChvdXRwdXQga2V5KSwgb3RoZXJ3aXNlIG9ubHkgdmVyaWZpZXMgcGFydGlhbCBzaWcuXG4gICAqIElmIHB1YmtleSBpcyBwYXNzZWQgaW4gaW5wdXQsIGl0IHdpbGwgY2hlY2sgc2lnIG9ubHkgZm9yIHRoYXQgcHVia2V5LFxuICAgKiBpZiBubyBzaWcgZXhpdHMgZm9yIHN1Y2gga2V5LCB0aHJvd3MgZXJyb3IuXG4gICAqIEZvciBpbnZhbGlkIHN0YXRlIG9mIGlucHV0IGRhdGEsIGl0IHdpbGwgdGhyb3cgZXJyb3JzLlxuICAgKi9cbiAgdmFsaWRhdGVUYXByb290TXVzaWcyU2lnbmF0dXJlc09mSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyLCBwdWJrZXk/OiBCdWZmZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgY29uc3QgcGFydGlhbFNpZ3MgPSBwYXJzZVBzYnRNdXNpZzJQYXJ0aWFsU2lncyhpbnB1dCk7XG4gICAgaWYgKCFwYXJ0aWFsU2lncykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzaWduYXR1cmVzIHRvIHZhbGlkYXRlYCk7XG4gICAgfVxuXG4gICAgbGV0IG15UGFydGlhbFNpZ3MgPSBwYXJ0aWFsU2lncztcbiAgICBpZiAocHVia2V5KSB7XG4gICAgICBjaGVja1BsYWluUHVibGljS2V5KHB1YmtleSk7XG4gICAgICBteVBhcnRpYWxTaWdzID0gcGFydGlhbFNpZ3MuZmlsdGVyKChrdikgPT4ga3YucGFydGljaXBhbnRQdWJLZXkuZXF1YWxzKHB1YmtleSkpO1xuICAgICAgaWYgKG15UGFydGlhbFNpZ3M/Lmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzaWduYXR1cmVzIGZvciB0aGlzIHB1YmtleScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgcGFydGlhbFNpZ3M6IG15U2lncywgc2lnSGFzaFR5cGUgfSA9IGdldFNpZ0hhc2hUeXBlRnJvbVNpZ3MobXlQYXJ0aWFsU2lncyk7XG4gICAgY29uc3QgeyBwYXJ0aWNpcGFudHMsIG5vbmNlcywgaGFzaCwgc2Vzc2lvbktleSB9ID0gdGhpcy5nZXRNdXNpZzJTZXNzaW9uS2V5KGlucHV0SW5kZXgsIHNpZ0hhc2hUeXBlKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBteVNpZ3MubWFwKChteVNpZykgPT4ge1xuICAgICAgY29uc3QgbXlOb25jZSA9IG5vbmNlcy5maW5kKChrdikgPT4ga3YucGFydGljaXBhbnRQdWJLZXkuZXF1YWxzKG15U2lnLnBhcnRpY2lwYW50UHViS2V5KSk7XG4gICAgICBpZiAoIW15Tm9uY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBubyBwdWIgbm9uY2UgZm9yIHB1YmtleScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG11c2lnMlBhcnRpYWxTaWdWZXJpZnkobXlTaWcucGFydGlhbFNpZywgbXlTaWcucGFydGljaXBhbnRQdWJLZXksIG15Tm9uY2UucHViTm9uY2UsIHNlc3Npb25LZXkpO1xuICAgIH0pO1xuXG4gICAgLy8gRm9yIHZhbGlkIHNpbmdsZSBzaWcgb3IgMSBvciAyIGZhaWx1cmUgc2lncywgbm8gbmVlZCB0byB2YWxpZGF0ZSBhZ2dyZWdhdGVkIHNpZy4gU28gc2tpcC5cbiAgICBjb25zdCByZXN1bHQgPSByZXN1bHRzLmV2ZXJ5KChyZXMpID0+IHJlcyk7XG4gICAgaWYgKCFyZXN1bHQgfHwgbXlTaWdzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgYWdnU2lnID0gbXVzaWcyQWdncmVnYXRlU2lncyhcbiAgICAgIG15U2lncy5tYXAoKG15U2lnKSA9PiBteVNpZy5wYXJ0aWFsU2lnKSxcbiAgICAgIHNlc3Npb25LZXlcbiAgICApO1xuXG4gICAgcmV0dXJuIGVjY0xpYi52ZXJpZnlTY2hub3JyKGhhc2gsIHBhcnRpY2lwYW50cy50YXBPdXRwdXRLZXksIGFnZ1NpZyk7XG4gIH1cblxuICB2YWxpZGF0ZVRhcHJvb3RTaWduYXR1cmVzT2ZJbnB1dChpbnB1dEluZGV4OiBudW1iZXIsIHB1YmtleT86IEJ1ZmZlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5kYXRhLmlucHV0c1tpbnB1dEluZGV4XTtcbiAgICBjb25zdCB0YXBTaWdzID0gKGlucHV0IHx8IHt9KS50YXBTY3JpcHRTaWc7XG4gICAgaWYgKCFpbnB1dCB8fCAhdGFwU2lncyB8fCB0YXBTaWdzLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc2lnbmF0dXJlcyB0byB2YWxpZGF0ZScpO1xuICAgIH1cbiAgICBsZXQgbXlTaWdzO1xuICAgIGlmIChwdWJrZXkpIHtcbiAgICAgIGNvbnN0IHhPbmx5UHVia2V5ID0gdG9YT25seVB1YmxpY0tleShwdWJrZXkpO1xuICAgICAgbXlTaWdzID0gdGFwU2lncy5maWx0ZXIoKHNpZykgPT4gc2lnLnB1YmtleS5lcXVhbHMoeE9ubHlQdWJrZXkpKTtcbiAgICAgIGlmIChteVNpZ3MubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNpZ25hdHVyZXMgZm9yIHRoaXMgcHVia2V5Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG15U2lncyA9IHRhcFNpZ3M7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHM6IGJvb2xlYW5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBwU2lnIG9mIG15U2lncykge1xuICAgICAgY29uc3QgeyBzaWduYXR1cmUsIGxlYWZIYXNoLCBwdWJrZXkgfSA9IHBTaWc7XG4gICAgICBsZXQgc2lnSGFzaFR5cGU6IG51bWJlcjtcbiAgICAgIGxldCBzaWc6IEJ1ZmZlcjtcbiAgICAgIGlmIChzaWduYXR1cmUubGVuZ3RoID09PSA2NSkge1xuICAgICAgICBzaWdIYXNoVHlwZSA9IHNpZ25hdHVyZVs2NF07XG4gICAgICAgIHNpZyA9IHNpZ25hdHVyZS5zbGljZSgwLCA2NCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaWdIYXNoVHlwZSA9IFRyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVDtcbiAgICAgICAgc2lnID0gc2lnbmF0dXJlO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBoYXNoIH0gPSB0aGlzLmdldFRhcHJvb3RIYXNoRm9yU2lnKGlucHV0SW5kZXgsIFtzaWdIYXNoVHlwZV0sIGxlYWZIYXNoKTtcbiAgICAgIHJlc3VsdHMucHVzaChlY2NMaWIudmVyaWZ5U2Nobm9ycihoYXNoLCBwdWJrZXksIHNpZykpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cy5ldmVyeSgocmVzKSA9PiByZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBpbnB1dEluZGV4XG4gICAqIEBwYXJhbSByb290Tm9kZXMgb3B0aW9uYWwgaW5wdXQgcm9vdCBiaXAzMiBub2RlcyB0byB2ZXJpZnkgd2l0aC4gSWYgaXQgaXMgbm90IHByb3ZpZGVkLCBnbG9iYWxYcHViIHdpbGwgYmUgdXNlZC5cbiAgICogQHJldHVybiBhcnJheSBvZiBib29sZWFuIHZhbHVlcy4gVHJ1ZSB3aGVuIGNvcnJlc3BvbmRpbmcgaW5kZXggaW4gYHB1YmxpY0tleXNgIGhhcyBzaWduZWQgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBJZiBubyBzaWduYXR1cmUgaW4gdGhlIHR4IG9yIG5vIHB1YmxpYyBrZXkgbWF0Y2hpbmcgc2lnbmF0dXJlLCB0aGUgdmFsaWRhdGlvbiBpcyBjb25zaWRlcmVkIGFzIGZhbHNlLlxuICAgKi9cbiAgZ2V0U2lnbmF0dXJlVmFsaWRhdGlvbkFycmF5KFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICB7IHJvb3ROb2RlcyB9OiB7IHJvb3ROb2Rlcz86IFRyaXBsZTxCSVAzMkludGVyZmFjZT4gfSA9IHt9XG4gICk6IFRyaXBsZTxib29sZWFuPiB7XG4gICAgaWYgKCFyb290Tm9kZXMgJiYgKCF0aGlzLmRhdGEuZ2xvYmFsTWFwLmdsb2JhbFhwdWI/Lmxlbmd0aCB8fCAhaXNUcmlwbGUodGhpcy5kYXRhLmdsb2JhbE1hcC5nbG9iYWxYcHViKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCBzaWduYXR1cmUgdmFsaWRhdGlvbiBhcnJheSB3aXRob3V0IDMgZ2xvYmFsIHhwdWJzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYmlwMzJzID0gcm9vdE5vZGVzXG4gICAgICA/IHJvb3ROb2Rlc1xuICAgICAgOiB0aGlzLmRhdGEuZ2xvYmFsTWFwLmdsb2JhbFhwdWI/Lm1hcCgoeHB1YikgPT5cbiAgICAgICAgICBCSVAzMkZhY3RvcnkoZWNjTGliKS5mcm9tQmFzZTU4KGJzNThjaGVjay5lbmNvZGUoeHB1Yi5leHRlbmRlZFB1YmtleSkpXG4gICAgICAgICk7XG5cbiAgICBpZiAoIWJpcDMycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlaXRoZXIgZ2xvYmFsTWFwIG9yIHJvb3ROb2RlcyBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoIWdldFBzYnRJbnB1dFNpZ25hdHVyZUNvdW50KGlucHV0KSkge1xuICAgICAgcmV0dXJuIFtmYWxzZSwgZmFsc2UsIGZhbHNlXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmlwMzJzLm1hcCgoYmlwMzIpID0+IHtcbiAgICAgIGNvbnN0IHB1YktleSA9IGlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbj8ubGVuZ3RoXG4gICAgICAgID8gVXR4b1BzYnQuZGVyaXZlS2V5UGFpcihiaXAzMiwgaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uKT8ucHVibGljS2V5XG4gICAgICAgIDogaW5wdXQuYmlwMzJEZXJpdmF0aW9uPy5sZW5ndGhcbiAgICAgICAgPyBVdHhvUHNidC5kZXJpdmVLZXlQYWlyKGJpcDMyLCBpbnB1dC5iaXAzMkRlcml2YXRpb24pPy5wdWJsaWNLZXlcbiAgICAgICAgOiBiaXAzMj8ucHVibGljS2V5O1xuICAgICAgaWYgKCFwdWJLZXkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dENvbW1vbihpbnB1dEluZGV4LCBwdWJLZXkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIE5vdCBhbiBlbGVnYW50IHNvbHV0aW9uLiBNaWdodCBuZWVkIHVwc3RyZWFtIGNoYW5nZXMgbGlrZSBjdXN0b20gZXJyb3IgdHlwZXMuXG4gICAgICAgIGlmIChlcnIubWVzc2FnZSA9PT0gJ05vIHNpZ25hdHVyZXMgZm9yIHRoaXMgcHVia2V5Jykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfSkgYXMgVHJpcGxlPGJvb2xlYW4+O1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBjb3BpZWQgZnJvbSBiaXRjb2luanMtbGliL3RzX3NyYy9wc2J0LnRzXG4gICAqL1xuICBzaWduQWxsSW5wdXRzSEQoXG4gICAgaGRLZXlQYWlyOiBIRFRhcHJvb3RTaWduZXIgfCBIRFRhcHJvb3RNdXNpZzJTaWduZXIsXG4gICAgcGFyYW1zOiBudW1iZXJbXSB8IFBhcnRpYWw8U2lnbmF0dXJlUGFyYW1zPiA9IGRlZmF1bHRTaWduYXR1cmVQYXJhbXNcbiAgKTogdGhpcyB7XG4gICAgaWYgKCFoZEtleVBhaXIgfHwgIWhkS2V5UGFpci5wdWJsaWNLZXkgfHwgIWhkS2V5UGFpci5maW5nZXJwcmludCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIEhEU2lnbmVyIHRvIHNpZ24gaW5wdXQnKTtcbiAgICB9XG4gICAgY29uc3QgeyBzaWdoYXNoVHlwZXMsIGRldGVybWluaXN0aWMgfSA9IHRvU2lnbmF0dXJlUGFyYW1zKHBhcmFtcyk7XG5cbiAgICBjb25zdCByZXN1bHRzOiBib29sZWFuW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5pbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc2lnbklucHV0SEQoaSwgaGRLZXlQYWlyLCB7IHNpZ2hhc2hUeXBlcywgZGV0ZXJtaW5pc3RpYyB9KTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHRydWUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlc3VsdHMucHVzaChmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXN1bHRzLmV2ZXJ5KCh2KSA9PiAhdikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gaW5wdXRzIHdlcmUgc2lnbmVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBjb3BpZWQgZnJvbSBiaXRjb2luanMtbGliL3RzX3NyYy9wc2J0LnRzOnNpZ25JbnB1dEhEXG4gICAqL1xuICBzaWduVGFwcm9vdElucHV0SEQoXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIGhkS2V5UGFpcjogSERUYXByb290U2lnbmVyIHwgSERUYXByb290TXVzaWcyU2lnbmVyLFxuICAgIHsgc2lnaGFzaFR5cGVzID0gW1RyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCwgVHJhbnNhY3Rpb24uU0lHSEFTSF9BTExdLCBkZXRlcm1pbmlzdGljID0gZmFsc2UgfSA9IHt9XG4gICk6IHRoaXMge1xuICAgIGlmICghdGhpcy5pc1RhcHJvb3RJbnB1dChpbnB1dEluZGV4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgYSB0YXByb290IGlucHV0Jyk7XG4gICAgfVxuICAgIGlmICghaGRLZXlQYWlyIHx8ICFoZEtleVBhaXIucHVibGljS2V5IHx8ICFoZEtleVBhaXIuZmluZ2VycHJpbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmVlZCBIRFNpZ25lciB0byBzaWduIGlucHV0Jyk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoIWlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbiB8fCBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgdGFwQmlwMzJEZXJpdmF0aW9uIHRvIHNpZ24gVGFwcm9vdCB3aXRoIEhEJyk7XG4gICAgfVxuICAgIGNvbnN0IG15RGVyaXZhdGlvbnMgPSBpbnB1dC50YXBCaXAzMkRlcml2YXRpb25cbiAgICAgIC5tYXAoKGJpcER2KSA9PiB7XG4gICAgICAgIGlmIChiaXBEdi5tYXN0ZXJGaW5nZXJwcmludC5lcXVhbHMoaGRLZXlQYWlyLmZpbmdlcnByaW50KSkge1xuICAgICAgICAgIHJldHVybiBiaXBEdjtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKHYpID0+ICEhdikgYXMgVGFwQmlwMzJEZXJpdmF0aW9uW107XG4gICAgaWYgKG15RGVyaXZhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgb25lIHRhcEJpcDMyRGVyaXZhdGlvbiBtYXN0ZXJGaW5nZXJwcmludCB0byBtYXRjaCB0aGUgSERTaWduZXIgZmluZ2VycHJpbnQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXREZXJpdmVkTm9kZShiaXBEdjogVGFwQmlwMzJEZXJpdmF0aW9uKTogSERUYXByb290TXVzaWcyU2lnbmVyIHwgSERUYXByb290U2lnbmVyIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBoZEtleVBhaXIuZGVyaXZlUGF0aChiaXBEdi5wYXRoKTtcbiAgICAgIGlmICghYmlwRHYucHVia2V5LmVxdWFscyhub2RlLnB1YmxpY0tleS5zbGljZSgxKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwdWJrZXkgZGlkIG5vdCBtYXRjaCB0YXBCaXAzMkRlcml2YXRpb24nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGlmIChpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHNpZ25lcnM6IFRhcHJvb3RTaWduZXJbXSA9IG15RGVyaXZhdGlvbnMubWFwKChiaXBEdikgPT4ge1xuICAgICAgICBjb25zdCBzaWduZXIgPSBnZXREZXJpdmVkTm9kZShiaXBEdik7XG4gICAgICAgIGlmICghKCdzaWduU2Nobm9ycicgaW4gc2lnbmVyKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnblNjaG5vcnIgZnVuY3Rpb24gaXMgcmVxdWlyZWQgdG8gc2lnbiBwMnRyJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc2lnbmVyLCBsZWFmSGFzaGVzOiBiaXBEdi5sZWFmSGFzaGVzIH07XG4gICAgICB9KTtcbiAgICAgIHNpZ25lcnMuZm9yRWFjaCgoeyBzaWduZXIsIGxlYWZIYXNoZXMgfSkgPT4gdGhpcy5zaWduVGFwcm9vdElucHV0KGlucHV0SW5kZXgsIHNpZ25lciwgbGVhZkhhc2hlcywgc2lnaGFzaFR5cGVzKSk7XG4gICAgfSBlbHNlIGlmIChpbnB1dC50YXBJbnRlcm5hbEtleT8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBzaWduZXJzOiBNdXNpZzJTaWduZXJbXSA9IG15RGVyaXZhdGlvbnMubWFwKChiaXBEdikgPT4ge1xuICAgICAgICBjb25zdCBzaWduZXIgPSBnZXREZXJpdmVkTm9kZShiaXBEdik7XG4gICAgICAgIGlmICghKCdwcml2YXRlS2V5JyBpbiBzaWduZXIpIHx8ICFzaWduZXIucHJpdmF0ZUtleSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncHJpdmF0ZUtleSBpcyByZXF1aXJlZCB0byBzaWduIHAydHIgbXVzaWcyJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpZ25lcjtcbiAgICAgIH0pO1xuICAgICAgc2lnbmVycy5mb3JFYWNoKChzaWduZXIpID0+IHRoaXMuc2lnblRhcHJvb3RNdXNpZzJJbnB1dChpbnB1dEluZGV4LCBzaWduZXIsIHsgc2lnaGFzaFR5cGVzLCBkZXRlcm1pbmlzdGljIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzaWduSW5wdXRIRChcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgaGRLZXlQYWlyOiBIRFRhcHJvb3RTaWduZXIgfCBIRFRhcHJvb3RNdXNpZzJTaWduZXIsXG4gICAgcGFyYW1zOiBudW1iZXJbXSB8IFBhcnRpYWw8U2lnbmF0dXJlUGFyYW1zPiA9IGRlZmF1bHRTaWduYXR1cmVQYXJhbXNcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgeyBzaWdoYXNoVHlwZXMsIGRldGVybWluaXN0aWMgfSA9IHRvU2lnbmF0dXJlUGFyYW1zKHBhcmFtcyk7XG4gICAgaWYgKHRoaXMuaXNUYXByb290SW5wdXQoaW5wdXRJbmRleCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpZ25UYXByb290SW5wdXRIRChpbnB1dEluZGV4LCBoZEtleVBhaXIsIHsgc2lnaGFzaFR5cGVzLCBkZXRlcm1pbmlzdGljIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3VwZXIuc2lnbklucHV0SEQoaW5wdXRJbmRleCwgaGRLZXlQYWlyLCBzaWdoYXNoVHlwZXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TXVzaWcyUGFydGljaXBhbnRzKGlucHV0SW5kZXg6IG51bWJlciwgdGFwSW50ZXJuYWxLZXk6IEJ1ZmZlciwgdGFwTWVya2xlUm9vdDogQnVmZmVyKSB7XG4gICAgY29uc3QgcGFydGljaXBhbnRzS2V5VmFsRGF0YSA9IHBhcnNlUHNidE11c2lnMlBhcnRpY2lwYW50cyh0aGlzLmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdKTtcbiAgICBpZiAoIXBhcnRpY2lwYW50c0tleVZhbERhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgMCBtYXRjaGluZyBwYXJ0aWNpcGFudCBrZXkgdmFsdWUgaW5zdGVhZCBvZiAxYCk7XG4gICAgfVxuICAgIGFzc2VydFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMocGFydGljaXBhbnRzS2V5VmFsRGF0YSwgdGFwSW50ZXJuYWxLZXksIHRhcE1lcmtsZVJvb3QpO1xuICAgIHJldHVybiBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNdXNpZzJOb25jZXMoaW5wdXRJbmRleDogbnVtYmVyLCBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzKSB7XG4gICAgY29uc3Qgbm9uY2VzS2V5VmFsc0RhdGEgPSBwYXJzZVBzYnRNdXNpZzJOb25jZXModGhpcy5kYXRhLmlucHV0c1tpbnB1dEluZGV4XSk7XG4gICAgaWYgKCFub25jZXNLZXlWYWxzRGF0YSB8fCAhaXNUdXBsZShub25jZXNLZXlWYWxzRGF0YSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZvdW5kICR7bm9uY2VzS2V5VmFsc0RhdGE/Lmxlbmd0aCA/IG5vbmNlc0tleVZhbHNEYXRhLmxlbmd0aCA6IDB9IG1hdGNoaW5nIG5vbmNlIGtleSB2YWx1ZSBpbnN0ZWFkIG9mIDJgXG4gICAgICApO1xuICAgIH1cbiAgICBhc3NlcnRQc2J0TXVzaWcyTm9uY2VzKG5vbmNlc0tleVZhbHNEYXRhLCBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhKTtcbiAgICByZXR1cm4gbm9uY2VzS2V5VmFsc0RhdGE7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgcDJ0ciBtdXNpZzIga2V5IHBhdGggaW5wdXQgd2l0aCAyIGFnZ3JlZ2F0ZWQga2V5cy5cbiAgICpcbiAgICogTm90ZTogT25seSBjYW4gc2lnbiBkZXRlcm1pbmlzdGljYWxseSBhcyB0aGUgY29zaWduZXJcbiAgICogQHBhcmFtIGlucHV0SW5kZXhcbiAgICogQHBhcmFtIHNpZ25lciAtIFhZIHB1YmxpYyBrZXkgYW5kIHByaXZhdGUga2V5IGFyZSByZXF1aXJlZFxuICAgKiBAcGFyYW0gc2lnaGFzaFR5cGVzXG4gICAqIEBwYXJhbSBkZXRlcm1pbmlzdGljIElmIHRydWUsIHNpZ24gdGhlIG11c2lnIGlucHV0IGRldGVybWluaXN0aWNhbGx5XG4gICAqL1xuICBzaWduVGFwcm9vdE11c2lnMklucHV0KFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBzaWduZXI6IE11c2lnMlNpZ25lcixcbiAgICB7IHNpZ2hhc2hUeXBlcyA9IFtUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQsIFRyYW5zYWN0aW9uLlNJR0hBU0hfQUxMXSwgZGV0ZXJtaW5pc3RpYyA9IGZhbHNlIH0gPSB7fVxuICApOiB0aGlzIHtcbiAgICBpZiAoIXRoaXMuaXNUYXByb290S2V5UGF0aElucHV0KGlucHV0SW5kZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhIHRhcHJvb3QgbXVzaWcyIGlucHV0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdO1xuXG4gICAgaWYgKCFpbnB1dC50YXBJbnRlcm5hbEtleSB8fCAhaW5wdXQudGFwTWVya2xlUm9vdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIGlucHV0IGRhdGEnKTtcbiAgICB9XG5cbiAgICAvLyBSZXRyaWV2ZSBhbmQgY2hlY2sgdGhhdCB3ZSBoYXZlIHR3byBwYXJ0aWNpcGFudCBub25jZXNcbiAgICBjb25zdCBwYXJ0aWNpcGFudHMgPSB0aGlzLmdldE11c2lnMlBhcnRpY2lwYW50cyhpbnB1dEluZGV4LCBpbnB1dC50YXBJbnRlcm5hbEtleSwgaW5wdXQudGFwTWVya2xlUm9vdCk7XG4gICAgY29uc3QgeyB0YXBPdXRwdXRLZXksIHBhcnRpY2lwYW50UHViS2V5cyB9ID0gcGFydGljaXBhbnRzO1xuICAgIGNvbnN0IHNpZ25lclB1YktleSA9IHBhcnRpY2lwYW50UHViS2V5cy5maW5kKChwdWJLZXkpID0+IHB1YktleS5lcXVhbHMoc2lnbmVyLnB1YmxpY0tleSkpO1xuICAgIGlmICghc2lnbmVyUHViS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lciBwdWIga2V5IHNob3VsZCBtYXRjaCBvbmUgb2YgcGFydGljaXBhbnQgcHViIGtleXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBub25jZXMgPSB0aGlzLmdldE11c2lnMk5vbmNlcyhpbnB1dEluZGV4LCBwYXJ0aWNpcGFudHMpO1xuICAgIGNvbnN0IHsgaGFzaCwgc2lnaGFzaFR5cGUgfSA9IHRoaXMuZ2V0VGFwcm9vdEhhc2hGb3JTaWcoaW5wdXRJbmRleCwgc2lnaGFzaFR5cGVzKTtcblxuICAgIGxldCBwYXJ0aWFsU2lnOiBCdWZmZXI7XG4gICAgaWYgKGRldGVybWluaXN0aWMpIHtcbiAgICAgIGlmICghc2lnbmVyUHViS2V5LmVxdWFscyhwYXJ0aWNpcGFudFB1YktleXNbMV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG9ubHkgYWRkIGEgZGV0ZXJtaW5pc3RpYyBzaWduYXR1cmUgb24gdGhlIGNvc2lnbmVyJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpcnN0U2lnbmVyTm9uY2UgPSBub25jZXMuZmluZCgobikgPT4gbi5wYXJ0aWNpcGFudFB1YktleS5lcXVhbHMocGFydGljaXBhbnRQdWJLZXlzWzBdKSk7XG4gICAgICBpZiAoIWZpcnN0U2lnbmVyTm9uY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZmluZCB0aGUgdXNlciBub25jZScpO1xuICAgICAgfVxuXG4gICAgICBwYXJ0aWFsU2lnID0gbXVzaWcyRGV0ZXJtaW5pc3RpY1NpZ24oe1xuICAgICAgICBwcml2YXRlS2V5OiBzaWduZXIucHJpdmF0ZUtleSxcbiAgICAgICAgb3RoZXJOb25jZTogZmlyc3RTaWduZXJOb25jZS5wdWJOb25jZSxcbiAgICAgICAgcHVibGljS2V5czogcGFydGljaXBhbnRQdWJLZXlzLFxuICAgICAgICBpbnRlcm5hbFB1YktleTogaW5wdXQudGFwSW50ZXJuYWxLZXksXG4gICAgICAgIHRhcFRyZWVSb290OiBpbnB1dC50YXBNZXJrbGVSb290LFxuICAgICAgICBoYXNoLFxuICAgICAgfSkuc2lnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZXNzaW9uS2V5ID0gY3JlYXRlTXVzaWcyU2lnbmluZ1Nlc3Npb24oe1xuICAgICAgICBwdWJOb25jZXM6IFtub25jZXNbMF0ucHViTm9uY2UsIG5vbmNlc1sxXS5wdWJOb25jZV0sXG4gICAgICAgIHB1YktleXM6IHBhcnRpY2lwYW50UHViS2V5cyxcbiAgICAgICAgdHhIYXNoOiBoYXNoLFxuICAgICAgICBpbnRlcm5hbFB1YktleTogaW5wdXQudGFwSW50ZXJuYWxLZXksXG4gICAgICAgIHRhcFRyZWVSb290OiBpbnB1dC50YXBNZXJrbGVSb290LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNpZ25lck5vbmNlID0gbm9uY2VzLmZpbmQoKGt2KSA9PiBrdi5wYXJ0aWNpcGFudFB1YktleS5lcXVhbHMoc2lnbmVyUHViS2V5KSk7XG4gICAgICBpZiAoIXNpZ25lck5vbmNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncHViTm9uY2UgaXMgbWlzc2luZy4gcmV0cnkgc2lnbmluZyBwcm9jZXNzJyk7XG4gICAgICB9XG4gICAgICBwYXJ0aWFsU2lnID0gbXVzaWcyUGFydGlhbFNpZ24oc2lnbmVyLnByaXZhdGVLZXksIHNpZ25lck5vbmNlLnB1Yk5vbmNlLCBzZXNzaW9uS2V5LCB0aGlzLm5vbmNlU3RvcmUpO1xuICAgIH1cblxuICAgIGlmIChzaWdoYXNoVHlwZSAhPT0gVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxUKSB7XG4gICAgICBwYXJ0aWFsU2lnID0gQnVmZmVyLmNvbmNhdChbcGFydGlhbFNpZywgQnVmZmVyLm9mKHNpZ2hhc2hUeXBlKV0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZyA9IGVuY29kZVBzYnRNdXNpZzJQYXJ0aWFsU2lnKHtcbiAgICAgIHBhcnRpY2lwYW50UHViS2V5OiBzaWduZXJQdWJLZXksXG4gICAgICB0YXBPdXRwdXRLZXksXG4gICAgICBwYXJ0aWFsU2lnOiBwYXJ0aWFsU2lnLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkUHJvcHJpZXRhcnlLZXlWYWxUb0lucHV0KGlucHV0SW5kZXgsIHNpZyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzaWduVGFwcm9vdElucHV0KFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBzaWduZXI6IFNjaG5vcnJTaWduZXIsXG4gICAgbGVhZkhhc2hlczogQnVmZmVyW10sXG4gICAgc2lnaGFzaFR5cGVzOiBudW1iZXJbXSA9IFtUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQsIFRyYW5zYWN0aW9uLlNJR0hBU0hfQUxMXVxuICApOiB0aGlzIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgLy8gRmlndXJlIG91dCBpZiB0aGlzIGlzIHNjcmlwdCBwYXRoIG9yIG5vdCwgaWYgbm90LCB0d2VhayB0aGUgcHJpdmF0ZSBrZXlcbiAgICBpZiAoIWlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0YXBMZWFmU2NyaXB0IGlzIHJlcXVpcmVkIGZvciBwMnRyIHNjcmlwdCBwYXRoJyk7XG4gICAgfVxuICAgIGNvbnN0IHB1YmtleSA9IHRvWE9ubHlQdWJsaWNLZXkoc2lnbmVyLnB1YmxpY0tleSk7XG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgb25lIGxlYWYgc2NyaXB0IHN1cHBvcnRlZCBmb3Igc2lnbmluZycpO1xuICAgIH1cbiAgICBjb25zdCB0YXBMZWFmU2NyaXB0ID0gaW5wdXQudGFwTGVhZlNjcmlwdFswXTtcbiAgICBjb25zdCBwYXJzZWRDb250cm9sQmxvY2sgPSB0YXByb290LnBhcnNlQ29udHJvbEJsb2NrKGVjY0xpYiwgdGFwTGVhZlNjcmlwdC5jb250cm9sQmxvY2spO1xuICAgIGNvbnN0IHsgbGVhZlZlcnNpb24gfSA9IHBhcnNlZENvbnRyb2xCbG9jaztcbiAgICBpZiAobGVhZlZlcnNpb24gIT09IHRhcExlYWZTY3JpcHQubGVhZlZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGFwIHNjcmlwdCBsZWFmIHZlcnNpb24gbWlzbWF0Y2ggd2l0aCBjb250cm9sIGJsb2NrJyk7XG4gICAgfVxuICAgIGNvbnN0IGxlYWZIYXNoID0gdGFwcm9vdC5nZXRUYXBsZWFmSGFzaChlY2NMaWIsIHBhcnNlZENvbnRyb2xCbG9jaywgdGFwTGVhZlNjcmlwdC5zY3JpcHQpO1xuICAgIGlmICghbGVhZkhhc2hlcy5maW5kKChsKSA9PiBsLmVxdWFscyhsZWFmSGFzaCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNpZ25lciBjYW5ub3Qgc2lnbiBmb3IgbGVhZiBoYXNoICR7bGVhZkhhc2gudG9TdHJpbmcoJ2hleCcpfWApO1xuICAgIH1cbiAgICBjb25zdCB7IGhhc2gsIHNpZ2hhc2hUeXBlIH0gPSB0aGlzLmdldFRhcHJvb3RIYXNoRm9yU2lnKGlucHV0SW5kZXgsIHNpZ2hhc2hUeXBlcywgbGVhZkhhc2gpO1xuICAgIGxldCBzaWduYXR1cmUgPSBzaWduZXIuc2lnblNjaG5vcnIoaGFzaCk7XG4gICAgaWYgKHNpZ2hhc2hUeXBlICE9PSBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQpIHtcbiAgICAgIHNpZ25hdHVyZSA9IEJ1ZmZlci5jb25jYXQoW3NpZ25hdHVyZSwgQnVmZmVyLm9mKHNpZ2hhc2hUeXBlKV0pO1xuICAgIH1cbiAgICB0aGlzLmRhdGEudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgdGFwU2NyaXB0U2lnOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwdWJrZXksXG4gICAgICAgICAgc2lnbmF0dXJlLFxuICAgICAgICAgIGxlYWZIYXNoLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFwcm9vdE91dHB1dFNjcmlwdChpbnB1dEluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRhcHJvb3QuY3JlYXRlVGFwcm9vdE91dHB1dFNjcmlwdCh7XG4gICAgICAgIGNvbnRyb2xCbG9jazogaW5wdXQudGFwTGVhZlNjcmlwdFswXS5jb250cm9sQmxvY2ssXG4gICAgICAgIGxlYWZTY3JpcHQ6IGlucHV0LnRhcExlYWZTY3JpcHRbMF0uc2NyaXB0LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpbnB1dC50YXBJbnRlcm5hbEtleSAmJiBpbnB1dC50YXBNZXJrbGVSb290KSB7XG4gICAgICByZXR1cm4gdGFwcm9vdC5jcmVhdGVUYXByb290T3V0cHV0U2NyaXB0KHtcbiAgICAgICAgaW50ZXJuYWxQdWJLZXk6IGlucHV0LnRhcEludGVybmFsS2V5LFxuICAgICAgICB0YXB0cmVlUm9vdDogaW5wdXQudGFwTWVya2xlUm9vdCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhIHRhcHJvb3QgaW5wdXQnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFwcm9vdEhhc2hGb3JTaWcoXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIHNpZ2hhc2hUeXBlcz86IG51bWJlcltdLFxuICAgIGxlYWZIYXNoPzogQnVmZmVyXG4gICk6IHtcbiAgICBoYXNoOiBCdWZmZXI7XG4gICAgc2lnaGFzaFR5cGU6IG51bWJlcjtcbiAgfSB7XG4gICAgaWYgKCF0aGlzLmlzVGFwcm9vdElucHV0KGlucHV0SW5kZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhIHRhcHJvb3QgaW5wdXQnKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnaGFzaFR5cGUgPSB0aGlzLmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdLnNpZ2hhc2hUeXBlIHx8IFRyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVDtcbiAgICBpZiAoc2lnaGFzaFR5cGVzICYmIHNpZ2hhc2hUeXBlcy5pbmRleE9mKHNpZ2hhc2hUeXBlKSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFNpZ2hhc2ggdHlwZSBpcyBub3QgYWxsb3dlZC4gUmV0cnkgdGhlIHNpZ24gbWV0aG9kIHBhc3NpbmcgdGhlIGAgK1xuICAgICAgICAgIGBzaWdoYXNoVHlwZXMgYXJyYXkgb2Ygd2hpdGVsaXN0ZWQgdHlwZXMuIFNpZ2hhc2ggdHlwZTogJHtzaWdoYXNoVHlwZX1gXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB0eElucHV0cyA9IHRoaXMudHhJbnB1dHM7IC8vIFRoZXNlIGFyZSBzb21ld2hhdCBjb3N0bHkgdG8gZXh0cmFjdFxuICAgIGNvbnN0IHByZXZvdXRTY3JpcHRzOiBCdWZmZXJbXSA9IFtdO1xuICAgIGNvbnN0IHByZXZvdXRWYWx1ZXM6IGJpZ2ludFtdID0gW107XG5cbiAgICB0aGlzLmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0LCBpKSA9PiB7XG4gICAgICBsZXQgcHJldm91dDtcbiAgICAgIGlmIChpbnB1dC5ub25XaXRuZXNzVXR4bykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNvdWxkIGJlIGNvc3RseSwgZWl0aGVyIGNhY2hlIGl0IGhlcmUsIG9yIGZpbmQgYSB3YXkgdG8gc2hhcmUgd2l0aCBzdXBlclxuICAgICAgICBjb25zdCBub25XaXRuZXNzVXR4b1R4ID0gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFV0eG9Qc2J0KS50cmFuc2FjdGlvbkZyb21CdWZmZXIoXG4gICAgICAgICAgaW5wdXQubm9uV2l0bmVzc1V0eG8sXG4gICAgICAgICAgdGhpcy50eC5uZXR3b3JrXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcHJldm91dEhhc2ggPSB0eElucHV0c1tpXS5oYXNoO1xuICAgICAgICBjb25zdCB1dHhvSGFzaCA9IG5vbldpdG5lc3NVdHhvVHguZ2V0SGFzaCgpO1xuXG4gICAgICAgIC8vIElmIGEgbm9uLXdpdG5lc3MgVVRYTyBpcyBwcm92aWRlZCwgaXRzIGhhc2ggbXVzdCBtYXRjaCB0aGUgaGFzaCBzcGVjaWZpZWQgaW4gdGhlIHByZXZvdXRcbiAgICAgICAgaWYgKCFwcmV2b3V0SGFzaC5lcXVhbHModXR4b0hhc2gpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb24td2l0bmVzcyBVVFhPIGhhc2ggZm9yIGlucHV0ICMke2l9IGRvZXNuJ3QgbWF0Y2ggdGhlIGhhc2ggc3BlY2lmaWVkIGluIHRoZSBwcmV2b3V0YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmV2b3V0SW5kZXggPSB0eElucHV0c1tpXS5pbmRleDtcbiAgICAgICAgcHJldm91dCA9IG5vbldpdG5lc3NVdHhvVHgub3V0c1twcmV2b3V0SW5kZXhdO1xuICAgICAgfSBlbHNlIGlmIChpbnB1dC53aXRuZXNzVXR4bykge1xuICAgICAgICBwcmV2b3V0ID0gaW5wdXQud2l0bmVzc1V0eG87XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgYSBVdHhvIGlucHV0IGl0ZW0gZm9yIHNpZ25pbmcnKTtcbiAgICAgIH1cbiAgICAgIHByZXZvdXRTY3JpcHRzLnB1c2gocHJldm91dC5zY3JpcHQpO1xuICAgICAgcHJldm91dFZhbHVlcy5wdXNoKHByZXZvdXQudmFsdWUpO1xuICAgIH0pO1xuICAgIGNvbnN0IG91dHB1dFNjcmlwdCA9IHRoaXMuZ2V0VGFwcm9vdE91dHB1dFNjcmlwdChpbnB1dEluZGV4KTtcbiAgICBpZiAoIW91dHB1dFNjcmlwdC5lcXVhbHMocHJldm91dFNjcmlwdHNbaW5wdXRJbmRleF0pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFdpdG5lc3Mgc2NyaXB0IGZvciBpbnB1dCAjJHtpbnB1dEluZGV4fSBkb2Vzbid0IG1hdGNoIHRoZSBzY3JpcHRQdWJLZXkgaW4gdGhlIHByZXZvdXRgKTtcbiAgICB9XG4gICAgY29uc3QgaGFzaCA9IHRoaXMudHguaGFzaEZvcldpdG5lc3NWMShpbnB1dEluZGV4LCBwcmV2b3V0U2NyaXB0cywgcHJldm91dFZhbHVlcywgc2lnaGFzaFR5cGUsIGxlYWZIYXNoKTtcbiAgICByZXR1cm4geyBoYXNoLCBzaWdoYXNoVHlwZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcHJvcHJpZXRhcnkga2V5IHZhbHVlIHBhaXIgdG8gUFNCVCBpbnB1dC5cbiAgICogRGVmYXVsdCBpZGVudGlmaWVyRW5jb2RpbmcgaXMgdXRmLTggZm9yIGlkZW50aWZpZXIuXG4gICAqL1xuICBhZGRQcm9wcmlldGFyeUtleVZhbFRvSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyLCBrZXlWYWx1ZURhdGE6IFByb3ByaWV0YXJ5S2V5VmFsdWUpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRVbmtub3duS2V5VmFsVG9JbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICBrZXk6IGVuY29kZVByb3ByaWV0YXJ5S2V5KGtleVZhbHVlRGF0YS5rZXkpLFxuICAgICAgdmFsdWU6IGtleVZhbHVlRGF0YS52YWx1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIG9yIHVwZGF0ZXMgKGlmIGV4aXN0cykgcHJvcHJpZXRhcnkga2V5IHZhbHVlIHBhaXIgdG8gUFNCVCBpbnB1dC5cbiAgICogRGVmYXVsdCBpZGVudGlmaWVyRW5jb2RpbmcgaXMgdXRmLTggZm9yIGlkZW50aWZpZXIuXG4gICAqL1xuICBhZGRPclVwZGF0ZVByb3ByaWV0YXJ5S2V5VmFsVG9JbnB1dChpbnB1dEluZGV4OiBudW1iZXIsIGtleVZhbHVlRGF0YTogUHJvcHJpZXRhcnlLZXlWYWx1ZSk6IHRoaXMge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBjb25zdCBrZXkgPSBlbmNvZGVQcm9wcmlldGFyeUtleShrZXlWYWx1ZURhdGEua2V5KTtcbiAgICBjb25zdCB7IHZhbHVlIH0gPSBrZXlWYWx1ZURhdGE7XG4gICAgaWYgKGlucHV0LnVua25vd25LZXlWYWxzPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHVrdkluZGV4ID0gaW5wdXQudW5rbm93bktleVZhbHMuZmluZEluZGV4KCh1a3YpID0+IHVrdi5rZXkuZXF1YWxzKGtleSkpO1xuICAgICAgaWYgKHVrdkluZGV4ID4gLTEpIHtcbiAgICAgICAgaW5wdXQudW5rbm93bktleVZhbHNbdWt2SW5kZXhdID0geyBrZXksIHZhbHVlIH07XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFkZFVua25vd25LZXlWYWxUb0lucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIHNlYXJjaCBhbnkgZGF0YSBmcm9tIHByb3ByaWV0YXJ5IGtleSB2YWx1ZSBhZ2FpbnN0IGtleWRhdGEuXG4gICAqIERlZmF1bHQgaWRlbnRpZmllckVuY29kaW5nIGlzIHV0Zi04IGZvciBpZGVudGlmaWVyLlxuICAgKi9cbiAgZ2V0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXg6IG51bWJlciwga2V5U2VhcmNoPzogUHJvcHJpZXRhcnlLZXlTZWFyY2gpOiBQcm9wcmlldGFyeUtleVZhbHVlW10ge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICByZXR1cm4gZ2V0UHNidElucHV0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0LCBrZXlTZWFyY2gpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIGRlbGV0ZSBhbnkgZGF0YSBmcm9tIHByb3ByaWV0YXJ5IGtleSB2YWx1ZS5cbiAgICogRGVmYXVsdCBpZGVudGlmaWVyRW5jb2RpbmcgaXMgdXRmLTggZm9yIGlkZW50aWZpZXIuXG4gICAqL1xuICBkZWxldGVQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleDogbnVtYmVyLCBrZXlzVG9EZWxldGU/OiBQcm9wcmlldGFyeUtleVNlYXJjaCk6IHRoaXMge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoIWlucHV0LnVua25vd25LZXlWYWxzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAoa2V5c1RvRGVsZXRlICYmIGtleXNUb0RlbGV0ZS5zdWJ0eXBlID09PSB1bmRlZmluZWQgJiYgQnVmZmVyLmlzQnVmZmVyKGtleXNUb0RlbGV0ZS5rZXlkYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByb3ByaWV0YXJ5IGtleSBzZWFyY2ggZmlsdGVyIGNvbWJpbmF0aW9uLiBzdWJ0eXBlIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlucHV0LnVua25vd25LZXlWYWxzID0gaW5wdXQudW5rbm93bktleVZhbHMuZmlsdGVyKChrZXlWYWx1ZSwgaSkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZGVjb2RlUHJvcHJpZXRhcnlLZXkoa2V5VmFsdWUua2V5KTtcbiAgICAgIHJldHVybiAhKFxuICAgICAgICBrZXlzVG9EZWxldGUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAoa2V5c1RvRGVsZXRlLmlkZW50aWZpZXIgPT09IGtleS5pZGVudGlmaWVyICYmXG4gICAgICAgICAgKGtleXNUb0RlbGV0ZS5zdWJ0eXBlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIChrZXlzVG9EZWxldGUuc3VidHlwZSA9PT0ga2V5LnN1YnR5cGUgJiZcbiAgICAgICAgICAgICAgKCFCdWZmZXIuaXNCdWZmZXIoa2V5c1RvRGVsZXRlLmtleWRhdGEpIHx8IGtleXNUb0RlbGV0ZS5rZXlkYXRhLmVxdWFscyhrZXkua2V5ZGF0YSkpKSkpXG4gICAgICApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNdXNpZzJOb25jZUZvcklucHV0KFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBrZXlQYWlyOiBCSVAzMkludGVyZmFjZSxcbiAgICBrZXlUeXBlOiAncm9vdCcgfCAnZGVyaXZlZCcsXG4gICAgcGFyYW1zOiB7IHNlc3Npb25JZD86IEJ1ZmZlcjsgZGV0ZXJtaW5pc3RpYz86IGJvb2xlYW4gfSA9IHsgZGV0ZXJtaW5pc3RpYzogZmFsc2UgfVxuICApOiBQc2J0TXVzaWcyUHViTm9uY2Uge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5kYXRhLmlucHV0c1tpbnB1dEluZGV4XTtcbiAgICBpZiAoIWlucHV0LnRhcEludGVybmFsS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcEludGVybmFsS2V5IGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBub25jZScpO1xuICAgIH1cbiAgICBpZiAoIWlucHV0LnRhcE1lcmtsZVJvb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGFwTWVya2xlUm9vdCBpcyByZXF1aXJlZCB0byBjcmVhdGUgbm9uY2UnKTtcbiAgICB9XG4gICAgY29uc3QgZ2V0RGVyaXZlZEtleVBhaXIgPSAoKTogQklQMzJJbnRlcmZhY2UgPT4ge1xuICAgICAgaWYgKCFpbnB1dC50YXBCaXAzMkRlcml2YXRpb24/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcEJpcDMyRGVyaXZhdGlvbiBpcyByZXF1aXJlZCB0byBjcmVhdGUgbm9uY2UnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlcml2ZWQgPSBVdHhvUHNidC5kZXJpdmVLZXlQYWlyKGtleVBhaXIsIGlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbik7XG4gICAgICBpZiAoIWRlcml2ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBiaXAzMkRlcml2YXRpb24gbWFzdGVyRmluZ2VycHJpbnQgbWF0Y2hlZCB0aGUgSEQga2V5UGFpciBmaW5nZXJwcmludCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlcml2ZWQ7XG4gICAgfTtcbiAgICBjb25zdCBkZXJpdmVkS2V5UGFpciA9IGtleVR5cGUgPT09ICdyb290JyA/IGdldERlcml2ZWRLZXlQYWlyKCkgOiBrZXlQYWlyO1xuICAgIGlmICghZGVyaXZlZEtleVBhaXIucHJpdmF0ZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcml2YXRlS2V5IGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBub25jZScpO1xuICAgIH1cbiAgICBjb25zdCBwYXJ0aWNpcGFudHMgPSBwYXJzZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHMoaW5wdXQpO1xuICAgIGlmICghcGFydGljaXBhbnRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kIDAgbWF0Y2hpbmcgcGFydGljaXBhbnQga2V5IHZhbHVlIGluc3RlYWQgb2YgMWApO1xuICAgIH1cbiAgICBhc3NlcnRQc2J0TXVzaWcyUGFydGljaXBhbnRzKHBhcnRpY2lwYW50cywgaW5wdXQudGFwSW50ZXJuYWxLZXksIGlucHV0LnRhcE1lcmtsZVJvb3QpO1xuICAgIGNvbnN0IHsgdGFwT3V0cHV0S2V5LCBwYXJ0aWNpcGFudFB1YktleXMgfSA9IHBhcnRpY2lwYW50cztcblxuICAgIGNvbnN0IHBhcnRpY2lwYW50UHViS2V5ID0gcGFydGljaXBhbnRQdWJLZXlzLmZpbmQoKHB1YktleSkgPT4gcHViS2V5LmVxdWFscyhkZXJpdmVkS2V5UGFpci5wdWJsaWNLZXkpKTtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihwYXJ0aWNpcGFudFB1YktleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFydGljaXBhbnQgcGxhaW4gcHViIGtleSBzaG91bGQgbWF0Y2ggb25lIGJpcDMyRGVyaXZhdGlvbiBwbGFpbiBwdWIga2V5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBoYXNoIH0gPSB0aGlzLmdldFRhcHJvb3RIYXNoRm9yU2lnKGlucHV0SW5kZXgpO1xuXG4gICAgbGV0IHB1Yk5vbmNlOiBCdWZmZXI7XG4gICAgaWYgKHBhcmFtcy5kZXRlcm1pbmlzdGljKSB7XG4gICAgICBpZiAocGFyYW1zLnNlc3Npb25JZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgZXh0cmEgZW50cm9weSB3aGVuIGdlbmVyYXRpbmcgYSBkZXRlcm1pbmlzdGljIG5vbmNlJyk7XG4gICAgICB9XG4gICAgICAvLyBUaGVyZSBtdXN0IGJlIG9ubHkgMiBwYXJ0aWNpcGFudCBwdWJLZXlzIGlmIGl0IGdvdCB0byB0aGlzIHBvaW50XG4gICAgICBpZiAoIXBhcnRpY2lwYW50UHViS2V5LmVxdWFscyhwYXJ0aWNpcGFudFB1YktleXNbMV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgT25seSB0aGUgY29zaWduZXIncyBub25jZSBjYW4gYmUgc2V0IGRldGVybWluaXN0aWNhbGx5YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBub25jZXMgPSBwYXJzZVBzYnRNdXNpZzJOb25jZXMoaW5wdXQpO1xuICAgICAgaWYgKCFub25jZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBub25jZXMgZm91bmQgb24gaW5wdXQgIyR7aW5wdXRJbmRleH1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChub25jZXMubGVuZ3RoID4gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBoYXZlIG1vcmUgdGhhbiAyIG5vbmNlc2ApO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlyc3RTaWduZXJOb25jZSA9IG5vbmNlcy5maW5kKChrdikgPT4ga3YucGFydGljaXBhbnRQdWJLZXkuZXF1YWxzKHBhcnRpY2lwYW50UHViS2V5c1swXSkpO1xuICAgICAgaWYgKCFmaXJzdFNpZ25lck5vbmNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVyIG5vbmNlIG11c3QgYmUgc2V0IGlmIGNvc2lnbmVyIG5vbmNlIGlzIHRvIGJlIGRlcml2ZWQgZGV0ZXJtaW5pc3RpY2FsbHknKTtcbiAgICAgIH1cblxuICAgICAgcHViTm9uY2UgPSBjcmVhdGVNdXNpZzJEZXRlcm1pbmlzdGljTm9uY2Uoe1xuICAgICAgICBwcml2YXRlS2V5OiBkZXJpdmVkS2V5UGFpci5wcml2YXRlS2V5LFxuICAgICAgICBvdGhlck5vbmNlOiBmaXJzdFNpZ25lck5vbmNlLnB1Yk5vbmNlLFxuICAgICAgICBwdWJsaWNLZXlzOiBwYXJ0aWNpcGFudFB1YktleXMsXG4gICAgICAgIGludGVybmFsUHViS2V5OiBpbnB1dC50YXBJbnRlcm5hbEtleSxcbiAgICAgICAgdGFwVHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QsXG4gICAgICAgIGhhc2gsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHViTm9uY2UgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgdGhpcy5ub25jZVN0b3JlLmNyZWF0ZU11c2lnMk5vbmNlKFxuICAgICAgICAgIGRlcml2ZWRLZXlQYWlyLnByaXZhdGVLZXksXG4gICAgICAgICAgcGFydGljaXBhbnRQdWJLZXksXG4gICAgICAgICAgdGFwT3V0cHV0S2V5LFxuICAgICAgICAgIGhhc2gsXG4gICAgICAgICAgcGFyYW1zLnNlc3Npb25JZFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7IHRhcE91dHB1dEtleSwgcGFydGljaXBhbnRQdWJLZXksIHB1Yk5vbmNlIH07XG4gIH1cblxuICBwcml2YXRlIHNldE11c2lnMk5vbmNlc0lubmVyKFxuICAgIGtleVBhaXI6IEJJUDMySW50ZXJmYWNlLFxuICAgIGtleVR5cGU6ICdyb290JyB8ICdkZXJpdmVkJyxcbiAgICBpbnB1dEluZGV4PzogbnVtYmVyLFxuICAgIHBhcmFtczogeyBzZXNzaW9uSWQ/OiBCdWZmZXI7IGRldGVybWluaXN0aWM/OiBib29sZWFuIH0gPSB7IGRldGVybWluaXN0aWM6IGZhbHNlIH1cbiAgKTogdGhpcyB7XG4gICAgaWYgKGtleVBhaXIuaXNOZXV0ZXJlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByaXZhdGUga2V5IGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIG5vbmNlJyk7XG4gICAgfVxuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIocGFyYW1zLnNlc3Npb25JZCkgJiYgcGFyYW1zLnNlc3Npb25JZC5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2Vzc2lvbklkIHNpemUgJHtwYXJhbXMuc2Vzc2lvbklkLmxlbmd0aH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dHMgPSBpbnB1dEluZGV4ID09PSB1bmRlZmluZWQgPyB0aGlzLmRhdGEuaW5wdXRzIDogW2NoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCldO1xuICAgIGlucHV0cy5mb3JFYWNoKChpbnB1dCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghdGhpcy5pc1RhcHJvb3RLZXlQYXRoSW5wdXQoaW5kZXgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vbmNlID0gdGhpcy5jcmVhdGVNdXNpZzJOb25jZUZvcklucHV0KGluZGV4LCBrZXlQYWlyLCBrZXlUeXBlLCBwYXJhbXMpO1xuICAgICAgdGhpcy5hZGRPclVwZGF0ZVByb3ByaWV0YXJ5S2V5VmFsVG9JbnB1dChpbmRleCwgZW5jb2RlUHNidE11c2lnMlB1Yk5vbmNlKG5vbmNlKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGFuZCBzZXRzIE11U2lnMiBub25jZSB0byB0YXByb290IGtleSBwYXRoIGlucHV0IGF0IGlucHV0SW5kZXguXG4gICAqIElmIGlucHV0IGlzIG5vdCBhIHRhcHJvb3Qga2V5IHBhdGgsIG5vIGFjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0SW5kZXggaW5wdXQgaW5kZXhcbiAgICogQHBhcmFtIGtleVBhaXIgZGVyaXZlZCBrZXkgcGFpclxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIE9wdGlvbmFsIGV4dHJhIGVudHJvcHkuIElmIHByb3ZpZGVkIGl0IG11c3QgZWl0aGVyIGJlIGEgY291bnRlciB1bmlxdWUgdG8gdGhpcyBzZWNyZXQga2V5LFxuICAgKiAoY29udmVydGVkIHRvIGFuIGFycmF5IG9mIDMyIGJ5dGVzKSwgb3IgMzIgdW5pZm9ybWx5IHJhbmRvbSBieXRlcy5cbiAgICogQHBhcmFtIGRldGVybWluaXN0aWMgSWYgdHJ1ZSwgc2V0IHRoZSBjb3NpZ25lciBub25jZSBkZXRlcm1pbmlzdGljYWxseVxuICAgKi9cbiAgc2V0SW5wdXRNdXNpZzJOb25jZShcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgZGVyaXZlZEtleVBhaXI6IEJJUDMySW50ZXJmYWNlLFxuICAgIHBhcmFtczogeyBzZXNzaW9uSWQ/OiBCdWZmZXI7IGRldGVybWluaXN0aWM/OiBib29sZWFuIH0gPSB7IGRldGVybWluaXN0aWM6IGZhbHNlIH1cbiAgKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuc2V0TXVzaWcyTm9uY2VzSW5uZXIoZGVyaXZlZEtleVBhaXIsICdkZXJpdmVkJywgaW5wdXRJbmRleCwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW5kIHNldHMgTXVTaWcyIG5vbmNlIHRvIHRhcHJvb3Qga2V5IHBhdGggaW5wdXQgYXQgaW5wdXRJbmRleC5cbiAgICogSWYgaW5wdXQgaXMgbm90IGEgdGFwcm9vdCBrZXkgcGF0aCwgbm8gYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRJbmRleCBpbnB1dCBpbmRleFxuICAgKiBAcGFyYW0ga2V5UGFpciBIRCByb290IGtleSBwYWlyXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgT3B0aW9uYWwgZXh0cmEgZW50cm9weS4gSWYgcHJvdmlkZWQgaXQgbXVzdCBlaXRoZXIgYmUgYSBjb3VudGVyIHVuaXF1ZSB0byB0aGlzIHNlY3JldCBrZXksXG4gICAqIChjb252ZXJ0ZWQgdG8gYW4gYXJyYXkgb2YgMzIgYnl0ZXMpLCBvciAzMiB1bmlmb3JtbHkgcmFuZG9tIGJ5dGVzLlxuICAgKiBAcGFyYW0gZGV0ZXJtaW5pc3RpYyBJZiB0cnVlLCBzZXQgdGhlIGNvc2lnbmVyIG5vbmNlIGRldGVybWluaXN0aWNhbGx5XG4gICAqL1xuICBzZXRJbnB1dE11c2lnMk5vbmNlSEQoXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIGtleVBhaXI6IEJJUDMySW50ZXJmYWNlLFxuICAgIHBhcmFtczogeyBzZXNzaW9uSWQ/OiBCdWZmZXI7IGRldGVybWluaXN0aWM/OiBib29sZWFuIH0gPSB7IGRldGVybWluaXN0aWM6IGZhbHNlIH1cbiAgKTogdGhpcyB7XG4gICAgY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICByZXR1cm4gdGhpcy5zZXRNdXNpZzJOb25jZXNJbm5lcihrZXlQYWlyLCAncm9vdCcsIGlucHV0SW5kZXgsIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGFuZCBzZXRzIE11U2lnMiBub25jZSB0byBhbGwgdGFwcm9vdCBrZXkgcGF0aCBpbnB1dHMuIE90aGVyIGlucHV0cyB3aWxsIGJlIHNraXBwZWQuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dEluZGV4IGlucHV0IGluZGV4XG4gICAqIEBwYXJhbSBrZXlQYWlyIGRlcml2ZWQga2V5IHBhaXJcbiAgICogQHBhcmFtIHNlc3Npb25JZCBPcHRpb25hbCBleHRyYSBlbnRyb3B5LiBJZiBwcm92aWRlZCBpdCBtdXN0IGVpdGhlciBiZSBhIGNvdW50ZXIgdW5pcXVlIHRvIHRoaXMgc2VjcmV0IGtleSxcbiAgICogKGNvbnZlcnRlZCB0byBhbiBhcnJheSBvZiAzMiBieXRlcyksIG9yIDMyIHVuaWZvcm1seSByYW5kb20gYnl0ZXMuXG4gICAqL1xuICBzZXRBbGxJbnB1dHNNdXNpZzJOb25jZShcbiAgICBrZXlQYWlyOiBCSVAzMkludGVyZmFjZSxcbiAgICBwYXJhbXM6IHsgc2Vzc2lvbklkPzogQnVmZmVyOyBkZXRlcm1pbmlzdGljPzogYm9vbGVhbiB9ID0geyBkZXRlcm1pbmlzdGljOiBmYWxzZSB9XG4gICk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLnNldE11c2lnMk5vbmNlc0lubmVyKGtleVBhaXIsICdkZXJpdmVkJywgdW5kZWZpbmVkLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbmQgc2V0cyBNdVNpZzIgbm9uY2UgdG8gYWxsIHRhcHJvb3Qga2V5IHBhdGggaW5wdXRzLiBPdGhlciBpbnB1dHMgd2lsbCBiZSBza2lwcGVkLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRJbmRleCBpbnB1dCBpbmRleFxuICAgKiBAcGFyYW0ga2V5UGFpciBIRCByb290IGtleSBwYWlyXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgT3B0aW9uYWwgZXh0cmEgZW50cm9weS4gSWYgcHJvdmlkZWQgaXQgbXVzdCBlaXRoZXIgYmUgYSBjb3VudGVyIHVuaXF1ZSB0byB0aGlzIHNlY3JldCBrZXksXG4gICAqIChjb252ZXJ0ZWQgdG8gYW4gYXJyYXkgb2YgMzIgYnl0ZXMpLCBvciAzMiB1bmlmb3JtbHkgcmFuZG9tIGJ5dGVzLlxuICAgKi9cbiAgc2V0QWxsSW5wdXRzTXVzaWcyTm9uY2VIRChcbiAgICBrZXlQYWlyOiBCSVAzMkludGVyZmFjZSxcbiAgICBwYXJhbXM6IHsgc2Vzc2lvbklkPzogQnVmZmVyOyBkZXRlcm1pbmlzdGljPzogYm9vbGVhbiB9ID0geyBkZXRlcm1pbmlzdGljOiBmYWxzZSB9XG4gICk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLnNldE11c2lnMk5vbmNlc0lubmVyKGtleVBhaXIsICdyb290JywgdW5kZWZpbmVkLCBwYXJhbXMpO1xuICB9XG5cbiAgY2xvbmUoKTogdGhpcyB7XG4gICAgcmV0dXJuIHN1cGVyLmNsb25lKCkgYXMgdGhpcztcbiAgfVxufVxuIl19
967
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXR4b1BzYnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYml0Z28vVXR4b1BzYnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQTBDO0FBTzFDLGdEQUFxRDtBQUNyRCwrREFBc0U7QUFFdEUsaUNBQXFEO0FBQ3JELHVDQUF1QztBQUN2Qyx3RUFBOEY7QUFFOUYsMEJBQTZHO0FBQzdHLHVEQUFvRDtBQUNwRCx1Q0FBZ0Q7QUFDaEQsb0RBQThDO0FBQzlDLDBEQUErQztBQUMvQyxtREFBd0U7QUFDeEUsNkNBQWtEO0FBQ2xELHFDQWtCa0I7QUFDbEIsbUNBQTJEO0FBQzNELHdDQUFpRDtBQUNqRCx5Q0FPb0I7QUFZcEIsTUFBTSxzQkFBc0IsR0FBRztJQUM3QixhQUFhLEVBQUUsS0FBSztJQUNwQixZQUFZLEVBQUUsQ0FBQyxlQUFXLENBQUMsZUFBZSxFQUFFLGVBQVcsQ0FBQyxXQUFXLENBQUM7Q0FDckUsQ0FBQztBQUVGLFNBQVMsaUJBQWlCLENBQUMsQ0FBc0M7SUFDL0QsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUN6RyxDQUFDO0FBb0RELDJFQUEyRTtBQUMzRSw4RUFBOEU7QUFDOUUsaUVBQWlFO0FBQ2pFLE1BQWEsUUFBdUUsU0FBUSxRQUFJO0lBQWhHOztRQUNVLGVBQVUsR0FBRyxJQUFJLHlCQUFnQixFQUFFLENBQUM7SUFxbEM5QyxDQUFDO0lBbmxDVyxNQUFNLENBQUMscUJBQXFCLENBQUMsTUFBYyxFQUFFLE9BQWdCO1FBQ3JFLE9BQU8saUNBQWUsQ0FBQyxVQUFVLENBQVMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFD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bnRlbnQiOlsiaW1wb3J0IHsgUHNidCBhcyBQc2J0QmFzZSB9IGZyb20gJ2JpcDE3NCc7XG5pbXBvcnQge1xuICBCaXAzMkRlcml2YXRpb24sXG4gIFRhcEJpcDMyRGVyaXZhdGlvbixcbiAgVHJhbnNhY3Rpb24gYXMgSVRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvbkZyb21CdWZmZXIsXG59IGZyb20gJ2JpcDE3NC9zcmMvbGliL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgY2hlY2tGb3JJbnB1dCB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL3V0aWxzJztcbmltcG9ydCB7IEJ1ZmZlcldyaXRlciwgdmFydWludCB9IGZyb20gJ2JpdGNvaW5qcy1saWIvc3JjL2J1ZmZlcnV0aWxzJztcbmltcG9ydCB7IFNlc3Npb25LZXkgfSBmcm9tICdAYnJhbmRvbmJsYWNrL211c2lnJztcbmltcG9ydCB7IEJJUDMyRmFjdG9yeSwgQklQMzJJbnRlcmZhY2UgfSBmcm9tICdiaXAzMic7XG5pbXBvcnQgKiBhcyBiczU4Y2hlY2sgZnJvbSAnYnM1OGNoZWNrJztcbmltcG9ydCB7IGRlY29kZVByb3ByaWV0YXJ5S2V5LCBlbmNvZGVQcm9wcmlldGFyeUtleSB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL3Byb3ByaWV0YXJ5S2V5VmFsJztcblxuaW1wb3J0IHsgdGFwcm9vdCwgSERTaWduZXIsIFBzYnQsIFBzYnRUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb24sIFR4T3V0cHV0LCBOZXR3b3JrLCBlY2MgYXMgZWNjTGliIH0gZnJvbSAnLi4nO1xuaW1wb3J0IHsgVXR4b1RyYW5zYWN0aW9uIH0gZnJvbSAnLi9VdHhvVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgZ2V0T3V0cHV0SWRGb3JJbnB1dCB9IGZyb20gJy4vVW5zcGVudCc7XG5pbXBvcnQgeyBpc1NlZ3dpdCB9IGZyb20gJy4vcHNidC9zY3JpcHRUeXBlcyc7XG5pbXBvcnQgeyB1bnNpZ24gfSBmcm9tICcuL3BzYnQvZnJvbUhhbGZTaWduZWQnO1xuaW1wb3J0IHsgY2hlY2tQbGFpblB1YmxpY0tleSwgdG9YT25seVB1YmxpY0tleSB9IGZyb20gJy4vb3V0cHV0U2NyaXB0cyc7XG5pbXBvcnQgeyBwYXJzZVB1YlNjcmlwdDJPZjMgfSBmcm9tICcuL3BhcnNlSW5wdXQnO1xuaW1wb3J0IHtcbiAgY3JlYXRlTXVzaWcyU2lnbmluZ1Nlc3Npb24sXG4gIGVuY29kZVBzYnRNdXNpZzJQYXJ0aWFsU2lnLFxuICBlbmNvZGVQc2J0TXVzaWcyUHViTm9uY2UsXG4gIG11c2lnMlBhcnRpYWxTaWduLFxuICBwYXJzZVBzYnRNdXNpZzJOb25jZXMsXG4gIHBhcnNlUHNidE11c2lnMlBhcnRpY2lwYW50cyxcbiAgUHNidE11c2lnMlBhcnRpY2lwYW50cyxcbiAgYXNzZXJ0UHNidE11c2lnMk5vbmNlcyxcbiAgYXNzZXJ0UHNidE11c2lnMlBhcnRpY2lwYW50cyxcbiAgTXVzaWcyTm9uY2VTdG9yZSxcbiAgUHNidE11c2lnMlB1Yk5vbmNlLFxuICBwYXJzZVBzYnRNdXNpZzJQYXJ0aWFsU2lncyxcbiAgbXVzaWcyUGFydGlhbFNpZ1ZlcmlmeSxcbiAgbXVzaWcyQWdncmVnYXRlU2lncyxcbiAgZ2V0U2lnSGFzaFR5cGVGcm9tU2lncyxcbiAgbXVzaWcyRGV0ZXJtaW5pc3RpY1NpZ24sXG4gIGNyZWF0ZU11c2lnMkRldGVybWluaXN0aWNOb25jZSxcbn0gZnJvbSAnLi9NdXNpZzInO1xuaW1wb3J0IHsgaXNUcmlwbGUsIGlzVHVwbGUsIFRyaXBsZSwgVHVwbGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGdldFRhcHJvb3RPdXRwdXRLZXkgfSBmcm9tICcuLi90YXByb290JztcbmltcG9ydCB7XG4gIGdldFBzYnRJbnB1dFByb3ByaWV0YXJ5S2V5VmFscyxcbiAgZ2V0UHNidElucHV0U2lnbmF0dXJlQ291bnQsXG4gIFByb3ByaWV0YXJ5S2V5U2VhcmNoLFxuICBQcm9wcmlldGFyeUtleVN1YnR5cGUsXG4gIFByb3ByaWV0YXJ5S2V5VmFsdWUsXG4gIFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbn0gZnJvbSAnLi9Qc2J0VXRpbCc7XG5cbnR5cGUgU2lnbmF0dXJlUGFyYW1zID0ge1xuICAvKiogV2hlbiB0cnVlLCBhbmQgYWRkIHRoZSBzZWNvbmQgKGxhc3QpIG5vbmNlIGFuZCBzaWduYXR1cmUgZm9yIGEgdGFwcm9vdCBrZXlcbiAgICogcGF0aCBzcGVuZCBkZXRlcm1pbmlzdGljYWxseS4gVGhyb3dzIGFuIGVycm9yIGlmIGRvbmUgZm9yIHRoZSBmaXJzdCBub25jZS9zaWduYXR1cmVcbiAgICogb2YgYSB0YXByb290IGtleXBhdGggc3BlbmQuIElnbm9yZSBmb3IgYWxsIG90aGVyIGlucHV0IHR5cGVzLlxuICAgKi9cbiAgZGV0ZXJtaW5pc3RpYzogYm9vbGVhbjtcbiAgLyoqIEFsbG93ZWQgc2lnaGFzaCB0eXBlcyAqL1xuICBzaWdoYXNoVHlwZXM6IG51bWJlcltdO1xufTtcblxuY29uc3QgZGVmYXVsdFNpZ25hdHVyZVBhcmFtcyA9IHtcbiAgZGV0ZXJtaW5pc3RpYzogZmFsc2UsXG4gIHNpZ2hhc2hUeXBlczogW1RyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCwgVHJhbnNhY3Rpb24uU0lHSEFTSF9BTExdLFxufTtcblxuZnVuY3Rpb24gdG9TaWduYXR1cmVQYXJhbXModjogUGFydGlhbDxTaWduYXR1cmVQYXJhbXM+IHwgbnVtYmVyW10pOiBTaWduYXR1cmVQYXJhbXMge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KSA/IHRvU2lnbmF0dXJlUGFyYW1zKHsgc2lnaGFzaFR5cGVzOiB2IH0pIDogeyAuLi5kZWZhdWx0U2lnbmF0dXJlUGFyYW1zLCAuLi52IH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSERUYXByb290U2lnbmVyIGV4dGVuZHMgSERTaWduZXIge1xuICAvKipcbiAgICogVGhlIHBhdGggc3RyaW5nIG11c3QgbWF0Y2ggL15tKFxcL1xcZCsnPykrJC9cbiAgICogZXguIG0vNDQnLzAnLzAnLzEvMjMgbGV2ZWxzIHdpdGggJyBtdXN0IGJlIGhhcmQgZGVyaXZhdGlvbnNcbiAgICovXG4gIGRlcml2ZVBhdGgocGF0aDogc3RyaW5nKTogSERUYXByb290U2lnbmVyO1xuICAvKipcbiAgICogSW5wdXQgaGFzaCAodGhlIFwibWVzc2FnZSBkaWdlc3RcIikgZm9yIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtXG4gICAqIFJldHVybiBhIDY0IGJ5dGUgc2lnbmF0dXJlICgzMiBieXRlIHIgYW5kIDMyIGJ5dGUgcyBpbiB0aGF0IG9yZGVyKVxuICAgKi9cbiAgc2lnblNjaG5vcnIoaGFzaDogQnVmZmVyKTogQnVmZmVyO1xufVxuXG4vKipcbiAqIEhEIHNpZ25lciBvYmplY3QgZm9yIHRhcHJvb3QgcDJ0ciBtdXNpZzIga2V5IHBhdGggc2lnblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhEVGFwcm9vdE11c2lnMlNpZ25lciBleHRlbmRzIEhEU2lnbmVyIHtcbiAgLyoqXG4gICAqIE11c2lnMiByZXF1aXJlcyBzaWduZXIncyAzMi1ieXRlcyBwcml2YXRlIGtleSB0byBiZSBwYXNzZWQgdG8gaXQuXG4gICAqL1xuICBwcml2YXRlS2V5OiBCdWZmZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHN0cmluZyBtdXN0IG1hdGNoIC9ebShcXC9cXGQrJz8pKyQvXG4gICAqIGV4LiBtLzQ0Jy8wJy8wJy8xLzIzIGxldmVscyB3aXRoICcgbXVzdCBiZSBoYXJkIGRlcml2YXRpb25zXG4gICAqL1xuICBkZXJpdmVQYXRoKHBhdGg6IHN0cmluZyk6IEhEVGFwcm9vdE11c2lnMlNpZ25lcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hub3JyU2lnbmVyIHtcbiAgcHVibGljS2V5OiBCdWZmZXI7XG4gIHNpZ25TY2hub3JyKGhhc2g6IEJ1ZmZlcik6IEJ1ZmZlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNdXNpZzJTaWduZXIge1xuICBwdWJsaWNLZXk6IEJ1ZmZlcjtcbiAgcHJpdmF0ZUtleTogQnVmZmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhcHJvb3RTaWduZXIge1xuICBsZWFmSGFzaGVzOiBCdWZmZXJbXTtcbiAgc2lnbmVyOiBTY2hub3JyU2lnbmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBzYnRPcHRzIHtcbiAgbmV0d29yazogTmV0d29yaztcbiAgbWF4aW11bUZlZVJhdGU/OiBudW1iZXI7IC8vIFtzYXQvYnl0ZV1cbiAgYmlwMzJQYXRoc0Fic29sdXRlPzogYm9vbGVhbjtcbn1cblxuLy8gVE9ETzogdXBzdHJlYW0gZG9lcyBgY2hlY2tJbnB1dHNGb3JQYXJ0aWFsU2lnc2AgYmVmb3JlIGRvaW5nIHRoaW5ncyBsaWtlXG4vLyBgc2V0VmVyc2lvbmAuIE91ciBpbnB1dHMgY291bGQgaGF2ZSB0YXBzY3JpcHRzaWdzIChvciBpbiBmdXR1cmUgdGFwa2V5c2lncylcbi8vIGFuZCBub3QgZmFpbCB0aGF0IGNoZWNrLiBEbyB3ZSB3YW50IHRvIGRvIGFueXRoaW5nIGFib3V0IHRoYXQ/XG5leHBvcnQgY2xhc3MgVXR4b1BzYnQ8VHggZXh0ZW5kcyBVdHhvVHJhbnNhY3Rpb248YmlnaW50PiA9IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+PiBleHRlbmRzIFBzYnQge1xuICBwcml2YXRlIG5vbmNlU3RvcmUgPSBuZXcgTXVzaWcyTm9uY2VTdG9yZSgpO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgdHJhbnNhY3Rpb25Gcm9tQnVmZmVyKGJ1ZmZlcjogQnVmZmVyLCBuZXR3b3JrOiBOZXR3b3JrKTogVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4ge1xuICAgIHJldHVybiBVdHhvVHJhbnNhY3Rpb24uZnJvbUJ1ZmZlcjxiaWdpbnQ+KGJ1ZmZlciwgZmFsc2UsICdiaWdpbnQnLCBuZXR3b3JrKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVQc2J0KG9wdHM6IFBzYnRPcHRzLCBkYXRhPzogUHNidEJhc2UpOiBVdHhvUHNidCB7XG4gICAgcmV0dXJuIG5ldyBVdHhvUHNidChcbiAgICAgIG9wdHMsXG4gICAgICBkYXRhIHx8IG5ldyBQc2J0QmFzZShuZXcgUHNidFRyYW5zYWN0aW9uKHsgdHg6IG5ldyBVdHhvVHJhbnNhY3Rpb248YmlnaW50PihvcHRzLm5ldHdvcmspIH0pKVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUJ1ZmZlcihidWZmZXI6IEJ1ZmZlciwgb3B0czogUHNidE9wdHMpOiBVdHhvUHNidCB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25Gcm9tQnVmZmVyOiBUcmFuc2FjdGlvbkZyb21CdWZmZXIgPSAoYnVmZmVyOiBCdWZmZXIpOiBJVHJhbnNhY3Rpb24gPT4ge1xuICAgICAgY29uc3QgdHggPSB0aGlzLnRyYW5zYWN0aW9uRnJvbUJ1ZmZlcihidWZmZXIsIG9wdHMubmV0d29yayk7XG4gICAgICByZXR1cm4gbmV3IFBzYnRUcmFuc2FjdGlvbih7IHR4IH0pO1xuICAgIH07XG4gICAgY29uc3QgcHNidEJhc2UgPSBQc2J0QmFzZS5mcm9tQnVmZmVyKGJ1ZmZlciwgdHJhbnNhY3Rpb25Gcm9tQnVmZmVyLCB7XG4gICAgICBiaXAzMlBhdGhzQWJzb2x1dGU6IG9wdHMuYmlwMzJQYXRoc0Fic29sdXRlLFxuICAgIH0pO1xuICAgIGNvbnN0IHBzYnQgPSB0aGlzLmNyZWF0ZVBzYnQob3B0cywgcHNidEJhc2UpO1xuICAgIC8vIFVwc3RyZWFtIGNoZWNrcyBmb3IgZHVwbGljYXRlIGlucHV0cyBoZXJlLCBidXQgaXQgc2VlbXMgdG8gYmUgb2YgZHViaW91cyB2YWx1ZS5cbiAgICByZXR1cm4gcHNidDtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSGV4KGRhdGE6IHN0cmluZywgb3B0czogUHNidE9wdHMpOiBVdHhvUHNidCB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbUJ1ZmZlcihCdWZmZXIuZnJvbShkYXRhLCAnaGV4JyksIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXJlbnQgLSBQYXJlbnQga2V5LiBNYXRjaGVkIHdpdGggYGJpcDMyRGVyaXZhdGlvbnNgIHVzaW5nIGBmaW5nZXJwcmludGAgcHJvcGVydHkuXG4gICAqIEBwYXJhbSBiaXAzMkRlcml2YXRpb25zIC0gcG9zc2libGUgZGVyaXZhdGlvbnMgZm9yIGlucHV0IG9yIG91dHB1dFxuICAgKiBAcmV0dXJuIGRlcml2ZWQgYmlwMzIgbm9kZSBpZiBtYXRjaGluZyBkZXJpdmF0aW9uIGlzIGZvdW5kLCB1bmRlZmluZWQgaWYgbm9uZSBpcyBmb3VuZFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIG1vcmUgdGhhbiBvbmUgbWF0Y2ggaXMgZm91bmRcbiAgICovXG4gIHN0YXRpYyBkZXJpdmVLZXlQYWlyKHBhcmVudDogQklQMzJJbnRlcmZhY2UsIGJpcDMyRGVyaXZhdGlvbnM6IEJpcDMyRGVyaXZhdGlvbltdKTogQklQMzJJbnRlcmZhY2UgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1hdGNoaW5nRGVyaXZhdGlvbnMgPSBiaXAzMkRlcml2YXRpb25zLmZpbHRlcigoYmlwRHYpID0+IHtcbiAgICAgIHJldHVybiBiaXBEdi5tYXN0ZXJGaW5nZXJwcmludC5lcXVhbHMocGFyZW50LmZpbmdlcnByaW50KTtcbiAgICB9KTtcblxuICAgIGlmICghbWF0Y2hpbmdEZXJpdmF0aW9ucy5sZW5ndGgpIHtcbiAgICAgIC8vIE5vIGZpbmdlcnByaW50IG1hdGNoXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChtYXRjaGluZ0Rlcml2YXRpb25zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgbW9yZSB0aGFuIG9uZSBtYXRjaGluZyBkZXJpdmF0aW9uIGZvciBmaW5nZXJwcmludCAke3BhcmVudC5maW5nZXJwcmludC50b1N0cmluZygnaGV4Jyl9OiAke1xuICAgICAgICAgIG1hdGNoaW5nRGVyaXZhdGlvbnMubGVuZ3RoXG4gICAgICAgIH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IFtkZXJpdmF0aW9uXSA9IG1hdGNoaW5nRGVyaXZhdGlvbnM7XG4gICAgY29uc3Qgbm9kZSA9IHBhcmVudC5kZXJpdmVQYXRoKGRlcml2YXRpb24ucGF0aCk7XG5cbiAgICBpZiAoIWRlcml2YXRpb24ucHVia2V5LmVxdWFscyhub2RlLnB1YmxpY0tleSkgJiYgIWRlcml2YXRpb24ucHVia2V5LmVxdWFscyh0b1hPbmx5UHVibGljS2V5KG5vZGUucHVibGljS2V5KSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHVia2V5IGRpZCBub3QgbWF0Y2ggYmlwMzJEZXJpdmF0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBnZXQgbmV0d29yaygpOiBOZXR3b3JrIHtcbiAgICByZXR1cm4gdGhpcy50eC5uZXR3b3JrO1xuICB9XG5cbiAgdG9IZXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIGdldE5vbldpdG5lc3NQcmV2aW91c1R4aWRzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB0eElucHV0cyA9IHRoaXMudHhJbnB1dHM7IC8vIFRoZXNlIGFyZSBzb21ld2hhdCBjb3N0bHkgdG8gZXh0cmFjdFxuICAgIGNvbnN0IHR4aWRTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKCFpbnB1dC53aXRuZXNzVXR4bykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgaGF2ZSB3aXRuZXNzIFVUWE8gZm9yIGFsbCBpbnB1dHMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNTZWd3aXQoaW5wdXQud2l0bmVzc1V0eG8uc2NyaXB0LCBpbnB1dC5yZWRlZW1TY3JpcHQpKSB7XG4gICAgICAgIHR4aWRTZXQuYWRkKGdldE91dHB1dElkRm9ySW5wdXQodHhJbnB1dHNbaW5kZXhdKS50eGlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gWy4uLnR4aWRTZXRdO1xuICB9XG5cbiAgYWRkTm9uV2l0bmVzc1V0eG9zKHR4QnVmczogUmVjb3JkPHN0cmluZywgQnVmZmVyPik6IHRoaXMge1xuICAgIGNvbnN0IHR4SW5wdXRzID0gdGhpcy50eElucHV0czsgLy8gVGhlc2UgYXJlIHNvbWV3aGF0IGNvc3RseSB0byBleHRyYWN0XG4gICAgdGhpcy5kYXRhLmlucHV0cy5mb3JFYWNoKChpbnB1dCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghaW5wdXQud2l0bmVzc1V0eG8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGhhdmUgd2l0bmVzcyBVVFhPIGZvciBhbGwgaW5wdXRzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzU2Vnd2l0KGlucHV0LndpdG5lc3NVdHhvLnNjcmlwdCwgaW5wdXQucmVkZWVtU2NyaXB0KSkge1xuICAgICAgICBjb25zdCB7IHR4aWQgfSA9IGdldE91dHB1dElkRm9ySW5wdXQodHhJbnB1dHNbaW5kZXhdKTtcbiAgICAgICAgaWYgKHR4QnVmc1t0eGlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYWxsIHJlcXVpcmVkIHByZXZpb3VzIHRyYW5zYWN0aW9ucyBwcm92aWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlSW5wdXQoaW5kZXgsIHsgbm9uV2l0bmVzc1V0eG86IHR4QnVmc1t0eGlkXSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tVHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+LCBwcmV2T3V0cHV0czogVHhPdXRwdXQ8YmlnaW50PltdKTogVXR4b1BzYnQge1xuICAgIGlmIChwcmV2T3V0cHV0cy5sZW5ndGggIT09IHRyYW5zYWN0aW9uLmlucy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyYW5zYWN0aW9uIGhhcyAke3RyYW5zYWN0aW9uLmlucy5sZW5ndGh9IGlucHV0cywgYnV0ICR7cHJldk91dHB1dHMubGVuZ3RofSBwcmV2aW91cyBvdXRwdXRzIHByb3ZpZGVkYFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgY2xvbmVkVHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbi5jbG9uZSgpO1xuICAgIGNvbnN0IHVwZGF0ZXMgPSB1bnNpZ24oY2xvbmVkVHJhbnNhY3Rpb24sIHByZXZPdXRwdXRzKTtcblxuICAgIGNvbnN0IHBzYnRCYXNlID0gbmV3IFBzYnRCYXNlKG5ldyBQc2J0VHJhbnNhY3Rpb24oeyB0eDogY2xvbmVkVHJhbnNhY3Rpb24gfSkpO1xuICAgIGNsb25lZFRyYW5zYWN0aW9uLmlucy5mb3JFYWNoKCgpID0+IHBzYnRCYXNlLmlucHV0cy5wdXNoKHsgdW5rbm93bktleVZhbHM6IFtdIH0pKTtcbiAgICBjbG9uZWRUcmFuc2FjdGlvbi5vdXRzLmZvckVhY2goKCkgPT4gcHNidEJhc2Uub3V0cHV0cy5wdXNoKHsgdW5rbm93bktleVZhbHM6IFtdIH0pKTtcbiAgICBjb25zdCBwc2J0ID0gdGhpcy5jcmVhdGVQc2J0KHsgbmV0d29yazogdHJhbnNhY3Rpb24ubmV0d29yayB9LCBwc2J0QmFzZSk7XG5cbiAgICB1cGRhdGVzLmZvckVhY2goKHVwZGF0ZSwgaW5kZXgpID0+IHtcbiAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5kZXgsIHVwZGF0ZSk7XG4gICAgICBwc2J0LnVwZGF0ZUlucHV0KGluZGV4LCB7IHdpdG5lc3NVdHhvOiB7IHNjcmlwdDogcHJldk91dHB1dHNbaW5kZXhdLnNjcmlwdCwgdmFsdWU6IHByZXZPdXRwdXRzW2luZGV4XS52YWx1ZSB9IH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBzYnQ7XG4gIH1cblxuICBnZXRVbnNpZ25lZFR4KCk6IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+IHtcbiAgICByZXR1cm4gdGhpcy50eC5jbG9uZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBuZXdUcmFuc2FjdGlvbihuZXR3b3JrOiBOZXR3b3JrKTogVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4ge1xuICAgIHJldHVybiBuZXcgVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4obmV0d29yayk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHR4KCk6IFR4IHtcbiAgICByZXR1cm4gKHRoaXMuZGF0YS5nbG9iYWxNYXAudW5zaWduZWRUeCBhcyBQc2J0VHJhbnNhY3Rpb24pLnR4IGFzIFR4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrRm9yU2lnbmF0dXJlcyhwcm9wTmFtZT86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIGlmIChpbnB1dC50YXBTY3JpcHRTaWc/Lmxlbmd0aCB8fCBpbnB1dC50YXBLZXlTaWcgfHwgaW5wdXQucGFydGlhbFNpZz8ubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1vZGlmeSAke3Byb3BOYW1lID8/ICd0cmFuc2FjdGlvbid9IC0gc2lnbmF0dXJlcyBleGlzdC5gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCBhdCBpbnB1dEluZGV4IGlzIGEgdGFwcm9vdCBrZXkgcGF0aC5cbiAgICogQ2hlY2tzIGZvciBwcmVzZW5jZSBvZiBtaW5pbXVtIHJlcXVpcmVkIGtleSBwYXRoIGlucHV0IGZpZWxkcyBhbmQgYWJzZW5jZSBvZiBhbnkgc2NyaXB0IHBhdGggb25seSBpbnB1dCBmaWVsZHMuXG4gICAqL1xuICBpc1RhcHJvb3RLZXlQYXRoSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIHJldHVybiAoXG4gICAgICAhIWlucHV0LnRhcEludGVybmFsS2V5ICYmXG4gICAgICAhIWlucHV0LnRhcE1lcmtsZVJvb3QgJiZcbiAgICAgICEoXG4gICAgICAgIGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCB8fFxuICAgICAgICBpbnB1dC50YXBTY3JpcHRTaWc/Lmxlbmd0aCB8fFxuICAgICAgICBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24/LnNvbWUoKHYpID0+IHYubGVhZkhhc2hlcy5sZW5ndGgpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCBhdCBpbnB1dEluZGV4IGlzIGEgdGFwcm9vdCBzY3JpcHQgcGF0aC5cbiAgICogQ2hlY2tzIGZvciBwcmVzZW5jZSBvZiBtaW5pbXVtIHJlcXVpcmVkIHNjcmlwdCBwYXRoIGlucHV0IGZpZWxkcyBhbmQgYWJzZW5jZSBvZiBhbnkga2V5IHBhdGggb25seSBpbnB1dCBmaWVsZHMuXG4gICAqL1xuICBpc1RhcHJvb3RTY3JpcHRQYXRoSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIHJldHVybiAoXG4gICAgICAhIWlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCAmJlxuICAgICAgIShcbiAgICAgICAgdGhpcy5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgICAgICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTLFxuICAgICAgICB9KS5sZW5ndGggfHxcbiAgICAgICAgdGhpcy5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgICAgICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BVQl9OT05DRSxcbiAgICAgICAgfSkubGVuZ3RoIHx8XG4gICAgICAgIHRoaXMuZ2V0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXgsIHtcbiAgICAgICAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUFMX1NJRyxcbiAgICAgICAgfSkubGVuZ3RoXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCBhdCBpbnB1dEluZGV4IGlzIGEgdGFwcm9vdFxuICAgKi9cbiAgaXNUYXByb290SW5wdXQoaW5wdXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGNvbnN0IGlzUDJUUiA9IChzY3JpcHQ6IEJ1ZmZlcik6IGJvb2xlYW4gPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZ2V0VGFwcm9vdE91dHB1dEtleShzY3JpcHQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuICEhKFxuICAgICAgaW5wdXQudGFwSW50ZXJuYWxLZXkgfHxcbiAgICAgIGlucHV0LnRhcE1lcmtsZVJvb3QgfHxcbiAgICAgIGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCB8fFxuICAgICAgaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uPy5sZW5ndGggfHxcbiAgICAgIGlucHV0LnRhcFNjcmlwdFNpZz8ubGVuZ3RoIHx8XG4gICAgICB0aGlzLmdldFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7XG4gICAgICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUNJUEFOVF9QVUJfS0VZUyxcbiAgICAgIH0pLmxlbmd0aCB8fFxuICAgICAgdGhpcy5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgICAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUFVCX05PTkNFLFxuICAgICAgfSkubGVuZ3RoIHx8XG4gICAgICB0aGlzLmdldFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7XG4gICAgICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUFMX1NJRyxcbiAgICAgIH0pLmxlbmd0aCB8fFxuICAgICAgKGlucHV0LndpdG5lc3NVdHhvICYmIGlzUDJUUihpbnB1dC53aXRuZXNzVXR4by5zY3JpcHQpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTW9zdGx5IGNvcGllZCBmcm9tIGJpdGNvaW5qcy1saWIvdHNfc3JjL3BzYnQudHNcbiAgICovXG4gIGZpbmFsaXplQWxsSW5wdXRzKCk6IHRoaXMge1xuICAgIGNvbnN0IGlzTXVsdGlzaWdUYXByb290U2NyaXB0ID0gKHNjcmlwdDogQnVmZmVyKTogYm9vbGVhbiA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJzZVB1YlNjcmlwdDJPZjMoc2NyaXB0LCAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCcpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG4gICAgY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCAwKTsgLy8gbWFraW5nIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBvbmVcbiAgICB0aGlzLmRhdGEuaW5wdXRzLm1hcCgoaW5wdXQsIGlkeCkgPT4ge1xuICAgICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gaXNNdWx0aXNpZ1RhcHJvb3RTY3JpcHQoaW5wdXQudGFwTGVhZlNjcmlwdFswXS5zY3JpcHQpXG4gICAgICAgICAgPyB0aGlzLmZpbmFsaXplVGFwcm9vdElucHV0KGlkeClcbiAgICAgICAgICA6IHRoaXMuZmluYWxpemVUYXBJbnB1dFdpdGhTaW5nbGVMZWFmU2NyaXB0QW5kU2lnbmF0dXJlKGlkeCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUYXByb290S2V5UGF0aElucHV0KGlkeCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemVUYXByb290TXVzaWcySW5wdXQoaWR4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplSW5wdXQoaWR4KTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZpbmFsaXplVGFwcm9vdElucHV0KGlucHV0SW5kZXg6IG51bWJlcik6IHRoaXMge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICAvLyB3aXRuZXNzID0gY29udHJvbC1ibG9jayBzY3JpcHQgZmlyc3Qtc2lnIHNlY29uZC1zaWdcbiAgICBpZiAoaW5wdXQudGFwTGVhZlNjcmlwdD8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgb25lIGxlYWYgc2NyaXB0IHN1cHBvcnRlZCBmb3IgZmluYWxpemluZycpO1xuICAgIH1cbiAgICBjb25zdCB7IGNvbnRyb2xCbG9jaywgc2NyaXB0IH0gPSBpbnB1dC50YXBMZWFmU2NyaXB0WzBdO1xuICAgIGNvbnN0IHdpdG5lc3M6IEJ1ZmZlcltdID0gW3NjcmlwdCwgY29udHJvbEJsb2NrXTtcbiAgICBjb25zdCBbcHVia2V5MSwgcHVia2V5Ml0gPSBwYXJzZVB1YlNjcmlwdDJPZjMoc2NyaXB0LCAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCcpLnB1YmxpY0tleXM7XG4gICAgZm9yIChjb25zdCBwayBvZiBbcHVia2V5MSwgcHVia2V5Ml0pIHtcbiAgICAgIGNvbnN0IHNpZyA9IGlucHV0LnRhcFNjcmlwdFNpZz8uZmluZCgoeyBwdWJrZXkgfSkgPT4gcHVia2V5LmVxdWFscyhwaykpO1xuICAgICAgaWYgKCFzaWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBzaWduYXR1cmVzIGluIFNjcmlwdCBTaWcuJyk7XG4gICAgICB9XG4gICAgICB3aXRuZXNzLnVuc2hpZnQoc2lnLnNpZ25hdHVyZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2l0bmVzc0xlbmd0aCA9IHdpdG5lc3MucmVkdWNlKChzLCBiKSA9PiBzICsgYi5sZW5ndGggKyB2YXJ1aW50LmVuY29kaW5nTGVuZ3RoKGIubGVuZ3RoKSwgMSk7XG5cbiAgICBjb25zdCBidWZmZXJXcml0ZXIgPSBCdWZmZXJXcml0ZXIud2l0aENhcGFjaXR5KHdpdG5lc3NMZW5ndGgpO1xuICAgIGJ1ZmZlcldyaXRlci53cml0ZVZlY3Rvcih3aXRuZXNzKTtcbiAgICBjb25zdCBmaW5hbFNjcmlwdFdpdG5lc3MgPSBidWZmZXJXcml0ZXIuZW5kKCk7XG5cbiAgICB0aGlzLmRhdGEudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyBmaW5hbFNjcmlwdFdpdG5lc3MgfSk7XG4gICAgdGhpcy5kYXRhLmNsZWFyRmluYWxpemVkSW5wdXQoaW5wdXRJbmRleCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5hbGl6ZXMgYSB0YXByb290IG11c2lnMiBpbnB1dCBieSBhZ2dyZWdhdGluZyBhbGwgcGFydGlhbCBzaWdzLlxuICAgKiBJTVBPUlRBTlQ6IEFsd2F5cyBjYWxsIHZhbGlkYXRlKiBmdW5jdGlvbiBiZWZvcmUgZmluYWxpemluZy5cbiAgICovXG4gIGZpbmFsaXplVGFwcm9vdE11c2lnMklucHV0KGlucHV0SW5kZXg6IG51bWJlcik6IHRoaXMge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBjb25zdCBwYXJ0aWFsU2lncyA9IHBhcnNlUHNidE11c2lnMlBhcnRpYWxTaWdzKGlucHV0KTtcbiAgICBpZiAocGFydGlhbFNpZ3M/Lmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG51bWJlciBvZiBwYXJ0aWFsIHNpZ25hdHVyZXMgJHtwYXJ0aWFsU2lncyA/IHBhcnRpYWxTaWdzLmxlbmd0aCA6IDB9IHRvIGZpbmFsaXplYCk7XG4gICAgfVxuICAgIGNvbnN0IHsgcGFydGlhbFNpZ3M6IHBTaWdzLCBzaWdIYXNoVHlwZSB9ID0gZ2V0U2lnSGFzaFR5cGVGcm9tU2lncyhwYXJ0aWFsU2lncyk7XG4gICAgY29uc3QgeyBzZXNzaW9uS2V5IH0gPSB0aGlzLmdldE11c2lnMlNlc3Npb25LZXkoaW5wdXRJbmRleCwgc2lnSGFzaFR5cGUpO1xuXG4gICAgY29uc3QgYWdnU2lnID0gbXVzaWcyQWdncmVnYXRlU2lncyhcbiAgICAgIHBTaWdzLm1hcCgocFNpZykgPT4gcFNpZy5wYXJ0aWFsU2lnKSxcbiAgICAgIHNlc3Npb25LZXlcbiAgICApO1xuXG4gICAgY29uc3Qgc2lnID0gc2lnSGFzaFR5cGUgPT09IFRyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCA/IGFnZ1NpZyA6IEJ1ZmZlci5jb25jYXQoW2FnZ1NpZywgQnVmZmVyLm9mKHNpZ0hhc2hUeXBlKV0pO1xuXG4gICAgLy8gc2luZ2xlIHNpZ25hdHVyZSB3aXRoIDY0LzY1IGJ5dGVzIHNpemUgaXMgc2NyaXB0IHdpdG5lc3MgZm9yIGtleSBwYXRoIHNwZW5kXG4gICAgY29uc3QgYnVmZmVyV3JpdGVyID0gQnVmZmVyV3JpdGVyLndpdGhDYXBhY2l0eSgxICsgdmFydWludC5lbmNvZGluZ0xlbmd0aChzaWcubGVuZ3RoKSArIHNpZy5sZW5ndGgpO1xuICAgIGJ1ZmZlcldyaXRlci53cml0ZVZlY3Rvcihbc2lnXSk7XG4gICAgY29uc3QgZmluYWxTY3JpcHRXaXRuZXNzID0gYnVmZmVyV3JpdGVyLmVuZCgpO1xuXG4gICAgdGhpcy5kYXRhLnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHsgZmluYWxTY3JpcHRXaXRuZXNzIH0pO1xuICAgIHRoaXMuZGF0YS5jbGVhckZpbmFsaXplZElucHV0KGlucHV0SW5kZXgpO1xuICAgIC8vIGRlbGV0aW5nIG9ubHkgQml0R28gcHJvcHJpZXRhcnkga2V5IHZhbHVlcy5cbiAgICB0aGlzLmRlbGV0ZVByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7IGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZpbmFsaXplVGFwSW5wdXRXaXRoU2luZ2xlTGVhZlNjcmlwdEFuZFNpZ25hdHVyZShpbnB1dEluZGV4OiBudW1iZXIpOiB0aGlzIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPbmx5IG9uZSBsZWFmIHNjcmlwdCBzdXBwb3J0ZWQgZm9yIGZpbmFsaXppbmcnKTtcbiAgICB9XG4gICAgaWYgKGlucHV0LnRhcFNjcmlwdFNpZz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHNpZ25hdHVyZXMgaW4gU2NyaXB0IFNpZy4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvbnRyb2xCbG9jaywgc2NyaXB0IH0gPSBpbnB1dC50YXBMZWFmU2NyaXB0WzBdO1xuICAgIGNvbnN0IHdpdG5lc3M6IEJ1ZmZlcltdID0gW2lucHV0LnRhcFNjcmlwdFNpZ1swXS5zaWduYXR1cmUsIHNjcmlwdCwgY29udHJvbEJsb2NrXTtcbiAgICBjb25zdCB3aXRuZXNzTGVuZ3RoID0gd2l0bmVzcy5yZWR1Y2UoKHMsIGIpID0+IHMgKyBiLmxlbmd0aCArIHZhcnVpbnQuZW5jb2RpbmdMZW5ndGgoYi5sZW5ndGgpLCAxKTtcblxuICAgIGNvbnN0IGJ1ZmZlcldyaXRlciA9IEJ1ZmZlcldyaXRlci53aXRoQ2FwYWNpdHkod2l0bmVzc0xlbmd0aCk7XG4gICAgYnVmZmVyV3JpdGVyLndyaXRlVmVjdG9yKHdpdG5lc3MpO1xuICAgIGNvbnN0IGZpbmFsU2NyaXB0V2l0bmVzcyA9IGJ1ZmZlcldyaXRlci5lbmQoKTtcblxuICAgIHRoaXMuZGF0YS51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IGZpbmFsU2NyaXB0V2l0bmVzcyB9KTtcbiAgICB0aGlzLmRhdGEuY2xlYXJGaW5hbGl6ZWRJbnB1dChpbnB1dEluZGV4KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBjb3BpZWQgZnJvbSBiaXRjb2luanMtbGliL3RzX3NyYy9wc2J0LnRzXG4gICAqXG4gICAqIFVubGlrZSB0aGUgZnVuY3Rpb24gaXQgb3ZlcnJpZGVzLCB0aGlzIGRvZXMgbm90IHRha2UgYSB2YWxpZGF0b3IuIEluIEJpdEdvXG4gICAqIGNvbnRleHQsIHdlIGtub3cgaG93IHdlIHdhbnQgdG8gdmFsaWRhdGUgc28gd2UganVzdCBoYXJkIGNvZGUgdGhlIHJpZ2h0XG4gICAqIHZhbGlkYXRvci5cbiAgICovXG4gIHZhbGlkYXRlU2lnbmF0dXJlc09mQWxsSW5wdXRzKCk6IGJvb2xlYW4ge1xuICAgIGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgMCk7IC8vIG1ha2luZyBzdXJlIHdlIGhhdmUgYXQgbGVhc3Qgb25lXG4gICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZGF0YS5pbnB1dHMubWFwKChpbnB1dCwgaWR4KSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0Q29tbW9uKGlkeCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdHMucmVkdWNlKChmaW5hbCwgcmVzKSA9PiByZXMgJiYgZmluYWwsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRydWUgaWZmIGFueSBtYXRjaGluZyB2YWxpZCBzaWduYXR1cmUgaXMgZm91bmQgZm9yIGEgZGVyaXZlZCBwdWIga2V5IGZyb20gZ2l2ZW4gSEQga2V5IHBhaXIuXG4gICAqL1xuICB2YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0SEQoaW5wdXRJbmRleDogbnVtYmVyLCBoZEtleVBhaXI6IEJJUDMySW50ZXJmYWNlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGNvbnN0IHB1YktleSA9IGlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbj8ubGVuZ3RoXG4gICAgICA/IFV0eG9Qc2J0LmRlcml2ZUtleVBhaXIoaGRLZXlQYWlyLCBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24pPy5wdWJsaWNLZXlcbiAgICAgIDogaW5wdXQuYmlwMzJEZXJpdmF0aW9uPy5sZW5ndGhcbiAgICAgID8gVXR4b1BzYnQuZGVyaXZlS2V5UGFpcihoZEtleVBhaXIsIGlucHV0LmJpcDMyRGVyaXZhdGlvbik/LnB1YmxpY0tleVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFwdWJLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG5vdCBkZXJpdmUgZnJvbSBIRCBrZXkgcGFpcicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0Q29tbW9uKGlucHV0SW5kZXgsIHB1YktleSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBpZmYgYW55IHZhbGlkIHNpZ25hdHVyZShzKSBhcmUgZm91bmQgZnJvbSBiaXAzMiBkYXRhIG9mIFBTQlQgb3IgZm9yIGdpdmVuIHB1YiBrZXkuXG4gICAqL1xuICB2YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0Q29tbW9uKGlucHV0SW5kZXg6IG51bWJlciwgcHVia2V5PzogQnVmZmVyKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmlzVGFwcm9vdFNjcmlwdFBhdGhJbnB1dChpbnB1dEluZGV4KSkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVRhcHJvb3RTaWduYXR1cmVzT2ZJbnB1dChpbnB1dEluZGV4LCBwdWJrZXkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVGFwcm9vdEtleVBhdGhJbnB1dChpbnB1dEluZGV4KSkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVRhcHJvb3RNdXNpZzJTaWduYXR1cmVzT2ZJbnB1dChpbnB1dEluZGV4LCBwdWJrZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dChpbnB1dEluZGV4LCAocCwgbSwgcykgPT4gZWNjTGliLnZlcmlmeShtLCBwLCBzLCB0cnVlKSwgcHVia2V5KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIE5vdCBhbiBlbGVnYW50IHNvbHV0aW9uLiBNaWdodCBuZWVkIHVwc3RyZWFtIGNoYW5nZXMgbGlrZSBjdXN0b20gZXJyb3IgdHlwZXMuXG4gICAgICBpZiAoZXJyLm1lc3NhZ2UgPT09ICdObyBzaWduYXR1cmVzIGZvciB0aGlzIHB1YmtleScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TXVzaWcyU2Vzc2lvbktleShcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgc2lnSGFzaFR5cGU6IG51bWJlclxuICApOiB7XG4gICAgcGFydGljaXBhbnRzOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzO1xuICAgIG5vbmNlczogVHVwbGU8UHNidE11c2lnMlB1Yk5vbmNlPjtcbiAgICBoYXNoOiBCdWZmZXI7XG4gICAgc2Vzc2lvbktleTogU2Vzc2lvbktleTtcbiAgfSB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGlmICghaW5wdXQudGFwSW50ZXJuYWxLZXkgfHwgIWlucHV0LnRhcE1lcmtsZVJvb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYm90aCB0YXBJbnRlcm5hbEtleSBhbmQgdGFwTWVya2xlUm9vdCBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aWNpcGFudHMgPSB0aGlzLmdldE11c2lnMlBhcnRpY2lwYW50cyhpbnB1dEluZGV4LCBpbnB1dC50YXBJbnRlcm5hbEtleSwgaW5wdXQudGFwTWVya2xlUm9vdCk7XG4gICAgY29uc3Qgbm9uY2VzID0gdGhpcy5nZXRNdXNpZzJOb25jZXMoaW5wdXRJbmRleCwgcGFydGljaXBhbnRzKTtcblxuICAgIGNvbnN0IHsgaGFzaCB9ID0gdGhpcy5nZXRUYXByb290SGFzaEZvclNpZyhpbnB1dEluZGV4LCBbc2lnSGFzaFR5cGVdKTtcblxuICAgIGNvbnN0IHNlc3Npb25LZXkgPSBjcmVhdGVNdXNpZzJTaWduaW5nU2Vzc2lvbih7XG4gICAgICBwdWJOb25jZXM6IFtub25jZXNbMF0ucHViTm9uY2UsIG5vbmNlc1sxXS5wdWJOb25jZV0sXG4gICAgICBwdWJLZXlzOiBwYXJ0aWNpcGFudHMucGFydGljaXBhbnRQdWJLZXlzLFxuICAgICAgdHhIYXNoOiBoYXNoLFxuICAgICAgaW50ZXJuYWxQdWJLZXk6IGlucHV0LnRhcEludGVybmFsS2V5LFxuICAgICAgdGFwVHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcGFydGljaXBhbnRzLCBub25jZXMsIGhhc2gsIHNlc3Npb25LZXkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGZvciBmb2xsb3dpbmcgY2FzZXMuXG4gICAqIElmIHZhbGlkIG11c2lnMiBwYXJ0aWFsIHNpZ25hdHVyZXMgZXhpc3RzIGZvciBib3RoIDIga2V5cywgaXQgd2lsbCBhbHNvIHZlcmlmaWVzIGFnZ3JlZ2F0ZWQgc2lnXG4gICAqIGZvciBhZ2dyZWdhdGVkIHR3ZWFrZWQga2V5IChvdXRwdXQga2V5KSwgb3RoZXJ3aXNlIG9ubHkgdmVyaWZpZXMgcGFydGlhbCBzaWcuXG4gICAqIElmIHB1YmtleSBpcyBwYXNzZWQgaW4gaW5wdXQsIGl0IHdpbGwgY2hlY2sgc2lnIG9ubHkgZm9yIHRoYXQgcHVia2V5LFxuICAgKiBpZiBubyBzaWcgZXhpdHMgZm9yIHN1Y2gga2V5LCB0aHJvd3MgZXJyb3IuXG4gICAqIEZvciBpbnZhbGlkIHN0YXRlIG9mIGlucHV0IGRhdGEsIGl0IHdpbGwgdGhyb3cgZXJyb3JzLlxuICAgKi9cbiAgdmFsaWRhdGVUYXByb290TXVzaWcyU2lnbmF0dXJlc09mSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyLCBwdWJrZXk/OiBCdWZmZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgY29uc3QgcGFydGlhbFNpZ3MgPSBwYXJzZVBzYnRNdXNpZzJQYXJ0aWFsU2lncyhpbnB1dCk7XG4gICAgaWYgKCFwYXJ0aWFsU2lncykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzaWduYXR1cmVzIHRvIHZhbGlkYXRlYCk7XG4gICAgfVxuXG4gICAgbGV0IG15UGFydGlhbFNpZ3MgPSBwYXJ0aWFsU2lncztcbiAgICBpZiAocHVia2V5KSB7XG4gICAgICBjaGVja1BsYWluUHVibGljS2V5KHB1YmtleSk7XG4gICAgICBteVBhcnRpYWxTaWdzID0gcGFydGlhbFNpZ3MuZmlsdGVyKChrdikgPT4ga3YucGFydGljaXBhbnRQdWJLZXkuZXF1YWxzKHB1YmtleSkpO1xuICAgICAgaWYgKG15UGFydGlhbFNpZ3M/Lmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzaWduYXR1cmVzIGZvciB0aGlzIHB1YmtleScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgcGFydGlhbFNpZ3M6IG15U2lncywgc2lnSGFzaFR5cGUgfSA9IGdldFNpZ0hhc2hUeXBlRnJvbVNpZ3MobXlQYXJ0aWFsU2lncyk7XG4gICAgY29uc3QgeyBwYXJ0aWNpcGFudHMsIG5vbmNlcywgaGFzaCwgc2Vzc2lvbktleSB9ID0gdGhpcy5nZXRNdXNpZzJTZXNzaW9uS2V5KGlucHV0SW5kZXgsIHNpZ0hhc2hUeXBlKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBteVNpZ3MubWFwKChteVNpZykgPT4ge1xuICAgICAgY29uc3QgbXlOb25jZSA9IG5vbmNlcy5maW5kKChrdikgPT4ga3YucGFydGljaXBhbnRQdWJLZXkuZXF1YWxzKG15U2lnLnBhcnRpY2lwYW50UHViS2V5KSk7XG4gICAgICBpZiAoIW15Tm9uY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBubyBwdWIgbm9uY2UgZm9yIHB1YmtleScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG11c2lnMlBhcnRpYWxTaWdWZXJpZnkobXlTaWcucGFydGlhbFNpZywgbXlTaWcucGFydGljaXBhbnRQdWJLZXksIG15Tm9uY2UucHViTm9uY2UsIHNlc3Npb25LZXkpO1xuICAgIH0pO1xuXG4gICAgLy8gRm9yIHZhbGlkIHNpbmdsZSBzaWcgb3IgMSBvciAyIGZhaWx1cmUgc2lncywgbm8gbmVlZCB0byB2YWxpZGF0ZSBhZ2dyZWdhdGVkIHNpZy4gU28gc2tpcC5cbiAgICBjb25zdCByZXN1bHQgPSByZXN1bHRzLmV2ZXJ5KChyZXMpID0+IHJlcyk7XG4gICAgaWYgKCFyZXN1bHQgfHwgbXlTaWdzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgYWdnU2lnID0gbXVzaWcyQWdncmVnYXRlU2lncyhcbiAgICAgIG15U2lncy5tYXAoKG15U2lnKSA9PiBteVNpZy5wYXJ0aWFsU2lnKSxcbiAgICAgIHNlc3Npb25LZXlcbiAgICApO1xuXG4gICAgcmV0dXJuIGVjY0xpYi52ZXJpZnlTY2hub3JyKGhhc2gsIHBhcnRpY2lwYW50cy50YXBPdXRwdXRLZXksIGFnZ1NpZyk7XG4gIH1cblxuICB2YWxpZGF0ZVRhcHJvb3RTaWduYXR1cmVzT2ZJbnB1dChpbnB1dEluZGV4OiBudW1iZXIsIHB1YmtleT86IEJ1ZmZlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5kYXRhLmlucHV0c1tpbnB1dEluZGV4XTtcbiAgICBjb25zdCB0YXBTaWdzID0gKGlucHV0IHx8IHt9KS50YXBTY3JpcHRTaWc7XG4gICAgaWYgKCFpbnB1dCB8fCAhdGFwU2lncyB8fCB0YXBTaWdzLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc2lnbmF0dXJlcyB0byB2YWxpZGF0ZScpO1xuICAgIH1cbiAgICBsZXQgbXlTaWdzO1xuICAgIGlmIChwdWJrZXkpIHtcbiAgICAgIGNvbnN0IHhPbmx5UHVia2V5ID0gdG9YT25seVB1YmxpY0tleShwdWJrZXkpO1xuICAgICAgbXlTaWdzID0gdGFwU2lncy5maWx0ZXIoKHNpZykgPT4gc2lnLnB1YmtleS5lcXVhbHMoeE9ubHlQdWJrZXkpKTtcbiAgICAgIGlmIChteVNpZ3MubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNpZ25hdHVyZXMgZm9yIHRoaXMgcHVia2V5Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG15U2lncyA9IHRhcFNpZ3M7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHM6IGJvb2xlYW5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBwU2lnIG9mIG15U2lncykge1xuICAgICAgY29uc3QgeyBzaWduYXR1cmUsIGxlYWZIYXNoLCBwdWJrZXkgfSA9IHBTaWc7XG4gICAgICBsZXQgc2lnSGFzaFR5cGU6IG51bWJlcjtcbiAgICAgIGxldCBzaWc6IEJ1ZmZlcjtcbiAgICAgIGlmIChzaWduYXR1cmUubGVuZ3RoID09PSA2NSkge1xuICAgICAgICBzaWdIYXNoVHlwZSA9IHNpZ25hdHVyZVs2NF07XG4gICAgICAgIHNpZyA9IHNpZ25hdHVyZS5zbGljZSgwLCA2NCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaWdIYXNoVHlwZSA9IFRyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVDtcbiAgICAgICAgc2lnID0gc2lnbmF0dXJlO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBoYXNoIH0gPSB0aGlzLmdldFRhcHJvb3RIYXNoRm9yU2lnKGlucHV0SW5kZXgsIFtzaWdIYXNoVHlwZV0sIGxlYWZIYXNoKTtcbiAgICAgIHJlc3VsdHMucHVzaChlY2NMaWIudmVyaWZ5U2Nobm9ycihoYXNoLCBwdWJrZXksIHNpZykpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cy5ldmVyeSgocmVzKSA9PiByZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBpbnB1dEluZGV4XG4gICAqIEBwYXJhbSByb290Tm9kZXMgb3B0aW9uYWwgaW5wdXQgcm9vdCBiaXAzMiBub2RlcyB0byB2ZXJpZnkgd2l0aC4gSWYgaXQgaXMgbm90IHByb3ZpZGVkLCBnbG9iYWxYcHViIHdpbGwgYmUgdXNlZC5cbiAgICogQHJldHVybiBhcnJheSBvZiBib29sZWFuIHZhbHVlcy4gVHJ1ZSB3aGVuIGNvcnJlc3BvbmRpbmcgaW5kZXggaW4gYHB1YmxpY0tleXNgIGhhcyBzaWduZWQgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBJZiBubyBzaWduYXR1cmUgaW4gdGhlIHR4IG9yIG5vIHB1YmxpYyBrZXkgbWF0Y2hpbmcgc2lnbmF0dXJlLCB0aGUgdmFsaWRhdGlvbiBpcyBjb25zaWRlcmVkIGFzIGZhbHNlLlxuICAgKi9cbiAgZ2V0U2lnbmF0dXJlVmFsaWRhdGlvbkFycmF5KFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICB7IHJvb3ROb2RlcyB9OiB7IHJvb3ROb2Rlcz86IFRyaXBsZTxCSVAzMkludGVyZmFjZT4gfSA9IHt9XG4gICk6IFRyaXBsZTxib29sZWFuPiB7XG4gICAgaWYgKCFyb290Tm9kZXMgJiYgKCF0aGlzLmRhdGEuZ2xvYmFsTWFwLmdsb2JhbFhwdWI/Lmxlbmd0aCB8fCAhaXNUcmlwbGUodGhpcy5kYXRhLmdsb2JhbE1hcC5nbG9iYWxYcHViKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCBzaWduYXR1cmUgdmFsaWRhdGlvbiBhcnJheSB3aXRob3V0IDMgZ2xvYmFsIHhwdWJzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYmlwMzJzID0gcm9vdE5vZGVzXG4gICAgICA/IHJvb3ROb2Rlc1xuICAgICAgOiB0aGlzLmRhdGEuZ2xvYmFsTWFwLmdsb2JhbFhwdWI/Lm1hcCgoeHB1YikgPT5cbiAgICAgICAgICBCSVAzMkZhY3RvcnkoZWNjTGliKS5mcm9tQmFzZTU4KGJzNThjaGVjay5lbmNvZGUoeHB1Yi5leHRlbmRlZFB1YmtleSkpXG4gICAgICAgICk7XG5cbiAgICBpZiAoIWJpcDMycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlaXRoZXIgZ2xvYmFsTWFwIG9yIHJvb3ROb2RlcyBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoIWdldFBzYnRJbnB1dFNpZ25hdHVyZUNvdW50KGlucHV0KSkge1xuICAgICAgcmV0dXJuIFtmYWxzZSwgZmFsc2UsIGZhbHNlXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmlwMzJzLm1hcCgoYmlwMzIpID0+IHtcbiAgICAgIGNvbnN0IHB1YktleSA9IGlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbj8ubGVuZ3RoXG4gICAgICAgID8gVXR4b1BzYnQuZGVyaXZlS2V5UGFpcihiaXAzMiwgaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uKT8ucHVibGljS2V5XG4gICAgICAgIDogaW5wdXQuYmlwMzJEZXJpdmF0aW9uPy5sZW5ndGhcbiAgICAgICAgPyBVdHhvUHNidC5kZXJpdmVLZXlQYWlyKGJpcDMyLCBpbnB1dC5iaXAzMkRlcml2YXRpb24pPy5wdWJsaWNLZXlcbiAgICAgICAgOiBiaXAzMj8ucHVibGljS2V5O1xuICAgICAgaWYgKCFwdWJLZXkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dENvbW1vbihpbnB1dEluZGV4LCBwdWJLZXkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIE5vdCBhbiBlbGVnYW50IHNvbHV0aW9uLiBNaWdodCBuZWVkIHVwc3RyZWFtIGNoYW5nZXMgbGlrZSBjdXN0b20gZXJyb3IgdHlwZXMuXG4gICAgICAgIGlmIChlcnIubWVzc2FnZSA9PT0gJ05vIHNpZ25hdHVyZXMgZm9yIHRoaXMgcHVia2V5Jykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfSkgYXMgVHJpcGxlPGJvb2xlYW4+O1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBjb3BpZWQgZnJvbSBiaXRjb2luanMtbGliL3RzX3NyYy9wc2J0LnRzXG4gICAqL1xuICBzaWduQWxsSW5wdXRzSEQoXG4gICAgaGRLZXlQYWlyOiBIRFRhcHJvb3RTaWduZXIgfCBIRFRhcHJvb3RNdXNpZzJTaWduZXIsXG4gICAgcGFyYW1zOiBudW1iZXJbXSB8IFBhcnRpYWw8U2lnbmF0dXJlUGFyYW1zPiA9IGRlZmF1bHRTaWduYXR1cmVQYXJhbXNcbiAgKTogdGhpcyB7XG4gICAgaWYgKCFoZEtleVBhaXIgfHwgIWhkS2V5UGFpci5wdWJsaWNLZXkgfHwgIWhkS2V5UGFpci5maW5nZXJwcmludCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIEhEU2lnbmVyIHRvIHNpZ24gaW5wdXQnKTtcbiAgICB9XG4gICAgY29uc3QgeyBzaWdoYXNoVHlwZXMsIGRldGVybWluaXN0aWMgfSA9IHRvU2lnbmF0dXJlUGFyYW1zKHBhcmFtcyk7XG5cbiAgICBjb25zdCByZXN1bHRzOiBib29sZWFuW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5pbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc2lnbklucHV0SEQoaSwgaGRLZXlQYWlyLCB7IHNpZ2hhc2hUeXBlcywgZGV0ZXJtaW5pc3RpYyB9KTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHRydWUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlc3VsdHMucHVzaChmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXN1bHRzLmV2ZXJ5KCh2KSA9PiAhdikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gaW5wdXRzIHdlcmUgc2lnbmVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBjb3BpZWQgZnJvbSBiaXRjb2luanMtbGliL3RzX3NyYy9wc2J0LnRzOnNpZ25JbnB1dEhEXG4gICAqL1xuICBzaWduVGFwcm9vdElucHV0SEQoXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIGhkS2V5UGFpcjogSERUYXByb290U2lnbmVyIHwgSERUYXByb290TXVzaWcyU2lnbmVyLFxuICAgIHsgc2lnaGFzaFR5cGVzID0gW1RyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCwgVHJhbnNhY3Rpb24uU0lHSEFTSF9BTExdLCBkZXRlcm1pbmlzdGljID0gZmFsc2UgfSA9IHt9XG4gICk6IHRoaXMge1xuICAgIGlmICghdGhpcy5pc1RhcHJvb3RJbnB1dChpbnB1dEluZGV4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgYSB0YXByb290IGlucHV0Jyk7XG4gICAgfVxuICAgIGlmICghaGRLZXlQYWlyIHx8ICFoZEtleVBhaXIucHVibGljS2V5IHx8ICFoZEtleVBhaXIuZmluZ2VycHJpbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmVlZCBIRFNpZ25lciB0byBzaWduIGlucHV0Jyk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoIWlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbiB8fCBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgdGFwQmlwMzJEZXJpdmF0aW9uIHRvIHNpZ24gVGFwcm9vdCB3aXRoIEhEJyk7XG4gICAgfVxuICAgIGNvbnN0IG15RGVyaXZhdGlvbnMgPSBpbnB1dC50YXBCaXAzMkRlcml2YXRpb25cbiAgICAgIC5tYXAoKGJpcER2KSA9PiB7XG4gICAgICAgIGlmIChiaXBEdi5tYXN0ZXJGaW5nZXJwcmludC5lcXVhbHMoaGRLZXlQYWlyLmZpbmdlcnByaW50KSkge1xuICAgICAgICAgIHJldHVybiBiaXBEdjtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKHYpID0+ICEhdikgYXMgVGFwQmlwMzJEZXJpdmF0aW9uW107XG4gICAgaWYgKG15RGVyaXZhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgb25lIHRhcEJpcDMyRGVyaXZhdGlvbiBtYXN0ZXJGaW5nZXJwcmludCB0byBtYXRjaCB0aGUgSERTaWduZXIgZmluZ2VycHJpbnQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXREZXJpdmVkTm9kZShiaXBEdjogVGFwQmlwMzJEZXJpdmF0aW9uKTogSERUYXByb290TXVzaWcyU2lnbmVyIHwgSERUYXByb290U2lnbmVyIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBoZEtleVBhaXIuZGVyaXZlUGF0aChiaXBEdi5wYXRoKTtcbiAgICAgIGlmICghYmlwRHYucHVia2V5LmVxdWFscyhub2RlLnB1YmxpY0tleS5zbGljZSgxKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwdWJrZXkgZGlkIG5vdCBtYXRjaCB0YXBCaXAzMkRlcml2YXRpb24nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGlmIChpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHNpZ25lcnM6IFRhcHJvb3RTaWduZXJbXSA9IG15RGVyaXZhdGlvbnMubWFwKChiaXBEdikgPT4ge1xuICAgICAgICBjb25zdCBzaWduZXIgPSBnZXREZXJpdmVkTm9kZShiaXBEdik7XG4gICAgICAgIGlmICghKCdzaWduU2Nobm9ycicgaW4gc2lnbmVyKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnblNjaG5vcnIgZnVuY3Rpb24gaXMgcmVxdWlyZWQgdG8gc2lnbiBwMnRyJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc2lnbmVyLCBsZWFmSGFzaGVzOiBiaXBEdi5sZWFmSGFzaGVzIH07XG4gICAgICB9KTtcbiAgICAgIHNpZ25lcnMuZm9yRWFjaCgoeyBzaWduZXIsIGxlYWZIYXNoZXMgfSkgPT4gdGhpcy5zaWduVGFwcm9vdElucHV0KGlucHV0SW5kZXgsIHNpZ25lciwgbGVhZkhhc2hlcywgc2lnaGFzaFR5cGVzKSk7XG4gICAgfSBlbHNlIGlmIChpbnB1dC50YXBJbnRlcm5hbEtleT8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBzaWduZXJzOiBNdXNpZzJTaWduZXJbXSA9IG15RGVyaXZhdGlvbnMubWFwKChiaXBEdikgPT4ge1xuICAgICAgICBjb25zdCBzaWduZXIgPSBnZXREZXJpdmVkTm9kZShiaXBEdik7XG4gICAgICAgIGlmICghKCdwcml2YXRlS2V5JyBpbiBzaWduZXIpIHx8ICFzaWduZXIucHJpdmF0ZUtleSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncHJpdmF0ZUtleSBpcyByZXF1aXJlZCB0byBzaWduIHAydHIgbXVzaWcyJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpZ25lcjtcbiAgICAgIH0pO1xuICAgICAgc2lnbmVycy5mb3JFYWNoKChzaWduZXIpID0+IHRoaXMuc2lnblRhcHJvb3RNdXNpZzJJbnB1dChpbnB1dEluZGV4LCBzaWduZXIsIHsgc2lnaGFzaFR5cGVzLCBkZXRlcm1pbmlzdGljIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzaWduSW5wdXRIRChcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgaGRLZXlQYWlyOiBIRFRhcHJvb3RTaWduZXIgfCBIRFRhcHJvb3RNdXNpZzJTaWduZXIsXG4gICAgcGFyYW1zOiBudW1iZXJbXSB8IFBhcnRpYWw8U2lnbmF0dXJlUGFyYW1zPiA9IGRlZmF1bHRTaWduYXR1cmVQYXJhbXNcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgeyBzaWdoYXNoVHlwZXMsIGRldGVybWluaXN0aWMgfSA9IHRvU2lnbmF0dXJlUGFyYW1zKHBhcmFtcyk7XG4gICAgaWYgKHRoaXMuaXNUYXByb290SW5wdXQoaW5wdXRJbmRleCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpZ25UYXByb290SW5wdXRIRChpbnB1dEluZGV4LCBoZEtleVBhaXIsIHsgc2lnaGFzaFR5cGVzLCBkZXRlcm1pbmlzdGljIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3VwZXIuc2lnbklucHV0SEQoaW5wdXRJbmRleCwgaGRLZXlQYWlyLCBzaWdoYXNoVHlwZXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TXVzaWcyUGFydGljaXBhbnRzKGlucHV0SW5kZXg6IG51bWJlciwgdGFwSW50ZXJuYWxLZXk6IEJ1ZmZlciwgdGFwTWVya2xlUm9vdDogQnVmZmVyKSB7XG4gICAgY29uc3QgcGFydGljaXBhbnRzS2V5VmFsRGF0YSA9IHBhcnNlUHNidE11c2lnMlBhcnRpY2lwYW50cyh0aGlzLmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdKTtcbiAgICBpZiAoIXBhcnRpY2lwYW50c0tleVZhbERhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgMCBtYXRjaGluZyBwYXJ0aWNpcGFudCBrZXkgdmFsdWUgaW5zdGVhZCBvZiAxYCk7XG4gICAgfVxuICAgIGFzc2VydFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMocGFydGljaXBhbnRzS2V5VmFsRGF0YSwgdGFwSW50ZXJuYWxLZXksIHRhcE1lcmtsZVJvb3QpO1xuICAgIHJldHVybiBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNdXNpZzJOb25jZXMoaW5wdXRJbmRleDogbnVtYmVyLCBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzKSB7XG4gICAgY29uc3Qgbm9uY2VzS2V5VmFsc0RhdGEgPSBwYXJzZVBzYnRNdXNpZzJOb25jZXModGhpcy5kYXRhLmlucHV0c1tpbnB1dEluZGV4XSk7XG4gICAgaWYgKCFub25jZXNLZXlWYWxzRGF0YSB8fCAhaXNUdXBsZShub25jZXNLZXlWYWxzRGF0YSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZvdW5kICR7bm9uY2VzS2V5VmFsc0RhdGE/Lmxlbmd0aCA/IG5vbmNlc0tleVZhbHNEYXRhLmxlbmd0aCA6IDB9IG1hdGNoaW5nIG5vbmNlIGtleSB2YWx1ZSBpbnN0ZWFkIG9mIDJgXG4gICAgICApO1xuICAgIH1cbiAgICBhc3NlcnRQc2J0TXVzaWcyTm9uY2VzKG5vbmNlc0tleVZhbHNEYXRhLCBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhKTtcbiAgICByZXR1cm4gbm9uY2VzS2V5VmFsc0RhdGE7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgcDJ0ciBtdXNpZzIga2V5IHBhdGggaW5wdXQgd2l0aCAyIGFnZ3JlZ2F0ZWQga2V5cy5cbiAgICpcbiAgICogTm90ZTogT25seSBjYW4gc2lnbiBkZXRlcm1pbmlzdGljYWxseSBhcyB0aGUgY29zaWduZXJcbiAgICogQHBhcmFtIGlucHV0SW5kZXhcbiAgICogQHBhcmFtIHNpZ25lciAtIFhZIHB1YmxpYyBrZXkgYW5kIHByaXZhdGUga2V5IGFyZSByZXF1aXJlZFxuICAgKiBAcGFyYW0gc2lnaGFzaFR5cGVzXG4gICAqIEBwYXJhbSBkZXRlcm1pbmlzdGljIElmIHRydWUsIHNpZ24gdGhlIG11c2lnIGlucHV0IGRldGVybWluaXN0aWNhbGx5XG4gICAqL1xuICBzaWduVGFwcm9vdE11c2lnMklucHV0KFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBzaWduZXI6IE11c2lnMlNpZ25lcixcbiAgICB7IHNpZ2hhc2hUeXBlcyA9IFtUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQsIFRyYW5zYWN0aW9uLlNJR0hBU0hfQUxMXSwgZGV0ZXJtaW5pc3RpYyA9IGZhbHNlIH0gPSB7fVxuICApOiB0aGlzIHtcbiAgICBpZiAoIXRoaXMuaXNUYXByb290S2V5UGF0aElucHV0KGlucHV0SW5kZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhIHRhcHJvb3QgbXVzaWcyIGlucHV0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdO1xuXG4gICAgaWYgKCFpbnB1dC50YXBJbnRlcm5hbEtleSB8fCAhaW5wdXQudGFwTWVya2xlUm9vdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIGlucHV0IGRhdGEnKTtcbiAgICB9XG5cbiAgICAvLyBSZXRyaWV2ZSBhbmQgY2hlY2sgdGhhdCB3ZSBoYXZlIHR3byBwYXJ0aWNpcGFudCBub25jZXNcbiAgICBjb25zdCBwYXJ0aWNpcGFudHMgPSB0aGlzLmdldE11c2lnMlBhcnRpY2lwYW50cyhpbnB1dEluZGV4LCBpbnB1dC50YXBJbnRlcm5hbEtleSwgaW5wdXQudGFwTWVya2xlUm9vdCk7XG4gICAgY29uc3QgeyB0YXBPdXRwdXRLZXksIHBhcnRpY2lwYW50UHViS2V5cyB9ID0gcGFydGljaXBhbnRzO1xuICAgIGNvbnN0IHNpZ25lclB1YktleSA9IHBhcnRpY2lwYW50UHViS2V5cy5maW5kKChwdWJLZXkpID0+IHB1YktleS5lcXVhbHMoc2lnbmVyLnB1YmxpY0tleSkpO1xuICAgIGlmICghc2lnbmVyUHViS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lciBwdWIga2V5IHNob3VsZCBtYXRjaCBvbmUgb2YgcGFydGljaXBhbnQgcHViIGtleXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBub25jZXMgPSB0aGlzLmdldE11c2lnMk5vbmNlcyhpbnB1dEluZGV4LCBwYXJ0aWNpcGFudHMpO1xuICAgIGNvbnN0IHsgaGFzaCwgc2lnaGFzaFR5cGUgfSA9IHRoaXMuZ2V0VGFwcm9vdEhhc2hGb3JTaWcoaW5wdXRJbmRleCwgc2lnaGFzaFR5cGVzKTtcblxuICAgIGxldCBwYXJ0aWFsU2lnOiBCdWZmZXI7XG4gICAgaWYgKGRldGVybWluaXN0aWMpIHtcbiAgICAgIGlmICghc2lnbmVyUHViS2V5LmVxdWFscyhwYXJ0aWNpcGFudFB1YktleXNbMV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG9ubHkgYWRkIGEgZGV0ZXJtaW5pc3RpYyBzaWduYXR1cmUgb24gdGhlIGNvc2lnbmVyJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpcnN0U2lnbmVyTm9uY2UgPSBub25jZXMuZmluZCgobikgPT4gbi5wYXJ0aWNpcGFudFB1YktleS5lcXVhbHMocGFydGljaXBhbnRQdWJLZXlzWzBdKSk7XG4gICAgICBpZiAoIWZpcnN0U2lnbmVyTm9uY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZmluZCB0aGUgdXNlciBub25jZScpO1xuICAgICAgfVxuXG4gICAgICBwYXJ0aWFsU2lnID0gbXVzaWcyRGV0ZXJtaW5pc3RpY1NpZ24oe1xuICAgICAgICBwcml2YXRlS2V5OiBzaWduZXIucHJpdmF0ZUtleSxcbiAgICAgICAgb3RoZXJOb25jZTogZmlyc3RTaWduZXJOb25jZS5wdWJOb25jZSxcbiAgICAgICAgcHVibGljS2V5czogcGFydGljaXBhbnRQdWJLZXlzLFxuICAgICAgICBpbnRlcm5hbFB1YktleTogaW5wdXQudGFwSW50ZXJuYWxLZXksXG4gICAgICAgIHRhcFRyZWVSb290OiBpbnB1dC50YXBNZXJrbGVSb290LFxuICAgICAgICBoYXNoLFxuICAgICAgfSkuc2lnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZXNzaW9uS2V5ID0gY3JlYXRlTXVzaWcyU2lnbmluZ1Nlc3Npb24oe1xuICAgICAgICBwdWJOb25jZXM6IFtub25jZXNbMF0ucHViTm9uY2UsIG5vbmNlc1sxXS5wdWJOb25jZV0sXG4gICAgICAgIHB1YktleXM6IHBhcnRpY2lwYW50UHViS2V5cyxcbiAgICAgICAgdHhIYXNoOiBoYXNoLFxuICAgICAgICBpbnRlcm5hbFB1YktleTogaW5wdXQudGFwSW50ZXJuYWxLZXksXG4gICAgICAgIHRhcFRyZWVSb290OiBpbnB1dC50YXBNZXJrbGVSb290LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNpZ25lck5vbmNlID0gbm9uY2VzLmZpbmQoKGt2KSA9PiBrdi5wYXJ0aWNpcGFudFB1YktleS5lcXVhbHMoc2lnbmVyUHViS2V5KSk7XG4gICAgICBpZiAoIXNpZ25lck5vbmNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncHViTm9uY2UgaXMgbWlzc2luZy4gcmV0cnkgc2lnbmluZyBwcm9jZXNzJyk7XG4gICAgICB9XG4gICAgICBwYXJ0aWFsU2lnID0gbXVzaWcyUGFydGlhbFNpZ24oc2lnbmVyLnByaXZhdGVLZXksIHNpZ25lck5vbmNlLnB1Yk5vbmNlLCBzZXNzaW9uS2V5LCB0aGlzLm5vbmNlU3RvcmUpO1xuICAgIH1cblxuICAgIGlmIChzaWdoYXNoVHlwZSAhPT0gVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxUKSB7XG4gICAgICBwYXJ0aWFsU2lnID0gQnVmZmVyLmNvbmNhdChbcGFydGlhbFNpZywgQnVmZmVyLm9mKHNpZ2hhc2hUeXBlKV0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZyA9IGVuY29kZVBzYnRNdXNpZzJQYXJ0aWFsU2lnKHtcbiAgICAgIHBhcnRpY2lwYW50UHViS2V5OiBzaWduZXJQdWJLZXksXG4gICAgICB0YXBPdXRwdXRLZXksXG4gICAgICBwYXJ0aWFsU2lnOiBwYXJ0aWFsU2lnLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkUHJvcHJpZXRhcnlLZXlWYWxUb0lucHV0KGlucHV0SW5kZXgsIHNpZyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzaWduVGFwcm9vdElucHV0KFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBzaWduZXI6IFNjaG5vcnJTaWduZXIsXG4gICAgbGVhZkhhc2hlczogQnVmZmVyW10sXG4gICAgc2lnaGFzaFR5cGVzOiBudW1iZXJbXSA9IFtUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQsIFRyYW5zYWN0aW9uLlNJR0hBU0hfQUxMXVxuICApOiB0aGlzIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgLy8gRmlndXJlIG91dCBpZiB0aGlzIGlzIHNjcmlwdCBwYXRoIG9yIG5vdCwgaWYgbm90LCB0d2VhayB0aGUgcHJpdmF0ZSBrZXlcbiAgICBpZiAoIWlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0YXBMZWFmU2NyaXB0IGlzIHJlcXVpcmVkIGZvciBwMnRyIHNjcmlwdCBwYXRoJyk7XG4gICAgfVxuICAgIGNvbnN0IHB1YmtleSA9IHRvWE9ubHlQdWJsaWNLZXkoc2lnbmVyLnB1YmxpY0tleSk7XG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgb25lIGxlYWYgc2NyaXB0IHN1cHBvcnRlZCBmb3Igc2lnbmluZycpO1xuICAgIH1cbiAgICBjb25zdCB0YXBMZWFmU2NyaXB0ID0gaW5wdXQudGFwTGVhZlNjcmlwdFswXTtcbiAgICBjb25zdCBwYXJzZWRDb250cm9sQmxvY2sgPSB0YXByb290LnBhcnNlQ29udHJvbEJsb2NrKGVjY0xpYiwgdGFwTGVhZlNjcmlwdC5jb250cm9sQmxvY2spO1xuICAgIGNvbnN0IHsgbGVhZlZlcnNpb24gfSA9IHBhcnNlZENvbnRyb2xCbG9jaztcbiAgICBpZiAobGVhZlZlcnNpb24gIT09IHRhcExlYWZTY3JpcHQubGVhZlZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGFwIHNjcmlwdCBsZWFmIHZlcnNpb24gbWlzbWF0Y2ggd2l0aCBjb250cm9sIGJsb2NrJyk7XG4gICAgfVxuICAgIGNvbnN0IGxlYWZIYXNoID0gdGFwcm9vdC5nZXRUYXBsZWFmSGFzaChlY2NMaWIsIHBhcnNlZENvbnRyb2xCbG9jaywgdGFwTGVhZlNjcmlwdC5zY3JpcHQpO1xuICAgIGlmICghbGVhZkhhc2hlcy5maW5kKChsKSA9PiBsLmVxdWFscyhsZWFmSGFzaCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNpZ25lciBjYW5ub3Qgc2lnbiBmb3IgbGVhZiBoYXNoICR7bGVhZkhhc2gudG9TdHJpbmcoJ2hleCcpfWApO1xuICAgIH1cbiAgICBjb25zdCB7IGhhc2gsIHNpZ2hhc2hUeXBlIH0gPSB0aGlzLmdldFRhcHJvb3RIYXNoRm9yU2lnKGlucHV0SW5kZXgsIHNpZ2hhc2hUeXBlcywgbGVhZkhhc2gpO1xuICAgIGxldCBzaWduYXR1cmUgPSBzaWduZXIuc2lnblNjaG5vcnIoaGFzaCk7XG4gICAgaWYgKHNpZ2hhc2hUeXBlICE9PSBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQpIHtcbiAgICAgIHNpZ25hdHVyZSA9IEJ1ZmZlci5jb25jYXQoW3NpZ25hdHVyZSwgQnVmZmVyLm9mKHNpZ2hhc2hUeXBlKV0pO1xuICAgIH1cbiAgICB0aGlzLmRhdGEudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgdGFwU2NyaXB0U2lnOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwdWJrZXksXG4gICAgICAgICAgc2lnbmF0dXJlLFxuICAgICAgICAgIGxlYWZIYXNoLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFwcm9vdE91dHB1dFNjcmlwdChpbnB1dEluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRhcHJvb3QuY3JlYXRlVGFwcm9vdE91dHB1dFNjcmlwdCh7XG4gICAgICAgIGNvbnRyb2xCbG9jazogaW5wdXQudGFwTGVhZlNjcmlwdFswXS5jb250cm9sQmxvY2ssXG4gICAgICAgIGxlYWZTY3JpcHQ6IGlucHV0LnRhcExlYWZTY3JpcHRbMF0uc2NyaXB0LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpbnB1dC50YXBJbnRlcm5hbEtleSAmJiBpbnB1dC50YXBNZXJrbGVSb290KSB7XG4gICAgICByZXR1cm4gdGFwcm9vdC5jcmVhdGVUYXByb290T3V0cHV0U2NyaXB0KHtcbiAgICAgICAgaW50ZXJuYWxQdWJLZXk6IGlucHV0LnRhcEludGVybmFsS2V5LFxuICAgICAgICB0YXB0cmVlUm9vdDogaW5wdXQudGFwTWVya2xlUm9vdCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhIHRhcHJvb3QgaW5wdXQnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFwcm9vdEhhc2hGb3JTaWcoXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIHNpZ2hhc2hUeXBlcz86IG51bWJlcltdLFxuICAgIGxlYWZIYXNoPzogQnVmZmVyXG4gICk6IHtcbiAgICBoYXNoOiBCdWZmZXI7XG4gICAgc2lnaGFzaFR5cGU6IG51bWJlcjtcbiAgfSB7XG4gICAgaWYgKCF0aGlzLmlzVGFwcm9vdElucHV0KGlucHV0SW5kZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhIHRhcHJvb3QgaW5wdXQnKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnaGFzaFR5cGUgPSB0aGlzLmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdLnNpZ2hhc2hUeXBlIHx8IFRyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVDtcbiAgICBpZiAoc2lnaGFzaFR5cGVzICYmIHNpZ2hhc2hUeXBlcy5pbmRleE9mKHNpZ2hhc2hUeXBlKSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFNpZ2hhc2ggdHlwZSBpcyBub3QgYWxsb3dlZC4gUmV0cnkgdGhlIHNpZ24gbWV0aG9kIHBhc3NpbmcgdGhlIGAgK1xuICAgICAgICAgIGBzaWdoYXNoVHlwZXMgYXJyYXkgb2Ygd2hpdGVsaXN0ZWQgdHlwZXMuIFNpZ2hhc2ggdHlwZTogJHtzaWdoYXNoVHlwZX1gXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB0eElucHV0cyA9IHRoaXMudHhJbnB1dHM7IC8vIFRoZXNlIGFyZSBzb21ld2hhdCBjb3N0bHkgdG8gZXh0cmFjdFxuICAgIGNvbnN0IHByZXZvdXRTY3JpcHRzOiBCdWZmZXJbXSA9IFtdO1xuICAgIGNvbnN0IHByZXZvdXRWYWx1ZXM6IGJpZ2ludFtdID0gW107XG5cbiAgICB0aGlzLmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0LCBpKSA9PiB7XG4gICAgICBsZXQgcHJldm91dDtcbiAgICAgIGlmIChpbnB1dC5ub25XaXRuZXNzVXR4bykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNvdWxkIGJlIGNvc3RseSwgZWl0aGVyIGNhY2hlIGl0IGhlcmUsIG9yIGZpbmQgYSB3YXkgdG8gc2hhcmUgd2l0aCBzdXBlclxuICAgICAgICBjb25zdCBub25XaXRuZXNzVXR4b1R4ID0gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFV0eG9Qc2J0KS50cmFuc2FjdGlvbkZyb21CdWZmZXIoXG4gICAgICAgICAgaW5wdXQubm9uV2l0bmVzc1V0eG8sXG4gICAgICAgICAgdGhpcy50eC5uZXR3b3JrXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcHJldm91dEhhc2ggPSB0eElucHV0c1tpXS5oYXNoO1xuICAgICAgICBjb25zdCB1dHhvSGFzaCA9IG5vbldpdG5lc3NVdHhvVHguZ2V0SGFzaCgpO1xuXG4gICAgICAgIC8vIElmIGEgbm9uLXdpdG5lc3MgVVRYTyBpcyBwcm92aWRlZCwgaXRzIGhhc2ggbXVzdCBtYXRjaCB0aGUgaGFzaCBzcGVjaWZpZWQgaW4gdGhlIHByZXZvdXRcbiAgICAgICAgaWYgKCFwcmV2b3V0SGFzaC5lcXVhbHModXR4b0hhc2gpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb24td2l0bmVzcyBVVFhPIGhhc2ggZm9yIGlucHV0ICMke2l9IGRvZXNuJ3QgbWF0Y2ggdGhlIGhhc2ggc3BlY2lmaWVkIGluIHRoZSBwcmV2b3V0YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmV2b3V0SW5kZXggPSB0eElucHV0c1tpXS5pbmRleDtcbiAgICAgICAgcHJldm91dCA9IG5vbldpdG5lc3NVdHhvVHgub3V0c1twcmV2b3V0SW5kZXhdO1xuICAgICAgfSBlbHNlIGlmIChpbnB1dC53aXRuZXNzVXR4bykge1xuICAgICAgICBwcmV2b3V0ID0gaW5wdXQud2l0bmVzc1V0eG87XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgYSBVdHhvIGlucHV0IGl0ZW0gZm9yIHNpZ25pbmcnKTtcbiAgICAgIH1cbiAgICAgIHByZXZvdXRTY3JpcHRzLnB1c2gocHJldm91dC5zY3JpcHQpO1xuICAgICAgcHJldm91dFZhbHVlcy5wdXNoKHByZXZvdXQudmFsdWUpO1xuICAgIH0pO1xuICAgIGNvbnN0IG91dHB1dFNjcmlwdCA9IHRoaXMuZ2V0VGFwcm9vdE91dHB1dFNjcmlwdChpbnB1dEluZGV4KTtcbiAgICBpZiAoIW91dHB1dFNjcmlwdC5lcXVhbHMocHJldm91dFNjcmlwdHNbaW5wdXRJbmRleF0pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFdpdG5lc3Mgc2NyaXB0IGZvciBpbnB1dCAjJHtpbnB1dEluZGV4fSBkb2Vzbid0IG1hdGNoIHRoZSBzY3JpcHRQdWJLZXkgaW4gdGhlIHByZXZvdXRgKTtcbiAgICB9XG4gICAgY29uc3QgaGFzaCA9IHRoaXMudHguaGFzaEZvcldpdG5lc3NWMShpbnB1dEluZGV4LCBwcmV2b3V0U2NyaXB0cywgcHJldm91dFZhbHVlcywgc2lnaGFzaFR5cGUsIGxlYWZIYXNoKTtcbiAgICByZXR1cm4geyBoYXNoLCBzaWdoYXNoVHlwZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcHJvcHJpZXRhcnkga2V5IHZhbHVlIHBhaXIgdG8gUFNCVCBpbnB1dC5cbiAgICogRGVmYXVsdCBpZGVudGlmaWVyRW5jb2RpbmcgaXMgdXRmLTggZm9yIGlkZW50aWZpZXIuXG4gICAqL1xuICBhZGRQcm9wcmlldGFyeUtleVZhbFRvSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyLCBrZXlWYWx1ZURhdGE6IFByb3ByaWV0YXJ5S2V5VmFsdWUpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRVbmtub3duS2V5VmFsVG9JbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICBrZXk6IGVuY29kZVByb3ByaWV0YXJ5S2V5KGtleVZhbHVlRGF0YS5rZXkpLFxuICAgICAgdmFsdWU6IGtleVZhbHVlRGF0YS52YWx1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIG9yIHVwZGF0ZXMgKGlmIGV4aXN0cykgcHJvcHJpZXRhcnkga2V5IHZhbHVlIHBhaXIgdG8gUFNCVCBpbnB1dC5cbiAgICogRGVmYXVsdCBpZGVudGlmaWVyRW5jb2RpbmcgaXMgdXRmLTggZm9yIGlkZW50aWZpZXIuXG4gICAqL1xuICBhZGRPclVwZGF0ZVByb3ByaWV0YXJ5S2V5VmFsVG9JbnB1dChpbnB1dEluZGV4OiBudW1iZXIsIGtleVZhbHVlRGF0YTogUHJvcHJpZXRhcnlLZXlWYWx1ZSk6IHRoaXMge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBjb25zdCBrZXkgPSBlbmNvZGVQcm9wcmlldGFyeUtleShrZXlWYWx1ZURhdGEua2V5KTtcbiAgICBjb25zdCB7IHZhbHVlIH0gPSBrZXlWYWx1ZURhdGE7XG4gICAgaWYgKGlucHV0LnVua25vd25LZXlWYWxzPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHVrdkluZGV4ID0gaW5wdXQudW5rbm93bktleVZhbHMuZmluZEluZGV4KCh1a3YpID0+IHVrdi5rZXkuZXF1YWxzKGtleSkpO1xuICAgICAgaWYgKHVrdkluZGV4ID4gLTEpIHtcbiAgICAgICAgaW5wdXQudW5rbm93bktleVZhbHNbdWt2SW5kZXhdID0geyBrZXksIHZhbHVlIH07XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFkZFVua25vd25LZXlWYWxUb0lucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIHNlYXJjaCBhbnkgZGF0YSBmcm9tIHByb3ByaWV0YXJ5IGtleSB2YWx1ZSBhZ2FpbnN0IGtleWRhdGEuXG4gICAqIERlZmF1bHQgaWRlbnRpZmllckVuY29kaW5nIGlzIHV0Zi04IGZvciBpZGVudGlmaWVyLlxuICAgKi9cbiAgZ2V0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXg6IG51bWJlciwga2V5U2VhcmNoPzogUHJvcHJpZXRhcnlLZXlTZWFyY2gpOiBQcm9wcmlldGFyeUtleVZhbHVlW10ge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICByZXR1cm4gZ2V0UHNidElucHV0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0LCBrZXlTZWFyY2gpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIGRlbGV0ZSBhbnkgZGF0YSBmcm9tIHByb3ByaWV0YXJ5IGtleSB2YWx1ZS5cbiAgICogRGVmYXVsdCBpZGVudGlmaWVyRW5jb2RpbmcgaXMgdXRmLTggZm9yIGlkZW50aWZpZXIuXG4gICAqL1xuICBkZWxldGVQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleDogbnVtYmVyLCBrZXlzVG9EZWxldGU/OiBQcm9wcmlldGFyeUtleVNlYXJjaCk6IHRoaXMge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoIWlucHV0LnVua25vd25LZXlWYWxzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAoa2V5c1RvRGVsZXRlICYmIGtleXNUb0RlbGV0ZS5zdWJ0eXBlID09PSB1bmRlZmluZWQgJiYgQnVmZmVyLmlzQnVmZmVyKGtleXNUb0RlbGV0ZS5rZXlkYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByb3ByaWV0YXJ5IGtleSBzZWFyY2ggZmlsdGVyIGNvbWJpbmF0aW9uLiBzdWJ0eXBlIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlucHV0LnVua25vd25LZXlWYWxzID0gaW5wdXQudW5rbm93bktleVZhbHMuZmlsdGVyKChrZXlWYWx1ZSwgaSkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZGVjb2RlUHJvcHJpZXRhcnlLZXkoa2V5VmFsdWUua2V5KTtcbiAgICAgIHJldHVybiAhKFxuICAgICAgICBrZXlzVG9EZWxldGUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAoa2V5c1RvRGVsZXRlLmlkZW50aWZpZXIgPT09IGtleS5pZGVudGlmaWVyICYmXG4gICAgICAgICAgKGtleXNUb0RlbGV0ZS5zdWJ0eXBlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIChrZXlzVG9EZWxldGUuc3VidHlwZSA9PT0ga2V5LnN1YnR5cGUgJiZcbiAgICAgICAgICAgICAgKCFCdWZmZXIuaXNCdWZmZXIoa2V5c1RvRGVsZXRlLmtleWRhdGEpIHx8IGtleXNUb0RlbGV0ZS5rZXlkYXRhLmVxdWFscyhrZXkua2V5ZGF0YSkpKSkpXG4gICAgICApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNdXNpZzJOb25jZUZvcklucHV0KFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBrZXlQYWlyOiBCSVAzMkludGVyZmFjZSxcbiAgICBrZXlUeXBlOiAncm9vdCcgfCAnZGVyaXZlZCcsXG4gICAgcGFyYW1zOiB7IHNlc3Npb25JZD86IEJ1ZmZlcjsgZGV0ZXJtaW5pc3RpYz86IGJvb2xlYW4gfSA9IHsgZGV0ZXJtaW5pc3RpYzogZmFsc2UgfVxuICApOiBQc2J0TXVzaWcyUHViTm9uY2Uge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5kYXRhLmlucHV0c1tpbnB1dEluZGV4XTtcbiAgICBpZiAoIWlucHV0LnRhcEludGVybmFsS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcEludGVybmFsS2V5IGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBub25jZScpO1xuICAgIH1cbiAgICBpZiAoIWlucHV0LnRhcE1lcmtsZVJvb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGFwTWVya2xlUm9vdCBpcyByZXF1aXJlZCB0byBjcmVhdGUgbm9uY2UnKTtcbiAgICB9XG4gICAgY29uc3QgZ2V0RGVyaXZlZEtleVBhaXIgPSAoKTogQklQMzJJbnRlcmZhY2UgPT4ge1xuICAgICAgaWYgKCFpbnB1dC50YXBCaXAzMkRlcml2YXRpb24/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcEJpcDMyRGVyaXZhdGlvbiBpcyByZXF1aXJlZCB0byBjcmVhdGUgbm9uY2UnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlcml2ZWQgPSBVdHhvUHNidC5kZXJpdmVLZXlQYWlyKGtleVBhaXIsIGlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbik7XG4gICAgICBpZiAoIWRlcml2ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBiaXAzMkRlcml2YXRpb24gbWFzdGVyRmluZ2VycHJpbnQgbWF0Y2hlZCB0aGUgSEQga2V5UGFpciBmaW5nZXJwcmludCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlcml2ZWQ7XG4gICAgfTtcbiAgICBjb25zdCBkZXJpdmVkS2V5UGFpciA9IGtleVR5cGUgPT09ICdyb290JyA/IGdldERlcml2ZWRLZXlQYWlyKCkgOiBrZXlQYWlyO1xuICAgIGlmICghZGVyaXZlZEtleVBhaXIucHJpdmF0ZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcml2YXRlS2V5IGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBub25jZScpO1xuICAgIH1cbiAgICBjb25zdCBwYXJ0aWNpcGFudHMgPSBwYXJzZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHMoaW5wdXQpO1xuICAgIGlmICghcGFydGljaXBhbnRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kIDAgbWF0Y2hpbmcgcGFydGljaXBhbnQga2V5IHZhbHVlIGluc3RlYWQgb2YgMWApO1xuICAgIH1cbiAgICBhc3NlcnRQc2J0TXVzaWcyUGFydGljaXBhbnRzKHBhcnRpY2lwYW50cywgaW5wdXQudGFwSW50ZXJuYWxLZXksIGlucHV0LnRhcE1lcmtsZVJvb3QpO1xuICAgIGNvbnN0IHsgdGFwT3V0cHV0S2V5LCBwYXJ0aWNpcGFudFB1YktleXMgfSA9IHBhcnRpY2lwYW50cztcblxuICAgIGNvbnN0IHBhcnRpY2lwYW50UHViS2V5ID0gcGFydGljaXBhbnRQdWJLZXlzLmZpbmQoKHB1YktleSkgPT4gcHViS2V5LmVxdWFscyhkZXJpdmVkS2V5UGFpci5wdWJsaWNLZXkpKTtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihwYXJ0aWNpcGFudFB1YktleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFydGljaXBhbnQgcGxhaW4gcHViIGtleSBzaG91bGQgbWF0Y2ggb25lIGJpcDMyRGVyaXZhdGlvbiBwbGFpbiBwdWIga2V5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBoYXNoIH0gPSB0aGlzLmdldFRhcHJvb3RIYXNoRm9yU2lnKGlucHV0SW5kZXgpO1xuXG4gICAgbGV0IHB1Yk5vbmNlOiBCdWZmZXI7XG4gICAgaWYgKHBhcmFtcy5kZXRlcm1pbmlzdGljKSB7XG4gICAgICBpZiAocGFyYW1zLnNlc3Npb25JZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgZXh0cmEgZW50cm9weSB3aGVuIGdlbmVyYXRpbmcgYSBkZXRlcm1pbmlzdGljIG5vbmNlJyk7XG4gICAgICB9XG4gICAgICAvLyBUaGVyZSBtdXN0IGJlIG9ubHkgMiBwYXJ0aWNpcGFudCBwdWJLZXlzIGlmIGl0IGdvdCB0byB0aGlzIHBvaW50XG4gICAgICBpZiAoIXBhcnRpY2lwYW50UHViS2V5LmVxdWFscyhwYXJ0aWNpcGFudFB1YktleXNbMV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgT25seSB0aGUgY29zaWduZXIncyBub25jZSBjYW4gYmUgc2V0IGRldGVybWluaXN0aWNhbGx5YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBub25jZXMgPSBwYXJzZVBzYnRNdXNpZzJOb25jZXMoaW5wdXQpO1xuICAgICAgaWYgKCFub25jZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBub25jZXMgZm91bmQgb24gaW5wdXQgIyR7aW5wdXRJbmRleH1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChub25jZXMubGVuZ3RoID4gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBoYXZlIG1vcmUgdGhhbiAyIG5vbmNlc2ApO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlyc3RTaWduZXJOb25jZSA9IG5vbmNlcy5maW5kKChrdikgPT4ga3YucGFydGljaXBhbnRQdWJLZXkuZXF1YWxzKHBhcnRpY2lwYW50UHViS2V5c1swXSkpO1xuICAgICAgaWYgKCFmaXJzdFNpZ25lck5vbmNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVyIG5vbmNlIG11c3QgYmUgc2V0IGlmIGNvc2lnbmVyIG5vbmNlIGlzIHRvIGJlIGRlcml2ZWQgZGV0ZXJtaW5pc3RpY2FsbHknKTtcbiAgICAgIH1cblxuICAgICAgcHViTm9uY2UgPSBjcmVhdGVNdXNpZzJEZXRlcm1pbmlzdGljTm9uY2Uoe1xuICAgICAgICBwcml2YXRlS2V5OiBkZXJpdmVkS2V5UGFpci5wcml2YXRlS2V5LFxuICAgICAgICBvdGhlck5vbmNlOiBmaXJzdFNpZ25lck5vbmNlLnB1Yk5vbmNlLFxuICAgICAgICBwdWJsaWNLZXlzOiBwYXJ0aWNpcGFudFB1YktleXMsXG4gICAgICAgIGludGVybmFsUHViS2V5OiBpbnB1dC50YXBJbnRlcm5hbEtleSxcbiAgICAgICAgdGFwVHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QsXG4gICAgICAgIGhhc2gsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHViTm9uY2UgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgdGhpcy5ub25jZVN0b3JlLmNyZWF0ZU11c2lnMk5vbmNlKFxuICAgICAgICAgIGRlcml2ZWRLZXlQYWlyLnByaXZhdGVLZXksXG4gICAgICAgICAgcGFydGljaXBhbnRQdWJLZXksXG4gICAgICAgICAgdGFwT3V0cHV0S2V5LFxuICAgICAgICAgIGhhc2gsXG4gICAgICAgICAgcGFyYW1zLnNlc3Npb25JZFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7IHRhcE91dHB1dEtleSwgcGFydGljaXBhbnRQdWJLZXksIHB1Yk5vbmNlIH07XG4gIH1cblxuICBwcml2YXRlIHNldE11c2lnMk5vbmNlc0lubmVyKFxuICAgIGtleVBhaXI6IEJJUDMySW50ZXJmYWNlLFxuICAgIGtleVR5cGU6ICdyb290JyB8ICdkZXJpdmVkJyxcbiAgICBpbnB1dEluZGV4PzogbnVtYmVyLFxuICAgIHBhcmFtczogeyBzZXNzaW9uSWQ/OiBCdWZmZXI7IGRldGVybWluaXN0aWM/OiBib29sZWFuIH0gPSB7IGRldGVybWluaXN0aWM6IGZhbHNlIH1cbiAgKTogdGhpcyB7XG4gICAgaWYgKGtleVBhaXIuaXNOZXV0ZXJlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByaXZhdGUga2V5IGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIG5vbmNlJyk7XG4gICAgfVxuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIocGFyYW1zLnNlc3Npb25JZCkgJiYgcGFyYW1zLnNlc3Npb25JZC5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2Vzc2lvbklkIHNpemUgJHtwYXJhbXMuc2Vzc2lvbklkLmxlbmd0aH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dEluZGV4ZXMgPSBpbnB1dEluZGV4ID09PSB1bmRlZmluZWQgPyBbLi4uQXJyYXkodGhpcy5pbnB1dENvdW50KS5rZXlzKCldIDogW2lucHV0SW5kZXhdO1xuICAgIGlucHV0SW5kZXhlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlzVGFwcm9vdEtleVBhdGhJbnB1dChpbmRleCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9uY2UgPSB0aGlzLmNyZWF0ZU11c2lnMk5vbmNlRm9ySW5wdXQoaW5kZXgsIGtleVBhaXIsIGtleVR5cGUsIHBhcmFtcyk7XG4gICAgICB0aGlzLmFkZE9yVXBkYXRlUHJvcHJpZXRhcnlLZXlWYWxUb0lucHV0KGluZGV4LCBlbmNvZGVQc2J0TXVzaWcyUHViTm9uY2Uobm9uY2UpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW5kIHNldHMgTXVTaWcyIG5vbmNlIHRvIHRhcHJvb3Qga2V5IHBhdGggaW5wdXQgYXQgaW5wdXRJbmRleC5cbiAgICogSWYgaW5wdXQgaXMgbm90IGEgdGFwcm9vdCBrZXkgcGF0aCwgbm8gYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRJbmRleCBpbnB1dCBpbmRleFxuICAgKiBAcGFyYW0ga2V5UGFpciBkZXJpdmVkIGtleSBwYWlyXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgT3B0aW9uYWwgZXh0cmEgZW50cm9weS4gSWYgcHJvdmlkZWQgaXQgbXVzdCBlaXRoZXIgYmUgYSBjb3VudGVyIHVuaXF1ZSB0byB0aGlzIHNlY3JldCBrZXksXG4gICAqIChjb252ZXJ0ZWQgdG8gYW4gYXJyYXkgb2YgMzIgYnl0ZXMpLCBvciAzMiB1bmlmb3JtbHkgcmFuZG9tIGJ5dGVzLlxuICAgKiBAcGFyYW0gZGV0ZXJtaW5pc3RpYyBJZiB0cnVlLCBzZXQgdGhlIGNvc2lnbmVyIG5vbmNlIGRldGVybWluaXN0aWNhbGx5XG4gICAqL1xuICBzZXRJbnB1dE11c2lnMk5vbmNlKFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBkZXJpdmVkS2V5UGFpcjogQklQMzJJbnRlcmZhY2UsXG4gICAgcGFyYW1zOiB7IHNlc3Npb25JZD86IEJ1ZmZlcjsgZGV0ZXJtaW5pc3RpYz86IGJvb2xlYW4gfSA9IHsgZGV0ZXJtaW5pc3RpYzogZmFsc2UgfVxuICApOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5zZXRNdXNpZzJOb25jZXNJbm5lcihkZXJpdmVkS2V5UGFpciwgJ2Rlcml2ZWQnLCBpbnB1dEluZGV4LCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbmQgc2V0cyBNdVNpZzIgbm9uY2UgdG8gdGFwcm9vdCBrZXkgcGF0aCBpbnB1dCBhdCBpbnB1dEluZGV4LlxuICAgKiBJZiBpbnB1dCBpcyBub3QgYSB0YXByb290IGtleSBwYXRoLCBubyBhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dEluZGV4IGlucHV0IGluZGV4XG4gICAqIEBwYXJhbSBrZXlQYWlyIEhEIHJvb3Qga2V5IHBhaXJcbiAgICogQHBhcmFtIHNlc3Npb25JZCBPcHRpb25hbCBleHRyYSBlbnRyb3B5LiBJZiBwcm92aWRlZCBpdCBtdXN0IGVpdGhlciBiZSBhIGNvdW50ZXIgdW5pcXVlIHRvIHRoaXMgc2VjcmV0IGtleSxcbiAgICogKGNvbnZlcnRlZCB0byBhbiBhcnJheSBvZiAzMiBieXRlcyksIG9yIDMyIHVuaWZvcm1seSByYW5kb20gYnl0ZXMuXG4gICAqIEBwYXJhbSBkZXRlcm1pbmlzdGljIElmIHRydWUsIHNldCB0aGUgY29zaWduZXIgbm9uY2UgZGV0ZXJtaW5pc3RpY2FsbHlcbiAgICovXG4gIHNldElucHV0TXVzaWcyTm9uY2VIRChcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAga2V5UGFpcjogQklQMzJJbnRlcmZhY2UsXG4gICAgcGFyYW1zOiB7IHNlc3Npb25JZD86IEJ1ZmZlcjsgZGV0ZXJtaW5pc3RpYz86IGJvb2xlYW4gfSA9IHsgZGV0ZXJtaW5pc3RpYzogZmFsc2UgfVxuICApOiB0aGlzIHtcbiAgICBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIHJldHVybiB0aGlzLnNldE11c2lnMk5vbmNlc0lubmVyKGtleVBhaXIsICdyb290JywgaW5wdXRJbmRleCwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW5kIHNldHMgTXVTaWcyIG5vbmNlIHRvIGFsbCB0YXByb290IGtleSBwYXRoIGlucHV0cy4gT3RoZXIgaW5wdXRzIHdpbGwgYmUgc2tpcHBlZC5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0SW5kZXggaW5wdXQgaW5kZXhcbiAgICogQHBhcmFtIGtleVBhaXIgZGVyaXZlZCBrZXkgcGFpclxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIE9wdGlvbmFsIGV4dHJhIGVudHJvcHkuIElmIHByb3ZpZGVkIGl0IG11c3QgZWl0aGVyIGJlIGEgY291bnRlciB1bmlxdWUgdG8gdGhpcyBzZWNyZXQga2V5LFxuICAgKiAoY29udmVydGVkIHRvIGFuIGFycmF5IG9mIDMyIGJ5dGVzKSwgb3IgMzIgdW5pZm9ybWx5IHJhbmRvbSBieXRlcy5cbiAgICovXG4gIHNldEFsbElucHV0c011c2lnMk5vbmNlKFxuICAgIGtleVBhaXI6IEJJUDMySW50ZXJmYWNlLFxuICAgIHBhcmFtczogeyBzZXNzaW9uSWQ/OiBCdWZmZXI7IGRldGVybWluaXN0aWM/OiBib29sZWFuIH0gPSB7IGRldGVybWluaXN0aWM6IGZhbHNlIH1cbiAgKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuc2V0TXVzaWcyTm9uY2VzSW5uZXIoa2V5UGFpciwgJ2Rlcml2ZWQnLCB1bmRlZmluZWQsIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGFuZCBzZXRzIE11U2lnMiBub25jZSB0byBhbGwgdGFwcm9vdCBrZXkgcGF0aCBpbnB1dHMuIE90aGVyIGlucHV0cyB3aWxsIGJlIHNraXBwZWQuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dEluZGV4IGlucHV0IGluZGV4XG4gICAqIEBwYXJhbSBrZXlQYWlyIEhEIHJvb3Qga2V5IHBhaXJcbiAgICogQHBhcmFtIHNlc3Npb25JZCBPcHRpb25hbCBleHRyYSBlbnRyb3B5LiBJZiBwcm92aWRlZCBpdCBtdXN0IGVpdGhlciBiZSBhIGNvdW50ZXIgdW5pcXVlIHRvIHRoaXMgc2VjcmV0IGtleSxcbiAgICogKGNvbnZlcnRlZCB0byBhbiBhcnJheSBvZiAzMiBieXRlcyksIG9yIDMyIHVuaWZvcm1seSByYW5kb20gYnl0ZXMuXG4gICAqL1xuICBzZXRBbGxJbnB1dHNNdXNpZzJOb25jZUhEKFxuICAgIGtleVBhaXI6IEJJUDMySW50ZXJmYWNlLFxuICAgIHBhcmFtczogeyBzZXNzaW9uSWQ/OiBCdWZmZXI7IGRldGVybWluaXN0aWM/OiBib29sZWFuIH0gPSB7IGRldGVybWluaXN0aWM6IGZhbHNlIH1cbiAgKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuc2V0TXVzaWcyTm9uY2VzSW5uZXIoa2V5UGFpciwgJ3Jvb3QnLCB1bmRlZmluZWQsIHBhcmFtcyk7XG4gIH1cblxuICBjbG9uZSgpOiB0aGlzIHtcbiAgICByZXR1cm4gc3VwZXIuY2xvbmUoKSBhcyB0aGlzO1xuICB9XG59XG4iXX0=
@@ -36,11 +36,37 @@ export interface WalletUnspentLegacy<TNumber extends number | bigint = number> e
36
36
  /** @deprecated - obviated by verifyWithUnspent */
37
37
  witnessScript?: string;
38
38
  }
39
+ /**
40
+ * @param psbt
41
+ * @param inputIndex
42
+ * @param id Unspent ID
43
+ * @returns true iff the unspent ID on the unspent and psbt input match
44
+ */
45
+ export declare function psbtIncludesUnspentAtIndex(psbt: UtxoPsbt, inputIndex: number, id: string): boolean;
46
+ /**
47
+ * Update the psbt input at the given index
48
+ * @param psbt
49
+ * @param inputIndex
50
+ * @param u
51
+ * @param redeemScript Only overrides if there is no redeemScript in the input currently
52
+ */
53
+ export declare function updateReplayProtectionUnspentToPsbt(psbt: UtxoPsbt, inputIndex: number, u: Unspent<bigint>, redeemScript?: Buffer): void;
39
54
  export declare function addReplayProtectionUnspentToPsbt(psbt: UtxoPsbt, u: Unspent<bigint>, redeemScript: Buffer,
40
55
  /**
41
56
  * @deprecated
42
57
  */
43
58
  network?: Network): void;
59
+ /**
60
+ * Update the PSBT with the unspent data for the input at the given index if the data is not there already.
61
+ *
62
+ * @param psbt
63
+ * @param inputIndex
64
+ * @param u
65
+ * @param rootWalletKeys
66
+ * @param signer
67
+ * @param cosigner
68
+ */
69
+ export declare function updateWalletUnspentForPsbt(psbt: UtxoPsbt, inputIndex: number, u: WalletUnspent<bigint>, rootWalletKeys: RootWalletKeys, signer: KeyName, cosigner: KeyName): void;
44
70
  export declare function addWalletUnspentToPsbt(psbt: UtxoPsbt, u: WalletUnspent<bigint>, rootWalletKeys: RootWalletKeys, signer: KeyName, cosigner: KeyName,
45
71
  /**
46
72
  * @deprecated
@@ -1 +1 @@
1
- {"version":3,"file":"Unspent.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/wallet/Unspent.ts"],"names":[],"mappings":";AAAA,OAAO,EAAc,OAAO,EAAY,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAWnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAY,iBAAiB,EAAE,OAAO,EAAqC,MAAM,YAAY,CAAC;AACrG,OAAO,EAAE,SAAS,EAAY,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAKvC,MAAM,WAAW,aAAa,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAE,SAAQ,OAAO,CAAC,OAAO,CAAC;IAC/F,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAC/E,SAAQ,iBAAiB,CAAC,OAAO,CAAC,EAChC,aAAa,CAAC,OAAO,CAAC;CAAG;AAE7B,wBAAgB,eAAe,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC,CAEjH;AAED,wBAAgB,oBAAoB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAClE,SAAS,EAAE,sBAAsB,CAAC,OAAO,CAAC,EAC1C,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,EAC/B,aAAa,EAAE,mBAAmB,CAAC,cAAc,CAAC,GACjD,IAAI,CAmBN;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACxE,EAAE,EAAE,eAAe,CAAC,OAAO,CAAC,EAC5B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,EAC5B,UAAU,EAAE,cAAc,GACzB,MAAM,CAAC,OAAO,CAAC,CAiCjB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAE,SAAQ,aAAa,CAAC,OAAO,CAAC;IAC3G,gDAAgD;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,QAAQ,EACd,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAClB,YAAY,EAAE,MAAM;AACpB;;GAEG;AACH,OAAO,GAAE,OAAsB,GAC9B,IAAI,CAuBN;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,QAAQ,EACd,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EACxB,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,OAAO;AACjB;;GAEG;AACH,OAAO,GAAE,OAAsB,GAC9B,IAAI,CAkFN"}
1
+ {"version":3,"file":"Unspent.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/wallet/Unspent.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.addWalletUnspentToPsbt = exports.addReplayProtectionUnspentToPsbt = exports.verifySignatureWithUnspent = exports.signInputWithUnspent = exports.isWalletUnspent = void 0;
3
+ exports.addWalletUnspentToPsbt = exports.updateWalletUnspentForPsbt = exports.addReplayProtectionUnspentToPsbt = exports.updateReplayProtectionUnspentToPsbt = exports.psbtIncludesUnspentAtIndex = exports.verifySignatureWithUnspent = exports.signInputWithUnspent = exports.isWalletUnspent = void 0;
4
4
  const __1 = require("../..");
5
5
  const outputScripts_1 = require("../outputScripts");
6
6
  const address_1 = require("../../address");
@@ -10,6 +10,8 @@ const chains_1 = require("./chains");
10
10
  const Musig2_1 = require("../Musig2");
11
11
  const transaction_1 = require("../transaction");
12
12
  const parseInput_1 = require("../parseInput");
13
+ const utils_1 = require("bip174/src/lib/utils");
14
+ const PsbtUtil_1 = require("../PsbtUtil");
13
15
  function isWalletUnspent(u) {
14
16
  return u.chain !== undefined;
15
17
  }
@@ -58,116 +60,196 @@ function verifySignatureWithUnspent(tx, inputIndex, unspents, walletKeys) {
58
60
  return signature_1.verifySignatureWithPublicKeys(tx, inputIndex, prevOutputs, walletKeys.deriveForChainAndIndex(unspent.chain, unspent.index).publicKeys);
59
61
  }
60
62
  exports.verifySignatureWithUnspent = verifySignatureWithUnspent;
61
- function addReplayProtectionUnspentToPsbt(psbt, u, redeemScript,
62
63
  /**
63
- * @deprecated
64
+ * @param psbt
65
+ * @param inputIndex
66
+ * @param id Unspent ID
67
+ * @returns true iff the unspent ID on the unspent and psbt input match
64
68
  */
65
- network = psbt.network) {
66
- if (network !== psbt.network) {
67
- throw new Error(`network parameter does not match psbt.network`);
69
+ function psbtIncludesUnspentAtIndex(psbt, inputIndex, id) {
70
+ utils_1.checkForInput(psbt.data.inputs, inputIndex);
71
+ const { txid, vout } = Unspent_1.parseOutputId(id);
72
+ const psbtOutPoint = Unspent_1.getOutputIdForInput(psbt.txInputs[inputIndex]);
73
+ return psbtOutPoint.txid === txid && psbtOutPoint.vout === vout;
74
+ }
75
+ exports.psbtIncludesUnspentAtIndex = psbtIncludesUnspentAtIndex;
76
+ /**
77
+ * Update the psbt input at the given index
78
+ * @param psbt
79
+ * @param inputIndex
80
+ * @param u
81
+ * @param redeemScript Only overrides if there is no redeemScript in the input currently
82
+ */
83
+ function updateReplayProtectionUnspentToPsbt(psbt, inputIndex, u, redeemScript) {
84
+ if (!psbtIncludesUnspentAtIndex(psbt, inputIndex, u.id)) {
85
+ throw new Error(`unspent does not correspond to psbt input`);
86
+ }
87
+ const input = utils_1.checkForInput(psbt.data.inputs, inputIndex);
88
+ if (redeemScript && !input.redeemScript) {
89
+ psbt.updateInput(inputIndex, { redeemScript });
68
90
  }
69
- const { txid, vout, script, value } = Unspent_1.toPrevOutput(u, psbt.network);
70
- const isZcash = __1.getMainnet(psbt.network) === __1.networks.zcash;
71
91
  // Because Zcash directly hashes the value for non-segwit transactions, we do not need to check indirectly
72
92
  // with the previous transaction. Therefore, we can treat Zcash non-segwit transactions as Bitcoin
73
93
  // segwit transactions
94
+ const isZcash = __1.getMainnet(psbt.network) === __1.networks.zcash;
74
95
  if (!Unspent_1.isUnspentWithPrevTx(u) && !isZcash) {
75
96
  throw new Error('Error, require previous tx to add to PSBT');
76
97
  }
98
+ if (isZcash && !input.witnessUtxo) {
99
+ const { script, value } = Unspent_1.toPrevOutput(u, psbt.network);
100
+ psbt.updateInput(inputIndex, { witnessUtxo: { script, value } });
101
+ }
102
+ else if (!isZcash && !input.nonWitnessUtxo) {
103
+ psbt.updateInput(inputIndex, { nonWitnessUtxo: u.prevTx });
104
+ }
105
+ }
106
+ exports.updateReplayProtectionUnspentToPsbt = updateReplayProtectionUnspentToPsbt;
107
+ function addUnspentToPsbt(psbt, id) {
108
+ const { txid, vout } = Unspent_1.parseOutputId(id);
77
109
  psbt.addInput({
78
110
  hash: txid,
79
111
  index: vout,
80
- redeemScript,
81
112
  });
82
- if (isZcash) {
83
- psbt.updateInput(psbt.inputCount - 1, { witnessUtxo: { script, value } });
84
- }
85
- else {
86
- psbt.updateInput(psbt.inputCount - 1, { nonWitnessUtxo: u.prevTx });
87
- }
88
113
  }
89
- exports.addReplayProtectionUnspentToPsbt = addReplayProtectionUnspentToPsbt;
90
- function addWalletUnspentToPsbt(psbt, u, rootWalletKeys, signer, cosigner,
114
+ function addReplayProtectionUnspentToPsbt(psbt, u, redeemScript,
91
115
  /**
92
116
  * @deprecated
93
117
  */
94
118
  network = psbt.network) {
95
- if (network !== psbt.network) {
96
- throw new Error(`network parameter does not match psbt.network`);
119
+ if (psbt.network !== network) {
120
+ throw new Error('psbt network does not match network');
97
121
  }
98
- const { txid, vout, script, value } = Unspent_1.toPrevOutput(u, psbt.network);
99
- psbt.addInput({ hash: txid, index: vout });
100
- const inputIndex = psbt.inputCount - 1;
122
+ addUnspentToPsbt(psbt, u.id);
123
+ updateReplayProtectionUnspentToPsbt(psbt, psbt.inputCount - 1, u, redeemScript);
124
+ }
125
+ exports.addReplayProtectionUnspentToPsbt = addReplayProtectionUnspentToPsbt;
126
+ /**
127
+ * Update the PSBT with the unspent data for the input at the given index if the data is not there already.
128
+ *
129
+ * @param psbt
130
+ * @param inputIndex
131
+ * @param u
132
+ * @param rootWalletKeys
133
+ * @param signer
134
+ * @param cosigner
135
+ */
136
+ function updateWalletUnspentForPsbt(psbt, inputIndex, u, rootWalletKeys, signer, cosigner) {
137
+ if (!psbtIncludesUnspentAtIndex(psbt, inputIndex, u.id)) {
138
+ throw new Error(`unspent does not correspond to psbt input`);
139
+ }
140
+ const input = utils_1.checkForInput(psbt.data.inputs, inputIndex);
101
141
  // Because Zcash directly hashes the value for non-segwit transactions, we do not need to check indirectly
102
142
  // with the previous transaction. Therefore, we can treat Zcash non-segwit transactions as Bitcoin
103
143
  // segwit transactions
104
- if (chains_1.isSegwit(u.chain) || __1.getMainnet(psbt.network) === __1.networks.zcash) {
144
+ const isZcashOrSegwit = chains_1.isSegwit(u.chain) || __1.getMainnet(psbt.network) === __1.networks.zcash;
145
+ if (isZcashOrSegwit && !input.witnessUtxo) {
146
+ const { script, value } = Unspent_1.toPrevOutput(u, psbt.network);
105
147
  psbt.updateInput(inputIndex, { witnessUtxo: { script, value } });
106
148
  }
107
- else {
149
+ else if (!isZcashOrSegwit) {
108
150
  if (!Unspent_1.isUnspentWithPrevTx(u)) {
109
151
  throw new Error('Error, require previous tx to add to PSBT');
110
152
  }
111
- // Force the litecoin transaction to have no MWEB advanced transaction flag
112
- if (__1.getMainnet(psbt.network) === __1.networks.litecoin) {
113
- u.prevTx = transaction_1.createTransactionFromBuffer(u.prevTx, psbt.network, { amountType: 'bigint' }).toBuffer();
153
+ if (!input.witnessUtxo && !input.nonWitnessUtxo) {
154
+ // Force the litecoin transaction to have no MWEB advanced transaction flag
155
+ if (__1.getMainnet(psbt.network) === __1.networks.litecoin) {
156
+ u.prevTx = transaction_1.createTransactionFromBuffer(u.prevTx, psbt.network, { amountType: 'bigint' }).toBuffer();
157
+ }
158
+ psbt.updateInput(inputIndex, { nonWitnessUtxo: u.prevTx });
114
159
  }
115
- psbt.updateInput(inputIndex, { nonWitnessUtxo: u.prevTx });
116
160
  }
117
161
  const walletKeys = rootWalletKeys.deriveForChainAndIndex(u.chain, u.index);
118
162
  const scriptType = outputScripts_1.scriptTypeForChain(u.chain);
119
163
  const isBackupFlow = signer === 'backup' || cosigner === 'backup';
120
164
  if (scriptType === 'p2tr' || (scriptType === 'p2trMusig2' && isBackupFlow)) {
165
+ if (input.tapLeafScript && input.tapBip32Derivation) {
166
+ return;
167
+ }
121
168
  const createSpendScriptP2trFn = scriptType === 'p2tr' ? outputScripts_1.createSpendScriptP2tr : outputScripts_1.createSpendScriptP2trMusig2;
122
169
  const { controlBlock, witnessScript, leafVersion, leafHash } = createSpendScriptP2trFn(walletKeys.publicKeys, [
123
170
  walletKeys[signer].publicKey,
124
171
  walletKeys[cosigner].publicKey,
125
172
  ]);
126
- psbt.updateInput(inputIndex, {
127
- tapLeafScript: [{ controlBlock, script: witnessScript, leafVersion }],
128
- tapBip32Derivation: [signer, cosigner].map((key) => ({
129
- leafHashes: [leafHash],
130
- pubkey: outputScripts_1.toXOnlyPublicKey(walletKeys[key].publicKey),
131
- path: rootWalletKeys.getDerivationPath(rootWalletKeys[key], u.chain, u.index),
132
- masterFingerprint: rootWalletKeys[key].fingerprint,
133
- })),
134
- });
173
+ if (!input.tapLeafScript) {
174
+ psbt.updateInput(inputIndex, {
175
+ tapLeafScript: [{ controlBlock, script: witnessScript, leafVersion }],
176
+ });
177
+ }
178
+ if (!input.tapBip32Derivation) {
179
+ psbt.updateInput(inputIndex, {
180
+ tapBip32Derivation: [signer, cosigner].map((key) => ({
181
+ leafHashes: [leafHash],
182
+ pubkey: outputScripts_1.toXOnlyPublicKey(walletKeys[key].publicKey),
183
+ path: rootWalletKeys.getDerivationPath(rootWalletKeys[key], u.chain, u.index),
184
+ masterFingerprint: rootWalletKeys[key].fingerprint,
185
+ })),
186
+ });
187
+ }
135
188
  }
136
189
  else if (scriptType === 'p2trMusig2') {
137
190
  const { internalPubkey: tapInternalKey, outputPubkey: tapOutputKey, taptreeRoot, } = outputScripts_1.createKeyPathP2trMusig2(walletKeys.publicKeys);
138
- const participantsKeyValData = Musig2_1.encodePsbtMusig2Participants({
139
- tapOutputKey,
140
- tapInternalKey,
141
- participantPubKeys: [walletKeys.user.publicKey, walletKeys.bitgo.publicKey],
142
- });
143
- psbt.addProprietaryKeyValToInput(inputIndex, participantsKeyValData);
144
- psbt.updateInput(inputIndex, {
145
- tapInternalKey: tapInternalKey,
146
- tapMerkleRoot: taptreeRoot,
147
- tapBip32Derivation: [signer, cosigner].map((key) => ({
148
- leafHashes: [],
149
- pubkey: outputScripts_1.toXOnlyPublicKey(walletKeys[key].publicKey),
150
- path: rootWalletKeys.getDerivationPath(rootWalletKeys[key], u.chain, u.index),
151
- masterFingerprint: rootWalletKeys[key].fingerprint,
152
- })),
153
- });
191
+ if (psbt.getProprietaryKeyVals(inputIndex, {
192
+ identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
193
+ subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
194
+ }).length === 0) {
195
+ const participantsKeyValData = Musig2_1.encodePsbtMusig2Participants({
196
+ tapOutputKey,
197
+ tapInternalKey,
198
+ participantPubKeys: [walletKeys.user.publicKey, walletKeys.bitgo.publicKey],
199
+ });
200
+ psbt.addProprietaryKeyValToInput(inputIndex, participantsKeyValData);
201
+ }
202
+ if (!input.tapInternalKey) {
203
+ psbt.updateInput(inputIndex, {
204
+ tapInternalKey: tapInternalKey,
205
+ });
206
+ }
207
+ if (!input.tapMerkleRoot) {
208
+ psbt.updateInput(inputIndex, {
209
+ tapMerkleRoot: taptreeRoot,
210
+ });
211
+ }
212
+ if (!input.tapBip32Derivation) {
213
+ psbt.updateInput(inputIndex, {
214
+ tapBip32Derivation: [signer, cosigner].map((key) => ({
215
+ leafHashes: [],
216
+ pubkey: outputScripts_1.toXOnlyPublicKey(walletKeys[key].publicKey),
217
+ path: rootWalletKeys.getDerivationPath(rootWalletKeys[key], u.chain, u.index),
218
+ masterFingerprint: rootWalletKeys[key].fingerprint,
219
+ })),
220
+ });
221
+ }
154
222
  }
155
223
  else {
224
+ if (!input.bip32Derivation) {
225
+ psbt.updateInput(inputIndex, {
226
+ bip32Derivation: [0, 1, 2].map((idx) => ({
227
+ pubkey: walletKeys.triple[idx].publicKey,
228
+ path: walletKeys.paths[idx],
229
+ masterFingerprint: rootWalletKeys.triple[idx].fingerprint,
230
+ })),
231
+ });
232
+ }
156
233
  const { witnessScript, redeemScript } = outputScripts_1.createOutputScript2of3(walletKeys.publicKeys, scriptType);
157
- psbt.updateInput(inputIndex, {
158
- bip32Derivation: [0, 1, 2].map((idx) => ({
159
- pubkey: walletKeys.triple[idx].publicKey,
160
- path: walletKeys.paths[idx],
161
- masterFingerprint: rootWalletKeys.triple[idx].fingerprint,
162
- })),
163
- });
164
- if (witnessScript) {
234
+ if (witnessScript && !input.witnessScript) {
165
235
  psbt.updateInput(inputIndex, { witnessScript });
166
236
  }
167
- if (redeemScript) {
237
+ if (redeemScript && !input.redeemScript) {
168
238
  psbt.updateInput(inputIndex, { redeemScript });
169
239
  }
170
240
  }
171
241
  }
242
+ exports.updateWalletUnspentForPsbt = updateWalletUnspentForPsbt;
243
+ function addWalletUnspentToPsbt(psbt, u, rootWalletKeys, signer, cosigner,
244
+ /**
245
+ * @deprecated
246
+ */
247
+ network = psbt.network) {
248
+ if (psbt.network !== network) {
249
+ throw new Error('psbt network does not match network');
250
+ }
251
+ addUnspentToPsbt(psbt, u.id);
252
+ updateWalletUnspentForPsbt(psbt, psbt.inputCount - 1, u, rootWalletKeys, signer, cosigner);
253
+ }
172
254
  exports.addWalletUnspentToPsbt = addWalletUnspentToPsbt;
173
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5zcGVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvVW5zcGVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBc0Q7QUFFdEQsb0RBTzBCO0FBQzFCLDJDQUErQztBQUMvQyw0Q0FBdUc7QUFLdkcsd0NBQXFHO0FBQ3JHLHFDQUErQztBQUUvQyxzQ0FBeUQ7QUFDekQsZ0RBQTZEO0FBQzdELDhDQUFxRDtBQWFyRCxTQUFnQixlQUFlLENBQWtDLENBQW1CO0lBQ2xGLE9BQVEsQ0FBNEIsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDO0FBQzNELENBQUM7QUFGRCwwQ0FFQztBQUVELFNBQWdCLG9CQUFvQixDQUNsQyxTQUEwQyxFQUMxQyxVQUFrQixFQUNsQixPQUErQixFQUMvQixhQUFrRDtJQUVsRCxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxhQUFhLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUcsTUFBTSxVQUFVLEdBQUcsa0NBQWtCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JELE1BQU0sU0FBUyxHQUFHLHNDQUFzQixDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDO0lBQ3pGLE1BQU0saUJBQWlCLEdBQUcsd0JBQWMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFrQixDQUFDLENBQUM7SUFDeEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsRUFBRTtRQUN4QyxNQUFNLElBQUksS0FBSyxDQUNiLGdDQUFnQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUNy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RUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDdkMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUztnQkFDeEMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO2dCQUMzQixpQkFBaUIsRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVc7YUFDMUQsQ0FBQyxDQUFDO1NBQ0osQ0FBQyxDQUFDO1FBQ0gsSUFBSSxhQUFhLEVBQUU7WUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1NBQ2pEO1FBQ0QsSUFBSSxZQUFZLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1NBQ2hEO0tBQ0Y7QUFDSCxDQUFDO0FBNUZELHdEQTRGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldE1haW5uZXQsIE5ldHdvcmssIG5ldHdvcmtzIH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgVXR4b1RyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4uL1V0eG9UcmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHtcbiAgY3JlYXRlS2V5UGF0aFAydHJNdXNpZzIsXG4gIGNyZWF0ZU91dHB1dFNjcmlwdDJvZjMsXG4gIGNyZWF0ZVNwZW5kU2NyaXB0UDJ0cixcbiAgY3JlYXRlU3BlbmRTY3JpcHRQMnRyTXVzaWcyLFxuICBzY3JpcHRUeXBlRm9yQ2hhaW4sXG4gIHRvWE9ubHlQdWJsaWNLZXksXG59IGZyb20gJy4uL291dHB1dFNjcmlwdHMnO1xuaW1wb3J0IHsgdG9PdXRwdXRTY3JpcHQgfSBmcm9tICcuLi8uLi9hZGRyZXNzJztcbmltcG9ydCB7IGdldFNpZ25hdHVyZVZlcmlmaWNhdGlvbnMsIHNpZ25JbnB1dDJPZjMsIHZlcmlmeVNpZ25hdHVyZVdpdGhQdWJsaWNLZXlzIH0gZnJvbSAnLi4vc2lnbmF0dXJlJztcbmltcG9ydCB7IFdhbGxldFVuc3BlbnRTaWduZXIgfSBmcm9tICcuL1dhbGxldFVuc3BlbnRTaWduZXInO1xuaW1wb3J0IHsgS2V5TmFtZSwgUm9vdFdhbGxldEtleXMgfSBmcm9tICcuL1dhbGxldEtleXMnO1xuaW1wb3J0IHsgVXR4b1RyYW5zYWN0aW9uIH0gZnJvbSAnLi4vVXR4b1RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyaXBsZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IHRvT3V0cHV0LCBVbnNwZW50V2l0aFByZXZUeCwgVW5zcGVudCwgaXNVbnNwZW50V2l0aFByZXZUeCwgdG9QcmV2T3V0cHV0IH0gZnJvbSAnLi4vVW5zcGVudCc7XG5pbXBvcnQgeyBDaGFpbkNvZGUsIGlzU2Vnd2l0IH0gZnJvbSAnLi9jaGFpbnMnO1xuaW1wb3J0IHsgVXR4b1BzYnQgfSBmcm9tICcuLi9VdHhvUHNidCc7XG5pbXBvcnQgeyBlbmNvZGVQc2J0TXVzaWcyUGFydGljaXBhbnRzIH0gZnJvbSAnLi4vTXVzaWcyJztcbmltcG9ydCB7IGNyZWF0ZVRyYW5zYWN0aW9uRnJvbUJ1ZmZlciB9IGZyb20gJy4uL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IHBhcnNlU2lnbmF0dXJlU2NyaXB0IH0gZnJvbSAnLi4vcGFyc2VJbnB1dCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIFVuc3BlbnQ8VE51bWJlcj4ge1xuICBjaGFpbjogQ2hhaW5Db2RlO1xuICBpbmRleDogbnVtYmVyO1xuICB3aXRuZXNzU2NyaXB0Pzogc3RyaW5nO1xuICB2YWx1ZVN0cmluZz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb25XaXRuZXNzV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPlxuICBleHRlbmRzIFVuc3BlbnRXaXRoUHJldlR4PFROdW1iZXI+LFxuICAgIFdhbGxldFVuc3BlbnQ8VE51bWJlcj4ge31cblxuZXhwb3J0IGZ1bmN0aW9uIGlzV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50Pih1OiBVbnNwZW50PFROdW1iZXI+KTogdSBpcyBXYWxsZXRVbnNwZW50PFROdW1iZXI+IHtcbiAgcmV0dXJuICh1IGFzIFdhbGxldFVuc3BlbnQ8VE51bWJlcj4pLmNoYWluICE9PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaWduSW5wdXRXaXRoVW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgdHhCdWlsZGVyOiBVdHhvVHJhbnNhY3Rpb25CdWlsZGVyPFROdW1iZXI+LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIHVuc3BlbnQ6IFdhbGxldFVuc3BlbnQ8VE51bWJlcj4sXG4gIHVuc3BlbnRTaWduZXI6IFdhbGxldFVuc3BlbnRTaWduZXI8Um9vdFdhbGxldEtleXM+XG4pOiB2b2lkIHtcbiAgY29uc3QgeyB3YWxsZXRLZXlzLCBzaWduZXIsIGNvc2lnbmVyIH0gPSB1bnNwZW50U2lnbmVyLmRlcml2ZUZvckNoYWluQW5kSW5kZXgodW5zcGVudC5jaGFpbiwgdW5zcGVudC5pbmRleCk7XG4gIGNvbnN0IHNjcmlwdFR5cGUgPSBzY3JpcHRUeXBlRm9yQ2hhaW4odW5zcGVudC5jaGFpbik7XG4gIGNvbnN0IHB1YlNjcmlwdCA9IGNyZWF0ZU91dHB1dFNjcmlwdDJvZjMod2FsbGV0S2V5cy5wdWJsaWNLZXlzLCBzY3JpcHRUeXBlKS5zY3JpcHRQdWJLZXk7XG4gIGNvbnN0IHB1YlNjcmlwdEV4cGVjdGVkID0gdG9PdXRwdXRTY3JpcHQodW5zcGVudC5hZGRyZXNzLCB0eEJ1aWxkZXIubmV0d29yayBhcyBOZXR3b3JrKTtcbiAgaWYgKCFwdWJTY3JpcHQuZXF1YWxzKHB1YlNjcmlwdEV4cGVjdGVkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBwdWJzY3JpcHQgbWlzbWF0Y2g6IGV4cGVjdGVkICR7cHViU2NyaXB0RXhwZWN0ZWQudG9TdHJpbmcoJ2hleCcpfSBnb3QgJHtwdWJTY3JpcHQudG9TdHJpbmcoJ2hleCcpfWBcbiAgICApO1xuICB9XG4gIHNpZ25JbnB1dDJPZjM8VE51bWJlcj4oXG4gICAgdHhCdWlsZGVyLFxuICAgIGlucHV0SW5kZXgsXG4gICAgc2NyaXB0VHlwZSxcbiAgICB3YWxsZXRLZXlzLnB1YmxpY0tleXMsXG4gICAgc2lnbmVyLFxuICAgIGNvc2lnbmVyLnB1YmxpY0tleSxcbiAgICB1bnNwZW50LnZhbHVlXG4gICk7XG59XG5cbi8qKlxuICogQHBhcmFtIHR4XG4gKiBAcGFyYW0gaW5wdXRJbmRleFxuICogQHBhcmFtIHVuc3BlbnRzXG4gKiBAcGFyYW0gd2FsbGV0S2V5c1xuICogQHJldHVybiB0cmlwbGUgb2YgYm9vbGVhbnMgaW5kaWNhdGluZyBhIHZhbGlkIHNpZ25hdHVyZSBmb3IgZWFjaCBwdWJrZXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVNpZ25hdHVyZVdpdGhVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICB0eDogVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIHVuc3BlbnRzOiBVbnNwZW50PFROdW1iZXI+W10sXG4gIHdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzXG4pOiBUcmlwbGU8Ym9vbGVhbj4ge1xuICBpZiAodHguaW5zLmxlbmd0aCAhPT0gdW5zcGVudHMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnB1dCBsZW5ndGggbXVzdCBtYXRjaCB1bnNwZW50cyBsZW5ndGhgKTtcbiAgfVxuXG4gIGNvbnN0IGlucHV0ID0gdHguaW5zW2lucHV0SW5kZXhdO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAoIWlucHV0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBubyBpbnB1dCBhdCBpbmRleCAke2lucHV0SW5kZXh9YCk7XG4gIH1cblxuICBjb25zdCB1bnNwZW50ID0gdW5zcGVudHNbaW5wdXRJbmRleF07XG4gIGlmICghaXNXYWxsZXRVbnNwZW50KHVuc3BlbnQpIHx8ICghaW5wdXQuc2NyaXB0Py5sZW5ndGggJiYgIWlucHV0LndpdG5lc3M/Lmxlbmd0aCkpIHtcbiAgICByZXR1cm4gW2ZhbHNlLCBmYWxzZSwgZmFsc2VdO1xuICB9XG5cbiAgY29uc3QgcGFyc2VkSW5wdXQgPSBwYXJzZVNpZ25hdHVyZVNjcmlwdChpbnB1dCk7XG4gIGNvbnN0IHByZXZPdXRwdXRzID0gdW5zcGVudHMubWFwKCh1KSA9PiB0b091dHB1dCh1LCB0eC5uZXR3b3JrKSk7XG5cbiAgLy8gSWYgaXQgaXMgYSB0YXByb290IGtleVBhdGhTcGVuZCBpbnB1dCwgdGhlIG9ubHkgdmFsaWQgc2lnbmF0dXJlIGNvbWJpbmF0aW9ucyBpcyB1c2VyLWJpdGdvLiBXZSBjYW5cbiAgLy8gb25seSB2ZXJpZnkgdGhhdCB0aGUgYWdncmVnYXRlZCBzaWduYXR1cmUgaXMgdmFsaWQsIG5vdCB0aGF0IHRoZSBpbmRpdmlkdWFsIHBhcnRpYWwtc2lnbmF0dXJlIGlzIHZhbGlkLlxuICAvLyBUaGVyZWZvcmUsIHdlIGNhbiBvbmx5IHNheSB0aGF0IGVpdGhlciBhbGwgcGFydGlhbCBzaWduYXR1cmVzIGFyZSB2YWxpZCwgb3Igbm9uZSBhcmUuXG4gIGlmIChwYXJzZWRJbnB1dC5zY3JpcHRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcpIHtcbiAgICBjb25zdCByZXN1bHQgPSBnZXRTaWduYXR1cmVWZXJpZmljYXRpb25zKHR4LCBpbnB1dEluZGV4LCB1bnNwZW50LnZhbHVlLCB1bmRlZmluZWQsIHByZXZPdXRwdXRzKTtcbiAgICByZXR1cm4gcmVzdWx0Lmxlbmd0aCA9PT0gMSAmJiByZXN1bHRbMF0uc2lnbmF0dXJlID8gW3RydWUsIGZhbHNlLCB0cnVlXSA6IFtmYWxzZSwgZmFsc2UsIGZhbHNlXTtcbiAgfVxuXG4gIHJldHVybiB2ZXJpZnlTaWduYXR1cmVXaXRoUHVibGljS2V5cyhcbiAgICB0eCxcbiAgICBpbnB1dEluZGV4LFxuICAgIHByZXZPdXRwdXRzLFxuICAgIHdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KS5wdWJsaWNLZXlzXG4gICkgYXMgVHJpcGxlPGJvb2xlYW4+O1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiBVc2VkIGluIGNlcnRhaW4gbGVnYWN5IHNpZ25pbmcgbWV0aG9kcyB0aGF0IGRvIG5vdCBkZXJpdmUgc2lnbmluZyBkYXRhIGZyb20gaW5kZXgvY2hhaW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRVbnNwZW50TGVnYWN5PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IGV4dGVuZHMgV2FsbGV0VW5zcGVudDxUTnVtYmVyPiB7XG4gIC8qKiBAZGVwcmVjYXRlZCAtIG9idmlhdGVkIGJ5IHNpZ25XaXRoVW5zcGVudCAqL1xuICByZWRlZW1TY3JpcHQ/OiBzdHJpbmc7XG4gIC8qKiBAZGVwcmVjYXRlZCAtIG9idmlhdGVkIGJ5IHZlcmlmeVdpdGhVbnNwZW50ICovXG4gIHdpdG5lc3NTY3JpcHQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRSZXBsYXlQcm90ZWN0aW9uVW5zcGVudFRvUHNidChcbiAgcHNidDogVXR4b1BzYnQsXG4gIHU6IFVuc3BlbnQ8YmlnaW50PixcbiAgcmVkZWVtU2NyaXB0OiBCdWZmZXIsXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgbmV0d29yazogTmV0d29yayA9IHBzYnQubmV0d29ya1xuKTogdm9pZCB7XG4gIGlmIChuZXR3b3JrICE9PSBwc2J0Lm5ldHdvcmspIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG5ldHdvcmsgcGFyYW1ldGVyIGRvZXMgbm90IG1hdGNoIHBzYnQubmV0d29ya2ApO1xuICB9XG4gIGNvbnN0IHsgdHhpZCwgdm91dCwgc2NyaXB0LCB2YWx1ZSB9ID0gdG9QcmV2T3V0cHV0KHUsIHBzYnQubmV0d29yayk7XG4gIGNvbnN0IGlzWmNhc2ggPSBnZXRNYWlubmV0KHBzYnQubmV0d29yaykgPT09IG5ldHdvcmtzLnpjYXNoO1xuXG4gIC8vIEJlY2F1c2UgWmNhc2ggZGlyZWN0bHkgaGFzaGVzIHRoZSB2YWx1ZSBmb3Igbm9uLXNlZ3dpdCB0cmFuc2FjdGlvbnMsIHdlIGRvIG5vdCBuZWVkIHRvIGNoZWNrIGluZGlyZWN0bHlcbiAgLy8gd2l0aCB0aGUgcHJldmlvdXMgdHJhbnNhY3Rpb24uIFRoZXJlZm9yZSwgd2UgY2FuIHRyZWF0IFpjYXNoIG5vbi1zZWd3aXQgdHJhbnNhY3Rpb25zIGFzIEJpdGNvaW5cbiAgLy8gc2Vnd2l0IHRyYW5zYWN0aW9uc1xuICBpZiAoIWlzVW5zcGVudFdpdGhQcmV2VHgodSkgJiYgIWlzWmNhc2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yLCByZXF1aXJlIHByZXZpb3VzIHR4IHRvIGFkZCB0byBQU0JUJyk7XG4gIH1cbiAgcHNidC5hZGRJbnB1dCh7XG4gICAgaGFzaDogdHhpZCxcbiAgICBpbmRleDogdm91dCxcbiAgICByZWRlZW1TY3JpcHQsXG4gIH0pO1xuICBpZiAoaXNaY2FzaCkge1xuICAgIHBzYnQudXBkYXRlSW5wdXQocHNidC5pbnB1dENvdW50IC0gMSwgeyB3aXRuZXNzVXR4bzogeyBzY3JpcHQsIHZhbHVlIH0gfSk7XG4gIH0gZWxzZSB7XG4gICAgcHNidC51cGRhdGVJbnB1dChwc2J0LmlucHV0Q291bnQgLSAxLCB7IG5vbldpdG5lc3NVdHhvOiAodSBhcyBVbnNwZW50V2l0aFByZXZUeDxiaWdpbnQ+KS5wcmV2VHggfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFdhbGxldFVuc3BlbnRUb1BzYnQoXG4gIHBzYnQ6IFV0eG9Qc2J0LFxuICB1OiBXYWxsZXRVbnNwZW50PGJpZ2ludD4sXG4gIHJvb3RXYWxsZXRLZXlzOiBSb290V2FsbGV0S2V5cyxcbiAgc2lnbmVyOiBLZXlOYW1lLFxuICBjb3NpZ25lcjogS2V5TmFtZSxcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBuZXR3b3JrOiBOZXR3b3JrID0gcHNidC5uZXR3b3JrXG4pOiB2b2lkIHtcbiAgaWYgKG5ldHdvcmsgIT09IHBzYnQubmV0d29yaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgbmV0d29yayBwYXJhbWV0ZXIgZG9lcyBub3QgbWF0Y2ggcHNidC5uZXR3b3JrYCk7XG4gIH1cbiAgY29uc3QgeyB0eGlkLCB2b3V0LCBzY3JpcHQsIHZhbHVlIH0gPSB0b1ByZXZPdXRwdXQodSwgcHNidC5uZXR3b3JrKTtcblxuICBwc2J0LmFkZElucHV0KHsgaGFzaDogdHhpZCwgaW5kZXg6IHZvdXQgfSk7XG4gIGNvbnN0IGlucHV0SW5kZXggPSBwc2J0LmlucHV0Q291bnQgLSAxO1xuXG4gIC8vIEJlY2F1c2UgWmNhc2ggZGlyZWN0bHkgaGFzaGVzIHRoZSB2YWx1ZSBmb3Igbm9uLXNlZ3dpdCB0cmFuc2FjdGlvbnMsIHdlIGRvIG5vdCBuZWVkIHRvIGNoZWNrIGluZGlyZWN0bHlcbiAgLy8gd2l0aCB0aGUgcHJldmlvdXMgdHJhbnNhY3Rpb24uIFRoZXJlZm9yZSwgd2UgY2FuIHRyZWF0IFpjYXNoIG5vbi1zZWd3aXQgdHJhbnNhY3Rpb25zIGFzIEJpdGNvaW5cbiAgLy8gc2Vnd2l0IHRyYW5zYWN0aW9uc1xuICBpZiAoaXNTZWd3aXQodS5jaGFpbikgfHwgZ2V0TWFpbm5ldChwc2J0Lm5ldHdvcmspID09PSBuZXR3b3Jrcy56Y2FzaCkge1xuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyB3aXRuZXNzVXR4bzogeyBzY3JpcHQsIHZhbHVlIH0gfSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFpc1Vuc3BlbnRXaXRoUHJldlR4KHUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yLCByZXF1aXJlIHByZXZpb3VzIHR4IHRvIGFkZCB0byBQU0JUJyk7XG4gICAgfVxuICAgIC8vIEZvcmNlIHRoZSBsaXRlY29pbiB0cmFuc2FjdGlvbiB0byBoYXZlIG5vIE1XRUIgYWR2YW5jZWQgdHJhbnNhY3Rpb24gZmxhZ1xuICAgIGlmIChnZXRNYWlubmV0KHBzYnQubmV0d29yaykgPT09IG5ldHdvcmtzLmxpdGVjb2luKSB7XG4gICAgICB1LnByZXZUeCA9IGNyZWF0ZVRyYW5zYWN0aW9uRnJvbUJ1ZmZlcih1LnByZXZUeCwgcHNidC5uZXR3b3JrLCB7IGFtb3VudFR5cGU6ICdiaWdpbnQnIH0pLnRvQnVmZmVyKCk7XG4gICAgfVxuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyBub25XaXRuZXNzVXR4bzogdS5wcmV2VHggfSk7XG4gIH1cblxuICBjb25zdCB3YWxsZXRLZXlzID0gcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh1LmNoYWluLCB1LmluZGV4KTtcbiAgY29uc3Qgc2NyaXB0VHlwZSA9IHNjcmlwdFR5cGVGb3JDaGFpbih1LmNoYWluKTtcbiAgY29uc3QgaXNCYWNrdXBGbG93ID0gc2lnbmVyID09PSAnYmFja3VwJyB8fCBjb3NpZ25lciA9PT0gJ2JhY2t1cCc7XG5cbiAgaWYgKHNjcmlwdFR5cGUgPT09ICdwMnRyJyB8fCAoc2NyaXB0VHlwZSA9PT0gJ3AydHJNdXNpZzInICYmIGlzQmFja3VwRmxvdykpIHtcbiAgICBjb25zdCBjcmVhdGVTcGVuZFNjcmlwdFAydHJGbiA9IHNjcmlwdFR5cGUgPT09ICdwMnRyJyA/IGNyZWF0ZVNwZW5kU2NyaXB0UDJ0ciA6IGNyZWF0ZVNwZW5kU2NyaXB0UDJ0ck11c2lnMjtcbiAgICBjb25zdCB7IGNvbnRyb2xCbG9jaywgd2l0bmVzc1NjcmlwdCwgbGVhZlZlcnNpb24sIGxlYWZIYXNoIH0gPSBjcmVhdGVTcGVuZFNjcmlwdFAydHJGbih3YWxsZXRLZXlzLnB1YmxpY0tleXMsIFtcbiAgICAgIHdhbGxldEtleXNbc2lnbmVyXS5wdWJsaWNLZXksXG4gICAgICB3YWxsZXRLZXlzW2Nvc2lnbmVyXS5wdWJsaWNLZXksXG4gICAgXSk7XG4gICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICB0YXBMZWFmU2NyaXB0OiBbeyBjb250cm9sQmxvY2ssIHNjcmlwdDogd2l0bmVzc1NjcmlwdCwgbGVhZlZlcnNpb24gfV0sXG4gICAgICB0YXBCaXAzMkRlcml2YXRpb246IFtzaWduZXIsIGNvc2lnbmVyXS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgbGVhZkhhc2hlczogW2xlYWZIYXNoXSxcbiAgICAgICAgcHVia2V5OiB0b1hPbmx5UHVibGljS2V5KHdhbGxldEtleXNba2V5XS5wdWJsaWNLZXkpLFxuICAgICAgICBwYXRoOiByb290V2FsbGV0S2V5cy5nZXREZXJpdmF0aW9uUGF0aChyb290V2FsbGV0S2V5c1trZXldLCB1LmNoYWluLCB1LmluZGV4KSxcbiAgICAgICAgbWFzdGVyRmluZ2VycHJpbnQ6IHJvb3RXYWxsZXRLZXlzW2tleV0uZmluZ2VycHJpbnQsXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoc2NyaXB0VHlwZSA9PT0gJ3AydHJNdXNpZzInKSB7XG4gICAgY29uc3Qge1xuICAgICAgaW50ZXJuYWxQdWJrZXk6IHRhcEludGVybmFsS2V5LFxuICAgICAgb3V0cHV0UHVia2V5OiB0YXBPdXRwdXRLZXksXG4gICAgICB0YXB0cmVlUm9vdCxcbiAgICB9ID0gY3JlYXRlS2V5UGF0aFAydHJNdXNpZzIod2FsbGV0S2V5cy5wdWJsaWNLZXlzKTtcbiAgICBjb25zdCBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhID0gZW5jb2RlUHNidE11c2lnMlBhcnRpY2lwYW50cyh7XG4gICAgICB0YXBPdXRwdXRLZXksXG4gICAgICB0YXBJbnRlcm5hbEtleSxcbiAgICAgIHBhcnRpY2lwYW50UHViS2V5czogW3dhbGxldEtleXMudXNlci5wdWJsaWNLZXksIHdhbGxldEtleXMuYml0Z28ucHVibGljS2V5XSxcbiAgICB9KTtcbiAgICBwc2J0LmFkZFByb3ByaWV0YXJ5S2V5VmFsVG9JbnB1dChpbnB1dEluZGV4LCBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhKTtcbiAgICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgIHRhcEludGVybmFsS2V5OiB0YXBJbnRlcm5hbEtleSxcbiAgICAgIHRhcE1lcmtsZVJvb3Q6IHRhcHRyZWVSb290LFxuICAgICAgdGFwQmlwMzJEZXJpdmF0aW9uOiBbc2lnbmVyLCBjb3NpZ25lcl0ubWFwKChrZXkpID0+ICh7XG4gICAgICAgIGxlYWZIYXNoZXM6IFtdLFxuICAgICAgICBwdWJrZXk6IHRvWE9ubHlQdWJsaWNLZXkod2FsbGV0S2V5c1trZXldLnB1YmxpY0tleSksXG4gICAgICAgIHBhdGg6IHJvb3RXYWxsZXRLZXlzLmdldERlcml2YXRpb25QYXRoKHJvb3RXYWxsZXRLZXlzW2tleV0sIHUuY2hhaW4sIHUuaW5kZXgpLFxuICAgICAgICBtYXN0ZXJGaW5nZXJwcmludDogcm9vdFdhbGxldEtleXNba2V5XS5maW5nZXJwcmludCxcbiAgICAgIH0pKSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7IHdpdG5lc3NTY3JpcHQsIHJlZGVlbVNjcmlwdCB9ID0gY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMyh3YWxsZXRLZXlzLnB1YmxpY0tleXMsIHNjcmlwdFR5cGUpO1xuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgYmlwMzJEZXJpdmF0aW9uOiBbMCwgMSwgMl0ubWFwKChpZHgpID0+ICh7XG4gICAgICAgIHB1YmtleTogd2FsbGV0S2V5cy50cmlwbGVbaWR4XS5wdWJsaWNLZXksXG4gICAgICAgIHBhdGg6IHdhbGxldEtleXMucGF0aHNbaWR4XSxcbiAgICAgICAgbWFzdGVyRmluZ2VycHJpbnQ6IHJvb3RXYWxsZXRLZXlzLnRyaXBsZVtpZHhdLmZpbmdlcnByaW50LFxuICAgICAgfSkpLFxuICAgIH0pO1xuICAgIGlmICh3aXRuZXNzU2NyaXB0KSB7XG4gICAgICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHsgd2l0bmVzc1NjcmlwdCB9KTtcbiAgICB9XG4gICAgaWYgKHJlZGVlbVNjcmlwdCkge1xuICAgICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IHJlZGVlbVNjcmlwdCB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5zcGVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvVW5zcGVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBc0Q7QUFFdEQsb0RBTzBCO0FBQzFCLDJDQUErQztBQUMvQyw0Q0FBdUc7QUFLdkcsd0NBUW9CO0FBQ3BCLHFDQUErQztBQUUvQyxzQ0FBeUQ7QUFDekQsZ0RBQTZEO0FBQzdELDhDQUFxRDtBQUNyRCxnREFBcUQ7QUFDckQsMENBQWlGO0FBYWpGLFNBQWdCLGVBQWUsQ0FBa0MsQ0FBbUI7SUFDbEYsT0FBUSxDQUE0QixDQUFDLEtBQUssS0FBSyxTQUFTLENBQUM7QUFDM0QsQ0FBQztBQUZELDBDQUVDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQ2xDLFNBQTBDLEVBQzFDLFVBQWtCLEVBQ2xCLE9BQStCLEVBQy9CLGFBQWtEO0lBRWxELE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1RyxNQUFNLFVBQVUsR0FBRyxrQ0FBa0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckQsTUFBTSxTQUFTLEdBQUcsc0NBQXNCLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFDekYsTUFBTSxpQkFBaUIsR0FBRyx3QkFBYyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQWtCLENBQUMsQ0FBQztJQUN4RixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1FBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0NBQWdDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxTQUFTLENBQUMsUUFB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QixpQkFBaUIsRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVc7aUJBQzFELENBQUMsQ0FBQzthQUNKLENBQUMsQ0FBQztTQUNKO1FBRUQsTUFBTSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsR0FBRyxzQ0FBc0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xHLElBQUksYUFBYSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUN6QyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7U0FDakQ7UUFDRCxJQUFJLFlBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUU7WUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1NBQ2hEO0tBQ0Y7QUFDSCxDQUFDO0FBN0hELGdFQTZIQztBQUVELFNBQWdCLHNCQUFzQixDQUNwQyxJQUFjLEVBQ2QsQ0FBd0IsRUFDeEIsY0FBOEIsRUFDOUIsTUFBZSxFQUNmLFFBQWlCO0FBQ2pCOztHQUVHO0FBQ0gsVUFBbUIsSUFBSSxDQUFDLE9BQU87SUFFL0IsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRTtRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7S0FDeEQ7SUFDRCxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdCLDBCQUEwQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM3RixDQUFDO0FBaEJELHdEQWdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldE1haW5uZXQsIE5ldHdvcmssIG5ldHdvcmtzIH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgVXR4b1RyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4uL1V0eG9UcmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHtcbiAgY3JlYXRlS2V5UGF0aFAydHJNdXNpZzIsXG4gIGNyZWF0ZU91dHB1dFNjcmlwdDJvZjMsXG4gIGNyZWF0ZVNwZW5kU2NyaXB0UDJ0cixcbiAgY3JlYXRlU3BlbmRTY3JpcHRQMnRyTXVzaWcyLFxuICBzY3JpcHRUeXBlRm9yQ2hhaW4sXG4gIHRvWE9ubHlQdWJsaWNLZXksXG59IGZyb20gJy4uL291dHB1dFNjcmlwdHMnO1xuaW1wb3J0IHsgdG9PdXRwdXRTY3JpcHQgfSBmcm9tICcuLi8uLi9hZGRyZXNzJztcbmltcG9ydCB7IGdldFNpZ25hdHVyZVZlcmlmaWNhdGlvbnMsIHNpZ25JbnB1dDJPZjMsIHZlcmlmeVNpZ25hdHVyZVdpdGhQdWJsaWNLZXlzIH0gZnJvbSAnLi4vc2lnbmF0dXJlJztcbmltcG9ydCB7IFdhbGxldFVuc3BlbnRTaWduZXIgfSBmcm9tICcuL1dhbGxldFVuc3BlbnRTaWduZXInO1xuaW1wb3J0IHsgS2V5TmFtZSwgUm9vdFdhbGxldEtleXMgfSBmcm9tICcuL1dhbGxldEtleXMnO1xuaW1wb3J0IHsgVXR4b1RyYW5zYWN0aW9uIH0gZnJvbSAnLi4vVXR4b1RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyaXBsZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7XG4gIHRvT3V0cHV0LFxuICBVbnNwZW50V2l0aFByZXZUeCxcbiAgVW5zcGVudCxcbiAgaXNVbnNwZW50V2l0aFByZXZUeCxcbiAgdG9QcmV2T3V0cHV0LFxuICBwYXJzZU91dHB1dElkLFxuICBnZXRPdXRwdXRJZEZvcklucHV0LFxufSBmcm9tICcuLi9VbnNwZW50JztcbmltcG9ydCB7IENoYWluQ29kZSwgaXNTZWd3aXQgfSBmcm9tICcuL2NoYWlucyc7XG5pbXBvcnQgeyBVdHhvUHNidCB9IGZyb20gJy4uL1V0eG9Qc2J0JztcbmltcG9ydCB7IGVuY29kZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHMgfSBmcm9tICcuLi9NdXNpZzInO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNhY3Rpb25Gcm9tQnVmZmVyIH0gZnJvbSAnLi4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgcGFyc2VTaWduYXR1cmVTY3JpcHQgfSBmcm9tICcuLi9wYXJzZUlucHV0JztcbmltcG9ydCB7IGNoZWNrRm9ySW5wdXQgfSBmcm9tICdiaXAxNzQvc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBQcm9wcmlldGFyeUtleVN1YnR5cGUsIFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiB9IGZyb20gJy4uL1BzYnRVdGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IGV4dGVuZHMgVW5zcGVudDxUTnVtYmVyPiB7XG4gIGNoYWluOiBDaGFpbkNvZGU7XG4gIGluZGV4OiBudW1iZXI7XG4gIHdpdG5lc3NTY3JpcHQ/OiBzdHJpbmc7XG4gIHZhbHVlU3RyaW5nPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vbldpdG5lc3NXYWxsZXRVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+XG4gIGV4dGVuZHMgVW5zcGVudFdpdGhQcmV2VHg8VE51bWJlcj4sXG4gICAgV2FsbGV0VW5zcGVudDxUTnVtYmVyPiB7fVxuXG5leHBvcnQgZnVuY3Rpb24gaXNXYWxsZXRVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KHU6IFVuc3BlbnQ8VE51bWJlcj4pOiB1IGlzIFdhbGxldFVuc3BlbnQ8VE51bWJlcj4ge1xuICByZXR1cm4gKHUgYXMgV2FsbGV0VW5zcGVudDxUTnVtYmVyPikuY2hhaW4gIT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNpZ25JbnB1dFdpdGhVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICB0eEJ1aWxkZXI6IFV0eG9UcmFuc2FjdGlvbkJ1aWxkZXI8VE51bWJlcj4sXG4gIGlucHV0SW5kZXg6IG51bWJlcixcbiAgdW5zcGVudDogV2FsbGV0VW5zcGVudDxUTnVtYmVyPixcbiAgdW5zcGVudFNpZ25lcjogV2FsbGV0VW5zcGVudFNpZ25lcjxSb290V2FsbGV0S2V5cz5cbik6IHZvaWQge1xuICBjb25zdCB7IHdhbGxldEtleXMsIHNpZ25lciwgY29zaWduZXIgfSA9IHVuc3BlbnRTaWduZXIuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KTtcbiAgY29uc3Qgc2NyaXB0VHlwZSA9IHNjcmlwdFR5cGVGb3JDaGFpbih1bnNwZW50LmNoYWluKTtcbiAgY29uc3QgcHViU2NyaXB0ID0gY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMyh3YWxsZXRLZXlzLnB1YmxpY0tleXMsIHNjcmlwdFR5cGUpLnNjcmlwdFB1YktleTtcbiAgY29uc3QgcHViU2NyaXB0RXhwZWN0ZWQgPSB0b091dHB1dFNjcmlwdCh1bnNwZW50LmFkZHJlc3MsIHR4QnVpbGRlci5uZXR3b3JrIGFzIE5ldHdvcmspO1xuICBpZiAoIXB1YlNjcmlwdC5lcXVhbHMocHViU2NyaXB0RXhwZWN0ZWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHB1YnNjcmlwdCBtaXNtYXRjaDogZXhwZWN0ZWQgJHtwdWJTY3JpcHRFeHBlY3RlZC50b1N0cmluZygnaGV4Jyl9IGdvdCAke3B1YlNjcmlwdC50b1N0cmluZygnaGV4Jyl9YFxuICAgICk7XG4gIH1cbiAgc2lnbklucHV0Mk9mMzxUTnVtYmVyPihcbiAgICB0eEJ1aWxkZXIsXG4gICAgaW5wdXRJbmRleCxcbiAgICBzY3JpcHRUeXBlLFxuICAgIHdhbGxldEtleXMucHVibGljS2V5cyxcbiAgICBzaWduZXIsXG4gICAgY29zaWduZXIucHVibGljS2V5LFxuICAgIHVuc3BlbnQudmFsdWVcbiAgKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gdHhcbiAqIEBwYXJhbSBpbnB1dEluZGV4XG4gKiBAcGFyYW0gdW5zcGVudHNcbiAqIEBwYXJhbSB3YWxsZXRLZXlzXG4gKiBAcmV0dXJuIHRyaXBsZSBvZiBib29sZWFucyBpbmRpY2F0aW5nIGEgdmFsaWQgc2lnbmF0dXJlIGZvciBlYWNoIHB1YmtleVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5U2lnbmF0dXJlV2l0aFVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gIHR4OiBVdHhvVHJhbnNhY3Rpb248VE51bWJlcj4sXG4gIGlucHV0SW5kZXg6IG51bWJlcixcbiAgdW5zcGVudHM6IFVuc3BlbnQ8VE51bWJlcj5bXSxcbiAgd2FsbGV0S2V5czogUm9vdFdhbGxldEtleXNcbik6IFRyaXBsZTxib29sZWFuPiB7XG4gIGlmICh0eC5pbnMubGVuZ3RoICE9PSB1bnNwZW50cy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGlucHV0IGxlbmd0aCBtdXN0IG1hdGNoIHVuc3BlbnRzIGxlbmd0aGApO1xuICB9XG5cbiAgY29uc3QgaW5wdXQgPSB0eC5pbnNbaW5wdXRJbmRleF07XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmICghaW5wdXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIGlucHV0IGF0IGluZGV4ICR7aW5wdXRJbmRleH1gKTtcbiAgfVxuXG4gIGNvbnN0IHVuc3BlbnQgPSB1bnNwZW50c1tpbnB1dEluZGV4XTtcbiAgaWYgKCFpc1dhbGxldFVuc3BlbnQodW5zcGVudCkgfHwgKCFpbnB1dC5zY3JpcHQ/Lmxlbmd0aCAmJiAhaW5wdXQud2l0bmVzcz8ubGVuZ3RoKSkge1xuICAgIHJldHVybiBbZmFsc2UsIGZhbHNlLCBmYWxzZV07XG4gIH1cblxuICBjb25zdCBwYXJzZWRJbnB1dCA9IHBhcnNlU2lnbmF0dXJlU2NyaXB0KGlucHV0KTtcbiAgY29uc3QgcHJldk91dHB1dHMgPSB1bnNwZW50cy5tYXAoKHUpID0+IHRvT3V0cHV0KHUsIHR4Lm5ldHdvcmspKTtcblxuICAvLyBJZiBpdCBpcyBhIHRhcHJvb3Qga2V5UGF0aFNwZW5kIGlucHV0LCB0aGUgb25seSB2YWxpZCBzaWduYXR1cmUgY29tYmluYXRpb25zIGlzIHVzZXItYml0Z28uIFdlIGNhblxuICAvLyBvbmx5IHZlcmlmeSB0aGF0IHRoZSBhZ2dyZWdhdGVkIHNpZ25hdHVyZSBpcyB2YWxpZCwgbm90IHRoYXQgdGhlIGluZGl2aWR1YWwgcGFydGlhbC1zaWduYXR1cmUgaXMgdmFsaWQuXG4gIC8vIFRoZXJlZm9yZSwgd2UgY2FuIG9ubHkgc2F5IHRoYXQgZWl0aGVyIGFsbCBwYXJ0aWFsIHNpZ25hdHVyZXMgYXJlIHZhbGlkLCBvciBub25lIGFyZS5cbiAgaWYgKHBhcnNlZElucHV0LnNjcmlwdFR5cGUgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGdldFNpZ25hdHVyZVZlcmlmaWNhdGlvbnModHgsIGlucHV0SW5kZXgsIHVuc3BlbnQudmFsdWUsIHVuZGVmaW5lZCwgcHJldk91dHB1dHMpO1xuICAgIHJldHVybiByZXN1bHQubGVuZ3RoID09PSAxICYmIHJlc3VsdFswXS5zaWduYXR1cmUgPyBbdHJ1ZSwgZmFsc2UsIHRydWVdIDogW2ZhbHNlLCBmYWxzZSwgZmFsc2VdO1xuICB9XG5cbiAgcmV0dXJuIHZlcmlmeVNpZ25hdHVyZVdpdGhQdWJsaWNLZXlzKFxuICAgIHR4LFxuICAgIGlucHV0SW5kZXgsXG4gICAgcHJldk91dHB1dHMsXG4gICAgd2FsbGV0S2V5cy5kZXJpdmVGb3JDaGFpbkFuZEluZGV4KHVuc3BlbnQuY2hhaW4sIHVuc3BlbnQuaW5kZXgpLnB1YmxpY0tleXNcbiAgKSBhcyBUcmlwbGU8Ym9vbGVhbj47XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFVzZWQgaW4gY2VydGFpbiBsZWdhY3kgc2lnbmluZyBtZXRob2RzIHRoYXQgZG8gbm90IGRlcml2ZSBzaWduaW5nIGRhdGEgZnJvbSBpbmRleC9jaGFpblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFVuc3BlbnRMZWdhY3k8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gZXh0ZW5kcyBXYWxsZXRVbnNwZW50PFROdW1iZXI+IHtcbiAgLyoqIEBkZXByZWNhdGVkIC0gb2J2aWF0ZWQgYnkgc2lnbldpdGhVbnNwZW50ICovXG4gIHJlZGVlbVNjcmlwdD86IHN0cmluZztcbiAgLyoqIEBkZXByZWNhdGVkIC0gb2J2aWF0ZWQgYnkgdmVyaWZ5V2l0aFVuc3BlbnQgKi9cbiAgd2l0bmVzc1NjcmlwdD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBAcGFyYW0gcHNidFxuICogQHBhcmFtIGlucHV0SW5kZXhcbiAqIEBwYXJhbSBpZCBVbnNwZW50IElEXG4gKiBAcmV0dXJucyB0cnVlIGlmZiB0aGUgdW5zcGVudCBJRCBvbiB0aGUgdW5zcGVudCBhbmQgcHNidCBpbnB1dCBtYXRjaFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHNidEluY2x1ZGVzVW5zcGVudEF0SW5kZXgocHNidDogVXR4b1BzYnQsIGlucHV0SW5kZXg6IG51bWJlciwgaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjaGVja0ZvcklucHV0KHBzYnQuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuXG4gIGNvbnN0IHsgdHhpZCwgdm91dCB9ID0gcGFyc2VPdXRwdXRJZChpZCk7XG4gIGNvbnN0IHBzYnRPdXRQb2ludCA9IGdldE91dHB1dElkRm9ySW5wdXQocHNidC50eElucHV0c1tpbnB1dEluZGV4XSk7XG4gIHJldHVybiBwc2J0T3V0UG9pbnQudHhpZCA9PT0gdHhpZCAmJiBwc2J0T3V0UG9pbnQudm91dCA9PT0gdm91dDtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIHBzYnQgaW5wdXQgYXQgdGhlIGdpdmVuIGluZGV4XG4gKiBAcGFyYW0gcHNidFxuICogQHBhcmFtIGlucHV0SW5kZXhcbiAqIEBwYXJhbSB1XG4gKiBAcGFyYW0gcmVkZWVtU2NyaXB0IE9ubHkgb3ZlcnJpZGVzIGlmIHRoZXJlIGlzIG5vIHJlZGVlbVNjcmlwdCBpbiB0aGUgaW5wdXQgY3VycmVudGx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVSZXBsYXlQcm90ZWN0aW9uVW5zcGVudFRvUHNidChcbiAgcHNidDogVXR4b1BzYnQsXG4gIGlucHV0SW5kZXg6IG51bWJlcixcbiAgdTogVW5zcGVudDxiaWdpbnQ+LFxuICByZWRlZW1TY3JpcHQ/OiBCdWZmZXJcbik6IHZvaWQge1xuICBpZiAoIXBzYnRJbmNsdWRlc1Vuc3BlbnRBdEluZGV4KHBzYnQsIGlucHV0SW5kZXgsIHUuaWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bnNwZW50IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gcHNidCBpbnB1dGApO1xuICB9XG4gIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dChwc2J0LmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcblxuICBpZiAocmVkZWVtU2NyaXB0ICYmICFpbnB1dC5yZWRlZW1TY3JpcHQpIHtcbiAgICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHsgcmVkZWVtU2NyaXB0IH0pO1xuICB9XG5cbiAgLy8gQmVjYXVzZSBaY2FzaCBkaXJlY3RseSBoYXNoZXMgdGhlIHZhbHVlIGZvciBub24tc2Vnd2l0IHRyYW5zYWN0aW9ucywgd2UgZG8gbm90IG5lZWQgdG8gY2hlY2sgaW5kaXJlY3RseVxuICAvLyB3aXRoIHRoZSBwcmV2aW91cyB0cmFuc2FjdGlvbi4gVGhlcmVmb3JlLCB3ZSBjYW4gdHJlYXQgWmNhc2ggbm9uLXNlZ3dpdCB0cmFuc2FjdGlvbnMgYXMgQml0Y29pblxuICAvLyBzZWd3aXQgdHJhbnNhY3Rpb25zXG4gIGNvbnN0IGlzWmNhc2ggPSBnZXRNYWlubmV0KHBzYnQubmV0d29yaykgPT09IG5ldHdvcmtzLnpjYXNoO1xuICBpZiAoIWlzVW5zcGVudFdpdGhQcmV2VHgodSkgJiYgIWlzWmNhc2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yLCByZXF1aXJlIHByZXZpb3VzIHR4IHRvIGFkZCB0byBQU0JUJyk7XG4gIH1cbiAgaWYgKGlzWmNhc2ggJiYgIWlucHV0LndpdG5lc3NVdHhvKSB7XG4gICAgY29uc3QgeyBzY3JpcHQsIHZhbHVlIH0gPSB0b1ByZXZPdXRwdXQodSwgcHNidC5uZXR3b3JrKTtcbiAgICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHsgd2l0bmVzc1V0eG86IHsgc2NyaXB0LCB2YWx1ZSB9IH0pO1xuICB9IGVsc2UgaWYgKCFpc1pjYXNoICYmICFpbnB1dC5ub25XaXRuZXNzVXR4bykge1xuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyBub25XaXRuZXNzVXR4bzogKHUgYXMgVW5zcGVudFdpdGhQcmV2VHg8YmlnaW50PikucHJldlR4IH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFVuc3BlbnRUb1BzYnQocHNidDogVXR4b1BzYnQsIGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgeyB0eGlkLCB2b3V0IH0gPSBwYXJzZU91dHB1dElkKGlkKTtcbiAgcHNidC5hZGRJbnB1dCh7XG4gICAgaGFzaDogdHhpZCxcbiAgICBpbmRleDogdm91dCxcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRSZXBsYXlQcm90ZWN0aW9uVW5zcGVudFRvUHNidChcbiAgcHNidDogVXR4b1BzYnQsXG4gIHU6IFVuc3BlbnQ8YmlnaW50PixcbiAgcmVkZWVtU2NyaXB0OiBCdWZmZXIsXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgbmV0d29yazogTmV0d29yayA9IHBzYnQubmV0d29ya1xuKTogdm9pZCB7XG4gIGlmIChwc2J0Lm5ldHdvcmsgIT09IG5ldHdvcmspIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BzYnQgbmV0d29yayBkb2VzIG5vdCBtYXRjaCBuZXR3b3JrJyk7XG4gIH1cbiAgYWRkVW5zcGVudFRvUHNidChwc2J0LCB1LmlkKTtcbiAgdXBkYXRlUmVwbGF5UHJvdGVjdGlvblVuc3BlbnRUb1BzYnQocHNidCwgcHNidC5pbnB1dENvdW50IC0gMSwgdSwgcmVkZWVtU2NyaXB0KTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIFBTQlQgd2l0aCB0aGUgdW5zcGVudCBkYXRhIGZvciB0aGUgaW5wdXQgYXQgdGhlIGdpdmVuIGluZGV4IGlmIHRoZSBkYXRhIGlzIG5vdCB0aGVyZSBhbHJlYWR5LlxuICpcbiAqIEBwYXJhbSBwc2J0XG4gKiBAcGFyYW0gaW5wdXRJbmRleFxuICogQHBhcmFtIHVcbiAqIEBwYXJhbSByb290V2FsbGV0S2V5c1xuICogQHBhcmFtIHNpZ25lclxuICogQHBhcmFtIGNvc2lnbmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVXYWxsZXRVbnNwZW50Rm9yUHNidChcbiAgcHNidDogVXR4b1BzYnQsXG4gIGlucHV0SW5kZXg6IG51bWJlcixcbiAgdTogV2FsbGV0VW5zcGVudDxiaWdpbnQ+LFxuICByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIHNpZ25lcjogS2V5TmFtZSxcbiAgY29zaWduZXI6IEtleU5hbWVcbik6IHZvaWQge1xuICBpZiAoIXBzYnRJbmNsdWRlc1Vuc3BlbnRBdEluZGV4KHBzYnQsIGlucHV0SW5kZXgsIHUuaWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bnNwZW50IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gcHNidCBpbnB1dGApO1xuICB9XG4gIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dChwc2J0LmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcblxuICAvLyBCZWNhdXNlIFpjYXNoIGRpcmVjdGx5IGhhc2hlcyB0aGUgdmFsdWUgZm9yIG5vbi1zZWd3aXQgdHJhbnNhY3Rpb25zLCB3ZSBkbyBub3QgbmVlZCB0byBjaGVjayBpbmRpcmVjdGx5XG4gIC8vIHdpdGggdGhlIHByZXZpb3VzIHRyYW5zYWN0aW9uLiBUaGVyZWZvcmUsIHdlIGNhbiB0cmVhdCBaY2FzaCBub24tc2Vnd2l0IHRyYW5zYWN0aW9ucyBhcyBCaXRjb2luXG4gIC8vIHNlZ3dpdCB0cmFuc2FjdGlvbnNcbiAgY29uc3QgaXNaY2FzaE9yU2Vnd2l0ID0gaXNTZWd3aXQodS5jaGFpbikgfHwgZ2V0TWFpbm5ldChwc2J0Lm5ldHdvcmspID09PSBuZXR3b3Jrcy56Y2FzaDtcbiAgaWYgKGlzWmNhc2hPclNlZ3dpdCAmJiAhaW5wdXQud2l0bmVzc1V0eG8pIHtcbiAgICBjb25zdCB7IHNjcmlwdCwgdmFsdWUgfSA9IHRvUHJldk91dHB1dCh1LCBwc2J0Lm5ldHdvcmspO1xuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyB3aXRuZXNzVXR4bzogeyBzY3JpcHQsIHZhbHVlIH0gfSk7XG4gIH0gZWxzZSBpZiAoIWlzWmNhc2hPclNlZ3dpdCkge1xuICAgIGlmICghaXNVbnNwZW50V2l0aFByZXZUeCh1KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciwgcmVxdWlyZSBwcmV2aW91cyB0eCB0byBhZGQgdG8gUFNCVCcpO1xuICAgIH1cblxuICAgIGlmICghaW5wdXQud2l0bmVzc1V0eG8gJiYgIWlucHV0Lm5vbldpdG5lc3NVdHhvKSB7XG4gICAgICAvLyBGb3JjZSB0aGUgbGl0ZWNvaW4gdHJhbnNhY3Rpb24gdG8gaGF2ZSBubyBNV0VCIGFkdmFuY2VkIHRyYW5zYWN0aW9uIGZsYWdcbiAgICAgIGlmIChnZXRNYWlubmV0KHBzYnQubmV0d29yaykgPT09IG5ldHdvcmtzLmxpdGVjb2luKSB7XG4gICAgICAgIHUucHJldlR4ID0gY3JlYXRlVHJhbnNhY3Rpb25Gcm9tQnVmZmVyKHUucHJldlR4LCBwc2J0Lm5ldHdvcmssIHsgYW1vdW50VHlwZTogJ2JpZ2ludCcgfSkudG9CdWZmZXIoKTtcbiAgICAgIH1cblxuICAgICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IG5vbldpdG5lc3NVdHhvOiB1LnByZXZUeCB9KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB3YWxsZXRLZXlzID0gcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh1LmNoYWluLCB1LmluZGV4KTtcbiAgY29uc3Qgc2NyaXB0VHlwZSA9IHNjcmlwdFR5cGVGb3JDaGFpbih1LmNoYWluKTtcbiAgY29uc3QgaXNCYWNrdXBGbG93ID0gc2lnbmVyID09PSAnYmFja3VwJyB8fCBjb3NpZ25lciA9PT0gJ2JhY2t1cCc7XG5cbiAgaWYgKHNjcmlwdFR5cGUgPT09ICdwMnRyJyB8fCAoc2NyaXB0VHlwZSA9PT0gJ3AydHJNdXNpZzInICYmIGlzQmFja3VwRmxvdykpIHtcbiAgICBpZiAoaW5wdXQudGFwTGVhZlNjcmlwdCAmJiBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3JlYXRlU3BlbmRTY3JpcHRQMnRyRm4gPSBzY3JpcHRUeXBlID09PSAncDJ0cicgPyBjcmVhdGVTcGVuZFNjcmlwdFAydHIgOiBjcmVhdGVTcGVuZFNjcmlwdFAydHJNdXNpZzI7XG4gICAgY29uc3QgeyBjb250cm9sQmxvY2ssIHdpdG5lc3NTY3JpcHQsIGxlYWZWZXJzaW9uLCBsZWFmSGFzaCB9ID0gY3JlYXRlU3BlbmRTY3JpcHRQMnRyRm4od2FsbGV0S2V5cy5wdWJsaWNLZXlzLCBbXG4gICAgICB3YWxsZXRLZXlzW3NpZ25lcl0ucHVibGljS2V5LFxuICAgICAgd2FsbGV0S2V5c1tjb3NpZ25lcl0ucHVibGljS2V5LFxuICAgIF0pO1xuICAgIGlmICghaW5wdXQudGFwTGVhZlNjcmlwdCkge1xuICAgICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICAgIHRhcExlYWZTY3JpcHQ6IFt7IGNvbnRyb2xCbG9jaywgc2NyaXB0OiB3aXRuZXNzU2NyaXB0LCBsZWFmVmVyc2lvbiB9XSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIWlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbikge1xuICAgICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICAgIHRhcEJpcDMyRGVyaXZhdGlvbjogW3NpZ25lciwgY29zaWduZXJdLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgICAgIGxlYWZIYXNoZXM6IFtsZWFmSGFzaF0sXG4gICAgICAgICAgcHVia2V5OiB0b1hPbmx5UHVibGljS2V5KHdhbGxldEtleXNba2V5XS5wdWJsaWNLZXkpLFxuICAgICAgICAgIHBhdGg6IHJvb3RXYWxsZXRLZXlzLmdldERlcml2YXRpb25QYXRoKHJvb3RXYWxsZXRLZXlzW2tleV0sIHUuY2hhaW4sIHUuaW5kZXgpLFxuICAgICAgICAgIG1hc3RlckZpbmdlcnByaW50OiByb290V2FsbGV0S2V5c1trZXldLmZpbmdlcnByaW50LFxuICAgICAgICB9KSksXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc2NyaXB0VHlwZSA9PT0gJ3AydHJNdXNpZzInKSB7XG4gICAgY29uc3Qge1xuICAgICAgaW50ZXJuYWxQdWJrZXk6IHRhcEludGVybmFsS2V5LFxuICAgICAgb3V0cHV0UHVia2V5OiB0YXBPdXRwdXRLZXksXG4gICAgICB0YXB0cmVlUm9vdCxcbiAgICB9ID0gY3JlYXRlS2V5UGF0aFAydHJNdXNpZzIod2FsbGV0S2V5cy5wdWJsaWNLZXlzKTtcblxuICAgIGlmIChcbiAgICAgIHBzYnQuZ2V0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXgsIHtcbiAgICAgICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgICAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTLFxuICAgICAgfSkubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICBjb25zdCBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhID0gZW5jb2RlUHNidE11c2lnMlBhcnRpY2lwYW50cyh7XG4gICAgICAgIHRhcE91dHB1dEtleSxcbiAgICAgICAgdGFwSW50ZXJuYWxLZXksXG4gICAgICAgIHBhcnRpY2lwYW50UHViS2V5czogW3dhbGxldEtleXMudXNlci5wdWJsaWNLZXksIHdhbGxldEtleXMuYml0Z28ucHVibGljS2V5XSxcbiAgICAgIH0pO1xuICAgICAgcHNidC5hZGRQcm9wcmlldGFyeUtleVZhbFRvSW5wdXQoaW5wdXRJbmRleCwgcGFydGljaXBhbnRzS2V5VmFsRGF0YSk7XG4gICAgfVxuXG4gICAgaWYgKCFpbnB1dC50YXBJbnRlcm5hbEtleSkge1xuICAgICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICAgIHRhcEludGVybmFsS2V5OiB0YXBJbnRlcm5hbEtleSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghaW5wdXQudGFwTWVya2xlUm9vdCkge1xuICAgICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICAgIHRhcE1lcmtsZVJvb3Q6IHRhcHRyZWVSb290LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFpbnB1dC50YXBCaXAzMkRlcml2YXRpb24pIHtcbiAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgICB0YXBCaXAzMkRlcml2YXRpb246IFtzaWduZXIsIGNvc2lnbmVyXS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICBsZWFmSGFzaGVzOiBbXSxcbiAgICAgICAgICBwdWJrZXk6IHRvWE9ubHlQdWJsaWNLZXkod2FsbGV0S2V5c1trZXldLnB1YmxpY0tleSksXG4gICAgICAgICAgcGF0aDogcm9vdFdhbGxldEtleXMuZ2V0RGVyaXZhdGlvblBhdGgocm9vdFdhbGxldEtleXNba2V5XSwgdS5jaGFpbiwgdS5pbmRleCksXG4gICAgICAgICAgbWFzdGVyRmluZ2VycHJpbnQ6IHJvb3RXYWxsZXRLZXlzW2tleV0uZmluZ2VycHJpbnQsXG4gICAgICAgIH0pKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoIWlucHV0LmJpcDMyRGVyaXZhdGlvbikge1xuICAgICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICAgIGJpcDMyRGVyaXZhdGlvbjogWzAsIDEsIDJdLm1hcCgoaWR4KSA9PiAoe1xuICAgICAgICAgIHB1YmtleTogd2FsbGV0S2V5cy50cmlwbGVbaWR4XS5wdWJsaWNLZXksXG4gICAgICAgICAgcGF0aDogd2FsbGV0S2V5cy5wYXRoc1tpZHhdLFxuICAgICAgICAgIG1hc3RlckZpbmdlcnByaW50OiByb290V2FsbGV0S2V5cy50cmlwbGVbaWR4XS5maW5nZXJwcmludCxcbiAgICAgICAgfSkpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB3aXRuZXNzU2NyaXB0LCByZWRlZW1TY3JpcHQgfSA9IGNyZWF0ZU91dHB1dFNjcmlwdDJvZjMod2FsbGV0S2V5cy5wdWJsaWNLZXlzLCBzY3JpcHRUeXBlKTtcbiAgICBpZiAod2l0bmVzc1NjcmlwdCAmJiAhaW5wdXQud2l0bmVzc1NjcmlwdCkge1xuICAgICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IHdpdG5lc3NTY3JpcHQgfSk7XG4gICAgfVxuICAgIGlmIChyZWRlZW1TY3JpcHQgJiYgIWlucHV0LnJlZGVlbVNjcmlwdCkge1xuICAgICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IHJlZGVlbVNjcmlwdCB9KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFdhbGxldFVuc3BlbnRUb1BzYnQoXG4gIHBzYnQ6IFV0eG9Qc2J0LFxuICB1OiBXYWxsZXRVbnNwZW50PGJpZ2ludD4sXG4gIHJvb3RXYWxsZXRLZXlzOiBSb290V2FsbGV0S2V5cyxcbiAgc2lnbmVyOiBLZXlOYW1lLFxuICBjb3NpZ25lcjogS2V5TmFtZSxcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBuZXR3b3JrOiBOZXR3b3JrID0gcHNidC5uZXR3b3JrXG4pOiB2b2lkIHtcbiAgaWYgKHBzYnQubmV0d29yayAhPT0gbmV0d29yaykge1xuICAgIHRocm93IG5ldyBFcnJvcigncHNidCBuZXR3b3JrIGRvZXMgbm90IG1hdGNoIG5ldHdvcmsnKTtcbiAgfVxuICBhZGRVbnNwZW50VG9Qc2J0KHBzYnQsIHUuaWQpO1xuICB1cGRhdGVXYWxsZXRVbnNwZW50Rm9yUHNidChwc2J0LCBwc2J0LmlucHV0Q291bnQgLSAxLCB1LCByb290V2FsbGV0S2V5cywgc2lnbmVyLCBjb3NpZ25lcik7XG59XG4iXX0=
@@ -17,5 +17,5 @@ export declare function mockWalletUnspent<TNumber extends number | bigint>(netwo
17
17
  vout?: number;
18
18
  id?: string;
19
19
  }): WalletUnspent<TNumber> | NonWitnessWalletUnspent<TNumber>;
20
- export declare function mockUnspents<TNumber extends number | bigint>(rootWalletKeys: RootWalletKeys, inputScriptTypes: InputType[], testOutputAmount: TNumber, network: Network): WalletUnspent<TNumber>[];
20
+ export declare function mockUnspents<TNumber extends number | bigint>(rootWalletKeys: RootWalletKeys, inputScriptTypes: (InputType | outputScripts.ScriptTypeP2shP2pk)[], testOutputAmount: TNumber, network: Network): (Unspent<TNumber> | WalletUnspent<TNumber>)[];
21
21
  //# sourceMappingURL=mock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../../src/testutil/mock.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,EAAc,OAAO,EAAY,MAAM,aAAa,CAAC;AAE5D,OAAO,EACL,SAAS,EAMT,uBAAuB,EACvB,aAAa,EACb,cAAc,EAEd,OAAO,EACP,iBAAiB,EACjB,eAAe,EACf,aAAa,EACd,MAAM,UAAU,CAAC;AAMlB,oBAAY,SAAS,GAAG,aAAa,CAAC,cAAc,CAAC;AAErD,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,GACf,eAAe,CAAC,MAAM,CAAC,CA6BzB;AAED,eAAO,MAAM,uBAAuB,gBAA8B,CAAC;AAGnE,wBAAgB,yBAAyB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACvE,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,EACnB,OAAO,EAAE,OAAO,GACf,OAAO,CAET;AAED,wBAAgB,2BAA2B,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACzE,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,EACd,EAAE,GAA6B,EAAE,IAAQ,EAAE,GAAE;IAAE,GAAG,CAAC,EAAE,cAAc,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACxF,iBAAiB,CAAC,OAAO,CAAC,CAI5B;AAED,wBAAgB,iBAAiB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAC/D,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,EACd,EACE,KAAS,EACT,KAAS,EACT,IAA6B,EAC7B,IAAQ,EACR,EAAE,GACH,GAAE;IAAE,KAAK,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,cAAc,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/F,aAAa,CAAC,OAAO,CAAC,GAAG,uBAAuB,CAAC,OAAO,CAAC,CA0B3D;AAED,wBAAgB,YAAY,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAC1D,cAAc,EAAE,cAAc,EAC9B,gBAAgB,EAAE,SAAS,EAAE,EAC7B,gBAAgB,EAAE,OAAO,EACzB,OAAO,EAAE,OAAO,GACf,aAAa,CAAC,OAAO,CAAC,EAAE,CAW1B"}
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../../src/testutil/mock.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,EAAc,OAAO,EAAY,MAAM,aAAa,CAAC;AAE5D,OAAO,EACL,SAAS,EAMT,uBAAuB,EACvB,aAAa,EACb,cAAc,EAEd,OAAO,EACP,iBAAiB,EACjB,eAAe,EACf,aAAa,EACd,MAAM,UAAU,CAAC;AAMlB,oBAAY,SAAS,GAAG,aAAa,CAAC,cAAc,CAAC;AAErD,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,GACf,eAAe,CAAC,MAAM,CAAC,CA6BzB;AAED,eAAO,MAAM,uBAAuB,gBAA8B,CAAC;AAGnE,wBAAgB,yBAAyB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACvE,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,EACnB,OAAO,EAAE,OAAO,GACf,OAAO,CAET;AAED,wBAAgB,2BAA2B,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACzE,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,EACd,EAAE,GAA6B,EAAE,IAAQ,EAAE,GAAE;IAAE,GAAG,CAAC,EAAE,cAAc,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACxF,iBAAiB,CAAC,OAAO,CAAC,CAI5B;AAED,wBAAgB,iBAAiB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAC/D,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,EACd,EACE,KAAS,EACT,KAAS,EACT,IAA6B,EAC7B,IAAQ,EACR,EAAE,GACH,GAAE;IAAE,KAAK,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,cAAc,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/F,aAAa,CAAC,OAAO,CAAC,GAAG,uBAAuB,CAAC,OAAO,CAAC,CA0B3D;AAED,wBAAgB,YAAY,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAC1D,cAAc,EAAE,cAAc,EAC9B,gBAAgB,EAAE,CAAC,SAAS,GAAG,aAAa,CAAC,kBAAkB,CAAC,EAAE,EAClE,gBAAgB,EAAE,OAAO,EACzB,OAAO,EAAE,OAAO,GACf,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,CAgB/C"}
@@ -79,8 +79,14 @@ function mockUnspents(rootWalletKeys, inputScriptTypes, testOutputAmount, networ
79
79
  vout: i,
80
80
  });
81
81
  }
82
+ else if (t === bitgo_1.outputScripts.scriptTypeP2shP2pk) {
83
+ return mockReplayProtectionUnspent(network, testOutputAmount, {
84
+ key: exports.replayProtectionKeyPair,
85
+ vout: i,
86
+ });
87
+ }
82
88
  throw new Error(`invalid input type ${t}`);
83
89
  });
84
90
  }
85
91
  exports.mockUnspents = mockUnspents;
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0dXRpbC9tb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDBDQUEwQztBQUMxQyw4QkFBOEI7QUFDOUIsMENBQTREO0FBRTVELG9DQWVrQjtBQUNsQix3Q0FBOEM7QUFDOUMsMERBQTRGO0FBRTVGLGlDQUFzRDtBQUl0RCxTQUFnQixVQUFVLENBQ3hCLElBQVksRUFDWixZQUFvQixFQUNwQixLQUFhLEVBQ2IsT0FBZ0I7SUFFaEIsTUFBTSxlQUFlLEdBQUcsNEJBQW9CLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBRTFELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMvQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDOUQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDbEMsSUFBSSxDQUFDLFVBQVU7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFFMUYsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUMxQyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7WUFDbEIsZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUM1RDthQUFNO1lBQ0wsZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENB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VUFBVSxFQUFFLDBCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFlBQVksRUFDL0YsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUNiLE9BQU8sQ0FDUixDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQ1gsZ0JBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxxQkFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLG1CQUFRLENBQUMsS0FBSztZQUN2RCxDQUFDLENBQUMsa0JBQVUsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDO1lBQ25DLENBQUMsQ0FBQyw0QkFBb0IsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEQsT0FBTztZQUNMLEdBQUcsT0FBTztZQUNWLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztTQUNOLENBQUM7S0FDSDtBQUNILENBQUM7QUFwQ0QsOENBb0NDO0FBRUQsU0FBZ0IsWUFBWSxDQUMxQixjQUE4QixFQUM5QixnQkFBNkIsRUFDN0IsZ0JBQXlCLEVBQ3pCLE9BQWdCO0lBRWhCLE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBMEIsRUFBRTtRQUMzRCxJQUFJLHFCQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDckMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ2xELElBQUksRUFBRSxjQUFjO2dCQUNwQixLQUFLLEVBQUUsNEJBQW9CLENBQUMsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLEVBQUUsQ0FBQzthQUNSLENBQUMsQ0FBQztTQUNKO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFoQkQsb0NBZ0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQklQMzJJbnRlcmZhY2UgfSBmcm9tICdiaXAzMic7XG5pbXBvcnQgKiBhcyBub2JsZSBmcm9tICdAbm9ibGUvc2VjcDI1NmsxJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnLi4nO1xuaW1wb3J0IHsgZ2V0TWFpbm5ldCwgTmV0d29yaywgbmV0d29ya3MgfSBmcm9tICcuLi9uZXR3b3Jrcyc7XG5cbmltcG9ydCB7XG4gIENoYWluQ29kZSxcbiAgY3JlYXRlUHNidEZvck5ldHdvcmssXG4gIGZyb21PdXRwdXQsXG4gIGZyb21PdXRwdXRXaXRoUHJldlR4LFxuICBnZXRFeHRlcm5hbENoYWluQ29kZSxcbiAgaXNTZWd3aXQsXG4gIE5vbldpdG5lc3NXYWxsZXRVbnNwZW50LFxuICBvdXRwdXRTY3JpcHRzLFxuICBSb290V2FsbGV0S2V5cyxcbiAgc2NyaXB0VHlwZUZvckNoYWluLFxuICBVbnNwZW50LFxuICBVbnNwZW50V2l0aFByZXZUeCxcbiAgVXR4b1RyYW5zYWN0aW9uLFxuICBXYWxsZXRVbnNwZW50LFxufSBmcm9tICcuLi9iaXRnbyc7XG5pbXBvcnQgeyBmcm9tT3V0cHV0U2NyaXB0IH0gZnJvbSAnLi4vYWRkcmVzcyc7XG5pbXBvcnQgeyBjcmVhdGVPdXRwdXRTY3JpcHQyb2YzLCBjcmVhdGVPdXRwdXRTY3JpcHRQMnNoUDJwayB9IGZyb20gJy4uL2JpdGdvL291dHB1dFNjcmlwdHMnO1xuXG5pbXBvcnQgeyBnZXREZWZhdWx0V2FsbGV0S2V5cywgZ2V0S2V5IH0gZnJvbSAnLi9rZXlzJztcblxuZXhwb3J0IHR5cGUgSW5wdXRUeXBlID0gb3V0cHV0U2NyaXB0cy5TY3JpcHRUeXBlMk9mMztcblxuZXhwb3J0IGZ1bmN0aW9uIG1vY2tQcmV2VHgoXG4gIHZvdXQ6IG51bWJlcixcbiAgb3V0cHV0U2NyaXB0OiBCdWZmZXIsXG4gIHZhbHVlOiBiaWdpbnQsXG4gIG5ldHdvcms6IE5ldHdvcmtcbik6IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+IHtcbiAgY29uc3QgcHNidEZyb21OZXR3b3JrID0gY3JlYXRlUHNidEZvck5ldHdvcmsoeyBuZXR3b3JrIH0pO1xuXG4gIGNvbnN0IHByaXZLZXkgPSBub2JsZS51dGlscy5yYW5kb21Qcml2YXRlS2V5KCk7XG4gIGNvbnN0IHB1YmtleSA9IEJ1ZmZlci5mcm9tKG5vYmxlLmdldFB1YmxpY0tleShwcml2S2V5LCB0cnVlKSk7XG4gIGNvbnN0IHBheW1lbnQgPSB1dHhvbGliLnBheW1lbnRzLnAyd3BraCh7IHB1YmtleSB9KTtcbiAgY29uc3QgZGVzdE91dHB1dCA9IHBheW1lbnQub3V0cHV0O1xuICBpZiAoIWRlc3RPdXRwdXQpIHRocm93IG5ldyBFcnJvcignSW1wb3NzaWJsZSwgcGF5bWVudCB3ZSBqdXN0IGNvbnN0cnVjdGVkIGhhcyBubyBvdXRwdXQnKTtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDw9IHZvdXQ7IGluZGV4KyspIHtcbiAgICBpZiAoaW5kZXggPT09IHZvdXQpIHtcbiAgICAgIHBzYnRGcm9tTmV0d29yay5hZGRPdXRwdXQoeyBzY3JpcHQ6IG91dHB1dFNjcmlwdCwgdmFsdWUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBzYnRGcm9tTmV0d29yay5hZGRPdXRwdXQoeyBzY3JpcHQ6IGRlc3RPdXRwdXQsIHZhbHVlIH0pO1xuICAgIH1cbiAgfVxuICBwc2J0RnJvbU5ldHdvcmsuYWRkSW5wdXQoe1xuICAgIGhhc2g6IEJ1ZmZlci5hbGxvYygzMiwgMHgwMSksXG4gICAgaW5kZXg6IDAsXG4gICAgd2l0bmVzc1V0eG86IHsgc2NyaXB0OiBkZXN0T3V0cHV0LCB2YWx1ZTogdmFsdWUgKiAoQmlnSW50KHZvdXQpICsgQmlnSW50KDEpKSArIEJpZ0ludCgxMDAwKSB9LFxuICB9KTtcbiAgcHNidEZyb21OZXR3b3JrLnNpZ25JbnB1dCgwLCB7XG4gICAgcHVibGljS2V5OiBwdWJrZXksXG4gICAgc2lnbjogKGhhc2g6IEJ1ZmZlciwgbG93Uj86IGJvb2xlYW4pID0+XG4gICAgICBCdWZmZXIuZnJvbShub2JsZS5zaWduU3luYyhoYXNoLCBwcml2S2V5LCB7IGNhbm9uaWNhbDogIWxvd1IsIGRlcjogZmFsc2UgfSkpLFxuICB9KTtcbiAgcHNidEZyb21OZXR3b3JrLnZhbGlkYXRlU2lnbmF0dXJlc09mQWxsSW5wdXRzKCk7XG4gIHBzYnRGcm9tTmV0d29yay5maW5hbGl6ZUFsbElucHV0cygpO1xuICByZXR1cm4gcHNidEZyb21OZXR3b3JrLmV4dHJhY3RUcmFuc2FjdGlvbigpIGFzIFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+O1xufVxuXG5leHBvcnQgY29uc3QgcmVwbGF5UHJvdGVjdGlvbktleVBhaXIgPSBnZXRLZXkoJ3JlcGxheS1wcm90ZWN0aW9uJyk7XG5jb25zdCByZXBsYXlQcm90ZWN0aW9uU2NyaXB0UHViS2V5ID0gY3JlYXRlT3V0cHV0U2NyaXB0UDJzaFAycGsocmVwbGF5UHJvdGVjdGlvbktleVBhaXIucHVibGljS2V5KS5zY3JpcHRQdWJLZXk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlcGxheVByb3RlY3Rpb25VbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBiaWdpbnQgfCBudW1iZXI+KFxuICB1OiBVbnNwZW50PFROdW1iZXI+LFxuICBuZXR3b3JrOiBOZXR3b3JrXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIHUuYWRkcmVzcyA9PT0gZnJvbU91dHB1dFNjcmlwdChyZXBsYXlQcm90ZWN0aW9uU2NyaXB0UHViS2V5LCBuZXR3b3JrKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vY2tSZXBsYXlQcm90ZWN0aW9uVW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgbmV0d29yazogTmV0d29yayxcbiAgdmFsdWU6IFROdW1iZXIsXG4gIHsga2V5ID0gcmVwbGF5UHJvdGVjdGlvbktleVBhaXIsIHZvdXQgPSAwIH06IHsga2V5PzogQklQMzJJbnRlcmZhY2U7IHZvdXQ/OiBudW1iZXIgfSA9IHt9XG4pOiBVbnNwZW50V2l0aFByZXZUeDxUTnVtYmVyPiB7XG4gIGNvbnN0IG91dHB1dFNjcmlwdCA9IGNyZWF0ZU91dHB1dFNjcmlwdFAyc2hQMnBrKGtleS5wdWJsaWNLZXkpLnNjcmlwdFB1YktleTtcbiAgY29uc3QgcHJldlRyYW5zYWN0aW9uID0gbW9ja1ByZXZUeCh2b3V0LCBvdXRwdXRTY3JpcHQsIEJpZ0ludCh2YWx1ZSksIG5ldHdvcmspO1xuICByZXR1cm4geyAuLi5mcm9tT3V0cHV0V2l0aFByZXZUeChwcmV2VHJhbnNhY3Rpb24sIHZvdXQpLCB2YWx1ZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1dhbGxldFVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gIG5ldHdvcms6IE5ldHdvcmssXG4gIHZhbHVlOiBUTnVtYmVyLFxuICB7XG4gICAgY2hhaW4gPSAwLFxuICAgIGluZGV4ID0gMCxcbiAgICBrZXlzID0gZ2V0RGVmYXVsdFdhbGxldEtleXMoKSxcbiAgICB2b3V0ID0gMCxcbiAgICBpZCxcbiAgfTogeyBjaGFpbj86IENoYWluQ29kZTsgaW5kZXg/OiBudW1iZXI7IGtleXM/OiBSb290V2FsbGV0S2V5czsgdm91dD86IG51bWJlcjsgaWQ/OiBzdHJpbmcgfSA9IHt9XG4pOiBXYWxsZXRVbnNwZW50PFROdW1iZXI+IHwgTm9uV2l0bmVzc1dhbGxldFVuc3BlbnQ8VE51bWJlcj4ge1xuICBjb25zdCBkZXJpdmVkS2V5cyA9IGtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleChjaGFpbiwgaW5kZXgpO1xuICBjb25zdCBhZGRyZXNzID0gZnJvbU91dHB1dFNjcmlwdChcbiAgICBjcmVhdGVPdXRwdXRTY3JpcHQyb2YzKGRlcml2ZWRLZXlzLnB1YmxpY0tleXMsIHNjcmlwdFR5cGVGb3JDaGFpbihjaGFpbikpLnNjcmlwdFB1YktleSxcbiAgICBuZXR3b3JrXG4gICk7XG4gIGlmIChpZCAmJiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgaWQsIGFkZHJlc3MsIGNoYWluLCBpbmRleCwgdmFsdWUgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcmV2VHJhbnNhY3Rpb24gPSBtb2NrUHJldlR4KFxuICAgICAgdm91dCxcbiAgICAgIGNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoZGVyaXZlZEtleXMucHVibGljS2V5cywgc2NyaXB0VHlwZUZvckNoYWluKGNoYWluKSwgbmV0d29yaykuc2NyaXB0UHViS2V5LFxuICAgICAgQmlnSW50KHZhbHVlKSxcbiAgICAgIG5ldHdvcmtcbiAgICApO1xuICAgIGNvbnN0IHVuc3BlbnQgPVxuICAgICAgaXNTZWd3aXQoY2hhaW4pIHx8IGdldE1haW5uZXQobmV0d29yaykgPT09IG5ldHdvcmtzLnpjYXNoXG4gICAgICAgID8gZnJvbU91dHB1dChwcmV2VHJhbnNhY3Rpb24sIHZvdXQpXG4gICAgICAgIDogZnJvbU91dHB1dFdpdGhQcmV2VHgocHJldlRyYW5zYWN0aW9uLCB2b3V0KTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udW5zcGVudCxcbiAgICAgIGNoYWluLFxuICAgICAgaW5kZXgsXG4gICAgICB2YWx1ZSxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb2NrVW5zcGVudHM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gIHJvb3RXYWxsZXRLZXlzOiBSb290V2FsbGV0S2V5cyxcbiAgaW5wdXRTY3JpcHRUeXBlczogSW5wdXRUeXBlW10sXG4gIHRlc3RPdXRwdXRBbW91bnQ6IFROdW1iZXIsXG4gIG5ldHdvcms6IE5ldHdvcmtcbik6IFdhbGxldFVuc3BlbnQ8VE51bWJlcj5bXSB7XG4gIHJldHVybiBpbnB1dFNjcmlwdFR5cGVzLm1hcCgodCwgaSk6IFdhbGxldFVuc3BlbnQ8VE51bWJlcj4gPT4ge1xuICAgIGlmIChvdXRwdXRTY3JpcHRzLmlzU2NyaXB0VHlwZTJPZjModCkpIHtcbiAgICAgIHJldHVybiBtb2NrV2FsbGV0VW5zcGVudChuZXR3b3JrLCB0ZXN0T3V0cHV0QW1vdW50LCB7XG4gICAgICAgIGtleXM6IHJvb3RXYWxsZXRLZXlzLFxuICAgICAgICBjaGFpbjogZ2V0RXh0ZXJuYWxDaGFpbkNvZGUodCksXG4gICAgICAgIHZvdXQ6IGksXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGlucHV0IHR5cGUgJHt0fWApO1xuICB9KTtcbn1cbiJdfQ==
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0dXRpbC9tb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDBDQUEwQztBQUMxQyw4QkFBOEI7QUFDOUIsMENBQTREO0FBRTVELG9DQWVrQjtBQUNsQix3Q0FBOEM7QUFDOUMsMERBQTRGO0FBRTVGLGlDQUFzRDtBQUl0RCxTQUFnQixVQUFVLENBQ3hCLElBQVksRUFDWixZQUFvQixFQUNwQixLQUFhLEVBQ2IsT0FBZ0I7SUFFaEIsTUFBTSxlQUFlLEdBQUcsNEJBQW9CLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBRTFELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMvQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDOUQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDbEMsSUFBSSxDQUFDLFVBQVU7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFFMUYsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUMxQyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7WUFDbEIsZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUM1RDthQUFNO1lBQ0wsZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENB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QUMsRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBckJELG9DQXFCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJJUDMySW50ZXJmYWNlIH0gZnJvbSAnYmlwMzInO1xuaW1wb3J0ICogYXMgbm9ibGUgZnJvbSAnQG5vYmxlL3NlY3AyNTZrMSc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJy4uJztcbmltcG9ydCB7IGdldE1haW5uZXQsIE5ldHdvcmssIG5ldHdvcmtzIH0gZnJvbSAnLi4vbmV0d29ya3MnO1xuXG5pbXBvcnQge1xuICBDaGFpbkNvZGUsXG4gIGNyZWF0ZVBzYnRGb3JOZXR3b3JrLFxuICBmcm9tT3V0cHV0LFxuICBmcm9tT3V0cHV0V2l0aFByZXZUeCxcbiAgZ2V0RXh0ZXJuYWxDaGFpbkNvZGUsXG4gIGlzU2Vnd2l0LFxuICBOb25XaXRuZXNzV2FsbGV0VW5zcGVudCxcbiAgb3V0cHV0U2NyaXB0cyxcbiAgUm9vdFdhbGxldEtleXMsXG4gIHNjcmlwdFR5cGVGb3JDaGFpbixcbiAgVW5zcGVudCxcbiAgVW5zcGVudFdpdGhQcmV2VHgsXG4gIFV0eG9UcmFuc2FjdGlvbixcbiAgV2FsbGV0VW5zcGVudCxcbn0gZnJvbSAnLi4vYml0Z28nO1xuaW1wb3J0IHsgZnJvbU91dHB1dFNjcmlwdCB9IGZyb20gJy4uL2FkZHJlc3MnO1xuaW1wb3J0IHsgY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMywgY3JlYXRlT3V0cHV0U2NyaXB0UDJzaFAycGsgfSBmcm9tICcuLi9iaXRnby9vdXRwdXRTY3JpcHRzJztcblxuaW1wb3J0IHsgZ2V0RGVmYXVsdFdhbGxldEtleXMsIGdldEtleSB9IGZyb20gJy4va2V5cyc7XG5cbmV4cG9ydCB0eXBlIElucHV0VHlwZSA9IG91dHB1dFNjcmlwdHMuU2NyaXB0VHlwZTJPZjM7XG5cbmV4cG9ydCBmdW5jdGlvbiBtb2NrUHJldlR4KFxuICB2b3V0OiBudW1iZXIsXG4gIG91dHB1dFNjcmlwdDogQnVmZmVyLFxuICB2YWx1ZTogYmlnaW50LFxuICBuZXR3b3JrOiBOZXR3b3JrXG4pOiBVdHhvVHJhbnNhY3Rpb248YmlnaW50PiB7XG4gIGNvbnN0IHBzYnRGcm9tTmV0d29yayA9IGNyZWF0ZVBzYnRGb3JOZXR3b3JrKHsgbmV0d29yayB9KTtcblxuICBjb25zdCBwcml2S2V5ID0gbm9ibGUudXRpbHMucmFuZG9tUHJpdmF0ZUtleSgpO1xuICBjb25zdCBwdWJrZXkgPSBCdWZmZXIuZnJvbShub2JsZS5nZXRQdWJsaWNLZXkocHJpdktleSwgdHJ1ZSkpO1xuICBjb25zdCBwYXltZW50ID0gdXR4b2xpYi5wYXltZW50cy5wMndwa2goeyBwdWJrZXkgfSk7XG4gIGNvbnN0IGRlc3RPdXRwdXQgPSBwYXltZW50Lm91dHB1dDtcbiAgaWYgKCFkZXN0T3V0cHV0KSB0aHJvdyBuZXcgRXJyb3IoJ0ltcG9zc2libGUsIHBheW1lbnQgd2UganVzdCBjb25zdHJ1Y3RlZCBoYXMgbm8gb3V0cHV0Jyk7XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8PSB2b3V0OyBpbmRleCsrKSB7XG4gICAgaWYgKGluZGV4ID09PSB2b3V0KSB7XG4gICAgICBwc2J0RnJvbU5ldHdvcmsuYWRkT3V0cHV0KHsgc2NyaXB0OiBvdXRwdXRTY3JpcHQsIHZhbHVlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwc2J0RnJvbU5ldHdvcmsuYWRkT3V0cHV0KHsgc2NyaXB0OiBkZXN0T3V0cHV0LCB2YWx1ZSB9KTtcbiAgICB9XG4gIH1cbiAgcHNidEZyb21OZXR3b3JrLmFkZElucHV0KHtcbiAgICBoYXNoOiBCdWZmZXIuYWxsb2MoMzIsIDB4MDEpLFxuICAgIGluZGV4OiAwLFxuICAgIHdpdG5lc3NVdHhvOiB7IHNjcmlwdDogZGVzdE91dHB1dCwgdmFsdWU6IHZhbHVlICogKEJpZ0ludCh2b3V0KSArIEJpZ0ludCgxKSkgKyBCaWdJbnQoMTAwMCkgfSxcbiAgfSk7XG4gIHBzYnRGcm9tTmV0d29yay5zaWduSW5wdXQoMCwge1xuICAgIHB1YmxpY0tleTogcHVia2V5LFxuICAgIHNpZ246IChoYXNoOiBCdWZmZXIsIGxvd1I/OiBib29sZWFuKSA9PlxuICAgICAgQnVmZmVyLmZyb20obm9ibGUuc2lnblN5bmMoaGFzaCwgcHJpdktleSwgeyBjYW5vbmljYWw6ICFsb3dSLCBkZXI6IGZhbHNlIH0pKSxcbiAgfSk7XG4gIHBzYnRGcm9tTmV0d29yay52YWxpZGF0ZVNpZ25hdHVyZXNPZkFsbElucHV0cygpO1xuICBwc2J0RnJvbU5ldHdvcmsuZmluYWxpemVBbGxJbnB1dHMoKTtcbiAgcmV0dXJuIHBzYnRGcm9tTmV0d29yay5leHRyYWN0VHJhbnNhY3Rpb24oKSBhcyBVdHhvVHJhbnNhY3Rpb248YmlnaW50Pjtcbn1cblxuZXhwb3J0IGNvbnN0IHJlcGxheVByb3RlY3Rpb25LZXlQYWlyID0gZ2V0S2V5KCdyZXBsYXktcHJvdGVjdGlvbicpO1xuY29uc3QgcmVwbGF5UHJvdGVjdGlvblNjcmlwdFB1YktleSA9IGNyZWF0ZU91dHB1dFNjcmlwdFAyc2hQMnBrKHJlcGxheVByb3RlY3Rpb25LZXlQYWlyLnB1YmxpY0tleSkuc2NyaXB0UHViS2V5O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXBsYXlQcm90ZWN0aW9uVW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgYmlnaW50IHwgbnVtYmVyPihcbiAgdTogVW5zcGVudDxUTnVtYmVyPixcbiAgbmV0d29yazogTmV0d29ya1xuKTogYm9vbGVhbiB7XG4gIHJldHVybiB1LmFkZHJlc3MgPT09IGZyb21PdXRwdXRTY3JpcHQocmVwbGF5UHJvdGVjdGlvblNjcmlwdFB1YktleSwgbmV0d29yayk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb2NrUmVwbGF5UHJvdGVjdGlvblVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gIG5ldHdvcms6IE5ldHdvcmssXG4gIHZhbHVlOiBUTnVtYmVyLFxuICB7IGtleSA9IHJlcGxheVByb3RlY3Rpb25LZXlQYWlyLCB2b3V0ID0gMCB9OiB7IGtleT86IEJJUDMySW50ZXJmYWNlOyB2b3V0PzogbnVtYmVyIH0gPSB7fVxuKTogVW5zcGVudFdpdGhQcmV2VHg8VE51bWJlcj4ge1xuICBjb25zdCBvdXRwdXRTY3JpcHQgPSBjcmVhdGVPdXRwdXRTY3JpcHRQMnNoUDJwayhrZXkucHVibGljS2V5KS5zY3JpcHRQdWJLZXk7XG4gIGNvbnN0IHByZXZUcmFuc2FjdGlvbiA9IG1vY2tQcmV2VHgodm91dCwgb3V0cHV0U2NyaXB0LCBCaWdJbnQodmFsdWUpLCBuZXR3b3JrKTtcbiAgcmV0dXJuIHsgLi4uZnJvbU91dHB1dFdpdGhQcmV2VHgocHJldlRyYW5zYWN0aW9uLCB2b3V0KSwgdmFsdWUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vY2tXYWxsZXRVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICBuZXR3b3JrOiBOZXR3b3JrLFxuICB2YWx1ZTogVE51bWJlcixcbiAge1xuICAgIGNoYWluID0gMCxcbiAgICBpbmRleCA9IDAsXG4gICAga2V5cyA9IGdldERlZmF1bHRXYWxsZXRLZXlzKCksXG4gICAgdm91dCA9IDAsXG4gICAgaWQsXG4gIH06IHsgY2hhaW4/OiBDaGFpbkNvZGU7IGluZGV4PzogbnVtYmVyOyBrZXlzPzogUm9vdFdhbGxldEtleXM7IHZvdXQ/OiBudW1iZXI7IGlkPzogc3RyaW5nIH0gPSB7fVxuKTogV2FsbGV0VW5zcGVudDxUTnVtYmVyPiB8IE5vbldpdG5lc3NXYWxsZXRVbnNwZW50PFROdW1iZXI+IHtcbiAgY29uc3QgZGVyaXZlZEtleXMgPSBrZXlzLmRlcml2ZUZvckNoYWluQW5kSW5kZXgoY2hhaW4sIGluZGV4KTtcbiAgY29uc3QgYWRkcmVzcyA9IGZyb21PdXRwdXRTY3JpcHQoXG4gICAgY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMyhkZXJpdmVkS2V5cy5wdWJsaWNLZXlzLCBzY3JpcHRUeXBlRm9yQ2hhaW4oY2hhaW4pKS5zY3JpcHRQdWJLZXksXG4gICAgbmV0d29ya1xuICApO1xuICBpZiAoaWQgJiYgdHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IGlkLCBhZGRyZXNzLCBjaGFpbiwgaW5kZXgsIHZhbHVlIH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHJldlRyYW5zYWN0aW9uID0gbW9ja1ByZXZUeChcbiAgICAgIHZvdXQsXG4gICAgICBjcmVhdGVPdXRwdXRTY3JpcHQyb2YzKGRlcml2ZWRLZXlzLnB1YmxpY0tleXMsIHNjcmlwdFR5cGVGb3JDaGFpbihjaGFpbiksIG5ldHdvcmspLnNjcmlwdFB1YktleSxcbiAgICAgIEJpZ0ludCh2YWx1ZSksXG4gICAgICBuZXR3b3JrXG4gICAgKTtcbiAgICBjb25zdCB1bnNwZW50ID1cbiAgICAgIGlzU2Vnd2l0KGNoYWluKSB8fCBnZXRNYWlubmV0KG5ldHdvcmspID09PSBuZXR3b3Jrcy56Y2FzaFxuICAgICAgICA/IGZyb21PdXRwdXQocHJldlRyYW5zYWN0aW9uLCB2b3V0KVxuICAgICAgICA6IGZyb21PdXRwdXRXaXRoUHJldlR4KHByZXZUcmFuc2FjdGlvbiwgdm91dCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnVuc3BlbnQsXG4gICAgICBjaGFpbixcbiAgICAgIGluZGV4LFxuICAgICAgdmFsdWUsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1Vuc3BlbnRzPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIGlucHV0U2NyaXB0VHlwZXM6IChJbnB1dFR5cGUgfCBvdXRwdXRTY3JpcHRzLlNjcmlwdFR5cGVQMnNoUDJwaylbXSxcbiAgdGVzdE91dHB1dEFtb3VudDogVE51bWJlcixcbiAgbmV0d29yazogTmV0d29ya1xuKTogKFVuc3BlbnQ8VE51bWJlcj4gfCBXYWxsZXRVbnNwZW50PFROdW1iZXI+KVtdIHtcbiAgcmV0dXJuIGlucHV0U2NyaXB0VHlwZXMubWFwKCh0LCBpKTogVW5zcGVudDxUTnVtYmVyPiA9PiB7XG4gICAgaWYgKG91dHB1dFNjcmlwdHMuaXNTY3JpcHRUeXBlMk9mMyh0KSkge1xuICAgICAgcmV0dXJuIG1vY2tXYWxsZXRVbnNwZW50KG5ldHdvcmssIHRlc3RPdXRwdXRBbW91bnQsIHtcbiAgICAgICAga2V5czogcm9vdFdhbGxldEtleXMsXG4gICAgICAgIGNoYWluOiBnZXRFeHRlcm5hbENoYWluQ29kZSh0KSxcbiAgICAgICAgdm91dDogaSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodCA9PT0gb3V0cHV0U2NyaXB0cy5zY3JpcHRUeXBlUDJzaFAycGspIHtcbiAgICAgIHJldHVybiBtb2NrUmVwbGF5UHJvdGVjdGlvblVuc3BlbnQobmV0d29yaywgdGVzdE91dHB1dEFtb3VudCwge1xuICAgICAgICBrZXk6IHJlcGxheVByb3RlY3Rpb25LZXlQYWlyLFxuICAgICAgICB2b3V0OiBpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBpbnB1dCB0eXBlICR7dH1gKTtcbiAgfSk7XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitgo-beta/utxo-lib",
3
- "version": "8.0.3-beta.24",
3
+ "version": "8.0.3-beta.26",
4
4
  "description": "Client-side Bitcoin JavaScript library",
5
5
  "main": "./dist/src/index.js",
6
6
  "engines": {
@@ -46,7 +46,7 @@
46
46
  "dist/src"
47
47
  ],
48
48
  "dependencies": {
49
- "@bitgo-beta/blake2b": "3.0.4-beta.260",
49
+ "@bitgo-beta/blake2b": "3.0.4-beta.262",
50
50
  "@brandonblack/musig": "^0.0.1-alpha.0",
51
51
  "@noble/secp256k1": "1.6.3",
52
52
  "bech32": "^2.0.0",
@@ -84,5 +84,5 @@
84
84
  },
85
85
  "author": "BitGo SDK Team <sdkteam@bitgo.com>",
86
86
  "license": "MIT",
87
- "gitHead": "0e1ca199eb7548166f6f8c94ff71b43d62d99b7f"
87
+ "gitHead": "77997be73fc391270d93c5980b6eb28228c55b1b"
88
88
  }