israeli-bank-scrapers 3.4.1 → 3.7.0

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 (58) hide show
  1. package/README.md +42 -0
  2. package/lib/definitions.d.ts +6 -1
  3. package/lib/definitions.js +6 -1
  4. package/lib/helpers/fetch.d.ts +2 -1
  5. package/lib/helpers/fetch.js +26 -9
  6. package/lib/helpers/storage.d.ts +2 -0
  7. package/lib/helpers/storage.js +17 -0
  8. package/lib/index.d.ts +2 -1
  9. package/lib/index.js +47 -3
  10. package/lib/scrapers/amex.d.ts +1 -1
  11. package/lib/scrapers/amex.js +1 -1
  12. package/lib/scrapers/amex.test.js +3 -2
  13. package/lib/scrapers/base-beinleumi-group.d.ts +7 -4
  14. package/lib/scrapers/base-beinleumi-group.js +1 -1
  15. package/lib/scrapers/base-isracard-amex.d.ts +8 -3
  16. package/lib/scrapers/base-isracard-amex.js +13 -11
  17. package/lib/scrapers/base-scraper-with-browser.d.ts +6 -3
  18. package/lib/scrapers/base-scraper-with-browser.js +14 -11
  19. package/lib/scrapers/base-scraper.d.ts +9 -119
  20. package/lib/scrapers/base-scraper.js +34 -50
  21. package/lib/scrapers/beyahad-bishvilha.d.ts +6 -3
  22. package/lib/scrapers/beyahad-bishvilha.js +1 -1
  23. package/lib/scrapers/discount.d.ts +9 -4
  24. package/lib/scrapers/discount.js +4 -4
  25. package/lib/scrapers/discount.test.js +4 -3
  26. package/lib/scrapers/errors.d.ts +16 -0
  27. package/lib/scrapers/errors.js +37 -0
  28. package/lib/scrapers/factory.d.ts +2 -16
  29. package/lib/scrapers/factory.js +6 -1
  30. package/lib/scrapers/hapoalim.d.ts +6 -3
  31. package/lib/scrapers/hapoalim.js +1 -1
  32. package/lib/scrapers/hapoalim.test.js +2 -2
  33. package/lib/scrapers/interface.d.ts +146 -0
  34. package/lib/scrapers/interface.js +2 -0
  35. package/lib/scrapers/isracard.d.ts +1 -1
  36. package/lib/scrapers/isracard.js +1 -1
  37. package/lib/scrapers/isracard.test.js +4 -3
  38. package/lib/scrapers/leumi.d.ts +8 -4
  39. package/lib/scrapers/leumi.js +1 -1
  40. package/lib/scrapers/max.d.ts +6 -3
  41. package/lib/scrapers/max.js +1 -1
  42. package/lib/scrapers/mizrahi.d.ts +7 -3
  43. package/lib/scrapers/mizrahi.js +11 -9
  44. package/lib/scrapers/one-zero-queries.d.ts +2 -0
  45. package/lib/scrapers/one-zero-queries.js +562 -0
  46. package/lib/scrapers/one-zero.d.ts +36 -0
  47. package/lib/scrapers/one-zero.js +304 -0
  48. package/lib/scrapers/one-zero.test.d.ts +1 -0
  49. package/lib/scrapers/one-zero.test.js +67 -0
  50. package/lib/scrapers/otsar-hahayal.d.ts +6 -3
  51. package/lib/scrapers/otsar-hahayal.js +1 -1
  52. package/lib/scrapers/union-bank.d.ts +6 -3
  53. package/lib/scrapers/union-bank.js +1 -1
  54. package/lib/scrapers/visa-cal.d.ts +103 -15
  55. package/lib/scrapers/visa-cal.js +154 -265
  56. package/lib/scrapers/yahav.d.ts +7 -3
  57. package/lib/scrapers/yahav.js +1 -1
  58. package/package.json +2 -2
@@ -0,0 +1,304 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.symbol.description");
4
+
5
+ require("core-js/modules/es.array.flat-map");
6
+
7
+ require("core-js/modules/es.array.iterator");
8
+
9
+ require("core-js/modules/es.array.sort");
10
+
11
+ require("core-js/modules/es.array.unscopables.flat-map");
12
+
13
+ require("core-js/modules/es.promise");
14
+
15
+ require("core-js/modules/es.string.replace");
16
+
17
+ require("core-js/modules/es.string.trim");
18
+
19
+ Object.defineProperty(exports, "__esModule", {
20
+ value: true
21
+ });
22
+ exports.default = void 0;
23
+
24
+ var _moment = _interopRequireDefault(require("moment/moment"));
25
+
26
+ var _debug = require("../helpers/debug");
27
+
28
+ var _fetch = require("../helpers/fetch");
29
+
30
+ var _errors = require("./errors");
31
+
32
+ var _oneZeroQueries = require("./one-zero-queries");
33
+
34
+ var _transactions = require("../transactions");
35
+
36
+ var _baseScraper = require("./base-scraper");
37
+
38
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
39
+
40
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
41
+
42
+ const HEBREW_WORDS_REGEX = /[\u0590-\u05FF][\u0590-\u05FF"'\-_ /\\]*[\u0590-\u05FF]/g;
43
+ const debug = (0, _debug.getDebug)('one-zero');
44
+ const IDENTITY_SERVER_URL = 'https://identity.tfd-bank.com/v1/';
45
+ const GRAPHQL_API_URL = 'https://mobile.tfd-bank.com/mobile-graph/graphql';
46
+
47
+ class OneZeroScraper extends _baseScraper.BaseScraper {
48
+ constructor(...args) {
49
+ super(...args);
50
+
51
+ _defineProperty(this, "otpContext", void 0);
52
+
53
+ _defineProperty(this, "accessToken", void 0);
54
+ }
55
+
56
+ async triggerTwoFactorAuth(phoneNumber) {
57
+ if (!phoneNumber.startsWith('+')) {
58
+ return (0, _errors.createGenericError)('A full international phone number starting with + and a three digit country code is required');
59
+ }
60
+
61
+ debug('Fetching device token');
62
+ const deviceTokenResponse = await (0, _fetch.fetchPost)(`${IDENTITY_SERVER_URL}/devices/token`, {
63
+ extClientId: 'mobile',
64
+ os: 'Android'
65
+ });
66
+ const {
67
+ resultData: {
68
+ deviceToken
69
+ }
70
+ } = deviceTokenResponse;
71
+ debug(`Sending OTP to phone number ${phoneNumber}`);
72
+ const otpPrepareResponse = await (0, _fetch.fetchPost)(`${IDENTITY_SERVER_URL}/otp/prepare`, {
73
+ factorValue: phoneNumber,
74
+ deviceToken,
75
+ otpChannel: 'SMS_OTP'
76
+ });
77
+ const {
78
+ resultData: {
79
+ otpContext
80
+ }
81
+ } = otpPrepareResponse;
82
+ this.otpContext = otpContext;
83
+ return {
84
+ success: true
85
+ };
86
+ }
87
+
88
+ async getLongTermTwoFactorToken(otpCode) {
89
+ if (!this.otpContext) {
90
+ return (0, _errors.createGenericError)('triggerOtp was not called before calling getPermenantOtpToken()');
91
+ }
92
+
93
+ debug('Requesting OTP token');
94
+ const otpVerifyResponse = await (0, _fetch.fetchPost)(`${IDENTITY_SERVER_URL}/otp/verify`, {
95
+ otpContext: this.otpContext,
96
+ otpCode
97
+ });
98
+ const {
99
+ resultData: {
100
+ otpToken
101
+ }
102
+ } = otpVerifyResponse;
103
+ return {
104
+ success: true,
105
+ longTermTwoFactorAuthToken: otpToken
106
+ };
107
+ }
108
+
109
+ async resolveOtpToken(credentials) {
110
+ if ('otpLongTermToken' in credentials) {
111
+ if (!credentials.otpLongTermToken) {
112
+ return (0, _errors.createGenericError)('Invalid otpLongTermToken');
113
+ }
114
+
115
+ return {
116
+ success: true,
117
+ longTermTwoFactorAuthToken: credentials.otpLongTermToken
118
+ };
119
+ }
120
+
121
+ if (!credentials.otpCodeRetriever) {
122
+ return {
123
+ success: false,
124
+ errorType: _errors.ScraperErrorTypes.TwoFactorRetrieverMissing,
125
+ errorMessage: 'otpCodeRetriever is required when otpPermanentToken is not provided'
126
+ };
127
+ }
128
+
129
+ if (!credentials.phoneNumber) {
130
+ return (0, _errors.createGenericError)('phoneNumber is required when providing a otpCodeRetriever callback');
131
+ }
132
+
133
+ debug('Triggering user supplied otpCodeRetriever callback');
134
+ const triggerResult = await this.triggerTwoFactorAuth(credentials.phoneNumber);
135
+
136
+ if (!triggerResult.success) {
137
+ return triggerResult;
138
+ }
139
+
140
+ const otpCode = await credentials.otpCodeRetriever();
141
+ const otpTokenResult = await this.getLongTermTwoFactorToken(otpCode);
142
+
143
+ if (!otpTokenResult.success) {
144
+ return otpTokenResult;
145
+ }
146
+
147
+ return {
148
+ success: true,
149
+ longTermTwoFactorAuthToken: otpTokenResult.longTermTwoFactorAuthToken
150
+ };
151
+ }
152
+
153
+ async login(credentials) {
154
+ const otpTokenResult = await this.resolveOtpToken(credentials);
155
+
156
+ if (!otpTokenResult.success) {
157
+ return otpTokenResult;
158
+ }
159
+
160
+ debug('Requesting id token');
161
+ const getIdTokenResponse = await (0, _fetch.fetchPost)(`${IDENTITY_SERVER_URL}/getIdToken`, {
162
+ otpSmsToken: otpTokenResult.longTermTwoFactorAuthToken,
163
+ email: credentials.email,
164
+ pass: credentials.password,
165
+ pinCode: ''
166
+ });
167
+ const {
168
+ resultData: {
169
+ idToken
170
+ }
171
+ } = getIdTokenResponse;
172
+ debug('Requesting session token');
173
+ const getSessionTokenResponse = await (0, _fetch.fetchPost)(`${IDENTITY_SERVER_URL}/sessions/token`, {
174
+ idToken,
175
+ pass: credentials.password
176
+ });
177
+ const {
178
+ resultData: {
179
+ accessToken
180
+ }
181
+ } = getSessionTokenResponse;
182
+ this.accessToken = accessToken;
183
+ return {
184
+ success: true,
185
+ persistentOtpToken: otpTokenResult.longTermTwoFactorAuthToken
186
+ };
187
+ }
188
+
189
+ async fetchPortfolioMovements(portfolio, startDate) {
190
+ // TODO: Find out if we need the other accounts, there seems to always be one
191
+ const account = portfolio.accounts[0];
192
+ let cursor = null;
193
+ const movements = [];
194
+
195
+ while (!movements.length || new Date(movements[0].movementTimestamp) >= startDate) {
196
+ debug(`Fetching transactions for account ${portfolio.portfolioNum}...`);
197
+ const {
198
+ movements: {
199
+ movements: newMovements,
200
+ pagination
201
+ }
202
+ } = await (0, _fetch.fetchGraphql)(GRAPHQL_API_URL, _oneZeroQueries.GET_MOVEMENTS, {
203
+ portfolioId: portfolio.portfolioId,
204
+ accountId: account.accountId,
205
+ language: 'HEBREW',
206
+ pagination: {
207
+ cursor,
208
+ limit: 50
209
+ }
210
+ }, {
211
+ authorization: `Bearer ${this.accessToken}`
212
+ });
213
+ movements.unshift(...newMovements);
214
+ cursor = pagination.cursor;
215
+
216
+ if (!pagination.hasMore) {
217
+ break;
218
+ }
219
+ }
220
+
221
+ movements.sort((x, y) => new Date(x.movementTimestamp).valueOf() - new Date(y.movementTimestamp).valueOf());
222
+ const matchingMovements = movements.filter(movement => new Date(movement.movementTimestamp) >= startDate);
223
+ return {
224
+ accountNumber: portfolio.portfolioNum,
225
+ balance: !movements.length ? 0 : parseFloat(movements[movements.length - 1].runningBalance),
226
+ txns: matchingMovements.map(movement => {
227
+ var _movement$transaction, _movement$transaction2, _movement$transaction3;
228
+
229
+ const hasInstallments = (_movement$transaction = movement.transaction) === null || _movement$transaction === void 0 ? void 0 : (_movement$transaction2 = _movement$transaction.enrichment) === null || _movement$transaction2 === void 0 ? void 0 : (_movement$transaction3 = _movement$transaction2.recurrences) === null || _movement$transaction3 === void 0 ? void 0 : _movement$transaction3.some(x => x.isRecurrent);
230
+ const modifier = movement.creditDebit === 'DEBIT' ? -1 : 1;
231
+ return {
232
+ date: movement.valueDate,
233
+ chargedAmount: +movement.movementAmount * modifier,
234
+ chargedCurrency: movement.movementCurrency,
235
+ originalAmount: +movement.movementAmount * modifier,
236
+ originalCurrency: movement.movementCurrency,
237
+ description: this.sanitizeHebrew(movement.description),
238
+ processedDate: movement.movementTimestamp,
239
+ status: _transactions.TransactionStatuses.Completed,
240
+ type: hasInstallments ? _transactions.TransactionTypes.Installments : _transactions.TransactionTypes.Normal
241
+ };
242
+ })
243
+ };
244
+ }
245
+ /**
246
+ * one zero hebrew strings are reversed with a unicode control character that forces display in LTR order
247
+ * We need to remove the unicode control character, and then reverse hebrew substrings inside the string
248
+ */
249
+
250
+
251
+ sanitizeHebrew(text) {
252
+ if (!text.includes('\u202d')) {
253
+ return text.trim();
254
+ }
255
+
256
+ const plainString = text.replace(/\u202d/gi, '').trim();
257
+ const hebrewSubStringsRanges = [...plainString.matchAll(HEBREW_WORDS_REGEX)];
258
+ const rangesToReverse = hebrewSubStringsRanges.map(text => ({
259
+ start: text.index,
260
+ end: text.index + text[0].length
261
+ }));
262
+ const out = [];
263
+ let index = 0;
264
+
265
+ for (const {
266
+ start,
267
+ end
268
+ } of rangesToReverse) {
269
+ out.push(...plainString.substring(index, start));
270
+ index += start - index;
271
+ const reversed = [...plainString.substring(start, end)].reverse();
272
+ out.push(...reversed);
273
+ index += end - start;
274
+ }
275
+
276
+ out.push(...plainString.substring(index, plainString.length));
277
+ return out.join('');
278
+ }
279
+
280
+ async fetchData() {
281
+ if (!this.accessToken) {
282
+ return (0, _errors.createGenericError)('login() was not called');
283
+ }
284
+
285
+ const defaultStartMoment = (0, _moment.default)().subtract(1, 'years').add(1, 'day');
286
+ const startDate = this.options.startDate || defaultStartMoment.toDate();
287
+
288
+ const startMoment = _moment.default.max(defaultStartMoment, (0, _moment.default)(startDate));
289
+
290
+ debug('Fetching account list');
291
+ const result = await (0, _fetch.fetchGraphql)(GRAPHQL_API_URL, _oneZeroQueries.GET_CUSTOMER, {}, {
292
+ authorization: `Bearer ${this.accessToken}`
293
+ });
294
+ const portfolios = result.customer.flatMap(customer => customer.portfolios || []);
295
+ return {
296
+ success: true,
297
+ accounts: await Promise.all(portfolios.map(portfolio => this.fetchPortfolioMovements(portfolio, startMoment.toDate())))
298
+ };
299
+ }
300
+
301
+ }
302
+
303
+ exports.default = OneZeroScraper;
304
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy9vbmUtemVyby50cyJdLCJuYW1lcyI6WyJIRUJSRVdfV09SRFNfUkVHRVgiLCJkZWJ1ZyIsIklERU5USVRZX1NFUlZFUl9VUkwiLCJHUkFQSFFMX0FQSV9VUkwiLCJPbmVaZXJvU2NyYXBlciIsIkJhc2VTY3JhcGVyIiwidHJpZ2dlclR3b0ZhY3RvckF1dGgiLCJwaG9uZU51bWJlciIsInN0YXJ0c1dpdGgiLCJkZXZpY2VUb2tlblJlc3BvbnNlIiwiZXh0Q2xpZW50SWQiLCJvcyIsInJlc3VsdERhdGEiLCJkZXZpY2VUb2tlbiIsIm90cFByZXBhcmVSZXNwb25zZSIsImZhY3RvclZhbHVlIiwib3RwQ2hhbm5lbCIsIm90cENvbnRleHQiLCJzdWNjZXNzIiwiZ2V0TG9uZ1Rlcm1Ud29GYWN0b3JUb2tlbiIsIm90cENvZGUiLCJvdHBWZXJpZnlSZXNwb25zZSIsIm90cFRva2VuIiwibG9uZ1Rlcm1Ud29GYWN0b3JBdXRoVG9rZW4iLCJyZXNvbHZlT3RwVG9rZW4iLCJjcmVkZW50aWFscyIsIm90cExvbmdUZXJtVG9rZW4iLCJvdHBDb2RlUmV0cmlldmVyIiwiZXJyb3JUeXBlIiwiU2NyYXBlckVycm9yVHlwZXMiLCJUd29GYWN0b3JSZXRyaWV2ZXJNaXNzaW5nIiwiZXJyb3JNZXNzYWdlIiwidHJpZ2dlclJlc3VsdCIsIm90cFRva2VuUmVzdWx0IiwibG9naW4iLCJnZXRJZFRva2VuUmVzcG9uc2UiLCJvdHBTbXNUb2tlbiIsImVtYWlsIiwicGFzcyIsInBhc3N3b3JkIiwicGluQ29kZSIsImlkVG9rZW4iLCJnZXRTZXNzaW9uVG9rZW5SZXNwb25zZSIsImFjY2Vzc1Rva2VuIiwicGVyc2lzdGVudE90cFRva2VuIiwiZmV0Y2hQb3J0Zm9saW9Nb3ZlbWVudHMiLCJwb3J0Zm9saW8iLCJzdGFydERhdGUiLCJhY2NvdW50IiwiYWNjb3VudHMiLCJjdXJzb3IiLCJtb3ZlbWVudHMiLCJsZW5ndGgiLCJEYXRlIiwibW92ZW1lbnRUaW1lc3RhbXAiLCJwb3J0Zm9saW9OdW0iLCJuZXdNb3ZlbWVudHMiLCJwYWdpbmF0aW9uIiwiR0VUX01PVkVNRU5UUyIsInBvcnRmb2xpb0lkIiwiYWNjb3VudElkIiwibGFuZ3VhZ2UiLCJsaW1pdCIsImF1dGhvcml6YXRpb24iLCJ1bnNoaWZ0IiwiaGFzTW9yZSIsInNvcnQiLCJ4IiwieSIsInZhbHVlT2YiLCJtYXRjaGluZ01vdmVtZW50cyIsImZpbHRlciIsIm1vdmVtZW50IiwiYWNjb3VudE51bWJlciIsImJhbGFuY2UiLCJwYXJzZUZsb2F0IiwicnVubmluZ0JhbGFuY2UiLCJ0eG5zIiwibWFwIiwiaGFzSW5zdGFsbG1lbnRzIiwidHJhbnNhY3Rpb24iLCJlbnJpY2htZW50IiwicmVjdXJyZW5jZXMiLCJzb21lIiwiaXNSZWN1cnJlbnQiLCJtb2RpZmllciIsImNyZWRpdERlYml0IiwiZGF0ZSIsInZhbHVlRGF0ZSIsImNoYXJnZWRBbW91bnQiLCJtb3ZlbWVudEFtb3VudCIsImNoYXJnZWRDdXJyZW5jeSIsIm1vdmVtZW50Q3VycmVuY3kiLCJvcmlnaW5hbEFtb3VudCIsIm9yaWdpbmFsQ3VycmVuY3kiLCJkZXNjcmlwdGlvbiIsInNhbml0aXplSGVicmV3IiwicHJvY2Vzc2VkRGF0ZSIsInN0YXR1cyIsIlRyYW5zYWN0aW9uU3RhdHVzZXMiLCJDb21wbGV0ZWQiLCJ0eXBlIiwiVHJhbnNhY3Rpb25UeXBlcyIsIkluc3RhbGxtZW50cyIsIk5vcm1hbCIsInRleHQiLCJpbmNsdWRlcyIsInRyaW0iLCJwbGFpblN0cmluZyIsInJlcGxhY2UiLCJoZWJyZXdTdWJTdHJpbmdzUmFuZ2VzIiwibWF0Y2hBbGwiLCJyYW5nZXNUb1JldmVyc2UiLCJzdGFydCIsImluZGV4IiwiZW5kIiwib3V0IiwicHVzaCIsInN1YnN0cmluZyIsInJldmVyc2VkIiwicmV2ZXJzZSIsImpvaW4iLCJmZXRjaERhdGEiLCJkZWZhdWx0U3RhcnRNb21lbnQiLCJzdWJ0cmFjdCIsImFkZCIsIm9wdGlvbnMiLCJ0b0RhdGUiLCJzdGFydE1vbWVudCIsIm1vbWVudCIsIm1heCIsInJlc3VsdCIsIkdFVF9DVVNUT01FUiIsInBvcnRmb2xpb3MiLCJjdXN0b21lciIsImZsYXRNYXAiLCJQcm9taXNlIiwiYWxsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUtBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQU1BOzs7Ozs7QUFFQSxNQUFNQSxrQkFBa0IsR0FBRywwREFBM0I7QUFFQSxNQUFNQyxLQUFLLEdBQUcscUJBQVMsVUFBVCxDQUFkO0FBNkRBLE1BQU1DLG1CQUFtQixHQUFHLG1DQUE1QjtBQUVBLE1BQU1DLGVBQWUsR0FBRyxrREFBeEI7O0FBVWUsTUFBTUMsY0FBTixTQUE2QkMsd0JBQTdCLENBQXFFO0FBQUE7QUFBQTs7QUFBQTs7QUFBQTtBQUFBOztBQU1sRixRQUFNQyxvQkFBTixDQUEyQkMsV0FBM0IsRUFBNEY7QUFDMUYsUUFBSSxDQUFDQSxXQUFXLENBQUNDLFVBQVosQ0FBdUIsR0FBdkIsQ0FBTCxFQUFrQztBQUNoQyxhQUFPLGdDQUFtQiw4RkFBbkIsQ0FBUDtBQUNEOztBQUVEUCxJQUFBQSxLQUFLLENBQUMsdUJBQUQsQ0FBTDtBQUNBLFVBQU1RLG1CQUFtQixHQUFHLE1BQU0sc0JBQVcsR0FBRVAsbUJBQW9CLGdCQUFqQyxFQUFrRDtBQUNsRlEsTUFBQUEsV0FBVyxFQUFFLFFBRHFFO0FBRWxGQyxNQUFBQSxFQUFFLEVBQUU7QUFGOEUsS0FBbEQsQ0FBbEM7QUFLQSxVQUFNO0FBQUVDLE1BQUFBLFVBQVUsRUFBRTtBQUFFQyxRQUFBQTtBQUFGO0FBQWQsUUFBa0NKLG1CQUF4QztBQUVBUixJQUFBQSxLQUFLLENBQUUsK0JBQThCTSxXQUFZLEVBQTVDLENBQUw7QUFFQSxVQUFNTyxrQkFBa0IsR0FBRyxNQUFNLHNCQUFXLEdBQUVaLG1CQUFvQixjQUFqQyxFQUFnRDtBQUMvRWEsTUFBQUEsV0FBVyxFQUFFUixXQURrRTtBQUUvRU0sTUFBQUEsV0FGK0U7QUFHL0VHLE1BQUFBLFVBQVUsRUFBRTtBQUhtRSxLQUFoRCxDQUFqQztBQU1BLFVBQU07QUFBRUosTUFBQUEsVUFBVSxFQUFFO0FBQUVLLFFBQUFBO0FBQUY7QUFBZCxRQUFpQ0gsa0JBQXZDO0FBRUEsU0FBS0csVUFBTCxHQUFrQkEsVUFBbEI7QUFFQSxXQUFPO0FBQ0xDLE1BQUFBLE9BQU8sRUFBRTtBQURKLEtBQVA7QUFHRDs7QUFFRCxRQUFhQyx5QkFBYixDQUF1Q0MsT0FBdkMsRUFBeUc7QUFDdkcsUUFBSSxDQUFDLEtBQUtILFVBQVYsRUFBc0I7QUFDcEIsYUFBTyxnQ0FBbUIsaUVBQW5CLENBQVA7QUFDRDs7QUFFRGhCLElBQUFBLEtBQUssQ0FBQyxzQkFBRCxDQUFMO0FBQ0EsVUFBTW9CLGlCQUFpQixHQUFHLE1BQU0sc0JBQVcsR0FBRW5CLG1CQUFvQixhQUFqQyxFQUErQztBQUM3RWUsTUFBQUEsVUFBVSxFQUFFLEtBQUtBLFVBRDREO0FBRTdFRyxNQUFBQTtBQUY2RSxLQUEvQyxDQUFoQztBQUtBLFVBQU07QUFBRVIsTUFBQUEsVUFBVSxFQUFFO0FBQUVVLFFBQUFBO0FBQUY7QUFBZCxRQUErQkQsaUJBQXJDO0FBQ0EsV0FBTztBQUFFSCxNQUFBQSxPQUFPLEVBQUUsSUFBWDtBQUFpQkssTUFBQUEsMEJBQTBCLEVBQUVEO0FBQTdDLEtBQVA7QUFDRDs7QUFFRCxRQUFjRSxlQUFkLENBQ0VDLFdBREYsRUFFbUQ7QUFDakQsUUFBSSxzQkFBc0JBLFdBQTFCLEVBQXVDO0FBQ3JDLFVBQUksQ0FBQ0EsV0FBVyxDQUFDQyxnQkFBakIsRUFBbUM7QUFDakMsZUFBTyxnQ0FBbUIsMEJBQW5CLENBQVA7QUFDRDs7QUFDRCxhQUFPO0FBQUVSLFFBQUFBLE9BQU8sRUFBRSxJQUFYO0FBQWlCSyxRQUFBQSwwQkFBMEIsRUFBRUUsV0FBVyxDQUFDQztBQUF6RCxPQUFQO0FBQ0Q7O0FBRUQsUUFBSSxDQUFDRCxXQUFXLENBQUNFLGdCQUFqQixFQUFtQztBQUNqQyxhQUFPO0FBQ0xULFFBQUFBLE9BQU8sRUFBRSxLQURKO0FBRUxVLFFBQUFBLFNBQVMsRUFBRUMsMEJBQWtCQyx5QkFGeEI7QUFHTEMsUUFBQUEsWUFBWSxFQUFFO0FBSFQsT0FBUDtBQUtEOztBQUVELFFBQUksQ0FBQ04sV0FBVyxDQUFDbEIsV0FBakIsRUFBOEI7QUFDNUIsYUFBTyxnQ0FBbUIsb0VBQW5CLENBQVA7QUFDRDs7QUFFRE4sSUFBQUEsS0FBSyxDQUFDLG9EQUFELENBQUw7QUFDQSxVQUFNK0IsYUFBYSxHQUFHLE1BQU0sS0FBSzFCLG9CQUFMLENBQTBCbUIsV0FBVyxDQUFDbEIsV0FBdEMsQ0FBNUI7O0FBRUEsUUFBSSxDQUFDeUIsYUFBYSxDQUFDZCxPQUFuQixFQUE0QjtBQUMxQixhQUFPYyxhQUFQO0FBQ0Q7O0FBRUQsVUFBTVosT0FBTyxHQUFHLE1BQU1LLFdBQVcsQ0FBQ0UsZ0JBQVosRUFBdEI7QUFFQSxVQUFNTSxjQUFjLEdBQUcsTUFBTSxLQUFLZCx5QkFBTCxDQUErQkMsT0FBL0IsQ0FBN0I7O0FBQ0EsUUFBSSxDQUFDYSxjQUFjLENBQUNmLE9BQXBCLEVBQTZCO0FBQzNCLGFBQU9lLGNBQVA7QUFDRDs7QUFFRCxXQUFPO0FBQUVmLE1BQUFBLE9BQU8sRUFBRSxJQUFYO0FBQWlCSyxNQUFBQSwwQkFBMEIsRUFBRVUsY0FBYyxDQUFDVjtBQUE1RCxLQUFQO0FBQ0Q7O0FBRUQsUUFBTVcsS0FBTixDQUFZVCxXQUFaLEVBQzRCO0FBQzFCLFVBQU1RLGNBQWMsR0FBRyxNQUFNLEtBQUtULGVBQUwsQ0FBcUJDLFdBQXJCLENBQTdCOztBQUNBLFFBQUksQ0FBQ1EsY0FBYyxDQUFDZixPQUFwQixFQUE2QjtBQUMzQixhQUFPZSxjQUFQO0FBQ0Q7O0FBR0RoQyxJQUFBQSxLQUFLLENBQUMscUJBQUQsQ0FBTDtBQUNBLFVBQU1rQyxrQkFBa0IsR0FBRyxNQUFNLHNCQUFXLEdBQUVqQyxtQkFBb0IsYUFBakMsRUFBK0M7QUFDOUVrQyxNQUFBQSxXQUFXLEVBQUVILGNBQWMsQ0FBQ1YsMEJBRGtEO0FBRTlFYyxNQUFBQSxLQUFLLEVBQUVaLFdBQVcsQ0FBQ1ksS0FGMkQ7QUFHOUVDLE1BQUFBLElBQUksRUFBRWIsV0FBVyxDQUFDYyxRQUg0RDtBQUk5RUMsTUFBQUEsT0FBTyxFQUFFO0FBSnFFLEtBQS9DLENBQWpDO0FBT0EsVUFBTTtBQUFFNUIsTUFBQUEsVUFBVSxFQUFFO0FBQUU2QixRQUFBQTtBQUFGO0FBQWQsUUFBOEJOLGtCQUFwQztBQUdBbEMsSUFBQUEsS0FBSyxDQUFDLDBCQUFELENBQUw7QUFFQSxVQUFNeUMsdUJBQXVCLEdBQUcsTUFBTSxzQkFBVyxHQUFFeEMsbUJBQW9CLGlCQUFqQyxFQUFtRDtBQUN2RnVDLE1BQUFBLE9BRHVGO0FBRXZGSCxNQUFBQSxJQUFJLEVBQUViLFdBQVcsQ0FBQ2M7QUFGcUUsS0FBbkQsQ0FBdEM7QUFLQSxVQUFNO0FBQUUzQixNQUFBQSxVQUFVLEVBQUU7QUFBRStCLFFBQUFBO0FBQUY7QUFBZCxRQUFrQ0QsdUJBQXhDO0FBRUEsU0FBS0MsV0FBTCxHQUFtQkEsV0FBbkI7QUFFQSxXQUFPO0FBQ0x6QixNQUFBQSxPQUFPLEVBQUUsSUFESjtBQUVMMEIsTUFBQUEsa0JBQWtCLEVBQUVYLGNBQWMsQ0FBQ1Y7QUFGOUIsS0FBUDtBQUlEOztBQUVELFFBQWNzQix1QkFBZCxDQUFzQ0MsU0FBdEMsRUFBNERDLFNBQTVELEVBQTJHO0FBQ3pHO0FBQ0EsVUFBTUMsT0FBTyxHQUFHRixTQUFTLENBQUNHLFFBQVYsQ0FBbUIsQ0FBbkIsQ0FBaEI7QUFDQSxRQUFJQyxNQUFNLEdBQUcsSUFBYjtBQUNBLFVBQU1DLFNBQVMsR0FBRyxFQUFsQjs7QUFHQSxXQUFPLENBQUNBLFNBQVMsQ0FBQ0MsTUFBWCxJQUFxQixJQUFJQyxJQUFKLENBQVNGLFNBQVMsQ0FBQyxDQUFELENBQVQsQ0FBYUcsaUJBQXRCLEtBQTRDUCxTQUF4RSxFQUFtRjtBQUNqRjlDLE1BQUFBLEtBQUssQ0FBRSxxQ0FBb0M2QyxTQUFTLENBQUNTLFlBQWEsS0FBN0QsQ0FBTDtBQUNBLFlBQU07QUFBRUosUUFBQUEsU0FBUyxFQUFFO0FBQUVBLFVBQUFBLFNBQVMsRUFBRUssWUFBYjtBQUEyQkMsVUFBQUE7QUFBM0I7QUFBYixVQUVGLE1BQU0seUJBQ0p0RCxlQURJLEVBRUp1RCw2QkFGSSxFQUVXO0FBQ2JDLFFBQUFBLFdBQVcsRUFBRWIsU0FBUyxDQUFDYSxXQURWO0FBRWJDLFFBQUFBLFNBQVMsRUFBRVosT0FBTyxDQUFDWSxTQUZOO0FBR2JDLFFBQUFBLFFBQVEsRUFBRSxRQUhHO0FBSWJKLFFBQUFBLFVBQVUsRUFBRTtBQUNWUCxVQUFBQSxNQURVO0FBRVZZLFVBQUFBLEtBQUssRUFBRTtBQUZHO0FBSkMsT0FGWCxFQVdKO0FBQUVDLFFBQUFBLGFBQWEsRUFBRyxVQUFTLEtBQUtwQixXQUFZO0FBQTVDLE9BWEksQ0FGVjtBQWdCQVEsTUFBQUEsU0FBUyxDQUFDYSxPQUFWLENBQWtCLEdBQUdSLFlBQXJCO0FBQ0FOLE1BQUFBLE1BQU0sR0FBR08sVUFBVSxDQUFDUCxNQUFwQjs7QUFDQSxVQUFJLENBQUNPLFVBQVUsQ0FBQ1EsT0FBaEIsRUFBeUI7QUFDdkI7QUFDRDtBQUNGOztBQUVEZCxJQUFBQSxTQUFTLENBQUNlLElBQVYsQ0FBZSxDQUFDQyxDQUFELEVBQUlDLENBQUosS0FBVSxJQUFJZixJQUFKLENBQVNjLENBQUMsQ0FBQ2IsaUJBQVgsRUFBOEJlLE9BQTlCLEtBQTBDLElBQUloQixJQUFKLENBQVNlLENBQUMsQ0FBQ2QsaUJBQVgsRUFBOEJlLE9BQTlCLEVBQW5FO0FBRUEsVUFBTUMsaUJBQWlCLEdBQUduQixTQUFTLENBQUNvQixNQUFWLENBQWtCQyxRQUFELElBQWMsSUFBSW5CLElBQUosQ0FBU21CLFFBQVEsQ0FBQ2xCLGlCQUFsQixLQUF3Q1AsU0FBdkUsQ0FBMUI7QUFDQSxXQUFPO0FBQ0wwQixNQUFBQSxhQUFhLEVBQUUzQixTQUFTLENBQUNTLFlBRHBCO0FBRUxtQixNQUFBQSxPQUFPLEVBQUUsQ0FBQ3ZCLFNBQVMsQ0FBQ0MsTUFBWCxHQUFvQixDQUFwQixHQUF3QnVCLFVBQVUsQ0FBQ3hCLFNBQVMsQ0FBQ0EsU0FBUyxDQUFDQyxNQUFWLEdBQW1CLENBQXBCLENBQVQsQ0FBZ0N3QixjQUFqQyxDQUZ0QztBQUdMQyxNQUFBQSxJQUFJLEVBQUVQLGlCQUFpQixDQUFDUSxHQUFsQixDQUF1Qk4sUUFBRCxJQUFtQztBQUFBOztBQUM3RCxjQUFNTyxlQUFlLDRCQUFHUCxRQUFRLENBQUNRLFdBQVosb0ZBQUcsc0JBQXNCQyxVQUF6QixxRkFBRyx1QkFBa0NDLFdBQXJDLDJEQUFHLHVCQUErQ0MsSUFBL0MsQ0FBcURoQixDQUFELElBQU9BLENBQUMsQ0FBQ2lCLFdBQTdELENBQXhCO0FBQ0EsY0FBTUMsUUFBUSxHQUFHYixRQUFRLENBQUNjLFdBQVQsS0FBeUIsT0FBekIsR0FBbUMsQ0FBQyxDQUFwQyxHQUF3QyxDQUF6RDtBQUNBLGVBQVE7QUFDTkMsVUFBQUEsSUFBSSxFQUFFZixRQUFRLENBQUNnQixTQURUO0FBRU5DLFVBQUFBLGFBQWEsRUFBRyxDQUFDakIsUUFBUSxDQUFDa0IsY0FBWCxHQUE2QkwsUUFGdEM7QUFHTk0sVUFBQUEsZUFBZSxFQUFFbkIsUUFBUSxDQUFDb0IsZ0JBSHBCO0FBSU5DLFVBQUFBLGNBQWMsRUFBRyxDQUFDckIsUUFBUSxDQUFDa0IsY0FBWCxHQUE2QkwsUUFKdkM7QUFLTlMsVUFBQUEsZ0JBQWdCLEVBQUV0QixRQUFRLENBQUNvQixnQkFMckI7QUFNTkcsVUFBQUEsV0FBVyxFQUFFLEtBQUtDLGNBQUwsQ0FBb0J4QixRQUFRLENBQUN1QixXQUE3QixDQU5QO0FBT05FLFVBQUFBLGFBQWEsRUFBRXpCLFFBQVEsQ0FBQ2xCLGlCQVBsQjtBQVFONEMsVUFBQUEsTUFBTSxFQUFFQyxrQ0FBb0JDLFNBUnRCO0FBU05DLFVBQUFBLElBQUksRUFBRXRCLGVBQWUsR0FBR3VCLCtCQUFpQkMsWUFBcEIsR0FBbUNELCtCQUFpQkU7QUFUbkUsU0FBUjtBQVdELE9BZEs7QUFIRCxLQUFQO0FBbUJEO0FBRUQ7Ozs7OztBQUlRUixFQUFBQSxjQUFSLENBQXVCUyxJQUF2QixFQUFxQztBQUNuQyxRQUFJLENBQUNBLElBQUksQ0FBQ0MsUUFBTCxDQUFjLFFBQWQsQ0FBTCxFQUE4QjtBQUM1QixhQUFPRCxJQUFJLENBQUNFLElBQUwsRUFBUDtBQUNEOztBQUVELFVBQU1DLFdBQVcsR0FBR0gsSUFBSSxDQUFDSSxPQUFMLENBQWEsVUFBYixFQUF5QixFQUF6QixFQUE2QkYsSUFBN0IsRUFBcEI7QUFDQSxVQUFNRyxzQkFBc0IsR0FBRyxDQUFDLEdBQUdGLFdBQVcsQ0FBQ0csUUFBWixDQUFxQi9HLGtCQUFyQixDQUFKLENBQS9CO0FBQ0EsVUFBTWdILGVBQWUsR0FBR0Ysc0JBQXNCLENBQUNoQyxHQUF2QixDQUE0QjJCLElBQUQsS0FDakQ7QUFBRVEsTUFBQUEsS0FBSyxFQUFFUixJQUFJLENBQUNTLEtBQWQ7QUFBc0JDLE1BQUFBLEdBQUcsRUFBRVYsSUFBSSxDQUFDUyxLQUFMLEdBQWNULElBQUksQ0FBQyxDQUFELENBQUosQ0FBUXJEO0FBQWpELEtBRGlELENBQTNCLENBQXhCO0FBRUEsVUFBTWdFLEdBQUcsR0FBRyxFQUFaO0FBQ0EsUUFBSUYsS0FBSyxHQUFHLENBQVo7O0FBRUEsU0FBSyxNQUFNO0FBQUVELE1BQUFBLEtBQUY7QUFBU0UsTUFBQUE7QUFBVCxLQUFYLElBQTZCSCxlQUE3QixFQUE4QztBQUM1Q0ksTUFBQUEsR0FBRyxDQUFDQyxJQUFKLENBQVMsR0FBR1QsV0FBVyxDQUFDVSxTQUFaLENBQXNCSixLQUF0QixFQUE2QkQsS0FBN0IsQ0FBWjtBQUNBQyxNQUFBQSxLQUFLLElBQUtELEtBQUssR0FBR0MsS0FBbEI7QUFDQSxZQUFNSyxRQUFRLEdBQUcsQ0FBQyxHQUFHWCxXQUFXLENBQUNVLFNBQVosQ0FBc0JMLEtBQXRCLEVBQTZCRSxHQUE3QixDQUFKLEVBQXVDSyxPQUF2QyxFQUFqQjtBQUNBSixNQUFBQSxHQUFHLENBQUNDLElBQUosQ0FBUyxHQUFHRSxRQUFaO0FBQ0FMLE1BQUFBLEtBQUssSUFBS0MsR0FBRyxHQUFHRixLQUFoQjtBQUNEOztBQUVERyxJQUFBQSxHQUFHLENBQUNDLElBQUosQ0FBUyxHQUFHVCxXQUFXLENBQUNVLFNBQVosQ0FBc0JKLEtBQXRCLEVBQTZCTixXQUFXLENBQUN4RCxNQUF6QyxDQUFaO0FBRUEsV0FBT2dFLEdBQUcsQ0FBQ0ssSUFBSixDQUFTLEVBQVQsQ0FBUDtBQUNEOztBQUVELFFBQU1DLFNBQU4sR0FBa0Q7QUFDaEQsUUFBSSxDQUFDLEtBQUsvRSxXQUFWLEVBQXVCO0FBQ3JCLGFBQU8sZ0NBQW1CLHdCQUFuQixDQUFQO0FBQ0Q7O0FBRUQsVUFBTWdGLGtCQUFrQixHQUFHLHVCQUFTQyxRQUFULENBQWtCLENBQWxCLEVBQXFCLE9BQXJCLEVBQThCQyxHQUE5QixDQUFrQyxDQUFsQyxFQUFxQyxLQUFyQyxDQUEzQjtBQUNBLFVBQU05RSxTQUFTLEdBQUcsS0FBSytFLE9BQUwsQ0FBYS9FLFNBQWIsSUFBMEI0RSxrQkFBa0IsQ0FBQ0ksTUFBbkIsRUFBNUM7O0FBQ0EsVUFBTUMsV0FBVyxHQUFHQyxnQkFBT0MsR0FBUCxDQUFXUCxrQkFBWCxFQUErQixxQkFBTzVFLFNBQVAsQ0FBL0IsQ0FBcEI7O0FBRUE5QyxJQUFBQSxLQUFLLENBQUMsdUJBQUQsQ0FBTDtBQUNBLFVBQU1rSSxNQUFNLEdBQUcsTUFBTSx5QkFBdUNoSSxlQUF2QyxFQUF3RGlJLDRCQUF4RCxFQUFzRSxFQUF0RSxFQUEwRTtBQUFFckUsTUFBQUEsYUFBYSxFQUFHLFVBQVMsS0FBS3BCLFdBQVk7QUFBNUMsS0FBMUUsQ0FBckI7QUFDQSxVQUFNMEYsVUFBVSxHQUFHRixNQUFNLENBQUNHLFFBQVAsQ0FBZ0JDLE9BQWhCLENBQXlCRCxRQUFELElBQWVBLFFBQVEsQ0FBQ0QsVUFBVCxJQUF1QixFQUE5RCxDQUFuQjtBQUVBLFdBQU87QUFDTG5ILE1BQUFBLE9BQU8sRUFBRSxJQURKO0FBRUwrQixNQUFBQSxRQUFRLEVBQUUsTUFBTXVGLE9BQU8sQ0FBQ0MsR0FBUixDQUFZSixVQUFVLENBQUN2RCxHQUFYLENBQ3pCaEMsU0FBRCxJQUFlLEtBQUtELHVCQUFMLENBQTZCQyxTQUE3QixFQUF3Q2tGLFdBQVcsQ0FBQ0QsTUFBWixFQUF4QyxDQURXLENBQVo7QUFGWCxLQUFQO0FBTUQ7O0FBdE9pRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50L21vbWVudCc7XG5pbXBvcnQge1xuICBTY3JhcGVyR2V0TG9uZ1Rlcm1Ud29GYWN0b3JUb2tlblJlc3VsdCwgU2NyYXBlckxvZ2luUmVzdWx0LFxuICBTY3JhcGVyU2NyYXBpbmdSZXN1bHQsIFNjcmFwZXJUd29GYWN0b3JBdXRoVHJpZ2dlclJlc3VsdCxcbn0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZ2V0RGVidWcgfSBmcm9tICcuLi9oZWxwZXJzL2RlYnVnJztcbmltcG9ydCB7IGZldGNoR3JhcGhxbCwgZmV0Y2hQb3N0IH0gZnJvbSAnLi4vaGVscGVycy9mZXRjaCc7XG5pbXBvcnQgeyBjcmVhdGVHZW5lcmljRXJyb3IsIFNjcmFwZXJFcnJvclR5cGVzIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgR0VUX0NVU1RPTUVSLCBHRVRfTU9WRU1FTlRTIH0gZnJvbSAnLi9vbmUtemVyby1xdWVyaWVzJztcbmltcG9ydCB7XG4gIFRyYW5zYWN0aW9uIGFzIFNjcmFwaW5nVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uc0FjY291bnQsXG4gIFRyYW5zYWN0aW9uU3RhdHVzZXMsXG4gIFRyYW5zYWN0aW9uVHlwZXMsXG59IGZyb20gJy4uL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBCYXNlU2NyYXBlciB9IGZyb20gJy4vYmFzZS1zY3JhcGVyJztcblxuY29uc3QgSEVCUkVXX1dPUkRTX1JFR0VYID0gL1tcXHUwNTkwLVxcdTA1RkZdW1xcdTA1OTAtXFx1MDVGRlwiJ1xcLV8gL1xcXFxdKltcXHUwNTkwLVxcdTA1RkZdL2c7XG5cbmNvbnN0IGRlYnVnID0gZ2V0RGVidWcoJ29uZS16ZXJvJyk7XG5cbnR5cGUgQWNjb3VudCA9IHtcbiAgYWNjb3VudElkOiBzdHJpbmc7XG59O1xuXG50eXBlIFBvcnRmb2xpbyA9IHtcbiAgYWNjb3VudHM6IEFycmF5PEFjY291bnQ+O1xuICBwb3J0Zm9saW9JZDogc3RyaW5nO1xuICBwb3J0Zm9saW9OdW06IHN0cmluZztcbn07XG5cbnR5cGUgQ3VzdG9tZXIgPSB7XG4gIGN1c3RvbWVySWQ6IHN0cmluZztcbiAgcG9ydGZvbGlvcz86IEFycmF5PFBvcnRmb2xpbz4gfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgQ2F0ZWdvcnkgPSB7XG4gIGNhdGVnb3J5SWQ6IG51bWJlcjtcbiAgZGF0YVNvdXJjZTogc3RyaW5nO1xuICBzdWJDYXRlZ29yeUlkPzogbnVtYmVyIHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIFJlY3VycmVuY2UgPSB7XG4gIGRhdGFTb3VyY2U6IHN0cmluZztcbiAgaXNSZWN1cnJlbnQ6IGJvb2xlYW47XG59O1xuXG50eXBlIFRyYW5zYWN0aW9uRW5yaWNobWVudCA9IHtcbiAgY2F0ZWdvcmllcz86IENhdGVnb3J5W10gfCBudWxsO1xuICByZWN1cnJlbmNlcz86IFJlY3VycmVuY2VbXSB8IG51bGw7XG59O1xuXG50eXBlIFRyYW5zYWN0aW9uID0ge1xuICBlbnJpY2htZW50PzogVHJhbnNhY3Rpb25FbnJpY2htZW50IHwgbnVsbDtcbiAgLy8gVE9ETzogR2V0IGluc3RhbGxtZW50cyBpbmZvcm1hdGlvbiBoZXJlXG4gIC8vIHRyYW5zYWN0aW9uRGV0YWlsczogVHJhbnNhY3Rpb25EZXRhaWxzO1xufTtcblxudHlwZSBNb3ZlbWVudCA9IHtcbiAgYWNjb3VudElkOiBzdHJpbmc7XG4gIGJhbmtDdXJyZW5jeUFtb3VudDogc3RyaW5nO1xuICBib29raW5nRGF0ZTogc3RyaW5nO1xuICBjb252ZXJzaW9uUmF0ZTogc3RyaW5nO1xuICBjcmVkaXREZWJpdDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBpc1JldmVyc2VkOiBib29sZWFuO1xuICBtb3ZlbWVudEFtb3VudDogc3RyaW5nO1xuICBtb3ZlbWVudEN1cnJlbmN5OiBzdHJpbmc7XG4gIG1vdmVtZW50SWQ6IHN0cmluZztcbiAgbW92ZW1lbnRSZXZlcnNlZElkPzogc3RyaW5nfG51bGw7XG4gIG1vdmVtZW50VGltZXN0YW1wOiBzdHJpbmc7XG4gIG1vdmVtZW50VHlwZTogc3RyaW5nO1xuICBwb3J0Zm9saW9JZDogc3RyaW5nO1xuICBydW5uaW5nQmFsYW5jZTogc3RyaW5nO1xuICB0cmFuc2FjdGlvbj86IFRyYW5zYWN0aW9uIHwgbnVsbDtcbiAgdmFsdWVEYXRlOiBzdHJpbmc7XG59O1xuXG50eXBlIFF1ZXJ5UGFnaW5hdGlvbiA9IHsgaGFzTW9yZTogYm9vbGVhbiwgY3Vyc29yOiBzdHJpbmcgfTtcblxuY29uc3QgSURFTlRJVFlfU0VSVkVSX1VSTCA9ICdodHRwczovL2lkZW50aXR5LnRmZC1iYW5rLmNvbS92MS8nO1xuXG5jb25zdCBHUkFQSFFMX0FQSV9VUkwgPSAnaHR0cHM6Ly9tb2JpbGUudGZkLWJhbmsuY29tL21vYmlsZS1ncmFwaC9ncmFwaHFsJztcblxuXG50eXBlIFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzID0ge2VtYWlsOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmd9ICYgKHtcbiAgb3RwQ29kZVJldHJpZXZlcjogKCkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuICBwaG9uZU51bWJlcjogc3RyaW5nO1xufSB8IHtcbiAgb3RwTG9uZ1Rlcm1Ub2tlbjogc3RyaW5nO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9uZVplcm9TY3JhcGVyIGV4dGVuZHMgQmFzZVNjcmFwZXI8U2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHM+IHtcbiAgcHJpdmF0ZSBvdHBDb250ZXh0Pzogc3RyaW5nO1xuXG4gIHByaXZhdGUgYWNjZXNzVG9rZW4/OiBzdHJpbmc7XG5cblxuICBhc3luYyB0cmlnZ2VyVHdvRmFjdG9yQXV0aChwaG9uZU51bWJlcjogc3RyaW5nKTogUHJvbWlzZTxTY3JhcGVyVHdvRmFjdG9yQXV0aFRyaWdnZXJSZXN1bHQ+IHtcbiAgICBpZiAoIXBob25lTnVtYmVyLnN0YXJ0c1dpdGgoJysnKSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUdlbmVyaWNFcnJvcignQSBmdWxsIGludGVybmF0aW9uYWwgcGhvbmUgbnVtYmVyIHN0YXJ0aW5nIHdpdGggKyBhbmQgYSB0aHJlZSBkaWdpdCBjb3VudHJ5IGNvZGUgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBkZWJ1ZygnRmV0Y2hpbmcgZGV2aWNlIHRva2VuJyk7XG4gICAgY29uc3QgZGV2aWNlVG9rZW5SZXNwb25zZSA9IGF3YWl0IGZldGNoUG9zdChgJHtJREVOVElUWV9TRVJWRVJfVVJMfS9kZXZpY2VzL3Rva2VuYCwge1xuICAgICAgZXh0Q2xpZW50SWQ6ICdtb2JpbGUnLFxuICAgICAgb3M6ICdBbmRyb2lkJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcmVzdWx0RGF0YTogeyBkZXZpY2VUb2tlbiB9IH0gPSBkZXZpY2VUb2tlblJlc3BvbnNlO1xuXG4gICAgZGVidWcoYFNlbmRpbmcgT1RQIHRvIHBob25lIG51bWJlciAke3Bob25lTnVtYmVyfWApO1xuXG4gICAgY29uc3Qgb3RwUHJlcGFyZVJlc3BvbnNlID0gYXdhaXQgZmV0Y2hQb3N0KGAke0lERU5USVRZX1NFUlZFUl9VUkx9L290cC9wcmVwYXJlYCwge1xuICAgICAgZmFjdG9yVmFsdWU6IHBob25lTnVtYmVyLFxuICAgICAgZGV2aWNlVG9rZW4sXG4gICAgICBvdHBDaGFubmVsOiAnU01TX09UUCcsXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHJlc3VsdERhdGE6IHsgb3RwQ29udGV4dCB9IH0gPSBvdHBQcmVwYXJlUmVzcG9uc2U7XG5cbiAgICB0aGlzLm90cENvbnRleHQgPSBvdHBDb250ZXh0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRMb25nVGVybVR3b0ZhY3RvclRva2VuKG90cENvZGU6IHN0cmluZyk6IFByb21pc2U8U2NyYXBlckdldExvbmdUZXJtVHdvRmFjdG9yVG9rZW5SZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMub3RwQ29udGV4dCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUdlbmVyaWNFcnJvcigndHJpZ2dlck90cCB3YXMgbm90IGNhbGxlZCBiZWZvcmUgY2FsbGluZyBnZXRQZXJtZW5hbnRPdHBUb2tlbigpJyk7XG4gICAgfVxuXG4gICAgZGVidWcoJ1JlcXVlc3RpbmcgT1RQIHRva2VuJyk7XG4gICAgY29uc3Qgb3RwVmVyaWZ5UmVzcG9uc2UgPSBhd2FpdCBmZXRjaFBvc3QoYCR7SURFTlRJVFlfU0VSVkVSX1VSTH0vb3RwL3ZlcmlmeWAsIHtcbiAgICAgIG90cENvbnRleHQ6IHRoaXMub3RwQ29udGV4dCxcbiAgICAgIG90cENvZGUsXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHJlc3VsdERhdGE6IHsgb3RwVG9rZW4gfSB9ID0gb3RwVmVyaWZ5UmVzcG9uc2U7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgbG9uZ1Rlcm1Ud29GYWN0b3JBdXRoVG9rZW46IG90cFRva2VuIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc29sdmVPdHBUb2tlbihcbiAgICBjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMsXG4gICk6IFByb21pc2U8U2NyYXBlckdldExvbmdUZXJtVHdvRmFjdG9yVG9rZW5SZXN1bHQ+IHtcbiAgICBpZiAoJ290cExvbmdUZXJtVG9rZW4nIGluIGNyZWRlbnRpYWxzKSB7XG4gICAgICBpZiAoIWNyZWRlbnRpYWxzLm90cExvbmdUZXJtVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUdlbmVyaWNFcnJvcignSW52YWxpZCBvdHBMb25nVGVybVRva2VuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBsb25nVGVybVR3b0ZhY3RvckF1dGhUb2tlbjogY3JlZGVudGlhbHMub3RwTG9uZ1Rlcm1Ub2tlbiB9O1xuICAgIH1cblxuICAgIGlmICghY3JlZGVudGlhbHMub3RwQ29kZVJldHJpZXZlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yVHlwZTogU2NyYXBlckVycm9yVHlwZXMuVHdvRmFjdG9yUmV0cmlldmVyTWlzc2luZyxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiAnb3RwQ29kZVJldHJpZXZlciBpcyByZXF1aXJlZCB3aGVuIG90cFBlcm1hbmVudFRva2VuIGlzIG5vdCBwcm92aWRlZCcsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghY3JlZGVudGlhbHMucGhvbmVOdW1iZXIpIHtcbiAgICAgIHJldHVybiBjcmVhdGVHZW5lcmljRXJyb3IoJ3Bob25lTnVtYmVyIGlzIHJlcXVpcmVkIHdoZW4gcHJvdmlkaW5nIGEgb3RwQ29kZVJldHJpZXZlciBjYWxsYmFjaycpO1xuICAgIH1cblxuICAgIGRlYnVnKCdUcmlnZ2VyaW5nIHVzZXIgc3VwcGxpZWQgb3RwQ29kZVJldHJpZXZlciBjYWxsYmFjaycpO1xuICAgIGNvbnN0IHRyaWdnZXJSZXN1bHQgPSBhd2FpdCB0aGlzLnRyaWdnZXJUd29GYWN0b3JBdXRoKGNyZWRlbnRpYWxzLnBob25lTnVtYmVyKTtcblxuICAgIGlmICghdHJpZ2dlclJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICByZXR1cm4gdHJpZ2dlclJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCBvdHBDb2RlID0gYXdhaXQgY3JlZGVudGlhbHMub3RwQ29kZVJldHJpZXZlcigpO1xuXG4gICAgY29uc3Qgb3RwVG9rZW5SZXN1bHQgPSBhd2FpdCB0aGlzLmdldExvbmdUZXJtVHdvRmFjdG9yVG9rZW4ob3RwQ29kZSk7XG4gICAgaWYgKCFvdHBUb2tlblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICByZXR1cm4gb3RwVG9rZW5SZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgbG9uZ1Rlcm1Ud29GYWN0b3JBdXRoVG9rZW46IG90cFRva2VuUmVzdWx0LmxvbmdUZXJtVHdvRmFjdG9yQXV0aFRva2VuIH07XG4gIH1cblxuICBhc3luYyBsb2dpbihjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpOlxuICBQcm9taXNlPFNjcmFwZXJMb2dpblJlc3VsdD4ge1xuICAgIGNvbnN0IG90cFRva2VuUmVzdWx0ID0gYXdhaXQgdGhpcy5yZXNvbHZlT3RwVG9rZW4oY3JlZGVudGlhbHMpO1xuICAgIGlmICghb3RwVG9rZW5SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIG90cFRva2VuUmVzdWx0O1xuICAgIH1cblxuXG4gICAgZGVidWcoJ1JlcXVlc3RpbmcgaWQgdG9rZW4nKTtcbiAgICBjb25zdCBnZXRJZFRva2VuUmVzcG9uc2UgPSBhd2FpdCBmZXRjaFBvc3QoYCR7SURFTlRJVFlfU0VSVkVSX1VSTH0vZ2V0SWRUb2tlbmAsIHtcbiAgICAgIG90cFNtc1Rva2VuOiBvdHBUb2tlblJlc3VsdC5sb25nVGVybVR3b0ZhY3RvckF1dGhUb2tlbixcbiAgICAgIGVtYWlsOiBjcmVkZW50aWFscy5lbWFpbCxcbiAgICAgIHBhc3M6IGNyZWRlbnRpYWxzLnBhc3N3b3JkLFxuICAgICAgcGluQ29kZTogJycsXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHJlc3VsdERhdGE6IHsgaWRUb2tlbiB9IH0gPSBnZXRJZFRva2VuUmVzcG9uc2U7XG5cblxuICAgIGRlYnVnKCdSZXF1ZXN0aW5nIHNlc3Npb24gdG9rZW4nKTtcblxuICAgIGNvbnN0IGdldFNlc3Npb25Ub2tlblJlc3BvbnNlID0gYXdhaXQgZmV0Y2hQb3N0KGAke0lERU5USVRZX1NFUlZFUl9VUkx9L3Nlc3Npb25zL3Rva2VuYCwge1xuICAgICAgaWRUb2tlbixcbiAgICAgIHBhc3M6IGNyZWRlbnRpYWxzLnBhc3N3b3JkLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyByZXN1bHREYXRhOiB7IGFjY2Vzc1Rva2VuIH0gfSA9IGdldFNlc3Npb25Ub2tlblJlc3BvbnNlO1xuXG4gICAgdGhpcy5hY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBwZXJzaXN0ZW50T3RwVG9rZW46IG90cFRva2VuUmVzdWx0LmxvbmdUZXJtVHdvRmFjdG9yQXV0aFRva2VuLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoUG9ydGZvbGlvTW92ZW1lbnRzKHBvcnRmb2xpbzogUG9ydGZvbGlvLCBzdGFydERhdGU6IERhdGUpOiBQcm9taXNlPFRyYW5zYWN0aW9uc0FjY291bnQ+IHtcbiAgICAvLyBUT0RPOiBGaW5kIG91dCBpZiB3ZSBuZWVkIHRoZSBvdGhlciBhY2NvdW50cywgdGhlcmUgc2VlbXMgdG8gYWx3YXlzIGJlIG9uZVxuICAgIGNvbnN0IGFjY291bnQgPSBwb3J0Zm9saW8uYWNjb3VudHNbMF07XG4gICAgbGV0IGN1cnNvciA9IG51bGw7XG4gICAgY29uc3QgbW92ZW1lbnRzID0gW107XG5cblxuICAgIHdoaWxlICghbW92ZW1lbnRzLmxlbmd0aCB8fCBuZXcgRGF0ZShtb3ZlbWVudHNbMF0ubW92ZW1lbnRUaW1lc3RhbXApID49IHN0YXJ0RGF0ZSkge1xuICAgICAgZGVidWcoYEZldGNoaW5nIHRyYW5zYWN0aW9ucyBmb3IgYWNjb3VudCAke3BvcnRmb2xpby5wb3J0Zm9saW9OdW19Li4uYCk7XG4gICAgICBjb25zdCB7IG1vdmVtZW50czogeyBtb3ZlbWVudHM6IG5ld01vdmVtZW50cywgcGFnaW5hdGlvbiB9IH06XG4gICAgICB7bW92ZW1lbnRzOiB7IG1vdmVtZW50czogTW92ZW1lbnRbXSwgcGFnaW5hdGlvbjogUXVlcnlQYWdpbmF0aW9uIH19ID1cbiAgICAgICAgICBhd2FpdCBmZXRjaEdyYXBocWwoXG4gICAgICAgICAgICBHUkFQSFFMX0FQSV9VUkwsXG4gICAgICAgICAgICBHRVRfTU9WRU1FTlRTLCB7XG4gICAgICAgICAgICAgIHBvcnRmb2xpb0lkOiBwb3J0Zm9saW8ucG9ydGZvbGlvSWQsXG4gICAgICAgICAgICAgIGFjY291bnRJZDogYWNjb3VudC5hY2NvdW50SWQsXG4gICAgICAgICAgICAgIGxhbmd1YWdlOiAnSEVCUkVXJyxcbiAgICAgICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgICAgIGN1cnNvcixcbiAgICAgICAgICAgICAgICBsaW1pdDogNTAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5hY2Nlc3NUb2tlbn1gIH0sXG4gICAgICAgICAgKTtcblxuICAgICAgbW92ZW1lbnRzLnVuc2hpZnQoLi4ubmV3TW92ZW1lbnRzKTtcbiAgICAgIGN1cnNvciA9IHBhZ2luYXRpb24uY3Vyc29yO1xuICAgICAgaWYgKCFwYWdpbmF0aW9uLmhhc01vcmUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbW92ZW1lbnRzLnNvcnQoKHgsIHkpID0+IG5ldyBEYXRlKHgubW92ZW1lbnRUaW1lc3RhbXApLnZhbHVlT2YoKSAtIG5ldyBEYXRlKHkubW92ZW1lbnRUaW1lc3RhbXApLnZhbHVlT2YoKSk7XG5cbiAgICBjb25zdCBtYXRjaGluZ01vdmVtZW50cyA9IG1vdmVtZW50cy5maWx0ZXIoKG1vdmVtZW50KSA9PiBuZXcgRGF0ZShtb3ZlbWVudC5tb3ZlbWVudFRpbWVzdGFtcCkgPj0gc3RhcnREYXRlKTtcbiAgICByZXR1cm4ge1xuICAgICAgYWNjb3VudE51bWJlcjogcG9ydGZvbGlvLnBvcnRmb2xpb051bSxcbiAgICAgIGJhbGFuY2U6ICFtb3ZlbWVudHMubGVuZ3RoID8gMCA6IHBhcnNlRmxvYXQobW92ZW1lbnRzW21vdmVtZW50cy5sZW5ndGggLSAxXS5ydW5uaW5nQmFsYW5jZSksXG4gICAgICB0eG5zOiBtYXRjaGluZ01vdmVtZW50cy5tYXAoKG1vdmVtZW50KTogU2NyYXBpbmdUcmFuc2FjdGlvbiA9PiB7XG4gICAgICAgIGNvbnN0IGhhc0luc3RhbGxtZW50cyA9IG1vdmVtZW50LnRyYW5zYWN0aW9uPy5lbnJpY2htZW50Py5yZWN1cnJlbmNlcz8uc29tZSgoeCkgPT4geC5pc1JlY3VycmVudCk7XG4gICAgICAgIGNvbnN0IG1vZGlmaWVyID0gbW92ZW1lbnQuY3JlZGl0RGViaXQgPT09ICdERUJJVCcgPyAtMSA6IDE7XG4gICAgICAgIHJldHVybiAoe1xuICAgICAgICAgIGRhdGU6IG1vdmVtZW50LnZhbHVlRGF0ZSxcbiAgICAgICAgICBjaGFyZ2VkQW1vdW50OiAoK21vdmVtZW50Lm1vdmVtZW50QW1vdW50KSAqIG1vZGlmaWVyLFxuICAgICAgICAgIGNoYXJnZWRDdXJyZW5jeTogbW92ZW1lbnQubW92ZW1lbnRDdXJyZW5jeSxcbiAgICAgICAgICBvcmlnaW5hbEFtb3VudDogKCttb3ZlbWVudC5tb3ZlbWVudEFtb3VudCkgKiBtb2RpZmllcixcbiAgICAgICAgICBvcmlnaW5hbEN1cnJlbmN5OiBtb3ZlbWVudC5tb3ZlbWVudEN1cnJlbmN5LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnNhbml0aXplSGVicmV3KG1vdmVtZW50LmRlc2NyaXB0aW9uKSxcbiAgICAgICAgICBwcm9jZXNzZWREYXRlOiBtb3ZlbWVudC5tb3ZlbWVudFRpbWVzdGFtcCxcbiAgICAgICAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzZXMuQ29tcGxldGVkLFxuICAgICAgICAgIHR5cGU6IGhhc0luc3RhbGxtZW50cyA/IFRyYW5zYWN0aW9uVHlwZXMuSW5zdGFsbG1lbnRzIDogVHJhbnNhY3Rpb25UeXBlcy5Ob3JtYWwsXG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBvbmUgemVybyBoZWJyZXcgc3RyaW5ncyBhcmUgcmV2ZXJzZWQgd2l0aCBhIHVuaWNvZGUgY29udHJvbCBjaGFyYWN0ZXIgdGhhdCBmb3JjZXMgZGlzcGxheSBpbiBMVFIgb3JkZXJcbiAgICogV2UgbmVlZCB0byByZW1vdmUgdGhlIHVuaWNvZGUgY29udHJvbCBjaGFyYWN0ZXIsIGFuZCB0aGVuIHJldmVyc2UgaGVicmV3IHN1YnN0cmluZ3MgaW5zaWRlIHRoZSBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgc2FuaXRpemVIZWJyZXcodGV4dDogc3RyaW5nKSB7XG4gICAgaWYgKCF0ZXh0LmluY2x1ZGVzKCdcXHUyMDJkJykpIHtcbiAgICAgIHJldHVybiB0ZXh0LnRyaW0oKTtcbiAgICB9XG5cbiAgICBjb25zdCBwbGFpblN0cmluZyA9IHRleHQucmVwbGFjZSgvXFx1MjAyZC9naSwgJycpLnRyaW0oKTtcbiAgICBjb25zdCBoZWJyZXdTdWJTdHJpbmdzUmFuZ2VzID0gWy4uLnBsYWluU3RyaW5nLm1hdGNoQWxsKEhFQlJFV19XT1JEU19SRUdFWCldO1xuICAgIGNvbnN0IHJhbmdlc1RvUmV2ZXJzZSA9IGhlYnJld1N1YlN0cmluZ3NSYW5nZXMubWFwKCh0ZXh0KSA9PiAoXG4gICAgICB7IHN0YXJ0OiB0ZXh0LmluZGV4ISwgZW5kOiB0ZXh0LmluZGV4ISArIHRleHRbMF0ubGVuZ3RoIH0pKTtcbiAgICBjb25zdCBvdXQgPSBbXTtcbiAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgZm9yIChjb25zdCB7IHN0YXJ0LCBlbmQgfSBvZiByYW5nZXNUb1JldmVyc2UpIHtcbiAgICAgIG91dC5wdXNoKC4uLnBsYWluU3RyaW5nLnN1YnN0cmluZyhpbmRleCwgc3RhcnQpKTtcbiAgICAgIGluZGV4ICs9IChzdGFydCAtIGluZGV4KTtcbiAgICAgIGNvbnN0IHJldmVyc2VkID0gWy4uLnBsYWluU3RyaW5nLnN1YnN0cmluZyhzdGFydCwgZW5kKV0ucmV2ZXJzZSgpO1xuICAgICAgb3V0LnB1c2goLi4ucmV2ZXJzZWQpO1xuICAgICAgaW5kZXggKz0gKGVuZCAtIHN0YXJ0KTtcbiAgICB9XG5cbiAgICBvdXQucHVzaCguLi5wbGFpblN0cmluZy5zdWJzdHJpbmcoaW5kZXgsIHBsYWluU3RyaW5nLmxlbmd0aCkpO1xuXG4gICAgcmV0dXJuIG91dC5qb2luKCcnKTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoRGF0YSgpOiBQcm9taXNlPFNjcmFwZXJTY3JhcGluZ1Jlc3VsdD4ge1xuICAgIGlmICghdGhpcy5hY2Nlc3NUb2tlbikge1xuICAgICAgcmV0dXJuIGNyZWF0ZUdlbmVyaWNFcnJvcignbG9naW4oKSB3YXMgbm90IGNhbGxlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRTdGFydE1vbWVudCA9IG1vbWVudCgpLnN1YnRyYWN0KDEsICd5ZWFycycpLmFkZCgxLCAnZGF5Jyk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5vcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnQgPSBtb21lbnQubWF4KGRlZmF1bHRTdGFydE1vbWVudCwgbW9tZW50KHN0YXJ0RGF0ZSkpO1xuXG4gICAgZGVidWcoJ0ZldGNoaW5nIGFjY291bnQgbGlzdCcpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoR3JhcGhxbDx7IGN1c3RvbWVyOiBDdXN0b21lcltdIH0+KEdSQVBIUUxfQVBJX1VSTCwgR0VUX0NVU1RPTUVSLCB7fSwgeyBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5hY2Nlc3NUb2tlbn1gIH0pO1xuICAgIGNvbnN0IHBvcnRmb2xpb3MgPSByZXN1bHQuY3VzdG9tZXIuZmxhdE1hcCgoY3VzdG9tZXIpID0+IChjdXN0b21lci5wb3J0Zm9saW9zIHx8IFtdKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGFjY291bnRzOiBhd2FpdCBQcm9taXNlLmFsbChwb3J0Zm9saW9zLm1hcChcbiAgICAgICAgKHBvcnRmb2xpbykgPT4gdGhpcy5mZXRjaFBvcnRmb2xpb01vdmVtZW50cyhwb3J0Zm9saW8sIHN0YXJ0TW9tZW50LnRvRGF0ZSgpKSxcbiAgICAgICkpLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.promise");
4
+
5
+ require("core-js/modules/es.string.trim");
6
+
7
+ var _testsUtils = require("../tests/tests-utils");
8
+
9
+ var _definitions = require("../definitions");
10
+
11
+ var _baseScraperWithBrowser = require("./base-scraper-with-browser");
12
+
13
+ var _oneZero = _interopRequireDefault(require("./one-zero"));
14
+
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
+
17
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
18
+
19
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
20
+
21
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
22
+
23
+ const COMPANY_ID = 'oneZero'; // TODO this property should be hard-coded in the provider
24
+
25
+ const testsConfig = (0, _testsUtils.getTestsConfig)();
26
+ describe('OneZero scraper', () => {
27
+ beforeAll(() => {
28
+ (0, _testsUtils.extendAsyncTimeout)(); // The default timeout is 5 seconds per async test, this function extends the timeout value
29
+ });
30
+ test('should expose login fields in scrapers constant', () => {
31
+ expect(_definitions.SCRAPERS.oneZero).toBeDefined();
32
+ expect(_definitions.SCRAPERS.oneZero.loginFields).toContain('email');
33
+ expect(_definitions.SCRAPERS.oneZero.loginFields).toContain('password');
34
+ expect(_definitions.SCRAPERS.oneZero.loginFields).toContain('otpCodeRetriever');
35
+ expect(_definitions.SCRAPERS.oneZero.loginFields).toContain('phoneNumber');
36
+ expect(_definitions.SCRAPERS.oneZero.loginFields).toContain('otpLongTermToken');
37
+ });
38
+ (0, _testsUtils.maybeTestCompanyAPI)(COMPANY_ID, config => config.companyAPI.invalidPassword)('should fail on invalid user/password"', async () => {
39
+ const options = _objectSpread({}, testsConfig.options, {
40
+ companyId: COMPANY_ID
41
+ });
42
+
43
+ const scraper = new _oneZero.default(options);
44
+ const result = await scraper.scrape({
45
+ email: 'e10s12@gmail.com',
46
+ password: '3f3ss3d',
47
+ otpLongTermToken: '11111'
48
+ });
49
+ expect(result).toBeDefined();
50
+ expect(result.success).toBeFalsy();
51
+ expect(result.errorType).toBe(_baseScraperWithBrowser.LoginResults.InvalidPassword);
52
+ });
53
+ (0, _testsUtils.maybeTestCompanyAPI)(COMPANY_ID)('should scrape transactions"', async () => {
54
+ const options = _objectSpread({}, testsConfig.options, {
55
+ companyId: COMPANY_ID
56
+ });
57
+
58
+ const scraper = new _oneZero.default(options);
59
+ const result = await scraper.scrape(testsConfig.credentials.oneZero);
60
+ expect(result).toBeDefined();
61
+ const error = `${result.errorType || ''} ${result.errorMessage || ''}`.trim();
62
+ expect(error).toBe('');
63
+ expect(result.success).toBeTruthy();
64
+ (0, _testsUtils.exportTransactions)(COMPANY_ID, result.accounts || []);
65
+ });
66
+ });
67
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy9vbmUtemVyby50ZXN0LnRzIl0sIm5hbWVzIjpbIkNPTVBBTllfSUQiLCJ0ZXN0c0NvbmZpZyIsImRlc2NyaWJlIiwiYmVmb3JlQWxsIiwidGVzdCIsImV4cGVjdCIsIlNDUkFQRVJTIiwib25lWmVybyIsInRvQmVEZWZpbmVkIiwibG9naW5GaWVsZHMiLCJ0b0NvbnRhaW4iLCJjb25maWciLCJjb21wYW55QVBJIiwiaW52YWxpZFBhc3N3b3JkIiwib3B0aW9ucyIsImNvbXBhbnlJZCIsInNjcmFwZXIiLCJPbmVaZXJvU2NyYXBlciIsInJlc3VsdCIsInNjcmFwZSIsImVtYWlsIiwicGFzc3dvcmQiLCJvdHBMb25nVGVybVRva2VuIiwic3VjY2VzcyIsInRvQmVGYWxzeSIsImVycm9yVHlwZSIsInRvQmUiLCJMb2dpblJlc3VsdHMiLCJJbnZhbGlkUGFzc3dvcmQiLCJjcmVkZW50aWFscyIsImVycm9yIiwiZXJyb3JNZXNzYWdlIiwidHJpbSIsInRvQmVUcnV0aHkiLCJhY2NvdW50cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBR0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7QUFFQSxNQUFNQSxVQUFVLEdBQUcsU0FBbkIsQyxDQUE4Qjs7QUFDOUIsTUFBTUMsV0FBVyxHQUFHLGlDQUFwQjtBQUVBQyxRQUFRLENBQUMsaUJBQUQsRUFBb0IsTUFBTTtBQUNoQ0MsRUFBQUEsU0FBUyxDQUFDLE1BQU07QUFDZCwwQ0FEYyxDQUNRO0FBQ3ZCLEdBRlEsQ0FBVDtBQUlBQyxFQUFBQSxJQUFJLENBQUMsaURBQUQsRUFBb0QsTUFBTTtBQUM1REMsSUFBQUEsTUFBTSxDQUFDQyxzQkFBU0MsT0FBVixDQUFOLENBQXlCQyxXQUF6QjtBQUNBSCxJQUFBQSxNQUFNLENBQUNDLHNCQUFTQyxPQUFULENBQWlCRSxXQUFsQixDQUFOLENBQXFDQyxTQUFyQyxDQUErQyxPQUEvQztBQUNBTCxJQUFBQSxNQUFNLENBQUNDLHNCQUFTQyxPQUFULENBQWlCRSxXQUFsQixDQUFOLENBQXFDQyxTQUFyQyxDQUErQyxVQUEvQztBQUNBTCxJQUFBQSxNQUFNLENBQUNDLHNCQUFTQyxPQUFULENBQWlCRSxXQUFsQixDQUFOLENBQXFDQyxTQUFyQyxDQUErQyxrQkFBL0M7QUFDQUwsSUFBQUEsTUFBTSxDQUFDQyxzQkFBU0MsT0FBVCxDQUFpQkUsV0FBbEIsQ0FBTixDQUFxQ0MsU0FBckMsQ0FBK0MsYUFBL0M7QUFDQUwsSUFBQUEsTUFBTSxDQUFDQyxzQkFBU0MsT0FBVCxDQUFpQkUsV0FBbEIsQ0FBTixDQUFxQ0MsU0FBckMsQ0FBK0Msa0JBQS9DO0FBQ0QsR0FQRyxDQUFKO0FBU0EsdUNBQW9CVixVQUFwQixFQUFpQ1csTUFBRCxJQUFZQSxNQUFNLENBQUNDLFVBQVAsQ0FBa0JDLGVBQTlELEVBQStFLHVDQUEvRSxFQUF3SCxZQUFZO0FBQ2xJLFVBQU1DLE9BQU8scUJBQ1JiLFdBQVcsQ0FBQ2EsT0FESjtBQUVYQyxNQUFBQSxTQUFTLEVBQUVmO0FBRkEsTUFBYjs7QUFLQSxVQUFNZ0IsT0FBTyxHQUFHLElBQUlDLGdCQUFKLENBQW1CSCxPQUFuQixDQUFoQjtBQUVBLFVBQU1JLE1BQU0sR0FBRyxNQUFNRixPQUFPLENBQUNHLE1BQVIsQ0FBZTtBQUFFQyxNQUFBQSxLQUFLLEVBQUUsa0JBQVQ7QUFBNkJDLE1BQUFBLFFBQVEsRUFBRSxTQUF2QztBQUFrREMsTUFBQUEsZ0JBQWdCLEVBQUU7QUFBcEUsS0FBZixDQUFyQjtBQUVBakIsSUFBQUEsTUFBTSxDQUFDYSxNQUFELENBQU4sQ0FBZVYsV0FBZjtBQUNBSCxJQUFBQSxNQUFNLENBQUNhLE1BQU0sQ0FBQ0ssT0FBUixDQUFOLENBQXVCQyxTQUF2QjtBQUNBbkIsSUFBQUEsTUFBTSxDQUFDYSxNQUFNLENBQUNPLFNBQVIsQ0FBTixDQUF5QkMsSUFBekIsQ0FBOEJDLHFDQUFhQyxlQUEzQztBQUNELEdBYkQ7QUFlQSx1Q0FBb0I1QixVQUFwQixFQUFnQyw2QkFBaEMsRUFBK0QsWUFBWTtBQUN6RSxVQUFNYyxPQUFPLHFCQUNSYixXQUFXLENBQUNhLE9BREo7QUFFWEMsTUFBQUEsU0FBUyxFQUFFZjtBQUZBLE1BQWI7O0FBS0EsVUFBTWdCLE9BQU8sR0FBRyxJQUFJQyxnQkFBSixDQUFtQkgsT0FBbkIsQ0FBaEI7QUFDQSxVQUFNSSxNQUFNLEdBQUcsTUFBTUYsT0FBTyxDQUFDRyxNQUFSLENBQWVsQixXQUFXLENBQUM0QixXQUFaLENBQXdCdEIsT0FBdkMsQ0FBckI7QUFDQUYsSUFBQUEsTUFBTSxDQUFDYSxNQUFELENBQU4sQ0FBZVYsV0FBZjtBQUNBLFVBQU1zQixLQUFLLEdBQUksR0FBRVosTUFBTSxDQUFDTyxTQUFQLElBQW9CLEVBQUcsSUFBR1AsTUFBTSxDQUFDYSxZQUFQLElBQXVCLEVBQUcsRUFBdkQsQ0FBeURDLElBQXpELEVBQWQ7QUFDQTNCLElBQUFBLE1BQU0sQ0FBQ3lCLEtBQUQsQ0FBTixDQUFjSixJQUFkLENBQW1CLEVBQW5CO0FBQ0FyQixJQUFBQSxNQUFNLENBQUNhLE1BQU0sQ0FBQ0ssT0FBUixDQUFOLENBQXVCVSxVQUF2QjtBQUVBLHdDQUFtQmpDLFVBQW5CLEVBQStCa0IsTUFBTSxDQUFDZ0IsUUFBUCxJQUFtQixFQUFsRDtBQUNELEdBZEQ7QUFlRCxDQTVDTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgbWF5YmVUZXN0Q29tcGFueUFQSSwgZXh0ZW5kQXN5bmNUaW1lb3V0LCBnZXRUZXN0c0NvbmZpZywgZXhwb3J0VHJhbnNhY3Rpb25zLFxufSBmcm9tICcuLi90ZXN0cy90ZXN0cy11dGlscyc7XG5pbXBvcnQgeyBTQ1JBUEVSUyB9IGZyb20gJy4uL2RlZmluaXRpb25zJztcbmltcG9ydCB7IExvZ2luUmVzdWx0cyB9IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5pbXBvcnQgT25lWmVyb1NjcmFwZXIgZnJvbSAnLi9vbmUtemVybyc7XG5cbmNvbnN0IENPTVBBTllfSUQgPSAnb25lWmVybyc7IC8vIFRPRE8gdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgaGFyZC1jb2RlZCBpbiB0aGUgcHJvdmlkZXJcbmNvbnN0IHRlc3RzQ29uZmlnID0gZ2V0VGVzdHNDb25maWcoKTtcblxuZGVzY3JpYmUoJ09uZVplcm8gc2NyYXBlcicsICgpID0+IHtcbiAgYmVmb3JlQWxsKCgpID0+IHtcbiAgICBleHRlbmRBc3luY1RpbWVvdXQoKTsgLy8gVGhlIGRlZmF1bHQgdGltZW91dCBpcyA1IHNlY29uZHMgcGVyIGFzeW5jIHRlc3QsIHRoaXMgZnVuY3Rpb24gZXh0ZW5kcyB0aGUgdGltZW91dCB2YWx1ZVxuICB9KTtcblxuICB0ZXN0KCdzaG91bGQgZXhwb3NlIGxvZ2luIGZpZWxkcyBpbiBzY3JhcGVycyBjb25zdGFudCcsICgpID0+IHtcbiAgICBleHBlY3QoU0NSQVBFUlMub25lWmVybykudG9CZURlZmluZWQoKTtcbiAgICBleHBlY3QoU0NSQVBFUlMub25lWmVyby5sb2dpbkZpZWxkcykudG9Db250YWluKCdlbWFpbCcpO1xuICAgIGV4cGVjdChTQ1JBUEVSUy5vbmVaZXJvLmxvZ2luRmllbGRzKS50b0NvbnRhaW4oJ3Bhc3N3b3JkJyk7XG4gICAgZXhwZWN0KFNDUkFQRVJTLm9uZVplcm8ubG9naW5GaWVsZHMpLnRvQ29udGFpbignb3RwQ29kZVJldHJpZXZlcicpO1xuICAgIGV4cGVjdChTQ1JBUEVSUy5vbmVaZXJvLmxvZ2luRmllbGRzKS50b0NvbnRhaW4oJ3Bob25lTnVtYmVyJyk7XG4gICAgZXhwZWN0KFNDUkFQRVJTLm9uZVplcm8ubG9naW5GaWVsZHMpLnRvQ29udGFpbignb3RwTG9uZ1Rlcm1Ub2tlbicpO1xuICB9KTtcblxuICBtYXliZVRlc3RDb21wYW55QVBJKENPTVBBTllfSUQsIChjb25maWcpID0+IGNvbmZpZy5jb21wYW55QVBJLmludmFsaWRQYXNzd29yZCkoJ3Nob3VsZCBmYWlsIG9uIGludmFsaWQgdXNlci9wYXNzd29yZFwiJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAuLi50ZXN0c0NvbmZpZy5vcHRpb25zLFxuICAgICAgY29tcGFueUlkOiBDT01QQU5ZX0lELFxuICAgIH07XG5cbiAgICBjb25zdCBzY3JhcGVyID0gbmV3IE9uZVplcm9TY3JhcGVyKG9wdGlvbnMpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2NyYXBlci5zY3JhcGUoeyBlbWFpbDogJ2UxMHMxMkBnbWFpbC5jb20nLCBwYXNzd29yZDogJzNmM3NzM2QnLCBvdHBMb25nVGVybVRva2VuOiAnMTExMTEnIH0pO1xuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKTtcbiAgICBleHBlY3QocmVzdWx0LnN1Y2Nlc3MpLnRvQmVGYWxzeSgpO1xuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JUeXBlKS50b0JlKExvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmQpO1xuICB9KTtcblxuICBtYXliZVRlc3RDb21wYW55QVBJKENPTVBBTllfSUQpKCdzaG91bGQgc2NyYXBlIHRyYW5zYWN0aW9uc1wiJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAuLi50ZXN0c0NvbmZpZy5vcHRpb25zLFxuICAgICAgY29tcGFueUlkOiBDT01QQU5ZX0lELFxuICAgIH07XG5cbiAgICBjb25zdCBzY3JhcGVyID0gbmV3IE9uZVplcm9TY3JhcGVyKG9wdGlvbnMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNjcmFwZXIuc2NyYXBlKHRlc3RzQ29uZmlnLmNyZWRlbnRpYWxzLm9uZVplcm8pO1xuICAgIGV4cGVjdChyZXN1bHQpLnRvQmVEZWZpbmVkKCk7XG4gICAgY29uc3QgZXJyb3IgPSBgJHtyZXN1bHQuZXJyb3JUeXBlIHx8ICcnfSAke3Jlc3VsdC5lcnJvck1lc3NhZ2UgfHwgJyd9YC50cmltKCk7XG4gICAgZXhwZWN0KGVycm9yKS50b0JlKCcnKTtcbiAgICBleHBlY3QocmVzdWx0LnN1Y2Nlc3MpLnRvQmVUcnV0aHkoKTtcblxuICAgIGV4cG9ydFRyYW5zYWN0aW9ucyhDT01QQU5ZX0lELCByZXN1bHQuYWNjb3VudHMgfHwgW10pO1xuICB9KTtcbn0pO1xuIl19
@@ -1,8 +1,11 @@
1
1
  import { BaseScraperWithBrowser, PossibleLoginResults } from './base-scraper-with-browser';
2
2
  import { Transaction } from '../transactions';
3
- import { ScraperCredentials } from './base-scraper';
4
- declare class OtsarHahayalScraper extends BaseScraperWithBrowser {
5
- getLoginOptions(credentials: ScraperCredentials): {
3
+ declare type ScraperSpecificCredentials = {
4
+ username: string;
5
+ password: string;
6
+ };
7
+ declare class OtsarHahayalScraper extends BaseScraperWithBrowser<ScraperSpecificCredentials> {
8
+ getLoginOptions(credentials: ScraperSpecificCredentials): {
6
9
  loginUrl: string;
7
10
  fields: {
8
11
  selector: string;
@@ -227,4 +227,4 @@ class OtsarHahayalScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser
227
227
 
228
228
  var _default = OtsarHahayalScraper;
229
229
  exports.default = _default;
230
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy9vdHNhci1oYWhheWFsLnRzIl0sIm5hbWVzIjpbIkJBU0VfVVJMIiwiTE9OR19EQVRFX0ZPUk1BVCIsIkRBVEVfRk9STUFUIiwiZ2V0UG9zc2libGVMb2dpblJlc3VsdHMiLCJwYWdlIiwidXJscyIsIkxvZ2luUmVzdWx0cyIsIlN1Y2Nlc3MiLCJJbnZhbGlkUGFzc3dvcmQiLCJnZXRUcmFuc2FjdGlvbnNVcmwiLCJjcmVhdGVMb2dpbkZpZWxkcyIsImNyZWRlbnRpYWxzIiwic2VsZWN0b3IiLCJ2YWx1ZSIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJnZXRBbW91bnREYXRhIiwiYW1vdW50U3RyIiwiaGFzQ3VycmVuY3kiLCJhbW91bnRTdHJDbG4iLCJyZXBsYWNlIiwiY3VycmVuY3kiLCJhbW91bnQiLCJwYXJzZUZsb2F0IiwiU0hFS0VMX0NVUlJFTkNZIiwiaW5jbHVkZXMiLCJTSEVLRUxfQ1VSUkVOQ1lfU1lNQk9MIiwicGFydHMiLCJzcGxpdCIsImNvbnZlcnRUcmFuc2FjdGlvbnMiLCJ0eG5zIiwibWFwIiwidHhuIiwiZGF0ZUZvcm1hdCIsImRhdGUiLCJsZW5ndGgiLCJFcnJvciIsInR4bkRhdGUiLCJ0b0lTT1N0cmluZyIsImNyZWRpdCIsImRlYml0IiwiTnVtYmVyIiwiaXNOYU4iLCJyZXN1bHQiLCJ0eXBlIiwiVHJhbnNhY3Rpb25UeXBlcyIsIk5vcm1hbCIsInN0YXR1cyIsIlRyYW5zYWN0aW9uU3RhdHVzZXMiLCJDb21wbGV0ZWQiLCJpZGVudGlmaWVyIiwicmVmZXJlbmNlIiwicGFyc2VJbnQiLCJ1bmRlZmluZWQiLCJwcm9jZXNzZWREYXRlIiwib3JpZ2luYWxBbW91bnQiLCJvcmlnaW5hbEN1cnJlbmN5IiwiY2hhcmdlZEFtb3VudCIsImRlc2NyaXB0aW9uIiwibWVtbyIsInBhcnNlVHJhbnNhY3Rpb25QYWdlIiwidGRzVmFsdWVzIiwidHJzIiwiZWwiLCJxdWVyeVNlbGVjdG9yIiwiaW5uZXJUZXh0IiwiYmFsYW5jZSIsImdldEFjY291bnRTdW1tYXJ5IiwiYmFsYW5jZUVsbSIsIiQiLCJiYWxhbmNlSW5uZXJUZXh0RWxtIiwiZ2V0UHJvcGVydHkiLCJiYWxhbmNlVGV4dCIsImpzb25WYWx1ZSIsImJhbGFuY2VWYWx1ZSIsImNyZWRpdExpbWl0IiwiY3JlZGl0VXRpbGl6YXRpb24iLCJiYWxhbmNlQ3VycmVuY3kiLCJmZXRjaFRyYW5zYWN0aW9uc0ZvckFjY291bnQiLCJzdGFydERhdGUiLCJzdW1tYXJ5IiwiYnJhbmNoTnVtIiwiJGV2YWwiLCJzcGFuIiwiYWNjb3VudE5tYnIiLCJhY2NvdW50TnVtYmVyIiwiZm9ybWF0IiwiaGFzTmV4dFBhZ2UiLCJub1RyYW5zYWN0aW9uRWxtIiwicGFnZVR4bnMiLCJjb25jYXQiLCJidXR0b24iLCJzbGljZSIsImZldGNoVHJhbnNhY3Rpb25zIiwid2FpdEZvclBvc3RMb2dpbiIsIlByb21pc2UiLCJyYWNlIiwiT3RzYXJIYWhheWFsU2NyYXBlciIsIkJhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJnZXRMb2dpbk9wdGlvbnMiLCJsb2dpblVybCIsImZpZWxkcyIsInN1Ym1pdEJ1dHRvblNlbGVjdG9yIiwid2FpdEZvclRpbWVvdXQiLCJwb3N0QWN0aW9uIiwicG9zc2libGVSZXN1bHRzIiwiZmV0Y2hEYXRhIiwiZGVmYXVsdFN0YXJ0TW9tZW50Iiwic3VidHJhY3QiLCJhZGQiLCJvcHRpb25zIiwidG9EYXRlIiwic3RhcnRNb21lbnQiLCJtb21lbnQiLCJtYXgiLCJ1cmwiLCJuYXZpZ2F0ZVRvIiwiYWNjb3VudHMiLCJzdWNjZXNzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFPQTs7QUFDQTs7OztBQUdBLE1BQU1BLFFBQVEsR0FBRyxnQ0FBakI7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxZQUF6QjtBQUNBLE1BQU1DLFdBQVcsR0FBRyxVQUFwQjs7QUFhQSxTQUFTQyx1QkFBVCxDQUFpQ0MsSUFBakMsRUFBNkM7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Z2UgfSBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IHsgQmFzZVNjcmFwZXJXaXRoQnJvd3NlciwgTG9naW5SZXN1bHRzLCBQb3NzaWJsZUxvZ2luUmVzdWx0cyB9IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5pbXBvcnQgeyB3YWl0Rm9yTmF2aWdhdGlvbiB9IGZyb20gJy4uL2hlbHBlcnMvbmF2aWdhdGlvbic7XG5pbXBvcnQge1xuICBmaWxsSW5wdXQsXG4gIGNsaWNrQnV0dG9uLFxuICB3YWl0VW50aWxFbGVtZW50Rm91bmQsXG4gIHBhZ2VFdmFsQWxsLFxuICBlbGVtZW50UHJlc2VudE9uUGFnZSxcbn0gZnJvbSAnLi4vaGVscGVycy9lbGVtZW50cy1pbnRlcmFjdGlvbnMnO1xuaW1wb3J0IHsgU0hFS0VMX0NVUlJFTkNZLCBTSEVLRUxfQ1VSUkVOQ1lfU1lNQk9MIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvblN0YXR1c2VzLCBUcmFuc2FjdGlvblR5cGVzIH0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IFNjcmFwZXJDcmVkZW50aWFscyB9IGZyb20gJy4vYmFzZS1zY3JhcGVyJztcblxuY29uc3QgQkFTRV9VUkwgPSAnaHR0cHM6Ly9vbmxpbmUuYmFua290c2FyLmNvLmlsJztcbmNvbnN0IExPTkdfREFURV9GT1JNQVQgPSAnREQvTU0vWVlZWSc7XG5jb25zdCBEQVRFX0ZPUk1BVCA9ICdERC9NTS9ZWSc7XG5cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBiYWxhbmNlPzogc3RyaW5nO1xuICBkZWJpdD86IHN0cmluZztcbiAgY3JlZGl0Pzogc3RyaW5nO1xuICBtZW1vPzogc3RyaW5nO1xuICBzdGF0dXM/OiBzdHJpbmc7XG4gIHJlZmVyZW5jZT86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGRhdGU6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gZ2V0UG9zc2libGVMb2dpblJlc3VsdHMocGFnZTogUGFnZSkge1xuICBjb25zdCB1cmxzOiBQb3NzaWJsZUxvZ2luUmVzdWx0cyA9IHt9O1xuICB1cmxzW0xvZ2luUmVzdWx0cy5TdWNjZXNzXSA9IFtgJHtCQVNFX1VSTH0vd3BzL215cG9ydGFsL0ZpYmlNZW51L09ubGluZWBdO1xuICB1cmxzW0xvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmRdID0gWygpID0+IGVsZW1lbnRQcmVzZW50T25QYWdlKHBhZ2UsICcjdmFsaWRhdGlvbk1zZycpXTtcbiAgLy8gVE9ETzogc3VwcG9ydCBjaGFuZ2UgcGFzc3dvcmRcbiAgLyogdXJsc1tMT0dJTl9SRVNVTFQuQ0hBTkdFX1BBU1NXT1JEXSA9IFtgYF07ICovXG4gIHJldHVybiB1cmxzO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvbnNVcmwoKSB7XG4gIHJldHVybiBgJHtCQVNFX1VSTH0vd3BzL215cG9ydGFsL0ZpYmlNZW51L09ubGluZS9PbkFjY291bnRNbmdtZW50L09uQmFsYW5jZVRyYW5zL1ByaXZhdGVBY2NvdW50Rmxvd2A7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvZ2luRmllbGRzKGNyZWRlbnRpYWxzOiBTY3JhcGVyQ3JlZGVudGlhbHMpIHtcbiAgcmV0dXJuIFtcbiAgICB7IHNlbGVjdG9yOiAnI3VzZXJuYW1lJywgdmFsdWU6IGNyZWRlbnRpYWxzLnVzZXJuYW1lIH0sXG4gICAgeyBzZWxlY3RvcjogJyNwYXNzd29yZCcsIHZhbHVlOiBjcmVkZW50aWFscy5wYXNzd29yZCB9LFxuICBdO1xufVxuXG5mdW5jdGlvbiBnZXRBbW91bnREYXRhKGFtb3VudFN0cjogc3RyaW5nLCBoYXNDdXJyZW5jeSA9IGZhbHNlKSB7XG4gIGNvbnN0IGFtb3VudFN0ckNsbiA9IGFtb3VudFN0ci5yZXBsYWNlKCcsJywgJycpO1xuICBsZXQgY3VycmVuY3k6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBsZXQgYW1vdW50OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgaWYgKCFoYXNDdXJyZW5jeSkge1xuICAgIGFtb3VudCA9IHBhcnNlRmxvYXQoYW1vdW50U3RyQ2xuKTtcbiAgICBjdXJyZW5jeSA9IFNIRUtFTF9DVVJSRU5DWTtcbiAgfSBlbHNlIGlmIChhbW91bnRTdHJDbG4uaW5jbHVkZXMoU0hFS0VMX0NVUlJFTkNZX1NZTUJPTCkpIHtcbiAgICBhbW91bnQgPSBwYXJzZUZsb2F0KGFtb3VudFN0ckNsbi5yZXBsYWNlKFNIRUtFTF9DVVJSRU5DWV9TWU1CT0wsICcnKSk7XG4gICAgY3VycmVuY3kgPSBTSEVLRUxfQ1VSUkVOQ1k7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcGFydHMgPSBhbW91bnRTdHJDbG4uc3BsaXQoJyAnKTtcbiAgICBhbW91bnQgPSBwYXJzZUZsb2F0KHBhcnRzWzBdKTtcbiAgICBbLCBjdXJyZW5jeV0gPSBwYXJ0cztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYW1vdW50LFxuICAgIGN1cnJlbmN5LFxuICB9O1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VHJhbnNhY3Rpb25zKHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdKTogVHJhbnNhY3Rpb25bXSB7XG4gIHJldHVybiB0eG5zLm1hcCgodHhuKSA9PiB7XG4gICAgY29uc3QgZGF0ZUZvcm1hdCA9XG4gICAgICAgIHR4bi5kYXRlLmxlbmd0aCA9PT0gOCA/XG4gICAgICAgICAgREFURV9GT1JNQVQgOlxuICAgICAgICAgIHR4bi5kYXRlLmxlbmd0aCA9PT0gMTAgP1xuICAgICAgICAgICAgTE9OR19EQVRFX0ZPUk1BVCA6XG4gICAgICAgICAgICBudWxsO1xuICAgIGlmICghZGF0ZUZvcm1hdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRhdGUgZm9ybWF0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHR4bkRhdGUgPSBtb21lbnQodHhuLmRhdGUsIGRhdGVGb3JtYXQpLnRvSVNPU3RyaW5nKCk7XG4gICAgY29uc3QgY3JlZGl0ID0gZ2V0QW1vdW50RGF0YSh0eG4uY3JlZGl0IHx8ICcnKS5hbW91bnQ7XG4gICAgY29uc3QgZGViaXQgPSBnZXRBbW91bnREYXRhKHR4bi5kZWJpdCB8fCAnJykuYW1vdW50O1xuICAgIGNvbnN0IGFtb3VudCA9IChOdW1iZXIuaXNOYU4oY3JlZGl0KSA/IDAgOiBjcmVkaXQpIC0gKE51bWJlci5pc05hTihkZWJpdCkgPyAwIDogZGViaXQpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBUcmFuc2FjdGlvbiA9IHtcbiAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZXMuTm9ybWFsLFxuICAgICAgc3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c2VzLkNvbXBsZXRlZCxcbiAgICAgIGlkZW50aWZpZXI6IHR4bi5yZWZlcmVuY2UgPyBwYXJzZUludCh0eG4ucmVmZXJlbmNlLCAxMCkgOiB1bmRlZmluZWQsXG4gICAgICBkYXRlOiB0eG5EYXRlLFxuICAgICAgcHJvY2Vzc2VkRGF0ZTogdHhuRGF0ZSxcbiAgICAgIG9yaWdpbmFsQW1vdW50OiBhbW91bnQsXG4gICAgICBvcmlnaW5hbEN1cnJlbmN5OiBTSEVLRUxfQ1VSUkVOQ1ksXG4gICAgICBjaGFyZ2VkQW1vdW50OiBhbW91bnQsXG4gICAgICBkZXNjcmlwdGlvbjogdHhuLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgbWVtbzogJycsXG4gICAgfTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwYXJzZVRyYW5zYWN0aW9uUGFnZShwYWdlOiBQYWdlKTogUHJvbWlzZTxTY3JhcGVkVHJhbnNhY3Rpb25bXT4ge1xuICBjb25zdCB0ZHNWYWx1ZXMgPSBhd2FpdCBwYWdlRXZhbEFsbChwYWdlLCAnI2RhdGFUYWJsZTA3NyB0Ym9keSB0cicsIFtdLCAodHJzKSA9PiB7XG4gICAgcmV0dXJuICh0cnMpLm1hcCgoZWwpID0+ICh7XG4gICAgICBkYXRlOiAoZWwucXVlcnlTZWxlY3RvcignLmRhdGUnKSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0LFxuICAgICAgLy8gcmVmZXJlbmNlIGFuZCBkZXNjcmlwdGlvbiBoYXZlIHZpY2UtdmVyc2EgY2xhc3MgbmFtZVxuICAgICAgZGVzY3JpcHRpb246IChlbC5xdWVyeVNlbGVjdG9yKCcucmVmZXJlbmNlJykgYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dCxcbiAgICAgIHJlZmVyZW5jZTogKGVsLnF1ZXJ5U2VsZWN0b3IoJy5kZXRhaWxzJykgYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dCxcbiAgICAgIGNyZWRpdDogKGVsLnF1ZXJ5U2VsZWN0b3IoJy5jcmVkaXQnKSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0LFxuICAgICAgZGViaXQ6IChlbC5xdWVyeVNlbGVjdG9yKCcuZGViaXQnKSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0LFxuICAgICAgYmFsYW5jZTogKGVsLnF1ZXJ5U2VsZWN0b3IoJy5iYWxhbmNlJykgYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dCxcbiAgICB9KSk7XG4gIH0pO1xuXG4gIHJldHVybiB0ZHNWYWx1ZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFjY291bnRTdW1tYXJ5KHBhZ2U6IFBhZ2UpIHtcbiAgY29uc3QgYmFsYW5jZUVsbSA9IGF3YWl0IHBhZ2UuJCgnLmN1cnJlbnRfYmFsYW5jZScpO1xuICBjb25zdCBiYWxhbmNlSW5uZXJUZXh0RWxtID0gYXdhaXQgYmFsYW5jZUVsbSEuZ2V0UHJvcGVydHkoJ2lubmVyVGV4dCcpO1xuICBjb25zdCBiYWxhbmNlVGV4dCA9IGF3YWl0IGJhbGFuY2VJbm5lclRleHRFbG0uanNvblZhbHVlKCk7XG4gIGNvbnN0IGJhbGFuY2VWYWx1ZSA9IGdldEFtb3VudERhdGEoYmFsYW5jZVRleHQgYXMgc3RyaW5nLCB0cnVlKTtcbiAgLy8gVE9ETzogRmluZCB0aGUgY3JlZGl0IGZpZWxkIGluIGJhbmsgd2Vic2l0ZSAoY291bGQgc2VlIGl0IGluIG15IGFjY291bnQpXG4gIHJldHVybiB7XG4gICAgYmFsYW5jZTogTnVtYmVyLmlzTmFOKGJhbGFuY2VWYWx1ZS5hbW91bnQpID8gMCA6IGJhbGFuY2VWYWx1ZS5hbW91bnQsXG4gICAgY3JlZGl0TGltaXQ6IDAuMCxcbiAgICBjcmVkaXRVdGlsaXphdGlvbjogMC4wLFxuICAgIGJhbGFuY2VDdXJyZW5jeTogYmFsYW5jZVZhbHVlLmN1cnJlbmN5LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFRyYW5zYWN0aW9uc0ZvckFjY291bnQocGFnZTogUGFnZSwgc3RhcnREYXRlOiBNb21lbnQpIHtcbiAgY29uc3Qgc3VtbWFyeSA9IGF3YWl0IGdldEFjY291bnRTdW1tYXJ5KHBhZ2UpO1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJ2lucHV0I2Zyb21EYXRlJyk7XG4gIC8vIEdldCBhY2NvdW50IG51bWJlclxuICBjb25zdCBicmFuY2hOdW0gPSBhd2FpdCBwYWdlLiRldmFsKCcuYnJhbmNoX251bScsIChzcGFuKSA9PiB7XG4gICAgcmV0dXJuIChzcGFuIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gIH0pO1xuXG4gIGNvbnN0IGFjY291bnRObWJyID0gYXdhaXQgcGFnZS4kZXZhbCgnLmFjY19udW0nLCAoc3BhbikgPT4ge1xuICAgIHJldHVybiAoc3BhbiBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICB9KTtcbiAgY29uc3QgYWNjb3VudE51bWJlciA9IGAxNC0ke2JyYW5jaE51bX0tJHthY2NvdW50Tm1icn1gO1xuICAvLyBTZWFyY2ggZm9yIHJlbGF2YW50IHRyYW5zYWN0aW9uIGZyb20gc3RhcnREYXRlXG4gIGF3YWl0IGNsaWNrQnV0dG9uKHBhZ2UsICcjdGFiSGVhZGVyNCcpO1xuICBhd2FpdCBmaWxsSW5wdXQoXG4gICAgcGFnZSxcbiAgICAnaW5wdXQjZnJvbURhdGUnLFxuICAgIHN0YXJ0RGF0ZS5mb3JtYXQoJ0REL01NL1lZWVknKSxcbiAgKTtcblxuICBhd2FpdCBjbGlja0J1dHRvbihwYWdlLCAnI2ZpYmlfdGFiX2RhdGVzIC5maWJpX2J0bjpudGgtY2hpbGQoMiknKTtcbiAgYXdhaXQgd2FpdEZvck5hdmlnYXRpb24ocGFnZSk7XG4gIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAndGFibGUjZGF0YVRhYmxlMDc3LCAjTk9fREFUQTA3NycpO1xuICBsZXQgaGFzTmV4dFBhZ2UgPSB0cnVlO1xuICBsZXQgdHhuczogU2NyYXBlZFRyYW5zYWN0aW9uW10gPSBbXTtcblxuICBjb25zdCBub1RyYW5zYWN0aW9uRWxtID0gYXdhaXQgcGFnZS4kKCcjTk9fREFUQTA3NycpO1xuICBpZiAobm9UcmFuc2FjdGlvbkVsbSA9PSBudWxsKSB7XG4gICAgLy8gU2NhcGUgdHJhbnNhY3Rpb25zICh0aGlzIG1heWJlIHNwYW5uZWQgb24gbXVsdGlwbGUgcGFnZXMpXG4gICAgd2hpbGUgKGhhc05leHRQYWdlKSB7XG4gICAgICBjb25zdCBwYWdlVHhucyA9IGF3YWl0IHBhcnNlVHJhbnNhY3Rpb25QYWdlKHBhZ2UpO1xuICAgICAgdHhucyA9IHR4bnMuY29uY2F0KHBhZ2VUeG5zKTtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGF3YWl0IHBhZ2UuJCgnI05wYWdlJyk7XG4gICAgICBoYXNOZXh0UGFnZSA9IGZhbHNlO1xuICAgICAgaWYgKGJ1dHRvbiAhPSBudWxsKSB7XG4gICAgICAgIGhhc05leHRQYWdlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChoYXNOZXh0UGFnZSkge1xuICAgICAgICBhd2FpdCBjbGlja0J1dHRvbihwYWdlLCAnI05wYWdlJyk7XG4gICAgICAgIGF3YWl0IHdhaXRGb3JOYXZpZ2F0aW9uKHBhZ2UpO1xuICAgICAgICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJ3RhYmxlI2RhdGFUYWJsZTA3NycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYWNjb3VudE51bWJlcixcbiAgICBzdW1tYXJ5LFxuICAgIHR4bnM6IGNvbnZlcnRUcmFuc2FjdGlvbnModHhucy5zbGljZSgxKSksIC8vIFJlbW92ZSBmaXJzdCBsaW5lIHdoaWNoIGlzIFwib3BlbmluZyBiYWxhbmNlXCJcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hUcmFuc2FjdGlvbnMocGFnZTogUGFnZSwgc3RhcnREYXRlOiBNb21lbnQpIHtcbiAgLy8gVE9ETyBuZWVkIHRvIGV4dGVuZCB0byBzdXBwb3J0IG11bHRpcGxlIGFjY291bnRzIGFuZCBmb3JlaWduIGFjY291bnRzXG4gIHJldHVybiBbYXdhaXQgZmV0Y2hUcmFuc2FjdGlvbnNGb3JBY2NvdW50KHBhZ2UsIHN0YXJ0RGF0ZSldO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yUG9zdExvZ2luKHBhZ2U6IFBhZ2UpIHtcbiAgLy8gVE9ETyBjaGVjayBmb3IgY29uZGl0aW9uIHRvIHByb3ZpZGUgbmV3IHBhc3N3b3JkXG4gIHJldHVybiBQcm9taXNlLnJhY2UoW1xuICAgIHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnZGl2LmxvdHVzRnJhbWUnLCB0cnVlKSxcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJyN2YWxpZGF0aW9uTXNnJyksXG4gIF0pO1xufVxuXG5jbGFzcyBPdHNhckhhaGF5YWxTY3JhcGVyIGV4dGVuZHMgQmFzZVNjcmFwZXJXaXRoQnJvd3NlciB7XG4gIGdldExvZ2luT3B0aW9ucyhjcmVkZW50aWFsczogU2NyYXBlckNyZWRlbnRpYWxzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvZ2luVXJsOiBgJHtCQVNFX1VSTH0vTWF0YWZMb2dpblNlcnZpY2UvTWF0YWZMb2dpblNlcnZsZXQ/YmFua0lkPU9UU0FSUFJUQUwmc2l0ZT1Qcml2YXRlJktPRFNBRkE9SEVgLFxuICAgICAgZmllbGRzOiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFscyksXG4gICAgICBzdWJtaXRCdXR0b25TZWxlY3RvcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnBhZ2Uud2FpdEZvclRpbWVvdXQoMTAwMCk7XG4gICAgICAgIGF3YWl0IGNsaWNrQnV0dG9uKHRoaXMucGFnZSwgJyNjb250aW51ZUJ0bicpO1xuICAgICAgfSxcbiAgICAgIHBvc3RBY3Rpb246IGFzeW5jICgpID0+IHdhaXRGb3JQb3N0TG9naW4odGhpcy5wYWdlKSxcbiAgICAgIHBvc3NpYmxlUmVzdWx0czogZ2V0UG9zc2libGVMb2dpblJlc3VsdHModGhpcy5wYWdlKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCkge1xuICAgIGNvbnN0IGRlZmF1bHRTdGFydE1vbWVudCA9IG1vbWVudCgpLnN1YnRyYWN0KDEsICd5ZWFycycpLmFkZCgxLCAnZGF5Jyk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5vcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnQgPSBtb21lbnQubWF4KGRlZmF1bHRTdGFydE1vbWVudCwgbW9tZW50KHN0YXJ0RGF0ZSkpO1xuXG4gICAgY29uc3QgdXJsID0gZ2V0VHJhbnNhY3Rpb25zVXJsKCk7XG4gICAgYXdhaXQgdGhpcy5uYXZpZ2F0ZVRvKHVybCk7XG5cbiAgICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IGZldGNoVHJhbnNhY3Rpb25zKHRoaXMucGFnZSwgc3RhcnRNb21lbnQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhY2NvdW50cyxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE90c2FySGFoYXlhbFNjcmFwZXI7XG4iXX0=
230
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy9vdHNhci1oYWhheWFsLnRzIl0sIm5hbWVzIjpbIkJBU0VfVVJMIiwiTE9OR19EQVRFX0ZPUk1BVCIsIkRBVEVfRk9STUFUIiwiZ2V0UG9zc2libGVMb2dpblJlc3VsdHMiLCJwYWdlIiwidXJscyIsIkxvZ2luUmVzdWx0cyIsIlN1Y2Nlc3MiLCJJbnZhbGlkUGFzc3dvcmQiLCJnZXRUcmFuc2FjdGlvbnNVcmwiLCJjcmVhdGVMb2dpbkZpZWxkcyIsImNyZWRlbnRpYWxzIiwic2VsZWN0b3IiLCJ2YWx1ZSIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJnZXRBbW91bnREYXRhIiwiYW1vdW50U3RyIiwiaGFzQ3VycmVuY3kiLCJhbW91bnRTdHJDbG4iLCJyZXBsYWNlIiwiY3VycmVuY3kiLCJhbW91bnQiLCJwYXJzZUZsb2F0IiwiU0hFS0VMX0NVUlJFTkNZIiwiaW5jbHVkZXMiLCJTSEVLRUxfQ1VSUkVOQ1lfU1lNQk9MIiwicGFydHMiLCJzcGxpdCIsImNvbnZlcnRUcmFuc2FjdGlvbnMiLCJ0eG5zIiwibWFwIiwidHhuIiwiZGF0ZUZvcm1hdCIsImRhdGUiLCJsZW5ndGgiLCJFcnJvciIsInR4bkRhdGUiLCJ0b0lTT1N0cmluZyIsImNyZWRpdCIsImRlYml0IiwiTnVtYmVyIiwiaXNOYU4iLCJyZXN1bHQiLCJ0eXBlIiwiVHJhbnNhY3Rpb25UeXBlcyIsIk5vcm1hbCIsInN0YXR1cyIsIlRyYW5zYWN0aW9uU3RhdHVzZXMiLCJDb21wbGV0ZWQiLCJpZGVudGlmaWVyIiwicmVmZXJlbmNlIiwicGFyc2VJbnQiLCJ1bmRlZmluZWQiLCJwcm9jZXNzZWREYXRlIiwib3JpZ2luYWxBbW91bnQiLCJvcmlnaW5hbEN1cnJlbmN5IiwiY2hhcmdlZEFtb3VudCIsImRlc2NyaXB0aW9uIiwibWVtbyIsInBhcnNlVHJhbnNhY3Rpb25QYWdlIiwidGRzVmFsdWVzIiwidHJzIiwiZWwiLCJxdWVyeVNlbGVjdG9yIiwiaW5uZXJUZXh0IiwiYmFsYW5jZSIsImdldEFjY291bnRTdW1tYXJ5IiwiYmFsYW5jZUVsbSIsIiQiLCJiYWxhbmNlSW5uZXJUZXh0RWxtIiwiZ2V0UHJvcGVydHkiLCJiYWxhbmNlVGV4dCIsImpzb25WYWx1ZSIsImJhbGFuY2VWYWx1ZSIsImNyZWRpdExpbWl0IiwiY3JlZGl0VXRpbGl6YXRpb24iLCJiYWxhbmNlQ3VycmVuY3kiLCJmZXRjaFRyYW5zYWN0aW9uc0ZvckFjY291bnQiLCJzdGFydERhdGUiLCJzdW1tYXJ5IiwiYnJhbmNoTnVtIiwiJGV2YWwiLCJzcGFuIiwiYWNjb3VudE5tYnIiLCJhY2NvdW50TnVtYmVyIiwiZm9ybWF0IiwiaGFzTmV4dFBhZ2UiLCJub1RyYW5zYWN0aW9uRWxtIiwicGFnZVR4bnMiLCJjb25jYXQiLCJidXR0b24iLCJzbGljZSIsImZldGNoVHJhbnNhY3Rpb25zIiwid2FpdEZvclBvc3RMb2dpbiIsIlByb21pc2UiLCJyYWNlIiwiT3RzYXJIYWhheWFsU2NyYXBlciIsIkJhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJnZXRMb2dpbk9wdGlvbnMiLCJsb2dpblVybCIsImZpZWxkcyIsInN1Ym1pdEJ1dHRvblNlbGVjdG9yIiwid2FpdEZvclRpbWVvdXQiLCJwb3N0QWN0aW9uIiwicG9zc2libGVSZXN1bHRzIiwiZmV0Y2hEYXRhIiwiZGVmYXVsdFN0YXJ0TW9tZW50Iiwic3VidHJhY3QiLCJhZGQiLCJvcHRpb25zIiwidG9EYXRlIiwic3RhcnRNb21lbnQiLCJtb21lbnQiLCJtYXgiLCJ1cmwiLCJuYXZpZ2F0ZVRvIiwiYWNjb3VudHMiLCJzdWNjZXNzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFPQTs7QUFDQTs7OztBQUVBLE1BQU1BLFFBQVEsR0FBRyxnQ0FBakI7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxZQUF6QjtBQUNBLE1BQU1DLFdBQVcsR0FBRyxVQUFwQjs7QUFhQSxTQUFTQyx1QkFBVCxDQUFpQ0MsSUFBakMsRUFBNkM7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Z2UgfSBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IHsgQmFzZVNjcmFwZXJXaXRoQnJvd3NlciwgTG9naW5SZXN1bHRzLCBQb3NzaWJsZUxvZ2luUmVzdWx0cyB9IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5pbXBvcnQgeyB3YWl0Rm9yTmF2aWdhdGlvbiB9IGZyb20gJy4uL2hlbHBlcnMvbmF2aWdhdGlvbic7XG5pbXBvcnQge1xuICBmaWxsSW5wdXQsXG4gIGNsaWNrQnV0dG9uLFxuICB3YWl0VW50aWxFbGVtZW50Rm91bmQsXG4gIHBhZ2VFdmFsQWxsLFxuICBlbGVtZW50UHJlc2VudE9uUGFnZSxcbn0gZnJvbSAnLi4vaGVscGVycy9lbGVtZW50cy1pbnRlcmFjdGlvbnMnO1xuaW1wb3J0IHsgU0hFS0VMX0NVUlJFTkNZLCBTSEVLRUxfQ1VSUkVOQ1lfU1lNQk9MIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvblN0YXR1c2VzLCBUcmFuc2FjdGlvblR5cGVzIH0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcblxuY29uc3QgQkFTRV9VUkwgPSAnaHR0cHM6Ly9vbmxpbmUuYmFua290c2FyLmNvLmlsJztcbmNvbnN0IExPTkdfREFURV9GT1JNQVQgPSAnREQvTU0vWVlZWSc7XG5jb25zdCBEQVRFX0ZPUk1BVCA9ICdERC9NTS9ZWSc7XG5cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBiYWxhbmNlPzogc3RyaW5nO1xuICBkZWJpdD86IHN0cmluZztcbiAgY3JlZGl0Pzogc3RyaW5nO1xuICBtZW1vPzogc3RyaW5nO1xuICBzdGF0dXM/OiBzdHJpbmc7XG4gIHJlZmVyZW5jZT86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGRhdGU6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gZ2V0UG9zc2libGVMb2dpblJlc3VsdHMocGFnZTogUGFnZSkge1xuICBjb25zdCB1cmxzOiBQb3NzaWJsZUxvZ2luUmVzdWx0cyA9IHt9O1xuICB1cmxzW0xvZ2luUmVzdWx0cy5TdWNjZXNzXSA9IFtgJHtCQVNFX1VSTH0vd3BzL215cG9ydGFsL0ZpYmlNZW51L09ubGluZWBdO1xuICB1cmxzW0xvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmRdID0gWygpID0+IGVsZW1lbnRQcmVzZW50T25QYWdlKHBhZ2UsICcjdmFsaWRhdGlvbk1zZycpXTtcbiAgLy8gVE9ETzogc3VwcG9ydCBjaGFuZ2UgcGFzc3dvcmRcbiAgLyogdXJsc1tMT0dJTl9SRVNVTFQuQ0hBTkdFX1BBU1NXT1JEXSA9IFtgYF07ICovXG4gIHJldHVybiB1cmxzO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvbnNVcmwoKSB7XG4gIHJldHVybiBgJHtCQVNFX1VSTH0vd3BzL215cG9ydGFsL0ZpYmlNZW51L09ubGluZS9PbkFjY291bnRNbmdtZW50L09uQmFsYW5jZVRyYW5zL1ByaXZhdGVBY2NvdW50Rmxvd2A7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvZ2luRmllbGRzKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscykge1xuICByZXR1cm4gW1xuICAgIHsgc2VsZWN0b3I6ICcjdXNlcm5hbWUnLCB2YWx1ZTogY3JlZGVudGlhbHMudXNlcm5hbWUgfSxcbiAgICB7IHNlbGVjdG9yOiAnI3Bhc3N3b3JkJywgdmFsdWU6IGNyZWRlbnRpYWxzLnBhc3N3b3JkIH0sXG4gIF07XG59XG5cbmZ1bmN0aW9uIGdldEFtb3VudERhdGEoYW1vdW50U3RyOiBzdHJpbmcsIGhhc0N1cnJlbmN5ID0gZmFsc2UpIHtcbiAgY29uc3QgYW1vdW50U3RyQ2xuID0gYW1vdW50U3RyLnJlcGxhY2UoJywnLCAnJyk7XG4gIGxldCBjdXJyZW5jeTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGxldCBhbW91bnQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBpZiAoIWhhc0N1cnJlbmN5KSB7XG4gICAgYW1vdW50ID0gcGFyc2VGbG9hdChhbW91bnRTdHJDbG4pO1xuICAgIGN1cnJlbmN5ID0gU0hFS0VMX0NVUlJFTkNZO1xuICB9IGVsc2UgaWYgKGFtb3VudFN0ckNsbi5pbmNsdWRlcyhTSEVLRUxfQ1VSUkVOQ1lfU1lNQk9MKSkge1xuICAgIGFtb3VudCA9IHBhcnNlRmxvYXQoYW1vdW50U3RyQ2xuLnJlcGxhY2UoU0hFS0VMX0NVUlJFTkNZX1NZTUJPTCwgJycpKTtcbiAgICBjdXJyZW5jeSA9IFNIRUtFTF9DVVJSRU5DWTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwYXJ0cyA9IGFtb3VudFN0ckNsbi5zcGxpdCgnICcpO1xuICAgIGFtb3VudCA9IHBhcnNlRmxvYXQocGFydHNbMF0pO1xuICAgIFssIGN1cnJlbmN5XSA9IHBhcnRzO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhbW91bnQsXG4gICAgY3VycmVuY3ksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRUcmFuc2FjdGlvbnModHhuczogU2NyYXBlZFRyYW5zYWN0aW9uW10pOiBUcmFuc2FjdGlvbltdIHtcbiAgcmV0dXJuIHR4bnMubWFwKCh0eG4pID0+IHtcbiAgICBjb25zdCBkYXRlRm9ybWF0ID1cbiAgICAgICAgdHhuLmRhdGUubGVuZ3RoID09PSA4ID9cbiAgICAgICAgICBEQVRFX0ZPUk1BVCA6XG4gICAgICAgICAgdHhuLmRhdGUubGVuZ3RoID09PSAxMCA/XG4gICAgICAgICAgICBMT05HX0RBVEVfRk9STUFUIDpcbiAgICAgICAgICAgIG51bGw7XG4gICAgaWYgKCFkYXRlRm9ybWF0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGF0ZSBmb3JtYXQnKTtcbiAgICB9XG4gICAgY29uc3QgdHhuRGF0ZSA9IG1vbWVudCh0eG4uZGF0ZSwgZGF0ZUZvcm1hdCkudG9JU09TdHJpbmcoKTtcbiAgICBjb25zdCBjcmVkaXQgPSBnZXRBbW91bnREYXRhKHR4bi5jcmVkaXQgfHwgJycpLmFtb3VudDtcbiAgICBjb25zdCBkZWJpdCA9IGdldEFtb3VudERhdGEodHhuLmRlYml0IHx8ICcnKS5hbW91bnQ7XG4gICAgY29uc3QgYW1vdW50ID0gKE51bWJlci5pc05hTihjcmVkaXQpID8gMCA6IGNyZWRpdCkgLSAoTnVtYmVyLmlzTmFOKGRlYml0KSA/IDAgOiBkZWJpdCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFRyYW5zYWN0aW9uID0ge1xuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlcy5Ob3JtYWwsXG4gICAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzZXMuQ29tcGxldGVkLFxuICAgICAgaWRlbnRpZmllcjogdHhuLnJlZmVyZW5jZSA/IHBhcnNlSW50KHR4bi5yZWZlcmVuY2UsIDEwKSA6IHVuZGVmaW5lZCxcbiAgICAgIGRhdGU6IHR4bkRhdGUsXG4gICAgICBwcm9jZXNzZWREYXRlOiB0eG5EYXRlLFxuICAgICAgb3JpZ2luYWxBbW91bnQ6IGFtb3VudCxcbiAgICAgIG9yaWdpbmFsQ3VycmVuY3k6IFNIRUtFTF9DVVJSRU5DWSxcbiAgICAgIGNoYXJnZWRBbW91bnQ6IGFtb3VudCxcbiAgICAgIGRlc2NyaXB0aW9uOiB0eG4uZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICBtZW1vOiAnJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlVHJhbnNhY3Rpb25QYWdlKHBhZ2U6IFBhZ2UpOiBQcm9taXNlPFNjcmFwZWRUcmFuc2FjdGlvbltdPiB7XG4gIGNvbnN0IHRkc1ZhbHVlcyA9IGF3YWl0IHBhZ2VFdmFsQWxsKHBhZ2UsICcjZGF0YVRhYmxlMDc3IHRib2R5IHRyJywgW10sICh0cnMpID0+IHtcbiAgICByZXR1cm4gKHRycykubWFwKChlbCkgPT4gKHtcbiAgICAgIGRhdGU6IChlbC5xdWVyeVNlbGVjdG9yKCcuZGF0ZScpIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQsXG4gICAgICAvLyByZWZlcmVuY2UgYW5kIGRlc2NyaXB0aW9uIGhhdmUgdmljZS12ZXJzYSBjbGFzcyBuYW1lXG4gICAgICBkZXNjcmlwdGlvbjogKGVsLnF1ZXJ5U2VsZWN0b3IoJy5yZWZlcmVuY2UnKSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0LFxuICAgICAgcmVmZXJlbmNlOiAoZWwucXVlcnlTZWxlY3RvcignLmRldGFpbHMnKSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0LFxuICAgICAgY3JlZGl0OiAoZWwucXVlcnlTZWxlY3RvcignLmNyZWRpdCcpIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQsXG4gICAgICBkZWJpdDogKGVsLnF1ZXJ5U2VsZWN0b3IoJy5kZWJpdCcpIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQsXG4gICAgICBiYWxhbmNlOiAoZWwucXVlcnlTZWxlY3RvcignLmJhbGFuY2UnKSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0LFxuICAgIH0pKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHRkc1ZhbHVlcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWNjb3VudFN1bW1hcnkocGFnZTogUGFnZSkge1xuICBjb25zdCBiYWxhbmNlRWxtID0gYXdhaXQgcGFnZS4kKCcuY3VycmVudF9iYWxhbmNlJyk7XG4gIGNvbnN0IGJhbGFuY2VJbm5lclRleHRFbG0gPSBhd2FpdCBiYWxhbmNlRWxtIS5nZXRQcm9wZXJ0eSgnaW5uZXJUZXh0Jyk7XG4gIGNvbnN0IGJhbGFuY2VUZXh0ID0gYXdhaXQgYmFsYW5jZUlubmVyVGV4dEVsbS5qc29uVmFsdWUoKTtcbiAgY29uc3QgYmFsYW5jZVZhbHVlID0gZ2V0QW1vdW50RGF0YShiYWxhbmNlVGV4dCBhcyBzdHJpbmcsIHRydWUpO1xuICAvLyBUT0RPOiBGaW5kIHRoZSBjcmVkaXQgZmllbGQgaW4gYmFuayB3ZWJzaXRlIChjb3VsZCBzZWUgaXQgaW4gbXkgYWNjb3VudClcbiAgcmV0dXJuIHtcbiAgICBiYWxhbmNlOiBOdW1iZXIuaXNOYU4oYmFsYW5jZVZhbHVlLmFtb3VudCkgPyAwIDogYmFsYW5jZVZhbHVlLmFtb3VudCxcbiAgICBjcmVkaXRMaW1pdDogMC4wLFxuICAgIGNyZWRpdFV0aWxpemF0aW9uOiAwLjAsXG4gICAgYmFsYW5jZUN1cnJlbmN5OiBiYWxhbmNlVmFsdWUuY3VycmVuY3ksXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoVHJhbnNhY3Rpb25zRm9yQWNjb3VudChwYWdlOiBQYWdlLCBzdGFydERhdGU6IE1vbWVudCkge1xuICBjb25zdCBzdW1tYXJ5ID0gYXdhaXQgZ2V0QWNjb3VudFN1bW1hcnkocGFnZSk7XG4gIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnaW5wdXQjZnJvbURhdGUnKTtcbiAgLy8gR2V0IGFjY291bnQgbnVtYmVyXG4gIGNvbnN0IGJyYW5jaE51bSA9IGF3YWl0IHBhZ2UuJGV2YWwoJy5icmFuY2hfbnVtJywgKHNwYW4pID0+IHtcbiAgICByZXR1cm4gKHNwYW4gYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dDtcbiAgfSk7XG5cbiAgY29uc3QgYWNjb3VudE5tYnIgPSBhd2FpdCBwYWdlLiRldmFsKCcuYWNjX251bScsIChzcGFuKSA9PiB7XG4gICAgcmV0dXJuIChzcGFuIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gIH0pO1xuICBjb25zdCBhY2NvdW50TnVtYmVyID0gYDE0LSR7YnJhbmNoTnVtfS0ke2FjY291bnRObWJyfWA7XG4gIC8vIFNlYXJjaCBmb3IgcmVsYXZhbnQgdHJhbnNhY3Rpb24gZnJvbSBzdGFydERhdGVcbiAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgJyN0YWJIZWFkZXI0Jyk7XG4gIGF3YWl0IGZpbGxJbnB1dChcbiAgICBwYWdlLFxuICAgICdpbnB1dCNmcm9tRGF0ZScsXG4gICAgc3RhcnREYXRlLmZvcm1hdCgnREQvTU0vWVlZWScpLFxuICApO1xuXG4gIGF3YWl0IGNsaWNrQnV0dG9uKHBhZ2UsICcjZmliaV90YWJfZGF0ZXMgLmZpYmlfYnRuOm50aC1jaGlsZCgyKScpO1xuICBhd2FpdCB3YWl0Rm9yTmF2aWdhdGlvbihwYWdlKTtcbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICd0YWJsZSNkYXRhVGFibGUwNzcsICNOT19EQVRBMDc3Jyk7XG4gIGxldCBoYXNOZXh0UGFnZSA9IHRydWU7XG4gIGxldCB0eG5zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXSA9IFtdO1xuXG4gIGNvbnN0IG5vVHJhbnNhY3Rpb25FbG0gPSBhd2FpdCBwYWdlLiQoJyNOT19EQVRBMDc3Jyk7XG4gIGlmIChub1RyYW5zYWN0aW9uRWxtID09IG51bGwpIHtcbiAgICAvLyBTY2FwZSB0cmFuc2FjdGlvbnMgKHRoaXMgbWF5YmUgc3Bhbm5lZCBvbiBtdWx0aXBsZSBwYWdlcylcbiAgICB3aGlsZSAoaGFzTmV4dFBhZ2UpIHtcbiAgICAgIGNvbnN0IHBhZ2VUeG5zID0gYXdhaXQgcGFyc2VUcmFuc2FjdGlvblBhZ2UocGFnZSk7XG4gICAgICB0eG5zID0gdHhucy5jb25jYXQocGFnZVR4bnMpO1xuICAgICAgY29uc3QgYnV0dG9uID0gYXdhaXQgcGFnZS4kKCcjTnBhZ2UnKTtcbiAgICAgIGhhc05leHRQYWdlID0gZmFsc2U7XG4gICAgICBpZiAoYnV0dG9uICE9IG51bGwpIHtcbiAgICAgICAgaGFzTmV4dFBhZ2UgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGhhc05leHRQYWdlKSB7XG4gICAgICAgIGF3YWl0IGNsaWNrQnV0dG9uKHBhZ2UsICcjTnBhZ2UnKTtcbiAgICAgICAgYXdhaXQgd2FpdEZvck5hdmlnYXRpb24ocGFnZSk7XG4gICAgICAgIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAndGFibGUjZGF0YVRhYmxlMDc3Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhY2NvdW50TnVtYmVyLFxuICAgIHN1bW1hcnksXG4gICAgdHhuczogY29udmVydFRyYW5zYWN0aW9ucyh0eG5zLnNsaWNlKDEpKSwgLy8gUmVtb3ZlIGZpcnN0IGxpbmUgd2hpY2ggaXMgXCJvcGVuaW5nIGJhbGFuY2VcIlxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFRyYW5zYWN0aW9ucyhwYWdlOiBQYWdlLCBzdGFydERhdGU6IE1vbWVudCkge1xuICAvLyBUT0RPIG5lZWQgdG8gZXh0ZW5kIHRvIHN1cHBvcnQgbXVsdGlwbGUgYWNjb3VudHMgYW5kIGZvcmVpZ24gYWNjb3VudHNcbiAgcmV0dXJuIFthd2FpdCBmZXRjaFRyYW5zYWN0aW9uc0ZvckFjY291bnQocGFnZSwgc3RhcnREYXRlKV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JQb3N0TG9naW4ocGFnZTogUGFnZSkge1xuICAvLyBUT0RPIGNoZWNrIGZvciBjb25kaXRpb24gdG8gcHJvdmlkZSBuZXcgcGFzc3dvcmRcbiAgcmV0dXJuIFByb21pc2UucmFjZShbXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICdkaXYubG90dXNGcmFtZScsIHRydWUpLFxuICAgIHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnI3ZhbGlkYXRpb25Nc2cnKSxcbiAgXSk7XG59XG5cbnR5cGUgU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMgPSB7IHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcgfTtcblxuY2xhc3MgT3RzYXJIYWhheWFsU2NyYXBlciBleHRlbmRzIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXI8U2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHM+IHtcbiAgZ2V0TG9naW5PcHRpb25zKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscykge1xuICAgIHJldHVybiB7XG4gICAgICBsb2dpblVybDogYCR7QkFTRV9VUkx9L01hdGFmTG9naW5TZXJ2aWNlL01hdGFmTG9naW5TZXJ2bGV0P2JhbmtJZD1PVFNBUlBSVEFMJnNpdGU9UHJpdmF0ZSZLT0RTQUZBPUhFYCxcbiAgICAgIGZpZWxkczogY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHMpLFxuICAgICAgc3VibWl0QnV0dG9uU2VsZWN0b3I6IGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wYWdlLndhaXRGb3JUaW1lb3V0KDEwMDApO1xuICAgICAgICBhd2FpdCBjbGlja0J1dHRvbih0aGlzLnBhZ2UsICcjY29udGludWVCdG4nKTtcbiAgICAgIH0sXG4gICAgICBwb3N0QWN0aW9uOiBhc3luYyAoKSA9PiB3YWl0Rm9yUG9zdExvZ2luKHRoaXMucGFnZSksXG4gICAgICBwb3NzaWJsZVJlc3VsdHM6IGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKHRoaXMucGFnZSksXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoRGF0YSgpIHtcbiAgICBjb25zdCBkZWZhdWx0U3RhcnRNb21lbnQgPSBtb21lbnQoKS5zdWJ0cmFjdCgxLCAneWVhcnMnKS5hZGQoMSwgJ2RheScpO1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMub3B0aW9ucy5zdGFydERhdGUgfHwgZGVmYXVsdFN0YXJ0TW9tZW50LnRvRGF0ZSgpO1xuICAgIGNvbnN0IHN0YXJ0TW9tZW50ID0gbW9tZW50Lm1heChkZWZhdWx0U3RhcnRNb21lbnQsIG1vbWVudChzdGFydERhdGUpKTtcblxuICAgIGNvbnN0IHVybCA9IGdldFRyYW5zYWN0aW9uc1VybCgpO1xuICAgIGF3YWl0IHRoaXMubmF2aWdhdGVUbyh1cmwpO1xuXG4gICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBmZXRjaFRyYW5zYWN0aW9ucyh0aGlzLnBhZ2UsIHN0YXJ0TW9tZW50KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgYWNjb3VudHMsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBPdHNhckhhaGF5YWxTY3JhcGVyO1xuIl19
@@ -1,8 +1,11 @@
1
1
  import { BaseScraperWithBrowser, PossibleLoginResults } from './base-scraper-with-browser';
2
2
  import { TransactionsAccount } from '../transactions';
3
- import { ScraperCredentials } from './base-scraper';
4
- declare class UnionBankScraper extends BaseScraperWithBrowser {
5
- getLoginOptions(credentials: ScraperCredentials): {
3
+ declare type ScraperSpecificCredentials = {
4
+ username: string;
5
+ password: string;
6
+ };
7
+ declare class UnionBankScraper extends BaseScraperWithBrowser<ScraperSpecificCredentials> {
8
+ getLoginOptions(credentials: ScraperSpecificCredentials): {
6
9
  loginUrl: string;
7
10
  fields: {
8
11
  selector: string;