@bitgo/sdk-core 37.4.1 → 37.6.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.
Files changed (87) hide show
  1. package/dist/src/account-lib/baseCoin/enum.d.ts +2 -1
  2. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
  3. package/dist/src/account-lib/baseCoin/enum.js +3 -1
  4. package/dist/src/api/types.d.ts +1 -0
  5. package/dist/src/api/types.d.ts.map +1 -1
  6. package/dist/src/api/types.js +1 -1
  7. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +2 -0
  8. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  9. package/dist/src/bitgo/baseCoin/baseCoin.js +19 -3
  10. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +1 -0
  11. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  12. package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
  13. package/dist/src/bitgo/defi/defiVault.d.ts +79 -0
  14. package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -0
  15. package/dist/src/bitgo/defi/defiVault.js +198 -0
  16. package/dist/src/bitgo/defi/iDefiVault.d.ts +59 -0
  17. package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -0
  18. package/dist/src/bitgo/defi/iDefiVault.js +6 -0
  19. package/dist/src/bitgo/defi/index.d.ts +3 -0
  20. package/dist/src/bitgo/defi/index.d.ts.map +1 -0
  21. package/dist/src/bitgo/defi/index.js +22 -0
  22. package/dist/src/bitgo/index.d.ts +1 -0
  23. package/dist/src/bitgo/index.d.ts.map +1 -1
  24. package/dist/src/bitgo/index.js +2 -1
  25. package/dist/src/bitgo/internal/keycard.d.ts +2 -1
  26. package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
  27. package/dist/src/bitgo/internal/keycard.js +6 -3
  28. package/dist/src/bitgo/keychain/iKeychains.d.ts +2 -1
  29. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  30. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  31. package/dist/src/bitgo/keychain/keychains.d.ts +2 -1
  32. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  33. package/dist/src/bitgo/keychain/keychains.js +9 -4
  34. package/dist/src/bitgo/trading/tradingAccount.js +2 -2
  35. package/dist/src/bitgo/tss/common.d.ts +2 -1
  36. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  37. package/dist/src/bitgo/tss/common.js +14 -4
  38. package/dist/src/bitgo/utils/messageTypes.d.ts +3 -1
  39. package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -1
  40. package/dist/src/bitgo/utils/messageTypes.js +3 -1
  41. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  42. package/dist/src/bitgo/utils/mpcUtils.js +16 -1
  43. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +25 -3
  44. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  45. package/dist/src/bitgo/utils/tss/baseTypes.js +1 -1
  46. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +3 -0
  47. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  48. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +8 -1
  49. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +1 -1
  50. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
  51. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +14 -8
  52. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +2 -2
  53. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  54. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +14 -6
  55. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +3 -1
  56. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
  57. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +23 -28
  58. package/dist/src/bitgo/wallet/iWallet.d.ts +11 -2
  59. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  60. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  61. package/dist/src/bitgo/wallet/iWallets.d.ts +3 -0
  62. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  63. package/dist/src/bitgo/wallet/iWallets.js +1 -1
  64. package/dist/src/bitgo/wallet/wallet.d.ts +9 -3
  65. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  66. package/dist/src/bitgo/wallet/wallet.js +47 -7
  67. package/dist/src/bitgo/wallet/wallets.d.ts +2 -1
  68. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  69. package/dist/src/bitgo/wallet/wallets.js +26 -16
  70. package/dist/src/coins/ofc.d.ts +4 -0
  71. package/dist/src/coins/ofc.d.ts.map +1 -1
  72. package/dist/src/coins/ofc.js +17 -2
  73. package/dist/test/unit/bitgo/defi/defiVault.d.ts +2 -0
  74. package/dist/test/unit/bitgo/defi/defiVault.d.ts.map +1 -0
  75. package/dist/test/unit/bitgo/defi/defiVault.js +292 -0
  76. package/dist/test/unit/bitgo/trading/tradingAccount.js +6 -6
  77. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +14 -6
  78. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts +2 -0
  79. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts.map +1 -0
  80. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.js +94 -0
  81. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +50 -1
  82. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +77 -21
  83. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts +2 -0
  84. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts.map +1 -0
  85. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +228 -0
  86. package/dist/tsconfig.tsbuildinfo +1 -1
  87. package/package.json +3 -3
@@ -0,0 +1,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=walletsEncryptionVersion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walletsEncryptionVersion.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/wallet/walletsEncryptionVersion.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,228 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const assert = __importStar(require("assert"));
37
+ const sinon = __importStar(require("sinon"));
38
+ require("should");
39
+ const wallets_1 = require("../../../../src/bitgo/wallet/wallets");
40
+ const wallet_1 = require("../../../../src/bitgo/wallet/wallet");
41
+ describe('Wallets - encryptionVersion threading', function () {
42
+ let wallets;
43
+ let mockBitGo;
44
+ let mockBaseCoin;
45
+ let mockKeychains;
46
+ const userPrv = 'xprvSomeUserPrivateKey';
47
+ const userPub = 'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8';
48
+ beforeEach(function () {
49
+ mockKeychains = {
50
+ create: sinon.stub().returns({ pub: userPub, prv: userPrv }),
51
+ add: sinon.stub().resolves({ id: 'user-key-id', pub: userPub, encryptedPrv: 'encrypted-prv' }),
52
+ };
53
+ mockBitGo = {
54
+ encryptAsync: sinon
55
+ .stub()
56
+ .callsFake(async ({ password, input }) => `enc:${password}:${input}`),
57
+ decryptAsync: sinon.stub().resolves('decryptedPrv'),
58
+ get: sinon.stub().returns({ result: sinon.stub(), query: sinon.stub().returnsThis() }),
59
+ post: sinon.stub().returns({ send: sinon.stub().returns({ result: sinon.stub().resolves({}) }) }),
60
+ put: sinon.stub().returns({
61
+ send: sinon
62
+ .stub()
63
+ .returns({ result: sinon.stub().resolves({ acceptedWalletShares: [], walletShareUpdateErrors: [] }) }),
64
+ }),
65
+ getECDHKeychain: sinon.stub().resolves({ encryptedXprv: 'encXprv' }),
66
+ setRequestTracer: sinon.stub(),
67
+ url: sinon.stub().returns('/test/url'),
68
+ };
69
+ mockBaseCoin = {
70
+ keychains: sinon.stub().returns(mockKeychains),
71
+ url: sinon.stub().callsFake((path) => path),
72
+ getFamily: sinon.stub().returns('btc'),
73
+ getChain: sinon.stub().returns('btc'),
74
+ supportsTss: sinon.stub().returns(false),
75
+ getMPCAlgorithm: sinon.stub().returns('ecdsa'),
76
+ };
77
+ wallets = new wallets_1.Wallets(mockBitGo, mockBaseCoin);
78
+ });
79
+ afterEach(function () {
80
+ sinon.restore();
81
+ });
82
+ describe('acceptShare', function () {
83
+ it('passes encryptionVersion: 2 to encryptAsync on the multiUserKeyRotationRequired path', async function () {
84
+ mockBitGo.get.returns({
85
+ result: sinon.stub().resolves({
86
+ userMultiKeyRotationRequired: true,
87
+ keychain: null,
88
+ permissions: ['spend'],
89
+ wallet: 'wallet-id',
90
+ }),
91
+ });
92
+ await wallets.acceptShare({
93
+ walletShareId: 'share-id',
94
+ userPassword: 'my-password',
95
+ encryptionVersion: 2,
96
+ });
97
+ assert.ok(mockBitGo.encryptAsync.called, 'encryptAsync should have been called');
98
+ const call = mockBitGo.encryptAsync.firstCall;
99
+ assert.strictEqual(call.args[0].encryptionVersion, 2);
100
+ });
101
+ it('passes encryptionVersion: undefined when not set', async function () {
102
+ mockBitGo.get.returns({
103
+ result: sinon.stub().resolves({
104
+ userMultiKeyRotationRequired: true,
105
+ keychain: null,
106
+ permissions: ['spend'],
107
+ wallet: 'wallet-id',
108
+ }),
109
+ });
110
+ await wallets.acceptShare({
111
+ walletShareId: 'share-id',
112
+ userPassword: 'my-password',
113
+ });
114
+ assert.ok(mockBitGo.encryptAsync.called);
115
+ const call = mockBitGo.encryptAsync.firstCall;
116
+ assert.strictEqual(call.args[0].encryptionVersion, undefined);
117
+ });
118
+ });
119
+ describe('bulkAcceptShare', function () {
120
+ const walletSharesList = {
121
+ incoming: [
122
+ {
123
+ id: 'share-id',
124
+ userMultiKeyRotationRequired: true,
125
+ keychain: null,
126
+ permissions: ['spend'],
127
+ },
128
+ ],
129
+ outgoing: [],
130
+ };
131
+ beforeEach(function () {
132
+ mockBitGo.get.returns({ result: sinon.stub().resolves(walletSharesList) });
133
+ });
134
+ it('passes encryptionVersion: 2 to encryptAsync on the multiUserKeyRotationRequired path', async function () {
135
+ await wallets.bulkAcceptShare({
136
+ walletShareIds: ['share-id'],
137
+ userLoginPassword: 'login-password',
138
+ encryptionVersion: 2,
139
+ });
140
+ assert.ok(mockBitGo.encryptAsync.called);
141
+ const call = mockBitGo.encryptAsync.firstCall;
142
+ assert.strictEqual(call.args[0].encryptionVersion, 2);
143
+ });
144
+ it('passes encryptionVersion: undefined when not set', async function () {
145
+ await wallets.bulkAcceptShare({
146
+ walletShareIds: ['share-id'],
147
+ userLoginPassword: 'login-password',
148
+ });
149
+ assert.ok(mockBitGo.encryptAsync.called);
150
+ const call = mockBitGo.encryptAsync.firstCall;
151
+ assert.strictEqual(call.args[0].encryptionVersion, undefined);
152
+ });
153
+ });
154
+ describe('Wallet.shareWallet / createBulkWalletShare', function () {
155
+ let wallet;
156
+ beforeEach(function () {
157
+ const mockWalletData = {
158
+ id: 'wallet-id',
159
+ keys: ['key-1', 'key-2', 'key-3'],
160
+ coin: 'btc',
161
+ label: 'Test Wallet',
162
+ users: [],
163
+ multisigType: 'onchain',
164
+ type: 'hot',
165
+ };
166
+ mockBaseCoin.supportsTss = sinon.stub().returns(false);
167
+ mockBaseCoin.getMPCAlgorithm = sinon.stub().returns('ecdsa');
168
+ wallet = new wallet_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
169
+ });
170
+ it('shareWallet passes encryptionVersion to prepareSharedKeychain', async function () {
171
+ const prepareStub = sinon.stub(wallet, 'prepareSharedKeychain').resolves({});
172
+ mockBitGo.getSharingKey = sinon.stub().resolves({ userId: 'user-id', pubkey: 'recvPub', path: 'm/0' });
173
+ mockBitGo.post.returns({ send: sinon.stub().returns({ result: sinon.stub().resolves({}) }) });
174
+ await wallet.shareWallet({
175
+ email: 'test@test.com',
176
+ permissions: 'spend',
177
+ walletPassphrase: 'passphrase',
178
+ encryptionVersion: 2,
179
+ });
180
+ assert.ok(prepareStub.calledOnce, 'prepareSharedKeychain should be called');
181
+ assert.strictEqual(prepareStub.firstCall.args[3], 2, 'encryptionVersion should be forwarded');
182
+ });
183
+ it('shareWallet passes encryptionVersion: undefined when not set', async function () {
184
+ const prepareStub = sinon.stub(wallet, 'prepareSharedKeychain').resolves({});
185
+ mockBitGo.getSharingKey = sinon.stub().resolves({ userId: 'user-id', pubkey: 'recvPub', path: 'm/0' });
186
+ mockBitGo.post.returns({ send: sinon.stub().returns({ result: sinon.stub().resolves({}) }) });
187
+ await wallet.shareWallet({
188
+ email: 'test@test.com',
189
+ permissions: 'spend',
190
+ walletPassphrase: 'passphrase',
191
+ });
192
+ assert.ok(prepareStub.calledOnce);
193
+ assert.strictEqual(prepareStub.firstCall.args[3], undefined);
194
+ });
195
+ it('createBulkWalletShare passes encryptionVersion to encryptPrvForUserAsync', async function () {
196
+ const encryptPrvStub = sinon
197
+ .stub(wallet, 'encryptPrvForUserAsync')
198
+ .resolves({ encryptedPrv: 'enc', pub: 'pub', fromPubKey: 'fpk', toPubKey: 'tpk', path: 'm/0' });
199
+ sinon
200
+ .stub(wallet, 'getDecryptedKeychainForSharing')
201
+ .resolves({ prv: 'prv', pub: 'pub', encryptedPrv: 'encPrv' });
202
+ sinon.stub(wallet, 'createBulkKeyShares').resolves({ shares: [] });
203
+ await wallet.createBulkWalletShare({
204
+ walletPassphrase: 'passphrase',
205
+ keyShareOptions: [{ userId: 'user-1', pubKey: 'pubKey', path: 'm/0', permissions: ['spend'] }],
206
+ encryptionVersion: 2,
207
+ });
208
+ assert.ok(encryptPrvStub.calledOnce);
209
+ assert.strictEqual(encryptPrvStub.firstCall.args[4], 2, 'encryptionVersion should be forwarded');
210
+ });
211
+ it('createBulkWalletShare passes encryptionVersion: undefined when not set', async function () {
212
+ const encryptPrvStub = sinon
213
+ .stub(wallet, 'encryptPrvForUserAsync')
214
+ .resolves({ encryptedPrv: 'enc', pub: 'pub', fromPubKey: 'fpk', toPubKey: 'tpk', path: 'm/0' });
215
+ sinon
216
+ .stub(wallet, 'getDecryptedKeychainForSharing')
217
+ .resolves({ prv: 'prv', pub: 'pub', encryptedPrv: 'encPrv' });
218
+ sinon.stub(wallet, 'createBulkKeyShares').resolves({ shares: [] });
219
+ await wallet.createBulkWalletShare({
220
+ walletPassphrase: 'passphrase',
221
+ keyShareOptions: [{ userId: 'user-1', pubKey: 'pubKey', path: 'm/0', permissions: ['spend'] }],
222
+ });
223
+ assert.ok(encryptPrvStub.calledOnce);
224
+ assert.strictEqual(encryptPrvStub.firstCall.args[4], undefined);
225
+ });
226
+ });
227
+ });
228
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0c0VuY3J5cHRpb25WZXJzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC93YWxsZXRzRW5jcnlwdGlvblZlcnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsNkNBQStCO0FBQy9CLGtCQUFnQjtBQUNoQixrRUFBK0Q7QUFDL0QsZ0VBQTZEO0FBRTdELFFBQVEsQ0FBQyx1Q0FBdUMsRUFBRTtJQUNoRCxJQUFJLE9BQWdCLENBQUM7SUFDckIsSUFBSSxTQUFjLENBQUM7SUFDbkIsSUFBSSxZQUFpQixDQUFDO0lBQ3RCLElBQUksYUFBa0IsQ0FBQztJQUV2QixNQUFNLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQztJQUN6QyxNQUFNLE9BQU8sR0FDWCxpSEFBaUgsQ0FBQztJQUVwSCxVQUFVLENBQUM7UUFDVCxhQUFhLEdBQUc7WUFDZCxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQzVELEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsQ0FBQztTQUMvRixDQUFDO1FBRUYsU0FBUyxHQUFHO1lBQ1YsWUFBWSxFQUFFLEtBQUs7aUJBQ2hCLElBQUksRUFBRTtpQkFDTixTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBdUMsRUFBRSxFQUFFLENBQUMsT0FBTyxRQUFRLElBQUksS0FBSyxFQUFFLENBQUM7WUFDNUcsWUFBWSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FB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QUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBXYWxsZXRzIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC93YWxsZXRzJztcbmltcG9ydCB7IFdhbGxldCB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvd2FsbGV0JztcblxuZGVzY3JpYmUoJ1dhbGxldHMgLSBlbmNyeXB0aW9uVmVyc2lvbiB0aHJlYWRpbmcnLCBmdW5jdGlvbiAoKSB7XG4gIGxldCB3YWxsZXRzOiBXYWxsZXRzO1xuICBsZXQgbW9ja0JpdEdvOiBhbnk7XG4gIGxldCBtb2NrQmFzZUNvaW46IGFueTtcbiAgbGV0IG1vY2tLZXljaGFpbnM6IGFueTtcblxuICBjb25zdCB1c2VyUHJ2ID0gJ3hwcnZTb21lVXNlclByaXZhdGVLZXknO1xuICBjb25zdCB1c2VyUHViID1cbiAgICAneHB1YjY2MU15TXdBcVJiY0Z0WGdTNXNZSkFCcXFHOVlMbUM0UTFSZGFwOWdTRThOcXR3eWJHaGVQWTJnWjI5RVNGanFKb0N1MVJ1cGplOFl0R3FzZWZEMjY1VE1nN3VzVURGZHA2VzFFR01jZXQ4JztcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBtb2NrS2V5Y2hhaW5zID0ge1xuICAgICAgY3JlYXRlOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHB1YjogdXNlclB1YiwgcHJ2OiB1c2VyUHJ2IH0pLFxuICAgICAgYWRkOiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBpZDogJ3VzZXIta2V5LWlkJywgcHViOiB1c2VyUHViLCBlbmNyeXB0ZWRQcnY6ICdlbmNyeXB0ZWQtcHJ2JyB9KSxcbiAgICB9O1xuXG4gICAgbW9ja0JpdEdvID0ge1xuICAgICAgZW5jcnlwdEFzeW5jOiBzaW5vblxuICAgICAgICAuc3R1YigpXG4gICAgICAgIC5jYWxsc0Zha2UoYXN5bmMgKHsgcGFzc3dvcmQsIGlucHV0IH06IHsgcGFzc3dvcmQ6IHN0cmluZzsgaW5wdXQ6IHN0cmluZyB9KSA9PiBgZW5jOiR7cGFzc3dvcmR9OiR7aW5wdXR9YCksXG4gICAgICBkZWNyeXB0QXN5bmM6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcygnZGVjcnlwdGVkUHJ2JyksXG4gICAgICBnZXQ6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgcmVzdWx0OiBzaW5vbi5zdHViKCksIHF1ZXJ5OiBzaW5vbi5zdHViKCkucmV0dXJuc1RoaXMoKSB9KSxcbiAgICAgIHBvc3Q6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7fSkgfSkgfSksXG4gICAgICBwdXQ6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHtcbiAgICAgICAgc2VuZDogc2lub25cbiAgICAgICAgICAuc3R1YigpXG4gICAgICAgICAgLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IGFjY2VwdGVkV2FsbGV0U2hhcmVzOiBbXSwgd2FsbGV0U2hhcmVVcGRhdGVFcnJvcnM6IFtdIH0pIH0pLFxuICAgICAgfSksXG4gICAgICBnZXRFQ0RIS2V5Y2hhaW46IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IGVuY3J5cHRlZFhwcnY6ICdlbmNYcHJ2JyB9KSxcbiAgICAgIHNldFJlcXVlc3RUcmFjZXI6IHNpbm9uLnN0dWIoKSxcbiAgICAgIHVybDogc2lub24uc3R1YigpLnJldHVybnMoJy90ZXN0L3VybCcpLFxuICAgIH07XG5cbiAgICBtb2NrQmFzZUNvaW4gPSB7XG4gICAgICBrZXljaGFpbnM6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKG1vY2tLZXljaGFpbnMpLFxuICAgICAgdXJsOiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKChwYXRoOiBzdHJpbmcpID0+IHBhdGgpLFxuICAgICAgZ2V0RmFtaWx5OiBzaW5vbi5zdHViKCkucmV0dXJucygnYnRjJyksXG4gICAgICBnZXRDaGFpbjogc2lub24uc3R1YigpLnJldHVybnMoJ2J0YycpLFxuICAgICAgc3VwcG9ydHNUc3M6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGZhbHNlKSxcbiAgICAgIGdldE1QQ0FsZ29yaXRobTogc2lub24uc3R1YigpLnJldHVybnMoJ2VjZHNhJyksXG4gICAgfTtcblxuICAgIHdhbGxldHMgPSBuZXcgV2FsbGV0cyhtb2NrQml0R28sIG1vY2tCYXNlQ29pbik7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWNjZXB0U2hhcmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Bhc3NlcyBlbmNyeXB0aW9uVmVyc2lvbjogMiB0byBlbmNyeXB0QXN5bmMgb24gdGhlIG11bHRpVXNlcktleVJvdGF0aW9uUmVxdWlyZWQgcGF0aCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyh7XG4gICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHtcbiAgICAgICAgICB1c2VyTXVsdGlLZXlSb3RhdGlvblJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIGtleWNoYWluOiBudWxsLFxuICAgICAgICAgIHBlcm1pc3Npb25zOiBbJ3NwZW5kJ10sXG4gICAgICAgICAgd2FsbGV0OiAnd2FsbGV0LWlkJyxcbiAgICAgICAgfSksXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0cy5hY2NlcHRTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWQ6ICdzaGFyZS1pZCcsXG4gICAgICAgIHVzZXJQYXNzd29yZDogJ215LXBhc3N3b3JkJyxcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IDIsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKG1vY2tCaXRHby5lbmNyeXB0QXN5bmMuY2FsbGVkLCAnZW5jcnlwdEFzeW5jIHNob3VsZCBoYXZlIGJlZW4gY2FsbGVkJyk7XG4gICAgICBjb25zdCBjYWxsID0gbW9ja0JpdEdvLmVuY3J5cHRBc3luYy5maXJzdENhbGw7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY2FsbC5hcmdzWzBdLmVuY3J5cHRpb25WZXJzaW9uLCAyKTtcbiAgICB9KTtcblxuICAgIGl0KCdwYXNzZXMgZW5jcnlwdGlvblZlcnNpb246IHVuZGVmaW5lZCB3aGVuIG5vdCBzZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMoe1xuICAgICAgICByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdXNlck11bHRpS2V5Um90YXRpb25SZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBrZXljaGFpbjogbnVsbCxcbiAgICAgICAgICBwZXJtaXNzaW9uczogWydzcGVuZCddLFxuICAgICAgICAgIHdhbGxldDogJ3dhbGxldC1pZCcsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldHMuYWNjZXB0U2hhcmUoe1xuICAgICAgICB3YWxsZXRTaGFyZUlkOiAnc2hhcmUtaWQnLFxuICAgICAgICB1c2VyUGFzc3dvcmQ6ICdteS1wYXNzd29yZCcsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKG1vY2tCaXRHby5lbmNyeXB0QXN5bmMuY2FsbGVkKTtcbiAgICAgIGNvbnN0IGNhbGwgPSBtb2NrQml0R28uZW5jcnlwdEFzeW5jLmZpcnN0Q2FsbDtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjYWxsLmFyZ3NbMF0uZW5jcnlwdGlvblZlcnNpb24sIHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWxrQWNjZXB0U2hhcmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgd2FsbGV0U2hhcmVzTGlzdCA9IHtcbiAgICAgIGluY29taW5nOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ3NoYXJlLWlkJyxcbiAgICAgICAgICB1c2VyTXVsdGlLZXlSb3RhdGlvblJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIGtleWNoYWluOiBudWxsLFxuICAgICAgICAgIHBlcm1pc3Npb25zOiBbJ3NwZW5kJ10sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgb3V0Z29pbmc6IFtdLFxuICAgIH07XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHdhbGxldFNoYXJlc0xpc3QpIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Bhc3NlcyBlbmNyeXB0aW9uVmVyc2lvbjogMiB0byBlbmNyeXB0QXN5bmMgb24gdGhlIG11bHRpVXNlcktleVJvdGF0aW9uUmVxdWlyZWQgcGF0aCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IHdhbGxldHMuYnVsa0FjY2VwdFNoYXJlKHtcbiAgICAgICAgd2FsbGV0U2hhcmVJZHM6IFsnc2hhcmUtaWQnXSxcbiAgICAgICAgdXNlckxvZ2luUGFzc3dvcmQ6ICdsb2dpbi1wYXNzd29yZCcsXG4gICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAyLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5vayhtb2NrQml0R28uZW5jcnlwdEFzeW5jLmNhbGxlZCk7XG4gICAgICBjb25zdCBjYWxsID0gbW9ja0JpdEdvLmVuY3J5cHRBc3luYy5maXJzdENhbGw7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY2FsbC5hcmdzWzBdLmVuY3J5cHRpb25WZXJzaW9uLCAyKTtcbiAgICB9KTtcblxuICAgIGl0KCdwYXNzZXMgZW5jcnlwdGlvblZlcnNpb246IHVuZGVmaW5lZCB3aGVuIG5vdCBzZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB3YWxsZXRzLmJ1bGtBY2NlcHRTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWRzOiBbJ3NoYXJlLWlkJ10sXG4gICAgICAgIHVzZXJMb2dpblBhc3N3b3JkOiAnbG9naW4tcGFzc3dvcmQnLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5vayhtb2NrQml0R28uZW5jcnlwdEFzeW5jLmNhbGxlZCk7XG4gICAgICBjb25zdCBjYWxsID0gbW9ja0JpdEdvLmVuY3J5cHRBc3luYy5maXJzdENhbGw7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY2FsbC5hcmdzWzBdLmVuY3J5cHRpb25WZXJzaW9uLCB1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnV2FsbGV0LnNoYXJlV2FsbGV0IC8gY3JlYXRlQnVsa1dhbGxldFNoYXJlJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCB3YWxsZXQ6IFdhbGxldDtcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1dhbGxldERhdGEgPSB7XG4gICAgICAgIGlkOiAnd2FsbGV0LWlkJyxcbiAgICAgICAga2V5czogWydrZXktMScsICdrZXktMicsICdrZXktMyddLFxuICAgICAgICBjb2luOiAnYnRjJyxcbiAgICAgICAgbGFiZWw6ICdUZXN0IFdhbGxldCcsXG4gICAgICAgIHVzZXJzOiBbXSxcbiAgICAgICAgbXVsdGlzaWdUeXBlOiAnb25jaGFpbicsXG4gICAgICAgIHR5cGU6ICdob3QnLFxuICAgICAgfTtcbiAgICAgIG1vY2tCYXNlQ29pbi5zdXBwb3J0c1RzcyA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIG1vY2tCYXNlQ29pbi5nZXRNUENBbGdvcml0aG0gPSBzaW5vbi5zdHViKCkucmV0dXJucygnZWNkc2EnKTtcbiAgICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaGFyZVdhbGxldCBwYXNzZXMgZW5jcnlwdGlvblZlcnNpb24gdG8gcHJlcGFyZVNoYXJlZEtleWNoYWluJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHJlcGFyZVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3ByZXBhcmVTaGFyZWRLZXljaGFpbicpLnJlc29sdmVzKHt9KTtcbiAgICAgIG1vY2tCaXRHby5nZXRTaGFyaW5nS2V5ID0gc2lub24uc3R1YigpLnJlc29sdmVzKHsgdXNlcklkOiAndXNlci1pZCcsIHB1YmtleTogJ3JlY3ZQdWInLCBwYXRoOiAnbS8wJyB9KTtcbiAgICAgIG1vY2tCaXRHby5wb3N0LnJldHVybnMoeyBzZW5kOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHt9KSB9KSB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0LnNoYXJlV2FsbGV0KHtcbiAgICAgICAgZW1haWw6ICd0ZXN0QHRlc3QuY29tJyxcbiAgICAgICAgcGVybWlzc2lvbnM6ICdzcGVuZCcsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICdwYXNzcGhyYXNlJyxcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IDIsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKHByZXBhcmVTdHViLmNhbGxlZE9uY2UsICdwcmVwYXJlU2hhcmVkS2V5Y2hhaW4gc2hvdWxkIGJlIGNhbGxlZCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHByZXBhcmVTdHViLmZpcnN0Q2FsbC5hcmdzWzNdLCAyLCAnZW5jcnlwdGlvblZlcnNpb24gc2hvdWxkIGJlIGZvcndhcmRlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NoYXJlV2FsbGV0IHBhc3NlcyBlbmNyeXB0aW9uVmVyc2lvbjogdW5kZWZpbmVkIHdoZW4gbm90IHNldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHByZXBhcmVTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdwcmVwYXJlU2hhcmVkS2V5Y2hhaW4nKS5yZXNvbHZlcyh7fSk7XG4gICAgICBtb2NrQml0R28uZ2V0U2hhcmluZ0tleSA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IHVzZXJJZDogJ3VzZXItaWQnLCBwdWJrZXk6ICdyZWN2UHViJywgcGF0aDogJ20vMCcgfSk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHsgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7fSkgfSkgfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldC5zaGFyZVdhbGxldCh7XG4gICAgICAgIGVtYWlsOiAndGVzdEB0ZXN0LmNvbScsXG4gICAgICAgIHBlcm1pc3Npb25zOiAnc3BlbmQnLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAncGFzc3BocmFzZScsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKHByZXBhcmVTdHViLmNhbGxlZE9uY2UpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHByZXBhcmVTdHViLmZpcnN0Q2FsbC5hcmdzWzNdLCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NyZWF0ZUJ1bGtXYWxsZXRTaGFyZSBwYXNzZXMgZW5jcnlwdGlvblZlcnNpb24gdG8gZW5jcnlwdFBydkZvclVzZXJBc3luYycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGVuY3J5cHRQcnZTdHViID0gc2lub25cbiAgICAgICAgLnN0dWIod2FsbGV0LCAnZW5jcnlwdFBydkZvclVzZXJBc3luYycpXG4gICAgICAgIC5yZXNvbHZlcyh7IGVuY3J5cHRlZFBydjogJ2VuYycsIHB1YjogJ3B1YicsIGZyb21QdWJLZXk6ICdmcGsnLCB0b1B1YktleTogJ3RwaycsIHBhdGg6ICdtLzAnIH0pO1xuICAgICAgc2lub25cbiAgICAgICAgLnN0dWIod2FsbGV0IGFzIGFueSwgJ2dldERlY3J5cHRlZEtleWNoYWluRm9yU2hhcmluZycpXG4gICAgICAgIC5yZXNvbHZlcyh7IHBydjogJ3BydicsIHB1YjogJ3B1YicsIGVuY3J5cHRlZFBydjogJ2VuY1BydicgfSk7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdjcmVhdGVCdWxrS2V5U2hhcmVzJykucmVzb2x2ZXMoeyBzaGFyZXM6IFtdIH0pO1xuXG4gICAgICBhd2FpdCB3YWxsZXQuY3JlYXRlQnVsa1dhbGxldFNoYXJlKHtcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ3Bhc3NwaHJhc2UnLFxuICAgICAgICBrZXlTaGFyZU9wdGlvbnM6IFt7IHVzZXJJZDogJ3VzZXItMScsIHB1YktleTogJ3B1YktleScsIHBhdGg6ICdtLzAnLCBwZXJtaXNzaW9uczogWydzcGVuZCddIH1dLFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogMixcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQub2soZW5jcnlwdFBydlN0dWIuY2FsbGVkT25jZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW5jcnlwdFBydlN0dWIuZmlyc3RDYWxsLmFyZ3NbNF0sIDIsICdlbmNyeXB0aW9uVmVyc2lvbiBzaG91bGQgYmUgZm9yd2FyZGVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnY3JlYXRlQnVsa1dhbGxldFNoYXJlIHBhc3NlcyBlbmNyeXB0aW9uVmVyc2lvbjogdW5kZWZpbmVkIHdoZW4gbm90IHNldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGVuY3J5cHRQcnZTdHViID0gc2lub25cbiAgICAgICAgLnN0dWIod2FsbGV0LCAnZW5jcnlwdFBydkZvclVzZXJBc3luYycpXG4gICAgICAgIC5yZXNvbHZlcyh7IGVuY3J5cHRlZFBydjogJ2VuYycsIHB1YjogJ3B1YicsIGZyb21QdWJLZXk6ICdmcGsnLCB0b1B1YktleTogJ3RwaycsIHBhdGg6ICdtLzAnIH0pO1xuICAgICAgc2lub25cbiAgICAgICAgLnN0dWIod2FsbGV0IGFzIGFueSwgJ2dldERlY3J5cHRlZEtleWNoYWluRm9yU2hhcmluZycpXG4gICAgICAgIC5yZXNvbHZlcyh7IHBydjogJ3BydicsIHB1YjogJ3B1YicsIGVuY3J5cHRlZFBydjogJ2VuY1BydicgfSk7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdjcmVhdGVCdWxrS2V5U2hhcmVzJykucmVzb2x2ZXMoeyBzaGFyZXM6IFtdIH0pO1xuXG4gICAgICBhd2FpdCB3YWxsZXQuY3JlYXRlQnVsa1dhbGxldFNoYXJlKHtcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ3Bhc3NwaHJhc2UnLFxuICAgICAgICBrZXlTaGFyZU9wdGlvbnM6IFt7IHVzZXJJZDogJ3VzZXItMScsIHB1YktleTogJ3B1YktleScsIHBhdGg6ICdtLzAnLCBwZXJtaXNzaW9uczogWydzcGVuZCddIH1dLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5vayhlbmNyeXB0UHJ2U3R1Yi5jYWxsZWRPbmNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbmNyeXB0UHJ2U3R1Yi5maXJzdENhbGwuYXJnc1s0XSwgdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==