@bitgo-beta/sdk-coin-icp 1.0.1-beta.82 → 1.0.1-beta.820
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/resources/messageCompiled.d.ts +797 -0
- package/dist/resources/messageCompiled.js +1859 -0
- package/dist/src/icp.d.ts +55 -2
- package/dist/src/icp.d.ts.map +1 -1
- package/dist/src/icp.js +300 -9
- package/dist/src/lib/icpAgent.d.ts +36 -0
- package/dist/src/lib/icpAgent.d.ts.map +1 -0
- package/dist/src/lib/icpAgent.js +90 -0
- package/dist/src/lib/iface.d.ts +191 -0
- package/dist/src/lib/iface.d.ts.map +1 -0
- package/dist/src/lib/iface.js +44 -0
- package/dist/src/lib/index.d.ts +4 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +12 -2
- package/dist/src/lib/signedTransactionBuilder.d.ts +9 -0
- package/dist/src/lib/signedTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/signedTransactionBuilder.js +64 -0
- package/dist/src/lib/transaction.d.ts +54 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +255 -0
- package/dist/src/lib/transactionBuilder.d.ts +58 -28
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +127 -40
- package/dist/src/lib/transactionBuilderFactory.d.ts +15 -14
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +43 -27
- package/dist/src/lib/transferBuilder.d.ts +7 -24
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +88 -43
- package/dist/src/lib/unsignedTransactionBuilder.d.ts +13 -0
- package/dist/src/lib/unsignedTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/unsignedTransactionBuilder.js +90 -0
- package/dist/src/lib/utils.d.ts +285 -7
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +607 -52
- package/dist/src/ticp.d.ts +0 -4
- package/dist/src/ticp.d.ts.map +1 -1
- package/dist/src/ticp.js +1 -7
- package/dist/test/resources/icp.d.ts +268 -0
- package/dist/test/resources/icp.d.ts.map +1 -0
- package/dist/test/resources/icp.js +377 -0
- package/dist/test/unit/getBuilderFactory.d.ts +3 -0
- package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/getBuilderFactory.js +10 -0
- package/dist/test/unit/icp.d.ts +2 -0
- package/dist/test/unit/icp.d.ts.map +1 -0
- package/dist/test/unit/icp.js +246 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +107 -0
- package/dist/test/unit/transaction.d.ts +2 -0
- package/dist/test/unit/transaction.d.ts.map +1 -0
- package/dist/test/unit/transaction.js +109 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +274 -0
- package/dist/test/unit/transactionBuilder/transactionRecover.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionRecover.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionRecover.js +188 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +206 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +23 -12
- package/.eslintignore +0 -4
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -44
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const should_1 = __importDefault(require("should"));
|
|
7
|
+
const utils_1 = __importDefault(require("../../src/lib/utils"));
|
|
8
|
+
const icp_1 = require("../resources/icp");
|
|
9
|
+
const { encode } = require('cbor-x/index-no-eval');
|
|
10
|
+
const crypto_1 = require("crypto");
|
|
11
|
+
describe('utils', () => {
|
|
12
|
+
describe('isValidAddress()', () => {
|
|
13
|
+
it('should validate addresses correctly', () => {
|
|
14
|
+
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.account1.address), true);
|
|
15
|
+
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.account2.address), true);
|
|
16
|
+
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.account3.address), true);
|
|
17
|
+
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.account4.address), true);
|
|
18
|
+
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.account5.address), true);
|
|
19
|
+
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.account6.address), true);
|
|
20
|
+
});
|
|
21
|
+
it('should invalidate wrong addresses correctly', () => {
|
|
22
|
+
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.errorsAccounts.account1.address), false);
|
|
23
|
+
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.errorsAccounts.account2.address), false);
|
|
24
|
+
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.errorsAccounts.account3.address), false);
|
|
25
|
+
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.errorsAccounts.account4.address), false);
|
|
26
|
+
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.errorsAccounts.account5.address), false);
|
|
27
|
+
should_1.default.equal(utils_1.default.isValidAddress(icp_1.Accounts.errorsAccounts.account6.address), false);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe('isValidBlockId()', () => {
|
|
31
|
+
it('should validate block hashes correctly', () => {
|
|
32
|
+
should_1.default.equal(utils_1.default.isValidBlockId(icp_1.BlockHashes.validHashes.block1), true);
|
|
33
|
+
should_1.default.equal(utils_1.default.isValidBlockId(icp_1.BlockHashes.validHashes.block2), true);
|
|
34
|
+
should_1.default.equal(utils_1.default.isValidBlockId(icp_1.BlockHashes.validHashes.block3), true);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe('isValidTransactionId()', () => {
|
|
38
|
+
it('should validate transaction hashes correctly', () => {
|
|
39
|
+
should_1.default.equal(utils_1.default.isValidBlockId(icp_1.TransactionHashes.validHashes.txId1), true);
|
|
40
|
+
should_1.default.equal(utils_1.default.isValidBlockId(icp_1.TransactionHashes.validHashes.txId2), true);
|
|
41
|
+
should_1.default.equal(utils_1.default.isValidBlockId(icp_1.TransactionHashes.validHashes.txId3), true);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe('gasData()', () => {
|
|
45
|
+
it('should return correct gas data', () => {
|
|
46
|
+
should_1.default.equal(utils_1.default.feeData(), '-10000');
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe('isValidPublicKey()', () => {
|
|
50
|
+
it('should validate public key correctly', () => {
|
|
51
|
+
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.account1.publicKey), true);
|
|
52
|
+
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.account2.publicKey), true);
|
|
53
|
+
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.account3.publicKey), true);
|
|
54
|
+
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.account4.publicKey), true);
|
|
55
|
+
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.account5.publicKey), true);
|
|
56
|
+
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.account6.publicKey), true);
|
|
57
|
+
});
|
|
58
|
+
it('should invalidate public key correctly', () => {
|
|
59
|
+
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.errorsAccounts.account1.publicKey), false);
|
|
60
|
+
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.errorsAccounts.account2.publicKey), false);
|
|
61
|
+
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.errorsAccounts.account3.publicKey), false);
|
|
62
|
+
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.errorsAccounts.account4.publicKey), false);
|
|
63
|
+
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.errorsAccounts.account5.publicKey), false);
|
|
64
|
+
should_1.default.equal(utils_1.default.isValidPublicKey(icp_1.Accounts.errorsAccounts.account6.publicKey), false);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('cborEncode()', () => {
|
|
68
|
+
it('should correctly encode an object', () => {
|
|
69
|
+
const value = { key: 'value' };
|
|
70
|
+
const expectedHex = Buffer.from(encode(value)).toString('hex');
|
|
71
|
+
should_1.default.equal(utils_1.default.cborEncode(value), expectedHex);
|
|
72
|
+
});
|
|
73
|
+
it('should encode and decode a big number correctly', () => {
|
|
74
|
+
const original = { number: BigInt(1740680777458000000) };
|
|
75
|
+
const encoded = encode(original);
|
|
76
|
+
const decoded = utils_1.default.cborDecode(encoded);
|
|
77
|
+
should_1.default.deepEqual(decoded, original);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe('cborDecode()', () => {
|
|
81
|
+
it('should correctly decode a CBOR-encoded object', () => {
|
|
82
|
+
const original = { key: 'value', number: 100 };
|
|
83
|
+
const encoded = encode(original);
|
|
84
|
+
const decoded = utils_1.default.cborDecode(encoded);
|
|
85
|
+
should_1.default.deepEqual(decoded, original);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe('isValidLength()', () => {
|
|
89
|
+
it('should return true for a valid compressed public key length (66 characters)', () => {
|
|
90
|
+
should_1.default.equal(utils_1.default.isValidLength('a'.repeat(66)), true);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('isValidHex()', () => {
|
|
94
|
+
it('should return true for a valid hexadecimal string', () => {
|
|
95
|
+
should_1.default.equal(utils_1.default.isValidHex('abcdef1234567890ABCDEF'), true);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe('hexToBytes()', () => {
|
|
99
|
+
it('should correctly convert a valid hexadecimal string to a Uint8Array', () => {
|
|
100
|
+
const hex = 'abcdef123456';
|
|
101
|
+
const expected = new Uint8Array([0xab, 0xcd, 0xef, 0x12, 0x34, 0x56]);
|
|
102
|
+
should_1.default.deepEqual(utils_1.default.hexToBytes(hex), expected);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
describe('isValidPrivateKey()', () => {
|
|
106
|
+
it('should validate private key correctly', () => {
|
|
107
|
+
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.account1.secretKey), true);
|
|
108
|
+
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.account2.secretKey), true);
|
|
109
|
+
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.account3.secretKey), true);
|
|
110
|
+
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.account4.secretKey), true);
|
|
111
|
+
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.account5.secretKey), true);
|
|
112
|
+
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.account6.secretKey), true);
|
|
113
|
+
});
|
|
114
|
+
it('should invalidate private key correctly', () => {
|
|
115
|
+
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.errorsAccounts.account1.secretKey), false);
|
|
116
|
+
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.errorsAccounts.account2.secretKey), false);
|
|
117
|
+
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.errorsAccounts.account3.secretKey), false);
|
|
118
|
+
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.errorsAccounts.account4.secretKey), false);
|
|
119
|
+
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.errorsAccounts.account5.secretKey), false);
|
|
120
|
+
should_1.default.equal(utils_1.default.isValidPrivateKey(icp_1.Accounts.errorsAccounts.account6.secretKey), false);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
describe('getAddressFromPublicKey()', () => {
|
|
124
|
+
it('should return the correct address for a valid public key', async () => {
|
|
125
|
+
const address1 = await utils_1.default.getAddressFromPublicKey(icp_1.Accounts.account1.publicKey);
|
|
126
|
+
should_1.default.equal(address1, icp_1.Accounts.account1.address);
|
|
127
|
+
const address2 = await utils_1.default.getAddressFromPublicKey(icp_1.Accounts.account1.publicKey);
|
|
128
|
+
should_1.default.equal(address2, icp_1.Accounts.account1.address);
|
|
129
|
+
const address3 = await utils_1.default.getAddressFromPublicKey(icp_1.Accounts.account1.publicKey);
|
|
130
|
+
should_1.default.equal(address3, icp_1.Accounts.account1.address);
|
|
131
|
+
const address4 = await utils_1.default.getAddressFromPublicKey(icp_1.Accounts.account1.publicKey);
|
|
132
|
+
should_1.default.equal(address4, icp_1.Accounts.account1.address);
|
|
133
|
+
const address5 = await utils_1.default.getAddressFromPublicKey(icp_1.Accounts.account1.publicKey);
|
|
134
|
+
should_1.default.equal(address5, icp_1.Accounts.account1.address);
|
|
135
|
+
const address6 = await utils_1.default.getAddressFromPublicKey(icp_1.Accounts.account1.publicKey);
|
|
136
|
+
should_1.default.equal(address6, icp_1.Accounts.account1.address);
|
|
137
|
+
});
|
|
138
|
+
it('should throw an error for an invalid public key', async () => {
|
|
139
|
+
await (0, should_1.default)(utils_1.default.getAddressFromPublicKey(icp_1.Accounts.errorsAccounts.account1.publicKey)).be.rejectedWith('Invalid hex-encoded public key format.');
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
describe('generateKeyPair()', () => {
|
|
143
|
+
it('should generate a valid key pair without a seed', () => {
|
|
144
|
+
const keyPair = utils_1.default.generateKeyPair();
|
|
145
|
+
should_1.default.exist(keyPair);
|
|
146
|
+
should_1.default.exist(keyPair.pub);
|
|
147
|
+
should_1.default.exist(keyPair.prv);
|
|
148
|
+
});
|
|
149
|
+
it('should generate a valid key pair with a given seed', () => {
|
|
150
|
+
const seed = (0, crypto_1.randomBytes)(32);
|
|
151
|
+
const keyPair = utils_1.default.generateKeyPair(seed);
|
|
152
|
+
should_1.default.exist(keyPair);
|
|
153
|
+
should_1.default.exist(keyPair.pub);
|
|
154
|
+
should_1.default.exist(keyPair.prv);
|
|
155
|
+
});
|
|
156
|
+
it('should generate different key pairs for different seeds', () => {
|
|
157
|
+
const seed1 = (0, crypto_1.randomBytes)(32);
|
|
158
|
+
const seed2 = (0, crypto_1.randomBytes)(32);
|
|
159
|
+
const keyPair1 = utils_1.default.generateKeyPair(seed1);
|
|
160
|
+
const keyPair2 = utils_1.default.generateKeyPair(seed2);
|
|
161
|
+
should_1.default.notEqual(keyPair1.pub, keyPair2.pub);
|
|
162
|
+
should_1.default.notEqual(keyPair1.prv, keyPair2.prv);
|
|
163
|
+
});
|
|
164
|
+
it('should generate the same key pair for the same seed', () => {
|
|
165
|
+
const seed = (0, crypto_1.randomBytes)(32);
|
|
166
|
+
const keyPair1 = utils_1.default.generateKeyPair(seed);
|
|
167
|
+
const keyPair2 = utils_1.default.generateKeyPair(seed);
|
|
168
|
+
should_1.default.equal(keyPair1.pub, keyPair2.pub);
|
|
169
|
+
should_1.default.equal(keyPair1.prv, keyPair2.prv);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
describe('validateRawTransaction()', () => {
|
|
173
|
+
const data = icp_1.IcpTransactionData;
|
|
174
|
+
it('should validate icpTransactionData correctly', () => {
|
|
175
|
+
utils_1.default.validateRawTransaction(data);
|
|
176
|
+
});
|
|
177
|
+
it('should throw an error for invalid expiryTime', () => {
|
|
178
|
+
(data.expiryTime = Date.now()), should_1.default.throws(() => utils_1.default.validateRawTransaction(data), 'Invalid expiry time');
|
|
179
|
+
});
|
|
180
|
+
it('should throw an error for invalid fee', () => {
|
|
181
|
+
data.fee = '-100';
|
|
182
|
+
should_1.default.throws(() => utils_1.default.validateRawTransaction(data), 'Invalid fee value');
|
|
183
|
+
});
|
|
184
|
+
it('should throw an error for invalid amount', () => {
|
|
185
|
+
data.amount = '0';
|
|
186
|
+
should_1.default.throws(() => utils_1.default.validateRawTransaction(data), 'amount cannot be less than or equal to zero');
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
describe('getTransactionId()', () => {
|
|
190
|
+
const sender = '47867f2cfb85094275c847435fa10cad54a813eba7e6a9bc3538aa2f537f1d73';
|
|
191
|
+
const receiver = 'a1c60efca988c411cd7bc5e481364b9c94caebb24c00e01db269e3a0541ee498';
|
|
192
|
+
it('should return the correct transaction hash for amount less than 2^32 (amount = 1000)', () => {
|
|
193
|
+
const unsignedTransaction = 'b90002677570646174657381826b5452414e53414354494f4eb900056b63616e69737465725f69644a000000000000000201016b6d6574686f645f6e616d656773656e645f70626361726758400a02080012050a0308e8071a0308904e2a220a20a1c60efca988c411cd7bc5e481364b9c94caebb24c00e01db269e3a0541ee4983a0a088084a8a988e4f4a0186673656e646572581da905b86bba9bfed194ac8c12377b5d48847128dbfff10f01adb80f7f026e696e67726573735f6578706972791b000000000000000070696e67726573735f6578706972696573811b1841d35866476200';
|
|
194
|
+
const transactionHash = utils_1.default.getTransactionId(unsignedTransaction, sender, receiver);
|
|
195
|
+
const expectedTransactionHash = 'bb502d0566f726da02a1925415f68cb6f175cdd6cba1e09823143078715b2ba4';
|
|
196
|
+
should_1.default.equal(transactionHash, expectedTransactionHash);
|
|
197
|
+
});
|
|
198
|
+
it('should return the correct transaction hash for amount greater than 2^32 (amount = 6948150200)', () => {
|
|
199
|
+
const unsignedTransaction = 'b90002677570646174657381826b5452414e53414354494f4eb900056b63616e69737465725f69644a000000000000000201016b6d6574686f645f6e616d656773656e645f70626361726758430a02080012080a0608b8b791f1191a0308904e2a220a20a1c60efca988c411cd7bc5e481364b9c94caebb24c00e01db269e3a0541ee4983a0a0880b8a789bfebf4a0186673656e646572581da905b86bba9bfed194ac8c12377b5d48847128dbfff10f01adb80f7f026e696e67726573735f6578706972791b000000000000000070696e67726573735f6578706972696573811b1841d393d2473c00';
|
|
200
|
+
const transactionHash = utils_1.default.getTransactionId(unsignedTransaction, sender, receiver);
|
|
201
|
+
const expectedTransactionHash = '016411110006d4645cbcb553a84efdec6c402847f856caa909111d81bb513565';
|
|
202
|
+
should_1.default.equal(transactionHash, expectedTransactionHash);
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsZ0VBQXdDO0FBQ3hDLDBDQUFnRztBQUNoRyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFDbkQsbUNBQXFDO0FBRXJDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO0lBQ3JCLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7UUFDaEMsRUFBRSxDQUFDLHFDQUFxQyxFQUFFLEdBQUcsRUFBRTtZQUM3QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLGNBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxjQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BFLGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxjQUFjLENBQUMsY0FBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLGNBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxjQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BFLGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxjQUFjLENBQUMsY0FBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMs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QUFtQixHQUN2Qiw4Y0FBOGMsQ0FBQztZQUNqZCxNQUFNLGVBQWUsR0FBRyxlQUFLLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3RGLE1BQU0sdUJBQXVCLEdBQUcsa0VBQWtFLENBQUM7WUFDbkcsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsK0ZBQStGLEVBQUUsR0FBRyxFQUFFO1lBQ3ZHLE1BQU0sbUJBQW1CLEdBQ3ZCLG9kQUFvZCxDQUFDO1lBQ3ZkLE1BQU0sZUFBZSxHQUFHLGVBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdEYsTUFBTSx1QkFBdUIsR0FBRyxrRUFBa0UsQ0FBQztZQUNuRyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBBY2NvdW50cywgSWNwVHJhbnNhY3Rpb25EYXRhLCBCbG9ja0hhc2hlcywgVHJhbnNhY3Rpb25IYXNoZXMgfSBmcm9tICcuLi9yZXNvdXJjZXMvaWNwJztcbmNvbnN0IHsgZW5jb2RlIH0gPSByZXF1aXJlKCdjYm9yLXgvaW5kZXgtbm8tZXZhbCcpO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG5kZXNjcmliZSgndXRpbHMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdpc1ZhbGlkQWRkcmVzcygpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYWRkcmVzc2VzIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhBY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzKSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoQWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKEFjY291bnRzLmFjY291bnQzLmFkZHJlc3MpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhBY2NvdW50cy5hY2NvdW50NC5hZGRyZXNzKSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoQWNjb3VudHMuYWNjb3VudDUuYWRkcmVzcyksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKEFjY291bnRzLmFjY291bnQ2LmFkZHJlc3MpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW52YWxpZGF0ZSB3cm9uZyBhZGRyZXNzZXMgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKEFjY291bnRzLmVycm9yc0FjY291bnRzLmFjY291bnQxLmFkZHJlc3MpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoQWNjb3VudHMuZXJyb3JzQWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50My5hZGRyZXNzKSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKEFjY291bnRzLmVycm9yc0FjY291bnRzLmFjY291bnQ0LmFkZHJlc3MpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoQWNjb3VudHMuZXJyb3JzQWNjb3VudHMuYWNjb3VudDUuYWRkcmVzcyksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50Ni5hZGRyZXNzKSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZEJsb2NrSWQoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGJsb2NrIGhhc2hlcyBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEJsb2NrSWQoQmxvY2tIYXNoZXMudmFsaWRIYXNoZXMuYmxvY2sxKSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEJsb2NrSWQoQmxvY2tIYXNoZXMudmFsaWRIYXNoZXMuYmxvY2syKSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEJsb2NrSWQoQmxvY2tIYXNoZXMudmFsaWRIYXNoZXMuYmxvY2szKSwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkVHJhbnNhY3Rpb25JZCgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdHJhbnNhY3Rpb24gaGFzaGVzIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQmxvY2tJZChUcmFuc2FjdGlvbkhhc2hlcy52YWxpZEhhc2hlcy50eElkMSksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRCbG9ja0lkKFRyYW5zYWN0aW9uSGFzaGVzLnZhbGlkSGFzaGVzLnR4SWQyKSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEJsb2NrSWQoVHJhbnNhY3Rpb25IYXNoZXMudmFsaWRIYXNoZXMudHhJZDMpLCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dhc0RhdGEoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IGdhcyBkYXRhJywgKCkgPT4ge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmZlZURhdGEoKSwgJy0xMDAwMCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZFB1YmxpY0tleSgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgcHVibGljIGtleSBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFB1YmxpY0tleShBY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHVibGljS2V5KEFjY291bnRzLmFjY291bnQyLnB1YmxpY0tleSksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoQWNjb3VudHMuYWNjb3VudDMucHVibGljS2V5KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFB1YmxpY0tleShBY2NvdW50cy5hY2NvdW50NC5wdWJsaWNLZXkpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHVibGljS2V5KEFjY291bnRzLmFjY291bnQ1LnB1YmxpY0tleSksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoQWNjb3VudHMuYWNjb3VudDYucHVibGljS2V5KSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGludmFsaWRhdGUgcHVibGljIGtleSBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFB1YmxpY0tleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFB1YmxpY0tleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50Mi5wdWJsaWNLZXkpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFB1YmxpY0tleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50My5wdWJsaWNLZXkpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFB1YmxpY0tleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50NC5wdWJsaWNLZXkpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFB1YmxpY0tleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50NS5wdWJsaWNLZXkpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFB1YmxpY0tleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50Ni5wdWJsaWNLZXkpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjYm9yRW5jb2RlKCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZW5jb2RlIGFuIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0geyBrZXk6ICd2YWx1ZScgfTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkSGV4ID0gQnVmZmVyLmZyb20oZW5jb2RlKHZhbHVlKSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmNib3JFbmNvZGUodmFsdWUpLCBleHBlY3RlZEhleCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGVuY29kZSBhbmQgZGVjb2RlIGEgYmlnIG51bWJlciBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBvcmlnaW5hbCA9IHsgbnVtYmVyOiBCaWdJbnQoMTc0MDY4MDc3NzQ1ODAwMDAwMCkgfTtcbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGUob3JpZ2luYWwpO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IHV0aWxzLmNib3JEZWNvZGUoZW5jb2RlZCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKGRlY29kZWQsIG9yaWdpbmFsKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Nib3JEZWNvZGUoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBkZWNvZGUgYSBDQk9SLWVuY29kZWQgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3Qgb3JpZ2luYWwgPSB7IGtleTogJ3ZhbHVlJywgbnVtYmVyOiAxMDAgfTtcbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGUob3JpZ2luYWwpO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IHV0aWxzLmNib3JEZWNvZGUoZW5jb2RlZCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKGRlY29kZWQsIG9yaWdpbmFsKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRMZW5ndGgoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGZvciBhIHZhbGlkIGNvbXByZXNzZWQgcHVibGljIGtleSBsZW5ndGggKDY2IGNoYXJhY3RlcnMpJywgKCkgPT4ge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRMZW5ndGgoJ2EnLnJlcGVhdCg2NikpLCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRIZXgoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGZvciBhIHZhbGlkIGhleGFkZWNpbWFsIHN0cmluZycsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkSGV4KCdhYmNkZWYxMjM0NTY3ODkwQUJDREVGJyksIHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaGV4VG9CeXRlcygpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGNvbnZlcnQgYSB2YWxpZCBoZXhhZGVjaW1hbCBzdHJpbmcgdG8gYSBVaW50OEFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgaGV4ID0gJ2FiY2RlZjEyMzQ1Nic7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IG5ldyBVaW50OEFycmF5KFsweGFiLCAweGNkLCAweGVmLCAweDEyLCAweDM0LCAweDU2XSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHV0aWxzLmhleFRvQnl0ZXMoaGV4KSwgZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZFByaXZhdGVLZXkoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHByaXZhdGUga2V5IGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShBY2NvdW50cy5hY2NvdW50MS5zZWNyZXRLZXkpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShBY2NvdW50cy5hY2NvdW50Mi5zZWNyZXRLZXkpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShBY2NvdW50cy5hY2NvdW50My5zZWNyZXRLZXkpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShBY2NvdW50cy5hY2NvdW50NC5zZWNyZXRLZXkpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShBY2NvdW50cy5hY2NvdW50NS5zZWNyZXRLZXkpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShBY2NvdW50cy5hY2NvdW50Ni5zZWNyZXRLZXkpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW52YWxpZGF0ZSBwcml2YXRlIGtleSBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoQWNjb3VudHMuZXJyb3JzQWNjb3VudHMuYWNjb3VudDEuc2VjcmV0S2V5KSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KEFjY291bnRzLmVycm9yc0FjY291bnRzLmFjY291bnQyLnNlY3JldEtleSksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50My5zZWNyZXRLZXkpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoQWNjb3VudHMuZXJyb3JzQWNjb3VudHMuYWNjb3VudDQuc2VjcmV0S2V5KSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KEFjY291bnRzLmVycm9yc0FjY291bnRzLmFjY291bnQ1LnNlY3JldEtleSksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50Ni5zZWNyZXRLZXkpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRBZGRyZXNzRnJvbVB1YmxpY0tleSgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBjb3JyZWN0IGFkZHJlc3MgZm9yIGEgdmFsaWQgcHVibGljIGtleScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGFkZHJlc3MxID0gYXdhaXQgdXRpbHMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkoQWNjb3VudHMuYWNjb3VudDEucHVibGljS2V5KTtcbiAgICAgIHNob3VsZC5lcXVhbChhZGRyZXNzMSwgQWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyk7XG4gICAgICBjb25zdCBhZGRyZXNzMiA9IGF3YWl0IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KEFjY291bnRzLmFjY291bnQxLnB1YmxpY0tleSk7XG4gICAgICBzaG91bGQuZXF1YWwoYWRkcmVzczIsIEFjY291bnRzLmFjY291bnQxLmFkZHJlc3MpO1xuICAgICAgY29uc3QgYWRkcmVzczMgPSBhd2FpdCB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShBY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkpO1xuICAgICAgc2hvdWxkLmVxdWFsKGFkZHJlc3MzLCBBY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzKTtcbiAgICAgIGNvbnN0IGFkZHJlc3M0ID0gYXdhaXQgdXRpbHMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkoQWNjb3VudHMuYWNjb3VudDEucHVibGljS2V5KTtcbiAgICAgIHNob3VsZC5lcXVhbChhZGRyZXNzNCwgQWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyk7XG4gICAgICBjb25zdCBhZGRyZXNzNSA9IGF3YWl0IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KEFjY291bnRzLmFjY291bnQxLnB1YmxpY0tleSk7XG4gICAgICBzaG91bGQuZXF1YWwoYWRkcmVzczUsIEFjY291bnRzLmFjY291bnQxLmFkZHJlc3MpO1xuICAgICAgY29uc3QgYWRkcmVzczYgPSBhd2FpdCB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShBY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkpO1xuICAgICAgc2hvdWxkLmVxdWFsKGFkZHJlc3M2LCBBY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3IgZm9yIGFuIGludmFsaWQgcHVibGljIGtleScsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHNob3VsZCh1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShBY2NvdW50cy5lcnJvcnNBY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXkpKS5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICdJbnZhbGlkIGhleC1lbmNvZGVkIHB1YmxpYyBrZXkgZm9ybWF0LidcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZW5lcmF0ZUtleVBhaXIoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGEgdmFsaWQga2V5IHBhaXIgd2l0aG91dCBhIHNlZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gdXRpbHMuZ2VuZXJhdGVLZXlQYWlyKCk7XG4gICAgICBzaG91bGQuZXhpc3Qoa2V5UGFpcik7XG4gICAgICBzaG91bGQuZXhpc3Qoa2V5UGFpci5wdWIpO1xuICAgICAgc2hvdWxkLmV4aXN0KGtleVBhaXIucHJ2KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSB2YWxpZCBrZXkgcGFpciB3aXRoIGEgZ2l2ZW4gc2VlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHNlZWQgPSByYW5kb21CeXRlcygzMik7XG4gICAgICBjb25zdCBrZXlQYWlyID0gdXRpbHMuZ2VuZXJhdGVLZXlQYWlyKHNlZWQpO1xuICAgICAgc2hvdWxkLmV4aXN0KGtleVBhaXIpO1xuICAgICAgc2hvdWxkLmV4aXN0KGtleVBhaXIucHViKTtcbiAgICAgIHNob3VsZC5leGlzdChrZXlQYWlyLnBydik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGRpZmZlcmVudCBrZXkgcGFpcnMgZm9yIGRpZmZlcmVudCBzZWVkcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHNlZWQxID0gcmFuZG9tQnl0ZXMoMzIpO1xuICAgICAgY29uc3Qgc2VlZDIgPSByYW5kb21CeXRlcygzMik7XG4gICAgICBjb25zdCBrZXlQYWlyMSA9IHV0aWxzLmdlbmVyYXRlS2V5UGFpcihzZWVkMSk7XG4gICAgICBjb25zdCBrZXlQYWlyMiA9IHV0aWxzLmdlbmVyYXRlS2V5UGFpcihzZWVkMik7XG5cbiAgICAgIHNob3VsZC5ub3RFcXVhbChrZXlQYWlyMS5wdWIsIGtleVBhaXIyLnB1Yik7XG4gICAgICBzaG91bGQubm90RXF1YWwoa2V5UGFpcjEucHJ2LCBrZXlQYWlyMi5wcnYpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSB0aGUgc2FtZSBrZXkgcGFpciBmb3IgdGhlIHNhbWUgc2VlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHNlZWQgPSByYW5kb21CeXRlcygzMik7XG4gICAgICBjb25zdCBrZXlQYWlyMSA9IHV0aWxzLmdlbmVyYXRlS2V5UGFpcihzZWVkKTtcbiAgICAgIGNvbnN0IGtleVBhaXIyID0gdXRpbHMuZ2VuZXJhdGVLZXlQYWlyKHNlZWQpO1xuXG4gICAgICBzaG91bGQuZXF1YWwoa2V5UGFpcjEucHViLCBrZXlQYWlyMi5wdWIpO1xuICAgICAgc2hvdWxkLmVxdWFsKGtleVBhaXIxLnBydiwga2V5UGFpcjIucHJ2KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oKScsICgpID0+IHtcbiAgICBjb25zdCBkYXRhID0gSWNwVHJhbnNhY3Rpb25EYXRhO1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgaWNwVHJhbnNhY3Rpb25EYXRhIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIHV0aWxzLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oZGF0YSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciBmb3IgaW52YWxpZCBleHBpcnlUaW1lJywgKCkgPT4ge1xuICAgICAgKGRhdGEuZXhwaXJ5VGltZSA9IERhdGUubm93KCkpLCBzaG91bGQudGhyb3dzKCgpID0+IHV0aWxzLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oZGF0YSksICdJbnZhbGlkIGV4cGlyeSB0aW1lJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciBmb3IgaW52YWxpZCBmZWUnLCAoKSA9PiB7XG4gICAgICBkYXRhLmZlZSA9ICctMTAwJztcbiAgICAgIHNob3VsZC50aHJvd3MoKCkgPT4gdXRpbHMudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihkYXRhKSwgJ0ludmFsaWQgZmVlIHZhbHVlJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciBmb3IgaW52YWxpZCBhbW91bnQnLCAoKSA9PiB7XG4gICAgICBkYXRhLmFtb3VudCA9ICcwJztcbiAgICAgIHNob3VsZC50aHJvd3MoKCkgPT4gdXRpbHMudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihkYXRhKSwgJ2Ftb3VudCBjYW5ub3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFRyYW5zYWN0aW9uSWQoKScsICgpID0+IHtcbiAgICBjb25zdCBzZW5kZXIgPSAnNDc4NjdmMmNmYjg1MDk0Mjc1Yzg0NzQzNWZhMTBjYWQ1NGE4MTNlYmE3ZTZhOWJjMzUzOGFhMmY1MzdmMWQ3Myc7XG4gICAgY29uc3QgcmVjZWl2ZXIgPSAnYTFjNjBlZmNhOTg4YzQxMWNkN2JjNWU0ODEzNjRiOWM5NGNhZWJiMjRjMDBlMDFkYjI2OWUzYTA1NDFlZTQ5OCc7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGNvcnJlY3QgdHJhbnNhY3Rpb24gaGFzaCBmb3IgYW1vdW50IGxlc3MgdGhhbiAyXjMyIChhbW91bnQgPSAxMDAwKScsICgpID0+IHtcbiAgICAgIGNvbnN0IHVuc2lnbmVkVHJhbnNhY3Rpb24gPVxuICAgICAgICAnYjkwMDAyNjc3NTcwNjQ2MTc0NjU3MzgxODI2YjU0NTI0MTRlNTM0MTQzNTQ0OTRmNGViOTAwMDU2YjYzNjE2ZTY5NzM3NDY1NzI1ZjY5NjQ0YTAwMDAwMDAwMDAwMDAwMDIwMTAxNmI2ZDY1NzQ2ODZmNjQ1ZjZlNjE2ZDY1Njc3MzY1NmU2NDVmNzA2MjYzNjE3MjY3NTg0MDBhMDIwODAwMTIwNTBhMDMwOGU4MDcxYTAzMDg5MDRlMmEyMjBhMjBhMWM2MGVmY2E5ODhjNDExY2Q3YmM1ZTQ4MTM2NGI5Yzk0Y2FlYmIyNGMwMGUwMWRiMjY5ZTNhMDU0MWVlNDk4M2EwYTA4ODA4NGE4YTk4OGU0ZjRhMDE4NjY3MzY1NmU2NDY1NzI1ODFkYTkwNWI4NmJiYTliZmVkMTk0YWM4YzEyMzc3YjVkNDg4NDcxMjhkYmZmZjEwZjAxYWRiODBmN2YwMjZlNjk2ZTY3NzI2NTczNzM1ZjY1Nzg3MDY5NzI3OTFiMDAwMDAwMDAwMDAwMDAwMDcwNjk2ZTY3NzI2NTczNzM1ZjY1Nzg3MDY5NzI2OTY1NzM4MTFiMTg0MWQzNTg2NjQ3NjIwMCc7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbkhhc2ggPSB1dGlscy5nZXRUcmFuc2FjdGlvbklkKHVuc2lnbmVkVHJhbnNhY3Rpb24sIHNlbmRlciwgcmVjZWl2ZXIpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRUcmFuc2FjdGlvbkhhc2ggPSAnYmI1MDJkMDU2NmY3MjZkYTAyYTE5MjU0MTVmNjhjYjZmMTc1Y2RkNmNiYTFlMDk4MjMxNDMwNzg3MTViMmJhNCc7XG4gICAgICBzaG91bGQuZXF1YWwodHJhbnNhY3Rpb25IYXNoLCBleHBlY3RlZFRyYW5zYWN0aW9uSGFzaCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgY29ycmVjdCB0cmFuc2FjdGlvbiBoYXNoIGZvciBhbW91bnQgZ3JlYXRlciB0aGFuIDJeMzIgKGFtb3VudCA9IDY5NDgxNTAyMDApJywgKCkgPT4ge1xuICAgICAgY29uc3QgdW5zaWduZWRUcmFuc2FjdGlvbiA9XG4gICAgICAgICdiOTAwMDI2Nzc1NzA2NDYxNzQ2NTczODE4MjZiNTQ1MjQxNGU1MzQxNDM1NDQ5NGY0ZWI5MDAwNTZiNjM2MTZlNjk3Mzc0NjU3MjVmNjk2NDRhMDAwMDAwMDAwMDAwMDAwMjAxMDE2YjZkNjU3NDY4NmY2NDVmNmU2MTZkNjU2NzczNjU2ZTY0NWY3MDYyNjM2MTcyNjc1ODQzMGEwMjA4MDAxMjA4MGEwNjA4YjhiNzkxZjExOTFhMDMwODkwNGUyYTIyMGEyMGExYzYwZWZjYTk4OGM0MTFjZDdiYzVlNDgxMzY0YjljOTRjYWViYjI0YzAwZTAxZGIyNjllM2EwNTQxZWU0OTgzYTBhMDg4MGI4YTc4OWJmZWJmNGEwMTg2NjczNjU2ZTY0NjU3MjU4MWRhOTA1Yjg2YmJhOWJmZWQxOTRhYzhjMTIzNzdiNWQ0ODg0NzEyOGRiZmZmMTBmMDFhZGI4MGY3ZjAyNmU2OTZlNjc3MjY1NzM3MzVmNjU3ODcwNjk3Mjc5MWIwMDAwMDAwMDAwMDAwMDAwNzA2OTZlNjc3MjY1NzM3MzVmNjU3ODcwNjk3MjY5NjU3MzgxMWIxODQxZDM5M2QyNDczYzAwJztcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uSGFzaCA9IHV0aWxzLmdldFRyYW5zYWN0aW9uSWQodW5zaWduZWRUcmFuc2FjdGlvbiwgc2VuZGVyLCByZWNlaXZlcik7XG4gICAgICBjb25zdCBleHBlY3RlZFRyYW5zYWN0aW9uSGFzaCA9ICcwMTY0MTExMTAwMDZkNDY0NWNiY2I1NTNhODRlZmRlYzZjNDAyODQ3Zjg1NmNhYTkwOTExMWQ4MWJiNTEzNTY1JztcbiAgICAgIHNob3VsZC5lcXVhbCh0cmFuc2FjdGlvbkhhc2gsIGV4cGVjdGVkVHJhbnNhY3Rpb25IYXNoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|