@bitgo-beta/sdk-core 8.2.1-beta.1733 → 8.2.1-beta.1735

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.
Files changed (49) hide show
  1. package/dist/src/api/types.d.ts +12 -0
  2. package/dist/src/api/types.d.ts.map +1 -1
  3. package/dist/src/api/types.js +1 -1
  4. package/dist/src/bitgo/bitgoBase.d.ts +3 -1
  5. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
  6. package/dist/src/bitgo/bitgoBase.js +1 -1
  7. package/dist/src/bitgo/keychain/decryptKeychain.d.ts +12 -1
  8. package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -1
  9. package/dist/src/bitgo/keychain/decryptKeychain.js +34 -2
  10. package/dist/src/bitgo/keychain/iKeychains.d.ts +3 -1
  11. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  12. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  13. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  14. package/dist/src/bitgo/keychain/keychains.js +9 -2
  15. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +1 -1
  16. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -1
  17. package/dist/src/bitgo/tss/bitgoPubKeys.js +6 -9
  18. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +4 -2
  19. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  20. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +25 -5
  21. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +8 -1
  22. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  23. package/dist/src/bitgo/utils/tss/baseTypes.js +13 -1
  24. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +8 -1
  25. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
  26. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +101 -46
  27. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +5 -3
  28. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  29. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +77 -38
  30. package/dist/src/bitgo/wallet/BuildParams.d.ts +20 -0
  31. package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
  32. package/dist/src/bitgo/wallet/BuildParams.js +12 -2
  33. package/dist/src/bitgo/wallet/iWallet.d.ts +1 -0
  34. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  35. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  36. package/dist/src/bitgo/wallet/iWallets.d.ts +9 -3
  37. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  38. package/dist/src/bitgo/wallet/iWallets.js +16 -8
  39. package/dist/src/bitgo/wallet/wallet.d.ts +7 -1
  40. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  41. package/dist/src/bitgo/wallet/wallet.js +51 -13
  42. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  43. package/dist/src/bitgo/wallet/wallets.js +37 -13
  44. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
  45. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
  46. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +43 -0
  47. package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +5 -2
  48. package/dist/tsconfig.tsbuildinfo +1 -1
  49. package/package.json +8 -8
@@ -1395,7 +1395,7 @@ class Wallet {
1395
1395
  if (!params.walletPassphrase) {
1396
1396
  throw new Error('wallet passphrase was not provided');
1397
1397
  }
1398
- const userPrv = (0, keychain_1.decryptKeychainPrivateKey)(this.bitgo, userKeychain, params.walletPassphrase);
1398
+ const userPrv = await (0, keychain_1.decryptKeychainPrivateKeyAsync)(this.bitgo, userKeychain, params.walletPassphrase);
1399
1399
  if (!userPrv) {
1400
1400
  throw new Error('error decrypting wallet private key');
1401
1401
  }
@@ -1547,7 +1547,7 @@ class Wallet {
1547
1547
  if (!walletPassphrase) {
1548
1548
  throw new Error('Missing walletPassphrase argument');
1549
1549
  }
1550
- const prv = (0, keychain_1.decryptKeychainPrivateKey)(this.bitgo, keychain, walletPassphrase);
1550
+ const prv = await (0, keychain_1.decryptKeychainPrivateKeyAsync)(this.bitgo, keychain, walletPassphrase);
1551
1551
  if (!prv) {
1552
1552
  throw new errors_1.IncorrectPasswordError('Password shared is incorrect for this wallet');
1553
1553
  }
@@ -1857,7 +1857,7 @@ class Wallet {
1857
1857
  if (this.multisigType() === 'tss') {
1858
1858
  return this.signTransactionTss({
1859
1859
  ...presign,
1860
- prv: this.getUserPrv(presign),
1860
+ prv: await this.getUserPrvAsync(presign),
1861
1861
  apiVersion,
1862
1862
  });
1863
1863
  }
@@ -1892,7 +1892,7 @@ class Wallet {
1892
1892
  }
1893
1893
  return this.baseCoin.signTransaction({
1894
1894
  ...signTransactionParams,
1895
- prv: this.getUserPrv(presign),
1895
+ prv: await this.getUserPrvAsync(presign),
1896
1896
  wallet: this,
1897
1897
  });
1898
1898
  }
@@ -1926,7 +1926,7 @@ class Wallet {
1926
1926
  ...params,
1927
1927
  walletData: this._wallet,
1928
1928
  tssUtils: this.tssUtils,
1929
- prv: this.getUserPrv(userPrvOptions),
1929
+ prv: await this.getUserPrvAsync(userPrvOptions),
1930
1930
  keychain: keychains[0],
1931
1931
  backupKeychain: keychains.length > 1 ? keychains[1] : null,
1932
1932
  bitgoKeychain: keychains.length > 2 ? keychains[2] : null,
@@ -1964,7 +1964,7 @@ class Wallet {
1964
1964
  ...params,
1965
1965
  walletData: this._wallet,
1966
1966
  tssUtils: this.tssUtils,
1967
- prv: this.getUserPrv(userPrvOptions),
1967
+ prv: await this.getUserPrvAsync(userPrvOptions),
1968
1968
  keychain: keychains[0],
1969
1969
  backupKeychain: keychains.length > 1 ? keychains[1] : null,
1970
1970
  bitgoKeychain: keychains.length > 2 ? keychains[2] : null,
@@ -2011,7 +2011,7 @@ class Wallet {
2011
2011
  }
2012
2012
  }
2013
2013
  /**
2014
- * Get the user private key from either a derivation or an encrypted keychain
2014
+ * Get the user private key from either a derivation or an encrypted keychain (sync, v1 only).
2015
2015
  * @param [params.keychain / params.key] (object) or params.prv (string)
2016
2016
  * @param params.walletPassphrase (string)
2017
2017
  */
@@ -2021,9 +2021,6 @@ class Wallet {
2021
2021
  if (userPrv && typeof userPrv !== 'string') {
2022
2022
  throw new Error('prv must be a string');
2023
2023
  }
2024
- // use the `derivedFromParentWithSeed` property from the user keychain as the `coldDerivationSeed`
2025
- // if no other `coldDerivationSeed` was explicitly provided
2026
- // Only for onchain multisig wallets, TSS key derivation happens during the signing process
2027
2024
  if (params.coldDerivationSeed === undefined &&
2028
2025
  params.keychain !== undefined &&
2029
2026
  params.keychain.derivedFromParentWithSeed !== undefined &&
@@ -2031,7 +2028,6 @@ class Wallet {
2031
2028
  params.coldDerivationSeed = params.keychain.derivedFromParentWithSeed;
2032
2029
  }
2033
2030
  if (userPrv && params.coldDerivationSeed) {
2034
- // the derivation only makes sense when a key already exists
2035
2031
  const derivation = this.baseCoin.deriveKeyWithSeed({
2036
2032
  key: userPrv,
2037
2033
  seed: params.coldDerivationSeed,
@@ -2056,6 +2052,48 @@ class Wallet {
2056
2052
  }
2057
2053
  return userPrv;
2058
2054
  }
2055
+ /**
2056
+ * Async version of getUserPrv that supports both v1 (SJCL) and v2 (Argon2id) envelopes.
2057
+ * @param [params.keychain / params.key] (object) or params.prv (string)
2058
+ * @param params.walletPassphrase (string)
2059
+ */
2060
+ async getUserPrvAsync(params = {}) {
2061
+ const userKeychain = params.keychain || params.key;
2062
+ let userPrv = params.prv;
2063
+ if (userPrv && typeof userPrv !== 'string') {
2064
+ throw new Error('prv must be a string');
2065
+ }
2066
+ if (params.coldDerivationSeed === undefined &&
2067
+ params.keychain !== undefined &&
2068
+ params.keychain.derivedFromParentWithSeed !== undefined &&
2069
+ this.multisigType() === 'onchain') {
2070
+ params.coldDerivationSeed = params.keychain.derivedFromParentWithSeed;
2071
+ }
2072
+ if (userPrv && params.coldDerivationSeed) {
2073
+ const derivation = this.baseCoin.deriveKeyWithSeed({
2074
+ key: userPrv,
2075
+ seed: params.coldDerivationSeed,
2076
+ });
2077
+ userPrv = derivation.key;
2078
+ }
2079
+ else if (!userPrv) {
2080
+ if (!userKeychain || typeof userKeychain !== 'object') {
2081
+ throw new Error('keychain must be an object');
2082
+ }
2083
+ const userEncryptedPrv = userKeychain.encryptedPrv;
2084
+ if (!userEncryptedPrv) {
2085
+ throw new Error('keychain does not have property encryptedPrv');
2086
+ }
2087
+ if (!params.walletPassphrase) {
2088
+ throw new Error('walletPassphrase property missing');
2089
+ }
2090
+ userPrv = await (0, keychain_1.decryptKeychainPrivateKeyAsync)(this.bitgo, userKeychain, params.walletPassphrase);
2091
+ if (!userPrv) {
2092
+ throw new Error('failed to decrypt user keychain');
2093
+ }
2094
+ }
2095
+ return userPrv;
2096
+ }
2059
2097
  /**
2060
2098
  * Get a transaction prebuild from BitGo, validate it, and then decrypt the user key and sign the transaction
2061
2099
  * @param params
@@ -3728,7 +3766,7 @@ class Wallet {
3728
3766
  // we ignore this check with if customSigningFunction is provided
3729
3767
  // which means that the user is handling the signing in external signing mode
3730
3768
  if (!customSigningFunction && keychains?.[0]?.encryptedPrv && walletPassphrase) {
3731
- if (!(0, keychain_1.decryptKeychainPrivateKey)(this.bitgo, keychains[0], walletPassphrase)) {
3769
+ if (!(await (0, keychain_1.decryptKeychainPrivateKeyAsync)(this.bitgo, keychains[0], walletPassphrase))) {
3732
3770
  const error = new Error(`unable to decrypt keychain with the given wallet passphrase`);
3733
3771
  error.code = 'wallet_passphrase_incorrect';
3734
3772
  throw error;
@@ -3817,4 +3855,4 @@ class Wallet {
3817
3855
  }
3818
3856
  }
3819
3857
  exports.Wallet = Wallet;
3820
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC93YWxsZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0dBRUc7QUFDSCxzREFBMEU7QUFDMUUsaURBQWlEO0FBQ2pELG9EQUE0QjtBQUM1QixnRUFBcUM7QUFDckMseUNBQTJCO0FBQzNCLDBDQUE0QjtBQUU1QixxREFBdUM7QUFDdkMsa0RBQTREO0FBVTVELHdDQUEyQztBQUUzQyxrQ0FBMEM7QUFDMUMsc0NBTW1CO0FBRW5CLDBDQUEwQztBQUMxQywrREFBaUQ7QUFDakQsMENBQXdHO0FBQ3hHLDBFQUF1RTtBQUN2RSx3REFBeUY7QUFDekYsd0NBQTREO0FBQzVELHdDQUE0QztBQUM1QyxnQ0FBc0M7QUFDdEMsb0NBU2tCO0FBQ2xCLDBEQUF1RDtBQUN2RCw4Q0FBaUU7QUFDakUsNERBQWlFO0FBQ2pFLGtEQUF5RjtBQUN6RiwrQ0FBNEQ7QUErRTVELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBSWxELE1BQU0scUJBQXFCLEdBQUcseUJBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUV6RixJQUFZLHFCQUdYO0FBSEQsV0FBWSxxQkFBcUI7SUFDL0IsNkVBQVUsQ0FBQTtJQUNWLHVGQUFlLENBQUE7QUFDakIsQ0FBQyxFQUhXLHFCQUFxQixxQ0FBckIscUJBQXFCLFFBR2hDO0FBRUQsU0FBUywyQkFBMkIsQ0FDbEMsVUFBMEQ7SUFFMUQsSUFBSSxDQUFDLFVBQVUsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNs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RjtBQXp3SUQsd0JBeXdJQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCB7IFR4U2VuZEJvZHksIHR5cGUgQWRkcmVzc1F1ZXJ5UmVzdWx0IH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBDb2luRmFtaWx5IH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgKiBhcyB0IGZyb20gJ2lvLXRzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IElSZXF1ZXN0VHJhY2VyIH0gZnJvbSAnLi4vLi4vYXBpJztcbmltcG9ydCAqIGFzIGNvbW1vbiBmcm9tICcuLi8uLi9jb21tb24nO1xuaW1wb3J0IHsgQWRkcmVzc0Jvb2ssIElBZGRyZXNzQm9vayB9IGZyb20gJy4uL2FkZHJlc3MtYm9vayc7XG5pbXBvcnQge1xuICBJQmFzZUNvaW4sXG4gIE5GVFRyYW5zZmVyT3B0aW9ucyxcbiAgU2lnbmVkTWVzc2FnZSxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFNpZ25lZFRyYW5zYWN0aW9uUmVxdWVzdCxcbiAgVHJhbnNhY3Rpb25QcmVidWlsZCxcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG59IGZyb20gJy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IG1ha2VSYW5kb21LZXkgfSBmcm9tICcuLi9iaXRjb2luJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBnZXRTaGFyZWRTZWNyZXQgfSBmcm9tICcuLi9lY2RoJztcbmltcG9ydCB7XG4gIEFkZHJlc3NHZW5lcmF0aW9uRXJyb3IsXG4gIEluY29ycmVjdFBhc3N3b3JkRXJyb3IsXG4gIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IsXG4gIE1pc3NpbmdFbmNyeXB0ZWRLZXljaGFpbkVycm9yLFxuICBOZWVkVXNlclNpZ251cEVycm9yLFxufSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgU3VibWl0VHJhbnNhY3Rpb25SZXNwb25zZSB9IGZyb20gJy4uL2luc2NyaXB0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBkcmF3S2V5Y2FyZCB9IGZyb20gJy4uL2ludGVybmFsJztcbmltcG9ydCAqIGFzIGludGVybmFsIGZyb20gJy4uL2ludGVybmFsL2ludGVybmFsJztcbmltcG9ydCB7IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXksIEtleWNoYWluLCBLZXljaGFpbldpdGhFbmNyeXB0ZWRQcnYsIEtleUluZGljZXMgfSBmcm9tICcuLi9rZXljaGFpbic7XG5pbXBvcnQgeyBnZXRMaWdodG5pbmdBdXRoS2V5IH0gZnJvbSAnLi4vbGlnaHRuaW5nL2xpZ2h0bmluZ1dhbGxldFV0aWwnO1xuaW1wb3J0IHsgSVBlbmRpbmdBcHByb3ZhbCwgUGVuZGluZ0FwcHJvdmFsLCBQZW5kaW5nQXBwcm92YWxzIH0gZnJvbSAnLi4vcGVuZGluZ0FwcHJvdmFsJztcbmltcG9ydCB7IEdvU3Rha2luZ1dhbGxldCwgU3Rha2luZ1dhbGxldCB9IGZyb20gJy4uL3N0YWtpbmcnO1xuaW1wb3J0IHsgVHJhZGluZ0FjY291bnQgfSBmcm9tICcuLi90cmFkaW5nJztcbmltcG9ydCB7IGdldFR4UmVxdWVzdCB9IGZyb20gJy4uL3Rzcyc7XG5pbXBvcnQge1xuICBFZGRzYVVuc2lnbmVkVHJhbnNhY3Rpb24sXG4gIEludGVudE9wdGlvbnNGb3JNZXNzYWdlLFxuICBJbnRlbnRPcHRpb25zRm9yVHlwZWREYXRhLFxuICBSZXF1ZXN0VHJhY2VyLFxuICBSZXF1ZXN0VHlwZSxcbiAgVG9rZW5UcmFuc2ZlclJlY2lwaWVudFBhcmFtcyxcbiAgVG9rZW5UeXBlLFxuICBUeFJlcXVlc3QsXG59IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IHBvc3RXaXRoQ29kZWMgfSBmcm9tICcuLi91dGlscy9wb3N0V2l0aENvZGVjJztcbmltcG9ydCB7IEVjZHNhTVBDdjJVdGlscywgRWNkc2FVdGlscyB9IGZyb20gJy4uL3V0aWxzL3Rzcy9lY2RzYSc7XG5pbXBvcnQgRWRkc2FVdGlscywgeyBFZGRzYU1QQ3YyVXRpbHMgfSBmcm9tICcuLi91dGlscy90c3MvZWRkc2EnO1xuaW1wb3J0IHsgZ2V0VHhSZXF1ZXN0QXBpVmVyc2lvbiwgdmFsaWRhdGVUeFJlcXVlc3RBcGlWZXJzaW9uIH0gZnJvbSAnLi4vdXRpbHMvdHhSZXF1ZXN0JztcbmltcG9ydCB7IGJ1aWxkUGFyYW1LZXlzLCBCdWlsZFBhcmFtcyB9IGZyb20gJy4vQnVpbGRQYXJhbXMnO1xuaW1wb3J0IHtcbiAgQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgQWRkcmVzc2VzQnlCYWxhbmNlT3B0aW9ucyxcbiAgQWRkcmVzc2VzT3B0aW9ucyxcbiAgQnVpbGRDb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25PcHRpb25zLFxuICBCdWlsZFRva2VuRW5hYmxlbWVudE9wdGlvbnMsXG4gIEJ1bGtDcmVhdGVTaGFyZU9wdGlvbixcbiAgQnVsa1dhbGxldFNoYXJlS2V5Y2hhaW4sXG4gIEJ1bGtXYWxsZXRTaGFyZU9wdGlvbnMsXG4gIENoYW5nZUZlZU9wdGlvbnMsXG4gIENvbnNvbGlkYXRlVW5zcGVudHNPcHRpb25zLFxuICBDcmVhdGVBZGRyZXNzT3B0aW9ucyxcbiAgQ3JlYXRlQnVsa1dhbGxldFNoYXJlTGlzdFJlc3BvbnNlLFxuICBDcmVhdGVQb2xpY3lSdWxlT3B0aW9ucyxcbiAgQ3JlYXRlU2hhcmVPcHRpb25zLFxuICBDcm9zc0NoYWluVVRYTyxcbiAgRGVjcnlwdGVkS2V5Y2hhaW5EYXRhLFxuICBEZXBsb3lGb3J3YXJkZXJzT3B0aW9ucyxcbiAgRG93bmxvYWRLZXljYXJkT3B0aW9ucyxcbiAgRmFub3V0VW5zcGVudHNPcHRpb25zLFxuICBGZXRjaENyb3NzQ2hhaW5VVFhPc09wdGlvbnMsXG4gIEZsdXNoRm9yd2FyZGVyVG9rZW5PcHRpb25zLFxuICBGb3J3YXJkZXJCYWxhbmNlLFxuICBGb3J3YXJkZXJCYWxhbmNlT3B0aW9ucyxcbiAgRnJlZXplT3B0aW9ucyxcbiAgRnVuZEZvcndhcmRlclBhcmFtcyxcbiAgRnVuZEZvcndhcmRlcnNPcHRpb25zLFxuICBHZXRBZGRyZXNzT3B0aW9ucyxcbiAgR2V0UHJ2T3B0aW9ucyxcbiAgR2V0VHJhbnNhY3Rpb25PcHRpb25zLFxuICBHZXRUcmFuc2Zlck9wdGlvbnMsXG4gIEdldFVzZXJQcnZPcHRpb25zLFxuICB0eXBlIElXYWxsZXQsXG4gIE1hbmFnZVVuc3BlbnRSZXNlcnZhdGlvbk9wdGlvbnMsXG4gIE1heGltdW1TcGVuZGFibGUsXG4gIE1heGltdW1TcGVuZGFibGVPcHRpb25zLFxuICBNb2RpZnlXZWJob29rT3B0aW9ucyxcbiAgTmZ0QmFsYW5jZSxcbiAgUGFnaW5hdGlvbk9wdGlvbnMsXG4gIFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQsXG4gIFJlY292ZXJUb2tlbk9wdGlvbnMsXG4gIFJlbW92ZVBvbGljeVJ1bGVPcHRpb25zLFxuICBSZW1vdmVVc2VyT3B0aW9ucyxcbiAgU2VuZE1hbnlPcHRpb25zLFxuICBTZW5kTkZUT3B0aW9ucyxcbiAgU2VuZE5GVFJlc3VsdCxcbiAgU2VuZE9wdGlvbnMsXG4gIFNoYXJlZEtleUNoYWluLFxuICBTaGFyZVdhbGxldE9wdGlvbnMsXG4gIFNpZ25BbmRTZW5kVHhSZXF1ZXN0T3B0aW9ucyxcbiAgU2ltdWxhdGVXZWJob29rT3B0aW9ucyxcbiAgU3VibWl0VHJhbnNhY3Rpb25PcHRpb25zLFxuICBTdWJXYWxsZXRUeXBlLFxuICBTd2VlcE9wdGlvbnMsXG4gIFRyYW5zZmVyQnlTZXF1ZW5jZUlkT3B0aW9ucyxcbiAgVHJhbnNmZXJDb21tZW50T3B0aW9ucyxcbiAgVHJhbnNmZXJzT3B0aW9ucyxcbiAgVW5zcGVudHNPcHRpb25zLFxuICBVcGRhdGVBZGRyZXNzT3B0aW9ucyxcbiAgVXBkYXRlQnVpbGREZWZhdWx0T3B0aW9ucyxcbiAgVXBkYXRlV2FsbGV0T3B0aW9ucyxcbiAgV2FsbGV0Q29pblNwZWNpZmljLFxuICBXYWxsZXREYXRhLFxuICBXYWxsZXRFY2RzYUNoYWxsZW5nZXMsXG4gIFdhbGxldFNpZ25NZXNzYWdlT3B0aW9ucyxcbiAgV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgV2FsbGV0U2lnblR5cGVkRGF0YU9wdGlvbnMsXG4gIFdhbGxldFR5cGUsXG4gIEJ1aWxkVG9rZW5BcHByb3ZhbFJlc3BvbnNlLFxuICBXYWxsZXRJbml0UmVzdWx0LFxuICBHZXRBY2NvdW50UmVzb3VyY2VzT3B0aW9ucyxcbiAgR2V0QWNjb3VudFJlc291cmNlc1Jlc3BvbnNlLFxuICBHZXRSZXNvdXJjZURlbGVnYXRpb25zT3B0aW9ucyxcbiAgR2V0UmVzb3VyY2VEZWxlZ2F0aW9uc1Jlc3BvbnNlLFxufSBmcm9tICcuL2lXYWxsZXQnO1xuXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2JpdGdvOnYyOndhbGxldCcpO1xuXG50eXBlIE1hbmFnZVVuc3BlbnRzID0gJ2NvbnNvbGlkYXRlJyB8ICdmYW5vdXQnO1xuXG5jb25zdCB3aGl0ZWxpc3RlZFNlbmRQYXJhbXMgPSBUeFNlbmRCb2R5LnR5cGUudHlwZXMuZmxhdE1hcCgodCkgPT4gT2JqZWN0LmtleXModC5wcm9wcykpO1xuXG5leHBvcnQgZW51bSBNYW5hZ2VVbnNwZW50c09wdGlvbnMge1xuICBCVUlMRF9PTkxZLFxuICBCVUlMRF9TSUdOX1NFTkQsXG59XG5cbmZ1bmN0aW9uIGlzUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdChcbiAgcHJlYnVpbGRUeDogc3RyaW5nIHwgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCB8IHVuZGVmaW5lZFxuKTogcHJlYnVpbGRUeCBpcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0IHtcbiAgaWYgKCFwcmVidWlsZFR4IHx8IHR5cGVvZiBwcmVidWlsZFR4ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gKHByZWJ1aWxkVHggYXMgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCkud2FsbGV0SWQgIT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNsYXNzIFdhbGxldCBpbXBsZW1lbnRzIElXYWxsZXQge1xuICBwdWJsaWMgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHVibGljIHJlYWRvbmx5IGJhc2VDb2luOiBJQmFzZUNvaW47XG4gIHB1YmxpYyBfd2FsbGV0OiBXYWxsZXREYXRhO1xuICBwcml2YXRlIHJlYWRvbmx5IHRzc1V0aWxzOiBFY2RzYVV0aWxzIHwgRWNkc2FNUEN2MlV0aWxzIHwgRWRkc2FVdGlscyB8IEVkZHNhTVBDdjJVdGlscyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBfcGVybWlzc2lvbnM/OiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBiYXNlQ29pbjogSUJhc2VDb2luLCB3YWxsZXREYXRhOiBhbnkpIHtcbiAgICB0aGlzLmJpdGdvID0gYml0Z287XG4gICAgdGhpcy5iYXNlQ29pbiA9IGJhc2VDb2luO1xuICAgIHRoaXMuX3dhbGxldCA9IHdhbGxldERhdGE7XG4gICAgY29uc3QgdXNlcklkID0gXy5nZXQoYml0Z28sICdfdXNlci5pZCcpO1xuICAgIGlmIChfLmlzU3RyaW5nKHVzZXJJZCkpIHtcbiAgICAgIGNvbnN0IHVzZXJEZXRhaWxzID0gXy5maW5kKHdhbGxldERhdGEudXNlcnMsIHsgdXNlcjogdXNlcklkIH0pO1xuICAgICAgdGhpcy5fcGVybWlzc2lvbnMgPSBfLmdldCh1c2VyRGV0YWlscywgJ3Blcm1pc3Npb25zJyk7XG4gICAgfVxuICAgIGlmIChiYXNlQ29pbj8uc3VwcG9ydHNUc3MoKSAmJiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgc3dpdGNoIChiYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSkge1xuICAgICAgICBjYXNlICdlY2RzYSc6XG4gICAgICAgICAgaWYgKHdhbGxldERhdGEubXVsdGlzaWdUeXBlVmVyc2lvbiA9PT0gJ01QQ3YyJykge1xuICAgICAgICAgICAgdGhpcy50c3NVdGlscyA9IG5ldyBFY2RzYU1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luLCB0aGlzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50c3NVdGlscyA9IG5ldyBFY2RzYVV0aWxzKGJpdGdvLCBiYXNlQ29pbiwgdGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlZGRzYSc6XG4gICAgICAgICAgaWYgKHdhbGxldERhdGEubXVsdGlzaWdUeXBlVmVyc2lvbiA9PT0gJ01QQ3YyJykge1xuICAgICAgICAgICAgdGhpcy50c3NVdGlscyA9IG5ldyBFZGRzYU1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luLCB0aGlzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50c3NVdGlscyA9IG5ldyBFZGRzYVV0aWxzKGJpdGdvLCBiYXNlQ29pbiwgdGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMudHNzVXRpbHMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgVVJMIHVzaW5nIHRoaXMgd2FsbGV0J3MgaWQgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIEJpdEdvIEFQSSBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSBleHRyYSBBUEkgc3BlY2lmaWMgc3RyaW5nIHRvIGFwcGVuZCB0byB0aGUgd2FsbGV0IGlkXG4gICAqL1xuICB1cmwoZXh0cmEgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyBleHRyYSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoaXMgd2FsbGV0J3MgaWRcbiAgICovXG4gIGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlciBvZiBhcHByb3ZhbHMgcmVxdWlyZWQgZm9yIHNwZW5kaW5nIGZ1bmRzIGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIGFwcHJvdmFsc1JlcXVpcmVkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5hcHByb3ZhbHNSZXF1aXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgYmFsYW5jZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuYmFsYW5jZTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgY29kZWMgaW5zdGVhZDogdC5leGFjdChCdWlsZFBhcmFtcykuZW5jb2RlKHYpICovXG4gIHByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBidWlsZFBhcmFtS2V5cztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGEgc3RyaWN0IHN1Yi1zZXQgb2YgcHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtc1xuICAgKi9cbiAgcHJlYnVpbGRDb25zb2xpZGF0ZUFjY291bnRQYXJhbXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAnY29uc29saWRhdGVBZGRyZXNzZXMnLFxuICAgICAgJ25mdENvbGxlY3Rpb25JZCcsXG4gICAgICAnbmZ0SWQnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ21lbW8nLFxuICAgICAgJ3ZhbGlkRnJvbUJsb2NrJyxcbiAgICAgICd2YWxpZFRvQmxvY2snLFxuICAgICAgJ3ByZXZpZXcnLFxuICAgICAgJ2tlZXBBbGl2ZScsXG4gICAgICAnYXBpVmVyc2lvbicsXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbmZpcm1lZCBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqL1xuICBjb25maXJtZWRCYWxhbmNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb25maXJtZWRCYWxhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3BlbmRhYmxlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICovXG4gIHNwZW5kYWJsZUJhbGFuY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LnNwZW5kYWJsZUJhbGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gYmFsYW5jZXMgaGF2ZSB0aGUgcG90ZW50aWFsIHRvIG92ZXJmbG93IHN0YW5kYXJkIGphdmFzY3JpcHQgbnVtYmVyc1xuICAgKi9cbiAgYmFsYW5jZVN0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuYmFsYW5jZVN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbmZpcm1lZCBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gYmFsYW5jZXMgaGF2ZSB0aGUgcG90ZW50aWFsIHRvIG92ZXJmbG93IHN0YW5kYXJkIGphdmFzY3JpcHQgbnVtYmVyc1xuICAgKi9cbiAgY29uZmlybWVkQmFsYW5jZVN0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29uZmlybWVkQmFsYW5jZVN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZW5kYWJsZSBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gYmFsYW5jZXMgaGF2ZSB0aGUgcG90ZW50aWFsIHRvIG92ZXJmbG93IHN0YW5kYXJkIGphdmFzY3JpcHQgbnVtYmVyc1xuICAgKi9cbiAgc3BlbmRhYmxlQmFsYW5jZVN0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuc3BlbmRhYmxlQmFsYW5jZVN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvaW4gaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgY29pbiB0aGlzIHdhbGxldCBob2xkc1xuICAgKi9cbiAgY29pbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29pbjtcbiAgfVxuXG4gIHR5cGUoKTogV2FsbGV0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC50eXBlIHx8ICdob3QnO1xuICB9XG5cbiAgbXVsdGlzaWdUeXBlKCk6ICdvbmNoYWluJyB8ICd0c3MnIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZTtcbiAgfVxuXG4gIG11bHRpc2lnVHlwZVZlcnNpb24oKTogJ01QQ3YyJyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uO1xuICB9XG5cbiAgc3ViVHlwZSgpOiBTdWJXYWxsZXRUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LnN1YlR5cGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsYWJlbCAobmFtZSkgZm9yIHRoaXMgd2FsbGV0XG4gICAqL1xuICBwdWJsaWMgbGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmxhYmVsO1xuICB9XG5cbiAgcHVibGljIGZsYWdzKCk6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC53YWxsZXRGbGFncyA/PyBbXTtcbiAgfVxuXG4gIHB1YmxpYyBmbGFnKG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmxhZ3MoKS5maW5kKChmbGFnKSA9PiBmbGFnLm5hbWUgPT09IG5hbWUpPy52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHB1YmxpYyBvYmplY3QgaWRzIGZvciB0aGUga2V5Y2hhaW5zIG9uIHRoaXMgd2FsbGV0LlxuICAgKi9cbiAgcHVibGljIGtleUlkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5rZXlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHJlY2VpdmUgYWRkcmVzcyBmb3IgdGhpcyB3YWxsZXRcbiAgICovXG4gIHB1YmxpYyByZWNlaXZlQWRkcmVzcygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQucmVjZWl2ZUFkZHJlc3M/LmFkZHJlc3M7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB3YWxsZXQgaWQgb2YgdGhlIHdhbGxldCB0aGF0IHRoaXMgd2FsbGV0IHdhcyBtaWdyYXRlZCBmcm9tLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhpcyBpcyBhIEJDSCB3YWxsZXQgdGhhdCB3YXMgY3JlYXRlZCBmcm9tIGEgQlRDIHdhbGxldCxcbiAgICogdGhlIEJDSCB3YWxsZXQgbWlncmF0ZWQgZnJvbSBmaWVsZCB3b3VsZCBoYXZlIHRoZSBCVEMgd2FsbGV0IGlkLlxuICAgKi9cbiAgcHVibGljIG1pZ3JhdGVkRnJvbSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQubWlncmF0ZWRGcm9tO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgdG9rZW4gZmx1c2ggdGhyZXNob2xkcyBmb3IgdGhpcyB3YWxsZXRcbiAgICogQHJldHVybiB7KnxPYmplY3R9IHBhaXJzIG9mIHsgW3Rva2VuTmFtZV06IHRocmVzaG9sZHMgfSBiYXNlIHVuaXRzXG4gICAqL1xuICB0b2tlbkZsdXNoVGhyZXNob2xkcygpOiBhbnkge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnZXRoJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHdhbGxldCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYy50b2tlbkZsdXNoVGhyZXNob2xkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2FsbGV0IHByb3BlcnRpZXMgd2hpY2ggYXJlIHNwZWNpZmljIHRvIGNlcnRhaW4gY29pbiBpbXBsZW1lbnRhdGlvbnNcbiAgICovXG4gIGNvaW5TcGVjaWZpYygpOiBXYWxsZXRDb2luU3BlY2lmaWMgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcGVuZGluZyBhcHByb3ZhbHMgb24gdGhpcyB3YWxsZXRcbiAgICovXG4gIHBlbmRpbmdBcHByb3ZhbHMoKTogSVBlbmRpbmdBcHByb3ZhbFtdIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LnBlbmRpbmdBcHByb3ZhbHMubWFwKChjdXJyZW50QXBwcm92YWwpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUGVuZGluZ0FwcHJvdmFsKHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIGN1cnJlbnRBcHByb3ZhbCwgdGhpcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaCB0aGUgd2FsbGV0IG9iamVjdCBieSBzeW5jaW5nIHdpdGggdGhlIGJhY2stZW5kXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMge1dhbGxldH1cbiAgICovXG4gIGFzeW5jIHJlZnJlc2gocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8V2FsbGV0PiB7XG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoKSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgdHJhbnNhY3Rpb25zKHBhcmFtczogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnk6IFBhZ2luYXRpb25PcHRpb25zID0ge307XG5cbiAgICBpZiAocGFyYW1zLnByZXZJZCkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcmV2SWQgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnByZXZJZCA9IHBhcmFtcy5wcmV2SWQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy90eCcpKVxuICAgICAgLnF1ZXJ5KHF1ZXJ5KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGxpc3Qgb2YgbmZ0IHRva2VucyBmb3IgdGhpcyB3YWxsZXQuIFdpbGwgYWx3YXlzIHJldHVybiB1bmRlZmluZWQgaWYgdGhlIHdhbGxldFxuICAgKiB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdGhlIGFsbFRva2VucyBmbGFnLlxuICAgKlxuICAgKiBAcmV0dXJucyB7TmZ0QmFsYW5jZVtdIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgbmZ0QmFsYW5jZXMoKTogTmZ0QmFsYW5jZVtdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm5mdHMpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX3dhbGxldC5uZnRzKS5tYXAoKG5mdERhdGEpID0+IG5mdERhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGxpc3Qgb2YgdW5zdXBwb3J0ZWQgbmZ0IHRva2VucyBmb3IgdGhpcyB3YWxsZXQuIFdpbGwgYWx3YXlzIHJldHVybiB1bmRlZmluZWQgaWYgdGhlIHdhbGxldFxuICAgKiB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdGhlIGFsbFRva2VucyBmbGFnLlxuICAgKlxuICAgKiBAcmV0dXJucyB7TmZ0QmFsYW5jZVtdIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgdW5zdXBwb3J0ZWROZnRCYWxhbmNlcygpOiBOZnRCYWxhbmNlW10gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLl93YWxsZXQudW5zdXBwb3J0ZWROZnRzKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl93YWxsZXQudW5zdXBwb3J0ZWROZnRzKS5tYXAoKG5mdERhdGEpID0+IG5mdERhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSB3YWxsZXRzIG5mdCAmIHVuc3VwcG9ydGVkIG5mdHMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtOZnRCYWxhbmNlW119XG4gICAqL1xuICBhc3luYyBnZXROZnRCYWxhbmNlcygpOiBQcm9taXNlPE5mdEJhbGFuY2VbXT4ge1xuICAgIGNvbnN0IHdhbGxldERhdGE6IFBhcnRpYWw8V2FsbGV0RGF0YT4gPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgpKS5xdWVyeSh7IGFsbFRva2VuczogdHJ1ZSB9KS5yZXN1bHQoKTtcblxuICAgIGNvbnN0IHN1cHBvcnRlZE5mdHMgPSB3YWxsZXREYXRhPy5uZnRzID8gT2JqZWN0LnZhbHVlcyh3YWxsZXREYXRhLm5mdHMpLm1hcCgoYmFsYW5jZSkgPT4gYmFsYW5jZSkgOiBbXTtcblxuICAgIGNvbnN0IHVuc3VwcG9ydGVkTmZ0cyA9IHdhbGxldERhdGE/LnVuc3VwcG9ydGVkTmZ0c1xuICAgICAgPyBPYmplY3QudmFsdWVzKHdhbGxldERhdGEudW5zdXBwb3J0ZWROZnRzKS5tYXAoKGJhbGFuY2UpID0+IGJhbGFuY2UpXG4gICAgICA6IFtdO1xuICAgIHJldHVybiBbLi4uc3VwcG9ydGVkTmZ0cywgLi4udW5zdXBwb3J0ZWROZnRzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogIC0gdHhIYXNoIHRoZSB0cmFuc2FjdGlvbiBoYXNoIHRvIHNlYXJjaCBmb3JcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBnZXRUcmFuc2FjdGlvbihwYXJhbXM6IEdldFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3R4SGFzaCddLCBbXSk7XG5cbiAgICBjb25zdCBwYWdpbmF0ZWRPcHRpb25zOiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9O1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMucHJldklkKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcmV2SWQgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHBhZ2luYXRlZE9wdGlvbnMucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmxpbWl0KSkge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubGltaXQpIHx8IHBhcmFtcy5saW1pdCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgICAgfVxuICAgICAgcGFnaW5hdGVkT3B0aW9ucy5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeSA9IHBhZ2luYXRlZE9wdGlvbnM7XG4gICAgaWYgKHBhcmFtcy5pbmNsdWRlUmJmKSB7XG4gICAgICBxdWVyeVsnaW5jbHVkZVJiZiddID0gcGFyYW1zLmluY2x1ZGVSYmY7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy51cmwoJy90eC8nICsgcGFyYW1zLnR4SGFzaCkpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdHJhbnNmZXJzIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgdHJhbnNmZXJzKHBhcmFtczogVHJhbnNmZXJzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogVHJhbnNmZXJzT3B0aW9ucyA9IHt9O1xuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuYWxsVG9rZW5zKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5hbGxUb2tlbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhbGxUb2tlbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5hbGxUb2tlbnMgPSBwYXJhbXMuYWxsVG9rZW5zO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc2VhcmNoTGFiZWwpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuc2VhcmNoTGFiZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZWFyY2hMYWJlbCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkuc2VhcmNoTGFiZWwgPSBwYXJhbXMuc2VhcmNoTGFiZWw7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheShwYXJhbXMuYWRkcmVzcykgJiYgIV8uaXNTdHJpbmcocGFyYW1zLmFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhZGRyZXNzIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nIG9yIGFycmF5Jyk7XG4gICAgICB9XG4gICAgICBpZiAoXy5pc0FycmF5KHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgICBwYXJhbXMuYWRkcmVzcy5mb3JFYWNoKChhZGRyZXNzKSA9PiB7XG4gICAgICAgICAgaWYgKCFfLmlzU3RyaW5nKGFkZHJlc3MpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYWRkcmVzcyBhcmd1bWVudCwgZXhwZWN0aW5nIGFycmF5IG9mIGFkZHJlc3Mgc3RyaW5ncycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBxdWVyeS5hZGRyZXNzID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5kYXRlR3RlKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmRhdGVHdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkYXRlR3RlIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5kYXRlR3RlID0gcGFyYW1zLmRhdGVHdGU7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5kYXRlTHQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuZGF0ZUx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGF0ZUx0IGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5kYXRlTHQgPSBwYXJhbXMuZGF0ZUx0O1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudmFsdWVHdGUpKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnZhbHVlR3RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdmFsdWVHdGUgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnZhbHVlR3RlID0gcGFyYW1zLnZhbHVlR3RlO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudmFsdWVMdCkpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMudmFsdWVMdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHZhbHVlTHQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnZhbHVlTHQgPSBwYXJhbXMudmFsdWVMdDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLmluY2x1ZGVIZXgpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlSGV4KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jbHVkZUhleCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmluY2x1ZGVIZXggPSBwYXJhbXMuaW5jbHVkZUhleDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnN0YXRlKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5zdGF0ZSkgJiYgIV8uaXNTdHJpbmcocGFyYW1zLnN0YXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdGUgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcgb3IgYXJyYXknKTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zLnN0YXRlKSkge1xuICAgICAgICBwYXJhbXMuc3RhdGUuZm9yRWFjaCgoc3RhdGUpID0+IHtcbiAgICAgICAgICBpZiAoIV8uaXNTdHJpbmcoc3RhdGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdGUgYXJndW1lbnQsIGV4cGVjdGluZyBhcnJheSBvZiBzdGF0ZSBzdHJpbmdzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnN0YXRlID0gcGFyYW1zLnN0YXRlO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudHlwZSkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMudHlwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHR5cGUgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnR5cGUgPSBwYXJhbXMudHlwZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLmRlY29yYXRlVXR4b1NwZWNpZmljRmllbGRzKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuZGVjb3JhdGVVdHhvU3BlY2lmaWNGaWVsZHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlSGV4IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuZGVjb3JhdGVVdHhvU3BlY2lmaWNGaWVsZHMgPSBwYXJhbXMuZGVjb3JhdGVVdHhvU3BlY2lmaWNGaWVsZHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdHJhbnNmZXInKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0cmFuc2ZlcnMgb24gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgZ2V0VHJhbnNmZXIocGFyYW1zOiBHZXRUcmFuc2Zlck9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbXSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdHJhbnNmZXIvJyArIHBhcmFtcy5pZCkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHRyYW5zYWN0aW9uIGJ5IHNlcXVlbmNlIGlkIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyB0cmFuc2ZlckJ5U2VxdWVuY2VJZChwYXJhbXM6IFRyYW5zZmVyQnlTZXF1ZW5jZUlkT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3NlcXVlbmNlSWQnXSwgW10pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3RyYW5zZmVyL3NlcXVlbmNlSWQvJyArIHBhcmFtcy5zZXF1ZW5jZUlkKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtYXhpbXVtIGFtb3VudCB5b3UgY2FuIHNwZW5kIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxpbWl0IC0gbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0YWJsZSB1bnNwZW50c1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBFbmZvcmNlcyBtaW5Db25maXJtcyBvbiBjaGFuZ2UgaW5wdXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIGZlZSByYXRlIHRvIHVzZSBpbiBjYWxjdWxhdGlvbiBvZiBtYXhpbXVtIHNwZW5kYWJsZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnJlY2lwaWVudEFkZHJlc3MgLSByZWNpcGllbnQgYWRkcmVzc2VzIGZvciBhIG1vcmUgYWNjdXJhdGUgY2FsY3VsYXRpb24gb2YgdGhlIG1heGltdW0gYXZhaWxhYmxlIHRvIHNlbmRcbiAgICogQHJldHVybnMge3ttYXhpbXVtU3BlbmRhYmxlOiBOdW1iZXIsIGNvaW46IFN0cmluZ319XG4gICAqIE5PVEUgOiBmZWVUeENvbmZpcm1UYXJnZXQgb21pdHRlZCBvbiBwdXJwb3NlIGJlY2F1c2UgZ2F1Z2luZyB0aGUgbWF4aW11bSBzcGVuZGFibGUgYW1vdW50IHdpdGggZHluYW1pYyBmZWVzIGRvZXMgbm90IG1ha2Ugc2Vuc2VcbiAgICovXG4gIGFzeW5jIG1heGltdW1TcGVuZGFibGUocGFyYW1zOiBNYXhpbXVtU3BlbmRhYmxlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxNYXhpbXVtU3BlbmRhYmxlPiB7XG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbXG4gICAgICAnZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlJyxcbiAgICAgICdmZWVSYXRlJyxcbiAgICAgICdsaW1pdCcsXG4gICAgICAnbWF4RmVlUmF0ZScsXG4gICAgICAnbWF4VmFsdWUnLFxuICAgICAgJ21pbkNvbmZpcm1zJyxcbiAgICAgICdtaW5IZWlnaHQnLFxuICAgICAgJ21pblZhbHVlJyxcbiAgICAgICdwbGFpblRhcmdldCcsXG4gICAgICAncmVjaXBpZW50QWRkcmVzcycsXG4gICAgICAndGFyZ2V0JyxcbiAgICBdKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL21heGltdW1TcGVuZGFibGUnKSkucXVlcnkoZmlsdGVyZWRQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIHVuc3BlbnRzIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgdW5zcGVudHMocGFyYW1zOiBVbnNwZW50c09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnkgPSBfLnBpY2socGFyYW1zLCBbXG4gICAgICAnY2hhaW5zJyxcbiAgICAgICdsaW1pdCcsXG4gICAgICAnbWF4VmFsdWUnLFxuICAgICAgJ21pbkNvbmZpcm1zJyxcbiAgICAgICdtaW5IZWlnaHQnLFxuICAgICAgJ21pblZhbHVlJyxcbiAgICAgICdwcmV2SWQnLFxuICAgICAgJ3NlZ3dpdCcsXG4gICAgICAndGFyZ2V0JyxcbiAgICAgICd1bnNwZW50SWRzJyxcbiAgICBdKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3Vuc3BlbnRzJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zb2xpZGF0ZSBvciBmYW5vdXQgdW5zcGVudHMgb24gYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHJvdXRlTmFtZSAtIGVpdGhlciBgY29uc29saWRhdGVgIG9yIGBmYW5vdXRgXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKlxuICAgKiBXYWxsZXQgcGFyYW1ldGVyczpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHVzZXJzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMueHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSBpZiB0aGUgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4gICAqXG4gICAqIEZlZSBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBUaGUgZmVlIHJhdGUgdG8gdXNlIGZvciB0aGUgY29uc29saWRhdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVBlcmNlbnRhZ2UgLSB0aGUgbWF4aW11bSByZWxhdGl2ZSBwb3J0aW9uIHRoYXQgeW91J3JlIHdpbGxpbmcgdG8gc3BlbmQgdG93YXJkcyBmZWVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IC0gZXN0aW1hdGUgdGhlIGZlZXMgdG8gYWltIGZvciBmaXJzdCBjb25maXJtYXRpb24gd2l0aCB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICpcbiAgICogSW5wdXQgcGFyYW1ldGVyczpcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1heFZhbHVlIC0gdGhlIG1heGltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluSGVpZ2h0IC0gdGhlIG1pbmltdW0gaGVpZ2h0IG9mIHVuc3BlbnRzIG9uIHRoZSBibG9jayBjaGFpbiB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIGFsbCBzZWxlY3RlZCB1bnNwZW50cyB3aWxsIGhhdmUgYXQgbGVhc3QgdGhpcyBtYW55IGNvbmZpcm1hdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gaWYgdHJ1ZSwgbWluQ29uZmlybXMgYWxzbyBhcHBsaWVzIHRvIGNoYW5nZSBvdXRwdXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGltaXQgICAgICAgICAgICAgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2NvbnNvbGlkYXRlJ1xuICAgKiAgICAgICAgICAgICAgICAgcGFyYW1zLm1heE51bUlucHV0c1RvVXNlICAgIGZvciByb3V0ZU5hbWUgPT09ICdmYW5vdXQnXG4gICAqICAgICAgICAgICAgICAgICAgLSBtYXhpbXVtIG51bWJlciBvZiB1bnNwZW50cyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIE91dHB1dCBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm51bVVuc3BlbnRzVG9NYWtlIC0gdGhlIG51bWJlciBvZiBuZXcgdW5zcGVudHMgdG8gbWFrZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5idWxrIC0gaWYgc2V0IHRvIFRydWUsIHRoaXMgZW5hYmxlcyB0aGUgY29uc29saWRhdGlvbiBvZiBsYXJnZSBudW1iZXIgb2YgdW5zcGVudHMgYnkgY3JlYXRpbmcgbXVsdGlwbGUgdHJhbnNhY3Rpb25zLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBlYWNoIHRyYW5zYWN0aW9uIGNvbXBvc2VkIG9mIDIwMCB1bnNwZW50cywgZXhjZXB0IGZvciB0aGUgbGFzdCB0cmFuc2FjdGlvbiB3aGljaCBtYXkgaGF2ZSBmZXdlciB1bnNwZW50cy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbWFuYWdlVW5zcGVudHMoXG4gICAgcm91dGVOYW1lOiBNYW5hZ2VVbnNwZW50cyxcbiAgICBwYXJhbXM6IENvbnNvbGlkYXRlVW5zcGVudHNPcHRpb25zIHwgRmFub3V0VW5zcGVudHNPcHRpb25zID0ge30sXG4gICAgb3B0aW9uID0gTWFuYWdlVW5zcGVudHNPcHRpb25zLkJVSUxEX1NJR05fU0VORFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBpZiAodGhpcy5fd2FsbGV0LnR5cGUgPT09ICdjdXN0b2RpYWwnICYmIHJvdXRlTmFtZSA9PT0gJ2NvbnNvbGlkYXRlJykge1xuICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhdGVUcmFuc2FjdGlvbih7IC4uLnBhcmFtcywgdHlwZTogJ2NvbnNvbGlkYXRlJyB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJyAmJiByb3V0ZU5hbWUgPT09ICdmYW5vdXQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbml0aWF0ZVRyYW5zYWN0aW9uKHsgLi4ucGFyYW1zLCB0eXBlOiAnZmFub3V0JyB9KTtcbiAgICB9XG5cbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSk7XG5cbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgY29uc3QgZmFub3V0SW5wdXRGb3JtYXQgPSBwYXJhbXMubWF4TnVtSW5wdXRzVG9Vc2UgPyAnbWF4TnVtSW5wdXRzVG9Vc2UnIDogJ3Vuc3BlbnRzJztcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdmZWVSYXRlJyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdtYXhGZWVQZXJjZW50YWdlJyxcbiAgICAgICdmZWVUeENvbmZpcm1UYXJnZXQnLFxuXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtaW5IZWlnaHQnLFxuICAgICAgJ21pbkNvbmZpcm1zJyxcbiAgICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICAgJ3RhcmdldEFkZHJlc3MnLFxuICAgICAgJ3R4Rm9ybWF0JyxcbiAgICAgICdidWxrJyxcblxuICAgICAgcm91dGVOYW1lID09PSAnY29uc29saWRhdGUnID8gJ2xpbWl0JyA6IGZhbm91dElucHV0Rm9ybWF0LFxuICAgICAgJ251bVVuc3BlbnRzVG9NYWtlJyxcbiAgICBdKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgY29uc3QgYnVpbGRSZXNwb25zZTogVHJhbnNhY3Rpb25QcmVidWlsZCB8IFRyYW5zYWN0aW9uUHJlYnVpbGRbXSA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKGAvJHtyb3V0ZU5hbWV9VW5zcGVudHNgKSlcbiAgICAgIC5zZW5kKGZpbHRlcmVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuXG4gICAgaWYgKG9wdGlvbiA9PT0gTWFuYWdlVW5zcGVudHNPcHRpb25zLkJVSUxEX09OTFkpIHtcbiAgICAgIHJldHVybiBidWlsZFJlc3BvbnNlO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IChhd2FpdCB0aGlzLmJhc2VDb2luXG4gICAgICAua2V5Y2hhaW5zKClcbiAgICAgIC5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQgfSkpIGFzIHVua25vd24gYXMgS2V5Y2hhaW5bXTtcblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHBsYXRmb3JtLWJ1aWx0IHRyYW5zYWN0aW9uIG1hdGNoZXMgdXNlciBwYXJhbWV0ZXJzXG4gICAgY29uc3QgdHhQcmVidWlsZHMgPSBBcnJheS5pc0FycmF5KGJ1aWxkUmVzcG9uc2UpID8gYnVpbGRSZXNwb25zZSA6IFtidWlsZFJlc3BvbnNlXTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHR4UHJlYnVpbGRzLm1hcCgodHhQcmVidWlsZCkgPT5cbiAgICAgICAgdGhpcy5iYXNlQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIHdhbGxldDogdGhpcyxcbiAgICAgICAgICB2ZXJpZmljYXRpb246IHtcbiAgICAgICAgICAgIC4uLihwYXJhbXMudmVyaWZpY2F0aW9uID8/IHt9KSxcbiAgICAgICAgICAgIGtleWNoYWluczoge1xuICAgICAgICAgICAgICB1c2VyOiBrZXljaGFpbnNbMF0sXG4gICAgICAgICAgICAgIGJhY2t1cDoga2V5Y2hhaW5zWzFdLFxuICAgICAgICAgICAgICBiaXRnbzoga2V5Y2hhaW5zWzJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcUlkLFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBwdWJzOiBrZXljaGFpbnMubWFwKChrKSA9PiB7XG4gICAgICAgIGFzc2VydChrLnB1Yik7XG4gICAgICAgIHJldHVybiBrLnB1YjtcbiAgICAgIH0pLFxuICAgICAgLy8gQnVpbGRpbmcgUFNCVHMgd2l0aCB0aGUgYnVsayBmbGFnIGRvZXMgbm90IGluY2x1ZGUgdGhlIHByZXZpb3VzIHRyYW5zYWN0aW9uIGZvciBub24tc2Vnd2l0IGlucHV0cy5cbiAgICAgIC8vIE1hbnVhbGx5IG92ZXJyaWRlIHRoZSBzaWduaW5nIGFuZCB2YWxpZGF0aW5nIHRvIG5vdCBmYWlsLlxuICAgICAgYWxsb3dOb25TZWd3aXRTaWduaW5nV2l0aG91dFByZXZUeDogISFwYXJhbXMuYnVsayxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2VsZWN0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgWydjb21tZW50JywgJ290cCcsICdidWxrJ10pO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHR4UHJlYnVpbGRzLm1hcChhc3luYyAodHhQcmVidWlsZCkgPT4ge1xuICAgICAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAuLi50cmFuc2FjdGlvblBhcmFtcyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZmluYWxUeFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBzaWduZWRUcmFuc2FjdGlvbiwgc2VsZWN0UGFyYW1zLCB7XG4gICAgICAgICAgdHlwZTogcm91dGVOYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRyYW5zYWN0aW9uKGZpbmFsVHhQYXJhbXMsIHJlcUlkKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGJ1aWxkUmVzcG9uc2UpID8gcmVzcG9uc2UgOiByZXNwb25zZVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW5hZ2UgdGhlIHVuc3BlbnQgcmVzZXJ2YXRpb25zIG9uIHRoZSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcy5jcmVhdGUgLSBjcmVhdGUgYSBuZXcgcmVzZXJ2YXRpb25cbiAgICogQHBhcmFtIHBhcmFtcy5tb2RpZnkgLSBtb2RpZnkgYW4gZXhpc3RpbmcgcmVzZXJ2YXRpb25cbiAgICogQHBhcmFtIHBhcmFtcy5kZWxldGUgLSBkZWxldGUgYW4gZXhpc3RpbmcgcmVzZXJ2YXRpb25cbiAgICovXG4gIGFzeW5jIG1hbmFnZVVuc3BlbnRSZXNlcnZhdGlvbnMocGFyYW1zOiBNYW5hZ2VVbnNwZW50UmVzZXJ2YXRpb25PcHRpb25zKTogUHJvbWlzZTx7XG4gICAgdW5zcGVudHM6IHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICB3YWxsZXRJZDogc3RyaW5nO1xuICAgICAgZXhwaXJlVGltZTogc3RyaW5nO1xuICAgICAgdXNlcklkPzogc3RyaW5nO1xuICAgIH1bXTtcbiAgfT4ge1xuICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgWydjcmVhdGUnLCAnbW9kaWZ5JywgJ2RlbGV0ZSddKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIobmV3IFJlcXVlc3RUcmFjZXIoKSk7XG4gICAgLy8gVGhlIFVSTCBjYW5ub3QgY29udGFpbiB0aGUgY29pbk5hbWUsIHNvIHdlIHJlbW92ZSBpdCBmcm9tIHRoZSBVUkxcbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybChgL3Jlc2VydmVkdW5zcGVudHNgKS5yZXBsYWNlKGAvJHt0aGlzLmJhc2VDb2luLmdldENoYWluKCl9YCwgJycpO1xuICAgIGlmIChmaWx0ZXJlZFBhcmFtcy5jcmVhdGUpIHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkQ3JlYXRlUGFyYW1zID0gXy5waWNrKHBhcmFtcy5jcmVhdGUsIFsndW5zcGVudElkcycsICdleHBpcmVUaW1lJ10pO1xuICAgICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQoZmlsdGVyZWRDcmVhdGVQYXJhbXMpLnJlc3VsdCgpO1xuICAgIH0gZWxzZSBpZiAoZmlsdGVyZWRQYXJhbXMubW9kaWZ5KSB7XG4gICAgICBjb25zdCBmaWx0ZXJlZE1vZGlmeVBhcmFtcyA9IF8ucGljayhwYXJhbXMubW9kaWZ5LCBbJ3Vuc3BlbnRJZHMnLCAnY2hhbmdlcyddKTtcbiAgICAgIHJldHVybiB0aGlzLmJpdGdvLnB1dCh1cmwpLnNlbmQoZmlsdGVyZWRNb2RpZnlQYXJhbXMpLnJlc3VsdCgpO1xuICAgIH0gZWxzZSBpZiAoZmlsdGVyZWRQYXJhbXMuZGVsZXRlKSB7XG4gICAgICBjb25zdCBmaWx0ZXJlZERlbGV0ZVBhcmFtcyA9IF8ucGljayhwYXJhbXMuZGVsZXRlLCBbJ2lkJ10pO1xuICAgICAgcmV0dXJuIHRoaXMuYml0Z28uZGVsKHVybCkucXVlcnkoZmlsdGVyZWREZWxldGVQYXJhbXMpLnJlc3VsdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RpZCBub3QgZGV0ZWN0IGEgY3JlYXRpb24sIG1vZGlmaWNhdGlvbiwgb3IgZGVsZXRpb24gcmVxdWVzdC4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGUgdW5zcGVudHMgb24gYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBUaGUgZmVlIHJhdGUgdG8gdXNlIGZvciB0aGUgY29uc29saWRhdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVBlcmNlbnRhZ2UgLSB0aGUgbWF4aW11bSByZWxhdGl2ZSBwb3J0aW9uIHRoYXQgeW91J3JlIHdpbGxpbmcgdG8gc3BlbmQgdG93YXJkcyBmZWVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IC0gZXN0aW1hdGUgdGhlIGZlZXMgdG8gYWltIGZvciBmaXJzdCBjb25maXJtYXRpb24gd2l0aCB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1heFZhbHVlIC0gdGhlIG1heGltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluSGVpZ2h0IC0gdGhlIG1pbmltdW0gaGVpZ2h0IG9mIHVuc3BlbnRzIG9uIHRoZSBibG9jayBjaGFpbiB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIGFsbCBzZWxlY3RlZCB1bnNwZW50cyB3aWxsIGhhdmUgYXQgbGVhc3QgdGhpcyBtYW55IGNvbmZpcm1hdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gaWYgdHJ1ZSwgbWluQ29uZmlybXMgYWxzbyBhcHBsaWVzIHRvIGNoYW5nZSBvdXRwdXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGltaXQgICAgICAgICAgICAgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2NvbnNvbGlkYXRlJ1xuICAgKiAgICAgICAgICAgICAgICAgcGFyYW1zLm1heE51bUlucHV0c1RvVXNlICAgIGZvciByb3V0ZU5hbWUgPT09ICdmYW5vdXQnXG4gICAqICAgICAgICAgICAgICAgICAgLSBtYXhpbXVtIG51bWJlciBvZiB1bnNwZW50cyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlLiBJdCBpcyBub3QgYXBwbGljYWJsZSBmb3IgaWYgYnVsayBjb25zb2xpZGF0ZS5cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuYnVsayAtIGlmIHNldCB0byBUcnVlLCB0aGlzIGVuYWJsZXMgdGhlIGNvbnNvbGlkYXRpb24gb2YgbGFyZ2UgbnVtYmVyIG9mIHVuc3BlbnRzIGJ5IGNyZWF0aW5nIG11bHRpcGxlIHRyYW5zYWN0aW9ucyxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggZWFjaCB0cmFuc2FjdGlvbiBjb21wb3NlZCBvZiAyMDAgdW5zcGVudHMsIGV4Y2VwdCBmb3IgdGhlIGxhc3QgdHJhbnNhY3Rpb24gd2hpY2ggbWF5IGhhdmUgZmV3ZXIgdW5zcGVudHMuXG4gICAqL1xuICBhc3luYyBjb25zb2xpZGF0ZVVuc3BlbnRzKFxuICAgIHBhcmFtczogQ29uc29saWRhdGVVbnNwZW50c09wdGlvbnMgPSB7fSxcbiAgICBvcHRpb24gPSBNYW5hZ2VVbnNwZW50c09wdGlvbnMuQlVJTERfU0lHTl9TRU5EXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZVVuc3BlbnRzKCdjb25zb2xpZGF0ZScsIHBhcmFtcywgb3B0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYW5vdXQgdW5zcGVudHMgb24gYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVBlcmNlbnRhZ2UgLSB0aGUgbWF4aW11bSBwcm9wb3J0aW9uIG9mIGFuIHVuc3BlbnQgeW91IGFyZSB3aWxsaW5nIHRvIGxvc2UgdG8gZmVlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIGVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGggdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBkZXNpcmVkIGZlZSByYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gVGhlIG1heCBsaW1pdCBmb3IgYSBmZWUgcmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heE51bUlucHV0c1RvVXNlIC0gdGhlIG51bWJlciBvZiB1bnNwZW50cyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqXG4gICAqIEBwYXJhbSB7TWFuYWdlVW5zcGVudHNPcHRpb25zfSBvcHRpb24gLSBmbGFnIHRvIHRvZ2dsZSBidWlsZCBhbmQgc2VuZCBvciBidWlsZCBvbmx5XG4gICAqL1xuICBhc3luYyBmYW5vdXRVbnNwZW50cyhcbiAgICBwYXJhbXM6IEZhbm91dFVuc3BlbnRzT3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbiA9IE1hbmFnZVVuc3BlbnRzT3B0aW9ucy5CVUlMRF9TSUdOX1NFTkRcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlVW5zcGVudHMoJ2Zhbm91dCcsIHBhcmFtcywgb3B0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRva2VuIGZsdXNoIHRocmVzaG9sZHMgZm9yIHRoZSB3YWxsZXQuIFVwZGF0ZXMgdGhlIHdhbGxldC5cbiAgICogVG9rZW5zIHdpbGwgb25seSBiZSBmbHVzaGVkIGZyb20gZm9yd2FyZGVyIGNvbnRyYWN0cyBpZiB0aGUgYmFsYW5jZSBpcyBncmVhdGVyIHRoYW4gdGhlIHRocmVzaG9sZCBkZWZpbmVkIGhlcmUuXG4gICAqIEBwYXJhbSB0aHJlc2hvbGRzIHtPYmplY3R9IC0gcGFpcnMgb2YgeyBbdG9rZW5OYW1lXTogdGhyZXNob2xkIH0gKGJhc2UgdW5pdHMpXG4gICAqL1xuICBhc3luYyB1cGRhdGVUb2tlbkZsdXNoVGhyZXNob2xkcyh0aHJlc2hvbGRzOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLnVybCgpKVxuICAgICAgLnNlbmQoe1xuICAgICAgICB0b2tlbkZsdXNoVGhyZXNob2xkczogdGhyZXNob2xkcyxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gIH1cbiAgLyoqXG4gICAgICAqIFVwZGF0ZXMgdGhlIHdhbGxldC4gU2V0cyBmbGFncyBmb3IgZGVwbG95Rm9yd2FyZGVyc01hbnVhbGx5IGFuZCBmbHVzaEZvcndhcmRlcnNNYW51YWxseSBvZiB0aGUgd2FsbGV0LlxuICAgICAgKiBAcGFyYW0gZm9yd2FyZGVyRmxhZ3Mge09iamVjdH0gLSB7XG4gICAgICAgIFwiY29pblNwZWNpZmljXCI6IHtcbiAgICAgICAgICBbY29pbk5hbWVdOiB7XG4gICAgICAgICAgICBcImRlcGxveUZvcndhcmRlcnNNYW51YWxseVwiOiB7Qm9vbGVhbn0sXG4gICAgICAgICAgICBcImZsdXNoRm9yd2FyZGVyc01hbnVhbGx5XCI6IHtCb29sZWFufVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKi9cbiAgYXN5bmMgdXBkYXRlRm9yd2FyZGVycyhmb3J3YXJkZXJGbGFnczogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnZXRoJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHdhbGxldCcpO1xuICAgIH1cbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnB1dCh0aGlzLnVybCgpKS5zZW5kKGZvcndhcmRlckZsYWdzKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBtYW51YWxseSBkZXBsb3kgYW4gRVRIIGFkZHJlc3NcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmFkZHJlc3NdIC0gYWRkcmVzc0lkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmlkXSAtIGFkZHJlc3NJZCBjb3VsZCBiZSByZWNlaXZlZCBhbHNvIGFzIGlkXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEh0dHAgcmVzcG9uc2VcbiAgICovXG4gIGFzeW5jIGRlcGxveUZvcndhcmRlcnMocGFyYW1zOiBEZXBsb3lGb3J3YXJkZXJzT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmFkZHJlc3MpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhZGRyZXNzIG9yIGlkIG9mIGFkZHJlc3MgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuaWQ7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKGAvYWRkcmVzcy8ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9L2RlcGxveW1lbnRgKTtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBtYW51YWxseSBmb3J3YXJkIHRva2VucyBmcm9tIGFuIEVUSCBvciBDRUxPIGFkZHJlc3NcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudG9rZW5OYW1lIC0gTmFtZSBvZiB0b2tlbiB0aGF0IG5lZWRzIHRvIGJlIGZvcndhcmRlZCBmcm9tIHRoZSBhZGRyZXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmFkZHJlc3NdIC1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuYWRkcmVzc10gLSBhZGRyZXNzSWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuaWRdIC0gYWRkcmVzc0lkIGNvdWxkIGJlIHJlY2VpdmVkIGFsc28gYXMgaWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuZ2FzUHJpY2VdIC0gRXhwbGljaXQgZ2FzIHByaWNlIHRvIHVzZSB3aGVuIGZvcndhcmRpbmcgdG9rZW4gZnJvbSB0aGUgZm9yd2FyZGVyIGNvbnRyYWN0IChFVEggYW5kIENlbG8gb25seSkuIElmIG5vdCBnaXZlbiwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgZXN0aW1hdGVkIG5ldHdvcmsgZ2FzIHByaWNlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5laXAxNTU5XSAtIFNwZWNpZnkgZWlwMTU1OSBmZWUgcGFyYW1ldGVycyBpbiB0b2tlbiBmb3J3YXJkaW5nIHRyYW5zYWN0aW9uLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBIdHRwIHJlc3BvbnNlXG4gICAqL1xuICBhc3luYyBmbHVzaEZvcndhcmRlclRva2VuKHBhcmFtczogRmx1c2hGb3J3YXJkZXJUb2tlbk9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSAmJiBfLmlzVW5kZWZpbmVkKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyBvciBpZCBvZiBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGxldCBxdWVyeTtcbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmlkO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybChgL2FkZHJlc3MvJHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfS90b2tlbmZvcndhcmRgKTtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2VlcCBmdW5kcyBmb3IgYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYWRkcmVzcyAtIFRoZSBhZGRyZXNzIHRvIHNlbmQgYWxsIHRoZSBmdW5kcyBpbiB0aGUgd2FsbGV0IHRvXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLm90cCAtIFR3byBmYWN0b3IgYXV0aCBjb2RlIHRvIGVuYWJsZSBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIEVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGhpbiB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gVGhlIGRlc2lyZWQgZmVlIHJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gW3BhcmFtcy5tYXhGZWVSYXRlXSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3BhcmFtcy5hbGxvd1BhcnRpYWxTd2VlcF0gLSBhbGxvd3Mgc3dlZXBpbmcgMjAwIHVuc3BlbnRzIHdoZW4gdGhlIHdhbGxldCBoYXMgbW9yZSB0aGFuIHRoYXRcbiAgICogQHJldHVybnMgdHhIZXgge1N0cmluZ30gdGhlIHR4SGV4IG9mIHRoZSBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIGFzeW5jIHN3ZWVwKHBhcmFtczogU3dlZXBPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnLCAnb3RwJ10pO1xuXG4gICAgLy8gVGhlIHN3ZWVwIEFQSSBlbmRwb2ludCBpcyBvbmx5IGF2YWlsYWJsZSB0byB1dHhvLWJhc2VkIGNvaW5zXG5cbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3dlZXBXaXRoU2VuZE1hbnkoKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlybWVkQmFsYW5jZVN0cmluZygpICE9PSB0aGlzLmJhbGFuY2VTdHJpbmcoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2Nhbm5vdCBzd2VlcCB3aGVuIHVuY29uZmlybWVkIGZ1bmRzIGV4aXN0IG9uIHRoZSB3YWxsZXQsIHBsZWFzZSB3YWl0IHVudGlsIGFsbCBpbmJvdW5kIHRyYW5zYWN0aW9ucyBjb25maXJtJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL21heGltdW1TcGVuZGFibGUnKSkucmVzdWx0KCk7XG4gICAgICBjb25zdCBtYXhpbXVtU3BlbmRhYmxlID0gbmV3IEJpZ051bWJlcih2YWx1ZS5tYXhpbXVtU3BlbmRhYmxlKTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IG1heGltdW1TcGVuZGFibGUuaXNaZXJvKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBmdW5kcyB0byBzd2VlcCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZW5kTWFueVBhcmFtczogU2VuZE1hbnlPcHRpb25zID0ge1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyB8fCAnJywgLy8gRW5zdXJlIGFkZHJlc3MgaXMgYWx3YXlzIGEgc3RyaW5nXG4gICAgICAgICAgICBhbW91bnQ6IG1heGltdW1TcGVuZGFibGUudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHRoaXMuc2VuZE1hbnkoc2VuZE1hbnlQYXJhbXMpO1xuICAgIH1cbiAgICAvLyB0aGUgZm9sbG93aW5nIGZsb3cgd29ya3MgZm9yIGFsbCBVVFhPIGNvaW5zXG5cbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbXG4gICAgICAnYWRkcmVzcycsXG4gICAgICAnZmVlUmF0ZScsXG4gICAgICAnbWF4RmVlUmF0ZScsXG4gICAgICAnZmVlVHhDb25maXJtVGFyZ2V0JyxcbiAgICAgICdhbGxvd1BhcnRpYWxTd2VlcCcsXG4gICAgICAndHhGb3JtYXQnLFxuICAgIF0pO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zd2VlcFdhbGxldCcpKS5zZW5kKGZpbHRlcmVkUGFyYW1zKS5yZXN1bHQoKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHJlc3BvbnNlKTtcbiAgICBpZiAodHJhbnNhY3Rpb24/Lm91dHB1dHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBpbnZhbGlkT3V0cHV0QWRkcmVzcyA9IHRyYW5zYWN0aW9uLm91dHB1dHMuZmluZCgob3V0cHV0KSA9PiBvdXRwdXQuYWRkcmVzcyAhPT0gcGFyYW1zLmFkZHJlc3MpO1xuICAgICAgaWYgKGludmFsaWRPdXRwdXRBZGRyZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBzd2VlcCBkZXN0aW5hdGlvbiAke2ludmFsaWRPdXRwdXRBZGRyZXNzLmFkZHJlc3N9LCBzcGVjaWZpZWQgJHtwYXJhbXMuYWRkcmVzc31gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRyYW5zYWN0aW9uLCBubyBkZXN0aW5hdGlvbiBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gKGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkIH0pKSBhcyBhbnk7XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHR4UHJlYnVpbGQ6IHJlc3BvbnNlLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIHVzZXJLZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgYmFja3VwS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAxID8ga2V5Y2hhaW5zWzFdIDogbnVsbCxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAyID8ga2V5Y2hhaW5zWzJdIDogbnVsbCxcbiAgICAgIHBydjogcGFyYW1zLnhwcnYsXG4gICAgfTtcbiAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uUGFyYW1zKTtcblxuICAgIGNvbnN0IHNlbGVjdFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsnb3RwJ10pO1xuICAgIGNvbnN0IGZpbmFsVHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgc2lnbmVkVHJhbnNhY3Rpb24sIHNlbGVjdFBhcmFtcyk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24oZmluYWxUeFBhcmFtcywgcmVxSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZyZWV6ZSBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZnJlZXplKHBhcmFtczogRnJlZXplT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10pO1xuXG4gICAgaWYgKHBhcmFtcy5kdXJhdGlvbikge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5kdXJhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGR1cmF0aW9uOiBzaG91bGQgYmUgbnVtYmVyIG9mIHNlY29uZHMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvZnJlZXplJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY29tbWVudCBvZiBhIHRyYW5zZmVyXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2ZlckNvbW1lbnQocGFyYW1zOiBUcmFuc2ZlckNvbW1lbnRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgWydjb21tZW50J10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3RyYW5zZmVyLycgKyBwYXJhbXMuaWQgKyAnL2NvbW1lbnQnKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSBhZGRyZXNzZXMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBhZGRyZXNzZXMocGFyYW1zOiBBZGRyZXNzZXNPcHRpb25zID0ge30pOiBQcm9taXNlPEFkZHJlc3NRdWVyeVJlc3VsdD4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSk7XG5cbiAgICBjb25zdCBxdWVyeTogQWRkcmVzc2VzT3B0aW9ucyA9IHt9O1xuXG4gICAgaWYgKHBhcmFtcy5taW5lKSB7XG4gICAgICBxdWVyeS5taW5lID0gISFwYXJhbXMubWluZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc29ydCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5zb3J0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc29ydCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuc29ydCA9IHBhcmFtcy5zb3J0O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5sYWJlbENvbnRhaW5zKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmxhYmVsQ29udGFpbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsYWJlbENvbnRhaW5zIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5sYWJlbENvbnRhaW5zID0gcGFyYW1zLmxhYmVsQ29udGFpbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZWd3aXQgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zZWd3aXQgPSBwYXJhbXMuc2Vnd2l0O1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuY2hhaW5zKSkge1xuICAgICAgaWYgKCFfLmlzQXJyYXkocGFyYW1zLmNoYWlucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNoYWlucyBhcmd1bWVudCwgZXhwZWN0aW5nIGFycmF5IG9mIG51bWJlcnMnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmNoYWlucyA9IHBhcmFtcy5jaGFpbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlQmFsYW5jZXMpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlQmFsYW5jZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlQmFsYW5jZXMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlQmFsYW5jZXMgPSBwYXJhbXMuaW5jbHVkZUJhbGFuY2VzO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZVRva2VucykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluY2x1ZGVUb2tlbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlVG9rZW5zIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZVRva2VucyA9IHBhcmFtcy5pbmNsdWRlVG9rZW5zO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50KSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50ID0gcGFyYW1zLmluY2x1ZGVUb3RhbEFkZHJlc3NDb3VudDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJldHVybkJhbGFuY2VzRm9yVG9rZW4pIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJldHVybkJhbGFuY2VzRm9yVG9rZW4gYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnJldHVybkJhbGFuY2VzRm9yVG9rZW4gPSBwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnBlbmRpbmdEZXBsb3ltZW50KSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMucGVuZGluZ0RlcGxveW1lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwZW5kaW5nRGVwbG95bWVudCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnBlbmRpbmdEZXBsb3ltZW50ID0gcGFyYW1zLnBlbmRpbmdEZXBsb3ltZW50O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL2FkZHJlc3NlcycpKVxuICAgICAgLnF1ZXJ5KHF1ZXJ5KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIGFkZHJlc3NlcyBzb3J0ZWQgYnkgYmFsYW5jZSBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGFkZHJlc3Nlc0J5QmFsYW5jZShwYXJhbXM6IEFkZHJlc3Nlc0J5QmFsYW5jZU9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBBZGRyZXNzZXNCeUJhbGFuY2VPcHRpb25zID0ge1xuICAgICAgdG9rZW46IHBhcmFtcy50b2tlbixcbiAgICAgIG5mdENvbGxlY3Rpb25JZDogcGFyYW1zLm5mdENvbGxlY3Rpb25JZCxcbiAgICAgIG5mdElkOiBwYXJhbXMubmZ0SWQsXG4gICAgfTtcbiAgICBxdWVyeS5zb3J0ID0gcGFyYW1zLnNvcnQgPz8gLTE7XG4gICAgcXVlcnkucGFnZSA9IHBhcmFtcy5wYWdlID8/IDE7XG4gICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQgPz8gNTAwO1xuXG4gICAgaWYgKCFfLmlzTnVtYmVyKHF1ZXJ5LnNvcnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc29ydCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNOdW1iZXIocXVlcnkucGFnZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwYWdlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIGlmICghXy5pc051bWJlcihxdWVyeS5saW1pdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBpZiAocXVlcnkubGltaXQgPCAxIHx8IHF1ZXJ5LmxpbWl0ID4gNTAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xpbWl0IGFyZ3VtZW50IG11c3QgYmUgYmV0d2VlbiAxIGFuZCA1MDAnKTtcbiAgICB9XG5cbiAgICAvLyBBc3NlcnQgdGhhdCBlaXRoZXIgYm90aCBuZnRDb2xsZWN0aW9uSWQgYW5kIG5mdElkIGFyZSBwcm92aWRlZCBvciBuZWl0aGVyIGFyZSBwcm92aWRlZFxuICAgIGNvbnN0IGhhc05mdENvbGxlY3Rpb25JZCA9ICFfLmlzVW5kZWZpbmVkKHF1ZXJ5Lm5mdENvbGxlY3Rpb25JZCk7XG4gICAgY29uc3QgaGFzTmZ0SWQgPSAhXy5pc1VuZGVmaW5lZChxdWVyeS5uZnRJZCk7XG4gICAgaWYgKGhhc05mdENvbGxlY3Rpb25JZCAhPT0gaGFzTmZ0SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbmZ0Q29sbGVjdGlvbklkIGFuZCBuZnRJZCBtdXN0IGJvdGggYmUgcHJvdmlkZWQgb3IgYm90aCBiZSBvbWl0dGVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvYWRkcmVzc2VzL2JhbGFuY2VzJykpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc2luZ2xlIHdhbGxldCBhZGRyZXNzIGJ5IGl0cyBpZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0QWRkcmVzcyhwYXJhbXM6IEdldEFkZHJlc3NPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ2FkZHJlc3MnLCAnaWQnXSk7XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSAmJiBfLmlzVW5kZWZpbmVkKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyBvciBpZCBvZiBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuaWQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoYC93YWxsZXQvJHt0aGlzLl93YWxsZXQuaWR9L2FkZHJlc3MvJHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWApKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBvbmUgb3IgbW9yZSBuZXcgYWRkcmVzcyhlcykgZm9yIHVzZSB3aXRoIHRoaXMgd2FsbGV0LlxuICAgKlxuICAgKiBJZiB0aGUgYGNvdW50YCBmaWVsZCBpcyBkZWZpbmVkIGFuZCBncmVhdGVyIHRoYW4gMSwgYW4gb2JqZWN0IHdpdGggYSBzaW5nbGVcbiAgICogYXJyYXkgcHJvcGVydHkgbmFtZWQgYGFkZHJlc3Nlc2AgY29udGFpbmluZyBgY291bnRgIGFkZHJlc3Mgb2JqZWN0c1xuICAgKiB3aWxsIGJlIHJldHVybmVkLiBPdGhlcndpc2UsIGEgc2luZ2xlIGFkZHJlc3Mgb2JqZWN0IGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuY2hhaW4gb24gd2hpY2ggdGhlIG5ldyBhZGRyZXNzIHNob3VsZCBiZSBjcmVhdGVkXG4gICAqIEBwYXJhbSB7KE51bWJlcnxTdHJpbmcpfSBwYXJhbXMuZ2FzUHJpY2UgZ2FzIHByaWNlIGZvciBuZXcgYWRkcmVzcyBjcmVhdGlvbiwgaWYgYXBwbGljYWJsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmxhYmVsIGxhYmVsIGZvciB0aGUgbmV3IGFkZHJlc3MoZXMpXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuY291bnQ9MSBudW1iZXIgb2YgbmV3IGFkZHJlc3NlcyB3aGljaCBzaG91bGQgYmUgY3JlYXRlZCAobWF4aW11bSAyNTApXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZm9yd2FyZGVyVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiBhZGRyZXNzIHRvIGNyZWF0ZSwgaWYgYXBwbGljYWJsZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5sb3dQcmlvcml0eSBFdGhlcmV1bS1zcGVjaWZpYyBwYXJhbSB0byBjcmVhdGUgYWRkcmVzcyB1c2luZyBsb3cgcHJpb3JpdHkgZmVlIGFkZHJlc3NcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5iYXNlQWRkcmVzcyBiYXNlIGFkZHJlc3Mgb2YgdGhlIHdhbGxldChvcHRpb25hbCBwYXJhbWV0ZXIpXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmFsbG93U2tpcFZlcmlmeUFkZHJlc3MgV2hlbiBzZXQgdG8gZmFsc2UsIGl0IHRocm93cyBlcnJvciBpZiBhZGRyZXNzIHZlcmlmaWNhdGlvbiBpcyBza2lwcGVkIGZvciBhbnkgcmVhc29uLiBEZWZhdWx0IGlzIHRydWUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMub25Ub2tlbiBtYW5kYXRvcnkgaW4gY2FzZSBvZiB0aGUgT0ZDIHdhbGxldCwgdGhlIG5hbWUgb2YgdG9rZW4gdG8gY3JlYXRlIGFkZHJlc3MgZm9yXG4gICAqIEFkZHJlc3MgdmVyaWZpY2F0aW9uIGNhbiBiZSBza2lwcGVkIHdoZW4gZm9yd2FyZGVyVmVyc2lvbiBpcyAwIGFuZCBwZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiBpcyB0cnVlIE9SXG4gICAqIGlmICdjb2luU3BlY2lmaWMnIGlzIG5vdCBwYXJ0IG9mIHRoZSByZXNwb25zZSBmcm9tIGFwaSBjYWxsIHRvIGNyZWF0ZSBhZGRyZXNzXG4gICAqL1xuICBhc3luYyBjcmVhdGVBZGRyZXNzKHBhcmFtczogQ3JlYXRlQWRkcmVzc09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgYWRkcmVzc1BhcmFtczogQ3JlYXRlQWRkcmVzc09wdGlvbnMgPSB7fTtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBjaGFpbixcbiAgICAgIGdhc1ByaWNlLFxuICAgICAgbGFiZWwsXG4gICAgICBsb3dQcmlvcml0eSxcbiAgICAgIGZvcndhcmRlclZlcnNpb24sXG4gICAgICBmb3JtYXQsXG4gICAgICBjb3VudCA9IDEsXG4gICAgICBiYXNlQWRkcmVzcyxcbiAgICAgIGFsbG93U2tpcFZlcmlmeUFkZHJlc3MgPSB0cnVlLFxuICAgICAgb25Ub2tlbixcbiAgICAgIGV2bUtleVJpbmdSZWZlcmVuY2VBZGRyZXNzLFxuICAgIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoY2hhaW4pKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKGNoYWluKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NoYWluIGhhcyB0byBiZSBhbiBpbnRlZ2VyJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmNoYWluID0gY2hhaW47XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGdhc1ByaWNlKSkge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihnYXNQcmljZSkgJiYgKGlzTmFOKE51bWJlcihnYXNQcmljZSkpIHx8ICFfLmlzU3RyaW5nKGdhc1ByaWNlKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnYXNQcmljZSBoYXMgdG8gYmUgYW4gaW50ZWdlciBvciBudW1lcmljIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5nYXNQcmljZSA9IGdhc1ByaWNlO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChmb3J3YXJkZXJWZXJzaW9uKSkge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihmb3J3YXJkZXJWZXJzaW9uKSB8fCBmb3J3YXJkZXJWZXJzaW9uIDwgMCB8fCBmb3J3YXJkZXJWZXJzaW9uID4gNSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZvcndhcmRlclZlcnNpb24gaGFzIHRvIGJlIGFuIGludGVnZXIgMCwgMSwgMiwgMywgNCBvciA1Jyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmZvcndhcmRlclZlcnNpb24gPSBmb3J3YXJkZXJWZXJzaW9uO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChsYWJlbCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhsYWJlbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsYWJlbCBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMubGFiZWwgPSBsYWJlbDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYmFzZUFkZHJlc3MpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoYmFzZUFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYmFzZUFkZHJlc3MgaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGFsbG93U2tpcFZlcmlmeUFkZHJlc3MpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKGFsbG93U2tpcFZlcmlmeUFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcyBoYXMgdG8gYmUgYSBib29sZWFuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzSW50ZWdlcihjb3VudCkgfHwgY291bnQgPD0gMCB8fCBjb3VudCA+IDI1MCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VudCBoYXMgdG8gYmUgYSBudW1iZXIgYmV0d2VlbiAxIGFuZCAyNTAnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQobG93UHJpb3JpdHkpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKGxvd1ByaW9yaXR5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xvd1ByaW9yaXR5IGhhcyB0byBiZSBhIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMubG93UHJpb3JpdHkgPSBsb3dQcmlvcml0eTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZm9ybWF0KSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGZvcm1hdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3JtYXQgaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmZvcm1hdCA9IGZvcm1hdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PT0gJ29mYycpIHtcbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZChvblRva2VuKSkge1xuICAgICAgICBpZiAoIV8uaXNTdHJpbmcob25Ub2tlbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uVG9rZW4gaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkcmVzc1BhcmFtcy5vblRva2VuID0gb25Ub2tlbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb25Ub2tlbiBpcyBhIG1hbmRhdG9yeSBwYXJhbWV0ZXIgZm9yIE9GQyB3YWxsZXRzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNTdHJpbmcob25Ub2tlbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvblRva2VuIGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcykpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcyBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5iYXNlQ29pbi5pc0VWTSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXZtS2V5UmluZ1JlZmVyZW5jZUFkZHJlc3MgaXMgb25seSBzdXBwb3J0ZWQgZm9yIEVWTSBjaGFpbnMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5iYXNlQ29pbi5pc1ZhbGlkQWRkcmVzcyhldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcyBtdXN0IGJlIGEgdmFsaWQgYWRkcmVzcycpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5ldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcyA9IGV2bUtleVJpbmdSZWZlcmVuY2VBZGRyZXNzO1xuICAgIH1cblxuICAgIC8vIGdldCBrZXljaGFpbnMgZm9yIGFkZHJlc3MgdmVyaWZpY2F0aW9uXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fd2FsbGV0LmtleXMubWFwKChrKSA9PiB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldCh7IGlkOiBrLCByZXFJZCB9KSkpO1xuICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gXy5nZXQodGhpcy5fd2FsbGV0LCAncmVjZWl2ZUFkZHJlc3MuYWRkcmVzcycpO1xuXG4gICAgY29uc3QgbmV3QWRkcmVzc2VzID0gXy50aW1lcyhjb3VudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICAgIGNvbnN0IG5ld0FkZHJlc3MgPSAoYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy9hZGRyZXNzJykpXG4gICAgICAgIC5zZW5kKGFkZHJlc3NQYXJhbXMpXG4gICAgICAgIC5yZXN1bHQoKSkgYXMgYW55O1xuXG4gICAgICBuZXdBZGRyZXNzLmtleWNoYWlucyA9IGtleWNoYWlucztcbiAgICAgIG5ld0FkZHJlc3MuYmFzZUFkZHJlc3MgPSBiYXNlQWRkcmVzcyA/PyBfLmdldCh0aGlzLl93YWxsZXQsICdjb2luU3BlY2lmaWMuYmFzZUFkZHJlc3MnKTtcbiAgICAgIG5ld0FkZHJlc3MuZm9ybWF0ID0gYWRkcmVzc1BhcmFtcy5mb3JtYXQ7XG5cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkRhdGE6IFZlcmlmeUFkZHJlc3NPcHRpb25zID0gXy5tZXJnZSh7fSwgbmV3QWRkcmVzcywge1xuICAgICAgICByb290QWRkcmVzcyxcbiAgICAgICAgd2FsbGV0VmVyc2lvbjogXy5nZXQodGhpcy5fd2FsbGV0LCAnY29pblNwZWNpZmljLndhbGxldFZlcnNpb24nKSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodmVyaWZpY2F0aW9uRGF0YS5lcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgQWRkcmVzc0dlbmVyYXRpb25FcnJvcih2ZXJpZmljYXRpb25EYXRhLmVycm9yKTtcbiAgICAgIH1cblxuICAgICAgdmVyaWZpY2F0aW9uRGF0YS5pbXBsaWVkRm9yd2FyZGVyVmVyc2lvbiA9IGZvcndhcmRlclZlcnNpb24gPz8gdmVyaWZpY2F0aW9uRGF0YS5jb2luU3BlY2lmaWM/LmZvcndhcmRlclZlcnNpb247XG5cbiAgICAgIC8vIEZvciBTTUMgKFNlbGYtTWFuYWdlZCBDdXN0b2RpYWwpIHdhbGxldHMsIHBhc3MgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCBmcm9tIHVzZXIga2V5Y2hhaW5cbiAgICAgIC8vIFRoZSB2ZXJpZmljYXRpb24gZnVuY3Rpb24gd2lsbCBjb21wdXRlIHRoZSBkZXJpdmF0aW9uIHByZWZpeCBpbnRlcm5hbGx5XG4gICAgICAvLyBDdXN0b2RpYWwgd2FsbGV0cyBkb24ndCBuZWVkIHRoaXMgYXMgdGhlaXIgY29tbW9uS2V5Y2hhaW4gYWxyZWFkeSBhY2NvdW50cyBmb3IgdGhlIHByZWZpeFxuICAgICAgaWYgKHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICd0c3MnICYmIHRoaXMudHlwZSgpID09PSAnY29sZCcgJiYgdGhpcy5fd2FsbGV0LmtleXMubGVuZ3RoID4gS2V5SW5kaWNlcy5VU0VSKSB7XG4gICAgICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IGtleWNoYWluc1tLZXlJbmRpY2VzLlVTRVJdIGFzIEtleWNoYWluIHwgdW5kZWZpbmVkO1xuICAgICAgICB2ZXJpZmljYXRpb25EYXRhLmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQgPSB1c2VyS2V5Y2hhaW4/LmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoaXMgY29uZGl0aW9uIHdhcyBhZGRlZCBpbiBmaXJzdCBwbGFjZSBiZWNhdXNlIGluIGNlbG8sIHdoZW4gdmVyaWZ5QWRkcmVzcyBtZXRob2Qgd2FzIGNhbGxlZCBvbiBhZGRyZXNzZXMgd2hpY2ggd2VyZSBoYXZpbmcgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gYXMgdHJ1ZSwgaXQgdXNlZCB0byB0aHJvdyBzb21lIGVycm9yXG4gICAgICAvLyBJbiBjYXNlIG9mIGZvcndhcmRlciB2ZXJzaW9uIDEgZXRoIGFkZHJlc3NlcywgYWRkcmVzc2VzIG5lZWQgdG8gYmUgdmVyaWZpZWQgZXZlbiBpZiB0aGUgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gZmxhZyBpcyB0cnVlXG4gICAgICBpZiAoXG4gICAgICAgIHZlcmlmaWNhdGlvbkRhdGEuY29pblNwZWNpZmljICYmXG4gICAgICAgICghdmVyaWZpY2F0aW9uRGF0YS5jb2luU3BlY2lmaWMucGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gfHwgdmVyaWZpY2F0aW9uRGF0YS5pbXBsaWVkRm9yd2FyZGVyVmVyc2lvbiA9PT0gMSlcbiAgICAgICkge1xuICAgICAgICAvLyBjYW4ndCB2ZXJpZnkgYWRkcmVzc2VzIHdoaWNoIGFyZSBwZW5kaW5nIGNoYWluIGluaXRpYWxpemF0aW9uLCBhcyB0aGUgYWRkcmVzcyBpcyBoaWRkZW5cbiAgICAgICAgbGV0IGlzV2FsbGV0QWRkcmVzcyA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlzV2FsbGV0QWRkcmVzcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uaXNXYWxsZXRBZGRyZXNzKHZlcmlmaWNhdGlvbkRhdGEsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGSVhNRShCRy00MzIyNSk6IGltcGxlbWVudCB0aGlzIGNvcnJlY3RseVxuICAgICAgICAgIGlzV2FsbGV0QWRkcmVzcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1dhbGxldEFkZHJlc3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vdCBhIHdhbGxldCBhZGRyZXNzYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWFsbG93U2tpcFZlcmlmeUFkZHJlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBhZGRyZXNzIHZlcmlmaWNhdGlvbiBza2lwcGVkIGZvciBjb3VudCA9ICR7Y291bnR9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdBZGRyZXNzO1xuICAgIH0pO1xuXG4gICAgaWYgKG5ld0FkZHJlc3Nlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBuZXdBZGRyZXNzZXNbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZHJlc3NlczogYXdhaXQgUHJvbWlzZS5hbGwobmV3QWRkcmVzc2VzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBwcm9wZXJ0aWVzIG9uIGFuIGFkZHJlc3NcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUFkZHJlc3MocGFyYW1zOiBVcGRhdGVBZGRyZXNzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBhZGRyZXNzID0gcGFyYW1zLmFkZHJlc3M7XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIGFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwdXRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ2xhYmVsJ10pO1xuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvYWRkcmVzcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFkZHJlc3MpKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLnB1dCh1cmwpLnNlbmQocHV0UGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWNjb3VudCByZXNvdXJjZXMgZm9yIHRoZSBnaXZlbiBhZGRyZXNzZXNcbiAgICogQHBhcmFtIHBhcmFtcyAtIG9wdGlvbnMgb2JqZWN0IGNvbnRhaW5pbmcgYWRkcmVzc2VzIGFuZCBvcHRpb25hbCBkZXN0aW5hdGlvbkFkZHJlc3NcbiAgICogQHJldHVybnMge1Byb21pc2U8R2V0QWNjb3VudFJlc291cmNlc1Jlc3BvbnNlPn0gLSByZXNwb25zZSBmcm9tIFdQIEFQSVxuICAgKi9cbiAgYXN5bmMgZ2V0QWNjb3VudFJlc291cmNlcyhwYXJhbXM6IEdldEFjY291bnRSZXNvdXJjZXNPcHRpb25zKTogUHJvbWlzZTxHZXRBY2NvdW50UmVzb3VyY2VzUmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IGFkZHJlc3NlcywgZGVzdGluYXRpb25BZGRyZXNzIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWRkcmVzc2VzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhZGRyZXNzZXMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChhZGRyZXNzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkZHJlc3NlcyBhcnJheSBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5OiBHZXRBY2NvdW50UmVzb3VyY2VzT3B0aW9ucyA9IHsgYWRkcmVzc2VzIH07XG4gICAgaWYgKGRlc3RpbmF0aW9uQWRkcmVzcykge1xuICAgICAgYm9keS5kZXN0aW5hdGlvbkFkZHJlc3MgPSBkZXN0aW5hdGlvbkFkZHJlc3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL2dldEFjY291bnRSZXNvdXJjZXMnKSkuc2VuZChib2R5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVzb3VyY2UgZGVsZWdhdGlvbnMgZm9yIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXMgLSBvcHRpb25hbCBmaWx0ZXJzOiB0eXBlLCByZXNvdXJjZSwgbGltaXQsIG5leHRCYXRjaFByZXZJZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxHZXRSZXNvdXJjZURlbGVnYXRpb25zUmVzcG9uc2U+fSAtIHJlc3BvbnNlIGZyb20gV1AgQVBJXG4gICAqL1xuICBhc3luYyBnZXRSZXNvdXJjZURlbGVnYXRpb25zKHBhcmFtcz86IEdldFJlc291cmNlRGVsZWdhdGlvbnNPcHRpb25zKTogUHJvbWlzZTxHZXRSZXNvdXJjZURlbGVnYXRpb25zUmVzcG9uc2U+IHtcbiAgICBjb25zdCBxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPiA9IHt9O1xuICAgIGlmIChwYXJhbXM/LnR5cGUgIT09IHVuZGVmaW5lZCkgcXVlcnlQYXJhbXMudHlwZSA9IHBhcmFtcy50eXBlO1xuICAgIGlmIChwYXJhbXM/LnJlc291cmNlICE9PSB1bmRlZmluZWQpIHF1ZXJ5UGFyYW1zLnJlc291cmNlID0gcGFyYW1zLnJlc291cmNlO1xuICAgIGlmIChwYXJhbXM/LmxpbWl0ICE9PSB1bmRlZmluZWQpIHF1ZXJ5UGFyYW1zLmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIGlmIChwYXJhbXM/Lm5leHRCYXRjaFByZXZJZCAhPT0gdW5kZWZpbmVkKSBxdWVyeVBhcmFtcy5uZXh0QmF0Y2hQcmV2SWQgPSBwYXJhbXMubmV4dEJhdGNoUHJldklkO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvcmVzb3VyY2VkZWxlZ2F0aW9ucycpKS5xdWVyeShxdWVyeVBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVXYWxsZXRCdWlsZERlZmF1bHRzKHBhcmFtczogVXBkYXRlQnVpbGREZWZhdWx0T3B0aW9ucyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ21pbkZlZVJhdGUnLCAnY2hhbmdlQWRkcmVzc1R5cGUnLCAndHhGb3JtYXQnXSk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlV2FsbGV0KHtcbiAgICAgIGJ1aWxkRGVmYXVsdHM6IHtcbiAgICAgICAgbWluRmVlUmF0ZTogcGFyYW1zLm1pbkZlZVJhdGUsXG4gICAgICAgIGNoYW5nZUFkZHJlc3NUeXBlOiBwYXJhbXMuY2hhbmdlQWRkcmVzc1R5cGUsXG4gICAgICAgIHR4Rm9ybWF0OiBwYXJhbXMudHhGb3JtYXQsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlV2FsbGV0KHBhcmFtczogVXBkYXRlV2FsbGV0T3B0aW9ucyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgWydjb2luU3BlY2lmaWMnLCAnYnVpbGREZWZhdWx0cycsICdsYWJlbCddKTtcbiAgICBjb25zdCB7IGNvaW5TcGVjaWZpYywgLi4ucmVzdCB9ID0gZmlsdGVyZWRQYXJhbXM7XG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wdXQodGhpcy51cmwoKSlcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgLi4ucmVzdCxcbiAgICAgICAgLi4uKGNvaW5TcGVjaWZpY1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICAgICAgICBbdGhpcy5iYXNlQ29pbi5nZXRDaGFpbigpXTogY29pblNwZWNpZmljLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHdlYmhvb2tzIG9uIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGxpc3RXZWJob29rcyhwYXJhbXM6IFBhZ2luYXRpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9O1xuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW11bGF0ZSB3YWxsZXQgd2ViaG9vaywgY3VycmVudGx5IGZvciB3ZWJob29rcyBvZiB0eXBlIHRyYW5zZmVyIGFuZCBwZW5kaW5nIGFwcHJvdmFsXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB3ZWJob29rSWQgKHJlcXVpcmVkKSBpZCBvZiB0aGUgd2ViaG9vayB0byBiZSBzaW11bGF0ZWRcbiAgICogLSB0cmFuc2ZlcklkIChvcHRpb25hbCBidXQgcmVxdWlyZWQgZm9yIHRyYW5zZmVyIHdlYmhvb2tzKSBpZCBvZiB0aGUgc2ltdWxhdGVkIHRyYW5zZmVyXG4gICAqIC0gcGVuZGluZ0FwcHJvdmFsSWQgKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgcGVuZGluZyBhcHByb3ZhbCB3ZWJob29rcykgaWQgb2YgdGhlIHNpbXVsYXRlZCBwZW5kaW5nIGFwcHJvdmFsXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2ltdWxhdGVXZWJob29rKHBhcmFtczogU2ltdWxhdGVXZWJob29rT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dlYmhvb2tJZCddLCBbJ3RyYW5zZmVySWQnLCAncGVuZGluZ0FwcHJvdmFsSWQnXSk7XG5cbiAgICBjb25zdCBoYXNUcmFuc2ZlcklkID0gISFwYXJhbXMudHJhbnNmZXJJZDtcbiAgICBjb25zdCBoYXNQZW5kaW5nQXBwcm92YWxJZCA9ICEhcGFyYW1zLnBlbmRpbmdBcHByb3ZhbElkO1xuICAgIGlmICghaGFzVHJhbnNmZXJJZCAmJiAhaGFzUGVuZGluZ0FwcHJvdmFsSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzdXBwbHkgZWl0aGVyIHRyYW5zZmVySWQgb3IgcGVuZGluZ0FwcHJvdmFsSWQnKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzVHJhbnNmZXJJZCAmJiBoYXNQZW5kaW5nQXBwcm92YWxJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHJhbnNmZXJJZCBvciBwZW5kaW5nQXBwcm92YWxJZCwgYnV0IG5vdCBib3RoJyk7XG4gICAgfVxuXG4gICAgLy8gZGVwZW5kaW5nIG9uIHRoZSBjb2luIHR5cGUgb2YgdGhlIHdhbGxldCwgdGhlIHR4SGFzaCBoYXMgdG8gYWRoZXJlIHRvIGl0cyByZXNwZWN0aXZlIGZvcm1hdFxuICAgIC8vIGJ1dCB0aGUgc2VydmVyIHRha2VzIGNhcmUgb2YgdGhhdFxuXG4gICAgLy8gb25seSB0YWtlIHRoZSB0cmFuc2ZlcklkIGFuZCBwZW5kaW5nQXBwcm92YWxJZCBwcm9wZXJ0aWVzXG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ3RyYW5zZmVySWQnLCAncGVuZGluZ0FwcHJvdmFsSWQnXSk7XG5cbiAgICBjb25zdCB3ZWJob29rSWQgPSBwYXJhbXMud2ViaG9va0lkO1xuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzLycgKyB3ZWJob29rSWQgKyAnL3NpbXVsYXRlJykpXG4gICAgICAuc2VuZChmaWx0ZXJlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSB3ZWJob29rIHRvIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGFkZFdlYmhvb2socGFyYW1zOiBNb2RpZnlXZWJob29rT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCcsICd0eXBlJ10sIFtdKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy93ZWJob29rcycpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgd2ViaG9vayBmcm9tIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHJlbW92ZVdlYmhvb2socGFyYW1zOiBNb2RpZnlXZWJob29rT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCcsICd0eXBlJ10sIFtdKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1c2VyIGtleWNoYWluIGZvciB0aGlzIHdhbGxldFxuICAgKlxuICAgKiBUaGUgdXNlciBrZXljaGFpbiBpcyB0aGUgZmlyc3Qga2V5Y2hhaW4gb2YgdGhlIHdhbGxldCBhbmQgdXN1YWxseSBoYXMgdGhlIGVuY3J5cHRlZCBwcnYgc3RvcmVkIG9uIEJpdEdvLlxuICAgKiBVc2VmdWwgd2hlbiB0cnlpbmcgdG8gZ2V0IHRoZSB1c2Vycycga2V5Y2hhaW4gZnJvbSB0aGUgc2VydmVyIGJlZm9yZSBkZWNyeXB0aW5nIHRvIHNpZ24gYSB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIGdldEVuY3J5cHRlZFVzZXJLZXljaGFpbigpOiBQcm9taXNlPEtleWNoYWluV2l0aEVuY3J5cHRlZFBydj4ge1xuICAgIGNvbnN0IHRyeUtleUNoYWluID0gYXN5bmMgKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPEtleWNoYWluV2l0aEVuY3J5cHRlZFBydj4gPT4ge1xuICAgICAgaWYgKCF0aGlzLl93YWxsZXQua2V5cyB8fCBpbmRleCA+PSB0aGlzLl93YWxsZXQua2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdFbmNyeXB0ZWRLZXljaGFpbkVycm9yKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgaWQ6IHRoaXMuX3dhbGxldC5rZXlzW2luZGV4XSB9O1xuXG4gICAgICBjb25zdCBrZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHBhcmFtcyk7XG4gICAgICAvLyBJZiB3ZSBmaW5kIHRoZSBwcnYsIHRoZW4gdGhpcyBpcyBwcm9iYWJseSB0aGUgdXNlciBrZXljaGFpbiB3ZSdyZSBsb29raW5nIGZvclxuICAgICAgaWYgKGtleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgICByZXR1cm4ga2V5Y2hhaW4gYXMgS2V5Y2hhaW5XaXRoRW5jcnlwdGVkUHJ2O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRyeUtleUNoYWluKGluZGV4ICsgMSk7XG4gICAgfTtcblxuICAgIHJldHVybiB0cnlLZXlDaGFpbigwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1bmVuY3J5cHRlZCBwcml2YXRlIGtleSBmb3IgdGhpcyB3YWxsZXQgKGJlIGNhcmVmdWwhKVxuICAgKiBSZXF1aXJlcyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXRQcnYocGFyYW1zOiBHZXRQcnZPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAncHJ2J10pO1xuXG4gICAgLy8gUHJlcGFyZSBzaWduaW5nIGtleVxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcnYpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgZWl0aGVyIHByb3ZpZGUgcHJ2IG9yIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcnYpICYmICFfLmlzU3RyaW5nKHBhcmFtcy5wcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSAmJiAhXy5pc1N0cmluZyhwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0UGFzc3BocmFzZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wcnYpIHtcbiAgICAgIHJldHVybiBwYXJhbXMucHJ2O1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IGF3YWl0IHRoaXMuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCk7XG4gICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXQgcGFzc3BocmFzZSB3YXMgbm90IHByb3ZpZGVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJQcnYgPSBkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5KHRoaXMuYml0Z28sIHVzZXJLZXljaGFpbiwgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpO1xuICAgIGlmICghdXNlclBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlcnJvciBkZWNyeXB0aW5nIHdhbGxldCBwcml2YXRlIGtleScpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlclBydjtcbiAgfVxuXG4gIHByaXZhdGUgaXNNdWx0aVVzZXJLZXlXYWxsZXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM/LmZlYXR1cmVzPy5pbmNsdWRlcygnbXVsdGkta2V5LXVzZXIta2V5JykgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhbiBlbmNyeXB0ZWQgd2FsbGV0IHNoYXJlIHRvIEJpdEdvLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBjcmVhdGVTaGFyZShwYXJhbXM6IENyZWF0ZVNoYXJlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXInLCAncGVybWlzc2lvbnMnXSwgW10pO1xuXG4gICAgY29uc3QgaXNNdWx0aVVzZXJLZXlXYWxsZXQgPSB0aGlzLmlzTXVsdGlVc2VyS2V5V2FsbGV0KCk7XG5cbiAgICBpZiAoaXNNdWx0aVVzZXJLZXlXYWxsZXQpIHtcbiAgICAgIGlmIChwYXJhbXMua2V5Y2hhaW4gJiYgIV8uaXNFbXB0eShwYXJhbXMua2V5Y2hhaW4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigna2V5Y2hhaW4gcHJvcGVydHkgbXVzdCBub3QgYmUgcHJvdmlkZWQgZm9yIG11bHRpLWtleS11c2VyLWtleSB3YWxsZXRzJyk7XG4gICAgICB9XG4gICAgICAvLyBSZW1vdmUga2V5Y2hhaW4gZnJvbSBwYXJhbXMgaWYgcHJlc2VudHNcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zaGFyZScpKS5zZW5kKF8ub21pdChwYXJhbXMsICdrZXljaGFpbicpKS5yZXN1bHQoKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmtleWNoYWluICYmICFfLmlzRW1wdHkocGFyYW1zLmtleWNoYWluKSkge1xuICAgICAgaWYgKFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLnB1YiB8fFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLmVuY3J5cHRlZFBydiB8fFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLmZyb21QdWJLZXkgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi50b1B1YktleSB8fFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLnBhdGhcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVzIGtleWNoYWluIHBhcmFtZXRlcnMgLSBwdWIsIGVuY3J5cHRlZFBydiwgZnJvbVB1YktleSwgdG9QdWJLZXksIHBhdGgnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvc2hhcmUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlcyBhIHdhbGxldCB3aXRoIG11bHRpcGxlIHVzZXJzIGJ5IGNyZWF0aW5nIGJ1bGsgd2FsbGV0IHNoYXJlcy5cbiAgICpcbiAgICogQGFzeW5jXG4gICAqIEBwYXJhbSB7QnVsa1dhbGxldFNoYXJlT3B0aW9uc30gcGFyYW1zIC0gVGhlIG9wdGlvbnMgZm9yIHNoYXJpbmcgd2FsbGV0cyBpbiBidWxrLlxuICAgKiBAcGFyYW0ge0FycmF5PFNoYXJlT3B0aW9uPn0gcGFyYW1zLnNoYXJlT3B0aW9ucyAtIEFuIGFycmF5IG9mIHNoYXJlIG9wdGlvbiBvYmplY3RzIGNvbnRhaW5pbmcgdXNlciBhbmQgcGVybWlzc2lvbnMgaW5mb3JtYXRpb24uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zLnNoYXJlT3B0aW9uc1tdLmtleWNoYWluXSAtIFRoZSBrZXljaGFpbiBvYmplY3QgdXNlZCB0byBzaGFyZSB0aGUgd2FsbGV0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhcmFtcy5zaGFyZU9wdGlvbnNbXS5rZXljaGFpbi50b1B1YktleV0gLSBUaGUgcmVjaXBpZW50J3MgcHVibGljIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMuc2hhcmVPcHRpb25zW10ua2V5Y2hhaW4ucGF0aF0gLSBUaGUgZGVyaXZhdGlvbiBwYXRoIG9mIHRoZSBrZXljaGFpbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5zaGFyZU9wdGlvbnNbXS51c2VyIC0gVGhlIHVzZXIgdG8gc2hhcmUgdGhlIHdhbGxldCB3aXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNoYXJlT3B0aW9uc1tdLnBlcm1pc3Npb25zIC0gVGhlIHBlcm1pc3Npb25zIGdyYW50ZWQgdG8gdGhlIHVzZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLndhbGxldFBhc3NwaHJhc2VdIC0gVGhlIHdhbGxldCBwYXNzcGhyYXNlIHVzZWQgdG8gZGVjcnlwdCB0aGUga2V5Y2hhaW4uXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBgc2hhcmVPcHRpb25zYCBpcyBlbXB0eSwgb3IgaWYgcmVxdWlyZWQga2V5Y2hhaW4gcGFyYW1ldGVycyAoYHRvUHViS2V5YCBhbmQgYHBhdGhgKSBhcmUgbWlzc2luZyB3aGVuIG5lZWRlZC5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHVuYWJsZSB0byBkZWNyeXB0IHRoZSB1c2VyIGtleWNoYWluLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDcmVhdGVCdWxrV2FsbGV0U2hhcmVMaXN0UmVzcG9uc2U+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZSBvZiB0aGUgYnVsayB3YWxsZXQgc2hhcmUgY3JlYXRpb24uXG4gICAqL1xuICBhc3luYyBjcmVhdGVCdWxrV2FsbGV0U2hhcmUocGFyYW1zOiBCdWxrV2FsbGV0U2hhcmVPcHRpb25zKTogUHJvbWlzZTxDcmVhdGVCdWxrV2FsbGV0U2hhcmVMaXN0UmVzcG9uc2U+IHtcbiAgICBpZiAocGFyYW1zLmtleVNoYXJlT3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc2hhcmUgb3B0aW9ucyBwcm92aWRlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1bGtDcmVhdGVTaGFyZU9wdGlvbnM6IEJ1bGtDcmVhdGVTaGFyZU9wdGlvbltdID0gW107XG5cbiAgICAvLyBDaGVjayBpZiBhbnkgc2hhcmUgb3B0aW9uIG5lZWRzIGEga2V5Y2hhaW4gKGhhcyAnc3BlbmQnIHBlcm1pc3Npb24pXG4gICAgY29uc3QgYW55TmVlZHNLZXljaGFpbiA9IHBhcmFtcy5rZXlTaGFyZU9wdGlvbnMuc29tZSgob3B0KSA9PiBvcHQucGVybWlzc2lvbnMgJiYgb3B0LnBlcm1pc3Npb25zLmluY2x1ZGVzKCdzcGVuZCcpKTtcblxuICAgIC8vIEZldGNoIGFuZCBkZWNyeXB0IHRoZSBrZXljaGFpbiBPTkNFIGZvciBhbGwgdXNlcnNcbiAgICBsZXQgZGVjcnlwdGVkS2V5Y2hhaW46IERlY3J5cHRlZEtleWNoYWluRGF0YSB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChhbnlOZWVkc0tleWNoYWluKSB7XG4gICAgICB0cnkge1xuICAgICAgICBkZWNyeXB0ZWRLZXljaGFpbiA9IGF3YWl0IHRoaXMuZ2V0RGVjcnlwdGVkS2V5Y2hhaW5Gb3JTaGFyaW5nKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBNaXNzaW5nRW5jcnlwdGVkS2V5Y2hhaW5FcnJvcikge1xuICAgICAgICAgIGRlY3J5cHRlZEtleWNoYWluID0gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNoYXJlT3B0aW9uIG9mIHBhcmFtcy5rZXlTaGFyZU9wdGlvbnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhzaGFyZU9wdGlvbiwgWyd1c2VySWQnLCAncHViS2V5JywgJ3BhdGgnXSwgW10pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoIXNoYXJlT3B0aW9uLnB1YktleSkge1xuICAgICAgICAgIHRocm93IG5ldyBOZWVkVXNlclNpZ251cEVycm9yKHNoYXJlT3B0aW9uLnVzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmVlZHNLZXljaGFpbiA9IHNoYXJlT3B0aW9uLnBlcm1pc3Npb25zICYmIHNoYXJlT3B0aW9uLnBlcm1pc3Npb25zLmluY2x1ZGVzKCdzcGVuZCcpO1xuXG4gICAgICBpZiAobmVlZHNLZXljaGFpbiAmJiBkZWNyeXB0ZWRLZXljaGFpbikge1xuICAgICAgICBjb25zdCBzaGFyZWRLZXljaGFpbiA9IHRoaXMuZW5jcnlwdFBydkZvclVzZXIoXG4gICAgICAgICAgZGVjcnlwdGVkS2V5Y2hhaW4ucHJ2LFxuICAgICAgICAgIGRlY3J5cHRlZEtleWNoYWluLnB1YixcbiAgICAgICAgICBzaGFyZU9wdGlvbi5wdWJLZXksXG4gICAgICAgICAgc2hhcmVPcHRpb24ucGF0aFxuICAgICAgICApO1xuXG4gICAgICAgIGJ1bGtDcmVhdGVTaGFyZU9wdGlvbnMucHVzaCh7XG4gICAgICAgICAgdXNlcjogc2hhcmVPcHRpb24udXNlcklkLFxuICAgICAgICAgIHBlcm1pc3Npb25zOiBzaGFyZU9wdGlvbi5wZXJtaXNzaW9ucyxcbiAgICAgICAgICBrZXljaGFpbjogc2hhcmVkS2V5Y2hhaW4sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZUJ1bGtLZXlTaGFyZXMoYnVsa0NyZWF0ZVNoYXJlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBidWxrIHdhbGxldCBzaGFyZSBlbnRyaWVzIGZvciBzcGVjaWZpZWQgc2hhcmUgb3B0aW9ucy5cbiAgICogRmlsdGVycyBvdXQgc2hhcmUgb3B0aW9ucyB0aGF0IGRvIG5vdCBjb250YWluIHZhbGlkIGtleWNoYWluIGluZm9ybWF0aW9uIG9yIGhhdmUgbWlzc2luZyBrZXljaGFpbiBmaWVsZHMuXG4gICAqIElmIGFsbCBzaGFyZSBvcHRpb25zIGFyZSBpbnZhbGlkIG9yIGVtcHR5LCBpdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIFNlbmRzIGEgUE9TVCByZXF1ZXN0IHRvIGNyZWF0ZSB0aGUgd2FsbGV0IHNoYXJlcyBmb3IgdmFsaWQgc2hhcmUgb3B0aW9ucy5cbiAgICpcbiAgICogQGFzeW5jXG4gICAqIEBwYXJhbSB7QnVsa0NyZWF0ZVNoYXJlT3B0aW9uW119IFtwYXJhbXM9W11dIC0gVGhlIGFycmF5IG9mIHNoYXJlIG9wdGlvbnMgdG8gcHJvY2Vzcy5cbiAgICogICBLZXljaGFpbiBlbnRyaWVzIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGZpZWxkczogYHB1YmAsIGBlbmNyeXB0ZWRQcnZgLCBgZnJvbVB1YktleWAsIGB0b1B1YktleWAsIGFuZCBgcGF0aGAuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENyZWF0ZUJ1bGtXYWxsZXRTaGFyZUxpc3RSZXNwb25zZT59IEEgcHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJlc3VsdCBvZiB0aGUgd2FsbGV0IHNoYXJlcyBjcmVhdGlvbi5cbiAgICogQHRocm93cyB7RXJyb3J9IFRocm93cyBhbiBlcnJvciBpZiBubyB2YWxpZCBzaGFyZSBvcHRpb25zIGFyZSBwcm92aWRlZC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUJ1bGtLZXlTaGFyZXMocGFyYW1zOiBCdWxrQ3JlYXRlU2hhcmVPcHRpb25bXSA9IFtdKTogUHJvbWlzZTxDcmVhdGVCdWxrV2FsbGV0U2hhcmVMaXN0UmVzcG9uc2U+IHtcbiAgICBwYXJhbXMgPSBwYXJhbXMuZmlsdGVyKChzaGFyZU9wdGlvbikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHNoYXJlT3B0aW9uLmtleWNoYWluLCBbJ3B1YicsICdlbmNyeXB0ZWRQcnYnLCAnZnJvbVB1YktleScsICd0b1B1YktleScsICdwYXRoJ10sIFtdKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIEV4Y2x1ZGUgc2hhcmUgb3B0aW9ucyB3aXRoIGludmFsaWQga2V5Y2hhaW5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFwYXJhbXMgfHwgT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hhcmVPcHRpb25zIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IHRoaXMuYml0Z28udXJsKGAvd2FsbGV0LyR7dGhpcy5fd2FsbGV0LmlkfS93YWxsZXRzaGFyZXNgLCAyKTtcbiAgICByZXR1cm4gdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZCh7IHNoYXJlT3B0aW9uczogcGFyYW1zIH0pLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMga2V5Y2hhaW4gd2l0aCBlbmNyeXB0ZWQgcHJpdmF0ZSBrZXkgdG8gYmUgc2hhcmVkIGZvciB3YWxsZXQgc2hhcmluZy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0RW5jcnlwdGVkV2FsbGV0S2V5Y2hhaW5Gb3JXYWxsZXRTaGFyaW5nKCk6IFByb21pc2U8S2V5Y2hhaW5XaXRoRW5jcnlwdGVkUHJ2PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT09ICdsbmJ0YycpIHtcbiAgICAgIC8vIGxpZ2h0bmluZyBjb2luIGRvZXMgbm90IHVzZSB1c2VyIGtleSB0byBzaWduIHRoZSB0cmFuc2FjdGlvbnMgZnJvbSBTREsuXG4gICAgICAvLyBpdCB1c2VzIHVzZXIgYXV0aCBrZXkgaW5zdGVhZC5cbiAgICAgIHJldHVybiBhd2FpdCBnZXRMaWdodG5pbmdBdXRoS2V5KHRoaXMsICd1c2VyQXV0aCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBhbmQgZGVjcnlwdHMgdGhlIHdhbGxldCBrZXljaGFpbiBmb3Igc2hhcmluZy5cbiAgICogVGhpcyBtZXRob2QgZmV0Y2hlcyB0aGUga2V5Y2hhaW4gb25jZSBhbmQgZGVjcnlwdHMgaXQsIHJldHVybmluZyB0aGUgZGVjcnlwdGVkXG4gICAqIHByaXZhdGUga2V5IGFuZCBwdWJsaWMga2V5IGluZm8gbmVlZGVkIGZvciBzaGFyaW5nIHdpdGggbXVsdGlwbGUgdXNlcnMuXG4gICAqXG4gICAqIEBwYXJhbSB3YWxsZXRQYXNzcGhyYXNlIC0gVGhlIHBhc3NwaHJhc2UgdG8gZGVjcnlwdCB0aGUga2V5Y2hhaW5cbiAgICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgZGVjcnlwdGVkIHBydiBhbmQgcHViLCBvciB1bmRlZmluZWQgZm9yIGNvbGQgd2FsbGV0c1xuICAgKi9cbiAgYXN5bmMgZ2V0RGVjcnlwdGVkS2V5Y2hhaW5Gb3JTaGFyaW5nKFxuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiBQcm9taXNlPERlY3J5cHRlZEtleWNoYWluRGF0YSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGtleWNoYWluID0gYXdhaXQgdGhpcy5nZXRFbmNyeXB0ZWRXYWxsZXRLZXljaGFpbkZvcldhbGxldFNoYXJpbmcoKTtcblxuICAgIGlmICgha2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICghd2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHdhbGxldFBhc3NwaHJhc2UgYXJndW1lbnQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcnYgPSBkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5KHRoaXMuYml0Z28sIGtleWNoYWluLCB3YWxsZXRQYXNzcGhyYXNlKTtcbiAgICBpZiAoIXBydikge1xuICAgICAgdGhyb3cgbmV3IEluY29ycmVjdFBhc3N3b3JkRXJyb3IoJ1Bhc3N3b3JkIHNoYXJlZCBpcyBpbmNvcnJlY3QgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuXG4gICAgLy8gT25seSBvbmUgb2YgcHViL2NvbW1vblB1Yi9jb21tb25LZXljaGFpbiBzaG91bGQgYmUgcHJlc2VudCBpbiB0aGUga2V5Y2hhaW5cbiAgICBsZXQgcHViID0ga2V5Y2hhaW4ucHViID8/IGtleWNoYWluLmNvbW1vblB1YjtcbiAgICBpZiAoa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHB1YiA9XG4gICAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlZGRzYSdcbiAgICAgICAgICA/IEVkZHNhVXRpbHMuZ2V0UHVibGljS2V5RnJvbUNvbW1vbktleWNoYWluKGtleWNoYWluLmNvbW1vbktleWNoYWluKVxuICAgICAgICAgIDogRWNkc2FVdGlscy5nZXRQdWJsaWNLZXlGcm9tQ29tbW9uS2V5Y2hhaW4oa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgIH1cblxuICAgIGlmICghcHViKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZXRlcm1pbmUgcHVibGljIGtleSBmcm9tIGtleWNoYWluJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcHJ2LCBwdWIgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNyeXB0cyBhIGRlY3J5cHRlZCBwcml2YXRlIGtleSBmb3Igc2hhcmluZyB3aXRoIGEgc3BlY2lmaWMgdXNlci5cbiAgICogVGhpcyBpcyB0aGUgcHVyZSBlbmNyeXB0aW9uIHN0ZXAgLSBubyBBUEkgY2FsbHMsIG5vIGRlY3J5cHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBkZWNyeXB0ZWRQcnYgLSBUaGUgYWxyZWFkeS1kZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHB1YiAtIFRoZSB3YWxsZXQncyBwdWJsaWMga2V5XG4gICAqIEBwYXJhbSB1c2VyUHVia2V5IC0gVGhlIHJlY2lwaWVudCB1c2VyJ3MgcHVibGljIGtleVxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBrZXkgcGF0aFxuICAgKiBAcmV0dXJucyBUaGUgZW5jcnlwdGVkIGtleWNoYWluIGZvciB0aGUgcmVjaXBpZW50IHdpdGggYWxsIHJlcXVpcmVkIGZpZWxkc1xuICAgKi9cbiAgZW5jcnlwdFBydkZvclVzZXIoZGVjcnlwdGVkUHJ2OiBzdHJpbmcsIHB1Yjogc3RyaW5nLCB1c2VyUHVia2V5OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IEJ1bGtXYWxsZXRTaGFyZUtleWNoYWluIHtcbiAgICBjb25zdCBlY2tleSA9IG1ha2VSYW5kb21LZXkoKTtcbiAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoZWNrZXksIEJ1ZmZlci5mcm9tKHVzZXJQdWJrZXksICdoZXgnKSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IG5ld0VuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7IHBhc3N3b3JkOiBzZWNyZXQsIGlucHV0OiBkZWNyeXB0ZWRQcnYgfSk7XG5cbiAgICBjb25zdCBrZXljaGFpbjogQnVsa1dhbGxldFNoYXJlS2V5Y2hhaW4gPSB7XG4gICAgICBwdWIsXG4gICAgICBlbmNyeXB0ZWRQcnY6IG5ld0VuY3J5cHRlZFBydixcbiAgICAgIGZyb21QdWJLZXk6IGVja2V5LnB1YmxpY0tleS50b1N0cmluZygnaGV4JyksXG4gICAgICB0b1B1YktleTogdXNlclB1YmtleSxcbiAgICAgIHBhdGg6IHBhdGgsXG4gICAgfTtcblxuICAgIGFzc2VydChrZXljaGFpbi5wdWIsICdwdWIgbXVzdCBiZSBkZWZpbmVkIGZvciBzaGFyaW5nJyk7XG4gICAgYXNzZXJ0KGtleWNoYWluLmVuY3J5cHRlZFBydiwgJ2VuY3J5cHRlZFBydiBtdXN0IGJlIGRlZmluZWQgZm9yIHNoYXJpbmcnKTtcbiAgICBhc3NlcnQoa2V5Y2hhaW4uZnJvbVB1YktleSwgJ2Zyb21QdWJLZXkgbXVzdCBiZSBkZWZpbmVkIGZvciBzaGFyaW5nJyk7XG4gICAgYXNzZXJ0KGtleWNoYWluLnRvUHViS2V5LCAndG9QdWJLZXkgbXVzdCBiZSBkZWZpbmVkIGZvciBzaGFyaW5nJyk7XG4gICAgYXNzZXJ0KGtleWNoYWluLnBhdGgsICdwYXRoIG11c3QgYmUgZGVmaW5lZCBmb3Igc2hhcmluZycpO1xuXG4gICAgcmV0dXJuIGtleWNoYWluO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGEga2V5Y2hhaW4gZm9yIHNoYXJpbmcgd2l0aCBhbm90aGVyIHVzZXIuXG4gICAqIEZldGNoZXMgdGhlIHdhbGxldCBrZXljaGFpbiwgZGVjcnlwdHMgaXQsIGFuZCBlbmNyeXB0cyBpdCBmb3IgdGhlIHJlY2lwaWVudC5cbiAgICpcbiAgICogQHBhcmFtIHdhbGxldFBhc3NwaHJhc2UgLSBUaGUgcGFzc3BocmFzZSB0byBkZWNyeXB0IHRoZSBrZXljaGFpblxuICAgKiBAcGFyYW0gcHVia2V5IC0gVGhlIHJlY2lwaWVudCdzIHB1YmxpYyBrZXlcbiAgICogQHBhcmFtIHBhdGggLSBUaGUga2V5IHBhdGhcbiAgICogQHJldHVybnMgVGhlIGVuY3J5cHRlZCBrZXljaGFpbiBmb3IgdGhlIHJlY2lwaWVudFxuICAgKi9cbiAgYXN5bmMgcHJlcGFyZVNoYXJlZEtleWNoYWluKFxuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJrZXk6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxTaGFyZWRLZXlDaGFpbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWNyeXB0ZWRLZXljaGFpbiA9IGF3YWl0IHRoaXMuZ2V0RGVjcnlwdGVkS2V5Y2hhaW5Gb3JTaGFyaW5nKHdhbGxldFBhc3NwaHJhc2UpO1xuICAgICAgaWYgKCFkZWNyeXB0ZWRLZXljaGFpbikge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5lbmNyeXB0UHJ2Rm9yVXNlcihkZWNyeXB0ZWRLZXljaGFpbi5wcnYsIGRlY3J5cHRlZEtleWNoYWluLnB1YiwgcHVia2V5LCBwYXRoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIE1pc3NpbmdFbmNyeXB0ZWRLZXljaGFpbkVycm9yKSB7XG4gICAgICAgIC8vIGlnbm9yZSB0aGlzIGVycm9yIGJlY2F1c2UgdGhpcyBsb29rcyBsaWtlIGEgY29sZCB3YWxsZXRcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgdGhpcyB3YWxsZXQgd2l0aCBhbm90aGVyIEJpdEdvIHVzZXIuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzaGFyZVdhbGxldChwYXJhbXM6IFNoYXJlV2FsbGV0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2VtYWlsJywgJ3Blcm1pc3Npb25zJ10sIFsnd2FsbGV0UGFzc3BocmFzZScsICdtZXNzYWdlJ10pO1xuICAgIGlmIChwYXJhbXMucmVzaGFyZSAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMucmVzaGFyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVzaGFyZSB0byBiZSBhIGJvb2xlYW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5za2lwS2V5Y2hhaW4gIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnNraXBLZXljaGFpbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc2tpcEtleWNoYWluIHRvIGJlIGEgYm9vbGVhbi4gJyk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIG11bHRpLWtleS11c2VyLWtleSBPRkMgd2FsbGV0XG4gICAgLy8gRm9yIG11bHRpLWtleS11c2VyLWtleSB3YWxsZXRzLCBza2lwIGtleWNoYWluIHByZXBhcmF0aW9uIHJlZ2FyZGxlc3Mgb2Ygb3RoZXIgY29uZGl0aW9uc1xuICAgIGNvbnN0IG5lZWRzS2V5Y2hhaW4gPVxuICAgICAgIXRoaXMuaXNNdWx0aVVzZXJLZXlXYWxsZXQoKSAmJlxuICAgICAgIXBhcmFtcy5za2lwS2V5Y2hhaW4gJiZcbiAgICAgIHBhcmFtcy5wZXJtaXNzaW9ucyAmJlxuICAgICAgcGFyYW1zLnBlcm1pc3Npb25zLmluZGV4T2YoJ3NwZW5kJykgIT09IC0xO1xuXG4gICAgaWYgKHBhcmFtcy5kaXNhYmxlRW1haWwgIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmRpc2FibGVFbWFpbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZGlzYWJsZUVtYWlsIHRvIGJlIGEgYm9vbGVhbi4nKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmVtYWlsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgZW1haWwnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaGFyaW5nID0gKGF3YWl0IHRoaXMuYml0Z28uZ2V0U2hhcmluZ0tleSh7XG4gICAgICBlbWFpbDogcGFyYW1zLmVtYWlsLnRvTG93ZXJDYXNlKCksXG4gICAgfSkpIGFzIGFueTtcbiAgICBsZXQgc2hhcmVkS2V5Y2hhaW47XG4gICAgaWYgKG5lZWRzS2V5Y2hhaW4pIHtcbiAgICAgIHNoYXJlZEtleWNoYWluID0gYXdhaXQgdGhpcy5wcmVwYXJlU2hhcmVkS2V5Y2hhaW4ocGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIHNoYXJpbmcucHVia2V5LCBzaGFyaW5nLnBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IENyZWF0ZVNoYXJlT3B0aW9ucyA9IHtcbiAgICAgIHVzZXI6IHNoYXJpbmcudXNlcklkLFxuICAgICAgcGVybWlzc2lvbnM6IHBhcmFtcy5wZXJtaXNzaW9ucyxcbiAgICAgIHJlc2hhcmU6IHBhcmFtcy5yZXNoYXJlLFxuICAgICAgbWVzc2FnZTogcGFyYW1zLm1lc3NhZ2UsXG4gICAgICBkaXNhYmxlRW1haWw6IHBhcmFtcy5kaXNhYmxlRW1haWwsXG4gICAgICBza2lwS2V5Y2hhaW46IE9iamVjdC5rZXlzKHNoYXJlZEtleWNoYWluID8/IHt9KS5sZW5ndGggPT09IDAsXG4gICAgICBrZXljaGFpbjogT2JqZWN0LmtleXMoc2hhcmVkS2V5Y2hhaW4gPz8ge30pLmxlbmd0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHNoYXJlZEtleWNoYWluLFxuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVTaGFyZShvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdXNlciBmcm9tIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIC0gdXNlcklkIElkIG9mIHRoZSB1c2VyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlVXNlcihwYXJhbXM6IFJlbW92ZVVzZXJPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXNlcklkJ10sIFtdKTtcblxuICAgIGNvbnN0IHVzZXJJZCA9IHBhcmFtcy51c2VySWQ7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvdXNlci8nICsgdXNlcklkKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSB0cmFuc2FjdGlvbiBwcmVidWlsZCAodW5zaWduZWQgdHJhbnNhY3Rpb24pIGZyb20gQml0R29cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICAgKiBAcGFyYW0ge3thZGRyZXNzOiBzdHJpbmcsIGFtb3VudDogc3RyaW5nfX0gcGFyYW1zLnJlY2lwaWVudHMgLSBsaXN0IG9mIHJlY2lwaWVudHMgYW5kIG5lY2Vzc2FyeSByZWNpcGllbnQgaW5mb3JtYXRpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5udW1CbG9ja3MgLSBFc3RpbWF0ZXMgdGhlIGFwcHJveGltYXRlIGZlZSBwZXIga2lsb2J5dGUgbmVjZXNzYXJ5IGZvciBhIHRyYW5zYWN0aW9uIGNvbmZpcm1hdGlvbiB3aXRoaW4gbnVtQmxvY2tzIGJsb2Nrc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSB0aGUgZGVzaXJlZCBmZWVSYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gYmFzZSB1bml0cy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBiYXNlIHVuaXRzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBNaW5pbXVtIG51bWJlciBvZiBjb25maXJtYXRpb25zIHVuc3BlbnRzIGdvaW5nIGludG8gdGhpcyB0cmFuc2FjdGlvbiBzaG91bGQgaGF2ZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBFbmZvcmNlIG1pbmltdW0gbnVtYmVyIG9mIGNvbmZpcm1hdGlvbnMgb24gY2hhbmdlIChpbnRlcm5hbCkgaW5wdXRzLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzIC0gVGhlIGRlc2lyZWQgY291bnQgb2YgdW5zcGVudHMgaW4gdGhlIHdhbGxldC4gSWYgdGhlIHdhbGxldOKAmXMgY3VycmVudCB1bnNwZW50IGNvdW50IGlzIGxvd2VyIHRoYW4gdGhlIHRhcmdldCwgdXAgdG8gZm91ciBhZGRpdGlvbmFsIGNoYW5nZSBvdXRwdXRzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gSWdub3JlIHVuc3BlbnRzIHNtYWxsZXIgdGhhbiB0aGlzIGFtb3VudCBvZiBiYXNlIHVuaXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgbGFyZ2VyIHRoYW4gdGhpcyBhbW91bnQgb2YgYmFzZSB1bml0c1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnNlcXVlbmNlSWQgLSBUaGUgc2VxdWVuY2UgSUQgb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGFzdExlZGdlclNlcXVlbmNlIC0gQWJzb2x1dGUgbWF4IGxlZGdlciB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGVkZ2VyU2VxdWVuY2VEZWx0YSAtIFJlbGF0aXZlIGxlZGdlciBoZWlnaHQgKGluIHJlbGF0aW9uIHRvIHRoZSBjdXJyZW50IGxlZGdlcikgdGhhdCB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZ2FzUHJpY2UgLSBDdXN0b20gZ2FzIHByaWNlIHRvIGJlIHVzZWQgZm9yIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZ2FzTGltaXQgLSBDdXN0b20gZ2FzIGxpbWl0IHRvIGJlIHVzZWQgZm9yIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLm5vU3BsaXRDaGFuZ2UgLSBTZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIGF1dG9tYXRpYyBjaGFuZ2Ugc3BsaXR0aW5nIGZvciBwdXJwb3NlcyBvZiB1bnNwZW50IG1hbmFnZW1lbnRcbiAgICogQHBhcmFtIHtBcnJheX0gcGFyYW1zLnVuc3BlbnRzIC0gVGhlIHVuc3BlbnRzIHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb24uIEVhY2ggdW5zcGVudCBzaG91bGQgYmUgaW4gdGhlIGZvcm0gcHJldlR4SWQ6bk91dHB1dFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmNoYW5nZUFkZHJlc3MgLSBTcGVjaWZpZXMgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBjaGFuZ2Ugb3V0cHV0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLm5vblBhcnRpY2lwYXRpb24gLSAoQWxnb3JhbmQpIE5vbiBwYXJ0aWNpcGF0aW5nIGtleSByZWcgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy52YWxpZEZyb21CbG9jayAtIChBbGdvcmFuZCkgVGhlIG1pbmltdW0gcm91bmQgdGhpcyB3aWxsIHJ1biBvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnZhbGlkVG9CbG9jayAtIChBbGdvcmFuZCkgVGhlIG1heGltdW0gcm91bmQgdGhpcyB3aWxsIHJ1biBvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5pbnN0YW50IC0gQnVpbGQgdGhpcyB0cmFuc2FjdGlvbiB0byBjb25mb3JtIHdpdGggaW5zdGFudCBzZW5kaW5nIGNvaW4tc3BlY2lmaWMgbWV0aG9kIChpZiBhdmFpbGFibGUpXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmtlZXBBbGl2ZSAtIChQb2xrYWRvdCkga2VlcCBhZGRyZXNzIGFsaXZlIGJ5IHNlbmRpbmcgdGhlIGFkZHJlc3MgbWluaW11bSBmdW5kaW5nIGFtb3VudCwgdXNlZCBkdXJpbmcgd2FsbGV0IGNvbnNvbGlkYXRpb24sIHRydWUgYnkgZGVmYXVsdFxuICAgKiBAcGFyYW0ge3t2YWx1ZTogU3RyaW5nLCB0eXBlOiBTdHJpbmd9fSBwYXJhbXMubWVtbyAtIE1lbW8gdG8gdXNlIGluIHRyYW5zYWN0aW9uIChzdXBwb3J0ZWQgYnkgU3RlbGxhcilcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtLnRyYW5zZmVySWQgLSB0cmFuc2ZlciBJZCB0byB1c2UgaW4gdHJhbnNhY3Rpb24gKHN1cHBvcnRlZCBieSBjYXNwZXIpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYWRkcmVzc1R5cGUgLSBUaGUgdHlwZSBvZiBhZGRyZXNzIHRvIGNyZWF0ZSBmb3IgY2hhbmdlLiBPbmUgb2YgYHAyc2hgLCBgcDJzaFAyd3NoYCwgYW5kIGBwMndzaGAuIENhc2Utc2Vuc2l0aXZlLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ob3AgLSBCdWlsZCB0aGlzIGFzIGFuIEV0aGVyZXVtIGhvcCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zLnJlc2VydmF0aW9uIC0gT2JqZWN0IHRvIHJlc2VydmUgdGhlIHVuc3BlbnRzIHRoYXQgdGhpcyB0eCBidWlsZCB1c2VzLiBGb3JtYXQgaXMgcmVzZXJ2YXRpb24gPSB7IGV4cGlyZVRpbWU6IElTT0RhdGVTdHJpbmcsIHBlbmRpbmdBcHByb3ZhbElkOiBTdHJpbmcgfVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgVGhlIHBhc3NwaHJhc2UgdG8gdGhlIHdhbGxldCB1c2VyIGtleSwgdG8gc2lnbiBjb21taXRtZW50IGRhdGEgZm9yIEV0aGVyZXVtIGhvcCB0cmFuc2FjdGlvbnNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MgLSBUaGUgY29udHJhY3QgYWRkcmVzcyB1c2VkIGFzIHRoZSBcInRvXCIgZmllbGQgb2YgYSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHByZWJ1aWxkVHJhbnNhY3Rpb24ocGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uVHhSZXF1ZXN0cyhwYXJhbXMpO1xuICAgIH1cblxuICAgIC8vIFdoaXRlbGlzdCBwYXJhbXMgdG8gYnVpbGQgdHhcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IHRoaXMuYmFzZUNvaW4ucHJlcHJvY2Vzc0J1aWxkUGFyYW1zKF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpKSk7XG4gICAgZGVidWcoJ3ByZWJ1aWxkaW5nIHRyYW5zYWN0aW9uOiAlTycsIHdoaXRlbGlzdGVkUGFyYW1zKTtcblxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cbiAgICBjb25zdCBleHRyYVBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uZ2V0RXh0cmFQcmVidWlsZFBhcmFtcyhPYmplY3QuYXNzaWduKHBhcmFtcywgeyB3YWxsZXQ6IHRoaXMgfSkpO1xuICAgIE9iamVjdC5hc3NpZ24od2hpdGVsaXN0ZWRQYXJhbXMsIGV4dHJhUGFyYW1zKTtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHtcbiAgICAgIG9mZmxpbmVWZXJpZmljYXRpb246IHBhcmFtcy5vZmZsaW5lVmVyaWZpY2F0aW9uID8gdHJ1ZSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgY29uc3QgYnVpbGRRdWVyeSA9IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L2J1aWxkJykpXG4gICAgICAucXVlcnkocXVlcnlQYXJhbXMpXG4gICAgICAuc2VuZCh3aGl0ZWxpc3RlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcblxuICAgIGNvbnN0IGJsb2NrSGVpZ2h0UXVlcnkgPSBfLmlzRnVuY3Rpb24oKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5nZXRMYXRlc3RCbG9ja0hlaWdodClcbiAgICAgID8gKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5nZXRMYXRlc3RCbG9ja0hlaWdodChwYXJhbXMucmVxSWQpXG4gICAgICA6IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIGNvbnN0IHF1ZXJpZXMgPSBbYnVpbGRRdWVyeSwgYmxvY2tIZWlnaHRRdWVyeV07XG4gICAgY29uc3QgW2J1aWxkUmVzcG9uc2UsIGJsb2NrSGVpZ2h0XSA9IChhd2FpdCBQcm9taXNlLmFsbChxdWVyaWVzKSkgYXMgYW55O1xuICAgIGRlYnVnKCdwb3N0cHJvY2Vzc2luZyB0cmFuc2FjdGlvbiBwcmVidWlsZDogJU8nLCBidWlsZFJlc3BvbnNlKTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYmxvY2tIZWlnaHQpKSB7XG4gICAgICBidWlsZFJlc3BvbnNlLmJsb2NrSGVpZ2h0ID0gYmxvY2tIZWlnaHQ7XG4gICAgfVxuICAgIGxldCBwcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZCA9IChhd2FpdCB0aGlzLmJhc2VDb2luLnBvc3RQcm9jZXNzUHJlYnVpbGQoXG4gICAgICBPYmplY3QuYXNzaWduKGJ1aWxkUmVzcG9uc2UsIHtcbiAgICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgICBidWlsZFBhcmFtczogd2hpdGVsaXN0ZWRQYXJhbXMsXG4gICAgICB9KVxuICAgICkpIGFzIGFueTtcbiAgICBkZWxldGUgcHJlYnVpbGQud2FsbGV0O1xuICAgIGRlbGV0ZSBwcmVidWlsZC5idWlsZFBhcmFtcztcbiAgICBwcmVidWlsZCA9IF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwgeyB3YWxsZXRJZDogdGhpcy5pZCgpIH0pO1xuICAgIGlmICh0aGlzLl93YWxsZXQgJiYgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYyAmJiAhcGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcykge1xuICAgICAgcHJlYnVpbGQgPSBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHtcbiAgICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLmJhc2VBZGRyZXNzLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHByZWJ1aWxkID0gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHJlcUlkOiBwYXJhbXMucmVxSWQgfSk7XG4gICAgZGVidWcoJ2ZpbmFsIHRyYW5zYWN0aW9uIHByZWJ1aWxkOiAlTycsIHByZWJ1aWxkKTtcbiAgICByZXR1cm4gcHJlYnVpbGQgYXMgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBVc2VyIEtleWNoYWluIGFuZCBzaWduIGEgVFNTIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB0eFJlcXVlc3RJZCBUaGUgdHJhbnNhY3Rpb24gcmVxdWVzdCBpZFxuICAgKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSBUaGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHJldHVybiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPlxuICAgKi9cbiAgYXN5bmMgZ2V0VXNlcktleUFuZFNpZ25Uc3NUcmFuc2FjdGlvbih7XG4gICAgdHhSZXF1ZXN0SWQsXG4gICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgfToge1xuICAgIHR4UmVxdWVzdElkOiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdnZXRVc2VyS2V5QW5kU2lnblRzc1RyYW5zYWN0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgIH1cbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgLy8gRG9pbmcgYSBzYW5pdHkgY2hlY2sgZm9yIHBhc3N3b3JkIGhlcmUgdG8gYXZvaWQgZG9pbmcgZnVydGhlciB3b3JrIGlmIHdlIGtub3cgaXQncyB3cm9uZ1xuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICAgIHJlcUlkLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBrZXljaGFpbnNbMF07XG4gICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgIXVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGhlIHVzZXIga2V5Y2hhaW4gZG9lcyBub3QgaGF2ZSBwcm9wZXJ0eSBlbmNyeXB0ZWRQcnYnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgdHhQcmVidWlsZDogeyB0eFJlcXVlc3RJZCB9LFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIHJlcUlkLFxuICAgICAga2V5Y2hhaW46IHVzZXJLZXljaGFpbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHR4UHJlYnVpbGRcbiAgICogLSBba2V5Y2hhaW4gLyBrZXldIChvYmplY3QpIG9yIHBydiAoc3RyaW5nKVxuICAgKiAtIHdhbGxldFBhc3NwaHJhc2VcbiAgICogLSB2ZXJpZnlUeFBhcmFtcyAob3B0aW9uYWwpIC0gd2hlbiBwcm92aWRlZCwgdGhlIHRyYW5zYWN0aW9uIHdpbGwgYmUgdmVyaWZpZWQgYmVmb3JlIHNpZ25pbmdcbiAgICogICAtIHR4UGFyYW1zOiB0cmFuc2FjdGlvbiBwYXJhbWV0ZXJzIHVzZWQgZm9yIHZlcmlmaWNhdGlvblxuICAgKiAgIC0gdmVyaWZpY2F0aW9uOiBvcHRpb25hbCB2ZXJpZmljYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uKHBhcmFtczogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbiB8IFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHsgdHhQcmVidWlsZCwgYXBpVmVyc2lvbiwgdHhSZXF1ZXN0SWQgfSA9IHBhcmFtcztcblxuICAgIGlmIChcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tQ29tbWl0bWVudEdlbmVyYXRpbmdGdW5jdGlvbikgJiZcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tR1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pXG4gICAgKSB7XG4gICAgICAvLyBpbnZva2UgZXh0ZXJuYWwgc2lnbmVyIFRTUyBmb3IgRWREU0Egd29ya2Zsb3dcbiAgICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRWREU0EocGFyYW1zLCB0aGlzLmJhc2VDb2luKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVBhaWxsaWVyTW9kdWx1c0dlbmVyYXRpbmdGdW5jdGlvbikgJiZcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVNTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbilcbiAgICApIHtcbiAgICAgIC8vIGludm9rZSBleHRlcm5hbCBzaWduZXIgVFNTIGZvciBFQ0RTQSB3b3JrZmxvd1xuICAgICAgcmV0dXJuIHRoaXMuc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFQ0RTQSh0aGlzLmJhc2VDb2luLCBwYXJhbXMpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdGlvbkZ1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0aW9uRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRpb25GdW5jdGlvbilcbiAgICApIHtcbiAgICAgIC8vIGludm9rZSBleHRlcm5hbCBzaWduZXIgVFNTIGZvciBFQ0RTQSBNUEN2MndvcmtmbG93XG4gICAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb25Uc3NFeHRlcm5hbFNpZ25lckVDRFNBTVBDdjIodGhpcy5iYXNlQ29pbiwgcGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAoIXR4UHJlYnVpbGQgfHwgdHlwZW9mIHR4UHJlYnVpbGQgIT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aXNpZ1R5cGUoKSA9PT0gJ29uY2hhaW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndHhQcmVidWlsZCBpcyByZXF1aXJlZCBmb3Igb24tY2hhaW4gbXVsdGlzaWcgd2FsbGV0cycpO1xuICAgICAgfVxuICAgICAgaWYgKCF0eFJlcXVlc3RJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UHJlYnVpbGQgb3IgdHhSZXF1ZXN0SWQgaXMgcmVxdWlyZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgICB9XG4gICAgICAvLyBXZSBvbmx5IGRvIHRoaXMgaWYgd2UncmUgbm90IHVzaW5nIHRoZSBleHRlcm5hbCBzaWduZXIgVFNTIGZsb3dcbiAgICAgIHBhcmFtcy50eFByZWJ1aWxkID0geyB0eFJlcXVlc3RJZCB9O1xuICAgIH1cblxuICAgIC8vIFZlcmlmeSB0cmFuc2FjdGlvbiBpZiB2ZXJpZnlUeFBhcmFtcyBpcyBwcm92aWRlZFxuICAgIGlmIChwYXJhbXMudmVyaWZ5VHhQYXJhbXMgJiYgdHhQcmVidWlsZD8udHhIZXgpIHtcbiAgICAgIGNvbnN0IHZlcmlmeVBhcmFtcyA9IHtcbiAgICAgICAgdHhQcmVidWlsZDogeyAuLi50eFByZWJ1aWxkIH0sXG4gICAgICAgIHR4UGFyYW1zOiBwYXJhbXMudmVyaWZ5VHhQYXJhbXMudHhQYXJhbXMsXG4gICAgICAgIHdhbGxldDogdGhpcyBhcyBJV2FsbGV0LFxuICAgICAgICB2ZXJpZmljYXRpb246IHBhcmFtcy52ZXJpZnlUeFBhcmFtcy52ZXJpZmljYXRpb24sXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgIHdhbGxldFR5cGU6IHRoaXMubXVsdGlzaWdUeXBlKCkgYXMgJ29uY2hhaW4nIHwgJ3RzcycsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB0aGlzLmJhc2VDb2luLnZlcmlmeVRyYW5zYWN0aW9uKHZlcmlmeVBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgJiZcbiAgICAgICEocGFyYW1zLmtleWNoYWluIHx8IHBhcmFtcy5rZXkpICYmXG4gICAgICAodGhpcy50eXBlKCkgPT09ICdob3QnIHx8IHRoaXMudHlwZSgpID09PSB1bmRlZmluZWQpXG4gICAgKSB7XG4gICAgICAvLyB0aGlzIGxvZ2ljIHNob3VsZCBvbmx5IGFwcGx5IHRvIGhvdCB3YWxsZXRzXG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0UGFzc3BocmFzZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmdldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZSh7XG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBrZXljaGFpbnNbMF07XG4gICAgICBpZiAoIXVzZXJLZXljaGFpbiB8fCAhdXNlcktleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZSB1c2VyIGtleWNoYWluIGRvZXMgbm90IGhhdmUgcHJvcGVydHkgZW5jcnlwdGVkUHJ2Jyk7XG4gICAgICB9XG4gICAgICBwYXJhbXMua2V5Y2hhaW4gPSB1c2VyS2V5Y2hhaW47XG4gICAgfVxuXG4gICAgY29uc3QgcHJlc2lnbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ucHJlc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHdhbGxldERhdGE6IHRoaXMuX3dhbGxldCxcbiAgICAgIHRzc1V0aWxzOiB0aGlzLnRzc1V0aWxzLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb25Uc3Moe1xuICAgICAgICAuLi5wcmVzaWduLFxuICAgICAgICBwcnY6IHRoaXMuZ2V0VXNlclBydihwcmVzaWduIGFzIEdldFVzZXJQcnZPcHRpb25zKSxcbiAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCB7IHB1YnMgfSA9IHBhcmFtcztcbiAgICBpZiAoIXB1YnMgJiYgdGhpcy5iYXNlQ29pbi5rZXlJZHNGb3JTaWduaW5nKCkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcyB9KTtcbiAgICAgIHB1YnMgPSBrZXljaGFpbnMubWFwKChrKSA9PiB7XG4gICAgICAgIGFzc2VydChrLnB1Yik7XG4gICAgICAgIHJldHVybiBrLnB1YjtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25UcmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnByZXNpZ24sXG4gICAgICB0eFByZWJ1aWxkOiB7IC4uLnR4UHJlYnVpbGQsIHdhbGxldElkOiB0aGlzLmlkKCkgfSxcbiAgICAgIHB1YnMsXG4gICAgICBjb2luOiB0aGlzLmJhc2VDb2luLFxuICAgIH07XG5cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21TaWduaW5nRnVuY3Rpb24pKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuYmFzZUNvaW4uc2lnbldpdGhDdXN0b21TaWduaW5nRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgYXNzZXJ0KHB1YnMsICdwdWJzIGFyZSByZXF1aXJlZCBmb3IgY3VzdG9tIHNpZ25pbmcnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4uc2lnbldpdGhDdXN0b21TaWduaW5nRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbiwge1xuICAgICAgICAgIC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcyxcbiAgICAgICAgICBwdWJzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzIH0pO1xuICAgICAgY29uc3Qgc2lnblRyYW5zYWN0aW9uUGFyYW1zV2l0aFNlZWQgPSB7XG4gICAgICAgIC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcyxcbiAgICAgICAgZGVyaXZhdGlvblNlZWQ6IGtleXNbMF0/LmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHBhcmFtcy5jdXN0b21TaWduaW5nRnVuY3Rpb24oc2lnblRyYW5zYWN0aW9uUGFyYW1zV2l0aFNlZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgcHJ2OiB0aGlzLmdldFVzZXJQcnYocHJlc2lnbiBhcyBHZXRVc2VyUHJ2T3B0aW9ucyksXG4gICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIHR5cGVkIHN0cnVjdHVyZWQgZGF0YSB1c2luZyBUU1NcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgc2lnblR5cGVkRGF0YShwYXJhbXM6IFdhbGxldFNpZ25UeXBlZERhdGFPcHRpb25zKTogUHJvbWlzZTxTaWduZWRNZXNzYWdlPiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzU2lnbmluZ1R5cGVkRGF0YSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNpZ24gdHlwZWQgZGF0YSBub3Qgc3VwcG9ydGVkIGZvciAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMudHlwZWREYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFR5cGVkIGRhdGEgcmVxdWlyZWRgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2Ugc2lnbmluZyBvbmx5IHN1cHBvcnRlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICB9XG4gICAgaWYgKF8uaXNGdW5jdGlvbihwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YVJhdykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHlwZWREYXRhLnR5cGVkRGF0YVJhdyBtdXN0IGJlIEpTT04gc3RyaW5nJyk7XG4gICAgfVxuICAgIGlmIChfLmlzRnVuY3Rpb24oKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5lbmNvZGVUeXBlZERhdGEpKSB7XG4gICAgICBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQgPSAodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmVuY29kZVR5cGVkRGF0YShwYXJhbXMudHlwZWREYXRhKTtcbiAgICB9XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQ6IHBhcmFtcy5yZXFJZCB9KTtcbiAgICBjb25zdCB1c2VyUHJ2T3B0aW9uczogR2V0VXNlclBydk9wdGlvbnMgPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgIH07XG4gICAgYXNzZXJ0KGtleWNoYWluc1swXS5jb21tb25LZXljaGFpbiwgJ1VuYWJsZSB0byBmaW5kIGNvbW1vbktleWNoYWluIGluIGtleWNoYWlucycpO1xuICAgIGNvbnN0IHByZXNpZ24gPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICB3YWxsZXREYXRhOiB0aGlzLl93YWxsZXQsXG4gICAgICB0c3NVdGlsczogdGhpcy50c3NVdGlscyxcbiAgICAgIHBydjogdGhpcy5nZXRVc2VyUHJ2KHVzZXJQcnZPcHRpb25zKSxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcHViOiBrZXljaGFpbnMubWFwKChrKSA9PiBrLnB1YiksXG4gICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc2lnblR5cGVkRGF0YVRzcyhwcmVzaWduKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAgU2lnbiBhIG1lc3NhZ2UgdXNpbmcgVFNTXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSBNZXNzYWdlXG4gICAqIC0gY3VzdG9kaWFuTWVzc2FnZUlkXG4gICAqL1xuICBhc3luYyBzaWduTWVzc2FnZShwYXJhbXM6IFdhbGxldFNpZ25NZXNzYWdlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRNZXNzYWdlPiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzTWVzc2FnZVNpZ25pbmcoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXNzYWdlIHNpZ25pbmcgbm90IHN1cHBvcnRlZCBmb3IgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9YCk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLm1lc3NhZ2UgfHwgIXBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VTdGFuZGFyZFR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWVzc2FnZSBhbmQgdHlwZSByZXF1aXJlZCB0byBzaWduIG1lc3NhZ2UnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2Ugc2lnbmluZyBvbmx5IHN1cHBvcnRlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICB9XG4gICAgaWYgKF8uaXNGdW5jdGlvbigodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmVuY29kZU1lc3NhZ2UpKSB7XG4gICAgICBwYXJhbXMubWVzc2FnZS5tZXNzYWdlRW5jb2RlZCA9ICh0aGlzLmJhc2VDb2luIGFzIGFueSkuZW5jb2RlTWVzc2FnZShwYXJhbXMubWVzc2FnZS5tZXNzYWdlUmF3KTtcbiAgICB9XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQ6IHBhcmFtcy5yZXFJZCB9KTtcbiAgICBjb25zdCB1c2VyUHJ2T3B0aW9uczogR2V0VXNlclBydk9wdGlvbnMgPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgIH07XG4gICAgYXNzZXJ0KGtleWNoYWluc1swXS5jb21tb25LZXljaGFpbiwgJ1VuYWJsZSB0byBmaW5kIGNvbW1vbktleWNoYWluIGluIGtleWNoYWlucycpO1xuICAgIGNvbnN0IHByZXNpZ24gPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICB3YWxsZXREYXRhOiB0aGlzLl93YWxsZXQsXG4gICAgICB0c3NVdGlsczogdGhpcy50c3NVdGlscyxcbiAgICAgIHBydjogdGhpcy5nZXRVc2VyUHJ2KHVzZXJQcnZPcHRpb25zKSxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnNpZ25NZXNzYWdlVHNzKHByZXNpZ24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGFuZCBjcmVhdGVzIGEgc2lnbiBtZXNzYWdlIHJlcXVlc3QgZm9yIFRTUyB3YWxsZXRzLCB0aGF0IGNhbiBiZSB1c2VkIGxhdGVyIGZvciBzaWduaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBmb3IgY3JlYXRpbmcgdGhlIHNpZ24gbWVzc2FnZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIFByb21pc2U8VHhSZXF1ZXN0PiAtIFRoZSBjcmVhdGVkIHRyYW5zYWN0aW9uIHJlcXVlc3QgZm9yIHNpZ25pbmcgYSBtZXNzYWdlXG4gICAqL1xuICBhc3luYyBidWlsZFNpZ25NZXNzYWdlUmVxdWVzdChwYXJhbXM6IFdhbGxldFNpZ25NZXNzYWdlT3B0aW9ucyk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2Ugc2lnbmluZyBvbmx5IHN1cHBvcnRlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNNZXNzYWdlU2lnbmluZygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2Ugc2lnbmluZyBub3Qgc3VwcG9ydGVkIGZvciAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX1gKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5tZXNzYWdlPy5tZXNzYWdlUmF3IHx8ICFwYXJhbXMubWVzc2FnZT8ubWVzc2FnZVN0YW5kYXJkVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtZXNzYWdlIGFuZCB0eXBlIHJlcXVpcmVkIHRvIGNyZWF0ZSBtZXNzYWdlIHNpZ24gcmVxdWVzdCcpO1xuICAgIH1cbiAgICBjb25zdCBtZXNzYWdlUmF3ID0gcGFyYW1zLm1lc3NhZ2UubWVzc2FnZVJhdztcbiAgICBjb25zdCBtZXNzYWdlU3RhbmRhcmRUeXBlID0gcGFyYW1zLm1lc3NhZ2UubWVzc2FnZVN0YW5kYXJkVHlwZTtcblxuICAgIGNvbnN0IHJlcUlkID0gcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgaW50ZW50T3B0aW9uOiBJbnRlbnRPcHRpb25zRm9yTWVzc2FnZSA9IHtcbiAgICAgICAgY3VzdG9kaWFuTWVzc2FnZUlkOiBwYXJhbXMuY3VzdG9kaWFuTWVzc2FnZUlkLFxuICAgICAgICByZXFJZCxcbiAgICAgICAgaW50ZW50VHlwZTogJ3NpZ25NZXNzYWdlJyxcbiAgICAgICAgaXNUc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2VSYXcsXG4gICAgICAgIG1lc3NhZ2VTdGFuZGFyZFR5cGUsXG4gICAgICAgIHNpZ25lckFkZHJlc3M6IHBhcmFtcy5tZXNzYWdlLnNpZ25lckFkZHJlc3MsXG4gICAgICB9O1xuXG4gICAgICBpZiAoIXRoaXMudHNzVXRpbHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUU1MgdXRpbGl0aWVzIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50c3NVdGlscy5idWlsZFNpZ25NZXNzYWdlUmVxdWVzdChpbnRlbnRPcHRpb24pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgbWVzc2FnZSBzaWduIHJlcXVlc3Q6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdXNlciBwcml2YXRlIGtleSBmcm9tIGVpdGhlciBhIGRlcml2YXRpb24gb3IgYW4gZW5jcnlwdGVkIGtleWNoYWluXG4gICAqIEBwYXJhbSBbcGFyYW1zLmtleWNoYWluIC8gcGFyYW1zLmtleV0gKG9iamVjdCkgb3IgcGFyYW1zLnBydiAoc3RyaW5nKVxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgKHN0cmluZylcbiAgICovXG4gIGdldFVzZXJQcnYocGFyYW1zOiBHZXRVc2VyUHJ2T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBwYXJhbXMua2V5Y2hhaW4gfHwgcGFyYW1zLmtleTtcbiAgICBsZXQgdXNlclBydiA9IHBhcmFtcy5wcnY7XG4gICAgaWYgKHVzZXJQcnYgJiYgdHlwZW9mIHVzZXJQcnYgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgLy8gdXNlIHRoZSBgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZGAgcHJvcGVydHkgZnJvbSB0aGUgdXNlciBrZXljaGFpbiBhcyB0aGUgYGNvbGREZXJpdmF0aW9uU2VlZGBcbiAgICAvLyBpZiBubyBvdGhlciBgY29sZERlcml2YXRpb25TZWVkYCB3YXMgZXhwbGljaXRseSBwcm92aWRlZFxuICAgIC8vIE9ubHkgZm9yIG9uY2hhaW4gbXVsdGlzaWcgd2FsbGV0cywgVFNTIGtleSBkZXJpdmF0aW9uIGhhcHBlbnMgZHVyaW5nIHRoZSBzaWduaW5nIHByb2Nlc3NcbiAgICBpZiAoXG4gICAgICBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkID09PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5rZXljaGFpbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJhbXMua2V5Y2hhaW4uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLm11bHRpc2lnVHlwZSgpID09PSAnb25jaGFpbidcbiAgICApIHtcbiAgICAgIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQgPSBwYXJhbXMua2V5Y2hhaW4uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDtcbiAgICB9XG5cbiAgICBpZiAodXNlclBydiAmJiBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkKSB7XG4gICAgICAvLyB0aGUgZGVyaXZhdGlvbiBvbmx5IG1ha2VzIHNlbnNlIHdoZW4gYSBrZXkgYWxyZWFkeSBleGlzdHNcbiAgICAgIGNvbnN0IGRlcml2YXRpb24gPSB0aGlzLmJhc2VDb2luLmRlcml2ZUtleVdpdGhTZWVkKHtcbiAgICAgICAga2V5OiB1c2VyUHJ2LFxuICAgICAgICBzZWVkOiBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkLFxuICAgICAgfSk7XG4gICAgICB1c2VyUHJ2ID0gZGVyaXZhdGlvbi5rZXk7XG4gICAgfSBlbHNlIGlmICghdXNlclBydikge1xuICAgICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgdHlwZW9mIHVzZXJLZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgdXNlckVuY3J5cHRlZFBydiA9IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnY7XG4gICAgICBpZiAoIXVzZXJFbmNyeXB0ZWRQcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiBkb2VzIG5vdCBoYXZlIHByb3BlcnR5IGVuY3J5cHRlZFBydicpO1xuICAgICAgfVxuICAgICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldFBhc3NwaHJhc2UgcHJvcGVydHkgbWlzc2luZycpO1xuICAgICAgfVxuICAgICAgdXNlclBydiA9IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkodGhpcy5iaXRnbywgdXNlcktleWNoYWluLCBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSk7XG4gICAgICBpZiAoIXVzZXJQcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gZGVjcnlwdCB1c2VyIGtleWNoYWluJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1c2VyUHJ2O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkIGZyb20gQml0R28sIHZhbGlkYXRlIGl0LCBhbmQgdGhlbiBkZWNyeXB0IHRoZSB1c2VyIGtleSBhbmQgc2lnbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgcHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICBpZiAocGFyYW1zLmVpcDE1NTkgJiYgcGFyYW1zLmdhc1ByaWNlKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdPbmx5IG9uZSBvZiBwYXJhbXMuZWlwMTU1OSBhbmQgcGFyYW1zLmdhc1ByaWNlIG1heSBiZSBzcGVjaWZpZWQnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnYm90aF9nYXNQcmljZV9hbmRfZWlwMTU1OWdhc01vZGVsX3NwZWNpZmllZCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnByZWJ1aWxkVHggJiYgcGFyYW1zLnJlY2lwaWVudHMpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ09ubHkgb25lIG9mIHByZWJ1aWxkVHggYW5kIHJlY2lwaWVudHMgbWF5IGJlIHNwZWNpZmllZCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICdib3RoX3ByZWJ1aWxkdHhfYW5kX3JlY2lwaWVudHNfc3BlY2lmaWVkJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cyAmJiAhQXJyYXkuaXNBcnJheShwYXJhbXMucmVjaXBpZW50cykpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2V4cGVjdGluZyByZWNpcGllbnRzIGFycmF5Jyk7XG4gICAgICBlcnJvci5jb2RlID0gJ3JlY2lwaWVudHNfbm90X2FycmF5JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChfLmlzQXJyYXkodGhpcy5fcGVybWlzc2lvbnMpICYmICF0aGlzLl9wZXJtaXNzaW9ucy5pbmNsdWRlcygnc3BlbmQnKSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignbm8gc3BlbmQgcGVybWlzc2lvbiBvbiB0aGlzIHdhbGxldCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICd1c2VyX25vdF9hbGxvd2VkX3RvX3NwZW5kX2Zyb21fd2FsbGV0JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVjZWl2ZUFkZHJlc3MgJiYgKHBhcmFtcy50eXBlID09PSAndHJhbnNmZXInIHx8IHBhcmFtcy50eXBlID09PSAndHJhbnNmZXJUb2tlbicpKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKGBjYW5ub3QgdXNlIHJlY2VpdmUgYWRkcmVzcyBmb3IgVFNTIHRyYW5zYWN0aW9ucyBvZiB0eXBlICR7cGFyYW1zLnR5cGV9YCk7XG4gICAgICBlcnJvci5jb2RlID0gJ3JlY2VpdmVfYWRkcmVzc19ub3RfYWxsb3dlZF9mb3JfdHNzX3dpdGhkcmF3YWxzJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cyAmJiAocGFyYW1zLnR5cGUgPT09ICdmaWxsTm9uY2UnIHx8IHBhcmFtcy50eXBlID09PSAnYWNjZWxlcmF0aW9uJykpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoYGNhbm5vdCBwcm92aWRlIHJlY2lwaWVudHMgZm9yIHRyYW5zYWN0aW9uIHR5cGUgJHtwYXJhbXMudHlwZX1gKTtcbiAgICAgIGVycm9yLmNvZGUgPSAncmVjaXBpZW50c19ub3RfYWxsb3dlZF9mb3JfZmlsbG5vbmNlX2FuZF9hY2NlbGVyYXRpb25fdHhfdHlwZSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5hcGlWZXJzaW9uKSB7XG4gICAgICB2YWxpZGF0ZVR4UmVxdWVzdEFwaVZlcnNpb24odGhpcywgcGFyYW1zLmFwaVZlcnNpb24pO1xuICAgIH1cblxuICAgIC8vIERvaW5nIGEgc2FuaXR5IGNoZWNrIGZvciBwYXNzd29yZCBoZXJlIHRvIGF2b2lkIGRvaW5nIGZ1cnRoZXIgd29yayBpZiB3ZSBrbm93IGl0J3Mgd3JvbmdcbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmdldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZSh7XG4gICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICBjdXN0b21TaWduaW5nRnVuY3Rpb246IHBhcmFtcy5jdXN0b21TaWduaW5nRnVuY3Rpb24sXG4gICAgfSk7XG5cbiAgICBsZXQgdHhQcmVidWlsZFF1ZXJ5OiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQgfCBzdHJpbmc+O1xuICAgIGlmIChpc1ByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQocGFyYW1zLnByZWJ1aWxkVHgpICYmIHBhcmFtcy5wcmVidWlsZFR4LmJ1aWxkUGFyYW1zPy5wcmV2aWV3KSB7XG4gICAgICAvLyBJZiB3ZSBwcmVidWlsdCB0aGUgdHhSZXF1ZXN0IHdpdGggcHJldmlldz10cnVlLCB0aGVuIHdlIHNob3VsZCByZWJ1aWxkIHdpdGggcHJldmlldz1mYWxzZSB0byBwZXJzaXN0IHRoZSByZXF1ZXN0XG4gICAgICB0eFByZWJ1aWxkUXVlcnkgPSB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb24oe1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIC4uLnsgLi4ucGFyYW1zLnByZWJ1aWxkVHguYnVpbGRQYXJhbXMsIHByZXZpZXc6IGZhbHNlIH0sXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhQcmVidWlsZFF1ZXJ5ID0gcGFyYW1zLnByZWJ1aWxkVHggPyBQcm9taXNlLnJlc29sdmUocGFyYW1zLnByZWJ1aWxkVHgpIDogdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgLy8gdGhlIHByZWJ1aWxkIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHByb3ZpZGluZyBhbiBleHBsaWNpdCB0eFxuICAgIGNvbnN0IHR4UHJlYnVpbGQgPSAoYXdhaXQgdHhQcmVidWlsZFF1ZXJ5KSBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYmFzZUNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczogeyAuLi50eFByZWJ1aWxkLmJ1aWxkUGFyYW1zLCAuLi5wYXJhbXMgfSxcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgICB2ZXJpZmljYXRpb246IHBhcmFtcy52ZXJpZmljYXRpb24gPz8ge30sXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgIHdhbGxldFR5cGU6IHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd0cmFuc2FjdGlvbiBwcmVidWlsZCBmYWlsZWQgbG9jYWwgdmFsaWRhdGlvbjonLCBlLm1lc3NhZ2UpO1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgJ3RyYW5zYWN0aW9uIHBhcmFtczonLFxuICAgICAgICBfLm9taXQocGFyYW1zLCBbJ2tleWNoYWluJywgJ3BydicsICdwYXNzcGhyYXNlJywgJ3dhbGxldFBhc3NwaHJhc2UnLCAna2V5JywgJ3dhbGxldCddKVxuICAgICAgKTtcbiAgICAgIC8vIFNhbml0aXplIHRvIHJlbW92ZSBfdG9rZW4gZnJvbSBiaXRnb1xuICAgICAgY29uc3Qgc2FuaXRpemVkUHJlYnVpbGQgPSB7XG4gICAgICAgIC4uLl8ub21pdCh0eFByZWJ1aWxkLCBbJ3dhbGxldCddKSxcbiAgICAgICAgd2FsbGV0OiB7XG4gICAgICAgICAgLi4udGhpcyxcbiAgICAgICAgICBiaXRnbzogXy5vbWl0KHRoaXMuYml0Z28sIFsnX3Rva2VuJ10pLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3RyYW5zYWN0aW9uIHByZWJ1aWxkOicsIHNhbml0aXplZFByZWJ1aWxkKTtcbiAgICAgIGNvbnNvbGUudHJhY2UoZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBwYXNzIG91ciB0aHJlZSBrZXlzXG4gICAgY29uc3Qgc2lnbmluZ1BhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHR4UHJlYnVpbGQsXG4gICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgYmFja3VwS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAxID8ga2V5Y2hhaW5zWzFdIDogbnVsbCxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAyID8ga2V5Y2hhaW5zWzJdIDogbnVsbCxcbiAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgfTtcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ29uY2hhaW4nKSB7XG4gICAgICBzaWduaW5nUGFyYW1zLnB1YnMgPSBrZXljaGFpbnMubWFwKChrKSA9PiB7XG4gICAgICAgIGFzc2VydChrLnB1Yik7XG4gICAgICAgIHJldHVybiBrLnB1YjtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzaWduaW5nUGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQpIHtcbiAgICAgIGFzc2VydCh0aGlzLnRzc1V0aWxzLCAndHNzVXRpbHMgbXVzdCBiZSBkZWZpbmVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgICAgY29uc3QgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscy5nZXRUeFJlcXVlc3Qoc2lnbmluZ1BhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkLCBwYXJhbXMucmVxSWQpO1xuICAgICAgaWYgKHRoaXMudHNzVXRpbHMuaXNQZW5kaW5nQXBwcm92YWxUeFJlcXVlc3RGdWxsKHR4UmVxdWVzdCkpIHtcbiAgICAgICAgcmV0dXJuIHR4UmVxdWVzdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHNpZ25pbmdQYXJhbXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnaW5zdWZmaWNpZW50IGZ1bmRzJykpIHtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdpbnN1ZmZpY2llbnRfZnVuZHMnO1xuICAgICAgICBlcnJvci53YWxsZXRCYWxhbmNlcyA9IHtcbiAgICAgICAgICBiYWxhbmNlU3RyaW5nOiB0aGlzLmJhbGFuY2VTdHJpbmcoKSxcbiAgICAgICAgICBjb25maXJtZWRCYWxhbmNlU3RyaW5nOiB0aGlzLmNvbmZpcm1lZEJhbGFuY2VTdHJpbmcoKSxcbiAgICAgICAgICBzcGVuZGFibGVCYWxhbmNlU3RyaW5nOiB0aGlzLnNwZW5kYWJsZUJhbGFuY2VTdHJpbmcoKSxcbiAgICAgICAgICBiYWxhbmNlOiB0aGlzLmJhbGFuY2UoKSxcbiAgICAgICAgICBjb25maXJtZWRCYWxhbmNlOiB0aGlzLmNvbmZpcm1lZEJhbGFuY2UoKSxcbiAgICAgICAgICBzcGVuZGFibGVCYWxhbmNlOiB0aGlzLnNwZW5kYWJsZUJhbGFuY2UoKSxcbiAgICAgICAgfTtcbiAgICAgICAgZXJyb3IudHhQYXJhbXMgPSB7XG4gICAgICAgICAgLi4uXy5vbWl0KHBhcmFtcywgWydrZXljaGFpbicsICdwcnYnLCAncGFzc3BocmFzZScsICd3YWxsZXRQYXNzcGhyYXNlJywgJ2tleScsICd3YWxsZXQnXSksXG4gICAgICAgICAgd2FsbGV0OiB7XG4gICAgICAgICAgICAuLi50aGlzLFxuICAgICAgICAgICAgYml0Z286IF8ub21pdCh0aGlzLmJpdGdvLCBbJ190b2tlbiddKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VsZXJhdGUgYSB0cmFuc2FjdGlvbidzIGNvbmZpcm1hdGlvbiB1c2luZyBDaGlsZC1QYXlzLUZvci1QYXJlbnQgKENQRlApIG9yIFJlcGxhY2UtQnktRmVlIChSQkYpXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGFjY2VsZXJhdGVUcmFuc2FjdGlvbihwYXJhbXM6IEFjY2VsZXJhdGVUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgdGhpcy52YWxpZGF0ZUFjY2VsZXJhdGlvblBhcmFtcyhwYXJhbXMpO1xuXG4gICAgcGFyYW1zLnJlY2lwaWVudHMgPSBbXTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKHtcbiAgICAgIC4uLihhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcykpLFxuICAgICAgLi4uQnVpbGRQYXJhbXMuZW5jb2RlKHBhcmFtcyksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlQWNjZWxlcmF0aW9uUGFyYW1zKHBhcmFtczogQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucykge1xuICAgIGlmICghcGFyYW1zLmNwZnBUeElkcyAmJiAhcGFyYW1zLnJiZlR4SWRzKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdtdXN0IHBhc3MgY3BmcFR4SWRzIG9yIHJiZlR4SWRzJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2NwZnB0eGlkc19vcl9yYmZ0eGlkc19yZXF1aXJlZCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmNwZnBUeElkcyAmJiBwYXJhbXMucmJmVHhJZHMpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2Nhbm5vdCBzcGVjaWZ5IGJvdGggY3BmcFR4SWRzIGFuZCByYmZUeElkcycpO1xuICAgICAgZXJyb3IuY29kZSA9ICdjYW5ub3Rfc3BlY2lmeV9ib3RoX2NwZnBfYW5kX3JiZl90eGlkcyc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmNwZnBUeElkcykge1xuICAgICAgdGhpcy52YWxpZGF0ZUNwZnBQYXJhbXMocGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJiZlR4SWRzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlUmJmUGFyYW1zKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMucmVjaXBpZW50cykgfHwgcGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB2YWx1ZSBmb3IgJ3JlY2lwaWVudHMnOiBtdXN0IGJlIGVtcHR5IGFycmF5IHdoZW4gc2V0YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVJiZlBhcmFtcyhwYXJhbXM6IEFjY2VsZXJhdGVUcmFuc2FjdGlvbk9wdGlvbnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLnJiZlR4SWRzKSB8fCBwYXJhbXMucmJmVHhJZHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdleHBlY3RpbmcgcmJmVHhJZHMgdG8gYmUgYW4gYXJyYXkgb2YgbGVuZ3RoIDEnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAncmJmdHhpZHNfbm90X2FycmF5JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmZlZU11bHRpcGxpZXIpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2ZlZU11bHRpcGxpZXIgbXVzdCBiZSBzZXQnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnZmVlbXVsdGlwbGllcl9ub3Rfc2V0JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZmVlTXVsdGlwbGllciA8PSAxKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdmZWVNdWx0aXBsaWVyIG11c3QgYmUgYSBncmVhdGVyIHRoYW4gMScpO1xuICAgICAgZXJyb3IuY29kZSA9ICdmZWVtdWx0aXBsaWVyX2dyZWF0ZXJfdGhhbl9vbmUnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNwZnBQYXJhbXMocGFyYW1zOiBBY2NlbGVyYXRlVHJhbnNhY3Rpb25PcHRpb25zKSB7XG4gICAgLy8gVE9ETyhCRy05MzQ5KTogY2hhbmdlIHRoZSBsYXN0IGNoZWNrIHRvID4gMCBhbmQgdGhlIGVycm9yIG1lc3NhZ2Ugb25jZSBwbGF0Zm9ybSBhbGxvd3MgbXVsdGlwbGUgdHJhbnNhY3Rpb25zIHRvXG4gICAgLy8gYmUgYnVtcGVkIGluIHRoZSBzYW1lIENQRlAgdHJhbnNhY3Rpb25cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLmNwZnBUeElkcykgfHwgcGFyYW1zLmNwZnBUeElkcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2V4cGVjdGluZyBjcGZwVHhJZHMgdG8gYmUgYW4gYXJyYXkgb2YgbGVuZ3RoIDEnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnY3BmcHR4aWRzX25vdF9hcnJheSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuY3BmcEZlZVJhdGUpKSB7XG4gICAgICBpZiAocGFyYW1zLm5vQ3BmcEZlZVJhdGUgIT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignY3BmcEZlZVJhdGUgbXVzdCBiZSBzZXQgdW5sZXNzIG5vQ3BmcEZlZVJhdGUgaXMgc2V0Jyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnY3BmcGZlZXJhdGVfbm90X3NldCc7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5jcGZwRmVlUmF0ZSkgfHwgcGFyYW1zLmNwZnBGZWVSYXRlIDwgMCkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdjcGZwRmVlUmF0ZSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdjcGZwZmVlcmF0ZV9ub3Rfbm9ubmVnYXRpdmVfaW50ZWdlcic7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5tYXhGZWUpKSB7XG4gICAgICBpZiAocGFyYW1zLm5vTWF4RmVlICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ21heEZlZSBtdXN0IGJlIHNldCB1bmxlc3Mgbm9NYXhGZWUgaXMgc2V0Jyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnbWF4ZmVlX25vdF9zZXQnO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubWF4RmVlKSB8fCBwYXJhbXMubWF4RmVlIDwgMCkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdtYXhGZWUgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnbWF4ZmVlX25vdF9ub25uZWdhdGl2ZV9pbnRlZ2VyJztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdCBhIGhhbGYtc2lnbmVkIHRyYW5zYWN0aW9uIHRvIEJpdEdvXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB0eEhleDogdHJhbnNhY3Rpb24gaGV4IHRvIHN1Ym1pdFxuICAgKiAtIGhhbGZTaWduZWQ6IG9iamVjdCBjb250YWluaW5nIHRyYW5zYWN0aW9uICh0eEhleCBvciB0eEJhc2U2NCkgdG8gc3VibWl0XG4gICAqIEBwYXJhbSByZXFJZCAtIHJlcXVlc3QgdHJhY2VyIHJlcXVlc3QgaWRcbiAgICovXG4gIGFzeW5jIHN1Ym1pdFRyYW5zYWN0aW9uKHBhcmFtczogU3VibWl0VHJhbnNhY3Rpb25PcHRpb25zID0ge30sIHJlcUlkPzogSVJlcXVlc3RUcmFjZXIpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ290cCcsICd0eEhleCcsICd0eFJlcXVlc3RJZCddKTtcbiAgICBjb25zdCBoYXNUeEhleCA9ICEhcGFyYW1zLnR4SGV4O1xuICAgIGNvbnN0IGhhc0hhbGZTaWduZWQgPSAhIXBhcmFtcy5oYWxmU2lnbmVkO1xuXG4gICAgaWYgKHBhcmFtcy50eFJlcXVlc3RJZCAmJiAoaGFzVHhIZXggfHwgaGFzSGFsZlNpZ25lZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzdXBwbHkgZXhhY3RseSBvbmUgb2YgdHhSZXF1ZXN0SWQsIHR4SGV4LCBvciBoYWxmU2lnbmVkJyk7XG4gICAgfSBlbHNlIGlmICghcGFyYW1zLnR4UmVxdWVzdElkICYmICgoaGFzVHhIZXggJiYgaGFzSGFsZlNpZ25lZCkgfHwgKCFoYXNUeEhleCAmJiAhaGFzSGFsZlNpZ25lZCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3Qgc3VwcGx5IGVpdGhlciB0eEhleCBvciBoYWxmU2lnbmVkLCBidXQgbm90IGJvdGgnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VuZFRyYW5zYWN0aW9uKHBhcmFtcywgcmVxSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgY29pbnMgdG8gYSByZWNpcGllbnRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmFkZHJlc3MgLSB0aGUgZGVzdGluYXRpb24gYWRkcmVzc1xuICAgKiBAcGFyYW0gcGFyYW1zLmFtb3VudCAtIHRoZSBhbW91bnQgaW4gc2F0b3NoaXMvd2VpL2Jhc2UgdmFsdWUgdG8gYmUgc2VudFxuICAgKiBAcGFyYW0gcGFyYW1zLm1lc3NhZ2UgLSBvcHRpb25hbCBtZXNzYWdlIHRvIGF0dGFjaCB0byB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zLmRhdGEgLSBbRXRoZXJldW0gU3BlY2lmaWNdIG9wdGlvbmFsIGRhdGEgdG8gcGFzcyB0byB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zLmN1c3RvZGlhblRyYW5zYWN0aW9uSWQgLSBbRXRoZXJldW0vTU1JIFNwZWNpZmljXSBpZCBvZiB0cmFuc2FjdGlvbiBjcmVhdGVkIHZpYSBtZXRhbWFza1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB0aGUgcGFzc3BocmFzZSB0byBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIHVzZXIga2V5IG9uIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXMucHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtLCBpZiB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbiAgICogQHBhcmFtIHBhcmFtcy5taW5Db25maXJtcyAtIHRoZSBtaW5pbXVtIGNvbmZpcm1hdGlvbiB0aHJlc2hvbGQgZm9yIGlucHV0c1xuICAgKiBAcGFyYW0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIHdoZXRoZXIgdG8gZW5mb3JjZSBtaW5Db25maXJtcyBmb3IgY2hhbmdlIGlucHV0c1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHNlbmQocGFyYW1zOiBTZW5kT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnXSwgWydtZXNzYWdlJywgJ2RhdGEnXSk7XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYW1vdW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBhbW91bnQnKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgYWRkcmVzcycpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvaW4gPSB0aGlzLmJhc2VDb2luO1xuXG4gICAgY29uc3QgYW1vdW50ID0gbmV3IEJpZ051bWJlcihwYXJhbXMuYW1vdW50KTtcblxuICAgIGNvbnN0IGlzQW1vdW50TmVnYXRpdmUgPSBhbW91bnQuaXNOZWdhdGl2ZSgpO1xuICAgIGNvbnN0IGlzQW1vdW50WmVybyA9IGFtb3VudC5pc1plcm8oKTtcbiAgICBjb25zdCBpc0Ftb3VudERlY2ltYWwgPSAhYW1vdW50LmlzSW50ZWdlcigpO1xuXG4gICAgXy5zb21lKFtpc0Ftb3VudE5lZ2F0aXZlLCAhY29pbi52YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKSAmJiBpc0Ftb3VudFplcm8sIGlzQW1vdW50RGVjaW1hbF0sIChjb25kaXRpb24pID0+IHtcbiAgICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBhbW91bnQgLSBJbnRlZ2VyIGdyZWF0ZXIgdGhhbiB6ZXJvIG9yIG51bWVyaWMgc3RyaW5nIGV4cGVjdGVkJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCByZWNpcGllbnRzOiBTZW5kTWFueU9wdGlvbnNbJ3JlY2lwaWVudHMnXSA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogcGFyYW1zLmFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogcGFyYW1zLmFtb3VudCxcbiAgICAgIH0sXG4gICAgXTtcbiAgICBpZiAocGFyYW1zLnRva2VuTmFtZSkge1xuICAgICAgcmVjaXBpZW50c1swXS50b2tlbk5hbWUgPSBwYXJhbXMudG9rZW5OYW1lO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmRhdGEgJiYgY29pbi50cmFuc2FjdGlvbkRhdGFBbGxvd2VkKCkpIHtcbiAgICAgIHJlY2lwaWVudHNbMF0uZGF0YSA9IHBhcmFtcy5kYXRhO1xuICAgIH1cbiAgICBjb25zdCBzZW5kTWFueU9wdGlvbnM6IFNlbmRNYW55T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcywge1xuICAgICAgcmVjaXBpZW50cyxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5zZW5kTWFueShzZW5kTWFueU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYW4gRVJDLTcyMSBORlQgb3IgRVJDLTExNTUgTkZUKHMpLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGNvbnN0cnVjdHMgdGhlIGFwcHJvcHJpYXRlIGNhbGwgZGF0YSBmb3IgYW4gRVJDLTcyMS8xMTU1IHRva2VuIHRyYW5zZmVyLFxuICAgKiBhbmQgY2FsbHMgdGhlIHRva2VuIGNvbnRyYWN0IHdpdGggdGhlIGRhdGEsIGFuZCBhbW91bnQgMC4gVGhpcyB0cmFuc2FjdGlvbiB3aWxsIGFsd2F5cyBwcm9kdWNlXG4gICAqIGEgcGVuZGluZyBhcHByb3ZhbC5cbiAgICpcbiAgICogQHBhcmFtIHNlbmRPcHRpb25zIE9wdGlvbnMgdG8gc3BlY2lmeSBob3cgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBzZW50LlxuICAgKiBAcGFyYW0gc2VuZE5mdE9wdGlvbnMgT3B0aW9ucyB0byBzcGVjaWZ5IHRoZSBORlQocykgdG8gYmUgc2VudC5cbiAgICpcbiAgICogQHJldHVybiBBIHBlbmRpbmcgYXBwcm92YWwgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIHNlbmROZnQoc2VuZE9wdGlvbnM6IFNlbmRORlRPcHRpb25zLCBzZW5kTmZ0T3B0aW9uczogTkZUVHJhbnNmZXJPcHRpb25zKTogUHJvbWlzZTxTZW5kTkZUUmVzdWx0PiB7XG4gICAgY29uc3QgbmZ0Q29sbGVjdGlvbnMgPSBhd2FpdCB0aGlzLmdldE5mdEJhbGFuY2VzKCk7XG4gICAgY29uc3QgeyB0b2tlbkNvbnRyYWN0QWRkcmVzcywgcmVjaXBpZW50QWRkcmVzcywgdHlwZSB9ID0gc2VuZE5mdE9wdGlvbnM7XG5cbiAgICBjb25zdCBuZnRCYWxhbmNlID0gbmZ0Q29sbGVjdGlvbnMuZmluZCgoYykgPT4gYy5tZXRhZGF0YS50b2tlbkNvbnRyYWN0QWRkcmVzcyA9PT0gdG9rZW5Db250cmFjdEFkZHJlc3MpO1xuICAgIGlmICghbmZ0QmFsYW5jZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb2xsZWN0aW9uIG5vdCBmb3VuZCBmb3IgdG9rZW4gY29udHJhY3QgJHt0b2tlbkNvbnRyYWN0QWRkcmVzc31gKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uaXNWYWxpZEFkZHJlc3MocmVjaXBpZW50QWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZWNpcGllbnQgYWRkcmVzcyAke3JlY2lwaWVudEFkZHJlc3N9YCk7XG4gICAgfVxuICAgIGNvbnN0IGJhc2VBZGRyZXNzID0gdGhpcy5jb2luU3BlY2lmaWMoKT8uYmFzZUFkZHJlc3MgfHwgdGhpcy5jb2luU3BlY2lmaWMoKT8ucm9vdEFkZHJlc3M7XG4gICAgaWYgKCFiYXNlQWRkcmVzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGJhc2UgYWRkcmVzcyBmb3Igd2FsbGV0Jyk7XG4gICAgfVxuXG4gICAgaWYgKG5mdEJhbGFuY2UudHlwZSAhPT0gdHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTcGVjaWZpZWQgTkZUIHR5cGUgJHt0eXBlfSBkb2VzIG5vdCBtYXRjaCBjb2xsZWN0aW9uIHR5cGUgJHtuZnRCYWxhbmNlLnR5cGV9YCk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChzZW5kTmZ0T3B0aW9ucy50eXBlKSB7XG4gICAgICBjYXNlICdFUkM3MjEnOiB7XG4gICAgICAgIGlmICghbmZ0QmFsYW5jZS5jb2xsZWN0aW9uc1tzZW5kTmZ0T3B0aW9ucy50b2tlbklkXSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUb2tlbiAke3NlbmROZnRPcHRpb25zLnRva2VuSWR9IG5vdCBmb3VuZCBpbiBjb2xsZWN0aW9uICR7dG9rZW5Db250cmFjdEFkZHJlc3N9IG9yIGRvZXMgbm90IGhhdmUgYSBzcGVuZGFibGUgYmFsYW5jZWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYmFzZUNvaW4uYnVpbGROZnRUcmFuc2ZlckRhdGEoe1xuICAgICAgICAgIC4uLnNlbmROZnRPcHRpb25zLFxuICAgICAgICAgIGZyb21BZGRyZXNzOiBiYXNlQWRkcmVzcyxcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCByZWNpcGllbnQ7XG4gICAgICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpID09PSAndmV0Jykge1xuICAgICAgICAgIHJlY2lwaWVudCA9IHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgICAgIHRva2VuRGF0YTogZGF0YSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT09ICdoYmFyZXZtJykge1xuICAgICAgICAgIHJlY2lwaWVudCA9IHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHNlbmROZnRPcHRpb25zLnRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiAnMCcsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiBuZnRCYWxhbmNlLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWNpcGllbnQgPSB7XG4gICAgICAgICAgICBhZGRyZXNzOiBzZW5kTmZ0T3B0aW9ucy50b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmRNYW55KHtcbiAgICAgICAgICAuLi5zZW5kT3B0aW9ucyxcbiAgICAgICAgICByZWNpcGllbnRzOiBbcmVjaXBpZW50XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjYXNlICdFUkMxMTU1Jzoge1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gc2VuZE5mdE9wdGlvbnMuZW50cmllcztcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgaWYgKCFuZnRCYWxhbmNlLmNvbGxlY3Rpb25zW2VudHJ5LnRva2VuSWRdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBUb2tlbiAke2VudHJ5LnRva2VuSWR9IG5vdCBmb3VuZCBpbiBjb2xsZWN0aW9uICR7c2VuZE5mdE9wdGlvbnMudG9rZW5Db250cmFjdEFkZHJlc3N9IG9yIGRvZXMgbm90IGhhdmUgYSBzcGVuZGFibGUgYmFsYW5jZWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuZnRCYWxhbmNlLmNvbGxlY3Rpb25zW2VudHJ5LnRva2VuSWRdIDwgZW50cnkuYW1vdW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBBbW91bnQgJHtlbnRyeS5hbW91bnR9IGV4Y2VlZHMgc3BlbmRhYmxlIGJhbGFuY2Ugb2YgJHtuZnRCYWxhbmNlLmNvbGxlY3Rpb25zW2VudHJ5LnRva2VuSWRdfSBmb3IgdG9rZW4gJHtcbiAgICAgICAgICAgICAgICBlbnRyeS50b2tlbklkXG4gICAgICAgICAgICAgIH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJhc2VDb2luLmJ1aWxkTmZ0VHJhbnNmZXJEYXRhKHtcbiAgICAgICAgICAuLi5zZW5kTmZ0T3B0aW9ucyxcbiAgICAgICAgICBmcm9tQWRkcmVzczogYmFzZUFkZHJlc3MsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kTWFueSh7XG4gICAgICAgICAgLi4uc2VuZE9wdGlvbnMsXG4gICAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiBzZW5kTmZ0T3B0aW9ucy50b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICAgICAgICAgICAgYW1vdW50OiAnMCcsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRva2VuVHlwZS5ESUdJVEFMX0FTU0VUOiB7XG4gICAgICAgIGlmICghbmZ0QmFsYW5jZS5jb2xsZWN0aW9uc1tzZW5kTmZ0T3B0aW9ucy50b2tlbklkXSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUb2tlbiAke3NlbmROZnRPcHRpb25zLnRva2VuSWR9IG5vdCBmb3VuZCBpbiBjb2xsZWN0aW9uICR7dG9rZW5Db250cmFjdEFkZHJlc3N9IG9yIGRvZXMgbm90IGhhdmUgYSBzcGVuZGFibGUgYmFsYW5jZWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRva2VuRGF0YTogVG9rZW5UcmFuc2ZlclJlY2lwaWVudFBhcmFtcyA9IHtcbiAgICAgICAgICB0b2tlblR5cGU6IHNlbmROZnRPcHRpb25zLnR5cGUsXG4gICAgICAgICAgdG9rZW5RdWFudGl0eTogJzEnLCAvLyBUaGlzIE5GVCBzdGFuZGFyZCB3aWxsIGFsd2F5cyBoYXZlIHF1YW50aXR5IG9mIDFcbiAgICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICAgICAgICB0b2tlbklkOiBzZW5kTmZ0T3B0aW9ucy50b2tlbklkLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kTWFueSh7XG4gICAgICAgICAgLi4uc2VuZE9wdGlvbnMsXG4gICAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiByZWNpcGllbnRBZGRyZXNzLFxuICAgICAgICAgICAgICBhbW91bnQ6ICcxJywgLy8gdGhlIGFtb3VudCBuZWVkcyB0byBiZSBub24temVybyBmb3IgdGhlIHRyYW5zYWN0aW9uIHRvIGJlIHZhbGlkLCBpdCBpcyBpZ25vcmVkXG4gICAgICAgICAgICAgIHRva2VuRGF0YSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgbW9uZXkgdG8gbXVsdGlwbGUgcmVjaXBpZW50c1xuICAgKiAxLiBHZXRzIHRoZSB1c2VyIGtleWNoYWluIGJ5IGNoZWNraW5nIHRoZSB3YWxsZXQgZm9yIGEga2V5IHdoaWNoIGhhcyBhbiBlbmNyeXB0ZWQgcHJ2XG4gICAqIDIuIERlY3J5cHRzIHVzZXIga2V5XG4gICAqIDMuIENyZWF0ZXMgdGhlIHRyYW5zYWN0aW9uIHdpdGggZGVmYXVsdCBmZWVcbiAgICogNC4gU2lnbnMgdHJhbnNhY3Rpb24gd2l0aCBkZWNyeXB0ZWQgdXNlciBrZXlcbiAgICogNS4gU2VuZHMgdGhlIHRyYW5zYWN0aW9uIHRvIEJpdEdvXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXNcbiAgICogQHBhcmFtIHt7YWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IHN0cmluZ319IHBhcmFtcy5yZWNpcGllbnRzIC0gbGlzdCBvZiByZWNpcGllbnRzIGFuZCBuZWNlc3NhcnkgcmVjaXBpZW50IGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtQmxvY2tzIC0gRXN0aW1hdGVzIHRoZSBhcHByb3hpbWF0ZSBmZWUgcGVyIGtpbG9ieXRlIG5lY2Vzc2FyeSBmb3IgYSB0cmFuc2FjdGlvbiBjb25maXJtYXRpb24gd2l0aGluIG51bUJsb2NrcyBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gdGhlIGRlc2lyZWQgZmVlUmF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGluIHNhdG90aGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIEVuZm9yY2VzIG1pbkNvbmZpcm1zIG9uIGNoYW5nZSBpbnB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cyAtIFRoZSBkZXNpcmVkIGNvdW50IG9mIHVuc3BlbnRzIGluIHRoZSB3YWxsZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5tZXNzYWdlIC0gb3B0aW9uYWwgbWVzc2FnZSB0byBhdHRhY2ggdG8gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBzbWFsbGVyIHRoYW4gdGhpcyBhbW91bnQgb2Ygc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBsYXJnZXIgdGhhbiB0aGlzIGFtb3VudCBvZiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnNlcXVlbmNlSWQgLSBUaGUgc2VxdWVuY2UgSUQgb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGFzdExlZGdlclNlcXVlbmNlIC0gQWJzb2x1dGUgbWF4IGxlZGdlciB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGVkZ2VyU2VxdWVuY2VEZWx0YSAtIFJlbGF0aXZlIGxlZGdlciBoZWlnaHQgKGluIHJlbGF0aW9uIHRvIHRoZSBjdXJyZW50IGxlZGdlcikgdGhhdCB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZ2FzUHJpY2UgLSBDdXN0b20gZ2FzIHByaWNlIHRvIGJlIHVzZWQgZm9yIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLm5vU3BsaXRDaGFuZ2UgLSBTZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIGF1dG9tYXRpYyBjaGFuZ2Ugc3BsaXR0aW5nIGZvciBwdXJwb3NlcyBvZiB1bnNwZW50IG1hbmFnZW1lbnRcbiAgICogQHBhcmFtIHtBcnJheX0gcGFyYW1zLnVuc3BlbnRzIC0gVGhlIHVuc3BlbnRzIHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb24uIEVhY2ggdW5zcGVudCBzaG91bGQgYmUgaW4gdGhlIGZvcm0gcHJldlR4SWQ6bk91dHB1dFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmNvbW1lbnQgLSBBbnkgYWRkaXRpb25hbCBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5vdHAgLSBUd28gZmFjdG9yIGF1dGggY29kZSB0byBlbmFibGUgc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5jaGFuZ2VBZGRyZXNzIC0gU3BlY2lmaWVzIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgY2hhbmdlIG91dHB1dFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5pbnN0YW50IC0gU2VuZCB0aGlzIHRyYW5zYWN0aW9uIHVzaW5nIGNvaW4tc3BlY2lmaWMgaW5zdGFudCBzZW5kaW5nIG1ldGhvZCAoaWYgYXZhaWxhYmxlKVxuICAgKiBAcGFyYW0ge3t2YWx1ZTogU3RyaW5nLCB0eXBlOiBTdHJpbmd9fSBwYXJhbXMubWVtbyAtIE1lbW8gdG8gdXNlIGluIHRyYW5zYWN0aW9uIChzdXBwb3J0ZWQgYnkgU3RlbGxhcilcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50eXBlIC0gVHlwZSBvZiB0aGUgdHJhbnNhY3Rpb24gKGUuZy4gdHJ1c3RsaW5lKVxuICAgKiBAcGFyYW0ge3t0b2tlbjogcGFyYW1zLCBhY3Rpb246IFN0cmluZywgbGltaXQ6IFN0cmluZ31bXX0gb3B0aW9ucy50cnVzdGxpbmVzIC0gQXJyYXkgb2YgdHJ1c3RsaW5lcyB0byBtYW5hZ2UgKHN1cHBvcnRlZCBieSBTdGVsbGFyKVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHNlbmRNYW55KHBhcmFtczogU2VuZE1hbnlPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ2NvbW1lbnQnLCAnb3RwJ10pO1xuICAgIGRlYnVnKCdzZW5kTWFueSBjYWxsZWQnKTtcbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHBhcmFtcy5yZXFJZCA9IHJlcUlkO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgY29pbiA9IHRoaXMuYmFzZUNvaW47XG4gICAgaWYgKF8uaXNPYmplY3QocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgICBwYXJhbXMucmVjaXBpZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWNpcGllbnQpIHtcbiAgICAgICAgY29pbi5jaGVja1JlY2lwaWVudChyZWNpcGllbnQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZW5kTWFueVR4UmVxdWVzdHMocGFyYW1zKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbLi4udGhpcy5wcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCksICdjb21tZW50JywgJ290cCcsICdob3AnXSk7XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0LnR5cGUgPT09ICdjdXN0b2RpYWwnKSB7XG4gICAgICBjb25zdCBleHRyYVBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uZ2V0RXh0cmFQcmVidWlsZFBhcmFtcyhPYmplY3QuYXNzaWduKHBhcmFtcywgeyB3YWxsZXQ6IHRoaXMgfSkpO1xuICAgICAgT2JqZWN0LmFzc2lnbihzZWxlY3RQYXJhbXMsIGV4dHJhUGFyYW1zKTtcbiAgICAgIHJldHVybiB0aGlzLmluaXRpYXRlVHJhbnNhY3Rpb24oc2VsZWN0UGFyYW1zLCByZXFJZCk7XG4gICAgfVxuXG4gICAgY29uc3QgaGFsZlNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpO1xuICAgIGNvbnN0IGV4dHJhUGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5nZXRFeHRyYVByZWJ1aWxkUGFyYW1zKE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7IHdhbGxldDogdGhpcyB9KSk7XG4gICAgY29uc3QgZmluYWxUeFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBoYWxmU2lnbmVkVHJhbnNhY3Rpb24sIHNlbGVjdFBhcmFtcywgZXh0cmFQYXJhbXMpO1xuICAgIHJldHVybiB0aGlzLnNlbmRUcmFuc2FjdGlvbihmaW5hbFR4UGFyYW1zLCByZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3ZlciBhbiB1bnN1cHBvcnRlZCB0b2tlbiBmcm9tIGEgQml0R28gbXVsdGlzaWcgd2FsbGV0XG4gICAqIHBhcmFtcyBhcmUgdmFsaWRhdGVkIGluIEV0aC5wcm90b3R5cGUucmVjb3ZlclRva2VuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcyB0aGUgY29udHJhY3QgYWRkcmVzcyBvZiB0aGUgdW5zdXBwb3J0ZWQgdG9rZW5cbiAgICogQHBhcmFtIHBhcmFtcy5yZWNpcGllbnQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgcmVjb3ZlcmVkIHRva2VucyBzaG91bGQgYmUgc2VudCB0b1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgdGhlIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSBwYXJhbXMucHJ2IHRoZSB4cHJ2XG4gICAqL1xuICBhc3luYyByZWNvdmVyVG9rZW4ocGFyYW1zOiBSZWNvdmVyVG9rZW5PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnZXRoJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0b2tlbiByZWNvdmVyeSBvbmx5IHN1cHBvcnRlZCBmb3IgZXRoIHdhbGxldHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHRva2VuQ29udHJhY3RBZGRyZXNzLCByZWNpcGllbnQgfSA9IHBhcmFtcztcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHRva2VuQ29udHJhY3RBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgdG9rZW5Db250cmFjdEFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChyZWNpcGllbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciByZWNpcGllbnQnKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWNvdmVyVG9rZW5PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7IHRva2VuQ29udHJhY3RBZGRyZXNzLCByZWNpcGllbnQgfSwgcGFyYW1zLCB7IHdhbGxldDogdGhpcyB9KTtcbiAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5yZWNvdmVyVG9rZW4ocmVjb3ZlclRva2VuT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYW5zYWN0aW9uIG1ldGFkYXRhIGZvciB0aGUgb2xkZXN0IHRyYW5zYWN0aW9uIHRoYXQgaXMgc3RpbGwgcGVuZGluZyBvciBhdHRlbXB0ZWRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBPYmplY3Qgd2l0aCB0eGlkLCB3YWxsZXRJZCwgdHgsIGFuZCBmZWUgKGlmIHN1cHBvcnRlZCBmb3IgY29pbilcbiAgICovXG4gIGFzeW5jIGdldEZpcnN0UGVuZGluZ1RyYW5zYWN0aW9uKHBhcmFtczogUmVjb3JkPHN0cmluZywgbmV2ZXI+ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBpbnRlcm5hbC5nZXRGaXJzdFBlbmRpbmdUcmFuc2FjdGlvbih7IHdhbGxldElkOiB0aGlzLmlkKCkgfSwgdGhpcy5iYXNlQ29pbiwgdGhpcy5iaXRnbyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBmZWUgb24gdGhlIHBlbmRpbmcgdHJhbnNhY3Rpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gdHhpZCB0byB0aGUgZ2l2ZW4gbmV3IGZlZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHhpZCBUaGUgdHJhbnNhY3Rpb24gSWQgY29ycmVzcG9uZGluZyB0byB0aGUgdHJhbnNhY3Rpb24gd2hvc2UgZmVlIGlzIHRvIGJlIGNoYW5nZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuZmVlXSBPcHRpb25hbCAtIFRoZSBuZXcgZmVlIHRvIGFwcGx5IHRvIHRoZSBkZW5vdGVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zLmVpcDE1NTldIE9wdGlvbmFsIC0gdGhlIGVpcDE1NTkgdmFsdWVzIHRvIGFwcGx5IHRvIHRoZSBkZW5vdGVkIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSB0cmFuc2FjdGlvbiBJRCBvZiB0aGUgbmV3IHRyYW5zYWN0aW9uIHRoYXQgY29udGFpbnMgdGhlIG5ldyBmZWUgcmF0ZVxuICAgKi9cbiAgYXN5bmMgY2hhbmdlRmVlKHBhcmFtczogQ2hhbmdlRmVlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAocGFyYW1zLmZlZSkgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0eGlkJywgJ2ZlZSddLCBbXSk7XG4gICAgaWYgKHBhcmFtcy5laXAxNTU5KSBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLmVpcDE1NTksIFsnbWF4RmVlUGVyR2FzJywgJ21heFByaW9yaXR5RmVlUGVyR2FzJ10pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy90eC9jaGFuZ2VGZWUnKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBpbmZvIGZyb20gbWVyY2hhbnQgc2VydmVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgVGhlIHBhcmFtcyBwYXNzZWQgaW50byB0aGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy51cmwgVGhlIFVybCB0byByZXRyaWV2ZSBpbmZvIGZyb21cbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIGluZm8gcmV0dXJuZWQgZnJvbSB0aGUgbWVyY2hhbnQgc2VydmVyXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBnZXRQYXltZW50SW5mbyhwYXJhbXM6IHsgdXJsPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJ10sIFtdKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3BheW1lbnRJbmZvJykpLnF1ZXJ5KHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBqc29uIHBheW1lbnQgcmVzcG9uc2VcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1zIHBhc3NlZCBpbnRvIHRoZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnBheW1lbnRVcmwgLSBUaGUgdXJsIHRvIHNlbmQgdGhlIGZ1bGx5IHNpZ25lZCB0cmFuc2FjdGlvbiB0b1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnR4SGV4IC0gVGhlIHRyYW5zYWN0aW9uIGhleCBvZiB0aGUgcGF5bWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLm1lbW8ge1N0cmluZ30gLSBBIG1lbW8gc3VwcGxpZWQgYnkgdGhlIG1lcmNoYW50LCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSB0cmFuc2ZlciBhcyB0aGUgY29tbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmV4cGlyZXMge1N0cmluZ30gLSBJU08gRGF0ZSBmb3JtYXQgb2Ygd2hlbiB0aGUgcGF5bWVudCByZXF1ZXN0IGV4cGlyZXNcbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIGluZm8gcmV0dXJuZWQgZnJvbSB0aGUgbWVyY2hhbnQgc2VydmVyIFBheW1lbnQgQWNrXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBzZW5kUGF5bWVudFJlc3BvbnNlKHBhcmFtczogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zZW5kUGF5bWVudCcpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgcG9saWN5IHJ1bGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbmRpdGlvbiBjb25kaXRpb24gb2JqZWN0XG4gICAqIEBwYXJhbSBwYXJhbXMuYWN0aW9uIGFjdGlvbiBvYmplY3RcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBjcmVhdGVQb2xpY3lSdWxlKHBhcmFtczogQ3JlYXRlUG9saWN5UnVsZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFsnbWVzc2FnZSddKTtcblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuY29uZGl0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogY29uZGl0aW9ucyBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGFjdGlvbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvcG9saWN5L3J1bGUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhIHBvbGljeSBydWxlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5jb25kaXRpb24gY29uZGl0aW9uIG9iamVjdFxuICAgKiBAcGFyYW0gcGFyYW1zLmFjdGlvbiBhY3Rpb24gb2JqZWN0XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2V0UG9saWN5UnVsZShwYXJhbXM6IGFueSA9IHt9KSB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFsnbWVzc2FnZSddKTtcblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuY29uZGl0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogY29uZGl0aW9ucyBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGFjdGlvbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wdXQodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIFBvbGljeSBSdWxlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyByZW1vdmVQb2xpY3lSdWxlKHBhcmFtczogUmVtb3ZlUG9saWN5UnVsZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbJ21lc3NhZ2UnXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyByZW1vdmUocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgY3Jvc3NDaGFpbiBVVFhPc1xuICAgKiBDdXJyZW50bHkgb25seSBmb3IgQVZBWFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNvdXJjZUNoYWluIHRoZSBzb3VyY2VjaGFpbiB0byBwaWNrIFVUWE9zLCBpZiBub3QgZ2l2ZW4sIHRoZW4gcGljayBmcm9tIGFsbCBhdmFpbGFibGUgY2hhaW5zIFtQLCBDXVxuICAgKi9cbiAgZmV0Y2hDcm9zc0NoYWluVVRYT3MocGFyYW1zOiBGZXRjaENyb3NzQ2hhaW5VVFhPc09wdGlvbnMpOiBQcm9taXNlPENyb3NzQ2hhaW5VVFhPW10+IHtcbiAgICBjb25zdCBxdWVyeSA9IF8ucGljayhwYXJhbXMsIFsnc291cmNlQ2hhaW4nXSk7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvY3Jvc3NDaGFpblVuc3BlbnRzJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGEgSlNPTiByZXByZXNlbnRhYmxlIHZlcnNpb24gb2YgdGhpcyB3YWxsZXRcbiAgICovXG4gIHRvSlNPTigpOiBXYWxsZXREYXRhIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHRyYWRpbmcgYWNjb3VudCBmcm9tIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b1RyYWRpbmdBY2NvdW50KCk6IFRyYWRpbmdBY2NvdW50IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ29mYycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgY29udmVydCBhbiBPZmZjaGFpbiAoT0ZDKSB3YWxsZXQgdG8gYSB0cmFkaW5nIGFjY291bnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUcmFkaW5nQWNjb3VudCh0aGlzLl93YWxsZXQuZW50ZXJwcmlzZSwgdGhpcywgdGhpcy5iaXRnbyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhZGRyZXNzIGJvb2sgZm9yIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b0FkZHJlc3NCb29rKCk6IElBZGRyZXNzQm9vayB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdvZmMnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IHVzZSBhbiBPZmZjaGFpbiAoT0ZDKSB3YWxsZXQgZm9yIHRoZSBhZGRyZXNzIGJvb2snKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBZGRyZXNzQm9vayh0aGlzLl93YWxsZXQuZW50ZXJwcmlzZSwgdGhpcy5iaXRnbywgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgc3Rha2luZyB3YWxsZXQgZnJvbSB0aGlzIHdhbGxldFxuICAgKi9cbiAgdG9TdGFraW5nV2FsbGV0KCk6IFN0YWtpbmdXYWxsZXQge1xuICAgIGNvbnN0IGlzRXRoVHNzID1cbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT0gJ2V0aCcgJiYgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8ud2FsbGV0VmVyc2lvblxuICAgICAgICA/IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWMud2FsbGV0VmVyc2lvbiA+PSAzXG4gICAgICAgIDogZmFsc2U7XG4gICAgcmV0dXJuIG5ldyBTdGFraW5nV2FsbGV0KHRoaXMsIGlzRXRoVHNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBnbyBzdGFraW5nIHdhbGxldCBmcm9tIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b0dvU3Rha2luZ1dhbGxldCgpOiBHb1N0YWtpbmdXYWxsZXQge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnb2ZjJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBjb252ZXJ0IGFuIE9mZmNoYWluIChPRkMpIHdhbGxldCB0byBhIHN0YWtpbmcgd2FsbGV0Jyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgR29TdGFraW5nV2FsbGV0KHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIGRvd25sb2FkcyBQREYga2V5Y2FyZCBmb3Igd2FsbGV0IChyZXF1aXJlcyByZXNwb25zZSBmcm9tIHdhbGxldHMuZ2VuZXJhdGVXYWxsZXQpXG4gICAqXG4gICAqIE5vdGU6IHRoaXMgaXMgZXhhbXBsZSBjb2RlIGFuZCBpcyBub3QgdGhlIHZlcnNpb24gdXNlZCBvbiBiaXRnby5jb21cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgICoganNQREYgLSBhbiBpbnN0YW5jZSBvZiB0aGUganNQREYgbGlicmFyeVxuICAgKiAgICogUVJDb2RlIC0gYW4gaW5zdGFuY2Ugb2YgdGhlIFFSaW91cyBsaWJyYXJ5XG4gICAqICAgKiB1c2VyS2V5Y2hhaW4gLSBhIHdhbGxldCdzIHByaXZhdGUgdXNlciBrZXljaGFpblxuICAgKiAgICogYmFja3VwS2V5Y2hhaW4gLSBhIHdhbGxldCdzIHByaXZhdGUgYmFja3VwIGtleWNoYWluXG4gICAqICAgKiBiaXRnb0tleWNoYWluIC0gYSB3YWxsZXQncyBwcml2YXRlIGJpdGdvIGtleWNoYWluXG4gICAqICAgKiBwYXNzcGhyYXNlIC0gdGhlIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqICAgKiBwYXNzY29kZUVuY3J5cHRpb25Db2RlIC0gdGhlIGVuY3J5cHRpb24gc2VjcmV0IHVzZWQgZm9yIEJveCBEXG4gICAqICAgKiBhY3RpdmF0aW9uQ29kZSAtIGEgcmFuZG9tbHkgZ2VuZXJhdGVkIHNpeC1kaWdpdCBhY3RpdmF0aW9uIGNvZGVcbiAgICogICAqIHdhbGxldEtleUlEIC0gdGhlIEtleSBJRCB1c2VkIGZvciBkZXJpdmluZyBhIGNvbGQgd2FsbGV0J3Mgc2lnbmluZyBrZXlcbiAgICogICAqIGJhY2t1cEtleUlEIC0gdGhlIEtleSBJRCB1c2VkIGZvciBkZXJpdmluZyBhIGNvbGQgd2FsbGV0J3MgYmFja3VwIGtleVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGRvd25sb2FkS2V5Y2FyZChwYXJhbXM6IERvd25sb2FkS2V5Y2FyZE9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIGlmICghd2luZG93IHx8ICF3aW5kb3cubG9jYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRvd25sb2FkS2V5Y2FyZCBmdW5jdGlvbiBpcyBvbmx5IGNhbGxhYmxlIHdpdGhpbiBhIGJyb3dzZXIuJyk7XG4gICAgfVxuXG4gICAgLy8gR3JhYiBwYXJhbWV0ZXJzIHdpdGggZGVmYXVsdCBmb3IgYWN0aXZhdGlvbkNvZGVcbiAgICBjb25zdCB7XG4gICAgICBqc1BERixcbiAgICAgIFFSQ29kZSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBwYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgd2FsbGV0S2V5SUQsXG4gICAgICBiYWNrdXBLZXlJRCxcbiAgICAgIGFjdGl2YXRpb25Db2RlID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogOTAwMDAwICsgMTAwMDAwKS50b1N0cmluZygpLFxuICAgIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIWpzUERGIHx8IHR5cGVvZiBqc1BERiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcGFzcyBpbiBhIHZhbGlkIGpzUERGIGluc3RhbmNlJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUga2V5Y2hhaW5zXG4gICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgdHlwZW9mIHVzZXJLZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgV2FsbGV0IGtleWNoYWluIG11c3QgaGF2ZSBhICd1c2VyJyBwcm9wZXJ0eWApO1xuICAgIH1cblxuICAgIGlmICghYmFja3VwS2V5Y2hhaW4gfHwgdHlwZW9mIGJhY2t1cEtleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWNrdXAga2V5Y2hhaW4gaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFiaXRnb0tleWNoYWluIHx8IHR5cGVvZiBiaXRnb0tleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaXRnbyBrZXljaGFpbiBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAod2FsbGV0S2V5SUQgJiYgdHlwZW9mIHdhbGxldEtleUlEICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRLZXlJRCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKGJhY2t1cEtleUlEICYmIHR5cGVvZiBiYWNrdXBLZXlJRCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYmFja3VwS2V5SUQgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGFjdGl2YXRpb24gY29kZSBpZiBwcm92aWRlZFxuICAgIGlmICh0eXBlb2YgYWN0aXZhdGlvbkNvZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjdGl2YXRpb24gQ29kZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGl2YXRpb25Db2RlLmxlbmd0aCAhPT0gNikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3RpdmF0aW9uIGNvZGUgbXVzdCBiZSBzaXggY2hhcmFjdGVycycpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvaW5TaG9ydE5hbWUgPSB0aGlzLmJhc2VDb2luLnR5cGU7XG4gICAgY29uc3QgY29pbk5hbWUgPSB0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCk7XG4gICAgY29uc3Qgd2FsbGV0TGFiZWwgPSB0aGlzLl93YWxsZXQubGFiZWw7XG5cbiAgICBjb25zdCBkb2MgPSBkcmF3S2V5Y2FyZCh7XG4gICAgICBqc1BERixcbiAgICAgIFFSQ29kZSxcbiAgICAgIGVuY3J5cHQ6IHRoaXMuYml0Z28uZW5jcnlwdCxcbiAgICAgIGNvaW5TaG9ydE5hbWUsXG4gICAgICBjb2luTmFtZSxcbiAgICAgIGFjdGl2YXRpb25Db2RlLFxuICAgICAgd2FsbGV0TGFiZWwsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHdhbGxldEtleUlELFxuICAgICAgYmFja3VwS2V5SUQsXG4gICAgfSk7XG5cbiAgICAvLyBTYXZlIHRoZSBQREYgb24gdGhlIHVzZXIncyBicm93c2VyXG4gICAgZG9jLnNhdmUoYEJpdEdvIEtleWNhcmQgZm9yICR7d2FsbGV0TGFiZWx9LnBkZmApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNldCBvZiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucyBmb3IgYSB3YWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogICAgIGNvbnNvbGlkYXRlQWRkcmVzc2VzIC0gdGhlc2UgYXJlIHRoZSBvbi1jaGFpbiByZWNlaXZlIGFkZHJlc3NlcyB3ZSB3YW50IHRvIHBpY2sgYSBjb25zb2xpZGF0aW9uIGFtb3VudCBmcm9tXG4gICAqL1xuICBhc3luYyBidWlsZEFjY291bnRDb25zb2xpZGF0aW9ucyhcbiAgICBwYXJhbXM6IEJ1aWxkQ29uc29saWRhdGlvblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdPiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLmFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCBhbGxvdyBhY2NvdW50IGNvbnNvbGlkYXRpb25zLmApO1xuICAgIH1cblxuICAgIC8vIFdoaXRlbGlzdCBwYXJhbXMgdG8gYnVpbGQgdHhcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRDb25zb2xpZGF0ZUFjY291bnRQYXJhbXMoKSk7XG4gICAgZGVidWcoJ3ByZWJ1aWxkaW5nIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb246ICVPJywgd2hpdGVsaXN0ZWRQYXJhbXMpO1xuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjb3VsZCByZXR1cm4gMTAwIGJ1aWxkIHRyYW5zYWN0aW9uc1xuICAgIGNvbnN0IGJ1aWxkUmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvY29uc29saWRhdGVBY2NvdW50L2J1aWxkJykpXG4gICAgICAuc2VuZCh3aGl0ZWxpc3RlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKSkgYXMgYW55O1xuXG4gICAgaWYgKGJ1aWxkUmVzcG9uc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlY2VpdmUgYWRkcmVzc2VzIHdpdGggYmFsYW5jZSBmb3VuZCB0byBjb25zb2xpZGF0ZS4nKTtcbiAgICB9XG5cbiAgICAvLyB3ZSBuZWVkIHRvIHN0ZXAgb3ZlciBlYWNoIHByZWJ1aWxkIG5vdyAtIHNob3VsZCBiZSBpbiBhbiBhcnJheSBpbiB0aGUgYm9keVxuICAgIGNvbnN0IGNvbnNvbGlkYXRpb25zOiBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbnNvbGlkYXRlQWNjb3VudEJ1aWxkIG9mIGJ1aWxkUmVzcG9uc2UpIHtcbiAgICAgIGxldCBwcmVidWlsZDogUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCA9IChhd2FpdCB0aGlzLmJhc2VDb2luLnBvc3RQcm9jZXNzUHJlYnVpbGQoXG4gICAgICAgIE9iamVjdC5hc3NpZ24oY29uc29saWRhdGVBY2NvdW50QnVpbGQsIHtcbiAgICAgICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICAgICAgYnVpbGRQYXJhbXM6IHdoaXRlbGlzdGVkUGFyYW1zLFxuICAgICAgICB9KVxuICAgICAgKSkgYXMgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdDtcblxuICAgICAgZGVsZXRlIHByZWJ1aWxkLndhbGxldDtcbiAgICAgIGRlbGV0ZSBwcmVidWlsZC5idWlsZFBhcmFtcztcblxuICAgICAgcHJlYnVpbGQgPSBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHsgd2FsbGV0SWQ6IHRoaXMuaWQoKSB9KTtcbiAgICAgIGRlYnVnKCdmaW5hbCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uIHByZWJ1aWxkOiAlTycsIHByZWJ1aWxkKTtcblxuICAgICAgY29uc29saWRhdGlvbnMucHVzaChwcmVidWlsZCk7XG4gICAgfVxuICAgIHJldHVybiBjb25zb2xpZGF0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW5kIHNlbmRzIGEgc2V0IG9mIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zIGZvciBhIHdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgICAgcHJlYnVpbGRUeCAgIC0gdGhpcyBpcyB0aGUgcHJlLWJ1aWxkIGNvbnNvbGlkYXRpb24gdHguIHRoaXMgaXMgYSBub3JtYWxseSBidWlsdCB0eCB3aXRoXG4gICAqICAgICAgICAgICAgICAgICAgICBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciBvZiBjb25zb2xpZGF0ZUlkLlxuICAgKiAgICAgdmVyaWZpY2F0aW9uIC0gbm9ybWFsIGtleWNoYWlucywgZXRjLiBmb3IgdmVyaWZpY2F0aW9uXG4gICAqL1xuICBhc3luYyBzZW5kQWNjb3VudENvbnNvbGlkYXRpb24ocGFyYW1zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLmFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCBhbGxvdyBhY2NvdW50IGNvbnNvbGlkYXRpb25zLmApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQudHlwZSA9PT0gJ2N1c3RvZGlhbCcgJiYgdGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSAhPT0gJ3RzcycpIHtcbiAgICAgIHBhcmFtcy50eXBlID0gJ2NvbnNvbGlkYXRlJztcbiAgICAgIHJldHVybiB0aGlzLmluaXRpYXRlVHJhbnNhY3Rpb24ocGFyYW1zIGFzIFR4U2VuZEJvZHksIHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgLy8gb25lIG9mIGEgc2V0IG9mIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMucHJlYnVpbGRUeCA9PT0gJ3N0cmluZycgfHwgcGFyYW1zLnByZWJ1aWxkVHggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJ1aWxkIG9mIGFjY291bnQgY29uc29saWRhdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5wcmVidWlsZFR4LmNvbnNvbGlkYXRlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZpbmQgY29uc29saWRhdGlvbiBpZCBvbiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uLicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgaWYgKCFwYXJhbXMucHJlYnVpbGRUeC50eFJlcXVlc3RJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnNvbGlkYXRpb24gcmVxdWVzdCBtaXNzaW5nIHR4UmVxdWVzdElkLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kTWFueVR4UmVxdWVzdHMocGFyYW1zKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduZWRQcmVidWlsZCA9IChhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcykpIGFzIGFueTtcblxuICAgIC8vIGRlY29yYXRlIHdpdGggb3VyIGNvbnNvbGlkYXRpb24gaWRcbiAgICBzaWduZWRQcmVidWlsZC5jb25zb2xpZGF0ZUlkID0gcGFyYW1zLnByZWJ1aWxkVHguY29uc29saWRhdGVJZDtcblxuICAgIGRlbGV0ZSBzaWduZWRQcmVidWlsZC53YWxsZXQ7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihzaWduZWRQcmVidWlsZCwgcGFyYW1zLnJlcUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW5kIHNlbmRzIGEgc2V0IG9mIGFjY291bnQgY29uc29saWRhdGlvbnMuIFRoaXMgaXMgaW50ZW5kZWQgdG8gZmx1c2ggbWFueSBiYWxhbmNlcyB0byB0aGUgcm9vdCB3YWxsZXQgYmFsYW5jZS5cbiAgICogQHBhcmFtIHBhcmFtcyAtXG4gICAqICAgICBjb25zb2xpZGF0ZUFkZHJlc3NlcyAtIHRoZXNlIGFyZSB0aGUgb24tY2hhaW4gcmVjZWl2ZSBhZGRyZXNzZXMgd2Ugd2FudCB0byBwaWNrIGEgY29uc29saWRhdGlvbiBhbW91bnQgZnJvbVxuICAgKi9cbiAgYXN5bmMgc2VuZEFjY291bnRDb25zb2xpZGF0aW9ucyhwYXJhbXM6IEJ1aWxkQ29uc29saWRhdGlvblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IGFsbG93IGFjY291bnQgY29uc29saWRhdGlvbnMuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBpVmVyc2lvbiA9XG4gICAgICBwYXJhbXMuYXBpVmVyc2lvbiA/P1xuICAgICAgKHRoaXMudHNzVXRpbHMgJiYgdGhpcy50c3NVdGlscy5zdXBwb3J0ZWRUeFJlcXVlc3RWZXJzaW9ucygpLmluY2x1ZGVzKCdmdWxsJykgPyAnZnVsbCcgOiB1bmRlZmluZWQpO1xuXG4gICAgLy8gRG9pbmcgYSBzYW5pdHkgY2hlY2sgZm9yIHBhc3N3b3JkIGhlcmUgdG8gYXZvaWQgZG9pbmcgZnVydGhlciB3b3JrIGlmIHdlIGtub3cgaXQncyB3cm9uZ1xuICAgIGF3YWl0IHRoaXMuZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGN1c3RvbVNpZ25pbmdGdW5jdGlvbjogcGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbixcbiAgICB9KTtcblxuICAgIC8vIHRoaXMgZ2l2ZXMgdXMgYSBzZXQgb2YgYWNjb3VudCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uc1xuICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRzID0gYXdhaXQgdGhpcy5idWlsZEFjY291bnRDb25zb2xpZGF0aW9ucyh7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBhcGlWZXJzaW9uOiBhcGlWZXJzaW9uLFxuICAgIH0pO1xuICAgIGlmICh1bnNpZ25lZEJ1aWxkcyAmJiB1bnNpZ25lZEJ1aWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBHZXQgd2FsbGV0J3MgYmFzZSBhZGRyZXNzIHRvIHZhbGlkYXRlIGRlc3RpbmF0aW9uIGFkZHJlc3Nlc1xuICAgICAgY29uc3QgYmFzZUFkZHJlc3MgPSB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljPy5iYXNlQWRkcmVzcyB8fCB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljPy5yb290QWRkcmVzcztcbiAgICAgIC8vIFZhbGlkYXRlIGFsbCB0cmFuc2FjdGlvbnNcbiAgICAgIGZvciAoY29uc3QgYnVpbGQgb2YgdW5zaWduZWRCdWlsZHMpIHtcbiAgICAgICAgaWYgKGJhc2VBZGRyZXNzKSB7XG4gICAgICAgICAgZGVidWcoJ3ZlcmlmeWluZyB0eEhleCcsIEpTT04uc3RyaW5naWZ5KGJ1aWxkKSk7XG4gICAgICAgICAgLy9WZXJpZnkgdHJhbnNhY3Rpb25zIHNlbmQgZnVuZHMgdG8gdGhlIGJhc2UgYWRkcmVzc1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICEoYXdhaXQgdGhpcy5iYXNlQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICAgIHR4UHJlYnVpbGQ6IGJ1aWxkLFxuICAgICAgICAgICAgICB0eFBhcmFtczogcGFyYW1zLFxuICAgICAgICAgICAgICB2ZXJpZmljYXRpb246IHtcbiAgICAgICAgICAgICAgICBjb25zb2xpZGF0aW9uVG9CYXNlQWRkcmVzczogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgICAgICAgICB3YWxsZXRUeXBlOiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIG91dHB1dCB0aGF0IGRvZXMgbm90IGNvbnNvbGlkYXRlIGZ1bmRzIHRvIGJhc2UgYWRkcmVzcycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qgc3VjY2Vzc2Z1bFR4czogYW55W10gPSBbXTtcbiAgICAgIGNvbnN0IGZhaWxlZFR4czogeyBtZXNzYWdlOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdW5zaWduZWRCdWlsZCBvZiB1bnNpZ25lZEJ1aWxkcykge1xuICAgICAgICAvLyBmb2xkIGFueSBvZiB0aGUgcGFyYW1ldGVycyB3ZSB1c2VkIHRvIGJ1aWxkIHRoaXMgdHJhbnNhY3Rpb24gaW50byB0aGUgdW5zaWduZWRCdWlsZFxuICAgICAgICBjb25zdCB1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcyk7XG4gICAgICAgIHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9ucy5hcGlWZXJzaW9uID0gYXBpVmVyc2lvbjtcbiAgICAgICAgdW5zaWduZWRCdWlsZFdpdGhPcHRpb25zLnByZWJ1aWxkVHggPSB1bnNpZ25lZEJ1aWxkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHNlbmRUeCA9IGF3YWl0IHRoaXMuc2VuZEFjY291bnRDb25zb2xpZGF0aW9uKHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9ucyk7XG4gICAgICAgICAgc3VjY2Vzc2Z1bFR4cy5wdXNoKHNlbmRUeCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBmYWlsZWRUeHMucHVzaCh7IG1lc3NhZ2U6IGUubWVzc2FnZSwgbmFtZTogZS5uYW1lIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NmdWxUeHMsXG4gICAgICAgIGZhaWx1cmU6IGZhaWxlZFR4cyxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNldCBvZiB0cmFuc2FjdGlvbnMgdGhhdCBlbmFibGVzIHRoZSBzcGVjaWZpZWQgdG9rZW5zXG4gICAqIEBwYXJhbSBwYXJhbXMgLVxuICAgKiAgICBlbmFibGVUb2tlbnM6IFRva2VuIGVuYWJsZW1lbnQgb3BlcmF0aW9ucyB3ZSB3YW50IHRvIHBlcmZvcm1cbiAgICogQHJldHVybnMgVW5zaWduZWQgdHJhbnNhY3Rpb25zIHRoYXQgZW5hYmxlcyB0aGUgc3BlY2lmaWVkIHRva2Vuc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGJ1aWxkVG9rZW5FbmFibGVtZW50cyhcbiAgICBwYXJhbXM6IEJ1aWxkVG9rZW5FbmFibGVtZW50T3B0aW9ucyA9IHsgZW5hYmxlVG9rZW5zOiBbXSB9XG4gICk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdPiB7XG4gICAgY29uc3QgdGVDb25maWcgPSB0aGlzLmJhc2VDb2luLmdldFRva2VuRW5hYmxlbWVudENvbmZpZygpO1xuICAgIGlmICghdGVDb25maWcucmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IHJlcXVpcmUgdG9rZW4gZW5hYmxlbWVudHNgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB3YWxsZXQgdHlwZSBpZiBjb2luIHJlcXVpcmVzIGl0XG4gICAgaWYgKHR5cGVvZiB0ZUNvbmZpZy52YWxpZGF0ZVdhbGxldCA9PT0gJ2Z1bmN0aW9uJyAmJiB0aGlzLl93YWxsZXQudHlwZSkge1xuICAgICAgdGVDb25maWcudmFsaWRhdGVXYWxsZXQodGhpcy5fd2FsbGV0LnR5cGUpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZW5hYmxlVG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB0b2tlbnMgYXJlIGJlaW5nIHNwZWNpZmllZCcpO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLnJlY2lwaWVudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG5vdCBzcGVjaWZ5IHJlY2lwaWVudHMgZm9yIHRva2VuIGVuYWJsZW1lbnQgdHJhbnNhY3Rpb25zJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgLy8gU3BsaXQgcXVlcnkgaWYgd2UgY2FuJ3QgZW5hYmxlIG11bHRpcGxlIHRva2VucyBpbiBvbmUgdHhcbiAgICBpZiAoIXRlQ29uZmlnLnN1cHBvcnRzTXVsdGlwbGVUb2tlbkVuYWJsZW1lbnRzICYmIHBhcmFtcy5lbmFibGVUb2tlbnMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgcXVlcmllcyA9IHBhcmFtcy5lbmFibGVUb2tlbnMubWFwKGFzeW5jIChlbmFibGVUb2tlbikgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFRva2VuRW5hYmxlbWVudHMoe1xuICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICBlbmFibGVUb2tlbnM6IFtlbmFibGVUb2tlbl0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocXVlcmllcyk7XG4gICAgICByZXR1cm4gcmVzdWx0cy5mbGF0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRQYXJhbXM6IFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zID0gXy5waWNrKHBhcmFtcywgdGhpcy5wcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCkpO1xuICAgIGlmICghYnVpbGRQYXJhbXMudHlwZSkge1xuICAgICAgYnVpbGRQYXJhbXMudHlwZSA9ICdlbmFibGV0b2tlbic7XG4gICAgfVxuICAgIC8vIENoZWNrIGlmIHdlIGJ1aWxkIHdpdGggaW50ZW50XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gW2F3YWl0IHRoaXMucHJlYnVpbGRUcmFuc2FjdGlvbihidWlsZFBhcmFtcyldO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXdyaXRlIHRva2VucyBpbnRvIHJlY2lwaWVudHMgZm9yIGJ1aWxkVHJhbnNhY3Rpb25cbiAgICAgIGJ1aWxkUGFyYW1zLnJlY2lwaWVudHMgPSBwYXJhbXMuZW5hYmxlVG9rZW5zLm1hcCgodG9rZW4pID0+IHtcbiAgICAgICAgLy8gSWYgdG9rZW4gaGFzIG5vbiBhZGRyZXNzLCB0YWtlIHRoZSBmaXJzdCB3YWxsZXQgYWRkcmVzcyBpcyBzdG9yZWQgaW4gaXRzIGNvaW4tc3BlY2lmaWMgcHJvcGVydHlcbiAgICAgICAgLy8gSW4gYWNjb3VudC1iYXNlZCBjb2luIGltcGxlbWVudGF0aW9ucyB0aGF0IHVzZSB3YWxsZXQgY29udHJhY3RzLCB0aGUgYWRkcmVzcyBpcyBjYWxsZWQgYmFzZUFkZHJlc3MgKGUuZy4gZXRoLWxpa2UsIHh0eilcbiAgICAgICAgLy8gZm9yIG90aGVycyBpdCdzIGNhbGxlZCByb290QWRkcmVzcyAoZS5nLiB4cnAsIHhsbSwgYWxnbywgdHJ4KVxuICAgICAgICBjb25zdCBhZGRyZXNzID1cbiAgICAgICAgICB0b2tlbi5hZGRyZXNzIHx8IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM/LmJhc2VBZGRyZXNzIHx8IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM/LnJvb3RBZGRyZXNzO1xuICAgICAgICBpZiAoIWFkZHJlc3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dhbGxldCBkb2VzIG5vdCBoYXZlIGJhc2UgYWRkcmVzcywgbXVzdCBzcGVjaWZ5IHdpdGggdG9rZW4gcGFyYW0nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRva2VuTmFtZTogdG9rZW4ubmFtZSxcbiAgICAgICAgICBhZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBkZWxldGUgYnVpbGRQYXJhbXMuZW5hYmxlVG9rZW5zO1xuICAgICAgY29uc3QgcHJlYnVpbGRUeCA9IGF3YWl0IHRoaXMucHJlYnVpbGRUcmFuc2FjdGlvbihidWlsZFBhcmFtcyk7XG4gICAgICBwcmVidWlsZFR4LmJ1aWxkUGFyYW1zID0gYnVpbGRQYXJhbXM7XG4gICAgICByZXR1cm4gW3ByZWJ1aWxkVHhdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgd2FsbGV0IGluaXRpYWxpemF0aW9uXG4gICAqIEBwYXJhbSB7UHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnN9IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0Pn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBidWlsZFdhbGxldEluaXRpYWxpemF0aW9uKHBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4ucmVxdWlyZXNXYWxsZXRJbml0aWFsaXphdGlvblRyYW5zYWN0aW9uKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgV2FsbGV0IGluaXRpYWxpemF0aW9uIGlzIG5vdCByZXF1aXJlZCBmb3IgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdXYWxsZXQgaW5pdGlhbGl6YXRpb24gdHJhbnNhY3Rpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cbiAgICBjb25zdCBidWlsZFBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSk7XG4gICAgaWYgKCFidWlsZFBhcmFtcy50eXBlKSB7XG4gICAgICBidWlsZFBhcmFtcy50eXBlID0gJ2NyZWF0ZUFjY291bnQnO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKGJ1aWxkUGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhbmQgc2VuZHMgYSBzaW5nbGUgdW5zaWduZWQgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zXG4gICAqICAgLSBUaGUgcmVzcG9uc2UgZnJvbSBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvbiBmb3IgaG90L2NvbGQgd2FsbGV0c1xuICAgKiAgIC0gVGhlIHJlc3BvbnNlIGZyb20gaW5pdGlhdGluZyB0aGUgdHJhbnNhY3Rpb24gZm9yIGN1c3RvZGlhbCB3YWxsZXRzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZFRva2VuRW5hYmxlbWVudChwYXJhbXM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB0ZUNvbmZpZyA9IHRoaXMuYmFzZUNvaW4uZ2V0VG9rZW5FbmFibGVtZW50Q29uZmlnKCk7XG4gICAgcGFyYW1zLnZlcmlmaWNhdGlvbiA9IHBhcmFtcy52ZXJpZmljYXRpb24gPz8ge307XG4gICAgcGFyYW1zLnZlcmlmaWNhdGlvbi52ZXJpZnlUb2tlbkVuYWJsZW1lbnQgPSBwYXJhbXMudmVyaWZpY2F0aW9uLnZlcmlmeVRva2VuRW5hYmxlbWVudCA/PyB0cnVlO1xuICAgIGlmICghdGVDb25maWcucmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IHJlcXVpcmUgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbnNgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB3YWxsZXQgdHlwZSBpZiBjb2luIHJlcXVpcmVzIGl0XG4gICAgaWYgKHRlQ29uZmlnLnZhbGlkYXRlV2FsbGV0ICYmIHRoaXMuX3dhbGxldC50eXBlKSB7XG4gICAgICB0ZUNvbmZpZy52YWxpZGF0ZVdhbGxldCh0aGlzLl93YWxsZXQudHlwZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMucHJlYnVpbGRUeCA9PT0gJ3N0cmluZycgfHwgcGFyYW1zLnByZWJ1aWxkVHg/LmJ1aWxkUGFyYW1zPy50eXBlICE9PSAnZW5hYmxldG9rZW4nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYnVpbGQgb2YgdG9rZW4gZW5hYmxlbWVudC4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmRNYW55VHhSZXF1ZXN0cyhwYXJhbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuX3dhbGxldC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2hvdCc6XG4gICAgICAgIGNhc2UgJ2NvbGQnOlxuICAgICAgICAgIGNvbnN0IHNpZ25lZFByZWJ1aWxkID0gYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpO1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKHNpZ25lZFByZWJ1aWxkLCBwYXJhbXMucmVxSWQpO1xuICAgICAgICBjYXNlICdjdXN0b2RpYWwnOlxuICAgICAgICBjYXNlICdiYWNraW5nJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5pbml0aWF0ZVRyYW5zYWN0aW9uKHBhcmFtcy5wcmVidWlsZFR4LmJ1aWxkUGFyYW1zLCBwYXJhbXMucmVxSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTb21lIGNoYWlucyByZXF1aXJlIHRva2VucyB0byBiZSBlbmFibGVkIGJlZm9yZSB0aGV5IGNhbiBiZSByZWNlaXZlZC9zZW50LlxuICAgKiBUaGlzIGlzIGEgZGVkaWNhdGVkIGZ1bmN0aW9uIHRoYXQgZW5hYmxlcyB0b2tlbnMuXG4gICAqXG4gICAqIEJ1aWxkcywgc2lnbnMsIGFuZCBzZW5kcyBhIHNldCBvZiB0cmFuc2FjdGlvbnMgdGhhdCBlbmFibGVzIHRoZSBzcGVjaWZpZWQgdG9rZW5zXG4gICAqIEBwYXJhbSBwYXJhbXMgLVxuICAgKiAgICBlbmFibGVUb2tlbnM6IFRva2VuIGVuYWJsZW1lbnQgb3BlcmF0aW9ucyB3ZSB3YW50IHRvIHBlcmZvcm1cbiAgICogQHJldHVyblxuICAgKiAgICBzdWNjZXNzOiBTdWNjZXNzZnVsIHJlc3BvbnNlcyBmcm9tIHNlbmRUb2tlbkVuYWJsZW1lbnRcbiAgICogICAgZmFpbHVyZTogRXJyb3JzIGZyb20gZmFpbGVkIHRyYW5zYWN0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRUb2tlbkVuYWJsZW1lbnRzKHBhcmFtczogQnVpbGRUb2tlbkVuYWJsZW1lbnRPcHRpb25zID0geyBlbmFibGVUb2tlbnM6IFtdIH0pOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBhbnlbXTtcbiAgICBmYWlsdXJlOiBFcnJvcltdO1xuICB9PiB7XG4gICAgY29uc3QgdW5zaWduZWRCdWlsZHMgPSBhd2FpdCB0aGlzLmJ1aWxkVG9rZW5FbmFibGVtZW50cyhwYXJhbXMpO1xuXG4gICAgY29uc3Qgc3VjY2Vzc2Z1bFR4czogYW55W10gPSBbXTtcbiAgICBjb25zdCBmYWlsZWRUeHMgPSBuZXcgQXJyYXk8RXJyb3I+KCk7XG4gICAgZm9yIChjb25zdCB1bnNpZ25lZEJ1aWxkIG9mIHVuc2lnbmVkQnVpbGRzKSB7XG4gICAgICBjb25zdCB1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICBwcmVidWlsZFR4OiB1bnNpZ25lZEJ1aWxkLFxuICAgICAgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlbmRUeCA9IGF3YWl0IHRoaXMuc2VuZFRva2VuRW5hYmxlbWVudCh1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMpO1xuICAgICAgICBzdWNjZXNzZnVsVHhzLnB1c2goc2VuZFR4KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZmFpbGVkVHhzLnB1c2goZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NmdWxUeHMsXG4gICAgICBmYWlsdXJlOiBmYWlsZWRUeHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY2hhaW4gY2FudG9uLCByZXF1aXJlcyB0aGUgd2FsbGV0IHRvIGJlIGluaXRpYWxpemVkIGJ5IHNlbmRpbmcgb3V0IGEgdHJhbnNhY3Rpb25cbiAgICogdG8gYmUgb25ib2FyZGVkIG9udG8gdGhlIHZhbGlkYXRvci5cbiAgICogQnVpbGRzLCBTaWducyBhbmQgc2VuZHMgYSB0cmFuc2FjdGlvbiB0aGF0IGluaXRpYWxpemVzIHRoZSBjYW50b24gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kV2FsbGV0SW5pdGlhbGl6YXRpb24ocGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxXYWxsZXRJbml0UmVzdWx0PiB7XG4gICAgY29uc3QgcHJlYnVpbGRUeCA9IGF3YWl0IHRoaXMuYnVpbGRXYWxsZXRJbml0aWFsaXphdGlvbihwYXJhbXMpO1xuICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9uczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgcHJlYnVpbGRUeCxcbiAgICB9O1xuICAgIGNvbnN0IHN1Y2Nlc3NmdWxUeHM6IFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHRbXSA9IFtdO1xuICAgIGNvbnN0IGZhaWxlZFR4cyA9IG5ldyBBcnJheTxFcnJvcj4oKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2VuZFR4ID0gYXdhaXQgdGhpcy5zZW5kTWFueVR4UmVxdWVzdHModW5zaWduZWRCdWlsZFdpdGhPcHRpb25zKTtcbiAgICAgIHN1Y2Nlc3NmdWxUeHMucHVzaChzZW5kVHgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGZhaWxlZFR4cy5wdXNoKGUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2Vzczogc3VjY2Vzc2Z1bFR4cyxcbiAgICAgIGZhaWx1cmU6IGZhaWxlZFR4cyxcbiAgICB9O1xuICB9XG5cbiAgLyogTUFSSzogVFNTIEhlbHBlcnMgKi9cblxuICAvKipcbiAgICogUHJlYnVpbGRzIGEgdHJhbnNhY3Rpb24gZm9yIGEgVFNTIHdhbGxldC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBwcmVidWlsZCB0cmFuc2FjdGlvbiBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZWJ1aWxkVHJhbnNhY3Rpb25UeFJlcXVlc3RzKFxuICAgIHBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgYXBpVmVyc2lvbiA9IGdldFR4UmVxdWVzdEFwaVZlcnNpb24odGhpcywgcGFyYW1zLmFwaVZlcnNpb24pO1xuICAgIC8vIFR3byBvcHRpb25zIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgZmVlcyBzZWVtcyB0byBub3cgYmUgc3VwcG9ydGVkLCBmb3Igbm93IHdlIHdpbGwgc3VwcG9ydCBib3RoIHRvIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlXG4gICAgLy8gVE9ETyhCRy01OTY4NSk6IGRlcHJlY2F0ZSBvbmUgb2YgdGhlc2Ugc28gdGhhdCB3ZSBoYXZlIGEgc2luZ2xlIHdheSB0byBwYXNzIGZlZXNcbiAgICBsZXQgZmVlT3B0aW9ucztcbiAgICBpZiAocGFyYW1zLmZlZU9wdGlvbnMpIHtcbiAgICAgIGZlZU9wdGlvbnMgPSBwYXJhbXMuZmVlVG9rZW4gPyB7IC4uLnBhcmFtcy5mZWVPcHRpb25zLCBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuIH0gOiBwYXJhbXMuZmVlT3B0aW9ucztcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5nYXNQcmljZSAhPT0gdW5kZWZpbmVkIHx8IHBhcmFtcy5laXAxNTU5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZlZU9wdGlvbnMgPVxuICAgICAgICBwYXJhbXMuZ2FzUHJpY2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBnYXNQcmljZTogcGFyYW1zLmdhc1ByaWNlLFxuICAgICAgICAgICAgICBnYXNMaW1pdDogcGFyYW1zLmdhc0xpbWl0LFxuICAgICAgICAgICAgICAuLi4ocGFyYW1zLmZlZVRva2VuICE9PSB1bmRlZmluZWQgJiYgeyBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuIH0pLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBtYXhGZWVQZXJHYXM6IE51bWJlcihwYXJhbXMuZWlwMTU1OT8ubWF4RmVlUGVyR2FzKSxcbiAgICAgICAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IE51bWJlcihwYXJhbXMuZWlwMTU1OT8ubWF4UHJpb3JpdHlGZWVQZXJHYXMpLFxuICAgICAgICAgICAgICBnYXNMaW1pdDogcGFyYW1zLmdhc0xpbWl0LFxuICAgICAgICAgICAgICAuLi4ocGFyYW1zLmZlZVRva2VuICE9PSB1bmRlZmluZWQgJiYgeyBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuIH0pLFxuICAgICAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5mZWVUb2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmZWVPcHRpb25zID0geyBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuIH07XG4gICAgfSBlbHNlIGlmIChwYXJhbXMuZ2FzTGltaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmVlT3B0aW9ucyA9IHsgZ2FzTGltaXQ6IHBhcmFtcy5nYXNMaW1pdCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBmZWVPcHRpb25zID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGxldCB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICBzd2l0Y2ggKHBhcmFtcy50eXBlKSB7XG4gICAgICBjYXNlICd0cmFuc2Zlcic6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3BheW1lbnQnLFxuICAgICAgICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IHBhcmFtcy5yZWNpcGllbnRzIHx8IFtdLFxuICAgICAgICAgICAgbWVtbzogcGFyYW1zLm1lbW8sXG4gICAgICAgICAgICBub25jZTogcGFyYW1zLm5vbmNlLFxuICAgICAgICAgICAgZmVlT3B0aW9ucyxcbiAgICAgICAgICAgIGZlZVRva2VuOiBwYXJhbXMuZmVlVG9rZW4sXG4gICAgICAgICAgICBjdXN0b2RpYW5UcmFuc2FjdGlvbklkOiBwYXJhbXMuY3VzdG9kaWFuVHJhbnNhY3Rpb25JZCxcbiAgICAgICAgICAgIHVuc3BlbnRzOiBwYXJhbXMudW5zcGVudHMsXG4gICAgICAgICAgICBzZW5kZXJBZGRyZXNzOiBwYXJhbXMuc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgICAgIGlzVGVzdFRyYW5zYWN0aW9uOiBwYXJhbXMuaXNUZXN0VHJhbnNhY3Rpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndHJhbnNmZXJ0b2tlbic6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaXNUc3M6IHBhcmFtcy5pc1RzcyxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICd0cmFuc2ZlclRva2VuJyxcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IHBhcmFtcy5yZWNpcGllbnRzIHx8IFtdLFxuICAgICAgICAgICAgbm9uY2U6IHBhcmFtcy5ub25jZSxcbiAgICAgICAgICAgIGZlZU9wdGlvbnMsXG4gICAgICAgICAgICBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuLFxuICAgICAgICAgICAgdW5zcGVudHM6IHBhcmFtcy51bnNwZW50cyxcbiAgICAgICAgICAgIHNlcXVlbmNlSWQ6IHBhcmFtcy5zZXF1ZW5jZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VuYWJsZXRva2VuJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAnZW5hYmxlVG9rZW4nLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBlbmFibGVUb2tlbnM6IHBhcmFtcy5lbmFibGVUb2tlbnMsXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdjbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhY2NlbGVyYXRpb24nOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdhY2NlbGVyYXRpb24nLFxuICAgICAgICAgICAgY29tbWVudDogcGFyYW1zLmNvbW1lbnQsXG4gICAgICAgICAgICBsb3dGZWVUeGlkOiBwYXJhbXMubG93RmVlVHhpZCxcbiAgICAgICAgICAgIHJlY2VpdmVBZGRyZXNzOiBwYXJhbXMucmVjZWl2ZUFkZHJlc3MsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgICAgZmVlVG9rZW46IHBhcmFtcy5mZWVUb2tlbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmaWxsTm9uY2UnOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdmaWxsTm9uY2UnLFxuICAgICAgICAgICAgY29tbWVudDogcGFyYW1zLmNvbW1lbnQsXG4gICAgICAgICAgICBub25jZTogcGFyYW1zLm5vbmNlLFxuICAgICAgICAgICAgcmVjZWl2ZUFkZHJlc3M6IHBhcmFtcy5yZWNlaXZlQWRkcmVzcyxcbiAgICAgICAgICAgIGZlZU9wdGlvbnMsXG4gICAgICAgICAgICBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Rva2VuQXBwcm92YWwnOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICd0b2tlbkFwcHJvdmFsJyxcbiAgICAgICAgICAgIHRva2VuTmFtZTogcGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgICAgIGZlZVRva2VuOiBwYXJhbXMuZmVlVG9rZW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY3JlYXRlQWNjb3VudCc6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ2NyZWF0ZUFjY291bnQnLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndHJhbnNmZXJBY2NlcHQnOiB7XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3RyYW5zZmVyQWNjZXB0JyxcbiAgICAgICAgICAgIHR4UmVxdWVzdElkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAndHJhbnNmZXJSZWplY3QnOiB7XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3RyYW5zZmVyUmVqZWN0JyxcbiAgICAgICAgICAgIHR4UmVxdWVzdElkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAndHJhbnNmZXJPZmZlcldpdGhkcmF3bic6IHtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAndHJhbnNmZXJPZmZlcldpdGhkcmF3bicsXG4gICAgICAgICAgICB0cmFuc2Zlck9mZmVySWQ6IHBhcmFtcy50cmFuc2Zlck9mZmVySWQsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMudHJhbnNmZXJPZmZlcklkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2N1c3RvbVR4JzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAnY3VzdG9tVHgnLFxuICAgICAgICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIHNvbEluc3RydWN0aW9uczogcGFyYW1zLnNvbEluc3RydWN0aW9ucyxcbiAgICAgICAgICAgIHNvbFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YTogcGFyYW1zLnNvbFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSxcbiAgICAgICAgICAgIGFwdG9zQ3VzdG9tVHJhbnNhY3Rpb25QYXJhbXM6IHBhcmFtcy5hcHRvc0N1c3RvbVRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBub25jZTogcGFyYW1zLm5vbmNlLFxuICAgICAgICAgICAgbWVtbzogcGFyYW1zLm1lbW8sXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JyaWRnZUZ1bmRzJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAnYnJpZGdlRnVuZHMnLFxuICAgICAgICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIGFtb3VudDogcGFyYW1zLmludGVudEFtb3VudCxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgICAgZmVlVG9rZW46IHBhcmFtcy5mZWVUb2tlbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJHtwYXJhbXMudHlwZX1gKTtcbiAgICB9XG5cbiAgICBsZXQgdW5zaWduZWRUeDogRWRkc2FVbnNpZ25lZFRyYW5zYWN0aW9uO1xuXG4gICAgaWYgKHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcpIHtcbiAgICAgIGlmICh0eFJlcXVlc3QudHJhbnNhY3Rpb25zPy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHNpbmdsZSB1bnNpZ25lZCB0eCBmb3IgdHggcmVxdWVzdCB3aXRoIGlkOiAke3R4UmVxdWVzdC50eFJlcXVlc3RJZH1gKTtcbiAgICAgIH1cblxuICAgICAgdW5zaWduZWRUeCA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR4UmVxdWVzdC51bnNpZ25lZFR4cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHNpbmdsZSB1bnNpZ25lZCB0eCBmb3IgdHggcmVxdWVzdCB3aXRoIGlkOiAke3R4UmVxdWVzdC50eFJlcXVlc3RJZH1gKTtcbiAgICAgIH1cbiAgICAgIHVuc2lnbmVkVHggPSB0eFJlcXVlc3QudW5zaWduZWRUeHNbMF07XG4gICAgfVxuXG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdhbGxldElkOiB0aGlzLmlkKCksXG4gICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICB0eFJlcXVlc3RJZDogdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgdHhIZXg6IHVuc2lnbmVkVHguc2VyaWFsaXplZFR4SGV4LFxuICAgICAgYnVpbGRQYXJhbXM6IHdoaXRlbGlzdGVkUGFyYW1zLFxuICAgICAgZmVlSW5mbzogdW5zaWduZWRUeC5mZWVJbmZvLFxuICAgICAgLi4uKHR4UmVxdWVzdC5wZW5kaW5nQXBwcm92YWxJZCAmJiB7XG4gICAgICAgIHBlbmRpbmdBcHByb3ZhbElkOiB0eFJlcXVlc3QucGVuZGluZ0FwcHJvdmFsSWQsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gZnJvbSBhIFRTUyBFZERTQSB3YWxsZXQgdXNpbmcgZXh0ZXJuYWwgc2lnbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNpZ25pbmcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHJhbnNhY3Rpb25Uc3NFeHRlcm5hbFNpZ25lckVkRFNBKFxuICAgIHBhcmFtczogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9LFxuICAgIGNvaW46IElCYXNlQ29pblxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGxldCB0eFJlcXVlc3RJZCA9ICcnO1xuICAgIGlmIChwYXJhbXMudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnR4UHJlYnVpbGQgJiYgcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHhSZXF1ZXN0SWQgcmVxdWlyZWQgdG8gc2lnbiBUU1MgdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbUNvbW1pdG1lbnRHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBjb21taXRtZW50IHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbVJTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIFIgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tR1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgRyBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBhc3NlcnQodGhpcy50c3NVdGlscywgJ3Rzc1V0aWxzIG11c3QgYmUgZGVmaW5lZCcpO1xuICAgIC8vIGFkZGluZyB0aGlzIHRvIHJlYnVpbGQgdGhlIHRyYW5zYWN0aW9uIGp1c3QgYmVmb3JlIHNpZ25pbmcgZm9yIEVkRFNBIHRyYW5zYWN0aW9uIHVzaW5nIGV4dGVybmFsIHNpZ25lclxuICAgIGNvbnN0IHJlcUlkID0gcGFyYW1zLnJlcUlkIHx8IHVuZGVmaW5lZDtcbiAgICBhd2FpdCB0aGlzLnRzc1V0aWxzLmRlbGV0ZVNpZ25hdHVyZVNoYXJlcyh0eFJlcXVlc3RJZCwgcmVxSWQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25lZFR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMuc2lnbkVkZHNhVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICAgICAgdHhSZXF1ZXN0SWQsXG4gICAgICAgIHBhcmFtcy5jdXN0b21Db21taXRtZW50R2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tUlNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tR1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICByZXFJZFxuICAgICAgKTtcbiAgICAgIHJldHVybiBzaWduZWRUeFJlcXVlc3Q7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiB0cmFuc2FjdGlvbiAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGFuZCBzZW5kcyBhIHRyYW5zYWN0aW9uIHJlcXVlc3QgZnJvbSBhIFRTUyAoaG90KSB3YWxsZXQsIG9yIGEgU01DIChjb2xkKSB3YWxsZXQgd2l0aCBhbiBleHRlcm5hbCBzaWduZXIuXG4gICAqIE1lYW50IHRvIGJlIHVzZWQgZm9yIGEgdHJhbnNhY3Rpb24gcmVxdWVzdCB3aGVyZSB0aGUgc2lnbmluZyBwcm9jZXNzIGlzIGFib3J0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogICAgdHhSZXF1ZXN0SWQgLSBUaGUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqICAgIHdhbGxldFBhc3NwaHJhc2UgLSBUaGUgcGFzc3BocmFzZSBmb3IgdGhlIHdhbGxldC5cbiAgICogICAgaXNUeFJlcXVlc3RGdWxsIC0gRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0IGlzIGZ1bGwuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgU2lnbmVkVHJhbnNhY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2lnbkFuZFNlbmRUeFJlcXVlc3QocGFyYW1zOiBTaWduQW5kU2VuZFR4UmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKHBhcmFtcy5pc1R4UmVxdWVzdEZ1bGwpIHtcbiAgICAgIGF3YWl0IHRoaXMudHNzVXRpbHM/LmRlbGV0ZVNpZ25hdHVyZVNoYXJlcyhwYXJhbXMudHhSZXF1ZXN0SWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHRoaXMuZ2V0VXNlcktleUFuZFNpZ25Uc3NUcmFuc2FjdGlvbih7XG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIHR4UmVxdWVzdElkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgfSk7XG4gICAgaWYgKCFwYXJhbXMuaXNUeFJlcXVlc3RGdWxsKSB7XG4gICAgICAvLyBJdCBpcyBhc3N1bWVkIHRoYXQgaWYgaXRzIG5vdCBhIGZ1bGwgdHggcmVxdWVzdCwgdGhlbiBpdCBpcyBhIGxpdGUgdHggcmVxdWVzdFxuICAgICAgY29uc3Qgc3VibWl0VHggPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhSZXF1ZXN0SWQ6IHBhcmFtcy50eFJlcXVlc3RJZCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHN1Ym1pdFR4O1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgc2lnbmF0dXJlIHNoYXJlcyBhcmUgaW4gYSBjbGVhbiBzdGF0ZSBiZWZvcmUgc2lnbmluZyBhIHRyYW5zYWN0aW9uLlxuICAgKiBBdXRvbWF0aWNhbGx5IGRlbGV0ZXMgc2lnbmF0dXJlIHNoYXJlcyBmb3IgRnVsbCBUeFJlcXVlc3RzIGJlZm9yZSBzaWduaW5nIHRvIHByZXZlbnRcbiAgICogaXNzdWVzIHdpdGggc3RhbGUgb3IgcGFydGlhbCBzaWduYXR1cmVzLlxuICAgKiBVc2UgdGhpcyBmb3IgRXhwcmVzcyBBUEkgYW5kIG90aGVyIGludGVncmF0aW9ucyB0aGF0IG5lZWQgYXV0b21hdGljIGNsZWFudXAgb2Ygc2lnbmF0dXJlcy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIHNpZ25pbmcgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbnN1cmVDbGVhblNpZ1NoYXJlc0FuZFNpZ25UcmFuc2FjdGlvbihcbiAgICBwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uIHwgVHhSZXF1ZXN0PiB7XG4gICAgY29uc3QgdHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhSZXF1ZXN0SWQgfHwgcGFyYW1zLnR4UHJlYnVpbGQ/LnR4UmVxdWVzdElkO1xuXG4gICAgaWYgKHR4UmVxdWVzdElkICYmIHRoaXMudHNzVXRpbHMgJiYgdGhpcy5tdWx0aXNpZ1R5cGUoKSA9PT0gJ3RzcycpIHtcbiAgICAgIGNvbnN0IHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMuZ2V0VHhSZXF1ZXN0KHR4UmVxdWVzdElkKTtcblxuICAgICAgLy8gQWx3YXlzIGNsZWFuIHNpZ25hdHVyZSBzaGFyZXMgZm9yIEZ1bGwgVHhSZXF1ZXN0cyBiZWZvcmUgc2lnbmluZ1xuICAgICAgY29uc3QgaXNGdWxsID1cbiAgICAgICAgdHhSZXF1ZXN0LmFwaVZlcnNpb24gPT09ICdmdWxsJyAmJlxuICAgICAgICAoKHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgPz8gW10pLmxlbmd0aCA+IDAgfHwgKHR4UmVxdWVzdC5tZXNzYWdlcyA/PyBbXSkubGVuZ3RoID4gMCk7XG5cbiAgICAgIGlmIChpc0Z1bGwpIHtcbiAgICAgICAgYXdhaXQgdGhpcy50c3NVdGlscy5kZWxldGVTaWduYXR1cmVTaGFyZXModHhSZXF1ZXN0SWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvbihwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gZnJvbSBhIFRTUyBFQ0RTQSB3YWxsZXQgdXNpbmcgZXh0ZXJuYWwgc2lnbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNpZ25pbmcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHJhbnNhY3Rpb25Uc3NFeHRlcm5hbFNpZ25lckVDRFNBKFxuICAgIGNvaW46IElCYXNlQ29pbixcbiAgICBwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGxldCB0eFJlcXVlc3RJZCA9ICcnO1xuICAgIGlmIChwYXJhbXMudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnR4UHJlYnVpbGQgJiYgcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHhSZXF1ZXN0SWQgcmVxdWlyZWQgdG8gc2lnbiBUU1MgdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbVBhaWxsaWVyTW9kdWx1c0dlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIHBhaWxsaWVyIG1vZHVsdXMgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgSyBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBNdURlbHRhIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbVNTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIFMgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGFzc2VydCh0aGlzLnRzc1V0aWxzLCAndHNzVXRpbHMgbXVzdCBiZSBkZWZpbmVkJyk7XG4gICAgICBjb25zdCBzaWduZWRUeFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzLnNpZ25FY2RzYVRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgICAgIHtcbiAgICAgICAgICB0eFJlcXVlc3Q6IHR4UmVxdWVzdElkLFxuICAgICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSxcbiAgICAgICAgfSxcbiAgICAgICAgUmVxdWVzdFR5cGUudHgsXG4gICAgICAgIHBhcmFtcy5jdXN0b21QYWlsbGllck1vZHVsdXNHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21LU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21TU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb25cbiAgICAgICk7XG4gICAgICByZXR1cm4gc2lnbmVkVHhSZXF1ZXN0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1MgRUNEU0Egd2FsbGV0IHVzaW5nIGV4dGVybmFsIHNpZ25lci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzaWduaW5nIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFQ0RTQU1QQ3YyKFxuICAgIGNvaW46IElCYXNlQ29pbixcbiAgICBwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGxldCB0eFJlcXVlc3RJZCA9ICcnO1xuICAgIGlmIChwYXJhbXMudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnR4UHJlYnVpbGQgJiYgcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHhSZXF1ZXN0SWQgcmVxdWlyZWQgdG8gc2lnbiBUU1MgdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRpb25GdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIE1QQ3YyIFJvdW5kIDEgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgTVBDdjIgUm91bmQgMiBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0aW9uRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBNUEN2MiBSb3VuZCAzIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhc3NlcnQodGhpcy50c3NVdGlscywgJ3Rzc1V0aWxzIG11c3QgYmUgZGVmaW5lZCcpO1xuICAgICAgY29uc3Qgc2lnbmVkVHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscy5zaWduRWNkc2FNUEN2MlRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgICAgIHtcbiAgICAgICAgICB0eFJlcXVlc3Q6IHR4UmVxdWVzdElkLFxuICAgICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSxcbiAgICAgICAgfSxcbiAgICAgICAgcGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRpb25GdW5jdGlvbixcbiAgICAgICAgcGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRpb25GdW5jdGlvbixcbiAgICAgICAgcGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRpb25GdW5jdGlvblxuICAgICAgKTtcbiAgICAgIHJldHVybiBzaWduZWRUeFJlcXVlc3Q7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiB0cmFuc2FjdGlvbiAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gZnJvbSBhIFRTUyB3YWxsZXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UcmFuc2FjdGlvblRzcyhwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICBpZiAoIXBhcmFtcy50eFByZWJ1aWxkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UHJlYnVpbGQgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UmVxdWVzdElkIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggVFNTJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50c3NVdGlscyEuc2lnblR4UmVxdWVzdCh7XG4gICAgICAgIHR4UmVxdWVzdDogcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQsXG4gICAgICAgIHR4UGFyYW1zOiBwYXJhbXMudHhQcmVidWlsZC5idWlsZFBhcmFtcyxcbiAgICAgICAgcHJ2OiBwYXJhbXMucHJ2LFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIGFwaVZlcnNpb246IHBhcmFtcy5hcGlWZXJzaW9uLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiB0cmFuc2FjdGlvbiAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgbWVzc2FnZSBmcm9tIGEgVFNTIHdhbGxldC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzaWduaW5nIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnbk1lc3NhZ2VUc3MocGFyYW1zOiBXYWxsZXRTaWduTWVzc2FnZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2lnbmVkTWVzc2FnZT4ge1xuICAgIGlmICghcGFyYW1zLnJlcUlkKSB7XG4gICAgICBwYXJhbXMucmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcnYgcmVxdWlyZWQgdG8gc2lnbiBtZXNzYWdlIHdpdGggVFNTJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGxldCB0eFJlcXVlc3Q7XG4gICAgICBhc3NlcnQocGFyYW1zLm1lc3NhZ2UsICdtZXNzYWdlIHJlcXVpcmVkIGZvciBtZXNzYWdlIHNpZ25pbmcnKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VSYXcgPSBwYXJhbXMubWVzc2FnZS5tZXNzYWdlUmF3O1xuXG4gICAgICBpZiAoIXBhcmFtcy5tZXNzYWdlLnR4UmVxdWVzdElkKSB7XG4gICAgICAgIGNvbnN0IGludGVudE9wdGlvbjogSW50ZW50T3B0aW9uc0Zvck1lc3NhZ2UgPSB7XG4gICAgICAgICAgY3VzdG9kaWFuTWVzc2FnZUlkOiBwYXJhbXMuY3VzdG9kaWFuTWVzc2FnZUlkLFxuICAgICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgICAgaW50ZW50VHlwZTogJ3NpZ25NZXNzYWdlJyxcbiAgICAgICAgICBpc1RzczogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlUmF3LFxuICAgICAgICAgIG1lc3NhZ2VTdGFuZGFyZFR5cGU6IHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VTdGFuZGFyZFR5cGUsXG4gICAgICAgICAgc2lnbmVyQWRkcmVzczogcGFyYW1zLm1lc3NhZ2Uuc2lnbmVyQWRkcmVzcyxcbiAgICAgICAgfTtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuYnVpbGRTaWduTWVzc2FnZVJlcXVlc3QoaW50ZW50T3B0aW9uKTtcbiAgICAgICAgcGFyYW1zLm1lc3NhZ2UudHhSZXF1ZXN0SWQgPSB0eFJlcXVlc3QudHhSZXF1ZXN0SWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy5pZCgpLCBwYXJhbXMubWVzc2FnZS50eFJlcXVlc3RJZCwgcGFyYW1zLnJlcUlkKTtcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0KFxuICAgICAgICB0eFJlcXVlc3QubWVzc2FnZXMgJiYgdHhSZXF1ZXN0Lm1lc3NhZ2VzLmxlbmd0aCA+IDAsXG4gICAgICAgICdVbmFibGUgdG8gZmluZCBtZXNzYWdlcyBpbiB0eFJlcXVlc3QgZm9yIG1lc3NhZ2Ugc2lnbmluZydcbiAgICAgICk7XG4gICAgICBjb25zdCBtZXNzYWdlRW5jb2RlZCA9IHR4UmVxdWVzdC5tZXNzYWdlc1swXS5tZXNzYWdlRW5jb2RlZDtcblxuICAgICAgY29uc3Qgc2lnbmVkTWVzc2FnZVJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5zaWduVHhSZXF1ZXN0Rm9yTWVzc2FnZSh7XG4gICAgICAgIHR4UmVxdWVzdCxcbiAgICAgICAgcHJ2OiBwYXJhbXMucHJ2LFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIG1lc3NhZ2VSYXcsXG4gICAgICAgIG1lc3NhZ2VFbmNvZGVkLFxuICAgICAgICBidWZmZXJUb1NpZ246IEJ1ZmZlci5mcm9tKG1lc3NhZ2VFbmNvZGVkLCAnaGV4JyksXG4gICAgICB9KTtcbiAgICAgIGFzc2VydChzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlcywgJ1VuYWJsZSB0byBmaW5kIG1lc3NhZ2VzIGluIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Jyk7XG4gICAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PT0gQ29pbkZhbWlseS5FVEgpIHtcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzWzBdLmNvbWJpbmVTaWdTaGFyZSxcbiAgICAgICAgICAnVW5hYmxlIHRvIGZpbmQgY29tYmluZVNpZ1NoYXJlIGluIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCwgJ1VuYWJsZSB0byBmaW5kIHR4SGFzaCBpbiBzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlcycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29pbjogdGhpcy5jb2luKCksXG4gICAgICAgIHR4SGFzaDogc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXNbMF0udHhIYXNoLFxuICAgICAgICBzaWduYXR1cmU6IHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCxcbiAgICAgICAgbWVzc2FnZVJhdyxcbiAgICAgICAgbWVzc2FnZUVuY29kZWQsXG4gICAgICAgIHR4UmVxdWVzdElkOiBzaWduZWRNZXNzYWdlUmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiBtZXNzYWdlICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0eXBlZCBkYXRhIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UeXBlZERhdGFUc3MocGFyYW1zOiBXYWxsZXRTaWduVHlwZWREYXRhT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkTWVzc2FnZT4ge1xuICAgIGlmICghcGFyYW1zLnJlcUlkKSB7XG4gICAgICBwYXJhbXMucmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IHJlcXVpcmVkIHRvIHNpZ24gdHlwZWQgZGF0YSB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsZXQgdHhSZXF1ZXN0O1xuICAgICAgYXNzZXJ0KHBhcmFtcy50eXBlZERhdGEsICd0eXBlZERhdGEgcmVxdWlyZWQgZm9yIHR5cGVkIGRhdGEgc2lnbmluZycpO1xuICAgICAgaWYgKCFwYXJhbXMudHlwZWREYXRhLnR4UmVxdWVzdElkKSB7XG4gICAgICAgIGNvbnN0IGludGVudE9wdGlvbnM6IEludGVudE9wdGlvbnNGb3JUeXBlZERhdGEgPSB7XG4gICAgICAgICAgY3VzdG9kaWFuTWVzc2FnZUlkOiBwYXJhbXMuY3VzdG9kaWFuTWVzc2FnZUlkLFxuICAgICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgICAgaW50ZW50VHlwZTogJ3NpZ25UeXBlZFN0cnVjdHVyZWREYXRhJyxcbiAgICAgICAgICBpc1RzczogdHJ1ZSxcbiAgICAgICAgICB0eXBlZERhdGFSYXc6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhUmF3LFxuICAgICAgICAgIHR5cGVkRGF0YUVuY29kZWQ6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhRW5jb2RlZCEudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9O1xuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5jcmVhdGVUeFJlcXVlc3RXaXRoSW50ZW50Rm9yVHlwZWREYXRhU2lnbmluZyhpbnRlbnRPcHRpb25zKTtcbiAgICAgICAgcGFyYW1zLnR5cGVkRGF0YS50eFJlcXVlc3RJZCA9IHR4UmVxdWVzdC50eFJlcXVlc3RJZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLmlkKCksIHBhcmFtcy50eXBlZERhdGEudHhSZXF1ZXN0SWQsIHBhcmFtcy5yZXFJZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5zaWduVHhSZXF1ZXN0Rm9yTWVzc2FnZSh7XG4gICAgICAgIHR4UmVxdWVzdCxcbiAgICAgICAgcHJ2OiBwYXJhbXMucHJ2LFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIG1lc3NhZ2VSYXc6IEpTT04uc3RyaW5naWZ5KHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhUmF3KSxcbiAgICAgICAgbWVzc2FnZUVuY29kZWQ6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhRW5jb2RlZCEudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBidWZmZXJUb1NpZ246IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhRW5jb2RlZCEsXG4gICAgICB9KTtcbiAgICAgIGFzc2VydChzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzLCAnVW5hYmxlIHRvIGZpbmQgbWVzc2FnZXMgaW4gc2lnbmVkVHlwZWREYXRhUmVxdWVzdCcpO1xuICAgICAgYXNzZXJ0KFxuICAgICAgICBzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzWzBdLmNvbWJpbmVTaWdTaGFyZSxcbiAgICAgICAgJ1VuYWJsZSB0byBmaW5kIGNvbWJpbmVTaWdTaGFyZSBpbiBzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzJ1xuICAgICAgKTtcbiAgICAgIGFzc2VydChzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCwgJ1VuYWJsZSB0byBmaW5kIHR4SGFzaCBpbiBzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2luOiB0aGlzLmNvaW4oKSxcbiAgICAgICAgdHhIYXNoOiBzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCxcbiAgICAgICAgc2lnbmF0dXJlOiBzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCxcbiAgICAgICAgbWVzc2FnZVJhdzogcGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFSYXcsXG4gICAgICAgIG1lc3NhZ2VFbmNvZGVkOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgdHhSZXF1ZXN0SWQ6IHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHlwZWQgZGF0YSAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcywgc2lnbnMsIGFuZCBzZW5kcyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNlbmQgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZW5kTWFueVR4UmVxdWVzdHMocGFyYW1zOiBTZW5kTWFueU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zLmFwaVZlcnNpb24gPSBnZXRUeFJlcXVlc3RBcGlWZXJzaW9uKHRoaXMsIHBhcmFtcy5hcGlWZXJzaW9uKTtcblxuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gKGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKSkgYXMgU2lnbmVkVHJhbnNhY3Rpb25SZXF1ZXN0O1xuICAgIGlmICghc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHhSZXF1ZXN0SWQgbWlzc2luZyBmcm9tIHNpZ25lZCB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnKSB7XG4gICAgICBjb25zdCBsYXRlc3RUeFJlcXVlc3QgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy5pZCgpLCBzaWduZWRUcmFuc2FjdGlvbi50eFJlcXVlc3RJZCwgcGFyYW1zLnJlcUlkKTtcbiAgICAgIGNvbnN0IHJlcUlkID0gcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgICAgY29uc3QgdHJhbnNmZXI6IHtcbiAgICAgICAgc3RhdGU6IHN0cmluZztcbiAgICAgICAgcGVuZGluZ0FwcHJvdmFsPzogc3RyaW5nO1xuICAgICAgICB0eGlkPzogc3RyaW5nO1xuICAgICAgfSA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgICAgLnBvc3QoXG4gICAgICAgICAgdGhpcy5iaXRnby51cmwoXG4gICAgICAgICAgICAnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy90eHJlcXVlc3RzLycgKyBzaWduZWRUcmFuc2FjdGlvbi50eFJlcXVlc3RJZCArICcvdHJhbnNmZXJzJyxcbiAgICAgICAgICAgIDJcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnNlbmQoKVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgICBpZiAobGF0ZXN0VHhSZXF1ZXN0LnN0YXRlID09PSAncGVuZGluZ0FwcHJvdmFsJykge1xuICAgICAgICBjb25zdCBwZW5kaW5nQXBwcm92YWxzID0gbmV3IFBlbmRpbmdBcHByb3ZhbHModGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbik7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdBcHByb3ZhbCA9IGF3YWl0IHBlbmRpbmdBcHByb3ZhbHMuZ2V0KHtcbiAgICAgICAgICBpZDogbGF0ZXN0VHhSZXF1ZXN0LnBlbmRpbmdBcHByb3ZhbElkLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwZW5kaW5nQXBwcm92YWw6IHBlbmRpbmdBcHByb3ZhbC50b0pTT04oKSxcbiAgICAgICAgICB0eFJlcXVlc3Q6IGxhdGVzdFR4UmVxdWVzdCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYW5zZmVyLFxuICAgICAgICB0eFJlcXVlc3Q6IGxhdGVzdFR4UmVxdWVzdCxcbiAgICAgICAgdHhpZDogKGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMgPz8gW10pWzBdPy5zaWduZWRUeD8uaWQsXG4gICAgICAgIHR4OiAobGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyA/PyBbXSlbMF0/LnNpZ25lZFR4Py50eCxcbiAgICAgICAgc3RhdHVzOiB0cmFuc2Zlci5zdGF0ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVxSWQgPSBwYXJhbXMucmVxSWQgfHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLnRzc1V0aWxzPy5zZW5kVHhSZXF1ZXN0KHNpZ25lZFRyYW5zYWN0aW9uLnR4UmVxdWVzdElkLCByZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBmdW5kcyBmcm9tIGEgZmVlIGFkZHJlc3MgdG8gYSBmb3J3YXJkZXIuIE9ubHkgc3VwcG9ydHMgZXRoLWxpa2UgY29pbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmZvcndhcmRlckFkZHJlc3MgLSBBZGRyZXNzIG9mIHRoZSBmb3J3YXJkZXIgdG8gc2VuZCBmdW5kcyB0by5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5hbW91bnQgLSBBbW91bnQgdG8gc2VuZCB0aGUgZm9yd2FyZGVyIChvcHRpb25hbCkuIElmIG5vdCBnaXZlbiwgZGVmYXVsdHMgdG8gc2VuZGluZyBhbiBlc3RpbWF0ZSBvZiB0aGUgYW1vdW50IG5lZWRlZCBmb3IgYSBmdW5kIHJlY292ZXJ5XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZ1bmRGb3J3YXJkZXIocGFyYW1zOiBGdW5kRm9yd2FyZGVyc09wdGlvbnMpOiBQcm9taXNlPFdhbGxldERhdGE+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuZm9yd2FyZGVyQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZm9yd2FyZGVyIGFkZHJlc3MgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9mdW5kRm9yd2FyZGVyJyk7XG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQ7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBmdW5kcyBmcm9tIGEgZmVlIGFkZHJlc3MgdG8gYSBmb3J3YXJkZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge0xpc3R9IHBhcmFtcy5mb3J3YXJkZXJzIC0gbGlzdCBvZiBmdW5kIGZvcndhcmRlciBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZ1bmRGb3J3YXJkZXJzKHBhcmFtczogRnVuZEZvcndhcmRlclBhcmFtcyk6IFByb21pc2U8V2FsbGV0RGF0YT4ge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5mb3J3YXJkZXJzKSB8fCBwYXJhbXMuZm9yd2FyZGVycy5sZW5ndGggPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmdW5kIGZvcndhcmRlciBvcHRpb25zIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvZnVuZGZvcndhcmRlcnMnKTtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGZvcndhcmRlcidzIGJhbGFuY2VcbiAgICogQHBhcmFtIHBhcmFtcyAtIG9wdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICogQHJldHVybnMgTGlzdCBvZiBmb3J3YXJkZXIgYWRkcmVzcyBhbmQgYmFsYW5jZVxuICAgKiBpZiBwYXJhbXMgaXMgbm90IHNldCB0aGVuIHJldHVybnMgbG93IGJhbGFuY2UgZm9yd2FyZGVyc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEZvcndhcmRlckJhbGFuY2UocGFyYW1zPzogRm9yd2FyZGVyQmFsYW5jZU9wdGlvbnMpOiBQcm9taXNlPEZvcndhcmRlckJhbGFuY2VbXT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBGb3J3YXJkZXJCYWxhbmNlT3B0aW9ucyA9IHt9O1xuICAgIGlmIChwYXJhbXM/Lm1heGltdW1CYWxhbmNlKSB7XG4gICAgICBxdWVyeS5tYXhpbXVtQmFsYW5jZSA9IHBhcmFtcz8ubWF4aW11bUJhbGFuY2U7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcz8ubWluaW11bUJhbGFuY2UpIHtcbiAgICAgIHF1ZXJ5Lm1pbmltdW1CYWxhbmNlID0gcGFyYW1zPy5taW5pbXVtQmFsYW5jZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybChgL2ZvcndhcmRlcnMvYmFsYW5jZXNgKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHVybCkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICAgIHJldHVybiByZXNwb25zZSBhcyBGb3J3YXJkZXJCYWxhbmNlW107XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZWNkc2EgdHNzIGNoYWxsZW5nZXMgZm9yIGEgd2FsbGV0LlxuICAgKiBUaGVzZSBhcmUgc3RhdGljIGNoYWxsZW5nZXMgdGhhdCBoYXZlIGJlZW4gdmVyaWZpZWQgYnkgYW4gZW50ZXJwcmlzZSBhZG1pbi5cbiAgICogQ2FsbGVycyBzaG91bGQgdmVyaWZ5IHRoYXQgYW4gZW50ZXJwcmlzZSBhZG1pbiBzaWduZWQgdGhlIGNoYWxsZW5nZSB2YWx1ZXMgYmVmb3JlIHVzaW5nIHRoZW0uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFdhbGxldEVjZHNhQ2hhbGxlbmdlcz59XG4gICAqL1xuICBhc3luYyBnZXRDaGFsbGVuZ2VzRm9yRWNkc2FTaWduaW5nKCk6IFByb21pc2U8V2FsbGV0RWNkc2FDaGFsbGVuZ2VzPiB7XG4gICAgLy8gbm90ZTogdGhpcyBpcyBub3QgYSBjb2luIHNwZWNpZmljIHJvdXRlLCB3ZSBjYW5ub3QgdXNlIHRoaXMudXJsKC4uKVxuICAgIGNvbnN0IHVybCA9IHRoaXMuYml0Z28udXJsKGAvd2FsbGV0LyR7dGhpcy5pZCgpfS9jaGFsbGVuZ2VzYCwgMik7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHVybCkucXVlcnkoe30pLnJlc3VsdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZW5kVHJhbnNhY3Rpb24ocGFyYW1zOiBUeFNlbmRCb2R5LCByZXFJZD86IElSZXF1ZXN0VHJhY2VyKSB7XG4gICAgLy8gZXh0cmFjdCB0aGUgd2hpdGVsaXN0ZWQgcGFyYW1zIGZyb20gdGhlIHRvcCBsZXZlbCwgaW4gY2FzZVxuICAgIC8vIG90aGVyIGludmFsaWQgcGFyYW1zIGFyZSBwcmVzZW50IHRoYXQgd291bGQgZmFpbCBlbmNvZGluZ1xuICAgIC8vIGFuZCBmYWxsIGJhY2sgdG8gdGhlIGJvZHkgcGFyYW1zXG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSB0aGlzLmJhc2VDb2luLnByZXByb2Nlc3NCdWlsZFBhcmFtcyhfLnBpY2socGFyYW1zLCB3aGl0ZWxpc3RlZFNlbmRQYXJhbXMpKTtcbiAgICBjb25zdCByZXFUcmFjZXIgPSByZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFUcmFjZXIpO1xuICAgIHJldHVybiBwb3N0V2l0aENvZGVjKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L3NlbmQnKSxcbiAgICAgIHQuaW50ZXJzZWN0aW9uKFtUeFNlbmRCb2R5LCB0LnBhcnRpYWwoeyBsb2NrdGltZTogdC5udW1iZXIgfSldKSxcbiAgICAgIHdoaXRlbGlzdGVkUGFyYW1zXG4gICAgKS5yZXN1bHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhdGVUcmFuc2FjdGlvbihwYXJhbXM6IFR4U2VuZEJvZHksIHJlcUlkPzogSVJlcXVlc3RUcmFjZXIpIHtcbiAgICAvLyBleHRyYWN0IHRoZSB3aGl0ZWxpc3RlZCBwYXJhbXMgZnJvbSB0aGUgdG9wIGxldmVsLCBpbiBjYXNlXG4gICAgLy8gb3RoZXIgaW52YWxpZCBwYXJhbXMgYXJlIHByZXNlbnQgdGhhdCB3b3VsZCBmYWlsIGVuY29kaW5nXG4gICAgLy8gYW5kIGZhbGwgYmFjayB0byB0aGUgYm9keSBwYXJhbXNcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IHRoaXMuYmFzZUNvaW4ucHJlcHJvY2Vzc0J1aWxkUGFyYW1zKF8ucGljayhwYXJhbXMsIHdoaXRlbGlzdGVkU2VuZFBhcmFtcykpO1xuICAgIGNvbnN0IHJlcVRyYWNlciA9IHJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcVRyYWNlcik7XG4gICAgcmV0dXJuIHBvc3RXaXRoQ29kZWMoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvdHgvaW5pdGlhdGUnKSxcbiAgICAgIFR4U2VuZEJvZHksXG4gICAgICB3aGl0ZWxpc3RlZFBhcmFtc1xuICAgICkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHdhbGxldCBrZXljaGFpbnMgYW5kIHZhbGlkYXRlIHBhc3NwaHJhc2UgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSB7UHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnN9IHBhcmFtcyAtIHByZWJ1aWxkIHRyYW5zYWN0aW9uIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWQgZm9yIHRyYWNpbmcgcHVycG9zZXNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbiAtIGN1c3RvbSBzaWduaW5nIGZ1bmN0aW9uIGZvciBleHRlcm5hbCBzaWduaW5nXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEtleWNoYWluW10+fVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRLZXljaGFpbnNBbmRWYWxpZGF0ZVBhc3NwaHJhc2Uoe1xuICAgIGN1c3RvbVNpZ25pbmdGdW5jdGlvbixcbiAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgIHJlcUlkLFxuICB9OiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyAmIFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPEtleWNoYWluW10+IHtcbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZCB9KTtcblxuICAgIC8vIERvaW5nIGEgc2FuaXR5IGNoZWNrIGZvciBwYXNzd29yZCBoZXJlIHRvIGF2b2lkIGRvaW5nIGZ1cnRoZXIgd29yayBpZiB3ZSBrbm93IGl0J3Mgd3JvbmdcbiAgICAvLyB3ZSBpZ25vcmUgdGhpcyBjaGVjayB3aXRoIGlmIGN1c3RvbVNpZ25pbmdGdW5jdGlvbiBpcyBwcm92aWRlZFxuICAgIC8vICB3aGljaCBtZWFucyB0aGF0IHRoZSB1c2VyIGlzIGhhbmRsaW5nIHRoZSBzaWduaW5nIGluIGV4dGVybmFsIHNpZ25pbmcgbW9kZVxuICAgIGlmICghY3VzdG9tU2lnbmluZ0Z1bmN0aW9uICYmIGtleWNoYWlucz8uWzBdPy5lbmNyeXB0ZWRQcnYgJiYgd2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgaWYgKCFkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5KHRoaXMuYml0Z28sIGtleWNoYWluc1swXSwgd2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IEVycm9yICYgeyBjb2RlPzogc3RyaW5nIH0gPSBuZXcgRXJyb3IoXG4gICAgICAgICAgYHVuYWJsZSB0byBkZWNyeXB0IGtleWNoYWluIHdpdGggdGhlIGdpdmVuIHdhbGxldCBwYXNzcGhyYXNlYFxuICAgICAgICApO1xuICAgICAgICBlcnJvci5jb2RlID0gJ3dhbGxldF9wYXNzcGhyYXNlX2luY29ycmVjdCc7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5Y2hhaW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcHJvdmUgdG9rZW4gZm9yIHVzZSB3aXRoIGEgYmF0Y2hlciBjb250cmFjdFxuICAgKiBUaGlzIGZ1bmN0aW9uIGJ1aWxkcywgc2lnbnMsIGFuZCBzZW5kcyBhIHRva2VuIGFwcHJvdmFsIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB3YWxsZXRQYXNzcGhyYXNlIC0gVGhlIHBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB1c2VyIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRva2VuIHRvIGJlIGFwcHJvdmVkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFRoZSB0cmFuc2FjdGlvbiBkZXRhaWxzXG4gICAqL1xuICBhc3luYyBhcHByb3ZlRXJjMjBUb2tlbih3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmcsIHRva2VuTmFtZTogc3RyaW5nKTogUHJvbWlzZTxTdWJtaXRUcmFuc2FjdGlvblJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBsZXQgdG9rZW5BcHByb3ZhbEJ1aWxkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLmJhc2VDb2luLnVybChgL3dhbGxldC8ke3RoaXMuaWQoKX0vdG9rZW4vYXBwcm92YWwvYnVpbGRgKTtcbiAgICAgIHRva2VuQXBwcm92YWxCdWlsZCA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgICAgLnBvc3QodXJsKVxuICAgICAgICAuc2VuZCh7XG4gICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbk5hbWUsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXN1bHQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICAgIHJlcUlkLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNpZ25pbmdQYXJhbXMgPSB7XG4gICAgICB0eFByZWJ1aWxkOiB0b2tlbkFwcHJvdmFsQnVpbGQsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIHJlcUlkLFxuICAgIH07XG5cbiAgICBjb25zdCBoYWxmU2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbihzaWduaW5nUGFyYW1zKTtcbiAgICBjb25zdCBmaW5hbFR4UGFyYW1zID0gXy5leHRlbmQoe30sIGhhbGZTaWduZWRUcmFuc2FjdGlvbik7XG5cbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24oZmluYWxUeFBhcmFtcywgcmVxSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRva2VuIGFwcHJvdmFsIHRyYW5zYWN0aW9uIGZvciBFUkMyMCB0b2tlbnNcbiAgICogSWYgd2FsbGV0UGFzc3BocmFzZSBpcyBwcm92aWRlZCwgYWxzbyBzaWducyBhbmQgc2VuZHMgdGhlIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlbk5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdG9rZW4gdG8gYmUgYXBwcm92ZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt3YWxsZXRQYXNzcGhyYXNlXSAtIE9wdGlvbmFsIHdhbGxldCBwYXNzcGhyYXNlIGZvciBzaWduaW5nIGFuZCBzZW5kaW5nXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEJ1aWxkVG9rZW5BcHByb3ZhbFJlc3BvbnNlIHwgU3VibWl0VHJhbnNhY3Rpb25SZXNwb25zZT59IFRoZSB0b2tlbiBhcHByb3ZhbCBidWlsZCByZXNwb25zZSBvciB0cmFuc2FjdGlvbiBkZXRhaWxzIGlmIHNpZ25lZFxuICAgKi9cbiAgYXN5bmMgYnVpbGRFcmMyMFRva2VuQXBwcm92YWwoXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZ1xuICApOiBQcm9taXNlPEJ1aWxkVG9rZW5BcHByb3ZhbFJlc3BvbnNlIHwgU3VibWl0VHJhbnNhY3Rpb25SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgbGV0IHRva2VuQXBwcm92YWxCdWlsZDogQnVpbGRUb2tlbkFwcHJvdmFsUmVzcG9uc2U7XG4gICAgY29uc3QgdXJsID0gdGhpcy5iYXNlQ29pbi51cmwoYC93YWxsZXQvJHt0aGlzLmlkKCl9L3Rva2VuL2FwcHJvdmFsL2J1aWxkYCk7XG4gICAgdHJ5IHtcbiAgICAgIHRva2VuQXBwcm92YWxCdWlsZCA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgICAgLnBvc3QodXJsKVxuICAgICAgICAuc2VuZCh7XG4gICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbk5hbWUsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXN1bHQoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBlcnJvciBidWlsZGluZyBlcmMyMCB0b2tlbiBhcHByb3ZhbCB0eDogJHtlcnJvcn1gKTtcbiAgICB9XG5cbiAgICBpZiAoIXdhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgIHJldHVybiB0b2tlbkFwcHJvdmFsQnVpbGQ7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5nZXRLZXljaGFpbnNBbmRWYWxpZGF0ZVBhc3NwaHJhc2Uoe1xuICAgICAgcmVxSWQsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2lnbmluZ1BhcmFtcyA9IHtcbiAgICAgIHR4UHJlYnVpbGQ6IHRva2VuQXBwcm92YWxCdWlsZCxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgcmVxSWQsXG4gICAgfTtcblxuICAgIGNvbnN0IGhhbGZTaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHNpZ25pbmdQYXJhbXMpO1xuICAgIGNvbnN0IGZpbmFsVHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgaGFsZlNpZ25lZFRyYW5zYWN0aW9uKTtcblxuICAgIHJldHVybiB0aGlzLnNlbmRUcmFuc2FjdGlvbihmaW5hbFR4UGFyYW1zLCByZXFJZCk7XG4gIH1cbn1cbiJdfQ==
3858
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC93YWxsZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0dBRUc7QUFDSCxzREFBMEU7QUFDMUUsaURBQWlEO0FBQ2pELG9EQUE0QjtBQUM1QixnRUFBcUM7QUFDckMseUNBQTJCO0FBQzNCLDBDQUE0QjtBQUU1QixxREFBdUM7QUFDdkMsa0RBQTREO0FBVTVELHdDQUEyQztBQUUzQyxrQ0FBMEM7QUFDMUMsc0NBTW1CO0FBRW5CLDBDQUEwQztBQUMxQywrREFBaUQ7QUFDakQsMENBTXFCO0FBQ3JCLDBFQUF1RTtBQUN2RSx3REFBeUY7QUFDekYsd0NBQTREO0FBQzVELHdDQUE0QztBQUM1QyxnQ0FBc0M7QUFDdEMsb0NBU2tCO0FBQ2xCLDBEQUF1RDtBQUN2RCw4Q0FBaUU7QUFDakUsNERBQWlFO0FBQ2pFLGtEQUF5RjtBQUN6RiwrQ0FBNEQ7QUErRTVELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBSWxELE1BQU0scUJBQXFCLEdBQUcseUJBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUV6RixJQUFZLHFCQUdYO0FBSEQsV0FBWSxxQkFBcUI7SUFDL0IsNkVBQVUsQ0FBQTtJQUNWLHVGQUFlLENBQUE7QUFDakIsQ0FBQyxFQUhXLHFCQUFxQixxQ0FBckIscUJBQXFCLFFBR2hDO0FBRUQsU0FBUywyQkFBMkIsQ0FDbEMsVUFBMEQ7SUFFMUQsSUFBSSxDQUFDLFVBQVUsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNs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QUcsTUFBTSxJQUFJLENBQUMsaUNBQWlDLENBQUM7WUFDN0QsS0FBSztZQUNMLGdCQUFnQjtTQUNqQixDQUFDLENBQUM7UUFFSCxNQUFNLGFBQWEsR0FBRztZQUNwQixVQUFVLEVBQUUsa0JBQWtCO1lBQzlCLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLGdCQUFnQjtZQUNoQixLQUFLO1NBQ04sQ0FBQztRQUVGLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFFMUQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDO0NBQ0Y7QUFueklELHdCQW16SUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgeyBUeFNlbmRCb2R5LCB0eXBlIEFkZHJlc3NRdWVyeVJlc3VsdCB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgQ29pbkZhbWlseSB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0ICogYXMgdCBmcm9tICdpby10cyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBJUmVxdWVzdFRyYWNlciB9IGZyb20gJy4uLy4uL2FwaSc7XG5pbXBvcnQgKiBhcyBjb21tb24gZnJvbSAnLi4vLi4vY29tbW9uJztcbmltcG9ydCB7IEFkZHJlc3NCb29rLCBJQWRkcmVzc0Jvb2sgfSBmcm9tICcuLi9hZGRyZXNzLWJvb2snO1xuaW1wb3J0IHtcbiAgSUJhc2VDb2luLFxuICBORlRUcmFuc2Zlck9wdGlvbnMsXG4gIFNpZ25lZE1lc3NhZ2UsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduZWRUcmFuc2FjdGlvblJlcXVlc3QsXG4gIFRyYW5zYWN0aW9uUHJlYnVpbGQsXG4gIFZlcmlmeUFkZHJlc3NPcHRpb25zLFxufSBmcm9tICcuLi9iYXNlQ29pbic7XG5pbXBvcnQgeyBtYWtlUmFuZG9tS2V5IH0gZnJvbSAnLi4vYml0Y29pbic7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgZ2V0U2hhcmVkU2VjcmV0IH0gZnJvbSAnLi4vZWNkaCc7XG5pbXBvcnQge1xuICBBZGRyZXNzR2VuZXJhdGlvbkVycm9yLFxuICBJbmNvcnJlY3RQYXNzd29yZEVycm9yLFxuICBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yLFxuICBNaXNzaW5nRW5jcnlwdGVkS2V5Y2hhaW5FcnJvcixcbiAgTmVlZFVzZXJTaWdudXBFcnJvcixcbn0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFN1Ym1pdFRyYW5zYWN0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi9pbnNjcmlwdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgZHJhd0tleWNhcmQgfSBmcm9tICcuLi9pbnRlcm5hbCc7XG5pbXBvcnQgKiBhcyBpbnRlcm5hbCBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcm5hbCc7XG5pbXBvcnQge1xuICBkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5LFxuICBkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5QXN5bmMsXG4gIEtleWNoYWluLFxuICBLZXljaGFpbldpdGhFbmNyeXB0ZWRQcnYsXG4gIEtleUluZGljZXMsXG59IGZyb20gJy4uL2tleWNoYWluJztcbmltcG9ydCB7IGdldExpZ2h0bmluZ0F1dGhLZXkgfSBmcm9tICcuLi9saWdodG5pbmcvbGlnaHRuaW5nV2FsbGV0VXRpbCc7XG5pbXBvcnQgeyBJUGVuZGluZ0FwcHJvdmFsLCBQZW5kaW5nQXBwcm92YWwsIFBlbmRpbmdBcHByb3ZhbHMgfSBmcm9tICcuLi9wZW5kaW5nQXBwcm92YWwnO1xuaW1wb3J0IHsgR29TdGFraW5nV2FsbGV0LCBTdGFraW5nV2FsbGV0IH0gZnJvbSAnLi4vc3Rha2luZyc7XG5pbXBvcnQgeyBUcmFkaW5nQWNjb3VudCB9IGZyb20gJy4uL3RyYWRpbmcnO1xuaW1wb3J0IHsgZ2V0VHhSZXF1ZXN0IH0gZnJvbSAnLi4vdHNzJztcbmltcG9ydCB7XG4gIEVkZHNhVW5zaWduZWRUcmFuc2FjdGlvbixcbiAgSW50ZW50T3B0aW9uc0Zvck1lc3NhZ2UsXG4gIEludGVudE9wdGlvbnNGb3JUeXBlZERhdGEsXG4gIFJlcXVlc3RUcmFjZXIsXG4gIFJlcXVlc3RUeXBlLFxuICBUb2tlblRyYW5zZmVyUmVjaXBpZW50UGFyYW1zLFxuICBUb2tlblR5cGUsXG4gIFR4UmVxdWVzdCxcbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgcG9zdFdpdGhDb2RlYyB9IGZyb20gJy4uL3V0aWxzL3Bvc3RXaXRoQ29kZWMnO1xuaW1wb3J0IHsgRWNkc2FNUEN2MlV0aWxzLCBFY2RzYVV0aWxzIH0gZnJvbSAnLi4vdXRpbHMvdHNzL2VjZHNhJztcbmltcG9ydCBFZGRzYVV0aWxzLCB7IEVkZHNhTVBDdjJVdGlscyB9IGZyb20gJy4uL3V0aWxzL3Rzcy9lZGRzYSc7XG5pbXBvcnQgeyBnZXRUeFJlcXVlc3RBcGlWZXJzaW9uLCB2YWxpZGF0ZVR4UmVxdWVzdEFwaVZlcnNpb24gfSBmcm9tICcuLi91dGlscy90eFJlcXVlc3QnO1xuaW1wb3J0IHsgYnVpbGRQYXJhbUtleXMsIEJ1aWxkUGFyYW1zIH0gZnJvbSAnLi9CdWlsZFBhcmFtcyc7XG5pbXBvcnQge1xuICBBY2NlbGVyYXRlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBBZGRyZXNzZXNCeUJhbGFuY2VPcHRpb25zLFxuICBBZGRyZXNzZXNPcHRpb25zLFxuICBCdWlsZENvbnNvbGlkYXRpb25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEJ1aWxkVG9rZW5FbmFibGVtZW50T3B0aW9ucyxcbiAgQnVsa0NyZWF0ZVNoYXJlT3B0aW9uLFxuICBCdWxrV2FsbGV0U2hhcmVLZXljaGFpbixcbiAgQnVsa1dhbGxldFNoYXJlT3B0aW9ucyxcbiAgQ2hhbmdlRmVlT3B0aW9ucyxcbiAgQ29uc29saWRhdGVVbnNwZW50c09wdGlvbnMsXG4gIENyZWF0ZUFkZHJlc3NPcHRpb25zLFxuICBDcmVhdGVCdWxrV2FsbGV0U2hhcmVMaXN0UmVzcG9uc2UsXG4gIENyZWF0ZVBvbGljeVJ1bGVPcHRpb25zLFxuICBDcmVhdGVTaGFyZU9wdGlvbnMsXG4gIENyb3NzQ2hhaW5VVFhPLFxuICBEZWNyeXB0ZWRLZXljaGFpbkRhdGEsXG4gIERlcGxveUZvcndhcmRlcnNPcHRpb25zLFxuICBEb3dubG9hZEtleWNhcmRPcHRpb25zLFxuICBGYW5vdXRVbnNwZW50c09wdGlvbnMsXG4gIEZldGNoQ3Jvc3NDaGFpblVUWE9zT3B0aW9ucyxcbiAgRmx1c2hGb3J3YXJkZXJUb2tlbk9wdGlvbnMsXG4gIEZvcndhcmRlckJhbGFuY2UsXG4gIEZvcndhcmRlckJhbGFuY2VPcHRpb25zLFxuICBGcmVlemVPcHRpb25zLFxuICBGdW5kRm9yd2FyZGVyUGFyYW1zLFxuICBGdW5kRm9yd2FyZGVyc09wdGlvbnMsXG4gIEdldEFkZHJlc3NPcHRpb25zLFxuICBHZXRQcnZPcHRpb25zLFxuICBHZXRUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEdldFRyYW5zZmVyT3B0aW9ucyxcbiAgR2V0VXNlclBydk9wdGlvbnMsXG4gIHR5cGUgSVdhbGxldCxcbiAgTWFuYWdlVW5zcGVudFJlc2VydmF0aW9uT3B0aW9ucyxcbiAgTWF4aW11bVNwZW5kYWJsZSxcbiAgTWF4aW11bVNwZW5kYWJsZU9wdGlvbnMsXG4gIE1vZGlmeVdlYmhvb2tPcHRpb25zLFxuICBOZnRCYWxhbmNlLFxuICBQYWdpbmF0aW9uT3B0aW9ucyxcbiAgUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCxcbiAgUmVjb3ZlclRva2VuT3B0aW9ucyxcbiAgUmVtb3ZlUG9saWN5UnVsZU9wdGlvbnMsXG4gIFJlbW92ZVVzZXJPcHRpb25zLFxuICBTZW5kTWFueU9wdGlvbnMsXG4gIFNlbmRORlRPcHRpb25zLFxuICBTZW5kTkZUUmVzdWx0LFxuICBTZW5kT3B0aW9ucyxcbiAgU2hhcmVkS2V5Q2hhaW4sXG4gIFNoYXJlV2FsbGV0T3B0aW9ucyxcbiAgU2lnbkFuZFNlbmRUeFJlcXVlc3RPcHRpb25zLFxuICBTaW11bGF0ZVdlYmhvb2tPcHRpb25zLFxuICBTdWJtaXRUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFN1YldhbGxldFR5cGUsXG4gIFN3ZWVwT3B0aW9ucyxcbiAgVHJhbnNmZXJCeVNlcXVlbmNlSWRPcHRpb25zLFxuICBUcmFuc2ZlckNvbW1lbnRPcHRpb25zLFxuICBUcmFuc2ZlcnNPcHRpb25zLFxuICBVbnNwZW50c09wdGlvbnMsXG4gIFVwZGF0ZUFkZHJlc3NPcHRpb25zLFxuICBVcGRhdGVCdWlsZERlZmF1bHRPcHRpb25zLFxuICBVcGRhdGVXYWxsZXRPcHRpb25zLFxuICBXYWxsZXRDb2luU3BlY2lmaWMsXG4gIFdhbGxldERhdGEsXG4gIFdhbGxldEVjZHNhQ2hhbGxlbmdlcyxcbiAgV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zLFxuICBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBXYWxsZXRTaWduVHlwZWREYXRhT3B0aW9ucyxcbiAgV2FsbGV0VHlwZSxcbiAgQnVpbGRUb2tlbkFwcHJvdmFsUmVzcG9uc2UsXG4gIFdhbGxldEluaXRSZXN1bHQsXG4gIEdldEFjY291bnRSZXNvdXJjZXNPcHRpb25zLFxuICBHZXRBY2NvdW50UmVzb3VyY2VzUmVzcG9uc2UsXG4gIEdldFJlc291cmNlRGVsZWdhdGlvbnNPcHRpb25zLFxuICBHZXRSZXNvdXJjZURlbGVnYXRpb25zUmVzcG9uc2UsXG59IGZyb20gJy4vaVdhbGxldCc7XG5cbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnYml0Z286djI6d2FsbGV0Jyk7XG5cbnR5cGUgTWFuYWdlVW5zcGVudHMgPSAnY29uc29saWRhdGUnIHwgJ2Zhbm91dCc7XG5cbmNvbnN0IHdoaXRlbGlzdGVkU2VuZFBhcmFtcyA9IFR4U2VuZEJvZHkudHlwZS50eXBlcy5mbGF0TWFwKCh0KSA9PiBPYmplY3Qua2V5cyh0LnByb3BzKSk7XG5cbmV4cG9ydCBlbnVtIE1hbmFnZVVuc3BlbnRzT3B0aW9ucyB7XG4gIEJVSUxEX09OTFksXG4gIEJVSUxEX1NJR05fU0VORCxcbn1cblxuZnVuY3Rpb24gaXNQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0KFxuICBwcmVidWlsZFR4OiBzdHJpbmcgfCBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0IHwgdW5kZWZpbmVkXG4pOiBwcmVidWlsZFR4IGlzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQge1xuICBpZiAoIXByZWJ1aWxkVHggfHwgdHlwZW9mIHByZWJ1aWxkVHggPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAocHJlYnVpbGRUeCBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0KS53YWxsZXRJZCAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgV2FsbGV0IGltcGxlbWVudHMgSVdhbGxldCB7XG4gIHB1YmxpYyByZWFkb25seSBiaXRnbzogQml0R29CYXNlO1xuICBwdWJsaWMgcmVhZG9ubHkgYmFzZUNvaW46IElCYXNlQ29pbjtcbiAgcHVibGljIF93YWxsZXQ6IFdhbGxldERhdGE7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHNzVXRpbHM6IEVjZHNhVXRpbHMgfCBFY2RzYU1QQ3YyVXRpbHMgfCBFZGRzYVV0aWxzIHwgRWRkc2FNUEN2MlV0aWxzIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wZXJtaXNzaW9ucz86IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGJhc2VDb2luOiBJQmFzZUNvaW4sIHdhbGxldERhdGE6IGFueSkge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLmJhc2VDb2luID0gYmFzZUNvaW47XG4gICAgdGhpcy5fd2FsbGV0ID0gd2FsbGV0RGF0YTtcbiAgICBjb25zdCB1c2VySWQgPSBfLmdldChiaXRnbywgJ191c2VyLmlkJyk7XG4gICAgaWYgKF8uaXNTdHJpbmcodXNlcklkKSkge1xuICAgICAgY29uc3QgdXNlckRldGFpbHMgPSBfLmZpbmQod2FsbGV0RGF0YS51c2VycywgeyB1c2VyOiB1c2VySWQgfSk7XG4gICAgICB0aGlzLl9wZXJtaXNzaW9ucyA9IF8uZ2V0KHVzZXJEZXRhaWxzLCAncGVybWlzc2lvbnMnKTtcbiAgICB9XG4gICAgaWYgKGJhc2VDb2luPy5zdXBwb3J0c1RzcygpICYmIHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICBzd2l0Y2ggKGJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpKSB7XG4gICAgICAgIGNhc2UgJ2VjZHNhJzpcbiAgICAgICAgICBpZiAod2FsbGV0RGF0YS5tdWx0aXNpZ1R5cGVWZXJzaW9uID09PSAnTVBDdjInKSB7XG4gICAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gbmV3IEVjZHNhTVBDdjJVdGlscyhiaXRnbywgYmFzZUNvaW4sIHRoaXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gbmV3IEVjZHNhVXRpbHMoYml0Z28sIGJhc2VDb2luLCB0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2VkZHNhJzpcbiAgICAgICAgICBpZiAod2FsbGV0RGF0YS5tdWx0aXNpZ1R5cGVWZXJzaW9uID09PSAnTVBDdjInKSB7XG4gICAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gbmV3IEVkZHNhTVBDdjJVdGlscyhiaXRnbywgYmFzZUNvaW4sIHRoaXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gbmV3IEVkZHNhVXRpbHMoYml0Z28sIGJhc2VDb2luLCB0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy50c3NVdGlscyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBVUkwgdXNpbmcgdGhpcyB3YWxsZXQncyBpZCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgQml0R28gQVBJIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIGV4dHJhIEFQSSBzcGVjaWZpYyBzdHJpbmcgdG8gYXBwZW5kIHRvIHRoZSB3YWxsZXQgaWRcbiAgICovXG4gIHVybChleHRyYSA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArIGV4dHJhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhpcyB3YWxsZXQncyBpZFxuICAgKi9cbiAgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyIG9mIGFwcHJvdmFscyByZXF1aXJlZCBmb3Igc3BlbmRpbmcgZnVuZHMgZnJvbSB0aGlzIHdhbGxldFxuICAgKi9cbiAgYXBwcm92YWxzUmVxdWlyZWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmFwcHJvdmFsc1JlcXVpcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqL1xuICBiYWxhbmNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5iYWxhbmNlO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIHVzZSBjb2RlYyBpbnN0ZWFkOiB0LmV4YWN0KEJ1aWxkUGFyYW1zKS5lbmNvZGUodikgKi9cbiAgcHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGJ1aWxkUGFyYW1LZXlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBzdHJpY3Qgc3ViLXNldCBvZiBwcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zXG4gICAqL1xuICBwcmVidWlsZENvbnNvbGlkYXRlQWNjb3VudFBhcmFtcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdjb25zb2xpZGF0ZUFkZHJlc3NlcycsXG4gICAgICAnbmZ0Q29sbGVjdGlvbklkJyxcbiAgICAgICduZnRJZCcsXG4gICAgICAnZmVlUmF0ZScsXG4gICAgICAnbWF4RmVlUmF0ZScsXG4gICAgICAnbWVtbycsXG4gICAgICAndmFsaWRGcm9tQmxvY2snLFxuICAgICAgJ3ZhbGlkVG9CbG9jaycsXG4gICAgICAncHJldmlldycsXG4gICAgICAna2VlcEFsaXZlJyxcbiAgICAgICdhcGlWZXJzaW9uJyxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29uZmlybWVkIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICovXG4gIGNvbmZpcm1lZEJhbGFuY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvbmZpcm1lZEJhbGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzcGVuZGFibGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgc3BlbmRhYmxlQmFsYW5jZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuc3BlbmRhYmxlQmFsYW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBiYWxhbmNlcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gb3ZlcmZsb3cgc3RhbmRhcmQgamF2YXNjcmlwdCBudW1iZXJzXG4gICAqL1xuICBiYWxhbmNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5iYWxhbmNlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29uZmlybWVkIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBiYWxhbmNlcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gb3ZlcmZsb3cgc3RhbmRhcmQgamF2YXNjcmlwdCBudW1iZXJzXG4gICAqL1xuICBjb25maXJtZWRCYWxhbmNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb25maXJtZWRCYWxhbmNlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlbmRhYmxlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBiYWxhbmNlcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gb3ZlcmZsb3cgc3RhbmRhcmQgamF2YXNjcmlwdCBudW1iZXJzXG4gICAqL1xuICBzcGVuZGFibGVCYWxhbmNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5zcGVuZGFibGVCYWxhbmNlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29pbiBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiBjb2luIHRoaXMgd2FsbGV0IGhvbGRzXG4gICAqL1xuICBjb2luKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luO1xuICB9XG5cbiAgdHlwZSgpOiBXYWxsZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LnR5cGUgfHwgJ2hvdCc7XG4gIH1cblxuICBtdWx0aXNpZ1R5cGUoKTogJ29uY2hhaW4nIHwgJ3Rzcycge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlO1xuICB9XG5cbiAgbXVsdGlzaWdUeXBlVmVyc2lvbigpOiAnTVBDdjInIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb247XG4gIH1cblxuICBzdWJUeXBlKCk6IFN1YldhbGxldFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuc3ViVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxhYmVsIChuYW1lKSBmb3IgdGhpcyB3YWxsZXRcbiAgICovXG4gIHB1YmxpYyBsYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQubGFiZWw7XG4gIH1cblxuICBwdWJsaWMgZmxhZ3MoKTogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LndhbGxldEZsYWdzID8/IFtdO1xuICB9XG5cbiAgcHVibGljIGZsYWcobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mbGFncygpLmZpbmQoKGZsYWcpID0+IGZsYWcubmFtZSA9PT0gbmFtZSk/LnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcHVibGljIG9iamVjdCBpZHMgZm9yIHRoZSBrZXljaGFpbnMgb24gdGhpcyB3YWxsZXQuXG4gICAqL1xuICBwdWJsaWMga2V5SWRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmtleXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgcmVjZWl2ZSBhZGRyZXNzIGZvciB0aGlzIHdhbGxldFxuICAgKi9cbiAgcHVibGljIHJlY2VpdmVBZGRyZXNzKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5yZWNlaXZlQWRkcmVzcz8uYWRkcmVzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHdhbGxldCBpZCBvZiB0aGUgd2FsbGV0IHRoYXQgdGhpcyB3YWxsZXQgd2FzIG1pZ3JhdGVkIGZyb20uXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBpZiB0aGlzIGlzIGEgQkNIIHdhbGxldCB0aGF0IHdhcyBjcmVhdGVkIGZyb20gYSBCVEMgd2FsbGV0LFxuICAgKiB0aGUgQkNIIHdhbGxldCBtaWdyYXRlZCBmcm9tIGZpZWxkIHdvdWxkIGhhdmUgdGhlIEJUQyB3YWxsZXQgaWQuXG4gICAqL1xuICBwdWJsaWMgbWlncmF0ZWRGcm9tKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5taWdyYXRlZEZyb207XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB0b2tlbiBmbHVzaCB0aHJlc2hvbGRzIGZvciB0aGlzIHdhbGxldFxuICAgKiBAcmV0dXJuIHsqfE9iamVjdH0gcGFpcnMgb2YgeyBbdG9rZW5OYW1lXTogdGhyZXNob2xkcyB9IGJhc2UgdW5pdHNcbiAgICovXG4gIHRva2VuRmx1c2hUaHJlc2hvbGRzKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLnRva2VuRmx1c2hUaHJlc2hvbGRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3YWxsZXQgcHJvcGVydGllcyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gY2VydGFpbiBjb2luIGltcGxlbWVudGF0aW9uc1xuICAgKi9cbiAgY29pblNwZWNpZmljKCk6IFdhbGxldENvaW5TcGVjaWZpYyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwZW5kaW5nIGFwcHJvdmFscyBvbiB0aGlzIHdhbGxldFxuICAgKi9cbiAgcGVuZGluZ0FwcHJvdmFscygpOiBJUGVuZGluZ0FwcHJvdmFsW10ge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQucGVuZGluZ0FwcHJvdmFscy5tYXAoKGN1cnJlbnRBcHByb3ZhbCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQZW5kaW5nQXBwcm92YWwodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgY3VycmVudEFwcHJvdmFsLCB0aGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoIHRoZSB3YWxsZXQgb2JqZWN0IGJ5IHN5bmNpbmcgd2l0aCB0aGUgYmFjay1lbmRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7V2FsbGV0fVxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaChwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgpKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2FjdGlvbnMocGFyYW1zOiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fTtcblxuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3R4JykpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbGlzdCBvZiBuZnQgdG9rZW5zIGZvciB0aGlzIHdhbGxldC4gV2lsbCBhbHdheXMgcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGUgd2FsbGV0XG4gICAqIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgYWxsVG9rZW5zIGZsYWcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtOZnRCYWxhbmNlW10gfCB1bmRlZmluZWR9XG4gICAqL1xuICBuZnRCYWxhbmNlcygpOiBOZnRCYWxhbmNlW10gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLl93YWxsZXQubmZ0cykge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fd2FsbGV0Lm5mdHMpLm1hcCgobmZ0RGF0YSkgPT4gbmZ0RGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbGlzdCBvZiB1bnN1cHBvcnRlZCBuZnQgdG9rZW5zIGZvciB0aGlzIHdhbGxldC4gV2lsbCBhbHdheXMgcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGUgd2FsbGV0XG4gICAqIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgYWxsVG9rZW5zIGZsYWcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtOZnRCYWxhbmNlW10gfCB1bmRlZmluZWR9XG4gICAqL1xuICB1bnN1cHBvcnRlZE5mdEJhbGFuY2VzKCk6IE5mdEJhbGFuY2VbXSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuX3dhbGxldC51bnN1cHBvcnRlZE5mdHMpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX3dhbGxldC51bnN1cHBvcnRlZE5mdHMpLm1hcCgobmZ0RGF0YSkgPT4gbmZ0RGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIHdhbGxldHMgbmZ0ICYgdW5zdXBwb3J0ZWQgbmZ0cy5cbiAgICpcbiAgICogQHJldHVybnMge05mdEJhbGFuY2VbXX1cbiAgICovXG4gIGFzeW5jIGdldE5mdEJhbGFuY2VzKCk6IFByb21pc2U8TmZ0QmFsYW5jZVtdPiB7XG4gICAgY29uc3Qgd2FsbGV0RGF0YTogUGFydGlhbDxXYWxsZXREYXRhPiA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCkpLnF1ZXJ5KHsgYWxsVG9rZW5zOiB0cnVlIH0pLnJlc3VsdCgpO1xuXG4gICAgY29uc3Qgc3VwcG9ydGVkTmZ0cyA9IHdhbGxldERhdGE/Lm5mdHMgPyBPYmplY3QudmFsdWVzKHdhbGxldERhdGEubmZ0cykubWFwKChiYWxhbmNlKSA9PiBiYWxhbmNlKSA6IFtdO1xuXG4gICAgY29uc3QgdW5zdXBwb3J0ZWROZnRzID0gd2FsbGV0RGF0YT8udW5zdXBwb3J0ZWROZnRzXG4gICAgICA/IE9iamVjdC52YWx1ZXMod2FsbGV0RGF0YS51bnN1cHBvcnRlZE5mdHMpLm1hcCgoYmFsYW5jZSkgPT4gYmFsYW5jZSlcbiAgICAgIDogW107XG4gICAgcmV0dXJuIFsuLi5zdXBwb3J0ZWROZnRzLCAuLi51bnN1cHBvcnRlZE5mdHNdO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgLSB0eEhhc2ggdGhlIHRyYW5zYWN0aW9uIGhhc2ggdG8gc2VhcmNoIGZvclxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdldFRyYW5zYWN0aW9uKHBhcmFtczogR2V0VHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndHhIYXNoJ10sIFtdKTtcblxuICAgIGNvbnN0IHBhZ2luYXRlZE9wdGlvbnM6IFBhZ2luYXRpb25PcHRpb25zID0ge307XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcGFnaW5hdGVkT3B0aW9ucy5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMubGltaXQpKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5saW1pdCkgfHwgcGFyYW1zLmxpbWl0IDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICB9XG4gICAgICBwYWdpbmF0ZWRPcHRpb25zLmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5ID0gcGFnaW5hdGVkT3B0aW9ucztcbiAgICBpZiAocGFyYW1zLmluY2x1ZGVSYmYpIHtcbiAgICAgIHF1ZXJ5WydpbmNsdWRlUmJmJ10gPSBwYXJhbXMuaW5jbHVkZVJiZjtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLnVybCgnL3R4LycgKyBwYXJhbXMudHhIYXNoKSlcbiAgICAgIC5xdWVyeShxdWVyeSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB0cmFuc2ZlcnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2ZlcnMocGFyYW1zOiBUcmFuc2ZlcnNPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBUcmFuc2ZlcnNPcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hbGxUb2tlbnMpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmFsbFRva2VucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFsbFRva2VucyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmFsbFRva2VucyA9IHBhcmFtcy5hbGxUb2tlbnM7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zZWFyY2hMYWJlbCkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5zZWFyY2hMYWJlbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNlYXJjaExhYmVsIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zZWFyY2hMYWJlbCA9IHBhcmFtcy5zZWFyY2hMYWJlbDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIGlmICghXy5pc0FycmF5KHBhcmFtcy5hZGRyZXNzKSAmJiAhXy5pc1N0cmluZyhwYXJhbXMuYWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFkZHJlc3MgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcgb3IgYXJyYXknKTtcbiAgICAgIH1cbiAgICAgIGlmIChfLmlzQXJyYXkocGFyYW1zLmFkZHJlc3MpKSB7XG4gICAgICAgIHBhcmFtcy5hZGRyZXNzLmZvckVhY2goKGFkZHJlc3MpID0+IHtcbiAgICAgICAgICBpZiAoIV8uaXNTdHJpbmcoYWRkcmVzcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhZGRyZXNzIGFyZ3VtZW50LCBleHBlY3RpbmcgYXJyYXkgb2YgYWRkcmVzcyBzdHJpbmdzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmFkZHJlc3MgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmRhdGVHdGUpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuZGF0ZUd0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRhdGVHdGUgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmRhdGVHdGUgPSBwYXJhbXMuZGF0ZUd0ZTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmRhdGVMdCkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5kYXRlTHQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkYXRlTHQgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmRhdGVMdCA9IHBhcmFtcy5kYXRlTHQ7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy52YWx1ZUd0ZSkpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMudmFsdWVHdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB2YWx1ZUd0ZSBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkudmFsdWVHdGUgPSBwYXJhbXMudmFsdWVHdGU7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy52YWx1ZUx0KSkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy52YWx1ZUx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdmFsdWVMdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkudmFsdWVMdCA9IHBhcmFtcy52YWx1ZUx0O1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZUhleCkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluY2x1ZGVIZXgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlSGV4IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZUhleCA9IHBhcmFtcy5pbmNsdWRlSGV4O1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuc3RhdGUpKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLnN0YXRlKSAmJiAhXy5pc1N0cmluZyhwYXJhbXMuc3RhdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzdGF0ZSBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZyBvciBhcnJheScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMuc3RhdGUpKSB7XG4gICAgICAgIHBhcmFtcy5zdGF0ZS5mb3JFYWNoKChzdGF0ZSkgPT4ge1xuICAgICAgICAgIGlmICghXy5pc1N0cmluZyhzdGF0ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzdGF0ZSBhcmd1bWVudCwgZXhwZWN0aW5nIGFycmF5IG9mIHN0YXRlIHN0cmluZ3MnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcXVlcnkuc3RhdGUgPSBwYXJhbXMuc3RhdGU7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy50eXBlKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy50eXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdHlwZSBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkudHlwZSA9IHBhcmFtcy50eXBlO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuZGVjb3JhdGVVdHhvU3BlY2lmaWNGaWVsZHMpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5kZWNvcmF0ZVV0eG9TcGVjaWZpY0ZpZWxkcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY2x1ZGVIZXggYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5kZWNvcmF0ZVV0eG9TcGVjaWZpY0ZpZWxkcyA9IHBhcmFtcy5kZWNvcmF0ZVV0eG9TcGVjaWZpY0ZpZWxkcztcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2ZlcicpKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYW5zZmVycyBvbiB0aGlzIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXRUcmFuc2ZlcihwYXJhbXM6IEdldFRyYW5zZmVyT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2Zlci8nICsgcGFyYW1zLmlkKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdHJhbnNhY3Rpb24gYnkgc2VxdWVuY2UgaWQgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyQnlTZXF1ZW5jZUlkKHBhcmFtczogVHJhbnNmZXJCeVNlcXVlbmNlSWRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnc2VxdWVuY2VJZCddLCBbXSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdHJhbnNmZXIvc2VxdWVuY2VJZC8nICsgcGFyYW1zLnNlcXVlbmNlSWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1heGltdW0gYW1vdW50IHlvdSBjYW4gc3BlbmQgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGltaXQgLSBtYXhpbXVtIG51bWJlciBvZiBzZWxlY3RhYmxlIHVuc3BlbnRzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSB0aGUgbWluaW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkhlaWdodCAtIHRoZSBtaW5pbXVtIGhlaWdodCBvZiB1bnNwZW50cyBvbiB0aGUgYmxvY2sgY2hhaW4gdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIEVuZm9yY2VzIG1pbkNvbmZpcm1zIG9uIGNoYW5nZSBpbnB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gZmVlIHJhdGUgdG8gdXNlIGluIGNhbGN1bGF0aW9uIG9mIG1heGltdW0gc3BlbmRhYmxlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMucmVjaXBpZW50QWRkcmVzcyAtIHJlY2lwaWVudCBhZGRyZXNzZXMgZm9yIGEgbW9yZSBhY2N1cmF0ZSBjYWxjdWxhdGlvbiBvZiB0aGUgbWF4aW11bSBhdmFpbGFibGUgdG8gc2VuZFxuICAgKiBAcmV0dXJucyB7e21heGltdW1TcGVuZGFibGU6IE51bWJlciwgY29pbjogU3RyaW5nfX1cbiAgICogTk9URSA6IGZlZVR4Q29uZmlybVRhcmdldCBvbWl0dGVkIG9uIHB1cnBvc2UgYmVjYXVzZSBnYXVnaW5nIHRoZSBtYXhpbXVtIHNwZW5kYWJsZSBhbW91bnQgd2l0aCBkeW5hbWljIGZlZXMgZG9lcyBub3QgbWFrZSBzZW5zZVxuICAgKi9cbiAgYXN5bmMgbWF4aW11bVNwZW5kYWJsZShwYXJhbXM6IE1heGltdW1TcGVuZGFibGVPcHRpb25zID0ge30pOiBQcm9taXNlPE1heGltdW1TcGVuZGFibGU+IHtcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ2xpbWl0JyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ3BsYWluVGFyZ2V0JyxcbiAgICAgICdyZWNpcGllbnRBZGRyZXNzJyxcbiAgICAgICd0YXJnZXQnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvbWF4aW11bVNwZW5kYWJsZScpKS5xdWVyeShmaWx0ZXJlZFBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdW5zcGVudHMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB1bnNwZW50cyhwYXJhbXM6IFVuc3BlbnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeSA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdjaGFpbnMnLFxuICAgICAgJ2xpbWl0JyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ3ByZXZJZCcsXG4gICAgICAnc2Vnd2l0JyxcbiAgICAgICd0YXJnZXQnLFxuICAgICAgJ3Vuc3BlbnRJZHMnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdW5zcGVudHMnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlIG9yIGZhbm91dCB1bnNwZW50cyBvbiBhIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcm91dGVOYW1lIC0gZWl0aGVyIGBjb25zb2xpZGF0ZWAgb3IgYGZhbm91dGBcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqXG4gICAqIFdhbGxldCBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB0aGUgdXNlcnMgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy54cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtIGlmIHRoZSB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbiAgICpcbiAgICogRmVlIHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBmZWUgcmF0ZSB0byB1c2UgZm9yIHRoZSBjb25zb2xpZGF0aW9uIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUGVyY2VudGFnZSAtIHRoZSBtYXhpbXVtIHJlbGF0aXZlIHBvcnRpb24gdGhhdCB5b3UncmUgd2lsbGluZyB0byBzcGVuZCB0b3dhcmRzIGZlZXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQgLSBlc3RpbWF0ZSB0aGUgZmVlcyB0byBhaW0gZm9yIGZpcnN0IGNvbmZpcm1hdGlvbiB3aXRoIHRoaXMgbnVtYmVyIG9mIGJsb2Nrc1xuICAgKlxuICAgKiBJbnB1dCBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBpZiB0cnVlLCBtaW5Db25maXJtcyBhbHNvIGFwcGxpZXMgdG8gY2hhbmdlIG91dHB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5saW1pdCAgICAgICAgICAgICAgICBmb3Igcm91dGVOYW1lID09PSAnY29uc29saWRhdGUnXG4gICAqICAgICAgICAgICAgICAgICBwYXJhbXMubWF4TnVtSW5wdXRzVG9Vc2UgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2Zhbm91dCdcbiAgICogICAgICAgICAgICAgICAgICAtIG1heGltdW0gbnVtYmVyIG9mIHVuc3BlbnRzIHlvdSB3YW50IHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogT3V0cHV0IHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmJ1bGsgLSBpZiBzZXQgdG8gVHJ1ZSwgdGhpcyBlbmFibGVzIHRoZSBjb25zb2xpZGF0aW9uIG9mIGxhcmdlIG51bWJlciBvZiB1bnNwZW50cyBieSBjcmVhdGluZyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGVhY2ggdHJhbnNhY3Rpb24gY29tcG9zZWQgb2YgMjAwIHVuc3BlbnRzLCBleGNlcHQgZm9yIHRoZSBsYXN0IHRyYW5zYWN0aW9uIHdoaWNoIG1heSBoYXZlIGZld2VyIHVuc3BlbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtYW5hZ2VVbnNwZW50cyhcbiAgICByb3V0ZU5hbWU6IE1hbmFnZVVuc3BlbnRzLFxuICAgIHBhcmFtczogQ29uc29saWRhdGVVbnNwZW50c09wdGlvbnMgfCBGYW5vdXRVbnNwZW50c09wdGlvbnMgPSB7fSxcbiAgICBvcHRpb24gPSBNYW5hZ2VVbnNwZW50c09wdGlvbnMuQlVJTERfU0lHTl9TRU5EXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGlmICh0aGlzLl93YWxsZXQudHlwZSA9PT0gJ2N1c3RvZGlhbCcgJiYgcm91dGVOYW1lID09PSAnY29uc29saWRhdGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbml0aWF0ZVRyYW5zYWN0aW9uKHsgLi4ucGFyYW1zLCB0eXBlOiAnY29uc29saWRhdGUnIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fd2FsbGV0LnR5cGUgPT09ICdjdXN0b2RpYWwnICYmIHJvdXRlTmFtZSA9PT0gJ2Zhbm91dCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmluaXRpYXRlVHJhbnNhY3Rpb24oeyAuLi5wYXJhbXMsIHR5cGU6ICdmYW5vdXQnIH0pO1xuICAgIH1cblxuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydiddKTtcblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBjb25zdCBmYW5vdXRJbnB1dEZvcm1hdCA9IHBhcmFtcy5tYXhOdW1JbnB1dHNUb1VzZSA/ICdtYXhOdW1JbnB1dHNUb1VzZScgOiAndW5zcGVudHMnO1xuICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgW1xuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ21heEZlZVBlcmNlbnRhZ2UnLFxuICAgICAgJ2ZlZVR4Q29uZmlybVRhcmdldCcsXG5cbiAgICAgICdtaW5WYWx1ZScsXG4gICAgICAnbWF4VmFsdWUnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ2VuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZScsXG4gICAgICAndGFyZ2V0QWRkcmVzcycsXG4gICAgICAndHhGb3JtYXQnLFxuICAgICAgJ2J1bGsnLFxuXG4gICAgICByb3V0ZU5hbWUgPT09ICdjb25zb2xpZGF0ZScgPyAnbGltaXQnIDogZmFub3V0SW5wdXRGb3JtYXQsXG4gICAgICAnbnVtVW5zcGVudHNUb01ha2UnLFxuICAgIF0pO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBjb25zdCBidWlsZFJlc3BvbnNlOiBUcmFuc2FjdGlvblByZWJ1aWxkIHwgVHJhbnNhY3Rpb25QcmVidWlsZFtdID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy51cmwoYC8ke3JvdXRlTmFtZX1VbnNwZW50c2ApKVxuICAgICAgLnNlbmQoZmlsdGVyZWRQYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG5cbiAgICBpZiAob3B0aW9uID09PSBNYW5hZ2VVbnNwZW50c09wdGlvbnMuQlVJTERfT05MWSkge1xuICAgICAgcmV0dXJuIGJ1aWxkUmVzcG9uc2U7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gKGF3YWl0IHRoaXMuYmFzZUNvaW5cbiAgICAgIC5rZXljaGFpbnMoKVxuICAgICAgLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZCB9KSkgYXMgdW5rbm93biBhcyBLZXljaGFpbltdO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgcGxhdGZvcm0tYnVpbHQgdHJhbnNhY3Rpb24gbWF0Y2hlcyB1c2VyIHBhcmFtZXRlcnNcbiAgICBjb25zdCB0eFByZWJ1aWxkcyA9IEFycmF5LmlzQXJyYXkoYnVpbGRSZXNwb25zZSkgPyBidWlsZFJlc3BvbnNlIDogW2J1aWxkUmVzcG9uc2VdO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdHhQcmVidWlsZHMubWFwKCh0eFByZWJ1aWxkKSA9PlxuICAgICAgICB0aGlzLmJhc2VDb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtczogcGFyYW1zLFxuICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgICAgIHZlcmlmaWNhdGlvbjoge1xuICAgICAgICAgICAgLi4uKHBhcmFtcy52ZXJpZmljYXRpb24gPz8ge30pLFxuICAgICAgICAgICAga2V5Y2hhaW5zOiB7XG4gICAgICAgICAgICAgIHVzZXI6IGtleWNoYWluc1swXSxcbiAgICAgICAgICAgICAgYmFja3VwOiBrZXljaGFpbnNbMV0sXG4gICAgICAgICAgICAgIGJpdGdvOiBrZXljaGFpbnNbMl0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxSWQsXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uUGFyYW1zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIHB1YnM6IGtleWNoYWlucy5tYXAoKGspID0+IHtcbiAgICAgICAgYXNzZXJ0KGsucHViKTtcbiAgICAgICAgcmV0dXJuIGsucHViO1xuICAgICAgfSksXG4gICAgICAvLyBCdWlsZGluZyBQU0JUcyB3aXRoIHRoZSBidWxrIGZsYWcgZG9lcyBub3QgaW5jbHVkZSB0aGUgcHJldmlvdXMgdHJhbnNhY3Rpb24gZm9yIG5vbi1zZWd3aXQgaW5wdXRzLlxuICAgICAgLy8gTWFudWFsbHkgb3ZlcnJpZGUgdGhlIHNpZ25pbmcgYW5kIHZhbGlkYXRpbmcgdG8gbm90IGZhaWwuXG4gICAgICBhbGxvd05vblNlZ3dpdFNpZ25pbmdXaXRob3V0UHJldlR4OiAhIXBhcmFtcy5idWxrLFxuICAgIH07XG5cbiAgICBjb25zdCBzZWxlY3RQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ2NvbW1lbnQnLCAnb3RwJywgJ2J1bGsnXSk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdHhQcmVidWlsZHMubWFwKGFzeW5jICh0eFByZWJ1aWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIC4uLnRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBmaW5hbFR4UGFyYW1zID0gXy5leHRlbmQoe30sIHNpZ25lZFRyYW5zYWN0aW9uLCBzZWxlY3RQYXJhbXMsIHtcbiAgICAgICAgICB0eXBlOiByb3V0ZU5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24oZmluYWxUeFBhcmFtcywgcmVxSWQpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYnVpbGRSZXNwb25zZSkgPyByZXNwb25zZSA6IHJlc3BvbnNlWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmFnZSB0aGUgdW5zcGVudCByZXNlcnZhdGlvbnMgb24gdGhlIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zLmNyZWF0ZSAtIGNyZWF0ZSBhIG5ldyByZXNlcnZhdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zLm1vZGlmeSAtIG1vZGlmeSBhbiBleGlzdGluZyByZXNlcnZhdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zLmRlbGV0ZSAtIGRlbGV0ZSBhbiBleGlzdGluZyByZXNlcnZhdGlvblxuICAgKi9cbiAgYXN5bmMgbWFuYWdlVW5zcGVudFJlc2VydmF0aW9ucyhwYXJhbXM6IE1hbmFnZVVuc3BlbnRSZXNlcnZhdGlvbk9wdGlvbnMpOiBQcm9taXNlPHtcbiAgICB1bnNwZW50czoge1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIHdhbGxldElkOiBzdHJpbmc7XG4gICAgICBleHBpcmVUaW1lOiBzdHJpbmc7XG4gICAgICB1c2VySWQ/OiBzdHJpbmc7XG4gICAgfVtdO1xuICB9PiB7XG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ2NyZWF0ZScsICdtb2RpZnknLCAnZGVsZXRlJ10pO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihuZXcgUmVxdWVzdFRyYWNlcigpKTtcbiAgICAvLyBUaGUgVVJMIGNhbm5vdCBjb250YWluIHRoZSBjb2luTmFtZSwgc28gd2UgcmVtb3ZlIGl0IGZyb20gdGhlIFVSTFxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKGAvcmVzZXJ2ZWR1bnNwZW50c2ApLnJlcGxhY2UoYC8ke3RoaXMuYmFzZUNvaW4uZ2V0Q2hhaW4oKX1gLCAnJyk7XG4gICAgaWYgKGZpbHRlcmVkUGFyYW1zLmNyZWF0ZSkge1xuICAgICAgY29uc3QgZmlsdGVyZWRDcmVhdGVQYXJhbXMgPSBfLnBpY2socGFyYW1zLmNyZWF0ZSwgWyd1bnNwZW50SWRzJywgJ2V4cGlyZVRpbWUnXSk7XG4gICAgICByZXR1cm4gdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChmaWx0ZXJlZENyZWF0ZVBhcmFtcykucmVzdWx0KCk7XG4gICAgfSBlbHNlIGlmIChmaWx0ZXJlZFBhcmFtcy5tb2RpZnkpIHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkTW9kaWZ5UGFyYW1zID0gXy5waWNrKHBhcmFtcy5tb2RpZnksIFsndW5zcGVudElkcycsICdjaGFuZ2VzJ10pO1xuICAgICAgcmV0dXJuIHRoaXMuYml0Z28ucHV0KHVybCkuc2VuZChmaWx0ZXJlZE1vZGlmeVBhcmFtcykucmVzdWx0KCk7XG4gICAgfSBlbHNlIGlmIChmaWx0ZXJlZFBhcmFtcy5kZWxldGUpIHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkRGVsZXRlUGFyYW1zID0gXy5waWNrKHBhcmFtcy5kZWxldGUsIFsnaWQnXSk7XG4gICAgICByZXR1cm4gdGhpcy5iaXRnby5kZWwodXJsKS5xdWVyeShmaWx0ZXJlZERlbGV0ZVBhcmFtcykucmVzdWx0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGlkIG5vdCBkZXRlY3QgYSBjcmVhdGlvbiwgbW9kaWZpY2F0aW9uLCBvciBkZWxldGlvbiByZXF1ZXN0LicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zb2xpZGF0ZSB1bnNwZW50cyBvbiBhIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHVzZXJzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMueHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSBpZiB0aGUgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBmZWUgcmF0ZSB0byB1c2UgZm9yIHRoZSBjb25zb2xpZGF0aW9uIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUGVyY2VudGFnZSAtIHRoZSBtYXhpbXVtIHJlbGF0aXZlIHBvcnRpb24gdGhhdCB5b3UncmUgd2lsbGluZyB0byBzcGVuZCB0b3dhcmRzIGZlZXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQgLSBlc3RpbWF0ZSB0aGUgZmVlcyB0byBhaW0gZm9yIGZpcnN0IGNvbmZpcm1hdGlvbiB3aXRoIHRoaXMgbnVtYmVyIG9mIGJsb2Nrc1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBpZiB0cnVlLCBtaW5Db25maXJtcyBhbHNvIGFwcGxpZXMgdG8gY2hhbmdlIG91dHB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5saW1pdCAgICAgICAgICAgICAgICBmb3Igcm91dGVOYW1lID09PSAnY29uc29saWRhdGUnXG4gICAqICAgICAgICAgICAgICAgICBwYXJhbXMubWF4TnVtSW5wdXRzVG9Vc2UgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2Zhbm91dCdcbiAgICogICAgICAgICAgICAgICAgICAtIG1heGltdW0gbnVtYmVyIG9mIHVuc3BlbnRzIHlvdSB3YW50IHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5udW1VbnNwZW50c1RvTWFrZSAtIHRoZSBudW1iZXIgb2YgbmV3IHVuc3BlbnRzIHRvIG1ha2UuIEl0IGlzIG5vdCBhcHBsaWNhYmxlIGZvciBpZiBidWxrIGNvbnNvbGlkYXRlLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5idWxrIC0gaWYgc2V0IHRvIFRydWUsIHRoaXMgZW5hYmxlcyB0aGUgY29uc29saWRhdGlvbiBvZiBsYXJnZSBudW1iZXIgb2YgdW5zcGVudHMgYnkgY3JlYXRpbmcgbXVsdGlwbGUgdHJhbnNhY3Rpb25zLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBlYWNoIHRyYW5zYWN0aW9uIGNvbXBvc2VkIG9mIDIwMCB1bnNwZW50cywgZXhjZXB0IGZvciB0aGUgbGFzdCB0cmFuc2FjdGlvbiB3aGljaCBtYXkgaGF2ZSBmZXdlciB1bnNwZW50cy5cbiAgICovXG4gIGFzeW5jIGNvbnNvbGlkYXRlVW5zcGVudHMoXG4gICAgcGFyYW1zOiBDb25zb2xpZGF0ZVVuc3BlbnRzT3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbiA9IE1hbmFnZVVuc3BlbnRzT3B0aW9ucy5CVUlMRF9TSUdOX1NFTkRcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlVW5zcGVudHMoJ2NvbnNvbGlkYXRlJywgcGFyYW1zLCBvcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhbm91dCB1bnNwZW50cyBvbiBhIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHVzZXJzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMueHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSBpZiB0aGUgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSB0aGUgbWluaW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkhlaWdodCAtIHRoZSBtaW5pbXVtIGhlaWdodCBvZiB1bnNwZW50cyBvbiB0aGUgYmxvY2sgY2hhaW4gdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUGVyY2VudGFnZSAtIHRoZSBtYXhpbXVtIHByb3BvcnRpb24gb2YgYW4gdW5zcGVudCB5b3UgYXJlIHdpbGxpbmcgdG8gbG9zZSB0byBmZWVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IC0gZXN0aW1hdGUgdGhlIGZlZXMgdG8gYWltIGZvciBmaXJzdCBjb25maXJtYXRpb24gd2l0aCB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gVGhlIGRlc2lyZWQgZmVlIHJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSBUaGUgbWF4IGxpbWl0IGZvciBhIGZlZSByYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4TnVtSW5wdXRzVG9Vc2UgLSB0aGUgbnVtYmVyIG9mIHVuc3BlbnRzIHlvdSB3YW50IHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5udW1VbnNwZW50c1RvTWFrZSAtIHRoZSBudW1iZXIgb2YgbmV3IHVuc3BlbnRzIHRvIG1ha2VcbiAgICpcbiAgICogQHBhcmFtIHtNYW5hZ2VVbnNwZW50c09wdGlvbnN9IG9wdGlvbiAtIGZsYWcgdG8gdG9nZ2xlIGJ1aWxkIGFuZCBzZW5kIG9yIGJ1aWxkIG9ubHlcbiAgICovXG4gIGFzeW5jIGZhbm91dFVuc3BlbnRzKFxuICAgIHBhcmFtczogRmFub3V0VW5zcGVudHNPcHRpb25zID0ge30sXG4gICAgb3B0aW9uID0gTWFuYWdlVW5zcGVudHNPcHRpb25zLkJVSUxEX1NJR05fU0VORFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5tYW5hZ2VVbnNwZW50cygnZmFub3V0JywgcGFyYW1zLCBvcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdG9rZW4gZmx1c2ggdGhyZXNob2xkcyBmb3IgdGhlIHdhbGxldC4gVXBkYXRlcyB0aGUgd2FsbGV0LlxuICAgKiBUb2tlbnMgd2lsbCBvbmx5IGJlIGZsdXNoZWQgZnJvbSBmb3J3YXJkZXIgY29udHJhY3RzIGlmIHRoZSBiYWxhbmNlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdGhyZXNob2xkIGRlZmluZWQgaGVyZS5cbiAgICogQHBhcmFtIHRocmVzaG9sZHMge09iamVjdH0gLSBwYWlycyBvZiB7IFt0b2tlbk5hbWVdOiB0aHJlc2hvbGQgfSAoYmFzZSB1bml0cylcbiAgICovXG4gIGFzeW5jIHVwZGF0ZVRva2VuRmx1c2hUaHJlc2hvbGRzKHRocmVzaG9sZHM6IGFueSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ2V0aCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucHV0KHRoaXMudXJsKCkpXG4gICAgICAuc2VuZCh7XG4gICAgICAgIHRva2VuRmx1c2hUaHJlc2hvbGRzOiB0aHJlc2hvbGRzLFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuICAvKipcbiAgICAgICogVXBkYXRlcyB0aGUgd2FsbGV0LiBTZXRzIGZsYWdzIGZvciBkZXBsb3lGb3J3YXJkZXJzTWFudWFsbHkgYW5kIGZsdXNoRm9yd2FyZGVyc01hbnVhbGx5IG9mIHRoZSB3YWxsZXQuXG4gICAgICAqIEBwYXJhbSBmb3J3YXJkZXJGbGFncyB7T2JqZWN0fSAtIHtcbiAgICAgICAgXCJjb2luU3BlY2lmaWNcIjoge1xuICAgICAgICAgIFtjb2luTmFtZV06IHtcbiAgICAgICAgICAgIFwiZGVwbG95Rm9yd2FyZGVyc01hbnVhbGx5XCI6IHtCb29sZWFufSxcbiAgICAgICAgICAgIFwiZmx1c2hGb3J3YXJkZXJzTWFudWFsbHlcIjoge0Jvb2xlYW59XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAqL1xuICBhc3luYyB1cGRhdGVGb3J3YXJkZXJzKGZvcndhcmRlckZsYWdzOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucHV0KHRoaXMudXJsKCkpLnNlbmQoZm9yd2FyZGVyRmxhZ3MpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIG1hbnVhbGx5IGRlcGxveSBhbiBFVEggYWRkcmVzc1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuYWRkcmVzc10gLSBhZGRyZXNzSWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuaWRdIC0gYWRkcmVzc0lkIGNvdWxkIGJlIHJlY2VpdmVkIGFsc28gYXMgaWRcbiAgICogQHJldHVybnMge09iamVjdH0gSHR0cCByZXNwb25zZVxuICAgKi9cbiAgYXN5bmMgZGVwbG95Rm9yd2FyZGVycyhwYXJhbXM6IERlcGxveUZvcndhcmRlcnNPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYWRkcmVzcykgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkZHJlc3Mgb3IgaWQgb2YgYWRkcmVzcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBsZXQgcXVlcnk7XG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzKSB7XG4gICAgICBxdWVyeSA9IHBhcmFtcy5hZGRyZXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeSA9IHBhcmFtcy5pZDtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoYC9hZGRyZXNzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX0vZGVwbG95bWVudGApO1xuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIG1hbnVhbGx5IGZvcndhcmQgdG9rZW5zIGZyb20gYW4gRVRIIG9yIENFTE8gYWRkcmVzc1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50b2tlbk5hbWUgLSBOYW1lIG9mIHRva2VuIHRoYXQgbmVlZHMgdG8gYmUgZm9yd2FyZGVkIGZyb20gdGhlIGFkZHJlc3NcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuYWRkcmVzc10gLVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5hZGRyZXNzXSAtIGFkZHJlc3NJZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5pZF0gLSBhZGRyZXNzSWQgY291bGQgYmUgcmVjZWl2ZWQgYWxzbyBhcyBpZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5nYXNQcmljZV0gLSBFeHBsaWNpdCBnYXMgcHJpY2UgdG8gdXNlIHdoZW4gZm9yd2FyZGluZyB0b2tlbiBmcm9tIHRoZSBmb3J3YXJkZXIgY29udHJhY3QgKEVUSCBhbmQgQ2VsbyBvbmx5KS4gSWYgbm90IGdpdmVuLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBlc3RpbWF0ZWQgbmV0d29yayBnYXMgcHJpY2UuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmVpcDE1NTldIC0gU3BlY2lmeSBlaXAxNTU5IGZlZSBwYXJhbWV0ZXJzIGluIHRva2VuIGZvcndhcmRpbmcgdHJhbnNhY3Rpb24uXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEh0dHAgcmVzcG9uc2VcbiAgICovXG4gIGFzeW5jIGZsdXNoRm9yd2FyZGVyVG9rZW4ocGFyYW1zOiBGbHVzaEZvcndhcmRlclRva2VuT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmFkZHJlc3MpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhZGRyZXNzIG9yIGlkIG9mIGFkZHJlc3MgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuaWQ7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKGAvYWRkcmVzcy8ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9L3Rva2VuZm9yd2FyZGApO1xuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFN3ZWVwIGZ1bmRzIGZvciBhIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5hZGRyZXNzIC0gVGhlIGFkZHJlc3MgdG8gc2VuZCBhbGwgdGhlIGZ1bmRzIGluIHRoZSB3YWxsZXQgdG9cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHVzZXJzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMueHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSBpZiB0aGUgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMub3RwIC0gVHdvIGZhY3RvciBhdXRoIGNvZGUgdG8gZW5hYmxlIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IC0gRXN0aW1hdGUgdGhlIGZlZXMgdG8gYWltIGZvciBmaXJzdCBjb25maXJtYXRpb24gd2l0aGluIHRoaXMgbnVtYmVyIG9mIGJsb2Nrc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBUaGUgZGVzaXJlZCBmZWUgcmF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcGFyYW1zLm1heEZlZVJhdGVdIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtCb29sZWFufSBbcGFyYW1zLmFsbG93UGFydGlhbFN3ZWVwXSAtIGFsbG93cyBzd2VlcGluZyAyMDAgdW5zcGVudHMgd2hlbiB0aGUgd2FsbGV0IGhhcyBtb3JlIHRoYW4gdGhhdFxuICAgKiBAcmV0dXJucyB0eEhleCB7U3RyaW5nfSB0aGUgdHhIZXggb2YgdGhlIHNpZ25lZCB0cmFuc2FjdGlvblxuICAgKi9cbiAgYXN5bmMgc3dlZXAocGFyYW1zOiBTd2VlcE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydicsICdvdHAnXSk7XG5cbiAgICAvLyBUaGUgc3dlZXAgQVBJIGVuZHBvaW50IGlzIG9ubHkgYXZhaWxhYmxlIHRvIHV0eG8tYmFzZWQgY29pbnNcblxuICAgIGlmICghdGhpcy5iYXNlQ29pbi5zd2VlcFdpdGhTZW5kTWFueSgpKSB7XG4gICAgICBpZiAodGhpcy5jb25maXJtZWRCYWxhbmNlU3RyaW5nKCkgIT09IHRoaXMuYmFsYW5jZVN0cmluZygpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnY2Fubm90IHN3ZWVwIHdoZW4gdW5jb25maXJtZWQgZnVuZHMgZXhpc3Qgb24gdGhlIHdhbGxldCwgcGxlYXNlIHdhaXQgdW50aWwgYWxsIGluYm91bmQgdHJhbnNhY3Rpb25zIGNvbmZpcm0nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvbWF4aW11bVNwZW5kYWJsZScpKS5yZXN1bHQoKTtcbiAgICAgIGNvbnN0IG1heGltdW1TcGVuZGFibGUgPSBuZXcgQmlnTnVtYmVyKHZhbHVlLm1heGltdW1TcGVuZGFibGUpO1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgbWF4aW11bVNwZW5kYWJsZS5pc1plcm8oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGZ1bmRzIHRvIHN3ZWVwJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlbmRNYW55UGFyYW1zOiBTZW5kTWFueU9wdGlvbnMgPSB7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHBhcmFtcy5hZGRyZXNzIHx8ICcnLCAvLyBFbnN1cmUgYWRkcmVzcyBpcyBhbHdheXMgYSBzdHJpbmdcbiAgICAgICAgICAgIGFtb3VudDogbWF4aW11bVNwZW5kYWJsZS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gdGhpcy5zZW5kTWFueShzZW5kTWFueVBhcmFtcyk7XG4gICAgfVxuICAgIC8vIHRoZSBmb2xsb3dpbmcgZmxvdyB3b3JrcyBmb3IgYWxsIFVUWE8gY29pbnNcblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdhZGRyZXNzJyxcbiAgICAgICdmZWVSYXRlJyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdmZWVUeENvbmZpcm1UYXJnZXQnLFxuICAgICAgJ2FsbG93UGFydGlhbFN3ZWVwJyxcbiAgICAgICd0eEZvcm1hdCcsXG4gICAgXSk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3N3ZWVwV2FsbGV0JykpLnNlbmQoZmlsdGVyZWRQYXJhbXMpLnJlc3VsdCgpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5leHBsYWluVHJhbnNhY3Rpb24ocmVzcG9uc2UpO1xuICAgIGlmICh0cmFuc2FjdGlvbj8ub3V0cHV0cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGludmFsaWRPdXRwdXRBZGRyZXNzID0gdHJhbnNhY3Rpb24ub3V0cHV0cy5maW5kKChvdXRwdXQpID0+IG91dHB1dC5hZGRyZXNzICE9PSBwYXJhbXMuYWRkcmVzcyk7XG4gICAgICBpZiAoaW52YWxpZE91dHB1dEFkZHJlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHN3ZWVwIGRlc3RpbmF0aW9uICR7aW52YWxpZE91dHB1dEFkZHJlc3MuYWRkcmVzc30sIHNwZWNpZmllZCAke3BhcmFtcy5hZGRyZXNzfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdHJhbnNhY3Rpb24sIG5vIGRlc3RpbmF0aW9uIGFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSAoYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQgfSkpIGFzIGFueTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uUGFyYW1zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgdHhQcmVidWlsZDogcmVzcG9uc2UsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgdXNlcktleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcHJ2OiBwYXJhbXMueHBydixcbiAgICB9O1xuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25QYXJhbXMpO1xuXG4gICAgY29uc3Qgc2VsZWN0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgWydvdHAnXSk7XG4gICAgY29uc3QgZmluYWxUeFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBzaWduZWRUcmFuc2FjdGlvbiwgc2VsZWN0UGFyYW1zKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIHJldHVybiB0aGlzLnNlbmRUcmFuc2FjdGlvbihmaW5hbFR4UGFyYW1zLCByZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogRnJlZXplIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBmcmVlemUocGFyYW1zOiBGcmVlemVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSk7XG5cbiAgICBpZiAocGFyYW1zLmR1cmF0aW9uKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmR1cmF0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZHVyYXRpb246IHNob3VsZCBiZSBudW1iZXIgb2Ygc2Vjb25kcycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9mcmVlemUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjb21tZW50IG9mIGEgdHJhbnNmZXJcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyQ29tbWVudChwYXJhbXM6IFRyYW5zZmVyQ29tbWVudE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbJ2NvbW1lbnQnXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvdHJhbnNmZXIvJyArIHBhcmFtcy5pZCArICcvY29tbWVudCcpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIGFkZHJlc3NlcyBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGFkZHJlc3NlcyhwYXJhbXM6IEFkZHJlc3Nlc09wdGlvbnMgPSB7fSk6IFByb21pc2U8QWRkcmVzc1F1ZXJ5UmVzdWx0PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdKTtcblxuICAgIGNvbnN0IHF1ZXJ5OiBBZGRyZXNzZXNPcHRpb25zID0ge307XG5cbiAgICBpZiAocGFyYW1zLm1pbmUpIHtcbiAgICAgIHF1ZXJ5Lm1pbmUgPSAhIXBhcmFtcy5taW5lO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMucHJldklkKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcmV2SWQgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnByZXZJZCA9IHBhcmFtcy5wcmV2SWQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zb3J0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnNvcnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzb3J0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zb3J0ID0gcGFyYW1zLnNvcnQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxhYmVsQ29udGFpbnMpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMubGFiZWxDb250YWlucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxhYmVsQ29udGFpbnMgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxhYmVsQ29udGFpbnMgPSBwYXJhbXMubGFiZWxDb250YWlucztcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnNlZ3dpdCkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLnNlZ3dpdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNlZ3dpdCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnNlZ3dpdCA9IHBhcmFtcy5zZWd3aXQ7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5jaGFpbnMpKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheShwYXJhbXMuY2hhaW5zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2hhaW5zIGFyZ3VtZW50LCBleHBlY3RpbmcgYXJyYXkgb2YgbnVtYmVycycpO1xuICAgICAgfVxuICAgICAgcXVlcnkuY2hhaW5zID0gcGFyYW1zLmNoYWlucztcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLmluY2x1ZGVCYWxhbmNlcykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluY2x1ZGVCYWxhbmNlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY2x1ZGVCYWxhbmNlcyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmluY2x1ZGVCYWxhbmNlcyA9IHBhcmFtcy5pbmNsdWRlQmFsYW5jZXM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlVG9rZW5zKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuaW5jbHVkZVRva2VucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY2x1ZGVUb2tlbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlVG9rZW5zID0gcGFyYW1zLmluY2x1ZGVUb2tlbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlVG90YWxBZGRyZXNzQ291bnQpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlVG90YWxBZGRyZXNzQ291bnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlVG90YWxBZGRyZXNzQ291bnQgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlVG90YWxBZGRyZXNzQ291bnQgPSBwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbikge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5yZXR1cm5CYWxhbmNlc0ZvclRva2VuKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmV0dXJuQmFsYW5jZXNGb3JUb2tlbiBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucmV0dXJuQmFsYW5jZXNGb3JUb2tlbiA9IHBhcmFtcy5yZXR1cm5CYWxhbmNlc0ZvclRva2VuO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMucGVuZGluZ0RlcGxveW1lbnQpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5wZW5kaW5nRGVwbG95bWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBlbmRpbmdEZXBsb3ltZW50IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkucGVuZGluZ0RlcGxveW1lbnQgPSBwYXJhbXMucGVuZGluZ0RlcGxveW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvYWRkcmVzc2VzJykpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgYWRkcmVzc2VzIHNvcnRlZCBieSBiYWxhbmNlIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgYWRkcmVzc2VzQnlCYWxhbmNlKHBhcmFtczogQWRkcmVzc2VzQnlCYWxhbmNlT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnk6IEFkZHJlc3Nlc0J5QmFsYW5jZU9wdGlvbnMgPSB7XG4gICAgICB0b2tlbjogcGFyYW1zLnRva2VuLFxuICAgICAgbmZ0Q29sbGVjdGlvbklkOiBwYXJhbXMubmZ0Q29sbGVjdGlvbklkLFxuICAgICAgbmZ0SWQ6IHBhcmFtcy5uZnRJZCxcbiAgICB9O1xuICAgIHF1ZXJ5LnNvcnQgPSBwYXJhbXMuc29ydCA/PyAtMTtcbiAgICBxdWVyeS5wYWdlID0gcGFyYW1zLnBhZ2UgPz8gMTtcbiAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdCA/PyA1MDA7XG5cbiAgICBpZiAoIV8uaXNOdW1iZXIocXVlcnkuc29ydCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzb3J0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIGlmICghXy5pc051bWJlcihxdWVyeS5wYWdlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBhZ2UgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzTnVtYmVyKHF1ZXJ5LmxpbWl0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIGlmIChxdWVyeS5saW1pdCA8IDEgfHwgcXVlcnkubGltaXQgPiA1MDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbGltaXQgYXJndW1lbnQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDUwMCcpO1xuICAgIH1cblxuICAgIC8vIEFzc2VydCB0aGF0IGVpdGhlciBib3RoIG5mdENvbGxlY3Rpb25JZCBhbmQgbmZ0SWQgYXJlIHByb3ZpZGVkIG9yIG5laXRoZXIgYXJlIHByb3ZpZGVkXG4gICAgY29uc3QgaGFzTmZ0Q29sbGVjdGlvbklkID0gIV8uaXNVbmRlZmluZWQocXVlcnkubmZ0Q29sbGVjdGlvbklkKTtcbiAgICBjb25zdCBoYXNOZnRJZCA9ICFfLmlzVW5kZWZpbmVkKHF1ZXJ5Lm5mdElkKTtcbiAgICBpZiAoaGFzTmZ0Q29sbGVjdGlvbklkICE9PSBoYXNOZnRJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCduZnRDb2xsZWN0aW9uSWQgYW5kIG5mdElkIG11c3QgYm90aCBiZSBwcm92aWRlZCBvciBib3RoIGJlIG9taXR0ZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy9hZGRyZXNzZXMvYmFsYW5jZXMnKSlcbiAgICAgIC5xdWVyeShxdWVyeSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzaW5nbGUgd2FsbGV0IGFkZHJlc3MgYnkgaXRzIGlkXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBnZXRBZGRyZXNzKHBhcmFtczogR2V0QWRkcmVzc09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnYWRkcmVzcycsICdpZCddKTtcbiAgICBsZXQgcXVlcnk7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmFkZHJlc3MpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhZGRyZXNzIG9yIGlkIG9mIGFkZHJlc3MgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzKSB7XG4gICAgICBxdWVyeSA9IHBhcmFtcy5hZGRyZXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeSA9IHBhcmFtcy5pZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLmJhc2VDb2luLnVybChgL3dhbGxldC8ke3RoaXMuX3dhbGxldC5pZH0vYWRkcmVzcy8ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9YCkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG9uZSBvciBtb3JlIG5ldyBhZGRyZXNzKGVzKSBmb3IgdXNlIHdpdGggdGhpcyB3YWxsZXQuXG4gICAqXG4gICAqIElmIHRoZSBgY291bnRgIGZpZWxkIGlzIGRlZmluZWQgYW5kIGdyZWF0ZXIgdGhhbiAxLCBhbiBvYmplY3Qgd2l0aCBhIHNpbmdsZVxuICAgKiBhcnJheSBwcm9wZXJ0eSBuYW1lZCBgYWRkcmVzc2VzYCBjb250YWluaW5nIGBjb3VudGAgYWRkcmVzcyBvYmplY3RzXG4gICAqIHdpbGwgYmUgcmV0dXJuZWQuIE90aGVyd2lzZSwgYSBzaW5nbGUgYWRkcmVzcyBvYmplY3QgaXMgcmV0dXJuZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5jaGFpbiBvbiB3aGljaCB0aGUgbmV3IGFkZHJlc3Mgc2hvdWxkIGJlIGNyZWF0ZWRcbiAgICogQHBhcmFtIHsoTnVtYmVyfFN0cmluZyl9IHBhcmFtcy5nYXNQcmljZSBnYXMgcHJpY2UgZm9yIG5ldyBhZGRyZXNzIGNyZWF0aW9uLCBpZiBhcHBsaWNhYmxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMubGFiZWwgbGFiZWwgZm9yIHRoZSBuZXcgYWRkcmVzcyhlcylcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5jb3VudD0xIG51bWJlciBvZiBuZXcgYWRkcmVzc2VzIHdoaWNoIHNob3VsZCBiZSBjcmVhdGVkIChtYXhpbXVtIDI1MClcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mb3J3YXJkZXJWZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIGFkZHJlc3MgdG8gY3JlYXRlLCBpZiBhcHBsaWNhYmxlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmxvd1ByaW9yaXR5IEV0aGVyZXVtLXNwZWNpZmljIHBhcmFtIHRvIGNyZWF0ZSBhZGRyZXNzIHVzaW5nIGxvdyBwcmlvcml0eSBmZWUgYWRkcmVzc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmJhc2VBZGRyZXNzIGJhc2UgYWRkcmVzcyBvZiB0aGUgd2FsbGV0KG9wdGlvbmFsIHBhcmFtZXRlcilcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcyBXaGVuIHNldCB0byBmYWxzZSwgaXQgdGhyb3dzIGVycm9yIGlmIGFkZHJlc3MgdmVyaWZpY2F0aW9uIGlzIHNraXBwZWQgZm9yIGFueSByZWFzb24uIERlZmF1bHQgaXMgdHJ1ZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5vblRva2VuIG1hbmRhdG9yeSBpbiBjYXNlIG9mIHRoZSBPRkMgd2FsbGV0LCB0aGUgbmFtZSBvZiB0b2tlbiB0byBjcmVhdGUgYWRkcmVzcyBmb3JcbiAgICogQWRkcmVzcyB2ZXJpZmljYXRpb24gY2FuIGJlIHNraXBwZWQgd2hlbiBmb3J3YXJkZXJWZXJzaW9uIGlzIDAgYW5kIHBlbmRpbmdDaGFpbkluaXRpYWxpemF0aW9uIGlzIHRydWUgT1JcbiAgICogaWYgJ2NvaW5TcGVjaWZpYycgaXMgbm90IHBhcnQgb2YgdGhlIHJlc3BvbnNlIGZyb20gYXBpIGNhbGwgdG8gY3JlYXRlIGFkZHJlc3NcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFkZHJlc3MocGFyYW1zOiBDcmVhdGVBZGRyZXNzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBhZGRyZXNzUGFyYW1zOiBDcmVhdGVBZGRyZXNzT3B0aW9ucyA9IHt9O1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGNoYWluLFxuICAgICAgZ2FzUHJpY2UsXG4gICAgICBsYWJlbCxcbiAgICAgIGxvd1ByaW9yaXR5LFxuICAgICAgZm9yd2FyZGVyVmVyc2lvbixcbiAgICAgIGZvcm1hdCxcbiAgICAgIGNvdW50ID0gMSxcbiAgICAgIGJhc2VBZGRyZXNzLFxuICAgICAgYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcyA9IHRydWUsXG4gICAgICBvblRva2VuLFxuICAgICAgZXZtS2V5UmluZ1JlZmVyZW5jZUFkZHJlc3MsXG4gICAgfSA9IHBhcmFtcztcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChjaGFpbikpIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIoY2hhaW4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2hhaW4gaGFzIHRvIGJlIGFuIGludGVnZXInKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuY2hhaW4gPSBjaGFpbjtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZ2FzUHJpY2UpKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKGdhc1ByaWNlKSAmJiAoaXNOYU4oTnVtYmVyKGdhc1ByaWNlKSkgfHwgIV8uaXNTdHJpbmcoZ2FzUHJpY2UpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dhc1ByaWNlIGhhcyB0byBiZSBhbiBpbnRlZ2VyIG9yIG51bWVyaWMgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmdhc1ByaWNlID0gZ2FzUHJpY2U7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGZvcndhcmRlclZlcnNpb24pKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKGZvcndhcmRlclZlcnNpb24pIHx8IGZvcndhcmRlclZlcnNpb24gPCAwIHx8IGZvcndhcmRlclZlcnNpb24gPiA1KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZm9yd2FyZGVyVmVyc2lvbiBoYXMgdG8gYmUgYW4gaW50ZWdlciAwLCAxLCAyLCAzLCA0IG9yIDUnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuZm9yd2FyZGVyVmVyc2lvbiA9IGZvcndhcmRlclZlcnNpb247XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGxhYmVsKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGxhYmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xhYmVsIGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5sYWJlbCA9IGxhYmVsO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChiYXNlQWRkcmVzcykpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhiYXNlQWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYXNlQWRkcmVzcyBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4oYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbGxvd1NraXBWZXJpZnlBZGRyZXNzIGhhcyB0byBiZSBhIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNJbnRlZ2VyKGNvdW50KSB8fCBjb3VudCA8PSAwIHx8IGNvdW50ID4gMjUwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdW50IGhhcyB0byBiZSBhIG51bWJlciBiZXR3ZWVuIDEgYW5kIDI1MCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChsb3dQcmlvcml0eSkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4obG93UHJpb3JpdHkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbG93UHJpb3JpdHkgaGFzIHRvIGJlIGEgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5sb3dQcmlvcml0eSA9IGxvd1ByaW9yaXR5O1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChmb3JtYXQpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoZm9ybWF0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Zvcm1hdCBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuZm9ybWF0ID0gZm9ybWF0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpID09PSAnb2ZjJykge1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKG9uVG9rZW4pKSB7XG4gICAgICAgIGlmICghXy5pc1N0cmluZyhvblRva2VuKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb25Ub2tlbiBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRyZXNzUGFyYW1zLm9uVG9rZW4gPSBvblRva2VuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvblRva2VuIGlzIGEgbWFuZGF0b3J5IHBhcmFtZXRlciBmb3IgT0ZDIHdhbGxldHMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghXy5pc1N0cmluZyhvblRva2VuKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uVG9rZW4gaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGV2bUtleVJpbmdSZWZlcmVuY2VBZGRyZXNzKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGV2bUtleVJpbmdSZWZlcmVuY2VBZGRyZXNzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V2bUtleVJpbmdSZWZlcmVuY2VBZGRyZXNzIGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmJhc2VDb2luLmlzRVZNKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgRVZNIGNoYWlucycpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmJhc2VDb2luLmlzVmFsaWRBZGRyZXNzKGV2bUtleVJpbmdSZWZlcmVuY2VBZGRyZXNzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V2bUtleVJpbmdSZWZlcmVuY2VBZGRyZXNzIG11c3QgYmUgYSB2YWxpZCBhZGRyZXNzJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmV2bUtleVJpbmdSZWZlcmVuY2VBZGRyZXNzID0gZXZtS2V5UmluZ1JlZmVyZW5jZUFkZHJlc3M7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGtleWNoYWlucyBmb3IgYWRkcmVzcyB2ZXJpZmljYXRpb25cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLl93YWxsZXQua2V5cy5tYXAoKGspID0+IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHsgaWQ6IGssIHJlcUlkIH0pKSk7XG4gICAgY29uc3Qgcm9vdEFkZHJlc3MgPSBfLmdldCh0aGlzLl93YWxsZXQsICdyZWNlaXZlQWRkcmVzcy5hZGRyZXNzJyk7XG5cbiAgICBjb25zdCBuZXdBZGRyZXNzZXMgPSBfLnRpbWVzKGNvdW50LCBhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgICAgY29uc3QgbmV3QWRkcmVzcyA9IChhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL2FkZHJlc3MnKSlcbiAgICAgICAgLnNlbmQoYWRkcmVzc1BhcmFtcylcbiAgICAgICAgLnJlc3VsdCgpKSBhcyBhbnk7XG5cbiAgICAgIG5ld0FkZHJlc3Mua2V5Y2hhaW5zID0ga2V5Y2hhaW5zO1xuICAgICAgbmV3QWRkcmVzcy5iYXNlQWRkcmVzcyA9IGJhc2VBZGRyZXNzID8/IF8uZ2V0KHRoaXMuX3dhbGxldCwgJ2NvaW5TcGVjaWZpYy5iYXNlQWRkcmVzcycpO1xuICAgICAgbmV3QWRkcmVzcy5mb3JtYXQgPSBhZGRyZXNzUGFyYW1zLmZvcm1hdDtcblxuICAgICAgY29uc3QgdmVyaWZpY2F0aW9uRGF0YTogVmVyaWZ5QWRkcmVzc09wdGlvbnMgPSBfLm1lcmdlKHt9LCBuZXdBZGRyZXNzLCB7XG4gICAgICAgIHJvb3RBZGRyZXNzLFxuICAgICAgICB3YWxsZXRWZXJzaW9uOiBfLmdldCh0aGlzLl93YWxsZXQsICdjb2luU3BlY2lmaWMud2FsbGV0VmVyc2lvbicpLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICh2ZXJpZmljYXRpb25EYXRhLmVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBBZGRyZXNzR2VuZXJhdGlvbkVycm9yKHZlcmlmaWNhdGlvbkRhdGEuZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICB2ZXJpZmljYXRpb25EYXRhLmltcGxpZWRGb3J3YXJkZXJWZXJzaW9uID0gZm9yd2FyZGVyVmVyc2lvbiA/PyB2ZXJpZmljYXRpb25EYXRhLmNvaW5TcGVjaWZpYz8uZm9yd2FyZGVyVmVyc2lvbjtcblxuICAgICAgLy8gRm9yIFNNQyAoU2VsZi1NYW5hZ2VkIEN1c3RvZGlhbCkgd2FsbGV0cywgcGFzcyBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkIGZyb20gdXNlciBrZXljaGFpblxuICAgICAgLy8gVGhlIHZlcmlmaWNhdGlvbiBmdW5jdGlvbiB3aWxsIGNvbXB1dGUgdGhlIGRlcml2YXRpb24gcHJlZml4IGludGVybmFsbHlcbiAgICAgIC8vIEN1c3RvZGlhbCB3YWxsZXRzIGRvbid0IG5lZWQgdGhpcyBhcyB0aGVpciBjb21tb25LZXljaGFpbiBhbHJlYWR5IGFjY291bnRzIGZvciB0aGUgcHJlZml4XG4gICAgICBpZiAodGhpcy5tdWx0aXNpZ1R5cGUoKSA9PT0gJ3RzcycgJiYgdGhpcy50eXBlKCkgPT09ICdjb2xkJyAmJiB0aGlzLl93YWxsZXQua2V5cy5sZW5ndGggPiBLZXlJbmRpY2VzLlVTRVIpIHtcbiAgICAgICAgY29uc3QgdXNlcktleWNoYWluID0ga2V5Y2hhaW5zW0tleUluZGljZXMuVVNFUl0gYXMgS2V5Y2hhaW4gfCB1bmRlZmluZWQ7XG4gICAgICAgIHZlcmlmaWNhdGlvbkRhdGEuZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCA9IHVzZXJLZXljaGFpbj8uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDtcbiAgICAgIH1cblxuICAgICAgLy8gVGhpcyBjb25kaXRpb24gd2FzIGFkZGVkIGluIGZpcnN0IHBsYWNlIGJlY2F1c2UgaW4gY2Vsbywgd2hlbiB2ZXJpZnlBZGRyZXNzIG1ldGhvZCB3YXMgY2FsbGVkIG9uIGFkZHJlc3NlcyB3aGljaCB3ZXJlIGhhdmluZyBwZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiBhcyB0cnVlLCBpdCB1c2VkIHRvIHRocm93IHNvbWUgZXJyb3JcbiAgICAgIC8vIEluIGNhc2Ugb2YgZm9yd2FyZGVyIHZlcnNpb24gMSBldGggYWRkcmVzc2VzLCBhZGRyZXNzZXMgbmVlZCB0byBiZSB2ZXJpZmllZCBldmVuIGlmIHRoZSBwZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiBmbGFnIGlzIHRydWVcbiAgICAgIGlmIChcbiAgICAgICAgdmVyaWZpY2F0aW9uRGF0YS5jb2luU3BlY2lmaWMgJiZcbiAgICAgICAgKCF2ZXJpZmljYXRpb25EYXRhLmNvaW5TcGVjaWZpYy5wZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiB8fCB2ZXJpZmljYXRpb25EYXRhLmltcGxpZWRGb3J3YXJkZXJWZXJzaW9uID09PSAxKVxuICAgICAgKSB7XG4gICAgICAgIC8vIGNhbid0IHZlcmlmeSBhZGRyZXNzZXMgd2hpY2ggYXJlIHBlbmRpbmcgY2hhaW4gaW5pdGlhbGl6YXRpb24sIGFzIHRoZSBhZGRyZXNzIGlzIGhpZGRlblxuICAgICAgICBsZXQgaXNXYWxsZXRBZGRyZXNzID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaXNXYWxsZXRBZGRyZXNzID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5pc1dhbGxldEFkZHJlc3ModmVyaWZpY2F0aW9uRGF0YSwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcikpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEZJWE1FKEJHLTQzMjI1KTogaW1wbGVtZW50IHRoaXMgY29ycmVjdGx5XG4gICAgICAgICAgaXNXYWxsZXRBZGRyZXNzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzV2FsbGV0QWRkcmVzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm90IGEgd2FsbGV0IGFkZHJlc3NgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGFkZHJlc3MgdmVyaWZpY2F0aW9uIHNraXBwZWQgZm9yIGNvdW50ID0gJHtjb3VudH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld0FkZHJlc3M7XG4gICAgfSk7XG5cbiAgICBpZiAobmV3QWRkcmVzc2VzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIG5ld0FkZHJlc3Nlc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWRkcmVzc2VzOiBhd2FpdCBQcm9taXNlLmFsbChuZXdBZGRyZXNzZXMpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHByb3BlcnRpZXMgb24gYW4gYWRkcmVzc1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlQWRkcmVzcyhwYXJhbXM6IFVwZGF0ZUFkZHJlc3NPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGFkZHJlc3MgPSBwYXJhbXMuYWRkcmVzcztcblxuICAgIGlmICghXy5pc1N0cmluZyhhZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgYWRkcmVzcycpO1xuICAgIH1cblxuICAgIGNvbnN0IHB1dFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsnbGFiZWwnXSk7XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9hZGRyZXNzLycgKyBlbmNvZGVVUklDb21wb25lbnQoYWRkcmVzcykpO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucHV0KHVybCkuc2VuZChwdXRQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhY2NvdW50IHJlc291cmNlcyBmb3IgdGhlIGdpdmVuIGFkZHJlc3Nlc1xuICAgKiBAcGFyYW0gcGFyYW1zIC0gb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyBhZGRyZXNzZXMgYW5kIG9wdGlvbmFsIGRlc3RpbmF0aW9uQWRkcmVzc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxHZXRBY2NvdW50UmVzb3VyY2VzUmVzcG9uc2U+fSAtIHJlc3BvbnNlIGZyb20gV1AgQVBJXG4gICAqL1xuICBhc3luYyBnZXRBY2NvdW50UmVzb3VyY2VzKHBhcmFtczogR2V0QWNjb3VudFJlc291cmNlc09wdGlvbnMpOiBQcm9taXNlPEdldEFjY291bnRSZXNvdXJjZXNSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgYWRkcmVzc2VzLCBkZXN0aW5hdGlvbkFkZHJlc3MgfSA9IHBhcmFtcztcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShhZGRyZXNzZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkZHJlc3NlcyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuXG4gICAgaWYgKGFkZHJlc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzc2VzIGFycmF5IGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHk6IEdldEFjY291bnRSZXNvdXJjZXNPcHRpb25zID0geyBhZGRyZXNzZXMgfTtcbiAgICBpZiAoZGVzdGluYXRpb25BZGRyZXNzKSB7XG4gICAgICBib2R5LmRlc3RpbmF0aW9uQWRkcmVzcyA9IGRlc3RpbmF0aW9uQWRkcmVzcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvZ2V0QWNjb3VudFJlc291cmNlcycpKS5zZW5kKGJvZHkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXNvdXJjZSBkZWxlZ2F0aW9ucyBmb3IgdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtcyAtIG9wdGlvbmFsIGZpbHRlcnM6IHR5cGUsIHJlc291cmNlLCBsaW1pdCwgbmV4dEJhdGNoUHJldklkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEdldFJlc291cmNlRGVsZWdhdGlvbnNSZXNwb25zZT59IC0gcmVzcG9uc2UgZnJvbSBXUCBBUElcbiAgICovXG4gIGFzeW5jIGdldFJlc291cmNlRGVsZWdhdGlvbnMocGFyYW1zPzogR2V0UmVzb3VyY2VEZWxlZ2F0aW9uc09wdGlvbnMpOiBQcm9taXNlPEdldFJlc291cmNlRGVsZWdhdGlvbnNSZXNwb25zZT4ge1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+ID0ge307XG4gICAgaWYgKHBhcmFtcz8udHlwZSAhPT0gdW5kZWZpbmVkKSBxdWVyeVBhcmFtcy50eXBlID0gcGFyYW1zLnR5cGU7XG4gICAgaWYgKHBhcmFtcz8ucmVzb3VyY2UgIT09IHVuZGVmaW5lZCkgcXVlcnlQYXJhbXMucmVzb3VyY2UgPSBwYXJhbXMucmVzb3VyY2U7XG4gICAgaWYgKHBhcmFtcz8ubGltaXQgIT09IHVuZGVmaW5lZCkgcXVlcnlQYXJhbXMubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgaWYgKHBhcmFtcz8ubmV4dEJhdGNoUHJldklkICE9PSB1bmRlZmluZWQpIHF1ZXJ5UGFyYW1zLm5leHRCYXRjaFByZXZJZCA9IHBhcmFtcy5uZXh0QmF0Y2hQcmV2SWQ7XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9yZXNvdXJjZWRlbGVnYXRpb25zJykpLnF1ZXJ5KHF1ZXJ5UGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVdhbGxldEJ1aWxkRGVmYXVsdHMocGFyYW1zOiBVcGRhdGVCdWlsZERlZmF1bHRPcHRpb25zKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnbWluRmVlUmF0ZScsICdjaGFuZ2VBZGRyZXNzVHlwZScsICd0eEZvcm1hdCddKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVXYWxsZXQoe1xuICAgICAgYnVpbGREZWZhdWx0czoge1xuICAgICAgICBtaW5GZWVSYXRlOiBwYXJhbXMubWluRmVlUmF0ZSxcbiAgICAgICAgY2hhbmdlQWRkcmVzc1R5cGU6IHBhcmFtcy5jaGFuZ2VBZGRyZXNzVHlwZSxcbiAgICAgICAgdHhGb3JtYXQ6IHBhcmFtcy50eEZvcm1hdCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVXYWxsZXQocGFyYW1zOiBVcGRhdGVXYWxsZXRPcHRpb25zKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ2NvaW5TcGVjaWZpYycsICdidWlsZERlZmF1bHRzJywgJ2xhYmVsJ10pO1xuICAgIGNvbnN0IHsgY29pblNwZWNpZmljLCAuLi5yZXN0IH0gPSBmaWx0ZXJlZFBhcmFtcztcbiAgICByZXR1cm4gdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLnVybCgpKVxuICAgICAgLnNlbmQoe1xuICAgICAgICAuLi5yZXN0LFxuICAgICAgICAuLi4oY29pblNwZWNpZmljXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgIFt0aGlzLmJhc2VDb2luLmdldENoYWluKCldOiBjb2luU3BlY2lmaWMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3Qgd2ViaG9va3Mgb24gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgbGlzdFdlYmhvb2tzKHBhcmFtczogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnk6IFBhZ2luYXRpb25PcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbXVsYXRlIHdhbGxldCB3ZWJob29rLCBjdXJyZW50bHkgZm9yIHdlYmhvb2tzIG9mIHR5cGUgdHJhbnNmZXIgYW5kIHBlbmRpbmcgYXBwcm92YWxcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHdlYmhvb2tJZCAocmVxdWlyZWQpIGlkIG9mIHRoZSB3ZWJob29rIHRvIGJlIHNpbXVsYXRlZFxuICAgKiAtIHRyYW5zZmVySWQgKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgdHJhbnNmZXIgd2ViaG9va3MpIGlkIG9mIHRoZSBzaW11bGF0ZWQgdHJhbnNmZXJcbiAgICogLSBwZW5kaW5nQXBwcm92YWxJZCAob3B0aW9uYWwgYnV0IHJlcXVpcmVkIGZvciBwZW5kaW5nIGFwcHJvdmFsIHdlYmhvb2tzKSBpZCBvZiB0aGUgc2ltdWxhdGVkIHBlbmRpbmcgYXBwcm92YWxcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzaW11bGF0ZVdlYmhvb2socGFyYW1zOiBTaW11bGF0ZVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2ViaG9va0lkJ10sIFsndHJhbnNmZXJJZCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICAgIGNvbnN0IGhhc1RyYW5zZmVySWQgPSAhIXBhcmFtcy50cmFuc2ZlcklkO1xuICAgIGNvbnN0IGhhc1BlbmRpbmdBcHByb3ZhbElkID0gISFwYXJhbXMucGVuZGluZ0FwcHJvdmFsSWQ7XG4gICAgaWYgKCFoYXNUcmFuc2ZlcklkICYmICFoYXNQZW5kaW5nQXBwcm92YWxJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHJhbnNmZXJJZCBvciBwZW5kaW5nQXBwcm92YWxJZCcpO1xuICAgIH1cblxuICAgIGlmIChoYXNUcmFuc2ZlcklkICYmIGhhc1BlbmRpbmdBcHByb3ZhbElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3Qgc3VwcGx5IGVpdGhlciB0cmFuc2ZlcklkIG9yIHBlbmRpbmdBcHByb3ZhbElkLCBidXQgbm90IGJvdGgnKTtcbiAgICB9XG5cbiAgICAvLyBkZXBlbmRpbmcgb24gdGhlIGNvaW4gdHlwZSBvZiB0aGUgd2FsbGV0LCB0aGUgdHhIYXNoIGhhcyB0byBhZGhlcmUgdG8gaXRzIHJlc3BlY3RpdmUgZm9ybWF0XG4gICAgLy8gYnV0IHRoZSBzZXJ2ZXIgdGFrZXMgY2FyZSBvZiB0aGF0XG5cbiAgICAvLyBvbmx5IHRha2UgdGhlIHRyYW5zZmVySWQgYW5kIHBlbmRpbmdBcHByb3ZhbElkIHByb3BlcnRpZXNcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsndHJhbnNmZXJJZCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICAgIGNvbnN0IHdlYmhvb2tJZCA9IHBhcmFtcy53ZWJob29rSWQ7XG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKCcvd2ViaG9va3MvJyArIHdlYmhvb2tJZCArICcvc2ltdWxhdGUnKSlcbiAgICAgIC5zZW5kKGZpbHRlcmVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHdlYmhvb2sgdG8gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgYWRkV2ViaG9vayhwYXJhbXM6IE1vZGlmeVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJywgJ3R5cGUnXSwgW10pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSB3ZWJob29rIGZyb20gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgcmVtb3ZlV2ViaG9vayhwYXJhbXM6IE1vZGlmeVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJywgJ3R5cGUnXSwgW10pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVzZXIga2V5Y2hhaW4gZm9yIHRoaXMgd2FsbGV0XG4gICAqXG4gICAqIFRoZSB1c2VyIGtleWNoYWluIGlzIHRoZSBmaXJzdCBrZXljaGFpbiBvZiB0aGUgd2FsbGV0IGFuZCB1c3VhbGx5IGhhcyB0aGUgZW5jcnlwdGVkIHBydiBzdG9yZWQgb24gQml0R28uXG4gICAqIFVzZWZ1bCB3aGVuIHRyeWluZyB0byBnZXQgdGhlIHVzZXJzJyBrZXljaGFpbiBmcm9tIHRoZSBzZXJ2ZXIgYmVmb3JlIGRlY3J5cHRpbmcgdG8gc2lnbiBhIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCk6IFByb21pc2U8S2V5Y2hhaW5XaXRoRW5jcnlwdGVkUHJ2PiB7XG4gICAgY29uc3QgdHJ5S2V5Q2hhaW4gPSBhc3luYyAoaW5kZXg6IG51bWJlcik6IFByb21pc2U8S2V5Y2hhaW5XaXRoRW5jcnlwdGVkUHJ2PiA9PiB7XG4gICAgICBpZiAoIXRoaXMuX3dhbGxldC5rZXlzIHx8IGluZGV4ID49IHRoaXMuX3dhbGxldC5rZXlzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0VuY3J5cHRlZEtleWNoYWluRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyYW1zID0geyBpZDogdGhpcy5fd2FsbGV0LmtleXNbaW5kZXhdIH07XG5cbiAgICAgIGNvbnN0IGtleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQocGFyYW1zKTtcbiAgICAgIC8vIElmIHdlIGZpbmQgdGhlIHBydiwgdGhlbiB0aGlzIGlzIHByb2JhYmx5IHRoZSB1c2VyIGtleWNoYWluIHdlJ3JlIGxvb2tpbmcgZm9yXG4gICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSB7XG4gICAgICAgIHJldHVybiBrZXljaGFpbiBhcyBLZXljaGFpbldpdGhFbmNyeXB0ZWRQcnY7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ5S2V5Q2hhaW4oaW5kZXggKyAxKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRyeUtleUNoYWluKDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVuZW5jcnlwdGVkIHByaXZhdGUga2V5IGZvciB0aGlzIHdhbGxldCAoYmUgY2FyZWZ1bCEpXG4gICAqIFJlcXVpcmVzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGdldFBydihwYXJhbXM6IEdldFBydk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICdwcnYnXSk7XG5cbiAgICAvLyBQcmVwYXJlIHNpZ25pbmcga2V5XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnBydikgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBlaXRoZXIgcHJvdmlkZSBwcnYgb3Igd2FsbGV0IHBhc3NwaHJhc2UnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnBydikgJiYgIV8uaXNTdHJpbmcocGFyYW1zLnBydikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpICYmICFfLmlzU3RyaW5nKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRQYXNzcGhyYXNlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnBydikge1xuICAgICAgcmV0dXJuIHBhcmFtcy5wcnY7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcktleWNoYWluID0gYXdhaXQgdGhpcy5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oKTtcbiAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldCBwYXNzcGhyYXNlIHdhcyBub3QgcHJvdmlkZWQnKTtcbiAgICB9XG4gICAgY29uc3QgdXNlclBydiA9IGF3YWl0IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXlBc3luYyh0aGlzLmJpdGdvLCB1c2VyS2V5Y2hhaW4sIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKTtcbiAgICBpZiAoIXVzZXJQcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXJyb3IgZGVjcnlwdGluZyB3YWxsZXQgcHJpdmF0ZSBrZXknKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZXJQcnY7XG4gIH1cblxuICBwcml2YXRlIGlzTXVsdGlVc2VyS2V5V2FsbGV0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljPy5mZWF0dXJlcz8uaW5jbHVkZXMoJ211bHRpLWtleS11c2VyLWtleScpID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYW4gZW5jcnlwdGVkIHdhbGxldCBzaGFyZSB0byBCaXRHby5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlU2hhcmUocGFyYW1zOiBDcmVhdGVTaGFyZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1c2VyJywgJ3Blcm1pc3Npb25zJ10sIFtdKTtcblxuICAgIGNvbnN0IGlzTXVsdGlVc2VyS2V5V2FsbGV0ID0gdGhpcy5pc011bHRpVXNlcktleVdhbGxldCgpO1xuXG4gICAgaWYgKGlzTXVsdGlVc2VyS2V5V2FsbGV0KSB7XG4gICAgICBpZiAocGFyYW1zLmtleWNoYWluICYmICFfLmlzRW1wdHkocGFyYW1zLmtleWNoYWluKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWluIHByb3BlcnR5IG11c3Qgbm90IGJlIHByb3ZpZGVkIGZvciBtdWx0aS1rZXktdXNlci1rZXkgd2FsbGV0cycpO1xuICAgICAgfVxuICAgICAgLy8gUmVtb3ZlIGtleWNoYWluIGZyb20gcGFyYW1zIGlmIHByZXNlbnRzXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvc2hhcmUnKSkuc2VuZChfLm9taXQocGFyYW1zLCAna2V5Y2hhaW4nKSkucmVzdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5rZXljaGFpbiAmJiAhXy5pc0VtcHR5KHBhcmFtcy5rZXljaGFpbikpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5wdWIgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5lbmNyeXB0ZWRQcnYgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5mcm9tUHViS2V5IHx8XG4gICAgICAgICFwYXJhbXMua2V5Y2hhaW4udG9QdWJLZXkgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5wYXRoXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlcyBrZXljaGFpbiBwYXJhbWV0ZXJzIC0gcHViLCBlbmNyeXB0ZWRQcnYsIGZyb21QdWJLZXksIHRvUHViS2V5LCBwYXRoJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3NoYXJlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaGFyZXMgYSB3YWxsZXQgd2l0aCBtdWx0aXBsZSB1c2VycyBieSBjcmVhdGluZyBidWxrIHdhbGxldCBzaGFyZXMuXG4gICAqXG4gICAqIEBhc3luY1xuICAgKiBAcGFyYW0ge0J1bGtXYWxsZXRTaGFyZU9wdGlvbnN9IHBhcmFtcyAtIFRoZSBvcHRpb25zIGZvciBzaGFyaW5nIHdhbGxldHMgaW4gYnVsay5cbiAgICogQHBhcmFtIHtBcnJheTxTaGFyZU9wdGlvbj59IHBhcmFtcy5zaGFyZU9wdGlvbnMgLSBBbiBhcnJheSBvZiBzaGFyZSBvcHRpb24gb2JqZWN0cyBjb250YWluaW5nIHVzZXIgYW5kIHBlcm1pc3Npb25zIGluZm9ybWF0aW9uLlxuICAgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcy5zaGFyZU9wdGlvbnNbXS5rZXljaGFpbl0gLSBUaGUga2V5Y2hhaW4gb2JqZWN0IHVzZWQgdG8gc2hhcmUgdGhlIHdhbGxldC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMuc2hhcmVPcHRpb25zW10ua2V5Y2hhaW4udG9QdWJLZXldIC0gVGhlIHJlY2lwaWVudCdzIHB1YmxpYyBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLnNoYXJlT3B0aW9uc1tdLmtleWNoYWluLnBhdGhdIC0gVGhlIGRlcml2YXRpb24gcGF0aCBvZiB0aGUga2V5Y2hhaW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc2hhcmVPcHRpb25zW10udXNlciAtIFRoZSB1c2VyIHRvIHNoYXJlIHRoZSB3YWxsZXQgd2l0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5zaGFyZU9wdGlvbnNbXS5wZXJtaXNzaW9ucyAtIFRoZSBwZXJtaXNzaW9ucyBncmFudGVkIHRvIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhcmFtcy53YWxsZXRQYXNzcGhyYXNlXSAtIFRoZSB3YWxsZXQgcGFzc3BocmFzZSB1c2VkIHRvIGRlY3J5cHQgdGhlIGtleWNoYWluLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgYHNoYXJlT3B0aW9uc2AgaXMgZW1wdHksIG9yIGlmIHJlcXVpcmVkIGtleWNoYWluIHBhcmFtZXRlcnMgKGB0b1B1YktleWAgYW5kIGBwYXRoYCkgYXJlIG1pc3Npbmcgd2hlbiBuZWVkZWQuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB1bmFibGUgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXljaGFpbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8Q3JlYXRlQnVsa1dhbGxldFNoYXJlTGlzdFJlc3BvbnNlPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVzcG9uc2Ugb2YgdGhlIGJ1bGsgd2FsbGV0IHNoYXJlIGNyZWF0aW9uLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQnVsa1dhbGxldFNoYXJlKHBhcmFtczogQnVsa1dhbGxldFNoYXJlT3B0aW9ucyk6IFByb21pc2U8Q3JlYXRlQnVsa1dhbGxldFNoYXJlTGlzdFJlc3BvbnNlPiB7XG4gICAgaWYgKHBhcmFtcy5rZXlTaGFyZU9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNoYXJlIG9wdGlvbnMgcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBidWxrQ3JlYXRlU2hhcmVPcHRpb25zOiBCdWxrQ3JlYXRlU2hhcmVPcHRpb25bXSA9IFtdO1xuXG4gICAgLy8gQ2hlY2sgaWYgYW55IHNoYXJlIG9wdGlvbiBuZWVkcyBhIGtleWNoYWluIChoYXMgJ3NwZW5kJyBwZXJtaXNzaW9uKVxuICAgIGNvbnN0IGFueU5lZWRzS2V5Y2hhaW4gPSBwYXJhbXMua2V5U2hhcmVPcHRpb25zLnNvbWUoKG9wdCkgPT4gb3B0LnBlcm1pc3Npb25zICYmIG9wdC5wZXJtaXNzaW9ucy5pbmNsdWRlcygnc3BlbmQnKSk7XG5cbiAgICAvLyBGZXRjaCBhbmQgZGVjcnlwdCB0aGUga2V5Y2hhaW4gT05DRSBmb3IgYWxsIHVzZXJzXG4gICAgbGV0IGRlY3J5cHRlZEtleWNoYWluOiBEZWNyeXB0ZWRLZXljaGFpbkRhdGEgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoYW55TmVlZHNLZXljaGFpbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGVjcnlwdGVkS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmdldERlY3J5cHRlZEtleWNoYWluRm9yU2hhcmluZyhwYXJhbXMud2FsbGV0UGFzc3BocmFzZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgTWlzc2luZ0VuY3J5cHRlZEtleWNoYWluRXJyb3IpIHtcbiAgICAgICAgICBkZWNyeXB0ZWRLZXljaGFpbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzaGFyZU9wdGlvbiBvZiBwYXJhbXMua2V5U2hhcmVPcHRpb25zKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb21tb24udmFsaWRhdGVQYXJhbXMoc2hhcmVPcHRpb24sIFsndXNlcklkJywgJ3B1YktleScsICdwYXRoJ10sIFtdKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKCFzaGFyZU9wdGlvbi5wdWJLZXkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTmVlZFVzZXJTaWdudXBFcnJvcihzaGFyZU9wdGlvbi51c2VySWQpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5lZWRzS2V5Y2hhaW4gPSBzaGFyZU9wdGlvbi5wZXJtaXNzaW9ucyAmJiBzaGFyZU9wdGlvbi5wZXJtaXNzaW9ucy5pbmNsdWRlcygnc3BlbmQnKTtcblxuICAgICAgaWYgKG5lZWRzS2V5Y2hhaW4gJiYgZGVjcnlwdGVkS2V5Y2hhaW4pIHtcbiAgICAgICAgY29uc3Qgc2hhcmVkS2V5Y2hhaW4gPSB0aGlzLmVuY3J5cHRQcnZGb3JVc2VyKFxuICAgICAgICAgIGRlY3J5cHRlZEtleWNoYWluLnBydixcbiAgICAgICAgICBkZWNyeXB0ZWRLZXljaGFpbi5wdWIsXG4gICAgICAgICAgc2hhcmVPcHRpb24ucHViS2V5LFxuICAgICAgICAgIHNoYXJlT3B0aW9uLnBhdGhcbiAgICAgICAgKTtcblxuICAgICAgICBidWxrQ3JlYXRlU2hhcmVPcHRpb25zLnB1c2goe1xuICAgICAgICAgIHVzZXI6IHNoYXJlT3B0aW9uLnVzZXJJZCxcbiAgICAgICAgICBwZXJtaXNzaW9uczogc2hhcmVPcHRpb24ucGVybWlzc2lvbnMsXG4gICAgICAgICAga2V5Y2hhaW46IHNoYXJlZEtleWNoYWluLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVCdWxrS2V5U2hhcmVzKGJ1bGtDcmVhdGVTaGFyZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYnVsayB3YWxsZXQgc2hhcmUgZW50cmllcyBmb3Igc3BlY2lmaWVkIHNoYXJlIG9wdGlvbnMuXG4gICAqIEZpbHRlcnMgb3V0IHNoYXJlIG9wdGlvbnMgdGhhdCBkbyBub3QgY29udGFpbiB2YWxpZCBrZXljaGFpbiBpbmZvcm1hdGlvbiBvciBoYXZlIG1pc3Npbmcga2V5Y2hhaW4gZmllbGRzLlxuICAgKiBJZiBhbGwgc2hhcmUgb3B0aW9ucyBhcmUgaW52YWxpZCBvciBlbXB0eSwgaXQgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBTZW5kcyBhIFBPU1QgcmVxdWVzdCB0byBjcmVhdGUgdGhlIHdhbGxldCBzaGFyZXMgZm9yIHZhbGlkIHNoYXJlIG9wdGlvbnMuXG4gICAqXG4gICAqIEBhc3luY1xuICAgKiBAcGFyYW0ge0J1bGtDcmVhdGVTaGFyZU9wdGlvbltdfSBbcGFyYW1zPVtdXSAtIFRoZSBhcnJheSBvZiBzaGFyZSBvcHRpb25zIHRvIHByb2Nlc3MuXG4gICAqICAgS2V5Y2hhaW4gZW50cmllcyBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBmaWVsZHM6IGBwdWJgLCBgZW5jcnlwdGVkUHJ2YCwgYGZyb21QdWJLZXlgLCBgdG9QdWJLZXlgLCBhbmQgYHBhdGhgLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDcmVhdGVCdWxrV2FsbGV0U2hhcmVMaXN0UmVzcG9uc2U+fSBBIHByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXN1bHQgb2YgdGhlIHdhbGxldCBzaGFyZXMgY3JlYXRpb24uXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgbm8gdmFsaWQgc2hhcmUgb3B0aW9ucyBhcmUgcHJvdmlkZWQuXG4gICAqL1xuICBhc3luYyBjcmVhdGVCdWxrS2V5U2hhcmVzKHBhcmFtczogQnVsa0NyZWF0ZVNoYXJlT3B0aW9uW10gPSBbXSk6IFByb21pc2U8Q3JlYXRlQnVsa1dhbGxldFNoYXJlTGlzdFJlc3BvbnNlPiB7XG4gICAgcGFyYW1zID0gcGFyYW1zLmZpbHRlcigoc2hhcmVPcHRpb24pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhzaGFyZU9wdGlvbi5rZXljaGFpbiwgWydwdWInLCAnZW5jcnlwdGVkUHJ2JywgJ2Zyb21QdWJLZXknLCAndG9QdWJLZXknLCAncGF0aCddLCBbXSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBFeGNsdWRlIHNoYXJlIG9wdGlvbnMgd2l0aCBpbnZhbGlkIGtleWNoYWluXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghcGFyYW1zIHx8IE9iamVjdC5rZXlzKHBhcmFtcykubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NoYXJlT3B0aW9ucyBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybChgL3dhbGxldC8ke3RoaXMuX3dhbGxldC5pZH0vd2FsbGV0c2hhcmVzYCwgMik7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQoeyBzaGFyZU9wdGlvbnM6IHBhcmFtcyB9KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGtleWNoYWluIHdpdGggZW5jcnlwdGVkIHByaXZhdGUga2V5IHRvIGJlIHNoYXJlZCBmb3Igd2FsbGV0IHNoYXJpbmcuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEVuY3J5cHRlZFdhbGxldEtleWNoYWluRm9yV2FsbGV0U2hhcmluZygpOiBQcm9taXNlPEtleWNoYWluV2l0aEVuY3J5cHRlZFBydj4ge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpID09PSAnbG5idGMnKSB7XG4gICAgICAvLyBsaWdodG5pbmcgY29pbiBkb2VzIG5vdCB1c2UgdXNlciBrZXkgdG8gc2lnbiB0aGUgdHJhbnNhY3Rpb25zIGZyb20gU0RLLlxuICAgICAgLy8gaXQgdXNlcyB1c2VyIGF1dGgga2V5IGluc3RlYWQuXG4gICAgICByZXR1cm4gYXdhaXQgZ2V0TGlnaHRuaW5nQXV0aEtleSh0aGlzLCAndXNlckF1dGgnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYW5kIGRlY3J5cHRzIHRoZSB3YWxsZXQga2V5Y2hhaW4gZm9yIHNoYXJpbmcuXG4gICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgdGhlIGtleWNoYWluIG9uY2UgYW5kIGRlY3J5cHRzIGl0LCByZXR1cm5pbmcgdGhlIGRlY3J5cHRlZFxuICAgKiBwcml2YXRlIGtleSBhbmQgcHVibGljIGtleSBpbmZvIG5lZWRlZCBmb3Igc2hhcmluZyB3aXRoIG11bHRpcGxlIHVzZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSAtIFRoZSBwYXNzcGhyYXNlIHRvIGRlY3J5cHQgdGhlIGtleWNoYWluXG4gICAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIGRlY3J5cHRlZCBwcnYgYW5kIHB1Yiwgb3IgdW5kZWZpbmVkIGZvciBjb2xkIHdhbGxldHNcbiAgICovXG4gIGFzeW5jIGdldERlY3J5cHRlZEtleWNoYWluRm9yU2hhcmluZyhcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxEZWNyeXB0ZWRLZXljaGFpbkRhdGEgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBrZXljaGFpbiA9IGF3YWl0IHRoaXMuZ2V0RW5jcnlwdGVkV2FsbGV0S2V5Y2hhaW5Gb3JXYWxsZXRTaGFyaW5nKCk7XG5cbiAgICBpZiAoIWtleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoIXdhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyB3YWxsZXRQYXNzcGhyYXNlIGFyZ3VtZW50Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJ2ID0gYXdhaXQgZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleUFzeW5jKHRoaXMuYml0Z28sIGtleWNoYWluLCB3YWxsZXRQYXNzcGhyYXNlKTtcbiAgICBpZiAoIXBydikge1xuICAgICAgdGhyb3cgbmV3IEluY29ycmVjdFBhc3N3b3JkRXJyb3IoJ1Bhc3N3b3JkIHNoYXJlZCBpcyBpbmNvcnJlY3QgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuXG4gICAgLy8gT25seSBvbmUgb2YgcHViL2NvbW1vblB1Yi9jb21tb25LZXljaGFpbiBzaG91bGQgYmUgcHJlc2VudCBpbiB0aGUga2V5Y2hhaW5cbiAgICBsZXQgcHViID0ga2V5Y2hhaW4ucHViID8/IGtleWNoYWluLmNvbW1vblB1YjtcbiAgICBpZiAoa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHB1YiA9XG4gICAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlZGRzYSdcbiAgICAgICAgICA/IEVkZHNhVXRpbHMuZ2V0UHVibGljS2V5RnJvbUNvbW1vbktleWNoYWluKGtleWNoYWluLmNvbW1vbktleWNoYWluKVxuICAgICAgICAgIDogRWNkc2FVdGlscy5nZXRQdWJsaWNLZXlGcm9tQ29tbW9uS2V5Y2hhaW4oa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgIH1cblxuICAgIGlmICghcHViKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZXRlcm1pbmUgcHVibGljIGtleSBmcm9tIGtleWNoYWluJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcHJ2LCBwdWIgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNyeXB0cyBhIGRlY3J5cHRlZCBwcml2YXRlIGtleSBmb3Igc2hhcmluZyB3aXRoIGEgc3BlY2lmaWMgdXNlci5cbiAgICogVGhpcyBpcyB0aGUgcHVyZSBlbmNyeXB0aW9uIHN0ZXAgLSBubyBBUEkgY2FsbHMsIG5vIGRlY3J5cHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBkZWNyeXB0ZWRQcnYgLSBUaGUgYWxyZWFkeS1kZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHB1YiAtIFRoZSB3YWxsZXQncyBwdWJsaWMga2V5XG4gICAqIEBwYXJhbSB1c2VyUHVia2V5IC0gVGhlIHJlY2lwaWVudCB1c2VyJ3MgcHVibGljIGtleVxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBrZXkgcGF0aFxuICAgKiBAcmV0dXJucyBUaGUgZW5jcnlwdGVkIGtleWNoYWluIGZvciB0aGUgcmVjaXBpZW50IHdpdGggYWxsIHJlcXVpcmVkIGZpZWxkc1xuICAgKi9cbiAgZW5jcnlwdFBydkZvclVzZXIoZGVjcnlwdGVkUHJ2OiBzdHJpbmcsIHB1Yjogc3RyaW5nLCB1c2VyUHVia2V5OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IEJ1bGtXYWxsZXRTaGFyZUtleWNoYWluIHtcbiAgICBjb25zdCBlY2tleSA9IG1ha2VSYW5kb21LZXkoKTtcbiAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoZWNrZXksIEJ1ZmZlci5mcm9tKHVzZXJQdWJrZXksICdoZXgnKSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IG5ld0VuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7IHBhc3N3b3JkOiBzZWNyZXQsIGlucHV0OiBkZWNyeXB0ZWRQcnYgfSk7XG5cbiAgICBjb25zdCBrZXljaGFpbjogQnVsa1dhbGxldFNoYXJlS2V5Y2hhaW4gPSB7XG4gICAgICBwdWIsXG4gICAgICBlbmNyeXB0ZWRQcnY6IG5ld0VuY3J5cHRlZFBydixcbiAgICAgIGZyb21QdWJLZXk6IGVja2V5LnB1YmxpY0tleS50b1N0cmluZygnaGV4JyksXG4gICAgICB0b1B1YktleTogdXNlclB1YmtleSxcbiAgICAgIHBhdGg6IHBhdGgsXG4gICAgfTtcblxuICAgIGFzc2VydChrZXljaGFpbi5wdWIsICdwdWIgbXVzdCBiZSBkZWZpbmVkIGZvciBzaGFyaW5nJyk7XG4gICAgYXNzZXJ0KGtleWNoYWluLmVuY3J5cHRlZFBydiwgJ2VuY3J5cHRlZFBydiBtdXN0IGJlIGRlZmluZWQgZm9yIHNoYXJpbmcnKTtcbiAgICBhc3NlcnQoa2V5Y2hhaW4uZnJvbVB1YktleSwgJ2Zyb21QdWJLZXkgbXVzdCBiZSBkZWZpbmVkIGZvciBzaGFyaW5nJyk7XG4gICAgYXNzZXJ0KGtleWNoYWluLnRvUHViS2V5LCAndG9QdWJLZXkgbXVzdCBiZSBkZWZpbmVkIGZvciBzaGFyaW5nJyk7XG4gICAgYXNzZXJ0KGtleWNoYWluLnBhdGgsICdwYXRoIG11c3QgYmUgZGVmaW5lZCBmb3Igc2hhcmluZycpO1xuXG4gICAgcmV0dXJuIGtleWNoYWluO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGEga2V5Y2hhaW4gZm9yIHNoYXJpbmcgd2l0aCBhbm90aGVyIHVzZXIuXG4gICAqIEZldGNoZXMgdGhlIHdhbGxldCBrZXljaGFpbiwgZGVjcnlwdHMgaXQsIGFuZCBlbmNyeXB0cyBpdCBmb3IgdGhlIHJlY2lwaWVudC5cbiAgICpcbiAgICogQHBhcmFtIHdhbGxldFBhc3NwaHJhc2UgLSBUaGUgcGFzc3BocmFzZSB0byBkZWNyeXB0IHRoZSBrZXljaGFpblxuICAgKiBAcGFyYW0gcHVia2V5IC0gVGhlIHJlY2lwaWVudCdzIHB1YmxpYyBrZXlcbiAgICogQHBhcmFtIHBhdGggLSBUaGUga2V5IHBhdGhcbiAgICogQHJldHVybnMgVGhlIGVuY3J5cHRlZCBrZXljaGFpbiBmb3IgdGhlIHJlY2lwaWVudFxuICAgKi9cbiAgYXN5bmMgcHJlcGFyZVNoYXJlZEtleWNoYWluKFxuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJrZXk6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxTaGFyZWRLZXlDaGFpbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWNyeXB0ZWRLZXljaGFpbiA9IGF3YWl0IHRoaXMuZ2V0RGVjcnlwdGVkS2V5Y2hhaW5Gb3JTaGFyaW5nKHdhbGxldFBhc3NwaHJhc2UpO1xuICAgICAgaWYgKCFkZWNyeXB0ZWRLZXljaGFpbikge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5lbmNyeXB0UHJ2Rm9yVXNlcihkZWNyeXB0ZWRLZXljaGFpbi5wcnYsIGRlY3J5cHRlZEtleWNoYWluLnB1YiwgcHVia2V5LCBwYXRoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIE1pc3NpbmdFbmNyeXB0ZWRLZXljaGFpbkVycm9yKSB7XG4gICAgICAgIC8vIGlnbm9yZSB0aGlzIGVycm9yIGJlY2F1c2UgdGhpcyBsb29rcyBsaWtlIGEgY29sZCB3YWxsZXRcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgdGhpcyB3YWxsZXQgd2l0aCBhbm90aGVyIEJpdEdvIHVzZXIuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzaGFyZVdhbGxldChwYXJhbXM6IFNoYXJlV2FsbGV0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2VtYWlsJywgJ3Blcm1pc3Npb25zJ10sIFsnd2FsbGV0UGFzc3BocmFzZScsICdtZXNzYWdlJ10pO1xuICAgIGlmIChwYXJhbXMucmVzaGFyZSAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMucmVzaGFyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVzaGFyZSB0byBiZSBhIGJvb2xlYW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5za2lwS2V5Y2hhaW4gIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnNraXBLZXljaGFpbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc2tpcEtleWNoYWluIHRvIGJlIGEgYm9vbGVhbi4gJyk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIG11bHRpLWtleS11c2VyLWtleSBPRkMgd2FsbGV0XG4gICAgLy8gRm9yIG11bHRpLWtleS11c2VyLWtleSB3YWxsZXRzLCBza2lwIGtleWNoYWluIHByZXBhcmF0aW9uIHJlZ2FyZGxlc3Mgb2Ygb3RoZXIgY29uZGl0aW9uc1xuICAgIGNvbnN0IG5lZWRzS2V5Y2hhaW4gPVxuICAgICAgIXRoaXMuaXNNdWx0aVVzZXJLZXlXYWxsZXQoKSAmJlxuICAgICAgIXBhcmFtcy5za2lwS2V5Y2hhaW4gJiZcbiAgICAgIHBhcmFtcy5wZXJtaXNzaW9ucyAmJlxuICAgICAgcGFyYW1zLnBlcm1pc3Npb25zLmluZGV4T2YoJ3NwZW5kJykgIT09IC0xO1xuXG4gICAgaWYgKHBhcmFtcy5kaXNhYmxlRW1haWwgIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmRpc2FibGVFbWFpbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZGlzYWJsZUVtYWlsIHRvIGJlIGEgYm9vbGVhbi4nKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmVtYWlsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgZW1haWwnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaGFyaW5nID0gKGF3YWl0IHRoaXMuYml0Z28uZ2V0U2hhcmluZ0tleSh7XG4gICAgICBlbWFpbDogcGFyYW1zLmVtYWlsLnRvTG93ZXJDYXNlKCksXG4gICAgfSkpIGFzIGFueTtcbiAgICBsZXQgc2hhcmVkS2V5Y2hhaW47XG4gICAgaWYgKG5lZWRzS2V5Y2hhaW4pIHtcbiAgICAgIHNoYXJlZEtleWNoYWluID0gYXdhaXQgdGhpcy5wcmVwYXJlU2hhcmVkS2V5Y2hhaW4ocGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIHNoYXJpbmcucHVia2V5LCBzaGFyaW5nLnBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IENyZWF0ZVNoYXJlT3B0aW9ucyA9IHtcbiAgICAgIHVzZXI6IHNoYXJpbmcudXNlcklkLFxuICAgICAgcGVybWlzc2lvbnM6IHBhcmFtcy5wZXJtaXNzaW9ucyxcbiAgICAgIHJlc2hhcmU6IHBhcmFtcy5yZXNoYXJlLFxuICAgICAgbWVzc2FnZTogcGFyYW1zLm1lc3NhZ2UsXG4gICAgICBkaXNhYmxlRW1haWw6IHBhcmFtcy5kaXNhYmxlRW1haWwsXG4gICAgICBza2lwS2V5Y2hhaW46IE9iamVjdC5rZXlzKHNoYXJlZEtleWNoYWluID8/IHt9KS5sZW5ndGggPT09IDAsXG4gICAgICBrZXljaGFpbjogT2JqZWN0LmtleXMoc2hhcmVkS2V5Y2hhaW4gPz8ge30pLmxlbmd0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHNoYXJlZEtleWNoYWluLFxuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVTaGFyZShvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdXNlciBmcm9tIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIC0gdXNlcklkIElkIG9mIHRoZSB1c2VyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlVXNlcihwYXJhbXM6IFJlbW92ZVVzZXJPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXNlcklkJ10sIFtdKTtcblxuICAgIGNvbnN0IHVzZXJJZCA9IHBhcmFtcy51c2VySWQ7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvdXNlci8nICsgdXNlcklkKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSB0cmFuc2FjdGlvbiBwcmVidWlsZCAodW5zaWduZWQgdHJhbnNhY3Rpb24pIGZyb20gQml0R29cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICAgKiBAcGFyYW0ge3thZGRyZXNzOiBzdHJpbmcsIGFtb3VudDogc3RyaW5nfX0gcGFyYW1zLnJlY2lwaWVudHMgLSBsaXN0IG9mIHJlY2lwaWVudHMgYW5kIG5lY2Vzc2FyeSByZWNpcGllbnQgaW5mb3JtYXRpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5udW1CbG9ja3MgLSBFc3RpbWF0ZXMgdGhlIGFwcHJveGltYXRlIGZlZSBwZXIga2lsb2J5dGUgbmVjZXNzYXJ5IGZvciBhIHRyYW5zYWN0aW9uIGNvbmZpcm1hdGlvbiB3aXRoaW4gbnVtQmxvY2tzIGJsb2Nrc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSB0aGUgZGVzaXJlZCBmZWVSYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gYmFzZSB1bml0cy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBiYXNlIHVuaXRzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBNaW5pbXVtIG51bWJlciBvZiBjb25maXJtYXRpb25zIHVuc3BlbnRzIGdvaW5nIGludG8gdGhpcyB0cmFuc2FjdGlvbiBzaG91bGQgaGF2ZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBFbmZvcmNlIG1pbmltdW0gbnVtYmVyIG9mIGNvbmZpcm1hdGlvbnMgb24gY2hhbmdlIChpbnRlcm5hbCkgaW5wdXRzLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzIC0gVGhlIGRlc2lyZWQgY291bnQgb2YgdW5zcGVudHMgaW4gdGhlIHdhbGxldC4gSWYgdGhlIHdhbGxldOKAmXMgY3VycmVudCB1bnNwZW50IGNvdW50IGlzIGxvd2VyIHRoYW4gdGhlIHRhcmdldCwgdXAgdG8gZm91ciBhZGRpdGlvbmFsIGNoYW5nZSBvdXRwdXRzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gSWdub3JlIHVuc3BlbnRzIHNtYWxsZXIgdGhhbiB0aGlzIGFtb3VudCBvZiBiYXNlIHVuaXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgbGFyZ2VyIHRoYW4gdGhpcyBhbW91bnQgb2YgYmFzZSB1bml0c1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnNlcXVlbmNlSWQgLSBUaGUgc2VxdWVuY2UgSUQgb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGFzdExlZGdlclNlcXVlbmNlIC0gQWJzb2x1dGUgbWF4IGxlZGdlciB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGVkZ2VyU2VxdWVuY2VEZWx0YSAtIFJlbGF0aXZlIGxlZGdlciBoZWlnaHQgKGluIHJlbGF0aW9uIHRvIHRoZSBjdXJyZW50IGxlZGdlcikgdGhhdCB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZ2FzUHJpY2UgLSBDdXN0b20gZ2FzIHByaWNlIHRvIGJlIHVzZWQgZm9yIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZ2FzTGltaXQgLSBDdXN0b20gZ2FzIGxpbWl0IHRvIGJlIHVzZWQgZm9yIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLm5vU3BsaXRDaGFuZ2UgLSBTZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIGF1dG9tYXRpYyBjaGFuZ2Ugc3BsaXR0aW5nIGZvciBwdXJwb3NlcyBvZiB1bnNwZW50IG1hbmFnZW1lbnRcbiAgICogQHBhcmFtIHtBcnJheX0gcGFyYW1zLnVuc3BlbnRzIC0gVGhlIHVuc3BlbnRzIHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb24uIEVhY2ggdW5zcGVudCBzaG91bGQgYmUgaW4gdGhlIGZvcm0gcHJldlR4SWQ6bk91dHB1dFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmNoYW5nZUFkZHJlc3MgLSBTcGVjaWZpZXMgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBjaGFuZ2Ugb3V0cHV0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLm5vblBhcnRpY2lwYXRpb24gLSAoQWxnb3JhbmQpIE5vbiBwYXJ0aWNpcGF0aW5nIGtleSByZWcgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy52YWxpZEZyb21CbG9jayAtIChBbGdvcmFuZCkgVGhlIG1pbmltdW0gcm91bmQgdGhpcyB3aWxsIHJ1biBvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnZhbGlkVG9CbG9jayAtIChBbGdvcmFuZCkgVGhlIG1heGltdW0gcm91bmQgdGhpcyB3aWxsIHJ1biBvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5pbnN0YW50IC0gQnVpbGQgdGhpcyB0cmFuc2FjdGlvbiB0byBjb25mb3JtIHdpdGggaW5zdGFudCBzZW5kaW5nIGNvaW4tc3BlY2lmaWMgbWV0aG9kIChpZiBhdmFpbGFibGUpXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmtlZXBBbGl2ZSAtIChQb2xrYWRvdCkga2VlcCBhZGRyZXNzIGFsaXZlIGJ5IHNlbmRpbmcgdGhlIGFkZHJlc3MgbWluaW11bSBmdW5kaW5nIGFtb3VudCwgdXNlZCBkdXJpbmcgd2FsbGV0IGNvbnNvbGlkYXRpb24sIHRydWUgYnkgZGVmYXVsdFxuICAgKiBAcGFyYW0ge3t2YWx1ZTogU3RyaW5nLCB0eXBlOiBTdHJpbmd9fSBwYXJhbXMubWVtbyAtIE1lbW8gdG8gdXNlIGluIHRyYW5zYWN0aW9uIChzdXBwb3J0ZWQgYnkgU3RlbGxhcilcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtLnRyYW5zZmVySWQgLSB0cmFuc2ZlciBJZCB0byB1c2UgaW4gdHJhbnNhY3Rpb24gKHN1cHBvcnRlZCBieSBjYXNwZXIpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYWRkcmVzc1R5cGUgLSBUaGUgdHlwZSBvZiBhZGRyZXNzIHRvIGNyZWF0ZSBmb3IgY2hhbmdlLiBPbmUgb2YgYHAyc2hgLCBgcDJzaFAyd3NoYCwgYW5kIGBwMndzaGAuIENhc2Utc2Vuc2l0aXZlLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ob3AgLSBCdWlsZCB0aGlzIGFzIGFuIEV0aGVyZXVtIGhvcCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zLnJlc2VydmF0aW9uIC0gT2JqZWN0IHRvIHJlc2VydmUgdGhlIHVuc3BlbnRzIHRoYXQgdGhpcyB0eCBidWlsZCB1c2VzLiBGb3JtYXQgaXMgcmVzZXJ2YXRpb24gPSB7IGV4cGlyZVRpbWU6IElTT0RhdGVTdHJpbmcsIHBlbmRpbmdBcHByb3ZhbElkOiBTdHJpbmcgfVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgVGhlIHBhc3NwaHJhc2UgdG8gdGhlIHdhbGxldCB1c2VyIGtleSwgdG8gc2lnbiBjb21taXRtZW50IGRhdGEgZm9yIEV0aGVyZXVtIGhvcCB0cmFuc2FjdGlvbnNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MgLSBUaGUgY29udHJhY3QgYWRkcmVzcyB1c2VkIGFzIHRoZSBcInRvXCIgZmllbGQgb2YgYSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHByZWJ1aWxkVHJhbnNhY3Rpb24ocGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uVHhSZXF1ZXN0cyhwYXJhbXMpO1xuICAgIH1cblxuICAgIC8vIFdoaXRlbGlzdCBwYXJhbXMgdG8gYnVpbGQgdHhcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IHRoaXMuYmFzZUNvaW4ucHJlcHJvY2Vzc0J1aWxkUGFyYW1zKF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpKSk7XG4gICAgZGVidWcoJ3ByZWJ1aWxkaW5nIHRyYW5zYWN0aW9uOiAlTycsIHdoaXRlbGlzdGVkUGFyYW1zKTtcblxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cbiAgICBjb25zdCBleHRyYVBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uZ2V0RXh0cmFQcmVidWlsZFBhcmFtcyhPYmplY3QuYXNzaWduKHBhcmFtcywgeyB3YWxsZXQ6IHRoaXMgfSkpO1xuICAgIE9iamVjdC5hc3NpZ24od2hpdGVsaXN0ZWRQYXJhbXMsIGV4dHJhUGFyYW1zKTtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHtcbiAgICAgIG9mZmxpbmVWZXJpZmljYXRpb246IHBhcmFtcy5vZmZsaW5lVmVyaWZpY2F0aW9uID8gdHJ1ZSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgY29uc3QgYnVpbGRRdWVyeSA9IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L2J1aWxkJykpXG4gICAgICAucXVlcnkocXVlcnlQYXJhbXMpXG4gICAgICAuc2VuZCh3aGl0ZWxpc3RlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcblxuICAgIGNvbnN0IGJsb2NrSGVpZ2h0UXVlcnkgPSBfLmlzRnVuY3Rpb24oKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5nZXRMYXRlc3RCbG9ja0hlaWdodClcbiAgICAgID8gKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5nZXRMYXRlc3RCbG9ja0hlaWdodChwYXJhbXMucmVxSWQpXG4gICAgICA6IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIGNvbnN0IHF1ZXJpZXMgPSBbYnVpbGRRdWVyeSwgYmxvY2tIZWlnaHRRdWVyeV07XG4gICAgY29uc3QgW2J1aWxkUmVzcG9uc2UsIGJsb2NrSGVpZ2h0XSA9IChhd2FpdCBQcm9taXNlLmFsbChxdWVyaWVzKSkgYXMgYW55O1xuICAgIGRlYnVnKCdwb3N0cHJvY2Vzc2luZyB0cmFuc2FjdGlvbiBwcmVidWlsZDogJU8nLCBidWlsZFJlc3BvbnNlKTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYmxvY2tIZWlnaHQpKSB7XG4gICAgICBidWlsZFJlc3BvbnNlLmJsb2NrSGVpZ2h0ID0gYmxvY2tIZWlnaHQ7XG4gICAgfVxuICAgIGxldCBwcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZCA9IChhd2FpdCB0aGlzLmJhc2VDb2luLnBvc3RQcm9jZXNzUHJlYnVpbGQoXG4gICAgICBPYmplY3QuYXNzaWduKGJ1aWxkUmVzcG9uc2UsIHtcbiAgICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgICBidWlsZFBhcmFtczogd2hpdGVsaXN0ZWRQYXJhbXMsXG4gICAgICB9KVxuICAgICkpIGFzIGFueTtcbiAgICBkZWxldGUgcHJlYnVpbGQud2FsbGV0O1xuICAgIGRlbGV0ZSBwcmVidWlsZC5idWlsZFBhcmFtcztcbiAgICBwcmVidWlsZCA9IF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwgeyB3YWxsZXRJZDogdGhpcy5pZCgpIH0pO1xuICAgIGlmICh0aGlzLl93YWxsZXQgJiYgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYyAmJiAhcGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcykge1xuICAgICAgcHJlYnVpbGQgPSBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHtcbiAgICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLmJhc2VBZGRyZXNzLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHByZWJ1aWxkID0gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHJlcUlkOiBwYXJhbXMucmVxSWQgfSk7XG4gICAgZGVidWcoJ2ZpbmFsIHRyYW5zYWN0aW9uIHByZWJ1aWxkOiAlTycsIHByZWJ1aWxkKTtcbiAgICByZXR1cm4gcHJlYnVpbGQgYXMgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBVc2VyIEtleWNoYWluIGFuZCBzaWduIGEgVFNTIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB0eFJlcXVlc3RJZCBUaGUgdHJhbnNhY3Rpb24gcmVxdWVzdCBpZFxuICAgKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSBUaGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHJldHVybiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPlxuICAgKi9cbiAgYXN5bmMgZ2V0VXNlcktleUFuZFNpZ25Uc3NUcmFuc2FjdGlvbih7XG4gICAgdHhSZXF1ZXN0SWQsXG4gICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgfToge1xuICAgIHR4UmVxdWVzdElkOiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdnZXRVc2VyS2V5QW5kU2lnblRzc1RyYW5zYWN0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgIH1cbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgLy8gRG9pbmcgYSBzYW5pdHkgY2hlY2sgZm9yIHBhc3N3b3JkIGhlcmUgdG8gYXZvaWQgZG9pbmcgZnVydGhlciB3b3JrIGlmIHdlIGtub3cgaXQncyB3cm9uZ1xuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICAgIHJlcUlkLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBrZXljaGFpbnNbMF07XG4gICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgIXVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGhlIHVzZXIga2V5Y2hhaW4gZG9lcyBub3QgaGF2ZSBwcm9wZXJ0eSBlbmNyeXB0ZWRQcnYnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgdHhQcmVidWlsZDogeyB0eFJlcXVlc3RJZCB9LFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIHJlcUlkLFxuICAgICAga2V5Y2hhaW46IHVzZXJLZXljaGFpbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHR4UHJlYnVpbGRcbiAgICogLSBba2V5Y2hhaW4gLyBrZXldIChvYmplY3QpIG9yIHBydiAoc3RyaW5nKVxuICAgKiAtIHdhbGxldFBhc3NwaHJhc2VcbiAgICogLSB2ZXJpZnlUeFBhcmFtcyAob3B0aW9uYWwpIC0gd2hlbiBwcm92aWRlZCwgdGhlIHRyYW5zYWN0aW9uIHdpbGwgYmUgdmVyaWZpZWQgYmVmb3JlIHNpZ25pbmdcbiAgICogICAtIHR4UGFyYW1zOiB0cmFuc2FjdGlvbiBwYXJhbWV0ZXJzIHVzZWQgZm9yIHZlcmlmaWNhdGlvblxuICAgKiAgIC0gdmVyaWZpY2F0aW9uOiBvcHRpb25hbCB2ZXJpZmljYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uKHBhcmFtczogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbiB8IFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHsgdHhQcmVidWlsZCwgYXBpVmVyc2lvbiwgdHhSZXF1ZXN0SWQgfSA9IHBhcmFtcztcblxuICAgIGlmIChcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tQ29tbWl0bWVudEdlbmVyYXRpbmdGdW5jdGlvbikgJiZcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tR1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pXG4gICAgKSB7XG4gICAgICAvLyBpbnZva2UgZXh0ZXJuYWwgc2lnbmVyIFRTUyBmb3IgRWREU0Egd29ya2Zsb3dcbiAgICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRWREU0EocGFyYW1zLCB0aGlzLmJhc2VDb2luKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVBhaWxsaWVyTW9kdWx1c0dlbmVyYXRpbmdGdW5jdGlvbikgJiZcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVNTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbilcbiAgICApIHtcbiAgICAgIC8vIGludm9rZSBleHRlcm5hbCBzaWduZXIgVFNTIGZvciBFQ0RTQSB3b3JrZmxvd1xuICAgICAgcmV0dXJuIHRoaXMuc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFQ0RTQSh0aGlzLmJhc2VDb2luLCBwYXJhbXMpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdGlvbkZ1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0aW9uRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRpb25GdW5jdGlvbilcbiAgICApIHtcbiAgICAgIC8vIGludm9rZSBleHRlcm5hbCBzaWduZXIgVFNTIGZvciBFQ0RTQSBNUEN2MndvcmtmbG93XG4gICAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb25Uc3NFeHRlcm5hbFNpZ25lckVDRFNBTVBDdjIodGhpcy5iYXNlQ29pbiwgcGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAoIXR4UHJlYnVpbGQgfHwgdHlwZW9mIHR4UHJlYnVpbGQgIT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aXNpZ1R5cGUoKSA9PT0gJ29uY2hhaW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndHhQcmVidWlsZCBpcyByZXF1aXJlZCBmb3Igb24tY2hhaW4gbXVsdGlzaWcgd2FsbGV0cycpO1xuICAgICAgfVxuICAgICAgaWYgKCF0eFJlcXVlc3RJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UHJlYnVpbGQgb3IgdHhSZXF1ZXN0SWQgaXMgcmVxdWlyZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgICB9XG4gICAgICAvLyBXZSBvbmx5IGRvIHRoaXMgaWYgd2UncmUgbm90IHVzaW5nIHRoZSBleHRlcm5hbCBzaWduZXIgVFNTIGZsb3dcbiAgICAgIHBhcmFtcy50eFByZWJ1aWxkID0geyB0eFJlcXVlc3RJZCB9O1xuICAgIH1cblxuICAgIC8vIFZlcmlmeSB0cmFuc2FjdGlvbiBpZiB2ZXJpZnlUeFBhcmFtcyBpcyBwcm92aWRlZFxuICAgIGlmIChwYXJhbXMudmVyaWZ5VHhQYXJhbXMgJiYgdHhQcmVidWlsZD8udHhIZXgpIHtcbiAgICAgIGNvbnN0IHZlcmlmeVBhcmFtcyA9IHtcbiAgICAgICAgdHhQcmVidWlsZDogeyAuLi50eFByZWJ1aWxkIH0sXG4gICAgICAgIHR4UGFyYW1zOiBwYXJhbXMudmVyaWZ5VHhQYXJhbXMudHhQYXJhbXMsXG4gICAgICAgIHdhbGxldDogdGhpcyBhcyBJV2FsbGV0LFxuICAgICAgICB2ZXJpZmljYXRpb246IHBhcmFtcy52ZXJpZnlUeFBhcmFtcy52ZXJpZmljYXRpb24sXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgIHdhbGxldFR5cGU6IHRoaXMubXVsdGlzaWdUeXBlKCkgYXMgJ29uY2hhaW4nIHwgJ3RzcycsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB0aGlzLmJhc2VDb2luLnZlcmlmeVRyYW5zYWN0aW9uKHZlcmlmeVBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgJiZcbiAgICAgICEocGFyYW1zLmtleWNoYWluIHx8IHBhcmFtcy5rZXkpICYmXG4gICAgICAodGhpcy50eXBlKCkgPT09ICdob3QnIHx8IHRoaXMudHlwZSgpID09PSB1bmRlZmluZWQpXG4gICAgKSB7XG4gICAgICAvLyB0aGlzIGxvZ2ljIHNob3VsZCBvbmx5IGFwcGx5IHRvIGhvdCB3YWxsZXRzXG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0UGFzc3BocmFzZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmdldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZSh7XG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBrZXljaGFpbnNbMF07XG4gICAgICBpZiAoIXVzZXJLZXljaGFpbiB8fCAhdXNlcktleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZSB1c2VyIGtleWNoYWluIGRvZXMgbm90IGhhdmUgcHJvcGVydHkgZW5jcnlwdGVkUHJ2Jyk7XG4gICAgICB9XG4gICAgICBwYXJhbXMua2V5Y2hhaW4gPSB1c2VyS2V5Y2hhaW47XG4gICAgfVxuXG4gICAgY29uc3QgcHJlc2lnbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ucHJlc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHdhbGxldERhdGE6IHRoaXMuX3dhbGxldCxcbiAgICAgIHRzc1V0aWxzOiB0aGlzLnRzc1V0aWxzLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb25Uc3Moe1xuICAgICAgICAuLi5wcmVzaWduLFxuICAgICAgICBwcnY6IGF3YWl0IHRoaXMuZ2V0VXNlclBydkFzeW5jKHByZXNpZ24gYXMgR2V0VXNlclBydk9wdGlvbnMpLFxuICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IHsgcHVicyB9ID0gcGFyYW1zO1xuICAgIGlmICghcHVicyAmJiB0aGlzLmJhc2VDb2luLmtleUlkc0ZvclNpZ25pbmcoKS5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzIH0pO1xuICAgICAgcHVicyA9IGtleWNoYWlucy5tYXAoKGspID0+IHtcbiAgICAgICAgYXNzZXJ0KGsucHViKTtcbiAgICAgICAgcmV0dXJuIGsucHViO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnblRyYW5zYWN0aW9uUGFyYW1zID0ge1xuICAgICAgLi4ucHJlc2lnbixcbiAgICAgIHR4UHJlYnVpbGQ6IHsgLi4udHhQcmVidWlsZCwgd2FsbGV0SWQ6IHRoaXMuaWQoKSB9LFxuICAgICAgcHVicyxcbiAgICAgIGNvaW46IHRoaXMuYmFzZUNvaW4sXG4gICAgfTtcblxuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbikpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5iYXNlQ29pbi5zaWduV2l0aEN1c3RvbVNpZ25pbmdGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhc3NlcnQocHVicywgJ3B1YnMgYXJlIHJlcXVpcmVkIGZvciBjdXN0b20gc2lnbmluZycpO1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5zaWduV2l0aEN1c3RvbVNpZ25pbmdGdW5jdGlvbihwYXJhbXMuY3VzdG9tU2lnbmluZ0Z1bmN0aW9uLCB7XG4gICAgICAgICAgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgICAgIHB1YnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMgfSk7XG4gICAgICBjb25zdCBzaWduVHJhbnNhY3Rpb25QYXJhbXNXaXRoU2VlZCA9IHtcbiAgICAgICAgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgICBkZXJpdmF0aW9uU2VlZDoga2V5c1swXT8uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCxcbiAgICAgIH07XG4gICAgICByZXR1cm4gcGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbihzaWduVHJhbnNhY3Rpb25QYXJhbXNXaXRoU2VlZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICBwcnY6IGF3YWl0IHRoaXMuZ2V0VXNlclBydkFzeW5jKHByZXNpZ24gYXMgR2V0VXNlclBydk9wdGlvbnMpLFxuICAgICAgd2FsbGV0OiB0aGlzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSB0eXBlZCBzdHJ1Y3R1cmVkIGRhdGEgdXNpbmcgVFNTXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHNpZ25UeXBlZERhdGEocGFyYW1zOiBXYWxsZXRTaWduVHlwZWREYXRhT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkTWVzc2FnZT4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5zdXBwb3J0c1NpZ25pbmdUeXBlZERhdGEoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaWduIHR5cGVkIGRhdGEgbm90IHN1cHBvcnRlZCBmb3IgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9YCk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLnR5cGVkRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUeXBlZCBkYXRhIHJlcXVpcmVkYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXNzYWdlIHNpZ25pbmcgb25seSBzdXBwb3J0ZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgfVxuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFSYXcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R5cGVkRGF0YS50eXBlZERhdGFSYXcgbXVzdCBiZSBKU09OIHN0cmluZycpO1xuICAgIH1cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKCh0aGlzLmJhc2VDb2luIGFzIGFueSkuZW5jb2RlVHlwZWREYXRhKSkge1xuICAgICAgcGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFFbmNvZGVkID0gKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5lbmNvZGVUeXBlZERhdGEocGFyYW1zLnR5cGVkRGF0YSk7XG4gICAgfVxuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkOiBwYXJhbXMucmVxSWQgfSk7XG4gICAgY29uc3QgdXNlclBydk9wdGlvbnM6IEdldFVzZXJQcnZPcHRpb25zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICB9O1xuICAgIGFzc2VydChrZXljaGFpbnNbMF0uY29tbW9uS2V5Y2hhaW4sICdVbmFibGUgdG8gZmluZCBjb21tb25LZXljaGFpbiBpbiBrZXljaGFpbnMnKTtcbiAgICBjb25zdCBwcmVzaWduID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgd2FsbGV0RGF0YTogdGhpcy5fd2FsbGV0LFxuICAgICAgdHNzVXRpbHM6IHRoaXMudHNzVXRpbHMsXG4gICAgICBwcnY6IGF3YWl0IHRoaXMuZ2V0VXNlclBydkFzeW5jKHVzZXJQcnZPcHRpb25zKSxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcHViOiBrZXljaGFpbnMubWFwKChrKSA9PiBrLnB1YiksXG4gICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc2lnblR5cGVkRGF0YVRzcyhwcmVzaWduKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAgU2lnbiBhIG1lc3NhZ2UgdXNpbmcgVFNTXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSBNZXNzYWdlXG4gICAqIC0gY3VzdG9kaWFuTWVzc2FnZUlkXG4gICAqL1xuICBhc3luYyBzaWduTWVzc2FnZShwYXJhbXM6IFdhbGxldFNpZ25NZXNzYWdlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRNZXNzYWdlPiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzTWVzc2FnZVNpZ25pbmcoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXNzYWdlIHNpZ25pbmcgbm90IHN1cHBvcnRlZCBmb3IgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9YCk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLm1lc3NhZ2UgfHwgIXBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VTdGFuZGFyZFR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWVzc2FnZSBhbmQgdHlwZSByZXF1aXJlZCB0byBzaWduIG1lc3NhZ2UnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2Ugc2lnbmluZyBvbmx5IHN1cHBvcnRlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICB9XG4gICAgaWYgKF8uaXNGdW5jdGlvbigodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmVuY29kZU1lc3NhZ2UpKSB7XG4gICAgICBwYXJhbXMubWVzc2FnZS5tZXNzYWdlRW5jb2RlZCA9ICh0aGlzLmJhc2VDb2luIGFzIGFueSkuZW5jb2RlTWVzc2FnZShwYXJhbXMubWVzc2FnZS5tZXNzYWdlUmF3KTtcbiAgICB9XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQ6IHBhcmFtcy5yZXFJZCB9KTtcbiAgICBjb25zdCB1c2VyUHJ2T3B0aW9uczogR2V0VXNlclBydk9wdGlvbnMgPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgIH07XG4gICAgYXNzZXJ0KGtleWNoYWluc1swXS5jb21tb25LZXljaGFpbiwgJ1VuYWJsZSB0byBmaW5kIGNvbW1vbktleWNoYWluIGluIGtleWNoYWlucycpO1xuICAgIGNvbnN0IHByZXNpZ24gPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICB3YWxsZXREYXRhOiB0aGlzLl93YWxsZXQsXG4gICAgICB0c3NVdGlsczogdGhpcy50c3NVdGlscyxcbiAgICAgIHBydjogYXdhaXQgdGhpcy5nZXRVc2VyUHJ2QXN5bmModXNlclBydk9wdGlvbnMpLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIGJhY2t1cEtleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMSA/IGtleWNoYWluc1sxXSA6IG51bGwsXG4gICAgICBiaXRnb0tleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMiA/IGtleWNoYWluc1syXSA6IG51bGwsXG4gICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc2lnbk1lc3NhZ2VUc3MocHJlc2lnbik7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYW5kIGNyZWF0ZXMgYSBzaWduIG1lc3NhZ2UgcmVxdWVzdCBmb3IgVFNTIHdhbGxldHMsIHRoYXQgY2FuIGJlIHVzZWQgbGF0ZXIgZm9yIHNpZ25pbmcuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciBjcmVhdGluZyB0aGUgc2lnbiBtZXNzYWdlIHJlcXVlc3RcbiAgICogQHJldHVybnMgUHJvbWlzZTxUeFJlcXVlc3Q+IC0gVGhlIGNyZWF0ZWQgdHJhbnNhY3Rpb24gcmVxdWVzdCBmb3Igc2lnbmluZyBhIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIGJ1aWxkU2lnbk1lc3NhZ2VSZXF1ZXN0KHBhcmFtczogV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSAhPT0gJ3RzcycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBzaWduaW5nIG9ubHkgc3VwcG9ydGVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5iYXNlQ29pbi5zdXBwb3J0c01lc3NhZ2VTaWduaW5nKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWVzc2FnZSBzaWduaW5nIG5vdCBzdXBwb3J0ZWQgZm9yICR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfWApO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLm1lc3NhZ2U/Lm1lc3NhZ2VSYXcgfHwgIXBhcmFtcy5tZXNzYWdlPy5tZXNzYWdlU3RhbmRhcmRUeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UgYW5kIHR5cGUgcmVxdWlyZWQgdG8gY3JlYXRlIG1lc3NhZ2Ugc2lnbiByZXF1ZXN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2VSYXcgPSBwYXJhbXMubWVzc2FnZS5tZXNzYWdlUmF3O1xuICAgIGNvbnN0IG1lc3NhZ2VTdGFuZGFyZFR5cGUgPSBwYXJhbXMubWVzc2FnZS5tZXNzYWdlU3RhbmRhcmRUeXBlO1xuXG4gICAgY29uc3QgcmVxSWQgPSBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbnRlbnRPcHRpb246IEludGVudE9wdGlvbnNGb3JNZXNzYWdlID0ge1xuICAgICAgICBjdXN0b2RpYW5NZXNzYWdlSWQ6IHBhcmFtcy5jdXN0b2RpYW5NZXNzYWdlSWQsXG4gICAgICAgIHJlcUlkLFxuICAgICAgICBpbnRlbnRUeXBlOiAnc2lnbk1lc3NhZ2UnLFxuICAgICAgICBpc1RzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZVJhdyxcbiAgICAgICAgbWVzc2FnZVN0YW5kYXJkVHlwZSxcbiAgICAgICAgc2lnbmVyQWRkcmVzczogcGFyYW1zLm1lc3NhZ2Uuc2lnbmVyQWRkcmVzcyxcbiAgICAgIH07XG5cbiAgICAgIGlmICghdGhpcy50c3NVdGlscykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RTUyB1dGlsaXRpZXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRzc1V0aWxzLmJ1aWxkU2lnbk1lc3NhZ2VSZXF1ZXN0KGludGVudE9wdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBtZXNzYWdlIHNpZ24gcmVxdWVzdDogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1c2VyIHByaXZhdGUga2V5IGZyb20gZWl0aGVyIGEgZGVyaXZhdGlvbiBvciBhbiBlbmNyeXB0ZWQga2V5Y2hhaW4gKHN5bmMsIHYxIG9ubHkpLlxuICAgKiBAcGFyYW0gW3BhcmFtcy5rZXljaGFpbiAvIHBhcmFtcy5rZXldIChvYmplY3QpIG9yIHBhcmFtcy5wcnYgKHN0cmluZylcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIChzdHJpbmcpXG4gICAqL1xuICBnZXRVc2VyUHJ2KHBhcmFtczogR2V0VXNlclBydk9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gICAgY29uc3QgdXNlcktleWNoYWluID0gcGFyYW1zLmtleWNoYWluIHx8IHBhcmFtcy5rZXk7XG4gICAgbGV0IHVzZXJQcnYgPSBwYXJhbXMucHJ2O1xuICAgIGlmICh1c2VyUHJ2ICYmIHR5cGVvZiB1c2VyUHJ2ICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcnYgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyYW1zLmtleWNoYWluICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5rZXljaGFpbi5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICdvbmNoYWluJ1xuICAgICkge1xuICAgICAgcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCA9IHBhcmFtcy5rZXljaGFpbi5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkO1xuICAgIH1cblxuICAgIGlmICh1c2VyUHJ2ICYmIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQpIHtcbiAgICAgIGNvbnN0IGRlcml2YXRpb24gPSB0aGlzLmJhc2VDb2luLmRlcml2ZUtleVdpdGhTZWVkKHtcbiAgICAgICAga2V5OiB1c2VyUHJ2LFxuICAgICAgICBzZWVkOiBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkLFxuICAgICAgfSk7XG4gICAgICB1c2VyUHJ2ID0gZGVyaXZhdGlvbi5rZXk7XG4gICAgfSBlbHNlIGlmICghdXNlclBydikge1xuICAgICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgdHlwZW9mIHVzZXJLZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgdXNlckVuY3J5cHRlZFBydiA9IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnY7XG4gICAgICBpZiAoIXVzZXJFbmNyeXB0ZWRQcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiBkb2VzIG5vdCBoYXZlIHByb3BlcnR5IGVuY3J5cHRlZFBydicpO1xuICAgICAgfVxuICAgICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldFBhc3NwaHJhc2UgcHJvcGVydHkgbWlzc2luZycpO1xuICAgICAgfVxuICAgICAgdXNlclBydiA9IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkodGhpcy5iaXRnbywgdXNlcktleWNoYWluLCBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSk7XG4gICAgICBpZiAoIXVzZXJQcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gZGVjcnlwdCB1c2VyIGtleWNoYWluJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1c2VyUHJ2O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jIHZlcnNpb24gb2YgZ2V0VXNlclBydiB0aGF0IHN1cHBvcnRzIGJvdGggdjEgKFNKQ0wpIGFuZCB2MiAoQXJnb24yaWQpIGVudmVsb3Blcy5cbiAgICogQHBhcmFtIFtwYXJhbXMua2V5Y2hhaW4gLyBwYXJhbXMua2V5XSAob2JqZWN0KSBvciBwYXJhbXMucHJ2IChzdHJpbmcpXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAoc3RyaW5nKVxuICAgKi9cbiAgYXN5bmMgZ2V0VXNlclBydkFzeW5jKHBhcmFtczogR2V0VXNlclBydk9wdGlvbnMgPSB7fSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdXNlcktleWNoYWluID0gcGFyYW1zLmtleWNoYWluIHx8IHBhcmFtcy5rZXk7XG4gICAgbGV0IHVzZXJQcnYgPSBwYXJhbXMucHJ2O1xuICAgIGlmICh1c2VyUHJ2ICYmIHR5cGVvZiB1c2VyUHJ2ICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcnYgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyYW1zLmtleWNoYWluICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5rZXljaGFpbi5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICdvbmNoYWluJ1xuICAgICkge1xuICAgICAgcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCA9IHBhcmFtcy5rZXljaGFpbi5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkO1xuICAgIH1cblxuICAgIGlmICh1c2VyUHJ2ICYmIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQpIHtcbiAgICAgIGNvbnN0IGRlcml2YXRpb24gPSB0aGlzLmJhc2VDb2luLmRlcml2ZUtleVdpdGhTZWVkKHtcbiAgICAgICAga2V5OiB1c2VyUHJ2LFxuICAgICAgICBzZWVkOiBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkLFxuICAgICAgfSk7XG4gICAgICB1c2VyUHJ2ID0gZGVyaXZhdGlvbi5rZXk7XG4gICAgfSBlbHNlIGlmICghdXNlclBydikge1xuICAgICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgdHlwZW9mIHVzZXJLZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgdXNlckVuY3J5cHRlZFBydiA9IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnY7XG4gICAgICBpZiAoIXVzZXJFbmNyeXB0ZWRQcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiBkb2VzIG5vdCBoYXZlIHByb3BlcnR5IGVuY3J5cHRlZFBydicpO1xuICAgICAgfVxuICAgICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldFBhc3NwaHJhc2UgcHJvcGVydHkgbWlzc2luZycpO1xuICAgICAgfVxuICAgICAgdXNlclBydiA9IGF3YWl0IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXlBc3luYyh0aGlzLmJpdGdvLCB1c2VyS2V5Y2hhaW4sIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKTtcbiAgICAgIGlmICghdXNlclBydikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBkZWNyeXB0IHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVzZXJQcnY7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgZnJvbSBCaXRHbywgdmFsaWRhdGUgaXQsIGFuZCB0aGVuIGRlY3J5cHQgdGhlIHVzZXIga2V5IGFuZCBzaWduIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBwcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGlmIChwYXJhbXMuZWlwMTU1OSAmJiBwYXJhbXMuZ2FzUHJpY2UpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ09ubHkgb25lIG9mIHBhcmFtcy5laXAxNTU5IGFuZCBwYXJhbXMuZ2FzUHJpY2UgbWF5IGJlIHNwZWNpZmllZCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICdib3RoX2dhc1ByaWNlX2FuZF9laXAxNTU5Z2FzTW9kZWxfc3BlY2lmaWVkJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucHJlYnVpbGRUeCAmJiBwYXJhbXMucmVjaXBpZW50cykge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignT25seSBvbmUgb2YgcHJlYnVpbGRUeCBhbmQgcmVjaXBpZW50cyBtYXkgYmUgc3BlY2lmaWVkJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2JvdGhfcHJlYnVpbGR0eF9hbmRfcmVjaXBpZW50c19zcGVjaWZpZWQnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICYmICFBcnJheS5pc0FycmF5KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignZXhwZWN0aW5nIHJlY2lwaWVudHMgYXJyYXknKTtcbiAgICAgIGVycm9yLmNvZGUgPSAncmVjaXBpZW50c19ub3RfYXJyYXknO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNBcnJheSh0aGlzLl9wZXJtaXNzaW9ucykgJiYgIXRoaXMuX3Blcm1pc3Npb25zLmluY2x1ZGVzKCdzcGVuZCcpKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdubyBzcGVuZCBwZXJtaXNzaW9uIG9uIHRoaXMgd2FsbGV0Jyk7XG4gICAgICBlcnJvci5jb2RlID0gJ3VzZXJfbm90X2FsbG93ZWRfdG9fc3BlbmRfZnJvbV93YWxsZXQnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNlaXZlQWRkcmVzcyAmJiAocGFyYW1zLnR5cGUgPT09ICd0cmFuc2ZlcicgfHwgcGFyYW1zLnR5cGUgPT09ICd0cmFuc2ZlclRva2VuJykpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoYGNhbm5vdCB1c2UgcmVjZWl2ZSBhZGRyZXNzIGZvciBUU1MgdHJhbnNhY3Rpb25zIG9mIHR5cGUgJHtwYXJhbXMudHlwZX1gKTtcbiAgICAgIGVycm9yLmNvZGUgPSAncmVjZWl2ZV9hZGRyZXNzX25vdF9hbGxvd2VkX2Zvcl90c3Nfd2l0aGRyYXdhbHMnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICYmIChwYXJhbXMudHlwZSA9PT0gJ2ZpbGxOb25jZScgfHwgcGFyYW1zLnR5cGUgPT09ICdhY2NlbGVyYXRpb24nKSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcihgY2Fubm90IHByb3ZpZGUgcmVjaXBpZW50cyBmb3IgdHJhbnNhY3Rpb24gdHlwZSAke3BhcmFtcy50eXBlfWApO1xuICAgICAgZXJyb3IuY29kZSA9ICdyZWNpcGllbnRzX25vdF9hbGxvd2VkX2Zvcl9maWxsbm9uY2VfYW5kX2FjY2VsZXJhdGlvbl90eF90eXBlJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmFwaVZlcnNpb24pIHtcbiAgICAgIHZhbGlkYXRlVHhSZXF1ZXN0QXBpVmVyc2lvbih0aGlzLCBwYXJhbXMuYXBpVmVyc2lvbik7XG4gICAgfVxuXG4gICAgLy8gRG9pbmcgYSBzYW5pdHkgY2hlY2sgZm9yIHBhc3N3b3JkIGhlcmUgdG8gYXZvaWQgZG9pbmcgZnVydGhlciB3b3JrIGlmIHdlIGtub3cgaXQncyB3cm9uZ1xuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGN1c3RvbVNpZ25pbmdGdW5jdGlvbjogcGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbixcbiAgICB9KTtcblxuICAgIGxldCB0eFByZWJ1aWxkUXVlcnk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCB8IHN0cmluZz47XG4gICAgaWYgKGlzUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdChwYXJhbXMucHJlYnVpbGRUeCkgJiYgcGFyYW1zLnByZWJ1aWxkVHguYnVpbGRQYXJhbXM/LnByZXZpZXcpIHtcbiAgICAgIC8vIElmIHdlIHByZWJ1aWx0IHRoZSB0eFJlcXVlc3Qgd2l0aCBwcmV2aWV3PXRydWUsIHRoZW4gd2Ugc2hvdWxkIHJlYnVpbGQgd2l0aCBwcmV2aWV3PWZhbHNlIHRvIHBlcnNpc3QgdGhlIHJlcXVlc3RcbiAgICAgIHR4UHJlYnVpbGRRdWVyeSA9IHRoaXMucHJlYnVpbGRUcmFuc2FjdGlvbih7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgLi4ueyAuLi5wYXJhbXMucHJlYnVpbGRUeC5idWlsZFBhcmFtcywgcHJldmlldzogZmFsc2UgfSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eFByZWJ1aWxkUXVlcnkgPSBwYXJhbXMucHJlYnVpbGRUeCA/IFByb21pc2UucmVzb2x2ZShwYXJhbXMucHJlYnVpbGRUeCkgOiB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICB9XG5cbiAgICAvLyB0aGUgcHJlYnVpbGQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgcHJvdmlkaW5nIGFuIGV4cGxpY2l0IHR4XG4gICAgY29uc3QgdHhQcmVidWlsZCA9IChhd2FpdCB0eFByZWJ1aWxkUXVlcnkpIGFzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5iYXNlQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7IC4uLnR4UHJlYnVpbGQuYnVpbGRQYXJhbXMsIC4uLnBhcmFtcyB9LFxuICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICAgIHZlcmlmaWNhdGlvbjogcGFyYW1zLnZlcmlmaWNhdGlvbiA/PyB7fSxcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICAgICAgd2FsbGV0VHlwZTogdGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3RyYW5zYWN0aW9uIHByZWJ1aWxkIGZhaWxlZCBsb2NhbCB2YWxpZGF0aW9uOicsIGUubWVzc2FnZSk7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAndHJhbnNhY3Rpb24gcGFyYW1zOicsXG4gICAgICAgIF8ub21pdChwYXJhbXMsIFsna2V5Y2hhaW4nLCAncHJ2JywgJ3Bhc3NwaHJhc2UnLCAnd2FsbGV0UGFzc3BocmFzZScsICdrZXknLCAnd2FsbGV0J10pXG4gICAgICApO1xuICAgICAgLy8gU2FuaXRpemUgdG8gcmVtb3ZlIF90b2tlbiBmcm9tIGJpdGdvXG4gICAgICBjb25zdCBzYW5pdGl6ZWRQcmVidWlsZCA9IHtcbiAgICAgICAgLi4uXy5vbWl0KHR4UHJlYnVpbGQsIFsnd2FsbGV0J10pLFxuICAgICAgICB3YWxsZXQ6IHtcbiAgICAgICAgICAuLi50aGlzLFxuICAgICAgICAgIGJpdGdvOiBfLm9taXQodGhpcy5iaXRnbywgWydfdG9rZW4nXSksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc29sZS5lcnJvcigndHJhbnNhY3Rpb24gcHJlYnVpbGQ6Jywgc2FuaXRpemVkUHJlYnVpbGQpO1xuICAgICAgY29uc29sZS50cmFjZShlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIC8vIHBhc3Mgb3VyIHRocmVlIGtleXNcbiAgICBjb25zdCBzaWduaW5nUGFyYW1zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgdHhQcmVidWlsZCxcbiAgICAgIHdhbGxldDogdGhpcyxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICB9O1xuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAnb25jaGFpbicpIHtcbiAgICAgIHNpZ25pbmdQYXJhbXMucHVicyA9IGtleWNoYWlucy5tYXAoKGspID0+IHtcbiAgICAgICAgYXNzZXJ0KGsucHViKTtcbiAgICAgICAgcmV0dXJuIGsucHViO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHNpZ25pbmdQYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgYXNzZXJ0KHRoaXMudHNzVXRpbHMsICd0c3NVdGlscyBtdXN0IGJlIGRlZmluZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgICBjb25zdCB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzLmdldFR4UmVxdWVzdChzaWduaW5nUGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQsIHBhcmFtcy5yZXFJZCk7XG4gICAgICBpZiAodGhpcy50c3NVdGlscy5pc1BlbmRpbmdBcHByb3ZhbFR4UmVxdWVzdEZ1bGwodHhSZXF1ZXN0KSkge1xuICAgICAgICByZXR1cm4gdHhSZXF1ZXN0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oc2lnbmluZ1BhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdpbnN1ZmZpY2llbnQgZnVuZHMnKSkge1xuICAgICAgICBlcnJvci5jb2RlID0gJ2luc3VmZmljaWVudF9mdW5kcyc7XG4gICAgICAgIGVycm9yLndhbGxldEJhbGFuY2VzID0ge1xuICAgICAgICAgIGJhbGFuY2VTdHJpbmc6IHRoaXMuYmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIGNvbmZpcm1lZEJhbGFuY2VTdHJpbmc6IHRoaXMuY29uZmlybWVkQmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIHNwZW5kYWJsZUJhbGFuY2VTdHJpbmc6IHRoaXMuc3BlbmRhYmxlQmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIGJhbGFuY2U6IHRoaXMuYmFsYW5jZSgpLFxuICAgICAgICAgIGNvbmZpcm1lZEJhbGFuY2U6IHRoaXMuY29uZmlybWVkQmFsYW5jZSgpLFxuICAgICAgICAgIHNwZW5kYWJsZUJhbGFuY2U6IHRoaXMuc3BlbmRhYmxlQmFsYW5jZSgpLFxuICAgICAgICB9O1xuICAgICAgICBlcnJvci50eFBhcmFtcyA9IHtcbiAgICAgICAgICAuLi5fLm9taXQocGFyYW1zLCBbJ2tleWNoYWluJywgJ3BydicsICdwYXNzcGhyYXNlJywgJ3dhbGxldFBhc3NwaHJhc2UnLCAna2V5JywgJ3dhbGxldCddKSxcbiAgICAgICAgICB3YWxsZXQ6IHtcbiAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICBiaXRnbzogXy5vbWl0KHRoaXMuYml0Z28sIFsnX3Rva2VuJ10pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWNjZWxlcmF0ZSBhIHRyYW5zYWN0aW9uJ3MgY29uZmlybWF0aW9uIHVzaW5nIENoaWxkLVBheXMtRm9yLVBhcmVudCAoQ1BGUCkgb3IgUmVwbGFjZS1CeS1GZWUgKFJCRilcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgYWNjZWxlcmF0ZVRyYW5zYWN0aW9uKHBhcmFtczogQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLnZhbGlkYXRlQWNjZWxlcmF0aW9uUGFyYW1zKHBhcmFtcyk7XG5cbiAgICBwYXJhbXMucmVjaXBpZW50cyA9IFtdO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oe1xuICAgICAgLi4uKGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKSksXG4gICAgICAuLi5CdWlsZFBhcmFtcy5lbmNvZGUocGFyYW1zKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVBY2NlbGVyYXRpb25QYXJhbXMocGFyYW1zOiBBY2NlbGVyYXRlVHJhbnNhY3Rpb25PcHRpb25zKSB7XG4gICAgaWYgKCFwYXJhbXMuY3BmcFR4SWRzICYmICFwYXJhbXMucmJmVHhJZHMpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ211c3QgcGFzcyBjcGZwVHhJZHMgb3IgcmJmVHhJZHMnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnY3BmcHR4aWRzX29yX3JiZnR4aWRzX3JlcXVpcmVkJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuY3BmcFR4SWRzICYmIHBhcmFtcy5yYmZUeElkcykge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignY2Fubm90IHNwZWNpZnkgYm90aCBjcGZwVHhJZHMgYW5kIHJiZlR4SWRzJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2Nhbm5vdF9zcGVjaWZ5X2JvdGhfY3BmcF9hbmRfcmJmX3R4aWRzJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuY3BmcFR4SWRzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQ3BmcFBhcmFtcyhwYXJhbXMpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmJmVHhJZHMpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVSYmZQYXJhbXMocGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5yZWNpcGllbnRzKSB8fCBwYXJhbXMucmVjaXBpZW50cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHZhbHVlIGZvciAncmVjaXBpZW50cyc6IG11c3QgYmUgZW1wdHkgYXJyYXkgd2hlbiBzZXRgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlUmJmUGFyYW1zKHBhcmFtczogQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMucmJmVHhJZHMpIHx8IHBhcmFtcy5yYmZUeElkcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2V4cGVjdGluZyByYmZUeElkcyB0byBiZSBhbiBhcnJheSBvZiBsZW5ndGggMScpO1xuICAgICAgZXJyb3IuY29kZSA9ICdyYmZ0eGlkc19ub3RfYXJyYXknO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuZmVlTXVsdGlwbGllcikge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignZmVlTXVsdGlwbGllciBtdXN0IGJlIHNldCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICdmZWVtdWx0aXBsaWVyX25vdF9zZXQnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5mZWVNdWx0aXBsaWVyIDw9IDEpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2ZlZU11bHRpcGxpZXIgbXVzdCBiZSBhIGdyZWF0ZXIgdGhhbiAxJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2ZlZW11bHRpcGxpZXJfZ3JlYXRlcl90aGFuX29uZSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlQ3BmcFBhcmFtcyhwYXJhbXM6IEFjY2VsZXJhdGVUcmFuc2FjdGlvbk9wdGlvbnMpIHtcbiAgICAvLyBUT0RPKEJHLTkzNDkpOiBjaGFuZ2UgdGhlIGxhc3QgY2hlY2sgdG8gPiAwIGFuZCB0aGUgZXJyb3IgbWVzc2FnZSBvbmNlIHBsYXRmb3JtIGFsbG93cyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMgdG9cbiAgICAvLyBiZSBidW1wZWQgaW4gdGhlIHNhbWUgQ1BGUCB0cmFuc2FjdGlvblxuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMuY3BmcFR4SWRzKSB8fCBwYXJhbXMuY3BmcFR4SWRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignZXhwZWN0aW5nIGNwZnBUeElkcyB0byBiZSBhbiBhcnJheSBvZiBsZW5ndGggMScpO1xuICAgICAgZXJyb3IuY29kZSA9ICdjcGZwdHhpZHNfbm90X2FycmF5JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5jcGZwRmVlUmF0ZSkpIHtcbiAgICAgIGlmIChwYXJhbXMubm9DcGZwRmVlUmF0ZSAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdjcGZwRmVlUmF0ZSBtdXN0IGJlIHNldCB1bmxlc3Mgbm9DcGZwRmVlUmF0ZSBpcyBzZXQnKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdjcGZwZmVlcmF0ZV9ub3Rfc2V0JztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLmNwZnBGZWVSYXRlKSB8fCBwYXJhbXMuY3BmcEZlZVJhdGUgPCAwKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2NwZnBGZWVSYXRlIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcicpO1xuICAgICAgICBlcnJvci5jb2RlID0gJ2NwZnBmZWVyYXRlX25vdF9ub25uZWdhdGl2ZV9pbnRlZ2VyJztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLm1heEZlZSkpIHtcbiAgICAgIGlmIChwYXJhbXMubm9NYXhGZWUgIT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignbWF4RmVlIG11c3QgYmUgc2V0IHVubGVzcyBub01heEZlZSBpcyBzZXQnKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdtYXhmZWVfbm90X3NldCc7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5tYXhGZWUpIHx8IHBhcmFtcy5tYXhGZWUgPCAwKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ21heEZlZSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdtYXhmZWVfbm90X25vbm5lZ2F0aXZlX2ludGVnZXInO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0IGEgaGFsZi1zaWduZWQgdHJhbnNhY3Rpb24gdG8gQml0R29cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHR4SGV4OiB0cmFuc2FjdGlvbiBoZXggdG8gc3VibWl0XG4gICAqIC0gaGFsZlNpZ25lZDogb2JqZWN0IGNvbnRhaW5pbmcgdHJhbnNhY3Rpb24gKHR4SGV4IG9yIHR4QmFzZTY0KSB0byBzdWJtaXRcbiAgICogQHBhcmFtIHJlcUlkIC0gcmVxdWVzdCB0cmFjZXIgcmVxdWVzdCBpZFxuICAgKi9cbiAgYXN5bmMgc3VibWl0VHJhbnNhY3Rpb24ocGFyYW1zOiBTdWJtaXRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSwgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcik6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnb3RwJywgJ3R4SGV4JywgJ3R4UmVxdWVzdElkJ10pO1xuICAgIGNvbnN0IGhhc1R4SGV4ID0gISFwYXJhbXMudHhIZXg7XG4gICAgY29uc3QgaGFzSGFsZlNpZ25lZCA9ICEhcGFyYW1zLmhhbGZTaWduZWQ7XG5cbiAgICBpZiAocGFyYW1zLnR4UmVxdWVzdElkICYmIChoYXNUeEhleCB8fCBoYXNIYWxmU2lnbmVkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBleGFjdGx5IG9uZSBvZiB0eFJlcXVlc3RJZCwgdHhIZXgsIG9yIGhhbGZTaWduZWQnKTtcbiAgICB9IGVsc2UgaWYgKCFwYXJhbXMudHhSZXF1ZXN0SWQgJiYgKChoYXNUeEhleCAmJiBoYXNIYWxmU2lnbmVkKSB8fCAoIWhhc1R4SGV4ICYmICFoYXNIYWxmU2lnbmVkKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzdXBwbHkgZWl0aGVyIHR4SGV4IG9yIGhhbGZTaWduZWQsIGJ1dCBub3QgYm90aCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24ocGFyYW1zLCByZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBjb2lucyB0byBhIHJlY2lwaWVudFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzcyAtIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzXG4gICAqIEBwYXJhbSBwYXJhbXMuYW1vdW50IC0gdGhlIGFtb3VudCBpbiBzYXRvc2hpcy93ZWkvYmFzZSB2YWx1ZSB0byBiZSBzZW50XG4gICAqIEBwYXJhbSBwYXJhbXMubWVzc2FnZSAtIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYXR0YWNoIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMuZGF0YSAtIFtFdGhlcmV1bSBTcGVjaWZpY10gb3B0aW9uYWwgZGF0YSB0byBwYXNzIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMuY3VzdG9kaWFuVHJhbnNhY3Rpb25JZCAtIFtFdGhlcmV1bS9NTUkgU3BlY2lmaWNdIGlkIG9mIHRyYW5zYWN0aW9uIGNyZWF0ZWQgdmlhIG1ldGFtYXNrXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXkgb24gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtcy5wcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0sIGlmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gdGhlIG1pbmltdW0gY29uZmlybWF0aW9uIHRocmVzaG9sZCBmb3IgaW5wdXRzXG4gICAqIEBwYXJhbSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gd2hldGhlciB0byBlbmZvcmNlIG1pbkNvbmZpcm1zIGZvciBjaGFuZ2UgaW5wdXRzXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2VuZChwYXJhbXM6IFNlbmRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbJ21lc3NhZ2UnLCAnZGF0YSddKTtcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hbW91bnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIGFtb3VudCcpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29pbiA9IHRoaXMuYmFzZUNvaW47XG5cbiAgICBjb25zdCBhbW91bnQgPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5hbW91bnQpO1xuXG4gICAgY29uc3QgaXNBbW91bnROZWdhdGl2ZSA9IGFtb3VudC5pc05lZ2F0aXZlKCk7XG4gICAgY29uc3QgaXNBbW91bnRaZXJvID0gYW1vdW50LmlzWmVybygpO1xuICAgIGNvbnN0IGlzQW1vdW50RGVjaW1hbCA9ICFhbW91bnQuaXNJbnRlZ2VyKCk7XG5cbiAgICBfLnNvbWUoW2lzQW1vdW50TmVnYXRpdmUsICFjb2luLnZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpICYmIGlzQW1vdW50WmVybywgaXNBbW91bnREZWNpbWFsXSwgKGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFtb3VudCAtIEludGVnZXIgZ3JlYXRlciB0aGFuIHplcm8gb3IgbnVtZXJpYyBzdHJpbmcgZXhwZWN0ZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHJlY2lwaWVudHM6IFNlbmRNYW55T3B0aW9uc1sncmVjaXBpZW50cyddID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBwYXJhbXMuYW1vdW50LFxuICAgICAgfSxcbiAgICBdO1xuICAgIGlmIChwYXJhbXMudG9rZW5OYW1lKSB7XG4gICAgICByZWNpcGllbnRzWzBdLnRva2VuTmFtZSA9IHBhcmFtcy50b2tlbk5hbWU7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZGF0YSAmJiBjb2luLnRyYW5zYWN0aW9uRGF0YUFsbG93ZWQoKSkge1xuICAgICAgcmVjaXBpZW50c1swXS5kYXRhID0gcGFyYW1zLmRhdGE7XG4gICAgfVxuICAgIGNvbnN0IHNlbmRNYW55T3B0aW9uczogU2VuZE1hbnlPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zLCB7XG4gICAgICByZWNpcGllbnRzLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnNlbmRNYW55KHNlbmRNYW55T3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhbiBFUkMtNzIxIE5GVCBvciBFUkMtMTE1NSBORlQocykuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gY29uc3RydWN0cyB0aGUgYXBwcm9wcmlhdGUgY2FsbCBkYXRhIGZvciBhbiBFUkMtNzIxLzExNTUgdG9rZW4gdHJhbnNmZXIsXG4gICAqIGFuZCBjYWxscyB0aGUgdG9rZW4gY29udHJhY3Qgd2l0aCB0aGUgZGF0YSwgYW5kIGFtb3VudCAwLiBUaGlzIHRyYW5zYWN0aW9uIHdpbGwgYWx3YXlzIHByb2R1Y2VcbiAgICogYSBwZW5kaW5nIGFwcHJvdmFsLlxuICAgKlxuICAgKiBAcGFyYW0gc2VuZE9wdGlvbnMgT3B0aW9ucyB0byBzcGVjaWZ5IGhvdyB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIHNlbnQuXG4gICAqIEBwYXJhbSBzZW5kTmZ0T3B0aW9ucyBPcHRpb25zIHRvIHNwZWNpZnkgdGhlIE5GVChzKSB0byBiZSBzZW50LlxuICAgKlxuICAgKiBAcmV0dXJuIEEgcGVuZGluZyBhcHByb3ZhbCBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgc2VuZE5mdChzZW5kT3B0aW9uczogU2VuZE5GVE9wdGlvbnMsIHNlbmROZnRPcHRpb25zOiBORlRUcmFuc2Zlck9wdGlvbnMpOiBQcm9taXNlPFNlbmRORlRSZXN1bHQ+IHtcbiAgICBjb25zdCBuZnRDb2xsZWN0aW9ucyA9IGF3YWl0IHRoaXMuZ2V0TmZ0QmFsYW5jZXMoKTtcbiAgICBjb25zdCB7IHRva2VuQ29udHJhY3RBZGRyZXNzLCByZWNpcGllbnRBZGRyZXNzLCB0eXBlIH0gPSBzZW5kTmZ0T3B0aW9ucztcblxuICAgIGNvbnN0IG5mdEJhbGFuY2UgPSBuZnRDb2xsZWN0aW9ucy5maW5kKChjKSA9PiBjLm1ldGFkYXRhLnRva2VuQ29udHJhY3RBZGRyZXNzID09PSB0b2tlbkNvbnRyYWN0QWRkcmVzcyk7XG4gICAgaWYgKCFuZnRCYWxhbmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbGxlY3Rpb24gbm90IGZvdW5kIGZvciB0b2tlbiBjb250cmFjdCAke3Rva2VuQ29udHJhY3RBZGRyZXNzfWApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5iYXNlQ29pbi5pc1ZhbGlkQWRkcmVzcyhyZWNpcGllbnRBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlY2lwaWVudCBhZGRyZXNzICR7cmVjaXBpZW50QWRkcmVzc31gKTtcbiAgICB9XG4gICAgY29uc3QgYmFzZUFkZHJlc3MgPSB0aGlzLmNvaW5TcGVjaWZpYygpPy5iYXNlQWRkcmVzcyB8fCB0aGlzLmNvaW5TcGVjaWZpYygpPy5yb290QWRkcmVzcztcbiAgICBpZiAoIWJhc2VBZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgYmFzZSBhZGRyZXNzIGZvciB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICBpZiAobmZ0QmFsYW5jZS50eXBlICE9PSB0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNwZWNpZmllZCBORlQgdHlwZSAke3R5cGV9IGRvZXMgbm90IG1hdGNoIGNvbGxlY3Rpb24gdHlwZSAke25mdEJhbGFuY2UudHlwZX1gKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHNlbmROZnRPcHRpb25zLnR5cGUpIHtcbiAgICAgIGNhc2UgJ0VSQzcyMSc6IHtcbiAgICAgICAgaWYgKCFuZnRCYWxhbmNlLmNvbGxlY3Rpb25zW3NlbmROZnRPcHRpb25zLnRva2VuSWRdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRva2VuICR7c2VuZE5mdE9wdGlvbnMudG9rZW5JZH0gbm90IGZvdW5kIGluIGNvbGxlY3Rpb24gJHt0b2tlbkNvbnRyYWN0QWRkcmVzc30gb3IgZG9lcyBub3QgaGF2ZSBhIHNwZW5kYWJsZSBiYWxhbmNlYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5iYXNlQ29pbi5idWlsZE5mdFRyYW5zZmVyRGF0YSh7XG4gICAgICAgICAgLi4uc2VuZE5mdE9wdGlvbnMsXG4gICAgICAgICAgZnJvbUFkZHJlc3M6IGJhc2VBZGRyZXNzLFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHJlY2lwaWVudDtcbiAgICAgICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT09ICd2ZXQnKSB7XG4gICAgICAgICAgcmVjaXBpZW50ID0ge1xuICAgICAgICAgICAgYWRkcmVzczogcmVjaXBpZW50QWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEnLFxuICAgICAgICAgICAgdG9rZW5EYXRhOiBkYXRhLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PT0gJ2hiYXJldm0nKSB7XG4gICAgICAgICAgcmVjaXBpZW50ID0ge1xuICAgICAgICAgICAgYWRkcmVzczogc2VuZE5mdE9wdGlvbnMudG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6ICcwJyxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICB0b2tlbk5hbWU6IG5mdEJhbGFuY2UubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY2lwaWVudCA9IHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHNlbmROZnRPcHRpb25zLnRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiAnMCcsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZE1hbnkoe1xuICAgICAgICAgIC4uLnNlbmRPcHRpb25zLFxuICAgICAgICAgIHJlY2lwaWVudHM6IFtyZWNpcGllbnRdLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VSQzExNTUnOiB7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBzZW5kTmZ0T3B0aW9ucy5lbnRyaWVzO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICBpZiAoIW5mdEJhbGFuY2UuY29sbGVjdGlvbnNbZW50cnkudG9rZW5JZF0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFRva2VuICR7ZW50cnkudG9rZW5JZH0gbm90IGZvdW5kIGluIGNvbGxlY3Rpb24gJHtzZW5kTmZ0T3B0aW9ucy50b2tlbkNvbnRyYWN0QWRkcmVzc30gb3IgZG9lcyBub3QgaGF2ZSBhIHNwZW5kYWJsZSBiYWxhbmNlYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5mdEJhbGFuY2UuY29sbGVjdGlvbnNbZW50cnkudG9rZW5JZF0gPCBlbnRyeS5hbW91bnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYEFtb3VudCAke2VudHJ5LmFtb3VudH0gZXhjZWVkcyBzcGVuZGFibGUgYmFsYW5jZSBvZiAke25mdEJhbGFuY2UuY29sbGVjdGlvbnNbZW50cnkudG9rZW5JZF19IGZvciB0b2tlbiAke1xuICAgICAgICAgICAgICAgIGVudHJ5LnRva2VuSWRcbiAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYmFzZUNvaW4uYnVpbGROZnRUcmFuc2ZlckRhdGEoe1xuICAgICAgICAgIC4uLnNlbmROZnRPcHRpb25zLFxuICAgICAgICAgIGZyb21BZGRyZXNzOiBiYXNlQWRkcmVzcyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmRNYW55KHtcbiAgICAgICAgICAuLi5zZW5kT3B0aW9ucyxcbiAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6IHNlbmROZnRPcHRpb25zLnRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICAgICAgICBhbW91bnQ6ICcwJyxcbiAgICAgICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVG9rZW5UeXBlLkRJR0lUQUxfQVNTRVQ6IHtcbiAgICAgICAgaWYgKCFuZnRCYWxhbmNlLmNvbGxlY3Rpb25zW3NlbmROZnRPcHRpb25zLnRva2VuSWRdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRva2VuICR7c2VuZE5mdE9wdGlvbnMudG9rZW5JZH0gbm90IGZvdW5kIGluIGNvbGxlY3Rpb24gJHt0b2tlbkNvbnRyYWN0QWRkcmVzc30gb3IgZG9lcyBub3QgaGF2ZSBhIHNwZW5kYWJsZSBiYWxhbmNlYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9rZW5EYXRhOiBUb2tlblRyYW5zZmVyUmVjaXBpZW50UGFyYW1zID0ge1xuICAgICAgICAgIHRva2VuVHlwZTogc2VuZE5mdE9wdGlvbnMudHlwZSxcbiAgICAgICAgICB0b2tlblF1YW50aXR5OiAnMScsIC8vIFRoaXMgTkZUIHN0YW5kYXJkIHdpbGwgYWx3YXlzIGhhdmUgcXVhbnRpdHkgb2YgMVxuICAgICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICAgIHRva2VuSWQ6IHNlbmROZnRPcHRpb25zLnRva2VuSWQsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmRNYW55KHtcbiAgICAgICAgICAuLi5zZW5kT3B0aW9ucyxcbiAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICAgICAgICAgIGFtb3VudDogJzEnLCAvLyB0aGUgYW1vdW50IG5lZWRzIHRvIGJlIG5vbi16ZXJvIGZvciB0aGUgdHJhbnNhY3Rpb24gdG8gYmUgdmFsaWQsIGl0IGlzIGlnbm9yZWRcbiAgICAgICAgICAgICAgdG9rZW5EYXRhLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBtb25leSB0byBtdWx0aXBsZSByZWNpcGllbnRzXG4gICAqIDEuIEdldHMgdGhlIHVzZXIga2V5Y2hhaW4gYnkgY2hlY2tpbmcgdGhlIHdhbGxldCBmb3IgYSBrZXkgd2hpY2ggaGFzIGFuIGVuY3J5cHRlZCBwcnZcbiAgICogMi4gRGVjcnlwdHMgdXNlciBrZXlcbiAgICogMy4gQ3JlYXRlcyB0aGUgdHJhbnNhY3Rpb24gd2l0aCBkZWZhdWx0IGZlZVxuICAgKiA0LiBTaWducyB0cmFuc2FjdGlvbiB3aXRoIGRlY3J5cHRlZCB1c2VyIGtleVxuICAgKiA1LiBTZW5kcyB0aGUgdHJhbnNhY3Rpb24gdG8gQml0R29cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcmFtc1xuICAgKiBAcGFyYW0ge3thZGRyZXNzOiBzdHJpbmcsIGFtb3VudDogc3RyaW5nfX0gcGFyYW1zLnJlY2lwaWVudHMgLSBsaXN0IG9mIHJlY2lwaWVudHMgYW5kIG5lY2Vzc2FyeSByZWNpcGllbnQgaW5mb3JtYXRpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5udW1CbG9ja3MgLSBFc3RpbWF0ZXMgdGhlIGFwcHJveGltYXRlIGZlZSBwZXIga2lsb2J5dGUgbmVjZXNzYXJ5IGZvciBhIHRyYW5zYWN0aW9uIGNvbmZpcm1hdGlvbiB3aXRoaW4gbnVtQmxvY2tzIGJsb2Nrc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSB0aGUgZGVzaXJlZCBmZWVSYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gc2F0b3RoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIGFsbCBzZWxlY3RlZCB1bnNwZW50cyB3aWxsIGhhdmUgYXQgbGVhc3QgdGhpcyBtYW55IGNvbmZpcm1hdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gRW5mb3JjZXMgbWluQ29uZmlybXMgb24gY2hhbmdlIGlucHV0c1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzIC0gVGhlIGRlc2lyZWQgY291bnQgb2YgdW5zcGVudHMgaW4gdGhlIHdhbGxldFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLm1lc3NhZ2UgLSBvcHRpb25hbCBtZXNzYWdlIHRvIGF0dGFjaCB0byB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gSWdub3JlIHVuc3BlbnRzIHNtYWxsZXIgdGhhbiB0aGlzIGFtb3VudCBvZiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1heFZhbHVlIC0gSWdub3JlIHVuc3BlbnRzIGxhcmdlciB0aGFuIHRoaXMgYW1vdW50IG9mIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuc2VxdWVuY2VJZCAtIFRoZSBzZXF1ZW5jZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5sYXN0TGVkZ2VyU2VxdWVuY2UgLSBBYnNvbHV0ZSBtYXggbGVkZ2VyIHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQgaW4sIHdoZXJlYWZ0ZXIgaXQgd2lsbCBiZSByZWplY3RlZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5sZWRnZXJTZXF1ZW5jZURlbHRhIC0gUmVsYXRpdmUgbGVkZ2VyIGhlaWdodCAoaW4gcmVsYXRpb24gdG8gdGhlIGN1cnJlbnQgbGVkZ2VyKSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQgaW4sIHdoZXJlYWZ0ZXIgaXQgd2lsbCBiZSByZWplY3RlZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5nYXNQcmljZSAtIEN1c3RvbSBnYXMgcHJpY2UgdG8gYmUgdXNlZCBmb3Igc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMubm9TcGxpdENoYW5nZSAtIFNldCB0byB0cnVlIHRvIGRpc2FibGUgYXV0b21hdGljIGNoYW5nZSBzcGxpdHRpbmcgZm9yIHB1cnBvc2VzIG9mIHVuc3BlbnQgbWFuYWdlbWVudFxuICAgKiBAcGFyYW0ge0FycmF5fSBwYXJhbXMudW5zcGVudHMgLSBUaGUgdW5zcGVudHMgdG8gdXNlIGluIHRoZSB0cmFuc2FjdGlvbi4gRWFjaCB1bnNwZW50IHNob3VsZCBiZSBpbiB0aGUgZm9ybSBwcmV2VHhJZDpuT3V0cHV0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuY29tbWVudCAtIEFueSBhZGRpdGlvbmFsIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLm90cCAtIFR3byBmYWN0b3IgYXV0aCBjb2RlIHRvIGVuYWJsZSBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmNoYW5nZUFkZHJlc3MgLSBTcGVjaWZpZXMgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBjaGFuZ2Ugb3V0cHV0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmluc3RhbnQgLSBTZW5kIHRoaXMgdHJhbnNhY3Rpb24gdXNpbmcgY29pbi1zcGVjaWZpYyBpbnN0YW50IHNlbmRpbmcgbWV0aG9kIChpZiBhdmFpbGFibGUpXG4gICAqIEBwYXJhbSB7e3ZhbHVlOiBTdHJpbmcsIHR5cGU6IFN0cmluZ319IHBhcmFtcy5tZW1vIC0gTWVtbyB0byB1c2UgaW4gdHJhbnNhY3Rpb24gKHN1cHBvcnRlZCBieSBTdGVsbGFyKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnR5cGUgLSBUeXBlIG9mIHRoZSB0cmFuc2FjdGlvbiAoZS5nLiB0cnVzdGxpbmUpXG4gICAqIEBwYXJhbSB7e3Rva2VuOiBwYXJhbXMsIGFjdGlvbjogU3RyaW5nLCBsaW1pdDogU3RyaW5nfVtdfSBvcHRpb25zLnRydXN0bGluZXMgLSBBcnJheSBvZiB0cnVzdGxpbmVzIHRvIG1hbmFnZSAoc3VwcG9ydGVkIGJ5IFN0ZWxsYXIpXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2VuZE1hbnkocGFyYW1zOiBTZW5kTWFueU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnY29tbWVudCcsICdvdHAnXSk7XG4gICAgZGVidWcoJ3NlbmRNYW55IGNhbGxlZCcpO1xuICAgIGNvbnN0IHJlcUlkID0gcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgcGFyYW1zLnJlcUlkID0gcmVxSWQ7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICBjb25zdCBjb2luID0gdGhpcy5iYXNlQ29pbjtcbiAgICBpZiAoXy5pc09iamVjdChwYXJhbXMucmVjaXBpZW50cykpIHtcbiAgICAgIHBhcmFtcy5yZWNpcGllbnRzLmZvckVhY2goZnVuY3Rpb24gKHJlY2lwaWVudCkge1xuICAgICAgICBjb2luLmNoZWNrUmVjaXBpZW50KHJlY2lwaWVudCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbmRNYW55VHhSZXF1ZXN0cyhwYXJhbXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsuLi50aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSwgJ2NvbW1lbnQnLCAnb3RwJywgJ2hvcCddKTtcblxuICAgIGlmICh0aGlzLl93YWxsZXQudHlwZSA9PT0gJ2N1c3RvZGlhbCcpIHtcbiAgICAgIGNvbnN0IGV4dHJhUGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5nZXRFeHRyYVByZWJ1aWxkUGFyYW1zKE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7IHdhbGxldDogdGhpcyB9KSk7XG4gICAgICBPYmplY3QuYXNzaWduKHNlbGVjdFBhcmFtcywgZXh0cmFQYXJhbXMpO1xuICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhdGVUcmFuc2FjdGlvbihzZWxlY3RQYXJhbXMsIHJlcUlkKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYWxmU2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgY29uc3QgZXh0cmFQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmdldEV4dHJhUHJlYnVpbGRQYXJhbXMoT2JqZWN0LmFzc2lnbihwYXJhbXMsIHsgd2FsbGV0OiB0aGlzIH0pKTtcbiAgICBjb25zdCBmaW5hbFR4UGFyYW1zID0gXy5leHRlbmQoe30sIGhhbGZTaWduZWRUcmFuc2FjdGlvbiwgc2VsZWN0UGFyYW1zLCBleHRyYVBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXMuc2VuZFRyYW5zYWN0aW9uKGZpbmFsVHhQYXJhbXMsIHJlcUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvdmVyIGFuIHVuc3VwcG9ydGVkIHRva2VuIGZyb20gYSBCaXRHbyBtdWx0aXNpZyB3YWxsZXRcbiAgICogcGFyYW1zIGFyZSB2YWxpZGF0ZWQgaW4gRXRoLnByb3RvdHlwZS5yZWNvdmVyVG9rZW5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzIHRoZSBjb250cmFjdCBhZGRyZXNzIG9mIHRoZSB1bnN1cHBvcnRlZCB0b2tlblxuICAgKiBAcGFyYW0gcGFyYW1zLnJlY2lwaWVudCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyByZWNvdmVyZWQgdG9rZW5zIHNob3VsZCBiZSBzZW50IHRvXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB0aGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHBhcmFtcy5wcnYgdGhlIHhwcnZcbiAgICovXG4gIGFzeW5jIHJlY292ZXJUb2tlbihwYXJhbXM6IFJlY292ZXJUb2tlbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rva2VuIHJlY292ZXJ5IG9ubHkgc3VwcG9ydGVkIGZvciBldGggd2FsbGV0cycpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHJlY2lwaWVudCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQodG9rZW5Db250cmFjdEFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciB0b2tlbkNvbnRyYWN0QWRkcmVzcycpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHJlY2lwaWVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIHJlY2lwaWVudCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY292ZXJUb2tlbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHJlY2lwaWVudCB9LCBwYXJhbXMsIHsgd2FsbGV0OiB0aGlzIH0pO1xuICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnJlY292ZXJUb2tlbihyZWNvdmVyVG9rZW5PcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdHJhbnNhY3Rpb24gbWV0YWRhdGEgZm9yIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gdGhhdCBpcyBzdGlsbCBwZW5kaW5nIG9yIGF0dGVtcHRlZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IE9iamVjdCB3aXRoIHR4aWQsIHdhbGxldElkLCB0eCwgYW5kIGZlZSAoaWYgc3VwcG9ydGVkIGZvciBjb2luKVxuICAgKi9cbiAgYXN5bmMgZ2V0Rmlyc3RQZW5kaW5nVHJhbnNhY3Rpb24ocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGludGVybmFsLmdldEZpcnN0UGVuZGluZ1RyYW5zYWN0aW9uKHsgd2FsbGV0SWQ6IHRoaXMuaWQoKSB9LCB0aGlzLmJhc2VDb2luLCB0aGlzLmJpdGdvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIGZlZSBvbiB0aGUgcGVuZGluZyB0cmFuc2FjdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiB0eGlkIHRvIHRoZSBnaXZlbiBuZXcgZmVlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50eGlkIFRoZSB0cmFuc2FjdGlvbiBJZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0cmFuc2FjdGlvbiB3aG9zZSBmZWUgaXMgdG8gYmUgY2hhbmdlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5mZWVdIE9wdGlvbmFsIC0gVGhlIG5ldyBmZWUgdG8gYXBwbHkgdG8gdGhlIGRlbm90ZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXMuZWlwMTU1OV0gT3B0aW9uYWwgLSB0aGUgZWlwMTU1OSB2YWx1ZXMgdG8gYXBwbHkgdG8gdGhlIGRlbm90ZWQgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge1N0cmluZ30gVGhlIHRyYW5zYWN0aW9uIElEIG9mIHRoZSBuZXcgdHJhbnNhY3Rpb24gdGhhdCBjb250YWlucyB0aGUgbmV3IGZlZSByYXRlXG4gICAqL1xuICBhc3luYyBjaGFuZ2VGZWUocGFyYW1zOiBDaGFuZ2VGZWVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChwYXJhbXMuZmVlKSBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3R4aWQnLCAnZmVlJ10sIFtdKTtcbiAgICBpZiAocGFyYW1zLmVpcDE1NTkpIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMuZWlwMTU1OSwgWydtYXhGZWVQZXJHYXMnLCAnbWF4UHJpb3JpdHlGZWVQZXJHYXMnXSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L2NoYW5nZUZlZScpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGluZm8gZnJvbSBtZXJjaGFudCBzZXJ2ZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1zIHBhc3NlZCBpbnRvIHRoZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnVybCBUaGUgVXJsIHRvIHJldHJpZXZlIGluZm8gZnJvbVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgaW5mbyByZXR1cm5lZCBmcm9tIHRoZSBtZXJjaGFudCBzZXJ2ZXJcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGdldFBheW1lbnRJbmZvKHBhcmFtczogeyB1cmw/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1cmwnXSwgW10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvcGF5bWVudEluZm8nKSkucXVlcnkocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGpzb24gcGF5bWVudCByZXNwb25zZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbXMgcGFzc2VkIGludG8gdGhlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMucGF5bWVudFVybCAtIFRoZSB1cmwgdG8gc2VuZCB0aGUgZnVsbHkgc2lnbmVkIHRyYW5zYWN0aW9uIHRvXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHhIZXggLSBUaGUgdHJhbnNhY3Rpb24gaGV4IG9mIHRoZSBwYXltZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMubWVtbyB7U3RyaW5nfSAtIEEgbWVtbyBzdXBwbGllZCBieSB0aGUgbWVyY2hhbnQsIHRvIGJlIGluc2VydGVkIGludG8gdGhlIHRyYW5zZmVyIGFzIHRoZSBjb21tZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuZXhwaXJlcyB7U3RyaW5nfSAtIElTTyBEYXRlIGZvcm1hdCBvZiB3aGVuIHRoZSBwYXltZW50IHJlcXVlc3QgZXhwaXJlc1xuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgaW5mbyByZXR1cm5lZCBmcm9tIHRoZSBtZXJjaGFudCBzZXJ2ZXIgUGF5bWVudCBBY2tcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIHNlbmRQYXltZW50UmVzcG9uc2UocGFyYW1zOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3NlbmRQYXltZW50JykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBwb2xpY3kgcnVsZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuY29uZGl0aW9uIGNvbmRpdGlvbiBvYmplY3RcbiAgICogQHBhcmFtIHBhcmFtcy5hY3Rpb24gYWN0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVBvbGljeVJ1bGUocGFyYW1zOiBDcmVhdGVQb2xpY3lSdWxlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ3R5cGUnXSwgWydtZXNzYWdlJ10pO1xuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5jb25kaXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBjb25kaXRpb25zIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogYWN0aW9uIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGEgcG9saWN5IHJ1bGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbmRpdGlvbiBjb25kaXRpb24gb2JqZWN0XG4gICAqIEBwYXJhbSBwYXJhbXMuYWN0aW9uIGFjdGlvbiBvYmplY3RcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzZXRQb2xpY3lSdWxlKHBhcmFtczogYW55ID0ge30pIHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ3R5cGUnXSwgWydtZXNzYWdlJ10pO1xuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5jb25kaXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBjb25kaXRpb25zIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogYWN0aW9uIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnB1dCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgUG9saWN5IFJ1bGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZVBvbGljeVJ1bGUocGFyYW1zOiBSZW1vdmVQb2xpY3lSdWxlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFsnbWVzc2FnZSddKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZShwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iaXRnby5kZWwodGhpcy51cmwoKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBjcm9zc0NoYWluIFVUWE9zXG4gICAqIEN1cnJlbnRseSBvbmx5IGZvciBBVkFYXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc291cmNlQ2hhaW4gdGhlIHNvdXJjZWNoYWluIHRvIHBpY2sgVVRYT3MsIGlmIG5vdCBnaXZlbiwgdGhlbiBwaWNrIGZyb20gYWxsIGF2YWlsYWJsZSBjaGFpbnMgW1AsIENdXG4gICAqL1xuICBmZXRjaENyb3NzQ2hhaW5VVFhPcyhwYXJhbXM6IEZldGNoQ3Jvc3NDaGFpblVUWE9zT3B0aW9ucyk6IFByb21pc2U8Q3Jvc3NDaGFpblVUWE9bXT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gXy5waWNrKHBhcmFtcywgWydzb3VyY2VDaGFpbiddKTtcbiAgICByZXR1cm4gdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9jcm9zc0NoYWluVW5zcGVudHMnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgYSBKU09OIHJlcHJlc2VudGFibGUgdmVyc2lvbiBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgdG9KU09OKCk6IFdhbGxldERhdGEge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgdHJhZGluZyBhY2NvdW50IGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIHRvVHJhZGluZ0FjY291bnQoKTogVHJhZGluZ0FjY291bnQge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnb2ZjJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBjb252ZXJ0IGFuIE9mZmNoYWluIChPRkMpIHdhbGxldCB0byBhIHRyYWRpbmcgYWNjb3VudCcpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRyYWRpbmdBY2NvdW50KHRoaXMuX3dhbGxldC5lbnRlcnByaXNlLCB0aGlzLCB0aGlzLmJpdGdvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFkZHJlc3MgYm9vayBmb3IgdGhpcyB3YWxsZXRcbiAgICovXG4gIHRvQWRkcmVzc0Jvb2soKTogSUFkZHJlc3NCb29rIHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ29mYycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgdXNlIGFuIE9mZmNoYWluIChPRkMpIHdhbGxldCBmb3IgdGhlIGFkZHJlc3MgYm9vaycpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFkZHJlc3NCb29rKHRoaXMuX3dhbGxldC5lbnRlcnByaXNlLCB0aGlzLmJpdGdvLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzdGFraW5nIHdhbGxldCBmcm9tIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b1N0YWtpbmdXYWxsZXQoKTogU3Rha2luZ1dhbGxldCB7XG4gICAgY29uc3QgaXNFdGhUc3MgPVxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PSAnZXRoJyAmJiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljPy53YWxsZXRWZXJzaW9uXG4gICAgICAgID8gdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYy53YWxsZXRWZXJzaW9uID49IDNcbiAgICAgICAgOiBmYWxzZTtcbiAgICByZXR1cm4gbmV3IFN0YWtpbmdXYWxsZXQodGhpcywgaXNFdGhUc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGdvIHN0YWtpbmcgd2FsbGV0IGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIHRvR29TdGFraW5nV2FsbGV0KCk6IEdvU3Rha2luZ1dhbGxldCB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdvZmMnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IGNvbnZlcnQgYW4gT2ZmY2hhaW4gKE9GQykgd2FsbGV0IHRvIGEgc3Rha2luZyB3YWxsZXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBHb1N0YWtpbmdXYWxsZXQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgZG93bmxvYWRzIFBERiBrZXljYXJkIGZvciB3YWxsZXQgKHJlcXVpcmVzIHJlc3BvbnNlIGZyb20gd2FsbGV0cy5nZW5lcmF0ZVdhbGxldClcbiAgICpcbiAgICogTm90ZTogdGhpcyBpcyBleGFtcGxlIGNvZGUgYW5kIGlzIG5vdCB0aGUgdmVyc2lvbiB1c2VkIG9uIGJpdGdvLmNvbVxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAgKiBqc1BERiAtIGFuIGluc3RhbmNlIG9mIHRoZSBqc1BERiBsaWJyYXJ5XG4gICAqICAgKiBRUkNvZGUgLSBhbiBpbnN0YW5jZSBvZiB0aGUgUVJpb3VzIGxpYnJhcnlcbiAgICogICAqIHVzZXJLZXljaGFpbiAtIGEgd2FsbGV0J3MgcHJpdmF0ZSB1c2VyIGtleWNoYWluXG4gICAqICAgKiBiYWNrdXBLZXljaGFpbiAtIGEgd2FsbGV0J3MgcHJpdmF0ZSBiYWNrdXAga2V5Y2hhaW5cbiAgICogICAqIGJpdGdvS2V5Y2hhaW4gLSBhIHdhbGxldCdzIHByaXZhdGUgYml0Z28ga2V5Y2hhaW5cbiAgICogICAqIHBhc3NwaHJhc2UgLSB0aGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogICAqIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUgLSB0aGUgZW5jcnlwdGlvbiBzZWNyZXQgdXNlZCBmb3IgQm94IERcbiAgICogICAqIGFjdGl2YXRpb25Db2RlIC0gYSByYW5kb21seSBnZW5lcmF0ZWQgc2l4LWRpZ2l0IGFjdGl2YXRpb24gY29kZVxuICAgKiAgICogd2FsbGV0S2V5SUQgLSB0aGUgS2V5IElEIHVzZWQgZm9yIGRlcml2aW5nIGEgY29sZCB3YWxsZXQncyBzaWduaW5nIGtleVxuICAgKiAgICogYmFja3VwS2V5SUQgLSB0aGUgS2V5IElEIHVzZWQgZm9yIGRlcml2aW5nIGEgY29sZCB3YWxsZXQncyBiYWNrdXAga2V5XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgZG93bmxvYWRLZXljYXJkKHBhcmFtczogRG93bmxvYWRLZXljYXJkT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gICAgaWYgKCF3aW5kb3cgfHwgIXdpbmRvdy5sb2NhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZG93bmxvYWRLZXljYXJkIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGFibGUgd2l0aGluIGEgYnJvd3Nlci4nKTtcbiAgICB9XG5cbiAgICAvLyBHcmFiIHBhcmFtZXRlcnMgd2l0aCBkZWZhdWx0IGZvciBhY3RpdmF0aW9uQ29kZVxuICAgIGNvbnN0IHtcbiAgICAgIGpzUERGLFxuICAgICAgUVJDb2RlLFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICB3YWxsZXRLZXlJRCxcbiAgICAgIGJhY2t1cEtleUlELFxuICAgICAgYWN0aXZhdGlvbkNvZGUgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA5MDAwMDAgKyAxMDAwMDApLnRvU3RyaW5nKCksXG4gICAgfSA9IHBhcmFtcztcblxuICAgIGlmICghanNQREYgfHwgdHlwZW9mIGpzUERGICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBwYXNzIGluIGEgdmFsaWQganNQREYgaW5zdGFuY2UnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBrZXljaGFpbnNcbiAgICBpZiAoIXVzZXJLZXljaGFpbiB8fCB0eXBlb2YgdXNlcktleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXYWxsZXQga2V5Y2hhaW4gbXVzdCBoYXZlIGEgJ3VzZXInIHByb3BlcnR5YCk7XG4gICAgfVxuXG4gICAgaWYgKCFiYWNrdXBLZXljaGFpbiB8fCB0eXBlb2YgYmFja3VwS2V5Y2hhaW4gIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhY2t1cCBrZXljaGFpbiBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAoIWJpdGdvS2V5Y2hhaW4gfHwgdHlwZW9mIGJpdGdvS2V5Y2hhaW4gIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JpdGdvIGtleWNoYWluIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICh3YWxsZXRLZXlJRCAmJiB0eXBlb2Ygd2FsbGV0S2V5SUQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldEtleUlEIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoYmFja3VwS2V5SUQgJiYgdHlwZW9mIGJhY2t1cEtleUlEICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWNrdXBLZXlJRCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgYWN0aXZhdGlvbiBjb2RlIGlmIHByb3ZpZGVkXG4gICAgaWYgKHR5cGVvZiBhY3RpdmF0aW9uQ29kZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWN0aXZhdGlvbiBDb2RlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aXZhdGlvbkNvZGUubGVuZ3RoICE9PSA2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjdGl2YXRpb24gY29kZSBtdXN0IGJlIHNpeCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29pblNob3J0TmFtZSA9IHRoaXMuYmFzZUNvaW4udHlwZTtcbiAgICBjb25zdCBjb2luTmFtZSA9IHRoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKTtcbiAgICBjb25zdCB3YWxsZXRMYWJlbCA9IHRoaXMuX3dhbGxldC5sYWJlbDtcblxuICAgIGNvbnN0IGRvYyA9IGRyYXdLZXljYXJkKHtcbiAgICAgIGpzUERGLFxuICAgICAgUVJDb2RlLFxuICAgICAgZW5jcnlwdDogdGhpcy5iaXRnby5lbmNyeXB0LFxuICAgICAgY29pblNob3J0TmFtZSxcbiAgICAgIGNvaW5OYW1lLFxuICAgICAgYWN0aXZhdGlvbkNvZGUsXG4gICAgICB3YWxsZXRMYWJlbCxcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBwYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgd2FsbGV0S2V5SUQsXG4gICAgICBiYWNrdXBLZXlJRCxcbiAgICB9KTtcblxuICAgIC8vIFNhdmUgdGhlIFBERiBvbiB0aGUgdXNlcidzIGJyb3dzZXJcbiAgICBkb2Muc2F2ZShgQml0R28gS2V5Y2FyZCBmb3IgJHt3YWxsZXRMYWJlbH0ucGRmYCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc2V0IG9mIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zIGZvciBhIHdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgICAgY29uc29saWRhdGVBZGRyZXNzZXMgLSB0aGVzZSBhcmUgdGhlIG9uLWNoYWluIHJlY2VpdmUgYWRkcmVzc2VzIHdlIHdhbnQgdG8gcGljayBhIGNvbnNvbGlkYXRpb24gYW1vdW50IGZyb21cbiAgICovXG4gIGFzeW5jIGJ1aWxkQWNjb3VudENvbnNvbGlkYXRpb25zKFxuICAgIHBhcmFtczogQnVpbGRDb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25PcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0W10+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IGFsbG93IGFjY291bnQgY29uc29saWRhdGlvbnMuYCk7XG4gICAgfVxuXG4gICAgLy8gV2hpdGVsaXN0IHBhcmFtcyB0byBidWlsZCB0eFxuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgdGhpcy5wcmVidWlsZENvbnNvbGlkYXRlQWNjb3VudFBhcmFtcygpKTtcbiAgICBkZWJ1ZygncHJlYnVpbGRpbmcgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbjogJU8nLCB3aGl0ZWxpc3RlZFBhcmFtcyk7XG5cbiAgICBpZiAocGFyYW1zLnJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGNvdWxkIHJldHVybiAxMDAgYnVpbGQgdHJhbnNhY3Rpb25zXG4gICAgY29uc3QgYnVpbGRSZXNwb25zZSA9IChhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy9jb25zb2xpZGF0ZUFjY291bnQvYnVpbGQnKSlcbiAgICAgIC5zZW5kKHdoaXRlbGlzdGVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpKSBhcyBhbnk7XG5cbiAgICBpZiAoYnVpbGRSZXNwb25zZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcmVjZWl2ZSBhZGRyZXNzZXMgd2l0aCBiYWxhbmNlIGZvdW5kIHRvIGNvbnNvbGlkYXRlLicpO1xuICAgIH1cblxuICAgIC8vIHdlIG5lZWQgdG8gc3RlcCBvdmVyIGVhY2ggcHJlYnVpbGQgbm93IC0gc2hvdWxkIGJlIGluIGFuIGFycmF5IGluIHRoZSBib2R5XG4gICAgY29uc3QgY29uc29saWRhdGlvbnM6IFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uc29saWRhdGVBY2NvdW50QnVpbGQgb2YgYnVpbGRSZXNwb25zZSkge1xuICAgICAgbGV0IHByZWJ1aWxkOiBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0ID0gKGF3YWl0IHRoaXMuYmFzZUNvaW4ucG9zdFByb2Nlc3NQcmVidWlsZChcbiAgICAgICAgT2JqZWN0LmFzc2lnbihjb25zb2xpZGF0ZUFjY291bnRCdWlsZCwge1xuICAgICAgICAgIHdhbGxldDogdGhpcyxcbiAgICAgICAgICBidWlsZFBhcmFtczogd2hpdGVsaXN0ZWRQYXJhbXMsXG4gICAgICAgIH0pXG4gICAgICApKSBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0O1xuXG4gICAgICBkZWxldGUgcHJlYnVpbGQud2FsbGV0O1xuICAgICAgZGVsZXRlIHByZWJ1aWxkLmJ1aWxkUGFyYW1zO1xuXG4gICAgICBwcmVidWlsZCA9IF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwgeyB3YWxsZXRJZDogdGhpcy5pZCgpIH0pO1xuICAgICAgZGVidWcoJ2ZpbmFsIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24gcHJlYnVpbGQ6ICVPJywgcHJlYnVpbGQpO1xuXG4gICAgICBjb25zb2xpZGF0aW9ucy5wdXNoKHByZWJ1aWxkKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnNvbGlkYXRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbmQgc2VuZHMgYSBzZXQgb2YgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnMgZm9yIGEgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAgICBwcmVidWlsZFR4ICAgLSB0aGlzIGlzIHRoZSBwcmUtYnVpbGQgY29uc29saWRhdGlvbiB0eC4gdGhpcyBpcyBhIG5vcm1hbGx5IGJ1aWx0IHR4IHdpdGhcbiAgICogICAgICAgICAgICAgICAgICAgIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIG9mIGNvbnNvbGlkYXRlSWQuXG4gICAqICAgICB2ZXJpZmljYXRpb24gLSBub3JtYWwga2V5Y2hhaW5zLCBldGMuIGZvciB2ZXJpZmljYXRpb25cbiAgICovXG4gIGFzeW5jIHNlbmRBY2NvdW50Q29uc29saWRhdGlvbihwYXJhbXM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IGFsbG93IGFjY291bnQgY29uc29saWRhdGlvbnMuYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJyAmJiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgcGFyYW1zLnR5cGUgPSAnY29uc29saWRhdGUnO1xuICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhdGVUcmFuc2FjdGlvbihwYXJhbXMgYXMgVHhTZW5kQm9keSwgcGFyYW1zLnJlcUlkKTtcbiAgICB9XG5cbiAgICAvLyBvbmUgb2YgYSBzZXQgb2YgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnNcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5wcmVidWlsZFR4ID09PSAnc3RyaW5nJyB8fCBwYXJhbXMucHJlYnVpbGRUeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYnVpbGQgb2YgYWNjb3VudCBjb25zb2xpZGF0aW9uLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnByZWJ1aWxkVHguY29uc29saWRhdGVJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmluZCBjb25zb2xpZGF0aW9uIGlkIG9uIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICBpZiAoIXBhcmFtcy5wcmVidWlsZFR4LnR4UmVxdWVzdElkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29uc29saWRhdGlvbiByZXF1ZXN0IG1pc3NpbmcgdHhSZXF1ZXN0SWQuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmRNYW55VHhSZXF1ZXN0cyhwYXJhbXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25lZFByZWJ1aWxkID0gKGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKSkgYXMgYW55O1xuXG4gICAgLy8gZGVjb3JhdGUgd2l0aCBvdXIgY29uc29saWRhdGlvbiBpZFxuICAgIHNpZ25lZFByZWJ1aWxkLmNvbnNvbGlkYXRlSWQgPSBwYXJhbXMucHJlYnVpbGRUeC5jb25zb2xpZGF0ZUlkO1xuXG4gICAgZGVsZXRlIHNpZ25lZFByZWJ1aWxkLndhbGxldDtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKHNpZ25lZFByZWJ1aWxkLCBwYXJhbXMucmVxSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbmQgc2VuZHMgYSBzZXQgb2YgYWNjb3VudCBjb25zb2xpZGF0aW9ucy4gVGhpcyBpcyBpbnRlbmRlZCB0byBmbHVzaCBtYW55IGJhbGFuY2VzIHRvIHRoZSByb290IHdhbGxldCBiYWxhbmNlLlxuICAgKiBAcGFyYW0gcGFyYW1zIC1cbiAgICogICAgIGNvbnNvbGlkYXRlQWRkcmVzc2VzIC0gdGhlc2UgYXJlIHRoZSBvbi1jaGFpbiByZWNlaXZlIGFkZHJlc3NlcyB3ZSB3YW50IHRvIHBpY2sgYSBjb25zb2xpZGF0aW9uIGFtb3VudCBmcm9tXG4gICAqL1xuICBhc3luYyBzZW5kQWNjb3VudENvbnNvbGlkYXRpb25zKHBhcmFtczogQnVpbGRDb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5hbGxvd3NBY2NvdW50Q29uc29saWRhdGlvbnMoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX0gZG9lcyBub3QgYWxsb3cgYWNjb3VudCBjb25zb2xpZGF0aW9ucy5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcGlWZXJzaW9uID1cbiAgICAgIHBhcmFtcy5hcGlWZXJzaW9uID8/XG4gICAgICAodGhpcy50c3NVdGlscyAmJiB0aGlzLnRzc1V0aWxzLnN1cHBvcnRlZFR4UmVxdWVzdFZlcnNpb25zKCkuaW5jbHVkZXMoJ2Z1bGwnKSA/ICdmdWxsJyA6IHVuZGVmaW5lZCk7XG5cbiAgICAvLyBEb2luZyBhIHNhbml0eSBjaGVjayBmb3IgcGFzc3dvcmQgaGVyZSB0byBhdm9pZCBkb2luZyBmdXJ0aGVyIHdvcmsgaWYgd2Uga25vdyBpdCdzIHdyb25nXG4gICAgYXdhaXQgdGhpcy5nZXRLZXljaGFpbnNBbmRWYWxpZGF0ZVBhc3NwaHJhc2Uoe1xuICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgY3VzdG9tU2lnbmluZ0Z1bmN0aW9uOiBwYXJhbXMuY3VzdG9tU2lnbmluZ0Z1bmN0aW9uLFxuICAgIH0pO1xuXG4gICAgLy8gdGhpcyBnaXZlcyB1cyBhIHNldCBvZiBhY2NvdW50IGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zXG4gICAgY29uc3QgdW5zaWduZWRCdWlsZHMgPSBhd2FpdCB0aGlzLmJ1aWxkQWNjb3VudENvbnNvbGlkYXRpb25zKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIGFwaVZlcnNpb246IGFwaVZlcnNpb24sXG4gICAgfSk7XG4gICAgaWYgKHVuc2lnbmVkQnVpbGRzICYmIHVuc2lnbmVkQnVpbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEdldCB3YWxsZXQncyBiYXNlIGFkZHJlc3MgdG8gdmFsaWRhdGUgZGVzdGluYXRpb24gYWRkcmVzc2VzXG4gICAgICBjb25zdCBiYXNlQWRkcmVzcyA9IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM/LmJhc2VBZGRyZXNzIHx8IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM/LnJvb3RBZGRyZXNzO1xuICAgICAgLy8gVmFsaWRhdGUgYWxsIHRyYW5zYWN0aW9uc1xuICAgICAgZm9yIChjb25zdCBidWlsZCBvZiB1bnNpZ25lZEJ1aWxkcykge1xuICAgICAgICBpZiAoYmFzZUFkZHJlc3MpIHtcbiAgICAgICAgICBkZWJ1ZygndmVyaWZ5aW5nIHR4SGV4JywgSlNPTi5zdHJpbmdpZnkoYnVpbGQpKTtcbiAgICAgICAgICAvL1ZlcmlmeSB0cmFuc2FjdGlvbnMgc2VuZCBmdW5kcyB0byB0aGUgYmFzZSBhZGRyZXNzXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIShhd2FpdCB0aGlzLmJhc2VDb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgICAgdHhQcmVidWlsZDogYnVpbGQsXG4gICAgICAgICAgICAgIHR4UGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgICAgIHZlcmlmaWNhdGlvbjoge1xuICAgICAgICAgICAgICAgIGNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzOiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICAgICAgICAgIHdhbGxldFR5cGU6IHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgb3V0cHV0IHRoYXQgZG9lcyBub3QgY29uc29saWRhdGUgZnVuZHMgdG8gYmFzZSBhZGRyZXNzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBzdWNjZXNzZnVsVHhzOiBhbnlbXSA9IFtdO1xuICAgICAgY29uc3QgZmFpbGVkVHhzOiB7IG1lc3NhZ2U6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB1bnNpZ25lZEJ1aWxkIG9mIHVuc2lnbmVkQnVpbGRzKSB7XG4gICAgICAgIC8vIGZvbGQgYW55IG9mIHRoZSBwYXJhbWV0ZXJzIHdlIHVzZWQgdG8gYnVpbGQgdGhpcyB0cmFuc2FjdGlvbiBpbnRvIHRoZSB1bnNpZ25lZEJ1aWxkXG4gICAgICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9uczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zKTtcbiAgICAgICAgdW5zaWduZWRCdWlsZFdpdGhPcHRpb25zLmFwaVZlcnNpb24gPSBhcGlWZXJzaW9uO1xuICAgICAgICB1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMucHJlYnVpbGRUeCA9IHVuc2lnbmVkQnVpbGQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc2VuZFR4ID0gYXdhaXQgdGhpcy5zZW5kQWNjb3VudENvbnNvbGlkYXRpb24odW5zaWduZWRCdWlsZFdpdGhPcHRpb25zKTtcbiAgICAgICAgICBzdWNjZXNzZnVsVHhzLnB1c2goc2VuZFR4KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGZhaWxlZFR4cy5wdXNoKHsgbWVzc2FnZTogZS5tZXNzYWdlLCBuYW1lOiBlLm5hbWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2Vzczogc3VjY2Vzc2Z1bFR4cyxcbiAgICAgICAgZmFpbHVyZTogZmFpbGVkVHhzLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc2V0IG9mIHRyYW5zYWN0aW9ucyB0aGF0IGVuYWJsZXMgdGhlIHNwZWNpZmllZCB0b2tlbnNcbiAgICogQHBhcmFtIHBhcmFtcyAtXG4gICAqICAgIGVuYWJsZVRva2VuczogVG9rZW4gZW5hYmxlbWVudCBvcGVyYXRpb25zIHdlIHdhbnQgdG8gcGVyZm9ybVxuICAgKiBAcmV0dXJucyBVbnNpZ25lZCB0cmFuc2FjdGlvbnMgdGhhdCBlbmFibGVzIHRoZSBzcGVjaWZpZWQgdG9rZW5zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYnVpbGRUb2tlbkVuYWJsZW1lbnRzKFxuICAgIHBhcmFtczogQnVpbGRUb2tlbkVuYWJsZW1lbnRPcHRpb25zID0geyBlbmFibGVUb2tlbnM6IFtdIH1cbiAgKTogUHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0W10+IHtcbiAgICBjb25zdCB0ZUNvbmZpZyA9IHRoaXMuYmFzZUNvaW4uZ2V0VG9rZW5FbmFibGVtZW50Q29uZmlnKCk7XG4gICAgaWYgKCF0ZUNvbmZpZy5yZXF1aXJlc1Rva2VuRW5hYmxlbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX0gZG9lcyBub3QgcmVxdWlyZSB0b2tlbiBlbmFibGVtZW50c2ApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHdhbGxldCB0eXBlIGlmIGNvaW4gcmVxdWlyZXMgaXRcbiAgICBpZiAodHlwZW9mIHRlQ29uZmlnLnZhbGlkYXRlV2FsbGV0ID09PSAnZnVuY3Rpb24nICYmIHRoaXMuX3dhbGxldC50eXBlKSB7XG4gICAgICB0ZUNvbmZpZy52YWxpZGF0ZVdhbGxldCh0aGlzLl93YWxsZXQudHlwZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5lbmFibGVUb2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRva2VucyBhcmUgYmVpbmcgc3BlY2lmaWVkJyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IHNwZWNpZnkgcmVjaXBpZW50cyBmb3IgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbnMnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICB9XG5cbiAgICAvLyBTcGxpdCBxdWVyeSBpZiB3ZSBjYW4ndCBlbmFibGUgbXVsdGlwbGUgdG9rZW5zIGluIG9uZSB0eFxuICAgIGlmICghdGVDb25maWcuc3VwcG9ydHNNdWx0aXBsZVRva2VuRW5hYmxlbWVudHMgJiYgcGFyYW1zLmVuYWJsZVRva2Vucy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBxdWVyaWVzID0gcGFyYW1zLmVuYWJsZVRva2Vucy5tYXAoYXN5bmMgKGVuYWJsZVRva2VuKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkVG9rZW5FbmFibGVtZW50cyh7XG4gICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgIGVuYWJsZVRva2VuczogW2VuYWJsZVRva2VuXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChxdWVyaWVzKTtcbiAgICAgIHJldHVybiByZXN1bHRzLmZsYXQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBidWlsZFBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSk7XG4gICAgaWYgKCFidWlsZFBhcmFtcy50eXBlKSB7XG4gICAgICBidWlsZFBhcmFtcy50eXBlID0gJ2VuYWJsZXRva2VuJztcbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgd2UgYnVpbGQgd2l0aCBpbnRlbnRcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKGJ1aWxkUGFyYW1zKV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJld3JpdGUgdG9rZW5zIGludG8gcmVjaXBpZW50cyBmb3IgYnVpbGRUcmFuc2FjdGlvblxuICAgICAgYnVpbGRQYXJhbXMucmVjaXBpZW50cyA9IHBhcmFtcy5lbmFibGVUb2tlbnMubWFwKCh0b2tlbikgPT4ge1xuICAgICAgICAvLyBJZiB0b2tlbiBoYXMgbm9uIGFkZHJlc3MsIHRha2UgdGhlIGZpcnN0IHdhbGxldCBhZGRyZXNzIGlzIHN0b3JlZCBpbiBpdHMgY29pbi1zcGVjaWZpYyBwcm9wZXJ0eVxuICAgICAgICAvLyBJbiBhY2NvdW50LWJhc2VkIGNvaW4gaW1wbGVtZW50YXRpb25zIHRoYXQgdXNlIHdhbGxldCBjb250cmFjdHMsIHRoZSBhZGRyZXNzIGlzIGNhbGxlZCBiYXNlQWRkcmVzcyAoZS5nLiBldGgtbGlrZSwgeHR6KVxuICAgICAgICAvLyBmb3Igb3RoZXJzIGl0J3MgY2FsbGVkIHJvb3RBZGRyZXNzIChlLmcuIHhycCwgeGxtLCBhbGdvLCB0cngpXG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPVxuICAgICAgICAgIHRva2VuLmFkZHJlc3MgfHwgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8uYmFzZUFkZHJlc3MgfHwgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8ucm9vdEFkZHJlc3M7XG4gICAgICAgIGlmICghYWRkcmVzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2FsbGV0IGRvZXMgbm90IGhhdmUgYmFzZSBhZGRyZXNzLCBtdXN0IHNwZWNpZnkgd2l0aCB0b2tlbiBwYXJhbScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiAnMCcsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSBidWlsZFBhcmFtcy5lbmFibGVUb2tlbnM7XG4gICAgICBjb25zdCBwcmVidWlsZFR4ID0gYXdhaXQgdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKGJ1aWxkUGFyYW1zKTtcbiAgICAgIHByZWJ1aWxkVHguYnVpbGRQYXJhbXMgPSBidWlsZFBhcmFtcztcbiAgICAgIHJldHVybiBbcHJlYnVpbGRUeF07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB3YWxsZXQgaW5pdGlhbGl6YXRpb25cbiAgICogQHBhcmFtIHtQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9uc30gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ+fVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGJ1aWxkV2FsbGV0SW5pdGlhbGl6YXRpb24ocGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5yZXF1aXJlc1dhbGxldEluaXRpYWxpemF0aW9uVHJhbnNhY3Rpb24oKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXYWxsZXQgaW5pdGlhbGl6YXRpb24gaXMgbm90IHJlcXVpcmVkIGZvciAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX1gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dhbGxldCBpbml0aWFsaXphdGlvbiB0cmFuc2FjdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuICAgIGNvbnN0IGJ1aWxkUGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyA9IF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpKTtcbiAgICBpZiAoIWJ1aWxkUGFyYW1zLnR5cGUpIHtcbiAgICAgIGJ1aWxkUGFyYW1zLnR5cGUgPSAnY3JlYXRlQWNjb3VudCc7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb24oYnVpbGRQYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGFuZCBzZW5kcyBhIHNpbmdsZSB1bnNpZ25lZCB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnNcbiAgICogICAtIFRoZSByZXNwb25zZSBmcm9tIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uIGZvciBob3QvY29sZCB3YWxsZXRzXG4gICAqICAgLSBUaGUgcmVzcG9uc2UgZnJvbSBpbml0aWF0aW5nIHRoZSB0cmFuc2FjdGlvbiBmb3IgY3VzdG9kaWFsIHdhbGxldHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kVG9rZW5FbmFibGVtZW50KHBhcmFtczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHRlQ29uZmlnID0gdGhpcy5iYXNlQ29pbi5nZXRUb2tlbkVuYWJsZW1lbnRDb25maWcoKTtcbiAgICBwYXJhbXMudmVyaWZpY2F0aW9uID0gcGFyYW1zLnZlcmlmaWNhdGlvbiA/PyB7fTtcbiAgICBwYXJhbXMudmVyaWZpY2F0aW9uLnZlcmlmeVRva2VuRW5hYmxlbWVudCA9IHBhcmFtcy52ZXJpZmljYXRpb24udmVyaWZ5VG9rZW5FbmFibGVtZW50ID8/IHRydWU7XG4gICAgaWYgKCF0ZUNvbmZpZy5yZXF1aXJlc1Rva2VuRW5hYmxlbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX0gZG9lcyBub3QgcmVxdWlyZSB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uc2ApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHdhbGxldCB0eXBlIGlmIGNvaW4gcmVxdWlyZXMgaXRcbiAgICBpZiAodGVDb25maWcudmFsaWRhdGVXYWxsZXQgJiYgdGhpcy5fd2FsbGV0LnR5cGUpIHtcbiAgICAgIHRlQ29uZmlnLnZhbGlkYXRlV2FsbGV0KHRoaXMuX3dhbGxldC50eXBlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBhcmFtcy5wcmVidWlsZFR4ID09PSAnc3RyaW5nJyB8fCBwYXJhbXMucHJlYnVpbGRUeD8uYnVpbGRQYXJhbXM/LnR5cGUgIT09ICdlbmFibGV0b2tlbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBidWlsZCBvZiB0b2tlbiBlbmFibGVtZW50LicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZE1hbnlUeFJlcXVlc3RzKHBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAodGhpcy5fd2FsbGV0LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnaG90JzpcbiAgICAgICAgY2FzZSAnY29sZCc6XG4gICAgICAgICAgY29uc3Qgc2lnbmVkUHJlYnVpbGQgPSBhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oc2lnbmVkUHJlYnVpbGQsIHBhcmFtcy5yZXFJZCk7XG4gICAgICAgIGNhc2UgJ2N1c3RvZGlhbCc6XG4gICAgICAgIGNhc2UgJ2JhY2tpbmcnOlxuICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYXRlVHJhbnNhY3Rpb24ocGFyYW1zLnByZWJ1aWxkVHguYnVpbGRQYXJhbXMsIHBhcmFtcy5yZXFJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNvbWUgY2hhaW5zIHJlcXVpcmUgdG9rZW5zIHRvIGJlIGVuYWJsZWQgYmVmb3JlIHRoZXkgY2FuIGJlIHJlY2VpdmVkL3NlbnQuXG4gICAqIFRoaXMgaXMgYSBkZWRpY2F0ZWQgZnVuY3Rpb24gdGhhdCBlbmFibGVzIHRva2Vucy5cbiAgICpcbiAgICogQnVpbGRzLCBzaWducywgYW5kIHNlbmRzIGEgc2V0IG9mIHRyYW5zYWN0aW9ucyB0aGF0IGVuYWJsZXMgdGhlIHNwZWNpZmllZCB0b2tlbnNcbiAgICogQHBhcmFtIHBhcmFtcyAtXG4gICAqICAgIGVuYWJsZVRva2VuczogVG9rZW4gZW5hYmxlbWVudCBvcGVyYXRpb25zIHdlIHdhbnQgdG8gcGVyZm9ybVxuICAgKiBAcmV0dXJuXG4gICAqICAgIHN1Y2Nlc3M6IFN1Y2Nlc3NmdWwgcmVzcG9uc2VzIGZyb20gc2VuZFRva2VuRW5hYmxlbWVudFxuICAgKiAgICBmYWlsdXJlOiBFcnJvcnMgZnJvbSBmYWlsZWQgdHJhbnNhY3Rpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZFRva2VuRW5hYmxlbWVudHMocGFyYW1zOiBCdWlsZFRva2VuRW5hYmxlbWVudE9wdGlvbnMgPSB7IGVuYWJsZVRva2VuczogW10gfSk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGFueVtdO1xuICAgIGZhaWx1cmU6IEVycm9yW107XG4gIH0+IHtcbiAgICBjb25zdCB1bnNpZ25lZEJ1aWxkcyA9IGF3YWl0IHRoaXMuYnVpbGRUb2tlbkVuYWJsZW1lbnRzKHBhcmFtcyk7XG5cbiAgICBjb25zdCBzdWNjZXNzZnVsVHhzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IGZhaWxlZFR4cyA9IG5ldyBBcnJheTxFcnJvcj4oKTtcbiAgICBmb3IgKGNvbnN0IHVuc2lnbmVkQnVpbGQgb2YgdW5zaWduZWRCdWlsZHMpIHtcbiAgICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9uczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHByZWJ1aWxkVHg6IHVuc2lnbmVkQnVpbGQsXG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VuZFR4ID0gYXdhaXQgdGhpcy5zZW5kVG9rZW5FbmFibGVtZW50KHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9ucyk7XG4gICAgICAgIHN1Y2Nlc3NmdWxUeHMucHVzaChzZW5kVHgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBmYWlsZWRUeHMucHVzaChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2Vzczogc3VjY2Vzc2Z1bFR4cyxcbiAgICAgIGZhaWx1cmU6IGZhaWxlZFR4cyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjaGFpbiBjYW50b24sIHJlcXVpcmVzIHRoZSB3YWxsZXQgdG8gYmUgaW5pdGlhbGl6ZWQgYnkgc2VuZGluZyBvdXQgYSB0cmFuc2FjdGlvblxuICAgKiB0byBiZSBvbmJvYXJkZWQgb250byB0aGUgdmFsaWRhdG9yLlxuICAgKiBCdWlsZHMsIFNpZ25zIGFuZCBzZW5kcyBhIHRyYW5zYWN0aW9uIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIGNhbnRvbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRXYWxsZXRJbml0aWFsaXphdGlvbihwYXJhbXM6IFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFdhbGxldEluaXRSZXN1bHQ+IHtcbiAgICBjb25zdCBwcmVidWlsZFR4ID0gYXdhaXQgdGhpcy5idWlsZFdhbGxldEluaXRpYWxpemF0aW9uKHBhcmFtcyk7XG4gICAgY29uc3QgdW5zaWduZWRCdWlsZFdpdGhPcHRpb25zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBwcmVidWlsZFR4LFxuICAgIH07XG4gICAgY29uc3Qgc3VjY2Vzc2Z1bFR4czogUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdID0gW107XG4gICAgY29uc3QgZmFpbGVkVHhzID0gbmV3IEFycmF5PEVycm9yPigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZW5kVHggPSBhd2FpdCB0aGlzLnNlbmRNYW55VHhSZXF1ZXN0cyh1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMpO1xuICAgICAgc3VjY2Vzc2Z1bFR4cy5wdXNoKHNlbmRUeCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZmFpbGVkVHhzLnB1c2goZSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBzdWNjZXNzZnVsVHhzLFxuICAgICAgZmFpbHVyZTogZmFpbGVkVHhzLFxuICAgIH07XG4gIH1cblxuICAvKiBNQVJLOiBUU1MgSGVscGVycyAqL1xuXG4gIC8qKlxuICAgKiBQcmVidWlsZHMgYSB0cmFuc2FjdGlvbiBmb3IgYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHByZWJ1aWxkIHRyYW5zYWN0aW9uIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJlYnVpbGRUcmFuc2FjdGlvblR4UmVxdWVzdHMoXG4gICAgcGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHJlcUlkID0gcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICBjb25zdCBhcGlWZXJzaW9uID0gZ2V0VHhSZXF1ZXN0QXBpVmVyc2lvbih0aGlzLCBwYXJhbXMuYXBpVmVyc2lvbik7XG4gICAgLy8gVHdvIG9wdGlvbnMgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiBmZWVzIHNlZW1zIHRvIG5vdyBiZSBzdXBwb3J0ZWQsIGZvciBub3cgd2Ugd2lsbCBzdXBwb3J0IGJvdGggdG8gYmUgYmFja3dhcmRzIGNvbXBhdGlibGVcbiAgICAvLyBUT0RPKEJHLTU5Njg1KTogZGVwcmVjYXRlIG9uZSBvZiB0aGVzZSBzbyB0aGF0IHdlIGhhdmUgYSBzaW5nbGUgd2F5IHRvIHBhc3MgZmVlc1xuICAgIGxldCBmZWVPcHRpb25zO1xuICAgIGlmIChwYXJhbXMuZmVlT3B0aW9ucykge1xuICAgICAgZmVlT3B0aW9ucyA9IHBhcmFtcy5mZWVUb2tlbiA/IHsgLi4ucGFyYW1zLmZlZU9wdGlvbnMsIGZlZVRva2VuOiBwYXJhbXMuZmVlVG9rZW4gfSA6IHBhcmFtcy5mZWVPcHRpb25zO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLmdhc1ByaWNlICE9PSB1bmRlZmluZWQgfHwgcGFyYW1zLmVpcDE1NTkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmVlT3B0aW9ucyA9XG4gICAgICAgIHBhcmFtcy5nYXNQcmljZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGdhc1ByaWNlOiBwYXJhbXMuZ2FzUHJpY2UsXG4gICAgICAgICAgICAgIGdhc0xpbWl0OiBwYXJhbXMuZ2FzTGltaXQsXG4gICAgICAgICAgICAgIC4uLihwYXJhbXMuZmVlVG9rZW4gIT09IHVuZGVmaW5lZCAmJiB7IGZlZVRva2VuOiBwYXJhbXMuZmVlVG9rZW4gfSksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIG1heEZlZVBlckdhczogTnVtYmVyKHBhcmFtcy5laXAxNTU5Py5tYXhGZWVQZXJHYXMpLFxuICAgICAgICAgICAgICBtYXhQcmlvcml0eUZlZVBlckdhczogTnVtYmVyKHBhcmFtcy5laXAxNTU5Py5tYXhQcmlvcml0eUZlZVBlckdhcyksXG4gICAgICAgICAgICAgIGdhc0xpbWl0OiBwYXJhbXMuZ2FzTGltaXQsXG4gICAgICAgICAgICAgIC4uLihwYXJhbXMuZmVlVG9rZW4gIT09IHVuZGVmaW5lZCAmJiB7IGZlZVRva2VuOiBwYXJhbXMuZmVlVG9rZW4gfSksXG4gICAgICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLmZlZVRva2VuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZlZU9wdGlvbnMgPSB7IGZlZVRva2VuOiBwYXJhbXMuZmVlVG9rZW4gfTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5nYXNMaW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmZWVPcHRpb25zID0geyBnYXNMaW1pdDogcGFyYW1zLmdhc0xpbWl0IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGZlZU9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgbGV0IHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHN3aXRjaCAocGFyYW1zLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3RyYW5zZmVyJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAncGF5bWVudCcsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMuc2VxdWVuY2VJZCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IHBhcmFtcy5jb21tZW50LFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgICAgZmVlVG9rZW46IHBhcmFtcy5mZWVUb2tlbixcbiAgICAgICAgICAgIGN1c3RvZGlhblRyYW5zYWN0aW9uSWQ6IHBhcmFtcy5jdXN0b2RpYW5UcmFuc2FjdGlvbklkLFxuICAgICAgICAgICAgdW5zcGVudHM6IHBhcmFtcy51bnNwZW50cyxcbiAgICAgICAgICAgIHNlbmRlckFkZHJlc3M6IHBhcmFtcy5zZW5kZXJBZGRyZXNzLFxuICAgICAgICAgICAgaXNUZXN0VHJhbnNhY3Rpb246IHBhcmFtcy5pc1Rlc3RUcmFuc2FjdGlvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0cmFuc2ZlcnRva2VuJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpc1RzczogcGFyYW1zLmlzVHNzLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3RyYW5zZmVyVG9rZW4nLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBub25jZTogcGFyYW1zLm5vbmNlLFxuICAgICAgICAgICAgZmVlT3B0aW9ucyxcbiAgICAgICAgICAgIGZlZVRva2VuOiBwYXJhbXMuZmVlVG9rZW4sXG4gICAgICAgICAgICB1bnNwZW50czogcGFyYW1zLnVuc3BlbnRzLFxuICAgICAgICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZW5hYmxldG9rZW4nOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdlbmFibGVUb2tlbicsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBwYXJhbXMucmVjaXBpZW50cyB8fCBbXSxcbiAgICAgICAgICAgIGVuYWJsZVRva2VuczogcGFyYW1zLmVuYWJsZVRva2VucyxcbiAgICAgICAgICAgIG1lbW86IHBhcmFtcy5tZW1vLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Nsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudCc6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ2Nsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudCcsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBwYXJhbXMucmVjaXBpZW50cyB8fCBbXSxcbiAgICAgICAgICAgIG1lbW86IHBhcmFtcy5tZW1vLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2FjY2VsZXJhdGlvbic6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ2FjY2VsZXJhdGlvbicsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIGxvd0ZlZVR4aWQ6IHBhcmFtcy5sb3dGZWVUeGlkLFxuICAgICAgICAgICAgcmVjZWl2ZUFkZHJlc3M6IHBhcmFtcy5yZWNlaXZlQWRkcmVzcyxcbiAgICAgICAgICAgIGZlZU9wdGlvbnMsXG4gICAgICAgICAgICBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ZpbGxOb25jZSc6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ2ZpbGxOb25jZScsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICByZWNlaXZlQWRkcmVzczogcGFyYW1zLnJlY2VpdmVBZGRyZXNzLFxuICAgICAgICAgICAgZmVlT3B0aW9ucyxcbiAgICAgICAgICAgIGZlZVRva2VuOiBwYXJhbXMuZmVlVG9rZW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9rZW5BcHByb3ZhbCc6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3Rva2VuQXBwcm92YWwnLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiBwYXJhbXMudG9rZW5OYW1lLFxuICAgICAgICAgICAgZmVlVG9rZW46IHBhcmFtcy5mZWVUb2tlbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjcmVhdGVBY2NvdW50JzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAnY3JlYXRlQWNjb3VudCcsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBwYXJhbXMucmVjaXBpZW50cyB8fCBbXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0cmFuc2ZlckFjY2VwdCc6IHtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAndHJhbnNmZXJBY2NlcHQnLFxuICAgICAgICAgICAgdHhSZXF1ZXN0SWQ6IHBhcmFtcy50eFJlcXVlc3RJZCxcbiAgICAgICAgICAgIHNlcXVlbmNlSWQ6IHBhcmFtcy50eFJlcXVlc3RJZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd0cmFuc2ZlclJlamVjdCc6IHtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAndHJhbnNmZXJSZWplY3QnLFxuICAgICAgICAgICAgdHhSZXF1ZXN0SWQ6IHBhcmFtcy50eFJlcXVlc3RJZCxcbiAgICAgICAgICAgIHNlcXVlbmNlSWQ6IHBhcmFtcy50eFJlcXVlc3RJZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd0cmFuc2Zlck9mZmVyV2l0aGRyYXduJzoge1xuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICd0cmFuc2Zlck9mZmVyV2l0aGRyYXduJyxcbiAgICAgICAgICAgIHRyYW5zZmVyT2ZmZXJJZDogcGFyYW1zLnRyYW5zZmVyT2ZmZXJJZCxcbiAgICAgICAgICAgIHNlcXVlbmNlSWQ6IHBhcmFtcy50cmFuc2Zlck9mZmVySWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY3VzdG9tVHgnOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdjdXN0b21UeCcsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMuc2VxdWVuY2VJZCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IHBhcmFtcy5jb21tZW50LFxuICAgICAgICAgICAgc29sSW5zdHJ1Y3Rpb25zOiBwYXJhbXMuc29sSW5zdHJ1Y3Rpb25zLFxuICAgICAgICAgICAgc29sVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhOiBwYXJhbXMuc29sVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhLFxuICAgICAgICAgICAgYXB0b3NDdXN0b21UcmFuc2FjdGlvblBhcmFtczogcGFyYW1zLmFwdG9zQ3VzdG9tVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBwYXJhbXMucmVjaXBpZW50cyB8fCBbXSxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICAgIGZlZU9wdGlvbnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYnJpZGdlRnVuZHMnOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdicmlkZ2VGdW5kcycsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMuc2VxdWVuY2VJZCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IHBhcmFtcy5jb21tZW50LFxuICAgICAgICAgICAgYW1vdW50OiBwYXJhbXMuaW50ZW50QW1vdW50LFxuICAgICAgICAgICAgbm9uY2U6IHBhcmFtcy5ub25jZSxcbiAgICAgICAgICAgIGZlZU9wdGlvbnMsXG4gICAgICAgICAgICBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdHJhbnNhY3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAke3BhcmFtcy50eXBlfWApO1xuICAgIH1cblxuICAgIGxldCB1bnNpZ25lZFR4OiBFZGRzYVVuc2lnbmVkVHJhbnNhY3Rpb247XG5cbiAgICBpZiAodHhSZXF1ZXN0LmFwaVZlcnNpb24gPT09ICdmdWxsJykge1xuICAgICAgaWYgKHR4UmVxdWVzdC50cmFuc2FjdGlvbnM/Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgc2luZ2xlIHVuc2lnbmVkIHR4IGZvciB0eCByZXF1ZXN0IHdpdGggaWQ6ICR7dHhSZXF1ZXN0LnR4UmVxdWVzdElkfWApO1xuICAgICAgfVxuXG4gICAgICB1bnNpZ25lZFR4ID0gdHhSZXF1ZXN0LnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHhSZXF1ZXN0LnVuc2lnbmVkVHhzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgc2luZ2xlIHVuc2lnbmVkIHR4IGZvciB0eCByZXF1ZXN0IHdpdGggaWQ6ICR7dHhSZXF1ZXN0LnR4UmVxdWVzdElkfWApO1xuICAgICAgfVxuICAgICAgdW5zaWduZWRUeCA9IHR4UmVxdWVzdC51bnNpZ25lZFR4c1swXTtcbiAgICB9XG5cbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpKTtcbiAgICByZXR1cm4ge1xuICAgICAgd2FsbGV0SWQ6IHRoaXMuaWQoKSxcbiAgICAgIHdhbGxldDogdGhpcyxcbiAgICAgIHR4UmVxdWVzdElkOiB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICB0eEhleDogdW5zaWduZWRUeC5zZXJpYWxpemVkVHhIZXgsXG4gICAgICBidWlsZFBhcmFtczogd2hpdGVsaXN0ZWRQYXJhbXMsXG4gICAgICBmZWVJbmZvOiB1bnNpZ25lZFR4LmZlZUluZm8sXG4gICAgICAuLi4odHhSZXF1ZXN0LnBlbmRpbmdBcHByb3ZhbElkICYmIHtcbiAgICAgICAgcGVuZGluZ0FwcHJvdmFsSWQ6IHR4UmVxdWVzdC5wZW5kaW5nQXBwcm92YWxJZCxcbiAgICAgIH0pLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0cmFuc2FjdGlvbiBmcm9tIGEgVFNTIEVkRFNBIHdhbGxldCB1c2luZyBleHRlcm5hbCBzaWduZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRWREU0EoXG4gICAgcGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30sXG4gICAgY29pbjogSUJhc2VDb2luXG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgbGV0IHR4UmVxdWVzdElkID0gJyc7XG4gICAgaWYgKHBhcmFtcy50eFJlcXVlc3RJZCkge1xuICAgICAgdHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMudHhQcmVidWlsZCAmJiBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgdHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeFJlcXVlc3RJZCByZXF1aXJlZCB0byBzaWduIFRTUyB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tQ29tbWl0bWVudEdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIGNvbW1pdG1lbnQgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tUlNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgUiBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21HU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBHIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGFzc2VydCh0aGlzLnRzc1V0aWxzLCAndHNzVXRpbHMgbXVzdCBiZSBkZWZpbmVkJyk7XG4gICAgLy8gYWRkaW5nIHRoaXMgdG8gcmVidWlsZCB0aGUgdHJhbnNhY3Rpb24ganVzdCBiZWZvcmUgc2lnbmluZyBmb3IgRWREU0EgdHJhbnNhY3Rpb24gdXNpbmcgZXh0ZXJuYWwgc2lnbmVyXG4gICAgY29uc3QgcmVxSWQgPSBwYXJhbXMucmVxSWQgfHwgdW5kZWZpbmVkO1xuICAgIGF3YWl0IHRoaXMudHNzVXRpbHMuZGVsZXRlU2lnbmF0dXJlU2hhcmVzKHR4UmVxdWVzdElkLCByZXFJZCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2lnbmVkVHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscy5zaWduRWRkc2FUc3NVc2luZ0V4dGVybmFsU2lnbmVyKFxuICAgICAgICB0eFJlcXVlc3RJZCxcbiAgICAgICAgcGFyYW1zLmN1c3RvbUNvbW1pdG1lbnRHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21HU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgICAgIHJlcUlkXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNpZ25lZFR4UmVxdWVzdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBzaWduIHRyYW5zYWN0aW9uICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYW5kIHNlbmRzIGEgdHJhbnNhY3Rpb24gcmVxdWVzdCBmcm9tIGEgVFNTIChob3QpIHdhbGxldCwgb3IgYSBTTUMgKGNvbGQpIHdhbGxldCB3aXRoIGFuIGV4dGVybmFsIHNpZ25lci5cbiAgICogTWVhbnQgdG8gYmUgdXNlZCBmb3IgYSB0cmFuc2FjdGlvbiByZXF1ZXN0IHdoZXJlIHRoZSBzaWduaW5nIHByb2Nlc3MgaXMgYWJvcnRlZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgICB0eFJlcXVlc3RJZCAtIFRoZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogICAgd2FsbGV0UGFzc3BocmFzZSAtIFRoZSBwYXNzcGhyYXNlIGZvciB0aGUgd2FsbGV0LlxuICAgKiAgICBpc1R4UmVxdWVzdEZ1bGwgLSBGbGFnIGluZGljYXRpbmcgaWYgdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QgaXMgZnVsbC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBTaWduZWRUcmFuc2FjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzaWduQW5kU2VuZFR4UmVxdWVzdChwYXJhbXM6IFNpZ25BbmRTZW5kVHhSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICBpZiAocGFyYW1zLmlzVHhSZXF1ZXN0RnVsbCkge1xuICAgICAgYXdhaXQgdGhpcy50c3NVdGlscz8uZGVsZXRlU2lnbmF0dXJlU2hhcmVzKHBhcmFtcy50eFJlcXVlc3RJZCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgdGhpcy5nZXRVc2VyS2V5QW5kU2lnblRzc1RyYW5zYWN0aW9uKHtcbiAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgdHhSZXF1ZXN0SWQ6IHBhcmFtcy50eFJlcXVlc3RJZCxcbiAgICB9KTtcbiAgICBpZiAoIXBhcmFtcy5pc1R4UmVxdWVzdEZ1bGwpIHtcbiAgICAgIC8vIEl0IGlzIGFzc3VtZWQgdGhhdCBpZiBpdHMgbm90IGEgZnVsbCB0eCByZXF1ZXN0LCB0aGVuIGl0IGlzIGEgbGl0ZSB0eCByZXF1ZXN0XG4gICAgICBjb25zdCBzdWJtaXRUeCA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFJlcXVlc3RJZDogcGFyYW1zLnR4UmVxdWVzdElkLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3VibWl0VHg7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyBzaWduYXR1cmUgc2hhcmVzIGFyZSBpbiBhIGNsZWFuIHN0YXRlIGJlZm9yZSBzaWduaW5nIGEgdHJhbnNhY3Rpb24uXG4gICAqIEF1dG9tYXRpY2FsbHkgZGVsZXRlcyBzaWduYXR1cmUgc2hhcmVzIGZvciBGdWxsIFR4UmVxdWVzdHMgYmVmb3JlIHNpZ25pbmcgdG8gcHJldmVudFxuICAgKiBpc3N1ZXMgd2l0aCBzdGFsZSBvciBwYXJ0aWFsIHNpZ25hdHVyZXMuXG4gICAqIFVzZSB0aGlzIGZvciBFeHByZXNzIEFQSSBhbmQgb3RoZXIgaW50ZWdyYXRpb25zIHRoYXQgbmVlZCBhdXRvbWF0aWMgY2xlYW51cCBvZiBzaWduYXR1cmVzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gc2lnbmluZyBvcHRpb25zXG4gICAqIEByZXR1cm5zIHNpZ25lZCB0cmFuc2FjdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuc3VyZUNsZWFuU2lnU2hhcmVzQW5kU2lnblRyYW5zYWN0aW9uKFxuICAgIHBhcmFtczogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24gfCBUeFJlcXVlc3Q+IHtcbiAgICBjb25zdCB0eFJlcXVlc3RJZCA9IHBhcmFtcy50eFJlcXVlc3RJZCB8fCBwYXJhbXMudHhQcmVidWlsZD8udHhSZXF1ZXN0SWQ7XG5cbiAgICBpZiAodHhSZXF1ZXN0SWQgJiYgdGhpcy50c3NVdGlscyAmJiB0aGlzLm11bHRpc2lnVHlwZSgpID09PSAndHNzJykge1xuICAgICAgY29uc3QgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscy5nZXRUeFJlcXVlc3QodHhSZXF1ZXN0SWQpO1xuXG4gICAgICAvLyBBbHdheXMgY2xlYW4gc2lnbmF0dXJlIHNoYXJlcyBmb3IgRnVsbCBUeFJlcXVlc3RzIGJlZm9yZSBzaWduaW5nXG4gICAgICBjb25zdCBpc0Z1bGwgPVxuICAgICAgICB0eFJlcXVlc3QuYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnICYmXG4gICAgICAgICgodHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyA/PyBbXSkubGVuZ3RoID4gMCB8fCAodHhSZXF1ZXN0Lm1lc3NhZ2VzID8/IFtdKS5sZW5ndGggPiAwKTtcblxuICAgICAgaWYgKGlzRnVsbCkge1xuICAgICAgICBhd2FpdCB0aGlzLnRzc1V0aWxzLmRlbGV0ZVNpZ25hdHVyZVNoYXJlcyh0eFJlcXVlc3RJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2lnblRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0cmFuc2FjdGlvbiBmcm9tIGEgVFNTIEVDRFNBIHdhbGxldCB1c2luZyBleHRlcm5hbCBzaWduZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRUNEU0EoXG4gICAgY29pbjogSUJhc2VDb2luLFxuICAgIHBhcmFtczogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgbGV0IHR4UmVxdWVzdElkID0gJyc7XG4gICAgaWYgKHBhcmFtcy50eFJlcXVlc3RJZCkge1xuICAgICAgdHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMudHhQcmVidWlsZCAmJiBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgdHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeFJlcXVlc3RJZCByZXF1aXJlZCB0byBzaWduIFRTUyB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tUGFpbGxpZXJNb2R1bHVzR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgcGFpbGxpZXIgbW9kdWx1cyByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21LU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBLIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbU11RGVsdGFTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIE11RGVsdGEgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tU1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgUyBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXNzZXJ0KHRoaXMudHNzVXRpbHMsICd0c3NVdGlscyBtdXN0IGJlIGRlZmluZWQnKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMuc2lnbkVjZHNhVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICAgICAge1xuICAgICAgICAgIHR4UmVxdWVzdDogdHhSZXF1ZXN0SWQsXG4gICAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpLFxuICAgICAgICB9LFxuICAgICAgICBSZXF1ZXN0VHlwZS50eCxcbiAgICAgICAgcGFyYW1zLmN1c3RvbVBhaWxsaWVyTW9kdWx1c0dlbmVyYXRpbmdGdW5jdGlvbixcbiAgICAgICAgcGFyYW1zLmN1c3RvbUtTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICAgICAgcGFyYW1zLmN1c3RvbU11RGVsdGFTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICAgICAgcGFyYW1zLmN1c3RvbVNTaGFyZUdlbmVyYXRpbmdGdW5jdGlvblxuICAgICAgKTtcbiAgICAgIHJldHVybiBzaWduZWRUeFJlcXVlc3Q7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiB0cmFuc2FjdGlvbiAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gZnJvbSBhIFRTUyBFQ0RTQSB3YWxsZXQgdXNpbmcgZXh0ZXJuYWwgc2lnbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNpZ25pbmcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHJhbnNhY3Rpb25Uc3NFeHRlcm5hbFNpZ25lckVDRFNBTVBDdjIoXG4gICAgY29pbjogSUJhc2VDb2luLFxuICAgIHBhcmFtczogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgbGV0IHR4UmVxdWVzdElkID0gJyc7XG4gICAgaWYgKHBhcmFtcy50eFJlcXVlc3RJZCkge1xuICAgICAgdHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMudHhQcmVidWlsZCAmJiBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgdHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeFJlcXVlc3RJZCByZXF1aXJlZCB0byBzaWduIFRTUyB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgTVBDdjIgUm91bmQgMSBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0aW9uRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBNUEN2MiBSb3VuZCAyIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRpb25GdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIE1QQ3YyIFJvdW5kIDMgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGFzc2VydCh0aGlzLnRzc1V0aWxzLCAndHNzVXRpbHMgbXVzdCBiZSBkZWZpbmVkJyk7XG4gICAgICBjb25zdCBzaWduZWRUeFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzLnNpZ25FY2RzYU1QQ3YyVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICAgICAge1xuICAgICAgICAgIHR4UmVxdWVzdDogdHhSZXF1ZXN0SWQsXG4gICAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpLFxuICAgICAgICB9LFxuICAgICAgICBwYXJhbXMuY3VzdG9tTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdGlvbkZ1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdGlvbkZ1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdGlvbkZ1bmN0aW9uXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNpZ25lZFR4UmVxdWVzdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBzaWduIHRyYW5zYWN0aW9uICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0cmFuc2FjdGlvbiBmcm9tIGEgVFNTIHdhbGxldC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzaWduaW5nIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblRyYW5zYWN0aW9uVHNzKHBhcmFtczogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGlmICghcGFyYW1zLnR4UHJlYnVpbGQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHhQcmVidWlsZCByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHhSZXF1ZXN0SWQgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggVFNTJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRzc1V0aWxzIS5zaWduVHhSZXF1ZXN0KHtcbiAgICAgICAgdHhSZXF1ZXN0OiBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCxcbiAgICAgICAgdHhQYXJhbXM6IHBhcmFtcy50eFByZWJ1aWxkLmJ1aWxkUGFyYW1zLFxuICAgICAgICBwcnY6IHBhcmFtcy5wcnYsXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSxcbiAgICAgICAgYXBpVmVyc2lvbjogcGFyYW1zLmFwaVZlcnNpb24sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBzaWduIHRyYW5zYWN0aW9uICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSBtZXNzYWdlIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNpZ25pbmcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduTWVzc2FnZVRzcyhwYXJhbXM6IFdhbGxldFNpZ25NZXNzYWdlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRNZXNzYWdlPiB7XG4gICAgaWYgKCFwYXJhbXMucmVxSWQpIHtcbiAgICAgIHBhcmFtcy5yZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiByZXF1aXJlZCB0byBzaWduIG1lc3NhZ2Ugd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgbGV0IHR4UmVxdWVzdDtcbiAgICAgIGFzc2VydChwYXJhbXMubWVzc2FnZSwgJ21lc3NhZ2UgcmVxdWlyZWQgZm9yIG1lc3NhZ2Ugc2lnbmluZycpO1xuICAgICAgY29uc3QgbWVzc2FnZVJhdyA9IHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VSYXc7XG5cbiAgICAgIGlmICghcGFyYW1zLm1lc3NhZ2UudHhSZXF1ZXN0SWQpIHtcbiAgICAgICAgY29uc3QgaW50ZW50T3B0aW9uOiBJbnRlbnRPcHRpb25zRm9yTWVzc2FnZSA9IHtcbiAgICAgICAgICBjdXN0b2RpYW5NZXNzYWdlSWQ6IHBhcmFtcy5jdXN0b2RpYW5NZXNzYWdlSWQsXG4gICAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICAgICAgICBpbnRlbnRUeXBlOiAnc2lnbk1lc3NhZ2UnLFxuICAgICAgICAgIGlzVHNzOiB0cnVlLFxuICAgICAgICAgIG1lc3NhZ2VSYXcsXG4gICAgICAgICAgbWVzc2FnZVN0YW5kYXJkVHlwZTogcGFyYW1zLm1lc3NhZ2UubWVzc2FnZVN0YW5kYXJkVHlwZSxcbiAgICAgICAgICBzaWduZXJBZGRyZXNzOiBwYXJhbXMubWVzc2FnZS5zaWduZXJBZGRyZXNzLFxuICAgICAgICB9O1xuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5idWlsZFNpZ25NZXNzYWdlUmVxdWVzdChpbnRlbnRPcHRpb24pO1xuICAgICAgICBwYXJhbXMubWVzc2FnZS50eFJlcXVlc3RJZCA9IHR4UmVxdWVzdC50eFJlcXVlc3RJZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLmlkKCksIHBhcmFtcy5tZXNzYWdlLnR4UmVxdWVzdElkLCBwYXJhbXMucmVxSWQpO1xuICAgICAgfVxuXG4gICAgICBhc3NlcnQoXG4gICAgICAgIHR4UmVxdWVzdC5tZXNzYWdlcyAmJiB0eFJlcXVlc3QubWVzc2FnZXMubGVuZ3RoID4gMCxcbiAgICAgICAgJ1VuYWJsZSB0byBmaW5kIG1lc3NhZ2VzIGluIHR4UmVxdWVzdCBmb3IgbWVzc2FnZSBzaWduaW5nJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VFbmNvZGVkID0gdHhSZXF1ZXN0Lm1lc3NhZ2VzWzBdLm1lc3NhZ2VFbmNvZGVkO1xuXG4gICAgICBjb25zdCBzaWduZWRNZXNzYWdlUmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnNpZ25UeFJlcXVlc3RGb3JNZXNzYWdlKHtcbiAgICAgICAgdHhSZXF1ZXN0LFxuICAgICAgICBwcnY6IHBhcmFtcy5wcnYsXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSxcbiAgICAgICAgbWVzc2FnZVJhdyxcbiAgICAgICAgbWVzc2FnZUVuY29kZWQsXG4gICAgICAgIGJ1ZmZlclRvU2lnbjogQnVmZmVyLmZyb20obWVzc2FnZUVuY29kZWQsICdoZXgnKSxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0KHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzLCAnVW5hYmxlIHRvIGZpbmQgbWVzc2FnZXMgaW4gc2lnbmVkTWVzc2FnZVJlcXVlc3QnKTtcbiAgICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpID09PSBDb2luRmFtaWx5LkVUSCkge1xuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXNbMF0uY29tYmluZVNpZ1NoYXJlLFxuICAgICAgICAgICdVbmFibGUgdG8gZmluZCBjb21iaW5lU2lnU2hhcmUgaW4gc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXMnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBhc3NlcnQoc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXNbMF0udHhIYXNoLCAnVW5hYmxlIHRvIGZpbmQgdHhIYXNoIGluIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2luOiB0aGlzLmNvaW4oKSxcbiAgICAgICAgdHhIYXNoOiBzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsXG4gICAgICAgIHNpZ25hdHVyZTogc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXNbMF0udHhIYXNoLFxuICAgICAgICBtZXNzYWdlUmF3LFxuICAgICAgICBtZXNzYWdlRW5jb2RlZCxcbiAgICAgICAgdHhSZXF1ZXN0SWQ6IHNpZ25lZE1lc3NhZ2VSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBzaWduIG1lc3NhZ2UgJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIHR5cGVkIGRhdGEgZnJvbSBhIFRTUyB3YWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblR5cGVkRGF0YVRzcyhwYXJhbXM6IFdhbGxldFNpZ25UeXBlZERhdGFPcHRpb25zKTogUHJvbWlzZTxTaWduZWRNZXNzYWdlPiB7XG4gICAgaWYgKCFwYXJhbXMucmVxSWQpIHtcbiAgICAgIHBhcmFtcy5yZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcnYgcmVxdWlyZWQgdG8gc2lnbiB0eXBlZCBkYXRhIHdpdGggVFNTJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGxldCB0eFJlcXVlc3Q7XG4gICAgICBhc3NlcnQocGFyYW1zLnR5cGVkRGF0YSwgJ3R5cGVkRGF0YSByZXF1aXJlZCBmb3IgdHlwZWQgZGF0YSBzaWduaW5nJyk7XG4gICAgICBpZiAoIXBhcmFtcy50eXBlZERhdGEudHhSZXF1ZXN0SWQpIHtcbiAgICAgICAgY29uc3QgaW50ZW50T3B0aW9uczogSW50ZW50T3B0aW9uc0ZvclR5cGVkRGF0YSA9IHtcbiAgICAgICAgICBjdXN0b2RpYW5NZXNzYWdlSWQ6IHBhcmFtcy5jdXN0b2RpYW5NZXNzYWdlSWQsXG4gICAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICAgICAgICBpbnRlbnRUeXBlOiAnc2lnblR5cGVkU3RydWN0dXJlZERhdGEnLFxuICAgICAgICAgIGlzVHNzOiB0cnVlLFxuICAgICAgICAgIHR5cGVkRGF0YVJhdzogcGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFSYXcsXG4gICAgICAgICAgdHlwZWREYXRhRW5jb2RlZDogcGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFFbmNvZGVkIS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH07XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLmNyZWF0ZVR4UmVxdWVzdFdpdGhJbnRlbnRGb3JUeXBlZERhdGFTaWduaW5nKGludGVudE9wdGlvbnMpO1xuICAgICAgICBwYXJhbXMudHlwZWREYXRhLnR4UmVxdWVzdElkID0gdHhSZXF1ZXN0LnR4UmVxdWVzdElkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMuaWQoKSwgcGFyYW1zLnR5cGVkRGF0YS50eFJlcXVlc3RJZCwgcGFyYW1zLnJlcUlkKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2lnbmVkVHlwZWREYXRhUmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnNpZ25UeFJlcXVlc3RGb3JNZXNzYWdlKHtcbiAgICAgICAgdHhSZXF1ZXN0LFxuICAgICAgICBwcnY6IHBhcmFtcy5wcnYsXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSxcbiAgICAgICAgbWVzc2FnZVJhdzogSlNPTi5zdHJpbmdpZnkocGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFSYXcpLFxuICAgICAgICBtZXNzYWdlRW5jb2RlZDogcGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFFbmNvZGVkIS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIGJ1ZmZlclRvU2lnbjogcGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFFbmNvZGVkISxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0KHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QubWVzc2FnZXMsICdVbmFibGUgdG8gZmluZCBtZXNzYWdlcyBpbiBzaWduZWRUeXBlZERhdGFSZXF1ZXN0Jyk7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QubWVzc2FnZXNbMF0uY29tYmluZVNpZ1NoYXJlLFxuICAgICAgICAnVW5hYmxlIHRvIGZpbmQgY29tYmluZVNpZ1NoYXJlIGluIHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QubWVzc2FnZXMnXG4gICAgICApO1xuICAgICAgYXNzZXJ0KHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QubWVzc2FnZXNbMF0udHhIYXNoLCAnVW5hYmxlIHRvIGZpbmQgdHhIYXNoIGluIHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QubWVzc2FnZXMnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvaW46IHRoaXMuY29pbigpLFxuICAgICAgICB0eEhhc2g6IHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QubWVzc2FnZXNbMF0udHhIYXNoLFxuICAgICAgICBzaWduYXR1cmU6IHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QubWVzc2FnZXNbMF0udHhIYXNoLFxuICAgICAgICBtZXNzYWdlUmF3OiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YVJhdyxcbiAgICAgICAgbWVzc2FnZUVuY29kZWQ6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhRW5jb2RlZCEudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB0eFJlcXVlc3RJZDogc2lnbmVkVHlwZWREYXRhUmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiB0eXBlZCBkYXRhICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzLCBzaWducywgYW5kIHNlbmRzIGEgdHJhbnNhY3Rpb24gZnJvbSBhIFRTUyB3YWxsZXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2VuZCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRNYW55VHhSZXF1ZXN0cyhwYXJhbXM6IFNlbmRNYW55T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBwYXJhbXMuYXBpVmVyc2lvbiA9IGdldFR4UmVxdWVzdEFwaVZlcnNpb24odGhpcywgcGFyYW1zLmFwaVZlcnNpb24pO1xuXG4gICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSAoYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpKSBhcyBTaWduZWRUcmFuc2FjdGlvblJlcXVlc3Q7XG4gICAgaWYgKCFzaWduZWRUcmFuc2FjdGlvbi50eFJlcXVlc3RJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFJlcXVlc3RJZCBtaXNzaW5nIGZyb20gc2lnbmVkIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hcGlWZXJzaW9uID09PSAnZnVsbCcpIHtcbiAgICAgIGNvbnN0IGxhdGVzdFR4UmVxdWVzdCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLmlkKCksIHNpZ25lZFRyYW5zYWN0aW9uLnR4UmVxdWVzdElkLCBwYXJhbXMucmVxSWQpO1xuICAgICAgY29uc3QgcmVxSWQgPSBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgICBjb25zdCB0cmFuc2Zlcjoge1xuICAgICAgICBzdGF0ZTogc3RyaW5nO1xuICAgICAgICBwZW5kaW5nQXBwcm92YWw/OiBzdHJpbmc7XG4gICAgICAgIHR4aWQ/OiBzdHJpbmc7XG4gICAgICB9ID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAucG9zdChcbiAgICAgICAgICB0aGlzLmJpdGdvLnVybChcbiAgICAgICAgICAgICcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3R4cmVxdWVzdHMvJyArIHNpZ25lZFRyYW5zYWN0aW9uLnR4UmVxdWVzdElkICsgJy90cmFuc2ZlcnMnLFxuICAgICAgICAgICAgMlxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAuc2VuZCgpXG4gICAgICAgIC5yZXN1bHQoKTtcbiAgICAgIGlmIChsYXRlc3RUeFJlcXVlc3Quc3RhdGUgPT09ICdwZW5kaW5nQXBwcm92YWwnKSB7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdBcHByb3ZhbHMgPSBuZXcgUGVuZGluZ0FwcHJvdmFscyh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luKTtcbiAgICAgICAgY29uc3QgcGVuZGluZ0FwcHJvdmFsID0gYXdhaXQgcGVuZGluZ0FwcHJvdmFscy5nZXQoe1xuICAgICAgICAgIGlkOiBsYXRlc3RUeFJlcXVlc3QucGVuZGluZ0FwcHJvdmFsSWQsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBlbmRpbmdBcHByb3ZhbDogcGVuZGluZ0FwcHJvdmFsLnRvSlNPTigpLFxuICAgICAgICAgIHR4UmVxdWVzdDogbGF0ZXN0VHhSZXF1ZXN0LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHJhbnNmZXIsXG4gICAgICAgIHR4UmVxdWVzdDogbGF0ZXN0VHhSZXF1ZXN0LFxuICAgICAgICB0eGlkOiAobGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyA/PyBbXSlbMF0/LnNpZ25lZFR4Py5pZCxcbiAgICAgICAgdHg6IChsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zID8/IFtdKVswXT8uc2lnbmVkVHg/LnR4LFxuICAgICAgICBzdGF0dXM6IHRyYW5zZmVyLnN0YXRlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMudHNzVXRpbHM/LnNlbmRUeFJlcXVlc3Qoc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQsIHJlcUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGZ1bmRzIGZyb20gYSBmZWUgYWRkcmVzcyB0byBhIGZvcndhcmRlci4gT25seSBzdXBwb3J0cyBldGgtbGlrZSBjb2lucy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuZm9yd2FyZGVyQWRkcmVzcyAtIEFkZHJlc3Mgb2YgdGhlIGZvcndhcmRlciB0byBzZW5kIGZ1bmRzIHRvLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmFtb3VudCAtIEFtb3VudCB0byBzZW5kIHRoZSBmb3J3YXJkZXIgKG9wdGlvbmFsKS4gSWYgbm90IGdpdmVuLCBkZWZhdWx0cyB0byBzZW5kaW5nIGFuIGVzdGltYXRlIG9mIHRoZSBhbW91bnQgbmVlZGVkIGZvciBhIGZ1bmQgcmVjb3ZlcnlcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZnVuZEZvcndhcmRlcihwYXJhbXM6IEZ1bmRGb3J3YXJkZXJzT3B0aW9ucyk6IFByb21pc2U8V2FsbGV0RGF0YT4ge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5mb3J3YXJkZXJBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3J3YXJkZXIgYWRkcmVzcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybCgnL2Z1bmRGb3J3YXJkZXInKTtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGZ1bmRzIGZyb20gYSBmZWUgYWRkcmVzcyB0byBhIGZvcndhcmRlci5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7TGlzdH0gcGFyYW1zLmZvcndhcmRlcnMgLSBsaXN0IG9mIGZ1bmQgZm9yd2FyZGVyIG9wdGlvbnNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZnVuZEZvcndhcmRlcnMocGFyYW1zOiBGdW5kRm9yd2FyZGVyUGFyYW1zKTogUHJvbWlzZTxXYWxsZXREYXRhPiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmZvcndhcmRlcnMpIHx8IHBhcmFtcy5mb3J3YXJkZXJzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Z1bmQgZm9yd2FyZGVyIG9wdGlvbnMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9mdW5kZm9yd2FyZGVycycpO1xuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZm9yd2FyZGVyJ3MgYmFsYW5jZVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gb3B0aW9uYWwgcXVlcnkgcGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyBMaXN0IG9mIGZvcndhcmRlciBhZGRyZXNzIGFuZCBiYWxhbmNlXG4gICAqIGlmIHBhcmFtcyBpcyBub3Qgc2V0IHRoZW4gcmV0dXJucyBsb3cgYmFsYW5jZSBmb3J3YXJkZXJzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Rm9yd2FyZGVyQmFsYW5jZShwYXJhbXM/OiBGb3J3YXJkZXJCYWxhbmNlT3B0aW9ucyk6IFByb21pc2U8Rm9yd2FyZGVyQmFsYW5jZVtdPiB7XG4gICAgY29uc3QgcXVlcnk6IEZvcndhcmRlckJhbGFuY2VPcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcz8ubWF4aW11bUJhbGFuY2UpIHtcbiAgICAgIHF1ZXJ5Lm1heGltdW1CYWxhbmNlID0gcGFyYW1zPy5tYXhpbXVtQmFsYW5jZTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zPy5taW5pbXVtQmFsYW5jZSkge1xuICAgICAgcXVlcnkubWluaW11bUJhbGFuY2UgPSBwYXJhbXM/Lm1pbmltdW1CYWxhbmNlO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKGAvZm9yd2FyZGVycy9iYWxhbmNlc2ApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodXJsKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIHJlc3BvbnNlIGFzIEZvcndhcmRlckJhbGFuY2VbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBlY2RzYSB0c3MgY2hhbGxlbmdlcyBmb3IgYSB3YWxsZXQuXG4gICAqIFRoZXNlIGFyZSBzdGF0aWMgY2hhbGxlbmdlcyB0aGF0IGhhdmUgYmVlbiB2ZXJpZmllZCBieSBhbiBlbnRlcnByaXNlIGFkbWluLlxuICAgKiBDYWxsZXJzIHNob3VsZCB2ZXJpZnkgdGhhdCBhbiBlbnRlcnByaXNlIGFkbWluIHNpZ25lZCB0aGUgY2hhbGxlbmdlIHZhbHVlcyBiZWZvcmUgdXNpbmcgdGhlbS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8V2FsbGV0RWNkc2FDaGFsbGVuZ2VzPn1cbiAgICovXG4gIGFzeW5jIGdldENoYWxsZW5nZXNGb3JFY2RzYVNpZ25pbmcoKTogUHJvbWlzZTxXYWxsZXRFY2RzYUNoYWxsZW5nZXM+IHtcbiAgICAvLyBub3RlOiB0aGlzIGlzIG5vdCBhIGNvaW4gc3BlY2lmaWMgcm91dGUsIHdlIGNhbm5vdCB1c2UgdGhpcy51cmwoLi4pXG4gICAgY29uc3QgdXJsID0gdGhpcy5iaXRnby51cmwoYC93YWxsZXQvJHt0aGlzLmlkKCl9L2NoYWxsZW5nZXNgLCAyKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodXJsKS5xdWVyeSh7fSkucmVzdWx0KCk7XG4gIH1cblxuICBwcml2YXRlIHNlbmRUcmFuc2FjdGlvbihwYXJhbXM6IFR4U2VuZEJvZHksIHJlcUlkPzogSVJlcXVlc3RUcmFjZXIpIHtcbiAgICAvLyBleHRyYWN0IHRoZSB3aGl0ZWxpc3RlZCBwYXJhbXMgZnJvbSB0aGUgdG9wIGxldmVsLCBpbiBjYXNlXG4gICAgLy8gb3RoZXIgaW52YWxpZCBwYXJhbXMgYXJlIHByZXNlbnQgdGhhdCB3b3VsZCBmYWlsIGVuY29kaW5nXG4gICAgLy8gYW5kIGZhbGwgYmFjayB0byB0aGUgYm9keSBwYXJhbXNcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IHRoaXMuYmFzZUNvaW4ucHJlcHJvY2Vzc0J1aWxkUGFyYW1zKF8ucGljayhwYXJhbXMsIHdoaXRlbGlzdGVkU2VuZFBhcmFtcykpO1xuICAgIGNvbnN0IHJlcVRyYWNlciA9IHJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcVRyYWNlcik7XG4gICAgcmV0dXJuIHBvc3RXaXRoQ29kZWMoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvdHgvc2VuZCcpLFxuICAgICAgdC5pbnRlcnNlY3Rpb24oW1R4U2VuZEJvZHksIHQucGFydGlhbCh7IGxvY2t0aW1lOiB0Lm51bWJlciB9KV0pLFxuICAgICAgd2hpdGVsaXN0ZWRQYXJhbXNcbiAgICApLnJlc3VsdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWF0ZVRyYW5zYWN0aW9uKHBhcmFtczogVHhTZW5kQm9keSwgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcikge1xuICAgIC8vIGV4dHJhY3QgdGhlIHdoaXRlbGlzdGVkIHBhcmFtcyBmcm9tIHRoZSB0b3AgbGV2ZWwsIGluIGNhc2VcbiAgICAvLyBvdGhlciBpbnZhbGlkIHBhcmFtcyBhcmUgcHJlc2VudCB0aGF0IHdvdWxkIGZhaWwgZW5jb2RpbmdcbiAgICAvLyBhbmQgZmFsbCBiYWNrIHRvIHRoZSBib2R5IHBhcmFtc1xuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gdGhpcy5iYXNlQ29pbi5wcmVwcm9jZXNzQnVpbGRQYXJhbXMoXy5waWNrKHBhcmFtcywgd2hpdGVsaXN0ZWRTZW5kUGFyYW1zKSk7XG4gICAgY29uc3QgcmVxVHJhY2VyID0gcmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxVHJhY2VyKTtcbiAgICByZXR1cm4gcG9zdFdpdGhDb2RlYyhcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy90eC9pbml0aWF0ZScpLFxuICAgICAgVHhTZW5kQm9keSxcbiAgICAgIHdoaXRlbGlzdGVkUGFyYW1zXG4gICAgKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2FsbGV0IGtleWNoYWlucyBhbmQgdmFsaWRhdGUgcGFzc3BocmFzZSBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIHtQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9uc30gcGFyYW1zIC0gcHJlYnVpbGQgdHJhbnNhY3Rpb24gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZCBmb3IgdHJhY2luZyBwdXJwb3Nlc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJhbXMuY3VzdG9tU2lnbmluZ0Z1bmN0aW9uIC0gY3VzdG9tIHNpZ25pbmcgZnVuY3Rpb24gZm9yIGV4dGVybmFsIHNpZ25pbmdcbiAgICogQHJldHVybnMge1Byb21pc2U8S2V5Y2hhaW5bXT59XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZSh7XG4gICAgY3VzdG9tU2lnbmluZ0Z1bmN0aW9uLFxuICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgcmVxSWQsXG4gIH06IFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zICYgV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8S2V5Y2hhaW5bXT4ge1xuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkIH0pO1xuXG4gICAgLy8gRG9pbmcgYSBzYW5pdHkgY2hlY2sgZm9yIHBhc3N3b3JkIGhlcmUgdG8gYXZvaWQgZG9pbmcgZnVydGhlciB3b3JrIGlmIHdlIGtub3cgaXQncyB3cm9uZ1xuICAgIC8vIHdlIGlnbm9yZSB0aGlzIGNoZWNrIHdpdGggaWYgY3VzdG9tU2lnbmluZ0Z1bmN0aW9uIGlzIHByb3ZpZGVkXG4gICAgLy8gIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHVzZXIgaXMgaGFuZGxpbmcgdGhlIHNpZ25pbmcgaW4gZXh0ZXJuYWwgc2lnbmluZyBtb2RlXG4gICAgaWYgKCFjdXN0b21TaWduaW5nRnVuY3Rpb24gJiYga2V5Y2hhaW5zPy5bMF0/LmVuY3J5cHRlZFBydiAmJiB3YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICBpZiAoIShhd2FpdCBkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5QXN5bmModGhpcy5iaXRnbywga2V5Y2hhaW5zWzBdLCB3YWxsZXRQYXNzcGhyYXNlKSkpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IEVycm9yICYgeyBjb2RlPzogc3RyaW5nIH0gPSBuZXcgRXJyb3IoXG4gICAgICAgICAgYHVuYWJsZSB0byBkZWNyeXB0IGtleWNoYWluIHdpdGggdGhlIGdpdmVuIHdhbGxldCBwYXNzcGhyYXNlYFxuICAgICAgICApO1xuICAgICAgICBlcnJvci5jb2RlID0gJ3dhbGxldF9wYXNzcGhyYXNlX2luY29ycmVjdCc7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5Y2hhaW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcHJvdmUgdG9rZW4gZm9yIHVzZSB3aXRoIGEgYmF0Y2hlciBjb250cmFjdFxuICAgKiBUaGlzIGZ1bmN0aW9uIGJ1aWxkcywgc2lnbnMsIGFuZCBzZW5kcyBhIHRva2VuIGFwcHJvdmFsIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB3YWxsZXRQYXNzcGhyYXNlIC0gVGhlIHBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB1c2VyIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRva2VuIHRvIGJlIGFwcHJvdmVkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFRoZSB0cmFuc2FjdGlvbiBkZXRhaWxzXG4gICAqL1xuICBhc3luYyBhcHByb3ZlRXJjMjBUb2tlbih3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmcsIHRva2VuTmFtZTogc3RyaW5nKTogUHJvbWlzZTxTdWJtaXRUcmFuc2FjdGlvblJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBsZXQgdG9rZW5BcHByb3ZhbEJ1aWxkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLmJhc2VDb2luLnVybChgL3dhbGxldC8ke3RoaXMuaWQoKX0vdG9rZW4vYXBwcm92YWwvYnVpbGRgKTtcbiAgICAgIHRva2VuQXBwcm92YWxCdWlsZCA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgICAgLnBvc3QodXJsKVxuICAgICAgICAuc2VuZCh7XG4gICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbk5hbWUsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXN1bHQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICAgIHJlcUlkLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNpZ25pbmdQYXJhbXMgPSB7XG4gICAgICB0eFByZWJ1aWxkOiB0b2tlbkFwcHJvdmFsQnVpbGQsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIHJlcUlkLFxuICAgIH07XG5cbiAgICBjb25zdCBoYWxmU2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbihzaWduaW5nUGFyYW1zKTtcbiAgICBjb25zdCBmaW5hbFR4UGFyYW1zID0gXy5leHRlbmQoe30sIGhhbGZTaWduZWRUcmFuc2FjdGlvbik7XG5cbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24oZmluYWxUeFBhcmFtcywgcmVxSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRva2VuIGFwcHJvdmFsIHRyYW5zYWN0aW9uIGZvciBFUkMyMCB0b2tlbnNcbiAgICogSWYgd2FsbGV0UGFzc3BocmFzZSBpcyBwcm92aWRlZCwgYWxzbyBzaWducyBhbmQgc2VuZHMgdGhlIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlbk5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdG9rZW4gdG8gYmUgYXBwcm92ZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt3YWxsZXRQYXNzcGhyYXNlXSAtIE9wdGlvbmFsIHdhbGxldCBwYXNzcGhyYXNlIGZvciBzaWduaW5nIGFuZCBzZW5kaW5nXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEJ1aWxkVG9rZW5BcHByb3ZhbFJlc3BvbnNlIHwgU3VibWl0VHJhbnNhY3Rpb25SZXNwb25zZT59IFRoZSB0b2tlbiBhcHByb3ZhbCBidWlsZCByZXNwb25zZSBvciB0cmFuc2FjdGlvbiBkZXRhaWxzIGlmIHNpZ25lZFxuICAgKi9cbiAgYXN5bmMgYnVpbGRFcmMyMFRva2VuQXBwcm92YWwoXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZ1xuICApOiBQcm9taXNlPEJ1aWxkVG9rZW5BcHByb3ZhbFJlc3BvbnNlIHwgU3VibWl0VHJhbnNhY3Rpb25SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgbGV0IHRva2VuQXBwcm92YWxCdWlsZDogQnVpbGRUb2tlbkFwcHJvdmFsUmVzcG9uc2U7XG4gICAgY29uc3QgdXJsID0gdGhpcy5iYXNlQ29pbi51cmwoYC93YWxsZXQvJHt0aGlzLmlkKCl9L3Rva2VuL2FwcHJvdmFsL2J1aWxkYCk7XG4gICAgdHJ5IHtcbiAgICAgIHRva2VuQXBwcm92YWxCdWlsZCA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgICAgLnBvc3QodXJsKVxuICAgICAgICAuc2VuZCh7XG4gICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbk5hbWUsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXN1bHQoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBlcnJvciBidWlsZGluZyBlcmMyMCB0b2tlbiBhcHByb3ZhbCB0eDogJHtlcnJvcn1gKTtcbiAgICB9XG5cbiAgICBpZiAoIXdhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgIHJldHVybiB0b2tlbkFwcHJvdmFsQnVpbGQ7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5nZXRLZXljaGFpbnNBbmRWYWxpZGF0ZVBhc3NwaHJhc2Uoe1xuICAgICAgcmVxSWQsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2lnbmluZ1BhcmFtcyA9IHtcbiAgICAgIHR4UHJlYnVpbGQ6IHRva2VuQXBwcm92YWxCdWlsZCxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgcmVxSWQsXG4gICAgfTtcblxuICAgIGNvbnN0IGhhbGZTaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHNpZ25pbmdQYXJhbXMpO1xuICAgIGNvbnN0IGZpbmFsVHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgaGFsZlNpZ25lZFRyYW5zYWN0aW9uKTtcblxuICAgIHJldHVybiB0aGlzLnNlbmRUcmFuc2FjdGlvbihmaW5hbFR4UGFyYW1zLCByZXFJZCk7XG4gIH1cbn1cbiJdfQ==