@bitgo-beta/abstract-substrate 1.0.1-beta.8 → 1.0.1-beta.800

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/src/abstractSubstrateCoin.d.ts +60 -3
  2. package/dist/src/abstractSubstrateCoin.d.ts.map +1 -1
  3. package/dist/src/abstractSubstrateCoin.js +374 -15
  4. package/dist/src/index.d.ts +1 -0
  5. package/dist/src/index.d.ts.map +1 -1
  6. package/dist/src/index.js +16 -1
  7. package/dist/src/lib/constants.d.ts +2 -0
  8. package/dist/src/lib/constants.d.ts.map +1 -0
  9. package/dist/src/lib/constants.js +5 -0
  10. package/dist/src/lib/errors.d.ts +8 -0
  11. package/dist/src/lib/errors.d.ts.map +1 -0
  12. package/dist/src/lib/errors.js +19 -0
  13. package/dist/src/lib/iface.d.ts +250 -0
  14. package/dist/src/lib/iface.d.ts.map +1 -0
  15. package/dist/src/lib/iface.js +83 -0
  16. package/dist/src/lib/index.d.ts +12 -0
  17. package/dist/src/lib/index.d.ts.map +1 -0
  18. package/dist/src/lib/index.js +61 -0
  19. package/dist/src/lib/keyPair.d.ts +31 -0
  20. package/dist/src/lib/keyPair.d.ts.map +1 -0
  21. package/dist/src/lib/keyPair.js +110 -0
  22. package/dist/src/lib/nativeTransferBuilder.d.ts +61 -0
  23. package/dist/src/lib/nativeTransferBuilder.d.ts.map +1 -0
  24. package/dist/src/lib/nativeTransferBuilder.js +150 -0
  25. package/dist/src/lib/singletonRegistry.d.ts +8 -0
  26. package/dist/src/lib/singletonRegistry.d.ts.map +1 -0
  27. package/dist/src/lib/singletonRegistry.js +20 -0
  28. package/dist/src/lib/transaction.d.ts +74 -0
  29. package/dist/src/lib/transaction.d.ts.map +1 -0
  30. package/dist/src/lib/transaction.js +553 -0
  31. package/dist/src/lib/transactionBuilder.d.ts +121 -0
  32. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  33. package/dist/src/lib/transactionBuilder.js +334 -0
  34. package/dist/src/lib/transferBuilder.d.ts +6 -0
  35. package/dist/src/lib/transferBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/transferBuilder.js +11 -0
  37. package/dist/src/lib/txnSchema.d.ts +12 -0
  38. package/dist/src/lib/txnSchema.d.ts.map +1 -0
  39. package/dist/src/lib/txnSchema.js +71 -0
  40. package/dist/src/lib/utils.d.ts +139 -0
  41. package/dist/src/lib/utils.d.ts.map +1 -0
  42. package/dist/src/lib/utils.js +281 -0
  43. package/dist/tsconfig.tsbuildinfo +1 -1
  44. package/package.json +24 -6
  45. package/.eslintignore +0 -5
  46. package/.mocharc.yml +0 -8
  47. package/CHANGELOG.md +0 -10
@@ -0,0 +1,139 @@
1
+ import { BaseUtils, Seed } from '@bitgo-beta/sdk-core';
2
+ import { NetworkType } from '@bitgo-beta/statics';
3
+ import { KeyringPair } from '@polkadot/keyring/types';
4
+ import { UnsignedTransaction } from '@substrate/txwrapper-core';
5
+ import { DecodedSignedTx, DecodedSigningPayload, TypeRegistry } from '@substrate/txwrapper-core/lib/types';
6
+ import { KeyPair } from '.';
7
+ import { HexString, Material, TransferAllArgs, TransferArgs, TxMethod, AddStakeArgs, RemoveStakeArgs, BondArgs, BondExtraArgs, NominateArgs, ChillArgs, UnbondArgs, WithdrawUnbondedArgs, BatchArgs, MoveStakeArgs } from './iface';
8
+ export declare class Utils implements BaseUtils {
9
+ /** @inheritdoc */
10
+ isValidAddress(address: string): boolean;
11
+ /** @inheritdoc */
12
+ isValidBlockId(hash: string): boolean;
13
+ /** @inheritdoc */
14
+ isValidPrivateKey(key: string): boolean;
15
+ /** @inheritdoc */
16
+ isValidPublicKey(key: string): boolean;
17
+ /** @inheritdoc */
18
+ isValidSignature(signature: string): boolean;
19
+ /**
20
+ * Verifies the signature on a given message
21
+ *
22
+ * @param {string} signedMessage the signed message for the signature
23
+ * @param {string} signature the signature to verify
24
+ * @param {string} address the address of the signer
25
+ * @returns {boolean} whether the signature is valid or not
26
+ */
27
+ verifySignature(signedMessage: string, signature: string, address: string): boolean;
28
+ /** @inheritdoc */
29
+ isValidTransactionId(txId: string): boolean;
30
+ /**
31
+ * decodeSeed decodes a substrate seed
32
+ *
33
+ * @param {string} seed - the seed to be validated.
34
+ * @returns {Seed} - the object Seed
35
+ */
36
+ decodeSeed(seed: string): Seed;
37
+ /**
38
+ * keyPairFromSeed generates an object with secretKey and publicKey using the substrate sdk
39
+ * @param seed 32 bytes long seed
40
+ * @returns KeyPair
41
+ */
42
+ keyPairFromSeed(seed: Uint8Array): KeyPair;
43
+ /**
44
+ * Signing function. Implement this on the OFFLINE signing device.
45
+ *
46
+ * @param {KeyringPair} pair - The signing pair.
47
+ * @param {string} signingPayload - Payload to sign.
48
+ * @param {UnsignedTransaction} transaction - raw transaction to sign
49
+ * @param {Object} options
50
+ * @param {HexString} options.metadataRpc - metadata that is needed for substrate to sign
51
+ * @param {TypeRegistry} options.registry - metadata that is needed for substrate to sign
52
+ */
53
+ createSignedTx(pair: KeyringPair, signingPayload: string, transaction: UnsignedTransaction, options: {
54
+ metadataRpc: HexString;
55
+ registry: TypeRegistry;
56
+ }): string;
57
+ /**
58
+ * Serializes the signed transaction
59
+ *
60
+ * @param transaction Transaction to serialize
61
+ * @param signature Signature of the message
62
+ * @param metadataRpc Network metadata
63
+ * @param registry Transaction registry
64
+ * @returns string Serialized transaction
65
+ */
66
+ serializeSignedTransaction(transaction: UnsignedTransaction, signature: HexString, metadataRpc: `0x${string}`, registry: TypeRegistry): string;
67
+ /**
68
+ * Decodes the substrate address from the given format
69
+ *
70
+ * @param {string} address
71
+ * @param {number} [ss58Format]
72
+ * @returns {string}
73
+ */
74
+ decodeSubstrateAddress(address: string, ss58Format: number): string;
75
+ /**
76
+ * Decodes the substrate address from the given format
77
+ *
78
+ * @param {string} address
79
+ * @param {number} [ss58Format]
80
+ * @returns {string}
81
+ */
82
+ encodeSubstrateAddress(address: string, ss58Format?: number): string;
83
+ /**
84
+ * Retrieves the txHash of a signed txHex
85
+ *
86
+ * @param txHex signed transaction hex
87
+ * @returns {string}
88
+ */
89
+ getTxHash(txHex: string): string;
90
+ isSigningPayload(payload: DecodedSigningPayload | DecodedSignedTx): payload is DecodedSigningPayload;
91
+ isTransfer(arg: TxMethod['args']): arg is TransferArgs;
92
+ isTransferAll(arg: TxMethod['args']): arg is TransferAllArgs;
93
+ isAddStake(arg: TxMethod['args']): arg is AddStakeArgs;
94
+ isRemoveStake(arg: TxMethod['args']): arg is RemoveStakeArgs;
95
+ isBond(arg: TxMethod['args']): arg is BondArgs;
96
+ isBondExtra(arg: TxMethod['args']): arg is BondExtraArgs;
97
+ isNominate(arg: TxMethod['args']): arg is NominateArgs;
98
+ isChill(arg: TxMethod['args']): arg is ChillArgs;
99
+ isUnbond(arg: TxMethod['args']): arg is UnbondArgs;
100
+ isWithdrawUnbonded(arg: TxMethod['args']): arg is WithdrawUnbondedArgs;
101
+ isBatch(arg: TxMethod['args']): arg is BatchArgs;
102
+ isMoveStake(arg: TxMethod['args']): arg is MoveStakeArgs;
103
+ /**
104
+ * extracts and returns the signature in hex format given a raw signed transaction
105
+ *
106
+ * @param {string} rawTx signed raw transaction
107
+ * @param options registry substrate registry used to retrieve the signature
108
+ */
109
+ recoverSignatureFromRawTx(rawTx: string, options: {
110
+ registry: TypeRegistry;
111
+ }): string;
112
+ /**
113
+ * Decodes the dot address from the given format
114
+ *
115
+ * @param {string} address
116
+ * @param {number} [ss58Format]
117
+ * @returns {KeyPair}
118
+ */
119
+ decodeSubstrateAddressToKeyPair(address: string, ss58Format?: number): KeyPair;
120
+ /**
121
+ * Checks whether the given input is a hex string with with 0 value
122
+ * used to check whether a given transaction is immortal or mortal
123
+ * @param hexValue
124
+ */
125
+ isZeroHex(hexValue: string): boolean;
126
+ getMaterial(networkType: NetworkType): Material;
127
+ /**
128
+ * Decodes a substrate transaction from raw transaction hex
129
+ *
130
+ * @param {string} txHex - The raw transaction hex string to decode (signed or unsigned)
131
+ * @param {Material} material - Network material containing metadata and chain information
132
+ * @param {boolean} [isImmortalEra] - Whether the transaction uses immortal era (optional)
133
+ * @returns {DecodedSignedTx | DecodedSigningPayload} The decoded transaction object
134
+ */
135
+ decodeTransaction(txHex: string, material: Material, isImmortalEra?: boolean): DecodedSignedTx | DecodedSigningPayload;
136
+ }
137
+ declare const utils: Utils;
138
+ export default utils;
139
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,281 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Utils = void 0;
7
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
+ const keyring_1 = require("@polkadot/keyring");
9
+ const decode_1 = require("@polkadot/keyring/pair/decode");
10
+ const Extrinsic_1 = require("@polkadot/types/extrinsic/v4/Extrinsic");
11
+ const util_1 = require("@polkadot/util");
12
+ const util_crypto_1 = require("@polkadot/util-crypto");
13
+ const txwrapper_polkadot_1 = require("@substrate/txwrapper-polkadot");
14
+ const bs58_1 = __importDefault(require("bs58"));
15
+ const hi_base32_1 = __importDefault(require("hi-base32"));
16
+ const tweetnacl_1 = __importDefault(require("tweetnacl"));
17
+ const _1 = require(".");
18
+ const singletonRegistry_1 = require("./singletonRegistry");
19
+ class Utils {
20
+ /** @inheritdoc */
21
+ isValidAddress(address) {
22
+ try {
23
+ (0, keyring_1.encodeAddress)((0, util_1.isHex)(address) ? (0, util_1.hexToU8a)(address) : (0, keyring_1.decodeAddress)(address));
24
+ return true;
25
+ }
26
+ catch (error) {
27
+ return false;
28
+ }
29
+ }
30
+ /** @inheritdoc */
31
+ isValidBlockId(hash) {
32
+ return (0, util_1.isHex)(hash, 256);
33
+ }
34
+ /** @inheritdoc */
35
+ isValidPrivateKey(key) {
36
+ try {
37
+ const decodedPrv = (0, util_1.hexToU8a)(key);
38
+ return decodedPrv.length === tweetnacl_1.default.sign.secretKeyLength / 2;
39
+ }
40
+ catch (e) {
41
+ return false;
42
+ }
43
+ }
44
+ /** @inheritdoc */
45
+ isValidPublicKey(key) {
46
+ let pubKey = key;
47
+ // convert base58 pub key to hex format
48
+ // tss common pub is in base58 format and decodes to length of 32
49
+ if ((0, sdk_core_1.isBase58)(pubKey, 32)) {
50
+ const base58Decode = bs58_1.default.decode(pubKey);
51
+ pubKey = base58Decode.toString('hex');
52
+ }
53
+ return (0, sdk_core_1.isValidEd25519PublicKey)(pubKey);
54
+ }
55
+ /** @inheritdoc */
56
+ isValidSignature(signature) {
57
+ const signatureU8a = (0, util_1.u8aToU8a)(signature);
58
+ return [64, 65, 66].includes(signatureU8a.length);
59
+ }
60
+ /**
61
+ * Verifies the signature on a given message
62
+ *
63
+ * @param {string} signedMessage the signed message for the signature
64
+ * @param {string} signature the signature to verify
65
+ * @param {string} address the address of the signer
66
+ * @returns {boolean} whether the signature is valid or not
67
+ */
68
+ verifySignature(signedMessage, signature, address) {
69
+ const publicKey = (0, keyring_1.decodeAddress)(address);
70
+ const hexPublicKey = (0, util_1.u8aToHex)(publicKey);
71
+ return (0, util_crypto_1.signatureVerify)(signedMessage, signature, hexPublicKey).isValid;
72
+ }
73
+ /** @inheritdoc */
74
+ isValidTransactionId(txId) {
75
+ return (0, util_1.isHex)(txId, 256);
76
+ }
77
+ /**
78
+ * decodeSeed decodes a substrate seed
79
+ *
80
+ * @param {string} seed - the seed to be validated.
81
+ * @returns {Seed} - the object Seed
82
+ */
83
+ decodeSeed(seed) {
84
+ const decoded = hi_base32_1.default.decode.asBytes(seed);
85
+ return {
86
+ seed: Buffer.from(decoded),
87
+ };
88
+ }
89
+ /**
90
+ * keyPairFromSeed generates an object with secretKey and publicKey using the substrate sdk
91
+ * @param seed 32 bytes long seed
92
+ * @returns KeyPair
93
+ */
94
+ keyPairFromSeed(seed) {
95
+ const keyring = new keyring_1.Keyring({ type: 'ed25519' });
96
+ const keyringPair = keyring.addFromSeed(seed);
97
+ const pairJson = keyringPair.toJson();
98
+ const decodedKeyPair = (0, decode_1.decodePair)('', (0, util_crypto_1.base64Decode)(pairJson.encoded), pairJson.encoding.type);
99
+ return new _1.KeyPair({ prv: Buffer.from(decodedKeyPair.secretKey).toString('hex') });
100
+ }
101
+ /**
102
+ * Signing function. Implement this on the OFFLINE signing device.
103
+ *
104
+ * @param {KeyringPair} pair - The signing pair.
105
+ * @param {string} signingPayload - Payload to sign.
106
+ * @param {UnsignedTransaction} transaction - raw transaction to sign
107
+ * @param {Object} options
108
+ * @param {HexString} options.metadataRpc - metadata that is needed for substrate to sign
109
+ * @param {TypeRegistry} options.registry - metadata that is needed for substrate to sign
110
+ */
111
+ createSignedTx(pair, signingPayload, transaction, options) {
112
+ const { registry, metadataRpc } = options;
113
+ const { signature } = registry
114
+ .createType('ExtrinsicPayload', signingPayload, {
115
+ version: Extrinsic_1.EXTRINSIC_VERSION,
116
+ })
117
+ .sign(pair);
118
+ // Serialize a signed transaction.
119
+ return this.serializeSignedTransaction(transaction, signature, metadataRpc, registry);
120
+ }
121
+ /**
122
+ * Serializes the signed transaction
123
+ *
124
+ * @param transaction Transaction to serialize
125
+ * @param signature Signature of the message
126
+ * @param metadataRpc Network metadata
127
+ * @param registry Transaction registry
128
+ * @returns string Serialized transaction
129
+ */
130
+ serializeSignedTransaction(transaction, signature, metadataRpc, registry) {
131
+ return txwrapper_polkadot_1.construct.signedTx(transaction, signature, {
132
+ metadataRpc,
133
+ registry,
134
+ });
135
+ }
136
+ /**
137
+ * Decodes the substrate address from the given format
138
+ *
139
+ * @param {string} address
140
+ * @param {number} [ss58Format]
141
+ * @returns {string}
142
+ */
143
+ decodeSubstrateAddress(address, ss58Format) {
144
+ const keypair = new _1.KeyPair({ pub: Buffer.from((0, keyring_1.decodeAddress)(address, undefined, ss58Format)).toString('hex') });
145
+ return keypair.getAddress(ss58Format);
146
+ }
147
+ /**
148
+ * Decodes the substrate address from the given format
149
+ *
150
+ * @param {string} address
151
+ * @param {number} [ss58Format]
152
+ * @returns {string}
153
+ */
154
+ encodeSubstrateAddress(address, ss58Format) {
155
+ return (0, keyring_1.encodeAddress)(address, ss58Format);
156
+ }
157
+ /**
158
+ * Retrieves the txHash of a signed txHex
159
+ *
160
+ * @param txHex signed transaction hex
161
+ * @returns {string}
162
+ */
163
+ getTxHash(txHex) {
164
+ return txwrapper_polkadot_1.construct.txHash(txHex);
165
+ }
166
+ isSigningPayload(payload) {
167
+ return payload.blockHash !== undefined;
168
+ }
169
+ isTransfer(arg) {
170
+ return arg.dest?.id !== undefined && arg.value !== undefined;
171
+ }
172
+ isTransferAll(arg) {
173
+ return arg.dest?.id !== undefined && arg.keepAlive !== undefined;
174
+ }
175
+ isAddStake(arg) {
176
+ return (arg.amountStaked !== undefined &&
177
+ arg.hotkey !== undefined &&
178
+ arg.netuid !== undefined);
179
+ }
180
+ isRemoveStake(arg) {
181
+ return (arg.amountUnstaked !== undefined &&
182
+ arg.hotkey !== undefined &&
183
+ arg.netuid !== undefined);
184
+ }
185
+ isBond(arg) {
186
+ return (arg.value !== undefined &&
187
+ arg.controller !== undefined &&
188
+ arg.payee !== undefined);
189
+ }
190
+ isBondExtra(arg) {
191
+ return arg.maxAdditional !== undefined;
192
+ }
193
+ isNominate(arg) {
194
+ return arg.targets !== undefined;
195
+ }
196
+ isChill(arg) {
197
+ return true; // Chill has no arguments, so any object can be considered ChillArgs
198
+ }
199
+ isUnbond(arg) {
200
+ return arg.value !== undefined;
201
+ }
202
+ isWithdrawUnbonded(arg) {
203
+ return arg.numSlashingSpans !== undefined;
204
+ }
205
+ isBatch(arg) {
206
+ return arg.calls !== undefined && Array.isArray(arg.calls);
207
+ }
208
+ isMoveStake(arg) {
209
+ return (arg.originHotkey !== undefined &&
210
+ arg.destinationHotkey !== undefined &&
211
+ arg.originNetuid !== undefined &&
212
+ arg.destinationNetuid !== undefined &&
213
+ arg.alphaAmount !== undefined);
214
+ }
215
+ /**
216
+ * extracts and returns the signature in hex format given a raw signed transaction
217
+ *
218
+ * @param {string} rawTx signed raw transaction
219
+ * @param options registry substrate registry used to retrieve the signature
220
+ */
221
+ recoverSignatureFromRawTx(rawTx, options) {
222
+ const { registry } = options;
223
+ const methodCall = registry.createType('Extrinsic', rawTx, {
224
+ isSigned: true,
225
+ });
226
+ let signature = (0, util_1.u8aToHex)(methodCall.signature);
227
+ // remove 0x from the signature since this is how it's returned from TSS signing
228
+ if (signature.startsWith('0x')) {
229
+ signature = signature.substr(2);
230
+ }
231
+ return signature;
232
+ }
233
+ /**
234
+ * Decodes the dot address from the given format
235
+ *
236
+ * @param {string} address
237
+ * @param {number} [ss58Format]
238
+ * @returns {KeyPair}
239
+ */
240
+ decodeSubstrateAddressToKeyPair(address, ss58Format) {
241
+ return new _1.KeyPair({ pub: Buffer.from((0, keyring_1.decodeAddress)(address, undefined, ss58Format)).toString('hex') });
242
+ }
243
+ /**
244
+ * Checks whether the given input is a hex string with with 0 value
245
+ * used to check whether a given transaction is immortal or mortal
246
+ * @param hexValue
247
+ */
248
+ isZeroHex(hexValue) {
249
+ return hexValue === '0x00';
250
+ }
251
+ getMaterial(networkType) {
252
+ throw new Error('Method not implemented.');
253
+ }
254
+ /**
255
+ * Decodes a substrate transaction from raw transaction hex
256
+ *
257
+ * @param {string} txHex - The raw transaction hex string to decode (signed or unsigned)
258
+ * @param {Material} material - Network material containing metadata and chain information
259
+ * @param {boolean} [isImmortalEra] - Whether the transaction uses immortal era (optional)
260
+ * @returns {DecodedSignedTx | DecodedSigningPayload} The decoded transaction object
261
+ */
262
+ decodeTransaction(txHex, material, isImmortalEra = false) {
263
+ try {
264
+ const registry = singletonRegistry_1.SingletonRegistry.getInstance(material);
265
+ // Attempt to decode as a signed transaction or unsigned transaction
266
+ const decoded = (0, txwrapper_polkadot_1.decode)(txHex, {
267
+ metadataRpc: material.metadata,
268
+ registry,
269
+ isImmortalEra,
270
+ });
271
+ return decoded;
272
+ }
273
+ catch (error) {
274
+ throw new Error(`Failed to decode transaction: ${error}`);
275
+ }
276
+ }
277
+ }
278
+ exports.Utils = Utils;
279
+ const utils = new Utils();
280
+ exports.default = utils;
281
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQUEwRjtBQUUxRiwrQ0FBMEU7QUFDMUUsMERBQTJEO0FBRTNELHNFQUEyRTtBQUMzRSx5Q0FBcUU7QUFDckUsdURBQXNFO0FBR3RFLHNFQUFrRTtBQUNsRSxnREFBd0I7QUFDeEIsMERBQStCO0FBQy9CLDBEQUE2QjtBQUM3Qix3QkFBNEI7QUFrQjVCLDJEQUF3RDtBQUV4RCxNQUFhLEtBQUs7SUFDaEIsa0JBQWtCO0lBQ2xCLGNBQWMsQ0FBQyxPQUFlO1FBQzVCLElBQUksQ0FBQztZQUNILElBQUEsdUJBQWEsRUFBQyxJQUFBLFlBQUssRUFBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSxlQUFRLEVBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEsdUJBQWEsRUFBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzNFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGNBQWMsQ0FBQyxJQUFZO1FBQ3pCLE9BQU8sSUFBQSxZQUFLLEVBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsaUJBQWlCLENBQUMsR0FBVztRQUMzQixJQUFJLENBQUM7WUFDSCxNQUFNLFVBQVUsR0FBRyxJQUFBLGVBQVEsRUFBQyxHQUFHLENBQUMsQ0FBQztZQUNqQyxPQUFPLFVBQVUsQ0FBQyxNQUFNLEtBQUssbUJBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sS0FBSyxDQUFDO1FBQ2Ys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QUFTLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFHLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUyxDQUFDLFFBQWdCO1FBQ3hCLE9BQU8sUUFBUSxLQUFLLE1BQU0sQ0FBQztJQUM3QixDQUFDO0lBRUQsV0FBVyxDQUFDLFdBQXdCO1FBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILGlCQUFpQixDQUFDLEtBQWEsRUFBRSxRQUFrQixFQUFFLGFBQWEsR0FBRyxLQUFLO1FBQ3hFLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLHFDQUFpQixDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUV6RCxvRUFBb0U7WUFDcEUsTUFBTSxPQUFPLEdBQUcsSUFBQSwyQkFBTSxFQUFDLEtBQUssRUFBRTtnQkFDNUIsV0FBVyxFQUFFLFFBQVEsQ0FBQyxRQUFRO2dCQUM5QixRQUFRO2dCQUNSLGFBQWE7YUFDZCxDQUFDLENBQUM7WUFFSCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDNUQsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXZURCxzQkF1VEM7QUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO0FBRTFCLGtCQUFlLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VVdGlscywgaXNCYXNlNTgsIGlzVmFsaWRFZDI1NTE5UHVibGljS2V5LCBTZWVkIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgTmV0d29ya1R5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IGRlY29kZUFkZHJlc3MsIGVuY29kZUFkZHJlc3MsIEtleXJpbmcgfSBmcm9tICdAcG9sa2Fkb3Qva2V5cmluZyc7XG5pbXBvcnQgeyBkZWNvZGVQYWlyIH0gZnJvbSAnQHBvbGthZG90L2tleXJpbmcvcGFpci9kZWNvZGUnO1xuaW1wb3J0IHsgS2V5cmluZ1BhaXIgfSBmcm9tICdAcG9sa2Fkb3Qva2V5cmluZy90eXBlcyc7XG5pbXBvcnQgeyBFWFRSSU5TSUNfVkVSU0lPTiB9IGZyb20gJ0Bwb2xrYWRvdC90eXBlcy9leHRyaW5zaWMvdjQvRXh0cmluc2ljJztcbmltcG9ydCB7IGhleFRvVThhLCBpc0hleCwgdThhVG9IZXgsIHU4YVRvVThhIH0gZnJvbSAnQHBvbGthZG90L3V0aWwnO1xuaW1wb3J0IHsgYmFzZTY0RGVjb2RlLCBzaWduYXR1cmVWZXJpZnkgfSBmcm9tICdAcG9sa2Fkb3QvdXRpbC1jcnlwdG8nO1xuaW1wb3J0IHsgVW5zaWduZWRUcmFuc2FjdGlvbiB9IGZyb20gJ0BzdWJzdHJhdGUvdHh3cmFwcGVyLWNvcmUnO1xuaW1wb3J0IHsgRGVjb2RlZFNpZ25lZFR4LCBEZWNvZGVkU2lnbmluZ1BheWxvYWQsIFR5cGVSZWdpc3RyeSB9IGZyb20gJ0BzdWJzdHJhdGUvdHh3cmFwcGVyLWNvcmUvbGliL3R5cGVzJztcbmltcG9ydCB7IGNvbnN0cnVjdCwgZGVjb2RlIH0gZnJvbSAnQHN1YnN0cmF0ZS90eHdyYXBwZXItcG9sa2Fkb3QnO1xuaW1wb3J0IGJzNTggZnJvbSAnYnM1OCc7XG5pbXBvcnQgYmFzZTMyIGZyb20gJ2hpLWJhc2UzMic7XG5pbXBvcnQgbmFjbCBmcm9tICd0d2VldG5hY2wnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4nO1xuaW1wb3J0IHtcbiAgSGV4U3RyaW5nLFxuICBNYXRlcmlhbCxcbiAgVHJhbnNmZXJBbGxBcmdzLFxuICBUcmFuc2ZlckFyZ3MsXG4gIFR4TWV0aG9kLFxuICBBZGRTdGFrZUFyZ3MsXG4gIFJlbW92ZVN0YWtlQXJncyxcbiAgQm9uZEFyZ3MsXG4gIEJvbmRFeHRyYUFyZ3MsXG4gIE5vbWluYXRlQXJncyxcbiAgQ2hpbGxBcmdzLFxuICBVbmJvbmRBcmdzLFxuICBXaXRoZHJhd1VuYm9uZGVkQXJncyxcbiAgQmF0Y2hBcmdzLFxuICBNb3ZlU3Rha2VBcmdzLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IFNpbmdsZXRvblJlZ2lzdHJ5IH0gZnJvbSAnLi9zaW5nbGV0b25SZWdpc3RyeSc7XG5cbmV4cG9ydCBjbGFzcyBVdGlscyBpbXBsZW1lbnRzIEJhc2VVdGlscyB7XG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgZW5jb2RlQWRkcmVzcyhpc0hleChhZGRyZXNzKSA/IGhleFRvVThhKGFkZHJlc3MpIDogZGVjb2RlQWRkcmVzcyhhZGRyZXNzKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNIZXgoaGFzaCwgMjU2KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkUHJpdmF0ZUtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWNvZGVkUHJ2ID0gaGV4VG9VOGEoa2V5KTtcbiAgICAgIHJldHVybiBkZWNvZGVkUHJ2Lmxlbmd0aCA9PT0gbmFjbC5zaWduLnNlY3JldEtleUxlbmd0aCAvIDI7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkUHVibGljS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgbGV0IHB1YktleSA9IGtleTtcblxuICAgIC8vIGNvbnZlcnQgYmFzZTU4IHB1YiBrZXkgdG8gaGV4IGZvcm1hdFxuICAgIC8vIHRzcyBjb21tb24gcHViIGlzIGluIGJhc2U1OCBmb3JtYXQgYW5kIGRlY29kZXMgdG8gbGVuZ3RoIG9mIDMyXG4gICAgaWYgKGlzQmFzZTU4KHB1YktleSwgMzIpKSB7XG4gICAgICBjb25zdCBiYXNlNThEZWNvZGUgPSBiczU4LmRlY29kZShwdWJLZXkpO1xuICAgICAgcHViS2V5ID0gYmFzZTU4RGVjb2RlLnRvU3RyaW5nKCdoZXgnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNWYWxpZEVkMjU1MTlQdWJsaWNLZXkocHViS2V5KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkU2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2lnbmF0dXJlVThhID0gdThhVG9VOGEoc2lnbmF0dXJlKTtcbiAgICByZXR1cm4gWzY0LCA2NSwgNjZdLmluY2x1ZGVzKHNpZ25hdHVyZVU4YS5sZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBzaWduYXR1cmUgb24gYSBnaXZlbiBtZXNzYWdlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzaWduZWRNZXNzYWdlIHRoZSBzaWduZWQgbWVzc2FnZSBmb3IgdGhlIHNpZ25hdHVyZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnbmF0dXJlIHRoZSBzaWduYXR1cmUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIHRoZSBhZGRyZXNzIG9mIHRoZSBzaWduZXJcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIHNpZ25hdHVyZSBpcyB2YWxpZCBvciBub3RcbiAgICovXG4gIHZlcmlmeVNpZ25hdHVyZShzaWduZWRNZXNzYWdlOiBzdHJpbmcsIHNpZ25hdHVyZTogc3RyaW5nLCBhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBwdWJsaWNLZXkgPSBkZWNvZGVBZGRyZXNzKGFkZHJlc3MpO1xuICAgIGNvbnN0IGhleFB1YmxpY0tleSA9IHU4YVRvSGV4KHB1YmxpY0tleSk7XG5cbiAgICByZXR1cm4gc2lnbmF0dXJlVmVyaWZ5KHNpZ25lZE1lc3NhZ2UsIHNpZ25hdHVyZSwgaGV4UHVibGljS2V5KS5pc1ZhbGlkO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRUcmFuc2FjdGlvbklkKHR4SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc0hleCh0eElkLCAyNTYpO1xuICB9XG5cbiAgLyoqXG4gICAqIGRlY29kZVNlZWQgZGVjb2RlcyBhIHN1YnN0cmF0ZSBzZWVkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWVkIC0gdGhlIHNlZWQgdG8gYmUgdmFsaWRhdGVkLlxuICAgKiBAcmV0dXJucyB7U2VlZH0gLSB0aGUgb2JqZWN0IFNlZWRcbiAgICovXG4gIGRlY29kZVNlZWQoc2VlZDogc3RyaW5nKTogU2VlZCB7XG4gICAgY29uc3QgZGVjb2RlZCA9IGJhc2UzMi5kZWNvZGUuYXNCeXRlcyhzZWVkKTtcbiAgICByZXR1cm4ge1xuICAgICAgc2VlZDogQnVmZmVyLmZyb20oZGVjb2RlZCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBrZXlQYWlyRnJvbVNlZWQgZ2VuZXJhdGVzIGFuIG9iamVjdCB3aXRoIHNlY3JldEtleSBhbmQgcHVibGljS2V5IHVzaW5nIHRoZSBzdWJzdHJhdGUgc2RrXG4gICAqIEBwYXJhbSBzZWVkIDMyIGJ5dGVzIGxvbmcgc2VlZFxuICAgKiBAcmV0dXJucyBLZXlQYWlyXG4gICAqL1xuICBrZXlQYWlyRnJvbVNlZWQoc2VlZDogVWludDhBcnJheSk6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleXJpbmcgPSBuZXcgS2V5cmluZyh7IHR5cGU6ICdlZDI1NTE5JyB9KTtcbiAgICBjb25zdCBrZXlyaW5nUGFpciA9IGtleXJpbmcuYWRkRnJvbVNlZWQoc2VlZCk7XG4gICAgY29uc3QgcGFpckpzb24gPSBrZXlyaW5nUGFpci50b0pzb24oKTtcbiAgICBjb25zdCBkZWNvZGVkS2V5UGFpciA9IGRlY29kZVBhaXIoJycsIGJhc2U2NERlY29kZShwYWlySnNvbi5lbmNvZGVkKSwgcGFpckpzb24uZW5jb2RpbmcudHlwZSk7XG4gICAgcmV0dXJuIG5ldyBLZXlQYWlyKHsgcHJ2OiBCdWZmZXIuZnJvbShkZWNvZGVkS2V5UGFpci5zZWNyZXRLZXkpLnRvU3RyaW5nKCdoZXgnKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduaW5nIGZ1bmN0aW9uLiBJbXBsZW1lbnQgdGhpcyBvbiB0aGUgT0ZGTElORSBzaWduaW5nIGRldmljZS5cbiAgICpcbiAgICogQHBhcmFtIHtLZXlyaW5nUGFpcn0gcGFpciAtIFRoZSBzaWduaW5nIHBhaXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzaWduaW5nUGF5bG9hZCAtIFBheWxvYWQgdG8gc2lnbi5cbiAgICogQHBhcmFtIHtVbnNpZ25lZFRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvbiAtIHJhdyB0cmFuc2FjdGlvbiB0byBzaWduXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqIEBwYXJhbSB7SGV4U3RyaW5nfSBvcHRpb25zLm1ldGFkYXRhUnBjIC0gbWV0YWRhdGEgdGhhdCBpcyBuZWVkZWQgZm9yIHN1YnN0cmF0ZSB0byBzaWduXG4gICAqIEBwYXJhbSB7VHlwZVJlZ2lzdHJ5fSBvcHRpb25zLnJlZ2lzdHJ5IC0gbWV0YWRhdGEgdGhhdCBpcyBuZWVkZWQgZm9yIHN1YnN0cmF0ZSB0byBzaWduXG4gICAqL1xuICBjcmVhdGVTaWduZWRUeChcbiAgICBwYWlyOiBLZXlyaW5nUGFpcixcbiAgICBzaWduaW5nUGF5bG9hZDogc3RyaW5nLFxuICAgIHRyYW5zYWN0aW9uOiBVbnNpZ25lZFRyYW5zYWN0aW9uLFxuICAgIG9wdGlvbnM6IHsgbWV0YWRhdGFScGM6IEhleFN0cmluZzsgcmVnaXN0cnk6IFR5cGVSZWdpc3RyeSB9XG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgeyByZWdpc3RyeSwgbWV0YWRhdGFScGMgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgeyBzaWduYXR1cmUgfSA9IHJlZ2lzdHJ5XG4gICAgICAuY3JlYXRlVHlwZSgnRXh0cmluc2ljUGF5bG9hZCcsIHNpZ25pbmdQYXlsb2FkLCB7XG4gICAgICAgIHZlcnNpb246IEVYVFJJTlNJQ19WRVJTSU9OLFxuICAgICAgfSlcbiAgICAgIC5zaWduKHBhaXIpO1xuXG4gICAgLy8gU2VyaWFsaXplIGEgc2lnbmVkIHRyYW5zYWN0aW9uLlxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZVNpZ25lZFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uLCBzaWduYXR1cmUsIG1ldGFkYXRhUnBjLCByZWdpc3RyeSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyB0aGUgc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbiBUcmFuc2FjdGlvbiB0byBzZXJpYWxpemVcbiAgICogQHBhcmFtIHNpZ25hdHVyZSBTaWduYXR1cmUgb2YgdGhlIG1lc3NhZ2VcbiAgICogQHBhcmFtIG1ldGFkYXRhUnBjIE5ldHdvcmsgbWV0YWRhdGFcbiAgICogQHBhcmFtIHJlZ2lzdHJ5IFRyYW5zYWN0aW9uIHJlZ2lzdHJ5XG4gICAqIEByZXR1cm5zIHN0cmluZyBTZXJpYWxpemVkIHRyYW5zYWN0aW9uXG4gICAqL1xuICBzZXJpYWxpemVTaWduZWRUcmFuc2FjdGlvbihcbiAgICB0cmFuc2FjdGlvbjogVW5zaWduZWRUcmFuc2FjdGlvbixcbiAgICBzaWduYXR1cmU6IEhleFN0cmluZyxcbiAgICBtZXRhZGF0YVJwYzogYDB4JHtzdHJpbmd9YCxcbiAgICByZWdpc3RyeTogVHlwZVJlZ2lzdHJ5XG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbnN0cnVjdC5zaWduZWRUeCh0cmFuc2FjdGlvbiwgc2lnbmF0dXJlLCB7XG4gICAgICBtZXRhZGF0YVJwYyxcbiAgICAgIHJlZ2lzdHJ5LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgdGhlIHN1YnN0cmF0ZSBhZGRyZXNzIGZyb20gdGhlIGdpdmVuIGZvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc1xuICAgKiBAcGFyYW0ge251bWJlcn0gW3NzNThGb3JtYXRdXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBkZWNvZGVTdWJzdHJhdGVBZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgc3M1OEZvcm1hdDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBrZXlwYWlyID0gbmV3IEtleVBhaXIoeyBwdWI6IEJ1ZmZlci5mcm9tKGRlY29kZUFkZHJlc3MoYWRkcmVzcywgdW5kZWZpbmVkLCBzczU4Rm9ybWF0KSkudG9TdHJpbmcoJ2hleCcpIH0pO1xuICAgIHJldHVybiBrZXlwYWlyLmdldEFkZHJlc3Moc3M1OEZvcm1hdCk7XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyB0aGUgc3Vic3RyYXRlIGFkZHJlc3MgZnJvbSB0aGUgZ2l2ZW4gZm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc3M1OEZvcm1hdF1cbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGVuY29kZVN1YnN0cmF0ZUFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBzczU4Rm9ybWF0PzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZW5jb2RlQWRkcmVzcyhhZGRyZXNzLCBzczU4Rm9ybWF0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHR4SGFzaCBvZiBhIHNpZ25lZCB0eEhleFxuICAgKlxuICAgKiBAcGFyYW0gdHhIZXggc2lnbmVkIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0VHhIYXNoKHR4SGV4OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjb25zdHJ1Y3QudHhIYXNoKHR4SGV4KTtcbiAgfVxuXG4gIGlzU2lnbmluZ1BheWxvYWQocGF5bG9hZDogRGVjb2RlZFNpZ25pbmdQYXlsb2FkIHwgRGVjb2RlZFNpZ25lZFR4KTogcGF5bG9hZCBpcyBEZWNvZGVkU2lnbmluZ1BheWxvYWQge1xuICAgIHJldHVybiAocGF5bG9hZCBhcyBEZWNvZGVkU2lnbmluZ1BheWxvYWQpLmJsb2NrSGFzaCAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNUcmFuc2Zlcihhcmc6IFR4TWV0aG9kWydhcmdzJ10pOiBhcmcgaXMgVHJhbnNmZXJBcmdzIHtcbiAgICByZXR1cm4gKGFyZyBhcyBUcmFuc2ZlckFyZ3MpLmRlc3Q/LmlkICE9PSB1bmRlZmluZWQgJiYgKGFyZyBhcyBUcmFuc2ZlckFyZ3MpLnZhbHVlICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBpc1RyYW5zZmVyQWxsKGFyZzogVHhNZXRob2RbJ2FyZ3MnXSk6IGFyZyBpcyBUcmFuc2ZlckFsbEFyZ3Mge1xuICAgIHJldHVybiAoYXJnIGFzIFRyYW5zZmVyQWxsQXJncykuZGVzdD8uaWQgIT09IHVuZGVmaW5lZCAmJiAoYXJnIGFzIFRyYW5zZmVyQWxsQXJncykua2VlcEFsaXZlICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBpc0FkZFN0YWtlKGFyZzogVHhNZXRob2RbJ2FyZ3MnXSk6IGFyZyBpcyBBZGRTdGFrZUFyZ3Mge1xuICAgIHJldHVybiAoXG4gICAgICAoYXJnIGFzIEFkZFN0YWtlQXJncykuYW1vdW50U3Rha2VkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChhcmcgYXMgQWRkU3Rha2VBcmdzKS5ob3RrZXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKGFyZyBhcyBBZGRTdGFrZUFyZ3MpLm5ldHVpZCAhPT0gdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIGlzUmVtb3ZlU3Rha2UoYXJnOiBUeE1ldGhvZFsnYXJncyddKTogYXJnIGlzIFJlbW92ZVN0YWtlQXJncyB7XG4gICAgcmV0dXJuIChcbiAgICAgIChhcmcgYXMgUmVtb3ZlU3Rha2VBcmdzKS5hbW91bnRVbnN0YWtlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoYXJnIGFzIFJlbW92ZVN0YWtlQXJncykuaG90a2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChhcmcgYXMgUmVtb3ZlU3Rha2VBcmdzKS5uZXR1aWQgIT09IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cblxuICBpc0JvbmQoYXJnOiBUeE1ldGhvZFsnYXJncyddKTogYXJnIGlzIEJvbmRBcmdzIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGFyZyBhcyBCb25kQXJncykudmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKGFyZyBhcyBCb25kQXJncykuY29udHJvbGxlciAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoYXJnIGFzIEJvbmRBcmdzKS5wYXllZSAhPT0gdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIGlzQm9uZEV4dHJhKGFyZzogVHhNZXRob2RbJ2FyZ3MnXSk6IGFyZyBpcyBCb25kRXh0cmFBcmdzIHtcbiAgICByZXR1cm4gKGFyZyBhcyBCb25kRXh0cmFBcmdzKS5tYXhBZGRpdGlvbmFsICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBpc05vbWluYXRlKGFyZzogVHhNZXRob2RbJ2FyZ3MnXSk6IGFyZyBpcyBOb21pbmF0ZUFyZ3Mge1xuICAgIHJldHVybiAoYXJnIGFzIE5vbWluYXRlQXJncykudGFyZ2V0cyAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNDaGlsbChhcmc6IFR4TWV0aG9kWydhcmdzJ10pOiBhcmcgaXMgQ2hpbGxBcmdzIHtcbiAgICByZXR1cm4gdHJ1ZTsgLy8gQ2hpbGwgaGFzIG5vIGFyZ3VtZW50cywgc28gYW55IG9iamVjdCBjYW4gYmUgY29uc2lkZXJlZCBDaGlsbEFyZ3NcbiAgfVxuXG4gIGlzVW5ib25kKGFyZzogVHhNZXRob2RbJ2FyZ3MnXSk6IGFyZyBpcyBVbmJvbmRBcmdzIHtcbiAgICByZXR1cm4gKGFyZyBhcyBVbmJvbmRBcmdzKS52YWx1ZSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNXaXRoZHJhd1VuYm9uZGVkKGFyZzogVHhNZXRob2RbJ2FyZ3MnXSk6IGFyZyBpcyBXaXRoZHJhd1VuYm9uZGVkQXJncyB7XG4gICAgcmV0dXJuIChhcmcgYXMgV2l0aGRyYXdVbmJvbmRlZEFyZ3MpLm51bVNsYXNoaW5nU3BhbnMgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlzQmF0Y2goYXJnOiBUeE1ldGhvZFsnYXJncyddKTogYXJnIGlzIEJhdGNoQXJncyB7XG4gICAgcmV0dXJuIChhcmcgYXMgQmF0Y2hBcmdzKS5jYWxscyAhPT0gdW5kZWZpbmVkICYmIEFycmF5LmlzQXJyYXkoKGFyZyBhcyBCYXRjaEFyZ3MpLmNhbGxzKTtcbiAgfVxuXG4gIGlzTW92ZVN0YWtlKGFyZzogVHhNZXRob2RbJ2FyZ3MnXSk6IGFyZyBpcyBNb3ZlU3Rha2VBcmdzIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGFyZyBhcyBNb3ZlU3Rha2VBcmdzKS5vcmlnaW5Ib3RrZXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKGFyZyBhcyBNb3ZlU3Rha2VBcmdzKS5kZXN0aW5hdGlvbkhvdGtleSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoYXJnIGFzIE1vdmVTdGFrZUFyZ3MpLm9yaWdpbk5ldHVpZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoYXJnIGFzIE1vdmVTdGFrZUFyZ3MpLmRlc3RpbmF0aW9uTmV0dWlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChhcmcgYXMgTW92ZVN0YWtlQXJncykuYWxwaGFBbW91bnQgIT09IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogZXh0cmFjdHMgYW5kIHJldHVybnMgdGhlIHNpZ25hdHVyZSBpbiBoZXggZm9ybWF0IGdpdmVuIGEgcmF3IHNpZ25lZCB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmF3VHggc2lnbmVkIHJhdyB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gb3B0aW9ucyByZWdpc3RyeSBzdWJzdHJhdGUgcmVnaXN0cnkgdXNlZCB0byByZXRyaWV2ZSB0aGUgc2lnbmF0dXJlXG4gICAqL1xuICByZWNvdmVyU2lnbmF0dXJlRnJvbVJhd1R4KHJhd1R4OiBzdHJpbmcsIG9wdGlvbnM6IHsgcmVnaXN0cnk6IFR5cGVSZWdpc3RyeSB9KTogc3RyaW5nIHtcbiAgICBjb25zdCB7IHJlZ2lzdHJ5IH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IG1ldGhvZENhbGwgPSByZWdpc3RyeS5jcmVhdGVUeXBlKCdFeHRyaW5zaWMnLCByYXdUeCwge1xuICAgICAgaXNTaWduZWQ6IHRydWUsXG4gICAgfSk7XG4gICAgbGV0IHNpZ25hdHVyZSA9IHU4YVRvSGV4KG1ldGhvZENhbGwuc2lnbmF0dXJlKSBhcyBzdHJpbmc7XG5cbiAgICAvLyByZW1vdmUgMHggZnJvbSB0aGUgc2lnbmF0dXJlIHNpbmNlIHRoaXMgaXMgaG93IGl0J3MgcmV0dXJuZWQgZnJvbSBUU1Mgc2lnbmluZ1xuICAgIGlmIChzaWduYXR1cmUuc3RhcnRzV2l0aCgnMHgnKSkge1xuICAgICAgc2lnbmF0dXJlID0gc2lnbmF0dXJlLnN1YnN0cigyKTtcbiAgICB9XG4gICAgcmV0dXJuIHNpZ25hdHVyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIHRoZSBkb3QgYWRkcmVzcyBmcm9tIHRoZSBnaXZlbiBmb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3NcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtzczU4Rm9ybWF0XVxuICAgKiBAcmV0dXJucyB7S2V5UGFpcn1cbiAgICovXG4gIGRlY29kZVN1YnN0cmF0ZUFkZHJlc3NUb0tleVBhaXIoYWRkcmVzczogc3RyaW5nLCBzczU4Rm9ybWF0PzogbnVtYmVyKTogS2V5UGFpciB7XG4gICAgcmV0dXJuIG5ldyBLZXlQYWlyKHsgcHViOiBCdWZmZXIuZnJvbShkZWNvZGVBZGRyZXNzKGFkZHJlc3MsIHVuZGVmaW5lZCwgc3M1OEZvcm1hdCkpLnRvU3RyaW5nKCdoZXgnKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gaW5wdXQgaXMgYSBoZXggc3RyaW5nIHdpdGggd2l0aCAwIHZhbHVlXG4gICAqIHVzZWQgdG8gY2hlY2sgd2hldGhlciBhIGdpdmVuIHRyYW5zYWN0aW9uIGlzIGltbW9ydGFsIG9yIG1vcnRhbFxuICAgKiBAcGFyYW0gaGV4VmFsdWVcbiAgICovXG4gIGlzWmVyb0hleChoZXhWYWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGhleFZhbHVlID09PSAnMHgwMCc7XG4gIH1cblxuICBnZXRNYXRlcmlhbChuZXR3b3JrVHlwZTogTmV0d29ya1R5cGUpOiBNYXRlcmlhbCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgYSBzdWJzdHJhdGUgdHJhbnNhY3Rpb24gZnJvbSByYXcgdHJhbnNhY3Rpb24gaGV4XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eEhleCAtIFRoZSByYXcgdHJhbnNhY3Rpb24gaGV4IHN0cmluZyB0byBkZWNvZGUgKHNpZ25lZCBvciB1bnNpZ25lZClcbiAgICogQHBhcmFtIHtNYXRlcmlhbH0gbWF0ZXJpYWwgLSBOZXR3b3JrIG1hdGVyaWFsIGNvbnRhaW5pbmcgbWV0YWRhdGEgYW5kIGNoYWluIGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzSW1tb3J0YWxFcmFdIC0gV2hldGhlciB0aGUgdHJhbnNhY3Rpb24gdXNlcyBpbW1vcnRhbCBlcmEgKG9wdGlvbmFsKVxuICAgKiBAcmV0dXJucyB7RGVjb2RlZFNpZ25lZFR4IHwgRGVjb2RlZFNpZ25pbmdQYXlsb2FkfSBUaGUgZGVjb2RlZCB0cmFuc2FjdGlvbiBvYmplY3RcbiAgICovXG4gIGRlY29kZVRyYW5zYWN0aW9uKHR4SGV4OiBzdHJpbmcsIG1hdGVyaWFsOiBNYXRlcmlhbCwgaXNJbW1vcnRhbEVyYSA9IGZhbHNlKTogRGVjb2RlZFNpZ25lZFR4IHwgRGVjb2RlZFNpZ25pbmdQYXlsb2FkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVnaXN0cnkgPSBTaW5nbGV0b25SZWdpc3RyeS5nZXRJbnN0YW5jZShtYXRlcmlhbCk7XG5cbiAgICAgIC8vIEF0dGVtcHQgdG8gZGVjb2RlIGFzIGEgc2lnbmVkIHRyYW5zYWN0aW9uIG9yIHVuc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlKHR4SGV4LCB7XG4gICAgICAgIG1ldGFkYXRhUnBjOiBtYXRlcmlhbC5tZXRhZGF0YSxcbiAgICAgICAgcmVnaXN0cnksXG4gICAgICAgIGlzSW1tb3J0YWxFcmEsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGRlY29kZWQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlY29kZSB0cmFuc2FjdGlvbjogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgdXRpbHMgPSBuZXcgVXRpbHMoKTtcblxuZXhwb3J0IGRlZmF1bHQgdXRpbHM7XG4iXX0=