@bitgo-beta/sdk-coin-sol 7.6.4-beta.744 → 7.6.4-beta.746
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/cjs/src/lib/confidentialTransferBuilder.d.ts.map +1 -1
- package/dist/cjs/src/lib/confidentialTransferBuilder.js +38 -8
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.js +50 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/lib/confidentialTransferBuilder.d.ts.map +1 -1
- package/dist/esm/lib/confidentialTransferBuilder.js +38 -8
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confidentialTransferBuilder.d.ts","sourceRoot":"","sources":["../../../../src/lib/confidentialTransferBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAyB,qBAAqB,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG7H,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,oCAAoC,EAGpC,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"confidentialTransferBuilder.d.ts","sourceRoot":"","sources":["../../../../src/lib/confidentialTransferBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAyB,qBAAqB,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG7H,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,oCAAoC,EAGpC,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAQjB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,2BAA4B,SAAQ,kBAAkB;IACjE,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,CAAwB;IACzC,OAAO,CAAC,oBAAoB,CAAC,CAAyB;gBAE1C,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED;;;;;;;;;;OAUG;IACH,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI;IAK7C;;;;;;;OAOG;IACH,iBAAiB,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI;IAKvD;;;;;;;;OAQG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAMzC,kBAAkB;IAClB,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAsBlC;;;;OAIG;IACH,gBAAgB,CAAC,MAAM,EAAE,oCAAoC,CAAC,QAAQ,CAAC,GAAG,IAAI;IAc9E;;;;OAIG;IACH,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GAAG,IAAI;IAahE;;;OAGG;IACH,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GAAG,IAAI;IAahE;;;;OAIG;IACH,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GAAG,IAAI;IAclE;;;OAGG;IACH,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GAAG,IAAI;IAgBlE;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GAAG,IAAI;IAQlE;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GAAG,IAAI;IAQhE;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GAAG,IAAI;IAQhE;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,GAAG,IAAI;IAQ1D,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAY3D;;;;;;;;;;OAUG;IACH,OAAO,CAAC,OAAO;CAsGhB"}
|
|
@@ -11,8 +11,10 @@ const transaction_1 = require("./transaction");
|
|
|
11
11
|
const transactionBuilder_1 = require("./transactionBuilder");
|
|
12
12
|
const constants_1 = require("./constants");
|
|
13
13
|
const compileTransactionMessage_1 = require("./serialization/compileTransactionMessage");
|
|
14
|
+
const message_1 = require("./serialization/codecs/v1/message");
|
|
14
15
|
const wire_transaction_1 = require("./serialization/wire-transaction");
|
|
15
16
|
const solInstructionFactory_1 = require("./solInstructionFactory");
|
|
17
|
+
const v1TransactionBuilder_1 = require("./v1TransactionBuilder");
|
|
16
18
|
const assert_1 = __importDefault(require("assert"));
|
|
17
19
|
/**
|
|
18
20
|
* Builder for Token-2022 confidential transfer transactions.
|
|
@@ -264,6 +266,12 @@ class ConfidentialTransferBuilder extends transactionBuilder_1.TransactionBuilde
|
|
|
264
266
|
...this._ctInstructions.filter((i) => i.type !== constants_1.InstructionBuilderTypes.ApplyPendingBalance),
|
|
265
267
|
];
|
|
266
268
|
const instructions = [];
|
|
269
|
+
// Durable nonce: the AdvanceNonceAccount instruction MUST be part of the
|
|
270
|
+
// message (a bare nonce hash without the instruction is invalid). It is
|
|
271
|
+
// placed first, matching the v0 web3.js convention.
|
|
272
|
+
if (this._nonceInfo) {
|
|
273
|
+
instructions.push((0, v1TransactionBuilder_1.buildAdvanceNonceAccountInstruction)(this._nonceInfo.params.walletNonceAddress, this._nonceInfo.params.authWalletAddress));
|
|
274
|
+
}
|
|
267
275
|
for (const instruction of this._ctInstructions) {
|
|
268
276
|
instructions.push(...(0, solInstructionFactory_1.solInstructionFactory)(instruction, this._zkProofProgramId));
|
|
269
277
|
}
|
|
@@ -283,22 +291,44 @@ class ConfidentialTransferBuilder extends transactionBuilder_1.TransactionBuilde
|
|
|
283
291
|
recentBlockhash: this._recentBlockhash,
|
|
284
292
|
transactionConfig: this._v1TransactionConfig,
|
|
285
293
|
});
|
|
294
|
+
// Signer order comes from the compiled message: the first
|
|
295
|
+
// numSignerAccounts static accounts are the required signers (fee payer
|
|
296
|
+
// first, then the remaining signers in the compiled account order).
|
|
297
|
+
const decoded = (0, message_1.decodeV1Message)(messageBytes);
|
|
298
|
+
const signerAddresses = decoded.staticAccounts.slice(0, decoded.header.numSignerAccounts);
|
|
286
299
|
const signatures = [];
|
|
287
|
-
for (const
|
|
288
|
-
const
|
|
289
|
-
(
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
300
|
+
for (const address of signerAddresses) {
|
|
301
|
+
const keyPair = this._signers.find((signer) => signer.getKeys().pub === address);
|
|
302
|
+
if (keyPair) {
|
|
303
|
+
const secretKey = keyPair.getKeys(true).prv;
|
|
304
|
+
(0, assert_1.default)(secretKey instanceof Uint8Array, 'Missing private key');
|
|
305
|
+
signatures.push(tweetnacl_1.default.sign.detached(messageBytes, secretKey));
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
const external = this.getAdditionalSignatures().find((sig) => sig.publicKey.pub === address);
|
|
309
|
+
if (external) {
|
|
310
|
+
signatures.push(new Uint8Array(external.signature));
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
// Missing signature: zero-fill the slot so the wire shape stays valid
|
|
314
|
+
// for partial-sign flows; the transaction is not broadcastable until
|
|
315
|
+
// every required signer has a signature.
|
|
316
|
+
signatures.push(new Uint8Array(64));
|
|
294
317
|
}
|
|
295
318
|
const v1Wire = (0, wire_transaction_1.serializeWireTransaction)(messageBytes, signatures);
|
|
296
319
|
this._transaction.v1TransactionBytes = v1Wire;
|
|
297
320
|
this._transaction.v1MessageBytes = messageBytes;
|
|
298
321
|
// Populate a metadata-only SolTransaction so toJson / loadInputsAndOutputs work.
|
|
322
|
+
// The durable nonce is carried via nonceInfo, matching the v0 model.
|
|
299
323
|
const metaTx = new web3_js_1.Transaction();
|
|
300
324
|
metaTx.feePayer = feePayer;
|
|
301
325
|
metaTx.recentBlockhash = this._recentBlockhash;
|
|
326
|
+
if (this._nonceInfo) {
|
|
327
|
+
metaTx.nonceInfo = {
|
|
328
|
+
nonce: this._recentBlockhash,
|
|
329
|
+
nonceInstruction: (0, v1TransactionBuilder_1.buildAdvanceNonceAccountInstruction)(this._nonceInfo.params.walletNonceAddress, this._nonceInfo.params.authWalletAddress),
|
|
330
|
+
};
|
|
331
|
+
}
|
|
302
332
|
metaTx.add(...instructions);
|
|
303
333
|
this._transaction.solTransaction = metaTx;
|
|
304
334
|
this._transaction.setTransactionType(this.transactionType);
|
|
@@ -308,4 +338,4 @@ class ConfidentialTransferBuilder extends transactionBuilder_1.TransactionBuilde
|
|
|
308
338
|
}
|
|
309
339
|
}
|
|
310
340
|
exports.ConfidentialTransferBuilder = ConfidentialTransferBuilder;
|
|
311
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlkZW50aWFsVHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb25maWRlbnRpYWxUcmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsbURBQTZIO0FBQzdILDZDQUFtRztBQUNuRywwREFBNkI7QUFDN0IsK0NBQTRDO0FBQzVDLDZEQUEwRDtBQUMxRCwyQ0FBc0Q7QUFjdEQseUZBQXNGO0FBQ3RGLHVFQUE0RTtBQUM1RSxtRUFBZ0U7QUFDaEUsb0RBQTRCO0FBRTVCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILE1BQWEsMkJBQTRCLFNBQVEsdUNBQWtCO0lBS2pFLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBTGIsb0JBQWUsR0FBd0IsRUFBRSxDQUFDO1FBTWhELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSx5QkFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLG9CQUFvQixDQUFDO0lBQzlDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsT0FBTyxDQUFDLE9BQThCO1FBQ3BDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxpQkFBaUIsQ0FBQyxNQUE4QjtRQUM5QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsTUFBTSxDQUFDO1FBQ25DLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsZ0JBQWdCLENBQUMsU0FBaUI7UUFDaEMsSUFBQSxnQkFBTSxFQUFDLFNBQVMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7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LGtFQWlUQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgU29sVHJhbnNhY3Rpb25WZXJzaW9uLCBTb2xWMVRyYW5zYWN0aW9uQ29uZmlnLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBQdWJsaWNLZXksIFRyYW5zYWN0aW9uIGFzIFNvbFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbkluc3RydWN0aW9uIH0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCBuYWNsIGZyb20gJ3R3ZWV0bmFjbCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBBcHBseVBlbmRpbmdCYWxhbmNlLFxuICBDb25maWRlbnRpYWxEZXBvc2l0LFxuICBDb25maWRlbnRpYWxUcmFuc2ZlcixcbiAgQ29uZmlkZW50aWFsV2l0aGRyYXcsXG4gIENvbmZpZ3VyZUNvbmZpZGVudGlhbFRyYW5zZmVyQWNjb3VudCxcbiAgSW5zdHJ1Y3Rpb25QYXJhbXMsXG4gIE1lbW8sXG4gIFZlcmlmeUVxdWFsaXR5UHJvb2YsXG4gIFZlcmlmeVB1YmtleVZhbGlkaXR5LFxuICBWZXJpZnlSYW5nZVByb29mLFxuICBWZXJpZnlWYWxpZGl0eVByb29mLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGNvbXBpbGVUcmFuc2FjdGlvbk1lc3NhZ2UgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24vY29tcGlsZVRyYW5zYWN0aW9uTWVzc2FnZSc7XG5pbXBvcnQgeyBzZXJpYWxpemVXaXJlVHJhbnNhY3Rpb24gfSBmcm9tICcuL3NlcmlhbGl6YXRpb24vd2lyZS10cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBzb2xJbnN0cnVjdGlvbkZhY3RvcnkgfSBmcm9tICcuL3NvbEluc3RydWN0aW9uRmFjdG9yeSc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbi8qKlxuICogQnVpbGRlciBmb3IgVG9rZW4tMjAyMiBjb25maWRlbnRpYWwgdHJhbnNmZXIgdHJhbnNhY3Rpb25zLlxuICpcbiAqIFByb3ZpZGVzIHR5cGUtc2FmZSBmbHVlbnQgc2V0dGVycyBmb3IgdGhlIGZvbGxvd2luZyBDVCBpbnN0cnVjdGlvbnM6XG4gKiAtIENvbmZpZ3VyZUFjY291bnQgKHN0YW5kYWxvbmUsIHdpdGggVmVyaWZ5UHVia2V5VmFsaWRpdHkgcHJvb2YpXG4gKiAtIEFwcGx5UGVuZGluZ0JhbGFuY2UgKGFsd2F5cyBpbnN0cnVjdGlvbiAjMSBpbiB2MSBzcGVuZCB0eHMsIGlkZW1wb3RlbnQpXG4gKiAtIERlcG9zaXQgKHB1YmxpYyDihpIgY29uZmlkZW50aWFsIGNvbnZlcnNpb24pXG4gKiAtIFdpdGhkcmF3IChjb25maWRlbnRpYWwg4oaSIHB1YmxpYyBjb252ZXJzaW9uLCB3aXRoIGVxdWFsaXR5ICsgcmFuZ2UgcHJvb2ZzKVxuICogLSBUcmFuc2ZlciAoY29uZmlkZW50aWFsIOKGkiBjb25maWRlbnRpYWwsIHdpdGggZXF1YWxpdHkgKyB2YWxpZGl0eSArIHJhbmdlIHByb29mcylcbiAqIC0gVmVyaWZ5UHVia2V5VmFsaWRpdHkgLyBWZXJpZnlFcXVhbGl0eSAvIFZlcmlmeVZhbGlkaXR5IC8gVmVyaWZ5UmFuZ2UgcHJvb2YgaW5zdHJ1Y3Rpb25zXG4gKlxuICogSW5zdHJ1Y3Rpb24gYnVpbGRlcnMgYXJlIHYwL3YxLWFnbm9zdGljOiB0aGV5IHByb2R1Y2UgaW5zdHJ1Y3Rpb24gZGF0YSBhbmRcbiAqIGFjY291bnQgbWV0YXMgb25seS4gVGhlIGNhbGxlciAoV2FsbGV0IFBsYXRmb3JtKSBhc3NlbWJsZXMgdGhlbSBpbnRvIHYxXG4gKiB0cmFuc2FjdGlvbnMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRDb25maWRlbnRpYWxUcmFuc2ZlckJ1aWxkZXIoKTtcbiAqIGJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2toYXNoKS5zZW5kZXIocGF5ZXIpO1xuICogYnVpbGRlci5jb25maWd1cmVBY2NvdW50KHsgdG9rZW5BZGRyZXNzLCBtaW50QWRkcmVzcywgYXV0aG9yaXR5QWRkcmVzcywgLi4uIH0pO1xuICogYnVpbGRlci52ZXJpZnlQdWJrZXlWYWxpZGl0eSh7IHByb29mRGF0YSB9KTtcbiAqIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25maWRlbnRpYWxUcmFuc2ZlckJ1aWxkZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcml2YXRlIF9jdEluc3RydWN0aW9uczogSW5zdHJ1Y3Rpb25QYXJhbXNbXSA9IFtdO1xuICBwcml2YXRlIF92ZXJzaW9uPzogU29sVHJhbnNhY3Rpb25WZXJzaW9uO1xuICBwcml2YXRlIF92MVRyYW5zYWN0aW9uQ29uZmlnPzogU29sVjFUcmFuc2FjdGlvbkNvbmZpZztcblxuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oX2NvaW5Db25maWcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkNvbmZpZGVudGlhbFRyYW5zZmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgU29sYW5hIHRyYW5zYWN0aW9uIHZlcnNpb24uXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGxlZ2FjeSB1bnRpbCBzZXQuIFdoZW4gc2V0IHRvIGAxYCwgdGhlIGJ1aWxkZXIgYXNzZW1ibGVzIGEgdjFcbiAgICogKFNJTUQtMDI5Ni8wMzg1KSB0cmFuc2FjdGlvbjogdmVyc2lvbiBieXRlIGAweDgxYCwgYW4gaW5saW5lIGB0cmFuc2FjdGlvbkNvbmZpZ2BcbiAgICogaW5zdGVhZCBvZiBDb21wdXRlQnVkZ2V0IGluc3RydWN0aW9ucywgbm8gYWRkcmVzcyBsb29rdXAgdGFibGVzLCBhbmQgYVxuICAgKiBtZXNzYWdlLWZpcnN0IHdpcmUgZm9ybWF0IHdpdGggc2lnbmF0dXJlcyBhcHBlbmRlZC5cbiAgICpcbiAgICogQHBhcmFtIHZlcnNpb24gLSB0aGUgdHJhbnNhY3Rpb24gdmVyc2lvbiAoMCA9IHYwLCAxID0gdjEpXG4gICAqIEByZXR1cm5zIHt0aGlzfSBUaGlzIGJ1aWxkZXJcbiAgICovXG4gIHZlcnNpb24odmVyc2lvbjogU29sVHJhbnNhY3Rpb25WZXJzaW9uKTogdGhpcyB7XG4gICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB2MSB0cmFuc2FjdGlvbiBjb25maWcgKGNvbXB1dGUgdW5pdCBsaW1pdCwgaGVhcCBzaXplLCBsb2FkZWQgYWNjb3VudHNcbiAgICogZGF0YSBzaXplIGxpbWl0LCBhbmQgcHJpb3JpdHkgZmVlIGFzIHRvdGFsIGxhbXBvcnRzKS4gUmVxdWlyZWQgd2hlblxuICAgKiBgdmVyc2lvbigxKWAgaXMgc2V0LlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gdGhlIHYxIHRyYW5zYWN0aW9uIGNvbmZpZ1xuICAgKiBAcmV0dXJucyB7dGhpc30gVGhpcyBidWlsZGVyXG4gICAqL1xuICB0cmFuc2FjdGlvbkNvbmZpZyhjb25maWc6IFNvbFYxVHJhbnNhY3Rpb25Db25maWcpOiB0aGlzIHtcbiAgICB0aGlzLl92MVRyYW5zYWN0aW9uQ29uZmlnID0gY29uZmlnO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSB6ay1lbGdhbWFsLXByb29mIHByb2dyYW0gaWQuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRoZSBjYW5vbmljYWwgb24tY2hhaW4gcHJvZ3JhbSBpZCAoYFprRTFHYW1hMVByb29mMTExLi4uYClcbiAgICogd2hpY2ggaXMgdGhlIHNhbWUgYWNyb3NzIG1haW5uZXQsIGRldm5ldCwgYW5kIHRlc3RuZXQuIE92ZXJyaWRlIG9ubHlcbiAgICogd2hlbiB0YXJnZXRpbmcgYSBjdXN0b20gZGVwbG95bWVudC5cbiAgICpcbiAgICogQHBhcmFtIHByb2dyYW1JZCAtIGJhc2U1OCBlbmNvZGVkIHByb2dyYW0gaWRcbiAgICovXG4gIHprUHJvb2ZQcm9ncmFtSWQocHJvZ3JhbUlkOiBzdHJpbmcpOiB0aGlzIHtcbiAgICBhc3NlcnQocHJvZ3JhbUlkLCAnTWlzc2luZyBwcm9ncmFtSWQgcGFyYW0nKTtcbiAgICB0aGlzLl96a1Byb29mUHJvZ3JhbUlkID0gcHJvZ3JhbUlkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGluaXRCdWlsZGVyKHR4OiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHN1cGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB0aGlzLl9jdEluc3RydWN0aW9ucyA9IFtdO1xuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSkge1xuICAgICAgc3dpdGNoIChpbnN0cnVjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ29uZmlndXJlQ29uZmlkZW50aWFsVHJhbnNmZXJBY2NvdW50OlxuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkFwcGx5UGVuZGluZ0JhbGFuY2U6XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ29uZmlkZW50aWFsRGVwb3NpdDpcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Db25maWRlbnRpYWxXaXRoZHJhdzpcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Db25maWRlbnRpYWxUcmFuc2ZlcjpcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5WZXJpZnlQdWJrZXlWYWxpZGl0eTpcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5WZXJpZnlFcXVhbGl0eVByb29mOlxuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlZlcmlmeVZhbGlkaXR5UHJvb2Y6XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVmVyaWZ5UmFuZ2VQcm9vZjpcbiAgICAgICAgICB0aGlzLl9jdEluc3RydWN0aW9ucy5wdXNoKGluc3RydWN0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgQ29uZmlndXJlQWNjb3VudCBpbnN0cnVjdGlvbiB0byB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIE9uZS10aW1lIEFUQSBzZXR1cCDigJQgcmVnaXN0ZXJzIEVsR2FtYWwgcHVia2V5ICsgQUVTIHplcm8gY2lwaGVydGV4dC5cbiAgICogTXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIFZlcmlmeVB1YmtleVZhbGlkaXR5IHByb29mIGluc3RydWN0aW9uLlxuICAgKi9cbiAgY29uZmlndXJlQWNjb3VudChwYXJhbXM6IENvbmZpZ3VyZUNvbmZpZGVudGlhbFRyYW5zZmVyQWNjb3VudFsncGFyYW1zJ10pOiB0aGlzIHtcbiAgICBhc3NlcnQocGFyYW1zLnRva2VuQWRkcmVzcywgJ01pc3NpbmcgdG9rZW5BZGRyZXNzIHBhcmFtJyk7XG4gICAgYXNzZXJ0KHBhcmFtcy5taW50QWRkcmVzcywgJ01pc3NpbmcgbWludEFkZHJlc3MgcGFyYW0nKTtcbiAgICBhc3NlcnQocGFyYW1zLmF1dGhvcml0eUFkZHJlc3MsICdNaXNzaW5nIGF1dGhvcml0eUFkZHJlc3MgcGFyYW0nKTtcbiAgICBhc3NlcnQocGFyYW1zLmRlY3J5cHRhYmxlWmVyb0JhbGFuY2UsICdNaXNzaW5nIGRlY3J5cHRhYmxlWmVyb0JhbGFuY2UgcGFyYW0nKTtcbiAgICBhc3NlcnQocGFyYW1zLm1heGltdW1QZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXIsICdNaXNzaW5nIG1heGltdW1QZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXIgcGFyYW0nKTtcblxuICAgIHRoaXMuX2N0SW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ29uZmlndXJlQ29uZmlkZW50aWFsVHJhbnNmZXJBY2NvdW50LFxuICAgICAgcGFyYW1zLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBBcHBseVBlbmRpbmdCYWxhbmNlIGluc3RydWN0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQ3JlZGl0cyBwZW5kaW5nIGJhbGFuY2UgaW50byBhdmFpbGFibGUgYmFsYW5jZS4gSWRlbXBvdGVudCAobm8tb3AgaWYgMCBwZW5kaW5nKS5cbiAgICogSW4gdjEgdHJhbnNhY3Rpb25zLCB0aGlzIHNob3VsZCBhbHdheXMgYmUgaW5zdHJ1Y3Rpb24gIzEuXG4gICAqL1xuICBhcHBseVBlbmRpbmdCYWxhbmNlKHBhcmFtczogQXBwbHlQZW5kaW5nQmFsYW5jZVsncGFyYW1zJ10pOiB0aGlzIHtcbiAgICBhc3NlcnQocGFyYW1zLnRva2VuQWRkcmVzcywgJ01pc3NpbmcgdG9rZW5BZGRyZXNzIHBhcmFtJyk7XG4gICAgYXNzZXJ0KHBhcmFtcy5hdXRob3JpdHlBZGRyZXNzLCAnTWlzc2luZyBhdXRob3JpdHlBZGRyZXNzIHBhcmFtJyk7XG4gICAgYXNzZXJ0KHBhcmFtcy5leHBlY3RlZFBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlciwgJ01pc3NpbmcgZXhwZWN0ZWRQZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXIgcGFyYW0nKTtcbiAgICBhc3NlcnQocGFyYW1zLm5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZSwgJ01pc3NpbmcgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlIHBhcmFtJyk7XG5cbiAgICB0aGlzLl9jdEluc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkFwcGx5UGVuZGluZ0JhbGFuY2UsXG4gICAgICBwYXJhbXMsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgRGVwb3NpdCBpbnN0cnVjdGlvbiB0byB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIE1vdmVzIHB1YmxpYyBTUEwgdG9rZW5zIGludG8gY29uZmlkZW50aWFsIHBlbmRpbmcgYmFsYW5jZS4gTm8gcHJvb2YgcmVxdWlyZWQuXG4gICAqL1xuICBjb25maWRlbnRpYWxEZXBvc2l0KHBhcmFtczogQ29uZmlkZW50aWFsRGVwb3NpdFsncGFyYW1zJ10pOiB0aGlzIHtcbiAgICBhc3NlcnQocGFyYW1zLnRva2VuQWRkcmVzcywgJ01pc3NpbmcgdG9rZW5BZGRyZXNzIHBhcmFtJyk7XG4gICAgYXNzZXJ0KHBhcmFtcy5taW50QWRkcmVzcywgJ01pc3NpbmcgbWludEFkZHJlc3MgcGFyYW0nKTtcbiAgICBhc3NlcnQocGFyYW1zLmF1dGhvcml0eUFkZHJlc3MsICdNaXNzaW5nIGF1dGhvcml0eUFkZHJlc3MgcGFyYW0nKTtcbiAgICBhc3NlcnQocGFyYW1zLmFtb3VudCwgJ01pc3NpbmcgYW1vdW50IHBhcmFtJyk7XG5cbiAgICB0aGlzLl9jdEluc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNvbmZpZGVudGlhbERlcG9zaXQsXG4gICAgICBwYXJhbXMsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgV2l0aGRyYXcgaW5zdHJ1Y3Rpb24gdG8gdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBNb3ZlcyBjb25maWRlbnRpYWwgYXZhaWxhYmxlIGJhbGFuY2UgdG8gcHVibGljIGJhbGFuY2UuXG4gICAqIFJlcXVpcmVzIGVxdWFsaXR5ICsgcmFuZ2UgcHJvb2YgdmVyaWZpY2F0aW9uIGluc3RydWN0aW9ucy5cbiAgICovXG4gIGNvbmZpZGVudGlhbFdpdGhkcmF3KHBhcmFtczogQ29uZmlkZW50aWFsV2l0aGRyYXdbJ3BhcmFtcyddKTogdGhpcyB7XG4gICAgYXNzZXJ0KHBhcmFtcy50b2tlbkFkZHJlc3MsICdNaXNzaW5nIHRva2VuQWRkcmVzcyBwYXJhbScpO1xuICAgIGFzc2VydChwYXJhbXMubWludEFkZHJlc3MsICdNaXNzaW5nIG1pbnRBZGRyZXNzIHBhcmFtJyk7XG4gICAgYXNzZXJ0KHBhcmFtcy5hdXRob3JpdHlBZGRyZXNzLCAnTWlzc2luZyBhdXRob3JpdHlBZGRyZXNzIHBhcmFtJyk7XG4gICAgYXNzZXJ0KHBhcmFtcy5hbW91bnQsICdNaXNzaW5nIGFtb3VudCBwYXJhbScpO1xuICAgIGFzc2VydChwYXJhbXMubmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlLCAnTWlzc2luZyBuZXdEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2UgcGFyYW0nKTtcblxuICAgIHRoaXMuX2N0SW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ29uZmlkZW50aWFsV2l0aGRyYXcsXG4gICAgICBwYXJhbXMsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY29uZmlkZW50aWFsIFRyYW5zZmVyIGluc3RydWN0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogUmVxdWlyZXMgZXF1YWxpdHkgKyBjaXBoZXJ0ZXh0IHZhbGlkaXR5ICsgcmFuZ2UgcHJvb2YgdmVyaWZpY2F0aW9uIGluc3RydWN0aW9ucy5cbiAgICovXG4gIGNvbmZpZGVudGlhbFRyYW5zZmVyKHBhcmFtczogQ29uZmlkZW50aWFsVHJhbnNmZXJbJ3BhcmFtcyddKTogdGhpcyB7XG4gICAgYXNzZXJ0KHBhcmFtcy5zb3VyY2VUb2tlbkFkZHJlc3MsICdNaXNzaW5nIHNvdXJjZVRva2VuQWRkcmVzcyBwYXJhbScpO1xuICAgIGFzc2VydChwYXJhbXMubWludEFkZHJlc3MsICdNaXNzaW5nIG1pbnRBZGRyZXNzIHBhcmFtJyk7XG4gICAgYXNzZXJ0KHBhcmFtcy5kZXN0aW5hdGlvblRva2VuQWRkcmVzcywgJ01pc3NpbmcgZGVzdGluYXRpb25Ub2tlbkFkZHJlc3MgcGFyYW0nKTtcbiAgICBhc3NlcnQocGFyYW1zLmF1dGhvcml0eUFkZHJlc3MsICdNaXNzaW5nIGF1dGhvcml0eUFkZHJlc3MgcGFyYW0nKTtcbiAgICBhc3NlcnQocGFyYW1zLm5ld1NvdXJjZURlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZSwgJ01pc3NpbmcgbmV3U291cmNlRGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlIHBhcmFtJyk7XG4gICAgYXNzZXJ0KHBhcmFtcy50cmFuc2ZlckFtb3VudEF1ZGl0b3JDaXBoZXJ0ZXh0TG8sICdNaXNzaW5nIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRMbyBwYXJhbScpO1xuICAgIGFzc2VydChwYXJhbXMudHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dEhpLCAnTWlzc2luZyB0cmFuc2ZlckFtb3VudEF1ZGl0b3JDaXBoZXJ0ZXh0SGkgcGFyYW0nKTtcblxuICAgIHRoaXMuX2N0SW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ29uZmlkZW50aWFsVHJhbnNmZXIsXG4gICAgICBwYXJhbXMsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgVmVyaWZ5UHVia2V5VmFsaWRpdHkgcHJvb2YgaW5zdHJ1Y3Rpb24gKHVzZWQgd2l0aCBDb25maWd1cmVBY2NvdW50KS5cbiAgICovXG4gIHZlcmlmeVB1YmtleVZhbGlkaXR5KHBhcmFtczogVmVyaWZ5UHVia2V5VmFsaWRpdHlbJ3BhcmFtcyddKTogdGhpcyB7XG4gICAgdGhpcy5fY3RJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5WZXJpZnlQdWJrZXlWYWxpZGl0eSxcbiAgICAgIHBhcmFtcyxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBWZXJpZnlDaXBoZXJ0ZXh0Q29tbWl0bWVudEVxdWFsaXR5IHByb29mIGluc3RydWN0aW9uICh1c2VkIHdpdGggVHJhbnNmZXIgYW5kIFdpdGhkcmF3KS5cbiAgICovXG4gIHZlcmlmeUVxdWFsaXR5UHJvb2YocGFyYW1zOiBWZXJpZnlFcXVhbGl0eVByb29mWydwYXJhbXMnXSk6IHRoaXMge1xuICAgIHRoaXMuX2N0SW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVmVyaWZ5RXF1YWxpdHlQcm9vZixcbiAgICAgIHBhcmFtcyxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBWZXJpZnlCYXRjaGVkR3JvdXBlZENpcGhlcnRleHQzSGFuZGxlc1ZhbGlkaXR5IHByb29mIGluc3RydWN0aW9uICh1c2VkIHdpdGggVHJhbnNmZXIpLlxuICAgKi9cbiAgdmVyaWZ5VmFsaWRpdHlQcm9vZihwYXJhbXM6IFZlcmlmeVZhbGlkaXR5UHJvb2ZbJ3BhcmFtcyddKTogdGhpcyB7XG4gICAgdGhpcy5fY3RJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5WZXJpZnlWYWxpZGl0eVByb29mLFxuICAgICAgcGFyYW1zLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIFZlcmlmeUJhdGNoZWRSYW5nZVByb29mVTEyOCBwcm9vZiBpbnN0cnVjdGlvbiAodXNlZCB3aXRoIFRyYW5zZmVyKS5cbiAgICovXG4gIHZlcmlmeVJhbmdlUHJvb2YocGFyYW1zOiBWZXJpZnlSYW5nZVByb29mWydwYXJhbXMnXSk6IHRoaXMge1xuICAgIHRoaXMuX2N0SW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVmVyaWZ5UmFuZ2VQcm9vZixcbiAgICAgIHBhcmFtcyxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgYXNzZXJ0KHRoaXMuX2N0SW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDAsICdBdCBsZWFzdCBvbmUgY29uZmlkZW50aWFsIHRyYW5zZmVyIGluc3RydWN0aW9uIG11c3QgYmUgc3BlY2lmaWVkJyk7XG5cbiAgICBpZiAodGhpcy5fdmVyc2lvbiA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRWMSgpO1xuICAgIH1cblxuICAgIHRoaXMuX2luc3RydWN0aW9uc0RhdGEgPSBbLi4udGhpcy5fY3RJbnN0cnVjdGlvbnNdO1xuXG4gICAgcmV0dXJuIGF3YWl0IHN1cGVyLmJ1aWxkSW1wbGVtZW50YXRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIHYxIChTSU1ELTAyOTYvMDM4NSkgY29uZmlkZW50aWFsIHRyYW5zZmVyIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBBc3NlbWJsZXMgdGhlIENUIGluc3RydWN0aW9ucyB2aWEgdGhlIHNoYXJlZCBpbnN0cnVjdGlvbiBmYWN0b3J5LCBjb21waWxlc1xuICAgKiBhbmQgc2VyaWFsaXplcyBhIHYxIG1lc3NhZ2Ugd2l0aCB0aGUgaW5saW5lIHRyYW5zYWN0aW9uIGNvbmZpZywgc2lnbnMgdGhlXG4gICAqIG1lc3NhZ2UgYnl0ZXMgd2l0aCB0aGUgYnVpbGRlcidzIHNpZ25lcnMsIGFuZCBzdG9yZXMgdGhlIHJlc3VsdGluZyB3aXJlXG4gICAqIGJ5dGVzIGZvciBicm9hZGNhc3QuIEFsc28gcG9wdWxhdGVzIGEgbWV0YWRhdGEtb25seSBTb2xUcmFuc2FjdGlvbiBzbyB0aGVcbiAgICogdHJhbnNhY3Rpb24gSlNPTiBhbmQgaW5wdXQvb3V0cHV0IGV4dHJhY3Rpb24gcmVtYWluIHVzYWJsZS5cbiAgICpcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9ufSBUaGUgYnVpbHQgdHJhbnNhY3Rpb24gaG9sZGluZyB0aGUgdjEgd2lyZSBieXRlc1xuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFYxKCk6IFRyYW5zYWN0aW9uIHtcbiAgICBhc3NlcnQodGhpcy5fc2VuZGVyLCBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdzZW5kZXIgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJykpO1xuICAgIGFzc2VydCh0aGlzLl9yZWNlbnRCbG9ja2hhc2gsIG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ3JlY2VudCBibG9ja2hhc2ggaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJykpO1xuICAgIGFzc2VydCh0aGlzLl92MVRyYW5zYWN0aW9uQ29uZmlnLCAndHJhbnNhY3Rpb25Db25maWcgaXMgcmVxdWlyZWQgdG8gYnVpbGQgYSB2MSBjb25maWRlbnRpYWwgdHJhbnNmZXIgdHJhbnNhY3Rpb24nKTtcblxuICAgIC8vIEFwcGx5UGVuZGluZ0JhbGFuY2UgbXVzdCByZW1haW4gaW5zdHJ1Y3Rpb24gIzEgaW4gdjEgc3BlbmQgdHhzIChpdCBpcyBpZGVtcG90ZW50KSxcbiAgICAvLyByZWdhcmRsZXNzIG9mIHRoZSBvcmRlciB0aGUgY2FsbGVyIGFkZGVkIGluc3RydWN0aW9ucy5cbiAgICB0aGlzLl9jdEluc3RydWN0aW9ucyA9IFtcbiAgICAgIC4uLnRoaXMuX2N0SW5zdHJ1Y3Rpb25zLmZpbHRlcigoaSkgPT4gaS50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5BcHBseVBlbmRpbmdCYWxhbmNlKSxcbiAgICAgIC4uLnRoaXMuX2N0SW5zdHJ1Y3Rpb25zLmZpbHRlcigoaSkgPT4gaS50eXBlICE9PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5BcHBseVBlbmRpbmdCYWxhbmNlKSxcbiAgICBdO1xuXG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIHRoaXMuX2N0SW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBpbnN0cnVjdGlvbnMucHVzaCguLi5zb2xJbnN0cnVjdGlvbkZhY3RvcnkoaW5zdHJ1Y3Rpb24sIHRoaXMuX3prUHJvb2ZQcm9ncmFtSWQpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbWVtbykge1xuICAgICAgY29uc3QgbWVtb0RhdGE6IE1lbW8gPSB7XG4gICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sXG4gICAgICAgIHBhcmFtczogeyBtZW1vOiB0aGlzLl9tZW1vIH0sXG4gICAgICB9O1xuICAgICAgdGhpcy5fY3RJbnN0cnVjdGlvbnMucHVzaChtZW1vRGF0YSk7XG4gICAgICBpbnN0cnVjdGlvbnMucHVzaCguLi5zb2xJbnN0cnVjdGlvbkZhY3RvcnkobWVtb0RhdGEpKTtcbiAgICB9XG5cbiAgICBjb25zdCBmZWVQYXllciA9IHRoaXMuX2ZlZVBheWVyID8gbmV3IFB1YmxpY0tleSh0aGlzLl9mZWVQYXllcikgOiBuZXcgUHVibGljS2V5KHRoaXMuX3NlbmRlcik7XG4gICAgY29uc3QgbWVzc2FnZUJ5dGVzID0gY29tcGlsZVRyYW5zYWN0aW9uTWVzc2FnZSh7XG4gICAgICB2ZXJzaW9uOiAxLFxuICAgICAgaW5zdHJ1Y3Rpb25zLFxuICAgICAgZmVlUGF5ZXIsXG4gICAgICByZWNlbnRCbG9ja2hhc2g6IHRoaXMuX3JlY2VudEJsb2NraGFzaCxcbiAgICAgIHRyYW5zYWN0aW9uQ29uZmlnOiB0aGlzLl92MVRyYW5zYWN0aW9uQ29uZmlnLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2lnbmF0dXJlczogVWludDhBcnJheVtdID0gW107XG4gICAgZm9yIChjb25zdCBzaWduZXIgb2YgdGhpcy5fc2lnbmVycykge1xuICAgICAgY29uc3Qgc2VjcmV0S2V5ID0gc2lnbmVyLmdldEtleXModHJ1ZSkucHJ2O1xuICAgICAgYXNzZXJ0KHNlY3JldEtleSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXksICdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gICAgICBzaWduYXR1cmVzLnB1c2gobmFjbC5zaWduLmRldGFjaGVkKG1lc3NhZ2VCeXRlcywgc2VjcmV0S2V5KSk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc2lnbmF0dXJlIG9mIHRoaXMuZ2V0QWRkaXRpb25hbFNpZ25hdHVyZXMoKSkge1xuICAgICAgc2lnbmF0dXJlcy5wdXNoKG5ldyBVaW50OEFycmF5KHNpZ25hdHVyZS5zaWduYXR1cmUpKTtcbiAgICB9XG5cbiAgICBjb25zdCB2MVdpcmUgPSBzZXJpYWxpemVXaXJlVHJhbnNhY3Rpb24obWVzc2FnZUJ5dGVzLCBzaWduYXR1cmVzKTtcblxuICAgIHRoaXMuX3RyYW5zYWN0aW9uLnYxVHJhbnNhY3Rpb25CeXRlcyA9IHYxV2lyZTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi52MU1lc3NhZ2VCeXRlcyA9IG1lc3NhZ2VCeXRlcztcblxuICAgIC8vIFBvcHVsYXRlIGEgbWV0YWRhdGEtb25seSBTb2xUcmFuc2FjdGlvbiBzbyB0b0pzb24gLyBsb2FkSW5wdXRzQW5kT3V0cHV0cyB3b3JrLlxuICAgIGNvbnN0IG1ldGFUeCA9IG5ldyBTb2xUcmFuc2FjdGlvbigpO1xuICAgIG1ldGFUeC5mZWVQYXllciA9IGZlZVBheWVyO1xuICAgIG1ldGFUeC5yZWNlbnRCbG9ja2hhc2ggPSB0aGlzLl9yZWNlbnRCbG9ja2hhc2g7XG4gICAgbWV0YVR4LmFkZCguLi5pbnN0cnVjdGlvbnMpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uLnNvbFRyYW5zYWN0aW9uID0gbWV0YVR4O1xuXG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb25UeXBlKHRoaXMudHJhbnNhY3Rpb25UeXBlKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5zZXRJbnN0cnVjdGlvbnNEYXRhKHRoaXMuX2N0SW5zdHJ1Y3Rpb25zKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5sb2FkSW5wdXRzQW5kT3V0cHV0cygpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICB9XG59XG4iXX0=
|
|
341
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlkZW50aWFsVHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb25maWRlbnRpYWxUcmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsbURBQTZIO0FBQzdILDZDQUFtRztBQUNuRywwREFBNkI7QUFDN0IsK0NBQTRDO0FBQzVDLDZEQUEwRDtBQUMxRCwyQ0FBc0Q7QUFjdEQseUZBQXNGO0FBQ3RGLCtEQUFvRTtBQUNwRSx1RUFBNEU7QUFDNUUsbUVBQWdFO0FBQ2hFLGlFQUE2RTtBQUM3RSxvREFBNEI7QUFFNUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBYSwyQkFBNEIsU0FBUSx1Q0FBa0I7SUFLakUsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFMYixvQkFBZSxHQUF3QixFQUFFLENBQUM7UUFNaEQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHlCQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELElBQWMsZUFBZTtRQUMzQixPQUFPLDBCQUFlLENBQUMsb0JBQW9CLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxPQUFPLENBQUMsT0FBOEI7UUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILGlCQUFpQixDQUFDLE1BQThCO1FBQzlDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxNQUFNLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxnQkFBZ0IsQ0FBQyxTQUFpQjtRQUNoQyxJQUFBLGdCQUFNLEVBQUMsU0FBUyxFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDN0MsSUFBSSxD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QUFDO1FBQzNELElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUV6QyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztDQUNGO0FBeFZELGtFQXdWQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgU29sVHJhbnNhY3Rpb25WZXJzaW9uLCBTb2xWMVRyYW5zYWN0aW9uQ29uZmlnLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBQdWJsaWNLZXksIFRyYW5zYWN0aW9uIGFzIFNvbFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbkluc3RydWN0aW9uIH0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCBuYWNsIGZyb20gJ3R3ZWV0bmFjbCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBBcHBseVBlbmRpbmdCYWxhbmNlLFxuICBDb25maWRlbnRpYWxEZXBvc2l0LFxuICBDb25maWRlbnRpYWxUcmFuc2ZlcixcbiAgQ29uZmlkZW50aWFsV2l0aGRyYXcsXG4gIENvbmZpZ3VyZUNvbmZpZGVudGlhbFRyYW5zZmVyQWNjb3VudCxcbiAgSW5zdHJ1Y3Rpb25QYXJhbXMsXG4gIE1lbW8sXG4gIFZlcmlmeUVxdWFsaXR5UHJvb2YsXG4gIFZlcmlmeVB1YmtleVZhbGlkaXR5LFxuICBWZXJpZnlSYW5nZVByb29mLFxuICBWZXJpZnlWYWxpZGl0eVByb29mLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGNvbXBpbGVUcmFuc2FjdGlvbk1lc3NhZ2UgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24vY29tcGlsZVRyYW5zYWN0aW9uTWVzc2FnZSc7XG5pbXBvcnQgeyBkZWNvZGVWMU1lc3NhZ2UgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24vY29kZWNzL3YxL21lc3NhZ2UnO1xuaW1wb3J0IHsgc2VyaWFsaXplV2lyZVRyYW5zYWN0aW9uIH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3dpcmUtdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgc29sSW5zdHJ1Y3Rpb25GYWN0b3J5IH0gZnJvbSAnLi9zb2xJbnN0cnVjdGlvbkZhY3RvcnknO1xuaW1wb3J0IHsgYnVpbGRBZHZhbmNlTm9uY2VBY2NvdW50SW5zdHJ1Y3Rpb24gfSBmcm9tICcuL3YxVHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuLyoqXG4gKiBCdWlsZGVyIGZvciBUb2tlbi0yMDIyIGNvbmZpZGVudGlhbCB0cmFuc2ZlciB0cmFuc2FjdGlvbnMuXG4gKlxuICogUHJvdmlkZXMgdHlwZS1zYWZlIGZsdWVudCBzZXR0ZXJzIGZvciB0aGUgZm9sbG93aW5nIENUIGluc3RydWN0aW9uczpcbiAqIC0gQ29uZmlndXJlQWNjb3VudCAoc3RhbmRhbG9uZSwgd2l0aCBWZXJpZnlQdWJrZXlWYWxpZGl0eSBwcm9vZilcbiAqIC0gQXBwbHlQZW5kaW5nQmFsYW5jZSAoYWx3YXlzIGluc3RydWN0aW9uICMxIGluIHYxIHNwZW5kIHR4cywgaWRlbXBvdGVudClcbiAqIC0gRGVwb3NpdCAocHVibGljIOKGkiBjb25maWRlbnRpYWwgY29udmVyc2lvbilcbiAqIC0gV2l0aGRyYXcgKGNvbmZpZGVudGlhbCDihpIgcHVibGljIGNvbnZlcnNpb24sIHdpdGggZXF1YWxpdHkgKyByYW5nZSBwcm9vZnMpXG4gKiAtIFRyYW5zZmVyIChjb25maWRlbnRpYWwg4oaSIGNvbmZpZGVudGlhbCwgd2l0aCBlcXVhbGl0eSArIHZhbGlkaXR5ICsgcmFuZ2UgcHJvb2ZzKVxuICogLSBWZXJpZnlQdWJrZXlWYWxpZGl0eSAvIFZlcmlmeUVxdWFsaXR5IC8gVmVyaWZ5VmFsaWRpdHkgLyBWZXJpZnlSYW5nZSBwcm9vZiBpbnN0cnVjdGlvbnNcbiAqXG4gKiBJbnN0cnVjdGlvbiBidWlsZGVycyBhcmUgdjAvdjEtYWdub3N0aWM6IHRoZXkgcHJvZHVjZSBpbnN0cnVjdGlvbiBkYXRhIGFuZFxuICogYWNjb3VudCBtZXRhcyBvbmx5LiBUaGUgY2FsbGVyIChXYWxsZXQgUGxhdGZvcm0pIGFzc2VtYmxlcyB0aGVtIGludG8gdjFcbiAqIHRyYW5zYWN0aW9ucyBpbiB0aGUgY29ycmVjdCBvcmRlci5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldENvbmZpZGVudGlhbFRyYW5zZmVyQnVpbGRlcigpO1xuICogYnVpbGRlci5ub25jZShyZWNlbnRCbG9ja2hhc2gpLnNlbmRlcihwYXllcik7XG4gKiBidWlsZGVyLmNvbmZpZ3VyZUFjY291bnQoeyB0b2tlbkFkZHJlc3MsIG1pbnRBZGRyZXNzLCBhdXRob3JpdHlBZGRyZXNzLCAuLi4gfSk7XG4gKiBidWlsZGVyLnZlcmlmeVB1YmtleVZhbGlkaXR5KHsgcHJvb2ZEYXRhIH0pO1xuICogY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIENvbmZpZGVudGlhbFRyYW5zZmVyQnVpbGRlciBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByaXZhdGUgX2N0SW5zdHJ1Y3Rpb25zOiBJbnN0cnVjdGlvblBhcmFtc1tdID0gW107XG4gIHByaXZhdGUgX3ZlcnNpb24/OiBTb2xUcmFuc2FjdGlvblZlcnNpb247XG4gIHByaXZhdGUgX3YxVHJhbnNhY3Rpb25Db25maWc/OiBTb2xWMVRyYW5zYWN0aW9uQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihfY29pbkNvbmZpZyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQ29uZmlkZW50aWFsVHJhbnNmZXI7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBTb2xhbmEgdHJhbnNhY3Rpb24gdmVyc2lvbi5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gbGVnYWN5IHVudGlsIHNldC4gV2hlbiBzZXQgdG8gYDFgLCB0aGUgYnVpbGRlciBhc3NlbWJsZXMgYSB2MVxuICAgKiAoU0lNRC0wMjk2LzAzODUpIHRyYW5zYWN0aW9uOiB2ZXJzaW9uIGJ5dGUgYDB4ODFgLCBhbiBpbmxpbmUgYHRyYW5zYWN0aW9uQ29uZmlnYFxuICAgKiBpbnN0ZWFkIG9mIENvbXB1dGVCdWRnZXQgaW5zdHJ1Y3Rpb25zLCBubyBhZGRyZXNzIGxvb2t1cCB0YWJsZXMsIGFuZCBhXG4gICAqIG1lc3NhZ2UtZmlyc3Qgd2lyZSBmb3JtYXQgd2l0aCBzaWduYXR1cmVzIGFwcGVuZGVkLlxuICAgKlxuICAgKiBAcGFyYW0gdmVyc2lvbiAtIHRoZSB0cmFuc2FjdGlvbiB2ZXJzaW9uICgwID0gdjAsIDEgPSB2MSlcbiAgICogQHJldHVybnMge3RoaXN9IFRoaXMgYnVpbGRlclxuICAgKi9cbiAgdmVyc2lvbih2ZXJzaW9uOiBTb2xUcmFuc2FjdGlvblZlcnNpb24pOiB0aGlzIHtcbiAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHYxIHRyYW5zYWN0aW9uIGNvbmZpZyAoY29tcHV0ZSB1bml0IGxpbWl0LCBoZWFwIHNpemUsIGxvYWRlZCBhY2NvdW50c1xuICAgKiBkYXRhIHNpemUgbGltaXQsIGFuZCBwcmlvcml0eSBmZWUgYXMgdG90YWwgbGFtcG9ydHMpLiBSZXF1aXJlZCB3aGVuXG4gICAqIGB2ZXJzaW9uKDEpYCBpcyBzZXQuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSB0aGUgdjEgdHJhbnNhY3Rpb24gY29uZmlnXG4gICAqIEByZXR1cm5zIHt0aGlzfSBUaGlzIGJ1aWxkZXJcbiAgICovXG4gIHRyYW5zYWN0aW9uQ29uZmlnKGNvbmZpZzogU29sVjFUcmFuc2FjdGlvbkNvbmZpZyk6IHRoaXMge1xuICAgIHRoaXMuX3YxVHJhbnNhY3Rpb25Db25maWcgPSBjb25maWc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIHprLWVsZ2FtYWwtcHJvb2YgcHJvZ3JhbSBpZC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdGhlIGNhbm9uaWNhbCBvbi1jaGFpbiBwcm9ncmFtIGlkIChgWmtFMUdhbWExUHJvb2YxMTEuLi5gKVxuICAgKiB3aGljaCBpcyB0aGUgc2FtZSBhY3Jvc3MgbWFpbm5ldCwgZGV2bmV0LCBhbmQgdGVzdG5ldC4gT3ZlcnJpZGUgb25seVxuICAgKiB3aGVuIHRhcmdldGluZyBhIGN1c3RvbSBkZXBsb3ltZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcHJvZ3JhbUlkIC0gYmFzZTU4IGVuY29kZWQgcHJvZ3JhbSBpZFxuICAgKi9cbiAgemtQcm9vZlByb2dyYW1JZChwcm9ncmFtSWQ6IHN0cmluZyk6IHRoaXMge1xuICAgIGFzc2VydChwcm9ncmFtSWQsICdNaXNzaW5nIHByb2dyYW1JZCBwYXJhbScpO1xuICAgIHRoaXMuX3prUHJvb2ZQcm9ncmFtSWQgPSBwcm9ncmFtSWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgaW5pdEJ1aWxkZXIodHg6IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgc3VwZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHRoaXMuX2N0SW5zdHJ1Y3Rpb25zID0gW107XG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhKSB7XG4gICAgICBzd2l0Y2ggKGluc3RydWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Db25maWd1cmVDb25maWRlbnRpYWxUcmFuc2ZlckFjY291bnQ6XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQXBwbHlQZW5kaW5nQmFsYW5jZTpcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Db25maWRlbnRpYWxEZXBvc2l0OlxuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNvbmZpZGVudGlhbFdpdGhkcmF3OlxuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNvbmZpZGVudGlhbFRyYW5zZmVyOlxuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlZlcmlmeVB1YmtleVZhbGlkaXR5OlxuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlZlcmlmeUVxdWFsaXR5UHJvb2Y6XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVmVyaWZ5VmFsaWRpdHlQcm9vZjpcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5WZXJpZnlSYW5nZVByb29mOlxuICAgICAgICAgIHRoaXMuX2N0SW5zdHJ1Y3Rpb25zLnB1c2goaW5zdHJ1Y3Rpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBDb25maWd1cmVBY2NvdW50IGluc3RydWN0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogT25lLXRpbWUgQVRBIHNldHVwIOKAlCByZWdpc3RlcnMgRWxHYW1hbCBwdWJrZXkgKyBBRVMgemVybyBjaXBoZXJ0ZXh0LlxuICAgKiBNdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgVmVyaWZ5UHVia2V5VmFsaWRpdHkgcHJvb2YgaW5zdHJ1Y3Rpb24uXG4gICAqL1xuICBjb25maWd1cmVBY2NvdW50KHBhcmFtczogQ29uZmlndXJlQ29uZmlkZW50aWFsVHJhbnNmZXJBY2NvdW50WydwYXJhbXMnXSk6IHRoaXMge1xuICAgIGFzc2VydChwYXJhbXMudG9rZW5BZGRyZXNzLCAnTWlzc2luZyB0b2tlbkFkZHJlc3MgcGFyYW0nKTtcbiAgICBhc3NlcnQocGFyYW1zLm1pbnRBZGRyZXNzLCAnTWlzc2luZyBtaW50QWRkcmVzcyBwYXJhbScpO1xuICAgIGFzc2VydChwYXJhbXMuYXV0aG9yaXR5QWRkcmVzcywgJ01pc3NpbmcgYXV0aG9yaXR5QWRkcmVzcyBwYXJhbScpO1xuICAgIGFzc2VydChwYXJhbXMuZGVjcnlwdGFibGVaZXJvQmFsYW5jZSwgJ01pc3NpbmcgZGVjcnlwdGFibGVaZXJvQmFsYW5jZSBwYXJhbScpO1xuICAgIGFzc2VydChwYXJhbXMubWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlciwgJ01pc3NpbmcgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlciBwYXJhbScpO1xuXG4gICAgdGhpcy5fY3RJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Db25maWd1cmVDb25maWRlbnRpYWxUcmFuc2ZlckFjY291bnQsXG4gICAgICBwYXJhbXMsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIEFwcGx5UGVuZGluZ0JhbGFuY2UgaW5zdHJ1Y3Rpb24gdG8gdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBDcmVkaXRzIHBlbmRpbmcgYmFsYW5jZSBpbnRvIGF2YWlsYWJsZSBiYWxhbmNlLiBJZGVtcG90ZW50IChuby1vcCBpZiAwIHBlbmRpbmcpLlxuICAgKiBJbiB2MSB0cmFuc2FjdGlvbnMsIHRoaXMgc2hvdWxkIGFsd2F5cyBiZSBpbnN0cnVjdGlvbiAjMS5cbiAgICovXG4gIGFwcGx5UGVuZGluZ0JhbGFuY2UocGFyYW1zOiBBcHBseVBlbmRpbmdCYWxhbmNlWydwYXJhbXMnXSk6IHRoaXMge1xuICAgIGFzc2VydChwYXJhbXMudG9rZW5BZGRyZXNzLCAnTWlzc2luZyB0b2tlbkFkZHJlc3MgcGFyYW0nKTtcbiAgICBhc3NlcnQocGFyYW1zLmF1dGhvcml0eUFkZHJlc3MsICdNaXNzaW5nIGF1dGhvcml0eUFkZHJlc3MgcGFyYW0nKTtcbiAgICBhc3NlcnQocGFyYW1zLmV4cGVjdGVkUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyLCAnTWlzc2luZyBleHBlY3RlZFBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlciBwYXJhbScpO1xuICAgIGFzc2VydChwYXJhbXMubmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlLCAnTWlzc2luZyBuZXdEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2UgcGFyYW0nKTtcblxuICAgIHRoaXMuX2N0SW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQXBwbHlQZW5kaW5nQmFsYW5jZSxcbiAgICAgIHBhcmFtcyxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBEZXBvc2l0IGluc3RydWN0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogTW92ZXMgcHVibGljIFNQTCB0b2tlbnMgaW50byBjb25maWRlbnRpYWwgcGVuZGluZyBiYWxhbmNlLiBObyBwcm9vZiByZXF1aXJlZC5cbiAgICovXG4gIGNvbmZpZGVudGlhbERlcG9zaXQocGFyYW1zOiBDb25maWRlbnRpYWxEZXBvc2l0WydwYXJhbXMnXSk6IHRoaXMge1xuICAgIGFzc2VydChwYXJhbXMudG9rZW5BZGRyZXNzLCAnTWlzc2luZyB0b2tlbkFkZHJlc3MgcGFyYW0nKTtcbiAgICBhc3NlcnQocGFyYW1zLm1pbnRBZGRyZXNzLCAnTWlzc2luZyBtaW50QWRkcmVzcyBwYXJhbScpO1xuICAgIGFzc2VydChwYXJhbXMuYXV0aG9yaXR5QWRkcmVzcywgJ01pc3NpbmcgYXV0aG9yaXR5QWRkcmVzcyBwYXJhbScpO1xuICAgIGFzc2VydChwYXJhbXMuYW1vdW50LCAnTWlzc2luZyBhbW91bnQgcGFyYW0nKTtcblxuICAgIHRoaXMuX2N0SW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ29uZmlkZW50aWFsRGVwb3NpdCxcbiAgICAgIHBhcmFtcyxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBXaXRoZHJhdyBpbnN0cnVjdGlvbiB0byB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIE1vdmVzIGNvbmZpZGVudGlhbCBhdmFpbGFibGUgYmFsYW5jZSB0byBwdWJsaWMgYmFsYW5jZS5cbiAgICogUmVxdWlyZXMgZXF1YWxpdHkgKyByYW5nZSBwcm9vZiB2ZXJpZmljYXRpb24gaW5zdHJ1Y3Rpb25zLlxuICAgKi9cbiAgY29uZmlkZW50aWFsV2l0aGRyYXcocGFyYW1zOiBDb25maWRlbnRpYWxXaXRoZHJhd1sncGFyYW1zJ10pOiB0aGlzIHtcbiAgICBhc3NlcnQocGFyYW1zLnRva2VuQWRkcmVzcywgJ01pc3NpbmcgdG9rZW5BZGRyZXNzIHBhcmFtJyk7XG4gICAgYXNzZXJ0KHBhcmFtcy5taW50QWRkcmVzcywgJ01pc3NpbmcgbWludEFkZHJlc3MgcGFyYW0nKTtcbiAgICBhc3NlcnQocGFyYW1zLmF1dGhvcml0eUFkZHJlc3MsICdNaXNzaW5nIGF1dGhvcml0eUFkZHJlc3MgcGFyYW0nKTtcbiAgICBhc3NlcnQocGFyYW1zLmFtb3VudCwgJ01pc3NpbmcgYW1vdW50IHBhcmFtJyk7XG4gICAgYXNzZXJ0KHBhcmFtcy5uZXdEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2UsICdNaXNzaW5nIG5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZSBwYXJhbScpO1xuXG4gICAgdGhpcy5fY3RJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Db25maWRlbnRpYWxXaXRoZHJhdyxcbiAgICAgIHBhcmFtcyxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb25maWRlbnRpYWwgVHJhbnNmZXIgaW5zdHJ1Y3Rpb24gdG8gdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBSZXF1aXJlcyBlcXVhbGl0eSArIGNpcGhlcnRleHQgdmFsaWRpdHkgKyByYW5nZSBwcm9vZiB2ZXJpZmljYXRpb24gaW5zdHJ1Y3Rpb25zLlxuICAgKi9cbiAgY29uZmlkZW50aWFsVHJhbnNmZXIocGFyYW1zOiBDb25maWRlbnRpYWxUcmFuc2ZlclsncGFyYW1zJ10pOiB0aGlzIHtcbiAgICBhc3NlcnQocGFyYW1zLnNvdXJjZVRva2VuQWRkcmVzcywgJ01pc3Npbmcgc291cmNlVG9rZW5BZGRyZXNzIHBhcmFtJyk7XG4gICAgYXNzZXJ0KHBhcmFtcy5taW50QWRkcmVzcywgJ01pc3NpbmcgbWludEFkZHJlc3MgcGFyYW0nKTtcbiAgICBhc3NlcnQocGFyYW1zLmRlc3RpbmF0aW9uVG9rZW5BZGRyZXNzLCAnTWlzc2luZyBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyBwYXJhbScpO1xuICAgIGFzc2VydChwYXJhbXMuYXV0aG9yaXR5QWRkcmVzcywgJ01pc3NpbmcgYXV0aG9yaXR5QWRkcmVzcyBwYXJhbScpO1xuICAgIGFzc2VydChwYXJhbXMubmV3U291cmNlRGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlLCAnTWlzc2luZyBuZXdTb3VyY2VEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2UgcGFyYW0nKTtcbiAgICBhc3NlcnQocGFyYW1zLnRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRMbywgJ01pc3NpbmcgdHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dExvIHBhcmFtJyk7XG4gICAgYXNzZXJ0KHBhcmFtcy50cmFuc2ZlckFtb3VudEF1ZGl0b3JDaXBoZXJ0ZXh0SGksICdNaXNzaW5nIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRIaSBwYXJhbScpO1xuXG4gICAgdGhpcy5fY3RJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Db25maWRlbnRpYWxUcmFuc2ZlcixcbiAgICAgIHBhcmFtcyxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBWZXJpZnlQdWJrZXlWYWxpZGl0eSBwcm9vZiBpbnN0cnVjdGlvbiAodXNlZCB3aXRoIENvbmZpZ3VyZUFjY291bnQpLlxuICAgKi9cbiAgdmVyaWZ5UHVia2V5VmFsaWRpdHkocGFyYW1zOiBWZXJpZnlQdWJrZXlWYWxpZGl0eVsncGFyYW1zJ10pOiB0aGlzIHtcbiAgICB0aGlzLl9jdEluc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlZlcmlmeVB1YmtleVZhbGlkaXR5LFxuICAgICAgcGFyYW1zLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIFZlcmlmeUNpcGhlcnRleHRDb21taXRtZW50RXF1YWxpdHkgcHJvb2YgaW5zdHJ1Y3Rpb24gKHVzZWQgd2l0aCBUcmFuc2ZlciBhbmQgV2l0aGRyYXcpLlxuICAgKi9cbiAgdmVyaWZ5RXF1YWxpdHlQcm9vZihwYXJhbXM6IFZlcmlmeUVxdWFsaXR5UHJvb2ZbJ3BhcmFtcyddKTogdGhpcyB7XG4gICAgdGhpcy5fY3RJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5WZXJpZnlFcXVhbGl0eVByb29mLFxuICAgICAgcGFyYW1zLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIFZlcmlmeUJhdGNoZWRHcm91cGVkQ2lwaGVydGV4dDNIYW5kbGVzVmFsaWRpdHkgcHJvb2YgaW5zdHJ1Y3Rpb24gKHVzZWQgd2l0aCBUcmFuc2ZlcikuXG4gICAqL1xuICB2ZXJpZnlWYWxpZGl0eVByb29mKHBhcmFtczogVmVyaWZ5VmFsaWRpdHlQcm9vZlsncGFyYW1zJ10pOiB0aGlzIHtcbiAgICB0aGlzLl9jdEluc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlZlcmlmeVZhbGlkaXR5UHJvb2YsXG4gICAgICBwYXJhbXMsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgVmVyaWZ5QmF0Y2hlZFJhbmdlUHJvb2ZVMTI4IHByb29mIGluc3RydWN0aW9uICh1c2VkIHdpdGggVHJhbnNmZXIpLlxuICAgKi9cbiAgdmVyaWZ5UmFuZ2VQcm9vZihwYXJhbXM6IFZlcmlmeVJhbmdlUHJvb2ZbJ3BhcmFtcyddKTogdGhpcyB7XG4gICAgdGhpcy5fY3RJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5WZXJpZnlSYW5nZVByb29mLFxuICAgICAgcGFyYW1zLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBhc3NlcnQodGhpcy5fY3RJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCwgJ0F0IGxlYXN0IG9uZSBjb25maWRlbnRpYWwgdHJhbnNmZXIgaW5zdHJ1Y3Rpb24gbXVzdCBiZSBzcGVjaWZpZWQnKTtcblxuICAgIGlmICh0aGlzLl92ZXJzaW9uID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZFYxKCk7XG4gICAgfVxuXG4gICAgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSA9IFsuLi50aGlzLl9jdEluc3RydWN0aW9uc107XG5cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIuYnVpbGRJbXBsZW1lbnRhdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgdjEgKFNJTUQtMDI5Ni8wMzg1KSBjb25maWRlbnRpYWwgdHJhbnNmZXIgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEFzc2VtYmxlcyB0aGUgQ1QgaW5zdHJ1Y3Rpb25zIHZpYSB0aGUgc2hhcmVkIGluc3RydWN0aW9uIGZhY3RvcnksIGNvbXBpbGVzXG4gICAqIGFuZCBzZXJpYWxpemVzIGEgdjEgbWVzc2FnZSB3aXRoIHRoZSBpbmxpbmUgdHJhbnNhY3Rpb24gY29uZmlnLCBzaWducyB0aGVcbiAgICogbWVzc2FnZSBieXRlcyB3aXRoIHRoZSBidWlsZGVyJ3Mgc2lnbmVycywgYW5kIHN0b3JlcyB0aGUgcmVzdWx0aW5nIHdpcmVcbiAgICogYnl0ZXMgZm9yIGJyb2FkY2FzdC4gQWxzbyBwb3B1bGF0ZXMgYSBtZXRhZGF0YS1vbmx5IFNvbFRyYW5zYWN0aW9uIHNvIHRoZVxuICAgKiB0cmFuc2FjdGlvbiBKU09OIGFuZCBpbnB1dC9vdXRwdXQgZXh0cmFjdGlvbiByZW1haW4gdXNhYmxlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb259IFRoZSBidWlsdCB0cmFuc2FjdGlvbiBob2xkaW5nIHRoZSB2MSB3aXJlIGJ5dGVzXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkVjEoKTogVHJhbnNhY3Rpb24ge1xuICAgIGFzc2VydCh0aGlzLl9zZW5kZXIsIG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ3NlbmRlciBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKSk7XG4gICAgYXNzZXJ0KHRoaXMuX3JlY2VudEJsb2NraGFzaCwgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcigncmVjZW50IGJsb2NraGFzaCBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKSk7XG4gICAgYXNzZXJ0KHRoaXMuX3YxVHJhbnNhY3Rpb25Db25maWcsICd0cmFuc2FjdGlvbkNvbmZpZyBpcyByZXF1aXJlZCB0byBidWlsZCBhIHYxIGNvbmZpZGVudGlhbCB0cmFuc2ZlciB0cmFuc2FjdGlvbicpO1xuXG4gICAgLy8gQXBwbHlQZW5kaW5nQmFsYW5jZSBtdXN0IHJlbWFpbiBpbnN0cnVjdGlvbiAjMSBpbiB2MSBzcGVuZCB0eHMgKGl0IGlzIGlkZW1wb3RlbnQpLFxuICAgIC8vIHJlZ2FyZGxlc3Mgb2YgdGhlIG9yZGVyIHRoZSBjYWxsZXIgYWRkZWQgaW5zdHJ1Y3Rpb25zLlxuICAgIHRoaXMuX2N0SW5zdHJ1Y3Rpb25zID0gW1xuICAgICAgLi4udGhpcy5fY3RJbnN0cnVjdGlvbnMuZmlsdGVyKChpKSA9PiBpLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkFwcGx5UGVuZGluZ0JhbGFuY2UpLFxuICAgICAgLi4udGhpcy5fY3RJbnN0cnVjdGlvbnMuZmlsdGVyKChpKSA9PiBpLnR5cGUgIT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkFwcGx5UGVuZGluZ0JhbGFuY2UpLFxuICAgIF07XG5cbiAgICBjb25zdCBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSA9IFtdO1xuXG4gICAgLy8gRHVyYWJsZSBub25jZTogdGhlIEFkdmFuY2VOb25jZUFjY291bnQgaW5zdHJ1Y3Rpb24gTVVTVCBiZSBwYXJ0IG9mIHRoZVxuICAgIC8vIG1lc3NhZ2UgKGEgYmFyZSBub25jZSBoYXNoIHdpdGhvdXQgdGhlIGluc3RydWN0aW9uIGlzIGludmFsaWQpLiBJdCBpc1xuICAgIC8vIHBsYWNlZCBmaXJzdCwgbWF0Y2hpbmcgdGhlIHYwIHdlYjMuanMgY29udmVudGlvbi5cbiAgICBpZiAodGhpcy5fbm9uY2VJbmZvKSB7XG4gICAgICBpbnN0cnVjdGlvbnMucHVzaChcbiAgICAgICAgYnVpbGRBZHZhbmNlTm9uY2VBY2NvdW50SW5zdHJ1Y3Rpb24oXG4gICAgICAgICAgdGhpcy5fbm9uY2VJbmZvLnBhcmFtcy53YWxsZXROb25jZUFkZHJlc3MsXG4gICAgICAgICAgdGhpcy5fbm9uY2VJbmZvLnBhcmFtcy5hdXRoV2FsbGV0QWRkcmVzc1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgdGhpcy5fY3RJbnN0cnVjdGlvbnMpIHtcbiAgICAgIGluc3RydWN0aW9ucy5wdXNoKC4uLnNvbEluc3RydWN0aW9uRmFjdG9yeShpbnN0cnVjdGlvbiwgdGhpcy5femtQcm9vZlByb2dyYW1JZCkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9tZW1vKSB7XG4gICAgICBjb25zdCBtZW1vRGF0YTogTWVtbyA9IHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbyxcbiAgICAgICAgcGFyYW1zOiB7IG1lbW86IHRoaXMuX21lbW8gfSxcbiAgICAgIH07XG4gICAgICB0aGlzLl9jdEluc3RydWN0aW9ucy5wdXNoKG1lbW9EYXRhKTtcbiAgICAgIGluc3RydWN0aW9ucy5wdXNoKC4uLnNvbEluc3RydWN0aW9uRmFjdG9yeShtZW1vRGF0YSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGZlZVBheWVyID0gdGhpcy5fZmVlUGF5ZXIgPyBuZXcgUHVibGljS2V5KHRoaXMuX2ZlZVBheWVyKSA6IG5ldyBQdWJsaWNLZXkodGhpcy5fc2VuZGVyKTtcbiAgICBjb25zdCBtZXNzYWdlQnl0ZXMgPSBjb21waWxlVHJhbnNhY3Rpb25NZXNzYWdlKHtcbiAgICAgIHZlcnNpb246IDEsXG4gICAgICBpbnN0cnVjdGlvbnMsXG4gICAgICBmZWVQYXllcixcbiAgICAgIHJlY2VudEJsb2NraGFzaDogdGhpcy5fcmVjZW50QmxvY2toYXNoLFxuICAgICAgdHJhbnNhY3Rpb25Db25maWc6IHRoaXMuX3YxVHJhbnNhY3Rpb25Db25maWcsXG4gICAgfSk7XG5cbiAgICAvLyBTaWduZXIgb3JkZXIgY29tZXMgZnJvbSB0aGUgY29tcGlsZWQgbWVzc2FnZTogdGhlIGZpcnN0XG4gICAgLy8gbnVtU2lnbmVyQWNjb3VudHMgc3RhdGljIGFjY291bnRzIGFyZSB0aGUgcmVxdWlyZWQgc2lnbmVycyAoZmVlIHBheWVyXG4gICAgLy8gZmlyc3QsIHRoZW4gdGhlIHJlbWFpbmluZyBzaWduZXJzIGluIHRoZSBjb21waWxlZCBhY2NvdW50IG9yZGVyKS5cbiAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlVjFNZXNzYWdlKG1lc3NhZ2VCeXRlcyk7XG4gICAgY29uc3Qgc2lnbmVyQWRkcmVzc2VzID0gZGVjb2RlZC5zdGF0aWNBY2NvdW50cy5zbGljZSgwLCBkZWNvZGVkLmhlYWRlci5udW1TaWduZXJBY2NvdW50cyk7XG5cbiAgICBjb25zdCBzaWduYXR1cmVzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGFkZHJlc3Mgb2Ygc2lnbmVyQWRkcmVzc2VzKSB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gdGhpcy5fc2lnbmVycy5maW5kKChzaWduZXIpID0+IHNpZ25lci5nZXRLZXlzKCkucHViID09PSBhZGRyZXNzKTtcbiAgICAgIGlmIChrZXlQYWlyKSB7XG4gICAgICAgIGNvbnN0IHNlY3JldEtleSA9IGtleVBhaXIuZ2V0S2V5cyh0cnVlKS5wcnY7XG4gICAgICAgIGFzc2VydChzZWNyZXRLZXkgaW5zdGFuY2VvZiBVaW50OEFycmF5LCAnTWlzc2luZyBwcml2YXRlIGtleScpO1xuICAgICAgICBzaWduYXR1cmVzLnB1c2gobmFjbC5zaWduLmRldGFjaGVkKG1lc3NhZ2VCeXRlcywgc2VjcmV0S2V5KSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZXh0ZXJuYWwgPSB0aGlzLmdldEFkZGl0aW9uYWxTaWduYXR1cmVzKCkuZmluZCgoc2lnKSA9PiBzaWcucHVibGljS2V5LnB1YiA9PT0gYWRkcmVzcyk7XG4gICAgICBpZiAoZXh0ZXJuYWwpIHtcbiAgICAgICAgc2lnbmF0dXJlcy5wdXNoKG5ldyBVaW50OEFycmF5KGV4dGVybmFsLnNpZ25hdHVyZSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIE1pc3Npbmcgc2lnbmF0dXJlOiB6ZXJvLWZpbGwgdGhlIHNsb3Qgc28gdGhlIHdpcmUgc2hhcGUgc3RheXMgdmFsaWRcbiAgICAgIC8vIGZvciBwYXJ0aWFsLXNpZ24gZmxvd3M7IHRoZSB0cmFuc2FjdGlvbiBpcyBub3QgYnJvYWRjYXN0YWJsZSB1bnRpbFxuICAgICAgLy8gZXZlcnkgcmVxdWlyZWQgc2lnbmVyIGhhcyBhIHNpZ25hdHVyZS5cbiAgICAgIHNpZ25hdHVyZXMucHVzaChuZXcgVWludDhBcnJheSg2NCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHYxV2lyZSA9IHNlcmlhbGl6ZVdpcmVUcmFuc2FjdGlvbihtZXNzYWdlQnl0ZXMsIHNpZ25hdHVyZXMpO1xuXG4gICAgdGhpcy5fdHJhbnNhY3Rpb24udjFUcmFuc2FjdGlvbkJ5dGVzID0gdjFXaXJlO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uLnYxTWVzc2FnZUJ5dGVzID0gbWVzc2FnZUJ5dGVzO1xuXG4gICAgLy8gUG9wdWxhdGUgYSBtZXRhZGF0YS1vbmx5IFNvbFRyYW5zYWN0aW9uIHNvIHRvSnNvbiAvIGxvYWRJbnB1dHNBbmRPdXRwdXRzIHdvcmsuXG4gICAgLy8gVGhlIGR1cmFibGUgbm9uY2UgaXMgY2FycmllZCB2aWEgbm9uY2VJbmZvLCBtYXRjaGluZyB0aGUgdjAgbW9kZWwuXG4gICAgY29uc3QgbWV0YVR4ID0gbmV3IFNvbFRyYW5zYWN0aW9uKCk7XG4gICAgbWV0YVR4LmZlZVBheWVyID0gZmVlUGF5ZXI7XG4gICAgbWV0YVR4LnJlY2VudEJsb2NraGFzaCA9IHRoaXMuX3JlY2VudEJsb2NraGFzaDtcbiAgICBpZiAodGhpcy5fbm9uY2VJbmZvKSB7XG4gICAgICBtZXRhVHgubm9uY2VJbmZvID0ge1xuICAgICAgICBub25jZTogdGhpcy5fcmVjZW50QmxvY2toYXNoLFxuICAgICAgICBub25jZUluc3RydWN0aW9uOiBidWlsZEFkdmFuY2VOb25jZUFjY291bnRJbnN0cnVjdGlvbihcbiAgICAgICAgICB0aGlzLl9ub25jZUluZm8ucGFyYW1zLndhbGxldE5vbmNlQWRkcmVzcyxcbiAgICAgICAgICB0aGlzLl9ub25jZUluZm8ucGFyYW1zLmF1dGhXYWxsZXRBZGRyZXNzXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH1cbiAgICBtZXRhVHguYWRkKC4uLmluc3RydWN0aW9ucyk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uc29sVHJhbnNhY3Rpb24gPSBtZXRhVHg7XG5cbiAgICB0aGlzLl90cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvblR5cGUodGhpcy50cmFuc2FjdGlvblR5cGUpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uLnNldEluc3RydWN0aW9uc0RhdGEodGhpcy5fY3RJbnN0cnVjdGlvbnMpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uLmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG5cbiAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb247XG4gIH1cbn1cbiJdfQ==
|
|
@@ -32,15 +32,23 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
32
32
|
return result;
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
35
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
39
|
require("should");
|
|
40
|
+
const tweetnacl_1 = __importDefault(require("tweetnacl"));
|
|
41
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
37
42
|
const src_1 = require("../../../src");
|
|
43
|
+
const parseWireTransaction_1 = require("../../../src/lib/serialization/parseWireTransaction");
|
|
38
44
|
const testData = __importStar(require("../../resources/sol"));
|
|
39
45
|
const getBuilderFactory_1 = require("../getBuilderFactory");
|
|
40
46
|
describe('Solana Confidential Transfer Builder - v1', () => {
|
|
41
47
|
const factory = (0, getBuilderFactory_1.getBuilderFactory)('sol');
|
|
42
48
|
const account = new src_1.KeyPair(testData.associatedTokenAccounts.accounts[0]).getKeys();
|
|
43
49
|
const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
|
|
50
|
+
const gasTank = new src_1.KeyPair({ prv: testData.prvKeys.prvKey1.base58 }).getKeys();
|
|
51
|
+
const nonceAccount = new src_1.KeyPair(testData.nonceAccount).getKeys();
|
|
44
52
|
const mintAddress = testData.associatedTokenAccountsForSol2022.mintId;
|
|
45
53
|
const tokenAddress = testData.associatedTokenAccountsForSol2022.accounts[0].ata;
|
|
46
54
|
const destinationTokenAddress = 'ENn8a2tGMS9bR5XV7smGHJvNgzkyxJmnD2eUvQxY5jSP';
|
|
@@ -100,6 +108,47 @@ describe('Solana Confidential Transfer Builder - v1', () => {
|
|
|
100
108
|
wire.length.should.be.lessThanOrEqual(4096);
|
|
101
109
|
// config preserved in the decoded v1 message
|
|
102
110
|
});
|
|
111
|
+
it('injects the AdvanceNonceAccount instruction and assembles user + gas-tank signatures in signer order for durable nonce', async () => {
|
|
112
|
+
const builder = ctBuilder();
|
|
113
|
+
addTransfer(builder);
|
|
114
|
+
builder.nonce(recentBlockHash, {
|
|
115
|
+
walletNonceAddress: nonceAccount.pub,
|
|
116
|
+
authWalletAddress: gasTank.pub,
|
|
117
|
+
});
|
|
118
|
+
builder.version(1).transactionConfig(v1Config);
|
|
119
|
+
const unsigned = (await builder.build());
|
|
120
|
+
const messageBytes = unsigned.v1MessageBytes;
|
|
121
|
+
unsigned.isVersionedTransaction().should.equal(true);
|
|
122
|
+
unsigned.v1TransactionBytes[0].should.equal(0x81);
|
|
123
|
+
// 2 required signers: user (fee payer) + gas-tank nonce authority
|
|
124
|
+
messageBytes[1].should.equal(2);
|
|
125
|
+
const decoded = (0, src_1.decodeV1Message)(messageBytes);
|
|
126
|
+
// nonce hash occupies the blockhash field
|
|
127
|
+
decoded.blockhash.should.equal(recentBlockHash);
|
|
128
|
+
// first instruction is AdvanceNonceAccount (System Program, discriminator 4)
|
|
129
|
+
decoded.compiledInstructions[0].data[0].should.equal(4);
|
|
130
|
+
decoded.staticAccounts[decoded.compiledInstructions[0].programAddressIndex].should.equal(web3_js_1.SystemProgram.programId.toBase58());
|
|
131
|
+
// signer order: fee payer (user) first, then gas tank
|
|
132
|
+
decoded.staticAccounts.slice(0, 2).should.deepEqual([account.pub, gasTank.pub]);
|
|
133
|
+
// attach the gas-tank HSM signature over the same message bytes
|
|
134
|
+
const signWith = (keyPair, msg) => {
|
|
135
|
+
const prv = keyPair.prv;
|
|
136
|
+
if (typeof prv !== 'string') {
|
|
137
|
+
throw new Error('Missing private key for test signer');
|
|
138
|
+
}
|
|
139
|
+
const kp = new src_1.KeyPair({ prv });
|
|
140
|
+
return tweetnacl_1.default.sign.detached(msg, kp.getKeys(true).prv);
|
|
141
|
+
};
|
|
142
|
+
const gasTankSig = signWith(gasTank, messageBytes);
|
|
143
|
+
builder.addSignature({ pub: gasTank.pub }, Buffer.from(gasTankSig));
|
|
144
|
+
const signed = (await builder.build());
|
|
145
|
+
// message byte-identity between build and sign
|
|
146
|
+
Buffer.from(signed.v1MessageBytes).equals(Buffer.from(messageBytes)).should.be.true();
|
|
147
|
+
signed.v1TransactionBytes.length.should.equal(messageBytes.length + 2 * 64);
|
|
148
|
+
const parsed = (0, src_1.parseWireTransaction)(signed.v1TransactionBytes);
|
|
149
|
+
parsed.signerPublicKeys.should.deepEqual([account.pub, gasTank.pub]);
|
|
150
|
+
(0, parseWireTransaction_1.verifyV1Signatures)(parsed.messageBytes, parsed.signatures, parsed.signerPublicKeys);
|
|
151
|
+
});
|
|
103
152
|
it('should require transactionConfig when version(1) is set', async () => {
|
|
104
153
|
const builder = ctBuilder();
|
|
105
154
|
addTransfer(builder);
|
|
@@ -141,4 +190,4 @@ describe('Solana Confidential Transfer Builder - v1', () => {
|
|
|
141
190
|
src_1.Utils.isValidRawTransaction(rawTx).should.equal(true);
|
|
142
191
|
});
|
|
143
192
|
});
|
|
144
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlkZW50aWFsVHJhbnNmZXJWMS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvY29uZmlkZW50aWFsVHJhbnNmZXJWMS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtCQUFnQjtBQUNoQixzQ0FBZ0U7QUFDaEUsOERBQWdEO0FBQ2hELDREQUF5RDtBQUV6RCxRQUFRLENBQUMsMkNBQTJDLEVBQUUsR0FBRyxFQUFFO0lBQ3pELE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWlCLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDekMsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFPLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3BGLE1BQU0sZUFBZSxHQUFHLDhDQUE4QyxDQUFDO0lBRXZFLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQyxNQUFNLENBQUM7SUFDdEUsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGlDQUFpQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDaEYsTUFBTSx1QkFBdUIsR0FBRyw4Q0FBOEMsQ0FBQztJQUMvRSxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFFckMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFdEMsTUFBTSxRQUFRLEdBQUc7UUFDZixnQkFBZ0IsRUFBRSxN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QUFDO0lBQ2hFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDREQUE0RCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzFFLE1BQU0sT0FBTyxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztZQUN2QixZQUFZO1lBQ1osV0FBVztZQUNYLGdCQUFnQjtZQUNoQixzQkFBc0IsRUFBRSxXQUFXO1lBQ25DLGtDQUFrQyxFQUFFLE9BQU87WUFDM0Msc0JBQXNCLEVBQUUsQ0FBQztTQUMxQixDQUFDLENBQUM7UUFFSCxNQUFNLEVBQUUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQyxNQUFNLEtBQUssR0FBSSxFQUFrQixDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDdEQsdURBQXVEO1FBQ3ZELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELEVBQWtCLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLFdBQUssQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBLZXlQYWlyLCBTb2wsIFRyYW5zYWN0aW9uLCBVdGlscyB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvc29sJztcbmltcG9ydCB7IGdldEJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vZ2V0QnVpbGRlckZhY3RvcnknO1xuXG5kZXNjcmliZSgnU29sYW5hIENvbmZpZGVudGlhbCBUcmFuc2ZlciBCdWlsZGVyIC0gdjEnLCAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBnZXRCdWlsZGVyRmFjdG9yeSgnc29sJyk7XG4gIGNvbnN0IGFjY291bnQgPSBuZXcgS2V5UGFpcih0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50cy5hY2NvdW50c1swXSkuZ2V0S2V5cygpO1xuICBjb25zdCByZWNlbnRCbG9ja0hhc2ggPSAnR0h0WFFCc29aSFZuTkZhOVlldkF6RnIxN0RKamdIWGszeWNUS0Q1eEQzWmknO1xuXG4gIGNvbnN0IG1pbnRBZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHNGb3JTb2wyMDIyLm1pbnRJZDtcbiAgY29uc3QgdG9rZW5BZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHNGb3JTb2wyMDIyLmFjY291bnRzWzBdLmF0YTtcbiAgY29uc3QgZGVzdGluYXRpb25Ub2tlbkFkZHJlc3MgPSAnRU5uOGEydEdNUzliUjVYVjdzbUdISnZOZ3preXhKbW5EMmVVdlF4WTVqU1AnO1xuICBjb25zdCBhdXRob3JpdHlBZGRyZXNzID0gYWNjb3VudC5wdWI7XG5cbiAgY29uc3QgemVyb0J5dGVzMzYgPSAnMDAnLnJlcGVhdCgzNik7XG4gIGNvbnN0IHplcm9CeXRlczY0ID0gJzAwJy5yZXBlYXQoNjQpO1xuICBjb25zdCBwcm9vZkRhdGFIZXggPSAnMDAnLnJlcGVhdCgzMjApO1xuXG4gIGNvbnN0IHYxQ29uZmlnID0ge1xuICAgIGNvbXB1dGVVbml0TGltaXQ6IDIwMF8wMDAsXG4gICAgaGVhcFNpemU6IDMyXzc2OCxcbiAgICBsb2FkZWRBY2NvdW50c0RhdGFTaXplTGltaXQ6IDY1XzUzNixcbiAgICBwcmlvcml0eUZlZTogNV8wMDAsXG4gIH07XG5cbiAgY29uc3QgY3RCdWlsZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q29uZmlkZW50aWFsVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgdHhCdWlsZGVyLnNlbmRlcihhY2NvdW50LnB1Yik7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pO1xuICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gIH07XG5cbiAgY29uc3QgYWRkVHJhbnNmZXIgPSAoYnVpbGRlcjogUmV0dXJuVHlwZTx0eXBlb2YgY3RCdWlsZGVyPikgPT4ge1xuICAgIGJ1aWxkZXJcbiAgICAgIC5hcHBseVBlbmRpbmdCYWxhbmNlKHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBleHBlY3RlZFBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzInLFxuICAgICAgICBuZXdEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgfSlcbiAgICAgIC52ZXJpZnlFcXVhbGl0eVByb29mKHsgcHJvb2ZEYXRhOiBwcm9vZkRhdGFIZXggfSlcbiAgICAgIC52ZXJpZnlWYWxpZGl0eVByb29mKHsgcHJvb2ZEYXRhOiBwcm9vZkRhdGFIZXggfSlcbiAgICAgIC52ZXJpZnlSYW5nZVByb29mKHsgcHJvb2ZEYXRhOiAnMDAnLnJlcGVhdCgxMDAwKSB9KVxuICAgICAgLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgbmV3U291cmNlRGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgdHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dExvOiB6ZXJvQnl0ZXM2NCxcbiAgICAgICAgdHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dEhpOiB6ZXJvQnl0ZXM2NCxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgICBjaXBoZXJ0ZXh0VmFsaWRpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAyLFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDMsXG4gICAgICB9KTtcbiAgfTtcblxuICBpdCgnc2hvdWxkIGJ1aWxkIGEgdjEgY29uZmlkZW50aWFsIHRyYW5zZmVyIHRyYW5zYWN0aW9uICgweDgxIHByZWZpeCwgd2l0aGluIDQwOTYgYnl0ZXMpJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICBhZGRUcmFuc2ZlcihidWlsZGVyKTtcbiAgICBidWlsZGVyLnZlcnNpb24oMSkudHJhbnNhY3Rpb25Db25maWcodjFDb25maWcpO1xuXG4gICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAodHggYXMgVHJhbnNhY3Rpb24pLmlzVmVyc2lvbmVkVHJhbnNhY3Rpb24oKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgKHR4IGFzIFRyYW5zYWN0aW9uKS52MVRyYW5zYWN0aW9uQnl0ZXMhLnNob3VsZC5iZS5hbi5pbnN0YW5jZU9mKFVpbnQ4QXJyYXkpO1xuXG4gICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIGNvbnN0IHdpcmUgPSBCdWZmZXIuZnJvbShyYXdUeCwgJ2Jhc2U2NCcpO1xuXG4gICAgLy8gdjEgdmVyc2lvbiBieXRlIHByZWZpeFxuICAgIHdpcmVbMF0uc2hvdWxkLmVxdWFsKDB4ODEpO1xuICAgIC8vIHdpdGhpbiB0aGUgdjEgd2lyZSBzaXplIGxpbWl0XG4gICAgd2lyZS5sZW5ndGguc2hvdWxkLmJlLmxlc3NUaGFuT3JFcXVhbCg0MDk2KTtcblxuICAgIC8vIGNvbmZpZyBwcmVzZXJ2ZWQgaW4gdGhlIGRlY29kZWQgdjEgbWVzc2FnZVxuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlcXVpcmUgdHJhbnNhY3Rpb25Db25maWcgd2hlbiB2ZXJzaW9uKDEpIGlzIHNldCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgYWRkVHJhbnNmZXIoYnVpbGRlcik7XG4gICAgYnVpbGRlci52ZXJzaW9uKDEpO1xuXG4gICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3RyYW5zYWN0aW9uQ29uZmlnIGlzIHJlcXVpcmVkLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmVqZWN0IHYxIHRyYW5zYWN0aW9ucyB0aGF0IGV4Y2VlZCB0aGUgNDA5Ni1ieXRlIHdpcmUgbGltaXQgYXQgYnJvYWRjYXN0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICBhZGRUcmFuc2ZlcihidWlsZGVyKTtcbiAgICBidWlsZGVyLnZlcnNpb24oMSkudHJhbnNhY3Rpb25Db25maWcodjFDb25maWcpO1xuXG4gICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgcmF3VHggPSAodHggYXMgVHJhbnNhY3Rpb24pLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAvLyBGb3JjZSBhbiBvdmVyc2l6ZWQgdjEgcGF5bG9hZCBieSBwYWRkaW5nIHRoZSB3aXJlIGJ5dGVzIHBhc3QgdGhlIGxpbWl0LlxuICAgIGNvbnN0IHdpcmUgPSBCdWZmZXIuZnJvbShyYXdUeCwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IG92ZXJzaXplZCA9IEJ1ZmZlci5jb25jYXQoW3dpcmUsIEJ1ZmZlci5hbGxvYyg0MDk3KV0pO1xuICAgIG92ZXJzaXplZFswXS5zaG91bGQuZXF1YWwoMHg4MSk7XG5cbiAgICAvLyBCcm9hZGNhc3QgdGhlIG92ZXJzaXplZCB2MSB0eCB0aHJvdWdoIFNvbC5wcm90b3R5cGUuYnJvYWRjYXN0VHJhbnNhY3Rpb24gd2l0aCBhbiBSUENcbiAgICAvLyBzdHViIHRoYXQgbXVzdCBub3QgYmUgcmVhY2hlZCAtIHRoZSBzaXplIGd1YXJkIHNob3J0LWNpcmN1aXRzIGJlZm9yZSB0aGUgUlBDIGNhbGwuXG4gICAgY29uc3QgY29pbiA9IHsgZ2V0RGF0YUZyb21Ob2RlOiAoKSA9PiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1JQQyBzaG91bGQgbm90IGJlIHJlYWNoZWQnKSkgfSBhcyB1bmtub3duIGFzIFNvbDtcbiAgICBhd2FpdCAoU29sLnByb3RvdHlwZS5icm9hZGNhc3RUcmFuc2FjdGlvbiBhcyAob3B0czogeyBzZXJpYWxpemVkU2lnbmVkVHJhbnNhY3Rpb246IHN0cmluZyB9KSA9PiBQcm9taXNlPG5ldmVyPilcbiAgICAgIC5jYWxsKGNvaW4sIHsgc2VyaWFsaXplZFNpZ25lZFRyYW5zYWN0aW9uOiBvdmVyc2l6ZWQudG9TdHJpbmcoJ2Jhc2U2NCcpIH0pXG4gICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvZXhjZWVkcyB0aGUgNDA5Ni1ieXRlIHNpemUgbGltaXQvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBsZWF2ZSB0aGUgbm9uLXYxIHBhdGggdW5jaGFuZ2VkICh2MC9sZWdhY3kgZGVmYXVsdCknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgIGJ1aWxkZXIuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICBtaW50QWRkcmVzcyxcbiAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICBkZWNyeXB0YWJsZVplcm9CYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgIG1heGltdW1QZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXI6ICc2NTUzNicsXG4gICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgcmF3VHggPSAodHggYXMgVHJhbnNhY3Rpb24pLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgLy8gbGVnYWN5IHRyYW5zYWN0aW9uIGRvZXMgbm90IGNhcnJ5IHRoZSAweDgxIHYxIHByZWZpeFxuICAgIEJ1ZmZlci5mcm9tKHJhd1R4LCAnYmFzZTY0JylbMF0uc2hvdWxkLm5vdC5lcXVhbCgweDgxKTtcbiAgICAodHggYXMgVHJhbnNhY3Rpb24pLmlzVmVyc2lvbmVkVHJhbnNhY3Rpb24oKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICB9KTtcbn0pO1xuIl19
|
|
193
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlkZW50aWFsVHJhbnNmZXJWMS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvY29uZmlkZW50aWFsVHJhbnNmZXJWMS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtCQUFnQjtBQUNoQiwwREFBNkI7QUFDN0IsNkNBQWdEO0FBQ2hELHNDQUF1RztBQUN2Ryw4RkFBeUY7QUFFekYsOERBQWdEO0FBQ2hELDREQUF5RDtBQUV6RCxRQUFRLENBQUMsMkNBQTJDLEVBQUUsR0FBRyxFQUFFO0lBQ3pELE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWlCLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDekMsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFPLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3BGLE1BQU0sZUFBZSxHQUFHLDhDQUE4QyxDQUFDO0lBQ3ZFLE1BQU0sT0FBTyxHQUFHLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEYsTUFBTSxZQUFZLEdBQUcsSUFBSSxhQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBRWxFLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQyxNQUFNLENBQUM7SUFDdEUsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGlDQUFpQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDaEYsTUFBTSx1QkFBdUIsR0FBRyw4Q0FBOEMsQ0FBQztJQUMvRSxNQUFNLGdCQUFn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LEVBQUUsV0FBVztZQUNuQyxrQ0FBa0MsRUFBRSxPQUFPO1lBQzNDLHNCQUFzQixFQUFFLENBQUM7U0FDMUIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxFQUFFLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsTUFBTSxLQUFLLEdBQUksRUFBa0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3RELHVEQUF1RDtRQUN2RCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxFQUFrQixDQUFDLHNCQUFzQixFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRSxXQUFLLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4RCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IG5hY2wgZnJvbSAndHdlZXRuYWNsJztcbmltcG9ydCB7IFN5c3RlbVByb2dyYW0gfSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IHsgZGVjb2RlVjFNZXNzYWdlLCBLZXlQYWlyLCBwYXJzZVdpcmVUcmFuc2FjdGlvbiwgU29sLCBUcmFuc2FjdGlvbiwgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHsgdmVyaWZ5VjFTaWduYXR1cmVzIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9zZXJpYWxpemF0aW9uL3BhcnNlV2lyZVRyYW5zYWN0aW9uJztcbmltcG9ydCB7IFNvbGFuYUtleXMgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL2lmYWNlJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9zb2wnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi9nZXRCdWlsZGVyRmFjdG9yeSc7XG5cbmRlc2NyaWJlKCdTb2xhbmEgQ29uZmlkZW50aWFsIFRyYW5zZmVyIEJ1aWxkZXIgLSB2MScsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KCdzb2wnKTtcbiAgY29uc3QgYWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzLmFjY291bnRzWzBdKS5nZXRLZXlzKCk7XG4gIGNvbnN0IHJlY2VudEJsb2NrSGFzaCA9ICdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaSc7XG4gIGNvbnN0IGdhc1RhbmsgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEucHJ2S2V5cy5wcnZLZXkxLmJhc2U1OCB9KS5nZXRLZXlzKCk7XG4gIGNvbnN0IG5vbmNlQWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLm5vbmNlQWNjb3VudCkuZ2V0S2V5cygpO1xuXG4gIGNvbnN0IG1pbnRBZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHNGb3JTb2wyMDIyLm1pbnRJZDtcbiAgY29uc3QgdG9rZW5BZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHNGb3JTb2wyMDIyLmFjY291bnRzWzBdLmF0YTtcbiAgY29uc3QgZGVzdGluYXRpb25Ub2tlbkFkZHJlc3MgPSAnRU5uOGEydEdNUzliUjVYVjdzbUdISnZOZ3preXhKbW5EMmVVdlF4WTVqU1AnO1xuICBjb25zdCBhdXRob3JpdHlBZGRyZXNzID0gYWNjb3VudC5wdWI7XG5cbiAgY29uc3QgemVyb0J5dGVzMzYgPSAnMDAnLnJlcGVhdCgzNik7XG4gIGNvbnN0IHplcm9CeXRlczY0ID0gJzAwJy5yZXBlYXQoNjQpO1xuICBjb25zdCBwcm9vZkRhdGFIZXggPSAnMDAnLnJlcGVhdCgzMjApO1xuXG4gIGNvbnN0IHYxQ29uZmlnID0ge1xuICAgIGNvbXB1dGVVbml0TGltaXQ6IDIwMF8wMDAsXG4gICAgaGVhcFNpemU6IDMyXzc2OCxcbiAgICBsb2FkZWRBY2NvdW50c0RhdGFTaXplTGltaXQ6IDY1XzUzNixcbiAgICBwcmlvcml0eUZlZTogNV8wMDAsXG4gIH07XG5cbiAgY29uc3QgY3RCdWlsZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q29uZmlkZW50aWFsVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgdHhCdWlsZGVyLnNlbmRlcihhY2NvdW50LnB1Yik7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGFjY291bnQucHJ2IH0pO1xuICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gIH07XG5cbiAgY29uc3QgYWRkVHJhbnNmZXIgPSAoYnVpbGRlcjogUmV0dXJuVHlwZTx0eXBlb2YgY3RCdWlsZGVyPikgPT4ge1xuICAgIGJ1aWxkZXJcbiAgICAgIC5hcHBseVBlbmRpbmdCYWxhbmNlKHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBleHBlY3RlZFBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzInLFxuICAgICAgICBuZXdEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgfSlcbiAgICAgIC52ZXJpZnlFcXVhbGl0eVByb29mKHsgcHJvb2ZEYXRhOiBwcm9vZkRhdGFIZXggfSlcbiAgICAgIC52ZXJpZnlWYWxpZGl0eVByb29mKHsgcHJvb2ZEYXRhOiBwcm9vZkRhdGFIZXggfSlcbiAgICAgIC52ZXJpZnlSYW5nZVByb29mKHsgcHJvb2ZEYXRhOiAnMDAnLnJlcGVhdCgxMDAwKSB9KVxuICAgICAgLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgbmV3U291cmNlRGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgdHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dExvOiB6ZXJvQnl0ZXM2NCxcbiAgICAgICAgdHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dEhpOiB6ZXJvQnl0ZXM2NCxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgICBjaXBoZXJ0ZXh0VmFsaWRpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAyLFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDMsXG4gICAgICB9KTtcbiAgfTtcblxuICBpdCgnc2hvdWxkIGJ1aWxkIGEgdjEgY29uZmlkZW50aWFsIHRyYW5zZmVyIHRyYW5zYWN0aW9uICgweDgxIHByZWZpeCwgd2l0aGluIDQwOTYgYnl0ZXMpJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICBhZGRUcmFuc2ZlcihidWlsZGVyKTtcbiAgICBidWlsZGVyLnZlcnNpb24oMSkudHJhbnNhY3Rpb25Db25maWcodjFDb25maWcpO1xuXG4gICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAodHggYXMgVHJhbnNhY3Rpb24pLmlzVmVyc2lvbmVkVHJhbnNhY3Rpb24oKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgKHR4IGFzIFRyYW5zYWN0aW9uKS52MVRyYW5zYWN0aW9uQnl0ZXMhLnNob3VsZC5iZS5hbi5pbnN0YW5jZU9mKFVpbnQ4QXJyYXkpO1xuXG4gICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIGNvbnN0IHdpcmUgPSBCdWZmZXIuZnJvbShyYXdUeCwgJ2Jhc2U2NCcpO1xuXG4gICAgLy8gdjEgdmVyc2lvbiBieXRlIHByZWZpeFxuICAgIHdpcmVbMF0uc2hvdWxkLmVxdWFsKDB4ODEpO1xuICAgIC8vIHdpdGhpbiB0aGUgdjEgd2lyZSBzaXplIGxpbWl0XG4gICAgd2lyZS5sZW5ndGguc2hvdWxkLmJlLmxlc3NUaGFuT3JFcXVhbCg0MDk2KTtcblxuICAgIC8vIGNvbmZpZyBwcmVzZXJ2ZWQgaW4gdGhlIGRlY29kZWQgdjEgbWVzc2FnZVxuICB9KTtcblxuICBpdCgnaW5qZWN0cyB0aGUgQWR2YW5jZU5vbmNlQWNjb3VudCBpbnN0cnVjdGlvbiBhbmQgYXNzZW1ibGVzIHVzZXIgKyBnYXMtdGFuayBzaWduYXR1cmVzIGluIHNpZ25lciBvcmRlciBmb3IgZHVyYWJsZSBub25jZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgYWRkVHJhbnNmZXIoYnVpbGRlcik7XG4gICAgYnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gsIHtcbiAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YixcbiAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBnYXNUYW5rLnB1YixcbiAgICB9KTtcbiAgICBidWlsZGVyLnZlcnNpb24oMSkudHJhbnNhY3Rpb25Db25maWcodjFDb25maWcpO1xuXG4gICAgY29uc3QgdW5zaWduZWQgPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICBjb25zdCBtZXNzYWdlQnl0ZXMgPSB1bnNpZ25lZC52MU1lc3NhZ2VCeXRlcyE7XG4gICAgdW5zaWduZWQuaXNWZXJzaW9uZWRUcmFuc2FjdGlvbigpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB1bnNpZ25lZC52MVRyYW5zYWN0aW9uQnl0ZXMhWzBdLnNob3VsZC5lcXVhbCgweDgxKTtcblxuICAgIC8vIDIgcmVxdWlyZWQgc2lnbmVyczogdXNlciAoZmVlIHBheWVyKSArIGdhcy10YW5rIG5vbmNlIGF1dGhvcml0eVxuICAgIG1lc3NhZ2VCeXRlc1sxXS5zaG91bGQuZXF1YWwoMik7XG5cbiAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlVjFNZXNzYWdlKG1lc3NhZ2VCeXRlcyk7XG4gICAgLy8gbm9uY2UgaGFzaCBvY2N1cGllcyB0aGUgYmxvY2toYXNoIGZpZWxkXG4gICAgZGVjb2RlZC5ibG9ja2hhc2guc2hvdWxkLmVxdWFsKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgLy8gZmlyc3QgaW5zdHJ1Y3Rpb24gaXMgQWR2YW5jZU5vbmNlQWNjb3VudCAoU3lzdGVtIFByb2dyYW0sIGRpc2NyaW1pbmF0b3IgNClcbiAgICBkZWNvZGVkLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zWzBdLmRhdGFbMF0uc2hvdWxkLmVxdWFsKDQpO1xuICAgIGRlY29kZWQuc3RhdGljQWNjb3VudHNbZGVjb2RlZC5jb21waWxlZEluc3RydWN0aW9uc1swXS5wcm9ncmFtQWRkcmVzc0luZGV4XS5zaG91bGQuZXF1YWwoXG4gICAgICBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b0Jhc2U1OCgpXG4gICAgKTtcbiAgICAvLyBzaWduZXIgb3JkZXI6IGZlZSBwYXllciAodXNlcikgZmlyc3QsIHRoZW4gZ2FzIHRhbmtcbiAgICBkZWNvZGVkLnN0YXRpY0FjY291bnRzLnNsaWNlKDAsIDIpLnNob3VsZC5kZWVwRXF1YWwoW2FjY291bnQucHViLCBnYXNUYW5rLnB1Yl0pO1xuXG4gICAgLy8gYXR0YWNoIHRoZSBnYXMtdGFuayBIU00gc2lnbmF0dXJlIG92ZXIgdGhlIHNhbWUgbWVzc2FnZSBieXRlc1xuICAgIGNvbnN0IHNpZ25XaXRoID0gKGtleVBhaXI6IFNvbGFuYUtleXMsIG1zZzogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgICAgY29uc3QgcHJ2ID0ga2V5UGFpci5wcnY7XG4gICAgICBpZiAodHlwZW9mIHBydiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHByaXZhdGUga2V5IGZvciB0ZXN0IHNpZ25lcicpO1xuICAgICAgfVxuICAgICAgY29uc3Qga3AgPSBuZXcgS2V5UGFpcih7IHBydiB9KTtcbiAgICAgIHJldHVybiBuYWNsLnNpZ24uZGV0YWNoZWQobXNnLCBrcC5nZXRLZXlzKHRydWUpLnBydiBhcyBVaW50OEFycmF5KTtcbiAgICB9O1xuICAgIGNvbnN0IGdhc1RhbmtTaWcgPSBzaWduV2l0aChnYXNUYW5rLCBtZXNzYWdlQnl0ZXMpO1xuICAgIGJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBnYXNUYW5rLnB1YiB9LCBCdWZmZXIuZnJvbShnYXNUYW5rU2lnKSk7XG4gICAgY29uc3Qgc2lnbmVkID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG5cbiAgICAvLyBtZXNzYWdlIGJ5dGUtaWRlbnRpdHkgYmV0d2VlbiBidWlsZCBhbmQgc2lnblxuICAgIEJ1ZmZlci5mcm9tKHNpZ25lZC52MU1lc3NhZ2VCeXRlcyEpLmVxdWFscyhCdWZmZXIuZnJvbShtZXNzYWdlQnl0ZXMpKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIHNpZ25lZC52MVRyYW5zYWN0aW9uQnl0ZXMhLmxlbmd0aC5zaG91bGQuZXF1YWwobWVzc2FnZUJ5dGVzLmxlbmd0aCArIDIgKiA2NCk7XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVdpcmVUcmFuc2FjdGlvbihzaWduZWQudjFUcmFuc2FjdGlvbkJ5dGVzISk7XG4gICAgcGFyc2VkLnNpZ25lclB1YmxpY0tleXMuc2hvdWxkLmRlZXBFcXVhbChbYWNjb3VudC5wdWIsIGdhc1RhbmsucHViXSk7XG4gICAgdmVyaWZ5VjFTaWduYXR1cmVzKHBhcnNlZC5tZXNzYWdlQnl0ZXMsIHBhcnNlZC5zaWduYXR1cmVzLCBwYXJzZWQuc2lnbmVyUHVibGljS2V5cyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmVxdWlyZSB0cmFuc2FjdGlvbkNvbmZpZyB3aGVuIHZlcnNpb24oMSkgaXMgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICBhZGRUcmFuc2ZlcihidWlsZGVyKTtcbiAgICBidWlsZGVyLnZlcnNpb24oMSk7XG5cbiAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvdHJhbnNhY3Rpb25Db25maWcgaXMgcmVxdWlyZWQvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZWplY3QgdjEgdHJhbnNhY3Rpb25zIHRoYXQgZXhjZWVkIHRoZSA0MDk2LWJ5dGUgd2lyZSBsaW1pdCBhdCBicm9hZGNhc3QnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgIGFkZFRyYW5zZmVyKGJ1aWxkZXIpO1xuICAgIGJ1aWxkZXIudmVyc2lvbigxKS50cmFuc2FjdGlvbkNvbmZpZyh2MUNvbmZpZyk7XG5cbiAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCByYXdUeCA9ICh0eCBhcyBUcmFuc2FjdGlvbikudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgIC8vIEZvcmNlIGFuIG92ZXJzaXplZCB2MSBwYXlsb2FkIGJ5IHBhZGRpbmcgdGhlIHdpcmUgYnl0ZXMgcGFzdCB0aGUgbGltaXQuXG4gICAgY29uc3Qgd2lyZSA9IEJ1ZmZlci5mcm9tKHJhd1R4LCAnYmFzZTY0Jyk7XG4gICAgY29uc3Qgb3ZlcnNpemVkID0gQnVmZmVyLmNvbmNhdChbd2lyZSwgQnVmZmVyLmFsbG9jKDQwOTcpXSk7XG4gICAgb3ZlcnNpemVkWzBdLnNob3VsZC5lcXVhbCgweDgxKTtcblxuICAgIC8vIEJyb2FkY2FzdCB0aGUgb3ZlcnNpemVkIHYxIHR4IHRocm91Z2ggU29sLnByb3RvdHlwZS5icm9hZGNhc3RUcmFuc2FjdGlvbiB3aXRoIGFuIFJQQ1xuICAgIC8vIHN0dWIgdGhhdCBtdXN0IG5vdCBiZSByZWFjaGVkIC0gdGhlIHNpemUgZ3VhcmQgc2hvcnQtY2lyY3VpdHMgYmVmb3JlIHRoZSBSUEMgY2FsbC5cbiAgICBjb25zdCBjb2luID0geyBnZXREYXRhRnJvbU5vZGU6ICgpID0+IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignUlBDIHNob3VsZCBub3QgYmUgcmVhY2hlZCcpKSB9IGFzIHVua25vd24gYXMgU29sO1xuICAgIGF3YWl0IChTb2wucHJvdG90eXBlLmJyb2FkY2FzdFRyYW5zYWN0aW9uIGFzIChvcHRzOiB7IHNlcmlhbGl6ZWRTaWduZWRUcmFuc2FjdGlvbjogc3RyaW5nIH0pID0+IFByb21pc2U8bmV2ZXI+KVxuICAgICAgLmNhbGwoY29pbiwgeyBzZXJpYWxpemVkU2lnbmVkVHJhbnNhY3Rpb246IG92ZXJzaXplZC50b1N0cmluZygnYmFzZTY0JykgfSlcbiAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9leGNlZWRzIHRoZSA0MDk2LWJ5dGUgc2l6ZSBsaW1pdC8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGxlYXZlIHRoZSBub24tdjEgcGF0aCB1bmNoYW5nZWQgKHYwL2xlZ2FjeSBkZWZhdWx0KScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgYnVpbGRlci5jb25maWd1cmVBY2NvdW50KHtcbiAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgIGRlY3J5cHRhYmxlWmVyb0JhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzY1NTM2JyxcbiAgICAgIHByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDEsXG4gICAgfSk7XG5cbiAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCByYXdUeCA9ICh0eCBhcyBUcmFuc2FjdGlvbikudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAvLyBsZWdhY3kgdHJhbnNhY3Rpb24gZG9lcyBub3QgY2FycnkgdGhlIDB4ODEgdjEgcHJlZml4XG4gICAgQnVmZmVyLmZyb20ocmF3VHgsICdiYXNlNjQnKVswXS5zaG91bGQubm90LmVxdWFsKDB4ODEpO1xuICAgICh0eCBhcyBUcmFuc2FjdGlvbikuaXNWZXJzaW9uZWRUcmFuc2FjdGlvbigpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gIH0pO1xufSk7XG4iXX0=
|