@bitgo-beta/sdk-coin-tao 1.0.1-alpha.18 → 1.0.1-alpha.181
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/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/lib/constants.d.ts +11 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +14 -0
- package/dist/src/lib/iface.d.ts +14 -335
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -126
- package/dist/src/lib/index.d.ts +9 -9
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +30 -51
- package/dist/src/lib/moveStakeBuilder.d.ts +84 -0
- package/dist/src/lib/moveStakeBuilder.d.ts.map +1 -0
- package/dist/src/lib/moveStakeBuilder.js +182 -0
- package/dist/src/lib/moveStakeTransaction.d.ts +10 -0
- package/dist/src/lib/moveStakeTransaction.d.ts.map +1 -0
- package/dist/src/lib/moveStakeTransaction.js +68 -0
- package/dist/src/lib/stakingBuilder.d.ts +63 -0
- package/dist/src/lib/stakingBuilder.d.ts.map +1 -0
- package/dist/src/lib/stakingBuilder.js +133 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts +79 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/tokenTransferBuilder.js +165 -0
- package/dist/src/lib/tokenTransferTransaction.d.ts +8 -0
- package/dist/src/lib/tokenTransferTransaction.d.ts.map +1 -0
- package/dist/src/lib/tokenTransferTransaction.js +57 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +10 -4
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +33 -8
- package/dist/src/lib/transferBuilder.d.ts +2 -7
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +8 -3
- package/dist/src/lib/unstakeBuilder.d.ts +66 -0
- package/dist/src/lib/unstakeBuilder.d.ts.map +1 -0
- package/dist/src/lib/unstakeBuilder.js +136 -0
- package/dist/src/lib/utils.d.ts +5 -264
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +15 -480
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +5 -1
- package/dist/src/resources/index.d.ts +1 -1
- package/dist/src/resources/index.js +2 -2
- package/dist/src/resources/mainnet.d.ts +12 -1
- package/dist/src/resources/mainnet.d.ts.map +1 -1
- package/dist/src/resources/mainnet.js +14 -3
- package/dist/src/resources/testnet.d.ts +13 -0
- package/dist/src/resources/testnet.d.ts.map +1 -0
- package/dist/src/resources/testnet.js +16 -0
- package/dist/src/tao.d.ts +19 -6
- package/dist/src/tao.d.ts.map +1 -1
- package/dist/src/tao.js +43 -81
- package/dist/src/taoToken.d.ts +19 -0
- package/dist/src/taoToken.d.ts.map +1 -0
- package/dist/src/taoToken.js +52 -0
- package/dist/test/integration/index.d.ts +1 -0
- package/dist/test/integration/index.d.ts.map +1 -0
- package/dist/test/integration/index.js +1 -0
- package/dist/test/resources/index.d.ts +150 -0
- package/dist/test/resources/index.d.ts.map +1 -0
- package/dist/test/resources/index.js +166 -0
- package/dist/test/resources/materialData.json +8 -0
- package/dist/test/resources/materialDataModified.json +8 -0
- package/dist/{src/resources/westend.d.ts → test/resources/testnet.d.ts} +2 -2
- package/dist/test/resources/testnet.d.ts.map +1 -0
- package/dist/test/resources/testnet.js +5 -0
- package/dist/test/unit/fixtures.d.ts +31 -0
- package/dist/test/unit/fixtures.d.ts.map +1 -0
- package/dist/test/unit/fixtures.js +107 -0
- package/dist/test/unit/tao.d.ts +2 -0
- package/dist/test/unit/tao.d.ts.map +1 -0
- package/dist/test/unit/tao.js +487 -0
- package/dist/test/unit/transactionBuilder/base.d.ts +8 -0
- package/dist/test/unit/transactionBuilder/base.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/base.js +238 -0
- package/dist/test/unit/transactionBuilder/moveStakeBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/moveStakeBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/moveStakeBuilder.js +472 -0
- package/dist/test/unit/transactionBuilder/singeltonRegistry.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/singeltonRegistry.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/singeltonRegistry.js +59 -0
- package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingBuilder.js +112 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +93 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +75 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +309 -0
- package/dist/test/unit/transactionBuilder/unstakeBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/unstakeBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/unstakeBuilder.js +112 -0
- package/dist/test/unit/util.d.ts +2 -0
- package/dist/test/unit/util.d.ts.map +1 -0
- package/dist/test/unit/util.js +29 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +14 -20
- package/.eslintignore +0 -4
- package/.gitignore +0 -3
- package/.mocharc.yml +0 -8
- package/.prettierignore +0 -2
- package/CHANGELOG.md +0 -36
- package/dist/src/lib/errors.d.ts +0 -8
- package/dist/src/lib/errors.d.ts.map +0 -1
- package/dist/src/lib/errors.js +0 -19
- package/dist/src/lib/iface_utils.d.ts +0 -59
- package/dist/src/lib/iface_utils.d.ts.map +0 -1
- package/dist/src/lib/iface_utils.js +0 -92
- package/dist/src/lib/keyPair.d.ts +0 -38
- package/dist/src/lib/keyPair.d.ts.map +0 -1
- package/dist/src/lib/keyPair.js +0 -117
- package/dist/src/lib/nativeTransferBuilder.d.ts +0 -84
- package/dist/src/lib/nativeTransferBuilder.d.ts.map +0 -1
- package/dist/src/lib/nativeTransferBuilder.js +0 -219
- package/dist/src/lib/singletonRegistry.d.ts +0 -7
- package/dist/src/lib/singletonRegistry.d.ts.map +0 -1
- package/dist/src/lib/singletonRegistry.js +0 -20
- package/dist/src/lib/transaction.d.ts +0 -83
- package/dist/src/lib/transaction.d.ts.map +0 -1
- package/dist/src/lib/transaction.js +0 -610
- package/dist/src/lib/transactionBuilder.d.ts +0 -131
- package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilder.js +0 -351
- package/dist/src/lib/txnSchema.d.ts +0 -15
- package/dist/src/lib/txnSchema.d.ts.map +0 -1
- package/dist/src/lib/txnSchema.js +0 -117
- package/dist/src/resources/westend.d.ts.map +0 -1
- package/dist/src/resources/westend.js +0 -5
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
|
+
const should_1 = __importDefault(require("should"));
|
|
8
|
+
const sinon_1 = require("sinon");
|
|
9
|
+
const moveStakeBuilder_1 = require("../../../src/lib/moveStakeBuilder");
|
|
10
|
+
const utils_1 = __importDefault(require("../../../src/lib/utils"));
|
|
11
|
+
const resources_1 = require("../../resources");
|
|
12
|
+
const base_1 = require("./base");
|
|
13
|
+
const resources_2 = require("../../../src/resources");
|
|
14
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
15
|
+
// Test helper class to access private methods for testing
|
|
16
|
+
class TestMoveStakeBuilder extends moveStakeBuilder_1.MoveStakeBuilder {
|
|
17
|
+
setMethodForTesting(method) {
|
|
18
|
+
this._method = method;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
describe('Tao Move Stake Builder', function () {
|
|
22
|
+
const referenceBlock = '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d';
|
|
23
|
+
let builder;
|
|
24
|
+
const sender = resources_1.accounts.account1;
|
|
25
|
+
beforeEach(function () {
|
|
26
|
+
const config = (0, base_1.buildTestConfig)();
|
|
27
|
+
const material = utils_1.default.getMaterial(config.network.type);
|
|
28
|
+
builder = new moveStakeBuilder_1.MoveStakeBuilder(config).material(material);
|
|
29
|
+
});
|
|
30
|
+
describe('setter validation', function () {
|
|
31
|
+
it('should validate amount', function () {
|
|
32
|
+
assert_1.default.throws(() => builder.amount('-1'), (e) => e.message === 'Amount must be greater than zero');
|
|
33
|
+
assert_1.default.throws(() => builder.amount('0'), (e) => e.message === 'Amount must be greater than zero');
|
|
34
|
+
should_1.default.doesNotThrow(() => builder.amount('1000'));
|
|
35
|
+
should_1.default.doesNotThrow(() => builder.amount('1'));
|
|
36
|
+
});
|
|
37
|
+
it('should validate addresses', function () {
|
|
38
|
+
const spyValidateAddress = (0, sinon_1.spy)(builder, 'validateAddress');
|
|
39
|
+
assert_1.default.throws(() => builder.originHotkey({ address: 'abc' }), (e) => e.message === `The address 'abc' is not a well-formed dot address`);
|
|
40
|
+
assert_1.default.throws(() => builder.destinationHotkey({ address: 'abc' }), (e) => e.message === `The address 'abc' is not a well-formed dot address`);
|
|
41
|
+
should_1.default.doesNotThrow(() => builder.originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' }));
|
|
42
|
+
should_1.default.doesNotThrow(() => builder.destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' }));
|
|
43
|
+
sinon_1.assert.callCount(spyValidateAddress, 4);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('build move stake transaction', function () {
|
|
47
|
+
it('should build a move stake transaction', async function () {
|
|
48
|
+
builder
|
|
49
|
+
.amount('9007199254740995')
|
|
50
|
+
.originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
|
|
51
|
+
.destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
|
|
52
|
+
.originNetuid('1')
|
|
53
|
+
.destinationNetuid('1')
|
|
54
|
+
.sender({ address: sender.address })
|
|
55
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
56
|
+
.referenceBlock(referenceBlock)
|
|
57
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
|
|
58
|
+
.fee({ amount: 0, type: 'tip' });
|
|
59
|
+
const tx = await builder.build();
|
|
60
|
+
const txJson = tx.toJson();
|
|
61
|
+
txJson.should.have.properties([
|
|
62
|
+
'id',
|
|
63
|
+
'sender',
|
|
64
|
+
'referenceBlock',
|
|
65
|
+
'blockNumber',
|
|
66
|
+
'genesisHash',
|
|
67
|
+
'nonce',
|
|
68
|
+
'specVersion',
|
|
69
|
+
'transactionVersion',
|
|
70
|
+
'eraPeriod',
|
|
71
|
+
'chainName',
|
|
72
|
+
'tip',
|
|
73
|
+
'originHotkey',
|
|
74
|
+
'destinationHotkey',
|
|
75
|
+
'originNetuid',
|
|
76
|
+
'destinationNetuid',
|
|
77
|
+
'alphaAmount',
|
|
78
|
+
]);
|
|
79
|
+
txJson.sender.should.equal('5EGoFA95omzemRssELLDjVenNZ68aXyUeqtKQScXSEBvVJkr');
|
|
80
|
+
txJson.originHotkey.should.equal('5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT');
|
|
81
|
+
txJson.destinationHotkey.should.equal('5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq');
|
|
82
|
+
txJson.originNetuid.should.equal('1');
|
|
83
|
+
txJson.destinationNetuid.should.equal('1');
|
|
84
|
+
txJson.alphaAmount.should.equal('9007199254740995');
|
|
85
|
+
txJson.blockNumber.should.equal(3933);
|
|
86
|
+
txJson.nonce.should.equal(200);
|
|
87
|
+
txJson.tip.should.equal(0);
|
|
88
|
+
// Verify transaction explanation
|
|
89
|
+
const explanation = tx.explainTransaction();
|
|
90
|
+
explanation.should.have.properties(['outputAmount', 'changeAmount', 'fee']);
|
|
91
|
+
});
|
|
92
|
+
it('should validate required fields', function () {
|
|
93
|
+
assert_1.default.throws(() => builder.validateTransaction({}), (e) => e.message.includes('Transaction validation failed'));
|
|
94
|
+
});
|
|
95
|
+
it('should set and get origin netuid', function () {
|
|
96
|
+
builder.originNetuid('5');
|
|
97
|
+
// We can't directly access private fields, but we can verify through building
|
|
98
|
+
should_1.default.doesNotThrow(() => builder.originNetuid('5'));
|
|
99
|
+
});
|
|
100
|
+
it('should set and get destination netuid', function () {
|
|
101
|
+
builder.destinationNetuid('10');
|
|
102
|
+
// We can't directly access private fields, but we can verify through building
|
|
103
|
+
should_1.default.doesNotThrow(() => builder.destinationNetuid('10'));
|
|
104
|
+
});
|
|
105
|
+
it('should build transaction with different netuids', async function () {
|
|
106
|
+
builder
|
|
107
|
+
.amount('1000000000000')
|
|
108
|
+
.originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
|
|
109
|
+
.destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
|
|
110
|
+
.originNetuid('1')
|
|
111
|
+
.destinationNetuid('2')
|
|
112
|
+
.sender({ address: sender.address })
|
|
113
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
114
|
+
.referenceBlock(referenceBlock)
|
|
115
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
|
|
116
|
+
.fee({ amount: 0, type: 'tip' });
|
|
117
|
+
const tx = await builder.build();
|
|
118
|
+
const txJson = tx.toJson();
|
|
119
|
+
txJson.originNetuid.should.equal('1');
|
|
120
|
+
txJson.destinationNetuid.should.equal('2');
|
|
121
|
+
txJson.alphaAmount.should.equal('1000000000000');
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('validation', function () {
|
|
125
|
+
it('should validate move stake transaction schema', function () {
|
|
126
|
+
should_1.default.doesNotThrow(() => {
|
|
127
|
+
builder
|
|
128
|
+
.amount('1000000000000')
|
|
129
|
+
.originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
|
|
130
|
+
.destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
|
|
131
|
+
.originNetuid('1')
|
|
132
|
+
.destinationNetuid('1');
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
it('should throw error for invalid amount', function () {
|
|
136
|
+
assert_1.default.throws(() => builder.amount('-100'), (e) => e.message.includes('Amount must be greater than zero'));
|
|
137
|
+
});
|
|
138
|
+
it('should throw error for zero amount', function () {
|
|
139
|
+
assert_1.default.throws(() => builder.amount('0'), (e) => e.message === 'Amount must be greater than zero');
|
|
140
|
+
});
|
|
141
|
+
it('should validate netuid range for origin netuid', function () {
|
|
142
|
+
// Valid netuids
|
|
143
|
+
should_1.default.doesNotThrow(() => builder.originNetuid('0'));
|
|
144
|
+
should_1.default.doesNotThrow(() => builder.originNetuid('64'));
|
|
145
|
+
should_1.default.doesNotThrow(() => builder.originNetuid('128'));
|
|
146
|
+
// Invalid netuids
|
|
147
|
+
assert_1.default.throws(() => builder.originNetuid('-1'), (e) => e.message.includes('Invalid netuid: -1. Must be a non-negative integer.'));
|
|
148
|
+
assert_1.default.throws(() => builder.originNetuid('129'), (e) => e.message.includes('Invalid netuid: 129. Netuid must be between 0 and 128.'));
|
|
149
|
+
assert_1.default.throws(() => builder.originNetuid('abc'), (e) => e.message.includes('Invalid netuid: abc. Must be a non-negative integer.'));
|
|
150
|
+
});
|
|
151
|
+
it('should validate netuid range for destination netuid', function () {
|
|
152
|
+
// Valid netuids
|
|
153
|
+
should_1.default.doesNotThrow(() => builder.destinationNetuid('0'));
|
|
154
|
+
should_1.default.doesNotThrow(() => builder.destinationNetuid('64'));
|
|
155
|
+
should_1.default.doesNotThrow(() => builder.destinationNetuid('128'));
|
|
156
|
+
// Invalid netuids
|
|
157
|
+
assert_1.default.throws(() => builder.destinationNetuid('-1'), (e) => e.message.includes('Invalid netuid: -1. Must be a non-negative integer.'));
|
|
158
|
+
assert_1.default.throws(() => builder.destinationNetuid('129'), (e) => e.message.includes('Invalid netuid: 129. Netuid must be between 0 and 128.'));
|
|
159
|
+
assert_1.default.throws(() => builder.destinationNetuid('invalid'), (e) => e.message.includes('Invalid netuid: invalid. Must be a non-negative integer.'));
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
describe('TSS signature integration', function () {
|
|
163
|
+
it('should build a signed move stake transaction with TSS signature', async function () {
|
|
164
|
+
builder
|
|
165
|
+
.amount('9007199254740995')
|
|
166
|
+
.originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
|
|
167
|
+
.destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
|
|
168
|
+
.originNetuid('1')
|
|
169
|
+
.destinationNetuid('1')
|
|
170
|
+
.sender({ address: sender.address })
|
|
171
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
172
|
+
.referenceBlock(referenceBlock)
|
|
173
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
|
|
174
|
+
.fee({ amount: 0, type: 'tip' })
|
|
175
|
+
.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
176
|
+
const tx = await builder.build();
|
|
177
|
+
const txJson = tx.toJson();
|
|
178
|
+
txJson.alphaAmount.should.equal('9007199254740995');
|
|
179
|
+
txJson.originHotkey.should.equal('5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT');
|
|
180
|
+
txJson.destinationHotkey.should.equal('5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq');
|
|
181
|
+
txJson.originNetuid.should.equal('1');
|
|
182
|
+
txJson.destinationNetuid.should.equal('1');
|
|
183
|
+
txJson.sender.should.equal(sender.address);
|
|
184
|
+
txJson.blockNumber.should.equal(3933);
|
|
185
|
+
txJson.referenceBlock.should.equal(referenceBlock);
|
|
186
|
+
txJson.genesisHash.should.equal(resources_1.genesisHash);
|
|
187
|
+
txJson.specVersion.should.equal(Number(resources_2.testnetMaterial.specVersion));
|
|
188
|
+
txJson.nonce.should.equal(200);
|
|
189
|
+
txJson.tip.should.equal(0);
|
|
190
|
+
txJson.transactionVersion.should.equal(Number(resources_2.testnetMaterial.txVersion));
|
|
191
|
+
txJson.chainName.toLowerCase().should.equal(resources_1.chainName);
|
|
192
|
+
txJson.eraPeriod.should.equal(64);
|
|
193
|
+
});
|
|
194
|
+
it('should build an unsigned move stake transaction', async function () {
|
|
195
|
+
builder
|
|
196
|
+
.amount('50000000')
|
|
197
|
+
.originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
|
|
198
|
+
.destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
|
|
199
|
+
.originNetuid('1')
|
|
200
|
+
.destinationNetuid('2')
|
|
201
|
+
.sender({ address: sender.address })
|
|
202
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
203
|
+
.referenceBlock(referenceBlock)
|
|
204
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
|
|
205
|
+
.fee({ amount: 0, type: 'tip' });
|
|
206
|
+
const tx = await builder.build();
|
|
207
|
+
const txJson = tx.toJson();
|
|
208
|
+
txJson.alphaAmount.should.equal('50000000');
|
|
209
|
+
txJson.originHotkey.should.equal('5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT');
|
|
210
|
+
txJson.destinationHotkey.should.equal('5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq');
|
|
211
|
+
txJson.originNetuid.should.equal('1');
|
|
212
|
+
txJson.destinationNetuid.should.equal('2');
|
|
213
|
+
txJson.sender.should.equal(sender.address);
|
|
214
|
+
txJson.blockNumber.should.equal(3933);
|
|
215
|
+
txJson.referenceBlock.should.equal(referenceBlock);
|
|
216
|
+
txJson.genesisHash.should.equal(resources_1.genesisHash);
|
|
217
|
+
txJson.specVersion.should.equal(Number(resources_2.testnetMaterial.specVersion));
|
|
218
|
+
txJson.nonce.should.equal(200);
|
|
219
|
+
txJson.tip.should.equal(0);
|
|
220
|
+
txJson.transactionVersion.should.equal(Number(resources_2.testnetMaterial.txVersion));
|
|
221
|
+
txJson.chainName.toLowerCase().should.equal(resources_1.chainName);
|
|
222
|
+
txJson.eraPeriod.should.equal(64);
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
describe('comprehensive error handling', function () {
|
|
226
|
+
it('should throw error for missing origin hotkey', function () {
|
|
227
|
+
builder
|
|
228
|
+
.amount('1000000000000')
|
|
229
|
+
.destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
|
|
230
|
+
.originNetuid('1')
|
|
231
|
+
.destinationNetuid('1');
|
|
232
|
+
assert_1.default.throws(() => builder.validateTransaction({}), (e) => e.message.includes('Transaction validation failed'));
|
|
233
|
+
});
|
|
234
|
+
it('should throw error for missing destination hotkey', function () {
|
|
235
|
+
builder
|
|
236
|
+
.amount('1000000000000')
|
|
237
|
+
.originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
|
|
238
|
+
.originNetuid('1')
|
|
239
|
+
.destinationNetuid('1');
|
|
240
|
+
assert_1.default.throws(() => builder.validateTransaction({}), (e) => e.message.includes('Transaction validation failed'));
|
|
241
|
+
});
|
|
242
|
+
it('should throw error for missing origin netuid', function () {
|
|
243
|
+
builder
|
|
244
|
+
.amount('1000000000000')
|
|
245
|
+
.originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
|
|
246
|
+
.destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
|
|
247
|
+
.destinationNetuid('1');
|
|
248
|
+
assert_1.default.throws(() => builder.validateTransaction({}), (e) => e.message.includes('Transaction validation failed'));
|
|
249
|
+
});
|
|
250
|
+
it('should throw error for missing destination netuid', function () {
|
|
251
|
+
builder
|
|
252
|
+
.amount('1000000000000')
|
|
253
|
+
.originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
|
|
254
|
+
.destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
|
|
255
|
+
.originNetuid('1');
|
|
256
|
+
assert_1.default.throws(() => builder.validateTransaction({}), (e) => e.message.includes('Transaction validation failed'));
|
|
257
|
+
});
|
|
258
|
+
it('should throw error for missing amount', function () {
|
|
259
|
+
builder
|
|
260
|
+
.originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
|
|
261
|
+
.destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
|
|
262
|
+
.originNetuid('1')
|
|
263
|
+
.destinationNetuid('1');
|
|
264
|
+
assert_1.default.throws(() => builder.validateTransaction({}), (e) => e.message.includes('Transaction validation failed'));
|
|
265
|
+
});
|
|
266
|
+
it('should throw error for invalid transaction type in fromImplementation', function () {
|
|
267
|
+
const config = (0, base_1.buildTestConfig)();
|
|
268
|
+
const material = utils_1.default.getMaterial(config.network.type);
|
|
269
|
+
const mockBuilder = new TestMoveStakeBuilder(config).material(material);
|
|
270
|
+
mockBuilder.setMethodForTesting({
|
|
271
|
+
name: 'transferKeepAlive',
|
|
272
|
+
args: { dest: { id: 'test' }, value: '1000' },
|
|
273
|
+
pallet: 'balances',
|
|
274
|
+
});
|
|
275
|
+
assert_1.default.throws(() => {
|
|
276
|
+
// Call the validation logic directly
|
|
277
|
+
if (mockBuilder['_method']?.name !== 'moveStake') {
|
|
278
|
+
throw new sdk_core_1.InvalidTransactionError(`Invalid Transaction Type: ${mockBuilder['_method']?.name}. Expected moveStake`);
|
|
279
|
+
}
|
|
280
|
+
}, (e) => e.message.includes('Invalid Transaction Type: transferKeepAlive. Expected moveStake'));
|
|
281
|
+
});
|
|
282
|
+
it('should handle malformed raw transaction', function () {
|
|
283
|
+
assert_1.default.throws(() => builder.from('invalid_hex_data'), (e) => e.message !== undefined);
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
describe('boundary value and edge case tests', function () {
|
|
287
|
+
it('should handle very large amounts', function () {
|
|
288
|
+
const largeAmount = '999999999999999999999999999999';
|
|
289
|
+
should_1.default.doesNotThrow(() => builder.amount(largeAmount));
|
|
290
|
+
});
|
|
291
|
+
it('should handle same origin and destination hotkeys', function () {
|
|
292
|
+
const sameAddress = '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT';
|
|
293
|
+
should_1.default.doesNotThrow(() => {
|
|
294
|
+
builder.originHotkey({ address: sameAddress }).destinationHotkey({ address: sameAddress });
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
it('should handle same origin and destination netuids', function () {
|
|
298
|
+
should_1.default.doesNotThrow(() => {
|
|
299
|
+
builder.originNetuid('5').destinationNetuid('5');
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
it('should validate various address formats', function () {
|
|
303
|
+
const invalidAddresses = [
|
|
304
|
+
'',
|
|
305
|
+
'123',
|
|
306
|
+
'invalid_address_format',
|
|
307
|
+
'5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT_invalid',
|
|
308
|
+
];
|
|
309
|
+
invalidAddresses.forEach((address) => {
|
|
310
|
+
assert_1.default.throws(() => builder.originHotkey({ address }), (e) => e.message.includes('is not a well-formed dot address'));
|
|
311
|
+
assert_1.default.throws(() => builder.destinationHotkey({ address }), (e) => e.message.includes('is not a well-formed dot address'));
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
it('should handle boundary netuid values', function () {
|
|
315
|
+
should_1.default.doesNotThrow(() => builder.originNetuid('0'));
|
|
316
|
+
should_1.default.doesNotThrow(() => builder.originNetuid('128'));
|
|
317
|
+
should_1.default.doesNotThrow(() => builder.destinationNetuid('0'));
|
|
318
|
+
should_1.default.doesNotThrow(() => builder.destinationNetuid('128'));
|
|
319
|
+
assert_1.default.throws(() => builder.originNetuid('-1'), (e) => e.message.includes('Invalid netuid: -1. Must be a non-negative integer.'));
|
|
320
|
+
assert_1.default.throws(() => builder.destinationNetuid('129'), (e) => e.message.includes('Invalid netuid: 129. Netuid must be between 0 and 128.'));
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
describe('transaction explanation validation', function () {
|
|
324
|
+
it('should provide correct explanation with different subnet tokens', async function () {
|
|
325
|
+
builder
|
|
326
|
+
.amount('1000000000000')
|
|
327
|
+
.originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
|
|
328
|
+
.destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
|
|
329
|
+
.originNetuid('1')
|
|
330
|
+
.destinationNetuid('2')
|
|
331
|
+
.sender({ address: sender.address })
|
|
332
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
333
|
+
.referenceBlock(referenceBlock)
|
|
334
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
|
|
335
|
+
.fee({ amount: 0, type: 'tip' });
|
|
336
|
+
const tx = await builder.build();
|
|
337
|
+
const explanation = tx.explainTransaction();
|
|
338
|
+
explanation.should.have.properties(['outputAmount', 'changeAmount', 'fee', 'type']);
|
|
339
|
+
explanation.outputAmount.should.equal('1000000000000');
|
|
340
|
+
explanation.changeAmount.should.equal('0');
|
|
341
|
+
explanation.fee.should.have.properties(['fee', 'type']);
|
|
342
|
+
explanation.fee.type.should.equal('tip');
|
|
343
|
+
});
|
|
344
|
+
it('should handle explanation with zero tip', async function () {
|
|
345
|
+
builder
|
|
346
|
+
.amount('500000000')
|
|
347
|
+
.originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
|
|
348
|
+
.destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
|
|
349
|
+
.originNetuid('1')
|
|
350
|
+
.destinationNetuid('1')
|
|
351
|
+
.sender({ address: sender.address })
|
|
352
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
353
|
+
.referenceBlock(referenceBlock)
|
|
354
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
|
|
355
|
+
.fee({ amount: 0, type: 'tip' });
|
|
356
|
+
const tx = await builder.build();
|
|
357
|
+
const explanation = tx.explainTransaction();
|
|
358
|
+
explanation.fee.fee.should.equal('0');
|
|
359
|
+
explanation.outputAmount.should.equal('500000000');
|
|
360
|
+
});
|
|
361
|
+
});
|
|
362
|
+
describe('fromImplementation stages validation', function () {
|
|
363
|
+
it('should call super.fromImplementation before validation to populate _method', async function () {
|
|
364
|
+
const config = (0, base_1.buildTestConfig)();
|
|
365
|
+
const material = utils_1.default.getMaterial(config.network.type);
|
|
366
|
+
const validBuilder = new moveStakeBuilder_1.MoveStakeBuilder(config).material(material);
|
|
367
|
+
validBuilder
|
|
368
|
+
.amount('1000000000000')
|
|
369
|
+
.originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
|
|
370
|
+
.destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
|
|
371
|
+
.originNetuid('1')
|
|
372
|
+
.destinationNetuid('2')
|
|
373
|
+
.sender({ address: sender.address })
|
|
374
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
375
|
+
.referenceBlock(referenceBlock)
|
|
376
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
|
|
377
|
+
.fee({ amount: 0, type: 'tip' });
|
|
378
|
+
const validTx = await validBuilder.build();
|
|
379
|
+
const rawTxHex = validTx.toBroadcastFormat();
|
|
380
|
+
const newBuilder = new moveStakeBuilder_1.MoveStakeBuilder(config).material(material);
|
|
381
|
+
should_1.default.doesNotThrow(() => {
|
|
382
|
+
newBuilder.from(rawTxHex);
|
|
383
|
+
});
|
|
384
|
+
const builderMethod = newBuilder._method;
|
|
385
|
+
builderMethod.should.not.be.undefined();
|
|
386
|
+
builderMethod.name.should.equal('moveStake');
|
|
387
|
+
builderMethod.args.should.have.properties([
|
|
388
|
+
'originHotkey',
|
|
389
|
+
'destinationHotkey',
|
|
390
|
+
'originNetuid',
|
|
391
|
+
'destinationNetuid',
|
|
392
|
+
'alphaAmount',
|
|
393
|
+
]);
|
|
394
|
+
builderMethod.args.alphaAmount.should.equal('1000000000000');
|
|
395
|
+
builderMethod.args.originHotkey.should.equal('5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT');
|
|
396
|
+
builderMethod.args.destinationHotkey.should.equal('5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq');
|
|
397
|
+
builderMethod.args.originNetuid.should.equal('1');
|
|
398
|
+
builderMethod.args.destinationNetuid.should.equal('2');
|
|
399
|
+
});
|
|
400
|
+
it('should throw error if _method is not populated before validation', function () {
|
|
401
|
+
const config = (0, base_1.buildTestConfig)();
|
|
402
|
+
const material = utils_1.default.getMaterial(config.network.type);
|
|
403
|
+
const mockBuilder = new TestMoveStakeBuilder(config).material(material);
|
|
404
|
+
assert_1.default.throws(() => {
|
|
405
|
+
if (mockBuilder['_method']?.name !== 'moveStake') {
|
|
406
|
+
throw new sdk_core_1.InvalidTransactionError(`Invalid Transaction Type: ${mockBuilder['_method']?.name}. Expected moveStake`);
|
|
407
|
+
}
|
|
408
|
+
}, (e) => e.message.includes('Invalid Transaction Type: undefined. Expected moveStake'));
|
|
409
|
+
});
|
|
410
|
+
it('should properly validate transaction type after super.fromImplementation', function () {
|
|
411
|
+
const config = (0, base_1.buildTestConfig)();
|
|
412
|
+
const material = utils_1.default.getMaterial(config.network.type);
|
|
413
|
+
const mockBuilder = new TestMoveStakeBuilder(config).material(material);
|
|
414
|
+
mockBuilder.setMethodForTesting({
|
|
415
|
+
name: 'transferKeepAlive',
|
|
416
|
+
args: { dest: { id: 'test' }, value: '1000' },
|
|
417
|
+
pallet: 'balances',
|
|
418
|
+
});
|
|
419
|
+
assert_1.default.throws(() => {
|
|
420
|
+
if (mockBuilder['_method']?.name !== 'moveStake') {
|
|
421
|
+
throw new sdk_core_1.InvalidTransactionError(`Invalid Transaction Type: ${mockBuilder['_method']?.name}. Expected moveStake`);
|
|
422
|
+
}
|
|
423
|
+
}, (e) => e.message.includes('Invalid Transaction Type: transferKeepAlive. Expected moveStake'));
|
|
424
|
+
});
|
|
425
|
+
it('should successfully parse and validate correct moveStake transaction', function () {
|
|
426
|
+
const config = (0, base_1.buildTestConfig)();
|
|
427
|
+
const material = utils_1.default.getMaterial(config.network.type);
|
|
428
|
+
const mockBuilder = new TestMoveStakeBuilder(config).material(material);
|
|
429
|
+
mockBuilder.setMethodForTesting({
|
|
430
|
+
name: 'moveStake',
|
|
431
|
+
args: {
|
|
432
|
+
originHotkey: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT',
|
|
433
|
+
destinationHotkey: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq',
|
|
434
|
+
originNetuid: '1',
|
|
435
|
+
destinationNetuid: '2',
|
|
436
|
+
alphaAmount: '1000000000000',
|
|
437
|
+
},
|
|
438
|
+
pallet: 'subtensorModule',
|
|
439
|
+
});
|
|
440
|
+
should_1.default.doesNotThrow(() => {
|
|
441
|
+
if (mockBuilder['_method']?.name !== 'moveStake') {
|
|
442
|
+
throw new sdk_core_1.InvalidTransactionError(`Invalid Transaction Type: ${mockBuilder['_method']?.name}. Expected moveStake`);
|
|
443
|
+
}
|
|
444
|
+
});
|
|
445
|
+
});
|
|
446
|
+
it('should fail validation when parsing wrong transaction type (transferStake instead of moveStake)', function () {
|
|
447
|
+
const config = (0, base_1.buildTestConfig)();
|
|
448
|
+
const material = utils_1.default.getMaterial(config.network.type);
|
|
449
|
+
const moveStakeBuilder = new moveStakeBuilder_1.MoveStakeBuilder(config).material(material);
|
|
450
|
+
assert_1.default.throws(() => {
|
|
451
|
+
moveStakeBuilder.from(resources_1.rawTx.transferStake.signed);
|
|
452
|
+
}, (e) => e.message.includes('Invalid Transaction Type: transferStake. Expected moveStake'));
|
|
453
|
+
});
|
|
454
|
+
it('should verify _method is properly populated after super.fromImplementation with wrong transaction type', function () {
|
|
455
|
+
const config = (0, base_1.buildTestConfig)();
|
|
456
|
+
const material = utils_1.default.getMaterial(config.network.type);
|
|
457
|
+
const testBuilder = new TestMoveStakeBuilder(config).material(material);
|
|
458
|
+
try {
|
|
459
|
+
testBuilder.from(resources_1.rawTx.transferStake.signed);
|
|
460
|
+
}
|
|
461
|
+
catch (error) {
|
|
462
|
+
const method = testBuilder._method;
|
|
463
|
+
method.should.not.be.undefined();
|
|
464
|
+
method.name.should.equal('transferStake'); // This proves super.fromImplementation was called
|
|
465
|
+
method.should.have.property('args');
|
|
466
|
+
method.should.have.property('pallet');
|
|
467
|
+
error.message.should.containEql('Invalid Transaction Type: transferStake. Expected moveStake');
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
});
|
|
471
|
+
});
|
|
472
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92ZVN0YWtlQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvbW92ZVN0YWtlQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1QixvREFBNEI7QUFDNUIsaUNBQW1EO0FBQ25ELHdFQUFxRTtBQUNyRSxtRUFBMkM7QUFDM0MsK0NBQTRGO0FBQzVGLGlDQUF5QztBQUN6QyxzREFBeUQ7QUFDekQsbURBQStEO0FBRS9ELDBEQUEwRDtBQUMxRCxNQUFNLG9CQUFxQixTQUFRLG1DQUFnQjtJQUNqRCxtQkFBbUIsQ0FBQyxNQUFXO1FBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLENBQUM7Q0FDRjtBQUVELFFBQVEsQ0FBQyx3QkFBd0IsRUFBRTtJQUNqQyxNQUFNLGNBQWMsR0FBRyxvRUFBb0UsQ0FBQztJQUM1RixJQUFJLE9BQXlCLENBQUM7SUFDOUIsTUFBTSxNQUFNLEdBQUcsb0JBQVEsQ0FBQyxRQUFRLENBQUM7SUFFakMsVUFBVSxDQUFDO1FBQ1QsTUFBTSxNQUFNLEdBQUcsSUFBQSxzQkFBZSxHQUFFLENBQUM7UUFDakMsTUFBTSxRQUFRLEdBQUcsZUFBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hELE9BQU8sR0FBRyxJQUFJLG1DQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1RCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtRQUM1QixFQUFFLENBQUMsd0JBQXdCLEVBQUU7WUFDM0IsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFDMUIsQ0FBQyxDQUFRLEVBQUUsRUFBRSxD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TSxXQUFXLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFeEUsSUFBSSxDQUFDO2dCQUNILFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0MsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxNQUFNLEdBQUksV0FBbUIsQ0FBQyxPQUFPLENBQUM7Z0JBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsa0RBQWtEO2dCQUM3RixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3BDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFckMsS0FBZSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLDZEQUE2RCxDQUFDLENBQUM7WUFDNUcsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IGFzc2VydCBhcyBTaW5vbkFzc2VydCwgc3B5IH0gZnJvbSAnc2lub24nO1xuaW1wb3J0IHsgTW92ZVN0YWtlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvbW92ZVN0YWtlQnVpbGRlcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBhY2NvdW50cywgbW9ja1Rzc1NpZ25hdHVyZSwgZ2VuZXNpc0hhc2gsIGNoYWluTmFtZSwgcmF3VHggfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgYnVpbGRUZXN0Q29uZmlnIH0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7IHRlc3RuZXRNYXRlcmlhbCB9IGZyb20gJy4uLy4uLy4uL3NyYy9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbi8vIFRlc3QgaGVscGVyIGNsYXNzIHRvIGFjY2VzcyBwcml2YXRlIG1ldGhvZHMgZm9yIHRlc3RpbmdcbmNsYXNzIFRlc3RNb3ZlU3Rha2VCdWlsZGVyIGV4dGVuZHMgTW92ZVN0YWtlQnVpbGRlciB7XG4gIHNldE1ldGhvZEZvclRlc3RpbmcobWV0aG9kOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9tZXRob2QgPSBtZXRob2Q7XG4gIH1cbn1cblxuZGVzY3JpYmUoJ1RhbyBNb3ZlIFN0YWtlIEJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHJlZmVyZW5jZUJsb2NrID0gJzB4MTQ5Nzk5YmM5NjAyY2I1Y2YyMDFmMzQyNWZiOGQyNTNiMmQ0ZTYxZmMxMTlkY2FiMzI0OWYzMDdmNTk0NzU0ZCc7XG4gIGxldCBidWlsZGVyOiBNb3ZlU3Rha2VCdWlsZGVyO1xuICBjb25zdCBzZW5kZXIgPSBhY2NvdW50cy5hY2NvdW50MTtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb25maWcgPSBidWlsZFRlc3RDb25maWcoKTtcbiAgICBjb25zdCBtYXRlcmlhbCA9IHV0aWxzLmdldE1hdGVyaWFsKGNvbmZpZy5uZXR3b3JrLnR5cGUpO1xuICAgIGJ1aWxkZXIgPSBuZXcgTW92ZVN0YWtlQnVpbGRlcihjb25maWcpLm1hdGVyaWFsKG1hdGVyaWFsKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NldHRlciB2YWxpZGF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYW1vdW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5hbW91bnQoJy0xJyksXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlID09PSAnQW1vdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8nXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5hbW91bnQoJzAnKSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UgPT09ICdBbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybydcbiAgICAgICk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIuYW1vdW50KCcxMDAwJykpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLmFtb3VudCgnMScpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3B5VmFsaWRhdGVBZGRyZXNzID0gc3B5KGJ1aWxkZXIsICd2YWxpZGF0ZUFkZHJlc3MnKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJ1aWxkZXIub3JpZ2luSG90a2V5KHsgYWRkcmVzczogJ2FiYycgfSksXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlID09PSBgVGhlIGFkZHJlc3MgJ2FiYycgaXMgbm90IGEgd2VsbC1mb3JtZWQgZG90IGFkZHJlc3NgXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5kZXN0aW5hdGlvbkhvdGtleSh7IGFkZHJlc3M6ICdhYmMnIH0pLFxuICAgICAgICAoZTogRXJyb3IpID0+IGUubWVzc2FnZSA9PT0gYFRoZSBhZGRyZXNzICdhYmMnIGlzIG5vdCBhIHdlbGwtZm9ybWVkIGRvdCBhZGRyZXNzYFxuICAgICAgKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci5vcmlnaW5Ib3RrZXkoeyBhZGRyZXNzOiAnNUZDUFRuamV2R3FBdVR0dGV0Qnk0YTI0RWozcEg5ZmlROGZtdlAxWmtyVnNMVW9UJyB9KSk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+XG4gICAgICAgIGJ1aWxkZXIuZGVzdGluYXRpb25Ib3RrZXkoeyBhZGRyZXNzOiAnNUZmcDF3SkNQdTRoelZEVG83WGFNTHFaU3ZTYWR5VVFteFdQRHc3NENCakVDU29xJyB9KVxuICAgICAgKTtcblxuICAgICAgU2lub25Bc3NlcnQuY2FsbENvdW50KHNweVZhbGlkYXRlQWRkcmVzcywgNCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZCBtb3ZlIHN0YWtlIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBtb3ZlIHN0YWtlIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlclxuICAgICAgICAuYW1vdW50KCc5MDA3MTk5MjU0NzQwOTk1JylcbiAgICAgICAgLm9yaWdpbkhvdGtleSh7IGFkZHJlc3M6ICc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1QnIH0pXG4gICAgICAgIC5kZXN0aW5hdGlvbkhvdGtleSh7IGFkZHJlc3M6ICc1RmZwMXdKQ1B1NGh6VkRUbzdYYU1McVpTdlNhZHlVUW14V1BEdzc0Q0JqRUNTb3EnIH0pXG4gICAgICAgIC5vcmlnaW5OZXR1aWQoJzEnKVxuICAgICAgICAuZGVzdGluYXRpb25OZXR1aWQoJzEnKVxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogMzkzMywgbWF4RHVyYXRpb246IDY0IH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayhyZWZlcmVuY2VCbG9jaylcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMjAwIH0pXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDAsIHR5cGU6ICd0aXAnIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICB0eEpzb24uc2hvdWxkLmhhdmUucHJvcGVydGllcyhbXG4gICAgICAgICdpZCcsXG4gICAgICAgICdzZW5kZXInLFxuICAgICAgICAncmVmZXJlbmNlQmxvY2snLFxuICAgICAgICAnYmxvY2tOdW1iZXInLFxuICAgICAgICAnZ2VuZXNpc0hhc2gnLFxuICAgICAgICAnbm9uY2UnLFxuICAgICAgICAnc3BlY1ZlcnNpb24nLFxuICAgICAgICAndHJhbnNhY3Rpb25WZXJzaW9uJyxcbiAgICAgICAgJ2VyYVBlcmlvZCcsXG4gICAgICAgICdjaGFpbk5hbWUnLFxuICAgICAgICAndGlwJyxcbiAgICAgICAgJ29yaWdpbkhvdGtleScsXG4gICAgICAgICdkZXN0aW5hdGlvbkhvdGtleScsXG4gICAgICAgICdvcmlnaW5OZXR1aWQnLFxuICAgICAgICAnZGVzdGluYXRpb25OZXR1aWQnLFxuICAgICAgICAnYWxwaGFBbW91bnQnLFxuICAgICAgXSk7XG5cbiAgICAgIHR4SnNvbi5zZW5kZXIuc2hvdWxkLmVxdWFsKCc1RUdvRkE5NW9temVtUnNzRUxMRGpWZW5OWjY4YVh5VWVxdEtRU2NYU0VCdlZKa3InKTtcbiAgICAgIHR4SnNvbi5vcmlnaW5Ib3RrZXkuc2hvdWxkLmVxdWFsKCc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1QnKTtcbiAgICAgIHR4SnNvbi5kZXN0aW5hdGlvbkhvdGtleS5zaG91bGQuZXF1YWwoJzVGZnAxd0pDUHU0aHpWRFRvN1hhTUxxWlN2U2FkeVVRbXhXUER3NzRDQmpFQ1NvcScpO1xuICAgICAgdHhKc29uLm9yaWdpbk5ldHVpZC5zaG91bGQuZXF1YWwoJzEnKTtcbiAgICAgIHR4SnNvbi5kZXN0aW5hdGlvbk5ldHVpZC5zaG91bGQuZXF1YWwoJzEnKTtcbiAgICAgIHR4SnNvbi5hbHBoYUFtb3VudC5zaG91bGQuZXF1YWwoJzkwMDcxOTkyNTQ3NDA5OTUnKTtcbiAgICAgIHR4SnNvbi5ibG9ja051bWJlci5zaG91bGQuZXF1YWwoMzkzMyk7XG4gICAgICB0eEpzb24ubm9uY2Uuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICB0eEpzb24udGlwLnNob3VsZC5lcXVhbCgwKTtcblxuICAgICAgLy8gVmVyaWZ5IHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uXG4gICAgICBjb25zdCBleHBsYW5hdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgZXhwbGFuYXRpb24uc2hvdWxkLmhhdmUucHJvcGVydGllcyhbJ291dHB1dEFtb3VudCcsICdjaGFuZ2VBbW91bnQnLCAnZmVlJ10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSByZXF1aXJlZCBmaWVsZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBidWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oe30gYXMgYW55KSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ1RyYW5zYWN0aW9uIHZhbGlkYXRpb24gZmFpbGVkJylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBhbmQgZ2V0IG9yaWdpbiBuZXR1aWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLm9yaWdpbk5ldHVpZCgnNScpO1xuICAgICAgLy8gV2UgY2FuJ3QgZGlyZWN0bHkgYWNjZXNzIHByaXZhdGUgZmllbGRzLCBidXQgd2UgY2FuIHZlcmlmeSB0aHJvdWdoIGJ1aWxkaW5nXG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIub3JpZ2luTmV0dWlkKCc1JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgYW5kIGdldCBkZXN0aW5hdGlvbiBuZXR1aWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLmRlc3RpbmF0aW9uTmV0dWlkKCcxMCcpO1xuICAgICAgLy8gV2UgY2FuJ3QgZGlyZWN0bHkgYWNjZXNzIHByaXZhdGUgZmllbGRzLCBidXQgd2UgY2FuIHZlcmlmeSB0aHJvdWdoIGJ1aWxkaW5nXG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIuZGVzdGluYXRpb25OZXR1aWQoJzEwJykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCB0cmFuc2FjdGlvbiB3aXRoIGRpZmZlcmVudCBuZXR1aWRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlclxuICAgICAgICAuYW1vdW50KCcxMDAwMDAwMDAwMDAwJylcbiAgICAgICAgLm9yaWdpbkhvdGtleSh7IGFkZHJlc3M6ICc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1QnIH0pXG4gICAgICAgIC5kZXN0aW5hdGlvbkhvdGtleSh7IGFkZHJlc3M6ICc1RmZwMXdKQ1B1NGh6VkRUbzdYYU1McVpTdlNhZHlVUW14V1BEdzc0Q0JqRUNTb3EnIH0pXG4gICAgICAgIC5vcmlnaW5OZXR1aWQoJzEnKVxuICAgICAgICAuZGVzdGluYXRpb25OZXR1aWQoJzInKVxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogMzkzMywgbWF4RHVyYXRpb246IDY0IH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayhyZWZlcmVuY2VCbG9jaylcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMjAwIH0pXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDAsIHR5cGU6ICd0aXAnIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICB0eEpzb24ub3JpZ2luTmV0dWlkLnNob3VsZC5lcXVhbCgnMScpO1xuICAgICAgdHhKc29uLmRlc3RpbmF0aW9uTmV0dWlkLnNob3VsZC5lcXVhbCgnMicpO1xuICAgICAgdHhKc29uLmFscGhhQW1vdW50LnNob3VsZC5lcXVhbCgnMTAwMDAwMDAwMDAwMCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIG1vdmUgc3Rha2UgdHJhbnNhY3Rpb24gc2NoZW1hJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXJcbiAgICAgICAgICAuYW1vdW50KCcxMDAwMDAwMDAwMDAwJylcbiAgICAgICAgICAub3JpZ2luSG90a2V5KHsgYWRkcmVzczogJzVGQ1BUbmpldkdxQXVUdHRldEJ5NGEyNEVqM3BIOWZpUThmbXZQMVprclZzTFVvVCcgfSlcbiAgICAgICAgICAuZGVzdGluYXRpb25Ib3RrZXkoeyBhZGRyZXNzOiAnNUZmcDF3SkNQdTRoelZEVG83WGFNTHFaU3ZTYWR5VVFteFdQRHc3NENCakVDU29xJyB9KVxuICAgICAgICAgIC5vcmlnaW5OZXR1aWQoJzEnKVxuICAgICAgICAgIC5kZXN0aW5hdGlvbk5ldHVpZCgnMScpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpbnZhbGlkIGFtb3VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJ1aWxkZXIuYW1vdW50KCctMTAwJyksXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCdBbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybycpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgemVybyBhbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBidWlsZGVyLmFtb3VudCgnMCcpLFxuICAgICAgICAoZTogRXJyb3IpID0+IGUubWVzc2FnZSA9PT0gJ0Ftb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgbmV0dWlkIHJhbmdlIGZvciBvcmlnaW4gbmV0dWlkJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVmFsaWQgbmV0dWlkc1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLm9yaWdpbk5ldHVpZCgnMCcpKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci5vcmlnaW5OZXR1aWQoJzY0JykpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLm9yaWdpbk5ldHVpZCgnMTI4JykpO1xuXG4gICAgICAvLyBJbnZhbGlkIG5ldHVpZHNcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJ1aWxkZXIub3JpZ2luTmV0dWlkKCctMScpLFxuICAgICAgICAoZTogRXJyb3IpID0+IGUubWVzc2FnZS5pbmNsdWRlcygnSW52YWxpZCBuZXR1aWQ6IC0xLiBNdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuJylcbiAgICAgICk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBidWlsZGVyLm9yaWdpbk5ldHVpZCgnMTI5JyksXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCdJbnZhbGlkIG5ldHVpZDogMTI5LiBOZXR1aWQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEyOC4nKVxuICAgICAgKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJ1aWxkZXIub3JpZ2luTmV0dWlkKCdhYmMnKSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ0ludmFsaWQgbmV0dWlkOiBhYmMuIE11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci4nKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgbmV0dWlkIHJhbmdlIGZvciBkZXN0aW5hdGlvbiBuZXR1aWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBWYWxpZCBuZXR1aWRzXG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIuZGVzdGluYXRpb25OZXR1aWQoJzAnKSk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIuZGVzdGluYXRpb25OZXR1aWQoJzY0JykpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLmRlc3RpbmF0aW9uTmV0dWlkKCcxMjgnKSk7XG5cbiAgICAgIC8vIEludmFsaWQgbmV0dWlkc1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5kZXN0aW5hdGlvbk5ldHVpZCgnLTEnKSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ0ludmFsaWQgbmV0dWlkOiAtMS4gTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLicpXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5kZXN0aW5hdGlvbk5ldHVpZCgnMTI5JyksXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCdJbnZhbGlkIG5ldHVpZDogMTI5LiBOZXR1aWQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEyOC4nKVxuICAgICAgKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJ1aWxkZXIuZGVzdGluYXRpb25OZXR1aWQoJ2ludmFsaWQnKSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ0ludmFsaWQgbmV0dWlkOiBpbnZhbGlkLiBNdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuJylcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUU1Mgc2lnbmF0dXJlIGludGVncmF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzaWduZWQgbW92ZSBzdGFrZSB0cmFuc2FjdGlvbiB3aXRoIFRTUyBzaWduYXR1cmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hbW91bnQoJzkwMDcxOTkyNTQ3NDA5OTUnKVxuICAgICAgICAub3JpZ2luSG90a2V5KHsgYWRkcmVzczogJzVGQ1BUbmpldkdxQXVUdHRldEJ5NGEyNEVqM3BIOWZpUThmbXZQMVprclZzTFVvVCcgfSlcbiAgICAgICAgLmRlc3RpbmF0aW9uSG90a2V5KHsgYWRkcmVzczogJzVGZnAxd0pDUHU0aHpWRFRvN1hhTUxxWlN2U2FkeVVRbXhXUER3NzRDQmpFQ1NvcScgfSlcbiAgICAgICAgLm9yaWdpbk5ldHVpZCgnMScpXG4gICAgICAgIC5kZXN0aW5hdGlvbk5ldHVpZCgnMScpXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXIuYWRkcmVzcyB9KVxuICAgICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiAzOTMzLCBtYXhEdXJhdGlvbjogNjQgfSlcbiAgICAgICAgLnJlZmVyZW5jZUJsb2NrKHJlZmVyZW5jZUJsb2NrKVxuICAgICAgICAuc2VxdWVuY2VJZCh7IG5hbWU6ICdOb25jZScsIGtleXdvcmQ6ICdub25jZScsIHZhbHVlOiAyMDAgfSlcbiAgICAgICAgLmZlZSh7IGFtb3VudDogMCwgdHlwZTogJ3RpcCcgfSlcbiAgICAgICAgLmFkZFNpZ25hdHVyZSh7IHB1Yjogc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbShtb2NrVHNzU2lnbmF0dXJlLCAnaGV4JykpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICB0eEpzb24uYWxwaGFBbW91bnQuc2hvdWxkLmVxdWFsKCc5MDA3MTk5MjU0NzQwOTk1Jyk7XG4gICAgICB0eEpzb24ub3JpZ2luSG90a2V5LnNob3VsZC5lcXVhbCgnNUZDUFRuamV2R3FBdVR0dGV0Qnk0YTI0RWozcEg5ZmlROGZtdlAxWmtyVnNMVW9UJyk7XG4gICAgICB0eEpzb24uZGVzdGluYXRpb25Ib3RrZXkuc2hvdWxkLmVxdWFsKCc1RmZwMXdKQ1B1NGh6VkRUbzdYYU1McVpTdlNhZHlVUW14V1BEdzc0Q0JqRUNTb3EnKTtcbiAgICAgIHR4SnNvbi5vcmlnaW5OZXR1aWQuc2hvdWxkLmVxdWFsKCcxJyk7XG4gICAgICB0eEpzb24uZGVzdGluYXRpb25OZXR1aWQuc2hvdWxkLmVxdWFsKCcxJyk7XG4gICAgICB0eEpzb24uc2VuZGVyLnNob3VsZC5lcXVhbChzZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEpzb24uYmxvY2tOdW1iZXIuc2hvdWxkLmVxdWFsKDM5MzMpO1xuICAgICAgdHhKc29uLnJlZmVyZW5jZUJsb2NrLnNob3VsZC5lcXVhbChyZWZlcmVuY2VCbG9jayk7XG4gICAgICB0eEpzb24uZ2VuZXNpc0hhc2guc2hvdWxkLmVxdWFsKGdlbmVzaXNIYXNoKTtcbiAgICAgIHR4SnNvbi5zcGVjVmVyc2lvbi5zaG91bGQuZXF1YWwoTnVtYmVyKHRlc3RuZXRNYXRlcmlhbC5zcGVjVmVyc2lvbikpO1xuICAgICAgdHhKc29uLm5vbmNlLnNob3VsZC5lcXVhbCgyMDApO1xuICAgICAgdHhKc29uLnRpcC5zaG91bGQuZXF1YWwoMCk7XG4gICAgICB0eEpzb24udHJhbnNhY3Rpb25WZXJzaW9uLnNob3VsZC5lcXVhbChOdW1iZXIodGVzdG5ldE1hdGVyaWFsLnR4VmVyc2lvbikpO1xuICAgICAgdHhKc29uLmNoYWluTmFtZS50b0xvd2VyQ2FzZSgpLnNob3VsZC5lcXVhbChjaGFpbk5hbWUpO1xuICAgICAgdHhKc29uLmVyYVBlcmlvZC5zaG91bGQuZXF1YWwoNjQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbiB1bnNpZ25lZCBtb3ZlIHN0YWtlIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlclxuICAgICAgICAuYW1vdW50KCc1MDAwMDAwMCcpXG4gICAgICAgIC5vcmlnaW5Ib3RrZXkoeyBhZGRyZXNzOiAnNUZDUFRuamV2R3FBdVR0dGV0Qnk0YTI0RWozcEg5ZmlROGZtdlAxWmtyVnNMVW9UJyB9KVxuICAgICAgICAuZGVzdGluYXRpb25Ib3RrZXkoeyBhZGRyZXNzOiAnNUZmcDF3SkNQdTRoelZEVG83WGFNTHFaU3ZTYWR5VVFteFdQRHc3NENCakVDU29xJyB9KVxuICAgICAgICAub3JpZ2luTmV0dWlkKCcxJylcbiAgICAgICAgLmRlc3RpbmF0aW9uTmV0dWlkKCcyJylcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlci5hZGRyZXNzIH0pXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IDM5MzMsIG1heER1cmF0aW9uOiA2NCB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2socmVmZXJlbmNlQmxvY2spXG4gICAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IDIwMCB9KVxuICAgICAgICAuZmVlKHsgYW1vdW50OiAwLCB0eXBlOiAndGlwJyB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgdHhKc29uLmFscGhhQW1vdW50LnNob3VsZC5lcXVhbCgnNTAwMDAwMDAnKTtcbiAgICAgIHR4SnNvbi5vcmlnaW5Ib3RrZXkuc2hvdWxkLmVxdWFsKCc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1QnKTtcbiAgICAgIHR4SnNvbi5kZXN0aW5hdGlvbkhvdGtleS5zaG91bGQuZXF1YWwoJzVGZnAxd0pDUHU0aHpWRFRvN1hhTUxxWlN2U2FkeVVRbXhXUER3NzRDQmpFQ1NvcScpO1xuICAgICAgdHhKc29uLm9yaWdpbk5ldHVpZC5zaG91bGQuZXF1YWwoJzEnKTtcbiAgICAgIHR4SnNvbi5kZXN0aW5hdGlvbk5ldHVpZC5zaG91bGQuZXF1YWwoJzInKTtcbiAgICAgIHR4SnNvbi5zZW5kZXIuc2hvdWxkLmVxdWFsKHNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4SnNvbi5ibG9ja051bWJlci5zaG91bGQuZXF1YWwoMzkzMyk7XG4gICAgICB0eEpzb24ucmVmZXJlbmNlQmxvY2suc2hvdWxkLmVxdWFsKHJlZmVyZW5jZUJsb2NrKTtcbiAgICAgIHR4SnNvbi5nZW5lc2lzSGFzaC5zaG91bGQuZXF1YWwoZ2VuZXNpc0hhc2gpO1xuICAgICAgdHhKc29uLnNwZWNWZXJzaW9uLnNob3VsZC5lcXVhbChOdW1iZXIodGVzdG5ldE1hdGVyaWFsLnNwZWNWZXJzaW9uKSk7XG4gICAgICB0eEpzb24ubm9uY2Uuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICB0eEpzb24udGlwLnNob3VsZC5lcXVhbCgwKTtcbiAgICAgIHR4SnNvbi50cmFuc2FjdGlvblZlcnNpb24uc2hvdWxkLmVxdWFsKE51bWJlcih0ZXN0bmV0TWF0ZXJpYWwudHhWZXJzaW9uKSk7XG4gICAgICB0eEpzb24uY2hhaW5OYW1lLnRvTG93ZXJDYXNlKCkuc2hvdWxkLmVxdWFsKGNoYWluTmFtZSk7XG4gICAgICB0eEpzb24uZXJhUGVyaW9kLnNob3VsZC5lcXVhbCg2NCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb21wcmVoZW5zaXZlIGVycm9yIGhhbmRsaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIG1pc3Npbmcgb3JpZ2luIGhvdGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFtb3VudCgnMTAwMDAwMDAwMDAwMCcpXG4gICAgICAgIC5kZXN0aW5hdGlvbkhvdGtleSh7IGFkZHJlc3M6ICc1RmZwMXdKQ1B1NGh6VkRUbzdYYU1McVpTdlNhZHlVUW14V1BEdzc0Q0JqRUNTb3EnIH0pXG4gICAgICAgIC5vcmlnaW5OZXR1aWQoJzEnKVxuICAgICAgICAuZGVzdGluYXRpb25OZXR1aWQoJzEnKTtcblxuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKHt9IGFzIGFueSksXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCdUcmFuc2FjdGlvbiB2YWxpZGF0aW9uIGZhaWxlZCcpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgbWlzc2luZyBkZXN0aW5hdGlvbiBob3RrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hbW91bnQoJzEwMDAwMDAwMDAwMDAnKVxuICAgICAgICAub3JpZ2luSG90a2V5KHsgYWRkcmVzczogJzVGQ1BUbmpldkdxQXVUdHRldEJ5NGEyNEVqM3BIOWZpUThmbXZQMVprclZzTFVvVCcgfSlcbiAgICAgICAgLm9yaWdpbk5ldHVpZCgnMScpXG4gICAgICAgIC5kZXN0aW5hdGlvbk5ldHVpZCgnMScpO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBidWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oe30gYXMgYW55KSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ1RyYW5zYWN0aW9uIHZhbGlkYXRpb24gZmFpbGVkJylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBtaXNzaW5nIG9yaWdpbiBuZXR1aWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hbW91bnQoJzEwMDAwMDAwMDAwMDAnKVxuICAgICAgICAub3JpZ2luSG90a2V5KHsgYWRkcmVzczogJzVGQ1BUbmpldkdxQXVUdHRldEJ5NGEyNEVqM3BIOWZpUThmbXZQMVprclZzTFVvVCcgfSlcbiAgICAgICAgLmRlc3RpbmF0aW9uSG90a2V5KHsgYWRkcmVzczogJzVGZnAxd0pDUHU0aHpWRFRvN1hhTUxxWlN2U2FkeVVRbXhXUER3NzRDQmpFQ1NvcScgfSlcbiAgICAgICAgLmRlc3RpbmF0aW9uTmV0dWlkKCcxJyk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJ1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbih7fSBhcyBhbnkpLFxuICAgICAgICAoZTogRXJyb3IpID0+IGUubWVzc2FnZS5pbmNsdWRlcygnVHJhbnNhY3Rpb24gdmFsaWRhdGlvbiBmYWlsZWQnKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIG1pc3NpbmcgZGVzdGluYXRpb24gbmV0dWlkJywgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlclxuICAgICAgICAuYW1vdW50KCcxMDAwMDAwMDAwMDAwJylcbiAgICAgICAgLm9yaWdpbkhvdGtleSh7IGFkZHJlc3M6ICc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1QnIH0pXG4gICAgICAgIC5kZXN0aW5hdGlvbkhvdGtleSh7IGFkZHJlc3M6ICc1RmZwMXdKQ1B1NGh6VkRUbzdYYU1McVpTdlNhZHlVUW14V1BEdzc0Q0JqRUNTb3EnIH0pXG4gICAgICAgIC5vcmlnaW5OZXR1aWQoJzEnKTtcblxuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKHt9IGFzIGFueSksXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCdUcmFuc2FjdGlvbiB2YWxpZGF0aW9uIGZhaWxlZCcpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgbWlzc2luZyBhbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5vcmlnaW5Ib3RrZXkoeyBhZGRyZXNzOiAnNUZDUFRuamV2R3FBdVR0dGV0Qnk0YTI0RWozcEg5ZmlROGZtdlAxWmtyVnNMVW9UJyB9KVxuICAgICAgICAuZGVzdGluYXRpb25Ib3RrZXkoeyBhZGRyZXNzOiAnNUZmcDF3SkNQdTRoelZEVG83WGFNTHFaU3ZTYWR5VVFteFdQRHc3NENCakVDU29xJyB9KVxuICAgICAgICAub3JpZ2luTmV0dWlkKCcxJylcbiAgICAgICAgLmRlc3RpbmF0aW9uTmV0dWlkKCcxJyk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJ1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbih7fSBhcyBhbnkpLFxuICAgICAgICAoZTogRXJyb3IpID0+IGUubWVzc2FnZS5pbmNsdWRlcygnVHJhbnNhY3Rpb24gdmFsaWRhdGlvbiBmYWlsZWQnKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgdHJhbnNhY3Rpb24gdHlwZSBpbiBmcm9tSW1wbGVtZW50YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBidWlsZFRlc3RDb25maWcoKTtcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gdXRpbHMuZ2V0TWF0ZXJpYWwoY29uZmlnLm5ldHdvcmsudHlwZSk7XG4gICAgICBjb25zdCBtb2NrQnVpbGRlciA9IG5ldyBUZXN0TW92ZVN0YWtlQnVpbGRlcihjb25maWcpLm1hdGVyaWFsKG1hdGVyaWFsKTtcbiAgICAgIG1vY2tCdWlsZGVyLnNldE1ldGhvZEZvclRlc3Rpbmcoe1xuICAgICAgICBuYW1lOiAndHJhbnNmZXJLZWVwQWxpdmUnLFxuICAgICAgICBhcmdzOiB7IGRlc3Q6IHsgaWQ6ICd0ZXN0JyB9LCB2YWx1ZTogJzEwMDAnIH0sXG4gICAgICAgIHBhbGxldDogJ2JhbGFuY2VzJyxcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgLy8gQ2FsbCB0aGUgdmFsaWRhdGlvbiBsb2dpYyBkaXJlY3RseVxuICAgICAgICAgIGlmIChtb2NrQnVpbGRlclsnX21ldGhvZCddPy5uYW1lICE9PSAnbW92ZVN0YWtlJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCBUcmFuc2FjdGlvbiBUeXBlOiAke21vY2tCdWlsZGVyWydfbWV0aG9kJ10/Lm5hbWV9LiBFeHBlY3RlZCBtb3ZlU3Rha2VgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ0ludmFsaWQgVHJhbnNhY3Rpb24gVHlwZTogdHJhbnNmZXJLZWVwQWxpdmUuIEV4cGVjdGVkIG1vdmVTdGFrZScpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbWFsZm9ybWVkIHJhdyB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJ1aWxkZXIuZnJvbSgnaW52YWxpZF9oZXhfZGF0YScpLFxuICAgICAgICAoZTogRXJyb3IpID0+IGUubWVzc2FnZSAhPT0gdW5kZWZpbmVkXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYm91bmRhcnkgdmFsdWUgYW5kIGVkZ2UgY2FzZSB0ZXN0cycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSB2ZXJ5IGxhcmdlIGFtb3VudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBsYXJnZUFtb3VudCA9ICc5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTknO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLmFtb3VudChsYXJnZUFtb3VudCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgc2FtZSBvcmlnaW4gYW5kIGRlc3RpbmF0aW9uIGhvdGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzYW1lQWRkcmVzcyA9ICc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1QnO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIub3JpZ2luSG90a2V5KHsgYWRkcmVzczogc2FtZUFkZHJlc3MgfSkuZGVzdGluYXRpb25Ib3RrZXkoeyBhZGRyZXNzOiBzYW1lQWRkcmVzcyB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgc2FtZSBvcmlnaW4gYW5kIGRlc3RpbmF0aW9uIG5ldHVpZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5vcmlnaW5OZXR1aWQoJzUnKS5kZXN0aW5hdGlvbk5ldHVpZCgnNScpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHZhcmlvdXMgYWRkcmVzcyBmb3JtYXRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW52YWxpZEFkZHJlc3NlcyA9IFtcbiAgICAgICAgJycsXG4gICAgICAgICcxMjMnLFxuICAgICAgICAnaW52YWxpZF9hZGRyZXNzX2Zvcm1hdCcsXG4gICAgICAgICc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1RfaW52YWxpZCcsXG4gICAgICBdO1xuXG4gICAgICBpbnZhbGlkQWRkcmVzc2VzLmZvckVhY2goKGFkZHJlc3MpID0+IHtcbiAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAoKSA9PiBidWlsZGVyLm9yaWdpbkhvdGtleSh7IGFkZHJlc3MgfSksXG4gICAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ2lzIG5vdCBhIHdlbGwtZm9ybWVkIGRvdCBhZGRyZXNzJylcbiAgICAgICAgKTtcbiAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAoKSA9PiBidWlsZGVyLmRlc3RpbmF0aW9uSG90a2V5KHsgYWRkcmVzcyB9KSxcbiAgICAgICAgICAoZTogRXJyb3IpID0+IGUubWVzc2FnZS5pbmNsdWRlcygnaXMgbm90IGEgd2VsbC1mb3JtZWQgZG90IGFkZHJlc3MnKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBib3VuZGFyeSBuZXR1aWQgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLm9yaWdpbk5ldHVpZCgnMCcpKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci5vcmlnaW5OZXR1aWQoJzEyOCcpKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci5kZXN0aW5hdGlvbk5ldHVpZCgnMCcpKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci5kZXN0aW5hdGlvbk5ldHVpZCgnMTI4JykpO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBidWlsZGVyLm9yaWdpbk5ldHVpZCgnLTEnKSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ0ludmFsaWQgbmV0dWlkOiAtMS4gTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLicpXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5kZXN0aW5hdGlvbk5ldHVpZCgnMTI5JyksXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCdJbnZhbGlkIG5ldHVpZDogMTI5LiBOZXR1aWQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEyOC4nKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RyYW5zYWN0aW9uIGV4cGxhbmF0aW9uIHZhbGlkYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBwcm92aWRlIGNvcnJlY3QgZXhwbGFuYXRpb24gd2l0aCBkaWZmZXJlbnQgc3VibmV0IHRva2VucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFtb3VudCgnMTAwMDAwMDAwMDAwMCcpXG4gICAgICAgIC5vcmlnaW5Ib3RrZXkoeyBhZGRyZXNzOiAnNUZDUFRuamV2R3FBdVR0dGV0Qnk0YTI0RWozcEg5ZmlROGZtdlAxWmtyVnNMVW9UJyB9KVxuICAgICAgICAuZGVzdGluYXRpb25Ib3RrZXkoeyBhZGRyZXNzOiAnNUZmcDF3SkNQdTRoelZEVG83WGFNTHFaU3ZTYWR5VVFteFdQRHc3NENCakVDU29xJyB9KVxuICAgICAgICAub3JpZ2luTmV0dWlkKCcxJylcbiAgICAgICAgLmRlc3RpbmF0aW9uTmV0dWlkKCcyJylcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlci5hZGRyZXNzIH0pXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IDM5MzMsIG1heER1cmF0aW9uOiA2NCB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2socmVmZXJlbmNlQmxvY2spXG4gICAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IDIwMCB9KVxuICAgICAgICAuZmVlKHsgYW1vdW50OiAwLCB0eXBlOiAndGlwJyB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBleHBsYW5hdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuXG4gICAgICBleHBsYW5hdGlvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0aWVzKFsnb3V0cHV0QW1vdW50JywgJ2NoYW5nZUFtb3VudCcsICdmZWUnLCAndHlwZSddKTtcbiAgICAgIGV4cGxhbmF0aW9uLm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwoJzEwMDAwMDAwMDAwMDAnKTtcbiAgICAgIGV4cGxhbmF0aW9uLmNoYW5nZUFtb3VudC5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICAgIGV4cGxhbmF0aW9uLmZlZS5zaG91bGQuaGF2ZS5wcm9wZXJ0aWVzKFsnZmVlJywgJ3R5cGUnXSk7XG4gICAgICBleHBsYW5hdGlvbi5mZWUudHlwZS5zaG91bGQuZXF1YWwoJ3RpcCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZXhwbGFuYXRpb24gd2l0aCB6ZXJvIHRpcCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFtb3VudCgnNTAwMDAwMDAwJylcbiAgICAgICAgLm9yaWdpbkhvdGtleSh7IGFkZHJlc3M6ICc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1QnIH0pXG4gICAgICAgIC5kZXN0aW5hdGlvbkhvdGtleSh7IGFkZHJlc3M6ICc1RmZwMXdKQ1B1NGh6VkRUbzdYYU1McVpTdlNhZHlVUW14V1BEdzc0Q0JqRUNTb3EnIH0pXG4gICAgICAgIC5vcmlnaW5OZXR1aWQoJzEnKVxuICAgICAgICAuZGVzdGluYXRpb25OZXR1aWQoJzEnKVxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogMzkzMywgbWF4RHVyYXRpb246IDY0IH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayhyZWZlcmVuY2VCbG9jaylcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMjAwIH0pXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDAsIHR5cGU6ICd0aXAnIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG5cbiAgICAgIGV4cGxhbmF0aW9uLmZlZS5mZWUuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICBleHBsYW5hdGlvbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKCc1MDAwMDAwMDAnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Zyb21JbXBsZW1lbnRhdGlvbiBzdGFnZXMgdmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgc3VwZXIuZnJvbUltcGxlbWVudGF0aW9uIGJlZm9yZSB2YWxpZGF0aW9uIHRvIHBvcHVsYXRlIF9tZXRob2QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBidWlsZFRlc3RDb25maWcoKTtcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gdXRpbHMuZ2V0TWF0ZXJpYWwoY29uZmlnLm5ldHdvcmsudHlwZSk7XG4gICAgICBjb25zdCB2YWxpZEJ1aWxkZXIgPSBuZXcgTW92ZVN0YWtlQnVpbGRlcihjb25maWcpLm1hdGVyaWFsKG1hdGVyaWFsKTtcbiAgICAgIHZhbGlkQnVpbGRlclxuICAgICAgICAuYW1vdW50KCcxMDAwMDAwMDAwMDAwJylcbiAgICAgICAgLm9yaWdpbkhvdGtleSh7IGFkZHJlc3M6ICc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1QnIH0pXG4gICAgICAgIC5kZXN0aW5hdGlvbkhvdGtleSh7IGFkZHJlc3M6ICc1RmZwMXdKQ1B1NGh6VkRUbzdYYU1McVpTdlNhZHlVUW14V1BEdzc0Q0JqRUNTb3EnIH0pXG4gICAgICAgIC5vcmlnaW5OZXR1aWQoJzEnKVxuICAgICAgICAuZGVzdGluYXRpb25OZXR1aWQoJzInKVxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogMzkzMywgbWF4RHVyYXRpb246IDY0IH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayhyZWZlcmVuY2VCbG9jaylcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMjAwIH0pXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDAsIHR5cGU6ICd0aXAnIH0pO1xuXG4gICAgICBjb25zdCB2YWxpZFR4ID0gYXdhaXQgdmFsaWRCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeEhleCA9IHZhbGlkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgY29uc3QgbmV3QnVpbGRlciA9IG5ldyBNb3ZlU3Rha2VCdWlsZGVyKGNvbmZpZykubWF0ZXJpYWwobWF0ZXJpYWwpO1xuXG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgbmV3QnVpbGRlci5mcm9tKHJhd1R4SGV4KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBidWlsZGVyTWV0aG9kID0gKG5ld0J1aWxkZXIgYXMgYW55KS5fbWV0aG9kO1xuICAgICAgYnVpbGRlck1ldGhvZC5zaG91bGQubm90LmJlLnVuZGVmaW5lZCgpO1xuICAgICAgYnVpbGRlck1ldGhvZC5uYW1lLnNob3VsZC5lcXVhbCgnbW92ZVN0YWtlJyk7XG4gICAgICBidWlsZGVyTWV0aG9kLmFyZ3Muc2hvdWxkLmhhdmUucHJvcGVydGllcyhbXG4gICAgICAgICdvcmlnaW5Ib3RrZXknLFxuICAgICAgICAnZGVzdGluYXRpb25Ib3RrZXknLFxuICAgICAgICAnb3JpZ2luTmV0dWlkJyxcbiAgICAgICAgJ2Rlc3RpbmF0aW9uTmV0dWlkJyxcbiAgICAgICAgJ2FscGhhQW1vdW50JyxcbiAgICAgIF0pO1xuICAgICAgYnVpbGRlck1ldGhvZC5hcmdzLmFscGhhQW1vdW50LnNob3VsZC5lcXVhbCgnMTAwMDAwMDAwMDAwMCcpO1xuICAgICAgYnVpbGRlck1ldGhvZC5hcmdzLm9yaWdpbkhvdGtleS5zaG91bGQuZXF1YWwoJzVGQ1BUbmpldkdxQXVUdHRldEJ5NGEyNEVqM3BIOWZpUThmbXZQMVprclZzTFVvVCcpO1xuICAgICAgYnVpbGRlck1ldGhvZC5hcmdzLmRlc3RpbmF0aW9uSG90a2V5LnNob3VsZC5lcXVhbCgnNUZmcDF3SkNQdTRoelZEVG83WGFNTHFaU3ZTYWR5VVFteFdQRHc3NENCakVDU29xJyk7XG4gICAgICBidWlsZGVyTWV0aG9kLmFyZ3Mub3JpZ2luTmV0dWlkLnNob3VsZC5lcXVhbCgnMScpO1xuICAgICAgYnVpbGRlck1ldGhvZC5hcmdzLmRlc3RpbmF0aW9uTmV0dWlkLnNob3VsZC5lcXVhbCgnMicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBpZiBfbWV0aG9kIGlzIG5vdCBwb3B1bGF0ZWQgYmVmb3JlIHZhbGlkYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBidWlsZFRlc3RDb25maWcoKTtcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gdXRpbHMuZ2V0TWF0ZXJpYWwoY29uZmlnLm5ldHdvcmsudHlwZSk7XG4gICAgICBjb25zdCBtb2NrQnVpbGRlciA9IG5ldyBUZXN0TW92ZVN0YWtlQnVpbGRlcihjb25maWcpLm1hdGVyaWFsKG1hdGVyaWFsKTtcblxuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGlmIChtb2NrQnVpbGRlclsnX21ldGhvZCddPy5uYW1lICE9PSAnbW92ZVN0YWtlJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCBUcmFuc2FjdGlvbiBUeXBlOiAke21vY2tCdWlsZGVyWydfbWV0aG9kJ10/Lm5hbWV9LiBFeHBlY3RlZCBtb3ZlU3Rha2VgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ0ludmFsaWQgVHJhbnNhY3Rpb24gVHlwZTogdW5kZWZpbmVkLiBFeHBlY3RlZCBtb3ZlU3Rha2UnKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvcGVybHkgdmFsaWRhdGUgdHJhbnNhY3Rpb24gdHlwZSBhZnRlciBzdXBlci5mcm9tSW1wbGVtZW50YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBidWlsZFRlc3RDb25maWcoKTtcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gdXRpbHMuZ2V0TWF0ZXJpYWwoY29uZmlnLm5ldHdvcmsudHlwZSk7XG4gICAgICBjb25zdCBtb2NrQnVpbGRlciA9IG5ldyBUZXN0TW92ZVN0YWtlQnVpbGRlcihjb25maWcpLm1hdGVyaWFsKG1hdGVyaWFsKTtcblxuICAgICAgbW9ja0J1aWxkZXIuc2V0TWV0aG9kRm9yVGVzdGluZyh7XG4gICAgICAgIG5hbWU6ICd0cmFuc2ZlcktlZXBBbGl2ZScsXG4gICAgICAgIGFyZ3M6IHsgZGVzdDogeyBpZDogJ3Rlc3QnIH0sIHZhbHVlOiAnMTAwMCcgfSxcbiAgICAgICAgcGFsbGV0OiAnYmFsYW5jZXMnLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBpZiAobW9ja0J1aWxkZXJbJ19tZXRob2QnXT8ubmFtZSAhPT0gJ21vdmVTdGFrZScpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgICAgICAgYEludmFsaWQgVHJhbnNhY3Rpb24gVHlwZTogJHttb2NrQnVpbGRlclsnX21ldGhvZCddPy5uYW1lfS4gRXhwZWN0ZWQgbW92ZVN0YWtlYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCdJbnZhbGlkIFRyYW5zYWN0aW9uIFR5cGU6IHRyYW5zZmVyS2VlcEFsaXZlLiBFeHBlY3RlZCBtb3ZlU3Rha2UnKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VjY2Vzc2Z1bGx5IHBhcnNlIGFuZCB2YWxpZGF0ZSBjb3JyZWN0IG1vdmVTdGFrZSB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGJ1aWxkVGVzdENvbmZpZygpO1xuICAgICAgY29uc3QgbWF0ZXJpYWwgPSB1dGlscy5nZXRNYXRlcmlhbChjb25maWcubmV0d29yay50eXBlKTtcbiAgICAgIGNvbnN0IG1vY2tCdWlsZGVyID0gbmV3IFRlc3RNb3ZlU3Rha2VCdWlsZGVyKGNvbmZpZykubWF0ZXJpYWwobWF0ZXJpYWwpO1xuXG4gICAgICBtb2NrQnVpbGRlci5zZXRNZXRob2RGb3JUZXN0aW5nKHtcbiAgICAgICAgbmFtZTogJ21vdmVTdGFrZScsXG4gICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICBvcmlnaW5Ib3RrZXk6ICc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1QnLFxuICAgICAgICAgIGRlc3RpbmF0aW9uSG90a2V5OiAnNUZmcDF3SkNQdTRoelZEVG83WGFNTHFaU3ZTYWR5VVFteFdQRHc3NENCakVDU29xJyxcbiAgICAgICAgICBvcmlnaW5OZXR1aWQ6ICcxJyxcbiAgICAgICAgICBkZXN0aW5hdGlvbk5ldHVpZDogJzInLFxuICAgICAgICAgIGFscGhhQW1vdW50OiAnMTAwMDAwMDAwMDAwMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHBhbGxldDogJ3N1YnRlbnNvck1vZHVsZScsXG4gICAgICB9KTtcblxuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGlmIChtb2NrQnVpbGRlclsnX21ldGhvZCddPy5uYW1lICE9PSAnbW92ZVN0YWtlJykge1xuICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgICAgIGBJbnZhbGlkIFRyYW5zYWN0aW9uIFR5cGU6ICR7bW9ja0J1aWxkZXJbJ19tZXRob2QnXT8ubmFtZX0uIEV4cGVjdGVkIG1vdmVTdGFrZWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB2YWxpZGF0aW9uIHdoZW4gcGFyc2luZyB3cm9uZyB0cmFuc2FjdGlvbiB0eXBlICh0cmFuc2ZlclN0YWtlIGluc3RlYWQgb2YgbW92ZVN0YWtlKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGJ1aWxkVGVzdENvbmZpZygpO1xuICAgICAgY29uc3QgbWF0ZXJpYWwgPSB1dGlscy5nZXRNYXRlcmlhbChjb25maWcubmV0d29yay50eXBlKTtcbiAgICAgIGNvbnN0IG1vdmVTdGFrZUJ1aWxkZXIgPSBuZXcgTW92ZVN0YWtlQnVpbGRlcihjb25maWcpLm1hdGVyaWFsKG1hdGVyaWFsKTtcblxuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIG1vdmVTdGFrZUJ1aWxkZXIuZnJvbShyYXdUeC50cmFuc2ZlclN0YWtlLnNpZ25lZCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCdJbnZhbGlkIFRyYW5zYWN0aW9uIFR5cGU6IHRyYW5zZmVyU3Rha2UuIEV4cGVjdGVkIG1vdmVTdGFrZScpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgX21ldGhvZCBpcyBwcm9wZXJseSBwb3B1bGF0ZWQgYWZ0ZXIgc3VwZXIuZnJvbUltcGxlbWVudGF0aW9uIHdpdGggd3JvbmcgdHJhbnNhY3Rpb24gdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGJ1aWxkVGVzdENvbmZpZygpO1xuICAgICAgY29uc3QgbWF0ZXJpYWwgPSB1dGlscy5nZXRNYXRlcmlhbChjb25maWcubmV0d29yay50eXBlKTtcblxuICAgICAgY29uc3QgdGVzdEJ1aWxkZXIgPSBuZXcgVGVzdE1vdmVTdGFrZUJ1aWxkZXIoY29uZmlnKS5tYXRlcmlhbChtYXRlcmlhbCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRlc3RCdWlsZGVyLmZyb20ocmF3VHgudHJhbnNmZXJTdGFrZS5zaWduZWQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWV0aG9kID0gKHRlc3RCdWlsZGVyIGFzIGFueSkuX21ldGhvZDtcbiAgICAgICAgbWV0aG9kLnNob3VsZC5ub3QuYmUudW5kZWZpbmVkKCk7XG4gICAgICAgIG1ldGhvZC5uYW1lLnNob3VsZC5lcXVhbCgndHJhbnNmZXJTdGFrZScpOyAvLyBUaGlzIHByb3ZlcyBzdXBlci5mcm9tSW1wbGVtZW50YXRpb24gd2FzIGNhbGxlZFxuICAgICAgICBtZXRob2Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ2FyZ3MnKTtcbiAgICAgICAgbWV0aG9kLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwYWxsZXQnKTtcblxuICAgICAgICAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2Uuc2hvdWxkLmNvbnRhaW5FcWwoJ0ludmFsaWQgVHJhbnNhY3Rpb24gVHlwZTogdHJhbnNmZXJTdGFrZS4gRXhwZWN0ZWQgbW92ZVN0YWtlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singeltonRegistry.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/singeltonRegistry.ts"],"names":[],"mappings":""}
|