tedious 16.4.1 → 16.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/benchmarks/bulk-load/iterable.js +1 -1
- package/benchmarks/common.js +2 -4
- package/benchmarks/package-lock.json +21173 -0
- package/benchmarks/package.json +11 -0
- package/benchmarks/query/call-tvp.js +1 -1
- package/benchmarks/query/insert-varbinary.js +1 -1
- package/benchmarks/query/select-many-rows.js +1 -1
- package/benchmarks/query/select-nvarchar.js +1 -1
- package/benchmarks/query/select-varbinary.js +1 -1
- package/benchmarks/request/rpcrequest-payload-tvp.js +2 -2
- package/benchmarks/request/rpcrequest-payload-varbinary.js +2 -2
- package/benchmarks/token-parser/colmetadata-token.js +4 -2
- package/benchmarks/token-parser/done-token.js +5 -2
- package/benchmarks/token-parser/simple-tokens.js +8 -2
- package/lib/always-encrypted/aead-aes-256-cbc-hmac-algorithm.js +1 -8
- package/lib/always-encrypted/aead-aes-256-cbc-hmac-algorithm.js.map +1 -1
- package/lib/always-encrypted/aead-aes-256-cbc-hmac-encryption-key.js +1 -8
- package/lib/always-encrypted/aead-aes-256-cbc-hmac-encryption-key.js.map +1 -1
- package/lib/always-encrypted/cek-entry.js +1 -7
- package/lib/always-encrypted/cek-entry.js.map +1 -1
- package/lib/always-encrypted/keystore-provider-azure-key-vault.js +1 -8
- package/lib/always-encrypted/keystore-provider-azure-key-vault.js.map +1 -1
- package/lib/always-encrypted/symmetric-key.js +1 -2
- package/lib/always-encrypted/symmetric-key.js.map +1 -1
- package/lib/bulk-load-payload.js +1 -3
- package/lib/bulk-load-payload.js.map +1 -1
- package/lib/bulk-load.js +15 -23
- package/lib/bulk-load.js.map +1 -1
- package/lib/collation.js +1 -7
- package/lib/collation.js.map +1 -1
- package/lib/connection.js +22 -28
- package/lib/connection.js.map +1 -1
- package/lib/debug.js +1 -4
- package/lib/debug.js.map +1 -1
- package/lib/errors/abort-error.js +1 -2
- package/lib/errors/abort-error.js.map +1 -1
- package/lib/errors/timeout-error.js +1 -2
- package/lib/errors/timeout-error.js.map +1 -1
- package/lib/errors.js +1 -10
- package/lib/errors.js.map +1 -1
- package/lib/incoming-message-stream.js +1 -4
- package/lib/incoming-message-stream.js.map +1 -1
- package/lib/login7-payload.js +1 -23
- package/lib/login7-payload.js.map +1 -1
- package/lib/message-io.js +1 -8
- package/lib/message-io.js.map +1 -1
- package/lib/message.js +1 -4
- package/lib/message.js.map +1 -1
- package/lib/ntlm-payload.js +1 -2
- package/lib/ntlm-payload.js.map +1 -1
- package/lib/outgoing-message-stream.js +1 -5
- package/lib/outgoing-message-stream.js.map +1 -1
- package/lib/packet.js +1 -2
- package/lib/packet.js.map +1 -1
- package/lib/prelogin-payload.js +1 -11
- package/lib/prelogin-payload.js.map +1 -1
- package/lib/request.js +13 -19
- package/lib/request.js.map +1 -1
- package/lib/rpcrequest-payload.js +1 -6
- package/lib/rpcrequest-payload.js.map +1 -1
- package/lib/sqlbatch-payload.js +1 -4
- package/lib/sqlbatch-payload.js.map +1 -1
- package/lib/token/handler.js +3 -13
- package/lib/token/handler.js.map +1 -1
- package/lib/token/stream-parser.js +1 -10
- package/lib/token/stream-parser.js.map +1 -1
- package/lib/token/token-stream-parser.js +1 -4
- package/lib/token/token-stream-parser.js.map +1 -1
- package/lib/token/token.js +2 -88
- package/lib/token/token.js.map +1 -1
- package/lib/tracking-buffer/writable-tracking-buffer.js +1 -7
- package/lib/tracking-buffer/writable-tracking-buffer.js.map +1 -1
- package/lib/transaction.js +1 -4
- package/lib/transaction.js.map +1 -1
- package/package.json +1 -1
- package/benchmarks/bulk-load/stream.js +0 -62
- package/benchmarks/bulk-load/sync.js +0 -59
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "tedious-benchmarks",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "This folder contains a collection of benchmarks for `tedious`.",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
7
|
+
},
|
|
8
|
+
"dependencies": {
|
|
9
|
+
"tedious": "file:.."
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const { createBenchmark } = require('../common');
|
|
2
2
|
|
|
3
|
-
const { Request, TYPES } = require('
|
|
4
|
-
const RpcRequestPayload = require('
|
|
3
|
+
const { Request, TYPES } = require('tedious');
|
|
4
|
+
const RpcRequestPayload = require('tedious/lib/rpcrequest-payload');
|
|
5
5
|
|
|
6
6
|
const { Readable } = require('stream');
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const { createBenchmark } = require('../common');
|
|
2
2
|
|
|
3
|
-
const { Request, TYPES } = require('
|
|
4
|
-
const RpcRequestPayload = require('
|
|
3
|
+
const { Request, TYPES } = require('tedious');
|
|
4
|
+
const RpcRequestPayload = require('tedious/lib/rpcrequest-payload');
|
|
5
5
|
|
|
6
6
|
const { Readable } = require('stream');
|
|
7
7
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const { createBenchmark } = require('../common');
|
|
2
2
|
|
|
3
|
-
const { Parser } = require('
|
|
3
|
+
const { Parser } = require('tedious/lib/token/token-stream-parser');
|
|
4
4
|
|
|
5
5
|
const bench = createBenchmark(main, {
|
|
6
6
|
n: [10, 100, 1000],
|
|
@@ -15,7 +15,9 @@ async function * repeat(data, n) {
|
|
|
15
15
|
|
|
16
16
|
function main({ n, tokenCount }) {
|
|
17
17
|
const data = Buffer.from('810300000000001000380269006400000000000900e7c8000904d00034046e0061006d006500000000000900e7ffff0904d000340b6400650073006300720069007000740069006f006e00'.repeat(tokenCount), 'hex');
|
|
18
|
-
const parser = new Parser(repeat(data, n), { token: function() { } }, {
|
|
18
|
+
const parser = new Parser(repeat(data, n), { token: function() { } }, {
|
|
19
|
+
onColMetadata: (token) => { }
|
|
20
|
+
}, {});
|
|
19
21
|
|
|
20
22
|
bench.start();
|
|
21
23
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const { createBenchmark } = require('../common');
|
|
2
2
|
|
|
3
|
-
const { Parser } = require('
|
|
3
|
+
const { Parser } = require('tedious/lib/token/token-stream-parser');
|
|
4
4
|
|
|
5
5
|
const bench = createBenchmark(main, {
|
|
6
6
|
n: [10, 100, 1000],
|
|
@@ -15,7 +15,10 @@ async function * repeat(data, n) {
|
|
|
15
15
|
|
|
16
16
|
function main({ n, tokenCount }) {
|
|
17
17
|
const data = Buffer.from('FE0000E0000000000000000000'.repeat(tokenCount), 'hex');
|
|
18
|
-
|
|
18
|
+
|
|
19
|
+
const parser = new Parser(repeat(data, n), { token: function() { } }, {
|
|
20
|
+
onDoneProc: (token) => { }
|
|
21
|
+
}, {});
|
|
19
22
|
|
|
20
23
|
bench.start();
|
|
21
24
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const { createBenchmark } = require('../common');
|
|
2
2
|
|
|
3
|
-
const { Parser } = require('
|
|
3
|
+
const { Parser } = require('tedious/lib/token/token-stream-parser');
|
|
4
4
|
|
|
5
5
|
const bench = createBenchmark(main, {
|
|
6
6
|
n: [10, 100, 1000]
|
|
@@ -347,7 +347,13 @@ function main({ n }) {
|
|
|
347
347
|
'1100C10064000000000000007900000000FE0000E0000000000000000000'
|
|
348
348
|
].join(''), 'hex');
|
|
349
349
|
|
|
350
|
-
const parser = new Parser(repeat(data, n), {
|
|
350
|
+
const parser = new Parser(repeat(data, n), {}, {
|
|
351
|
+
onColMetadata: () => { },
|
|
352
|
+
onRow: () => { },
|
|
353
|
+
onDoneInProc: () => { },
|
|
354
|
+
onDoneProc: () => { },
|
|
355
|
+
onReturnStatus: () => { }
|
|
356
|
+
}, {});
|
|
351
357
|
|
|
352
358
|
bench.start();
|
|
353
359
|
|
|
@@ -15,13 +15,6 @@ exports.algorithmName = algorithmName;
|
|
|
15
15
|
const algorithmVersion = 0x1;
|
|
16
16
|
const blockSizeInBytes = 16;
|
|
17
17
|
class AeadAes256CbcHmac256Algorithm {
|
|
18
|
-
columnEncryptionkey;
|
|
19
|
-
isDeterministic;
|
|
20
|
-
keySizeInBytes;
|
|
21
|
-
version;
|
|
22
|
-
versionSize;
|
|
23
|
-
minimumCipherTextLengthInBytesNoAuthenticationTag;
|
|
24
|
-
minimumCipherTextLengthInBytesWithAuthenticationTag;
|
|
25
18
|
constructor(columnEncryptionKey, encryptionType) {
|
|
26
19
|
this.keySizeInBytes = _aeadAes256CbcHmacEncryptionKey.keySize / 8;
|
|
27
20
|
this.version = Buffer.from([algorithmVersion]);
|
|
@@ -87,4 +80,4 @@ class AeadAes256CbcHmac256Algorithm {
|
|
|
87
80
|
}
|
|
88
81
|
}
|
|
89
82
|
exports.AeadAes256CbcHmac256Algorithm = AeadAes256CbcHmac256Algorithm;
|
|
90
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZXMiLCJyZXF1aXJlIiwiX2NyeXB0byIsIl9hZWFkQWVzMjU2Q2JjSG1hY0VuY3J5cHRpb25LZXkiLCJhbGdvcml0aG1OYW1lIiwiZXhwb3J0cyIsImFsZ29yaXRobVZlcnNpb24iLCJibG9ja1NpemVJbkJ5dGVzIiwiQWVhZEFlczI1NkNiY0htYWMyNTZBbGdvcml0aG0iLCJjb2x1bW5FbmNyeXB0aW9ua2V5IiwiaXNEZXRlcm1pbmlzdGljIiwia2V5U2l6ZUluQnl0ZXMiLCJ2ZXJzaW9uIiwidmVyc2lvblNpemUiLCJtaW5pbXVtQ2lwaGVyVGV4dExlbmd0aEluQnl0ZXNOb0F1dGhlbnRpY2F0aW9uVGFnIiwibWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzV2l0aEF1dGhlbnRpY2F0aW9uVGFnIiwiY29uc3RydWN0b3IiLCJjb2x1bW5FbmNyeXB0aW9uS2V5IiwiZW5jcnlwdGlvblR5cGUiLCJrZXlTaXplIiwiQnVmZmVyIiwiZnJvbSIsIlNRTFNlcnZlckVuY3J5cHRpb25UeXBlIiwiRGV0ZXJtaW5pc3RpYyIsImVuY3J5cHREYXRhIiwicGxhaW50VGV4dCIsIml2IiwiaG1hY0l2IiwiY3JlYXRlSG1hYyIsImdldEl2S2V5IiwidXBkYXRlIiwiZGlnZXN0Iiwic2xpY2UiLCJyYW5kb21CeXRlcyIsImVuY3J5cHRDaXBoZXIiLCJjcmVhdGVDaXBoZXJpdiIsImdldEVuY3J5cHRpb25LZXkiLCJlbmNyeXB0ZWRCdWZmZXIiLCJjb25jYXQiLCJmaW5hbCIsImF1dGhlbnRpY2F0aW9uVGFnIiwiX3ByZXBhcmVBdXRoZW50aWNhdGlvblRhZyIsImxlbmd0aCIsImRlY3J5cHREYXRhIiwiY2lwaGVyVGV4dCIsImFsbG9jIiwibWluaW11bUNpcGVyVGV4dExlbmd0aCIsIkVycm9yIiwic3RhcnRJbmRleCIsInRvU3RyaW5nIiwiYXV0aGVudGljYXRpb25UYWdPZmZzZXQiLCJjb3B5IiwiY2lwaGVyVGV4dE9mZnNldCIsImNpcGhlclRleHRDb3VudCIsImNvbXBhcmUiLCJNYXRoIiwibWluIiwicGxhaW5UZXh0IiwiZGVjaXBoZXIiLCJjcmVhdGVEZWNpcGhlcml2IiwiZXJyb3IiLCJtZXNzYWdlIiwib2Zmc2V0IiwiaG1hYyIsImdldE1hY0tleSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL2FlYWQtYWVzLTI1Ni1jYmMtaG1hYy1hbGdvcml0aG0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IHR5cGUgRW5jcnlwdGlvbkFsZ29yaXRobSwgU1FMU2VydmVyRW5jcnlwdGlvblR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUhtYWMsIHJhbmRvbUJ5dGVzLCBjcmVhdGVDaXBoZXJpdiwgY3JlYXRlRGVjaXBoZXJpdiB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBBZWFkQWVzMjU2Q2JjSG1hYzI1NkVuY3J5cHRpb25LZXksIGtleVNpemUgfSBmcm9tICcuL2FlYWQtYWVzLTI1Ni1jYmMtaG1hYy1lbmNyeXB0aW9uLWtleSc7XG5cbmV4cG9ydCBjb25zdCBhbGdvcml0aG1OYW1lID0gJ0FFQURfQUVTXzI1Nl9DQkNfSE1BQ19TSEEyNTYnO1xuY29uc3QgYWxnb3JpdGhtVmVyc2lvbiA9IDB4MTtcbmNvbnN0IGJsb2NrU2l6ZUluQnl0ZXMgPSAxNjtcblxuZXhwb3J0IGNsYXNzIEFlYWRBZXMyNTZDYmNIbWFjMjU2QWxnb3JpdGhtIGltcGxlbWVudHMgRW5jcnlwdGlvbkFsZ29yaXRobSB7XG4gIHByaXZhdGUgY29sdW1uRW5jcnlwdGlvbmtleTogQWVhZEFlczI1NkNiY0htYWMyNTZFbmNyeXB0aW9uS2V5O1xuICBwcml2YXRlIGlzRGV0ZXJtaW5pc3RpYzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBrZXlTaXplSW5CeXRlczogbnVtYmVyO1xuICBwcml2YXRlIHZlcnNpb246IEJ1ZmZlcjtcbiAgcHJpdmF0ZSB2ZXJzaW9uU2l6ZTogQnVmZmVyO1xuICBwcml2YXRlIG1pbmltdW1DaXBoZXJUZXh0TGVuZ3RoSW5CeXRlc05vQXV0aGVudGljYXRpb25UYWc6IG51bWJlcjtcbiAgcHJpdmF0ZSBtaW5pbXVtQ2lwaGVyVGV4dExlbmd0aEluQnl0ZXNXaXRoQXV0aGVudGljYXRpb25UYWc6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihjb2x1bW5FbmNyeXB0aW9uS2V5OiBBZWFkQWVzMjU2Q2JjSG1hYzI1NkVuY3J5cHRpb25LZXksIGVuY3J5cHRpb25UeXBlOiBTUUxTZXJ2ZXJFbmNyeXB0aW9uVHlwZSkge1xuICAgIHRoaXMua2V5U2l6ZUluQnl0ZXMgPSBrZXlTaXplIC8gODtcbiAgICB0aGlzLnZlcnNpb24gPSBCdWZmZXIuZnJvbShbYWxnb3JpdGhtVmVyc2lvbl0pO1xuICAgIHRoaXMudmVyc2lvblNpemUgPSBCdWZmZXIuZnJvbShbMV0pO1xuICAgIHRoaXMubWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzTm9BdXRoZW50aWNhdGlvblRhZyA9IDEgKyBibG9ja1NpemVJbkJ5dGVzICsgYmxvY2tTaXplSW5CeXRlcztcbiAgICB0aGlzLm1pbmltdW1DaXBoZXJUZXh0TGVuZ3RoSW5CeXRlc1dpdGhBdXRoZW50aWNhdGlvblRhZyA9IHRoaXMubWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzTm9BdXRoZW50aWNhdGlvblRhZyArIHRoaXMua2V5U2l6ZUluQnl0ZXM7XG4gICAgdGhpcy5jb2x1bW5FbmNyeXB0aW9ua2V5ID0gY29sdW1uRW5jcnlwdGlvbktleTtcblxuICAgIHRoaXMuaXNEZXRlcm1pbmlzdGljID0gZW5jcnlwdGlvblR5cGUgPT09IFNRTFNlcnZlckVuY3J5cHRpb25UeXBlLkRldGVybWluaXN0aWM7XG4gIH1cblxuICBlbmNyeXB0RGF0YShwbGFpbnRUZXh0OiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIGxldCBpdjogQnVmZmVyO1xuXG4gICAgaWYgKHRoaXMuaXNEZXRlcm1pbmlzdGljID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBobWFjSXYgPSBjcmVhdGVIbWFjKCdzaGEyNTYnLCB0aGlzLmNvbHVtbkVuY3J5cHRpb25rZXkuZ2V0SXZLZXkoKSk7XG4gICAgICBobWFjSXYudXBkYXRlKHBsYWludFRleHQpO1xuICAgICAgaXYgPSBobWFjSXYuZGlnZXN0KCkuc2xpY2UoMCwgYmxvY2tTaXplSW5CeXRlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl2ID0gcmFuZG9tQnl0ZXMoYmxvY2tTaXplSW5CeXRlcyk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5jcnlwdENpcGhlciA9IGNyZWF0ZUNpcGhlcml2KCdhZXMtMjU2LWNiYycsIHRoaXMuY29sdW1uRW5jcnlwdGlvbmtleS5nZXRFbmNyeXB0aW9uS2V5KCksIGl2KTtcblxuICAgIGNvbnN0IGVuY3J5cHRlZEJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW2VuY3J5cHRDaXBoZXIudXBkYXRlKHBsYWludFRleHQpLCBlbmNyeXB0Q2lwaGVyLmZpbmFsKCldKTtcblxuICAgIGNvbnN0IGF1dGhlbnRpY2F0aW9uVGFnOiBCdWZmZXIgPSB0aGlzLl9wcmVwYXJlQXV0aGVudGljYXRpb25UYWcoaXYsIGVuY3J5cHRlZEJ1ZmZlciwgMCwgZW5jcnlwdGVkQnVmZmVyLmxlbmd0aCk7XG5cbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oW2FsZ29yaXRobVZlcnNpb25dKSwgYXV0aGVudGljYXRpb25UYWcsIGl2LCBlbmNyeXB0ZWRCdWZmZXJdKTtcbiAgfVxuXG4gIGRlY3J5cHREYXRhKGNpcGhlclRleHQ6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgY29uc3QgaXY6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhibG9ja1NpemVJbkJ5dGVzKTtcblxuICAgIGNvbnN0IG1pbmltdW1DaXBlclRleHRMZW5ndGg6IG51bWJlciA9IHRoaXMubWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzV2l0aEF1dGhlbnRpY2F0aW9uVGFnO1xuXG4gICAgaWYgKGNpcGhlclRleHQubGVuZ3RoIDwgbWluaW11bUNpcGVyVGV4dExlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTcGVjaWZpZWQgY2lwaGVydGV4dCBoYXMgYW4gaW52YWxpZCBzaXplIG9mICR7Y2lwaGVyVGV4dC5sZW5ndGh9IGJ5dGVzLCB3aGljaCBpcyBiZWxvdyB0aGUgbWluaW11bSAke21pbmltdW1DaXBlclRleHRMZW5ndGh9IGJ5dGVzIHJlcXVpcmVkIGZvciBkZWNyeXB0aW9uLmApO1xuICAgIH1cblxuICAgIGxldCBzdGFydEluZGV4ID0gMDtcbiAgICBpZiAoY2lwaGVyVGV4dFswXSAhPT0gYWxnb3JpdGhtVmVyc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc3BlY2lmaWVkIGNpcGhlcnRleHQncyBlbmNyeXB0aW9uIGFsZ29yaXRobSB2ZXJzaW9uICR7QnVmZmVyLmZyb20oW2NpcGhlclRleHRbMF1dKS50b1N0cmluZygnaGV4Jyl9IGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBlbmNyeXB0aW9uIGFsZ29yaXRobSB2ZXJzaW9uICR7YWxnb3JpdGhtVmVyc2lvbn0uYCk7XG4gICAgfVxuXG4gICAgc3RhcnRJbmRleCArPSAxO1xuICAgIGxldCBhdXRoZW50aWNhdGlvblRhZ09mZnNldCA9IDA7XG5cbiAgICBhdXRoZW50aWNhdGlvblRhZ09mZnNldCA9IHN0YXJ0SW5kZXg7XG4gICAgc3RhcnRJbmRleCArPSB0aGlzLmtleVNpemVJbkJ5dGVzO1xuXG4gICAgY2lwaGVyVGV4dC5jb3B5KGl2LCAwLCBzdGFydEluZGV4LCBzdGFydEluZGV4ICsgaXYubGVuZ3RoKTtcbiAgICBzdGFydEluZGV4ICs9IGl2Lmxlbmd0aDtcblxuICAgIGNvbnN0IGNpcGhlclRleHRPZmZzZXQgPSBzdGFydEluZGV4O1xuICAgIGNvbnN0IGNpcGhlclRleHRDb3VudCA9IGNpcGhlclRleHQubGVuZ3RoIC0gc3RhcnRJbmRleDtcblxuICAgIGNvbnN0IGF1dGhlbnRpY2F0aW9uVGFnOiBCdWZmZXIgPSB0aGlzLl9wcmVwYXJlQXV0aGVudGljYXRpb25UYWcoaXYsIGNpcGhlclRleHQsIGNpcGhlclRleHRPZmZzZXQsIGNpcGhlclRleHRDb3VudCk7XG5cbiAgICBpZiAoMCAhPT0gYXV0aGVudGljYXRpb25UYWcuY29tcGFyZShjaXBoZXJUZXh0LCBhdXRoZW50aWNhdGlvblRhZ09mZnNldCwgTWF0aC5taW4oYXV0aGVudGljYXRpb25UYWdPZmZzZXQgKyBjaXBoZXJUZXh0Q291bnQsIGF1dGhlbnRpY2F0aW9uVGFnT2Zmc2V0ICsgYXV0aGVudGljYXRpb25UYWcubGVuZ3RoKSwgMCwgTWF0aC5taW4oY2lwaGVyVGV4dENvdW50LCBhdXRoZW50aWNhdGlvblRhZy5sZW5ndGgpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTcGVjaWZpZWQgY2lwaGVydGV4dCBoYXMgYW4gaW52YWxpZCBhdXRoZW50aWNhdGlvbiB0YWcuJyk7XG4gICAgfVxuXG4gICAgbGV0IHBsYWluVGV4dDogQnVmZmVyO1xuXG4gICAgY29uc3QgZGVjaXBoZXIgPSBjcmVhdGVEZWNpcGhlcml2KCdhZXMtMjU2LWNiYycsIHRoaXMuY29sdW1uRW5jcnlwdGlvbmtleS5nZXRFbmNyeXB0aW9uS2V5KCksIGl2KTtcbiAgICB0cnkge1xuICAgICAgcGxhaW5UZXh0ID0gZGVjaXBoZXIudXBkYXRlKGNpcGhlclRleHQuc2xpY2UoY2lwaGVyVGV4dE9mZnNldCwgY2lwaGVyVGV4dE9mZnNldCArIGNpcGhlclRleHRDb3VudCkpO1xuICAgICAgcGxhaW5UZXh0ID0gQnVmZmVyLmNvbmNhdChbcGxhaW5UZXh0LCBkZWNpcGhlci5maW5hbCgpXSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCBlcnJvciB3aGlsZSBkZWNyeXB0aW9uOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBsYWluVGV4dDtcbiAgfVxuXG4gIF9wcmVwYXJlQXV0aGVudGljYXRpb25UYWcoaXY6IEJ1ZmZlciwgY2lwaGVyVGV4dDogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIpOiBCdWZmZXIge1xuICAgIGNvbnN0IGhtYWMgPSBjcmVhdGVIbWFjKCdzaGEyNTYnLCB0aGlzLmNvbHVtbkVuY3J5cHRpb25rZXkuZ2V0TWFjS2V5KCkpO1xuXG4gICAgaG1hYy51cGRhdGUodGhpcy52ZXJzaW9uKTtcbiAgICBobWFjLnVwZGF0ZShpdik7XG4gICAgaG1hYy51cGRhdGUoY2lwaGVyVGV4dC5zbGljZShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkpO1xuICAgIGhtYWMudXBkYXRlKHRoaXMudmVyc2lvblNpemUpO1xuICAgIHJldHVybiBobWFjLmRpZ2VzdCgpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLCtCQUFBLEdBQUFGLE9BQUE7QUFMQTtBQUNBOztBQU1PLE1BQU1HLGFBQWEsR0FBRyw4QkFBOEI7QUFBQ0MsT0FBQSxDQUFBRCxhQUFBLEdBQUFBLGFBQUE7QUFDNUQsTUFBTUUsZ0JBQWdCLEdBQUcsR0FBRztBQUM1QixNQUFNQyxnQkFBZ0IsR0FBRyxFQUFFO0FBRXBCLE1BQU1DLDZCQUE2QixDQUFnQztFQUNoRUMsbUJBQW1CO0VBQ25CQyxlQUFlO0VBQ2ZDLGNBQWM7RUFDZEMsT0FBTztFQUNQQyxXQUFXO0VBQ1hDLGlEQUFpRDtFQUNqREMsbURBQW1EO0VBRTNEQyxXQUFXQSxDQUFDQyxtQkFBc0QsRUFBRUMsY0FBdUMsRUFBRTtJQUMzRyxJQUFJLENBQUNQLGNBQWMsR0FBR1EsdUNBQU8s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
|
|
83
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZXMiLCJyZXF1aXJlIiwiX2NyeXB0byIsIl9hZWFkQWVzMjU2Q2JjSG1hY0VuY3J5cHRpb25LZXkiLCJhbGdvcml0aG1OYW1lIiwiZXhwb3J0cyIsImFsZ29yaXRobVZlcnNpb24iLCJibG9ja1NpemVJbkJ5dGVzIiwiQWVhZEFlczI1NkNiY0htYWMyNTZBbGdvcml0aG0iLCJjb25zdHJ1Y3RvciIsImNvbHVtbkVuY3J5cHRpb25LZXkiLCJlbmNyeXB0aW9uVHlwZSIsImtleVNpemVJbkJ5dGVzIiwia2V5U2l6ZSIsInZlcnNpb24iLCJCdWZmZXIiLCJmcm9tIiwidmVyc2lvblNpemUiLCJtaW5pbXVtQ2lwaGVyVGV4dExlbmd0aEluQnl0ZXNOb0F1dGhlbnRpY2F0aW9uVGFnIiwibWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzV2l0aEF1dGhlbnRpY2F0aW9uVGFnIiwiY29sdW1uRW5jcnlwdGlvbmtleSIsImlzRGV0ZXJtaW5pc3RpYyIsIlNRTFNlcnZlckVuY3J5cHRpb25UeXBlIiwiRGV0ZXJtaW5pc3RpYyIsImVuY3J5cHREYXRhIiwicGxhaW50VGV4dCIsIml2IiwiaG1hY0l2IiwiY3JlYXRlSG1hYyIsImdldEl2S2V5IiwidXBkYXRlIiwiZGlnZXN0Iiwic2xpY2UiLCJyYW5kb21CeXRlcyIsImVuY3J5cHRDaXBoZXIiLCJjcmVhdGVDaXBoZXJpdiIsImdldEVuY3J5cHRpb25LZXkiLCJlbmNyeXB0ZWRCdWZmZXIiLCJjb25jYXQiLCJmaW5hbCIsImF1dGhlbnRpY2F0aW9uVGFnIiwiX3ByZXBhcmVBdXRoZW50aWNhdGlvblRhZyIsImxlbmd0aCIsImRlY3J5cHREYXRhIiwiY2lwaGVyVGV4dCIsImFsbG9jIiwibWluaW11bUNpcGVyVGV4dExlbmd0aCIsIkVycm9yIiwic3RhcnRJbmRleCIsInRvU3RyaW5nIiwiYXV0aGVudGljYXRpb25UYWdPZmZzZXQiLCJjb3B5IiwiY2lwaGVyVGV4dE9mZnNldCIsImNpcGhlclRleHRDb3VudCIsImNvbXBhcmUiLCJNYXRoIiwibWluIiwicGxhaW5UZXh0IiwiZGVjaXBoZXIiLCJjcmVhdGVEZWNpcGhlcml2IiwiZXJyb3IiLCJtZXNzYWdlIiwib2Zmc2V0IiwiaG1hYyIsImdldE1hY0tleSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL2FlYWQtYWVzLTI1Ni1jYmMtaG1hYy1hbGdvcml0aG0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IHR5cGUgRW5jcnlwdGlvbkFsZ29yaXRobSwgU1FMU2VydmVyRW5jcnlwdGlvblR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUhtYWMsIHJhbmRvbUJ5dGVzLCBjcmVhdGVDaXBoZXJpdiwgY3JlYXRlRGVjaXBoZXJpdiB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBBZWFkQWVzMjU2Q2JjSG1hYzI1NkVuY3J5cHRpb25LZXksIGtleVNpemUgfSBmcm9tICcuL2FlYWQtYWVzLTI1Ni1jYmMtaG1hYy1lbmNyeXB0aW9uLWtleSc7XG5cbmV4cG9ydCBjb25zdCBhbGdvcml0aG1OYW1lID0gJ0FFQURfQUVTXzI1Nl9DQkNfSE1BQ19TSEEyNTYnO1xuY29uc3QgYWxnb3JpdGhtVmVyc2lvbiA9IDB4MTtcbmNvbnN0IGJsb2NrU2l6ZUluQnl0ZXMgPSAxNjtcblxuZXhwb3J0IGNsYXNzIEFlYWRBZXMyNTZDYmNIbWFjMjU2QWxnb3JpdGhtIGltcGxlbWVudHMgRW5jcnlwdGlvbkFsZ29yaXRobSB7XG4gIGRlY2xhcmUgcHJpdmF0ZSBjb2x1bW5FbmNyeXB0aW9ua2V5OiBBZWFkQWVzMjU2Q2JjSG1hYzI1NkVuY3J5cHRpb25LZXk7XG4gIGRlY2xhcmUgcHJpdmF0ZSBpc0RldGVybWluaXN0aWM6IGJvb2xlYW47XG4gIGRlY2xhcmUgcHJpdmF0ZSBrZXlTaXplSW5CeXRlczogbnVtYmVyO1xuICBkZWNsYXJlIHByaXZhdGUgdmVyc2lvbjogQnVmZmVyO1xuICBkZWNsYXJlIHByaXZhdGUgdmVyc2lvblNpemU6IEJ1ZmZlcjtcbiAgZGVjbGFyZSBwcml2YXRlIG1pbmltdW1DaXBoZXJUZXh0TGVuZ3RoSW5CeXRlc05vQXV0aGVudGljYXRpb25UYWc6IG51bWJlcjtcbiAgZGVjbGFyZSBwcml2YXRlIG1pbmltdW1DaXBoZXJUZXh0TGVuZ3RoSW5CeXRlc1dpdGhBdXRoZW50aWNhdGlvblRhZzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNvbHVtbkVuY3J5cHRpb25LZXk6IEFlYWRBZXMyNTZDYmNIbWFjMjU2RW5jcnlwdGlvbktleSwgZW5jcnlwdGlvblR5cGU6IFNRTFNlcnZlckVuY3J5cHRpb25UeXBlKSB7XG4gICAgdGhpcy5rZXlTaXplSW5CeXRlcyA9IGtleVNpemUgLyA4O1xuICAgIHRoaXMudmVyc2lvbiA9IEJ1ZmZlci5mcm9tKFthbGdvcml0aG1WZXJzaW9uXSk7XG4gICAgdGhpcy52ZXJzaW9uU2l6ZSA9IEJ1ZmZlci5mcm9tKFsxXSk7XG4gICAgdGhpcy5taW5pbXVtQ2lwaGVyVGV4dExlbmd0aEluQnl0ZXNOb0F1dGhlbnRpY2F0aW9uVGFnID0gMSArIGJsb2NrU2l6ZUluQnl0ZXMgKyBibG9ja1NpemVJbkJ5dGVzO1xuICAgIHRoaXMubWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzV2l0aEF1dGhlbnRpY2F0aW9uVGFnID0gdGhpcy5taW5pbXVtQ2lwaGVyVGV4dExlbmd0aEluQnl0ZXNOb0F1dGhlbnRpY2F0aW9uVGFnICsgdGhpcy5rZXlTaXplSW5CeXRlcztcbiAgICB0aGlzLmNvbHVtbkVuY3J5cHRpb25rZXkgPSBjb2x1bW5FbmNyeXB0aW9uS2V5O1xuXG4gICAgdGhpcy5pc0RldGVybWluaXN0aWMgPSBlbmNyeXB0aW9uVHlwZSA9PT0gU1FMU2VydmVyRW5jcnlwdGlvblR5cGUuRGV0ZXJtaW5pc3RpYztcbiAgfVxuXG4gIGVuY3J5cHREYXRhKHBsYWludFRleHQ6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgbGV0IGl2OiBCdWZmZXI7XG5cbiAgICBpZiAodGhpcy5pc0RldGVybWluaXN0aWMgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGhtYWNJdiA9IGNyZWF0ZUhtYWMoJ3NoYTI1NicsIHRoaXMuY29sdW1uRW5jcnlwdGlvbmtleS5nZXRJdktleSgpKTtcbiAgICAgIGhtYWNJdi51cGRhdGUocGxhaW50VGV4dCk7XG4gICAgICBpdiA9IGhtYWNJdi5kaWdlc3QoKS5zbGljZSgwLCBibG9ja1NpemVJbkJ5dGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXYgPSByYW5kb21CeXRlcyhibG9ja1NpemVJbkJ5dGVzKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmNyeXB0Q2lwaGVyID0gY3JlYXRlQ2lwaGVyaXYoJ2Flcy0yNTYtY2JjJywgdGhpcy5jb2x1bW5FbmNyeXB0aW9ua2V5LmdldEVuY3J5cHRpb25LZXkoKSwgaXYpO1xuXG4gICAgY29uc3QgZW5jcnlwdGVkQnVmZmVyID0gQnVmZmVyLmNvbmNhdChbZW5jcnlwdENpcGhlci51cGRhdGUocGxhaW50VGV4dCksIGVuY3J5cHRDaXBoZXIuZmluYWwoKV0pO1xuXG4gICAgY29uc3QgYXV0aGVudGljYXRpb25UYWc6IEJ1ZmZlciA9IHRoaXMuX3ByZXBhcmVBdXRoZW50aWNhdGlvblRhZyhpdiwgZW5jcnlwdGVkQnVmZmVyLCAwLCBlbmNyeXB0ZWRCdWZmZXIubGVuZ3RoKTtcblxuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShbYWxnb3JpdGhtVmVyc2lvbl0pLCBhdXRoZW50aWNhdGlvblRhZywgaXYsIGVuY3J5cHRlZEJ1ZmZlcl0pO1xuICB9XG5cbiAgZGVjcnlwdERhdGEoY2lwaGVyVGV4dDogQnVmZmVyKTogQnVmZmVyIHtcbiAgICBjb25zdCBpdjogQnVmZmVyID0gQnVmZmVyLmFsbG9jKGJsb2NrU2l6ZUluQnl0ZXMpO1xuXG4gICAgY29uc3QgbWluaW11bUNpcGVyVGV4dExlbmd0aDogbnVtYmVyID0gdGhpcy5taW5pbXVtQ2lwaGVyVGV4dExlbmd0aEluQnl0ZXNXaXRoQXV0aGVudGljYXRpb25UYWc7XG5cbiAgICBpZiAoY2lwaGVyVGV4dC5sZW5ndGggPCBtaW5pbXVtQ2lwZXJUZXh0TGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNwZWNpZmllZCBjaXBoZXJ0ZXh0IGhhcyBhbiBpbnZhbGlkIHNpemUgb2YgJHtjaXBoZXJUZXh0Lmxlbmd0aH0gYnl0ZXMsIHdoaWNoIGlzIGJlbG93IHRoZSBtaW5pbXVtICR7bWluaW11bUNpcGVyVGV4dExlbmd0aH0gYnl0ZXMgcmVxdWlyZWQgZm9yIGRlY3J5cHRpb24uYCk7XG4gICAgfVxuXG4gICAgbGV0IHN0YXJ0SW5kZXggPSAwO1xuICAgIGlmIChjaXBoZXJUZXh0WzBdICE9PSBhbGdvcml0aG1WZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBzcGVjaWZpZWQgY2lwaGVydGV4dCdzIGVuY3J5cHRpb24gYWxnb3JpdGhtIHZlcnNpb24gJHtCdWZmZXIuZnJvbShbY2lwaGVyVGV4dFswXV0pLnRvU3RyaW5nKCdoZXgnKX0gZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIGVuY3J5cHRpb24gYWxnb3JpdGhtIHZlcnNpb24gJHthbGdvcml0aG1WZXJzaW9ufS5gKTtcbiAgICB9XG5cbiAgICBzdGFydEluZGV4ICs9IDE7XG4gICAgbGV0IGF1dGhlbnRpY2F0aW9uVGFnT2Zmc2V0ID0gMDtcblxuICAgIGF1dGhlbnRpY2F0aW9uVGFnT2Zmc2V0ID0gc3RhcnRJbmRleDtcbiAgICBzdGFydEluZGV4ICs9IHRoaXMua2V5U2l6ZUluQnl0ZXM7XG5cbiAgICBjaXBoZXJUZXh0LmNvcHkoaXYsIDAsIHN0YXJ0SW5kZXgsIHN0YXJ0SW5kZXggKyBpdi5sZW5ndGgpO1xuICAgIHN0YXJ0SW5kZXggKz0gaXYubGVuZ3RoO1xuXG4gICAgY29uc3QgY2lwaGVyVGV4dE9mZnNldCA9IHN0YXJ0SW5kZXg7XG4gICAgY29uc3QgY2lwaGVyVGV4dENvdW50ID0gY2lwaGVyVGV4dC5sZW5ndGggLSBzdGFydEluZGV4O1xuXG4gICAgY29uc3QgYXV0aGVudGljYXRpb25UYWc6IEJ1ZmZlciA9IHRoaXMuX3ByZXBhcmVBdXRoZW50aWNhdGlvblRhZyhpdiwgY2lwaGVyVGV4dCwgY2lwaGVyVGV4dE9mZnNldCwgY2lwaGVyVGV4dENvdW50KTtcblxuICAgIGlmICgwICE9PSBhdXRoZW50aWNhdGlvblRhZy5jb21wYXJlKGNpcGhlclRleHQsIGF1dGhlbnRpY2F0aW9uVGFnT2Zmc2V0LCBNYXRoLm1pbihhdXRoZW50aWNhdGlvblRhZ09mZnNldCArIGNpcGhlclRleHRDb3VudCwgYXV0aGVudGljYXRpb25UYWdPZmZzZXQgKyBhdXRoZW50aWNhdGlvblRhZy5sZW5ndGgpLCAwLCBNYXRoLm1pbihjaXBoZXJUZXh0Q291bnQsIGF1dGhlbnRpY2F0aW9uVGFnLmxlbmd0aCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NwZWNpZmllZCBjaXBoZXJ0ZXh0IGhhcyBhbiBpbnZhbGlkIGF1dGhlbnRpY2F0aW9uIHRhZy4nKTtcbiAgICB9XG5cbiAgICBsZXQgcGxhaW5UZXh0OiBCdWZmZXI7XG5cbiAgICBjb25zdCBkZWNpcGhlciA9IGNyZWF0ZURlY2lwaGVyaXYoJ2Flcy0yNTYtY2JjJywgdGhpcy5jb2x1bW5FbmNyeXB0aW9ua2V5LmdldEVuY3J5cHRpb25LZXkoKSwgaXYpO1xuICAgIHRyeSB7XG4gICAgICBwbGFpblRleHQgPSBkZWNpcGhlci51cGRhdGUoY2lwaGVyVGV4dC5zbGljZShjaXBoZXJUZXh0T2Zmc2V0LCBjaXBoZXJUZXh0T2Zmc2V0ICsgY2lwaGVyVGV4dENvdW50KSk7XG4gICAgICBwbGFpblRleHQgPSBCdWZmZXIuY29uY2F0KFtwbGFpblRleHQsIGRlY2lwaGVyLmZpbmFsKCldKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVybmFsIGVycm9yIHdoaWxlIGRlY3J5cHRpb246ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGxhaW5UZXh0O1xuICB9XG5cbiAgX3ByZXBhcmVBdXRoZW50aWNhdGlvblRhZyhpdjogQnVmZmVyLCBjaXBoZXJUZXh0OiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBsZW5ndGg6IG51bWJlcik6IEJ1ZmZlciB7XG4gICAgY29uc3QgaG1hYyA9IGNyZWF0ZUhtYWMoJ3NoYTI1NicsIHRoaXMuY29sdW1uRW5jcnlwdGlvbmtleS5nZXRNYWNLZXkoKSk7XG5cbiAgICBobWFjLnVwZGF0ZSh0aGlzLnZlcnNpb24pO1xuICAgIGhtYWMudXBkYXRlKGl2KTtcbiAgICBobWFjLnVwZGF0ZShjaXBoZXJUZXh0LnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKSk7XG4gICAgaG1hYy51cGRhdGUodGhpcy52ZXJzaW9uU2l6ZSk7XG4gICAgcmV0dXJuIGhtYWMuZGlnZXN0KCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsK0JBQUEsR0FBQUYsT0FBQTtBQUxBO0FBQ0E7O0FBTU8sTUFBTUcsYUFBYSxHQUFHLDhCQUE4QjtBQUFDQyxPQUFBLENBQUFELGFBQUEsR0FBQUEsYUFBQTtBQUM1RCxNQUFNRSxnQkFBZ0IsR0FBRyxHQUFHO0FBQzVCLE1BQU1DLGdCQUFnQixHQUFHLEVBQUU7QUFFcEIsTUFBTUMsNkJBQTZCLENBQWdDO0VBU3hFQyxXQUFXQSxDQUFDQyxtQkFBc0QsRUFBRUMsY0FBdUMsRUFBRTtJQUMzRyxJQUFJLENBQUNDLGNBQWMsR0FBR0MsdUNBQU8sR0FBRyxDQUFDO0lBQ2pDLElBQUksQ0FBQ0MsT0FB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aead-aes-256-cbc-hmac-algorithm.js","names":["_types","require","_crypto","_aeadAes256CbcHmacEncryptionKey","algorithmName","exports","algorithmVersion","blockSizeInBytes","AeadAes256CbcHmac256Algorithm","
|
|
1
|
+
{"version":3,"file":"aead-aes-256-cbc-hmac-algorithm.js","names":["_types","require","_crypto","_aeadAes256CbcHmacEncryptionKey","algorithmName","exports","algorithmVersion","blockSizeInBytes","AeadAes256CbcHmac256Algorithm","constructor","columnEncryptionKey","encryptionType","keySizeInBytes","keySize","version","Buffer","from","versionSize","minimumCipherTextLengthInBytesNoAuthenticationTag","minimumCipherTextLengthInBytesWithAuthenticationTag","columnEncryptionkey","isDeterministic","SQLServerEncryptionType","Deterministic","encryptData","plaintText","iv","hmacIv","createHmac","getIvKey","update","digest","slice","randomBytes","encryptCipher","createCipheriv","getEncryptionKey","encryptedBuffer","concat","final","authenticationTag","_prepareAuthenticationTag","length","decryptData","cipherText","alloc","minimumCiperTextLength","Error","startIndex","toString","authenticationTagOffset","copy","cipherTextOffset","cipherTextCount","compare","Math","min","plainText","decipher","createDecipheriv","error","message","offset","hmac","getMacKey"],"sources":["../../src/always-encrypted/aead-aes-256-cbc-hmac-algorithm.ts"],"sourcesContent":["// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.\n// Copyright (c) 2019 Microsoft Corporation\n\nimport { type EncryptionAlgorithm, SQLServerEncryptionType } from './types';\nimport { createHmac, randomBytes, createCipheriv, createDecipheriv } from 'crypto';\nimport { AeadAes256CbcHmac256EncryptionKey, keySize } from './aead-aes-256-cbc-hmac-encryption-key';\n\nexport const algorithmName = 'AEAD_AES_256_CBC_HMAC_SHA256';\nconst algorithmVersion = 0x1;\nconst blockSizeInBytes = 16;\n\nexport class AeadAes256CbcHmac256Algorithm implements EncryptionAlgorithm {\n declare private columnEncryptionkey: AeadAes256CbcHmac256EncryptionKey;\n declare private isDeterministic: boolean;\n declare private keySizeInBytes: number;\n declare private version: Buffer;\n declare private versionSize: Buffer;\n declare private minimumCipherTextLengthInBytesNoAuthenticationTag: number;\n declare private minimumCipherTextLengthInBytesWithAuthenticationTag: number;\n\n constructor(columnEncryptionKey: AeadAes256CbcHmac256EncryptionKey, encryptionType: SQLServerEncryptionType) {\n this.keySizeInBytes = keySize / 8;\n this.version = Buffer.from([algorithmVersion]);\n this.versionSize = Buffer.from([1]);\n this.minimumCipherTextLengthInBytesNoAuthenticationTag = 1 + blockSizeInBytes + blockSizeInBytes;\n this.minimumCipherTextLengthInBytesWithAuthenticationTag = this.minimumCipherTextLengthInBytesNoAuthenticationTag + this.keySizeInBytes;\n this.columnEncryptionkey = columnEncryptionKey;\n\n this.isDeterministic = encryptionType === SQLServerEncryptionType.Deterministic;\n }\n\n encryptData(plaintText: Buffer): Buffer {\n let iv: Buffer;\n\n if (this.isDeterministic === true) {\n const hmacIv = createHmac('sha256', this.columnEncryptionkey.getIvKey());\n hmacIv.update(plaintText);\n iv = hmacIv.digest().slice(0, blockSizeInBytes);\n } else {\n iv = randomBytes(blockSizeInBytes);\n }\n\n const encryptCipher = createCipheriv('aes-256-cbc', this.columnEncryptionkey.getEncryptionKey(), iv);\n\n const encryptedBuffer = Buffer.concat([encryptCipher.update(plaintText), encryptCipher.final()]);\n\n const authenticationTag: Buffer = this._prepareAuthenticationTag(iv, encryptedBuffer, 0, encryptedBuffer.length);\n\n return Buffer.concat([Buffer.from([algorithmVersion]), authenticationTag, iv, encryptedBuffer]);\n }\n\n decryptData(cipherText: Buffer): Buffer {\n const iv: Buffer = Buffer.alloc(blockSizeInBytes);\n\n const minimumCiperTextLength: number = this.minimumCipherTextLengthInBytesWithAuthenticationTag;\n\n if (cipherText.length < minimumCiperTextLength) {\n throw new Error(`Specified ciphertext has an invalid size of ${cipherText.length} bytes, which is below the minimum ${minimumCiperTextLength} bytes required for decryption.`);\n }\n\n let startIndex = 0;\n if (cipherText[0] !== algorithmVersion) {\n throw new Error(`The specified ciphertext's encryption algorithm version ${Buffer.from([cipherText[0]]).toString('hex')} does not match the expected encryption algorithm version ${algorithmVersion}.`);\n }\n\n startIndex += 1;\n let authenticationTagOffset = 0;\n\n authenticationTagOffset = startIndex;\n startIndex += this.keySizeInBytes;\n\n cipherText.copy(iv, 0, startIndex, startIndex + iv.length);\n startIndex += iv.length;\n\n const cipherTextOffset = startIndex;\n const cipherTextCount = cipherText.length - startIndex;\n\n const authenticationTag: Buffer = this._prepareAuthenticationTag(iv, cipherText, cipherTextOffset, cipherTextCount);\n\n if (0 !== authenticationTag.compare(cipherText, authenticationTagOffset, Math.min(authenticationTagOffset + cipherTextCount, authenticationTagOffset + authenticationTag.length), 0, Math.min(cipherTextCount, authenticationTag.length))) {\n throw new Error('Specified ciphertext has an invalid authentication tag.');\n }\n\n let plainText: Buffer;\n\n const decipher = createDecipheriv('aes-256-cbc', this.columnEncryptionkey.getEncryptionKey(), iv);\n try {\n plainText = decipher.update(cipherText.slice(cipherTextOffset, cipherTextOffset + cipherTextCount));\n plainText = Buffer.concat([plainText, decipher.final()]);\n } catch (error: any) {\n throw new Error(`Internal error while decryption: ${error.message}`);\n }\n\n return plainText;\n }\n\n _prepareAuthenticationTag(iv: Buffer, cipherText: Buffer, offset: number, length: number): Buffer {\n const hmac = createHmac('sha256', this.columnEncryptionkey.getMacKey());\n\n hmac.update(this.version);\n hmac.update(iv);\n hmac.update(cipherText.slice(offset, offset + length));\n hmac.update(this.versionSize);\n return hmac.digest();\n }\n}\n"],"mappings":"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"}
|
|
@@ -22,13 +22,6 @@ exports.deriveKey = deriveKey;
|
|
|
22
22
|
const generateKeySalt = (keyType, algorithmName, keySize) => `Microsoft SQL Server cell ${keyType} key ` + `with encryption algorithm:${algorithmName} and key length:${keySize}`;
|
|
23
23
|
exports.generateKeySalt = generateKeySalt;
|
|
24
24
|
class AeadAes256CbcHmac256EncryptionKey extends _symmetricKey.default {
|
|
25
|
-
algorithmName;
|
|
26
|
-
encryptionKeySaltFormat;
|
|
27
|
-
macKeySaltFormat;
|
|
28
|
-
ivKeySaltFormat;
|
|
29
|
-
encryptionKey;
|
|
30
|
-
macKey;
|
|
31
|
-
ivKey;
|
|
32
25
|
constructor(rootKey, algorithmName) {
|
|
33
26
|
super(rootKey);
|
|
34
27
|
this.algorithmName = algorithmName;
|
|
@@ -60,4 +53,4 @@ class AeadAes256CbcHmac256EncryptionKey extends _symmetricKey.default {
|
|
|
60
53
|
}
|
|
61
54
|
}
|
|
62
55
|
exports.AeadAes256CbcHmac256EncryptionKey = AeadAes256CbcHmac256EncryptionKey;
|
|
63
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
56
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY3J5cHRvIiwicmVxdWlyZSIsIl9zeW1tZXRyaWNLZXkiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0Iiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJrZXlTaXplIiwiZXhwb3J0cyIsImtleVNpemVJbkJ5dGVzIiwiZGVyaXZlS2V5Iiwicm9vdEtleSIsInNhbHQiLCJobWFjIiwiY3JlYXRlSG1hYyIsInVwZGF0ZSIsIkJ1ZmZlciIsImZyb20iLCJkaWdlc3QiLCJnZW5lcmF0ZUtleVNhbHQiLCJrZXlUeXBlIiwiYWxnb3JpdGhtTmFtZSIsIkFlYWRBZXMyNTZDYmNIbWFjMjU2RW5jcnlwdGlvbktleSIsIlN5bW1ldHJpY0tleSIsImNvbnN0cnVjdG9yIiwiZW5jcnlwdGlvbktleVNhbHRGb3JtYXQiLCJtYWNLZXlTYWx0Rm9ybWF0IiwiaXZLZXlTYWx0Rm9ybWF0IiwibGVuZ3RoIiwiRXJyb3IiLCJlbmNLZXlCdWZmIiwiZW5jcnlwdGlvbktleSIsIm1hY0tleUJ1ZmYiLCJtYWNLZXkiLCJpdktleUJ1ZmYiLCJpdktleSIsImVycm9yIiwibWVzc2FnZSIsImdldEVuY3J5cHRpb25LZXkiLCJnZXRNYWNLZXkiLCJnZXRJdktleSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL2FlYWQtYWVzLTI1Ni1jYmMtaG1hYy1lbmNyeXB0aW9uLWtleS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgY3JlYXRlSG1hYyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgU3ltbWV0cmljS2V5IGZyb20gJy4vc3ltbWV0cmljLWtleSc7XG5cbmV4cG9ydCBjb25zdCBrZXlTaXplID0gMjU2O1xuY29uc3Qga2V5U2l6ZUluQnl0ZXMgPSBrZXlTaXplIC8gODtcblxuZXhwb3J0IGNvbnN0IGRlcml2ZUtleSA9IChyb290S2V5OiBCdWZmZXIsIHNhbHQ6IHN0cmluZyk6IEJ1ZmZlciA9PiB7XG4gIGNvbnN0IGhtYWMgPSBjcmVhdGVIbWFjKCdzaGEyNTYnLCByb290S2V5KTtcbiAgaG1hYy51cGRhdGUoQnVmZmVyLmZyb20oc2FsdCwgJ3V0ZjE2bGUnKSk7XG4gIHJldHVybiBobWFjLmRpZ2VzdCgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlS2V5U2FsdCA9IChcbiAga2V5VHlwZTogJ2VuY3J5cHRpb24nIHwgJ01BQycgfCAnSVYnLFxuICBhbGdvcml0aG1OYW1lOiBzdHJpbmcsXG4gIGtleVNpemU6IG51bWJlcixcbik6IHN0cmluZyA9PlxuICBgTWljcm9zb2Z0IFNRTCBTZXJ2ZXIgY2VsbCAke2tleVR5cGV9IGtleSBgICtcbiAgYHdpdGggZW5jcnlwdGlvbiBhbGdvcml0aG06JHthbGdvcml0aG1OYW1lfSBhbmQga2V5IGxlbmd0aDoke2tleVNpemV9YDtcblxuZXhwb3J0IGNsYXNzIEFlYWRBZXMyNTZDYmNIbWFjMjU2RW5jcnlwdGlvbktleSBleHRlbmRzIFN5bW1ldHJpY0tleSB7XG4gIGRlY2xhcmUgcHJpdmF0ZSByZWFkb25seSBhbGdvcml0aG1OYW1lOiBzdHJpbmc7XG4gIGRlY2xhcmUgcHJpdmF0ZSBlbmNyeXB0aW9uS2V5U2FsdEZvcm1hdDogc3RyaW5nO1xuICBkZWNsYXJlIHByaXZhdGUgbWFjS2V5U2FsdEZvcm1hdDogc3RyaW5nO1xuICBkZWNsYXJlIHByaXZhdGUgaXZLZXlTYWx0Rm9ybWF0OiBzdHJpbmc7XG4gIGRlY2xhcmUgcHJpdmF0ZSBlbmNyeXB0aW9uS2V5OiBTeW1tZXRyaWNLZXk7XG4gIGRlY2xhcmUgcHJpdmF0ZSBtYWNLZXk6IFN5bW1ldHJpY0tleTtcbiAgZGVjbGFyZSBwcml2YXRlIGl2S2V5OiBTeW1tZXRyaWNLZXk7XG5cbiAgY29uc3RydWN0b3Iocm9vdEtleTogQnVmZmVyLCBhbGdvcml0aG1OYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihyb290S2V5KTtcbiAgICB0aGlzLmFsZ29yaXRobU5hbWUgPSBhbGdvcml0aG1OYW1lO1xuICAgIHRoaXMuZW5jcnlwdGlvbktleVNhbHRGb3JtYXQgPSBnZW5lcmF0ZUtleVNhbHQoJ2VuY3J5cHRpb24nLCB0aGlzLmFsZ29yaXRobU5hbWUsIGtleVNpemUpO1xuICAgIHRoaXMubWFjS2V5U2FsdEZvcm1hdCA9IGdlbmVyYXRlS2V5U2FsdCgnTUFDJywgdGhpcy5hbGdvcml0aG1OYW1lLCBrZXlTaXplKTtcbiAgICB0aGlzLml2S2V5U2FsdEZvcm1hdCA9IGdlbmVyYXRlS2V5U2FsdCgnSVYnLCB0aGlzLmFsZ29yaXRobU5hbWUsIGtleVNpemUpO1xuXG4gICAgaWYgKHJvb3RLZXkubGVuZ3RoICE9PSBrZXlTaXplSW5CeXRlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgY29sdW1uIGVuY3J5cHRpb24ga2V5IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNyeXB0ZWQgYnV0IGl0J3MgbGVuZ3RoOiAke3Jvb3RLZXkubGVuZ3RofSBkb2VzIG5vdCBtYXRjaCB0aGUgbGVuZ3RoOiAke2tleVNpemVJbkJ5dGVzfSBmb3IgYWxnb3JpdGhtIFwiJHt0aGlzLmFsZ29yaXRobU5hbWV9XCIuIFZlcmlmeSB0aGUgZW5jcnlwdGVkIHZhbHVlIG9mIHRoZSBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgaW4gdGhlIGRhdGFiYXNlLmApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbmNLZXlCdWZmID0gZGVyaXZlS2V5KHJvb3RLZXksIHRoaXMuZW5jcnlwdGlvbktleVNhbHRGb3JtYXQpO1xuXG4gICAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBuZXcgU3ltbWV0cmljS2V5KGVuY0tleUJ1ZmYpO1xuXG4gICAgICBjb25zdCBtYWNLZXlCdWZmID0gZGVyaXZlS2V5KHJvb3RLZXksIHRoaXMubWFjS2V5U2FsdEZvcm1hdCk7XG5cbiAgICAgIHRoaXMubWFjS2V5ID0gbmV3IFN5bW1ldHJpY0tleShtYWNLZXlCdWZmKTtcblxuICAgICAgY29uc3QgaXZLZXlCdWZmID0gZGVyaXZlS2V5KHJvb3RLZXksIHRoaXMuaXZLZXlTYWx0Rm9ybWF0KTtcblxuICAgICAgdGhpcy5pdktleSA9IG5ldyBTeW1tZXRyaWNLZXkoaXZLZXlCdWZmKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEtleSBleHRyYWN0aW9uIGZhaWxlZCA6ICR7ZXJyb3IubWVzc2FnZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RW5jcnlwdGlvbktleSgpOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLmVuY3J5cHRpb25LZXkucm9vdEtleTtcbiAgfVxuXG4gIGdldE1hY0tleSgpOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLm1hY0tleS5yb290S2V5O1xuICB9XG5cbiAgZ2V0SXZLZXkoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gdGhpcy5pdktleS5yb290S2V5O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUdBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLGFBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUEyQyxTQUFBRSx1QkFBQUMsR0FBQSxXQUFBQSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxHQUFBRCxHQUFBLEtBQUFFLE9BQUEsRUFBQUYsR0FBQTtBQUozQztBQUNBOztBQUtPLE1BQU1HLE9BQU8sR0FBRyxHQUFHO0FBQUNDLE9BQUEsQ0FBQUQsT0FBQSxHQUFBQSxPQUFBO0FBQzNCLE1BQU1FLGNBQWMsR0FBR0YsT0FBTyxHQUFHLENBQUM7QUFFM0IsTUFBTUcsU0FBUyxHQUFHQSxDQUFDQyxPQUFlLEVBQUVDLElBQVksS0FBYTtFQUNsRSxNQUFNQyxJQUFJLEdBQUcsSUFBQUMsa0JBQVUsRUFBQyxR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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aead-aes-256-cbc-hmac-encryption-key.js","names":["_crypto","require","_symmetricKey","_interopRequireDefault","obj","__esModule","default","keySize","exports","keySizeInBytes","deriveKey","rootKey","salt","hmac","createHmac","update","Buffer","from","digest","generateKeySalt","keyType","algorithmName","AeadAes256CbcHmac256EncryptionKey","SymmetricKey","encryptionKeySaltFormat","macKeySaltFormat","ivKeySaltFormat","
|
|
1
|
+
{"version":3,"file":"aead-aes-256-cbc-hmac-encryption-key.js","names":["_crypto","require","_symmetricKey","_interopRequireDefault","obj","__esModule","default","keySize","exports","keySizeInBytes","deriveKey","rootKey","salt","hmac","createHmac","update","Buffer","from","digest","generateKeySalt","keyType","algorithmName","AeadAes256CbcHmac256EncryptionKey","SymmetricKey","constructor","encryptionKeySaltFormat","macKeySaltFormat","ivKeySaltFormat","length","Error","encKeyBuff","encryptionKey","macKeyBuff","macKey","ivKeyBuff","ivKey","error","message","getEncryptionKey","getMacKey","getIvKey"],"sources":["../../src/always-encrypted/aead-aes-256-cbc-hmac-encryption-key.ts"],"sourcesContent":["// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.\n// Copyright (c) 2019 Microsoft Corporation\n\nimport { createHmac } from 'crypto';\nimport SymmetricKey from './symmetric-key';\n\nexport const keySize = 256;\nconst keySizeInBytes = keySize / 8;\n\nexport const deriveKey = (rootKey: Buffer, salt: string): Buffer => {\n const hmac = createHmac('sha256', rootKey);\n hmac.update(Buffer.from(salt, 'utf16le'));\n return hmac.digest();\n};\n\nexport const generateKeySalt = (\n keyType: 'encryption' | 'MAC' | 'IV',\n algorithmName: string,\n keySize: number,\n): string =>\n `Microsoft SQL Server cell ${keyType} key ` +\n `with encryption algorithm:${algorithmName} and key length:${keySize}`;\n\nexport class AeadAes256CbcHmac256EncryptionKey extends SymmetricKey {\n declare private readonly algorithmName: string;\n declare private encryptionKeySaltFormat: string;\n declare private macKeySaltFormat: string;\n declare private ivKeySaltFormat: string;\n declare private encryptionKey: SymmetricKey;\n declare private macKey: SymmetricKey;\n declare private ivKey: SymmetricKey;\n\n constructor(rootKey: Buffer, algorithmName: string) {\n super(rootKey);\n this.algorithmName = algorithmName;\n this.encryptionKeySaltFormat = generateKeySalt('encryption', this.algorithmName, keySize);\n this.macKeySaltFormat = generateKeySalt('MAC', this.algorithmName, keySize);\n this.ivKeySaltFormat = generateKeySalt('IV', this.algorithmName, keySize);\n\n if (rootKey.length !== keySizeInBytes) {\n throw new Error(`The column encryption key has been successfully decrypted but it's length: ${rootKey.length} does not match the length: ${keySizeInBytes} for algorithm \"${this.algorithmName}\". Verify the encrypted value of the column encryption key in the database.`);\n }\n\n try {\n const encKeyBuff = deriveKey(rootKey, this.encryptionKeySaltFormat);\n\n this.encryptionKey = new SymmetricKey(encKeyBuff);\n\n const macKeyBuff = deriveKey(rootKey, this.macKeySaltFormat);\n\n this.macKey = new SymmetricKey(macKeyBuff);\n\n const ivKeyBuff = deriveKey(rootKey, this.ivKeySaltFormat);\n\n this.ivKey = new SymmetricKey(ivKeyBuff);\n } catch (error: any) {\n throw new Error(`Key extraction failed : ${error.message}.`);\n }\n }\n\n getEncryptionKey(): Buffer {\n return this.encryptionKey.rootKey;\n }\n\n getMacKey(): Buffer {\n return this.macKey.rootKey;\n }\n\n getIvKey(): Buffer {\n return this.ivKey.rootKey;\n }\n}\n"],"mappings":";;;;;;AAGA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAC,sBAAA,CAAAF,OAAA;AAA2C,SAAAE,uBAAAC,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAJ3C;AACA;;AAKO,MAAMG,OAAO,GAAG,GAAG;AAACC,OAAA,CAAAD,OAAA,GAAAA,OAAA;AAC3B,MAAME,cAAc,GAAGF,OAAO,GAAG,CAAC;AAE3B,MAAMG,SAAS,GAAGA,CAACC,OAAe,EAAEC,IAAY,KAAa;EAClE,MAAMC,IAAI,GAAG,IAAAC,kBAAU,EAAC,QAAQ,EAAEH,OAAO,CAAC;EAC1CE,IAAI,CAACE,MAAM,CAACC,MAAM,CAACC,IAAI,CAACL,IAAI,EAAE,SAAS,CAAC,CAAC;EACzC,OAAOC,IAAI,CAACK,MAAM,CAAC,CAAC;AACtB,CAAC;AAACV,OAAA,CAAAE,SAAA,GAAAA,SAAA;AAEK,MAAMS,eAAe,GAAGA,CAC7BC,OAAoC,EACpCC,aAAqB,EACrBd,OAAe,KAEd,6BAA4Ba,OAAQ,OAAM,GAC1C,6BAA4BC,aAAc,mBAAkBd,OAAQ,EAAC;AAACC,OAAA,CAAAW,eAAA,GAAAA,eAAA;AAElE,MAAMG,iCAAiC,SAASC,qBAAY,CAAC;EASlEC,WAAWA,CAACb,OAAe,EAAEU,aAAqB,EAAE;IAClD,KAAK,CAACV,OAAO,CAAC;IACd,IAAI,CAACU,aAAa,GAAGA,aAAa;IAClC,IAAI,CAACI,uBAAuB,GAAGN,eAAe,CAAC,YAAY,EAAE,IAAI,CAACE,aAAa,EAAEd,OAAO,CAAC;IACzF,IAAI,CAACmB,gBAAgB,GAAGP,eAAe,CAAC,KAAK,EAAE,IAAI,CAACE,aAAa,EAAEd,OAAO,CAAC;IAC3E,IAAI,CAACoB,eAAe,GAAGR,eAAe,CAAC,IAAI,EAAE,IAAI,CAACE,aAAa,EAAEd,OAAO,CAAC;IAEzE,IAAII,OAAO,CAACiB,MAAM,KAAKnB,cAAc,EAAE;MACrC,MAAM,IAAIoB,KAAK,CAAE,8EAA6ElB,OAAO,CAACiB,MAAO,+BAA8BnB,cAAe,mBAAkB,IAAI,CAACY,aAAc,6EAA4E,CAAC;IAC9Q;IAEA,IAAI;MACF,MAAMS,UAAU,GAAGpB,SAAS,CAACC,OAAO,EAAE,IAAI,CAACc,uBAAuB,CAAC;MAEnE,IAAI,CAACM,aAAa,GAAG,IAAIR,qBAAY,CAACO,UAAU,CAAC;MAEjD,MAAME,UAAU,GAAGtB,SAAS,CAACC,OAAO,EAAE,IAAI,CAACe,gBAAgB,CAAC;MAE5D,IAAI,CAACO,MAAM,GAAG,IAAIV,qBAAY,CAACS,UAAU,CAAC;MAE1C,MAAME,SAAS,GAAGxB,SAAS,CAACC,OAAO,EAAE,IAAI,CAACgB,eAAe,CAAC;MAE1D,IAAI,CAACQ,KAAK,GAAG,IAAIZ,qBAAY,CAACW,SAAS,CAAC;IAC1C,CAAC,CAAC,OAAOE,KAAU,EAAE;MACnB,MAAM,IAAIP,KAAK,CAAE,2BAA0BO,KAAK,CAACC,OAAQ,GAAE,CAAC;IAC9D;EACF;EAEAC,gBAAgBA,CAAA,EAAW;IACzB,OAAO,IAAI,CAACP,aAAa,CAACpB,OAAO;EACnC;EAEA4B,SAASA,CAAA,EAAW;IAClB,OAAO,IAAI,CAACN,MAAM,CAACtB,OAAO;EAC5B;EAEA6B,QAAQA,CAAA,EAAW;IACjB,OAAO,IAAI,CAACL,KAAK,CAACxB,OAAO;EAC3B;AACF;AAACH,OAAA,CAAAc,iCAAA,GAAAA,iCAAA"}
|
|
@@ -8,12 +8,6 @@ exports.CEKEntry = void 0;
|
|
|
8
8
|
// Copyright (c) 2019 Microsoft Corporation
|
|
9
9
|
|
|
10
10
|
class CEKEntry {
|
|
11
|
-
columnEncryptionKeyValues;
|
|
12
|
-
ordinal;
|
|
13
|
-
databaseId;
|
|
14
|
-
cekId;
|
|
15
|
-
cekVersion;
|
|
16
|
-
cekMdVersion;
|
|
17
11
|
constructor(ordinalVal) {
|
|
18
12
|
this.ordinal = ordinalVal;
|
|
19
13
|
this.databaseId = 0;
|
|
@@ -45,4 +39,4 @@ class CEKEntry {
|
|
|
45
39
|
}
|
|
46
40
|
}
|
|
47
41
|
exports.CEKEntry = CEKEntry;
|
|
48
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
42
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDRUtFbnRyeSIsImNvbnN0cnVjdG9yIiwib3JkaW5hbFZhbCIsIm9yZGluYWwiLCJkYXRhYmFzZUlkIiwiY2VrSWQiLCJjZWtWZXJzaW9uIiwiY2VrTWRWZXJzaW9uIiwiQnVmZmVyIiwiYWxsb2MiLCJjb2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzIiwiYWRkIiwiZW5jcnlwdGVkS2V5IiwiZGJJZCIsImtleUlkIiwia2V5VmVyc2lvbiIsIm1kVmVyc2lvbiIsImtleVBhdGgiLCJrZXlTdG9yZU5hbWUiLCJhbGdvcml0aG1OYW1lIiwiZW5jcnlwdGlvbktleSIsInB1c2giLCJsZW5ndGgiLCJFcnJvciIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYWx3YXlzLWVuY3J5cHRlZC9jZWstZW50cnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IHR5cGUgRW5jcnlwdGlvbktleUluZm8gfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENFS0VudHJ5IHtcbiAgZGVjbGFyZSBjb2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzOiBFbmNyeXB0aW9uS2V5SW5mb1tdO1xuICBkZWNsYXJlIG9yZGluYWw6IG51bWJlcjtcbiAgZGVjbGFyZSBkYXRhYmFzZUlkOiBudW1iZXI7XG4gIGRlY2xhcmUgY2VrSWQ6IG51bWJlcjtcbiAgZGVjbGFyZSBjZWtWZXJzaW9uOiBudW1iZXI7XG4gIGRlY2xhcmUgY2VrTWRWZXJzaW9uOiBCdWZmZXI7XG5cbiAgY29uc3RydWN0b3Iob3JkaW5hbFZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5vcmRpbmFsID0gb3JkaW5hbFZhbDtcbiAgICB0aGlzLmRhdGFiYXNlSWQgPSAwO1xuICAgIHRoaXMuY2VrSWQgPSAwO1xuICAgIHRoaXMuY2VrVmVyc2lvbiA9IDA7XG4gICAgdGhpcy5jZWtNZFZlcnNpb24gPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgdGhpcy5jb2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzID0gW107XG4gIH1cblxuICBhZGQoZW5jcnlwdGVkS2V5OiBCdWZmZXIsIGRiSWQ6IG51bWJlciwga2V5SWQ6IG51bWJlciwga2V5VmVyc2lvbjogbnVtYmVyLCBtZFZlcnNpb246IEJ1ZmZlciwga2V5UGF0aDogc3RyaW5nLCBrZXlTdG9yZU5hbWU6IHN0cmluZywgYWxnb3JpdGhtTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZW5jcnlwdGlvbktleTogRW5jcnlwdGlvbktleUluZm8gPSB7XG4gICAgICBlbmNyeXB0ZWRLZXksXG4gICAgICBkYklkLFxuICAgICAga2V5SWQsXG4gICAgICBrZXlWZXJzaW9uLFxuICAgICAgbWRWZXJzaW9uLFxuICAgICAga2V5UGF0aCxcbiAgICAgIGtleVN0b3JlTmFtZSxcbiAgICAgIGFsZ29yaXRobU5hbWUsXG4gICAgfTtcblxuICAgIHRoaXMuY29sdW1uRW5jcnlwdGlvbktleVZhbHVlcy5wdXNoKGVuY3J5cHRpb25LZXkpO1xuXG4gICAgaWYgKHRoaXMuZGF0YWJhc2VJZCA9PT0gMCkge1xuICAgICAgdGhpcy5kYXRhYmFzZUlkID0gZGJJZDtcbiAgICAgIHRoaXMuY2VrSWQgPSBrZXlJZDtcbiAgICAgIHRoaXMuY2VrVmVyc2lvbiA9IGtleVZlcnNpb247XG4gICAgICB0aGlzLmNla01kVmVyc2lvbiA9IG1kVmVyc2lvbjtcbiAgICB9IGVsc2UgaWYgKCh0aGlzLmRhdGFiYXNlSWQgIT09IGRiSWQpIHx8ICh0aGlzLmNla0lkICE9PSBrZXlJZCkgfHwgKHRoaXMuY2VrVmVyc2lvbiAhPT0ga2V5VmVyc2lvbikgfHwgIXRoaXMuY2VrTWRWZXJzaW9uIHx8ICFtZFZlcnNpb24gfHwgdGhpcy5jZWtNZFZlcnNpb24ubGVuZ3RoICE9PSBtZFZlcnNpb24ubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0YWJhc2VJZCwgY2VrSWQsIGNla1ZlcnNpb24gb3IgY2VrTWRWZXJzaW9uLicpO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBOztBQUlPLE1BQU1BLFFBQVEsQ0FBQztFQVFwQkMsV0FBV0EsQ0FBQ0MsVUFBa0IsRUFBRTtJQUM5QixJQUFJLENBQUNDLE9BQU8sR0FBR0QsVUFBVTtJQUN6QixJQUFJLENBQUNFLFVBQVUsR0FBRyxDQUFDO0lBQ25CLElBQUksQ0FBQ0MsS0FBSyxHQUFHLENBQUM7SUFDZCxJQUFJLENBQUNDLFVBQVUsR0FBRyxDQUFDO0lBQ25CLElBQUksQ0FBQ0MsWUFBWSxHQUFHQyxNQUFNLENBQUNDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbkMsSUFBSSxDQUFDQyx5QkFBeUIsR0FBRyxFQUFFO0VBQ3JDO0VBRUFDLEdBQUdBLENBQUNDLFlBQW9CLEVBQUVDLElBQVksRUFBRUMsS0FBYSxFQUFFQyxVQUFrQixFQUFFQyxTQUFpQixFQUFFQyxPQUFlLEVBQUVDLFlBQW9CLEVBQUVDLGFBQXFCLEVBQVE7SUFDaEssTUFBTUMsYUFBZ0MsR0FBRztNQUN2Q1IsWUFBWTtNQUNaQyxJQUFJO01BQ0pDLEtBQUs7TUFDTEMsVUFBVTtNQUNWQyxTQUFTO01BQ1RDLE9BQU87TUFDUEMsWUFBWTtNQUNaQztJQUNGLENBQUM7SUFFRCxJQUFJLENBQUNULHlCQUF5QixDQUFDVyxJQUFJLENBQUNELGFBQWEsQ0FBQztJQUVsRCxJQUFJLElBQUksQ0FBQ2hCLFVBQVUsS0FBSyxDQUFDLEVBQUU7TUFDekIsSUFBSSxDQUFDQSxVQUFVLEdBQUdTLElBQUk7TUFDdEIsSUFBSSxDQUFDUixLQUFLLEdBQUdTLEtBQUs7TUFDbEIsSUFBSSxDQUFDUixVQUFVLEdBQUdTLFVBQVU7TUFDNUIsSUFBSSxDQUFDUixZQUFZLEdBQUdTLFNBQVM7SUFDL0IsQ0FBQyxNQUFNLElBQUssSUFBSSxDQUFDWixVQUFVLEtBQUtTLElBQUksSUFBTSxJQUFJLENBQUNSLEtBQUssS0FBS1MsS0FBTSxJQUFLLElBQUksQ0FBQ1IsVUFBVSxLQUFLUyxVQUFXLElBQUksQ0FBQyxJQUFJLENBQUNSLFlBQVksSUFBSSxDQUFDUyxTQUFTLElBQUksSUFBSSxDQUFDVCxZQUFZLENBQUNlLE1BQU0sS0FBS04sU0FBUyxDQUFDTSxNQUFNLEVBQUU7TUFDeEwsTUFBTSxJQUFJQyxLQUFLLENBQUMsd0RBQXdELENBQUM7SUFDM0U7RUFDRjtBQUNGO0FBQUNDLE9BQUEsQ0FBQXhCLFFBQUEsR0FBQUEsUUFBQSJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cek-entry.js","names":["CEKEntry","
|
|
1
|
+
{"version":3,"file":"cek-entry.js","names":["CEKEntry","constructor","ordinalVal","ordinal","databaseId","cekId","cekVersion","cekMdVersion","Buffer","alloc","columnEncryptionKeyValues","add","encryptedKey","dbId","keyId","keyVersion","mdVersion","keyPath","keyStoreName","algorithmName","encryptionKey","push","length","Error","exports"],"sources":["../../src/always-encrypted/cek-entry.ts"],"sourcesContent":["// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.\n// Copyright (c) 2019 Microsoft Corporation\n\nimport { type EncryptionKeyInfo } from './types';\n\nexport class CEKEntry {\n declare columnEncryptionKeyValues: EncryptionKeyInfo[];\n declare ordinal: number;\n declare databaseId: number;\n declare cekId: number;\n declare cekVersion: number;\n declare cekMdVersion: Buffer;\n\n constructor(ordinalVal: number) {\n this.ordinal = ordinalVal;\n this.databaseId = 0;\n this.cekId = 0;\n this.cekVersion = 0;\n this.cekMdVersion = Buffer.alloc(0);\n this.columnEncryptionKeyValues = [];\n }\n\n add(encryptedKey: Buffer, dbId: number, keyId: number, keyVersion: number, mdVersion: Buffer, keyPath: string, keyStoreName: string, algorithmName: string): void {\n const encryptionKey: EncryptionKeyInfo = {\n encryptedKey,\n dbId,\n keyId,\n keyVersion,\n mdVersion,\n keyPath,\n keyStoreName,\n algorithmName,\n };\n\n this.columnEncryptionKeyValues.push(encryptionKey);\n\n if (this.databaseId === 0) {\n this.databaseId = dbId;\n this.cekId = keyId;\n this.cekVersion = keyVersion;\n this.cekMdVersion = mdVersion;\n } else if ((this.databaseId !== dbId) || (this.cekId !== keyId) || (this.cekVersion !== keyVersion) || !this.cekMdVersion || !mdVersion || this.cekMdVersion.length !== mdVersion.length) {\n throw new Error('Invalid databaseId, cekId, cekVersion or cekMdVersion.');\n }\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;;AAIO,MAAMA,QAAQ,CAAC;EAQpBC,WAAWA,CAACC,UAAkB,EAAE;IAC9B,IAAI,CAACC,OAAO,GAAGD,UAAU;IACzB,IAAI,CAACE,UAAU,GAAG,CAAC;IACnB,IAAI,CAACC,KAAK,GAAG,CAAC;IACd,IAAI,CAACC,UAAU,GAAG,CAAC;IACnB,IAAI,CAACC,YAAY,GAAGC,MAAM,CAACC,KAAK,CAAC,CAAC,CAAC;IACnC,IAAI,CAACC,yBAAyB,GAAG,EAAE;EACrC;EAEAC,GAAGA,CAACC,YAAoB,EAAEC,IAAY,EAAEC,KAAa,EAAEC,UAAkB,EAAEC,SAAiB,EAAEC,OAAe,EAAEC,YAAoB,EAAEC,aAAqB,EAAQ;IAChK,MAAMC,aAAgC,GAAG;MACvCR,YAAY;MACZC,IAAI;MACJC,KAAK;MACLC,UAAU;MACVC,SAAS;MACTC,OAAO;MACPC,YAAY;MACZC;IACF,CAAC;IAED,IAAI,CAACT,yBAAyB,CAACW,IAAI,CAACD,aAAa,CAAC;IAElD,IAAI,IAAI,CAAChB,UAAU,KAAK,CAAC,EAAE;MACzB,IAAI,CAACA,UAAU,GAAGS,IAAI;MACtB,IAAI,CAACR,KAAK,GAAGS,KAAK;MAClB,IAAI,CAACR,UAAU,GAAGS,UAAU;MAC5B,IAAI,CAACR,YAAY,GAAGS,SAAS;IAC/B,CAAC,MAAM,IAAK,IAAI,CAACZ,UAAU,KAAKS,IAAI,IAAM,IAAI,CAACR,KAAK,KAAKS,KAAM,IAAK,IAAI,CAACR,UAAU,KAAKS,UAAW,IAAI,CAAC,IAAI,CAACR,YAAY,IAAI,CAACS,SAAS,IAAI,IAAI,CAACT,YAAY,CAACe,MAAM,KAAKN,SAAS,CAACM,MAAM,EAAE;MACxL,MAAM,IAAIC,KAAK,CAAC,wDAAwD,CAAC;IAC3E;EACF;AACF;AAACC,OAAA,CAAAxB,QAAA,GAAAA,QAAA"}
|
|
@@ -12,13 +12,6 @@ var _url = require("url");
|
|
|
12
12
|
// Copyright (c) 2019 Microsoft Corporation
|
|
13
13
|
|
|
14
14
|
class ColumnEncryptionAzureKeyVaultProvider {
|
|
15
|
-
name;
|
|
16
|
-
url;
|
|
17
|
-
rsaEncryptionAlgorithmWithOAEPForAKV;
|
|
18
|
-
firstVersion;
|
|
19
|
-
credentials;
|
|
20
|
-
azureKeyVaultDomainName;
|
|
21
|
-
keyClient;
|
|
22
15
|
constructor(clientId, clientKey, tenantId) {
|
|
23
16
|
this.name = 'AZURE_KEY_VAULT';
|
|
24
17
|
this.azureKeyVaultDomainName = 'vault.azure.net';
|
|
@@ -251,4 +244,4 @@ class ColumnEncryptionAzureKeyVaultProvider {
|
|
|
251
244
|
}
|
|
252
245
|
}
|
|
253
246
|
exports.ColumnEncryptionAzureKeyVaultProvider = ColumnEncryptionAzureKeyVaultProvider;
|
|
254
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaWRlbnRpdHkiLCJyZXF1aXJlIiwiX2tleXZhdWx0S2V5cyIsIl9jcnlwdG8iLCJfdXJsIiwiQ29sdW1uRW5jcnlwdGlvbkF6dXJlS2V5VmF1bHRQcm92aWRlciIsIm5hbWUiLCJ1cmwiLCJyc2FFbmNyeXB0aW9uQWxnb3JpdGhtV2l0aE9BRVBGb3JBS1YiLCJmaXJzdFZlcnNpb24iLCJjcmVkZW50aWFscyIsImF6dXJlS2V5VmF1bHREb21haW5OYW1lIiwia2V5Q2xpZW50IiwiY29uc3RydWN0b3IiLCJjbGllbnRJZCIsImNsaWVudEtleSIsInRlbmFudElkIiwiQnVmZmVyIiwiZnJvbSIsIkNsaWVudFNlY3JldENyZWRlbnRpYWwiLCJkZWNyeXB0Q29sdW1uRW5jcnlwdGlvbktleSIsIm1hc3RlcktleVBhdGgiLCJlbmNyeXB0aW9uQWxnb3JpdGhtIiwiZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleSIsIkVycm9yIiwibGVuZ3RoIiwidmFsaWRhdGVFbmNyeXB0aW9uQWxnb3JpdGhtIiwibWFzdGVyS2V5IiwiZ2V0TWFzdGVyS2V5Iiwia2V5U2l6ZUluQnl0ZXMiLCJnZXRBS1ZLZXlTaXplIiwiY3J5cHRvQ2xpZW50IiwiY3JlYXRlQ3J5cHRvQ2xpZW50IiwidG9TdHJpbmciLCJjdXJyZW50SW5kZXgiLCJrZXlQYXRoTGVuZ3RoIiwicmVhZEludDE2TEUiLCJjaXBoZXJUZXh0TGVuZ3RoIiwic2lnbmF0dXJlTGVuZ3RoIiwiY2lwaGVyVGV4dCIsImFsbG9jIiwiY29weSIsInNpZ25hdHVyZSIsImhhc2giLCJtZXNzYWdlRGlnZXN0IiwiY3JlYXRlSGFzaCIsInVwZGF0ZSIsImRhdGFUb1ZlcmlmeSIsImRpZ2VzdCIsInZlcmlmeUtleSIsInZlcmlmeSIsInJlc3VsdCIsImRlY3J5cHRlZENFSyIsImF6dXJlS2V5VmF1bHRVbldyYXAiLCJlbmNyeXB0Q29sdW1uRW5jcnlwdGlvbktleSIsImNvbHVtbkVuY3J5cHRpb25LZXkiLCJ2ZXJzaW9uIiwibWFzdGVyS2V5UGF0aEJ5dGVzIiwidG9Mb3dlckNhc2UiLCJhenVyZUtleVZhdWx0V3JhcCIsImRhdGFUb0hhc2giLCJkZXN0aW5hdGlvblBvc2l0aW9uIiwiZGF0YVRvU2lnbiIsInNpZ25lZEhhc2giLCJhenVyZUtleVZhdWx0U2lnbmVkSGFzaGVkRGF0YSIsImVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXlMZW5ndGgiLCJrZXlQYXJ0cyIsInBhcnNlUGF0aCIsImNyZWF0ZUtleUNsaWVudCIsInZhdWx0VXJsIiwiZ2V0S2V5Iiwia2V5VmF1bHRVcmwiLCJLZXlDbGllbnQiLCJDcnlwdG9ncmFwaHlDbGllbnQiLCJ0cmltIiwiYmFzZVVyaSIsInBhcnNlIiwiaG9zdG5hbWUiLCJlbmRzV2l0aCIsInNlZ21lbnRzIiwicGF0aG5hbWUiLCJzcGxpdCIsInByb3RvY29sIiwiaG9zdCIsInVuZGVmaW5lZCIsInNpZ25lZERhdGEiLCJzaWduIiwid3JhcHBlZEtleSIsIndyYXBLZXkiLCJ1bndyYXBwZWRLZXkiLCJ1bndyYXBLZXkiLCJyZXRyaWV2ZWRLZXkiLCJrZXkiLCJrdHkiLCJ0b1VwcGVyQ2FzZSIsImxvY2FsZUNvbXBhcmUiLCJrZXlMZW5ndGgiLCJuIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL2tleXN0b3JlLXByb3ZpZGVyLWF6dXJlLWtleS12YXVsdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgQ2xpZW50U2VjcmV0Q3JlZGVudGlhbCB9IGZyb20gJ0BhenVyZS9pZGVudGl0eSc7XG5pbXBvcnQgeyBDcnlwdG9ncmFwaHlDbGllbnQsIHR5cGUgS2V5V3JhcEFsZ29yaXRobSwgS2V5Q2xpZW50LCB0eXBlIEtleVZhdWx0S2V5IH0gZnJvbSAnQGF6dXJlL2tleXZhdWx0LWtleXMnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ3VybCc7XG5cbmludGVyZmFjZSBQYXJzZWRLZXlQYXRoIHtcbiAgdmF1bHRVcmw6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgQ29sdW1uRW5jcnlwdGlvbkF6dXJlS2V5VmF1bHRQcm92aWRlciB7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgdXJsOiB1bmRlZmluZWQgfCBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcnNhRW5jcnlwdGlvbkFsZ29yaXRobVdpdGhPQUVQRm9yQUtWOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlyc3RWZXJzaW9uOiBCdWZmZXI7XG4gIHByaXZhdGUgY3JlZGVudGlhbHM6IENsaWVudFNlY3JldENyZWRlbnRpYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXp1cmVLZXlWYXVsdERvbWFpbk5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBrZXlDbGllbnQ6IHVuZGVmaW5lZCB8IEtleUNsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnRJZDogc3RyaW5nLCBjbGllbnRLZXk6IHN0cmluZywgdGVuYW50SWQ6IHN0cmluZykge1xuICAgIHRoaXMubmFtZSA9ICdBWlVSRV9LRVlfVkFVTFQnO1xuICAgIHRoaXMuYXp1cmVLZXlWYXVsdERvbWFpbk5hbWUgPSAndmF1bHQuYXp1cmUubmV0JztcbiAgICB0aGlzLnJzYUVuY3J5cHRpb25BbGdvcml0aG1XaXRoT0FFUEZvckFLViA9ICdSU0EtT0FFUCc7XG4gICAgdGhpcy5maXJzdFZlcnNpb24gPSBCdWZmZXIuZnJvbShbMHgwMV0pO1xuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBuZXcgQ2xpZW50U2VjcmV0Q3JlZGVudGlhbCh0ZW5hbnRJZCwgY2xpZW50SWQsIGNsaWVudEtleSk7XG4gIH1cblxuICBhc3luYyBkZWNyeXB0Q29sdW1uRW5jcnlwdGlvbktleShtYXN0ZXJLZXlQYXRoOiBzdHJpbmcsIGVuY3J5cHRpb25BbGdvcml0aG06IHN0cmluZywgZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleTogQnVmZmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBpZiAoIWVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW50ZXJuYWwgZXJyb3IuIEVuY3J5cHRlZCBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgY2Fubm90IGJlIG51bGwuJyk7XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsIGVycm9yLiBFbXB0eSBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5IHNwZWNpZmllZC4nKTtcbiAgICB9XG5cbiAgICBlbmNyeXB0aW9uQWxnb3JpdGhtID0gdGhpcy52YWxpZGF0ZUVuY3J5cHRpb25BbGdvcml0aG0oZW5jcnlwdGlvbkFsZ29yaXRobSk7XG5cbiAgICBjb25zdCBtYXN0ZXJLZXkgPSBhd2FpdCB0aGlzLmdldE1hc3RlcktleShtYXN0ZXJLZXlQYXRoKTtcblxuICAgIGNvbnN0IGtleVNpemVJbkJ5dGVzID0gdGhpcy5nZXRBS1ZLZXlTaXplKG1hc3RlcktleSk7XG5cbiAgICBjb25zdCBjcnlwdG9DbGllbnQgPSB0aGlzLmNyZWF0ZUNyeXB0b0NsaWVudChtYXN0ZXJLZXkpO1xuXG4gICAgaWYgKGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXlbMF0gIT09IHRoaXMuZmlyc3RWZXJzaW9uWzBdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNwZWNpZmllZCBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5IGNvbnRhaW5zIGFuIGludmFsaWQgZW5jcnlwdGlvbiBhbGdvcml0aG0gdmVyc2lvbiAke0J1ZmZlci5mcm9tKFtlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5WzBdXSkudG9TdHJpbmcoJ2hleCcpfS4gRXhwZWN0ZWQgdmVyc2lvbiBpcyAke0J1ZmZlci5mcm9tKFt0aGlzLmZpcnN0VmVyc2lvblswXV0pLnRvU3RyaW5nKCdoZXgnKX0uYCk7XG4gICAgfVxuXG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IHRoaXMuZmlyc3RWZXJzaW9uLmxlbmd0aDtcbiAgICBjb25zdCBrZXlQYXRoTGVuZ3RoOiBudW1iZXIgPSBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5LnJlYWRJbnQxNkxFKGN1cnJlbnRJbmRleCk7XG5cbiAgICBjdXJyZW50SW5kZXggKz0gMjtcblxuICAgIGNvbnN0IGNpcGhlclRleHRMZW5ndGg6IG51bWJlciA9IGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkucmVhZEludDE2TEUoY3VycmVudEluZGV4KTtcblxuICAgIGN1cnJlbnRJbmRleCArPSAyO1xuXG4gICAgY3VycmVudEluZGV4ICs9IGtleVBhdGhMZW5ndGg7XG5cbiAgICBpZiAoY2lwaGVyVGV4dExlbmd0aCAhPT0ga2V5U2l6ZUluQnl0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHNwZWNpZmllZCBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5J3MgY2lwaGVydGV4dCBsZW5ndGg6ICR7Y2lwaGVyVGV4dExlbmd0aH0gZG9lcyBub3QgbWF0Y2ggdGhlIGNpcGhlcnRleHQgbGVuZ3RoOiAke2tleVNpemVJbkJ5dGVzfSB3aGVuIHVzaW5nIGNvbHVtbiBtYXN0ZXIga2V5IChBenVyZSBLZXkgVmF1bHQga2V5KSBpbiAke21hc3RlcktleVBhdGh9LiBUaGUgZW5jcnlwdGVkIGNvbHVtbiBlbmNyeXB0aW9uIGtleSBtYXkgYmUgY29ycnVwdCwgb3IgdGhlIHNwZWNpZmllZCBBenVyZSBLZXkgVmF1bHQga2V5IHBhdGggbWF5IGJlIGluY29ycmVjdC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduYXR1cmVMZW5ndGg6IG51bWJlciA9IGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkubGVuZ3RoIC0gY3VycmVudEluZGV4IC0gY2lwaGVyVGV4dExlbmd0aDtcblxuICAgIGlmIChzaWduYXR1cmVMZW5ndGggIT09IGtleVNpemVJbkJ5dGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBzcGVjaWZpZWQgZW5jcnlwdGVkIGNvbHVtbiBlbmNyeXB0aW9uIGtleSdzIHNpZ25hdHVyZSBsZW5ndGg6ICR7c2lnbmF0dXJlTGVuZ3RofSBkb2VzIG5vdCBtYXRjaCB0aGUgc2lnbmF0dXJlIGxlbmd0aDogJHtrZXlTaXplSW5CeXRlc30gd2hlbiB1c2luZyBjb2x1bW4gbWFzdGVyIGtleSAoQXp1cmUgS2V5IFZhdWx0IGtleSkgaW4gJHttYXN0ZXJLZXlQYXRofS4gVGhlIGVuY3J5cHRlZCBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgbWF5IGJlIGNvcnJ1cHQsIG9yIHRoZSBzcGVjaWZpZWQgQXp1cmUgS2V5IFZhdWx0IGtleSBwYXRoIG1heSBiZSBpbmNvcnJlY3QuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2lwaGVyVGV4dCA9IEJ1ZmZlci5hbGxvYyhjaXBoZXJUZXh0TGVuZ3RoKTtcbiAgICBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5LmNvcHkoY2lwaGVyVGV4dCwgMCwgY3VycmVudEluZGV4LCBjdXJyZW50SW5kZXggKyBjaXBoZXJUZXh0TGVuZ3RoKTtcbiAgICBjdXJyZW50SW5kZXggKz0gY2lwaGVyVGV4dExlbmd0aDtcblxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IEJ1ZmZlci5hbGxvYyhzaWduYXR1cmVMZW5ndGgpO1xuICAgIGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkuY29weShzaWduYXR1cmUsIDAsIGN1cnJlbnRJbmRleCwgY3VycmVudEluZGV4ICsgc2lnbmF0dXJlTGVuZ3RoKTtcblxuICAgIGNvbnN0IGhhc2ggPSBCdWZmZXIuYWxsb2MoZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleS5sZW5ndGggLSBzaWduYXR1cmUubGVuZ3RoKTtcbiAgICBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5LmNvcHkoaGFzaCwgMCwgMCwgZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleS5sZW5ndGggLSBzaWduYXR1cmUubGVuZ3RoKTtcblxuICAgIGNvbnN0IG1lc3NhZ2VEaWdlc3QgPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcbiAgICBtZXNzYWdlRGlnZXN0LnVwZGF0ZShoYXNoKTtcblxuICAgIGNvbnN0IGRhdGFUb1ZlcmlmeTogQnVmZmVyID0gbWVzc2FnZURpZ2VzdC5kaWdlc3QoKTtcblxuICAgIGlmICghZGF0YVRvVmVyaWZ5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0hhc2ggc2hvdWxkIG5vdCBiZSBudWxsIHdoaWxlIGRlY3J5cHRpbmcgZW5jcnlwdGVkIGNvbHVtbiBlbmNyeXB0aW9uIGtleS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB2ZXJpZnlLZXkgPSBhd2FpdCBjcnlwdG9DbGllbnQudmVyaWZ5KCdSUzI1NicsIGRhdGFUb1ZlcmlmeSwgc2lnbmF0dXJlKTtcbiAgICBpZiAoIXZlcmlmeUtleS5yZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHNwZWNpZmllZCBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5IHNpZ25hdHVyZSBkb2VzIG5vdCBtYXRjaCB0aGUgc2lnbmF0dXJlIGNvbXB1dGVkIHdpdGggdGhlIGNvbHVtbiBtYXN0ZXIga2V5IChBc3ltbWV0cmljIGtleSBpbiBBenVyZSBLZXkgVmF1bHQpIGluICR7bWFzdGVyS2V5UGF0aH0uIFRoZSBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5IG1heSBiZSBjb3JydXB0LCBvciB0aGUgc3BlY2lmaWVkIHBhdGggbWF5IGJlIGluY29ycmVjdC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRDRUs6IEJ1ZmZlciA9IGF3YWl0IHRoaXMuYXp1cmVLZXlWYXVsdFVuV3JhcChjcnlwdG9DbGllbnQsIGVuY3J5cHRpb25BbGdvcml0aG0sIGNpcGhlclRleHQpO1xuXG4gICAgcmV0dXJuIGRlY3J5cHRlZENFSztcbiAgfVxuXG4gIGFzeW5jIGVuY3J5cHRDb2x1bW5FbmNyeXB0aW9uS2V5KG1hc3RlcktleVBhdGg6IHN0cmluZywgZW5jcnlwdGlvbkFsZ29yaXRobTogc3RyaW5nLCBjb2x1bW5FbmNyeXB0aW9uS2V5OiBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGlmICghY29sdW1uRW5jcnlwdGlvbktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2x1bW4gZW5jcnlwdGlvbiBrZXkgY2Fubm90IGJlIG51bGwuJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbHVtbkVuY3J5cHRpb25LZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VtcHR5IGNvbHVtbiBlbmNyeXB0aW9uIGtleSBzcGVjaWZpZWQuJyk7XG4gICAgfVxuXG4gICAgZW5jcnlwdGlvbkFsZ29yaXRobSA9IHRoaXMudmFsaWRhdGVFbmNyeXB0aW9uQWxnb3JpdGhtKGVuY3J5cHRpb25BbGdvcml0aG0pO1xuXG4gICAgY29uc3QgbWFzdGVyS2V5ID0gYXdhaXQgdGhpcy5nZXRNYXN0ZXJLZXkobWFzdGVyS2V5UGF0aCk7XG5cbiAgICBjb25zdCBrZXlTaXplSW5CeXRlcyA9IHRoaXMuZ2V0QUtWS2V5U2l6ZShtYXN0ZXJLZXkpO1xuXG4gICAgY29uc3QgY3J5cHRvQ2xpZW50ID0gdGhpcy5jcmVhdGVDcnlwdG9DbGllbnQobWFzdGVyS2V5KTtcblxuICAgIGNvbnN0IHZlcnNpb24gPSBCdWZmZXIuZnJvbShbdGhpcy5maXJzdFZlcnNpb25bMF1dKTtcblxuICAgIGNvbnN0IG1hc3RlcktleVBhdGhCeXRlczogQnVmZmVyID0gQnVmZmVyLmZyb20obWFzdGVyS2V5UGF0aC50b0xvd2VyQ2FzZSgpLCAndXRmOCcpO1xuXG4gICAgY29uc3Qga2V5UGF0aExlbmd0aDogQnVmZmVyID0gQnVmZmVyLmFsbG9jKDIpO1xuXG4gICAga2V5UGF0aExlbmd0aFswXSA9IG1hc3RlcktleVBhdGhCeXRlcy5sZW5ndGggJiAweGZmO1xuICAgIGtleVBhdGhMZW5ndGhbMV0gPSBtYXN0ZXJLZXlQYXRoQnl0ZXMubGVuZ3RoID4+IDggJiAweGZmO1xuXG4gICAgY29uc3QgY2lwaGVyVGV4dDogQnVmZmVyID0gYXdhaXQgdGhpcy5henVyZUtleVZhdWx0V3JhcChjcnlwdG9DbGllbnQsIGVuY3J5cHRpb25BbGdvcml0aG0sIGNvbHVtbkVuY3J5cHRpb25LZXkpO1xuXG4gICAgY29uc3QgY2lwaGVyVGV4dExlbmd0aDogQnVmZmVyID0gQnVmZmVyLmFsbG9jKDIpO1xuXG4gICAgY2lwaGVyVGV4dExlbmd0aFswXSA9IGNpcGhlclRleHQubGVuZ3RoICYgMHhmZjtcbiAgICBjaXBoZXJUZXh0TGVuZ3RoWzFdID0gY2lwaGVyVGV4dC5sZW5ndGggPj4gOCAmIDB4ZmY7XG5cbiAgICBpZiAoY2lwaGVyVGV4dC5sZW5ndGggIT09IGtleVNpemVJbkJ5dGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NpcGhlclRleHQgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIHRoZSBSU0Ega2V5IHNpemUuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YVRvSGFzaDogQnVmZmVyID0gQnVmZmVyLmFsbG9jKHZlcnNpb24ubGVuZ3RoICsga2V5UGF0aExlbmd0aC5sZW5ndGggKyBjaXBoZXJUZXh0TGVuZ3RoLmxlbmd0aCArIG1hc3RlcktleVBhdGhCeXRlcy5sZW5ndGggKyBjaXBoZXJUZXh0Lmxlbmd0aCk7XG4gICAgbGV0IGRlc3RpbmF0aW9uUG9zaXRpb246IG51bWJlciA9IHZlcnNpb24ubGVuZ3RoO1xuICAgIHZlcnNpb24uY29weShkYXRhVG9IYXNoLCAwLCAwLCB2ZXJzaW9uLmxlbmd0aCk7XG5cbiAgICBrZXlQYXRoTGVuZ3RoLmNvcHkoZGF0YVRvSGFzaCwgZGVzdGluYXRpb25Qb3NpdGlvbiwgMCwga2V5UGF0aExlbmd0aC5sZW5ndGgpO1xuICAgIGRlc3RpbmF0aW9uUG9zaXRpb24gKz0ga2V5UGF0aExlbmd0aC5sZW5ndGg7XG5cbiAgICBjaXBoZXJUZXh0TGVuZ3RoLmNvcHkoZGF0YVRvSGFzaCwgZGVzdGluYXRpb25Qb3NpdGlvbiwgMCwgY2lwaGVyVGV4dExlbmd0aC5sZW5ndGgpO1xuICAgIGRlc3RpbmF0aW9uUG9zaXRpb24gKz0gY2lwaGVyVGV4dExlbmd0aC5sZW5ndGg7XG5cbiAgICBtYXN0ZXJLZXlQYXRoQnl0ZXMuY29weShkYXRhVG9IYXNoLCBkZXN0aW5hdGlvblBvc2l0aW9uLCAwLCBtYXN0ZXJLZXlQYXRoQnl0ZXMubGVuZ3RoKTtcbiAgICBkZXN0aW5hdGlvblBvc2l0aW9uICs9IG1hc3RlcktleVBhdGhCeXRlcy5sZW5ndGg7XG5cbiAgICBjaXBoZXJUZXh0LmNvcHkoZGF0YVRvSGFzaCwgZGVzdGluYXRpb25Qb3NpdGlvbiwgMCwgY2lwaGVyVGV4dC5sZW5ndGgpO1xuXG4gICAgY29uc3QgbWVzc2FnZURpZ2VzdCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gICAgbWVzc2FnZURpZ2VzdC51cGRhdGUoZGF0YVRvSGFzaCk7XG5cbiAgICBjb25zdCBkYXRhVG9TaWduOiBCdWZmZXIgPSBtZXNzYWdlRGlnZXN0LmRpZ2VzdCgpO1xuXG4gICAgY29uc3Qgc2lnbmVkSGFzaDogQnVmZmVyID0gYXdhaXQgdGhpcy5henVyZUtleVZhdWx0U2lnbmVkSGFzaGVkRGF0YShjcnlwdG9DbGllbnQsIGRhdGFUb1NpZ24pO1xuICAgIGlmIChzaWduZWRIYXNoLmxlbmd0aCAhPT0ga2V5U2l6ZUluQnl0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2lnbmVkIGhhc2ggbGVuZ3RoIGRvZXMgbm90IG1hdGNoIHRoZSBSU0Ega2V5IHNpemUuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdmVyaWZ5S2V5ID0gYXdhaXQgY3J5cHRvQ2xpZW50LnZlcmlmeSgnUlMyNTYnLCBkYXRhVG9TaWduLCBzaWduZWRIYXNoKTtcblxuICAgIGlmICghdmVyaWZ5S2V5LnJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNpZ25hdHVyZSBvZiB0aGUgZW5jcnlwdGVkIGNvbHVtbiBlbmNyeXB0aW9uIGtleSBjb21wdXRlZC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5TGVuZ3RoOiBudW1iZXIgPSB2ZXJzaW9uLmxlbmd0aCArIGNpcGhlclRleHRMZW5ndGgubGVuZ3RoICsga2V5UGF0aExlbmd0aC5sZW5ndGggKyBjaXBoZXJUZXh0Lmxlbmd0aCArIG1hc3RlcktleVBhdGhCeXRlcy5sZW5ndGggKyBzaWduZWRIYXNoLmxlbmd0aDtcbiAgICBjb25zdCBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5OiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleUxlbmd0aCk7XG5cbiAgICBsZXQgY3VycmVudEluZGV4ID0gMDtcbiAgICB2ZXJzaW9uLmNvcHkoZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleSwgY3VycmVudEluZGV4LCAwLCB2ZXJzaW9uLmxlbmd0aCk7XG4gICAgY3VycmVudEluZGV4ICs9IHZlcnNpb24ubGVuZ3RoO1xuXG4gICAga2V5UGF0aExlbmd0aC5jb3B5KGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXksIGN1cnJlbnRJbmRleCwgMCwga2V5UGF0aExlbmd0aC5sZW5ndGgpO1xuICAgIGN1cnJlbnRJbmRleCArPSBrZXlQYXRoTGVuZ3RoLmxlbmd0aDtcblxuICAgIGNpcGhlclRleHRMZW5ndGguY29weShlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5LCBjdXJyZW50SW5kZXgsIDAsIGNpcGhlclRleHRMZW5ndGgubGVuZ3RoKTtcbiAgICBjdXJyZW50SW5kZXggKz0gY2lwaGVyVGV4dExlbmd0aC5sZW5ndGg7XG5cbiAgICBtYXN0ZXJLZXlQYXRoQnl0ZXMuY29weShlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5LCBjdXJyZW50SW5kZXgsIDAsIG1hc3RlcktleVBhdGhCeXRlcy5sZW5ndGgpO1xuICAgIGN1cnJlbnRJbmRleCArPSBtYXN0ZXJLZXlQYXRoQnl0ZXMubGVuZ3RoO1xuXG4gICAgY2lwaGVyVGV4dC5jb3B5KGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXksIGN1cnJlbnRJbmRleCwgMCwgY2lwaGVyVGV4dC5sZW5ndGgpO1xuICAgIGN1cnJlbnRJbmRleCArPSBjaXBoZXJUZXh0Lmxlbmd0aDtcblxuICAgIHNpZ25lZEhhc2guY29weShlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5LCBjdXJyZW50SW5kZXgsIDAsIHNpZ25lZEhhc2gubGVuZ3RoKTtcblxuICAgIHJldHVybiBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRNYXN0ZXJLZXkobWFzdGVyS2V5UGF0aDogc3RyaW5nKTogUHJvbWlzZTxLZXlWYXVsdEtleT4ge1xuICAgIGlmICghbWFzdGVyS2V5UGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXN0ZXIga2V5IHBhdGggY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IGtleVBhcnRzID0gdGhpcy5wYXJzZVBhdGgobWFzdGVyS2V5UGF0aCk7XG5cbiAgICB0aGlzLmNyZWF0ZUtleUNsaWVudChrZXlQYXJ0cy52YXVsdFVybCk7XG5cbiAgICByZXR1cm4gYXdhaXQgKHRoaXMua2V5Q2xpZW50IGFzIEtleUNsaWVudCkuZ2V0S2V5KGtleVBhcnRzLm5hbWUsIGtleVBhcnRzLnZlcnNpb24gPyB7IHZlcnNpb246IGtleVBhcnRzLnZlcnNpb24gfSA6IHt9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlS2V5Q2xpZW50KGtleVZhdWx0VXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWtleVZhdWx0VXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUga2V5IGNsaWVudCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkIGtleVZhdWx0VXJsJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5rZXlDbGllbnQpIHtcbiAgICAgIHRoaXMudXJsID0ga2V5VmF1bHRVcmw7XG4gICAgICB0aGlzLmtleUNsaWVudCA9IG5ldyBLZXlDbGllbnQoa2V5VmF1bHRVcmwsIHRoaXMuY3JlZGVudGlhbHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ3J5cHRvQ2xpZW50KG1hc3RlcktleTogS2V5VmF1bHRLZXkpOiBDcnlwdG9ncmFwaHlDbGllbnQge1xuICAgIGlmICghbWFzdGVyS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgQ3J5cHRvZ3JhcGh5Q2xpZW50IHdpdGggbnVsbCBvciB1bmRlZmluZWQgbWFzdGVyS2V5Jyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQ3J5cHRvZ3JhcGh5Q2xpZW50KG1hc3RlcktleSwgdGhpcy5jcmVkZW50aWFscyk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlUGF0aChtYXN0ZXJLZXlQYXRoOiBzdHJpbmcpOiBQYXJzZWRLZXlQYXRoIHtcbiAgICBpZiAoIW1hc3RlcktleVBhdGggfHwgbWFzdGVyS2V5UGF0aC50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F6dXJlIEtleSBWYXVsdCBrZXkgcGF0aCBjYW5ub3QgYmUgbnVsbC4nKTtcbiAgICB9XG5cbiAgICBsZXQgYmFzZVVyaTtcbiAgICB0cnkge1xuICAgICAgYmFzZVVyaSA9IHBhcnNlKG1hc3RlcktleVBhdGgsIHRydWUsIHRydWUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleXMgaWRlbnRpZmllcjogJHttYXN0ZXJLZXlQYXRofS4gTm90IGEgdmFsaWQgVVJJYCk7XG4gICAgfVxuXG4gICAgaWYgKCFiYXNlVXJpLmhvc3RuYW1lIHx8ICFiYXNlVXJpLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgodGhpcy5henVyZUtleVZhdWx0RG9tYWluTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBBenVyZSBLZXkgVmF1bHQga2V5IHBhdGggc3BlY2lmaWVkOiAke21hc3RlcktleVBhdGh9LmApO1xuICAgIH1cblxuICAgIC8vIFBhdGggaXMgb2YgdGhlIGZvcm0gJy9jb2xsZWN0aW9uL25hbWVbL3ZlcnNpb25dJ1xuICAgIGNvbnN0IHNlZ21lbnRzID0gKGJhc2VVcmkucGF0aG5hbWUgfHwgJycpLnNwbGl0KCcvJyk7XG4gICAgaWYgKHNlZ21lbnRzLmxlbmd0aCAhPT0gMyAmJiBzZWdtZW50cy5sZW5ndGggIT09IDQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQga2V5cyBpZGVudGlmaWVyOiAke21hc3RlcktleVBhdGh9LiBCYWQgbnVtYmVyIG9mIHNlZ21lbnRzOiAke3NlZ21lbnRzLmxlbmd0aH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICgna2V5cycgIT09IHNlZ21lbnRzWzFdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGtleXMgaWRlbnRpZmllcjogJHttYXN0ZXJLZXlQYXRofS4gc2VnbWVudCBbMV0gc2hvdWxkIGJlIFwia2V5c1wiLCBmb3VuZCBcIiR7c2VnbWVudHNbMV19XCJgXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHZhdWx0VXJsID0gYCR7YmFzZVVyaS5wcm90b2NvbH0vLyR7YmFzZVVyaS5ob3N0fWA7XG4gICAgY29uc3QgbmFtZSA9IHNlZ21lbnRzWzJdO1xuICAgIGNvbnN0IHZlcnNpb24gPSBzZWdtZW50cy5sZW5ndGggPT09IDQgPyBzZWdtZW50c1szXSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgdmF1bHRVcmwsXG4gICAgICBuYW1lLFxuICAgICAgdmVyc2lvblxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGF6dXJlS2V5VmF1bHRTaWduZWRIYXNoZWREYXRhKGNyeXB0b0NsaWVudDogQ3J5cHRvZ3JhcGh5Q2xpZW50LCBkYXRhVG9TaWduOiBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGlmICghY3J5cHRvQ2xpZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F6dXJlIEtWUyBDcnlwdG8gQ2xpZW50IGlzIG5vdCBkZWZpbmVkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25lZERhdGEgPSBhd2FpdCBjcnlwdG9DbGllbnQuc2lnbignUlMyNTYnLCBkYXRhVG9TaWduKTtcblxuICAgIHJldHVybiBCdWZmZXIuZnJvbShzaWduZWREYXRhLnJlc3VsdCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGF6dXJlS2V5VmF1bHRXcmFwKGNyeXB0b0NsaWVudDogQ3J5cHRvZ3JhcGh5Q2xpZW50LCBlbmNyeXB0aW9uQWxnb3JpdGhtOiBzdHJpbmcsIGNvbHVtbkVuY3J5cHRpb25LZXk6IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgaWYgKCFjcnlwdG9DbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXp1cmUgS1ZTIENyeXB0byBDbGllbnQgaXMgbm90IGRlZmluZWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFjb2x1bW5FbmNyeXB0aW9uS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbHVtbiBlbmNyeXB0aW9uIGtleSBjYW5ub3QgYmUgbnVsbC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB3cmFwcGVkS2V5ID0gYXdhaXQgY3J5cHRvQ2xpZW50LndyYXBLZXkoZW5jcnlwdGlvbkFsZ29yaXRobSBhcyBLZXlXcmFwQWxnb3JpdGhtLCBjb2x1bW5FbmNyeXB0aW9uS2V5KTtcblxuICAgIHJldHVybiBCdWZmZXIuZnJvbSh3cmFwcGVkS2V5LnJlc3VsdCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGF6dXJlS2V5VmF1bHRVbldyYXAoY3J5cHRvQ2xpZW50OiBDcnlwdG9ncmFwaHlDbGllbnQsIGVuY3J5cHRpb25BbGdvcml0aG06IHN0cmluZywgZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleTogQnVmZmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBpZiAoIWNyeXB0b0NsaWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBenVyZSBLVlMgQ3J5cHRvIENsaWVudCBpcyBub3QgZGVmaW5lZC4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWVuY3J5cHRpb25BbGdvcml0aG0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5jcnlwdGlvbiBBbGdvcml0aG0gY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY3J5cHRlZCBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgY2Fubm90IGJlIG51bGwuJyk7XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY3J5cHRlZCBDb2x1bW4gRW5jcnlwdGlvbiBLZXkgbGVuZ3RoIHNob3VsZCBub3QgYmUgemVyby4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB1bndyYXBwZWRLZXkgPSBhd2FpdCBjcnlwdG9DbGllbnQudW53cmFwS2V5KGVuY3J5cHRpb25BbGdvcml0aG0gYXMgS2V5V3JhcEFsZ29yaXRobSwgZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleSk7XG5cbiAgICByZXR1cm4gQnVmZmVyLmZyb20odW53cmFwcGVkS2V5LnJlc3VsdCk7XG4gIH1cblxuICBwcml2YXRlIGdldEFLVktleVNpemUocmV0cmlldmVkS2V5OiBLZXlWYXVsdEtleSk6IG51bWJlciB7XG4gICAgaWYgKCFyZXRyaWV2ZWRLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmV0cmlldmVkIGtleSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gcmV0cmlldmVkS2V5LmtleTtcblxuICAgIGlmICgha2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEtleSBkb2VzIG5vdCBleGlzdCAke3JldHJpZXZlZEtleS5uYW1lfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGt0eTogc3RyaW5nIHwgdW5kZWZpbmVkID0ga2V5ICYmIGtleS5rdHkgJiYga2V5Lmt0eS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCk7XG5cbiAgICBpZiAoIWt0eSB8fCAnUlNBJy5sb2NhbGVDb21wYXJlKGt0eSwgJ2VuJykgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHVzZSBhIG5vbi1SU0Ega2V5OiAke2t0eX0uYCk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5TGVuZ3RoID0ga2V5ICYmIGtleS5uICYmIGtleS5uLmxlbmd0aDtcblxuICAgIHJldHVybiBrZXlMZW5ndGggfHwgMDtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVFbmNyeXB0aW9uQWxnb3JpdGhtKGVuY3J5cHRpb25BbGdvcml0aG06IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFlbmNyeXB0aW9uQWxnb3JpdGhtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0tleSBlbmNyeXB0aW9uIGFsZ29yaXRobSBjYW5ub3QgYmUgbnVsbC4nKTtcbiAgICB9XG5cbiAgICBpZiAoJ1JTQV9PQUVQJy5sb2NhbGVDb21wYXJlKGVuY3J5cHRpb25BbGdvcml0aG0udG9VcHBlckNhc2UoKSwgJ2VuJykgPT09IDApIHtcbiAgICAgIGVuY3J5cHRpb25BbGdvcml0aG0gPSAnUlNBLU9BRVAnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJzYUVuY3J5cHRpb25BbGdvcml0aG1XaXRoT0FFUEZvckFLVi5sb2NhbGVDb21wYXJlKGVuY3J5cHRpb25BbGdvcml0aG0udHJpbSgpLnRvVXBwZXJDYXNlKCksICdlbicpICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5IGVuY3J5cHRpb24gYWxnb3JpdGhtIHNwZWNpZmllZDogJHtlbmNyeXB0aW9uQWxnb3JpdGhtfS4gRXhwZWN0ZWQgdmFsdWU6ICR7dGhpcy5yc2FFbmNyeXB0aW9uQWxnb3JpdGhtV2l0aE9BRVBGb3JBS1Z9LmApO1xuICAgIH1cblxuICAgIHJldHVybiBlbmNyeXB0aW9uQWxnb3JpdGhtO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUdBLElBQUFBLFNBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLGFBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLElBQUEsR0FBQUgsT0FBQTtBQU5BO0FBQ0E7O0FBYU8sTUFBTUkscUNBQXFDLENBQUM7RUFDakNDLElBQUk7RUFDWkMsR0FBRztFQUNNQyxvQ0FBb0M7RUFDcENDLFlBQVk7RUFDckJDLFdBQVc7RUFDRkMsdUJBQXVCO0VBQ2hDQyxTQUFTO0VBRWpCQyxXQUFXQSxDQUFDQyxRQUFnQixFQUFFQyxTQUFpQixFQUFFQyxRQUFnQixFQUFFO0lBQ2pFLElBQUksQ0FBQ1YsSUFBSSxHQUFHLGlCQUFpQjtJQUM3QixJQUFJLENBQUNLLHVCQUF1QixHQUFHLGlCQUFpQjtJQUNoRCxJQUFJLENBQUNILG9DQUFvQyxHQUFHLFVBQVU7SUFDdEQsSUFBSSxDQUFDQyxZQUFZLEdBQUdRLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsSUFBSSxDQUFDUixXQUFXLEdB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
|
|
247
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaWRlbnRpdHkiLCJyZXF1aXJlIiwiX2tleXZhdWx0S2V5cyIsIl9jcnlwdG8iLCJfdXJsIiwiQ29sdW1uRW5jcnlwdGlvbkF6dXJlS2V5VmF1bHRQcm92aWRlciIsImNvbnN0cnVjdG9yIiwiY2xpZW50SWQiLCJjbGllbnRLZXkiLCJ0ZW5hbnRJZCIsIm5hbWUiLCJhenVyZUtleVZhdWx0RG9tYWluTmFtZSIsInJzYUVuY3J5cHRpb25BbGdvcml0aG1XaXRoT0FFUEZvckFLViIsImZpcnN0VmVyc2lvbiIsIkJ1ZmZlciIsImZyb20iLCJjcmVkZW50aWFscyIsIkNsaWVudFNlY3JldENyZWRlbnRpYWwiLCJkZWNyeXB0Q29sdW1uRW5jcnlwdGlvbktleSIsIm1hc3RlcktleVBhdGgiLCJlbmNyeXB0aW9uQWxnb3JpdGhtIiwiZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleSIsIkVycm9yIiwibGVuZ3RoIiwidmFsaWRhdGVFbmNyeXB0aW9uQWxnb3JpdGhtIiwibWFzdGVyS2V5IiwiZ2V0TWFzdGVyS2V5Iiwia2V5U2l6ZUluQnl0ZXMiLCJnZXRBS1ZLZXlTaXplIiwiY3J5cHRvQ2xpZW50IiwiY3JlYXRlQ3J5cHRvQ2xpZW50IiwidG9TdHJpbmciLCJjdXJyZW50SW5kZXgiLCJrZXlQYXRoTGVuZ3RoIiwicmVhZEludDE2TEUiLCJjaXBoZXJUZXh0TGVuZ3RoIiwic2lnbmF0dXJlTGVuZ3RoIiwiY2lwaGVyVGV4dCIsImFsbG9jIiwiY29weSIsInNpZ25hdHVyZSIsImhhc2giLCJtZXNzYWdlRGlnZXN0IiwiY3JlYXRlSGFzaCIsInVwZGF0ZSIsImRhdGFUb1ZlcmlmeSIsImRpZ2VzdCIsInZlcmlmeUtleSIsInZlcmlmeSIsInJlc3VsdCIsImRlY3J5cHRlZENFSyIsImF6dXJlS2V5VmF1bHRVbldyYXAiLCJlbmNyeXB0Q29sdW1uRW5jcnlwdGlvbktleSIsImNvbHVtbkVuY3J5cHRpb25LZXkiLCJ2ZXJzaW9uIiwibWFzdGVyS2V5UGF0aEJ5dGVzIiwidG9Mb3dlckNhc2UiLCJhenVyZUtleVZhdWx0V3JhcCIsImRhdGFUb0hhc2giLCJkZXN0aW5hdGlvblBvc2l0aW9uIiwiZGF0YVRvU2lnbiIsInNpZ25lZEhhc2giLCJhenVyZUtleVZhdWx0U2lnbmVkSGFzaGVkRGF0YSIsImVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXlMZW5ndGgiLCJrZXlQYXJ0cyIsInBhcnNlUGF0aCIsImNyZWF0ZUtleUNsaWVudCIsInZhdWx0VXJsIiwia2V5Q2xpZW50IiwiZ2V0S2V5Iiwia2V5VmF1bHRVcmwiLCJ1cmwiLCJLZXlDbGllbnQiLCJDcnlwdG9ncmFwaHlDbGllbnQiLCJ0cmltIiwiYmFzZVVyaSIsInBhcnNlIiwiaG9zdG5hbWUiLCJlbmRzV2l0aCIsInNlZ21lbnRzIiwicGF0aG5hbWUiLCJzcGxpdCIsInByb3RvY29sIiwiaG9zdCIsInVuZGVmaW5lZCIsInNpZ25lZERhdGEiLCJzaWduIiwid3JhcHBlZEtleSIsIndyYXBLZXkiLCJ1bndyYXBwZWRLZXkiLCJ1bndyYXBLZXkiLCJyZXRyaWV2ZWRLZXkiLCJrZXkiLCJrdHkiLCJ0b1VwcGVyQ2FzZSIsImxvY2FsZUNvbXBhcmUiLCJrZXlMZW5ndGgiLCJuIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL2tleXN0b3JlLXByb3ZpZGVyLWF6dXJlLWtleS12YXVsdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgQ2xpZW50U2VjcmV0Q3JlZGVudGlhbCB9IGZyb20gJ0BhenVyZS9pZGVudGl0eSc7XG5pbXBvcnQgeyBDcnlwdG9ncmFwaHlDbGllbnQsIHR5cGUgS2V5V3JhcEFsZ29yaXRobSwgS2V5Q2xpZW50LCB0eXBlIEtleVZhdWx0S2V5IH0gZnJvbSAnQGF6dXJlL2tleXZhdWx0LWtleXMnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ3VybCc7XG5cbmludGVyZmFjZSBQYXJzZWRLZXlQYXRoIHtcbiAgdmF1bHRVcmw6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgQ29sdW1uRW5jcnlwdGlvbkF6dXJlS2V5VmF1bHRQcm92aWRlciB7XG4gIGRlY2xhcmUgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgZGVjbGFyZSBwcml2YXRlIHVybDogdW5kZWZpbmVkIHwgc3RyaW5nO1xuICBkZWNsYXJlIHByaXZhdGUgcmVhZG9ubHkgcnNhRW5jcnlwdGlvbkFsZ29yaXRobVdpdGhPQUVQRm9yQUtWOiBzdHJpbmc7XG4gIGRlY2xhcmUgcHJpdmF0ZSByZWFkb25seSBmaXJzdFZlcnNpb246IEJ1ZmZlcjtcbiAgZGVjbGFyZSBwcml2YXRlIGNyZWRlbnRpYWxzOiBDbGllbnRTZWNyZXRDcmVkZW50aWFsO1xuICBkZWNsYXJlIHByaXZhdGUgcmVhZG9ubHkgYXp1cmVLZXlWYXVsdERvbWFpbk5hbWU6IHN0cmluZztcbiAgZGVjbGFyZSBwcml2YXRlIGtleUNsaWVudDogdW5kZWZpbmVkIHwgS2V5Q2xpZW50O1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudElkOiBzdHJpbmcsIGNsaWVudEtleTogc3RyaW5nLCB0ZW5hbnRJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gJ0FaVVJFX0tFWV9WQVVMVCc7XG4gICAgdGhpcy5henVyZUtleVZhdWx0RG9tYWluTmFtZSA9ICd2YXVsdC5henVyZS5uZXQnO1xuICAgIHRoaXMucnNhRW5jcnlwdGlvbkFsZ29yaXRobVdpdGhPQUVQRm9yQUtWID0gJ1JTQS1PQUVQJztcbiAgICB0aGlzLmZpcnN0VmVyc2lvbiA9IEJ1ZmZlci5mcm9tKFsweDAxXSk7XG4gICAgdGhpcy5jcmVkZW50aWFscyA9IG5ldyBDbGllbnRTZWNyZXRDcmVkZW50aWFsKHRlbmFudElkLCBjbGllbnRJZCwgY2xpZW50S2V5KTtcbiAgfVxuXG4gIGFzeW5jIGRlY3J5cHRDb2x1bW5FbmNyeXB0aW9uS2V5KG1hc3RlcktleVBhdGg6IHN0cmluZywgZW5jcnlwdGlvbkFsZ29yaXRobTogc3RyaW5nLCBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5OiBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGlmICghZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnRlcm5hbCBlcnJvci4gRW5jcnlwdGVkIGNvbHVtbiBlbmNyeXB0aW9uIGtleSBjYW5ub3QgYmUgbnVsbC4nKTtcbiAgICB9XG5cbiAgICBpZiAoZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW50ZXJuYWwgZXJyb3IuIEVtcHR5IGVuY3J5cHRlZCBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgc3BlY2lmaWVkLicpO1xuICAgIH1cblxuICAgIGVuY3J5cHRpb25BbGdvcml0aG0gPSB0aGlzLnZhbGlkYXRlRW5jcnlwdGlvbkFsZ29yaXRobShlbmNyeXB0aW9uQWxnb3JpdGhtKTtcblxuICAgIGNvbnN0IG1hc3RlcktleSA9IGF3YWl0IHRoaXMuZ2V0TWFzdGVyS2V5KG1hc3RlcktleVBhdGgpO1xuXG4gICAgY29uc3Qga2V5U2l6ZUluQnl0ZXMgPSB0aGlzLmdldEFLVktleVNpemUobWFzdGVyS2V5KTtcblxuICAgIGNvbnN0IGNyeXB0b0NsaWVudCA9IHRoaXMuY3JlYXRlQ3J5cHRvQ2xpZW50KG1hc3RlcktleSk7XG5cbiAgICBpZiAoZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleVswXSAhPT0gdGhpcy5maXJzdFZlcnNpb25bMF0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3BlY2lmaWVkIGVuY3J5cHRlZCBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgY29udGFpbnMgYW4gaW52YWxpZCBlbmNyeXB0aW9uIGFsZ29yaXRobSB2ZXJzaW9uICR7QnVmZmVyLmZyb20oW2VuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXlbMF1dKS50b1N0cmluZygnaGV4Jyl9LiBFeHBlY3RlZCB2ZXJzaW9uIGlzICR7QnVmZmVyLmZyb20oW3RoaXMuZmlyc3RWZXJzaW9uWzBdXSkudG9TdHJpbmcoJ2hleCcpfS5gKTtcbiAgICB9XG5cbiAgICBsZXQgY3VycmVudEluZGV4ID0gdGhpcy5maXJzdFZlcnNpb24ubGVuZ3RoO1xuICAgIGNvbnN0IGtleVBhdGhMZW5ndGg6IG51bWJlciA9IGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkucmVhZEludDE2TEUoY3VycmVudEluZGV4KTtcblxuICAgIGN1cnJlbnRJbmRleCArPSAyO1xuXG4gICAgY29uc3QgY2lwaGVyVGV4dExlbmd0aDogbnVtYmVyID0gZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleS5yZWFkSW50MTZMRShjdXJyZW50SW5kZXgpO1xuXG4gICAgY3VycmVudEluZGV4ICs9IDI7XG5cbiAgICBjdXJyZW50SW5kZXggKz0ga2V5UGF0aExlbmd0aDtcblxuICAgIGlmIChjaXBoZXJUZXh0TGVuZ3RoICE9PSBrZXlTaXplSW5CeXRlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc3BlY2lmaWVkIGVuY3J5cHRlZCBjb2x1bW4gZW5jcnlwdGlvbiBrZXkncyBjaXBoZXJ0ZXh0IGxlbmd0aDogJHtjaXBoZXJUZXh0TGVuZ3RofSBkb2VzIG5vdCBtYXRjaCB0aGUgY2lwaGVydGV4dCBsZW5ndGg6ICR7a2V5U2l6ZUluQnl0ZXN9IHdoZW4gdXNpbmcgY29sdW1uIG1hc3RlciBrZXkgKEF6dXJlIEtleSBWYXVsdCBrZXkpIGluICR7bWFzdGVyS2V5UGF0aH0uIFRoZSBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5IG1heSBiZSBjb3JydXB0LCBvciB0aGUgc3BlY2lmaWVkIEF6dXJlIEtleSBWYXVsdCBrZXkgcGF0aCBtYXkgYmUgaW5jb3JyZWN0LmApO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25hdHVyZUxlbmd0aDogbnVtYmVyID0gZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleS5sZW5ndGggLSBjdXJyZW50SW5kZXggLSBjaXBoZXJUZXh0TGVuZ3RoO1xuXG4gICAgaWYgKHNpZ25hdHVyZUxlbmd0aCAhPT0ga2V5U2l6ZUluQnl0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHNwZWNpZmllZCBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5J3Mgc2lnbmF0dXJlIGxlbmd0aDogJHtzaWduYXR1cmVMZW5ndGh9IGRvZXMgbm90IG1hdGNoIHRoZSBzaWduYXR1cmUgbGVuZ3RoOiAke2tleVNpemVJbkJ5dGVzfSB3aGVuIHVzaW5nIGNvbHVtbiBtYXN0ZXIga2V5IChBenVyZSBLZXkgVmF1bHQga2V5KSBpbiAke21hc3RlcktleVBhdGh9LiBUaGUgZW5jcnlwdGVkIGNvbHVtbiBlbmNyeXB0aW9uIGtleSBtYXkgYmUgY29ycnVwdCwgb3IgdGhlIHNwZWNpZmllZCBBenVyZSBLZXkgVmF1bHQga2V5IHBhdGggbWF5IGJlIGluY29ycmVjdC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBjaXBoZXJUZXh0ID0gQnVmZmVyLmFsbG9jKGNpcGhlclRleHRMZW5ndGgpO1xuICAgIGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkuY29weShjaXBoZXJUZXh0LCAwLCBjdXJyZW50SW5kZXgsIGN1cnJlbnRJbmRleCArIGNpcGhlclRleHRMZW5ndGgpO1xuICAgIGN1cnJlbnRJbmRleCArPSBjaXBoZXJUZXh0TGVuZ3RoO1xuXG4gICAgY29uc3Qgc2lnbmF0dXJlID0gQnVmZmVyLmFsbG9jKHNpZ25hdHVyZUxlbmd0aCk7XG4gICAgZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleS5jb3B5KHNpZ25hdHVyZSwgMCwgY3VycmVudEluZGV4LCBjdXJyZW50SW5kZXggKyBzaWduYXR1cmVMZW5ndGgpO1xuXG4gICAgY29uc3QgaGFzaCA9IEJ1ZmZlci5hbGxvYyhlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5Lmxlbmd0aCAtIHNpZ25hdHVyZS5sZW5ndGgpO1xuICAgIGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkuY29weShoYXNoLCAwLCAwLCBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5Lmxlbmd0aCAtIHNpZ25hdHVyZS5sZW5ndGgpO1xuXG4gICAgY29uc3QgbWVzc2FnZURpZ2VzdCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuICAgIG1lc3NhZ2VEaWdlc3QudXBkYXRlKGhhc2gpO1xuXG4gICAgY29uc3QgZGF0YVRvVmVyaWZ5OiBCdWZmZXIgPSBtZXNzYWdlRGlnZXN0LmRpZ2VzdCgpO1xuXG4gICAgaWYgKCFkYXRhVG9WZXJpZnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSGFzaCBzaG91bGQgbm90IGJlIG51bGwgd2hpbGUgZGVjcnlwdGluZyBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5LicpO1xuICAgIH1cblxuICAgIGNvbnN0IHZlcmlmeUtleSA9IGF3YWl0IGNyeXB0b0NsaWVudC52ZXJpZnkoJ1JTMjU2JywgZGF0YVRvVmVyaWZ5LCBzaWduYXR1cmUpO1xuICAgIGlmICghdmVyaWZ5S2V5LnJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc3BlY2lmaWVkIGVuY3J5cHRlZCBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoIHRoZSBzaWduYXR1cmUgY29tcHV0ZWQgd2l0aCB0aGUgY29sdW1uIG1hc3RlciBrZXkgKEFzeW1tZXRyaWMga2V5IGluIEF6dXJlIEtleSBWYXVsdCkgaW4gJHttYXN0ZXJLZXlQYXRofS4gVGhlIGVuY3J5cHRlZCBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgbWF5IGJlIGNvcnJ1cHQsIG9yIHRoZSBzcGVjaWZpZWQgcGF0aCBtYXkgYmUgaW5jb3JyZWN0LmApO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY3J5cHRlZENFSzogQnVmZmVyID0gYXdhaXQgdGhpcy5henVyZUtleVZhdWx0VW5XcmFwKGNyeXB0b0NsaWVudCwgZW5jcnlwdGlvbkFsZ29yaXRobSwgY2lwaGVyVGV4dCk7XG5cbiAgICByZXR1cm4gZGVjcnlwdGVkQ0VLO1xuICB9XG5cbiAgYXN5bmMgZW5jcnlwdENvbHVtbkVuY3J5cHRpb25LZXkobWFzdGVyS2V5UGF0aDogc3RyaW5nLCBlbmNyeXB0aW9uQWxnb3JpdGhtOiBzdHJpbmcsIGNvbHVtbkVuY3J5cHRpb25LZXk6IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgaWYgKCFjb2x1bW5FbmNyeXB0aW9uS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbHVtbiBlbmNyeXB0aW9uIGtleSBjYW5ub3QgYmUgbnVsbC4nKTtcbiAgICB9XG5cbiAgICBpZiAoY29sdW1uRW5jcnlwdGlvbktleS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW1wdHkgY29sdW1uIGVuY3J5cHRpb24ga2V5IHNwZWNpZmllZC4nKTtcbiAgICB9XG5cbiAgICBlbmNyeXB0aW9uQWxnb3JpdGhtID0gdGhpcy52YWxpZGF0ZUVuY3J5cHRpb25BbGdvcml0aG0oZW5jcnlwdGlvbkFsZ29yaXRobSk7XG5cbiAgICBjb25zdCBtYXN0ZXJLZXkgPSBhd2FpdCB0aGlzLmdldE1hc3RlcktleShtYXN0ZXJLZXlQYXRoKTtcblxuICAgIGNvbnN0IGtleVNpemVJbkJ5dGVzID0gdGhpcy5nZXRBS1ZLZXlTaXplKG1hc3RlcktleSk7XG5cbiAgICBjb25zdCBjcnlwdG9DbGllbnQgPSB0aGlzLmNyZWF0ZUNyeXB0b0NsaWVudChtYXN0ZXJLZXkpO1xuXG4gICAgY29uc3QgdmVyc2lvbiA9IEJ1ZmZlci5mcm9tKFt0aGlzLmZpcnN0VmVyc2lvblswXV0pO1xuXG4gICAgY29uc3QgbWFzdGVyS2V5UGF0aEJ5dGVzOiBCdWZmZXIgPSBCdWZmZXIuZnJvbShtYXN0ZXJLZXlQYXRoLnRvTG93ZXJDYXNlKCksICd1dGY4Jyk7XG5cbiAgICBjb25zdCBrZXlQYXRoTGVuZ3RoOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoMik7XG5cbiAgICBrZXlQYXRoTGVuZ3RoWzBdID0gbWFzdGVyS2V5UGF0aEJ5dGVzLmxlbmd0aCAmIDB4ZmY7XG4gICAga2V5UGF0aExlbmd0aFsxXSA9IG1hc3RlcktleVBhdGhCeXRlcy5sZW5ndGggPj4gOCAmIDB4ZmY7XG5cbiAgICBjb25zdCBjaXBoZXJUZXh0OiBCdWZmZXIgPSBhd2FpdCB0aGlzLmF6dXJlS2V5VmF1bHRXcmFwKGNyeXB0b0NsaWVudCwgZW5jcnlwdGlvbkFsZ29yaXRobSwgY29sdW1uRW5jcnlwdGlvbktleSk7XG5cbiAgICBjb25zdCBjaXBoZXJUZXh0TGVuZ3RoOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoMik7XG5cbiAgICBjaXBoZXJUZXh0TGVuZ3RoWzBdID0gY2lwaGVyVGV4dC5sZW5ndGggJiAweGZmO1xuICAgIGNpcGhlclRleHRMZW5ndGhbMV0gPSBjaXBoZXJUZXh0Lmxlbmd0aCA+PiA4ICYgMHhmZjtcblxuICAgIGlmIChjaXBoZXJUZXh0Lmxlbmd0aCAhPT0ga2V5U2l6ZUluQnl0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2lwaGVyVGV4dCBsZW5ndGggZG9lcyBub3QgbWF0Y2ggdGhlIFJTQSBrZXkgc2l6ZS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhVG9IYXNoOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2ModmVyc2lvbi5sZW5ndGggKyBrZXlQYXRoTGVuZ3RoLmxlbmd0aCArIGNpcGhlclRleHRMZW5ndGgubGVuZ3RoICsgbWFzdGVyS2V5UGF0aEJ5dGVzLmxlbmd0aCArIGNpcGhlclRleHQubGVuZ3RoKTtcbiAgICBsZXQgZGVzdGluYXRpb25Qb3NpdGlvbjogbnVtYmVyID0gdmVyc2lvbi5sZW5ndGg7XG4gICAgdmVyc2lvbi5jb3B5KGRhdGFUb0hhc2gsIDAsIDAsIHZlcnNpb24ubGVuZ3RoKTtcblxuICAgIGtleVBhdGhMZW5ndGguY29weShkYXRhVG9IYXNoLCBkZXN0aW5hdGlvblBvc2l0aW9uLCAwLCBrZXlQYXRoTGVuZ3RoLmxlbmd0aCk7XG4gICAgZGVzdGluYXRpb25Qb3NpdGlvbiArPSBrZXlQYXRoTGVuZ3RoLmxlbmd0aDtcblxuICAgIGNpcGhlclRleHRMZW5ndGguY29weShkYXRhVG9IYXNoLCBkZXN0aW5hdGlvblBvc2l0aW9uLCAwLCBjaXBoZXJUZXh0TGVuZ3RoLmxlbmd0aCk7XG4gICAgZGVzdGluYXRpb25Qb3NpdGlvbiArPSBjaXBoZXJUZXh0TGVuZ3RoLmxlbmd0aDtcblxuICAgIG1hc3RlcktleVBhdGhCeXRlcy5jb3B5KGRhdGFUb0hhc2gsIGRlc3RpbmF0aW9uUG9zaXRpb24sIDAsIG1hc3RlcktleVBhdGhCeXRlcy5sZW5ndGgpO1xuICAgIGRlc3RpbmF0aW9uUG9zaXRpb24gKz0gbWFzdGVyS2V5UGF0aEJ5dGVzLmxlbmd0aDtcblxuICAgIGNpcGhlclRleHQuY29weShkYXRhVG9IYXNoLCBkZXN0aW5hdGlvblBvc2l0aW9uLCAwLCBjaXBoZXJUZXh0Lmxlbmd0aCk7XG5cbiAgICBjb25zdCBtZXNzYWdlRGlnZXN0ID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG5cbiAgICBtZXNzYWdlRGlnZXN0LnVwZGF0ZShkYXRhVG9IYXNoKTtcblxuICAgIGNvbnN0IGRhdGFUb1NpZ246IEJ1ZmZlciA9IG1lc3NhZ2VEaWdlc3QuZGlnZXN0KCk7XG5cbiAgICBjb25zdCBzaWduZWRIYXNoOiBCdWZmZXIgPSBhd2FpdCB0aGlzLmF6dXJlS2V5VmF1bHRTaWduZWRIYXNoZWREYXRhKGNyeXB0b0NsaWVudCwgZGF0YVRvU2lnbik7XG4gICAgaWYgKHNpZ25lZEhhc2gubGVuZ3RoICE9PSBrZXlTaXplSW5CeXRlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaWduZWQgaGFzaCBsZW5ndGggZG9lcyBub3QgbWF0Y2ggdGhlIFJTQSBrZXkgc2l6ZS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB2ZXJpZnlLZXkgPSBhd2FpdCBjcnlwdG9DbGllbnQudmVyaWZ5KCdSUzI1NicsIGRhdGFUb1NpZ24sIHNpZ25lZEhhc2gpO1xuXG4gICAgaWYgKCF2ZXJpZnlLZXkucmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2lnbmF0dXJlIG9mIHRoZSBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5IGNvbXB1dGVkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXlMZW5ndGg6IG51bWJlciA9IHZlcnNpb24ubGVuZ3RoICsgY2lwaGVyVGV4dExlbmd0aC5sZW5ndGggKyBrZXlQYXRoTGVuZ3RoLmxlbmd0aCArIGNpcGhlclRleHQubGVuZ3RoICsgbWFzdGVyS2V5UGF0aEJ5dGVzLmxlbmd0aCArIHNpZ25lZEhhc2gubGVuZ3RoO1xuICAgIGNvbnN0IGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXk6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5TGVuZ3RoKTtcblxuICAgIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICAgIHZlcnNpb24uY29weShlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5LCBjdXJyZW50SW5kZXgsIDAsIHZlcnNpb24ubGVuZ3RoKTtcbiAgICBjdXJyZW50SW5kZXggKz0gdmVyc2lvbi5sZW5ndGg7XG5cbiAgICBrZXlQYXRoTGVuZ3RoLmNvcHkoZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleSwgY3VycmVudEluZGV4LCAwLCBrZXlQYXRoTGVuZ3RoLmxlbmd0aCk7XG4gICAgY3VycmVudEluZGV4ICs9IGtleVBhdGhMZW5ndGgubGVuZ3RoO1xuXG4gICAgY2lwaGVyVGV4dExlbmd0aC5jb3B5KGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXksIGN1cnJlbnRJbmRleCwgMCwgY2lwaGVyVGV4dExlbmd0aC5sZW5ndGgpO1xuICAgIGN1cnJlbnRJbmRleCArPSBjaXBoZXJUZXh0TGVuZ3RoLmxlbmd0aDtcblxuICAgIG1hc3RlcktleVBhdGhCeXRlcy5jb3B5KGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXksIGN1cnJlbnRJbmRleCwgMCwgbWFzdGVyS2V5UGF0aEJ5dGVzLmxlbmd0aCk7XG4gICAgY3VycmVudEluZGV4ICs9IG1hc3RlcktleVBhdGhCeXRlcy5sZW5ndGg7XG5cbiAgICBjaXBoZXJUZXh0LmNvcHkoZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleSwgY3VycmVudEluZGV4LCAwLCBjaXBoZXJUZXh0Lmxlbmd0aCk7XG4gICAgY3VycmVudEluZGV4ICs9IGNpcGhlclRleHQubGVuZ3RoO1xuXG4gICAgc2lnbmVkSGFzaC5jb3B5KGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXksIGN1cnJlbnRJbmRleCwgMCwgc2lnbmVkSGFzaC5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldE1hc3RlcktleShtYXN0ZXJLZXlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEtleVZhdWx0S2V5PiB7XG4gICAgaWYgKCFtYXN0ZXJLZXlQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hc3RlciBrZXkgcGF0aCBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG4gICAgY29uc3Qga2V5UGFydHMgPSB0aGlzLnBhcnNlUGF0aChtYXN0ZXJLZXlQYXRoKTtcblxuICAgIHRoaXMuY3JlYXRlS2V5Q2xpZW50KGtleVBhcnRzLnZhdWx0VXJsKTtcblxuICAgIHJldHVybiBhd2FpdCAodGhpcy5rZXlDbGllbnQgYXMgS2V5Q2xpZW50KS5nZXRLZXkoa2V5UGFydHMubmFtZSwga2V5UGFydHMudmVyc2lvbiA/IHsgdmVyc2lvbjoga2V5UGFydHMudmVyc2lvbiB9IDoge30pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVLZXlDbGllbnQoa2V5VmF1bHRVcmw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICgha2V5VmF1bHRVcmwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBrZXkgY2xpZW50IHdpdGggbnVsbCBvciB1bmRlZmluZWQga2V5VmF1bHRVcmwnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmtleUNsaWVudCkge1xuICAgICAgdGhpcy51cmwgPSBrZXlWYXVsdFVybDtcbiAgICAgIHRoaXMua2V5Q2xpZW50ID0gbmV3IEtleUNsaWVudChrZXlWYXVsdFVybCwgdGhpcy5jcmVkZW50aWFscyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDcnlwdG9DbGllbnQobWFzdGVyS2V5OiBLZXlWYXVsdEtleSk6IENyeXB0b2dyYXBoeUNsaWVudCB7XG4gICAgaWYgKCFtYXN0ZXJLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBDcnlwdG9ncmFwaHlDbGllbnQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCBtYXN0ZXJLZXknKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBDcnlwdG9ncmFwaHlDbGllbnQobWFzdGVyS2V5LCB0aGlzLmNyZWRlbnRpYWxzKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VQYXRoKG1hc3RlcktleVBhdGg6IHN0cmluZyk6IFBhcnNlZEtleVBhdGgge1xuICAgIGlmICghbWFzdGVyS2V5UGF0aCB8fCBtYXN0ZXJLZXlQYXRoLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXp1cmUgS2V5IFZhdWx0IGtleSBwYXRoIGNhbm5vdCBiZSBudWxsLicpO1xuICAgIH1cblxuICAgIGxldCBiYXNlVXJpO1xuICAgIHRyeSB7XG4gICAgICBiYXNlVXJpID0gcGFyc2UobWFzdGVyS2V5UGF0aCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5cyBpZGVudGlmaWVyOiAke21hc3RlcktleVBhdGh9LiBOb3QgYSB2YWxpZCBVUklgKTtcbiAgICB9XG5cbiAgICBpZiAoIWJhc2VVcmkuaG9zdG5hbWUgfHwgIWJhc2VVcmkuaG9zdG5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCh0aGlzLmF6dXJlS2V5VmF1bHREb21haW5OYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEF6dXJlIEtleSBWYXVsdCBrZXkgcGF0aCBzcGVjaWZpZWQ6ICR7bWFzdGVyS2V5UGF0aH0uYCk7XG4gICAgfVxuXG4gICAgLy8gUGF0aCBpcyBvZiB0aGUgZm9ybSAnL2NvbGxlY3Rpb24vbmFtZVsvdmVyc2lvbl0nXG4gICAgY29uc3Qgc2VnbWVudHMgPSAoYmFzZVVyaS5wYXRobmFtZSB8fCAnJykuc3BsaXQoJy8nKTtcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoICE9PSAzICYmIHNlZ21lbnRzLmxlbmd0aCAhPT0gNCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBrZXlzIGlkZW50aWZpZXI6ICR7bWFzdGVyS2V5UGF0aH0uIEJhZCBudW1iZXIgb2Ygc2VnbWVudHM6ICR7c2VnbWVudHMubGVuZ3RofWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCdrZXlzJyAhPT0gc2VnbWVudHNbMV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQga2V5cyBpZGVudGlmaWVyOiAke21hc3RlcktleVBhdGh9LiBzZWdtZW50IFsxXSBzaG91bGQgYmUgXCJrZXlzXCIsIGZvdW5kIFwiJHtzZWdtZW50c1sxXX1cImBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdmF1bHRVcmwgPSBgJHtiYXNlVXJpLnByb3RvY29sfS8vJHtiYXNlVXJpLmhvc3R9YDtcbiAgICBjb25zdCBuYW1lID0gc2VnbWVudHNbMl07XG4gICAgY29uc3QgdmVyc2lvbiA9IHNlZ21lbnRzLmxlbmd0aCA9PT0gNCA/IHNlZ21lbnRzWzNdIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICB2YXVsdFVybCxcbiAgICAgIG5hbWUsXG4gICAgICB2ZXJzaW9uXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXp1cmVLZXlWYXVsdFNpZ25lZEhhc2hlZERhdGEoY3J5cHRvQ2xpZW50OiBDcnlwdG9ncmFwaHlDbGllbnQsIGRhdGFUb1NpZ246IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgaWYgKCFjcnlwdG9DbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXp1cmUgS1ZTIENyeXB0byBDbGllbnQgaXMgbm90IGRlZmluZWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnbmVkRGF0YSA9IGF3YWl0IGNyeXB0b0NsaWVudC5zaWduKCdSUzI1NicsIGRhdGFUb1NpZ24pO1xuXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHNpZ25lZERhdGEucmVzdWx0KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXp1cmVLZXlWYXVsdFdyYXAoY3J5cHRvQ2xpZW50OiBDcnlwdG9ncmFwaHlDbGllbnQsIGVuY3J5cHRpb25BbGdvcml0aG06IHN0cmluZywgY29sdW1uRW5jcnlwdGlvbktleTogQnVmZmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBpZiAoIWNyeXB0b0NsaWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBenVyZSBLVlMgQ3J5cHRvIENsaWVudCBpcyBub3QgZGVmaW5lZC4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbHVtbkVuY3J5cHRpb25LZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29sdW1uIGVuY3J5cHRpb24ga2V5IGNhbm5vdCBiZSBudWxsLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHdyYXBwZWRLZXkgPSBhd2FpdCBjcnlwdG9DbGllbnQud3JhcEtleShlbmNyeXB0aW9uQWxnb3JpdGhtIGFzIEtleVdyYXBBbGdvcml0aG0sIGNvbHVtbkVuY3J5cHRpb25LZXkpO1xuXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHdyYXBwZWRLZXkucmVzdWx0KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXp1cmVLZXlWYXVsdFVuV3JhcChjcnlwdG9DbGllbnQ6IENyeXB0b2dyYXBoeUNsaWVudCwgZW5jcnlwdGlvbkFsZ29yaXRobTogc3RyaW5nLCBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5OiBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGlmICghY3J5cHRvQ2xpZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F6dXJlIEtWUyBDcnlwdG8gQ2xpZW50IGlzIG5vdCBkZWZpbmVkLicpO1xuICAgIH1cblxuICAgIGlmICghZW5jcnlwdGlvbkFsZ29yaXRobSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNyeXB0aW9uIEFsZ29yaXRobSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5jcnlwdGVkIGNvbHVtbiBlbmNyeXB0aW9uIGtleSBjYW5ub3QgYmUgbnVsbC4nKTtcbiAgICB9XG5cbiAgICBpZiAoZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5jcnlwdGVkIENvbHVtbiBFbmNyeXB0aW9uIEtleSBsZW5ndGggc2hvdWxkIG5vdCBiZSB6ZXJvLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHVud3JhcHBlZEtleSA9IGF3YWl0IGNyeXB0b0NsaWVudC51bndyYXBLZXkoZW5jcnlwdGlvbkFsZ29yaXRobSBhcyBLZXlXcmFwQWxnb3JpdGhtLCBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5KTtcblxuICAgIHJldHVybiBCdWZmZXIuZnJvbSh1bndyYXBwZWRLZXkucmVzdWx0KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QUtWS2V5U2l6ZShyZXRyaWV2ZWRLZXk6IEtleVZhdWx0S2V5KTogbnVtYmVyIHtcbiAgICBpZiAoIXJldHJpZXZlZEtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXRyaWV2ZWQga2V5IGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSByZXRyaWV2ZWRLZXkua2V5O1xuXG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgS2V5IGRvZXMgbm90IGV4aXN0ICR7cmV0cmlldmVkS2V5Lm5hbWV9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qga3R5OiBzdHJpbmcgfCB1bmRlZmluZWQgPSBrZXkgJiYga2V5Lmt0eSAmJiBrZXkua3R5LnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKTtcblxuICAgIGlmICgha3R5IHx8ICdSU0EnLmxvY2FsZUNvbXBhcmUoa3R5LCAnZW4nKSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdXNlIGEgbm9uLVJTQSBrZXk6ICR7a3R5fS5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlMZW5ndGggPSBrZXkgJiYga2V5Lm4gJiYga2V5Lm4ubGVuZ3RoO1xuXG4gICAgcmV0dXJuIGtleUxlbmd0aCB8fCAwO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUVuY3J5cHRpb25BbGdvcml0aG0oZW5jcnlwdGlvbkFsZ29yaXRobTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWVuY3J5cHRpb25BbGdvcml0aG0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignS2V5IGVuY3J5cHRpb24gYWxnb3JpdGhtIGNhbm5vdCBiZSBudWxsLicpO1xuICAgIH1cblxuICAgIGlmICgnUlNBX09BRVAnLmxvY2FsZUNvbXBhcmUoZW5jcnlwdGlvbkFsZ29yaXRobS50b1VwcGVyQ2FzZSgpLCAnZW4nKSA9PT0gMCkge1xuICAgICAgZW5jcnlwdGlvbkFsZ29yaXRobSA9ICdSU0EtT0FFUCc7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucnNhRW5jcnlwdGlvbkFsZ29yaXRobVdpdGhPQUVQRm9yQUtWLmxvY2FsZUNvbXBhcmUoZW5jcnlwdGlvbkFsZ29yaXRobS50cmltKCkudG9VcHBlckNhc2UoKSwgJ2VuJykgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXkgZW5jcnlwdGlvbiBhbGdvcml0aG0gc3BlY2lmaWVkOiAke2VuY3J5cHRpb25BbGdvcml0aG19LiBFeHBlY3RlZCB2YWx1ZTogJHt0aGlzLnJzYUVuY3J5cHRpb25BbGdvcml0aG1XaXRoT0FFUEZvckFLVn0uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuY3J5cHRpb25BbGdvcml0aG07XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBR0EsSUFBQUEsU0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsYUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsSUFBQSxHQUFBSCxPQUFBO0FBTkE7QUFDQTs7QUFhTyxNQUFNSSxxQ0FBcUMsQ0FBQztFQVNqREMsV0FBV0EsQ0FBQ0MsUUFBZ0IsRUFBRUMsU0FBaUIsRUFBRUMsUUFBZ0IsRUFBRTtJQUNqRSxJQUFJLENBQUNDLElBQUksR0FBRyxpQkFBaUI7SUFDN0IsSUFBSSxDQUFDQyx1QkFBdUIsR0FBRyxpQkFBaUI7SUFDaEQsSUFBSSxDQUFDQyxvQ0FBb0MsR0FBRyxVQUFVO0lBQ3RELElBQUksQ0FBQ0MsWUFBWSxHQUFHQyxNQUFNLENBQUNDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLElBQUksQ0FBQ0MsV0FBVyxHQUFHLElBQUlDLGdDQUFzQixDQUFDUixRQUFRLEVB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
|