@bitgo-beta/sdk-core 8.2.1-beta.2070 → 8.2.1-beta.2072
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/bitgo/keychain/iKeychains.d.ts +28 -0
- package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/iKeychains.js +1 -1
- package/dist/src/bitgo/keychain/keychains.d.ts +47 -6
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +100 -24
- package/dist/src/bitgo/safe/safe.d.ts.map +1 -1
- package/dist/src/bitgo/safe/safe.js +10 -5
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +16 -4
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +23 -8
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +4 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +11 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +20 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +55 -1
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +3 -0
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +1 -1
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/recipientUtils.js +2 -1
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +10 -1
- package/dist/test/unit/bitgo/keychain/keychains.js +261 -1
- package/dist/test/unit/bitgo/safe/safe.js +58 -1
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +224 -18
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +2 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -10
|
@@ -50,6 +50,7 @@ const io_ts_types_1 = require("io-ts-types");
|
|
|
50
50
|
const public_types_1 = require("@bitgo/public-types");
|
|
51
51
|
const ed25519_1 = require("@noble/curves/ed25519");
|
|
52
52
|
const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
|
|
53
|
+
const sdk_lib_safes_1 = require("@bitgo-beta/sdk-lib-safes");
|
|
53
54
|
const bitgoPubKeys_1 = require("../../../tss/bitgoPubKeys");
|
|
54
55
|
const common_1 = require("../../../tss/common");
|
|
55
56
|
const codecs_1 = require("../../codecs");
|
|
@@ -220,7 +221,7 @@ class EddsaMPCv2Utils extends base_1.BaseEddsaUtils {
|
|
|
220
221
|
return { userKeychain, backupKeychain, bitgoKeychain };
|
|
221
222
|
}
|
|
222
223
|
// #region keychain utils
|
|
223
|
-
async createParticipantKeychain(participantIndex, commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, webauthnInfo, encryptionVersion, enterprise, safeId) {
|
|
224
|
+
async createParticipantKeychain(participantIndex, commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, webauthnInfo, encryptionVersion, enterprise, safeId, child) {
|
|
224
225
|
let source;
|
|
225
226
|
let encryptedPrv = undefined;
|
|
226
227
|
let reducedEncryptedPrv = undefined;
|
|
@@ -229,6 +230,14 @@ class EddsaMPCv2Utils extends base_1.BaseEddsaUtils {
|
|
|
229
230
|
case typesMPCv2_1.MPCv2PartiesEnum.USER:
|
|
230
231
|
case typesMPCv2_1.MPCv2PartiesEnum.BACKUP:
|
|
231
232
|
source = participantIndex === typesMPCv2_1.MPCv2PartiesEnum.USER ? 'user' : 'backup';
|
|
233
|
+
if (privateMaterial === undefined) {
|
|
234
|
+
(0, assert_1.default)(participantIndex === typesMPCv2_1.MPCv2PartiesEnum.BACKUP &&
|
|
235
|
+
safeId !== undefined &&
|
|
236
|
+
child !== undefined &&
|
|
237
|
+
reducedPrivateMaterial === undefined, `Private material is required for ${source} keychain`);
|
|
238
|
+
(0, assert_1.default)(passphrase, `Passphrase is required for ${source} keychain`);
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
232
241
|
(0, assert_1.default)(privateMaterial, `Private material is required for ${source} keychain`);
|
|
233
242
|
(0, assert_1.default)(reducedPrivateMaterial, `Reduced private material is required for ${source} keychain`);
|
|
234
243
|
(0, assert_1.default)(passphrase, `Passphrase is required for ${source} keychain`);
|
|
@@ -266,6 +275,12 @@ class EddsaMPCv2Utils extends base_1.BaseEddsaUtils {
|
|
|
266
275
|
safeId,
|
|
267
276
|
enterprise,
|
|
268
277
|
};
|
|
278
|
+
if (child !== undefined) {
|
|
279
|
+
(0, assert_1.default)(io_ts_types_1.NonEmptyString.is(safeId), 'Safe ID is required for a derived keychain');
|
|
280
|
+
(0, assert_1.default)(io_ts_types_1.NonEmptyString.is(child.parentKeyId), 'Parent key ID is required for a derived keychain');
|
|
281
|
+
keychainParams.parent = child.parentKeyId;
|
|
282
|
+
keychainParams.derivedFromParentWithPath = (0, codecs_1.decodeWithCodec)(sdk_lib_safes_1.DerivedFromParentWithHardenedPath, `m/${child.index}'`, 'derivedFromParentWithPath');
|
|
283
|
+
}
|
|
269
284
|
if (webauthnInfo && participantIndex === typesMPCv2_1.MPCv2PartiesEnum.USER && privateMaterialBase64) {
|
|
270
285
|
// Send the passkey as `webauthnInfo`; the deprecated `webauthnDevices` array is ignored by POST /key.
|
|
271
286
|
(0, assert_1.default)(enterprise, 'enterprise is required to attach a webauthn device to the user keychain');
|
|
@@ -283,14 +298,14 @@ class EddsaMPCv2Utils extends base_1.BaseEddsaUtils {
|
|
|
283
298
|
const keychains = this.baseCoin.keychains();
|
|
284
299
|
return { ...(await keychains.add(keychainParams)), reducedEncryptedPrv };
|
|
285
300
|
}
|
|
286
|
-
async addUserKeychain(commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, webauthnInfo, encryptionVersion, enterprise, safeId) {
|
|
287
|
-
return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.USER, commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, webauthnInfo, encryptionVersion, enterprise, safeId);
|
|
301
|
+
async addUserKeychain(commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, webauthnInfo, encryptionVersion, enterprise, safeId, child) {
|
|
302
|
+
return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.USER, commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, webauthnInfo, encryptionVersion, enterprise, safeId, child);
|
|
288
303
|
}
|
|
289
|
-
async addBackupKeychain(commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, encryptionVersion, enterprise, safeId) {
|
|
290
|
-
return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BACKUP, commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, undefined, encryptionVersion, enterprise, safeId);
|
|
304
|
+
async addBackupKeychain(commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, encryptionVersion, enterprise, safeId, child) {
|
|
305
|
+
return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BACKUP, commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, undefined, encryptionVersion, enterprise, safeId, child);
|
|
291
306
|
}
|
|
292
|
-
async addBitgoKeychain(commonKeychain, safeId) {
|
|
293
|
-
return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BITGO, commonKeychain, undefined, undefined, undefined, undefined, undefined, undefined, undefined, safeId);
|
|
307
|
+
async addBitgoKeychain(commonKeychain, safeId, child) {
|
|
308
|
+
return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BITGO, commonKeychain, undefined, undefined, undefined, undefined, undefined, undefined, undefined, safeId, child);
|
|
294
309
|
}
|
|
295
310
|
// #endregion
|
|
296
311
|
async sendKeyGenerationRound1(enterprise, payload, safeId) {
|
|
@@ -887,4 +902,4 @@ exports.EddsaMPCv2RecoveryFunctions = {
|
|
|
887
902
|
isEddsaSigningMaterial,
|
|
888
903
|
signEddsaMpcV2RecoveryTx,
|
|
889
904
|
};
|
|
890
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2FNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWRkc2EvZWRkc2FNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrc0NBLGtFQVNDO0FBZ0JELG9HQTJEQztBQWVELHdEQWdDQztBQWVELDBEQWdCQztBQVdELHdEQWNDO0FBUUQsNERBbUJDO0FBeDVDRCxvREFBNEI7QUFDNUIsdURBQXlDO0FBQ3pDLDZDQUErQjtBQUMvQiw2Q0FBNkM7QUFDN0Msc0RBUzZCO0FBRTdCLG1EQUFnRDtBQUNoRCx5REFBZ0c7QUFTaEcsNERBQXFHO0FBQ3JHLGdEQUFnSDtBQUNoSCx5Q0FBK0M7QUFDL0MsOERBTXVDO0FBQ3ZDLG9EQUFxRTtBQUNyRSxxREFBd0Q7QUFDeEQsb0RBQXVEO0FBQ3ZELDRDQWFzQjtBQUd0QixpQ0FBd0M7QUFDeEMsc0RBQTZEO0FBQzdELHFFQUE2RjtBQUU3RiwwREFBaUU7QUFHakUsTUFBYSxlQUFnQixTQUFRLHFCQUFjO0lBTWpELGtCQUFrQjtJQUNsQixLQUFLLENBQUMsZUFBZSxDQUFDLE1BU3JCO1FBQ0MsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFBLGlDQUFrQixFQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sVUFBVSxHQUFHLE1BQU0sR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNwRixNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUM7UUFDL0MsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxNQUFNLHNCQUFRLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFMUUsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFBLGlDQUFrQixFQUFDLFNB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UUFDM0IsT0FBTyxTQUFTLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxDQUFDLE9BQU8sS0FBSyxRQUFRLENBQUM7SUFDakUsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUMzQixPQUFPLGtCQUFrQixJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssQ0FBQyxnQkFBZ0IsS0FBSyxRQUFRLENBQUM7SUFDbkYsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0ksS0FBSyxVQUFVLHdCQUF3QixDQUFDLE1BUTlDO0lBQ0MsTUFBTSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLEdBQUcsTUFBTSw0Q0FBNEMsQ0FDekcsTUFBTSxDQUFDLE9BQU8sRUFDZCxNQUFNLENBQUMsU0FBUyxFQUNoQixNQUFNLENBQUMsZ0JBQWdCLEVBQ3ZCLE1BQU0sQ0FBQyxLQUFLLENBQ2IsQ0FBQztJQUNGLElBQUksY0FBYyxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztRQUNuRSxNQUFNLElBQUksS0FBSyxDQUFDLDJFQUEyRSxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUNELE9BQU8sc0JBQXNCLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsY0FBYyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDckgsQ0FBQztBQUVZLFFBQUEsMkJBQTJCLEdBQUc7SUFDekMsMkJBQTJCO0lBQzNCLDRDQUE0QztJQUM1QyxzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0Qix3QkFBd0I7Q0FDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAqIGFzIHNqY2wgZnJvbSAnQGJpdGdvLWJldGEvc2pjbCc7XG5pbXBvcnQgKiBhcyBwZ3AgZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgeyBOb25FbXB0eVN0cmluZyB9IGZyb20gJ2lvLXRzLXR5cGVzJztcbmltcG9ydCB7XG4gIEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDFSZXF1ZXN0LFxuICBFZGRzYU1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2UsXG4gIEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDJSZXF1ZXN0LFxuICBFZGRzYU1QQ3YyS2V5R2VuUm91bmQyUmVzcG9uc2UsXG4gIEVkZHNhTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMU91dHB1dCxcbiAgRWRkc2FNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQyT3V0cHV0LFxuICBNUEN2MktleUdlblN0YXRlRW51bSxcbiAgTVBDdjJQYXJ0eUZyb21TdHJpbmdPck51bWJlcixcbn0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBFZGRzYU1QQ3YyS2V5R2VuQ2FsbGJhY2tzIH0gZnJvbSAnLi4vLi4vLi4vd2FsbGV0L2lXYWxsZXRzJztcbmltcG9ydCB7IGVkMjU1MTkgfSBmcm9tICdAbm9ibGUvY3VydmVzL2VkMjU1MTknO1xuaW1wb3J0IHsgRWRkc2FNUFNEa2csIEVkZHNhTVBTRHNnLCBNUFNDb21tcywgTVBTVHlwZXMsIE1QU1V0aWwgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstbGliLW1wYyc7XG5pbXBvcnQgeyBLZXljaGFpbnNUcmlwbGV0IH0gZnJvbSAnLi4vLi4vLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHtcbiAgQWRkS2V5Y2hhaW5PcHRpb25zLFxuICBEZWNyeXB0ZWRSZXRyb2ZpdFBheWxvYWQsXG4gIEtleWNoYWluLFxuICBLZXlUeXBlLFxuICBXZWJhdXRobktleUVuY3J5cHRpb25JbmZvLFxufSBmcm9tICcuLi8uLi8uLi9rZXljaGFpbic7XG5pbXBvcnQgeyBlbnZSZXF1aXJlc0JpdGdvUHViR3BnS2V5Q29uZmlnLCBpc0JpdGdvRWRkc2FNcGN2MlB1YktleSB9IGZyb20gJy4uLy4uLy4uL3Rzcy9iaXRnb1B1YktleXMnO1xuaW1wb3J0IHsgZ2V0Qml0Z29TaWduYXR1cmVTaGFyZSwgZ2V0VHhSZXF1ZXN0LCBzZW5kU2lnbmF0dXJlU2hhcmVWMiwgc2VuZFR4UmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL3Rzcy9jb21tb24nO1xuaW1wb3J0IHsgZGVjb2RlV2l0aENvZGVjIH0gZnJvbSAnLi4vLi4vY29kZWNzJztcbmltcG9ydCB7XG4gIGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUsXG4gIGdldFNpZ25hdHVyZVNoYXJlUm91bmRUd28sXG4gIGdldFNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZSxcbiAgdmVyaWZ5UGVlck1lc3NhZ2VSb3VuZE9uZSxcbiAgdmVyaWZ5UGVlck1lc3NhZ2VSb3VuZFR3byxcbn0gZnJvbSAnLi4vLi4vLi4vdHNzL2VkZHNhL2VkZHNhTVBDdjInO1xuaW1wb3J0IHsgZ2V0SW5pdGlhbGl6ZWRNcGNJbnN0YW5jZSB9IGZyb20gJy4uLy4uLy4uL3Rzcy9lZGRzYS9lZGRzYSc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdQR0tleVBhaXIgfSBmcm9tICcuLi8uLi9vcGVuZ3BnVXRpbHMnO1xuaW1wb3J0IHsgTVBDdjJQYXJ0aWVzRW51bSB9IGZyb20gJy4uL2VjZHNhL3R5cGVzTVBDdjInO1xuaW1wb3J0IHtcbiAgQ3VzdG9tRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIEN1c3RvbUVkZHNhTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21FZGRzYU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRpbmdGdW5jdGlvbixcbiAgUmVxdWVzdFR5cGUsXG4gIFNpZ25hdHVyZVNoYXJlUmVjb3JkLFxuICBTaWduYXR1cmVTaGFyZVR5cGUsXG4gIFRTU1BhcmFtcyxcbiAgVFNTUGFyYW1zRm9yTWVzc2FnZSxcbiAgVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYsXG4gIFRTU1BhcmFtc1dpdGhQcnYsXG4gIFR4UmVxdWVzdCxcbiAgaXNWMkVudmVsb3BlLFxufSBmcm9tICcuLi9iYXNlVHlwZXMnO1xuaW1wb3J0IHsgRW5jcnlwdGlvblZlcnNpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9hcGknO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vLi4vLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IEJhc2VFZGRzYVV0aWxzIH0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7IHJlc29sdmVFZmZlY3RpdmVUeFBhcmFtcyB9IGZyb20gJy4uL3JlY2lwaWVudFV0aWxzJztcbmltcG9ydCB7IEVkZHNhTVBDdjJLZXlHZW5TZW5kRm4sIEtleUdlblNlbmRlckZvckVudGVycHJpc2UgfSBmcm9tICcuL2VkZHNhTVBDdjJLZXlHZW5TZW5kZXInO1xuaW1wb3J0IHsgRWRkc2FNUEN2MlJlY292ZXJ5S2V5U2hhcmVzIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU1wY1YyS2V5U2hhcmVFbnZlbG9wZSB9IGZyb20gJy4uL2tleVNoYXJlRW52ZWxvcGUnO1xuaW1wb3J0IHsgU2lnbmluZ01hdGVyaWFsIH0gZnJvbSAnLi4vLi4vLi4vdHNzJztcblxuZXhwb3J0IGNsYXNzIEVkZHNhTVBDdjJVdGlscyBleHRlbmRzIEJhc2VFZGRzYVV0aWxzIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTVBTX0RTR19TSUdOSU5HX1VTRVJfR1BHX0tFWSA9ICdNUFNfRFNHX1NJR05JTkdfVVNFUl9HUEdfS0VZJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTVBTX0RTR19TSUdOSU5HX1JPVU5EMV9TVEFURSA9ICdNUFNfRFNHX1NJR05JTkdfUk9VTkQxX1NUQVRFJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTVBTX0RTR19TSUdOSU5HX1JPVU5EMl9TVEFURSA9ICdNUFNfRFNHX1NJR05JTkdfUk9VTkQyX1NUQVRFJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTVBTX0RLR19LRVlHRU5fUk9VTkQxX1NUQVRFID0gJ01QU19ES0dfS0VZR0VOX1JPVU5EMV9TVEFURSc7XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIGNyZWF0ZUtleWNoYWlucyhwYXJhbXM6IHtcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgZW50ZXJwcmlzZTogc3RyaW5nO1xuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZztcbiAgICByZXRyb2ZpdD86IERlY3J5cHRlZFJldHJvZml0UGF5bG9hZDtcbiAgICB3ZWJhdXRobkluZm8/OiBXZWJhdXRobktleUVuY3J5cHRpb25JbmZvO1xuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb247XG4gICAgLy8gV2FsbGV0IFNhZmVzIHYxIChAZXhwZXJpbWVudGFsKTogdGFncyB0aGUgcmVzdWx0aW5nIHVzZXIvYmFja3VwL2JpdGdvIHJvb3Qga2V5cyB3aXRoIHRoaXMgc2FmZS5cbiAgICBzYWZlSWQ/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPEtleWNoYWluc1RyaXBsZXQ+IHtcbiAgICBjb25zdCB1c2VyS2V5UGFpciA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignZWQyNTUxOScpO1xuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBwZ3AucmVhZFByaXZhdGVLZXkoeyBhcm1vcmVkS2V5OiB1c2VyS2V5UGFpci5wcml2YXRlS2V5IH0pO1xuICAgIGNvbnN0IHVzZXJHcGdQdWJsaWNLZXkgPSB1c2VyS2V5UGFpci5wdWJsaWNLZXk7XG4gICAgY29uc3QgW3VzZXJQaywgdXNlclNrXSA9IGF3YWl0IE1QU0NvbW1zLmV4dHJhY3RFZDI1NTE5S2V5UGFpcih1c2VyR3BnS2V5KTtcblxuICAgIGNvbnN0IGJhY2t1cEtleVBhaXIgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ2VkMjU1MTknKTtcbiAgICBjb25zdCBiYWNrdXBHcGdLZXkgPSBhd2FpdCBwZ3AucmVhZFByaXZhdGVLZXkoeyBhcm1vcmVkS2V5OiBiYWNrdXBLZXlQYWlyLnByaXZhdGVLZXkgfSk7XG4gICAgY29uc3QgYmFja3VwR3BnUHVibGljS2V5ID0gYmFja3VwS2V5UGFpci5wdWJsaWNLZXk7XG4gICAgY29uc3QgW2JhY2t1cFBrLCBiYWNrdXBTa10gPSBhd2FpdCBNUFNDb21tcy5leHRyYWN0RWQyNTUxOUtleVBhaXIoYmFja3VwR3BnS2V5KTtcblxuICAgIC8vIEdldCB0aGUgQml0R28gRWREU0EgTVBDdjIgcHVibGljIGtleSAoZWQyNTUxOSkuIFVzaW5nIHRoZSBkZWZhdWx0IG1wY3YyUHVibGljS2V5IChzZWNwMjU2azEpXG4gICAgLy8gaGVyZSB3b3VsZCBjYXVzZSBhIFdBU00gXCJJbnZhbGlkIElucHV0XCIgZXJyb3IsIHNvIHdlIHJlcXVpcmUgdGhlIGRlZGljYXRlZCBlZGRzYU1wY3YyUHVibGljS2V5LlxuICAgIGNvbnN0IHsgZWRkc2FNcGN2MlB1YmxpY0tleSB9ID0gYXdhaXQgdGhpcy5nZXRCaXRnb0dwZ1B1YmtleUJhc2VkT25GZWF0dXJlRmxhZ3MocGFyYW1zLmVudGVycHJpc2UsIHRydWUpO1xuICAgIGNvbnN0IGJpdGdvUHVibGljR3BnS2V5ID0gZWRkc2FNcGN2MlB1YmxpY0tleSA/PyB0aGlzLmJpdGdvRWRkc2FNcGN2MlB1YmxpY0dwZ0tleTtcbiAgICBhc3NlcnQoYml0Z29QdWJsaWNHcGdLZXksICdGYWlsZWQgdG8gZ2V0IEJpdEdvIEVkRFNBIE1QQ3YyIEdQRyBwdWJsaWMga2V5Jyk7XG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXlBcm1vcmVkID0gYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKTtcblxuICAgIGlmIChlbnZSZXF1aXJlc0JpdGdvUHViR3BnS2V5Q29uZmlnKHRoaXMuYml0Z28uZ2V0RW52KCkpKSB7XG4gICAgICBhc3NlcnQoaXNCaXRnb0VkZHNhTXBjdjJQdWJLZXkoYml0Z29QdWJsaWNHcGdLZXlBcm1vcmVkKSwgJ0ludmFsaWQgQml0R28gR1BHIHB1YmxpYyBrZXknKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0tleU9iaiA9IGF3YWl0IHBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogYml0Z29QdWJsaWNHcGdLZXlBcm1vcmVkIH0pO1xuICAgIGNvbnN0IGJpdGdvUGsgPSBhd2FpdCBNUFNDb21tcy5leHRyYWN0RWQyNTUxOVB1YmxpY0tleShiaXRnb0tleU9iaik7XG5cbiAgICAvLyBDcmVhdGUgREtHIHNlc3Npb25zIGZvciB1c2VyIChwYXJ0eSAwKSBhbmQgYmFja3VwIChwYXJ0eSAxKVxuICAgIGNvbnN0IHsgdXNlckRrZywgYmFja3VwRGtnIH0gPSBhd2FpdCB0aGlzLmdldFVzZXJBbmRCYWNrdXBTZXNzaW9uKHBhcmFtcy5yZXRyb2ZpdCk7XG5cbiAgICAvLyAjcmVnaW9uIHJvdW5kIDFcbiAgICBhd2FpdCB1c2VyRGtnLmluaXREa2codXNlclNrLCBbYmFja3VwUGssIGJpdGdvUGtdKTtcbiAgICBhd2FpdCBiYWNrdXBEa2cuaW5pdERrZyhiYWNrdXBTaywgW3VzZXJQaywgYml0Z29Qa10pO1xuXG4gICAgY29uc3QgdXNlck1zZzEgPSB1c2VyRGtnLmdldEZpcnN0TWVzc2FnZSgpO1xuICAgIGNvbnN0IGJhY2t1cE1zZzEgPSBiYWNrdXBEa2cuZ2V0Rmlyc3RNZXNzYWdlKCk7XG5cbiAgICBjb25zdCB1c2VyU2lnbmVkTXNnMSA9IGF3YWl0IE1QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKEJ1ZmZlci5mcm9tKHVzZXJNc2cxLnBheWxvYWQpLCB1c2VyR3BnS2V5KTtcbiAgICBjb25zdCBiYWNrdXBTaWduZWRNc2cxID0gYXdhaXQgTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20oYmFja3VwTXNnMS5wYXlsb2FkKSwgYmFja3VwR3BnS2V5KTtcblxuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyh1c2VyR3BnUHVibGljS2V5KSwgJ1VzZXIgR1BHIHB1YmxpYyBrZXkgaXMgcmVxdWlyZWQnKTtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoYmFja3VwR3BnUHVibGljS2V5KSwgJ0JhY2t1cCBHUEcgcHVibGljIGtleSBpcyByZXF1aXJlZCcpO1xuXG4gICAgY29uc3QgeyBzZXNzaW9uSWQsIGJpdGdvTXNnMSB9ID0gYXdhaXQgdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMShcbiAgICAgIHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAge1xuICAgICAgICB1c2VyR3BnUHVibGljS2V5LFxuICAgICAgICBiYWNrdXBHcGdQdWJsaWNLZXksXG4gICAgICAgIHVzZXJNc2cxOiB1c2VyU2lnbmVkTXNnMSxcbiAgICAgICAgYmFja3VwTXNnMTogYmFja3VwU2lnbmVkTXNnMSxcbiAgICAgICAgLi4uKHBhcmFtcy5yZXRyb2ZpdD8ud2FsbGV0SWQgPyB7IHdhbGxldElkOiBwYXJhbXMucmV0cm9maXQud2FsbGV0SWQgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgICBwYXJhbXMuc2FmZUlkXG4gICAgKTtcbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAvLyAjcmVnaW9uIHJvdW5kIDJcbiAgICBjb25zdCBiaXRnb1Jhd01zZzFCeXRlcyA9IGF3YWl0IE1QU0NvbW1zLnZlcmlmeU1wc01lc3NhZ2UoYml0Z29Nc2cxLCBiaXRnb0tleU9iaik7XG4gICAgY29uc3QgYml0Z29EZXNlcmlhbGl6ZWRNc2cxOiBNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlID0ge1xuICAgICAgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KGJpdGdvUmF3TXNnMUJ5dGVzKSxcbiAgICB9O1xuXG4gICAgY29uc3Qgcm91bmQxTWVzc2FnZXM6IE1QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2VzID0gW3VzZXJNc2cxLCBiYWNrdXBNc2cxLCBiaXRnb0Rlc2VyaWFsaXplZE1zZzFdO1xuXG4gICAgY29uc3QgdXNlclJvdW5kMk1zZ3MgPSB1c2VyRGtnLmhhbmRsZUluY29taW5nTWVzc2FnZXMocm91bmQxTWVzc2FnZXMpO1xuICAgIGNvbnN0IGJhY2t1cFJvdW5kMk1zZ3MgPSBiYWNrdXBEa2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhyb3VuZDFNZXNzYWdlcyk7XG5cbiAgICBhc3NlcnQodXNlclJvdW5kMk1zZ3MubGVuZ3RoID09PSAxLCAnVXNlciByb3VuZCAxIHNob3VsZCBwcm9kdWNlIGV4YWN0bHkgb25lIHJvdW5kIDIgbWVzc2FnZScpO1xuICAgIGFzc2VydChiYWNrdXBSb3VuZDJNc2dzLmxlbmd0aCA9PT0gMSwgJ0JhY2t1cCByb3VuZCAxIHNob3VsZCBwcm9kdWNlIGV4YWN0bHkgb25lIHJvdW5kIDIgbWVzc2FnZScpO1xuXG4gICAgY29uc3QgdXNlck1zZzIgPSB1c2VyUm91bmQyTXNnc1swXTtcbiAgICBjb25zdCBiYWNrdXBNc2cyID0gYmFja3VwUm91bmQyTXNnc1swXTtcblxuICAgIGNvbnN0IHVzZXJTaWduZWRNc2cyID0gYXdhaXQgTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20odXNlck1zZzIucGF5bG9hZCksIHVzZXJHcGdLZXkpO1xuICAgIGNvbnN0IGJhY2t1cFNpZ25lZE1zZzIgPSBhd2FpdCBNUFNDb21tcy5kZXRhY2hTaWduTXBzTWVzc2FnZShCdWZmZXIuZnJvbShiYWNrdXBNc2cyLnBheWxvYWQpLCBiYWNrdXBHcGdLZXkpO1xuXG4gICAgY29uc3Qge1xuICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWRSb3VuZDIsXG4gICAgICBjb21tb25QdWJsaWNLZXljaGFpbixcbiAgICAgIGJpdGdvTXNnMixcbiAgICB9ID0gYXdhaXQgdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMihwYXJhbXMuZW50ZXJwcmlzZSwge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgdXNlck1zZzI6IHVzZXJTaWduZWRNc2cyLFxuICAgICAgYmFja3VwTXNnMjogYmFja3VwU2lnbmVkTXNnMixcbiAgICB9KTtcbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAvLyAjcmVnaW9uIGtleWNoYWluIGNyZWF0aW9uXG4gICAgYXNzZXJ0LmVxdWFsKHNlc3Npb25JZCwgc2Vzc2lvbklkUm91bmQyLCAnUm91bmQgMSBhbmQgcm91bmQgMiBzZXNzaW9uIElEcyBkbyBub3QgbWF0Y2gnKTtcblxuICAgIGNvbnN0IGJpdGdvUmF3TXNnMkJ5dGVzID0gYXdhaXQgTVBTQ29tbXMudmVyaWZ5TXBzTWVzc2FnZShiaXRnb01zZzIsIGJpdGdvS2V5T2JqKTtcbiAgICBjb25zdCBiaXRnb0Rlc2VyaWFsaXplZE1zZzI6IE1QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2UgPSB7XG4gICAgICBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLFxuICAgICAgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkoYml0Z29SYXdNc2cyQnl0ZXMpLFxuICAgIH07XG5cbiAgICBjb25zdCByb3VuZDJNZXNzYWdlczogTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZXMgPSBbdXNlck1zZzIsIGJhY2t1cE1zZzIsIGJpdGdvRGVzZXJpYWxpemVkTXNnMl07XG5cbiAgICBjb25zdCB1c2VyRmluYWxNc2dzID0gdXNlckRrZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHJvdW5kMk1lc3NhZ2VzKTtcbiAgICBjb25zdCBiYWNrdXBGaW5hbE1zZ3MgPSBiYWNrdXBEa2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhyb3VuZDJNZXNzYWdlcyk7XG5cbiAgICBhc3NlcnQodXNlckZpbmFsTXNncy5sZW5ndGggPT09IDAsICdXQVNNIHJvdW5kIDIgc2hvdWxkIHByb2R1Y2Ugbm8gb3V0cHV0IG1lc3NhZ2VzIGZvciB1c2VyJyk7XG4gICAgYXNzZXJ0KGJhY2t1cEZpbmFsTXNncy5sZW5ndGggPT09IDAsICdXQVNNIHJvdW5kIDIgc2hvdWxkIHByb2R1Y2Ugbm8gb3V0cHV0IG1lc3NhZ2VzIGZvciBiYWNrdXAnKTtcblxuICAgIGNvbnN0IHVzZXJDb21tb25LZXljaGFpbiA9IHVzZXJEa2cuZ2V0Q29tbW9uS2V5Y2hhaW4oKTtcbiAgICBjb25zdCBiYWNrdXBDb21tb25LZXljaGFpbiA9IGJhY2t1cERrZy5nZXRDb21tb25LZXljaGFpbigpO1xuXG4gICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgdXNlckNvbW1vbktleWNoYWluLFxuICAgICAgY29tbW9uUHVibGljS2V5Y2hhaW4sXG4gICAgICAnVXNlciBjb21wdXRlZCBrZXljaGFpbiBkb2VzIG5vdCBtYXRjaCBCaXRHbyBjb21tb24ga2V5Y2hhaW4nXG4gICAgKTtcbiAgICBhc3NlcnQuZXF1YWwoXG4gICAgICBiYWNrdXBDb21tb25LZXljaGFpbixcbiAgICAgIGNvbW1vblB1YmxpY0tleWNoYWluLFxuICAgICAgJ0JhY2t1cCBjb21wdXRlZCBrZXljaGFpbiBkb2VzIG5vdCBtYXRjaCBCaXRHbyBjb21tb24ga2V5Y2hhaW4nXG4gICAgKTtcblxuICAgIGNvbnN0IHVzZXJQcml2YXRlTWF0ZXJpYWwgPSB1c2VyRGtnLmdldEtleVNoYXJlKCk7XG4gICAgY29uc3QgYmFja3VwUHJpdmF0ZU1hdGVyaWFsID0gYmFja3VwRGtnLmdldEtleVNoYXJlKCk7XG4gICAgY29uc3QgdXNlclJlZHVjZWRQcml2YXRlTWF0ZXJpYWwgPSB1c2VyRGtnLmdldFJlZHVjZWRLZXlTaGFyZSgpO1xuICAgIGNvbnN0IGJhY2t1cFJlZHVjZWRQcml2YXRlTWF0ZXJpYWwgPSBiYWNrdXBEa2cuZ2V0UmVkdWNlZEtleVNoYXJlKCk7XG5cbiAgICBjb25zdCB1c2VyS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5hZGRVc2VyS2V5Y2hhaW4oXG4gICAgICB1c2VyQ29tbW9uS2V5Y2hhaW4sXG4gICAgICB1c2VyUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgdXNlclJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsXG4gICAgICBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICBwYXJhbXMud2ViYXV0aG5JbmZvLFxuICAgICAgcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgcGFyYW1zLmVudGVycHJpc2UsXG4gICAgICBwYXJhbXMuc2FmZUlkXG4gICAgKTtcbiAgICBjb25zdCBiYWNrdXBLZXljaGFpblByb21pc2UgPSB0aGlzLmFkZEJhY2t1cEtleWNoYWluKFxuICAgICAgYmFja3VwQ29tbW9uS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBQcml2YXRlTWF0ZXJpYWwsXG4gICAgICBiYWNrdXBSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICBwYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgcGFyYW1zLmVudGVycHJpc2UsXG4gICAgICBwYXJhbXMuc2FmZUlkXG4gICAgKTtcbiAgICBjb25zdCBiaXRnb0tleWNoYWluUHJvbWlzZSA9IHRoaXMuYWRkQml0Z29LZXljaGFpbih1c2VyQ29tbW9uS2V5Y2hhaW4sIHBhcmFtcy5zYWZlSWQpO1xuXG4gICAgY29uc3QgW3VzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW5dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdXNlcktleWNoYWluUHJvbWlzZSxcbiAgICAgIGJhY2t1cEtleWNoYWluUHJvbWlzZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW5Qcm9taXNlLFxuICAgIF0pO1xuICAgIC8vICNlbmRyZWdpb25cblxuICAgIHJldHVybiB7XG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUtleWNoYWluc1dpdGhFeHRlcm5hbFNpZ25lcihwYXJhbXM6IHtcbiAgICBlbnRlcnByaXNlOiBzdHJpbmc7XG4gICAgY2FsbGJhY2tzOiBFZGRzYU1QQ3YyS2V5R2VuQ2FsbGJhY2tzO1xuICB9KTogUHJvbWlzZTxLZXljaGFpbnNUcmlwbGV0PiB7XG4gICAgY29uc3QgeyBlbnRlcnByaXNlLCBjYWxsYmFja3MgfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IHsgZWRkc2FNcGN2MlB1YmxpY0tleSB9ID0gYXdhaXQgdGhpcy5nZXRCaXRnb0dwZ1B1YmtleUJhc2VkT25GZWF0dXJlRmxhZ3MoZW50ZXJwcmlzZSwgdHJ1ZSk7XG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXkgPSBlZGRzYU1wY3YyUHVibGljS2V5ID8/IHRoaXMuYml0Z29FZGRzYU1wY3YyUHVibGljR3BnS2V5O1xuICAgIGFzc2VydChiaXRnb1B1YmxpY0dwZ0tleSwgJ0ZhaWxlZCB0byBnZXQgQml0R28gRWREU0EgTVBDdjIgR1BHIHB1YmxpYyBrZXknKTtcbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleUFybW9yZWQgPSBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpO1xuXG4gICAgaWYgKGVudlJlcXVpcmVzQml0Z29QdWJHcGdLZXlDb25maWcodGhpcy5iaXRnby5nZXRFbnYoKSkpIHtcbiAgICAgIGFzc2VydChpc0JpdGdvRWRkc2FNcGN2MlB1YktleShiaXRnb1B1YmxpY0dwZ0tleUFybW9yZWQpLCAnSW52YWxpZCBCaXRHbyBFZERTQSBNUEN2MiBHUEcgcHVibGljIGtleScpO1xuICAgIH1cblxuICAgIC8vIFJvdW5kIDA6IGJvdGggcGFydGllcyBnZW5lcmF0ZSBHUEcga2V5c1xuICAgIGNvbnN0IHsgdXNlckdwZ1B1YmxpY0tleSwgYmFja3VwR3BnUHVibGljS2V5LCB1c2VyU3RhdGUsIGJhY2t1cFN0YXRlIH0gPSBhd2FpdCBjYWxsYmFja3MuaW5pdGlhbGl6ZUNhbGxiYWNrKHtcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleTogYml0Z29QdWJsaWNHcGdLZXlBcm1vcmVkLFxuICAgIH0pO1xuXG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKHVzZXJHcGdQdWJsaWNLZXkpLCAnVXNlciBHUEcgcHVibGljIGtleSBpcyByZXF1aXJlZCcpO1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyhiYWNrdXBHcGdQdWJsaWNLZXkpLCAnQmFja3VwIEdQRyBwdWJsaWMga2V5IGlzIHJlcXVpcmVkJyk7XG5cbiAgICAvLyBSb3VuZCAxOiBib3RoIHBhcnRpZXMgcnVuIERLRyByb3VuZCAxXG4gICAgY29uc3Qge1xuICAgICAgdXNlclNpZ25lZE1zZzEsXG4gICAgICBiYWNrdXBTaWduZWRNc2cxLFxuICAgICAgdXNlclN0YXRlOiB1c2VyU3RhdGVBZnRlcjEsXG4gICAgICBiYWNrdXBTdGF0ZTogYmFja3VwU3RhdGVBZnRlcjEsXG4gICAgfSA9IGF3YWl0IGNhbGxiYWNrcy5yb3VuZDFDYWxsYmFjayh7XG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleTogYml0Z29QdWJsaWNHcGdLZXlBcm1vcmVkLFxuICAgICAgdXNlckdwZ1B1YmxpY0tleSxcbiAgICAgIGJhY2t1cEdwZ1B1YmxpY0tleSxcbiAgICAgIHVzZXJTdGF0ZSxcbiAgICAgIGJhY2t1cFN0YXRlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBzZXNzaW9uSWQsIGJpdGdvTXNnMSB9ID0gYXdhaXQgdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMShlbnRlcnByaXNlLCB7XG4gICAgICB1c2VyR3BnUHVibGljS2V5LFxuICAgICAgYmFja3VwR3BnUHVibGljS2V5LFxuICAgICAgdXNlck1zZzE6IHVzZXJTaWduZWRNc2cxLFxuICAgICAgYmFja3VwTXNnMTogYmFja3VwU2lnbmVkTXNnMSxcbiAgICB9KTtcblxuICAgIC8vIFJvdW5kIDI6IGJvdGggcGFydGllcyBydW4gREtHIHJvdW5kIDJcbiAgICBjb25zdCB7XG4gICAgICB1c2VyU2lnbmVkTXNnMixcbiAgICAgIGJhY2t1cFNpZ25lZE1zZzIsXG4gICAgICB1c2VyU3RhdGU6IHVzZXJTdGF0ZUFmdGVyMixcbiAgICAgIGJhY2t1cFN0YXRlOiBiYWNrdXBTdGF0ZUFmdGVyMixcbiAgICB9ID0gYXdhaXQgY2FsbGJhY2tzLnJvdW5kMkNhbGxiYWNrKHtcbiAgICAgIGJpdGdvTXNnMSxcbiAgICAgIHVzZXJTaWduZWRNc2cxLFxuICAgICAgYmFja3VwU2lnbmVkTXNnMSxcbiAgICAgIHVzZXJTdGF0ZTogdXNlclN0YXRlQWZ0ZXIxLFxuICAgICAgYmFja3VwU3RhdGU6IGJhY2t1cFN0YXRlQWZ0ZXIxLFxuICAgIH0pO1xuXG4gICAgY29uc3Qge1xuICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWRSb3VuZDIsXG4gICAgICBjb21tb25QdWJsaWNLZXljaGFpbjogYml0Z29Db21tb25LZXljaGFpbixcbiAgICAgIGJpdGdvTXNnMixcbiAgICB9ID0gYXdhaXQgdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMihlbnRlcnByaXNlLCB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB1c2VyTXNnMjogdXNlclNpZ25lZE1zZzIsXG4gICAgICBiYWNrdXBNc2cyOiBiYWNrdXBTaWduZWRNc2cyLFxuICAgIH0pO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChzZXNzaW9uSWQsIHNlc3Npb25JZFJvdW5kMiwgJ1JvdW5kIDEgYW5kIHJvdW5kIDIgc2Vzc2lvbiBJRHMgZG8gbm90IG1hdGNoJyk7XG5cbiAgICAvLyBGaW5hbGl6ZTogYm90aCBwYXJ0aWVzIHZlcmlmeSBhbmQgZGVyaXZlIHRoZSBjb21tb24ga2V5Y2hhaW5cbiAgICBjb25zdCB7IGNvbW1vbktleWNoYWluIH0gPSBhd2FpdCBjYWxsYmFja3MuZmluYWxpemVDYWxsYmFjayh7XG4gICAgICBiaXRnb01zZzIsXG4gICAgICBiaXRnb0NvbW1vbktleWNoYWluLFxuICAgICAgdXNlclN0YXRlOiB1c2VyU3RhdGVBZnRlcjIsXG4gICAgICBiYWNrdXBTdGF0ZTogYmFja3VwU3RhdGVBZnRlcjIsXG4gICAgfSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNvbW1vbktleWNoYWluLCBiaXRnb0NvbW1vbktleWNoYWluLCAnQ29tbW9uIGtleWNoYWlucyBkbyBub3QgbWF0Y2gnKTtcblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgY29uc3QgW3VzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW5dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAga2V5Y2hhaW5zLmFkZCh7IHNvdXJjZTogJ3VzZXInLCBrZXlUeXBlOiAndHNzJyBhcyBLZXlUeXBlLCBjb21tb25LZXljaGFpbiwgaXNNUEN2MjogdHJ1ZSwgZW50ZXJwcmlzZSB9KSxcbiAgICAgIGtleWNoYWlucy5hZGQoeyBzb3VyY2U6ICdiYWNrdXAnLCBrZXlUeXBlOiAndHNzJyBhcyBLZXlUeXBlLCBjb21tb25LZXljaGFpbiwgaXNNUEN2MjogdHJ1ZSwgZW50ZXJwcmlzZSB9KSxcbiAgICAgIHRoaXMuYWRkQml0Z29LZXljaGFpbihjb21tb25LZXljaGFpbiksXG4gICAgXSk7XG5cbiAgICByZXR1cm4geyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluIH07XG4gIH1cblxuICAvLyAjcmVnaW9uIGtleWNoYWluIHV0aWxzXG4gIGFzeW5jIGNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgcGFydGljaXBhbnRJbmRleDogTVBDdjJQYXJ0eUZyb21TdHJpbmdPck51bWJlcixcbiAgICBjb21tb25LZXljaGFpbjogc3RyaW5nLFxuICAgIHByaXZhdGVNYXRlcmlhbD86IEJ1ZmZlcixcbiAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsPzogQnVmZmVyLFxuICAgIHBhc3NwaHJhc2U/OiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nLFxuICAgIHdlYmF1dGhuSW5mbz86IFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm8sXG4gICAgZW5jcnlwdGlvblZlcnNpb24/OiBFbmNyeXB0aW9uVmVyc2lvbixcbiAgICBlbnRlcnByaXNlPzogc3RyaW5nLFxuICAgIHNhZmVJZD86IHN0cmluZ1xuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgbGV0IHNvdXJjZTogc3RyaW5nO1xuICAgIGxldCBlbmNyeXB0ZWRQcnY6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVkdWNlZEVuY3J5cHRlZFBydjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCBwcml2YXRlTWF0ZXJpYWxCYXNlNjQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIHN3aXRjaCAocGFydGljaXBhbnRJbmRleCkge1xuICAgICAgY2FzZSBNUEN2MlBhcnRpZXNFbnVtLlVTRVI6XG4gICAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQOlxuICAgICAgICBzb3VyY2UgPSBwYXJ0aWNpcGFudEluZGV4ID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgPyAndXNlcicgOiAnYmFja3VwJztcbiAgICAgICAgYXNzZXJ0KHByaXZhdGVNYXRlcmlhbCwgYFByaXZhdGUgbWF0ZXJpYWwgaXMgcmVxdWlyZWQgZm9yICR7c291cmNlfSBrZXljaGFpbmApO1xuICAgICAgICBhc3NlcnQocmVkdWNlZFByaXZhdGVNYXRlcmlhbCwgYFJlZHVjZWQgcHJpdmF0ZSBtYXRlcmlhbCBpcyByZXF1aXJlZCBmb3IgJHtzb3VyY2V9IGtleWNoYWluYCk7XG4gICAgICAgIGFzc2VydChwYXNzcGhyYXNlLCBgUGFzc3BocmFzZSBpcyByZXF1aXJlZCBmb3IgJHtzb3VyY2V9IGtleWNoYWluYCk7XG4gICAgICAgIHByaXZhdGVNYXRlcmlhbEJhc2U2NCA9IHByaXZhdGVNYXRlcmlhbC50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgIGVuY3J5cHRlZFBydiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgaW5wdXQ6IHByaXZhdGVNYXRlcmlhbEJhc2U2NCxcbiAgICAgICAgICBwYXNzd29yZDogcGFzc3BocmFzZSxcbiAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEVuY3J5cHRzIHRoZSBDQk9SLWVuY29kZWQgUmVkdWNlZEtleVNoYXJlICh3aGljaCBjb250YWlucyB0aGUgcGFydHkncyBwdWJsaWNcbiAgICAgICAgLy8ga2V5KSB3aXRoIHRoZSB3YWxsZXQgcGFzc3BocmFzZS4gVGhlIHJlc3VsdCBpcyBzdG9yZWQgYXMgcmVkdWNlZEVuY3J5cHRlZFBydlxuICAgICAgICAvLyBvbiB0aGUga2V5IGNhcmQgUVIgY29kZSBhbmQgcmVwcmVzZW50cyBhIHNlY29uZCBjb3B5IG9mIGtleSBtYXRlcmlhbFxuICAgICAgICAvLyBiZXlvbmQgdGhlIHNlcnZlci1zdG9yZWQgZW5jcnlwdGVkUHJ2LlxuICAgICAgICByZWR1Y2VkRW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICAvLyBCdWZmZXIudG9TdHJpbmcoJ2Jhc2U2NCcpIGNhbiBub3QgYmUgdXNlZCBoZXJlIGFzIGl0IGRvZXMgbm90IHdvcmsgb24gdGhlIGJyb3dzZXIuXG4gICAgICAgICAgLy8gVGhlIGJyb3dzZXIgZGVhbHMgd2l0aCBhIEJ1ZmZlciBhcyBVaW50OEFycmF5LCB0aGVyZWZvcmUgaW4gdGhlIGJyb3dzZXIgLnRvU3RyaW5nKCdiYXNlNjQnKSBqdXN0IGNyZWF0ZXMgYSBjb21tYSBzZXBhcmF0ZWQgc3RyaW5nIG9mIHRoZSBhcnJheSB2YWx1ZXMuXG4gICAgICAgICAgaW5wdXQ6IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwpKSkpLFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uQklUR086XG4gICAgICAgIHNvdXJjZSA9ICdiaXRnbyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcnRpY2lwYW50IGluZGV4Jyk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5QYXJhbXM6IEFkZEtleWNoYWluT3B0aW9ucyA9IHtcbiAgICAgIHNvdXJjZSxcbiAgICAgIGtleVR5cGU6ICd0c3MnIGFzIEtleVR5cGUsXG4gICAgICBjb21tb25LZXljaGFpbixcbiAgICAgIGVuY3J5cHRlZFBydixcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIGlzTVBDdjI6IHRydWUsXG4gICAgICBzYWZlSWQsXG4gICAgICBlbnRlcnByaXNlLFxuICAgIH07XG5cbiAgICBpZiAod2ViYXV0aG5JbmZvICYmIHBhcnRpY2lwYW50SW5kZXggPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBwcml2YXRlTWF0ZXJpYWxCYXNlNjQpIHtcbiAgICAgIC8vIFNlbmQgdGhlIHBhc3NrZXkgYXMgYHdlYmF1dGhuSW5mb2A7IHRoZSBkZXByZWNhdGVkIGB3ZWJhdXRobkRldmljZXNgIGFycmF5IGlzIGlnbm9yZWQgYnkgUE9TVCAva2V5LlxuICAgICAgYXNzZXJ0KGVudGVycHJpc2UsICdlbnRlcnByaXNlIGlzIHJlcXVpcmVkIHRvIGF0dGFjaCBhIHdlYmF1dGhuIGRldmljZSB0byB0aGUgdXNlciBrZXljaGFpbicpO1xuICAgICAga2V5Y2hhaW5QYXJhbXMud2ViYXV0aG5JbmZvID0ge1xuICAgICAgICBvdHBEZXZpY2VJZDogd2ViYXV0aG5JbmZvLm90cERldmljZUlkLFxuICAgICAgICBwcmZTYWx0OiB3ZWJhdXRobkluZm8ucHJmU2FsdCxcbiAgICAgICAgZW5jcnlwdGVkUHJ2OiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgIGlucHV0OiBwcml2YXRlTWF0ZXJpYWxCYXNlNjQsXG4gICAgICAgICAgcGFzc3dvcmQ6IHdlYmF1dGhuSW5mby5wYXNzcGhyYXNlLFxuICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICB9KSxcbiAgICAgICAgZW50ZXJwcmlzZUlkOiBlbnRlcnByaXNlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIHJldHVybiB7IC4uLihhd2FpdCBrZXljaGFpbnMuYWRkKGtleWNoYWluUGFyYW1zKSksIHJlZHVjZWRFbmNyeXB0ZWRQcnYgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBhZGRVc2VyS2V5Y2hhaW4oXG4gICAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICBwcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIsXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZyxcbiAgICB3ZWJhdXRobkluZm8/OiBXZWJhdXRobktleUVuY3J5cHRpb25JbmZvLFxuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb24sXG4gICAgZW50ZXJwcmlzZT86IHN0cmluZyxcbiAgICBzYWZlSWQ/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICBjb21tb25LZXljaGFpbixcbiAgICAgIHByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgd2ViYXV0aG5JbmZvLFxuICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICBlbnRlcnByaXNlLFxuICAgICAgc2FmZUlkXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBhZGRCYWNrdXBLZXljaGFpbihcbiAgICBjb21tb25LZXljaGFpbjogc3RyaW5nLFxuICAgIHByaXZhdGVNYXRlcmlhbDogQnVmZmVyLFxuICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nLFxuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb24sXG4gICAgZW50ZXJwcmlzZT86IHN0cmluZyxcbiAgICBzYWZlSWQ/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCxcbiAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgcHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICBzYWZlSWRcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGFkZEJpdGdvS2V5Y2hhaW4oY29tbW9uS2V5Y2hhaW46IHN0cmluZywgc2FmZUlkPzogc3RyaW5nKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLFxuICAgICAgY29tbW9uS2V5Y2hhaW4sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBzYWZlSWRcbiAgICApO1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMShcbiAgICBlbnRlcnByaXNlOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRWRkc2FNUEN2MktleUdlblJvdW5kMVJlcXVlc3QgJiB7IHdhbGxldElkPzogc3RyaW5nIH0sXG4gICAgc2FmZUlkPzogc3RyaW5nXG4gICk6IFByb21pc2U8RWRkc2FNUEN2MktleUdlblJvdW5kMVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDFCeVNlbmRlcihLZXlHZW5TZW5kZXJGb3JFbnRlcnByaXNlKHRoaXMuYml0Z28sIGVudGVycHJpc2UsIHNhZmVJZCksIHBheWxvYWQpO1xuICB9XG5cbiAgYXN5bmMgc2VuZEtleUdlbmVyYXRpb25Sb3VuZDFCeVNlbmRlcihcbiAgICBzZW5kZXJGbjogRWRkc2FNUEN2MktleUdlblNlbmRGbjxFZGRzYU1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2U+LFxuICAgIHBheWxvYWQ6IEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDFSZXF1ZXN0ICYgeyB3YWxsZXRJZD86IHN0cmluZyB9XG4gICk6IFByb21pc2U8RWRkc2FNUEN2MktleUdlblJvdW5kMVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHNlbmRlckZuKE1QQ3YyS2V5R2VuU3RhdGVFbnVtWydNUEN2Mi1SMSddLCBwYXlsb2FkKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQyKFxuICAgIGVudGVycHJpc2U6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBFZGRzYU1QQ3YyS2V5R2VuUm91bmQyUmVxdWVzdFxuICApOiBQcm9taXNlPEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQyQnlTZW5kZXIoS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZSh0aGlzLmJpdGdvLCBlbnRlcnByaXNlKSwgcGF5bG9hZCk7XG4gIH1cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMkJ5U2VuZGVyKFxuICAgIHNlbmRlckZuOiBFZGRzYU1QQ3YyS2V5R2VuU2VuZEZuPEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4sXG4gICAgcGF5bG9hZDogRWRkc2FNUEN2MktleUdlblJvdW5kMlJlcXVlc3RcbiAgKTogUHJvbWlzZTxFZGRzYU1QQ3YyS2V5R2VuUm91bmQyUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gc2VuZGVyRm4oTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyLVIyJ10sIHBheWxvYWQpO1xuICB9XG5cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gc2lnbiB0eCByZXF1ZXN0XG5cbiAgLyoqXG4gICAqIFNpZ25zIHRoZSB0cmFuc2FjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8VHhSZXF1ZXN0Pn0gZnVsbHkgc2lnbmVkIFR4UmVxdWVzdFxuICAgKi9cbiAgYXN5bmMgc2lnblR4UmVxdWVzdChwYXJhbXM6IFRTU1BhcmFtc1dpdGhQcnYpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIHJldHVybiB0aGlzLnNpZ25SZXF1ZXN0QmFzZShwYXJhbXMsIFJlcXVlc3RUeXBlLnR4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8VHhSZXF1ZXN0Pn0gZnVsbHkgc2lnbmVkIFR4UmVxdWVzdFxuICAgKi9cbiAgYXN5bmMgc2lnblR4UmVxdWVzdEZvck1lc3NhZ2UocGFyYW1zOiBUU1NQYXJhbXNGb3JNZXNzYWdlV2l0aFBydik6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgcmV0dXJuIHRoaXMuc2lnblJlcXVlc3RCYXNlKHBhcmFtcywgUmVxdWVzdFR5cGUubWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogRnVsbCAzLXJvdW5kIEVkRFNBIE1QQ3YyIChNUFMpIG9ubGluZSBzaWduaW5nIG9yY2hlc3RyYXRpb24uXG4gICAqXG4gICAqIFByb3RvY29sIG92ZXJ2aWV3OlxuICAgKiAgIFdBU00gUm91bmQgMCAg4oaSIGdldEZpcnN0TWVzc2FnZSgpICAgICAgKHByb2R1Y2VzIHVzZXJNc2cxKVxuICAgKiAgIEFQSSAgUm91bmQgMSAg4oaSIHNlbmQgdXNlck1zZzEgLyByZWN2IGJpdGdvTXNnMVxuICAgKiAgIFdBU00gUm91bmQgMSAg4oaSIGhhbmRsZUluY29taW5nTWVzc2FnZXMoW3VzZXJNc2cxLCBiaXRnb01zZzFdKSAgKHByb2R1Y2VzIHVzZXJNc2cyKVxuICAgKiAgIEFQSSAgUm91bmQgMiAg4oaSIHNlbmQgdXNlck1zZzIgLyByZWN2IGJpdGdvTXNnMlxuICAgKiAgIFdBU00gUm91bmQgMiAg4oaSIGhhbmRsZUluY29taW5nTWVzc2FnZXMoW3VzZXJNc2cyLCBiaXRnb01zZzJdKSAgKHByb2R1Y2VzIHVzZXJNc2czKVxuICAgKiAgIEFQSSAgUm91bmQgMyAg4oaSIHNlbmQgdXNlck1zZzMgKFdQIGZpbmFsaXNlczsgbm8gQml0R28gbXNnIHJldHVybmVkIHRvIGNsaWVudClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblJlcXVlc3RCYXNlKFxuICAgIHBhcmFtczogVFNTUGFyYW1zV2l0aFBydiB8IFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2LFxuICAgIHJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZVxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHVzZXJLZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKHBhcmFtcy5wcnYsICdiYXNlNjQnKTtcblxuICAgIGNvbnN0IHR4UmVxdWVzdDogVHhSZXF1ZXN0ID1cbiAgICAgIHR5cGVvZiBwYXJhbXMudHhSZXF1ZXN0ID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCBwYXJhbXMudHhSZXF1ZXN0LCBwYXJhbXMucmVxSWQpXG4gICAgICAgIDogcGFyYW1zLnR4UmVxdWVzdDtcblxuICAgIGxldCB0eE9yTWVzc2FnZVRvU2lnbjtcbiAgICBsZXQgZGVyaXZhdGlvblBhdGg7XG4gICAgbGV0IGJ1ZmZlckNvbnRlbnQ7XG4gICAgLy8gT25lIGZyZXNoIGVkMjU1MTkgR1BHIGtleSBwYWlyIHBlciBzaWduaW5nIHNlc3Npb24sIHJldXNlZCBhY3Jvc3MgYWxsIHNpZ25pbmcgcm91bmRzLlxuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ2VkMjU1MTknKTtcbiAgICBjb25zdCB1c2VyR3BnUHJ2S2V5ID0gYXdhaXQgcGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogdXNlckdwZ0tleS5wcml2YXRlS2V5IH0pO1xuICAgIGNvbnN0IGJpdGdvR3BnUHViS2V5ID0gYXdhaXQgdGhpcy5waWNrQml0Z29QdWJHcGdLZXlGb3JTaWduaW5nKHRydWUsIHBhcmFtcy5yZXFJZCwgdHhSZXF1ZXN0LmVudGVycHJpc2VJZCwgdHJ1ZSk7XG4gICAgYXNzZXJ0KGJpdGdvR3BnUHViS2V5LCAnTWlzc2luZyBCaXRHbyBHUEcga2V5IGZvciBNUEN2MicpO1xuXG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCkge1xuICAgICAgYXNzZXJ0KHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgdHhSZXF1ZXN0LnVuc2lnbmVkVHhzLCAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCcpO1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9XG4gICAgICAgIHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcgPyB0eFJlcXVlc3QudHJhbnNhY3Rpb25zIVswXS51bnNpZ25lZFR4IDogdHhSZXF1ZXN0LnVuc2lnbmVkVHhzIVswXTtcbiAgICAgIHR4T3JNZXNzYWdlVG9TaWduID0gdW5zaWduZWRUeC5zaWduYWJsZUhleDtcbiAgICAgIGFzc2VydCh0eE9yTWVzc2FnZVRvU2lnbiwgJ01pc3Npbmcgc2lnbmFibGVIZXggaW4gdW5zaWduZWRUeCcpO1xuICAgICAgZGVyaXZhdGlvblBhdGggPSB1bnNpZ25lZFR4LmRlcml2YXRpb25QYXRoO1xuICAgICAgYnVmZmVyQ29udGVudCA9IEJ1ZmZlci5mcm9tKHR4T3JNZXNzYWdlVG9TaWduLCAnaGV4Jyk7XG4gICAgICBhd2FpdCB0aGlzLmJhc2VDb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleDogdW5zaWduZWRUeC5zZXJpYWxpemVkVHhIZXggPz8gdHhPck1lc3NhZ2VUb1NpZ24gfSxcbiAgICAgICAgdHhQYXJhbXM6IHJlc29sdmVFZmZlY3RpdmVUeFBhcmFtcyh0eFJlcXVlc3QsIHBhcmFtcy50eFBhcmFtcywgdGhpcy5iYXNlQ29pbi5nZXRDaGFpbigpKSxcbiAgICAgICAgd2FsbGV0OiB0aGlzLndhbGxldCxcbiAgICAgICAgd2FsbGV0VHlwZTogdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlKCksXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS5tZXNzYWdlKSB7XG4gICAgICBhc3NlcnQodHhSZXF1ZXN0Lm1lc3NhZ2VzICYmIHR4UmVxdWVzdC5tZXNzYWdlcy5sZW5ndGggPiAwLCAnVW5hYmxlIHRvIGZpbmQgbWVzc2FnZXMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgICB0eE9yTWVzc2FnZVRvU2lnbiA9IHR4UmVxdWVzdC5tZXNzYWdlc1swXS5tZXNzYWdlRW5jb2RlZDtcbiAgICAgIGFzc2VydCh0eE9yTWVzc2FnZVRvU2lnbiwgJ01pc3NpbmcgbWVzc2FnZUVuY29kZWQgaW4gbWVzc2FnZXNbMF0nKTtcbiAgICAgIGRlcml2YXRpb25QYXRoID0gdHhSZXF1ZXN0Lm1lc3NhZ2VzWzBdLmRlcml2YXRpb25QYXRoIHx8ICdtLzAnO1xuICAgICAgYnVmZmVyQ29udGVudCA9IEJ1ZmZlci5mcm9tKHR4T3JNZXNzYWdlVG9TaWduLCAnaGV4Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByZXF1ZXN0IHR5cGUnKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgV0FTTSBSb3VuZCAwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGNvbnN0IHBhcnR5SWQgPSBwYXJhbXMubXBjdjJQYXJ0eUlkID8/IE1QQ3YyUGFydGllc0VudW0uVVNFUjtcbiAgICBjb25zdCBzaWduZXJTaGFyZVR5cGUgPSBwYXJ0eUlkID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgPyBTaWduYXR1cmVTaGFyZVR5cGUuVVNFUiA6IFNpZ25hdHVyZVNoYXJlVHlwZS5CQUNLVVA7XG4gICAgY29uc3QgdXNlckRzZyA9IG5ldyBFZGRzYU1QU0RzZy5EU0cocGFydHlJZCk7XG4gICAgYXdhaXQgdXNlckRzZy5pbml0RHNnKHVzZXJLZXlTaGFyZSwgYnVmZmVyQ29udGVudCwgZGVyaXZhdGlvblBhdGgsIE1QQ3YyUGFydGllc0VudW0uQklUR08pO1xuICAgIGNvbnN0IHVzZXJNc2cxID0gdXNlckRzZy5nZXRGaXJzdE1lc3NhZ2UoKTtcblxuICAgIC8vIOKUgOKUgCBBUEkgUm91bmQgMSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMSA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUodXNlck1zZzEsIHVzZXJHcGdQcnZLZXksIHBhcnR5SWQpO1xuICAgIGxldCBsYXRlc3RUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3Qud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDFdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuXG4gICAgYXNzZXJ0KGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzLCAnSW52YWxpZCB0eFJlcXVlc3Qgb2JqZWN0IGFmdGVyIHJvdW5kIDEnKTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlczEgPVxuICAgICAgcmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4XG4gICAgICAgID8gbGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyFbMF0uc2lnbmF0dXJlU2hhcmVzXG4gICAgICAgIDogbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzIVswXS5zaWduYXR1cmVTaGFyZXM7XG5cbiAgICBjb25zdCBiaXRnb1NoYXJlUm91bmRPbmUgPSBnZXRCaXRnb1NpZ25hdHVyZVNoYXJlKHNpZ25hdHVyZVNoYXJlczEsIHNpZ25lclNoYXJlVHlwZSwgJ3JvdW5kMU91dHB1dCcpO1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZSA9IGRlY29kZVdpdGhDb2RlYyhcbiAgICAgIEVkZHNhTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMU91dHB1dCxcbiAgICAgIEpTT04ucGFyc2UoYml0Z29TaGFyZVJvdW5kT25lLnNoYXJlKSxcbiAgICAgICdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJ1xuICAgICk7XG5cbiAgICBpZiAocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lLnR5cGUgIT09ICdyb3VuZDFPdXRwdXQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0Rlc2VyaWFsaXplZE1zZzEgPSBhd2FpdCB2ZXJpZnlQZWVyTWVzc2FnZVJvdW5kT25lKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZSwgYml0Z29HcGdQdWJLZXkpO1xuXG4gICAgLy8g4pSA4pSAIFdBU00gUm91bmQgMSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBjb25zdCBbdXNlck1zZzJdID0gdXNlckRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFt1c2VyTXNnMSwgYml0Z29EZXNlcmlhbGl6ZWRNc2cxXSk7XG4gICAgYXNzZXJ0KHVzZXJNc2cyLCAnV0FTTSByb3VuZCAxIHByb2R1Y2VkIG5vIG1lc3NhZ2UnKTtcblxuICAgIC8vIOKUgOKUgCBBUEkgUm91bmQgMiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kVHdvID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFR3byh1c2VyTXNnMiwgdXNlckdwZ1BydktleSwgcGFydHlJZCk7XG4gICAgbGF0ZXN0VHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0LndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmRUd29dLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuXG4gICAgYXNzZXJ0KGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzLCAnSW52YWxpZCB0eFJlcXVlc3Qgb2JqZWN0IGFmdGVyIHJvdW5kIDInKTtcblxuICAgIGNvbnN0IHR4UmVxdWVzdFNpZ25hdHVyZVNoYXJlcyA9XG4gICAgICByZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHhcbiAgICAgICAgPyBsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zIVswXS5zaWduYXR1cmVTaGFyZXNcbiAgICAgICAgOiBsYXRlc3RUeFJlcXVlc3QubWVzc2FnZXMhWzBdLnNpZ25hdHVyZVNoYXJlcztcblxuICAgIGNvbnN0IGJpdGdvU2hhcmVSb3VuZFR3byA9IGdldEJpdGdvU2lnbmF0dXJlU2hhcmUodHhSZXF1ZXN0U2lnbmF0dXJlU2hhcmVzLCBzaWduZXJTaGFyZVR5cGUsICdyb3VuZDJPdXRwdXQnKTtcbiAgICBjb25zdCBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28gPSBkZWNvZGVXaXRoQ29kZWMoXG4gICAgICBFZGRzYU1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDJPdXRwdXQsXG4gICAgICBKU09OLnBhcnNlKGJpdGdvU2hhcmVSb3VuZFR3by5zaGFyZSksXG4gICAgICAnVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLidcbiAgICApO1xuXG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3by50eXBlICE9PSAncm91bmQyT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29EZXNlcmlhbGl6ZWRNc2cyID0gYXdhaXQgdmVyaWZ5UGVlck1lc3NhZ2VSb3VuZFR3byhwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28sIGJpdGdvR3BnUHViS2V5KTtcblxuICAgIC8vIOKUgOKUgCBXQVNNIFJvdW5kIDIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgY29uc3QgW3VzZXJNc2czXSA9IHVzZXJEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbdXNlck1zZzIsIGJpdGdvRGVzZXJpYWxpemVkTXNnMl0pO1xuICAgIGFzc2VydCh1c2VyTXNnMywgJ1dBU00gcm91bmQgMiBwcm9kdWNlZCBubyBtZXNzYWdlJyk7XG5cbiAgICAvLyDilIDilIAgQVBJIFJvdW5kIDMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgLy8gTm8gQml0R28gcmVzcG9uc2UgdG8gdmVyaWZ5OyBXUCBmaW5hbGlzZXMgdGhlIHNpZ25pbmcgc2VydmVyLXNpZGVcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMyA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZSh1c2VyTXNnMywgdXNlckdwZ1BydktleSwgcGFydHlJZCk7XG4gICAgY29uc3Qgcm91bmQzVHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0LndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQzXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKTtcbiAgICBhc3NlcnQocm91bmQzVHhSZXF1ZXN0Py50eFJlcXVlc3RJZCA9PT0gdHhSZXF1ZXN0LnR4UmVxdWVzdElkLCAnSW52YWxpZCB0eFJlcXVlc3Qgb2JqZWN0IGFmdGVyIHJvdW5kIDMnKTtcblxuICAgIHJldHVybiBzZW5kVHhSZXF1ZXN0KHRoaXMuYml0Z28sIHR4UmVxdWVzdC53YWxsZXRJZCwgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLCByZXF1ZXN0VHlwZSwgcGFyYW1zLnJlcUlkKTtcbiAgfVxuXG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIGV4dGVybmFsIHNpZ25lclxuXG4gIC8vICNyZWdpb24gS2V5R2VuUm91bmQxU2hhcmVcbiAgYXN5bmMgY3JlYXRlT2ZmbGluZUtleUdlblJvdW5kMVNoYXJlKHBhcmFtczoge1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmc7XG4gICAgYml0Z29HcGdQdWJLZXk6IHN0cmluZztcbiAgICBjb3VudGVyUGFydHlHcGdQdWJLZXk6IHN0cmluZztcbiAgICBwYXJ0eUlkPzogTVBDdjJQYXJ0aWVzRW51bS5VU0VSIHwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVA7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzaWduZWRNc2cxOiBNUFNUeXBlcy5NUFNTaWduZWRNZXNzYWdlO1xuICAgIGVuY3J5cHRlZFJvdW5kMVNlc3Npb246IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHsgd2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGVkVXNlckdwZ1BydktleSwgYml0Z29HcGdQdWJLZXksIGNvdW50ZXJQYXJ0eUdwZ1B1YktleSB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHBhcnR5SWQgPSBwYXJhbXMucGFydHlJZCA/PyBNUEN2MlBhcnRpZXNFbnVtLlVTRVI7XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRHcGdQcnZLZXkgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogZW5jcnlwdGVkVXNlckdwZ1BydktleSwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgY29uc3QgZ3BnUHJ2S2V5ID0gYXdhaXQgcGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogZGVjcnlwdGVkR3BnUHJ2S2V5IH0pO1xuXG4gICAgY29uc3QgWywgb3duU2tdID0gYXdhaXQgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlLZXlQYWlyKGdwZ1BydktleSk7XG5cbiAgICBpZiAoZW52UmVxdWlyZXNCaXRnb1B1YkdwZ0tleUNvbmZpZyh0aGlzLmJpdGdvLmdldEVudigpKSkge1xuICAgICAgYXNzZXJ0KGlzQml0Z29FZGRzYU1wY3YyUHViS2V5KGJpdGdvR3BnUHViS2V5KSwgJ0ludmFsaWQgQml0R28gR1BHIHB1YmxpYyBrZXknKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0tleU9iaiA9IGF3YWl0IHBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogYml0Z29HcGdQdWJLZXkgfSk7XG4gICAgY29uc3QgYml0Z29QayA9IGF3YWl0IE1QU0NvbW1zLmV4dHJhY3RFZDI1NTE5UHVibGljS2V5KGJpdGdvS2V5T2JqKTtcblxuICAgIGNvbnN0IGNvdW50ZXJQYXJ0eUtleU9iaiA9IGF3YWl0IHBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogY291bnRlclBhcnR5R3BnUHViS2V5IH0pO1xuICAgIGNvbnN0IGNvdW50ZXJQYXJ0eVBrID0gYXdhaXQgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlQdWJsaWNLZXkoY291bnRlclBhcnR5S2V5T2JqKTtcblxuICAgIGNvbnN0IGRrZyA9IG5ldyBFZGRzYU1QU0RrZy5ES0coMywgMiwgcGFydHlJZCk7XG4gICAgYXdhaXQgZGtnLmluaXREa2cob3duU2ssIFtjb3VudGVyUGFydHlQaywgYml0Z29Qa10pO1xuXG4gICAgY29uc3QgbXNnMSA9IGRrZy5nZXRGaXJzdE1lc3NhZ2UoKTtcbiAgICBjb25zdCBzaWduZWRNc2cxID0gYXdhaXQgTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20obXNnMS5wYXlsb2FkKSwgZ3BnUHJ2S2V5KTtcblxuICAgIGNvbnN0IHNlc3Npb25QYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZGtnU2Vzc2lvbjogZGtnLmdldFNlc3Npb24oKSxcbiAgICAgIG93bk1zZ1BheWxvYWQ6IEJ1ZmZlci5mcm9tKG1zZzEucGF5bG9hZCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgb3duTXNnRnJvbTogbXNnMS5mcm9tLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICBpbnB1dDogc2Vzc2lvblBheWxvYWQsXG4gICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhOiBgJHtFZGRzYU1QQ3YyVXRpbHMuTVBTX0RLR19LRVlHRU5fUk9VTkQxX1NUQVRFfToke3BhcnR5SWR9YCxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAxLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgc2lnbmVkTXNnMSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiB9O1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIFJvdW5kMVNoYXJlXG4gIGFzeW5jIGNyZWF0ZU9mZmxpbmVSb3VuZDFTaGFyZShwYXJhbXM6IHtcbiAgICB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICBwcnY6IHN0cmluZztcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkUHJ2Pzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTx7XG4gICAgc2lnbmF0dXJlU2hhcmVSb3VuZDE6IFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICAgIHVzZXJHcGdQdWJLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uOiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkVXNlckdwZ1BydktleTogc3RyaW5nO1xuICB9PiB7XG4gICAgY29uc3QgeyBwcnYsIHdhbGxldFBhc3NwaHJhc2UsIHR4UmVxdWVzdCwgZW5jcnlwdGVkUHJ2IH0gPSBwYXJhbXM7XG4gICAgY29uc3QgeyBzaWduYWJsZUhleCwgZGVyaXZhdGlvblBhdGggfSA9IHRoaXMuZ2V0U2lnbmFibGVIZXhBbmREZXJpdmF0aW9uUGF0aChcbiAgICAgIHR4UmVxdWVzdCxcbiAgICAgICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0J1xuICAgICk7XG4gICAgY29uc3QgYWRhdGEgPSBgJHtzaWduYWJsZUhleH06JHtkZXJpdmF0aW9uUGF0aH1gO1xuXG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gQnVmZmVyLmZyb20ocHJ2LCAnYmFzZTY0Jyk7XG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignZWQyNTUxOScpO1xuICAgIGNvbnN0IHVzZXJHcGdQcnZLZXkgPSBhd2FpdCBwZ3AucmVhZFByaXZhdGVLZXkoeyBhcm1vcmVkS2V5OiB1c2VyR3BnS2V5LnByaXZhdGVLZXkgfSk7XG5cbiAgICBjb25zdCB1c2VyRHNnID0gbmV3IEVkZHNhTVBTRHNnLkRTRyhNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICAgIGF3YWl0IHVzZXJEc2cuaW5pdERzZyh1c2VyS2V5U2hhcmUsIEJ1ZmZlci5mcm9tKHNpZ25hYmxlSGV4LCAnaGV4JyksIGRlcml2YXRpb25QYXRoLCBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPKTtcbiAgICBjb25zdCB1c2VyTXNnMSA9IHVzZXJEc2cuZ2V0Rmlyc3RNZXNzYWdlKCk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZDEgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kT25lKHVzZXJNc2cxLCB1c2VyR3BnUHJ2S2V5KTtcbiAgICBjb25zdCBzZXNzaW9uUGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGRzZ1Nlc3Npb246IHVzZXJEc2cuZ2V0U2Vzc2lvbigpLFxuICAgICAgdXNlck1zZ1BheWxvYWQ6IEJ1ZmZlci5mcm9tKHVzZXJNc2cxLnBheWxvYWQpLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyR3BnUHViS2V5ID0gdXNlckdwZ0tleS5wdWJsaWNLZXk7XG5cbiAgICBjb25zdCB1c2VWMiA9IGVuY3J5cHRlZFBydiAhPT0gdW5kZWZpbmVkICYmIGlzVjJFbnZlbG9wZShlbmNyeXB0ZWRQcnYpO1xuICAgIGlmICh1c2VWMikge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24od2FsbGV0UGFzc3BocmFzZSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KFxuICAgICAgICAgIHNlc3Npb25QYXlsb2FkLFxuICAgICAgICAgIGAke0VkZHNhTVBDdjJVdGlscy5NUFNfRFNHX1NJR05JTkdfUk9VTkQxX1NUQVRFfToke2FkYXRhfWBcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkVXNlckdwZ1BydktleSA9IGF3YWl0IHNlc3Npb24uZW5jcnlwdChcbiAgICAgICAgICB1c2VyR3BnS2V5LnByaXZhdGVLZXksXG4gICAgICAgICAgYCR7RWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVl9OiR7YWRhdGF9YFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyBzaWduYXR1cmVTaGFyZVJvdW5kMSwgdXNlckdwZ1B1YktleSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgZW5jcnlwdGVkVXNlckdwZ1BydktleSB9O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2Vzc2lvbi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICBpbnB1dDogc2Vzc2lvblBheWxvYWQsXG4gICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhOiBgJHtFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1JPVU5EMV9TVEFURX06JHthZGF0YX1gLFxuICAgICAgZW5jcnlwdGlvblZlcnNpb246IDEsXG4gICAgfSk7XG4gICAgY29uc3QgZW5jcnlwdGVkVXNlckdwZ1BydktleSA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICBpbnB1dDogdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YTogYCR7RWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVl9OiR7YWRhdGF9YCxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAxLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgc2lnbmF0dXJlU2hhcmVSb3VuZDEsIHVzZXJHcGdQdWJLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgfTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBSb3VuZDJTaGFyZVxuICBhc3luYyBjcmVhdGVPZmZsaW5lUm91bmQyU2hhcmUocGFyYW1zOiB7XG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3Q7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGJpdGdvUHVibGljR3BnS2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkVXNlckdwZ1BydktleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFJvdW5kMVNlc3Npb246IHN0cmluZztcbiAgfSk6IFByb21pc2U8e1xuICAgIHNpZ25hdHVyZVNoYXJlUm91bmQyOiBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCB7IHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGJpdGdvUHVibGljR3BnS2V5LCB0eFJlcXVlc3QgfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IHsgc2lnbmFibGVIZXgsIGRlcml2YXRpb25QYXRoIH0gPSB0aGlzLmdldFNpZ25hYmxlSGV4QW5kRGVyaXZhdGlvblBhdGgoXG4gICAgICB0eFJlcXVlc3QsXG4gICAgICAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCdcbiAgICApO1xuICAgIGNvbnN0IGFkYXRhID0gYCR7c2lnbmFibGVIZXh9OiR7ZGVyaXZhdGlvblBhdGh9YDtcblxuICAgIGNvbnN0IHVzZVYyID0gaXNWMkVudmVsb3BlKGVuY3J5cHRlZFJvdW5kMVNlc3Npb24pO1xuXG4gICAgY29uc3QgeyBiaXRnb0dwZ0tleSwgdXNlckdwZ1BydktleSB9ID0gYXdhaXQgdGhpcy5nZXRCaXRnb0FuZFVzZXJHcGdLZXlzKFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhLFxuICAgICAgRWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVlcbiAgICApO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25zID0gdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucztcbiAgICBhc3NlcnQoQXJyYXkuaXNBcnJheSh0cmFuc2FjdGlvbnMpICYmIHRyYW5zYWN0aW9ucy5sZW5ndGggPT09IDEsICd0eFJlcXVlc3QgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHRyYW5zYWN0aW9uJyk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVzID0gdHJhbnNhY3Rpb25zWzBdLnNpZ25hdHVyZVNoYXJlcztcbiAgICBhc3NlcnQoc2lnbmF0dXJlU2hhcmVzLCAnTWlzc2luZyBzaWduYXR1cmUgc2hhcmVzIGluIHJvdW5kIDEgdHhSZXF1ZXN0Jyk7XG5cbiAgICBjb25zdCBiaXRnb1NoYXJlUm91bmRPbmUgPSBnZXRCaXRnb1NpZ25hdHVyZVNoYXJlKHNpZ25hdHVyZVNoYXJlcywgU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsICdyb3VuZDFPdXRwdXQnKTtcbiAgICBjb25zdCBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUgPSBkZWNvZGVXaXRoQ29kZWMoXG4gICAgICBFZGRzYU1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFPdXRwdXQsXG4gICAgICBKU09OLnBhcnNlKGJpdGdvU2hhcmVSb3VuZE9uZS5zaGFyZSksXG4gICAgICAnVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLidcbiAgICApO1xuXG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZS50eXBlICE9PSAncm91bmQxT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29EZXNlcmlhbGl6ZWRNc2cxID0gYXdhaXQgdmVyaWZ5UGVlck1lc3NhZ2VSb3VuZE9uZShwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUsIGJpdGdvR3BnS2V5KTtcblxuICAgIHRoaXMudmFsaWRhdGVBZGF0YShhZGF0YSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgRWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19ST1VORDFfU1RBVEUpO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkUm91bmQxU2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICBpbnB1dDogZW5jcnlwdGVkUm91bmQxU2Vzc2lvbixcbiAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBkc2dTZXNzaW9uLCB1c2VyTXNnUGF5bG9hZCB9ID0gSlNPTi5wYXJzZShkZWNyeXB0ZWRSb3VuZDFTZXNzaW9uKSBhcyB7XG4gICAgICBkc2dTZXNzaW9uOiBzdHJpbmc7XG4gICAgICB1c2VyTXNnUGF5bG9hZDogc3RyaW5nO1xuICAgIH07XG5cbiAgICBjb25zdCB1c2VyRHNnID0gbmV3IEVkZHNhTVBTRHNnLkRTRyhNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICAgIGF3YWl0IHVzZXJEc2cucmVzdG9yZVNlc3Npb24oZHNnU2Vzc2lvbik7XG4gICAgY29uc3QgdXNlck1zZzE6IE1QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2UgPSB7XG4gICAgICBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICBwYXlsb2FkOiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh1c2VyTXNnUGF5bG9hZCwgJ2Jhc2U2NCcpKSxcbiAgICB9O1xuXG4gICAgY29uc3QgW3VzZXJNc2cyXSA9IHVzZXJEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbdXNlck1zZzEsIGJpdGdvRGVzZXJpYWxpemVkTXNnMV0pO1xuICAgIGFzc2VydCh1c2VyTXNnMiwgJ0RTRyBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzIHByb2R1Y2VkIG5vIHJvdW5kLTIgb3V0cHV0Jyk7XG5cbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMiA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRUd28odXNlck1zZzIsIHVzZXJHcGdQcnZLZXkpO1xuICAgIGNvbnN0IHNlc3Npb25QYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZHNnU2Vzc2lvbjogdXNlckRzZy5nZXRTZXNzaW9uKCksXG4gICAgICB1c2VyTXNnUGF5bG9hZDogQnVmZmVyLmZyb20odXNlck1zZzIucGF5bG9hZCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIH0pO1xuXG4gICAgaWYgKHVzZVYyKSB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5jcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbih3YWxsZXRQYXNzcGhyYXNlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZFJvdW5kMlNlc3Npb24gPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQoXG4gICAgICAgICAgc2Vzc2lvblBheWxvYWQsXG4gICAgICAgICAgYCR7RWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19ST1VORDJfU1RBVEV9OiR7YWRhdGF9YFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyBzaWduYXR1cmVTaGFyZVJvdW5kMiwgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiB9O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2Vzc2lvbi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICBpbnB1dDogc2Vzc2lvblBheWxvYWQsXG4gICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhOiBgJHtFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1JPVU5EMl9TVEFURX06JHthZGF0YX1gLFxuICAgICAgZW5jcnlwdGlvblZlcnNpb246IDEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBzaWduYXR1cmVTaGFyZVJvdW5kMiwgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiB9O1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIFJvdW5kM1NoYXJlXG4gIGFzeW5jIGNyZWF0ZU9mZmxpbmVSb3VuZDNTaGFyZShwYXJhbXM6IHtcbiAgICB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgYml0Z29QdWJsaWNHcGdLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbjogc3RyaW5nO1xuICB9KTogUHJvbWlzZTx7XG4gICAgc2lnbmF0dXJlU2hhcmVSb3VuZDM6IFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICB9PiB7XG4gICAgY29uc3QgeyB3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLCBiaXRnb1B1YmxpY0dwZ0tleSwgdHhSZXF1ZXN0IH0gPSBwYXJhbXM7XG5cbiAgICBjb25zdCB7IHNpZ25hYmxlSGV4LCBkZXJpdmF0aW9uUGF0aCB9ID0gdGhpcy5nZXRTaWduYWJsZUhleEFuZERlcml2YXRpb25QYXRoKFxuICAgICAgdHhSZXF1ZXN0LFxuICAgICAgJ1VuYWJsZSB0byBmaW5kIHRyYW5zYWN0aW9ucyBpbiB0eFJlcXVlc3QnXG4gICAgKTtcbiAgICBjb25zdCBhZGF0YSA9IGAke3NpZ25hYmxlSGV4fToke2Rlcml2YXRpb25QYXRofWA7XG5cbiAgICBjb25zdCB7IGJpdGdvR3BnS2V5LCB1c2VyR3BnUHJ2S2V5IH0gPSBhd2FpdCB0aGlzLmdldEJpdGdvQW5kVXNlckdwZ0tleXMoXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGEsXG4gICAgICBFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1VTRVJfR1BHX0tFWVxuICAgICk7XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSB0eFJlcXVlc3QudHJhbnNhY3Rpb25zO1xuICAgIGFzc2VydChBcnJheS5pc0FycmF5KHRyYW5zYWN0aW9ucykgJiYgdHJhbnNhY3Rpb25zLmxlbmd0aCA9PT0gMSwgJ3R4UmVxdWVzdCBtdXN0IGhhdmUgZXhhY3RseSBvbmUgdHJhbnNhY3Rpb24nKTtcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZXMgPSB0cmFuc2FjdGlvbnNbMF0uc2lnbmF0dXJlU2hhcmVzO1xuICAgIGFzc2VydChzaWduYXR1cmVTaGFyZXMsICdNaXNzaW5nIHNpZ25hdHVyZSBzaGFyZXMgaW4gcm91bmQgMiB0eFJlcXVlc3QnKTtcblxuICAgIGNvbnN0IGJpdGdvU2hhcmVSb3VuZFR3byA9IGdldEJpdGdvU2lnbmF0dXJlU2hhcmUoc2lnbmF0dXJlU2hhcmVzLCBTaWduYXR1cmVTaGFyZVR5cGUuVVNFUiwgJ3JvdW5kMk91dHB1dCcpO1xuXG4gICAgY29uc3QgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kVHdvID0gZGVjb2RlV2l0aENvZGVjKFxuICAgICAgRWRkc2FNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQyT3V0cHV0LFxuICAgICAgSlNPTi5wYXJzZShiaXRnb1NoYXJlUm91bmRUd28uc2hhcmUpLFxuICAgICAgJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nXG4gICAgKTtcblxuICAgIGlmIChwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28udHlwZSAhPT0gJ3JvdW5kMk91dHB1dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdGdvRGVzZXJpYWxpemVkTXNnMiA9IGF3YWl0IHZlcmlmeVBlZXJNZXNzYWdlUm91bmRUd28ocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kVHdvLCBiaXRnb0dwZ0tleSk7XG5cbiAgICB0aGlzLnZhbGlkYXRlQWRhdGEoYWRhdGEsIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24sIEVkZHNhTVBDdjJVdGlscy5NUFNfRFNHX1NJR05JTkdfUk9VTkQyX1NUQVRFKTtcblxuICAgIGNvbnN0IGRlY3J5cHRlZFJvdW5kMlNlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgaW5wdXQ6IGVuY3J5cHRlZFJvdW5kMlNlc3Npb24sXG4gICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgZHNnU2Vzc2lvbiwgdXNlck1zZ1BheWxvYWQgfSA9IEpTT04ucGFyc2UoZGVjcnlwdGVkUm91bmQyU2Vzc2lvbikgYXMge1xuICAgICAgZHNnU2Vzc2lvbjogc3RyaW5nO1xuICAgICAgdXNlck1zZ1BheWxvYWQ6IHN0cmluZztcbiAgICB9O1xuXG4gICAgY29uc3QgdXNlckRzZyA9IG5ldyBFZGRzYU1QU0RzZy5EU0coTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgICBhd2FpdCB1c2VyRHNnLnJlc3RvcmVTZXNzaW9uKGRzZ1Nlc3Npb24pO1xuICAgIGNvbnN0IHVzZXJNc2cyOiBNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlID0ge1xuICAgICAgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICAgICAgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odXNlck1zZ1BheWxvYWQsICdiYXNlNjQnKSksXG4gICAgfTtcblxuICAgIGNvbnN0IFt1c2VyTXNnM10gPSB1c2VyRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3VzZXJNc2cyLCBiaXRnb0Rlc2VyaWFsaXplZE1zZzJdKTtcbiAgICBhc3NlcnQodXNlck1zZzMsICdEU0cgaGFuZGxlSW5jb21pbmdNZXNzYWdlcyBwcm9kdWNlZCBubyByb3VuZC0zIG91dHB1dCcpO1xuXG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZDMgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVGhyZWUodXNlck1zZzMsIHVzZXJHcGdQcnZLZXkpO1xuXG4gICAgcmV0dXJuIHsgc2lnbmF0dXJlU2hhcmVSb3VuZDMgfTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIHNpZ25FZGRzYU1QQ3YyVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICBwYXJhbXM6IFRTU1BhcmFtcyB8IFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gICAgZXh0ZXJuYWxTaWduZXJFZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRvcjogQ3VzdG9tRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJFZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRvcjogQ3VzdG9tRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJFZGRzYU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRvcjogQ3VzdG9tRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlID0gUmVxdWVzdFR5cGUudHhcbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBjb25zdCB7IHR4UmVxdWVzdCwgcmVxSWQgfSA9IHBhcmFtcztcblxuICAgIC8vIFRPRE8oV1AtMjE3Nik6IEFkZCBzdXBwb3J0IGZvciBtZXNzYWdlIHNpZ25pbmdcbiAgICBhc3NlcnQoXG4gICAgICByZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHgsXG4gICAgICAnT25seSB0cmFuc2FjdGlvbiBzaWduaW5nIGlzIHN1cHBvcnRlZCBmb3IgZXh0ZXJuYWwgc2lnbmVyLCBnb3Q6ICcgKyByZXF1ZXN0VHlwZVxuICAgICk7XG5cbiAgICBsZXQgdHhSZXF1ZXN0UmVzb2x2ZWQ6IFR4UmVxdWVzdDtcbiAgICBpZiAodHlwZW9mIHR4UmVxdWVzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkID0gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHR4UmVxdWVzdCwgcmVxSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZCA9IHR4UmVxdWVzdDtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9IGF3YWl0IHRoaXMucGlja0JpdGdvUHViR3BnS2V5Rm9yU2lnbmluZyhcbiAgICAgIHRydWUsXG4gICAgICByZXFJZCxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLmVudGVycHJpc2VJZCxcbiAgICAgIHRydWVcbiAgICApO1xuXG4gICAgaWYgKCFiaXRnb1B1YmxpY0dwZ0tleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIEJpdEdvIEdQRyBrZXkgZm9yIE1QQ3YyJyk7XG4gICAgfVxuXG4gICAgLy8gcm91bmQgMVxuICAgIGNvbnN0IHsgc2lnbmF0dXJlU2hhcmVSb3VuZDEsIHVzZXJHcGdQdWJLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgfSA9XG4gICAgICBhd2FpdCBleHRlcm5hbFNpZ25lckVkZHNhTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdG9yKHsgdHhSZXF1ZXN0OiB0eFJlcXVlc3RSZXNvbHZlZCB9KTtcbiAgICBjb25zdCByb3VuZDFUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQxXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdQdWJLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICByZXFJZFxuICAgICk7XG5cbiAgICAvLyByb3VuZCAyXG4gICAgY29uc3QgeyBzaWduYXR1cmVTaGFyZVJvdW5kMiwgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiB9ID0gYXdhaXQgZXh0ZXJuYWxTaWduZXJFZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRvcih7XG4gICAgICB0eFJlcXVlc3Q6IHJvdW5kMVR4UmVxdWVzdCxcbiAgICAgIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sXG4gICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXk6IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgfSk7XG4gICAgY29uc3Qgcm91bmQyVHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kMl0sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnUHViS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcmVxSWRcbiAgICApO1xuICAgIGFzc2VydChcbiAgICAgIHJvdW5kMlR4UmVxdWVzdC50cmFuc2FjdGlvbnMgJiYgcm91bmQyVHhSZXF1ZXN0LnRyYW5zYWN0aW9uc1swXS5zaWduYXR1cmVTaGFyZXMsXG4gICAgICAnTWlzc2luZyBzaWduYXR1cmUgc2hhcmVzIGluIHJvdW5kIDIgdHhSZXF1ZXN0J1xuICAgICk7XG5cbiAgICAvLyByb3VuZCAzXG4gICAgY29uc3QgeyBzaWduYXR1cmVTaGFyZVJvdW5kMyB9ID0gYXdhaXQgZXh0ZXJuYWxTaWduZXJFZGRzYU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRvcih7XG4gICAgICB0eFJlcXVlc3Q6IHJvdW5kMlR4UmVxdWVzdCxcbiAgICAgIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24sXG4gICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXk6IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgfSk7XG4gICAgYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kM10sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnUHViS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcmVxSWRcbiAgICApO1xuXG4gICAgcmV0dXJuIHNlbmRUeFJlcXVlc3QodGhpcy5iaXRnbywgdHhSZXF1ZXN0UmVzb2x2ZWQud2FsbGV0SWQsIHR4UmVxdWVzdFJlc29sdmVkLnR4UmVxdWVzdElkLCByZXF1ZXN0VHlwZSwgcmVxSWQpO1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIHJldHJvZml0XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldFVzZXJBbmRCYWNrdXBTZXNzaW9uKHJldHJvZml0PzogRGVjcnlwdGVkUmV0cm9maXRQYXlsb2FkKTogUHJvbWlzZTx7XG4gICAgdXNlckRrZzogRWRkc2FNUFNEa2cuREtHO1xuICAgIGJhY2t1cERrZzogRWRkc2FNUFNEa2cuREtHO1xuICB9PiB7XG4gICAgaWYgKHJldHJvZml0KSB7XG4gICAgICBjb25zdCB7IHVzZXJSZXRyb2ZpdERhdGEsIGJhY2t1cFJldHJvZml0RGF0YSB9ID0gYXdhaXQgdGhpcy5nZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleXMoe1xuICAgICAgICBtcGN2MVVzZXJLZXlTaGFyZTogcmV0cm9maXQuZGVjcnlwdGVkVXNlcktleSxcbiAgICAgICAgbXBjdjFCYWNrdXBLZXlTaGFyZTogcmV0cm9maXQuZGVjcnlwdGVkQmFja3VwS2V5LFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2VyRGtnOiBuZXcgRWRkc2FNUFNEa2cuREtHKDMsIDIsIE1QQ3YyUGFydGllc0VudW0uVVNFUiwgdXNlclJldHJvZml0RGF0YSksXG4gICAgICAgIGJhY2t1cERrZzogbmV3IEVkZHNhTVBTRGtnLkRLRygzLCAyLCBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCwgYmFja3VwUmV0cm9maXREYXRhKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB1c2VyRGtnOiBuZXcgRWRkc2FNUFNEa2cuREtHKDMsIDIsIE1QQ3YyUGFydGllc0VudW0uVVNFUiksXG4gICAgICBiYWNrdXBEa2c6IG5ldyBFZGRzYU1QU0RrZy5ES0coMywgMiwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBnZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleXMocGFyYW1zOiB7IG1wY3YxVXNlcktleVNoYXJlOiBzdHJpbmc7IG1wY3YxQmFja3VwS2V5U2hhcmU6IHN0cmluZyB9KTogUHJvbWlzZTx7XG4gICAgdXNlclJldHJvZml0RGF0YTogTVBTVHlwZXMuRWRkc2FSZXRyb2ZpdERhdGE7XG4gICAgYmFja3VwUmV0cm9maXREYXRhOiBNUFNUeXBlcy5FZGRzYVJldHJvZml0RGF0YTtcbiAgfT4ge1xuICAgIGNvbnN0IE1QQyA9IGF3YWl0IGdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcbiAgICBjb25zdCB1c2VyUmV0cm9maXREYXRhID0gRWRkc2FNUEN2MlV0aWxzLmdldE1wY1YyUmV0cm9maXREYXRhRnJvbU1wY1YxS2V5KFxuICAgICAgcGFyYW1zLm1wY3YxVXNlcktleVNoYXJlLFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICAgICAgTVBDXG4gICAgKTtcbiAgICBjb25zdCBiYWNrdXBSZXRyb2ZpdERhdGEgPSBFZGRzYU1QQ3YyVXRpbHMuZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXkoXG4gICAgICBwYXJhbXMubXBjdjFCYWNrdXBLZXlTaGFyZSxcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLFxuICAgICAgTVBDXG4gICAgKTtcblxuICAgIGFzc2VydChcbiAgICAgIHVzZXJSZXRyb2ZpdERhdGEuZXhwZWN0ZWRQayA9PT0gYmFja3VwUmV0cm9maXREYXRhLmV4cGVjdGVkUGssXG4gICAgICAnTVBDdjEgdXNlciBhbmQgYmFja3VwIGtleXMgY29tYmluZSB0byBkaWZmZXJlbnQgYWdncmVnYXRlIHB1YmxpYyBrZXlzJ1xuICAgICk7XG4gICAgYXNzZXJ0KFxuICAgICAgdXNlclJldHJvZml0RGF0YS5jaGFpbkNvZGUgPT09IGJhY2t1cFJldHJvZml0RGF0YS5jaGFpbkNvZGUsXG4gICAgICAnTVBDdjEgdXNlciBhbmQgYmFja3VwIGtleXMgY29tYmluZSB0byBkaWZmZXJlbnQgY2hhaW4gY29kZXMnXG4gICAgKTtcblxuICAgIHJldHVybiB7IHVzZXJSZXRyb2ZpdERhdGEsIGJhY2t1cFJldHJvZml0RGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgVXNlciBvciBCYWNrdXAgTVBDdjEgU2lnbmluZ01hdGVyaWFsIHRvIEVkZHNhUmV0cm9maXREYXRhIG5lZWRlZCBieSBNUEN2MiBES0cuXG4gICAqXG4gICAqIFB1YmxpYyBzdGF0aWMgc2luZ2xlLXBhcnR5IGhlbHBlciBmb3IgYWlyLWdhcHBlZCBPVkM6IG5vIEJpdEdvIGluc3RhbmNlIGFuZCBub1xuICAgKiBzZWNvbmQtcGFydHkgc2hhcmUgcmVxdWlyZWQuIFVubGlrZSBFQ0RTQSdzIGVxdWl2YWxlbnQgdGhpcyBpcyBhc3luYyBiZWNhdXNlXG4gICAqIEVkRFNBIE1QQyBpbml0aWFsaXphdGlvbiBpcyBhc3luYy5cbiAgICpcbiAgICogQHBhcmFtIGRlY3J5cHRlZEtleXNoYXJlIC0gTVBDdjEgZGVjcnlwdGVkIHNpZ25pbmcgbWF0ZXJpYWwgZm9yIHVzZXIgb3IgYmFja3VwIGFzIGEgSlNPTiBzdHJpbmdcbiAgICogQHBhcmFtIHBhcnR5SWQgLSBUaGUgcGFydHkgSUQgb2YgdGhlIE1QQ3YxIGtleXNoYXJlXG4gICAqIEByZXR1cm5zIFRoZSByZXRyb2ZpdCBkYXRhIG5lZWRlZCB0byBzdGFydCBhbiBNUEN2MiBES0cgc2Vzc2lvblxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldEtleURhdGFGb3JSZXRyb2ZpdChcbiAgICBkZWNyeXB0ZWRLZXlzaGFyZTogc3RyaW5nLFxuICAgIHBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQIHwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSXG4gICk6IFByb21pc2U8TVBTVHlwZXMuRWRkc2FSZXRyb2ZpdERhdGE+IHtcbiAgICBjb25zdCBtcGMgPSBhd2FpdCBnZXRJbml0aWFsaXplZE1wY0luc3RhbmNlKCk7XG4gICAgcmV0dXJuIEVkZHNhTVBDdjJVdGlscy5nZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleShkZWNyeXB0ZWRLZXlzaGFyZSwgcGFydHlJZCwgbXBjKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldE1wY1YyUmV0cm9maXREYXRhRnJvbU1wY1YxS2V5KFxuICAgIG1wY3YxUGFydHlLZXlTaGFyZTogc3RyaW5nLFxuICAgIG1wY3YxUGFydHlJbmRleDogTVBDdjJQYXJ0aWVzRW51bS5VU0VSIHwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsXG4gICAgbXBjOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGdldEluaXRpYWxpemVkTXBjSW5zdGFuY2U+PlxuICApOiBNUFNUeXBlcy5FZGRzYVJldHJvZml0RGF0YSB7XG4gICAgY29uc3Qgc2lnbmluZ01hdGVyaWFsOiBTaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKG1wY3YxUGFydHlLZXlTaGFyZSk7XG4gICAgYXNzZXJ0KHNpZ25pbmdNYXRlcmlhbC51U2hhcmUsICdNUEN2MSBrZXkgbWF0ZXJpYWwgbWlzc2luZyB1U2hhcmUnKTtcbiAgICBhc3NlcnQoc2lnbmluZ01hdGVyaWFsLmJpdGdvWVNoYXJlLCAnTVBDdjEga2V5IG1hdGVyaWFsIG1pc3NpbmcgYml0Z29ZU2hhcmUnKTtcblxuICAgIGxldCBwU2hhcmU7XG4gICAgc3dpdGNoIChtcGN2MVBhcnR5SW5kZXgpIHtcbiAgICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5VU0VSOlxuICAgICAgICBhc3NlcnQoc2lnbmluZ01hdGVyaWFsLmJhY2t1cFlTaGFyZSwgJ1VzZXIgTVBDdjEga2V5IG1hdGVyaWFsIG1pc3NpbmcgYmFja3VwWVNoYXJlJyk7XG4gICAgICAgIHBTaGFyZSA9IG1wYy5rZXlDb21iaW5lKHNpZ25pbmdNYXRlcmlhbC51U2hhcmUsIFtcbiAgICAgICAgICBzaWduaW5nTWF0ZXJpYWwuYml0Z29ZU2hhcmUsXG4gICAgICAgICAgc2lnbmluZ01hdGVyaWFsLmJhY2t1cFlTaGFyZSxcbiAgICAgICAgXSkucFNoYXJlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVA6XG4gICAgICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwudXNlcllTaGFyZSwgJ0JhY2t1cCBNUEN2MSBrZXkgbWF0ZXJpYWwgbWlzc2luZyB1c2VyWVNoYXJlJyk7XG4gICAgICAgIHBTaGFyZSA9IG1wYy5rZXlDb21iaW5lKHNpZ25pbmdNYXRlcmlhbC51U2hhcmUsIFtcbiAgICAgICAgICBzaWduaW5nTWF0ZXJpYWwuYml0Z29ZU2hhcmUsXG4gICAgICAgICAgc2lnbmluZ01hdGVyaWFsLnVzZXJZU2hhcmUsXG4gICAgICAgIF0pLnBTaGFyZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFydGljaXBhbnQgaW5kZXgnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc19pXzA6IHBTaGFyZS51LFxuICAgICAgZXhwZWN0ZWRQazogcFNoYXJlLnksXG4gICAgICBjaGFpbkNvZGU6IHBTaGFyZS5jaGFpbmNvZGUsXG4gICAgfTtcbiAgfVxuXG4gIC8vICNlbmRyZWdpb25cbn1cblxuLyoqXG4gKiBEZXRlY3Qgd2hldGhlciBhbiBlbmNyeXB0ZWQga2V5Y2FyZCBjb250YWlucyBNUEN2MSBzaWduaW5nIG1hdGVyaWFsLlxuICpcbiAqIERlY3J5cHRzIHRoZSBrZXljYXJkIGFuZCBjaGVja3MgZm9yIHRoZSBKU09OIHNoYXBlIHByb2R1Y2VkIGJ5IHRoZSBNUEN2MSBUU1NcbiAqIGtleS1nZW5lcmF0aW9uIGZsb3cgKHVTaGFyZS5zZWVkICsgYml0Z29ZU2hhcmUudSArIGJhY2t1cFlTaGFyZS51IC8gdXNlcllTaGFyZS51KS5cbiAqIFJldHVybnMgZmFsc2UgZm9yIE1QQ3YyIENCT1Iga2V5Y2FyZHMsIHdyb25nIHBhc3N3b3Jkcywgb3IgYW55IGRlY3J5cHRpb24gZXJyb3IuXG4gKlxuICogQHBhcmFtIGVuY3J5cHRlZEtleVNoYXJlIGVuY3J5cHRlZCB1c2VyIG9yIGJhY2t1cCBrZXljYXJkXG4gKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSBwYXNzcGhyYXNlIHVzZWQgdG8gZW5jcnlwdCB0aGUga2V5Y2FyZFxuICogQHBhcmFtIGJpdGdvIG9wdGlvbmFsIEJpdEdvQmFzZSBpbnN0YW5jZTsgd2hlbiBwcm92aWRlZCwgZGVjcnlwdHMgdmlhXG4gKiAgIGJpdGdvLmRlY3J5cHQgKHN1cHBvcnRzIGJvdGggdjEgU0pDTCBhbmQgdjIgQXJnb24yaWQgZW52ZWxvcGVzKTtcbiAqICAgd2hlbiBhYnNlbnQsIGZhbGxzIGJhY2sgdG8gc2pjbC5kZWNyeXB0ICh2MSBvbmx5KVxuICovXG5mdW5jdGlvbiBwYXJzZUVkZHNhTXBjVjFNYXRlcmlhbChkZWNyeXB0ZWQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICB0cnkge1xuICAgIGNvbnN0IG0gPSBKU09OLnBhcnNlKGRlY3J5cHRlZCk7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG0/LnVTaGFyZT8uc2VlZCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIHR5cGVvZiBtPy5iaXRnb1lTaGFyZT8udSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICh0eXBlb2YgbT8uYmFja3VwWVNoYXJlPy51ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbT8udXNlcllTaGFyZT8udSA9PT0gJ3N0cmluZycpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZGVjcnlwdGVkO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTm90IEpTT04g4oaSIE1QQ3YyIENCT1JcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzRWRkc2FNcGNWMVNpZ25pbmdNYXRlcmlhbChcbiAgZW5jcnlwdGVkS2V5U2hhcmU6IHN0cmluZyxcbiAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nLFxuICBiaXRnbz86IEJpdEdvQmFzZVxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGRlY3J5cHRlZCA9IGJpdGdvXG4gICAgPyBhd2FpdCBiaXRnby5kZWNyeXB0KHsgaW5wdXQ6IGVuY3J5cHRlZEtleVNoYXJlLCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KVxuICAgIDogc2pjbC5kZWNyeXB0KHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZEtleVNoYXJlKTtcbiAgcmV0dXJuIHBhcnNlRWRkc2FNcGNWMU1hdGVyaWFsKGRlY3J5cHRlZCkgIT09IG51bGw7XG59XG5cbi8qKlxuICogR2V0IEVkRFNBIE1QQ3YyIHJlY292ZXJ5IGtleSBzaGFyZXMgZnJvbSBlbmNyeXB0ZWQgcmVkdWNlZCB1c2VyIGFuZCBiYWNrdXAga2V5cy5cbiAqXG4gKiBUaGUgZW5jcnlwdGVkIGlucHV0cyBhcmUgdGhlIGByZWR1Y2VkRW5jcnlwdGVkUHJ2YCB2YWx1ZXMgc3RvcmVkIG9uIEVkRFNBIE1QQ3YyXG4gKiBrZXkgY2FyZHMuIFRoZXkgZGVjcnlwdCBlaXRoZXIgdG8gQ0JPUi1lbmNvZGVkIHJlZHVjZWQgc2hhcmVzIChsZWdhY3kgY2FyZHMpIG9yIHRvXG4gKiB0aGUgdmVyc2lvbmVkIHNhZmUtcm9vdCBlbnZlbG9wZSBgeyB2ZXJzaW9uOiAxLCBwcnZLZXlTaGFyZSwgdnJmIH1gLCB3aGVyZSB0aGUgc2lnbmluZ1xuICogc2hhcmUgc3RheXMgcmVkdWNlZCBhbmQgYHZyZmAgaXMgdGhlIGNvbXBsZXRlIHNlcmlhbGl6ZWQgVlJGIGtleXNoYXJlLiBMZWdhY3kgY2FyZHNcbiAqIGhhdmUgbm8gVlJGIG1hdGVyaWFsIGFuZCByZWNvdmVyIGFzIGJlZm9yZS5cbiAqXG4gKiBAcGFyYW0gZW5jcnlwdGVkVXNlcktleSBlbmNyeXB0ZWQgRWREU0EgTVBDdjIgcmVkdWNlZCB1c2VyIGtleVxuICogQHBhcmFtIGVuY3J5cHRlZEJhY2t1cEtleSBlbmNyeXB0ZWQgRWREU0EgTVBDdjIgcmVkdWNlZCBiYWNrdXAga2V5XG4gKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSBwYXNzd29yZCBmb3IgdXNlciBhbmQgYmFja3VwIGtleXNcbiAqIEByZXR1cm5zIEVkRFNBIE1QQ3YyIHJlY292ZXJ5IGtleSBzaGFyZXMgYW5kIGNvbW1vbiBrZXljaGFpblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RWRkc2FNcGNWMlJlY292ZXJ5S2V5U2hhcmVzRnJvbVJlZHVjZWRLZXkoXG4gIGVuY3J5cHRlZFVzZXJLZXk6IHN0cmluZyxcbiAgZW5jcnlwdGVkQmFja3VwS2V5OiBzdHJpbmcsXG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmcsXG4gIGJpdGdvPzogQml0R29CYXNlXG4pOiBQcm9taXNlPEVkZHNhTVBDdjJSZWNvdmVyeUtleVNoYXJlcz4ge1xuICBjb25zdCBkZWNvZGVLZXkgPSBhc3luYyAoXG4gICAgZW5jcnlwdGVkS2V5OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx7IHJlZHVjZWQ6IE1QU1R5cGVzLkVkZHNhUmVkdWNlZEtleVNoYXJlOyB2cmZLZXlTaGFyZT86IEJ1ZmZlciB9PiA9PiB7XG4gICAgY29uc3QgZGVjcnlwdGVkID0gYml0Z29cbiAgICAgID8gYXdhaXQgYml0Z28uZGVjcnlwdCh7IGlucHV0OiBlbmNyeXB0ZWRLZXksIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlIH0pXG4gICAgICA6IHNqY2wuZGVjcnlwdCh3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRLZXkpO1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlTXBjVjJLZXlTaGFyZUVudmVsb3BlKGRlY3J5cHRlZCk7XG4gICAgbGV0IHJlZHVjZWQ6IE1QU1R5cGVzLkVkZHNhUmVkdWNlZEtleVNoYXJlO1xuICAgIHRyeSB7XG4gICAgICByZWR1Y2VkID0gTVBTVHlwZXMuZ2V0RGVjb2RlZFJlZHVjZWRLZXlTaGFyZShwYXJzZWQuc2lnbmluZ0tleVNoYXJlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0VkRFNBIE1QQ3YyIHJlY292ZXJ5OiB1bmFibGUgdG8gZGVjb2RlIHJlZHVjZWQga2V5IHNoYXJlIGZyb20ga2V5Y2FyZCBtYXRlcmlhbC4gVGhlIGVuY3J5cHRlZCBrZXkgbWF5IGJlIGNvcnJ1cHRlZCwgbWFsZm9ybWVkLCBvciBub3QgYW4gRWREU0EgTVBDdjIgcmVkdWNlZCBrZXkuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFyZWR1Y2VkLmtleVNoYXJlPy5sZW5ndGggfHwgIXJlZHVjZWQucHViPy5sZW5ndGggfHwgIXJlZHVjZWQucm9vdENoYWluQ29kZT8ubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdFZERTQSBNUEN2MiByZWNvdmVyeTogcmVkdWNlZCBrZXkgc2hhcmUgaXMgbWlzc2luZyBrZXlTaGFyZSwgcHViLCBvciByb290Q2hhaW5Db2RlLiBUaGlzIGtleWNhcmQgbWF5IGJlIHB1YmxpYy1vbmx5IGFuZCBjYW5ub3QgYmUgdXNlZCBmb3IgcmVjb3ZlcnkuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcmVkdWNlZCwgdnJmS2V5U2hhcmU6IHBhcnNlZC52cmZLZXlTaGFyZSB9O1xuICB9O1xuXG4gIGNvbnN0IFt1c2VyRGVjb2RlZCwgYmFja3VwRGVjb2RlZF0gPSBhd2FpdCBQcm9taXNlLmFsbChbZGVjb2RlS2V5KGVuY3J5cHRlZFVzZXJLZXkpLCBkZWNvZGVLZXkoZW5jcnlwdGVkQmFja3VwS2V5KV0pO1xuICBjb25zdCB1c2VyUmVkdWNlZCA9IHVzZXJEZWNvZGVkLnJlZHVjZWQ7XG4gIGNvbnN0IGJhY2t1cFJlZHVjZWQgPSBiYWNrdXBEZWNvZGVkLnJlZHVjZWQ7XG5cbiAgY29uc3QgdXNlclB1YiA9IEJ1ZmZlci5mcm9tKHVzZXJSZWR1Y2VkLnB1YikudG9TdHJpbmcoJ2hleCcpO1xuICBjb25zdCBiYWNrdXBQdWIgPSBCdWZmZXIuZnJvbShiYWNrdXBSZWR1Y2VkLnB1YikudG9TdHJpbmcoJ2hleCcpO1xuICBpZiAodXNlclB1YiAhPT0gYmFja3VwUHViKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFZERTQSBNUEN2MiByZWNvdmVyeTogdXNlciBhbmQgYmFja3VwIHB1YiBrZXlzIGRvIG5vdCBtYXRjaCcpO1xuICB9XG5cbiAgY29uc3QgdXNlckNoYWluQ29kZSA9IEJ1ZmZlci5mcm9tKHVzZXJSZWR1Y2VkLnJvb3RDaGFpbkNvZGUpLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgYmFja3VwQ2hhaW5Db2RlID0gQnVmZmVyLmZyb20oYmFja3VwUmVkdWNlZC5yb290Q2hhaW5Db2RlKS50b1N0cmluZygnaGV4Jyk7XG4gIGlmICh1c2VyQ2hhaW5Db2RlICE9PSBiYWNrdXBDaGFpbkNvZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VkRFNBIE1QQ3YyIHJlY292ZXJ5OiB1c2VyIGFuZCBiYWNrdXAgcm9vdENoYWluQ29kZXMgZG8gbm90IG1hdGNoJyk7XG4gIH1cblxuICBjb25zdCBoYXNVc2VyVnJmID0gdXNlckRlY29kZWQudnJmS2V5U2hhcmUgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgaGFzQmFja3VwVnJmID0gYmFja3VwRGVjb2RlZC52cmZLZXlTaGFyZSAhPT0gdW5kZWZpbmVkO1xuICBpZiAoaGFzVXNlclZyZiAhPT0gaGFzQmFja3VwVnJmKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0VkRFNBIE1QQ3YyIHJlY292ZXJ5OiBrZXlzaGFyZSBlbnZlbG9wZXMgbXVzdCBlaXRoZXIgYm90aCBjb250YWluIFZSRiBrZXlzaGFyZXMgb3IgYm90aCBvbWl0IHRoZW0nXG4gICAgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHVzZXJLZXlTaGFyZTogQnVmZmVyLmZyb20odXNlclJlZHVjZWQua2V5U2hhcmUpLFxuICAgIGJhY2t1cEtleVNoYXJlOiBCdWZmZXIuZnJvbShiYWNrdXBSZWR1Y2VkLmtleVNoYXJlKSxcbiAgICBjb21tb25LZXlDaGFpbjogdXNlclB1YiArIHVzZXJDaGFpbkNvZGUsXG4gICAgdXNlclZyZktleVNoYXJlOiB1c2VyRGVjb2RlZC52cmZLZXlTaGFyZSxcbiAgICBiYWNrdXBWcmZLZXlTaGFyZTogYmFja3VwRGVjb2RlZC52cmZLZXlTaGFyZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaWduIGEgbWVzc2FnZSBmb3IgcmVjb3ZlcnkgdXNpbmcgRWREU0EgTVBDdjIgKE1QUykgd2l0aCB1c2VyIGFuZCBiYWNrdXAga2V5IHNoYXJlcy5cbiAqXG4gKiBSdW5zIHRoZSBNUFMgRFNHIHByb3RvY29sIGxvY2FsbHkgdG8gcm91bmQgMywgdGhlbiB2ZXJpZmllcyB0aGUgcmVzdWx0aW5nXG4gKiBFZDI1NTE5IHNpZ25hdHVyZSBhZ2FpbnN0IHRoZSBwdWJsaWMga2V5IGRlcml2ZWQgZnJvbSB0aGUgY29tbW9uIGtleWNoYWluLlxuICpcbiAqIEBwYXJhbSBtZXNzYWdlIHJhdyBieXRlcyB0byBzaWduXG4gKiBAcGFyYW0gZGVyaXZhdGlvblBhdGggQklQLTMyLXN0eWxlIGRlcml2YXRpb24gcGF0aCwgZS5nLiBgXCJtLzBcImBcbiAqIEBwYXJhbSB1c2VyS2V5U2hhcmUgb3BhcXVlIE1QUyBzaWduaW5nIGtleS1zaGFyZSBieXRlcyBmb3IgdGhlIHVzZXIgcGFydHlcbiAqIEBwYXJhbSBiYWNrdXBLZXlTaGFyZSBvcGFxdWUgTVBTIHNpZ25pbmcga2V5LXNoYXJlIGJ5dGVzIGZvciB0aGUgYmFja3VwIHBhcnR5XG4gKiBAcGFyYW0gY29tbW9uS2V5Q2hhaW4gMTI4LWhleC1jaGFyIHN0cmluZzogMzItYnl0ZSBwdWIgKyAzMi1ieXRlIHJvb3RDaGFpbkNvZGVcbiAqIEByZXR1cm5zIDY0LWJ5dGUgRWQyNTUxOSBzaWduYXR1cmUgQnVmZmVyXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduUmVjb3ZlcnlFZGRzYU1QQ3YyKFxuICBtZXNzYWdlOiBCdWZmZXIsXG4gIGRlcml2YXRpb25QYXRoOiBzdHJpbmcsXG4gIHVzZXJLZXlTaGFyZTogQnVmZmVyLFxuICBiYWNrdXBLZXlTaGFyZTogQnVmZmVyLFxuICBjb21tb25LZXlDaGFpbjogc3RyaW5nXG4pOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBjb25zdCB1c2VyRHNnID0gbmV3IEVkZHNhTVBTRHNnLkRTRyhNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICBjb25zdCBiYWNrdXBEc2cgPSBuZXcgRWRkc2FNUFNEc2cuRFNHKE1QQ3YyUGFydGllc0VudW0uQkFDS1VQKTtcblxuICBjb25zdCBzaWduYXR1cmUgPSAoYXdhaXQgTVBTVXRpbC5leGVjdXRlVGlsbFJvdW5kKFxuICAgIDMsXG4gICAgdXNlckRzZyxcbiAgICBiYWNrdXBEc2csXG4gICAgdXNlcktleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlLFxuICAgIG1lc3NhZ2UsXG4gICAgZGVyaXZhdGlvblBhdGhcbiAgKSkgYXMgQnVmZmVyO1xuXG4gIC8vIFVzZSBFZGRzYS5kZXJpdmVVbmhhcmRlbmVkIChCSVAzMi1FZDI1NTE5KSwgd2hpY2ggbWF0Y2hlcyB3aGF0IERTRyB1c2VzXG4gIC8vIGludGVybmFsbHkgZm9yIHBhdGggZGVyaXZhdGlvbiBzaW5jZSB3YXNtLW1wcyAxLjkuMC5cbiAgY29uc3QgbXBjID0gYXdhaXQgZ2V0SW5pdGlhbGl6ZWRNcGNJbnN0YW5jZSgpO1xuICBjb25zdCBkZXJpdmVkS2V5Y2hhaW4gPSBtcGMuZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXlDaGFpbiwgZGVyaXZhdGlvblBhdGgpO1xuICBjb25zdCBwdWJsaWNLZXlCeXRlcyA9IEJ1ZmZlci5mcm9tKGRlcml2ZWRLZXljaGFpbi5zbGljZSgwLCA2NCksICdoZXgnKTtcblxuICBjb25zdCB2ZXJpZmllZCA9IGVkMjU1MTkudmVyaWZ5KG5ldyBVaW50OEFycmF5KHNpZ25hdHVyZSksIG5ldyBVaW50OEFycmF5KG1lc3NhZ2UpLCBuZXcgVWludDhBcnJheShwdWJsaWNLZXlCeXRlcykpO1xuICBpZiAoIXZlcmlmaWVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFZERTQSBNUEN2MiByZWNvdmVyeSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxlZCcpO1xuICB9XG5cbiAgcmV0dXJuIHNpZ25hdHVyZTtcbn1cblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHVuaW9uIHJlcHJlc2VudGluZyBFZERTQSBzaWduaW5nIG1hdGVyaWFsIGRldGVjdGVkIGZyb20gYSBrZXljYXJkLlxuICogdjE6IE1QQ3YxIEpTT04ga2V5Y2FyZCDigJQgdXNlclBydiBpcyB0aGUgZGVjcnlwdGVkIHBsYWludGV4dC5cbiAqIHYyOiBNUEN2MiBDQk9SIGtleWNhcmQg4oCUIGVuY3J5cHRlZFVzZXJLZXkgaXMgcmV0dXJuZWQgYXMtaXMgZm9yIE1QUyBEU0cuXG4gKi9cbmV4cG9ydCB0eXBlIEVkZHNhU2lnbmluZ01hdGVyaWFsID0geyB2ZXJzaW9uOiAndjEnOyB1c2VyUHJ2OiBzdHJpbmcgfSB8IHsgdmVyc2lvbjogJ3YyJzsgZW5jcnlwdGVkVXNlcktleTogc3RyaW5nIH07XG5cbi8qKlxuICogRGV0ZWN0cyBNUEN2MSB2cyBNUEN2MiBrZXljYXJkIGZvcm1hdCBhbmQgcmV0dXJucyB0eXBlZCBzaWduaW5nIG1hdGVyaWFsLlxuICogRm9yIHYxOiBkZWNyeXB0cyBvbmNlIGFuZCByZXR1cm5zIHRoZSBwbGFpbnRleHQgYXMgdXNlclBydi5cbiAqIEZvciB2MjogcmV0dXJucyB0aGUgZW5jcnlwdGVkIGtleSBhcy1pcyBmb3IgdXNlIHdpdGggc2lnbkVkZHNhTXBjVjJSZWNvdmVyeVR4LlxuICogV2hlbiBiaXRnbyBpcyBvbWl0dGVkLCBmYWxscyBiYWNrIHRvIHNqY2wgKHYxIG9ubHkpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwoXG4gIHVzZXJLZXk6IHN0cmluZyxcbiAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nLFxuICBiaXRnbz86IEJpdEdvQmFzZVxuKTogUHJvbWlzZTxFZGRzYVNpZ25pbmdNYXRlcmlhbD4ge1xuICBjb25zdCBub3JtYWxpemVkID0gdXNlcktleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICBsZXQgZGVjcnlwdGVkOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgZGVjcnlwdGVkID0gYml0Z29cbiAgICAgID8gYXdhaXQgYml0Z28uZGVjcnlwdCh7IGlucHV0OiBub3JtYWxpemVkLCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KVxuICAgICAgOiBzamNsLmRlY3J5cHQod2FsbGV0UGFzc3BocmFzZSwgbm9ybWFsaXplZCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGRlY3J5cHRpbmcgdXNlciBrZXljaGFpbjogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSl9YCk7XG4gIH1cbiAgY29uc3QgdXNlclBydiA9IHBhcnNlRWRkc2FNcGNWMU1hdGVyaWFsKGRlY3J5cHRlZCk7XG4gIHJldHVybiB1c2VyUHJ2ICE9PSBudWxsID8geyB2ZXJzaW9uOiAndjEnLCB1c2VyUHJ2IH0gOiB7IHZlcnNpb246ICd2MicsIGVuY3J5cHRlZFVzZXJLZXk6IG5vcm1hbGl6ZWQgfTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHZhbGlkYXRpbmcgdGhhdCBhIHZhbHVlIGhhcyB0aGUgc2hhcGUgb2YgRWRkc2FTaWduaW5nTWF0ZXJpYWwuXG4gKlxuICogQ29pbiBgcmVjb3ZlcigpYCBpbXBsZW1lbnRhdGlvbnMgYWNjZXB0IGFuIG9wdGlvbmFsIHByZWNvbXB1dGVkIHNpZ25pbmctbWF0ZXJpYWxcbiAqIHBhcmFtZXRlciAoc2V0IGJ5IHJlY292ZXJDb25zb2xpZGF0aW9ucygpIHRvIGF2b2lkIHJlLWRlY3J5cHRpbmcgdGhlIGtleWNhcmQgcGVyXG4gKiBzY2FubmVkIGluZGV4KS4gU29tZSBjYWxsZXJzIHBhc3MgYW4gdW5yZWxhdGVkIHNlY29uZCBwb3NpdGlvbmFsIGFyZ3VtZW50IHRvXG4gKiByZWNvdmVyKCkgZm9yIG90aGVyIHB1cnBvc2VzIChlLmcuIG9wZW5TU0xCeXRlcyBmb3IgRVZNLWxpa2UgY29pbnMpOyB2YWxpZGF0aW5nXG4gKiB0aGUgc2hhcGUgaGVyZSBwcmV2ZW50cyB0aGF0IGZyb20gYmVpbmcgbWlzaW50ZXJwcmV0ZWQgYXMgc2lnbmluZyBtYXRlcmlhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRWRkc2FTaWduaW5nTWF0ZXJpYWwodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBFZGRzYVNpZ25pbmdNYXRlcmlhbCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghKCd2ZXJzaW9uJyBpbiB2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHZhbHVlLnZlcnNpb24gPT09ICd2MScpIHtcbiAgICByZXR1cm4gJ3VzZXJQcnYnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS51c2VyUHJ2ID09PSAnc3RyaW5nJztcbiAgfVxuICBpZiAodmFsdWUudmVyc2lvbiA9PT0gJ3YyJykge1xuICAgIHJldHVybiAnZW5jcnlwdGVkVXNlcktleScgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLmVuY3J5cHRlZFVzZXJLZXkgPT09ICdzdHJpbmcnO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBGdWxsIE1QQ3YyIHJlY292ZXJ5IHNpZ25pbmcgZmxvdzogZGVjcnlwdCBrZXkgc2hhcmVzIOKGkiB2YWxpZGF0ZSBjb21tb25LZXlDaGFpbiDihpIgTVBTIERTRy5cbiAqIFJldHVybnMgcmF3IDY0LWJ5dGUgRWQyNTUxOSBzaWduYXR1cmUgQnVmZmVyLlxuICogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbnkgY29pbi1zcGVjaWZpYyBlbnZlbG9wZVxuICogKGUuZy4gMHgwMCBTdWJzdHJhdGUgcHJlZml4LCBTVUkgZmxhZytwdWJrZXkgd3JhcHBlciwgb3IgcmF3IGZvciBORUFSL0FEQS9UT04pLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkVkZHNhTXBjVjJSZWNvdmVyeVR4KHBhcmFtczoge1xuICBtZXNzYWdlOiBCdWZmZXI7XG4gIHVzZXJLZXk6IHN0cmluZztcbiAgYmFja3VwS2V5OiBzdHJpbmc7XG4gIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgYml0Z29LZXk6IHN0cmluZztcbiAgZGVyaXZhdGlvblBhdGg6IHN0cmluZztcbiAgYml0Z28/OiBCaXRHb0Jhc2U7XG59KTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgY29uc3QgeyB1c2VyS2V5U2hhcmUsIGJhY2t1cEtleVNoYXJlLCBjb21tb25LZXlDaGFpbiB9ID0gYXdhaXQgZ2V0RWRkc2FNcGNWMlJlY292ZXJ5S2V5U2hhcmVzRnJvbVJlZHVjZWRLZXkoXG4gICAgcGFyYW1zLnVzZXJLZXksXG4gICAgcGFyYW1zLmJhY2t1cEtleSxcbiAgICBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICBwYXJhbXMuYml0Z29cbiAgKTtcbiAgaWYgKGNvbW1vbktleUNoYWluLnRvTG93ZXJDYXNlKCkgIT09IHBhcmFtcy5iaXRnb0tleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFZERTQSBNUEN2MiByZWNvdmVyeTogY29tbW9uS2V5Q2hhaW4gZnJvbSBrZXljYXJkIGRvZXMgbm90IG1hdGNoIGJpdGdvS2V5Jyk7XG4gIH1cbiAgcmV0dXJuIHNpZ25SZWNvdmVyeUVkZHNhTVBDdjIocGFyYW1zLm1lc3NhZ2UsIHBhcmFtcy5kZXJpdmF0aW9uUGF0aCwgdXNlcktleVNoYXJlLCBiYWNrdXBLZXlTaGFyZSwgY29tbW9uS2V5Q2hhaW4pO1xufVxuXG5leHBvcnQgY29uc3QgRWRkc2FNUEN2MlJlY292ZXJ5RnVuY3Rpb25zID0ge1xuICBpc0VkZHNhTXBjVjFTaWduaW5nTWF0ZXJpYWwsXG4gIGdldEVkZHNhTXBjVjJSZWNvdmVyeUtleVNoYXJlc0Zyb21SZWR1Y2VkS2V5LFxuICBzaWduUmVjb3ZlcnlFZGRzYU1QQ3YyLFxuICBnZXRFZGRzYVNpZ25pbmdNYXRlcmlhbCxcbiAgaXNFZGRzYVNpZ25pbmdNYXRlcmlhbCxcbiAgc2lnbkVkZHNhTXBjVjJSZWNvdmVyeVR4LFxufTtcbiJdfQ==
|
|
905
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2FNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWRkc2EvZWRkc2FNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtdUNBLGtFQVNDO0FBZ0JELG9HQTJEQztBQWVELHdEQWdDQztBQWVELDBEQWdCQztBQVdELHdEQWNDO0FBUUQsNERBbUJDO0FBejdDRCxvREFBNEI7QUFDNUIsdURBQXlDO0FBQ3pDLDZDQUErQjtBQUMvQiw2Q0FBNkM7QUFDN0Msc0RBUzZCO0FBRTdCLG1EQUFnRDtBQUNoRCx5REFBZ0c7QUFDaEcsNkRBQThFO0FBUzlFLDREQUFxRztBQUNyRyxnREFBZ0g7QUFDaEgseUNBQStDO0FBQy9DLDhEQU11QztBQUN2QyxvREFBcUU7QUFDckUscURBQXdEO0FBQ3hELG9EQUF1RDtBQUN2RCw0Q0Fhc0I7QUFHdEIsaUNBQXdDO0FBQ3hDLHNEQUE2RDtBQUM3RCxxRUFBNkY7QUFFN0YsMERBQWlFO0FBR2pFLE1BQWEsZUFBZ0IsU0FBUSxxQkFBYztJQU1qRCxrQkFBa0I7SUFDbEIsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQVNyQjtRQUNDLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBQSxpQ0FBa0IsRUFBQyxTQUFTLENBQUMsQ0FBQztRQUN4RCxNQUFNLFVBQVUsR0FBRyxNQUFNLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDcEYsTUFBTSxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsTUFBTSxzQkFBUSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTFFLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBQSxpQ0FBa0IsRUFBQyxTQUFTLENBQUMsQ0FBQztRQUMxRCxNQUFNLFlBQVksR0FBRyxNQUFNLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxVQUFVLEVBQUUsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDeEYsTUFBTSxrQkFBa0IsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDO1FBQ25ELE1BQU0sQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEdBQUcsTUFBTSxzQkFBUSxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWhGLCtGQUErRjtRQUMvRixrR0FBa0c7UUFDbEcsTUFBTSxFQUFFLG1CQUFtQixFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsb0NBQW9DLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6RyxNQUFNLGlCQUFpQixHQUFHLG1CQUFtQixJQUFJLElBQUksQ0FBQywyQkFBMkIsQ0FBQztRQUNsRixJQUFBLGdCQUFNLEVBQUMsaUJBQWlCLEVBQUUsZ0RBQWdELENBQUMsQ0FBQztRQUM1RSxNQUFNLHdCQUF3QixHQUFHLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTNELElBQUksSUFBQSw4Q0FBK0IsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN6RCxJQUFBLGdCQUFNLEVBQUMsSUFBQSxzQ0FBdUIsRUFBQyx3QkFBd0IsQ0FBQyxFQUFFLDhCQUE4QixDQUFDLENBQUM7UUFDNUYsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVUsRUFBRSx3QkFBd0IsRUFBRSxDQUFDLENBQUM7UUFDaEYsTUFBTSxPQUFPLEdBQUcsTUFBTSxzQkFBUSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXBFLDhEQUE4RDtRQUM5RCxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVuRixrQkFBa0I7UUFDbEIsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUVyRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDM0MsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRS9DLE1BQU0sY0FBYyxHQUFHLE1BQU0sc0JBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN0RyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sc0JBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUU1RyxJQUFBLGdCQUFNLEVBQUMsNEJBQWMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQy9FLElBQUEsZ0JBQU0sRUFBQyw0QkFBYyxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLG1DQUFtQyxDQUFDLENBQUM7UUFFbkYsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FDakUsTUFBTSxDQUFDLFVBQVUsRUFDakI7WUFDRSxnQkFBZ0I7WUFDaEIsa0JBQWtCO1lBQ2xCLFFBQVEsRUFBRSxjQUFjO1lBQ3hCLFVBQVUsRUFBRSxnQkFBZ0I7WUFDNUIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDN0UsRUFDRCxNQUFNLENBQUMsTUFBTSxDQUNkLENBQUM7UUFDRixhQUFhO1FBRWIsa0JBQWtCO1FBQ2xCLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxzQkFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNsRixNQUFNLHFCQUFxQixHQUFpQztZQUMxRCxJQUFJLEVBQUUsNkJBQWdCLENBQUMsS0FBSztZQUM1QixPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsaUJBQWlCLENBQUM7U0FDM0MsQ0FBQztRQUVGLE1BQU0sY0FBYyxHQUFrQyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUVwRyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEUsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFMUUsSUFBQSxnQkFBTSxFQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLHlEQUF5RCxDQUFDLENBQUM7UUFDL0YsSUFBQSxnQkFBTSxFQUFDLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsMkRBQTJELENBQUMsQ0FBQztRQUVuRyxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdkMsTUFBTSxjQUFjLEdBQUcsTUFBTSxzQkFBUSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3RHLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxzQkFBUSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRTVHLE1BQU0sRUFDSixTQUFTLEVBQUUsZUFBZSxFQUMxQixvQkFBb0IsRUFDcEIsU0FBUyxHQUNWLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtZQUN4RCxTQUFTO1lBQ1QsUUFBUSxFQUFFLGNBQWM7WUFDeEIsVUFBVSxFQUFFLGdCQUFnQjtTQUM3QixDQUFDLENBQUM7UUFDSCxhQUFhO1FBRWIsNEJBQTRCO1FBQzVCLGdCQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsOENBQThDLENBQUMsQ0FBQztRQUV6RixNQUFNLGlCQUFpQixHQUFHLE1BQU0sc0JBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbEYsTUFBTSxxQkFBcUIsR0FBaUM7WUFDMUQsSUFBSSxFQUFFLDZCQUFnQixDQUFDLEtBQUs7WUFDNUIsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLGlCQUFpQixDQUFDO1NBQzNDLENBQUM7UUFFRixNQUFNLGNBQWMsR0FBa0MsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFFcEcsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV6RSxJQUFBLGdCQUFNLEVBQUMsYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUseURBQXlELENBQUMsQ0FBQztRQUM5RixJQUFBLGdCQUFNLEVBQUMsZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsMkRBQTJELENBQUMsQ0FBQztRQUVsRyxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sb0JBQW9CLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFM0QsZ0JBQU0sQ0FBQyxLQUFLLENBQ1Ysa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQiw2REFBNkQsQ0FDOUQsQ0FBQztRQUNGLGdCQUFNLENBQUMsS0FBSyxDQUNWLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsK0RBQStELENBQ2hFLENBQUM7UUFFRixNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsRCxNQUFNLHFCQUFxQixHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0RCxNQUFNLDBCQUEwQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sNEJBQTRCLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFcEUsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUM5QyxrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQixNQUFNLENBQUMsVUFBVSxFQUNqQixNQUFNLENBQUMsOEJBQThCLEVBQ3JDLE1BQU0sQ0FBQyxZQUFZLEVBQ25CLE1BQU0sQ0FBQyxpQkFBaUIsRUFDeEIsTUFBTSxDQUFDLFVBQVUsRUFDakIsTUFBTSxDQUFDLE1BQU0sQ0FDZCxDQUFDO1FBQ0YsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQ2xELG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsNEJBQTRCLEVBQzVCLE1BQU0sQ0FBQyxVQUFVLEVBQ2pCLE1BQU0sQ0FBQyw4QkFBOEIsRUFDckMsTUFBTSxDQUFDLGlCQUFpQixFQUN4QixNQUFNLENBQUMsVUFBVSxFQUNqQixNQUFNLENBQUMsTUFBTSxDQUNkLENBQUM7UUFDRixNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdEYsTUFBTSxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsYUFBYSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ3RFLG1CQUFtQjtZQUNuQixxQkFBcUI7WUFDckIsb0JBQW9CO1NBQ3JCLENBQUMsQ0FBQztRQUNILGFBQWE7UUFFYixPQUFPO1lBQ0wsWUFBWTtZQUNaLGNBQWM7WUFDZCxhQUFhO1NBQ2QsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsaUNBQWlDLENBQUMsTUFHdkM7UUFDQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUV6QyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEcsTUFBTSxpQkFBaUIsR0FBRyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsMkJBQTJCLENBQUM7UUFDbEYsSUFBQSxnQkFBTSxFQUFDLGlCQUFpQixFQUFFLGdEQUFnRCxDQUFDLENBQUM7UUFDNUUsTUFBTSx3QkFBd0IsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUUzRCxJQUFJLElBQUEsOENBQStCLEVBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDekQsSUFBQSxnQkFBTSxFQUFDLElBQUEsc0NBQXVCLEVBQUMsd0JBQXdCLENBQUMsRUFBRSwwQ0FBMEMsQ0FBQyxDQUFDO1FBQ3hHLENBQUM7UUFFRCwwQ0FBMEM7UUFDMUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQztZQUMxRyxVQUFVO1lBQ1YsaUJBQWlCLEVBQUUsd0JBQXdCO1NBQzVDLENBQUMsQ0FBQztRQUVILElBQUEsZ0JBQU0sRUFBQyw0QkFBYyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7UUFDL0UsSUFBQSxnQkFBTSxFQUFDLDRCQUFjLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztRQUVuRix3Q0FBd0M7UUFDeEMsTUFBTSxFQUNKLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsU0FBUyxFQUFFLGVBQWUsRUFDMUIsV0FBVyxFQUFFLGlCQUFpQixHQUMvQixHQUFHLE1BQU0sU0FBUyxDQUFDLGNBQWMsQ0FBQztZQUNqQyxpQkFBaUIsRUFBRSx3QkFBd0I7WUFDM0MsZ0JBQWdCO1lBQ2hCLGtCQUFrQjtZQUNsQixTQUFTO1lBQ1QsV0FBVztTQUNaLENBQUMsQ0FBQztRQUVILE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxFQUFFO1lBQzlFLGdCQUFnQjtZQUNoQixrQkFBa0I7WUFDbEIsUUFBUSxFQUFFLGNBQWM7WUFDeEIsVUFBVSxFQUFFLGdCQUFnQjtTQUM3QixDQUFDLENBQUM7UUFFSCx3Q0FBd0M7UUFDeEMsTUFBTSxFQUNKLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsU0FBUyxFQUFFLGVBQWUsRUFDMUIsV0FBVyxFQUFFLGlCQUFpQixHQUMvQixHQUFHLE1BQU0sU0FBUyxDQUFDLGNBQWMsQ0FBQztZQUNqQyxTQUFTO1lBQ1QsY0FBYztZQUNkLGdCQUFnQjtZQUNoQixTQUFTLEVBQUUsZUFBZTtZQUMxQixXQUFXLEVBQUUsaUJBQWlCO1NBQy9CLENBQUMsQ0FBQztRQUVILE1BQU0sRUFDSixTQUFTLEVBQUUsZUFBZSxFQUMxQixvQkFBb0IsRUFBRSxtQkFBbUIsRUFDekMsU0FBUyxHQUNWLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxFQUFFO1lBQ2pELFNBQVM7WUFDVCxRQUFRLEVBQUUsY0FBYztZQUN4QixVQUFVLEVBQUUsZ0JBQWdCO1NBQzdCLENBQUMsQ0FBQztRQUNILGdCQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsOENBQThDLENBQUMsQ0FBQztRQUUvRiwrREFBK0Q7UUFDL0QsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLE1BQU0sU0FBUyxDQUFDLGdCQUFnQixDQUFDO1lBQzFELFNBQVM7WUFDVCxtQkFBbUI7WUFDbkIsU0FBUyxFQUFFLGVBQWU7WUFDMUIsV0FBVyxFQUFFLGlCQUFpQjtTQUMvQixDQUFDLENBQUM7UUFDSCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsK0JBQStCLENBQUMsQ0FBQztRQUV6RixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLGFBQWEsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUN0RSxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBZ0IsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQztZQUN2RyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBZ0IsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQztZQUN6RyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDO1NBQ3RDLENBQUMsQ0FBQztRQUVILE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQ3pELENBQUM7SUFFRCx5QkFBeUI7SUFDekIsS0FBSyxDQUFDLHlCQUF5QixDQUM3QixnQkFBOEMsRUFDOUMsY0FBc0IsRUFDdEIsZUFBd0IsRUFDeEIsc0JBQStCLEVBQy9CLFVBQW1CLEVBQ25CLDhCQUF1QyxFQUN2QyxZQUF3QyxFQUN4QyxpQkFBcUMsRUFDckMsVUFBbUIsRUFDbkIsTUFBZSxFQUNmLEtBQThDO1FBRTlDLElBQUksTUFBYyxDQUFDO1FBQ25CLElBQUksWUFBWSxHQUF1QixTQUFTLENBQUM7UUFDakQsSUFBSSxtQkFBbUIsR0FBdUIsU0FBUyxDQUFDO1FBQ3hELElBQUkscUJBQXFCLEdBQXVCLFNBQVMsQ0FBQztRQUUxRCxRQUFRLGdCQUFnQixFQUFFLENBQUM7WUFDekIsS0FBSyw2QkFBZ0IsQ0FBQyxJQUFJLENBQUM7WUFDM0IsS0FBSyw2QkFBZ0IsQ0FBQyxNQUFNO2dCQUMxQixNQUFNLEdBQUcsZ0JBQWdCLEtBQUssNkJBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFDeEUsSUFBSSxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ2xDLElBQUEsZ0JBQU0sRUFDSixnQkFBZ0IsS0FBSyw2QkFBZ0IsQ0FBQyxNQUFNO3dCQUMxQyxNQUFNLEtBQUssU0FBUzt3QkFDcEIsS0FBSyxLQUFLLFNBQVM7d0JBQ25CLHNCQUFzQixLQUFLLFNBQVMsRUFDdEMsb0NBQW9DLE1BQU0sV0FBVyxDQUN0RCxDQUFDO29CQUNGLElBQUEsZ0JBQU0sRUFBQyxVQUFVLEVBQUUsOEJBQThCLE1BQU0sV0FBVyxDQUFDLENBQUM7b0JBQ3BFLE1BQU07Z0JBQ1IsQ0FBQztnQkFDRCxJQUFBLGdCQUFNLEVBQUMsZUFBZSxFQUFFLG9DQUFvQyxNQUFNLFdBQVcsQ0FBQyxDQUFDO2dCQUMvRSxJQUFBLGdCQUFNLEVBQUMsc0JBQXNCLEVBQUUsNENBQTRDLE1BQU0sV0FBVyxDQUFDLENBQUM7Z0JBQzlGLElBQUEsZ0JBQU0sRUFBQyxVQUFVLEVBQUUsOEJBQThCLE1BQU0sV0FBVyxDQUFDLENBQUM7Z0JBQ3BFLHFCQUFxQixHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNELFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO29CQUN0QyxLQUFLLEVBQUUscUJBQXFCO29CQUM1QixRQUFRLEVBQUUsVUFBVTtvQkFDcEIsaUJBQWlCO2lCQUNsQixDQUFDLENBQUM7Z0JBQ0gsK0VBQStFO2dCQUMvRSwrRUFBK0U7Z0JBQy9FLHVFQUF1RTtnQkFDdkUseUNBQXlDO2dCQUN6QyxtQkFBbUIsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO29CQUM3QyxxRkFBcUY7b0JBQ3JGLHlKQUF5SjtvQkFDekosS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEcsUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLGlCQUFpQjtpQkFDbEIsQ0FBQyxDQUFDO2dCQUNILE1BQU07WUFDUixLQUFLLDZCQUFnQixDQUFDLEtBQUs7Z0JBQ3pCLE1BQU0sR0FBRyxPQUFPLENBQUM7Z0JBQ2pCLE1BQU07WUFDUjtnQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUF1QjtZQUN6QyxNQUFNO1lBQ04sT0FBTyxFQUFFLEtBQWdCO1lBQ3pCLGNBQWM7WUFDZCxZQUFZO1lBQ1osOEJBQThCO1lBQzlCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsTUFBTTtZQUNOLFVBQVU7U0FDWCxDQUFDO1FBRUYsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsSUFBQSxnQkFBTSxFQUFDLDRCQUFjLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLDRDQUE0QyxDQUFDLENBQUM7WUFDaEYsSUFBQSxnQkFBTSxFQUFDLDRCQUFjLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxrREFBa0QsQ0FBQyxDQUFDO1lBQ2pHLGNBQWMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUMxQyxjQUFjLENBQUMseUJBQXlCLEdBQUcsSUFBQSx3QkFBZSxFQUN4RCxpREFBaUMsRUFDakMsS0FBSyxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQ25CLDJCQUEyQixDQUM1QixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksWUFBWSxJQUFJLGdCQUFnQixLQUFLLDZCQUFnQixDQUFDLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1lBQ3hGLHNHQUFzRztZQUN0RyxJQUFBLGdCQUFNLEVBQUMsVUFBVSxFQUFFLHlFQUF5RSxDQUFDLENBQUM7WUFDOUYsY0FBYyxDQUFDLFlBQVksR0FBRztnQkFDNUIsV0FBVyxFQUFFLFlBQVksQ0FBQyxXQUFXO2dCQUNyQyxPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU87Z0JBQzdCLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO29CQUNyQyxLQUFLLEVBQUUscUJBQXFCO29CQUM1QixRQUFRLEVBQUUsWUFBWSxDQUFDLFVBQVU7b0JBQ2pDLGlCQUFpQjtpQkFDbEIsQ0FBQztnQkFDRixZQUFZLEVBQUUsVUFBVTthQUN6QixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDNUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDO0lBQzNFLENBQUM7SUFFUyxLQUFLLENBQUMsZUFBZSxDQUM3QixjQUFzQixFQUN0QixlQUF1QixFQUN2QixzQkFBOEIsRUFDOUIsVUFBa0IsRUFDbEIsOEJBQXVDLEVBQ3ZDLFlBQXdDLEVBQ3hDLGlCQUFxQyxFQUNyQyxVQUFtQixFQUNuQixNQUFlLEVBQ2YsS0FBOEM7UUFFOUMsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQ25DLDZCQUFnQixDQUFDLElBQUksRUFDckIsY0FBYyxFQUNkLGVBQWUsRUFDZixzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLDhCQUE4QixFQUM5QixZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxDQUNOLENBQUM7SUFDSixDQUFDO0lBRVMsS0FBSyxDQUFDLGlCQUFpQixDQUMvQixjQUFzQixFQUN0QixlQUFtQyxFQUNuQyxzQkFBMEMsRUFDMUMsVUFBa0IsRUFDbEIsOEJBQXVDLEVBQ3ZDLGlCQUFxQyxFQUNyQyxVQUFtQixFQUNuQixNQUFlLEVBQ2YsS0FBOEM7UUFFOUMsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQ25DLDZCQUFnQixDQUFDLE1BQU0sRUFDdkIsY0FBYyxFQUNkLGVBQWUsRUFDZixzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLDhCQUE4QixFQUM5QixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxDQUNOLENBQUM7SUFDSixDQUFDO0lBRVMsS0FBSyxDQUFDLGdCQUFnQixDQUM5QixjQUFzQixFQUN0QixNQUFlLEVBQ2YsS0FBOEM7UUFFOUMsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQ25DLDZCQUFnQixDQUFDLEtBQUssRUFDdEIsY0FBYyxFQUNkLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxNQUFNLEVBQ04sS0FBSyxDQUNOLENBQUM7SUFDSixDQUFDO0lBQ0QsYUFBYTtJQUViLEtBQUssQ0FBQyx1QkFBdUIsQ0FDM0IsVUFBa0IsRUFDbEIsT0FBOEQsRUFDOUQsTUFBZTtRQUVmLE9BQU8sSUFBSSxDQUFDLCtCQUErQixDQUFDLElBQUEsa0RBQXlCLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEgsQ0FBQztJQUVELEtBQUssQ0FBQywrQkFBK0IsQ0FDbkMsUUFBZ0UsRUFDaEUsT0FBOEQ7UUFFOUQsT0FBTyxRQUFRLENBQUMsbUNBQW9CLENBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELEtBQUssQ0FBQyx1QkFBdUIsQ0FDM0IsVUFBa0IsRUFDbEIsT0FBc0M7UUFFdEMsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBQSxrREFBeUIsRUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzFHLENBQUM7SUFFRCxLQUFLLENBQUMsK0JBQStCLENBQ25DLFFBQWdFLEVBQ2hFLE9BQXNDO1FBRXRDLE9BQU8sUUFBUSxDQUFDLG1DQUFvQixDQUFDLFVBQVUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxhQUFhO0lBRWIsMEJBQTBCO0lBRTFCOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBd0I7UUFDMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSx1QkFBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsdUJBQXVCLENBQUMsTUFBa0M7UUFDOUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSx1QkFBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ssS0FBSyxDQUFDLGVBQWUsQ0FDM0IsTUFBcUQsRUFDckQsV0FBd0I7UUFFeEIsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXZELE1BQU0sU0FBUyxHQUNiLE9BQU8sTUFBTSxDQUFDLFNBQVMsS0FBSyxRQUFRO1lBQ2xDLENBQUMsQ0FBQyxNQUFNLElBQUEscUJBQVksRUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ2xGLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBRXZCLElBQUksaUJBQWlCLENBQUM7UUFDdEIsSUFBSSxjQUFjLENBQUM7UUFDbkIsSUFBSSxhQUFhLENBQUM7UUFDbEIsd0ZBQXdGO1FBQ3hGLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBQSxpQ0FBa0IsRUFBQyxTQUFTLENBQUMsQ0FBQztRQUN2RCxNQUFNLGFBQWEsR0FBRyxNQUFNLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDdEYsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqSCxJQUFBLGdCQUFNLEVBQUMsY0FBYyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7UUFFMUQsSUFBSSxXQUFXLEtBQUssdUJBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNuQyxJQUFBLGdCQUFNLEVBQUMsU0FBUyxDQUFDLFlBQVksSUFBSSxTQUFTLENBQUMsV0FBVyxFQUFFLDBDQUEwQyxDQUFDLENBQUM7WUFDcEcsTUFBTSxVQUFVLEdBQ2QsU0FBUyxDQUFDLFVBQVUsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxZQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RHLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7WUFDM0MsSUFBQSxnQkFBTSxFQUFDLGlCQUFpQixFQUFFLG1DQUFtQyxDQUFDLENBQUM7WUFDL0QsY0FBYyxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUM7WUFDM0MsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEQsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDO2dCQUNwQyxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLGVBQWUsSUFBSSxpQkFBaUIsRUFBRTtnQkFDdEUsUUFBUSxFQUFFLElBQUEseUNBQXdCLEVBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDeEYsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNuQixVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUU7YUFDdkMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLElBQUksV0FBVyxLQUFLLHVCQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0MsSUFBQSxnQkFBTSxFQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLHNDQUFzQyxDQUFDLENBQUM7WUFDcEcsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7WUFDekQsSUFBQSxnQkFBTSxFQUFDLGlCQUFpQixFQUFFLHVDQUF1QyxDQUFDLENBQUM7WUFDbkUsY0FBYyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxJQUFJLEtBQUssQ0FBQztZQUMvRCxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4RCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBRUQsNkVBQTZFO1FBQzdFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxZQUFZLElBQUksNkJBQWdCLENBQUMsSUFBSSxDQUFDO1FBQzdELE1BQU0sZUFBZSxHQUFHLE9BQU8sS0FBSyw2QkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLDhCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsOEJBQWtCLENBQUMsTUFBTSxDQUFDO1FBQ2hILE1BQU0sT0FBTyxHQUFHLElBQUkseUJBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0MsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLDZCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNGLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUUzQyw2RUFBNkU7UUFDN0UsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLElBQUEsc0NBQXlCLEVBQUMsUUFBUSxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMvRixJQUFJLGVBQWUsR0FBRyxNQUFNLElBQUEsNkJBQW9CLEVBQzlDLElBQUksQ0FBQyxLQUFLLEVBQ1YsU0FBUyxDQUFDLFFBQVEsRUFDbEIsU0FBUyxDQUFDLFdBQVcsRUFDckIsQ0FBQyxvQkFBb0IsQ0FBQyxFQUN0QixXQUFXLEVBQ1gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsRUFDL0IsVUFBVSxDQUFDLFNBQVMsRUFDcEIsU0FBUyxFQUNULElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsRUFDakMsTUFBTSxDQUFDLEtBQUssQ0FDYixDQUFDO1FBRUYsSUFBQSxnQkFBTSxFQUFDLGVBQWUsQ0FBQyxZQUFZLElBQUksZUFBZSxDQUFDLFFBQVEsRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO1FBRTNHLE1BQU0sZ0JBQWdCLEdBQ3BCLFdBQVcsS0FBSyx1QkFBVyxDQUFDLEVBQUU7WUFDNUIsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxZQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZTtZQUNsRCxDQUFDLENBQUMsZUFBZSxDQUFDLFFBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7UUFFbkQsTUFBTSxrQkFBa0IsR0FBRyxJQUFBLCtCQUFzQixFQUFDLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNyRyxNQUFNLGlDQUFpQyxHQUFHLElBQUEsd0JBQWUsRUFDdkQsbURBQW9DLEVBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQ3BDLDREQUE0RCxDQUM3RCxDQUFDO1FBRUYsSUFBSSxpQ0FBaUMsQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFLENBQUM7WUFDOUQsTUFBTSxJQUFJLEtBQUssQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFFRCxNQUFNLHFCQUFxQixHQUFHLE1BQU0sSUFBQSxzQ0FBeUIsRUFBQyxpQ0FBaUMsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUVqSCw2RUFBNkU7UUFDN0UsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7UUFDckYsSUFBQSxnQkFBTSxFQUFDLFFBQVEsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1FBRXJELDZFQUE2RTtRQUM3RSxNQUFNLHNCQUFzQixHQUFHLE1BQU0sSUFBQSxzQ0FBeUIsRUFBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pHLGVBQWUsR0FBRyxNQUFNLElBQUEsNkJBQW9CLEVBQzFDLElBQUksQ0FBQyxLQUFLLEVBQ1YsU0FBUyxDQUFDLFFBQVEsRUFDbEIsU0FBUyxDQUFDLFdBQVcsRUFDckIsQ0FBQyxzQkFBc0IsQ0FBQyxFQUN4QixXQUFXLEVBQ1gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsRUFDL0IsVUFBVSxDQUFDLFNBQVMsRUFDcEIsU0FBUyxFQUNULElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsRUFDakMsTUFBTSxDQUFDLEtBQUssQ0FDYixDQUFDO1FBRUYsSUFBQSxnQkFBTSxFQUFDLGVBQWUsQ0FBQyxZQUFZLElBQUksZUFBZSxDQUFDLFFBQVEsRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO1FBRTNHLE1BQU0sd0JBQXdCLEdBQzVCLFdBQVcsS0FBSyx1QkFBVyxDQUFDLEVBQUU7WUFDNUIsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxZQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZTtZQUNsRCxDQUFDLENBQUMsZUFBZSxDQUFDLFFBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7UUFFbkQsTUFBTSxrQkFBa0IsR0FBRyxJQUFBLCtCQUFzQixFQUFDLHdCQUF3QixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUM3RyxNQUFNLGlDQUFpQyxHQUFHLElBQUEsd0JBQWUsRUFDdkQsbURBQW9DLEVBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQ3BDLDREQUE0RCxDQUM3RCxDQUFDO1FBRUYsSUFBSSxpQ0FBaUMsQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFLENBQUM7WUFDOUQsTUFBTSxJQUFJLEtBQUssQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFFRCxNQUFNLHFCQUFxQixHQUFHLE1BQU0sSUFBQSxzQ0FBeUIsRUFBQyxpQ0FBaUMsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUVqSCw2RUFBNkU7UUFDN0UsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7UUFDckYsSUFBQSxnQkFBTSxFQUFDLFFBQVEsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1FBRXJELDZFQUE2RTtRQUM3RSxvRUFBb0U7UUFDcEUsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLElBQUEsd0NBQTJCLEVBQUMsUUFBUSxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRyxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUEsNkJBQW9CLEVBQ2hELElBQUksQ0FBQyxLQUFLLEVBQ1YsU0FBUyxDQUFDLFFBQVEsRUFDbEIsU0FBUyxDQUFDLFdBQVcsRUFDckIsQ0FBQyxvQkFBb0IsQ0FBQyxFQUN0QixXQUFXLEVBQ1gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsRUFDL0IsVUFBVSxDQUFDLFNBQVMsRUFDcEIsU0FBUyxFQUNULElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsRUFDakMsTUFBTSxDQUFDLEtBQUssQ0FDYixDQUFDO1FBQ0YsSUFBQSxnQkFBTSxFQUFDLGVBQWUsRUFBRSxXQUFXLEtBQUssU0FBUyxDQUFDLFdBQVcsRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO1FBRXpHLE9BQU8sSUFBQSxzQkFBYSxFQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekcsQ0FBQztJQUVELGFBQWE7SUFFYiwwQkFBMEI7SUFFMUIsNEJBQTRCO0lBQzVCLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxNQU1wQztRQUlDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQUUscUJBQXFCLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFDbkcsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSw2QkFBZ0IsQ0FBQyxJQUFJLENBQUM7UUFFeEQsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDbkgsTUFBTSxTQUFTLEdBQUcsTUFBTSxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUUvRSxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLHNCQUFRLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFbEUsSUFBSSxJQUFBLDhDQUErQixFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3pELElBQUEsZ0JBQU0sRUFBQyxJQUFBLHNDQUF1QixFQUFDLGNBQWMsQ0FBQyxFQUFFLDhCQUE4QixDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sT0FBTyxHQUFHLE1BQU0sc0JBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVwRSxNQUFNLGtCQUFrQixHQUFHLE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVUsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7UUFDcEYsTUFBTSxjQUFjLEdBQUcsTUFBTSxzQkFBUSxDQUFDLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFbEYsTUFBTSxHQUFHLEdBQUcsSUFBSSx5QkFBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9DLE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUVwRCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbkMsTUFBTSxVQUFVLEdBQUcsTUFBTSxzQkFBUSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTdGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDcEMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUU7WUFDNUIsYUFBYSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDM0QsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJO1NBQ3RCLENBQUMsQ0FBQztRQUVILE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUN0RCxLQUFLLEVBQUUsY0FBYztZQUNyQixRQUFRLEVBQUUsZ0JBQWdCO1lBQzFCLEtBQUssRUFBRSxHQUFHLGVBQWUsQ0FBQywyQkFBMkIsSUFBSSxPQUFPLEVBQUU7WUFDbEUsaUJBQWlCLEVBQUUsQ0FBQztTQUNyQixDQUFDLENBQUM7UUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLHNCQUFzQixFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUNELGFBQWE7SUFFYixzQkFBc0I7SUFDdEIsS0FBSyxDQUFDLHdCQUF3QixDQUFDLE1BSzlCO1FBTUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ2xFLE1BQU0sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUMxRSxTQUFTLEVBQ1QsMENBQTBDLENBQzNDLENBQUM7UUFDRixNQUFNLEtBQUssR0FBRyxHQUFHLFdBQVcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUVqRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNoRCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUEsaUNBQWtCLEVBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkQsTUFBTSxhQUFhLEdBQUcsTUFBTSxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRXRGLE1BQU0sT0FBTyxHQUFHLElBQUkseUJBQVcsQ0FBQyxHQUFHLENBQUMsNkJBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsRUFBRSxjQUFjLEVBQUUsNkJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0csTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzNDLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxJQUFBLHNDQUF5QixFQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN0RixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ3BDLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQ2hDLGNBQWMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1NBQ2pFLENBQUMsQ0FBQztRQUNILE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFFM0MsTUFBTSxLQUFLLEdBQUcsWUFBWSxLQUFLLFNBQVMsSUFBSSxJQUFBLHdCQUFZLEVBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkUsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzNFLElBQUksQ0FBQztnQkFDSCxNQUFNLHNCQUFzQixHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FDbEQsY0FBYyxFQUNkLEdBQUcsZUFBZSxDQUFDLDRCQUE0QixJQUFJLEtBQUssRUFBRSxDQUMzRCxDQUFDO2dCQUNGLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUNsRCxVQUFVLENBQUMsVUFBVSxFQUNyQixHQUFHLGVBQWUsQ0FBQyw0QkFBNEIsSUFBSSxLQUFLLEVBQUUsQ0FDM0QsQ0FBQztnQkFDRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLENBQUM7WUFDakcsQ0FBQztvQkFBUyxDQUFDO2dCQUNULE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwQixDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUN0RCxLQUFLLEVBQUUsY0FBYztZQUNyQixRQUFRLEVBQUUsZ0JBQWdCO1lBQzFCLEtBQUssRUFBRSxHQUFHLGVBQWUsQ0FBQyw0QkFBNEIsSUFBSSxLQUFLLEVBQUU7WUFDakUsaUJBQWlCLEVBQUUsQ0FBQztTQUNyQixDQUFDLENBQUM7UUFDSCxNQUFNLHNCQUFzQixHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDdEQsS0FBSyxFQUFFLFVBQVUsQ0FBQyxVQUFVO1lBQzVCLFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsS0FBSyxFQUFFLEdBQUcsZUFBZSxDQUFDLDRCQUE0QixJQUFJLEtBQUssRUFBRTtZQUNqRSxpQkFBaUIsRUFBRSxDQUFDO1NBQ3JCLENBQUMsQ0FBQztRQUVILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQUUsc0JBQXNCLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztJQUNqRyxDQUFDO0lBQ0QsYUFBYTtJQUViLHNCQUFzQjtJQUN0QixLQUFLLENBQUMsd0JBQXdCLENBQUMsTUFNOUI7UUFJQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsc0JBQXNCLEVBQUUsc0JBQXNCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBRWxILE1BQU0sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUMxRSxTQUFTLEVBQ1QsMENBQTBDLENBQzNDLENBQUM7UUFDRixNQUFNLEtBQUssR0FBRyxHQUFHLFdBQVcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUVqRCxNQUFNLEtBQUssR0FBRyxJQUFBLHdCQUFZLEVBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUVuRCxNQUFNLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUN0RSxpQkFBaUIsRUFDakIsc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUNoQixLQUFLLEVBQ0wsZUFBZSxDQUFDLDRCQUE0QixDQUM3QyxDQUFDO1FBRUYsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQztRQUM1QyxJQUFBLGdCQUFNLEVBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ2hILE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7UUFDeEQsSUFBQSxnQkFBTSxFQUFDLGVBQWUsRUFBRSwrQ0FBK0MsQ0FBQyxDQUFDO1FBRXpFLE1BQU0sa0JBQWtCLEdBQUcsSUFBQSwrQkFBc0IsRUFBQyxlQUFlLEVBQUUsOEJBQWtCLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzVHLE1BQU0saUNBQWlDLEdBQUcsSUFBQSx3QkFBZSxFQUN2RCxtREFBb0MsRUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsRUFDcEMsNERBQTRELENBQzdELENBQUM7UUFFRixJQUFJLGlDQUFpQyxDQUFDLElBQUksS0FBSyxjQUFjLEVBQUUsQ0FBQztZQUM5RCxNQUFNLElBQUksS0FBSyxDQUFDLDREQUE0RCxDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUVELE1BQU0scUJBQXFCLEdBQUcsTUFBTSxJQUFBLHNDQUF5QixFQUFDLGlDQUFpQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRTlHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLHNCQUFzQixFQUFFLGVBQWUsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBRWhHLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUN0RCxLQUFLLEVBQUUsc0JBQXNCO1lBQzdCLFFBQVEsRUFBRSxnQkFBZ0I7U0FDM0IsQ0FBQyxDQUFDO1FBRUgsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUd2RSxDQUFDO1FBRUYsTUFBTSxPQUFPLEdBQUcsSUFBSSx5QkFBVyxDQUFDLEdBQUcsQ0FBQyw2QkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRCxNQUFNLE9BQU8sQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekMsTUFBTSxRQUFRLEdBQWlDO1lBQzdDLElBQUksRUFBRSw2QkFBZ0IsQ0FBQyxJQUFJO1lBQzNCLE9BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUMvRCxDQUFDO1FBRUYsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7UUFDckYsSUFBQSxnQkFBTSxFQUFDLFFBQVEsRUFBRSx1REFBdUQsQ0FBQyxDQUFDO1FBRTFFLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxJQUFBLHNDQUF5QixFQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN0RixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ3BDLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQ2hDLGNBQWMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1NBQ2pFLENBQUMsQ0FBQztRQUVILElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUMzRSxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQ2xELGNBQWMsRUFDZCxHQUFHLGVBQWUsQ0FBQyw0QkFBNEIsSUFBSSxLQUFLLEVBQUUsQ0FDM0QsQ0FBQztnQkFDRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztZQUMxRCxDQUFDO29CQUFTLENBQUM7Z0JBQ1QsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ3RELEtBQUssRUFBRSxjQUFjO1lBQ3JCLFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsS0FBSyxFQUFFLEdBQUcsZUFBZSxDQUFDLDRCQUE0QixJQUFJLEtBQUssRUFBRTtZQUNqRSxpQkFBaUIsRUFBRSxDQUFDO1NBQ3JCLENBQUMsQ0FBQztRQUVILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxzQkFBc0IsRUFBRSxDQUFDO0lBQzFELENBQUM7SUFDRCxhQUFhO0lBRWIsc0JBQXNCO0lBQ3RCLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxNQU05QjtRQUdDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSxzQkFBc0IsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFFbEgsTUFBTSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsK0JBQStCLENBQzFFLFNBQVMsRUFDVCwwQ0FBMEMsQ0FDM0MsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFHLEdBQUcsV0FBVyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBRWpELE1BQU0sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQ3RFLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsZ0JBQWdCLEVBQ2hCLEtBQUssRUFDTCxlQUFlLENBQUMsNEJBQTRCLENBQzdDLENBQUM7UUFFRixNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDO1FBQzVDLElBQUEsZ0JBQU0sRUFBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLDZDQUE2QyxDQUFDLENBQUM7UUFDaEgsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztRQUN4RCxJQUFBLGdCQUFNLEVBQUMsZUFBZSxFQUFFLCtDQUErQyxDQUFDLENBQUM7UUFFekUsTUFBTSxrQkFBa0IsR0FBRyxJQUFBLCtCQUFzQixFQUFDLGVBQWUsRUFBRSw4QkFBa0IsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFNUcsTUFBTSxpQ0FBaUMsR0FBRyxJQUFBLHdCQUFlLEVBQ3ZELG1EQUFvQyxFQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUNwQyw0REFBNEQsQ0FDN0QsQ0FBQztRQUVGLElBQUksaUNBQWlDLENBQUMsSUFBSSxLQUFLLGNBQWMsRUFBRSxDQUFDO1lBQzlELE1BQU0sSUFBSSxLQUFLLENBQUMsNERBQTRELENBQUMsQ0FBQztRQUNoRixDQUFDO1FBRUQsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLElBQUEsc0NBQXlCLEVBQUMsaUNBQWlDLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFOUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsZUFBZSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFFaEcsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ3RELEtBQUssRUFBRSxzQkFBc0I7WUFDN0IsUUFBUSxFQUFFLGdCQUFnQjtTQUMzQixDQUFDLENBQUM7UUFFSCxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBR3ZFLENBQUM7UUFFRixNQUFNLE9BQU8sR0FBRyxJQUFJLHlCQUFXLENBQUMsR0FBRyxDQUFDLDZCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNELE1BQU0sT0FBTyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6QyxNQUFNLFFBQVEsR0FBaUM7WUFDN0MsSUFBSSxFQUFFLDZCQUFnQixDQUFDLElBQUk7WUFDM0IsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQy9ELENBQUM7UUFFRixNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsUUFBUSxFQUFFLHFCQUFxQixDQUFDLENBQUMsQ0FBQztRQUNyRixJQUFBLGdCQUFNLEVBQUMsUUFBUSxFQUFFLHVEQUF1RCxDQUFDLENBQUM7UUFFMUUsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLElBQUEsd0NBQTJCLEVBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRXhGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFDRCxhQUFhO0lBRWIsa0JBQWtCO0lBQ2xCLEtBQUssQ0FBQyxvQ0FBb0MsQ0FDeEMsTUFBdUMsRUFDdkMsOENBQStGLEVBQy9GLDhDQUErRixFQUMvRiw4Q0FBK0YsRUFDL0YsY0FBMkIsdUJBQVcsQ0FBQyxFQUFFO1FBRXpDLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBRXBDLGlEQUFpRDtRQUNqRCxJQUFBLGdCQUFNLEVBQ0osV0FBVyxLQUFLLHVCQUFXLENBQUMsRUFBRSxFQUM5QixrRUFBa0UsR0FBRyxXQUFXLENBQ2pGLENBQUM7UUFFRixJQUFJLGlCQUE0QixDQUFDO1FBQ2pDLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbEMsaUJBQWlCLEdBQUcsTUFBTSxJQUFBLHFCQUFZLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6RixDQUFDO2FBQU0sQ0FBQztZQUNOLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FDL0QsSUFBSSxFQUNKLEtBQUssRUFDTCxpQkFBaUIsQ0FBQyxZQUFZLEVBQzlCLElBQUksQ0FDTCxDQUFDO1FBRUYsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFFRCxVQUFVO1FBQ1YsTUFBTSxFQUFFLG9CQUFvQixFQUFFLGFBQWEsRUFBRSxzQkFBc0IsRUFBRSxzQkFBc0IsRUFBRSxHQUMzRixNQUFNLDhDQUE4QyxDQUFDLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUN6RixNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUEsNkJBQW9CLEVBQ2hELElBQUksQ0FBQyxLQUFLLEVBQ1YsaUJBQWlCLENBQUMsUUFBUSxFQUMxQixpQkFBaUIsQ0FBQyxXQUFXLEVBQzdCLENBQUMsb0JBQW9CLENBQUMsRUFDdEIsV0FBVyxFQUNYLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLEVBQy9CLGFBQWEsRUFDYixTQUFTLEVBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxFQUNqQyxLQUFLLENBQ04sQ0FBQztRQUVGLFVBQVU7UUFDVixNQUFNLEVBQUUsb0JBQW9CLEVBQUUsc0JBQXNCLEVBQUUsR0FBRyxNQUFNLDhDQUE4QyxDQUFDO1lBQzVHLFNBQVMsRUFBRSxlQUFlO1lBQzFCLHNCQUFzQjtZQUN0QixzQkFBc0I7WUFDdEIsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxFQUFFO1NBQzdDLENBQUMsQ0FBQztRQUNILE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBQSw2QkFBb0IsRUFDaEQsSUFBSSxDQUFDLEtBQUssRUFDVixpQkFBaUIsQ0FBQyxRQUFRLEVBQzFCLGlCQUFpQixDQUFDLFdBQVcsRUFDN0IsQ0FBQyxvQkFBb0IsQ0FBQyxFQUN0QixXQUFXLEVBQ1gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsRUFDL0IsYUFBYSxFQUNiLFNBQVMsRUFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEVBQ2pDLEtBQUssQ0FDTixDQUFDO1FBQ0YsSUFBQSxnQkFBTSxFQUNKLGVBQWUsQ0FBQyxZQUFZLElBQUksZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQy9FLCtDQUErQyxDQUNoRCxDQUFDO1FBRUYsVUFBVTtRQUNWLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLE1BQU0sOENBQThDLENBQUM7WUFDcEYsU0FBUyxFQUFFLGVBQWU7WUFDMUIsc0JBQXNCO1lBQ3RCLHNCQUFzQjtZQUN0QixpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUU7U0FDN0MsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFBLDZCQUFvQixFQUN4QixJQUFJLENBQUMsS0FBSyxFQUNWLGlCQUFpQixDQUFDLFFBQVEsRUFDMUIsaUJBQWlCLENBQUMsV0FBVyxFQUM3QixDQUFDLG9CQUFvQixDQUFDLEVBQ3RCLFdBQVcsRUFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxFQUMvQixhQUFhLEVBQ2IsU0FBUyxFQUNULElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsRUFDakMsS0FBSyxDQUNOLENBQUM7UUFFRixPQUFPLElBQUEsc0JBQWEsRUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xILENBQUM7SUFDRCxhQUFhO0lBRWIsbUJBQW1CO0lBRVQsS0FBSyxDQUFDLHVCQUF1QixDQUFDLFFBQW1DO1FBSXpFLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQztnQkFDNUYsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLGdCQUFnQjtnQkFDNUMsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLGtCQUFrQjthQUNqRCxDQUFDLENBQUM7WUFDSCxPQUFPO2dCQUNMLE9BQU8sRUFBRSxJQUFJLHlCQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsNkJBQWdCLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDO2dCQUMzRSxTQUFTLEVBQUUsSUFBSSx5QkFBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLDZCQUFnQixDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQzthQUNsRixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSSx5QkFBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLDZCQUFnQixDQUFDLElBQUksQ0FBQztZQUN6RCxTQUFTLEVBQUUsSUFBSSx5QkFBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLDZCQUFnQixDQUFDLE1BQU0sQ0FBQztTQUM5RCxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxNQUFrRTtRQUl4RyxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUEsaUNBQXlCLEdBQUUsQ0FBQztRQUM5QyxNQUFNLGdCQUFnQixHQUFHLGVBQWUsQ0FBQyxnQ0FBZ0MsQ0FDdkUsTUFBTSxDQUFDLGlCQUFpQixFQUN4Qiw2QkFBZ0IsQ0FBQyxJQUFJLEVBQ3JCLEdBQUcsQ0FDSixDQUFDO1FBQ0YsTUFBTSxrQkFBa0IsR0FBRyxlQUFlLENBQUMsZ0NBQWdDLENBQ3pFLE1BQU0sQ0FBQyxtQkFBbUIsRUFDMUIsNkJBQWdCLENBQUMsTUFBTSxFQUN2QixHQUFHLENBQ0osQ0FBQztRQUVGLElBQUEsZ0JBQU0sRUFDSixnQkFBZ0IsQ0FBQyxVQUFVLEtBQUssa0JBQWtCLENBQUMsVUFBVSxFQUM3RCx1RUFBdUUsQ0FDeEUsQ0FBQztRQUNGLElBQUEsZ0JBQU0sRUFDSixnQkFBZ0IsQ0FBQyxTQUFTLEtBQUssa0JBQWtCLENBQUMsU0FBUyxFQUMzRCw2REFBNkQsQ0FDOUQsQ0FBQztRQUVGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FDaEMsaUJBQXlCLEVBQ3pCLE9BQXdEO1FBRXhELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSxpQ0FBeUIsR0FBRSxDQUFDO1FBQzlDLE9BQU8sZUFBZSxDQUFDLGdDQUFnQyxDQUFDLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRU8sTUFBTSxDQUFDLGdDQUFnQyxDQUM3QyxrQkFBMEIsRUFDMUIsZUFBZ0UsRUFDaEUsR0FBMEQ7UUFFMUQsTUFBTSxlQUFlLEdBQW9CLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN4RSxJQUFBLGdCQUFNLEVBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ3BFLElBQUEsZ0JBQU0sRUFBQyxlQUFlLENBQUMsV0FBVyxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFFOUUsSUFBSSxNQUFNLENBQUM7UUFDWCxRQUFRLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLEtBQUssNkJBQWdCLENBQUMsSUFBSTtnQkFDeEIsSUFBQSxnQkFBTSxFQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsOENBQThDLENBQUMsQ0FBQztnQkFDckYsTUFBTSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRTtvQkFDOUMsZUFBZSxDQUFDLFdBQVc7b0JBQzNCLGVBQWUsQ0FBQyxZQUFZO2lCQUM3QixDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUNWLE1BQU07WUFDUixLQUFLLDZCQUFnQixDQUFDLE1BQU07Z0JBQzFCLElBQUEsZ0JBQU0sRUFBQyxlQUFlLENBQUMsVUFBVSxFQUFFLDhDQUE4QyxDQUFDLENBQUM7Z0JBQ25GLE1BQU0sR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUU7b0JBQzlDLGVBQWUsQ0FBQyxXQUFXO29CQUMzQixlQUFlLENBQUMsVUFBVTtpQkFDM0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDVixNQUFNO1lBQ1I7Z0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxPQUFPO1lBQ0wsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2YsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3BCLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztTQUM1QixDQUFDO0lBQ0osQ0FBQzs7QUFub0NILDBDQXNvQ0M7QUFyb0N5Qiw0Q0FBNEIsR0FBRyw4QkFBOEIsQ0FBQztBQUM5RCw0Q0FBNEIsR0FBRyw4QkFBOEIsQ0FBQztBQUM5RCw0Q0FBNEIsR0FBRyw4QkFBOEIsQ0FBQztBQUM5RCwyQ0FBMkIsR0FBRyw2QkFBNkIsQ0FBQztBQW9vQ3RGOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILFNBQVMsdUJBQXVCLENBQUMsU0FBaUI7SUFDaEQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoQyxJQUNFLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEtBQUssUUFBUTtZQUNuQyxPQUFPLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxLQUFLLFFBQVE7WUFDckMsQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxFQUNoRixDQUFDO1lBQ0QsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCx3QkFBd0I7SUFDMUIsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVNLEtBQUssVUFBVSwyQkFBMkIsQ0FDL0MsaUJBQXlCLEVBQ3pCLGdCQUF3QixFQUN4QixLQUFpQjtJQUVqQixNQUFNLFNBQVMsR0FBRyxLQUFLO1FBQ3JCLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLENBQUM7UUFDL0UsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUN0RCxPQUFPLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksQ0FBQztBQUNyRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNJLEtBQUssVUFBVSw0Q0FBNEMsQ0FDaEUsZ0JBQXdCLEVBQ3hCLGtCQUEwQixFQUMxQixnQkFBeUIsRUFDekIsS0FBaUI7SUFFakIsTUFBTSxTQUFTLEdBQUcsS0FBSyxFQUNyQixZQUFvQixFQUN1RCxFQUFFO1FBQzdFLE1BQU0sU0FBUyxHQUFHLEtBQUs7WUFDckIsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLENBQUM7WUFDMUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDakQsTUFBTSxNQUFNLEdBQUcsSUFBQSw2Q0FBMEIsRUFBQyxTQUFTLENBQUMsQ0FBQztRQUNyRCxJQUFJLE9BQXNDLENBQUM7UUFDM0MsSUFBSSxDQUFDO1lBQ0gsT0FBTyxHQUFHLHNCQUFRLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxNQUFNLElBQUksS0FBSyxDQUNiLG1LQUFtSyxDQUNwSyxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN4RixNQUFNLElBQUksS0FBSyxDQUNiLHNKQUFzSixDQUN2SixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN0RCxDQUFDLENBQUM7SUFFRixNQUFNLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNySCxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO0lBQ3hDLE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFFNUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRSxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLDZEQUE2RCxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3RSxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakYsSUFBSSxhQUFhLEtBQUssZUFBZSxFQUFFLENBQUM7UUFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FBQztJQUN6RCxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FBQztJQUM3RCxJQUFJLFVBQVUsS0FBSyxZQUFZLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksS0FBSyxDQUNiLG1HQUFtRyxDQUNwRyxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU87UUFDTCxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO1FBQy9DLGNBQWMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7UUFDbkQsY0FBYyxFQUFFLE9BQU8sR0FBRyxhQUFhO1FBQ3ZDLGVBQWUsRUFBRSxXQUFXLENBQUMsV0FBVztRQUN4QyxpQkFBaUIsRUFBRSxhQUFhLENBQUMsV0FBVztLQUM3QyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNJLEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsT0FBZSxFQUNmLGNBQXNCLEVBQ3RCLFlBQW9CLEVBQ3BCLGNBQXNCLEVBQ3RCLGNBQXNCO0lBRXRCLE1BQU0sT0FBTyxHQUFHLElBQUkseUJBQVcsQ0FBQyxHQUFHLENBQUMsNkJBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0QsTUFBTSxTQUFTLEdBQUcsSUFBSSx5QkFBVyxDQUFDLEdBQUcsQ0FBQyw2QkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUUvRCxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0scUJBQU8sQ0FBQyxnQkFBZ0IsQ0FDL0MsQ0FBQyxFQUNELE9BQU8sRUFDUCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGNBQWMsRUFDZCxPQUFPLEVBQ1AsY0FBYyxDQUNmLENBQVcsQ0FBQztJQUViLDBFQUEwRTtJQUMxRSx1REFBdUQ7SUFDdkQsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFBLGlDQUF5QixHQUFFLENBQUM7SUFDOUMsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUM3RSxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXhFLE1BQU0sUUFBUSxHQUFHLGlCQUFPLENBQUMsTUFBTSxDQUFDLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDcEgsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBU0Q7Ozs7O0dBS0c7QUFDSSxLQUFLLFVBQVUsdUJBQXVCLENBQzNDLE9BQWUsRUFDZixnQkFBd0IsRUFDeEIsS0FBaUI7SUFFakIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUMsSUFBSSxTQUFpQixDQUFDO0lBQ3RCLElBQUksQ0FBQztRQUNILFNBQVMsR0FBRyxLQUFLO1lBQ2YsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLENBQUM7WUFDeEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25HLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuRCxPQUFPLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxDQUFDO0FBQ3pHLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLHNCQUFzQixDQUFDLEtBQWM7SUFDbkQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ2hELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUMzQixPQUFPLFNBQVMsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQztJQUNqRSxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzNCLE9BQU8sa0JBQWtCLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxDQUFDLGdCQUFnQixLQUFLLFFBQVEsQ0FBQztJQUNuRixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSSxLQUFLLFVBQVUsd0JBQXdCLENBQUMsTUFROUM7SUFDQyxNQUFNLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLDRDQUE0QyxDQUN6RyxNQUFNLENBQUMsT0FBTyxFQUNkLE1BQU0sQ0FBQyxTQUFTLEVBQ2hCLE1BQU0sQ0FBQyxnQkFBZ0IsRUFDdkIsTUFBTSxDQUFDLEtBQUssQ0FDYixDQUFDO0lBQ0YsSUFBSSxjQUFjLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQ25FLE1BQU0sSUFBSSxLQUFLLENBQUMsMkVBQTJFLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBQ0QsT0FBTyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUNySCxDQUFDO0FBRVksUUFBQSwyQkFBMkIsR0FBRztJQUN6QywyQkFBMkI7SUFDM0IsNENBQTRDO0lBQzVDLHNCQUFzQjtJQUN0Qix1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLHdCQUF3QjtDQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgc2pjbCBmcm9tICdAYml0Z28tYmV0YS9zamNsJztcbmltcG9ydCAqIGFzIHBncCBmcm9tICdvcGVucGdwJztcbmltcG9ydCB7IE5vbkVtcHR5U3RyaW5nIH0gZnJvbSAnaW8tdHMtdHlwZXMnO1xuaW1wb3J0IHtcbiAgRWRkc2FNUEN2MktleUdlblJvdW5kMVJlcXVlc3QsXG4gIEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZSxcbiAgRWRkc2FNUEN2MktleUdlblJvdW5kMlJlcXVlc3QsXG4gIEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZSxcbiAgRWRkc2FNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQxT3V0cHV0LFxuICBFZGRzYU1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDJPdXRwdXQsXG4gIE1QQ3YyS2V5R2VuU3RhdGVFbnVtLFxuICBNUEN2MlBhcnR5RnJvbVN0cmluZ09yTnVtYmVyLFxufSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCB7IEVkZHNhTVBDdjJLZXlHZW5DYWxsYmFja3MgfSBmcm9tICcuLi8uLi8uLi93YWxsZXQvaVdhbGxldHMnO1xuaW1wb3J0IHsgZWQyNTUxOSB9IGZyb20gJ0Bub2JsZS9jdXJ2ZXMvZWQyNTUxOSc7XG5pbXBvcnQgeyBFZGRzYU1QU0RrZywgRWRkc2FNUFNEc2csIE1QU0NvbW1zLCBNUFNUeXBlcywgTVBTVXRpbCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCB7IERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItc2FmZXMnO1xuaW1wb3J0IHsgS2V5Y2hhaW5zVHJpcGxldCB9IGZyb20gJy4uLy4uLy4uL2Jhc2VDb2luJztcbmltcG9ydCB7XG4gIEFkZEtleWNoYWluT3B0aW9ucyxcbiAgRGVjcnlwdGVkUmV0cm9maXRQYXlsb2FkLFxuICBLZXljaGFpbixcbiAgS2V5VHlwZSxcbiAgV2ViYXV0aG5LZXlFbmNyeXB0aW9uSW5mbyxcbn0gZnJvbSAnLi4vLi4vLi4va2V5Y2hhaW4nO1xuaW1wb3J0IHsgZW52UmVxdWlyZXNCaXRnb1B1YkdwZ0tleUNvbmZpZywgaXNCaXRnb0VkZHNhTXBjdjJQdWJLZXkgfSBmcm9tICcuLi8uLi8uLi90c3MvYml0Z29QdWJLZXlzJztcbmltcG9ydCB7IGdldEJpdGdvU2lnbmF0dXJlU2hhcmUsIGdldFR4UmVxdWVzdCwgc2VuZFNpZ25hdHVyZVNoYXJlVjIsIHNlbmRUeFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi90c3MvY29tbW9uJztcbmltcG9ydCB7IGRlY29kZVdpdGhDb2RlYyB9IGZyb20gJy4uLy4uL2NvZGVjcyc7XG5pbXBvcnQge1xuICBnZXRTaWduYXR1cmVTaGFyZVJvdW5kT25lLFxuICBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVHdvLFxuICBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVGhyZWUsXG4gIHZlcmlmeVBlZXJNZXNzYWdlUm91bmRPbmUsXG4gIHZlcmlmeVBlZXJNZXNzYWdlUm91bmRUd28sXG59IGZyb20gJy4uLy4uLy4uL3Rzcy9lZGRzYS9lZGRzYU1QQ3YyJztcbmltcG9ydCB7IGdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UgfSBmcm9tICcuLi8uLi8uLi90c3MvZWRkc2EvZWRkc2EnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHUEdLZXlQYWlyIH0gZnJvbSAnLi4vLi4vb3BlbmdwZ1V0aWxzJztcbmltcG9ydCB7IE1QQ3YyUGFydGllc0VudW0gfSBmcm9tICcuLi9lY2RzYS90eXBlc01QQ3YyJztcbmltcG9ydCB7XG4gIEN1c3RvbUVkZHNhTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21FZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRpbmdGdW5jdGlvbixcbiAgQ3VzdG9tRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIFJlcXVlc3RUeXBlLFxuICBTaWduYXR1cmVTaGFyZVJlY29yZCxcbiAgU2lnbmF0dXJlU2hhcmVUeXBlLFxuICBUU1NQYXJhbXMsXG4gIFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gIFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2LFxuICBUU1NQYXJhbXNXaXRoUHJ2LFxuICBUeFJlcXVlc3QsXG4gIGlzVjJFbnZlbG9wZSxcbn0gZnJvbSAnLi4vYmFzZVR5cGVzJztcbmltcG9ydCB7IEVuY3J5cHRpb25WZXJzaW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vYXBpJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uLy4uLy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBCYXNlRWRkc2FVdGlscyB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyByZXNvbHZlRWZmZWN0aXZlVHhQYXJhbXMgfSBmcm9tICcuLi9yZWNpcGllbnRVdGlscyc7XG5pbXBvcnQgeyBFZGRzYU1QQ3YyS2V5R2VuU2VuZEZuLCBLZXlHZW5TZW5kZXJGb3JFbnRlcnByaXNlIH0gZnJvbSAnLi9lZGRzYU1QQ3YyS2V5R2VuU2VuZGVyJztcbmltcG9ydCB7IEVkZHNhTVBDdjJSZWNvdmVyeUtleVNoYXJlcyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VNcGNWMktleVNoYXJlRW52ZWxvcGUgfSBmcm9tICcuLi9rZXlTaGFyZUVudmVsb3BlJztcbmltcG9ydCB7IFNpZ25pbmdNYXRlcmlhbCB9IGZyb20gJy4uLy4uLy4uL3Rzcyc7XG5cbmV4cG9ydCBjbGFzcyBFZGRzYU1QQ3YyVXRpbHMgZXh0ZW5kcyBCYXNlRWRkc2FVdGlscyB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVkgPSAnTVBTX0RTR19TSUdOSU5HX1VTRVJfR1BHX0tFWSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1QU19EU0dfU0lHTklOR19ST1VORDFfU1RBVEUgPSAnTVBTX0RTR19TSUdOSU5HX1JPVU5EMV9TVEFURSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1QU19EU0dfU0lHTklOR19ST1VORDJfU1RBVEUgPSAnTVBTX0RTR19TSUdOSU5HX1JPVU5EMl9TVEFURSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1QU19ES0dfS0VZR0VOX1JPVU5EMV9TVEFURSA9ICdNUFNfREtHX0tFWUdFTl9ST1VORDFfU1RBVEUnO1xuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhc3luYyBjcmVhdGVLZXljaGFpbnMocGFyYW1zOiB7XG4gICAgcGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGVudGVycHJpc2U6IHN0cmluZztcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmc7XG4gICAgcmV0cm9maXQ/OiBEZWNyeXB0ZWRSZXRyb2ZpdFBheWxvYWQ7XG4gICAgd2ViYXV0aG5JbmZvPzogV2ViYXV0aG5LZXlFbmNyeXB0aW9uSW5mbztcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uO1xuICAgIC8vIFdhbGxldCBTYWZlcyB2MSAoQGV4cGVyaW1lbnRhbCk6IHRhZ3MgdGhlIHJlc3VsdGluZyB1c2VyL2JhY2t1cC9iaXRnbyByb290IGtleXMgd2l0aCB0aGlzIHNhZmUuXG4gICAgc2FmZUlkPzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxLZXljaGFpbnNUcmlwbGV0PiB7XG4gICAgY29uc3QgdXNlcktleVBhaXIgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ2VkMjU1MTknKTtcbiAgICBjb25zdCB1c2VyR3BnS2V5ID0gYXdhaXQgcGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogdXNlcktleVBhaXIucHJpdmF0ZUtleSB9KTtcbiAgICBjb25zdCB1c2VyR3BnUHVibGljS2V5ID0gdXNlcktleVBhaXIucHVibGljS2V5O1xuICAgIGNvbnN0IFt1c2VyUGssIHVzZXJTa10gPSBhd2FpdCBNUFNDb21tcy5leHRyYWN0RWQyNTUxOUtleVBhaXIodXNlckdwZ0tleSk7XG5cbiAgICBjb25zdCBiYWNrdXBLZXlQYWlyID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdlZDI1NTE5Jyk7XG4gICAgY29uc3QgYmFja3VwR3BnS2V5ID0gYXdhaXQgcGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogYmFja3VwS2V5UGFpci5wcml2YXRlS2V5IH0pO1xuICAgIGNvbnN0IGJhY2t1cEdwZ1B1YmxpY0tleSA9IGJhY2t1cEtleVBhaXIucHVibGljS2V5O1xuICAgIGNvbnN0IFtiYWNrdXBQaywgYmFja3VwU2tdID0gYXdhaXQgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlLZXlQYWlyKGJhY2t1cEdwZ0tleSk7XG5cbiAgICAvLyBHZXQgdGhlIEJpdEdvIEVkRFNBIE1QQ3YyIHB1YmxpYyBrZXkgKGVkMjU1MTkpLiBVc2luZyB0aGUgZGVmYXVsdCBtcGN2MlB1YmxpY0tleSAoc2VjcDI1NmsxKVxuICAgIC8vIGhlcmUgd291bGQgY2F1c2UgYSBXQVNNIFwiSW52YWxpZCBJbnB1dFwiIGVycm9yLCBzbyB3ZSByZXF1aXJlIHRoZSBkZWRpY2F0ZWQgZWRkc2FNcGN2MlB1YmxpY0tleS5cbiAgICBjb25zdCB7IGVkZHNhTXBjdjJQdWJsaWNLZXkgfSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29HcGdQdWJrZXlCYXNlZE9uRmVhdHVyZUZsYWdzKHBhcmFtcy5lbnRlcnByaXNlLCB0cnVlKTtcbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9IGVkZHNhTXBjdjJQdWJsaWNLZXkgPz8gdGhpcy5iaXRnb0VkZHNhTXBjdjJQdWJsaWNHcGdLZXk7XG4gICAgYXNzZXJ0KGJpdGdvUHVibGljR3BnS2V5LCAnRmFpbGVkIHRvIGdldCBCaXRHbyBFZERTQSBNUEN2MiBHUEcgcHVibGljIGtleScpO1xuICAgIGNvbnN0IGJpdGdvUHVibGljR3BnS2V5QXJtb3JlZCA9IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCk7XG5cbiAgICBpZiAoZW52UmVxdWlyZXNCaXRnb1B1YkdwZ0tleUNvbmZpZyh0aGlzLmJpdGdvLmdldEVudigpKSkge1xuICAgICAgYXNzZXJ0KGlzQml0Z29FZGRzYU1wY3YyUHViS2V5KGJpdGdvUHVibGljR3BnS2V5QXJtb3JlZCksICdJbnZhbGlkIEJpdEdvIEdQRyBwdWJsaWMga2V5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29LZXlPYmogPSBhd2FpdCBwZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IGJpdGdvUHVibGljR3BnS2V5QXJtb3JlZCB9KTtcbiAgICBjb25zdCBiaXRnb1BrID0gYXdhaXQgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlQdWJsaWNLZXkoYml0Z29LZXlPYmopO1xuXG4gICAgLy8gQ3JlYXRlIERLRyBzZXNzaW9ucyBmb3IgdXNlciAocGFydHkgMCkgYW5kIGJhY2t1cCAocGFydHkgMSlcbiAgICBjb25zdCB7IHVzZXJEa2csIGJhY2t1cERrZyB9ID0gYXdhaXQgdGhpcy5nZXRVc2VyQW5kQmFja3VwU2Vzc2lvbihwYXJhbXMucmV0cm9maXQpO1xuXG4gICAgLy8gI3JlZ2lvbiByb3VuZCAxXG4gICAgYXdhaXQgdXNlckRrZy5pbml0RGtnKHVzZXJTaywgW2JhY2t1cFBrLCBiaXRnb1BrXSk7XG4gICAgYXdhaXQgYmFja3VwRGtnLmluaXREa2coYmFja3VwU2ssIFt1c2VyUGssIGJpdGdvUGtdKTtcblxuICAgIGNvbnN0IHVzZXJNc2cxID0gdXNlckRrZy5nZXRGaXJzdE1lc3NhZ2UoKTtcbiAgICBjb25zdCBiYWNrdXBNc2cxID0gYmFja3VwRGtnLmdldEZpcnN0TWVzc2FnZSgpO1xuXG4gICAgY29uc3QgdXNlclNpZ25lZE1zZzEgPSBhd2FpdCBNUFNDb21tcy5kZXRhY2hTaWduTXBzTWVzc2FnZShCdWZmZXIuZnJvbSh1c2VyTXNnMS5wYXlsb2FkKSwgdXNlckdwZ0tleSk7XG4gICAgY29uc3QgYmFja3VwU2lnbmVkTXNnMSA9IGF3YWl0IE1QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKEJ1ZmZlci5mcm9tKGJhY2t1cE1zZzEucGF5bG9hZCksIGJhY2t1cEdwZ0tleSk7XG5cbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXModXNlckdwZ1B1YmxpY0tleSksICdVc2VyIEdQRyBwdWJsaWMga2V5IGlzIHJlcXVpcmVkJyk7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKGJhY2t1cEdwZ1B1YmxpY0tleSksICdCYWNrdXAgR1BHIHB1YmxpYyBrZXkgaXMgcmVxdWlyZWQnKTtcblxuICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBiaXRnb01zZzEgfSA9IGF3YWl0IHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDEoXG4gICAgICBwYXJhbXMuZW50ZXJwcmlzZSxcbiAgICAgIHtcbiAgICAgICAgdXNlckdwZ1B1YmxpY0tleSxcbiAgICAgICAgYmFja3VwR3BnUHVibGljS2V5LFxuICAgICAgICB1c2VyTXNnMTogdXNlclNpZ25lZE1zZzEsXG4gICAgICAgIGJhY2t1cE1zZzE6IGJhY2t1cFNpZ25lZE1zZzEsXG4gICAgICAgIC4uLihwYXJhbXMucmV0cm9maXQ/LndhbGxldElkID8geyB3YWxsZXRJZDogcGFyYW1zLnJldHJvZml0LndhbGxldElkIH0gOiB7fSksXG4gICAgICB9LFxuICAgICAgcGFyYW1zLnNhZmVJZFxuICAgICk7XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiByb3VuZCAyXG4gICAgY29uc3QgYml0Z29SYXdNc2cxQnl0ZXMgPSBhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKGJpdGdvTXNnMSwgYml0Z29LZXlPYmopO1xuICAgIGNvbnN0IGJpdGdvRGVzZXJpYWxpemVkTXNnMTogTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZSA9IHtcbiAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICBwYXlsb2FkOiBuZXcgVWludDhBcnJheShiaXRnb1Jhd01zZzFCeXRlcyksXG4gICAgfTtcblxuICAgIGNvbnN0IHJvdW5kMU1lc3NhZ2VzOiBNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IFt1c2VyTXNnMSwgYmFja3VwTXNnMSwgYml0Z29EZXNlcmlhbGl6ZWRNc2cxXTtcblxuICAgIGNvbnN0IHVzZXJSb3VuZDJNc2dzID0gdXNlckRrZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHJvdW5kMU1lc3NhZ2VzKTtcbiAgICBjb25zdCBiYWNrdXBSb3VuZDJNc2dzID0gYmFja3VwRGtnLmhhbmRsZUluY29taW5nTWVzc2FnZXMocm91bmQxTWVzc2FnZXMpO1xuXG4gICAgYXNzZXJ0KHVzZXJSb3VuZDJNc2dzLmxlbmd0aCA9PT0gMSwgJ1VzZXIgcm91bmQgMSBzaG91bGQgcHJvZHVjZSBleGFjdGx5IG9uZSByb3VuZCAyIG1lc3NhZ2UnKTtcbiAgICBhc3NlcnQoYmFja3VwUm91bmQyTXNncy5sZW5ndGggPT09IDEsICdCYWNrdXAgcm91bmQgMSBzaG91bGQgcHJvZHVjZSBleGFjdGx5IG9uZSByb3VuZCAyIG1lc3NhZ2UnKTtcblxuICAgIGNvbnN0IHVzZXJNc2cyID0gdXNlclJvdW5kMk1zZ3NbMF07XG4gICAgY29uc3QgYmFja3VwTXNnMiA9IGJhY2t1cFJvdW5kMk1zZ3NbMF07XG5cbiAgICBjb25zdCB1c2VyU2lnbmVkTXNnMiA9IGF3YWl0IE1QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKEJ1ZmZlci5mcm9tKHVzZXJNc2cyLnBheWxvYWQpLCB1c2VyR3BnS2V5KTtcbiAgICBjb25zdCBiYWNrdXBTaWduZWRNc2cyID0gYXdhaXQgTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20oYmFja3VwTXNnMi5wYXlsb2FkKSwgYmFja3VwR3BnS2V5KTtcblxuICAgIGNvbnN0IHtcbiAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkUm91bmQyLFxuICAgICAgY29tbW9uUHVibGljS2V5Y2hhaW4sXG4gICAgICBiaXRnb01zZzIsXG4gICAgfSA9IGF3YWl0IHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDIocGFyYW1zLmVudGVycHJpc2UsIHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHVzZXJNc2cyOiB1c2VyU2lnbmVkTXNnMixcbiAgICAgIGJhY2t1cE1zZzI6IGJhY2t1cFNpZ25lZE1zZzIsXG4gICAgfSk7XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBrZXljaGFpbiBjcmVhdGlvblxuICAgIGFzc2VydC5lcXVhbChzZXNzaW9uSWQsIHNlc3Npb25JZFJvdW5kMiwgJ1JvdW5kIDEgYW5kIHJvdW5kIDIgc2Vzc2lvbiBJRHMgZG8gbm90IG1hdGNoJyk7XG5cbiAgICBjb25zdCBiaXRnb1Jhd01zZzJCeXRlcyA9IGF3YWl0IE1QU0NvbW1zLnZlcmlmeU1wc01lc3NhZ2UoYml0Z29Nc2cyLCBiaXRnb0tleU9iaik7XG4gICAgY29uc3QgYml0Z29EZXNlcmlhbGl6ZWRNc2cyOiBNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlID0ge1xuICAgICAgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KGJpdGdvUmF3TXNnMkJ5dGVzKSxcbiAgICB9O1xuXG4gICAgY29uc3Qgcm91bmQyTWVzc2FnZXM6IE1QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2VzID0gW3VzZXJNc2cyLCBiYWNrdXBNc2cyLCBiaXRnb0Rlc2VyaWFsaXplZE1zZzJdO1xuXG4gICAgY29uc3QgdXNlckZpbmFsTXNncyA9IHVzZXJEa2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhyb3VuZDJNZXNzYWdlcyk7XG4gICAgY29uc3QgYmFja3VwRmluYWxNc2dzID0gYmFja3VwRGtnLmhhbmRsZUluY29taW5nTWVzc2FnZXMocm91bmQyTWVzc2FnZXMpO1xuXG4gICAgYXNzZXJ0KHVzZXJGaW5hbE1zZ3MubGVuZ3RoID09PSAwLCAnV0FTTSByb3VuZCAyIHNob3VsZCBwcm9kdWNlIG5vIG91dHB1dCBtZXNzYWdlcyBmb3IgdXNlcicpO1xuICAgIGFzc2VydChiYWNrdXBGaW5hbE1zZ3MubGVuZ3RoID09PSAwLCAnV0FTTSByb3VuZCAyIHNob3VsZCBwcm9kdWNlIG5vIG91dHB1dCBtZXNzYWdlcyBmb3IgYmFja3VwJyk7XG5cbiAgICBjb25zdCB1c2VyQ29tbW9uS2V5Y2hhaW4gPSB1c2VyRGtnLmdldENvbW1vbktleWNoYWluKCk7XG4gICAgY29uc3QgYmFja3VwQ29tbW9uS2V5Y2hhaW4gPSBiYWNrdXBEa2cuZ2V0Q29tbW9uS2V5Y2hhaW4oKTtcblxuICAgIGFzc2VydC5lcXVhbChcbiAgICAgIHVzZXJDb21tb25LZXljaGFpbixcbiAgICAgIGNvbW1vblB1YmxpY0tleWNoYWluLFxuICAgICAgJ1VzZXIgY29tcHV0ZWQga2V5Y2hhaW4gZG9lcyBub3QgbWF0Y2ggQml0R28gY29tbW9uIGtleWNoYWluJ1xuICAgICk7XG4gICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgYmFja3VwQ29tbW9uS2V5Y2hhaW4sXG4gICAgICBjb21tb25QdWJsaWNLZXljaGFpbixcbiAgICAgICdCYWNrdXAgY29tcHV0ZWQga2V5Y2hhaW4gZG9lcyBub3QgbWF0Y2ggQml0R28gY29tbW9uIGtleWNoYWluJ1xuICAgICk7XG5cbiAgICBjb25zdCB1c2VyUHJpdmF0ZU1hdGVyaWFsID0gdXNlckRrZy5nZXRLZXlTaGFyZSgpO1xuICAgIGNvbnN0IGJhY2t1cFByaXZhdGVNYXRlcmlhbCA9IGJhY2t1cERrZy5nZXRLZXlTaGFyZSgpO1xuICAgIGNvbnN0IHVzZXJSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gdXNlckRrZy5nZXRSZWR1Y2VkS2V5U2hhcmUoKTtcbiAgICBjb25zdCBiYWNrdXBSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gYmFja3VwRGtnLmdldFJlZHVjZWRLZXlTaGFyZSgpO1xuXG4gICAgY29uc3QgdXNlcktleWNoYWluUHJvbWlzZSA9IHRoaXMuYWRkVXNlcktleWNoYWluKFxuICAgICAgdXNlckNvbW1vbktleWNoYWluLFxuICAgICAgdXNlclByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHVzZXJSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICBwYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgcGFyYW1zLndlYmF1dGhuSW5mbyxcbiAgICAgIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgIHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgcGFyYW1zLnNhZmVJZFxuICAgICk7XG4gICAgY29uc3QgYmFja3VwS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5hZGRCYWNrdXBLZXljaGFpbihcbiAgICAgIGJhY2t1cENvbW1vbktleWNoYWluLFxuICAgICAgYmFja3VwUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgYmFja3VwUmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgcGFyYW1zLm9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgIHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgcGFyYW1zLnNhZmVJZFxuICAgICk7XG4gICAgY29uc3QgYml0Z29LZXljaGFpblByb21pc2UgPSB0aGlzLmFkZEJpdGdvS2V5Y2hhaW4odXNlckNvbW1vbktleWNoYWluLCBwYXJhbXMuc2FmZUlkKTtcblxuICAgIGNvbnN0IFt1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHVzZXJLZXljaGFpblByb21pc2UsXG4gICAgICBiYWNrdXBLZXljaGFpblByb21pc2UsXG4gICAgICBiaXRnb0tleWNoYWluUHJvbWlzZSxcbiAgICBdKTtcbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICByZXR1cm4ge1xuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBjcmVhdGVLZXljaGFpbnNXaXRoRXh0ZXJuYWxTaWduZXIocGFyYW1zOiB7XG4gICAgZW50ZXJwcmlzZTogc3RyaW5nO1xuICAgIGNhbGxiYWNrczogRWRkc2FNUEN2MktleUdlbkNhbGxiYWNrcztcbiAgfSk6IFByb21pc2U8S2V5Y2hhaW5zVHJpcGxldD4ge1xuICAgIGNvbnN0IHsgZW50ZXJwcmlzZSwgY2FsbGJhY2tzIH0gPSBwYXJhbXM7XG5cbiAgICBjb25zdCB7IGVkZHNhTXBjdjJQdWJsaWNLZXkgfSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29HcGdQdWJrZXlCYXNlZE9uRmVhdHVyZUZsYWdzKGVudGVycHJpc2UsIHRydWUpO1xuICAgIGNvbnN0IGJpdGdvUHVibGljR3BnS2V5ID0gZWRkc2FNcGN2MlB1YmxpY0tleSA/PyB0aGlzLmJpdGdvRWRkc2FNcGN2MlB1YmxpY0dwZ0tleTtcbiAgICBhc3NlcnQoYml0Z29QdWJsaWNHcGdLZXksICdGYWlsZWQgdG8gZ2V0IEJpdEdvIEVkRFNBIE1QQ3YyIEdQRyBwdWJsaWMga2V5Jyk7XG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXlBcm1vcmVkID0gYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKTtcblxuICAgIGlmIChlbnZSZXF1aXJlc0JpdGdvUHViR3BnS2V5Q29uZmlnKHRoaXMuYml0Z28uZ2V0RW52KCkpKSB7XG4gICAgICBhc3NlcnQoaXNCaXRnb0VkZHNhTXBjdjJQdWJLZXkoYml0Z29QdWJsaWNHcGdLZXlBcm1vcmVkKSwgJ0ludmFsaWQgQml0R28gRWREU0EgTVBDdjIgR1BHIHB1YmxpYyBrZXknKTtcbiAgICB9XG5cbiAgICAvLyBSb3VuZCAwOiBib3RoIHBhcnRpZXMgZ2VuZXJhdGUgR1BHIGtleXNcbiAgICBjb25zdCB7IHVzZXJHcGdQdWJsaWNLZXksIGJhY2t1cEdwZ1B1YmxpY0tleSwgdXNlclN0YXRlLCBiYWNrdXBTdGF0ZSB9ID0gYXdhaXQgY2FsbGJhY2tzLmluaXRpYWxpemVDYWxsYmFjayh7XG4gICAgICBlbnRlcnByaXNlLFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXk6IGJpdGdvUHVibGljR3BnS2V5QXJtb3JlZCxcbiAgICB9KTtcblxuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyh1c2VyR3BnUHVibGljS2V5KSwgJ1VzZXIgR1BHIHB1YmxpYyBrZXkgaXMgcmVxdWlyZWQnKTtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoYmFja3VwR3BnUHVibGljS2V5KSwgJ0JhY2t1cCBHUEcgcHVibGljIGtleSBpcyByZXF1aXJlZCcpO1xuXG4gICAgLy8gUm91bmQgMTogYm90aCBwYXJ0aWVzIHJ1biBES0cgcm91bmQgMVxuICAgIGNvbnN0IHtcbiAgICAgIHVzZXJTaWduZWRNc2cxLFxuICAgICAgYmFja3VwU2lnbmVkTXNnMSxcbiAgICAgIHVzZXJTdGF0ZTogdXNlclN0YXRlQWZ0ZXIxLFxuICAgICAgYmFja3VwU3RhdGU6IGJhY2t1cFN0YXRlQWZ0ZXIxLFxuICAgIH0gPSBhd2FpdCBjYWxsYmFja3Mucm91bmQxQ2FsbGJhY2soe1xuICAgICAgYml0Z29QdWJsaWNHcGdLZXk6IGJpdGdvUHVibGljR3BnS2V5QXJtb3JlZCxcbiAgICAgIHVzZXJHcGdQdWJsaWNLZXksXG4gICAgICBiYWNrdXBHcGdQdWJsaWNLZXksXG4gICAgICB1c2VyU3RhdGUsXG4gICAgICBiYWNrdXBTdGF0ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBiaXRnb01zZzEgfSA9IGF3YWl0IHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDEoZW50ZXJwcmlzZSwge1xuICAgICAgdXNlckdwZ1B1YmxpY0tleSxcbiAgICAgIGJhY2t1cEdwZ1B1YmxpY0tleSxcbiAgICAgIHVzZXJNc2cxOiB1c2VyU2lnbmVkTXNnMSxcbiAgICAgIGJhY2t1cE1zZzE6IGJhY2t1cFNpZ25lZE1zZzEsXG4gICAgfSk7XG5cbiAgICAvLyBSb3VuZCAyOiBib3RoIHBhcnRpZXMgcnVuIERLRyByb3VuZCAyXG4gICAgY29uc3Qge1xuICAgICAgdXNlclNpZ25lZE1zZzIsXG4gICAgICBiYWNrdXBTaWduZWRNc2cyLFxuICAgICAgdXNlclN0YXRlOiB1c2VyU3RhdGVBZnRlcjIsXG4gICAgICBiYWNrdXBTdGF0ZTogYmFja3VwU3RhdGVBZnRlcjIsXG4gICAgfSA9IGF3YWl0IGNhbGxiYWNrcy5yb3VuZDJDYWxsYmFjayh7XG4gICAgICBiaXRnb01zZzEsXG4gICAgICB1c2VyU2lnbmVkTXNnMSxcbiAgICAgIGJhY2t1cFNpZ25lZE1zZzEsXG4gICAgICB1c2VyU3RhdGU6IHVzZXJTdGF0ZUFmdGVyMSxcbiAgICAgIGJhY2t1cFN0YXRlOiBiYWNrdXBTdGF0ZUFmdGVyMSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHtcbiAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkUm91bmQyLFxuICAgICAgY29tbW9uUHVibGljS2V5Y2hhaW46IGJpdGdvQ29tbW9uS2V5Y2hhaW4sXG4gICAgICBiaXRnb01zZzIsXG4gICAgfSA9IGF3YWl0IHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDIoZW50ZXJwcmlzZSwge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgdXNlck1zZzI6IHVzZXJTaWduZWRNc2cyLFxuICAgICAgYmFja3VwTXNnMjogYmFja3VwU2lnbmVkTXNnMixcbiAgICB9KTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2Vzc2lvbklkLCBzZXNzaW9uSWRSb3VuZDIsICdSb3VuZCAxIGFuZCByb3VuZCAyIHNlc3Npb24gSURzIGRvIG5vdCBtYXRjaCcpO1xuXG4gICAgLy8gRmluYWxpemU6IGJvdGggcGFydGllcyB2ZXJpZnkgYW5kIGRlcml2ZSB0aGUgY29tbW9uIGtleWNoYWluXG4gICAgY29uc3QgeyBjb21tb25LZXljaGFpbiB9ID0gYXdhaXQgY2FsbGJhY2tzLmZpbmFsaXplQ2FsbGJhY2soe1xuICAgICAgYml0Z29Nc2cyLFxuICAgICAgYml0Z29Db21tb25LZXljaGFpbixcbiAgICAgIHVzZXJTdGF0ZTogdXNlclN0YXRlQWZ0ZXIyLFxuICAgICAgYmFja3VwU3RhdGU6IGJhY2t1cFN0YXRlQWZ0ZXIyLFxuICAgIH0pO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChjb21tb25LZXljaGFpbiwgYml0Z29Db21tb25LZXljaGFpbiwgJ0NvbW1vbiBrZXljaGFpbnMgZG8gbm90IG1hdGNoJyk7XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIGNvbnN0IFt1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGtleWNoYWlucy5hZGQoeyBzb3VyY2U6ICd1c2VyJywga2V5VHlwZTogJ3RzcycgYXMgS2V5VHlwZSwgY29tbW9uS2V5Y2hhaW4sIGlzTVBDdjI6IHRydWUsIGVudGVycHJpc2UgfSksXG4gICAgICBrZXljaGFpbnMuYWRkKHsgc291cmNlOiAnYmFja3VwJywga2V5VHlwZTogJ3RzcycgYXMgS2V5VHlwZSwgY29tbW9uS2V5Y2hhaW4sIGlzTVBDdjI6IHRydWUsIGVudGVycHJpc2UgfSksXG4gICAgICB0aGlzLmFkZEJpdGdvS2V5Y2hhaW4oY29tbW9uS2V5Y2hhaW4pLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHsgdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbiB9O1xuICB9XG5cbiAgLy8gI3JlZ2lvbiBrZXljaGFpbiB1dGlsc1xuICBhc3luYyBjcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgIHBhcnRpY2lwYW50SW5kZXg6IE1QQ3YyUGFydHlGcm9tU3RyaW5nT3JOdW1iZXIsXG4gICAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICBwcml2YXRlTWF0ZXJpYWw/OiBCdWZmZXIsXG4gICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbD86IEJ1ZmZlcixcbiAgICBwYXNzcGhyYXNlPzogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZyxcbiAgICB3ZWJhdXRobkluZm8/OiBXZWJhdXRobktleUVuY3J5cHRpb25JbmZvLFxuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb24sXG4gICAgZW50ZXJwcmlzZT86IHN0cmluZyxcbiAgICBzYWZlSWQ/OiBzdHJpbmcsXG4gICAgY2hpbGQ/OiB7IHBhcmVudEtleUlkOiBzdHJpbmc7IGluZGV4OiBudW1iZXIgfVxuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgbGV0IHNvdXJjZTogc3RyaW5nO1xuICAgIGxldCBlbmNyeXB0ZWRQcnY6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVkdWNlZEVuY3J5cHRlZFBydjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCBwcml2YXRlTWF0ZXJpYWxCYXNlNjQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIHN3aXRjaCAocGFydGljaXBhbnRJbmRleCkge1xuICAgICAgY2FzZSBNUEN2MlBhcnRpZXNFbnVtLlVTRVI6XG4gICAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQOlxuICAgICAgICBzb3VyY2UgPSBwYXJ0aWNpcGFudEluZGV4ID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgPyAndXNlcicgOiAnYmFja3VwJztcbiAgICAgICAgaWYgKHByaXZhdGVNYXRlcmlhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgcGFydGljaXBhbnRJbmRleCA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAgJiZcbiAgICAgICAgICAgICAgc2FmZUlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgY2hpbGQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID09PSB1bmRlZmluZWQsXG4gICAgICAgICAgICBgUHJpdmF0ZSBtYXRlcmlhbCBpcyByZXF1aXJlZCBmb3IgJHtzb3VyY2V9IGtleWNoYWluYFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXNzZXJ0KHBhc3NwaHJhc2UsIGBQYXNzcGhyYXNlIGlzIHJlcXVpcmVkIGZvciAke3NvdXJjZX0ga2V5Y2hhaW5gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQocHJpdmF0ZU1hdGVyaWFsLCBgUHJpdmF0ZSBtYXRlcmlhbCBpcyByZXF1aXJlZCBmb3IgJHtzb3VyY2V9IGtleWNoYWluYCk7XG4gICAgICAgIGFzc2VydChyZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLCBgUmVkdWNlZCBwcml2YXRlIG1hdGVyaWFsIGlzIHJlcXVpcmVkIGZvciAke3NvdXJjZX0ga2V5Y2hhaW5gKTtcbiAgICAgICAgYXNzZXJ0KHBhc3NwaHJhc2UsIGBQYXNzcGhyYXNlIGlzIHJlcXVpcmVkIGZvciAke3NvdXJjZX0ga2V5Y2hhaW5gKTtcbiAgICAgICAgcHJpdmF0ZU1hdGVyaWFsQmFzZTY0ID0gcHJpdmF0ZU1hdGVyaWFsLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgICAgZW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogcHJpdmF0ZU1hdGVyaWFsQmFzZTY0LFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gRW5jcnlwdHMgdGhlIENCT1ItZW5jb2RlZCBSZWR1Y2VkS2V5U2hhcmUgKHdoaWNoIGNvbnRhaW5zIHRoZSBwYXJ0eSdzIHB1YmxpY1xuICAgICAgICAvLyBrZXkpIHdpdGggdGhlIHdhbGxldCBwYXNzcGhyYXNlLiBUaGUgcmVzdWx0IGlzIHN0b3JlZCBhcyByZWR1Y2VkRW5jcnlwdGVkUHJ2XG4gICAgICAgIC8vIG9uIHRoZSBrZXkgY2FyZCBRUiBjb2RlIGFuZCByZXByZXNlbnRzIGEgc2Vjb25kIGNvcHkgb2Yga2V5IG1hdGVyaWFsXG4gICAgICAgIC8vIGJleW9uZCB0aGUgc2VydmVyLXN0b3JlZCBlbmNyeXB0ZWRQcnYuXG4gICAgICAgIHJlZHVjZWRFbmNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgIC8vIEJ1ZmZlci50b1N0cmluZygnYmFzZTY0JykgY2FuIG5vdCBiZSB1c2VkIGhlcmUgYXMgaXQgZG9lcyBub3Qgd29yayBvbiB0aGUgYnJvd3Nlci5cbiAgICAgICAgICAvLyBUaGUgYnJvd3NlciBkZWFscyB3aXRoIGEgQnVmZmVyIGFzIFVpbnQ4QXJyYXksIHRoZXJlZm9yZSBpbiB0aGUgYnJvd3NlciAudG9TdHJpbmcoJ2Jhc2U2NCcpIGp1c3QgY3JlYXRlcyBhIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmcgb2YgdGhlIGFycmF5IHZhbHVlcy5cbiAgICAgICAgICBpbnB1dDogYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkocmVkdWNlZFByaXZhdGVNYXRlcmlhbCkpKSksXG4gICAgICAgICAgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsXG4gICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5CSVRHTzpcbiAgICAgICAgc291cmNlID0gJ2JpdGdvJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFydGljaXBhbnQgaW5kZXgnKTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpblBhcmFtczogQWRkS2V5Y2hhaW5PcHRpb25zID0ge1xuICAgICAgc291cmNlLFxuICAgICAga2V5VHlwZTogJ3RzcycgYXMgS2V5VHlwZSxcbiAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgZW5jcnlwdGVkUHJ2LFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgaXNNUEN2MjogdHJ1ZSxcbiAgICAgIHNhZmVJZCxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgfTtcblxuICAgIGlmIChjaGlsZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoc2FmZUlkKSwgJ1NhZmUgSUQgaXMgcmVxdWlyZWQgZm9yIGEgZGVyaXZlZCBrZXljaGFpbicpO1xuICAgICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKGNoaWxkLnBhcmVudEtleUlkKSwgJ1BhcmVudCBrZXkgSUQgaXMgcmVxdWlyZWQgZm9yIGEgZGVyaXZlZCBrZXljaGFpbicpO1xuICAgICAga2V5Y2hhaW5QYXJhbXMucGFyZW50ID0gY2hpbGQucGFyZW50S2V5SWQ7XG4gICAgICBrZXljaGFpblBhcmFtcy5kZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoID0gZGVjb2RlV2l0aENvZGVjKFxuICAgICAgICBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgsXG4gICAgICAgIGBtLyR7Y2hpbGQuaW5kZXh9J2AsXG4gICAgICAgICdkZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAod2ViYXV0aG5JbmZvICYmIHBhcnRpY2lwYW50SW5kZXggPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBwcml2YXRlTWF0ZXJpYWxCYXNlNjQpIHtcbiAgICAgIC8vIFNlbmQgdGhlIHBhc3NrZXkgYXMgYHdlYmF1dGhuSW5mb2A7IHRoZSBkZXByZWNhdGVkIGB3ZWJhdXRobkRldmljZXNgIGFycmF5IGlzIGlnbm9yZWQgYnkgUE9TVCAva2V5LlxuICAgICAgYXNzZXJ0KGVudGVycHJpc2UsICdlbnRlcnByaXNlIGlzIHJlcXVpcmVkIHRvIGF0dGFjaCBhIHdlYmF1dGhuIGRldmljZSB0byB0aGUgdXNlciBrZXljaGFpbicpO1xuICAgICAga2V5Y2hhaW5QYXJhbXMud2ViYXV0aG5JbmZvID0ge1xuICAgICAgICBvdHBEZXZpY2VJZDogd2ViYXV0aG5JbmZvLm90cERldmljZUlkLFxuICAgICAgICBwcmZTYWx0OiB3ZWJhdXRobkluZm8ucHJmU2FsdCxcbiAgICAgICAgZW5jcnlwdGVkUHJ2OiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgIGlucHV0OiBwcml2YXRlTWF0ZXJpYWxCYXNlNjQsXG4gICAgICAgICAgcGFzc3dvcmQ6IHdlYmF1dGhuSW5mby5wYXNzcGhyYXNlLFxuICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICB9KSxcbiAgICAgICAgZW50ZXJwcmlzZUlkOiBlbnRlcnByaXNlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIHJldHVybiB7IC4uLihhd2FpdCBrZXljaGFpbnMuYWRkKGtleWNoYWluUGFyYW1zKSksIHJlZHVjZWRFbmNyeXB0ZWRQcnYgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBhZGRVc2VyS2V5Y2hhaW4oXG4gICAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICBwcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIsXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZyxcbiAgICB3ZWJhdXRobkluZm8/OiBXZWJhdXRobktleUVuY3J5cHRpb25JbmZvLFxuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb24sXG4gICAgZW50ZXJwcmlzZT86IHN0cmluZyxcbiAgICBzYWZlSWQ/OiBzdHJpbmcsXG4gICAgY2hpbGQ/OiB7IHBhcmVudEtleUlkOiBzdHJpbmc7IGluZGV4OiBudW1iZXIgfVxuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgcHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICB3ZWJhdXRobkluZm8sXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICBzYWZlSWQsXG4gICAgICBjaGlsZFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgYWRkQmFja3VwS2V5Y2hhaW4oXG4gICAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICBwcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlciB8IHVuZGVmaW5lZCxcbiAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIgfCB1bmRlZmluZWQsXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZyxcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uLFxuICAgIGVudGVycHJpc2U/OiBzdHJpbmcsXG4gICAgc2FmZUlkPzogc3RyaW5nLFxuICAgIGNoaWxkPzogeyBwYXJlbnRLZXlJZDogc3RyaW5nOyBpbmRleDogbnVtYmVyIH1cbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCxcbiAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgcHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICBzYWZlSWQsXG4gICAgICBjaGlsZFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgYWRkQml0Z29LZXljaGFpbihcbiAgICBjb21tb25LZXljaGFpbjogc3RyaW5nLFxuICAgIHNhZmVJZD86IHN0cmluZyxcbiAgICBjaGlsZD86IHsgcGFyZW50S2V5SWQ6IHN0cmluZzsgaW5kZXg6IG51bWJlciB9XG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgc2FmZUlkLFxuICAgICAgY2hpbGRcbiAgICApO1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMShcbiAgICBlbnRlcnByaXNlOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRWRkc2FNUEN2MktleUdlblJvdW5kMVJlcXVlc3QgJiB7IHdhbGxldElkPzogc3RyaW5nIH0sXG4gICAgc2FmZUlkPzogc3RyaW5nXG4gICk6IFByb21pc2U8RWRkc2FNUEN2MktleUdlblJvdW5kMVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDFCeVNlbmRlcihLZXlHZW5TZW5kZXJGb3JFbnRlcnByaXNlKHRoaXMuYml0Z28sIGVudGVycHJpc2UsIHNhZmVJZCksIHBheWxvYWQpO1xuICB9XG5cbiAgYXN5bmMgc2VuZEtleUdlbmVyYXRpb25Sb3VuZDFCeVNlbmRlcihcbiAgICBzZW5kZXJGbjogRWRkc2FNUEN2MktleUdlblNlbmRGbjxFZGRzYU1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2U+LFxuICAgIHBheWxvYWQ6IEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDFSZXF1ZXN0ICYgeyB3YWxsZXRJZD86IHN0cmluZyB9XG4gICk6IFByb21pc2U8RWRkc2FNUEN2MktleUdlblJvdW5kMVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHNlbmRlckZuKE1QQ3YyS2V5R2VuU3RhdGVFbnVtWydNUEN2Mi1SMSddLCBwYXlsb2FkKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQyKFxuICAgIGVudGVycHJpc2U6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBFZGRzYU1QQ3YyS2V5R2VuUm91bmQyUmVxdWVzdFxuICApOiBQcm9taXNlPEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQyQnlTZW5kZXIoS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZSh0aGlzLmJpdGdvLCBlbnRlcnByaXNlKSwgcGF5bG9hZCk7XG4gIH1cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMkJ5U2VuZGVyKFxuICAgIHNlbmRlckZuOiBFZGRzYU1QQ3YyS2V5R2VuU2VuZEZuPEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4sXG4gICAgcGF5bG9hZDogRWRkc2FNUEN2MktleUdlblJvdW5kMlJlcXVlc3RcbiAgKTogUHJvbWlzZTxFZGRzYU1QQ3YyS2V5R2VuUm91bmQyUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gc2VuZGVyRm4oTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyLVIyJ10sIHBheWxvYWQpO1xuICB9XG5cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gc2lnbiB0eCByZXF1ZXN0XG5cbiAgLyoqXG4gICAqIFNpZ25zIHRoZSB0cmFuc2FjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8VHhSZXF1ZXN0Pn0gZnVsbHkgc2lnbmVkIFR4UmVxdWVzdFxuICAgKi9cbiAgYXN5bmMgc2lnblR4UmVxdWVzdChwYXJhbXM6IFRTU1BhcmFtc1dpdGhQcnYpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIHJldHVybiB0aGlzLnNpZ25SZXF1ZXN0QmFzZShwYXJhbXMsIFJlcXVlc3RUeXBlLnR4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8VHhSZXF1ZXN0Pn0gZnVsbHkgc2lnbmVkIFR4UmVxdWVzdFxuICAgKi9cbiAgYXN5bmMgc2lnblR4UmVxdWVzdEZvck1lc3NhZ2UocGFyYW1zOiBUU1NQYXJhbXNGb3JNZXNzYWdlV2l0aFBydik6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgcmV0dXJuIHRoaXMuc2lnblJlcXVlc3RCYXNlKHBhcmFtcywgUmVxdWVzdFR5cGUubWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogRnVsbCAzLXJvdW5kIEVkRFNBIE1QQ3YyIChNUFMpIG9ubGluZSBzaWduaW5nIG9yY2hlc3RyYXRpb24uXG4gICAqXG4gICAqIFByb3RvY29sIG92ZXJ2aWV3OlxuICAgKiAgIFdBU00gUm91bmQgMCAg4oaSIGdldEZpcnN0TWVzc2FnZSgpICAgICAgKHByb2R1Y2VzIHVzZXJNc2cxKVxuICAgKiAgIEFQSSAgUm91bmQgMSAg4oaSIHNlbmQgdXNlck1zZzEgLyByZWN2IGJpdGdvTXNnMVxuICAgKiAgIFdBU00gUm91bmQgMSAg4oaSIGhhbmRsZUluY29taW5nTWVzc2FnZXMoW3VzZXJNc2cxLCBiaXRnb01zZzFdKSAgKHByb2R1Y2VzIHVzZXJNc2cyKVxuICAgKiAgIEFQSSAgUm91bmQgMiAg4oaSIHNlbmQgdXNlck1zZzIgLyByZWN2IGJpdGdvTXNnMlxuICAgKiAgIFdBU00gUm91bmQgMiAg4oaSIGhhbmRsZUluY29taW5nTWVzc2FnZXMoW3VzZXJNc2cyLCBiaXRnb01zZzJdKSAgKHByb2R1Y2VzIHVzZXJNc2czKVxuICAgKiAgIEFQSSAgUm91bmQgMyAg4oaSIHNlbmQgdXNlck1zZzMgKFdQIGZpbmFsaXNlczsgbm8gQml0R28gbXNnIHJldHVybmVkIHRvIGNsaWVudClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblJlcXVlc3RCYXNlKFxuICAgIHBhcmFtczogVFNTUGFyYW1zV2l0aFBydiB8IFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2LFxuICAgIHJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZVxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHVzZXJLZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKHBhcmFtcy5wcnYsICdiYXNlNjQnKTtcblxuICAgIGNvbnN0IHR4UmVxdWVzdDogVHhSZXF1ZXN0ID1cbiAgICAgIHR5cGVvZiBwYXJhbXMudHhSZXF1ZXN0ID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCBwYXJhbXMudHhSZXF1ZXN0LCBwYXJhbXMucmVxSWQpXG4gICAgICAgIDogcGFyYW1zLnR4UmVxdWVzdDtcblxuICAgIGxldCB0eE9yTWVzc2FnZVRvU2lnbjtcbiAgICBsZXQgZGVyaXZhdGlvblBhdGg7XG4gICAgbGV0IGJ1ZmZlckNvbnRlbnQ7XG4gICAgLy8gT25lIGZyZXNoIGVkMjU1MTkgR1BHIGtleSBwYWlyIHBlciBzaWduaW5nIHNlc3Npb24sIHJldXNlZCBhY3Jvc3MgYWxsIHNpZ25pbmcgcm91bmRzLlxuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ2VkMjU1MTknKTtcbiAgICBjb25zdCB1c2VyR3BnUHJ2S2V5ID0gYXdhaXQgcGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogdXNlckdwZ0tleS5wcml2YXRlS2V5IH0pO1xuICAgIGNvbnN0IGJpdGdvR3BnUHViS2V5ID0gYXdhaXQgdGhpcy5waWNrQml0Z29QdWJHcGdLZXlGb3JTaWduaW5nKHRydWUsIHBhcmFtcy5yZXFJZCwgdHhSZXF1ZXN0LmVudGVycHJpc2VJZCwgdHJ1ZSk7XG4gICAgYXNzZXJ0KGJpdGdvR3BnUHViS2V5LCAnTWlzc2luZyBCaXRHbyBHUEcga2V5IGZvciBNUEN2MicpO1xuXG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCkge1xuICAgICAgYXNzZXJ0KHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgdHhSZXF1ZXN0LnVuc2lnbmVkVHhzLCAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCcpO1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9XG4gICAgICAgIHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcgPyB0eFJlcXVlc3QudHJhbnNhY3Rpb25zIVswXS51bnNpZ25lZFR4IDogdHhSZXF1ZXN0LnVuc2lnbmVkVHhzIVswXTtcbiAgICAgIHR4T3JNZXNzYWdlVG9TaWduID0gdW5zaWduZWRUeC5zaWduYWJsZUhleDtcbiAgICAgIGFzc2VydCh0eE9yTWVzc2FnZVRvU2lnbiwgJ01pc3Npbmcgc2lnbmFibGVIZXggaW4gdW5zaWduZWRUeCcpO1xuICAgICAgZGVyaXZhdGlvblBhdGggPSB1bnNpZ25lZFR4LmRlcml2YXRpb25QYXRoO1xuICAgICAgYnVmZmVyQ29udGVudCA9IEJ1ZmZlci5mcm9tKHR4T3JNZXNzYWdlVG9TaWduLCAnaGV4Jyk7XG4gICAgICBhd2FpdCB0aGlzLmJhc2VDb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleDogdW5zaWduZWRUeC5zZXJpYWxpemVkVHhIZXggPz8gdHhPck1lc3NhZ2VUb1NpZ24gfSxcbiAgICAgICAgdHhQYXJhbXM6IHJlc29sdmVFZmZlY3RpdmVUeFBhcmFtcyh0eFJlcXVlc3QsIHBhcmFtcy50eFBhcmFtcywgdGhpcy5iYXNlQ29pbi5nZXRDaGFpbigpKSxcbiAgICAgICAgd2FsbGV0OiB0aGlzLndhbGxldCxcbiAgICAgICAgd2FsbGV0VHlwZTogdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlKCksXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS5tZXNzYWdlKSB7XG4gICAgICBhc3NlcnQodHhSZXF1ZXN0Lm1lc3NhZ2VzICYmIHR4UmVxdWVzdC5tZXNzYWdlcy5sZW5ndGggPiAwLCAnVW5hYmxlIHRvIGZpbmQgbWVzc2FnZXMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgICB0eE9yTWVzc2FnZVRvU2lnbiA9IHR4UmVxdWVzdC5tZXNzYWdlc1swXS5tZXNzYWdlRW5jb2RlZDtcbiAgICAgIGFzc2VydCh0eE9yTWVzc2FnZVRvU2lnbiwgJ01pc3NpbmcgbWVzc2FnZUVuY29kZWQgaW4gbWVzc2FnZXNbMF0nKTtcbiAgICAgIGRlcml2YXRpb25QYXRoID0gdHhSZXF1ZXN0Lm1lc3NhZ2VzWzBdLmRlcml2YXRpb25QYXRoIHx8ICdtLzAnO1xuICAgICAgYnVmZmVyQ29udGVudCA9IEJ1ZmZlci5mcm9tKHR4T3JNZXNzYWdlVG9TaWduLCAnaGV4Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByZXF1ZXN0IHR5cGUnKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgV0FTTSBSb3VuZCAwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGNvbnN0IHBhcnR5SWQgPSBwYXJhbXMubXBjdjJQYXJ0eUlkID8/IE1QQ3YyUGFydGllc0VudW0uVVNFUjtcbiAgICBjb25zdCBzaWduZXJTaGFyZVR5cGUgPSBwYXJ0eUlkID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgPyBTaWduYXR1cmVTaGFyZVR5cGUuVVNFUiA6IFNpZ25hdHVyZVNoYXJlVHlwZS5CQUNLVVA7XG4gICAgY29uc3QgdXNlckRzZyA9IG5ldyBFZGRzYU1QU0RzZy5EU0cocGFydHlJZCk7XG4gICAgYXdhaXQgdXNlckRzZy5pbml0RHNnKHVzZXJLZXlTaGFyZSwgYnVmZmVyQ29udGVudCwgZGVyaXZhdGlvblBhdGgsIE1QQ3YyUGFydGllc0VudW0uQklUR08pO1xuICAgIGNvbnN0IHVzZXJNc2cxID0gdXNlckRzZy5nZXRGaXJzdE1lc3NhZ2UoKTtcblxuICAgIC8vIOKUgOKUgCBBUEkgUm91bmQgMSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMSA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUodXNlck1zZzEsIHVzZXJHcGdQcnZLZXksIHBhcnR5SWQpO1xuICAgIGxldCBsYXRlc3RUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3Qud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDFdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuXG4gICAgYXNzZXJ0KGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzLCAnSW52YWxpZCB0eFJlcXVlc3Qgb2JqZWN0IGFmdGVyIHJvdW5kIDEnKTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlczEgPVxuICAgICAgcmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4XG4gICAgICAgID8gbGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyFbMF0uc2lnbmF0dXJlU2hhcmVzXG4gICAgICAgIDogbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzIVswXS5zaWduYXR1cmVTaGFyZXM7XG5cbiAgICBjb25zdCBiaXRnb1NoYXJlUm91bmRPbmUgPSBnZXRCaXRnb1NpZ25hdHVyZVNoYXJlKHNpZ25hdHVyZVNoYXJlczEsIHNpZ25lclNoYXJlVHlwZSwgJ3JvdW5kMU91dHB1dCcpO1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZSA9IGRlY29kZVdpdGhDb2RlYyhcbiAgICAgIEVkZHNhTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMU91dHB1dCxcbiAgICAgIEpTT04ucGFyc2UoYml0Z29TaGFyZVJvdW5kT25lLnNoYXJlKSxcbiAgICAgICdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJ1xuICAgICk7XG5cbiAgICBpZiAocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lLnR5cGUgIT09ICdyb3VuZDFPdXRwdXQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0Rlc2VyaWFsaXplZE1zZzEgPSBhd2FpdCB2ZXJpZnlQZWVyTWVzc2FnZVJvdW5kT25lKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZSwgYml0Z29HcGdQdWJLZXkpO1xuXG4gICAgLy8g4pSA4pSAIFdBU00gUm91bmQgMSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBjb25zdCBbdXNlck1zZzJdID0gdXNlckRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFt1c2VyTXNnMSwgYml0Z29EZXNlcmlhbGl6ZWRNc2cxXSk7XG4gICAgYXNzZXJ0KHVzZXJNc2cyLCAnV0FTTSByb3VuZCAxIHByb2R1Y2VkIG5vIG1lc3NhZ2UnKTtcblxuICAgIC8vIOKUgOKUgCBBUEkgUm91bmQgMiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kVHdvID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFR3byh1c2VyTXNnMiwgdXNlckdwZ1BydktleSwgcGFydHlJZCk7XG4gICAgbGF0ZXN0VHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0LndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmRUd29dLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuXG4gICAgYXNzZXJ0KGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzLCAnSW52YWxpZCB0eFJlcXVlc3Qgb2JqZWN0IGFmdGVyIHJvdW5kIDInKTtcblxuICAgIGNvbnN0IHR4UmVxdWVzdFNpZ25hdHVyZVNoYXJlcyA9XG4gICAgICByZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHhcbiAgICAgICAgPyBsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zIVswXS5zaWduYXR1cmVTaGFyZXNcbiAgICAgICAgOiBsYXRlc3RUeFJlcXVlc3QubWVzc2FnZXMhWzBdLnNpZ25hdHVyZVNoYXJlcztcblxuICAgIGNvbnN0IGJpdGdvU2hhcmVSb3VuZFR3byA9IGdldEJpdGdvU2lnbmF0dXJlU2hhcmUodHhSZXF1ZXN0U2lnbmF0dXJlU2hhcmVzLCBzaWduZXJTaGFyZVR5cGUsICdyb3VuZDJPdXRwdXQnKTtcbiAgICBjb25zdCBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28gPSBkZWNvZGVXaXRoQ29kZWMoXG4gICAgICBFZGRzYU1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDJPdXRwdXQsXG4gICAgICBKU09OLnBhcnNlKGJpdGdvU2hhcmVSb3VuZFR3by5zaGFyZSksXG4gICAgICAnVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLidcbiAgICApO1xuXG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3by50eXBlICE9PSAncm91bmQyT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29EZXNlcmlhbGl6ZWRNc2cyID0gYXdhaXQgdmVyaWZ5UGVlck1lc3NhZ2VSb3VuZFR3byhwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28sIGJpdGdvR3BnUHViS2V5KTtcblxuICAgIC8vIOKUgOKUgCBXQVNNIFJvdW5kIDIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgY29uc3QgW3VzZXJNc2czXSA9IHVzZXJEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbdXNlck1zZzIsIGJpdGdvRGVzZXJpYWxpemVkTXNnMl0pO1xuICAgIGFzc2VydCh1c2VyTXNnMywgJ1dBU00gcm91bmQgMiBwcm9kdWNlZCBubyBtZXNzYWdlJyk7XG5cbiAgICAvLyDilIDilIAgQVBJIFJvdW5kIDMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgLy8gTm8gQml0R28gcmVzcG9uc2UgdG8gdmVyaWZ5OyBXUCBmaW5hbGlzZXMgdGhlIHNpZ25pbmcgc2VydmVyLXNpZGVcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMyA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZSh1c2VyTXNnMywgdXNlckdwZ1BydktleSwgcGFydHlJZCk7XG4gICAgY29uc3Qgcm91bmQzVHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0LndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQzXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKTtcbiAgICBhc3NlcnQocm91bmQzVHhSZXF1ZXN0Py50eFJlcXVlc3RJZCA9PT0gdHhSZXF1ZXN0LnR4UmVxdWVzdElkLCAnSW52YWxpZCB0eFJlcXVlc3Qgb2JqZWN0IGFmdGVyIHJvdW5kIDMnKTtcblxuICAgIHJldHVybiBzZW5kVHhSZXF1ZXN0KHRoaXMuYml0Z28sIHR4UmVxdWVzdC53YWxsZXRJZCwgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLCByZXF1ZXN0VHlwZSwgcGFyYW1zLnJlcUlkKTtcbiAgfVxuXG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIGV4dGVybmFsIHNpZ25lclxuXG4gIC8vICNyZWdpb24gS2V5R2VuUm91bmQxU2hhcmVcbiAgYXN5bmMgY3JlYXRlT2ZmbGluZUtleUdlblJvdW5kMVNoYXJlKHBhcmFtczoge1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmc7XG4gICAgYml0Z29HcGdQdWJLZXk6IHN0cmluZztcbiAgICBjb3VudGVyUGFydHlHcGdQdWJLZXk6IHN0cmluZztcbiAgICBwYXJ0eUlkPzogTVBDdjJQYXJ0aWVzRW51bS5VU0VSIHwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVA7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzaWduZWRNc2cxOiBNUFNUeXBlcy5NUFNTaWduZWRNZXNzYWdlO1xuICAgIGVuY3J5cHRlZFJvdW5kMVNlc3Npb246IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHsgd2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGVkVXNlckdwZ1BydktleSwgYml0Z29HcGdQdWJLZXksIGNvdW50ZXJQYXJ0eUdwZ1B1YktleSB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHBhcnR5SWQgPSBwYXJhbXMucGFydHlJZCA/PyBNUEN2MlBhcnRpZXNFbnVtLlVTRVI7XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRHcGdQcnZLZXkgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogZW5jcnlwdGVkVXNlckdwZ1BydktleSwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgY29uc3QgZ3BnUHJ2S2V5ID0gYXdhaXQgcGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogZGVjcnlwdGVkR3BnUHJ2S2V5IH0pO1xuXG4gICAgY29uc3QgWywgb3duU2tdID0gYXdhaXQgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlLZXlQYWlyKGdwZ1BydktleSk7XG5cbiAgICBpZiAoZW52UmVxdWlyZXNCaXRnb1B1YkdwZ0tleUNvbmZpZyh0aGlzLmJpdGdvLmdldEVudigpKSkge1xuICAgICAgYXNzZXJ0KGlzQml0Z29FZGRzYU1wY3YyUHViS2V5KGJpdGdvR3BnUHViS2V5KSwgJ0ludmFsaWQgQml0R28gR1BHIHB1YmxpYyBrZXknKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0tleU9iaiA9IGF3YWl0IHBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogYml0Z29HcGdQdWJLZXkgfSk7XG4gICAgY29uc3QgYml0Z29QayA9IGF3YWl0IE1QU0NvbW1zLmV4dHJhY3RFZDI1NTE5UHVibGljS2V5KGJpdGdvS2V5T2JqKTtcblxuICAgIGNvbnN0IGNvdW50ZXJQYXJ0eUtleU9iaiA9IGF3YWl0IHBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogY291bnRlclBhcnR5R3BnUHViS2V5IH0pO1xuICAgIGNvbnN0IGNvdW50ZXJQYXJ0eVBrID0gYXdhaXQgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlQdWJsaWNLZXkoY291bnRlclBhcnR5S2V5T2JqKTtcblxuICAgIGNvbnN0IGRrZyA9IG5ldyBFZGRzYU1QU0RrZy5ES0coMywgMiwgcGFydHlJZCk7XG4gICAgYXdhaXQgZGtnLmluaXREa2cob3duU2ssIFtjb3VudGVyUGFydHlQaywgYml0Z29Qa10pO1xuXG4gICAgY29uc3QgbXNnMSA9IGRrZy5nZXRGaXJzdE1lc3NhZ2UoKTtcbiAgICBjb25zdCBzaWduZWRNc2cxID0gYXdhaXQgTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20obXNnMS5wYXlsb2FkKSwgZ3BnUHJ2S2V5KTtcblxuICAgIGNvbnN0IHNlc3Npb25QYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZGtnU2Vzc2lvbjogZGtnLmdldFNlc3Npb24oKSxcbiAgICAgIG93bk1zZ1BheWxvYWQ6IEJ1ZmZlci5mcm9tKG1zZzEucGF5bG9hZCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgb3duTXNnRnJvbTogbXNnMS5mcm9tLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICBpbnB1dDogc2Vzc2lvblBheWxvYWQsXG4gICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhOiBgJHtFZGRzYU1QQ3YyVXRpbHMuTVBTX0RLR19LRVlHRU5fUk9VTkQxX1NUQVRFfToke3BhcnR5SWR9YCxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAxLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgc2lnbmVkTXNnMSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiB9O1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIFJvdW5kMVNoYXJlXG4gIGFzeW5jIGNyZWF0ZU9mZmxpbmVSb3VuZDFTaGFyZShwYXJhbXM6IHtcbiAgICB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICBwcnY6IHN0cmluZztcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkUHJ2Pzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTx7XG4gICAgc2lnbmF0dXJlU2hhcmVSb3VuZDE6IFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICAgIHVzZXJHcGdQdWJLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uOiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkVXNlckdwZ1BydktleTogc3RyaW5nO1xuICB9PiB7XG4gICAgY29uc3QgeyBwcnYsIHdhbGxldFBhc3NwaHJhc2UsIHR4UmVxdWVzdCwgZW5jcnlwdGVkUHJ2IH0gPSBwYXJhbXM7XG4gICAgY29uc3QgeyBzaWduYWJsZUhleCwgZGVyaXZhdGlvblBhdGggfSA9IHRoaXMuZ2V0U2lnbmFibGVIZXhBbmREZXJpdmF0aW9uUGF0aChcbiAgICAgIHR4UmVxdWVzdCxcbiAgICAgICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0J1xuICAgICk7XG4gICAgY29uc3QgYWRhdGEgPSBgJHtzaWduYWJsZUhleH06JHtkZXJpdmF0aW9uUGF0aH1gO1xuXG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gQnVmZmVyLmZyb20ocHJ2LCAnYmFzZTY0Jyk7XG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignZWQyNTUxOScpO1xuICAgIGNvbnN0IHVzZXJHcGdQcnZLZXkgPSBhd2FpdCBwZ3AucmVhZFByaXZhdGVLZXkoeyBhcm1vcmVkS2V5OiB1c2VyR3BnS2V5LnByaXZhdGVLZXkgfSk7XG5cbiAgICBjb25zdCB1c2VyRHNnID0gbmV3IEVkZHNhTVBTRHNnLkRTRyhNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICAgIGF3YWl0IHVzZXJEc2cuaW5pdERzZyh1c2VyS2V5U2hhcmUsIEJ1ZmZlci5mcm9tKHNpZ25hYmxlSGV4LCAnaGV4JyksIGRlcml2YXRpb25QYXRoLCBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPKTtcbiAgICBjb25zdCB1c2VyTXNnMSA9IHVzZXJEc2cuZ2V0Rmlyc3RNZXNzYWdlKCk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZDEgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kT25lKHVzZXJNc2cxLCB1c2VyR3BnUHJ2S2V5KTtcbiAgICBjb25zdCBzZXNzaW9uUGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGRzZ1Nlc3Npb246IHVzZXJEc2cuZ2V0U2Vzc2lvbigpLFxuICAgICAgdXNlck1zZ1BheWxvYWQ6IEJ1ZmZlci5mcm9tKHVzZXJNc2cxLnBheWxvYWQpLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyR3BnUHViS2V5ID0gdXNlckdwZ0tleS5wdWJsaWNLZXk7XG5cbiAgICBjb25zdCB1c2VWMiA9IGVuY3J5cHRlZFBydiAhPT0gdW5kZWZpbmVkICYmIGlzVjJFbnZlbG9wZShlbmNyeXB0ZWRQcnYpO1xuICAgIGlmICh1c2VWMikge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24od2FsbGV0UGFzc3BocmFzZSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KFxuICAgICAgICAgIHNlc3Npb25QYXlsb2FkLFxuICAgICAgICAgIGAke0VkZHNhTVBDdjJVdGlscy5NUFNfRFNHX1NJR05JTkdfUk9VTkQxX1NUQVRFfToke2FkYXRhfWBcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkVXNlckdwZ1BydktleSA9IGF3YWl0IHNlc3Npb24uZW5jcnlwdChcbiAgICAgICAgICB1c2VyR3BnS2V5LnByaXZhdGVLZXksXG4gICAgICAgICAgYCR7RWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVl9OiR7YWRhdGF9YFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyBzaWduYXR1cmVTaGFyZVJvdW5kMSwgdXNlckdwZ1B1YktleSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgZW5jcnlwdGVkVXNlckdwZ1BydktleSB9O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2Vzc2lvbi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICBpbnB1dDogc2Vzc2lvblBheWxvYWQsXG4gICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhOiBgJHtFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1JPVU5EMV9TVEFURX06JHthZGF0YX1gLFxuICAgICAgZW5jcnlwdGlvblZlcnNpb246IDEsXG4gICAgfSk7XG4gICAgY29uc3QgZW5jcnlwdGVkVXNlckdwZ1BydktleSA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICBpbnB1dDogdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YTogYCR7RWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVl9OiR7YWRhdGF9YCxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAxLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgc2lnbmF0dXJlU2hhcmVSb3VuZDEsIHVzZXJHcGdQdWJLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgfTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBSb3VuZDJTaGFyZVxuICBhc3luYyBjcmVhdGVPZmZsaW5lUm91bmQyU2hhcmUocGFyYW1zOiB7XG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3Q7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGJpdGdvUHVibGljR3BnS2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkVXNlckdwZ1BydktleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFJvdW5kMVNlc3Npb246IHN0cmluZztcbiAgfSk6IFByb21pc2U8e1xuICAgIHNpZ25hdHVyZVNoYXJlUm91bmQyOiBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCB7IHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGJpdGdvUHVibGljR3BnS2V5LCB0eFJlcXVlc3QgfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IHsgc2lnbmFibGVIZXgsIGRlcml2YXRpb25QYXRoIH0gPSB0aGlzLmdldFNpZ25hYmxlSGV4QW5kRGVyaXZhdGlvblBhdGgoXG4gICAgICB0eFJlcXVlc3QsXG4gICAgICAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCdcbiAgICApO1xuICAgIGNvbnN0IGFkYXRhID0gYCR7c2lnbmFibGVIZXh9OiR7ZGVyaXZhdGlvblBhdGh9YDtcblxuICAgIGNvbnN0IHVzZVYyID0gaXNWMkVudmVsb3BlKGVuY3J5cHRlZFJvdW5kMVNlc3Npb24pO1xuXG4gICAgY29uc3QgeyBiaXRnb0dwZ0tleSwgdXNlckdwZ1BydktleSB9ID0gYXdhaXQgdGhpcy5nZXRCaXRnb0FuZFVzZXJHcGdLZXlzKFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhLFxuICAgICAgRWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVlcbiAgICApO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25zID0gdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucztcbiAgICBhc3NlcnQoQXJyYXkuaXNBcnJheSh0cmFuc2FjdGlvbnMpICYmIHRyYW5zYWN0aW9ucy5sZW5ndGggPT09IDEsICd0eFJlcXVlc3QgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHRyYW5zYWN0aW9uJyk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVzID0gdHJhbnNhY3Rpb25zWzBdLnNpZ25hdHVyZVNoYXJlcztcbiAgICBhc3NlcnQoc2lnbmF0dXJlU2hhcmVzLCAnTWlzc2luZyBzaWduYXR1cmUgc2hhcmVzIGluIHJvdW5kIDEgdHhSZXF1ZXN0Jyk7XG5cbiAgICBjb25zdCBiaXRnb1NoYXJlUm91bmRPbmUgPSBnZXRCaXRnb1NpZ25hdHVyZVNoYXJlKHNpZ25hdHVyZVNoYXJlcywgU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsICdyb3VuZDFPdXRwdXQnKTtcbiAgICBjb25zdCBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUgPSBkZWNvZGVXaXRoQ29kZWMoXG4gICAgICBFZGRzYU1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFPdXRwdXQsXG4gICAgICBKU09OLnBhcnNlKGJpdGdvU2hhcmVSb3VuZE9uZS5zaGFyZSksXG4gICAgICAnVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLidcbiAgICApO1xuXG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZS50eXBlICE9PSAncm91bmQxT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29EZXNlcmlhbGl6ZWRNc2cxID0gYXdhaXQgdmVyaWZ5UGVlck1lc3NhZ2VSb3VuZE9uZShwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUsIGJpdGdvR3BnS2V5KTtcblxuICAgIHRoaXMudmFsaWRhdGVBZGF0YShhZGF0YSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgRWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19ST1VORDFfU1RBVEUpO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkUm91bmQxU2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICBpbnB1dDogZW5jcnlwdGVkUm91bmQxU2Vzc2lvbixcbiAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBkc2dTZXNzaW9uLCB1c2VyTXNnUGF5bG9hZCB9ID0gSlNPTi5wYXJzZShkZWNyeXB0ZWRSb3VuZDFTZXNzaW9uKSBhcyB7XG4gICAgICBkc2dTZXNzaW9uOiBzdHJpbmc7XG4gICAgICB1c2VyTXNnUGF5bG9hZDogc3RyaW5nO1xuICAgIH07XG5cbiAgICBjb25zdCB1c2VyRHNnID0gbmV3IEVkZHNhTVBTRHNnLkRTRyhNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICAgIGF3YWl0IHVzZXJEc2cucmVzdG9yZVNlc3Npb24oZHNnU2Vzc2lvbik7XG4gICAgY29uc3QgdXNlck1zZzE6IE1QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2UgPSB7XG4gICAgICBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICBwYXlsb2FkOiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh1c2VyTXNnUGF5bG9hZCwgJ2Jhc2U2NCcpKSxcbiAgICB9O1xuXG4gICAgY29uc3QgW3VzZXJNc2cyXSA9IHVzZXJEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbdXNlck1zZzEsIGJpdGdvRGVzZXJpYWxpemVkTXNnMV0pO1xuICAgIGFzc2VydCh1c2VyTXNnMiwgJ0RTRyBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzIHByb2R1Y2VkIG5vIHJvdW5kLTIgb3V0cHV0Jyk7XG5cbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMiA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRUd28odXNlck1zZzIsIHVzZXJHcGdQcnZLZXkpO1xuICAgIGNvbnN0IHNlc3Npb25QYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZHNnU2Vzc2lvbjogdXNlckRzZy5nZXRTZXNzaW9uKCksXG4gICAgICB1c2VyTXNnUGF5bG9hZDogQnVmZmVyLmZyb20odXNlck1zZzIucGF5bG9hZCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIH0pO1xuXG4gICAgaWYgKHVzZVYyKSB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5jcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbih3YWxsZXRQYXNzcGhyYXNlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZFJvdW5kMlNlc3Npb24gPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQoXG4gICAgICAgICAgc2Vzc2lvblBheWxvYWQsXG4gICAgICAgICAgYCR7RWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19ST1VORDJfU1RBVEV9OiR7YWRhdGF9YFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyBzaWduYXR1cmVTaGFyZVJvdW5kMiwgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiB9O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2Vzc2lvbi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICBpbnB1dDogc2Vzc2lvblBheWxvYWQsXG4gICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhOiBgJHtFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1JPVU5EMl9TVEFURX06JHthZGF0YX1gLFxuICAgICAgZW5jcnlwdGlvblZlcnNpb246IDEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBzaWduYXR1cmVTaGFyZVJvdW5kMiwgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiB9O1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIFJvdW5kM1NoYXJlXG4gIGFzeW5jIGNyZWF0ZU9mZmxpbmVSb3VuZDNTaGFyZShwYXJhbXM6IHtcbiAgICB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgYml0Z29QdWJsaWNHcGdLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbjogc3RyaW5nO1xuICB9KTogUHJvbWlzZTx7XG4gICAgc2lnbmF0dXJlU2hhcmVSb3VuZDM6IFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICB9PiB7XG4gICAgY29uc3QgeyB3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLCBiaXRnb1B1YmxpY0dwZ0tleSwgdHhSZXF1ZXN0IH0gPSBwYXJhbXM7XG5cbiAgICBjb25zdCB7IHNpZ25hYmxlSGV4LCBkZXJpdmF0aW9uUGF0aCB9ID0gdGhpcy5nZXRTaWduYWJsZUhleEFuZERlcml2YXRpb25QYXRoKFxuICAgICAgdHhSZXF1ZXN0LFxuICAgICAgJ1VuYWJsZSB0byBmaW5kIHRyYW5zYWN0aW9ucyBpbiB0eFJlcXVlc3QnXG4gICAgKTtcbiAgICBjb25zdCBhZGF0YSA9IGAke3NpZ25hYmxlSGV4fToke2Rlcml2YXRpb25QYXRofWA7XG5cbiAgICBjb25zdCB7IGJpdGdvR3BnS2V5LCB1c2VyR3BnUHJ2S2V5IH0gPSBhd2FpdCB0aGlzLmdldEJpdGdvQW5kVXNlckdwZ0tleXMoXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGEsXG4gICAgICBFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1VTRVJfR1BHX0tFWVxuICAgICk7XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSB0eFJlcXVlc3QudHJhbnNhY3Rpb25zO1xuICAgIGFzc2VydChBcnJheS5pc0FycmF5KHRyYW5zYWN0aW9ucykgJiYgdHJhbnNhY3Rpb25zLmxlbmd0aCA9PT0gMSwgJ3R4UmVxdWVzdCBtdXN0IGhhdmUgZXhhY3RseSBvbmUgdHJhbnNhY3Rpb24nKTtcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZXMgPSB0cmFuc2FjdGlvbnNbMF0uc2lnbmF0dXJlU2hhcmVzO1xuICAgIGFzc2VydChzaWduYXR1cmVTaGFyZXMsICdNaXNzaW5nIHNpZ25hdHVyZSBzaGFyZXMgaW4gcm91bmQgMiB0eFJlcXVlc3QnKTtcblxuICAgIGNvbnN0IGJpdGdvU2hhcmVSb3VuZFR3byA9IGdldEJpdGdvU2lnbmF0dXJlU2hhcmUoc2lnbmF0dXJlU2hhcmVzLCBTaWduYXR1cmVTaGFyZVR5cGUuVVNFUiwgJ3JvdW5kMk91dHB1dCcpO1xuXG4gICAgY29uc3QgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kVHdvID0gZGVjb2RlV2l0aENvZGVjKFxuICAgICAgRWRkc2FNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQyT3V0cHV0LFxuICAgICAgSlNPTi5wYXJzZShiaXRnb1NoYXJlUm91bmRUd28uc2hhcmUpLFxuICAgICAgJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nXG4gICAgKTtcblxuICAgIGlmIChwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28udHlwZSAhPT0gJ3JvdW5kMk91dHB1dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdGdvRGVzZXJpYWxpemVkTXNnMiA9IGF3YWl0IHZlcmlmeVBlZXJNZXNzYWdlUm91bmRUd28ocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kVHdvLCBiaXRnb0dwZ0tleSk7XG5cbiAgICB0aGlzLnZhbGlkYXRlQWRhdGEoYWRhdGEsIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24sIEVkZHNhTVBDdjJVdGlscy5NUFNfRFNHX1NJR05JTkdfUk9VTkQyX1NUQVRFKTtcblxuICAgIGNvbnN0IGRlY3J5cHRlZFJvdW5kMlNlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgaW5wdXQ6IGVuY3J5cHRlZFJvdW5kMlNlc3Npb24sXG4gICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgZHNnU2Vzc2lvbiwgdXNlck1zZ1BheWxvYWQgfSA9IEpTT04ucGFyc2UoZGVjcnlwdGVkUm91bmQyU2Vzc2lvbikgYXMge1xuICAgICAgZHNnU2Vzc2lvbjogc3RyaW5nO1xuICAgICAgdXNlck1zZ1BheWxvYWQ6IHN0cmluZztcbiAgICB9O1xuXG4gICAgY29uc3QgdXNlckRzZyA9IG5ldyBFZGRzYU1QU0RzZy5EU0coTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgICBhd2FpdCB1c2VyRHNnLnJlc3RvcmVTZXNzaW9uKGRzZ1Nlc3Npb24pO1xuICAgIGNvbnN0IHVzZXJNc2cyOiBNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlID0ge1xuICAgICAgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICAgICAgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odXNlck1zZ1BheWxvYWQsICdiYXNlNjQnKSksXG4gICAgfTtcblxuICAgIGNvbnN0IFt1c2VyTXNnM10gPSB1c2VyRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3VzZXJNc2cyLCBiaXRnb0Rlc2VyaWFsaXplZE1zZzJdKTtcbiAgICBhc3NlcnQodXNlck1zZzMsICdEU0cgaGFuZGxlSW5jb21pbmdNZXNzYWdlcyBwcm9kdWNlZCBubyByb3VuZC0zIG91dHB1dCcpO1xuXG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZDMgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVGhyZWUodXNlck1zZzMsIHVzZXJHcGdQcnZLZXkpO1xuXG4gICAgcmV0dXJuIHsgc2lnbmF0dXJlU2hhcmVSb3VuZDMgfTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIHNpZ25FZGRzYU1QQ3YyVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICBwYXJhbXM6IFRTU1BhcmFtcyB8IFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gICAgZXh0ZXJuYWxTaWduZXJFZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRvcjogQ3VzdG9tRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJFZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRvcjogQ3VzdG9tRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJFZGRzYU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRvcjogQ3VzdG9tRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlID0gUmVxdWVzdFR5cGUudHhcbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBjb25zdCB7IHR4UmVxdWVzdCwgcmVxSWQgfSA9IHBhcmFtcztcblxuICAgIC8vIFRPRE8oV1AtMjE3Nik6IEFkZCBzdXBwb3J0IGZvciBtZXNzYWdlIHNpZ25pbmdcbiAgICBhc3NlcnQoXG4gICAgICByZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHgsXG4gICAgICAnT25seSB0cmFuc2FjdGlvbiBzaWduaW5nIGlzIHN1cHBvcnRlZCBmb3IgZXh0ZXJuYWwgc2lnbmVyLCBnb3Q6ICcgKyByZXF1ZXN0VHlwZVxuICAgICk7XG5cbiAgICBsZXQgdHhSZXF1ZXN0UmVzb2x2ZWQ6IFR4UmVxdWVzdDtcbiAgICBpZiAodHlwZW9mIHR4UmVxdWVzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkID0gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHR4UmVxdWVzdCwgcmVxSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZCA9IHR4UmVxdWVzdDtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9IGF3YWl0IHRoaXMucGlja0JpdGdvUHViR3BnS2V5Rm9yU2lnbmluZyhcbiAgICAgIHRydWUsXG4gICAgICByZXFJZCxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLmVudGVycHJpc2VJZCxcbiAgICAgIHRydWVcbiAgICApO1xuXG4gICAgaWYgKCFiaXRnb1B1YmxpY0dwZ0tleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIEJpdEdvIEdQRyBrZXkgZm9yIE1QQ3YyJyk7XG4gICAgfVxuXG4gICAgLy8gcm91bmQgMVxuICAgIGNvbnN0IHsgc2lnbmF0dXJlU2hhcmVSb3VuZDEsIHVzZXJHcGdQdWJLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgfSA9XG4gICAgICBhd2FpdCBleHRlcm5hbFNpZ25lckVkZHNhTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdG9yKHsgdHhSZXF1ZXN0OiB0eFJlcXVlc3RSZXNvbHZlZCB9KTtcbiAgICBjb25zdCByb3VuZDFUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQxXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdQdWJLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICByZXFJZFxuICAgICk7XG5cbiAgICAvLyByb3VuZCAyXG4gICAgY29uc3QgeyBzaWduYXR1cmVTaGFyZVJvdW5kMiwgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiB9ID0gYXdhaXQgZXh0ZXJuYWxTaWduZXJFZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRvcih7XG4gICAgICB0eFJlcXVlc3Q6IHJvdW5kMVR4UmVxdWVzdCxcbiAgICAgIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sXG4gICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXk6IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgfSk7XG4gICAgY29uc3Qgcm91bmQyVHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kMl0sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnUHViS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcmVxSWRcbiAgICApO1xuICAgIGFzc2VydChcbiAgICAgIHJvdW5kMlR4UmVxdWVzdC50cmFuc2FjdGlvbnMgJiYgcm91bmQyVHhSZXF1ZXN0LnRyYW5zYWN0aW9uc1swXS5zaWduYXR1cmVTaGFyZXMsXG4gICAgICAnTWlzc2luZyBzaWduYXR1cmUgc2hhcmVzIGluIHJvdW5kIDIgdHhSZXF1ZXN0J1xuICAgICk7XG5cbiAgICAvLyByb3VuZCAzXG4gICAgY29uc3QgeyBzaWduYXR1cmVTaGFyZVJvdW5kMyB9ID0gYXdhaXQgZXh0ZXJuYWxTaWduZXJFZGRzYU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRvcih7XG4gICAgICB0eFJlcXVlc3Q6IHJvdW5kMlR4UmVxdWVzdCxcbiAgICAgIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24sXG4gICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXk6IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgfSk7XG4gICAgYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kM10sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnUHViS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcmVxSWRcbiAgICApO1xuXG4gICAgcmV0dXJuIHNlbmRUeFJlcXVlc3QodGhpcy5iaXRnbywgdHhSZXF1ZXN0UmVzb2x2ZWQud2FsbGV0SWQsIHR4UmVxdWVzdFJlc29sdmVkLnR4UmVxdWVzdElkLCByZXF1ZXN0VHlwZSwgcmVxSWQpO1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIHJldHJvZml0XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldFVzZXJBbmRCYWNrdXBTZXNzaW9uKHJldHJvZml0PzogRGVjcnlwdGVkUmV0cm9maXRQYXlsb2FkKTogUHJvbWlzZTx7XG4gICAgdXNlckRrZzogRWRkc2FNUFNEa2cuREtHO1xuICAgIGJhY2t1cERrZzogRWRkc2FNUFNEa2cuREtHO1xuICB9PiB7XG4gICAgaWYgKHJldHJvZml0KSB7XG4gICAgICBjb25zdCB7IHVzZXJSZXRyb2ZpdERhdGEsIGJhY2t1cFJldHJvZml0RGF0YSB9ID0gYXdhaXQgdGhpcy5nZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleXMoe1xuICAgICAgICBtcGN2MVVzZXJLZXlTaGFyZTogcmV0cm9maXQuZGVjcnlwdGVkVXNlcktleSxcbiAgICAgICAgbXBjdjFCYWNrdXBLZXlTaGFyZTogcmV0cm9maXQuZGVjcnlwdGVkQmFja3VwS2V5LFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2VyRGtnOiBuZXcgRWRkc2FNUFNEa2cuREtHKDMsIDIsIE1QQ3YyUGFydGllc0VudW0uVVNFUiwgdXNlclJldHJvZml0RGF0YSksXG4gICAgICAgIGJhY2t1cERrZzogbmV3IEVkZHNhTVBTRGtnLkRLRygzLCAyLCBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCwgYmFja3VwUmV0cm9maXREYXRhKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB1c2VyRGtnOiBuZXcgRWRkc2FNUFNEa2cuREtHKDMsIDIsIE1QQ3YyUGFydGllc0VudW0uVVNFUiksXG4gICAgICBiYWNrdXBEa2c6IG5ldyBFZGRzYU1QU0RrZy5ES0coMywgMiwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBnZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleXMocGFyYW1zOiB7IG1wY3YxVXNlcktleVNoYXJlOiBzdHJpbmc7IG1wY3YxQmFja3VwS2V5U2hhcmU6IHN0cmluZyB9KTogUHJvbWlzZTx7XG4gICAgdXNlclJldHJvZml0RGF0YTogTVBTVHlwZXMuRWRkc2FSZXRyb2ZpdERhdGE7XG4gICAgYmFja3VwUmV0cm9maXREYXRhOiBNUFNUeXBlcy5FZGRzYVJldHJvZml0RGF0YTtcbiAgfT4ge1xuICAgIGNvbnN0IE1QQyA9IGF3YWl0IGdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcbiAgICBjb25zdCB1c2VyUmV0cm9maXREYXRhID0gRWRkc2FNUEN2MlV0aWxzLmdldE1wY1YyUmV0cm9maXREYXRhRnJvbU1wY1YxS2V5KFxuICAgICAgcGFyYW1zLm1wY3YxVXNlcktleVNoYXJlLFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICAgICAgTVBDXG4gICAgKTtcbiAgICBjb25zdCBiYWNrdXBSZXRyb2ZpdERhdGEgPSBFZGRzYU1QQ3YyVXRpbHMuZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXkoXG4gICAgICBwYXJhbXMubXBjdjFCYWNrdXBLZXlTaGFyZSxcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLFxuICAgICAgTVBDXG4gICAgKTtcblxuICAgIGFzc2VydChcbiAgICAgIHVzZXJSZXRyb2ZpdERhdGEuZXhwZWN0ZWRQayA9PT0gYmFja3VwUmV0cm9maXREYXRhLmV4cGVjdGVkUGssXG4gICAgICAnTVBDdjEgdXNlciBhbmQgYmFja3VwIGtleXMgY29tYmluZSB0byBkaWZmZXJlbnQgYWdncmVnYXRlIHB1YmxpYyBrZXlzJ1xuICAgICk7XG4gICAgYXNzZXJ0KFxuICAgICAgdXNlclJldHJvZml0RGF0YS5jaGFpbkNvZGUgPT09IGJhY2t1cFJldHJvZml0RGF0YS5jaGFpbkNvZGUsXG4gICAgICAnTVBDdjEgdXNlciBhbmQgYmFja3VwIGtleXMgY29tYmluZSB0byBkaWZmZXJlbnQgY2hhaW4gY29kZXMnXG4gICAgKTtcblxuICAgIHJldHVybiB7IHVzZXJSZXRyb2ZpdERhdGEsIGJhY2t1cFJldHJvZml0RGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgVXNlciBvciBCYWNrdXAgTVBDdjEgU2lnbmluZ01hdGVyaWFsIHRvIEVkZHNhUmV0cm9maXREYXRhIG5lZWRlZCBieSBNUEN2MiBES0cuXG4gICAqXG4gICAqIFB1YmxpYyBzdGF0aWMgc2luZ2xlLXBhcnR5IGhlbHBlciBmb3IgYWlyLWdhcHBlZCBPVkM6IG5vIEJpdEdvIGluc3RhbmNlIGFuZCBub1xuICAgKiBzZWNvbmQtcGFydHkgc2hhcmUgcmVxdWlyZWQuIFVubGlrZSBFQ0RTQSdzIGVxdWl2YWxlbnQgdGhpcyBpcyBhc3luYyBiZWNhdXNlXG4gICAqIEVkRFNBIE1QQyBpbml0aWFsaXphdGlvbiBpcyBhc3luYy5cbiAgICpcbiAgICogQHBhcmFtIGRlY3J5cHRlZEtleXNoYXJlIC0gTVBDdjEgZGVjcnlwdGVkIHNpZ25pbmcgbWF0ZXJpYWwgZm9yIHVzZXIgb3IgYmFja3VwIGFzIGEgSlNPTiBzdHJpbmdcbiAgICogQHBhcmFtIHBhcnR5SWQgLSBUaGUgcGFydHkgSUQgb2YgdGhlIE1QQ3YxIGtleXNoYXJlXG4gICAqIEByZXR1cm5zIFRoZSByZXRyb2ZpdCBkYXRhIG5lZWRlZCB0byBzdGFydCBhbiBNUEN2MiBES0cgc2Vzc2lvblxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldEtleURhdGFGb3JSZXRyb2ZpdChcbiAgICBkZWNyeXB0ZWRLZXlzaGFyZTogc3RyaW5nLFxuICAgIHBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQIHwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSXG4gICk6IFByb21pc2U8TVBTVHlwZXMuRWRkc2FSZXRyb2ZpdERhdGE+IHtcbiAgICBjb25zdCBtcGMgPSBhd2FpdCBnZXRJbml0aWFsaXplZE1wY0luc3RhbmNlKCk7XG4gICAgcmV0dXJuIEVkZHNhTVBDdjJVdGlscy5nZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleShkZWNyeXB0ZWRLZXlzaGFyZSwgcGFydHlJZCwgbXBjKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldE1wY1YyUmV0cm9maXREYXRhRnJvbU1wY1YxS2V5KFxuICAgIG1wY3YxUGFydHlLZXlTaGFyZTogc3RyaW5nLFxuICAgIG1wY3YxUGFydHlJbmRleDogTVBDdjJQYXJ0aWVzRW51bS5VU0VSIHwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsXG4gICAgbXBjOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGdldEluaXRpYWxpemVkTXBjSW5zdGFuY2U+PlxuICApOiBNUFNUeXBlcy5FZGRzYVJldHJvZml0RGF0YSB7XG4gICAgY29uc3Qgc2lnbmluZ01hdGVyaWFsOiBTaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKG1wY3YxUGFydHlLZXlTaGFyZSk7XG4gICAgYXNzZXJ0KHNpZ25pbmdNYXRlcmlhbC51U2hhcmUsICdNUEN2MSBrZXkgbWF0ZXJpYWwgbWlzc2luZyB1U2hhcmUnKTtcbiAgICBhc3NlcnQoc2lnbmluZ01hdGVyaWFsLmJpdGdvWVNoYXJlLCAnTVBDdjEga2V5IG1hdGVyaWFsIG1pc3NpbmcgYml0Z29ZU2hhcmUnKTtcblxuICAgIGxldCBwU2hhcmU7XG4gICAgc3dpdGNoIChtcGN2MVBhcnR5SW5kZXgpIHtcbiAgICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5VU0VSOlxuICAgICAgICBhc3NlcnQoc2lnbmluZ01hdGVyaWFsLmJhY2t1cFlTaGFyZSwgJ1VzZXIgTVBDdjEga2V5IG1hdGVyaWFsIG1pc3NpbmcgYmFja3VwWVNoYXJlJyk7XG4gICAgICAgIHBTaGFyZSA9IG1wYy5rZXlDb21iaW5lKHNpZ25pbmdNYXRlcmlhbC51U2hhcmUsIFtcbiAgICAgICAgICBzaWduaW5nTWF0ZXJpYWwuYml0Z29ZU2hhcmUsXG4gICAgICAgICAgc2lnbmluZ01hdGVyaWFsLmJhY2t1cFlTaGFyZSxcbiAgICAgICAgXSkucFNoYXJlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVA6XG4gICAgICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwudXNlcllTaGFyZSwgJ0JhY2t1cCBNUEN2MSBrZXkgbWF0ZXJpYWwgbWlzc2luZyB1c2VyWVNoYXJlJyk7XG4gICAgICAgIHBTaGFyZSA9IG1wYy5rZXlDb21iaW5lKHNpZ25pbmdNYXRlcmlhbC51U2hhcmUsIFtcbiAgICAgICAgICBzaWduaW5nTWF0ZXJpYWwuYml0Z29ZU2hhcmUsXG4gICAgICAgICAgc2lnbmluZ01hdGVyaWFsLnVzZXJZU2hhcmUsXG4gICAgICAgIF0pLnBTaGFyZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFydGljaXBhbnQgaW5kZXgnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc19pXzA6IHBTaGFyZS51LFxuICAgICAgZXhwZWN0ZWRQazogcFNoYXJlLnksXG4gICAgICBjaGFpbkNvZGU6IHBTaGFyZS5jaGFpbmNvZGUsXG4gICAgfTtcbiAgfVxuXG4gIC8vICNlbmRyZWdpb25cbn1cblxuLyoqXG4gKiBEZXRlY3Qgd2hldGhlciBhbiBlbmNyeXB0ZWQga2V5Y2FyZCBjb250YWlucyBNUEN2MSBzaWduaW5nIG1hdGVyaWFsLlxuICpcbiAqIERlY3J5cHRzIHRoZSBrZXljYXJkIGFuZCBjaGVja3MgZm9yIHRoZSBKU09OIHNoYXBlIHByb2R1Y2VkIGJ5IHRoZSBNUEN2MSBUU1NcbiAqIGtleS1nZW5lcmF0aW9uIGZsb3cgKHVTaGFyZS5zZWVkICsgYml0Z29ZU2hhcmUudSArIGJhY2t1cFlTaGFyZS51IC8gdXNlcllTaGFyZS51KS5cbiAqIFJldHVybnMgZmFsc2UgZm9yIE1QQ3YyIENCT1Iga2V5Y2FyZHMsIHdyb25nIHBhc3N3b3Jkcywgb3IgYW55IGRlY3J5cHRpb24gZXJyb3IuXG4gKlxuICogQHBhcmFtIGVuY3J5cHRlZEtleVNoYXJlIGVuY3J5cHRlZCB1c2VyIG9yIGJhY2t1cCBrZXljYXJkXG4gKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSBwYXNzcGhyYXNlIHVzZWQgdG8gZW5jcnlwdCB0aGUga2V5Y2FyZFxuICogQHBhcmFtIGJpdGdvIG9wdGlvbmFsIEJpdEdvQmFzZSBpbnN0YW5jZTsgd2hlbiBwcm92aWRlZCwgZGVjcnlwdHMgdmlhXG4gKiAgIGJpdGdvLmRlY3J5cHQgKHN1cHBvcnRzIGJvdGggdjEgU0pDTCBhbmQgdjIgQXJnb24yaWQgZW52ZWxvcGVzKTtcbiAqICAgd2hlbiBhYnNlbnQsIGZhbGxzIGJhY2sgdG8gc2pjbC5kZWNyeXB0ICh2MSBvbmx5KVxuICovXG5mdW5jdGlvbiBwYXJzZUVkZHNhTXBjVjFNYXRlcmlhbChkZWNyeXB0ZWQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICB0cnkge1xuICAgIGNvbnN0IG0gPSBKU09OLnBhcnNlKGRlY3J5cHRlZCk7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG0/LnVTaGFyZT8uc2VlZCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIHR5cGVvZiBtPy5iaXRnb1lTaGFyZT8udSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICh0eXBlb2YgbT8uYmFja3VwWVNoYXJlPy51ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbT8udXNlcllTaGFyZT8udSA9PT0gJ3N0cmluZycpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZGVjcnlwdGVkO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTm90IEpTT04g4oaSIE1QQ3YyIENCT1JcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzRWRkc2FNcGNWMVNpZ25pbmdNYXRlcmlhbChcbiAgZW5jcnlwdGVkS2V5U2hhcmU6IHN0cmluZyxcbiAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nLFxuICBiaXRnbz86IEJpdEdvQmFzZVxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGRlY3J5cHRlZCA9IGJpdGdvXG4gICAgPyBhd2FpdCBiaXRnby5kZWNyeXB0KHsgaW5wdXQ6IGVuY3J5cHRlZEtleVNoYXJlLCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KVxuICAgIDogc2pjbC5kZWNyeXB0KHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZEtleVNoYXJlKTtcbiAgcmV0dXJuIHBhcnNlRWRkc2FNcGNWMU1hdGVyaWFsKGRlY3J5cHRlZCkgIT09IG51bGw7XG59XG5cbi8qKlxuICogR2V0IEVkRFNBIE1QQ3YyIHJlY292ZXJ5IGtleSBzaGFyZXMgZnJvbSBlbmNyeXB0ZWQgcmVkdWNlZCB1c2VyIGFuZCBiYWNrdXAga2V5cy5cbiAqXG4gKiBUaGUgZW5jcnlwdGVkIGlucHV0cyBhcmUgdGhlIGByZWR1Y2VkRW5jcnlwdGVkUHJ2YCB2YWx1ZXMgc3RvcmVkIG9uIEVkRFNBIE1QQ3YyXG4gKiBrZXkgY2FyZHMuIFRoZXkgZGVjcnlwdCBlaXRoZXIgdG8gQ0JPUi1lbmNvZGVkIHJlZHVjZWQgc2hhcmVzIChsZWdhY3kgY2FyZHMpIG9yIHRvXG4gKiB0aGUgdmVyc2lvbmVkIHNhZmUtcm9vdCBlbnZlbG9wZSBgeyB2ZXJzaW9uOiAxLCBwcnZLZXlTaGFyZSwgdnJmIH1gLCB3aGVyZSB0aGUgc2lnbmluZ1xuICogc2hhcmUgc3RheXMgcmVkdWNlZCBhbmQgYHZyZmAgaXMgdGhlIGNvbXBsZXRlIHNlcmlhbGl6ZWQgVlJGIGtleXNoYXJlLiBMZWdhY3kgY2FyZHNcbiAqIGhhdmUgbm8gVlJGIG1hdGVyaWFsIGFuZCByZWNvdmVyIGFzIGJlZm9yZS5cbiAqXG4gKiBAcGFyYW0gZW5jcnlwdGVkVXNlcktleSBlbmNyeXB0ZWQgRWREU0EgTVBDdjIgcmVkdWNlZCB1c2VyIGtleVxuICogQHBhcmFtIGVuY3J5cHRlZEJhY2t1cEtleSBlbmNyeXB0ZWQgRWREU0EgTVBDdjIgcmVkdWNlZCBiYWNrdXAga2V5XG4gKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSBwYXNzd29yZCBmb3IgdXNlciBhbmQgYmFja3VwIGtleXNcbiAqIEByZXR1cm5zIEVkRFNBIE1QQ3YyIHJlY292ZXJ5IGtleSBzaGFyZXMgYW5kIGNvbW1vbiBrZXljaGFpblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RWRkc2FNcGNWMlJlY292ZXJ5S2V5U2hhcmVzRnJvbVJlZHVjZWRLZXkoXG4gIGVuY3J5cHRlZFVzZXJLZXk6IHN0cmluZyxcbiAgZW5jcnlwdGVkQmFja3VwS2V5OiBzdHJpbmcsXG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmcsXG4gIGJpdGdvPzogQml0R29CYXNlXG4pOiBQcm9taXNlPEVkZHNhTVBDdjJSZWNvdmVyeUtleVNoYXJlcz4ge1xuICBjb25zdCBkZWNvZGVLZXkgPSBhc3luYyAoXG4gICAgZW5jcnlwdGVkS2V5OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx7IHJlZHVjZWQ6IE1QU1R5cGVzLkVkZHNhUmVkdWNlZEtleVNoYXJlOyB2cmZLZXlTaGFyZT86IEJ1ZmZlciB9PiA9PiB7XG4gICAgY29uc3QgZGVjcnlwdGVkID0gYml0Z29cbiAgICAgID8gYXdhaXQgYml0Z28uZGVjcnlwdCh7IGlucHV0OiBlbmNyeXB0ZWRLZXksIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlIH0pXG4gICAgICA6IHNqY2wuZGVjcnlwdCh3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRLZXkpO1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlTXBjVjJLZXlTaGFyZUVudmVsb3BlKGRlY3J5cHRlZCk7XG4gICAgbGV0IHJlZHVjZWQ6IE1QU1R5cGVzLkVkZHNhUmVkdWNlZEtleVNoYXJlO1xuICAgIHRyeSB7XG4gICAgICByZWR1Y2VkID0gTVBTVHlwZXMuZ2V0RGVjb2RlZFJlZHVjZWRLZXlTaGFyZShwYXJzZWQuc2lnbmluZ0tleVNoYXJlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0VkRFNBIE1QQ3YyIHJlY292ZXJ5OiB1bmFibGUgdG8gZGVjb2RlIHJlZHVjZWQga2V5IHNoYXJlIGZyb20ga2V5Y2FyZCBtYXRlcmlhbC4gVGhlIGVuY3J5cHRlZCBrZXkgbWF5IGJlIGNvcnJ1cHRlZCwgbWFsZm9ybWVkLCBvciBub3QgYW4gRWREU0EgTVBDdjIgcmVkdWNlZCBrZXkuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFyZWR1Y2VkLmtleVNoYXJlPy5sZW5ndGggfHwgIXJlZHVjZWQucHViPy5sZW5ndGggfHwgIXJlZHVjZWQucm9vdENoYWluQ29kZT8ubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdFZERTQSBNUEN2MiByZWNvdmVyeTogcmVkdWNlZCBrZXkgc2hhcmUgaXMgbWlzc2luZyBrZXlTaGFyZSwgcHViLCBvciByb290Q2hhaW5Db2RlLiBUaGlzIGtleWNhcmQgbWF5IGJlIHB1YmxpYy1vbmx5IGFuZCBjYW5ub3QgYmUgdXNlZCBmb3IgcmVjb3ZlcnkuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcmVkdWNlZCwgdnJmS2V5U2hhcmU6IHBhcnNlZC52cmZLZXlTaGFyZSB9O1xuICB9O1xuXG4gIGNvbnN0IFt1c2VyRGVjb2RlZCwgYmFja3VwRGVjb2RlZF0gPSBhd2FpdCBQcm9taXNlLmFsbChbZGVjb2RlS2V5KGVuY3J5cHRlZFVzZXJLZXkpLCBkZWNvZGVLZXkoZW5jcnlwdGVkQmFja3VwS2V5KV0pO1xuICBjb25zdCB1c2VyUmVkdWNlZCA9IHVzZXJEZWNvZGVkLnJlZHVjZWQ7XG4gIGNvbnN0IGJhY2t1cFJlZHVjZWQgPSBiYWNrdXBEZWNvZGVkLnJlZHVjZWQ7XG5cbiAgY29uc3QgdXNlclB1YiA9IEJ1ZmZlci5mcm9tKHVzZXJSZWR1Y2VkLnB1YikudG9TdHJpbmcoJ2hleCcpO1xuICBjb25zdCBiYWNrdXBQdWIgPSBCdWZmZXIuZnJvbShiYWNrdXBSZWR1Y2VkLnB1YikudG9TdHJpbmcoJ2hleCcpO1xuICBpZiAodXNlclB1YiAhPT0gYmFja3VwUHViKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFZERTQSBNUEN2MiByZWNvdmVyeTogdXNlciBhbmQgYmFja3VwIHB1YiBrZXlzIGRvIG5vdCBtYXRjaCcpO1xuICB9XG5cbiAgY29uc3QgdXNlckNoYWluQ29kZSA9IEJ1ZmZlci5mcm9tKHVzZXJSZWR1Y2VkLnJvb3RDaGFpbkNvZGUpLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgYmFja3VwQ2hhaW5Db2RlID0gQnVmZmVyLmZyb20oYmFja3VwUmVkdWNlZC5yb290Q2hhaW5Db2RlKS50b1N0cmluZygnaGV4Jyk7XG4gIGlmICh1c2VyQ2hhaW5Db2RlICE9PSBiYWNrdXBDaGFpbkNvZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VkRFNBIE1QQ3YyIHJlY292ZXJ5OiB1c2VyIGFuZCBiYWNrdXAgcm9vdENoYWluQ29kZXMgZG8gbm90IG1hdGNoJyk7XG4gIH1cblxuICBjb25zdCBoYXNVc2VyVnJmID0gdXNlckRlY29kZWQudnJmS2V5U2hhcmUgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgaGFzQmFja3VwVnJmID0gYmFja3VwRGVjb2RlZC52cmZLZXlTaGFyZSAhPT0gdW5kZWZpbmVkO1xuICBpZiAoaGFzVXNlclZyZiAhPT0gaGFzQmFja3VwVnJmKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0VkRFNBIE1QQ3YyIHJlY292ZXJ5OiBrZXlzaGFyZSBlbnZlbG9wZXMgbXVzdCBlaXRoZXIgYm90aCBjb250YWluIFZSRiBrZXlzaGFyZXMgb3IgYm90aCBvbWl0IHRoZW0nXG4gICAgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHVzZXJLZXlTaGFyZTogQnVmZmVyLmZyb20odXNlclJlZHVjZWQua2V5U2hhcmUpLFxuICAgIGJhY2t1cEtleVNoYXJlOiBCdWZmZXIuZnJvbShiYWNrdXBSZWR1Y2VkLmtleVNoYXJlKSxcbiAgICBjb21tb25LZXlDaGFpbjogdXNlclB1YiArIHVzZXJDaGFpbkNvZGUsXG4gICAgdXNlclZyZktleVNoYXJlOiB1c2VyRGVjb2RlZC52cmZLZXlTaGFyZSxcbiAgICBiYWNrdXBWcmZLZXlTaGFyZTogYmFja3VwRGVjb2RlZC52cmZLZXlTaGFyZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaWduIGEgbWVzc2FnZSBmb3IgcmVjb3ZlcnkgdXNpbmcgRWREU0EgTVBDdjIgKE1QUykgd2l0aCB1c2VyIGFuZCBiYWNrdXAga2V5IHNoYXJlcy5cbiAqXG4gKiBSdW5zIHRoZSBNUFMgRFNHIHByb3RvY29sIGxvY2FsbHkgdG8gcm91bmQgMywgdGhlbiB2ZXJpZmllcyB0aGUgcmVzdWx0aW5nXG4gKiBFZDI1NTE5IHNpZ25hdHVyZSBhZ2FpbnN0IHRoZSBwdWJsaWMga2V5IGRlcml2ZWQgZnJvbSB0aGUgY29tbW9uIGtleWNoYWluLlxuICpcbiAqIEBwYXJhbSBtZXNzYWdlIHJhdyBieXRlcyB0byBzaWduXG4gKiBAcGFyYW0gZGVyaXZhdGlvblBhdGggQklQLTMyLXN0eWxlIGRlcml2YXRpb24gcGF0aCwgZS5nLiBgXCJtLzBcImBcbiAqIEBwYXJhbSB1c2VyS2V5U2hhcmUgb3BhcXVlIE1QUyBzaWduaW5nIGtleS1zaGFyZSBieXRlcyBmb3IgdGhlIHVzZXIgcGFydHlcbiAqIEBwYXJhbSBiYWNrdXBLZXlTaGFyZSBvcGFxdWUgTVBTIHNpZ25pbmcga2V5LXNoYXJlIGJ5dGVzIGZvciB0aGUgYmFja3VwIHBhcnR5XG4gKiBAcGFyYW0gY29tbW9uS2V5Q2hhaW4gMTI4LWhleC1jaGFyIHN0cmluZzogMzItYnl0ZSBwdWIgKyAzMi1ieXRlIHJvb3RDaGFpbkNvZGVcbiAqIEByZXR1cm5zIDY0LWJ5dGUgRWQyNTUxOSBzaWduYXR1cmUgQnVmZmVyXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduUmVjb3ZlcnlFZGRzYU1QQ3YyKFxuICBtZXNzYWdlOiBCdWZmZXIsXG4gIGRlcml2YXRpb25QYXRoOiBzdHJpbmcsXG4gIHVzZXJLZXlTaGFyZTogQnVmZmVyLFxuICBiYWNrdXBLZXlTaGFyZTogQnVmZmVyLFxuICBjb21tb25LZXlDaGFpbjogc3RyaW5nXG4pOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBjb25zdCB1c2VyRHNnID0gbmV3IEVkZHNhTVBTRHNnLkRTRyhNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICBjb25zdCBiYWNrdXBEc2cgPSBuZXcgRWRkc2FNUFNEc2cuRFNHKE1QQ3YyUGFydGllc0VudW0uQkFDS1VQKTtcblxuICBjb25zdCBzaWduYXR1cmUgPSAoYXdhaXQgTVBTVXRpbC5leGVjdXRlVGlsbFJvdW5kKFxuICAgIDMsXG4gICAgdXNlckRzZyxcbiAgICBiYWNrdXBEc2csXG4gICAgdXNlcktleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlLFxuICAgIG1lc3NhZ2UsXG4gICAgZGVyaXZhdGlvblBhdGhcbiAgKSkgYXMgQnVmZmVyO1xuXG4gIC8vIFVzZSBFZGRzYS5kZXJpdmVVbmhhcmRlbmVkIChCSVAzMi1FZDI1NTE5KSwgd2hpY2ggbWF0Y2hlcyB3aGF0IERTRyB1c2VzXG4gIC8vIGludGVybmFsbHkgZm9yIHBhdGggZGVyaXZhdGlvbiBzaW5jZSB3YXNtLW1wcyAxLjkuMC5cbiAgY29uc3QgbXBjID0gYXdhaXQgZ2V0SW5pdGlhbGl6ZWRNcGNJbnN0YW5jZSgpO1xuICBjb25zdCBkZXJpdmVkS2V5Y2hhaW4gPSBtcGMuZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXlDaGFpbiwgZGVyaXZhdGlvblBhdGgpO1xuICBjb25zdCBwdWJsaWNLZXlCeXRlcyA9IEJ1ZmZlci5mcm9tKGRlcml2ZWRLZXljaGFpbi5zbGljZSgwLCA2NCksICdoZXgnKTtcblxuICBjb25zdCB2ZXJpZmllZCA9IGVkMjU1MTkudmVyaWZ5KG5ldyBVaW50OEFycmF5KHNpZ25hdHVyZSksIG5ldyBVaW50OEFycmF5KG1lc3NhZ2UpLCBuZXcgVWludDhBcnJheShwdWJsaWNLZXlCeXRlcykpO1xuICBpZiAoIXZlcmlmaWVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFZERTQSBNUEN2MiByZWNvdmVyeSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxlZCcpO1xuICB9XG5cbiAgcmV0dXJuIHNpZ25hdHVyZTtcbn1cblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHVuaW9uIHJlcHJlc2VudGluZyBFZERTQSBzaWduaW5nIG1hdGVyaWFsIGRldGVjdGVkIGZyb20gYSBrZXljYXJkLlxuICogdjE6IE1QQ3YxIEpTT04ga2V5Y2FyZCDigJQgdXNlclBydiBpcyB0aGUgZGVjcnlwdGVkIHBsYWludGV4dC5cbiAqIHYyOiBNUEN2MiBDQk9SIGtleWNhcmQg4oCUIGVuY3J5cHRlZFVzZXJLZXkgaXMgcmV0dXJuZWQgYXMtaXMgZm9yIE1QUyBEU0cuXG4gKi9cbmV4cG9ydCB0eXBlIEVkZHNhU2lnbmluZ01hdGVyaWFsID0geyB2ZXJzaW9uOiAndjEnOyB1c2VyUHJ2OiBzdHJpbmcgfSB8IHsgdmVyc2lvbjogJ3YyJzsgZW5jcnlwdGVkVXNlcktleTogc3RyaW5nIH07XG5cbi8qKlxuICogRGV0ZWN0cyBNUEN2MSB2cyBNUEN2MiBrZXljYXJkIGZvcm1hdCBhbmQgcmV0dXJucyB0eXBlZCBzaWduaW5nIG1hdGVyaWFsLlxuICogRm9yIHYxOiBkZWNyeXB0cyBvbmNlIGFuZCByZXR1cm5zIHRoZSBwbGFpbnRleHQgYXMgdXNlclBydi5cbiAqIEZvciB2MjogcmV0dXJucyB0aGUgZW5jcnlwdGVkIGtleSBhcy1pcyBmb3IgdXNlIHdpdGggc2lnbkVkZHNhTXBjVjJSZWNvdmVyeVR4LlxuICogV2hlbiBiaXRnbyBpcyBvbWl0dGVkLCBmYWxscyBiYWNrIHRvIHNqY2wgKHYxIG9ubHkpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwoXG4gIHVzZXJLZXk6IHN0cmluZyxcbiAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nLFxuICBiaXRnbz86IEJpdEdvQmFzZVxuKTogUHJvbWlzZTxFZGRzYVNpZ25pbmdNYXRlcmlhbD4ge1xuICBjb25zdCBub3JtYWxpemVkID0gdXNlcktleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICBsZXQgZGVjcnlwdGVkOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgZGVjcnlwdGVkID0gYml0Z29cbiAgICAgID8gYXdhaXQgYml0Z28uZGVjcnlwdCh7IGlucHV0OiBub3JtYWxpemVkLCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KVxuICAgICAgOiBzamNsLmRlY3J5cHQod2FsbGV0UGFzc3BocmFzZSwgbm9ybWFsaXplZCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGRlY3J5cHRpbmcgdXNlciBrZXljaGFpbjogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSl9YCk7XG4gIH1cbiAgY29uc3QgdXNlclBydiA9IHBhcnNlRWRkc2FNcGNWMU1hdGVyaWFsKGRlY3J5cHRlZCk7XG4gIHJldHVybiB1c2VyUHJ2ICE9PSBudWxsID8geyB2ZXJzaW9uOiAndjEnLCB1c2VyUHJ2IH0gOiB7IHZlcnNpb246ICd2MicsIGVuY3J5cHRlZFVzZXJLZXk6IG5vcm1hbGl6ZWQgfTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHZhbGlkYXRpbmcgdGhhdCBhIHZhbHVlIGhhcyB0aGUgc2hhcGUgb2YgRWRkc2FTaWduaW5nTWF0ZXJpYWwuXG4gKlxuICogQ29pbiBgcmVjb3ZlcigpYCBpbXBsZW1lbnRhdGlvbnMgYWNjZXB0IGFuIG9wdGlvbmFsIHByZWNvbXB1dGVkIHNpZ25pbmctbWF0ZXJpYWxcbiAqIHBhcmFtZXRlciAoc2V0IGJ5IHJlY292ZXJDb25zb2xpZGF0aW9ucygpIHRvIGF2b2lkIHJlLWRlY3J5cHRpbmcgdGhlIGtleWNhcmQgcGVyXG4gKiBzY2FubmVkIGluZGV4KS4gU29tZSBjYWxsZXJzIHBhc3MgYW4gdW5yZWxhdGVkIHNlY29uZCBwb3NpdGlvbmFsIGFyZ3VtZW50IHRvXG4gKiByZWNvdmVyKCkgZm9yIG90aGVyIHB1cnBvc2VzIChlLmcuIG9wZW5TU0xCeXRlcyBmb3IgRVZNLWxpa2UgY29pbnMpOyB2YWxpZGF0aW5nXG4gKiB0aGUgc2hhcGUgaGVyZSBwcmV2ZW50cyB0aGF0IGZyb20gYmVpbmcgbWlzaW50ZXJwcmV0ZWQgYXMgc2lnbmluZyBtYXRlcmlhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRWRkc2FTaWduaW5nTWF0ZXJpYWwodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBFZGRzYVNpZ25pbmdNYXRlcmlhbCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghKCd2ZXJzaW9uJyBpbiB2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHZhbHVlLnZlcnNpb24gPT09ICd2MScpIHtcbiAgICByZXR1cm4gJ3VzZXJQcnYnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS51c2VyUHJ2ID09PSAnc3RyaW5nJztcbiAgfVxuICBpZiAodmFsdWUudmVyc2lvbiA9PT0gJ3YyJykge1xuICAgIHJldHVybiAnZW5jcnlwdGVkVXNlcktleScgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLmVuY3J5cHRlZFVzZXJLZXkgPT09ICdzdHJpbmcnO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBGdWxsIE1QQ3YyIHJlY292ZXJ5IHNpZ25pbmcgZmxvdzogZGVjcnlwdCBrZXkgc2hhcmVzIOKGkiB2YWxpZGF0ZSBjb21tb25LZXlDaGFpbiDihpIgTVBTIERTRy5cbiAqIFJldHVybnMgcmF3IDY0LWJ5dGUgRWQyNTUxOSBzaWduYXR1cmUgQnVmZmVyLlxuICogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbnkgY29pbi1zcGVjaWZpYyBlbnZlbG9wZVxuICogKGUuZy4gMHgwMCBTdWJzdHJhdGUgcHJlZml4LCBTVUkgZmxhZytwdWJrZXkgd3JhcHBlciwgb3IgcmF3IGZvciBORUFSL0FEQS9UT04pLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkVkZHNhTXBjVjJSZWNvdmVyeVR4KHBhcmFtczoge1xuICBtZXNzYWdlOiBCdWZmZXI7XG4gIHVzZXJLZXk6IHN0cmluZztcbiAgYmFja3VwS2V5OiBzdHJpbmc7XG4gIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgYml0Z29LZXk6IHN0cmluZztcbiAgZGVyaXZhdGlvblBhdGg6IHN0cmluZztcbiAgYml0Z28/OiBCaXRHb0Jhc2U7XG59KTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgY29uc3QgeyB1c2VyS2V5U2hhcmUsIGJhY2t1cEtleVNoYXJlLCBjb21tb25LZXlDaGFpbiB9ID0gYXdhaXQgZ2V0RWRkc2FNcGNWMlJlY292ZXJ5S2V5U2hhcmVzRnJvbVJlZHVjZWRLZXkoXG4gICAgcGFyYW1zLnVzZXJLZXksXG4gICAgcGFyYW1zLmJhY2t1cEtleSxcbiAgICBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICBwYXJhbXMuYml0Z29cbiAgKTtcbiAgaWYgKGNvbW1vbktleUNoYWluLnRvTG93ZXJDYXNlKCkgIT09IHBhcmFtcy5iaXRnb0tleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFZERTQSBNUEN2MiByZWNvdmVyeTogY29tbW9uS2V5Q2hhaW4gZnJvbSBrZXljYXJkIGRvZXMgbm90IG1hdGNoIGJpdGdvS2V5Jyk7XG4gIH1cbiAgcmV0dXJuIHNpZ25SZWNvdmVyeUVkZHNhTVBDdjIocGFyYW1zLm1lc3NhZ2UsIHBhcmFtcy5kZXJpdmF0aW9uUGF0aCwgdXNlcktleVNoYXJlLCBiYWNrdXBLZXlTaGFyZSwgY29tbW9uS2V5Q2hhaW4pO1xufVxuXG5leHBvcnQgY29uc3QgRWRkc2FNUEN2MlJlY292ZXJ5RnVuY3Rpb25zID0ge1xuICBpc0VkZHNhTXBjVjFTaWduaW5nTWF0ZXJpYWwsXG4gIGdldEVkZHNhTXBjVjJSZWNvdmVyeUtleVNoYXJlc0Zyb21SZWR1Y2VkS2V5LFxuICBzaWduUmVjb3ZlcnlFZGRzYU1QQ3YyLFxuICBnZXRFZGRzYVNpZ25pbmdNYXRlcmlhbCxcbiAgaXNFZGRzYVNpZ25pbmdNYXRlcmlhbCxcbiAgc2lnbkVkZHNhTXBjVjJSZWNvdmVyeVR4LFxufTtcbiJdfQ==
|