@bitgo-beta/abstract-eth 1.2.3-alpha.401 → 1.2.3-alpha.402

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 (153) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/tsconfig.tsbuildinfo +1 -1
  3. package/package.json +8 -8
  4. package/dist/src/abstractEthLikeCoin.d.ts +0 -95
  5. package/dist/src/abstractEthLikeCoin.d.ts.map +0 -1
  6. package/dist/src/abstractEthLikeCoin.js +0 -160
  7. package/dist/src/abstractEthLikeNewCoins.d.ts +0 -749
  8. package/dist/src/abstractEthLikeNewCoins.d.ts.map +0 -1
  9. package/dist/src/abstractEthLikeNewCoins.js +0 -2229
  10. package/dist/src/ethLikeToken.d.ts +0 -70
  11. package/dist/src/ethLikeToken.d.ts.map +0 -1
  12. package/dist/src/ethLikeToken.js +0 -360
  13. package/dist/src/index.d.ts +0 -5
  14. package/dist/src/index.d.ts.map +0 -1
  15. package/dist/src/index.js +0 -21
  16. package/dist/src/lib/contractCall.d.ts +0 -8
  17. package/dist/src/lib/contractCall.d.ts.map +0 -1
  18. package/dist/src/lib/contractCall.js +0 -17
  19. package/dist/src/lib/iface.d.ts +0 -133
  20. package/dist/src/lib/iface.d.ts.map +0 -1
  21. package/dist/src/lib/iface.js +0 -8
  22. package/dist/src/lib/index.d.ts +0 -16
  23. package/dist/src/lib/index.d.ts.map +0 -1
  24. package/dist/src/lib/index.js +0 -57
  25. package/dist/src/lib/keyPair.d.ts +0 -26
  26. package/dist/src/lib/keyPair.d.ts.map +0 -1
  27. package/dist/src/lib/keyPair.js +0 -65
  28. package/dist/src/lib/messages/eip191/eip191Message.d.ts +0 -12
  29. package/dist/src/lib/messages/eip191/eip191Message.d.ts.map +0 -1
  30. package/dist/src/lib/messages/eip191/eip191Message.js +0 -25
  31. package/dist/src/lib/messages/eip191/eip191MessageBuilder.d.ts +0 -19
  32. package/dist/src/lib/messages/eip191/eip191MessageBuilder.d.ts.map +0 -1
  33. package/dist/src/lib/messages/eip191/eip191MessageBuilder.js +0 -27
  34. package/dist/src/lib/messages/eip191/index.d.ts +0 -3
  35. package/dist/src/lib/messages/eip191/index.d.ts.map +0 -1
  36. package/dist/src/lib/messages/eip191/index.js +0 -19
  37. package/dist/src/lib/messages/eip712/eip712Message.d.ts +0 -6
  38. package/dist/src/lib/messages/eip712/eip712Message.d.ts.map +0 -1
  39. package/dist/src/lib/messages/eip712/eip712Message.js +0 -27
  40. package/dist/src/lib/messages/eip712/eip712MessageBuilder.d.ts +0 -7
  41. package/dist/src/lib/messages/eip712/eip712MessageBuilder.d.ts.map +0 -1
  42. package/dist/src/lib/messages/eip712/eip712MessageBuilder.js +0 -15
  43. package/dist/src/lib/messages/eip712/index.d.ts +0 -3
  44. package/dist/src/lib/messages/eip712/index.d.ts.map +0 -1
  45. package/dist/src/lib/messages/eip712/index.js +0 -19
  46. package/dist/src/lib/messages/index.d.ts +0 -4
  47. package/dist/src/lib/messages/index.d.ts.map +0 -1
  48. package/dist/src/lib/messages/index.js +0 -20
  49. package/dist/src/lib/messages/messageBuilderFactory.d.ts +0 -7
  50. package/dist/src/lib/messages/messageBuilderFactory.d.ts.map +0 -1
  51. package/dist/src/lib/messages/messageBuilderFactory.js +0 -23
  52. package/dist/src/lib/transaction.d.ts +0 -67
  53. package/dist/src/lib/transaction.d.ts.map +0 -1
  54. package/dist/src/lib/transaction.js +0 -142
  55. package/dist/src/lib/transactionBuilder.d.ts +0 -270
  56. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  57. package/dist/src/lib/transactionBuilder.js +0 -822
  58. package/dist/src/lib/transferBuilder.d.ts +0 -76
  59. package/dist/src/lib/transferBuilder.d.ts.map +0 -1
  60. package/dist/src/lib/transferBuilder.js +0 -307
  61. package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.d.ts +0 -54
  62. package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.d.ts.map +0 -1
  63. package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.js +0 -120
  64. package/dist/src/lib/transferBuilders/index.d.ts +0 -4
  65. package/dist/src/lib/transferBuilders/index.d.ts.map +0 -1
  66. package/dist/src/lib/transferBuilders/index.js +0 -20
  67. package/dist/src/lib/transferBuilders/transferBuilderERC1155.d.ts +0 -17
  68. package/dist/src/lib/transferBuilders/transferBuilderERC1155.d.ts.map +0 -1
  69. package/dist/src/lib/transferBuilders/transferBuilderERC1155.js +0 -96
  70. package/dist/src/lib/transferBuilders/transferBuilderERC721.d.ts +0 -16
  71. package/dist/src/lib/transferBuilders/transferBuilderERC721.d.ts.map +0 -1
  72. package/dist/src/lib/transferBuilders/transferBuilderERC721.js +0 -81
  73. package/dist/src/lib/types.d.ts +0 -39
  74. package/dist/src/lib/types.d.ts.map +0 -1
  75. package/dist/src/lib/types.js +0 -137
  76. package/dist/src/lib/utils.d.ts +0 -310
  77. package/dist/src/lib/utils.d.ts.map +0 -1
  78. package/dist/src/lib/utils.js +0 -829
  79. package/dist/src/lib/walletUtil.d.ts +0 -40
  80. package/dist/src/lib/walletUtil.d.ts.map +0 -1
  81. package/dist/src/lib/walletUtil.js +0 -43
  82. package/dist/src/types.d.ts +0 -9
  83. package/dist/src/types.d.ts.map +0 -1
  84. package/dist/src/types.js +0 -3
  85. package/dist/test/index.d.ts +0 -2
  86. package/dist/test/index.d.ts.map +0 -1
  87. package/dist/test/index.js +0 -18
  88. package/dist/test/unit/coin.d.ts +0 -8
  89. package/dist/test/unit/coin.d.ts.map +0 -1
  90. package/dist/test/unit/coin.js +0 -577
  91. package/dist/test/unit/index.d.ts +0 -6
  92. package/dist/test/unit/index.d.ts.map +0 -1
  93. package/dist/test/unit/index.js +0 -22
  94. package/dist/test/unit/messages/abstractEthMessageBuilderTests.d.ts +0 -3
  95. package/dist/test/unit/messages/abstractEthMessageBuilderTests.d.ts.map +0 -1
  96. package/dist/test/unit/messages/abstractEthMessageBuilderTests.js +0 -110
  97. package/dist/test/unit/messages/abstractEthMessageTestTypes.d.ts +0 -43
  98. package/dist/test/unit/messages/abstractEthMessageTestTypes.d.ts.map +0 -1
  99. package/dist/test/unit/messages/abstractEthMessageTestTypes.js +0 -3
  100. package/dist/test/unit/messages/abstractEthMessagesTests.d.ts +0 -3
  101. package/dist/test/unit/messages/abstractEthMessagesTests.d.ts.map +0 -1
  102. package/dist/test/unit/messages/abstractEthMessagesTests.js +0 -129
  103. package/dist/test/unit/messages/eip191/eip191Message.d.ts +0 -2
  104. package/dist/test/unit/messages/eip191/eip191Message.d.ts.map +0 -1
  105. package/dist/test/unit/messages/eip191/eip191Message.js +0 -15
  106. package/dist/test/unit/messages/eip191/eip191MessageBuilder.d.ts +0 -2
  107. package/dist/test/unit/messages/eip191/eip191MessageBuilder.d.ts.map +0 -1
  108. package/dist/test/unit/messages/eip191/eip191MessageBuilder.js +0 -16
  109. package/dist/test/unit/messages/eip191/fixtures.d.ts +0 -109
  110. package/dist/test/unit/messages/eip191/fixtures.d.ts.map +0 -1
  111. package/dist/test/unit/messages/eip191/fixtures.js +0 -63
  112. package/dist/test/unit/messages/eip712/eip712Message.d.ts +0 -2
  113. package/dist/test/unit/messages/eip712/eip712Message.d.ts.map +0 -1
  114. package/dist/test/unit/messages/eip712/eip712Message.js +0 -15
  115. package/dist/test/unit/messages/eip712/eip712MessageBuilder.d.ts +0 -2
  116. package/dist/test/unit/messages/eip712/eip712MessageBuilder.d.ts.map +0 -1
  117. package/dist/test/unit/messages/eip712/eip712MessageBuilder.js +0 -16
  118. package/dist/test/unit/messages/eip712/fixtures.d.ts +0 -76
  119. package/dist/test/unit/messages/eip712/fixtures.d.ts.map +0 -1
  120. package/dist/test/unit/messages/eip712/fixtures.js +0 -120
  121. package/dist/test/unit/messages/index.d.ts +0 -4
  122. package/dist/test/unit/messages/index.d.ts.map +0 -1
  123. package/dist/test/unit/messages/index.js +0 -20
  124. package/dist/test/unit/messages/messageBuilderFactory.d.ts +0 -2
  125. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +0 -1
  126. package/dist/test/unit/messages/messageBuilderFactory.js +0 -52
  127. package/dist/test/unit/token.d.ts +0 -2
  128. package/dist/test/unit/token.d.ts.map +0 -1
  129. package/dist/test/unit/token.js +0 -37
  130. package/dist/test/unit/transaction.d.ts +0 -3
  131. package/dist/test/unit/transaction.d.ts.map +0 -1
  132. package/dist/test/unit/transaction.js +0 -60
  133. package/dist/test/unit/transactionBuilder/addressInitialization.d.ts +0 -8
  134. package/dist/test/unit/transactionBuilder/addressInitialization.d.ts.map +0 -1
  135. package/dist/test/unit/transactionBuilder/addressInitialization.js +0 -95
  136. package/dist/test/unit/transactionBuilder/flushNft.d.ts +0 -2
  137. package/dist/test/unit/transactionBuilder/flushNft.d.ts.map +0 -1
  138. package/dist/test/unit/transactionBuilder/flushNft.js +0 -381
  139. package/dist/test/unit/transactionBuilder/index.d.ts +0 -5
  140. package/dist/test/unit/transactionBuilder/index.d.ts.map +0 -1
  141. package/dist/test/unit/transactionBuilder/index.js +0 -21
  142. package/dist/test/unit/transactionBuilder/send.d.ts +0 -3
  143. package/dist/test/unit/transactionBuilder/send.d.ts.map +0 -1
  144. package/dist/test/unit/transactionBuilder/send.js +0 -197
  145. package/dist/test/unit/transactionBuilder/walletInitialization.d.ts +0 -10
  146. package/dist/test/unit/transactionBuilder/walletInitialization.d.ts.map +0 -1
  147. package/dist/test/unit/transactionBuilder/walletInitialization.js +0 -124
  148. package/dist/test/unit/transferBuilder.d.ts +0 -2
  149. package/dist/test/unit/transferBuilder.d.ts.map +0 -1
  150. package/dist/test/unit/transferBuilder.js +0 -76
  151. package/dist/test/unit/utils.d.ts +0 -2
  152. package/dist/test/unit/utils.d.ts.map +0 -1
  153. package/dist/test/unit/utils.js +0 -184
@@ -1,184 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const should_1 = __importDefault(require("should"));
7
- const utils_1 = require("../../src/lib/utils");
8
- describe('Abstract ETH Utils', () => {
9
- describe('ERC721 Flush Functions', () => {
10
- it('should encode flush ERC721 data correctly for v0-v3', () => {
11
- const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
12
- const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
13
- const tokenId = '12345';
14
- const forwarderVersion = 0;
15
- const encoded = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
16
- should_1.default.exist(encoded);
17
- encoded.should.startWith('0x5a953d0a'); // flushERC721ForwarderTokens method ID
18
- encoded.should.be.a.String();
19
- encoded.length.should.be.greaterThan(10); // method ID + parameters
20
- });
21
- it('should encode flush ERC721 data correctly for v4+', () => {
22
- const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
23
- const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
24
- const tokenId = '12345';
25
- const forwarderVersion = 4;
26
- const encoded = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
27
- should_1.default.exist(encoded);
28
- encoded.should.startWith('0x159e44d7'); // flushERC721Token method ID (v5)
29
- encoded.should.be.a.String();
30
- });
31
- it('should decode flush ERC721 data correctly for v0-v3', () => {
32
- const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
33
- const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
34
- const tokenId = '12345';
35
- const forwarderVersion = 2;
36
- const encoded = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
37
- const decoded = (0, utils_1.decodeFlushERC721TokensData)(encoded);
38
- should_1.default.exist(decoded);
39
- decoded.forwarderAddress.toLowerCase().should.equal(forwarderAddress.toLowerCase());
40
- decoded.tokenAddress.toLowerCase().should.equal(tokenAddress.toLowerCase());
41
- decoded.tokenId.should.equal(tokenId);
42
- should_1.default.not.exist(decoded.forwarderVersion);
43
- });
44
- it('should decode flush ERC721 data correctly for v4+', () => {
45
- const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
46
- const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
47
- const tokenId = '12345';
48
- const forwarderVersion = 4;
49
- const encoded = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
50
- const decoded = (0, utils_1.decodeFlushERC721TokensData)(encoded, forwarderAddress);
51
- should_1.default.exist(decoded);
52
- decoded.forwarderAddress.toLowerCase().should.equal(forwarderAddress.toLowerCase());
53
- decoded.tokenAddress.toLowerCase().should.equal(tokenAddress.toLowerCase());
54
- decoded.tokenId.should.equal(tokenId);
55
- should_1.default.exist(decoded.forwarderVersion);
56
- should_1.default.equal(decoded.forwarderVersion, 4);
57
- });
58
- it('should handle large token IDs for ERC721', () => {
59
- const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
60
- const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
61
- const tokenId = '115792089237316195423570985008687907853269984665640564039457584007913129639935'; // max uint256
62
- const forwarderVersion = 0;
63
- const encoded = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
64
- const decoded = (0, utils_1.decodeFlushERC721TokensData)(encoded);
65
- decoded.tokenId.should.equal(tokenId);
66
- });
67
- it('should throw error for invalid flush ERC721 data', () => {
68
- const invalidData = '0x12345678'; // Wrong method ID
69
- should_1.default.throws(() => {
70
- (0, utils_1.decodeFlushERC721TokensData)(invalidData);
71
- }, /Invalid flush ERC721 bytecode/);
72
- });
73
- it('should throw error for missing to address in v4+ decode', () => {
74
- const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
75
- const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
76
- const tokenId = '12345';
77
- const forwarderVersion = 4;
78
- const encoded = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
79
- should_1.default.throws(() => {
80
- (0, utils_1.decodeFlushERC721TokensData)(encoded); // Missing 'to' parameter
81
- }, /Missing to address/);
82
- });
83
- });
84
- describe('ERC1155 Flush Functions', () => {
85
- it('should encode flush ERC1155 data correctly for v0-v3', () => {
86
- const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
87
- const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
88
- const tokenId = '99999';
89
- const forwarderVersion = 0;
90
- const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
91
- should_1.default.exist(encoded);
92
- encoded.should.startWith('0xe6bd0aa4'); // flushERC1155ForwarderTokens method ID
93
- encoded.should.be.a.String();
94
- encoded.length.should.be.greaterThan(10); // method ID + parameters
95
- });
96
- it('should encode flush ERC1155 data correctly for v4+', () => {
97
- const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
98
- const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
99
- const tokenId = '99999';
100
- const forwarderVersion = 4;
101
- const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
102
- should_1.default.exist(encoded);
103
- encoded.should.startWith('0x8972c17c'); // flushERC1155Tokens method ID (v5)
104
- encoded.should.be.a.String();
105
- });
106
- it('should decode flush ERC1155 data correctly for v0-v3', () => {
107
- const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
108
- const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
109
- const tokenId = '99999';
110
- const forwarderVersion = 2;
111
- const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
112
- const decoded = (0, utils_1.decodeFlushERC1155TokensData)(encoded);
113
- should_1.default.exist(decoded);
114
- decoded.forwarderAddress.toLowerCase().should.equal(forwarderAddress.toLowerCase());
115
- decoded.tokenAddress.toLowerCase().should.equal(tokenAddress.toLowerCase());
116
- decoded.tokenId.should.equal(tokenId);
117
- should_1.default.not.exist(decoded.forwarderVersion);
118
- });
119
- it('should decode flush ERC1155 data correctly for v4+', () => {
120
- const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
121
- const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
122
- const tokenId = '99999';
123
- const forwarderVersion = 4;
124
- const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
125
- const decoded = (0, utils_1.decodeFlushERC1155TokensData)(encoded, forwarderAddress);
126
- should_1.default.exist(decoded);
127
- decoded.forwarderAddress.toLowerCase().should.equal(forwarderAddress.toLowerCase());
128
- decoded.tokenAddress.toLowerCase().should.equal(tokenAddress.toLowerCase());
129
- decoded.tokenId.should.equal(tokenId);
130
- should_1.default.exist(decoded.forwarderVersion);
131
- should_1.default.equal(decoded.forwarderVersion, 4);
132
- });
133
- it('should handle token ID 0 for ERC1155', () => {
134
- const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
135
- const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
136
- const tokenId = '0';
137
- const forwarderVersion = 0;
138
- const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
139
- const decoded = (0, utils_1.decodeFlushERC1155TokensData)(encoded);
140
- decoded.tokenId.should.equal(tokenId);
141
- });
142
- it('should handle large token IDs for ERC1155', () => {
143
- const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
144
- const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
145
- const tokenId = '115792089237316195423570985008687907853269984665640564039457584007913129639935'; // max uint256
146
- const forwarderVersion = 0;
147
- const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
148
- const decoded = (0, utils_1.decodeFlushERC1155TokensData)(encoded);
149
- decoded.tokenId.should.equal(tokenId);
150
- });
151
- it('should throw error for invalid flush ERC1155 data', () => {
152
- const invalidData = '0x87654321'; // Wrong method ID
153
- should_1.default.throws(() => {
154
- (0, utils_1.decodeFlushERC1155TokensData)(invalidData);
155
- }, /Invalid flush ERC1155 bytecode/);
156
- });
157
- it('should throw error for missing to address in v4+ decode', () => {
158
- const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
159
- const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
160
- const tokenId = '99999';
161
- const forwarderVersion = 4;
162
- const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
163
- should_1.default.throws(() => {
164
- (0, utils_1.decodeFlushERC1155TokensData)(encoded); // Missing 'to' parameter
165
- }, /Missing to address/);
166
- });
167
- });
168
- describe('Token Address Validation', () => {
169
- it('should preserve address format in encoding/decoding', () => {
170
- const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
171
- const tokenAddressChecksum = '0xDf7DECb1bAa8F529F0C8982cBB4Be50357195299'; // With checksum
172
- const tokenId = '12345';
173
- const forwarderVersion = 0;
174
- const encoded721 = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddressChecksum, tokenId, forwarderVersion);
175
- const decoded721 = (0, utils_1.decodeFlushERC721TokensData)(encoded721);
176
- // Should preserve the address (though may lowercase it)
177
- decoded721.tokenAddress.toLowerCase().should.equal(tokenAddressChecksum.toLowerCase());
178
- const encoded1155 = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddressChecksum, tokenId, forwarderVersion);
179
- const decoded1155 = (0, utils_1.decodeFlushERC1155TokensData)(encoded1155);
180
- decoded1155.tokenAddress.toLowerCase().should.equal(tokenAddressChecksum.toLowerCase());
181
- });
182
- });
183
- });
184
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsK0NBSzZCO0FBRTdCLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUU7SUFDbEMsUUFBUSxDQUFDLHdCQUF3QixFQUFFLEdBQUcsRUFBRTtRQUN0QyxFQUFFLENBQUMscURBQXFELEVBQUUsR0FBRyxFQUFFO1lBQzdELE1BQU0sZ0JBQWdCLEdBQUcsNENBQTRDLENBQUM7WUFDdEUsTUFBTSxZQUFZLEdBQUcsNENBQTRDLENBQUM7WUFDbEUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ3hCLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1lBRTNCLE1BQU0sT0FBTyxHQUFHLElBQUEsNkJBQXFCLEVBQUMsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBRWpHLGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsdUNBQXVDO1lBQy9FLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QixPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMseUJBQXlCO1FBQ3JFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEdBQUcsRUFBRTtZQUMzRCxNQUFNLGdCQUFnQixHQUFHLDRDQUE0QyxDQUFDO1lBQ3RFLE1BQU0sWUFBWSxHQUFHLDRDQUE0QyxDQUFDO1lBQ2xFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUN4QixNQUFNLGdCQUFnQixH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NEIsRUFBQyxXQUFXLENBQUMsQ0FBQztZQUU5RCxXQUFXLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUMxRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQge1xuICBmbHVzaEVSQzcyMVRva2Vuc0RhdGEsXG4gIGZsdXNoRVJDMTE1NVRva2Vuc0RhdGEsXG4gIGRlY29kZUZsdXNoRVJDNzIxVG9rZW5zRGF0YSxcbiAgZGVjb2RlRmx1c2hFUkMxMTU1VG9rZW5zRGF0YSxcbn0gZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5cbmRlc2NyaWJlKCdBYnN0cmFjdCBFVEggVXRpbHMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdFUkM3MjEgRmx1c2ggRnVuY3Rpb25zJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZW5jb2RlIGZsdXNoIEVSQzcyMSBkYXRhIGNvcnJlY3RseSBmb3IgdjAtdjMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgIGNvbnN0IHRva2VuSWQgPSAnMTIzNDUnO1xuICAgICAgY29uc3QgZm9yd2FyZGVyVmVyc2lvbiA9IDA7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBmbHVzaEVSQzcyMVRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzLCB0b2tlbklkLCBmb3J3YXJkZXJWZXJzaW9uKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGVuY29kZWQpO1xuICAgICAgZW5jb2RlZC5zaG91bGQuc3RhcnRXaXRoKCcweDVhOTUzZDBhJyk7IC8vIGZsdXNoRVJDNzIxRm9yd2FyZGVyVG9rZW5zIG1ldGhvZCBJRFxuICAgICAgZW5jb2RlZC5zaG91bGQuYmUuYS5TdHJpbmcoKTtcbiAgICAgIGVuY29kZWQubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigxMCk7IC8vIG1ldGhvZCBJRCArIHBhcmFtZXRlcnNcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZW5jb2RlIGZsdXNoIEVSQzcyMSBkYXRhIGNvcnJlY3RseSBmb3IgdjQrJywgKCkgPT4ge1xuICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICBjb25zdCB0b2tlbklkID0gJzEyMzQ1JztcbiAgICAgIGNvbnN0IGZvcndhcmRlclZlcnNpb24gPSA0O1xuXG4gICAgICBjb25zdCBlbmNvZGVkID0gZmx1c2hFUkM3MjFUb2tlbnNEYXRhKGZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZCwgZm9yd2FyZGVyVmVyc2lvbik7XG5cbiAgICAgIHNob3VsZC5leGlzdChlbmNvZGVkKTtcbiAgICAgIGVuY29kZWQuc2hvdWxkLnN0YXJ0V2l0aCgnMHgxNTllNDRkNycpOyAvLyBmbHVzaEVSQzcyMVRva2VuIG1ldGhvZCBJRCAodjUpXG4gICAgICBlbmNvZGVkLnNob3VsZC5iZS5hLlN0cmluZygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWNvZGUgZmx1c2ggRVJDNzIxIGRhdGEgY29ycmVjdGx5IGZvciB2MC12MycsICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgY29uc3QgdG9rZW5JZCA9ICcxMjM0NSc7XG4gICAgICBjb25zdCBmb3J3YXJkZXJWZXJzaW9uID0gMjtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGZsdXNoRVJDNzIxVG9rZW5zRGF0YShmb3J3YXJkZXJBZGRyZXNzLCB0b2tlbkFkZHJlc3MsIHRva2VuSWQsIGZvcndhcmRlclZlcnNpb24pO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUZsdXNoRVJDNzIxVG9rZW5zRGF0YShlbmNvZGVkKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGRlY29kZWQpO1xuICAgICAgZGVjb2RlZC5mb3J3YXJkZXJBZGRyZXNzLnRvTG93ZXJDYXNlKCkuc2hvdWxkLmVxdWFsKGZvcndhcmRlckFkZHJlc3MudG9Mb3dlckNhc2UoKSk7XG4gICAgICBkZWNvZGVkLnRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpLnNob3VsZC5lcXVhbCh0b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKSk7XG4gICAgICBkZWNvZGVkLnRva2VuSWQuc2hvdWxkLmVxdWFsKHRva2VuSWQpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdChkZWNvZGVkLmZvcndhcmRlclZlcnNpb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWNvZGUgZmx1c2ggRVJDNzIxIGRhdGEgY29ycmVjdGx5IGZvciB2NCsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgIGNvbnN0IHRva2VuSWQgPSAnMTIzNDUnO1xuICAgICAgY29uc3QgZm9yd2FyZGVyVmVyc2lvbiA9IDQ7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBmbHVzaEVSQzcyMVRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzLCB0b2tlbklkLCBmb3J3YXJkZXJWZXJzaW9uKTtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVGbHVzaEVSQzcyMVRva2Vuc0RhdGEoZW5jb2RlZCwgZm9yd2FyZGVyQWRkcmVzcyk7XG5cbiAgICAgIHNob3VsZC5leGlzdChkZWNvZGVkKTtcbiAgICAgIGRlY29kZWQuZm9yd2FyZGVyQWRkcmVzcy50b0xvd2VyQ2FzZSgpLnNob3VsZC5lcXVhbChmb3J3YXJkZXJBZGRyZXNzLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgZGVjb2RlZC50b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKS5zaG91bGQuZXF1YWwodG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgZGVjb2RlZC50b2tlbklkLnNob3VsZC5lcXVhbCh0b2tlbklkKTtcbiAgICAgIHNob3VsZC5leGlzdChkZWNvZGVkLmZvcndhcmRlclZlcnNpb24pO1xuICAgICAgc2hvdWxkLmVxdWFsKGRlY29kZWQuZm9yd2FyZGVyVmVyc2lvbiwgNCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBsYXJnZSB0b2tlbiBJRHMgZm9yIEVSQzcyMScsICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgY29uc3QgdG9rZW5JZCA9ICcxMTU3OTIwODkyMzczMTYxOTU0MjM1NzA5ODUwMDg2ODc5MDc4NTMyNjk5ODQ2NjU2NDA1NjQwMzk0NTc1ODQwMDc5MTMxMjk2Mzk5MzUnOyAvLyBtYXggdWludDI1NlxuICAgICAgY29uc3QgZm9yd2FyZGVyVmVyc2lvbiA9IDA7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBmbHVzaEVSQzcyMVRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzLCB0b2tlbklkLCBmb3J3YXJkZXJWZXJzaW9uKTtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVGbHVzaEVSQzcyMVRva2Vuc0RhdGEoZW5jb2RlZCk7XG5cbiAgICAgIGRlY29kZWQudG9rZW5JZC5zaG91bGQuZXF1YWwodG9rZW5JZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpbnZhbGlkIGZsdXNoIEVSQzcyMSBkYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW52YWxpZERhdGEgPSAnMHgxMjM0NTY3OCc7IC8vIFdyb25nIG1ldGhvZCBJRFxuXG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgZGVjb2RlRmx1c2hFUkM3MjFUb2tlbnNEYXRhKGludmFsaWREYXRhKTtcbiAgICAgIH0sIC9JbnZhbGlkIGZsdXNoIEVSQzcyMSBieXRlY29kZS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgbWlzc2luZyB0byBhZGRyZXNzIGluIHY0KyBkZWNvZGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgIGNvbnN0IHRva2VuSWQgPSAnMTIzNDUnO1xuICAgICAgY29uc3QgZm9yd2FyZGVyVmVyc2lvbiA9IDQ7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBmbHVzaEVSQzcyMVRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzLCB0b2tlbklkLCBmb3J3YXJkZXJWZXJzaW9uKTtcblxuICAgICAgc2hvdWxkLnRocm93cygoKSA9PiB7XG4gICAgICAgIGRlY29kZUZsdXNoRVJDNzIxVG9rZW5zRGF0YShlbmNvZGVkKTsgLy8gTWlzc2luZyAndG8nIHBhcmFtZXRlclxuICAgICAgfSwgL01pc3NpbmcgdG8gYWRkcmVzcy8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRVJDMTE1NSBGbHVzaCBGdW5jdGlvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBlbmNvZGUgZmx1c2ggRVJDMTE1NSBkYXRhIGNvcnJlY3RseSBmb3IgdjAtdjMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgIGNvbnN0IHRva2VuSWQgPSAnOTk5OTknO1xuICAgICAgY29uc3QgZm9yd2FyZGVyVmVyc2lvbiA9IDA7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBmbHVzaEVSQzExNTVUb2tlbnNEYXRhKGZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZCwgZm9yd2FyZGVyVmVyc2lvbik7XG5cbiAgICAgIHNob3VsZC5leGlzdChlbmNvZGVkKTtcbiAgICAgIGVuY29kZWQuc2hvdWxkLnN0YXJ0V2l0aCgnMHhlNmJkMGFhNCcpOyAvLyBmbHVzaEVSQzExNTVGb3J3YXJkZXJUb2tlbnMgbWV0aG9kIElEXG4gICAgICBlbmNvZGVkLnNob3VsZC5iZS5hLlN0cmluZygpO1xuICAgICAgZW5jb2RlZC5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDEwKTsgLy8gbWV0aG9kIElEICsgcGFyYW1ldGVyc1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBlbmNvZGUgZmx1c2ggRVJDMTE1NSBkYXRhIGNvcnJlY3RseSBmb3IgdjQrJywgKCkgPT4ge1xuICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICBjb25zdCB0b2tlbklkID0gJzk5OTk5JztcbiAgICAgIGNvbnN0IGZvcndhcmRlclZlcnNpb24gPSA0O1xuXG4gICAgICBjb25zdCBlbmNvZGVkID0gZmx1c2hFUkMxMTU1VG9rZW5zRGF0YShmb3J3YXJkZXJBZGRyZXNzLCB0b2tlbkFkZHJlc3MsIHRva2VuSWQsIGZvcndhcmRlclZlcnNpb24pO1xuXG4gICAgICBzaG91bGQuZXhpc3QoZW5jb2RlZCk7XG4gICAgICBlbmNvZGVkLnNob3VsZC5zdGFydFdpdGgoJzB4ODk3MmMxN2MnKTsgLy8gZmx1c2hFUkMxMTU1VG9rZW5zIG1ldGhvZCBJRCAodjUpXG4gICAgICBlbmNvZGVkLnNob3VsZC5iZS5hLlN0cmluZygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWNvZGUgZmx1c2ggRVJDMTE1NSBkYXRhIGNvcnJlY3RseSBmb3IgdjAtdjMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgIGNvbnN0IHRva2VuSWQgPSAnOTk5OTknO1xuICAgICAgY29uc3QgZm9yd2FyZGVyVmVyc2lvbiA9IDI7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBmbHVzaEVSQzExNTVUb2tlbnNEYXRhKGZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZCwgZm9yd2FyZGVyVmVyc2lvbik7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRmx1c2hFUkMxMTU1VG9rZW5zRGF0YShlbmNvZGVkKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGRlY29kZWQpO1xuICAgICAgZGVjb2RlZC5mb3J3YXJkZXJBZGRyZXNzLnRvTG93ZXJDYXNlKCkuc2hvdWxkLmVxdWFsKGZvcndhcmRlckFkZHJlc3MudG9Mb3dlckNhc2UoKSk7XG4gICAgICBkZWNvZGVkLnRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpLnNob3VsZC5lcXVhbCh0b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKSk7XG4gICAgICBkZWNvZGVkLnRva2VuSWQuc2hvdWxkLmVxdWFsKHRva2VuSWQpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdChkZWNvZGVkLmZvcndhcmRlclZlcnNpb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWNvZGUgZmx1c2ggRVJDMTE1NSBkYXRhIGNvcnJlY3RseSBmb3IgdjQrJywgKCkgPT4ge1xuICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICBjb25zdCB0b2tlbklkID0gJzk5OTk5JztcbiAgICAgIGNvbnN0IGZvcndhcmRlclZlcnNpb24gPSA0O1xuXG4gICAgICBjb25zdCBlbmNvZGVkID0gZmx1c2hFUkMxMTU1VG9rZW5zRGF0YShmb3J3YXJkZXJBZGRyZXNzLCB0b2tlbkFkZHJlc3MsIHRva2VuSWQsIGZvcndhcmRlclZlcnNpb24pO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUZsdXNoRVJDMTE1NVRva2Vuc0RhdGEoZW5jb2RlZCwgZm9yd2FyZGVyQWRkcmVzcyk7XG5cbiAgICAgIHNob3VsZC5leGlzdChkZWNvZGVkKTtcbiAgICAgIGRlY29kZWQuZm9yd2FyZGVyQWRkcmVzcy50b0xvd2VyQ2FzZSgpLnNob3VsZC5lcXVhbChmb3J3YXJkZXJBZGRyZXNzLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgZGVjb2RlZC50b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKS5zaG91bGQuZXF1YWwodG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgZGVjb2RlZC50b2tlbklkLnNob3VsZC5lcXVhbCh0b2tlbklkKTtcbiAgICAgIHNob3VsZC5leGlzdChkZWNvZGVkLmZvcndhcmRlclZlcnNpb24pO1xuICAgICAgc2hvdWxkLmVxdWFsKGRlY29kZWQuZm9yd2FyZGVyVmVyc2lvbiwgNCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSB0b2tlbiBJRCAwIGZvciBFUkMxMTU1JywgKCkgPT4ge1xuICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICBjb25zdCB0b2tlbklkID0gJzAnO1xuICAgICAgY29uc3QgZm9yd2FyZGVyVmVyc2lvbiA9IDA7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBmbHVzaEVSQzExNTVUb2tlbnNEYXRhKGZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZCwgZm9yd2FyZGVyVmVyc2lvbik7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRmx1c2hFUkMxMTU1VG9rZW5zRGF0YShlbmNvZGVkKTtcblxuICAgICAgZGVjb2RlZC50b2tlbklkLnNob3VsZC5lcXVhbCh0b2tlbklkKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGxhcmdlIHRva2VuIElEcyBmb3IgRVJDMTE1NScsICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgY29uc3QgdG9rZW5JZCA9ICcxMTU3OTIwODkyMzczMTYxOTU0MjM1NzA5ODUwMDg2ODc5MDc4NTMyNjk5ODQ2NjU2NDA1NjQwMzk0NTc1ODQwMDc5MTMxMjk2Mzk5MzUnOyAvLyBtYXggdWludDI1NlxuICAgICAgY29uc3QgZm9yd2FyZGVyVmVyc2lvbiA9IDA7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBmbHVzaEVSQzExNTVUb2tlbnNEYXRhKGZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZCwgZm9yd2FyZGVyVmVyc2lvbik7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRmx1c2hFUkMxMTU1VG9rZW5zRGF0YShlbmNvZGVkKTtcblxuICAgICAgZGVjb2RlZC50b2tlbklkLnNob3VsZC5lcXVhbCh0b2tlbklkKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgZmx1c2ggRVJDMTE1NSBkYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW52YWxpZERhdGEgPSAnMHg4NzY1NDMyMSc7IC8vIFdyb25nIG1ldGhvZCBJRFxuXG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgZGVjb2RlRmx1c2hFUkMxMTU1VG9rZW5zRGF0YShpbnZhbGlkRGF0YSk7XG4gICAgICB9LCAvSW52YWxpZCBmbHVzaCBFUkMxMTU1IGJ5dGVjb2RlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBtaXNzaW5nIHRvIGFkZHJlc3MgaW4gdjQrIGRlY29kZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgY29uc3QgdG9rZW5JZCA9ICc5OTk5OSc7XG4gICAgICBjb25zdCBmb3J3YXJkZXJWZXJzaW9uID0gNDtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGZsdXNoRVJDMTE1NVRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzLCB0b2tlbklkLCBmb3J3YXJkZXJWZXJzaW9uKTtcblxuICAgICAgc2hvdWxkLnRocm93cygoKSA9PiB7XG4gICAgICAgIGRlY29kZUZsdXNoRVJDMTE1NVRva2Vuc0RhdGEoZW5jb2RlZCk7IC8vIE1pc3NpbmcgJ3RvJyBwYXJhbWV0ZXJcbiAgICAgIH0sIC9NaXNzaW5nIHRvIGFkZHJlc3MvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Rva2VuIEFkZHJlc3MgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHByZXNlcnZlIGFkZHJlc3MgZm9ybWF0IGluIGVuY29kaW5nL2RlY29kaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgY29uc3QgdG9rZW5BZGRyZXNzQ2hlY2tzdW0gPSAnMHhEZjdERUNiMWJBYThGNTI5RjBDODk4MmNCQjRCZTUwMzU3MTk1Mjk5JzsgLy8gV2l0aCBjaGVja3N1bVxuICAgICAgY29uc3QgdG9rZW5JZCA9ICcxMjM0NSc7XG4gICAgICBjb25zdCBmb3J3YXJkZXJWZXJzaW9uID0gMDtcblxuICAgICAgY29uc3QgZW5jb2RlZDcyMSA9IGZsdXNoRVJDNzIxVG9rZW5zRGF0YShmb3J3YXJkZXJBZGRyZXNzLCB0b2tlbkFkZHJlc3NDaGVja3N1bSwgdG9rZW5JZCwgZm9yd2FyZGVyVmVyc2lvbik7XG4gICAgICBjb25zdCBkZWNvZGVkNzIxID0gZGVjb2RlRmx1c2hFUkM3MjFUb2tlbnNEYXRhKGVuY29kZWQ3MjEpO1xuXG4gICAgICAvLyBTaG91bGQgcHJlc2VydmUgdGhlIGFkZHJlc3MgKHRob3VnaCBtYXkgbG93ZXJjYXNlIGl0KVxuICAgICAgZGVjb2RlZDcyMS50b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKS5zaG91bGQuZXF1YWwodG9rZW5BZGRyZXNzQ2hlY2tzdW0udG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQxMTU1ID0gZmx1c2hFUkMxMTU1VG9rZW5zRGF0YShmb3J3YXJkZXJBZGRyZXNzLCB0b2tlbkFkZHJlc3NDaGVja3N1bSwgdG9rZW5JZCwgZm9yd2FyZGVyVmVyc2lvbik7XG4gICAgICBjb25zdCBkZWNvZGVkMTE1NSA9IGRlY29kZUZsdXNoRVJDMTE1NVRva2Vuc0RhdGEoZW5jb2RlZDExNTUpO1xuXG4gICAgICBkZWNvZGVkMTE1NS50b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKS5zaG91bGQuZXF1YWwodG9rZW5BZGRyZXNzQ2hlY2tzdW0udG9Mb3dlckNhc2UoKSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=