UNPKG

16.6 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const client_common_1 = require("@neo-one/client-common");
4const errors_1 = require("../errors");
5const utils_1 = require("../utils");
6const common_1 = require("./common");
7const Input_1 = require("./Input");
8const TransactionBase_1 = require("./TransactionBase");
9const TransactionType_1 = require("./TransactionType");
10class ClaimTransaction extends TransactionBase_1.TransactionBase(client_common_1.ClaimTransactionModel) {
11 constructor(add) {
12 super(add);
13 this.sizeExclusive = utils_1.utils.lazy(() => client_common_1.IOHelper.sizeOfUInt8 + client_common_1.IOHelper.sizeOfArray(this.claims, (claim) => claim.size));
14 const getScriptHashesForVerifying = super.getScriptHashesForVerifying.bind(this);
15 this.claimGetScriptHashesForVerifyingInternal = utils_1.utils.lazyAsync(async (options) => {
16 const { getOutput } = options;
17 const [hashesSet, hashes] = await Promise.all([
18 getScriptHashesForVerifying(options),
19 Promise.all(this.claims.map(async (claim) => {
20 const output = await getOutput(claim);
21 return client_common_1.common.uInt160ToHex(output.address);
22 })),
23 ]);
24 return new Set([...hashesSet, ...hashes]);
25 });
26 }
27 static deserializeWireBase(options) {
28 const { reader } = options;
29 const { type, version } = super.deserializeTransactionBaseStartWireBase(options);
30 if (type !== TransactionType_1.TransactionType.Claim) {
31 throw new client_common_1.InvalidFormatError(`Expected transaction type to be ${TransactionType_1.TransactionType.Claim}. Received: ${type}`);
32 }
33 const claims = reader.readArray(() => Input_1.Input.deserializeWireBase(options));
34 const { attributes, inputs, outputs, scripts } = super.deserializeTransactionBaseEndWireBase(options);
35 return new this({
36 version,
37 claims,
38 attributes,
39 inputs,
40 outputs,
41 scripts,
42 });
43 }
44 async getNetworkFee(_context) {
45 return utils_1.utils.ZERO;
46 }
47 async getClaimReferences({ getOutput }) {
48 return Promise.all(this.claims.map(async (input) => getOutput(input)));
49 }
50 async getScriptHashesForVerifying(options) {
51 return this.claimGetScriptHashesForVerifyingInternal(options);
52 }
53 async verify(options) {
54 const [results] = await Promise.all([super.verify(options), this.verifyInternal(options)]);
55 return results;
56 }
57 async serializeJSON(context) {
58 const transactionBaseJSON = await super.serializeTransactionBaseJSON(context);
59 return Object.assign({}, transactionBaseJSON, { type: 'ClaimTransaction', claims: this.claims.map((claim) => claim.serializeJSON(context)) });
60 }
61 async verifyInternal(options) {
62 const { calculateClaimAmount, getOutput, utilityToken, memPool = [] } = options;
63 if (common_1.hasDuplicateInputs(this.claims)) {
64 throw new errors_1.VerifyError('Duplicate claims');
65 }
66 if (memPool.some((transaction) => transaction instanceof ClaimTransaction &&
67 transaction.type === TransactionType_1.TransactionType.Claim &&
68 common_1.hasIntersectingInputs(this.claims, transaction.claims))) {
69 throw new errors_1.VerifyError('Duplicate claims in mempool');
70 }
71 const [results, claimAmount] = await Promise.all([
72 this.getTransactionResults({ getOutput }),
73 calculateClaimAmount(this.claims).catch((error) => {
74 throw new errors_1.VerifyError(`Invalid claims: ${error.message}`);
75 }),
76 ]);
77 const result = Object.entries(results).find(([assetHex, _value]) => client_common_1.common.uInt256Equal(client_common_1.common.hexToUInt256(assetHex), utilityToken.hash));
78 if (result === undefined || result[1].gt(utils_1.utils.ZERO)) {
79 throw new errors_1.VerifyError('Invalid claim value');
80 }
81 if (!claimAmount.eq(result[1].neg())) {
82 throw new errors_1.VerifyError('Invalid claim value');
83 }
84 }
85}
86exports.ClaimTransaction = ClaimTransaction;
87
88//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNsYWltVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwwREFRZ0M7QUFHaEMsc0NBQXdDO0FBRXhDLG9DQUFpQztBQUlqQyxxQ0FBcUU7QUFDckUsbUNBQWdDO0FBRWhDLHVEQU0yQjtBQUMzQix1REFBb0Q7QUFJcEQsTUFBYSxnQkFBaUIsU0FBUSxpQ0FBZSxDQUluRCxxQ0FBcUIsQ0FBQztJQWdDdEIsWUFBbUIsR0FBd0I7UUFDekMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBUk0sa0JBQWEsR0FBaUIsYUFBSyxDQUFDLElBQUksQ0FDekQsR0FBRyxFQUFFLENBQUMsd0JBQVEsQ0FBQyxXQUFXLEdBQUcsd0JBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUN0RixDQUFDO1FBUUEsTUFBTSwyQkFBMkIsR0FBRyxLQUFLLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyx3Q0FBd0MsR0FBRyxhQUFLLENBQUMsU0FBUyxDQUM3RCxLQUFLLEVBQUUsT0FBc0QsRUFBRSxFQUFFO1lBQy9ELE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxPQUFPLENBQUM7WUFDOUIsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQzVDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQztnQkFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FDVCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7b0JBQzlCLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUV0QyxPQUFPLHNCQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDN0MsQ0FBQyxDQUFDLENBQ0g7YUFDRixDQUFDLENBQUM7WUFFSCxPQUFPLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQXBETSxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBbUM7UUFDbkUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUUzQixNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVqRixJQUFJLElBQUksS0FBSyxpQ0FBZSxDQUFDLEtBQUssRUFBRTtZQUNsQyxNQUFNLElBQUksa0NBQWtCLENBQUMsbUNBQW1DLGlDQUFlLENBQUMsS0FBSyxlQUFlLElBQUksRUFBRSxDQUFDLENBQUM7U0FDN0c7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLGFBQUssQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRTFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUMscUNBQXFDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdEcsT0FBTyxJQUFJLElBQUksQ0FBQztZQUNkLE9BQU87WUFDUCxNQUFNO1lBQ04sVUFBVTtZQUNWLE1BQU07WUFDTixPQUFPO1lBQ1AsT0FBTztTQUNSLENBQUMsQ0FBQztJQUNMLENBQUM7SUFpQ00sS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFvQjtRQUM3QyxPQUFPLGFBQUssQ0FBQyxJQUFJLENBQUM7SUFDcEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLFNBQVMsRUFBd0I7UUFDakUsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVNLEtBQUssQ0FBQywyQkFBMkIsQ0FDdEMsT0FBc0Q7UUFFdEQsT0FBTyxJQUFJLENBQUMsd0NBQXdDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBaUM7UUFDbkQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0YsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVNLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBNkI7UUFDdEQsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU5RSx5QkFDSyxtQkFBbUIsSUFDdEIsSUFBSSxFQUFFLGtCQUFrQixFQUN4QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsSUFDaEU7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFpQztRQUM1RCxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQ2hGLElBQUksMkJBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ25DLE1BQU0sSUFBSSxvQkFBVyxDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDM0M7UUFFRCxJQUNFLE9BQU8sQ0FBQyxJQUFJLENBQ1YsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUNkLFdBQVcsWUFBWSxnQkFBZ0I7WUFDdkMsV0FBVyxDQUFDLElBQUksS0FBSyxpQ0FBZSxDQUFDLEtBQUs7WUFDMUMsOEJBQXFCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQ3pELEVBQ0Q7WUFDQSxNQUFNLElBQUksb0JBQVcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1NBQ3REO1FBQ0QsTUFBTSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDL0MsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUM7WUFDekMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNoRCxNQUFNLElBQUksb0JBQVcsQ0FBQyxtQkFBbUIsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDNUQsQ0FBQyxDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBR0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQ2pFLHNCQUFNLENBQUMsWUFBWSxDQUFDLHNCQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FDdEUsQ0FBQztRQUVGLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNwRCxNQUFNLElBQUksb0JBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1NBQzlDO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7WUFDcEMsTUFBTSxJQUFJLG9CQUFXLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUM5QztJQUNILENBQUM7Q0FDRjtBQTdIRCw0Q0E2SEMiLCJmaWxlIjoibmVvLW9uZS1ub2RlLWNvcmUvc3JjL3RyYW5zYWN0aW9uL0NsYWltVHJhbnNhY3Rpb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDbGFpbVRyYW5zYWN0aW9uSlNPTixcbiAgQ2xhaW1UcmFuc2FjdGlvbk1vZGVsLFxuICBDbGFpbVRyYW5zYWN0aW9uTW9kZWxBZGQsXG4gIGNvbW1vbixcbiAgSW52YWxpZEZvcm1hdEVycm9yLFxuICBJT0hlbHBlcixcbiAgVUludDE2MEhleCxcbn0gZnJvbSAnQG5lby1vbmUvY2xpZW50LWNvbW1vbic7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gJ0BuZW8tb25lL3V0aWxzJztcbmltcG9ydCB7IEJOIH0gZnJvbSAnYm4uanMnO1xuaW1wb3J0IHsgVmVyaWZ5RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVXaXJlQmFzZU9wdGlvbnMsIFNlcmlhbGl6ZUpTT05Db250ZXh0IH0gZnJvbSAnLi4vU2VyaWFsaXphYmxlJztcbmltcG9ydCB7IHV0aWxzIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgVmVyaWZ5U2NyaXB0UmVzdWx0IH0gZnJvbSAnLi4vdm0nO1xuaW1wb3J0IHsgV2l0bmVzcyB9IGZyb20gJy4uL1dpdG5lc3MnO1xuaW1wb3J0IHsgQXR0cmlidXRlIH0gZnJvbSAnLi9hdHRyaWJ1dGUnO1xuaW1wb3J0IHsgaGFzRHVwbGljYXRlSW5wdXRzLCBoYXNJbnRlcnNlY3RpbmdJbnB1dHMgfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgeyBJbnB1dCB9IGZyb20gJy4vSW5wdXQnO1xuaW1wb3J0IHsgT3V0cHV0IH0gZnJvbSAnLi9PdXRwdXQnO1xuaW1wb3J0IHtcbiAgRmVlQ29udGV4dCxcbiAgR2V0UmVmZXJlbmNlc09wdGlvbnMsXG4gIFRyYW5zYWN0aW9uQmFzZSxcbiAgVHJhbnNhY3Rpb25HZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdPcHRpb25zLFxuICBUcmFuc2FjdGlvblZlcmlmeU9wdGlvbnMsXG59IGZyb20gJy4vVHJhbnNhY3Rpb25CYXNlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJy4vVHJhbnNhY3Rpb25UeXBlJztcblxuZXhwb3J0IGludGVyZmFjZSBDbGFpbVRyYW5zYWN0aW9uQWRkIGV4dGVuZHMgQ2xhaW1UcmFuc2FjdGlvbk1vZGVsQWRkPEF0dHJpYnV0ZSwgSW5wdXQsIE91dHB1dCwgV2l0bmVzcz4ge31cblxuZXhwb3J0IGNsYXNzIENsYWltVHJhbnNhY3Rpb24gZXh0ZW5kcyBUcmFuc2FjdGlvbkJhc2U8XG4gIFRyYW5zYWN0aW9uVHlwZS5DbGFpbSxcbiAgQ2xhaW1UcmFuc2FjdGlvbkpTT04sXG4gIENvbnN0cnVjdG9yPENsYWltVHJhbnNhY3Rpb25Nb2RlbDxBdHRyaWJ1dGUsIElucHV0LCBPdXRwdXQsIFdpdG5lc3M+PlxuPihDbGFpbVRyYW5zYWN0aW9uTW9kZWwpIHtcbiAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZVdpcmVCYXNlKG9wdGlvbnM6IERlc2VyaWFsaXplV2lyZUJhc2VPcHRpb25zKTogQ2xhaW1UcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgeyByZWFkZXIgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCB7IHR5cGUsIHZlcnNpb24gfSA9IHN1cGVyLmRlc2VyaWFsaXplVHJhbnNhY3Rpb25CYXNlU3RhcnRXaXJlQmFzZShvcHRpb25zKTtcblxuICAgIGlmICh0eXBlICE9PSBUcmFuc2FjdGlvblR5cGUuQ2xhaW0pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRm9ybWF0RXJyb3IoYEV4cGVjdGVkIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgJHtUcmFuc2FjdGlvblR5cGUuQ2xhaW19LiBSZWNlaXZlZDogJHt0eXBlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGNsYWltcyA9IHJlYWRlci5yZWFkQXJyYXkoKCkgPT4gSW5wdXQuZGVzZXJpYWxpemVXaXJlQmFzZShvcHRpb25zKSk7XG5cbiAgICBjb25zdCB7IGF0dHJpYnV0ZXMsIGlucHV0cywgb3V0cHV0cywgc2NyaXB0cyB9ID0gc3VwZXIuZGVzZXJpYWxpemVUcmFuc2FjdGlvbkJhc2VFbmRXaXJlQmFzZShvcHRpb25zKTtcblxuICAgIHJldHVybiBuZXcgdGhpcyh7XG4gICAgICB2ZXJzaW9uLFxuICAgICAgY2xhaW1zLFxuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIGlucHV0cyxcbiAgICAgIG91dHB1dHMsXG4gICAgICBzY3JpcHRzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGNsYWltcyE6IHJlYWRvbmx5IElucHV0W107XG4gIHByb3RlY3RlZCByZWFkb25seSBzaXplRXhjbHVzaXZlOiAoKSA9PiBudW1iZXIgPSB1dGlscy5sYXp5KFxuICAgICgpID0+IElPSGVscGVyLnNpemVPZlVJbnQ4ICsgSU9IZWxwZXIuc2l6ZU9mQXJyYXkodGhpcy5jbGFpbXMsIChjbGFpbSkgPT4gY2xhaW0uc2l6ZSksXG4gICk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xhaW1HZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdJbnRlcm5hbDogKFxuICAgIG9wdGlvbnM6IFRyYW5zYWN0aW9uR2V0U2NyaXB0SGFzaGVzRm9yVmVyaWZ5aW5nT3B0aW9ucyxcbiAgKSA9PiBQcm9taXNlPFNldDxVSW50MTYwSGV4Pj47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGFkZDogQ2xhaW1UcmFuc2FjdGlvbkFkZCkge1xuICAgIHN1cGVyKGFkZCk7XG5cbiAgICBjb25zdCBnZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmcgPSBzdXBlci5nZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmcuYmluZCh0aGlzKTtcbiAgICB0aGlzLmNsYWltR2V0U2NyaXB0SGFzaGVzRm9yVmVyaWZ5aW5nSW50ZXJuYWwgPSB1dGlscy5sYXp5QXN5bmMoXG4gICAgICBhc3luYyAob3B0aW9uczogVHJhbnNhY3Rpb25HZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdPcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZ2V0T3V0cHV0IH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBbaGFzaGVzU2V0LCBoYXNoZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIGdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZyhvcHRpb25zKSxcbiAgICAgICAgICBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHRoaXMuY2xhaW1zLm1hcChhc3luYyAoY2xhaW0pID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZ2V0T3V0cHV0KGNsYWltKTtcblxuICAgICAgICAgICAgICByZXR1cm4gY29tbW9uLnVJbnQxNjBUb0hleChvdXRwdXQuYWRkcmVzcyk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICBdKTtcblxuICAgICAgICByZXR1cm4gbmV3IFNldChbLi4uaGFzaGVzU2V0LCAuLi5oYXNoZXNdKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXROZXR3b3JrRmVlKF9jb250ZXh0OiBGZWVDb250ZXh0KTogUHJvbWlzZTxCTj4ge1xuICAgIHJldHVybiB1dGlscy5aRVJPO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENsYWltUmVmZXJlbmNlcyh7IGdldE91dHB1dCB9OiBHZXRSZWZlcmVuY2VzT3B0aW9ucyk6IFByb21pc2U8cmVhZG9ubHkgT3V0cHV0W10+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5jbGFpbXMubWFwKGFzeW5jIChpbnB1dCkgPT4gZ2V0T3V0cHV0KGlucHV0KSkpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZyhcbiAgICBvcHRpb25zOiBUcmFuc2FjdGlvbkdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZ09wdGlvbnMsXG4gICk6IFByb21pc2U8U2V0PFVJbnQxNjBIZXg+PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xhaW1HZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdJbnRlcm5hbChvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB2ZXJpZnkob3B0aW9uczogVHJhbnNhY3Rpb25WZXJpZnlPcHRpb25zKTogUHJvbWlzZTxyZWFkb25seSBWZXJpZnlTY3JpcHRSZXN1bHRbXT4ge1xuICAgIGNvbnN0IFtyZXN1bHRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtzdXBlci52ZXJpZnkob3B0aW9ucyksIHRoaXMudmVyaWZ5SW50ZXJuYWwob3B0aW9ucyldKTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNlcmlhbGl6ZUpTT04oY29udGV4dDogU2VyaWFsaXplSlNPTkNvbnRleHQpOiBQcm9taXNlPENsYWltVHJhbnNhY3Rpb25KU09OPiB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25CYXNlSlNPTiA9IGF3YWl0IHN1cGVyLnNlcmlhbGl6ZVRyYW5zYWN0aW9uQmFzZUpTT04oY29udGV4dCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udHJhbnNhY3Rpb25CYXNlSlNPTixcbiAgICAgIHR5cGU6ICdDbGFpbVRyYW5zYWN0aW9uJyxcbiAgICAgIGNsYWltczogdGhpcy5jbGFpbXMubWFwKChjbGFpbSkgPT4gY2xhaW0uc2VyaWFsaXplSlNPTihjb250ZXh0KSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdmVyaWZ5SW50ZXJuYWwob3B0aW9uczogVHJhbnNhY3Rpb25WZXJpZnlPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBjYWxjdWxhdGVDbGFpbUFtb3VudCwgZ2V0T3V0cHV0LCB1dGlsaXR5VG9rZW4sIG1lbVBvb2wgPSBbXSB9ID0gb3B0aW9ucztcbiAgICBpZiAoaGFzRHVwbGljYXRlSW5wdXRzKHRoaXMuY2xhaW1zKSkge1xuICAgICAgdGhyb3cgbmV3IFZlcmlmeUVycm9yKCdEdXBsaWNhdGUgY2xhaW1zJyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgbWVtUG9vbC5zb21lKFxuICAgICAgICAodHJhbnNhY3Rpb24pID0+XG4gICAgICAgICAgdHJhbnNhY3Rpb24gaW5zdGFuY2VvZiBDbGFpbVRyYW5zYWN0aW9uICYmXG4gICAgICAgICAgdHJhbnNhY3Rpb24udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkNsYWltICYmXG4gICAgICAgICAgaGFzSW50ZXJzZWN0aW5nSW5wdXRzKHRoaXMuY2xhaW1zLCB0cmFuc2FjdGlvbi5jbGFpbXMpLFxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFZlcmlmeUVycm9yKCdEdXBsaWNhdGUgY2xhaW1zIGluIG1lbXBvb2wnKTtcbiAgICB9XG4gICAgY29uc3QgW3Jlc3VsdHMsIGNsYWltQW1vdW50XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMuZ2V0VHJhbnNhY3Rpb25SZXN1bHRzKHsgZ2V0T3V0cHV0IH0pLFxuICAgICAgY2FsY3VsYXRlQ2xhaW1BbW91bnQodGhpcy5jbGFpbXMpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgVmVyaWZ5RXJyb3IoYEludmFsaWQgY2xhaW1zOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9KSxcbiAgICBdKTtcblxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWRcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuZW50cmllcyhyZXN1bHRzKS5maW5kKChbYXNzZXRIZXgsIF92YWx1ZV0pID0+XG4gICAgICBjb21tb24udUludDI1NkVxdWFsKGNvbW1vbi5oZXhUb1VJbnQyNTYoYXNzZXRIZXgpLCB1dGlsaXR5VG9rZW4uaGFzaCksXG4gICAgKTtcblxuICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCB8fCByZXN1bHRbMV0uZ3QodXRpbHMuWkVSTykpIHtcbiAgICAgIHRocm93IG5ldyBWZXJpZnlFcnJvcignSW52YWxpZCBjbGFpbSB2YWx1ZScpO1xuICAgIH1cblxuICAgIGlmICghY2xhaW1BbW91bnQuZXEocmVzdWx0WzFdLm5lZygpKSkge1xuICAgICAgdGhyb3cgbmV3IFZlcmlmeUVycm9yKCdJbnZhbGlkIGNsYWltIHZhbHVlJyk7XG4gICAgfVxuICB9XG59XG4iXX0=