israeli-bank-scrapers 4.2.1 → 4.3.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 (62) hide show
  1. package/README.md +14 -0
  2. package/lib/assertNever.js +1 -2
  3. package/lib/constants.js +1 -1
  4. package/lib/definitions.d.ts +5 -0
  5. package/lib/definitions.js +7 -4
  6. package/lib/helpers/dates.js +1 -7
  7. package/lib/helpers/debug.js +1 -4
  8. package/lib/helpers/elements-interactions.js +5 -27
  9. package/lib/helpers/fetch.js +1 -21
  10. package/lib/helpers/navigation.js +1 -9
  11. package/lib/helpers/storage.js +1 -3
  12. package/lib/helpers/transactions.js +1 -17
  13. package/lib/helpers/waiting.js +4 -12
  14. package/lib/index.js +2 -12
  15. package/lib/scrapers/amex.js +1 -7
  16. package/lib/scrapers/amex.test.js +1 -14
  17. package/lib/scrapers/base-beinleumi-group.js +4 -67
  18. package/lib/scrapers/base-isracard-amex.js +1 -75
  19. package/lib/scrapers/base-scraper-with-browser.js +14 -82
  20. package/lib/scrapers/base-scraper-with-browser.test.js +13 -23
  21. package/lib/scrapers/base-scraper.js +13 -36
  22. package/lib/scrapers/behatsdaa.js +5 -26
  23. package/lib/scrapers/behatsdaa.test.js +1 -10
  24. package/lib/scrapers/beinleumi.js +1 -11
  25. package/lib/scrapers/beinleumi.test.js +1 -14
  26. package/lib/scrapers/beyahad-bishvilha.js +1 -35
  27. package/lib/scrapers/beyahad-bishvilha.test.js +1 -14
  28. package/lib/scrapers/discount.js +1 -31
  29. package/lib/scrapers/discount.test.js +1 -14
  30. package/lib/scrapers/errors.js +1 -5
  31. package/lib/scrapers/factory.js +4 -39
  32. package/lib/scrapers/factory.test.js +2 -4
  33. package/lib/scrapers/hapoalim.js +4 -50
  34. package/lib/scrapers/hapoalim.test.js +1 -14
  35. package/lib/scrapers/interface.js +1 -1
  36. package/lib/scrapers/isracard.js +1 -7
  37. package/lib/scrapers/isracard.test.js +1 -14
  38. package/lib/scrapers/leumi.js +13 -45
  39. package/lib/scrapers/leumi.test.js +1 -14
  40. package/lib/scrapers/massad.js +1 -11
  41. package/lib/scrapers/max.d.ts +20 -0
  42. package/lib/scrapers/max.js +76 -111
  43. package/lib/scrapers/max.test.js +21 -16
  44. package/lib/scrapers/mercantile.d.ts +20 -0
  45. package/lib/scrapers/mercantile.js +21 -0
  46. package/lib/scrapers/mercantile.test.d.ts +1 -0
  47. package/lib/scrapers/mercantile.test.js +48 -0
  48. package/lib/scrapers/mizrahi.js +14 -40
  49. package/lib/scrapers/mizrahi.test.js +1 -15
  50. package/lib/scrapers/one-zero-queries.js +1 -1
  51. package/lib/scrapers/one-zero.js +2 -54
  52. package/lib/scrapers/one-zero.test.js +1 -14
  53. package/lib/scrapers/otsar-hahayal.js +9 -47
  54. package/lib/scrapers/otsar-hahayal.test.js +1 -14
  55. package/lib/scrapers/union-bank.js +2 -60
  56. package/lib/scrapers/union-bank.test.js +1 -14
  57. package/lib/scrapers/visa-cal.js +3 -55
  58. package/lib/scrapers/visa-cal.test.js +3 -16
  59. package/lib/scrapers/yahav.js +25 -52
  60. package/lib/scrapers/yahav.test.js +1 -14
  61. package/lib/transactions.js +1 -4
  62. package/package.json +2 -7
@@ -1,34 +1,21 @@
1
1
  "use strict";
2
2
 
3
3
  require("core-js/modules/es.symbol.description");
4
-
5
4
  require("core-js/modules/es.array.iterator");
6
-
7
5
  require("core-js/modules/es.promise");
8
-
9
6
  require("core-js/modules/es.string.replace");
10
-
11
7
  require("core-js/modules/es.string.trim");
12
-
13
8
  Object.defineProperty(exports, "__esModule", {
14
9
  value: true
15
10
  });
16
11
  exports.default = void 0;
17
-
18
12
  var _moment = _interopRequireDefault(require("moment"));
19
-
20
13
  var _baseScraperWithBrowser = require("./base-scraper-with-browser");
21
-
22
14
  var _elementsInteractions = require("../helpers/elements-interactions");
23
-
24
15
  var _navigation = require("../helpers/navigation");
25
-
26
16
  var _constants = require("../constants");
27
-
28
17
  var _transactions = require("../transactions");
29
-
30
18
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
-
32
19
  const BASE_URL = 'https://hb.unionbank.co.il';
33
20
  const TRANSACTIONS_URL = `${BASE_URL}/eBanking/Accounts/ExtendedActivity.aspx#/`;
34
21
  const DATE_FORMAT = 'DD/MM/YY';
@@ -42,14 +29,12 @@ const PENDING_TRANSACTIONS_TABLE_ID = 'trTodayActivityNapaTableUpper';
42
29
  const COMPLETED_TRANSACTIONS_TABLE_ID = 'ctlActivityTable';
43
30
  const ERROR_MESSAGE_CLASS = 'errInfo';
44
31
  const ACCOUNTS_DROPDOWN_SELECTOR = 'select#ddlAccounts_m_ddl';
45
-
46
32
  function getPossibleLoginResults() {
47
33
  const urls = {};
48
34
  urls[_baseScraperWithBrowser.LoginResults.Success] = [/eBanking\/Accounts/];
49
35
  urls[_baseScraperWithBrowser.LoginResults.InvalidPassword] = [/InternalSite\/CustomUpdate\/leumi\/LoginPage.ASP/];
50
36
  return urls;
51
37
  }
52
-
53
38
  function createLoginFields(credentials) {
54
39
  return [{
55
40
  selector: '#uid',
@@ -59,18 +44,15 @@ function createLoginFields(credentials) {
59
44
  value: credentials.password
60
45
  }];
61
46
  }
62
-
63
47
  function getAmountData(amountStr) {
64
48
  const amountStrCopy = amountStr.replace(',', '');
65
49
  return parseFloat(amountStrCopy);
66
50
  }
67
-
68
51
  function getTxnAmount(txn) {
69
52
  const credit = getAmountData(txn.credit);
70
53
  const debit = getAmountData(txn.debit);
71
54
  return (Number.isNaN(credit) ? 0 : credit) - (Number.isNaN(debit) ? 0 : debit);
72
55
  }
73
-
74
56
  function convertTransactions(txns) {
75
57
  return txns.map(txn => {
76
58
  const convertedDate = (0, _moment.default)(txn.date, DATE_FORMAT).toISOString();
@@ -89,27 +71,21 @@ function convertTransactions(txns) {
89
71
  };
90
72
  });
91
73
  }
92
-
93
74
  function getTransactionDate(tds, txnsTableHeaders) {
94
75
  return (tds[txnsTableHeaders[DATE_HEADER]] || '').trim();
95
76
  }
96
-
97
77
  function getTransactionDescription(tds, txnsTableHeaders) {
98
78
  return (tds[txnsTableHeaders[DESCRIPTION_HEADER]] || '').trim();
99
79
  }
100
-
101
80
  function getTransactionReference(tds, txnsTableHeaders) {
102
81
  return (tds[txnsTableHeaders[REFERENCE_HEADER]] || '').trim();
103
82
  }
104
-
105
83
  function getTransactionDebit(tds, txnsTableHeaders) {
106
84
  return (tds[txnsTableHeaders[DEBIT_HEADER]] || '').trim();
107
85
  }
108
-
109
86
  function getTransactionCredit(tds, txnsTableHeaders) {
110
87
  return (tds[txnsTableHeaders[CREDIT_HEADER]] || '').trim();
111
88
  }
112
-
113
89
  function extractTransactionDetails(txnRow, txnsTableHeaders, txnStatus) {
114
90
  const tds = txnRow.innerTds;
115
91
  return {
@@ -122,22 +98,18 @@ function extractTransactionDetails(txnRow, txnsTableHeaders, txnStatus) {
122
98
  memo: ''
123
99
  };
124
100
  }
125
-
126
101
  function isExpandedDescRow(txnRow) {
127
102
  return txnRow.id === 'rowAdded';
128
103
  }
129
- /* eslint-disable no-param-reassign */
130
-
131
104
 
105
+ /* eslint-disable no-param-reassign */
132
106
  function editLastTransactionDesc(txnRow, lastTxn) {
133
107
  lastTxn.description = `${lastTxn.description} ${txnRow.innerTds[0]}`;
134
108
  return lastTxn;
135
109
  }
136
-
137
110
  function handleTransactionRow(txns, txnsTableHeaders, txnRow, txnType) {
138
111
  if (isExpandedDescRow(txnRow)) {
139
112
  const lastTransaction = txns.pop();
140
-
141
113
  if (lastTransaction) {
142
114
  txns.push(editLastTransactionDesc(txnRow, lastTransaction));
143
115
  } else {
@@ -147,7 +119,6 @@ function handleTransactionRow(txns, txnsTableHeaders, txnRow, txnType) {
147
119
  txns.push(extractTransactionDetails(txnRow, txnsTableHeaders, txnType));
148
120
  }
149
121
  }
150
-
151
122
  async function getTransactionsTableHeaders(page, tableTypeId) {
152
123
  const headersMap = [];
153
124
  const headersObjs = await (0, _elementsInteractions.pageEvalAll)(page, `#WorkSpaceBox #${tableTypeId} tr[class='header'] th`, null, ths => {
@@ -156,14 +127,11 @@ async function getTransactionsTableHeaders(page, tableTypeId) {
156
127
  index
157
128
  }));
158
129
  });
159
-
160
130
  for (const headerObj of headersObjs) {
161
131
  headersMap[headerObj.text] = headerObj.index;
162
132
  }
163
-
164
133
  return headersMap;
165
134
  }
166
-
167
135
  async function extractTransactionsFromTable(page, tableTypeId, txnType) {
168
136
  const txns = [];
169
137
  const transactionsTableHeaders = await getTransactionsTableHeaders(page, tableTypeId);
@@ -173,35 +141,27 @@ async function extractTransactionsFromTable(page, tableTypeId, txnType) {
173
141
  innerTds: Array.from(tr.getElementsByTagName('td')).map(td => td.innerText)
174
142
  }));
175
143
  });
176
-
177
144
  for (const txnRow of transactionsRows) {
178
145
  handleTransactionRow(txns, transactionsTableHeaders, txnRow, txnType);
179
146
  }
180
-
181
147
  return txns;
182
148
  }
183
-
184
149
  async function isNoTransactionInDateRangeError(page) {
185
150
  const hasErrorInfoElement = await (0, _elementsInteractions.elementPresentOnPage)(page, `.${ERROR_MESSAGE_CLASS}`);
186
-
187
151
  if (hasErrorInfoElement) {
188
152
  const errorText = await page.$eval(`.${ERROR_MESSAGE_CLASS}`, errorElement => {
189
153
  return errorElement.innerText;
190
154
  });
191
155
  return errorText.trim() === NO_TRANSACTION_IN_DATE_RANGE_TEXT;
192
156
  }
193
-
194
157
  return false;
195
158
  }
196
-
197
159
  async function chooseAccount(page, accountId) {
198
160
  const hasDropDownList = await (0, _elementsInteractions.elementPresentOnPage)(page, ACCOUNTS_DROPDOWN_SELECTOR);
199
-
200
161
  if (hasDropDownList) {
201
162
  await (0, _elementsInteractions.dropdownSelect)(page, ACCOUNTS_DROPDOWN_SELECTOR, accountId);
202
163
  }
203
164
  }
204
-
205
165
  async function searchByDates(page, startDate) {
206
166
  await (0, _elementsInteractions.dropdownSelect)(page, 'select#ddlTransactionPeriod', '004');
207
167
  await (0, _elementsInteractions.waitUntilElementFound)(page, 'select#ddlTransactionPeriod');
@@ -209,41 +169,33 @@ async function searchByDates(page, startDate) {
209
169
  await (0, _elementsInteractions.clickButton)(page, 'input#btnDisplayDates');
210
170
  await (0, _navigation.waitForNavigation)(page);
211
171
  }
212
-
213
172
  async function getAccountNumber(page) {
214
173
  const selectedSnifAccount = await page.$eval('#ddlAccounts_m_ddl option[selected="selected"]', option => {
215
174
  return option.innerText;
216
175
  });
217
176
  return selectedSnifAccount.replace('/', '_');
218
177
  }
219
-
220
178
  async function expandTransactionsTable(page) {
221
179
  const hasExpandAllButton = await (0, _elementsInteractions.elementPresentOnPage)(page, "a[id*='lnkCtlExpandAll']");
222
-
223
180
  if (hasExpandAllButton) {
224
181
  await (0, _elementsInteractions.clickButton)(page, "a[id*='lnkCtlExpandAll']");
225
182
  }
226
183
  }
227
-
228
184
  async function scrapeTransactionsFromTable(page) {
229
185
  const pendingTxns = await extractTransactionsFromTable(page, PENDING_TRANSACTIONS_TABLE_ID, _transactions.TransactionStatuses.Pending);
230
186
  const completedTxns = await extractTransactionsFromTable(page, COMPLETED_TRANSACTIONS_TABLE_ID, _transactions.TransactionStatuses.Completed);
231
187
  const txns = [...pendingTxns, ...completedTxns];
232
188
  return convertTransactions(txns);
233
189
  }
234
-
235
190
  async function getAccountTransactions(page) {
236
191
  await Promise.race([(0, _elementsInteractions.waitUntilElementFound)(page, `#${COMPLETED_TRANSACTIONS_TABLE_ID}`, false), (0, _elementsInteractions.waitUntilElementFound)(page, `.${ERROR_MESSAGE_CLASS}`, false)]);
237
192
  const noTransactionInRangeError = await isNoTransactionInDateRangeError(page);
238
-
239
193
  if (noTransactionInRangeError) {
240
194
  return [];
241
195
  }
242
-
243
196
  await expandTransactionsTable(page);
244
197
  return scrapeTransactionsFromTable(page);
245
198
  }
246
-
247
199
  async function fetchAccountData(page, startDate, accountId) {
248
200
  await chooseAccount(page, accountId);
249
201
  await searchByDates(page, startDate);
@@ -254,11 +206,9 @@ async function fetchAccountData(page, startDate, accountId) {
254
206
  txns
255
207
  };
256
208
  }
257
-
258
209
  async function fetchAccounts(page, startDate) {
259
210
  const accounts = [];
260
211
  const accountsList = await (0, _elementsInteractions.dropdownElements)(page, ACCOUNTS_DROPDOWN_SELECTOR);
261
-
262
212
  for (const account of accountsList) {
263
213
  if (account.value !== '-1') {
264
214
  // Skip "All accounts" option
@@ -266,14 +216,11 @@ async function fetchAccounts(page, startDate) {
266
216
  accounts.push(accountData);
267
217
  }
268
218
  }
269
-
270
219
  return accounts;
271
220
  }
272
-
273
221
  async function waitForPostLogin(page) {
274
222
  return Promise.race([(0, _elementsInteractions.waitUntilElementFound)(page, '#signoff', true), (0, _elementsInteractions.waitUntilElementFound)(page, '#restore', true)]);
275
223
  }
276
-
277
224
  class UnionBankScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser {
278
225
  getLoginOptions(credentials) {
279
226
  return {
@@ -284,13 +231,10 @@ class UnionBankScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser {
284
231
  possibleResults: getPossibleLoginResults()
285
232
  };
286
233
  }
287
-
288
234
  async fetchData() {
289
235
  const defaultStartMoment = (0, _moment.default)().subtract(1, 'years').add(1, 'day');
290
236
  const startDate = this.options.startDate || defaultStartMoment.toDate();
291
-
292
237
  const startMoment = _moment.default.max(defaultStartMoment, (0, _moment.default)(startDate));
293
-
294
238
  await this.navigateTo(TRANSACTIONS_URL);
295
239
  const accounts = await fetchAccounts(this.page, startMoment);
296
240
  return {
@@ -298,9 +242,7 @@ class UnionBankScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser {
298
242
  accounts
299
243
  };
300
244
  }
301
-
302
245
  }
303
-
304
246
  var _default = UnionBankScraper;
305
247
  exports.default = _default;
306
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy91bmlvbi1iYW5rLnRzIl0sIm5hbWVzIjpbIkJBU0VfVVJMIiwiVFJBTlNBQ1RJT05TX1VSTCIsIkRBVEVfRk9STUFUIiwiTk9fVFJBTlNBQ1RJT05fSU5fREFURV9SQU5HRV9URVhUIiwiREFURV9IRUFERVIiLCJERVNDUklQVElPTl9IRUFERVIiLCJSRUZFUkVOQ0VfSEVBREVSIiwiREVCSVRfSEVBREVSIiwiQ1JFRElUX0hFQURFUiIsIlBFTkRJTkdfVFJBTlNBQ1RJT05TX1RBQkxFX0lEIiwiQ09NUExFVEVEX1RSQU5TQUNUSU9OU19UQUJMRV9JRCIsIkVSUk9SX01FU1NBR0VfQ0xBU1MiLCJBQ0NPVU5UU19EUk9QRE9XTl9TRUxFQ1RPUiIsImdldFBvc3NpYmxlTG9naW5SZXN1bHRzIiwidXJscyIsIkxvZ2luUmVzdWx0cyIsIlN1Y2Nlc3MiLCJJbnZhbGlkUGFzc3dvcmQiLCJjcmVhdGVMb2dpbkZpZWxkcyIsImNyZWRlbnRpYWxzIiwic2VsZWN0b3IiLCJ2YWx1ZSIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJnZXRBbW91bnREYXRhIiwiYW1vdW50U3RyIiwiYW1vdW50U3RyQ29weSIsInJlcGxhY2UiLCJwYXJzZUZsb2F0IiwiZ2V0VHhuQW1vdW50IiwidHhuIiwiY3JlZGl0IiwiZGViaXQiLCJOdW1iZXIiLCJpc05hTiIsImNvbnZlcnRUcmFuc2FjdGlvbnMiLCJ0eG5zIiwibWFwIiwiY29udmVydGVkRGF0ZSIsImRhdGUiLCJ0b0lTT1N0cmluZyIsImNvbnZlcnRlZEFtb3VudCIsInR5cGUiLCJUcmFuc2FjdGlvblR5cGVzIiwiTm9ybWFsIiwiaWRlbnRpZmllciIsInJlZmVyZW5jZSIsInBhcnNlSW50IiwidW5kZWZpbmVkIiwicHJvY2Vzc2VkRGF0ZSIsIm9yaWdpbmFsQW1vdW50Iiwib3JpZ2luYWxDdXJyZW5jeSIsIlNIRUtFTF9DVVJSRU5DWSIsImNoYXJnZWRBbW91bnQiLCJzdGF0dXMiLCJkZXNjcmlwdGlvbiIsIm1lbW8iLCJnZXRUcmFuc2FjdGlvbkRhdGUiLCJ0ZHMiLCJ0eG5zVGFibGVIZWFkZXJzIiwidHJpbSIsImdldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24iLCJnZXRUcmFuc2FjdGlvblJlZmVyZW5jZSIsImdldFRyYW5zYWN0aW9uRGViaXQiLCJnZXRUcmFuc2FjdGlvbkNyZWRpdCIsImV4dHJhY3RUcmFuc2FjdGlvbkRldGFpbHMiLCJ0eG5Sb3ciLCJ0eG5TdGF0dXMiLCJpbm5lclRkcyIsImlzRXhwYW5kZWREZXNjUm93IiwiaWQiLCJlZGl0TGFzdFRyYW5zYWN0aW9uRGVzYyIsImxhc3RUeG4iLCJoYW5kbGVUcmFuc2FjdGlvblJvdyIsInR4blR5cGUiLCJsYXN0VHJhbnNhY3Rpb24iLCJwb3AiLCJwdXNoIiwiRXJyb3IiLCJnZXRUcmFuc2FjdGlvbnNUYWJsZUhlYWRlcnMiLCJwYWdlIiwidGFibGVUeXBlSWQiLCJoZWFkZXJzTWFwIiwiaGVhZGVyc09ianMiLCJ0aHMiLCJ0aCIsImluZGV4IiwidGV4dCIsImlubmVyVGV4dCIsImhlYWRlck9iaiIsImV4dHJhY3RUcmFuc2FjdGlvbnNGcm9tVGFibGUiLCJ0cmFuc2FjdGlvbnNUYWJsZUhlYWRlcnMiLCJ0cmFuc2FjdGlvbnNSb3dzIiwidHJzIiwidHIiLCJnZXRBdHRyaWJ1dGUiLCJBcnJheSIsImZyb20iLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsInRkIiwiaXNOb1RyYW5zYWN0aW9uSW5EYXRlUmFuZ2VFcnJvciIsImhhc0Vycm9ySW5mb0VsZW1lbnQiLCJlcnJvclRleHQiLCIkZXZhbCIsImVycm9yRWxlbWVudCIsImNob29zZUFjY291bnQiLCJhY2NvdW50SWQiLCJoYXNEcm9wRG93bkxpc3QiLCJzZWFyY2hCeURhdGVzIiwic3RhcnREYXRlIiwiZm9ybWF0IiwiZ2V0QWNjb3VudE51bWJlciIsInNlbGVjdGVkU25pZkFjY291bnQiLCJvcHRpb24iLCJleHBhbmRUcmFuc2FjdGlvbnNUYWJsZSIsImhhc0V4cGFuZEFsbEJ1dHRvbiIsInNjcmFwZVRyYW5zYWN0aW9uc0Zyb21UYWJsZSIsInBlbmRpbmdUeG5zIiwiVHJhbnNhY3Rpb25TdGF0dXNlcyIsIlBlbmRpbmciLCJjb21wbGV0ZWRUeG5zIiwiQ29tcGxldGVkIiwiZ2V0QWNjb3VudFRyYW5zYWN0aW9ucyIsIlByb21pc2UiLCJyYWNlIiwibm9UcmFuc2FjdGlvbkluUmFuZ2VFcnJvciIsImZldGNoQWNjb3VudERhdGEiLCJhY2NvdW50TnVtYmVyIiwiZmV0Y2hBY2NvdW50cyIsImFjY291bnRzIiwiYWNjb3VudHNMaXN0IiwiYWNjb3VudCIsImFjY291bnREYXRhIiwid2FpdEZvclBvc3RMb2dpbiIsIlVuaW9uQmFua1NjcmFwZXIiLCJCYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiZ2V0TG9naW5PcHRpb25zIiwibG9naW5VcmwiLCJmaWVsZHMiLCJzdWJtaXRCdXR0b25TZWxlY3RvciIsInBvc3RBY3Rpb24iLCJwb3NzaWJsZVJlc3VsdHMiLCJmZXRjaERhdGEiLCJkZWZhdWx0U3RhcnRNb21lbnQiLCJzdWJ0cmFjdCIsImFkZCIsIm9wdGlvbnMiLCJ0b0RhdGUiLCJzdGFydE1vbWVudCIsIm1vbWVudCIsIm1heCIsIm5hdmlnYXRlVG8iLCJzdWNjZXNzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUVBOztBQUNBOztBQVNBOztBQUNBOztBQUNBOzs7O0FBS0EsTUFBTUEsUUFBUSxHQUFHLDRCQUFqQjtBQUNBLE1BQU1DLGdCQUFnQixHQUFJLEdBQUVELFFBQVMsNENBQXJDO0FBQ0EsTUFBTUUsV0FBVyxHQUFHLFVBQXBCO0FBQ0EsTUFBTUMsaUNBQWlDLEdBQUcsOENBQTFDO0FBQ0EsTUFBTUMsV0FBVyxHQUFHLE9BQXBCO0FBQ0EsTUFBTUMsa0JBQWtCLEdBQUcsT0FBM0I7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxRQUF6QjtBQUNBLE1BQU1DLFlBQVksR0FBRyxNQUFyQjtBQUNBLE1BQU1DLGFBQWEsR0FBRyxNQUF0QjtBQUNBLE1BQU1DLDZC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LFdBQVcsR0FBR0MsZ0JBQU9DLEdBQVAsQ0FBV1Asa0JBQVgsRUFBK0IscUJBQU9sQyxTQUFQLENBQS9CLENBQXBCOztBQUVBLFVBQU0sS0FBSzBDLFVBQUwsQ0FBZ0J0SixnQkFBaEIsQ0FBTjtBQUVBLFVBQU1nSSxRQUFRLEdBQUcsTUFBTUQsYUFBYSxDQUFDLEtBQUtoRCxJQUFOLEVBQVlvRSxXQUFaLENBQXBDO0FBRUEsV0FBTztBQUNMSSxNQUFBQSxPQUFPLEVBQUUsSUFESjtBQUVMdkIsTUFBQUE7QUFGSyxLQUFQO0FBSUQ7O0FBeEIrRTs7ZUEyQm5FSyxnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQsIHsgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IFBhZ2UgfSBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IHsgQmFzZVNjcmFwZXJXaXRoQnJvd3NlciwgTG9naW5SZXN1bHRzLCBQb3NzaWJsZUxvZ2luUmVzdWx0cyB9IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5pbXBvcnQge1xuICBkcm9wZG93blNlbGVjdCxcbiAgZHJvcGRvd25FbGVtZW50cyxcbiAgZmlsbElucHV0LFxuICBjbGlja0J1dHRvbixcbiAgd2FpdFVudGlsRWxlbWVudEZvdW5kLFxuICBwYWdlRXZhbEFsbCxcbiAgZWxlbWVudFByZXNlbnRPblBhZ2UsXG59IGZyb20gJy4uL2hlbHBlcnMvZWxlbWVudHMtaW50ZXJhY3Rpb25zJztcbmltcG9ydCB7IHdhaXRGb3JOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vaGVscGVycy9uYXZpZ2F0aW9uJztcbmltcG9ydCB7IFNIRUtFTF9DVVJSRU5DWSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBUcmFuc2FjdGlvbnNBY2NvdW50LCBUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25TdGF0dXNlcyxcbiAgVHJhbnNhY3Rpb25UeXBlcyxcbn0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcblxuY29uc3QgQkFTRV9VUkwgPSAnaHR0cHM6Ly9oYi51bmlvbmJhbmsuY28uaWwnO1xuY29uc3QgVFJBTlNBQ1RJT05TX1VSTCA9IGAke0JBU0VfVVJMfS9lQmFua2luZy9BY2NvdW50cy9FeHRlbmRlZEFjdGl2aXR5LmFzcHgjL2A7XG5jb25zdCBEQVRFX0ZPUk1BVCA9ICdERC9NTS9ZWSc7XG5jb25zdCBOT19UUkFOU0FDVElPTl9JTl9EQVRFX1JBTkdFX1RFWFQgPSAn15zXkCDXp9eZ15nXnteV16og16rXoNeV16LXldeqINee16rXkNeZ157XldeqINei15wg16TXmSDXlNeh15nXoNeV158g16nXlNeV15LXk9eoJztcbmNvbnN0IERBVEVfSEVBREVSID0gJ9eq15DXqNeZ15onO1xuY29uc3QgREVTQ1JJUFRJT05fSEVBREVSID0gJ9eq15nXkNeV16gnO1xuY29uc3QgUkVGRVJFTkNFX0hFQURFUiA9ICfXkNeh157Xm9eq15AnO1xuY29uc3QgREVCSVRfSEVBREVSID0gJ9eX15XXkdeUJztcbmNvbnN0IENSRURJVF9IRUFERVIgPSAn15bXm9eV16onO1xuY29uc3QgUEVORElOR19UUkFOU0FDVElPTlNfVEFCTEVfSUQgPSAndHJUb2RheUFjdGl2aXR5TmFwYVRhYmxlVXBwZXInO1xuY29uc3QgQ09NUExFVEVEX1RSQU5TQUNUSU9OU19UQUJMRV9JRCA9ICdjdGxBY3Rpdml0eVRhYmxlJztcbmNvbnN0IEVSUk9SX01FU1NBR0VfQ0xBU1MgPSAnZXJySW5mbyc7XG5jb25zdCBBQ0NPVU5UU19EUk9QRE9XTl9TRUxFQ1RPUiA9ICdzZWxlY3QjZGRsQWNjb3VudHNfbV9kZGwnO1xuXG5mdW5jdGlvbiBnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cygpIHtcbiAgY29uc3QgdXJsczogUG9zc2libGVMb2dpblJlc3VsdHMgPSB7fTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuU3VjY2Vzc10gPSBbL2VCYW5raW5nXFwvQWNjb3VudHMvXTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuSW52YWxpZFBhc3N3b3JkXSA9IFsvSW50ZXJuYWxTaXRlXFwvQ3VzdG9tVXBkYXRlXFwvbGV1bWlcXC9Mb2dpblBhZ2UuQVNQL107XG4gIHJldHVybiB1cmxzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgcmV0dXJuIFtcbiAgICB7IHNlbGVjdG9yOiAnI3VpZCcsIHZhbHVlOiBjcmVkZW50aWFscy51c2VybmFtZSB9LFxuICAgIHsgc2VsZWN0b3I6ICcjcGFzc3dvcmQnLCB2YWx1ZTogY3JlZGVudGlhbHMucGFzc3dvcmQgfSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gZ2V0QW1vdW50RGF0YShhbW91bnRTdHI6IHN0cmluZykge1xuICBjb25zdCBhbW91bnRTdHJDb3B5ID0gYW1vdW50U3RyLnJlcGxhY2UoJywnLCAnJyk7XG4gIHJldHVybiBwYXJzZUZsb2F0KGFtb3VudFN0ckNvcHkpO1xufVxuXG5pbnRlcmZhY2UgU2NyYXBlZFRyYW5zYWN0aW9uIHtcbiAgY3JlZGl0OiBzdHJpbmc7XG4gIGRlYml0OiBzdHJpbmc7XG4gIGRhdGU6IHN0cmluZztcbiAgcmVmZXJlbmNlPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBtZW1vOiBzdHJpbmc7XG4gIHN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcztcbn1cblxuZnVuY3Rpb24gZ2V0VHhuQW1vdW50KHR4bjogU2NyYXBlZFRyYW5zYWN0aW9uKSB7XG4gIGNvbnN0IGNyZWRpdCA9IGdldEFtb3VudERhdGEodHhuLmNyZWRpdCk7XG4gIGNvbnN0IGRlYml0ID0gZ2V0QW1vdW50RGF0YSh0eG4uZGViaXQpO1xuICByZXR1cm4gKE51bWJlci5pc05hTihjcmVkaXQpID8gMCA6IGNyZWRpdCkgLSAoTnVtYmVyLmlzTmFOKGRlYml0KSA/IDAgOiBkZWJpdCk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRUcmFuc2FjdGlvbnModHhuczogU2NyYXBlZFRyYW5zYWN0aW9uW10pOiBUcmFuc2FjdGlvbltdIHtcbiAgcmV0dXJuIHR4bnMubWFwKCh0eG4pID0+IHtcbiAgICBjb25zdCBjb252ZXJ0ZWREYXRlID0gbW9tZW50KHR4bi5kYXRlLCBEQVRFX0ZPUk1BVCkudG9JU09TdHJpbmcoKTtcbiAgICBjb25zdCBjb252ZXJ0ZWRBbW91bnQgPSBnZXRUeG5BbW91bnQodHhuKTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlcy5Ob3JtYWwsXG4gICAgICBpZGVudGlmaWVyOiB0eG4ucmVmZXJlbmNlID8gcGFyc2VJbnQodHhuLnJlZmVyZW5jZSwgMTApIDogdW5kZWZpbmVkLFxuICAgICAgZGF0ZTogY29udmVydGVkRGF0ZSxcbiAgICAgIHByb2Nlc3NlZERhdGU6IGNvbnZlcnRlZERhdGUsXG4gICAgICBvcmlnaW5hbEFtb3VudDogY29udmVydGVkQW1vdW50LFxuICAgICAgb3JpZ2luYWxDdXJyZW5jeTogU0hFS0VMX0NVUlJFTkNZLFxuICAgICAgY2hhcmdlZEFtb3VudDogY29udmVydGVkQW1vdW50LFxuICAgICAgc3RhdHVzOiB0eG4uc3RhdHVzLFxuICAgICAgZGVzY3JpcHRpb246IHR4bi5kZXNjcmlwdGlvbixcbiAgICAgIG1lbW86IHR4bi5tZW1vLFxuICAgIH07XG4gIH0pO1xufVxuXG50eXBlIFRyYW5zYWN0aW9uc1RyID0geyBpZDogc3RyaW5nLCBpbm5lclRkczogVHJhbnNhY3Rpb25zVHJUZHMgfTtcbnR5cGUgVHJhbnNhY3Rpb25UYWJsZUhlYWRlcnMgPSBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xudHlwZSBUcmFuc2FjdGlvbnNUclRkcyA9IHN0cmluZ1tdO1xuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvbkRhdGUodGRzOiBUcmFuc2FjdGlvbnNUclRkcywgdHhuc1RhYmxlSGVhZGVyczogVHJhbnNhY3Rpb25UYWJsZUhlYWRlcnMpIHtcbiAgcmV0dXJuICh0ZHNbdHhuc1RhYmxlSGVhZGVyc1tEQVRFX0hFQURFUl1dIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24odGRzOiBUcmFuc2FjdGlvbnNUclRkcywgdHhuc1RhYmxlSGVhZGVyczogVHJhbnNhY3Rpb25UYWJsZUhlYWRlcnMpIHtcbiAgcmV0dXJuICh0ZHNbdHhuc1RhYmxlSGVhZGVyc1tERVNDUklQVElPTl9IRUFERVJdXSB8fCAnJykudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvblJlZmVyZW5jZSh0ZHM6IFRyYW5zYWN0aW9uc1RyVGRzLCB0eG5zVGFibGVIZWFkZXJzOiBUcmFuc2FjdGlvblRhYmxlSGVhZGVycykge1xuICByZXR1cm4gKHRkc1t0eG5zVGFibGVIZWFkZXJzW1JFRkVSRU5DRV9IRUFERVJdXSB8fCAnJykudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvbkRlYml0KHRkczogVHJhbnNhY3Rpb25zVHJUZHMsIHR4bnNUYWJsZUhlYWRlcnM6IFRyYW5zYWN0aW9uVGFibGVIZWFkZXJzKSB7XG4gIHJldHVybiAodGRzW3R4bnNUYWJsZUhlYWRlcnNbREVCSVRfSEVBREVSXV0gfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25DcmVkaXQodGRzOiBUcmFuc2FjdGlvbnNUclRkcywgdHhuc1RhYmxlSGVhZGVyczogVHJhbnNhY3Rpb25UYWJsZUhlYWRlcnMpIHtcbiAgcmV0dXJuICh0ZHNbdHhuc1RhYmxlSGVhZGVyc1tDUkVESVRfSEVBREVSXV0gfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFRyYW5zYWN0aW9uRGV0YWlscyh0eG5Sb3c6IFRyYW5zYWN0aW9uc1RyLCB0eG5zVGFibGVIZWFkZXJzOiBUcmFuc2FjdGlvblRhYmxlSGVhZGVycywgdHhuU3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c2VzKTogU2NyYXBlZFRyYW5zYWN0aW9uIHtcbiAgY29uc3QgdGRzID0gdHhuUm93LmlubmVyVGRzO1xuICByZXR1cm4ge1xuICAgIHN0YXR1czogdHhuU3RhdHVzLFxuICAgIGRhdGU6IGdldFRyYW5zYWN0aW9uRGF0ZSh0ZHMsIHR4bnNUYWJsZUhlYWRlcnMpLFxuICAgIGRlc2NyaXB0aW9uOiBnZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uKHRkcywgdHhuc1RhYmxlSGVhZGVycyksXG4gICAgcmVmZXJlbmNlOiBnZXRUcmFuc2FjdGlvblJlZmVyZW5jZSh0ZHMsIHR4bnNUYWJsZUhlYWRlcnMpLFxuICAgIGRlYml0OiBnZXRUcmFuc2FjdGlvbkRlYml0KHRkcywgdHhuc1RhYmxlSGVhZGVycyksXG4gICAgY3JlZGl0OiBnZXRUcmFuc2FjdGlvbkNyZWRpdCh0ZHMsIHR4bnNUYWJsZUhlYWRlcnMpLFxuICAgIG1lbW86ICcnLFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0V4cGFuZGVkRGVzY1Jvdyh0eG5Sb3c6IFRyYW5zYWN0aW9uc1RyKSB7XG4gIHJldHVybiB0eG5Sb3cuaWQgPT09ICdyb3dBZGRlZCc7XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG5mdW5jdGlvbiBlZGl0TGFzdFRyYW5zYWN0aW9uRGVzYyh0eG5Sb3c6IFRyYW5zYWN0aW9uc1RyLCBsYXN0VHhuOiBTY3JhcGVkVHJhbnNhY3Rpb24pOiBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBsYXN0VHhuLmRlc2NyaXB0aW9uID0gYCR7bGFzdFR4bi5kZXNjcmlwdGlvbn0gJHt0eG5Sb3cuaW5uZXJUZHNbMF19YDtcbiAgcmV0dXJuIGxhc3RUeG47XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVRyYW5zYWN0aW9uUm93KHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdLCB0eG5zVGFibGVIZWFkZXJzOiBUcmFuc2FjdGlvblRhYmxlSGVhZGVycywgdHhuUm93OiBUcmFuc2FjdGlvbnNUciwgdHhuVHlwZTogVHJhbnNhY3Rpb25TdGF0dXNlcykge1xuICBpZiAoaXNFeHBhbmRlZERlc2NSb3codHhuUm93KSkge1xuICAgIGNvbnN0IGxhc3RUcmFuc2FjdGlvbiA9IHR4bnMucG9wKCk7XG4gICAgaWYgKGxhc3RUcmFuc2FjdGlvbikge1xuICAgICAgdHhucy5wdXNoKGVkaXRMYXN0VHJhbnNhY3Rpb25EZXNjKHR4blJvdywgbGFzdFRyYW5zYWN0aW9uKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW50ZXJuYWwgdW5pb24tYmFuayBlcnJvcicpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0eG5zLnB1c2goZXh0cmFjdFRyYW5zYWN0aW9uRGV0YWlscyh0eG5Sb3csIHR4bnNUYWJsZUhlYWRlcnMsIHR4blR5cGUpKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRUcmFuc2FjdGlvbnNUYWJsZUhlYWRlcnMocGFnZTogUGFnZSwgdGFibGVUeXBlSWQ6IHN0cmluZykge1xuICBjb25zdCBoZWFkZXJzTWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gW107XG4gIGNvbnN0IGhlYWRlcnNPYmpzID0gYXdhaXQgcGFnZUV2YWxBbGwocGFnZSwgYCNXb3JrU3BhY2VCb3ggIyR7dGFibGVUeXBlSWR9IHRyW2NsYXNzPSdoZWFkZXInXSB0aGAsIG51bGwsICh0aHMpID0+IHtcbiAgICByZXR1cm4gdGhzLm1hcCgodGgsIGluZGV4KSA9PiAoe1xuICAgICAgdGV4dDogKHRoIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQudHJpbSgpLFxuICAgICAgaW5kZXgsXG4gICAgfSkpO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IGhlYWRlck9iaiBvZiBoZWFkZXJzT2Jqcykge1xuICAgIGhlYWRlcnNNYXBbaGVhZGVyT2JqLnRleHRdID0gaGVhZGVyT2JqLmluZGV4O1xuICB9XG4gIHJldHVybiBoZWFkZXJzTWFwO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0VHJhbnNhY3Rpb25zRnJvbVRhYmxlKHBhZ2U6IFBhZ2UsIHRhYmxlVHlwZUlkOiBzdHJpbmcsIHR4blR5cGU6IFRyYW5zYWN0aW9uU3RhdHVzZXMpOiBQcm9taXNlPFNjcmFwZWRUcmFuc2FjdGlvbltdPiB7XG4gIGNvbnN0IHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdID0gW107XG4gIGNvbnN0IHRyYW5zYWN0aW9uc1RhYmxlSGVhZGVycyA9IGF3YWl0IGdldFRyYW5zYWN0aW9uc1RhYmxlSGVhZGVycyhwYWdlLCB0YWJsZVR5cGVJZCk7XG5cbiAgY29uc3QgdHJhbnNhY3Rpb25zUm93cyA9IGF3YWl0IHBhZ2VFdmFsQWxsPFRyYW5zYWN0aW9uc1RyW10+KHBhZ2UsIGAjV29ya1NwYWNlQm94ICMke3RhYmxlVHlwZUlkfSB0cltjbGFzc106bm90KFtjbGFzcz0naGVhZGVyJ10pYCwgW10sICh0cnMpID0+IHtcbiAgICByZXR1cm4gKHRycyBhcyBIVE1MRWxlbWVudFtdKS5tYXAoKHRyKSA9PiAoe1xuICAgICAgaWQ6ICh0cikuZ2V0QXR0cmlidXRlKCdpZCcpIHx8ICcnLFxuICAgICAgaW5uZXJUZHM6IEFycmF5LmZyb20odHIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RkJykpLm1hcCgodGQpID0+ICh0ZCBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0KSxcbiAgICB9KSk7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgdHhuUm93IG9mIHRyYW5zYWN0aW9uc1Jvd3MpIHtcbiAgICBoYW5kbGVUcmFuc2FjdGlvblJvdyh0eG5zLCB0cmFuc2FjdGlvbnNUYWJsZUhlYWRlcnMsIHR4blJvdywgdHhuVHlwZSk7XG4gIH1cbiAgcmV0dXJuIHR4bnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGlzTm9UcmFuc2FjdGlvbkluRGF0ZVJhbmdlRXJyb3IocGFnZTogUGFnZSkge1xuICBjb25zdCBoYXNFcnJvckluZm9FbGVtZW50ID0gYXdhaXQgZWxlbWVudFByZXNlbnRPblBhZ2UocGFnZSwgYC4ke0VSUk9SX01FU1NBR0VfQ0xBU1N9YCk7XG4gIGlmIChoYXNFcnJvckluZm9FbGVtZW50KSB7XG4gICAgY29uc3QgZXJyb3JUZXh0ID0gYXdhaXQgcGFnZS4kZXZhbChgLiR7RVJST1JfTUVTU0FHRV9DTEFTU31gLCAoZXJyb3JFbGVtZW50KSA9PiB7XG4gICAgICByZXR1cm4gKGVycm9yRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICAgIH0pO1xuICAgIHJldHVybiBlcnJvclRleHQudHJpbSgpID09PSBOT19UUkFOU0FDVElPTl9JTl9EQVRFX1JBTkdFX1RFWFQ7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjaG9vc2VBY2NvdW50KHBhZ2U6IFBhZ2UsIGFjY291bnRJZDogc3RyaW5nKSB7XG4gIGNvbnN0IGhhc0Ryb3BEb3duTGlzdCA9IGF3YWl0IGVsZW1lbnRQcmVzZW50T25QYWdlKHBhZ2UsIEFDQ09VTlRTX0RST1BET1dOX1NFTEVDVE9SKTtcbiAgaWYgKGhhc0Ryb3BEb3duTGlzdCkge1xuICAgIGF3YWl0IGRyb3Bkb3duU2VsZWN0KHBhZ2UsIEFDQ09VTlRTX0RST1BET1dOX1NFTEVDVE9SLCBhY2NvdW50SWQpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNlYXJjaEJ5RGF0ZXMocGFnZTogUGFnZSwgc3RhcnREYXRlOiBNb21lbnQpIHtcbiAgYXdhaXQgZHJvcGRvd25TZWxlY3QocGFnZSwgJ3NlbGVjdCNkZGxUcmFuc2FjdGlvblBlcmlvZCcsICcwMDQnKTtcbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICdzZWxlY3QjZGRsVHJhbnNhY3Rpb25QZXJpb2QnKTtcbiAgYXdhaXQgZmlsbElucHV0KFxuICAgIHBhZ2UsXG4gICAgJ2lucHV0I2R0RnJvbURhdGVfdGV4dEJveCcsXG4gICAgc3RhcnREYXRlLmZvcm1hdChEQVRFX0ZPUk1BVCksXG4gICk7XG4gIGF3YWl0IGNsaWNrQnV0dG9uKHBhZ2UsICdpbnB1dCNidG5EaXNwbGF5RGF0ZXMnKTtcbiAgYXdhaXQgd2FpdEZvck5hdmlnYXRpb24ocGFnZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFjY291bnROdW1iZXIocGFnZTogUGFnZSkge1xuICBjb25zdCBzZWxlY3RlZFNuaWZBY2NvdW50ID0gYXdhaXQgcGFnZS4kZXZhbCgnI2RkbEFjY291bnRzX21fZGRsIG9wdGlvbltzZWxlY3RlZD1cInNlbGVjdGVkXCJdJywgKG9wdGlvbikgPT4ge1xuICAgIHJldHVybiAob3B0aW9uIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gIH0pO1xuXG4gIHJldHVybiBzZWxlY3RlZFNuaWZBY2NvdW50LnJlcGxhY2UoJy8nLCAnXycpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleHBhbmRUcmFuc2FjdGlvbnNUYWJsZShwYWdlOiBQYWdlKSB7XG4gIGNvbnN0IGhhc0V4cGFuZEFsbEJ1dHRvbiA9IGF3YWl0IGVsZW1lbnRQcmVzZW50T25QYWdlKHBhZ2UsIFwiYVtpZCo9J2xua0N0bEV4cGFuZEFsbCddXCIpO1xuICBpZiAoaGFzRXhwYW5kQWxsQnV0dG9uKSB7XG4gICAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgXCJhW2lkKj0nbG5rQ3RsRXhwYW5kQWxsJ11cIik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2NyYXBlVHJhbnNhY3Rpb25zRnJvbVRhYmxlKHBhZ2U6IFBhZ2UpOiBQcm9taXNlPFRyYW5zYWN0aW9uW10+IHtcbiAgY29uc3QgcGVuZGluZ1R4bnMgPSBhd2FpdCBleHRyYWN0VHJhbnNhY3Rpb25zRnJvbVRhYmxlKHBhZ2UsIFBFTkRJTkdfVFJBTlNBQ1RJT05TX1RBQkxFX0lELFxuICAgIFRyYW5zYWN0aW9uU3RhdHVzZXMuUGVuZGluZyk7XG4gIGNvbnN0IGNvbXBsZXRlZFR4bnMgPSBhd2FpdCBleHRyYWN0VHJhbnNhY3Rpb25zRnJvbVRhYmxlKHBhZ2UsIENPTVBMRVRFRF9UUkFOU0FDVElPTlNfVEFCTEVfSUQsXG4gICAgVHJhbnNhY3Rpb25TdGF0dXNlcy5Db21wbGV0ZWQpO1xuICBjb25zdCB0eG5zID0gW1xuICAgIC4uLnBlbmRpbmdUeG5zLFxuICAgIC4uLmNvbXBsZXRlZFR4bnMsXG4gIF07XG4gIHJldHVybiBjb252ZXJ0VHJhbnNhY3Rpb25zKHR4bnMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBY2NvdW50VHJhbnNhY3Rpb25zKHBhZ2U6IFBhZ2UpOiBQcm9taXNlPFRyYW5zYWN0aW9uW10+IHtcbiAgYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgYCMke0NPTVBMRVRFRF9UUkFOU0FDVElPTlNfVEFCTEVfSUR9YCwgZmFsc2UpLFxuICAgIHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCBgLiR7RVJST1JfTUVTU0FHRV9DTEFTU31gLCBmYWxzZSksXG4gIF0pO1xuXG4gIGNvbnN0IG5vVHJhbnNhY3Rpb25JblJhbmdlRXJyb3IgPSBhd2FpdCBpc05vVHJhbnNhY3Rpb25JbkRhdGVSYW5nZUVycm9yKHBhZ2UpO1xuICBpZiAobm9UcmFuc2FjdGlvbkluUmFuZ2VFcnJvcikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGF3YWl0IGV4cGFuZFRyYW5zYWN0aW9uc1RhYmxlKHBhZ2UpO1xuICByZXR1cm4gc2NyYXBlVHJhbnNhY3Rpb25zRnJvbVRhYmxlKHBhZ2UpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFjY291bnREYXRhKHBhZ2U6IFBhZ2UsIHN0YXJ0RGF0ZTogTW9tZW50LCBhY2NvdW50SWQ6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb25zQWNjb3VudD4ge1xuICBhd2FpdCBjaG9vc2VBY2NvdW50KHBhZ2UsIGFjY291bnRJZCk7XG4gIGF3YWl0IHNlYXJjaEJ5RGF0ZXMocGFnZSwgc3RhcnREYXRlKTtcbiAgY29uc3QgYWNjb3VudE51bWJlciA9IGF3YWl0IGdldEFjY291bnROdW1iZXIocGFnZSk7XG4gIGNvbnN0IHR4bnMgPSBhd2FpdCBnZXRBY2NvdW50VHJhbnNhY3Rpb25zKHBhZ2UpO1xuICByZXR1cm4ge1xuICAgIGFjY291bnROdW1iZXIsXG4gICAgdHhucyxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBY2NvdW50cyhwYWdlOiBQYWdlLCBzdGFydERhdGU6IE1vbWVudCkge1xuICBjb25zdCBhY2NvdW50czogVHJhbnNhY3Rpb25zQWNjb3VudFtdID0gW107XG4gIGNvbnN0IGFjY291bnRzTGlzdCA9IGF3YWl0IGRyb3Bkb3duRWxlbWVudHMocGFnZSwgQUNDT1VOVFNfRFJPUERPV05fU0VMRUNUT1IpO1xuICBmb3IgKGNvbnN0IGFjY291bnQgb2YgYWNjb3VudHNMaXN0KSB7XG4gICAgaWYgKGFjY291bnQudmFsdWUgIT09ICctMScpIHsgLy8gU2tpcCBcIkFsbCBhY2NvdW50c1wiIG9wdGlvblxuICAgICAgY29uc3QgYWNjb3VudERhdGEgPSBhd2FpdCBmZXRjaEFjY291bnREYXRhKHBhZ2UsIHN0YXJ0RGF0ZSwgYWNjb3VudC52YWx1ZSk7XG4gICAgICBhY2NvdW50cy5wdXNoKGFjY291bnREYXRhKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFjY291bnRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yUG9zdExvZ2luKHBhZ2U6IFBhZ2UpIHtcbiAgcmV0dXJuIFByb21pc2UucmFjZShbXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcjc2lnbm9mZicsIHRydWUpLFxuICAgIHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnI3Jlc3RvcmUnLCB0cnVlKSxcbiAgXSk7XG59XG5cbnR5cGUgU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMgPSB7IHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcgfTtcblxuY2xhc3MgVW5pb25CYW5rU2NyYXBlciBleHRlbmRzIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXI8U2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHM+IHtcbiAgZ2V0TG9naW5PcHRpb25zKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscykge1xuICAgIHJldHVybiB7XG4gICAgICBsb2dpblVybDogYCR7QkFTRV9VUkx9YCxcbiAgICAgIGZpZWxkczogY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHMpLFxuICAgICAgc3VibWl0QnV0dG9uU2VsZWN0b3I6ICcjZW50ZXInLFxuICAgICAgcG9zdEFjdGlvbjogYXN5bmMgKCkgPT4gd2FpdEZvclBvc3RMb2dpbih0aGlzLnBhZ2UpLFxuICAgICAgcG9zc2libGVSZXN1bHRzOiBnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cygpLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBmZXRjaERhdGEoKSB7XG4gICAgY29uc3QgZGVmYXVsdFN0YXJ0TW9tZW50ID0gbW9tZW50KCkuc3VidHJhY3QoMSwgJ3llYXJzJykuYWRkKDEsICdkYXknKTtcbiAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLm9wdGlvbnMuc3RhcnREYXRlIHx8IGRlZmF1bHRTdGFydE1vbWVudC50b0RhdGUoKTtcbiAgICBjb25zdCBzdGFydE1vbWVudCA9IG1vbWVudC5tYXgoZGVmYXVsdFN0YXJ0TW9tZW50LCBtb21lbnQoc3RhcnREYXRlKSk7XG5cbiAgICBhd2FpdCB0aGlzLm5hdmlnYXRlVG8oVFJBTlNBQ1RJT05TX1VSTCk7XG5cbiAgICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IGZldGNoQWNjb3VudHModGhpcy5wYWdlLCBzdGFydE1vbWVudCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGFjY291bnRzLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVW5pb25CYW5rU2NyYXBlcjtcbiJdfQ==
248
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsIl9lbGVtZW50c0ludGVyYWN0aW9ucyIsIl9uYXZpZ2F0aW9uIiwiX2NvbnN0YW50cyIsIl90cmFuc2FjdGlvbnMiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIkJBU0VfVVJMIiwiVFJBTlNBQ1RJT05TX1VSTCIsIkRBVEVfRk9STUFUIiwiTk9fVFJBTlNBQ1RJT05fSU5fREFURV9SQU5HRV9URVhUIiwiREFURV9IRUFERVIiLCJERVNDUklQVElPTl9IRUFERVIiLCJSRUZFUkVOQ0VfSEVBREVSIiwiREVCSVRfSEVBREVSIiwiQ1JFRElUX0hFQURFUiIsIlBFTkRJTkdfVFJBTlNBQ1RJT05TX1RBQkxFX0lEIiwiQ09NUExFVEVEX1RSQU5TQUNUSU9OU19UQUJMRV9JRCIsIkVSUk9SX01FU1NBR0VfQ0xBU1MiLCJBQ0NPVU5UU19EUk9QRE9XTl9TRUxFQ1RPUiIsImdldFBvc3NpYmxlTG9naW5SZXN1bHRzIiwidXJscyIsIkxvZ2luUmVzdWx0cyIsIlN1Y2Nlc3MiLCJJbnZhbGlkUGFzc3dvcmQiLCJjcmVhdGVMb2dpbkZpZWxkcyIsImNyZWRlbnRpYWxzIiwic2VsZWN0b3IiLCJ2YWx1ZSIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJnZXRBbW91bnREYXRhIiwiYW1vdW50U3RyIiwiYW1vdW50U3RyQ29weSIsInJlcGxhY2UiLCJwYXJzZUZsb2F0IiwiZ2V0VHhuQW1vdW50IiwidHhuIiwiY3JlZGl0IiwiZGViaXQiLCJOdW1iZXIiLCJpc05hTiIsImNvbnZlcnRUcmFuc2FjdGlvbnMiLCJ0eG5zIiwibWFwIiwiY29udmVydGVkRGF0ZSIsIm1vbWVudCIsImRhdGUiLCJ0b0lTT1N0cmluZyIsImNvbnZlcnRlZEFtb3VudCIsInR5cGUiLCJUcmFuc2FjdGlvblR5cGVzIiwiTm9ybWFsIiwiaWRlbnRpZmllciIsInJlZmVyZW5jZSIsInBhcnNlSW50IiwidW5kZWZpbmVkIiwicHJvY2Vzc2VkRGF0ZSIsIm9yaWdpbmFsQW1vdW50Iiwib3JpZ2luYWxDdXJyZW5jeSIsIlNIRUtFTF9DVVJSRU5DWSIsImNoYXJnZWRBbW91bnQiLCJzdGF0dXMiLCJkZXNjcmlwdGlvbiIsIm1lbW8iLCJnZXRUcmFuc2FjdGlvbkRhdGUiLCJ0ZHMiLCJ0eG5zVGFibGVIZWFkZXJzIiwidHJpbSIsImdldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24iLCJnZXRUcmFuc2FjdGlvblJlZmVyZW5jZSIsImdldFRyYW5zYWN0aW9uRGViaXQiLCJnZXRUcmFuc2FjdGlvbkNyZWRpdCIsImV4dHJhY3RUcmFuc2FjdGlvbkRldGFpbHMiLCJ0eG5Sb3ciLCJ0eG5TdGF0dXMiLCJpbm5lclRkcyIsImlzRXhwYW5kZWREZXNjUm93IiwiaWQiLCJlZGl0TGFzdFRyYW5zYWN0aW9uRGVzYyIsImxhc3RUeG4iLCJoYW5kbGVUcmFuc2FjdGlvblJvdyIsInR4blR5cGUiLCJsYXN0VHJhbnNhY3Rpb24iLCJwb3AiLCJwdXNoIiwiRXJyb3IiLCJnZXRUcmFuc2FjdGlvbnNUYWJsZUhlYWRlcnMiLCJwYWdlIiwidGFibGVUeXBlSWQiLCJoZWFkZXJzTWFwIiwiaGVhZGVyc09ianMiLCJwYWdlRXZhbEFsbCIsInRocyIsInRoIiwiaW5kZXgiLCJ0ZXh0IiwiaW5uZXJUZXh0IiwiaGVhZGVyT2JqIiwiZXh0cmFjdFRyYW5zYWN0aW9uc0Zyb21UYWJsZSIsInRyYW5zYWN0aW9uc1RhYmxlSGVhZGVycyIsInRyYW5zYWN0aW9uc1Jvd3MiLCJ0cnMiLCJ0ciIsImdldEF0dHJpYnV0ZSIsIkFycmF5IiwiZnJvbSIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwidGQiLCJpc05vVHJhbnNhY3Rpb25JbkRhdGVSYW5nZUVycm9yIiwiaGFzRXJyb3JJbmZvRWxlbWVudCIsImVsZW1lbnRQcmVzZW50T25QYWdlIiwiZXJyb3JUZXh0IiwiJGV2YWwiLCJlcnJvckVsZW1lbnQiLCJjaG9vc2VBY2NvdW50IiwiYWNjb3VudElkIiwiaGFzRHJvcERvd25MaXN0IiwiZHJvcGRvd25TZWxlY3QiLCJzZWFyY2hCeURhdGVzIiwic3RhcnREYXRlIiwid2FpdFVudGlsRWxlbWVudEZvdW5kIiwiZmlsbElucHV0IiwiZm9ybWF0IiwiY2xpY2tCdXR0b24iLCJ3YWl0Rm9yTmF2aWdhdGlvbiIsImdldEFjY291bnROdW1iZXIiLCJzZWxlY3RlZFNuaWZBY2NvdW50Iiwib3B0aW9uIiwiZXhwYW5kVHJhbnNhY3Rpb25zVGFibGUiLCJoYXNFeHBhbmRBbGxCdXR0b24iLCJzY3JhcGVUcmFuc2FjdGlvbnNGcm9tVGFibGUiLCJwZW5kaW5nVHhucyIsIlRyYW5zYWN0aW9uU3RhdHVzZXMiLCJQZW5kaW5nIiwiY29tcGxldGVkVHhucyIsIkNvbXBsZXRlZCIsImdldEFjY291bnRUcmFuc2FjdGlvbnMiLCJQcm9taXNlIiwicmFjZSIsIm5vVHJhbnNhY3Rpb25JblJhbmdlRXJyb3IiLCJmZXRjaEFjY291bnREYXRhIiwiYWNjb3VudE51bWJlciIsImZldGNoQWNjb3VudHMiLCJhY2NvdW50cyIsImFjY291bnRzTGlzdCIsImRyb3Bkb3duRWxlbWVudHMiLCJhY2NvdW50IiwiYWNjb3VudERhdGEiLCJ3YWl0Rm9yUG9zdExvZ2luIiwiVW5pb25CYW5rU2NyYXBlciIsIkJhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJnZXRMb2dpbk9wdGlvbnMiLCJsb2dpblVybCIsImZpZWxkcyIsInN1Ym1pdEJ1dHRvblNlbGVjdG9yIiwicG9zdEFjdGlvbiIsInBvc3NpYmxlUmVzdWx0cyIsImZldGNoRGF0YSIsImRlZmF1bHRTdGFydE1vbWVudCIsInN1YnRyYWN0IiwiYWRkIiwib3B0aW9ucyIsInRvRGF0ZSIsInN0YXJ0TW9tZW50IiwibWF4IiwibmF2aWdhdGVUbyIsInN1Y2Nlc3MiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyYXBlcnMvdW5pb24tYmFuay50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50LCB7IE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBQYWdlIH0gZnJvbSAncHVwcGV0ZWVyJztcbmltcG9ydCB7IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIsIExvZ2luUmVzdWx0cywgUG9zc2libGVMb2dpblJlc3VsdHMgfSBmcm9tICcuL2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXInO1xuaW1wb3J0IHtcbiAgZHJvcGRvd25TZWxlY3QsXG4gIGRyb3Bkb3duRWxlbWVudHMsXG4gIGZpbGxJbnB1dCxcbiAgY2xpY2tCdXR0b24sXG4gIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCxcbiAgcGFnZUV2YWxBbGwsXG4gIGVsZW1lbnRQcmVzZW50T25QYWdlLFxufSBmcm9tICcuLi9oZWxwZXJzL2VsZW1lbnRzLWludGVyYWN0aW9ucyc7XG5pbXBvcnQgeyB3YWl0Rm9yTmF2aWdhdGlvbiB9IGZyb20gJy4uL2hlbHBlcnMvbmF2aWdhdGlvbic7XG5pbXBvcnQgeyBTSEVLRUxfQ1VSUkVOQ1kgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgVHJhbnNhY3Rpb25zQWNjb3VudCwgVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uU3RhdHVzZXMsXG4gIFRyYW5zYWN0aW9uVHlwZXMsXG59IGZyb20gJy4uL3RyYW5zYWN0aW9ucyc7XG5cbmNvbnN0IEJBU0VfVVJMID0gJ2h0dHBzOi8vaGIudW5pb25iYW5rLmNvLmlsJztcbmNvbnN0IFRSQU5TQUNUSU9OU19VUkwgPSBgJHtCQVNFX1VSTH0vZUJhbmtpbmcvQWNjb3VudHMvRXh0ZW5kZWRBY3Rpdml0eS5hc3B4Iy9gO1xuY29uc3QgREFURV9GT1JNQVQgPSAnREQvTU0vWVknO1xuY29uc3QgTk9fVFJBTlNBQ1RJT05fSU5fREFURV9SQU5HRV9URVhUID0gJ9ec15Ag16fXmdeZ157XldeqINeq16DXldei15XXqiDXnteq15DXmdee15XXqiDXotecINek15kg15TXodeZ16DXldefINep15TXldeS15PXqCc7XG5jb25zdCBEQVRFX0hFQURFUiA9ICfXqteQ16jXmdeaJztcbmNvbnN0IERFU0NSSVBUSU9OX0hFQURFUiA9ICfXqteZ15DXldeoJztcbmNvbnN0IFJFRkVSRU5DRV9IRUFERVIgPSAn15DXodee15vXqteQJztcbmNvbnN0IERFQklUX0hFQURFUiA9ICfXl9eV15HXlCc7XG5jb25zdCBDUkVESVRfSEVBREVSID0gJ9eW15vXldeqJztcbmNvbnN0IFBFTkRJTkdfVFJBTlNBQ1RJT05TX1RBQkxFX0lEID0gJ3RyVG9kYXlBY3Rpdml0eU5hcGFUYWJsZVVwcGVyJztcbmNvbnN0IENPTVBMRVRFRF9UUkFOU0FDVElPTlNfVEFCTEVfSUQgPSAnY3RsQWN0aXZpdHlUYWJsZSc7XG5jb25zdCBFUlJPUl9NRVNTQUdFX0NMQVNTID0gJ2VyckluZm8nO1xuY29uc3QgQUNDT1VOVFNfRFJPUERPV05fU0VMRUNUT1IgPSAnc2VsZWN0I2RkbEFjY291bnRzX21fZGRsJztcblxuZnVuY3Rpb24gZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKSB7XG4gIGNvbnN0IHVybHM6IFBvc3NpYmxlTG9naW5SZXN1bHRzID0ge307XG4gIHVybHNbTG9naW5SZXN1bHRzLlN1Y2Nlc3NdID0gWy9lQmFua2luZ1xcL0FjY291bnRzL107XG4gIHVybHNbTG9naW5SZXN1bHRzLkludmFsaWRQYXNzd29yZF0gPSBbL0ludGVybmFsU2l0ZVxcL0N1c3RvbVVwZGF0ZVxcL2xldW1pXFwvTG9naW5QYWdlLkFTUC9dO1xuICByZXR1cm4gdXJscztcbn1cblxuZnVuY3Rpb24gY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHM6IFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzKSB7XG4gIHJldHVybiBbXG4gICAgeyBzZWxlY3RvcjogJyN1aWQnLCB2YWx1ZTogY3JlZGVudGlhbHMudXNlcm5hbWUgfSxcbiAgICB7IHNlbGVjdG9yOiAnI3Bhc3N3b3JkJywgdmFsdWU6IGNyZWRlbnRpYWxzLnBhc3N3b3JkIH0sXG4gIF07XG59XG5cbmZ1bmN0aW9uIGdldEFtb3VudERhdGEoYW1vdW50U3RyOiBzdHJpbmcpIHtcbiAgY29uc3QgYW1vdW50U3RyQ29weSA9IGFtb3VudFN0ci5yZXBsYWNlKCcsJywgJycpO1xuICByZXR1cm4gcGFyc2VGbG9hdChhbW91bnRTdHJDb3B5KTtcbn1cblxuaW50ZXJmYWNlIFNjcmFwZWRUcmFuc2FjdGlvbiB7XG4gIGNyZWRpdDogc3RyaW5nO1xuICBkZWJpdDogc3RyaW5nO1xuICBkYXRlOiBzdHJpbmc7XG4gIHJlZmVyZW5jZT86IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgbWVtbzogc3RyaW5nO1xuICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzZXM7XG59XG5cbmZ1bmN0aW9uIGdldFR4bkFtb3VudCh0eG46IFNjcmFwZWRUcmFuc2FjdGlvbikge1xuICBjb25zdCBjcmVkaXQgPSBnZXRBbW91bnREYXRhKHR4bi5jcmVkaXQpO1xuICBjb25zdCBkZWJpdCA9IGdldEFtb3VudERhdGEodHhuLmRlYml0KTtcbiAgcmV0dXJuIChOdW1iZXIuaXNOYU4oY3JlZGl0KSA/IDAgOiBjcmVkaXQpIC0gKE51bWJlci5pc05hTihkZWJpdCkgPyAwIDogZGViaXQpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VHJhbnNhY3Rpb25zKHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdKTogVHJhbnNhY3Rpb25bXSB7XG4gIHJldHVybiB0eG5zLm1hcCgodHhuKSA9PiB7XG4gICAgY29uc3QgY29udmVydGVkRGF0ZSA9IG1vbWVudCh0eG4uZGF0ZSwgREFURV9GT1JNQVQpLnRvSVNPU3RyaW5nKCk7XG4gICAgY29uc3QgY29udmVydGVkQW1vdW50ID0gZ2V0VHhuQW1vdW50KHR4bik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZXMuTm9ybWFsLFxuICAgICAgaWRlbnRpZmllcjogdHhuLnJlZmVyZW5jZSA/IHBhcnNlSW50KHR4bi5yZWZlcmVuY2UsIDEwKSA6IHVuZGVmaW5lZCxcbiAgICAgIGRhdGU6IGNvbnZlcnRlZERhdGUsXG4gICAgICBwcm9jZXNzZWREYXRlOiBjb252ZXJ0ZWREYXRlLFxuICAgICAgb3JpZ2luYWxBbW91bnQ6IGNvbnZlcnRlZEFtb3VudCxcbiAgICAgIG9yaWdpbmFsQ3VycmVuY3k6IFNIRUtFTF9DVVJSRU5DWSxcbiAgICAgIGNoYXJnZWRBbW91bnQ6IGNvbnZlcnRlZEFtb3VudCxcbiAgICAgIHN0YXR1czogdHhuLnN0YXR1cyxcbiAgICAgIGRlc2NyaXB0aW9uOiB0eG4uZGVzY3JpcHRpb24sXG4gICAgICBtZW1vOiB0eG4ubWVtbyxcbiAgICB9O1xuICB9KTtcbn1cblxudHlwZSBUcmFuc2FjdGlvbnNUciA9IHsgaWQ6IHN0cmluZywgaW5uZXJUZHM6IFRyYW5zYWN0aW9uc1RyVGRzIH07XG50eXBlIFRyYW5zYWN0aW9uVGFibGVIZWFkZXJzID0gUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbnR5cGUgVHJhbnNhY3Rpb25zVHJUZHMgPSBzdHJpbmdbXTtcblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25EYXRlKHRkczogVHJhbnNhY3Rpb25zVHJUZHMsIHR4bnNUYWJsZUhlYWRlcnM6IFRyYW5zYWN0aW9uVGFibGVIZWFkZXJzKSB7XG4gIHJldHVybiAodGRzW3R4bnNUYWJsZUhlYWRlcnNbREFURV9IRUFERVJdXSB8fCAnJykudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uKHRkczogVHJhbnNhY3Rpb25zVHJUZHMsIHR4bnNUYWJsZUhlYWRlcnM6IFRyYW5zYWN0aW9uVGFibGVIZWFkZXJzKSB7XG4gIHJldHVybiAodGRzW3R4bnNUYWJsZUhlYWRlcnNbREVTQ1JJUFRJT05fSEVBREVSXV0gfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25SZWZlcmVuY2UodGRzOiBUcmFuc2FjdGlvbnNUclRkcywgdHhuc1RhYmxlSGVhZGVyczogVHJhbnNhY3Rpb25UYWJsZUhlYWRlcnMpIHtcbiAgcmV0dXJuICh0ZHNbdHhuc1RhYmxlSGVhZGVyc1tSRUZFUkVOQ0VfSEVBREVSXV0gfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25EZWJpdCh0ZHM6IFRyYW5zYWN0aW9uc1RyVGRzLCB0eG5zVGFibGVIZWFkZXJzOiBUcmFuc2FjdGlvblRhYmxlSGVhZGVycykge1xuICByZXR1cm4gKHRkc1t0eG5zVGFibGVIZWFkZXJzW0RFQklUX0hFQURFUl1dIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uQ3JlZGl0KHRkczogVHJhbnNhY3Rpb25zVHJUZHMsIHR4bnNUYWJsZUhlYWRlcnM6IFRyYW5zYWN0aW9uVGFibGVIZWFkZXJzKSB7XG4gIHJldHVybiAodGRzW3R4bnNUYWJsZUhlYWRlcnNbQ1JFRElUX0hFQURFUl1dIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RUcmFuc2FjdGlvbkRldGFpbHModHhuUm93OiBUcmFuc2FjdGlvbnNUciwgdHhuc1RhYmxlSGVhZGVyczogVHJhbnNhY3Rpb25UYWJsZUhlYWRlcnMsIHR4blN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcyk6IFNjcmFwZWRUcmFuc2FjdGlvbiB7XG4gIGNvbnN0IHRkcyA9IHR4blJvdy5pbm5lclRkcztcbiAgcmV0dXJuIHtcbiAgICBzdGF0dXM6IHR4blN0YXR1cyxcbiAgICBkYXRlOiBnZXRUcmFuc2FjdGlvbkRhdGUodGRzLCB0eG5zVGFibGVIZWFkZXJzKSxcbiAgICBkZXNjcmlwdGlvbjogZ2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbih0ZHMsIHR4bnNUYWJsZUhlYWRlcnMpLFxuICAgIHJlZmVyZW5jZTogZ2V0VHJhbnNhY3Rpb25SZWZlcmVuY2UodGRzLCB0eG5zVGFibGVIZWFkZXJzKSxcbiAgICBkZWJpdDogZ2V0VHJhbnNhY3Rpb25EZWJpdCh0ZHMsIHR4bnNUYWJsZUhlYWRlcnMpLFxuICAgIGNyZWRpdDogZ2V0VHJhbnNhY3Rpb25DcmVkaXQodGRzLCB0eG5zVGFibGVIZWFkZXJzKSxcbiAgICBtZW1vOiAnJyxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNFeHBhbmRlZERlc2NSb3codHhuUm93OiBUcmFuc2FjdGlvbnNUcikge1xuICByZXR1cm4gdHhuUm93LmlkID09PSAncm93QWRkZWQnO1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuZnVuY3Rpb24gZWRpdExhc3RUcmFuc2FjdGlvbkRlc2ModHhuUm93OiBUcmFuc2FjdGlvbnNUciwgbGFzdFR4bjogU2NyYXBlZFRyYW5zYWN0aW9uKTogU2NyYXBlZFRyYW5zYWN0aW9uIHtcbiAgbGFzdFR4bi5kZXNjcmlwdGlvbiA9IGAke2xhc3RUeG4uZGVzY3JpcHRpb259ICR7dHhuUm93LmlubmVyVGRzWzBdfWA7XG4gIHJldHVybiBsYXN0VHhuO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVUcmFuc2FjdGlvblJvdyh0eG5zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXSwgdHhuc1RhYmxlSGVhZGVyczogVHJhbnNhY3Rpb25UYWJsZUhlYWRlcnMsIHR4blJvdzogVHJhbnNhY3Rpb25zVHIsIHR4blR5cGU6IFRyYW5zYWN0aW9uU3RhdHVzZXMpIHtcbiAgaWYgKGlzRXhwYW5kZWREZXNjUm93KHR4blJvdykpIHtcbiAgICBjb25zdCBsYXN0VHJhbnNhY3Rpb24gPSB0eG5zLnBvcCgpO1xuICAgIGlmIChsYXN0VHJhbnNhY3Rpb24pIHtcbiAgICAgIHR4bnMucHVzaChlZGl0TGFzdFRyYW5zYWN0aW9uRGVzYyh0eG5Sb3csIGxhc3RUcmFuc2FjdGlvbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIHVuaW9uLWJhbmsgZXJyb3InKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdHhucy5wdXNoKGV4dHJhY3RUcmFuc2FjdGlvbkRldGFpbHModHhuUm93LCB0eG5zVGFibGVIZWFkZXJzLCB0eG5UeXBlKSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25zVGFibGVIZWFkZXJzKHBhZ2U6IFBhZ2UsIHRhYmxlVHlwZUlkOiBzdHJpbmcpIHtcbiAgY29uc3QgaGVhZGVyc01hcDogUmVjb3JkPHN0cmluZywgYW55PiA9IFtdO1xuICBjb25zdCBoZWFkZXJzT2JqcyA9IGF3YWl0IHBhZ2VFdmFsQWxsKHBhZ2UsIGAjV29ya1NwYWNlQm94ICMke3RhYmxlVHlwZUlkfSB0cltjbGFzcz0naGVhZGVyJ10gdGhgLCBudWxsLCAodGhzKSA9PiB7XG4gICAgcmV0dXJuIHRocy5tYXAoKHRoLCBpbmRleCkgPT4gKHtcbiAgICAgIHRleHQ6ICh0aCBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0LnRyaW0oKSxcbiAgICAgIGluZGV4LFxuICAgIH0pKTtcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBoZWFkZXJPYmogb2YgaGVhZGVyc09ianMpIHtcbiAgICBoZWFkZXJzTWFwW2hlYWRlck9iai50ZXh0XSA9IGhlYWRlck9iai5pbmRleDtcbiAgfVxuICByZXR1cm4gaGVhZGVyc01hcDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXh0cmFjdFRyYW5zYWN0aW9uc0Zyb21UYWJsZShwYWdlOiBQYWdlLCB0YWJsZVR5cGVJZDogc3RyaW5nLCB0eG5UeXBlOiBUcmFuc2FjdGlvblN0YXR1c2VzKTogUHJvbWlzZTxTY3JhcGVkVHJhbnNhY3Rpb25bXT4ge1xuICBjb25zdCB0eG5zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXSA9IFtdO1xuICBjb25zdCB0cmFuc2FjdGlvbnNUYWJsZUhlYWRlcnMgPSBhd2FpdCBnZXRUcmFuc2FjdGlvbnNUYWJsZUhlYWRlcnMocGFnZSwgdGFibGVUeXBlSWQpO1xuXG4gIGNvbnN0IHRyYW5zYWN0aW9uc1Jvd3MgPSBhd2FpdCBwYWdlRXZhbEFsbDxUcmFuc2FjdGlvbnNUcltdPihwYWdlLCBgI1dvcmtTcGFjZUJveCAjJHt0YWJsZVR5cGVJZH0gdHJbY2xhc3NdOm5vdChbY2xhc3M9J2hlYWRlciddKWAsIFtdLCAodHJzKSA9PiB7XG4gICAgcmV0dXJuICh0cnMgYXMgSFRNTEVsZW1lbnRbXSkubWFwKCh0cikgPT4gKHtcbiAgICAgIGlkOiAodHIpLmdldEF0dHJpYnV0ZSgnaWQnKSB8fCAnJyxcbiAgICAgIGlubmVyVGRzOiBBcnJheS5mcm9tKHRyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0ZCcpKS5tYXAoKHRkKSA9PiAodGQgYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dCksXG4gICAgfSkpO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IHR4blJvdyBvZiB0cmFuc2FjdGlvbnNSb3dzKSB7XG4gICAgaGFuZGxlVHJhbnNhY3Rpb25Sb3codHhucywgdHJhbnNhY3Rpb25zVGFibGVIZWFkZXJzLCB0eG5Sb3csIHR4blR5cGUpO1xuICB9XG4gIHJldHVybiB0eG5zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpc05vVHJhbnNhY3Rpb25JbkRhdGVSYW5nZUVycm9yKHBhZ2U6IFBhZ2UpIHtcbiAgY29uc3QgaGFzRXJyb3JJbmZvRWxlbWVudCA9IGF3YWl0IGVsZW1lbnRQcmVzZW50T25QYWdlKHBhZ2UsIGAuJHtFUlJPUl9NRVNTQUdFX0NMQVNTfWApO1xuICBpZiAoaGFzRXJyb3JJbmZvRWxlbWVudCkge1xuICAgIGNvbnN0IGVycm9yVGV4dCA9IGF3YWl0IHBhZ2UuJGV2YWwoYC4ke0VSUk9SX01FU1NBR0VfQ0xBU1N9YCwgKGVycm9yRWxlbWVudCkgPT4ge1xuICAgICAgcmV0dXJuIChlcnJvckVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dDtcbiAgICB9KTtcbiAgICByZXR1cm4gZXJyb3JUZXh0LnRyaW0oKSA9PT0gTk9fVFJBTlNBQ1RJT05fSU5fREFURV9SQU5HRV9URVhUO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2hvb3NlQWNjb3VudChwYWdlOiBQYWdlLCBhY2NvdW50SWQ6IHN0cmluZykge1xuICBjb25zdCBoYXNEcm9wRG93bkxpc3QgPSBhd2FpdCBlbGVtZW50UHJlc2VudE9uUGFnZShwYWdlLCBBQ0NPVU5UU19EUk9QRE9XTl9TRUxFQ1RPUik7XG4gIGlmIChoYXNEcm9wRG93bkxpc3QpIHtcbiAgICBhd2FpdCBkcm9wZG93blNlbGVjdChwYWdlLCBBQ0NPVU5UU19EUk9QRE9XTl9TRUxFQ1RPUiwgYWNjb3VudElkKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzZWFyY2hCeURhdGVzKHBhZ2U6IFBhZ2UsIHN0YXJ0RGF0ZTogTW9tZW50KSB7XG4gIGF3YWl0IGRyb3Bkb3duU2VsZWN0KHBhZ2UsICdzZWxlY3QjZGRsVHJhbnNhY3Rpb25QZXJpb2QnLCAnMDA0Jyk7XG4gIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnc2VsZWN0I2RkbFRyYW5zYWN0aW9uUGVyaW9kJyk7XG4gIGF3YWl0IGZpbGxJbnB1dChcbiAgICBwYWdlLFxuICAgICdpbnB1dCNkdEZyb21EYXRlX3RleHRCb3gnLFxuICAgIHN0YXJ0RGF0ZS5mb3JtYXQoREFURV9GT1JNQVQpLFxuICApO1xuICBhd2FpdCBjbGlja0J1dHRvbihwYWdlLCAnaW5wdXQjYnRuRGlzcGxheURhdGVzJyk7XG4gIGF3YWl0IHdhaXRGb3JOYXZpZ2F0aW9uKHBhZ2UpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBY2NvdW50TnVtYmVyKHBhZ2U6IFBhZ2UpIHtcbiAgY29uc3Qgc2VsZWN0ZWRTbmlmQWNjb3VudCA9IGF3YWl0IHBhZ2UuJGV2YWwoJyNkZGxBY2NvdW50c19tX2RkbCBvcHRpb25bc2VsZWN0ZWQ9XCJzZWxlY3RlZFwiXScsIChvcHRpb24pID0+IHtcbiAgICByZXR1cm4gKG9wdGlvbiBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICB9KTtcblxuICByZXR1cm4gc2VsZWN0ZWRTbmlmQWNjb3VudC5yZXBsYWNlKCcvJywgJ18nKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhwYW5kVHJhbnNhY3Rpb25zVGFibGUocGFnZTogUGFnZSkge1xuICBjb25zdCBoYXNFeHBhbmRBbGxCdXR0b24gPSBhd2FpdCBlbGVtZW50UHJlc2VudE9uUGFnZShwYWdlLCBcImFbaWQqPSdsbmtDdGxFeHBhbmRBbGwnXVwiKTtcbiAgaWYgKGhhc0V4cGFuZEFsbEJ1dHRvbikge1xuICAgIGF3YWl0IGNsaWNrQnV0dG9uKHBhZ2UsIFwiYVtpZCo9J2xua0N0bEV4cGFuZEFsbCddXCIpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjcmFwZVRyYW5zYWN0aW9uc0Zyb21UYWJsZShwYWdlOiBQYWdlKTogUHJvbWlzZTxUcmFuc2FjdGlvbltdPiB7XG4gIGNvbnN0IHBlbmRpbmdUeG5zID0gYXdhaXQgZXh0cmFjdFRyYW5zYWN0aW9uc0Zyb21UYWJsZShwYWdlLCBQRU5ESU5HX1RSQU5TQUNUSU9OU19UQUJMRV9JRCxcbiAgICBUcmFuc2FjdGlvblN0YXR1c2VzLlBlbmRpbmcpO1xuICBjb25zdCBjb21wbGV0ZWRUeG5zID0gYXdhaXQgZXh0cmFjdFRyYW5zYWN0aW9uc0Zyb21UYWJsZShwYWdlLCBDT01QTEVURURfVFJBTlNBQ1RJT05TX1RBQkxFX0lELFxuICAgIFRyYW5zYWN0aW9uU3RhdHVzZXMuQ29tcGxldGVkKTtcbiAgY29uc3QgdHhucyA9IFtcbiAgICAuLi5wZW5kaW5nVHhucyxcbiAgICAuLi5jb21wbGV0ZWRUeG5zLFxuICBdO1xuICByZXR1cm4gY29udmVydFRyYW5zYWN0aW9ucyh0eG5zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWNjb3VudFRyYW5zYWN0aW9ucyhwYWdlOiBQYWdlKTogUHJvbWlzZTxUcmFuc2FjdGlvbltdPiB7XG4gIGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsIGAjJHtDT01QTEVURURfVFJBTlNBQ1RJT05TX1RBQkxFX0lEfWAsIGZhbHNlKSxcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgYC4ke0VSUk9SX01FU1NBR0VfQ0xBU1N9YCwgZmFsc2UpLFxuICBdKTtcblxuICBjb25zdCBub1RyYW5zYWN0aW9uSW5SYW5nZUVycm9yID0gYXdhaXQgaXNOb1RyYW5zYWN0aW9uSW5EYXRlUmFuZ2VFcnJvcihwYWdlKTtcbiAgaWYgKG5vVHJhbnNhY3Rpb25JblJhbmdlRXJyb3IpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBhd2FpdCBleHBhbmRUcmFuc2FjdGlvbnNUYWJsZShwYWdlKTtcbiAgcmV0dXJuIHNjcmFwZVRyYW5zYWN0aW9uc0Zyb21UYWJsZShwYWdlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBY2NvdW50RGF0YShwYWdlOiBQYWdlLCBzdGFydERhdGU6IE1vbWVudCwgYWNjb3VudElkOiBzdHJpbmcpOiBQcm9taXNlPFRyYW5zYWN0aW9uc0FjY291bnQ+IHtcbiAgYXdhaXQgY2hvb3NlQWNjb3VudChwYWdlLCBhY2NvdW50SWQpO1xuICBhd2FpdCBzZWFyY2hCeURhdGVzKHBhZ2UsIHN0YXJ0RGF0ZSk7XG4gIGNvbnN0IGFjY291bnROdW1iZXIgPSBhd2FpdCBnZXRBY2NvdW50TnVtYmVyKHBhZ2UpO1xuICBjb25zdCB0eG5zID0gYXdhaXQgZ2V0QWNjb3VudFRyYW5zYWN0aW9ucyhwYWdlKTtcbiAgcmV0dXJuIHtcbiAgICBhY2NvdW50TnVtYmVyLFxuICAgIHR4bnMsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQWNjb3VudHMocGFnZTogUGFnZSwgc3RhcnREYXRlOiBNb21lbnQpIHtcbiAgY29uc3QgYWNjb3VudHM6IFRyYW5zYWN0aW9uc0FjY291bnRbXSA9IFtdO1xuICBjb25zdCBhY2NvdW50c0xpc3QgPSBhd2FpdCBkcm9wZG93bkVsZW1lbnRzKHBhZ2UsIEFDQ09VTlRTX0RST1BET1dOX1NFTEVDVE9SKTtcbiAgZm9yIChjb25zdCBhY2NvdW50IG9mIGFjY291bnRzTGlzdCkge1xuICAgIGlmIChhY2NvdW50LnZhbHVlICE9PSAnLTEnKSB7IC8vIFNraXAgXCJBbGwgYWNjb3VudHNcIiBvcHRpb25cbiAgICAgIGNvbnN0IGFjY291bnREYXRhID0gYXdhaXQgZmV0Y2hBY2NvdW50RGF0YShwYWdlLCBzdGFydERhdGUsIGFjY291bnQudmFsdWUpO1xuICAgICAgYWNjb3VudHMucHVzaChhY2NvdW50RGF0YSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBhY2NvdW50cztcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvclBvc3RMb2dpbihwYWdlOiBQYWdlKSB7XG4gIHJldHVybiBQcm9taXNlLnJhY2UoW1xuICAgIHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnI3NpZ25vZmYnLCB0cnVlKSxcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJyNyZXN0b3JlJywgdHJ1ZSksXG4gIF0pO1xufVxuXG50eXBlIFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzID0geyB1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nIH07XG5cbmNsYXNzIFVuaW9uQmFua1NjcmFwZXIgZXh0ZW5kcyBCYXNlU2NyYXBlcldpdGhCcm93c2VyPFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzPiB7XG4gIGdldExvZ2luT3B0aW9ucyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9naW5Vcmw6IGAke0JBU0VfVVJMfWAsXG4gICAgICBmaWVsZHM6IGNyZWF0ZUxvZ2luRmllbGRzKGNyZWRlbnRpYWxzKSxcbiAgICAgIHN1Ym1pdEJ1dHRvblNlbGVjdG9yOiAnI2VudGVyJyxcbiAgICAgIHBvc3RBY3Rpb246IGFzeW5jICgpID0+IHdhaXRGb3JQb3N0TG9naW4odGhpcy5wYWdlKSxcbiAgICAgIHBvc3NpYmxlUmVzdWx0czogZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCkge1xuICAgIGNvbnN0IGRlZmF1bHRTdGFydE1vbWVudCA9IG1vbWVudCgpLnN1YnRyYWN0KDEsICd5ZWFycycpLmFkZCgxLCAnZGF5Jyk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5vcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnQgPSBtb21lbnQubWF4KGRlZmF1bHRTdGFydE1vbWVudCwgbW9tZW50KHN0YXJ0RGF0ZSkpO1xuXG4gICAgYXdhaXQgdGhpcy5uYXZpZ2F0ZVRvKFRSQU5TQUNUSU9OU19VUkwpO1xuXG4gICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBmZXRjaEFjY291bnRzKHRoaXMucGFnZSwgc3RhcnRNb21lbnQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhY2NvdW50cyxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVuaW9uQmFua1NjcmFwZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsdUJBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLHFCQUFBLEdBQUFGLE9BQUE7QUFTQSxJQUFBRyxXQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxVQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxhQUFBLEdBQUFMLE9BQUE7QUFHeUIsU0FBQUQsdUJBQUFPLEdBQUEsV0FBQUEsR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsR0FBQUQsR0FBQSxLQUFBRSxPQUFBLEVBQUFGLEdBQUE7QUFFekIsTUFBTUcsUUFBUSxHQUFHLDRCQUE0QjtBQUM3QyxNQUFNQyxnQkFBZ0IsR0FBSSxHQUFFRCxRQUFTLDRDQUEyQztBQUNoRixNQUFNRSxXQUFXLEdBQUcsVUFBVTtBQUM5QixNQUFNQyxpQ0FBaUMsR0FBRyw4Q0FBOEM7QUFDeEYsTUFBTUMsV0FBVyxHQUFHLE9BQU87QUFDM0IsTUFBTUMsa0JBQWtCLEdBQUcsT0FBTztBQUNsQyxNQUFNQyxnQkFBZ0IsR0FBRyxRQUFRO0FB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
@@ -1,27 +1,16 @@
1
1
  "use strict";
2
2
 
3
3
  require("core-js/modules/es.promise");
4
-
5
4
  require("core-js/modules/es.string.trim");
6
-
7
5
  var _unionBank = _interopRequireDefault(require("./union-bank"));
8
-
9
6
  var _testsUtils = require("../tests/tests-utils");
10
-
11
7
  var _definitions = require("../definitions");
12
-
13
8
  var _baseScraperWithBrowser = require("./base-scraper-with-browser");
14
-
15
9
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
-
17
10
  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
11
  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
12
  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
13
  const COMPANY_ID = 'union'; // TODO this property should be hard-coded in the provider
24
-
25
14
  const testsConfig = (0, _testsUtils.getTestsConfig)();
26
15
  describe('Union', () => {
27
16
  beforeAll(() => {
@@ -36,7 +25,6 @@ describe('Union', () => {
36
25
  const options = _objectSpread({}, testsConfig.options, {
37
26
  companyId: COMPANY_ID
38
27
  });
39
-
40
28
  const scraper = new _unionBank.default(options);
41
29
  const result = await scraper.scrape({
42
30
  username: 'e10s12',
@@ -50,7 +38,6 @@ describe('Union', () => {
50
38
  const options = _objectSpread({}, testsConfig.options, {
51
39
  companyId: COMPANY_ID
52
40
  });
53
-
54
41
  const scraper = new _unionBank.default(options);
55
42
  const result = await scraper.scrape(testsConfig.credentials.union);
56
43
  expect(result).toBeDefined();
@@ -60,4 +47,4 @@ describe('Union', () => {
60
47
  (0, _testsUtils.exportTransactions)(COMPANY_ID, result.accounts || []);
61
48
  });
62
49
  });
63
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy91bmlvbi1iYW5rLnRlc3QudHMiXSwibmFtZXMiOlsiQ09NUEFOWV9JRCIsInRlc3RzQ29uZmlnIiwiZGVzY3JpYmUiLCJiZWZvcmVBbGwiLCJ0ZXN0IiwiZXhwZWN0IiwiU0NSQVBFUlMiLCJ1bmlvbiIsInRvQmVEZWZpbmVkIiwibG9naW5GaWVsZHMiLCJ0b0NvbnRhaW4iLCJjb25maWciLCJjb21wYW55QVBJIiwiaW52YWxpZFBhc3N3b3JkIiwib3B0aW9ucyIsImNvbXBhbnlJZCIsInNjcmFwZXIiLCJVbmlvbkJhbmtTY3JhcGVyIiwicmVzdWx0Iiwic2NyYXBlIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsInN1Y2Nlc3MiLCJ0b0JlRmFsc3kiLCJlcnJvclR5cGUiLCJ0b0JlIiwiTG9naW5SZXN1bHRzIiwiSW52YWxpZFBhc3N3b3JkIiwiY3JlZGVudGlhbHMiLCJlcnJvciIsImVycm9yTWVzc2FnZSIsInRyaW0iLCJ0b0JlVHJ1dGh5IiwiYWNjb3VudHMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOztBQUdBOztBQUNBOzs7Ozs7Ozs7O0FBRUEsTUFBTUEsVUFBVSxHQUFHLE9BQW5CLEMsQ0FBNEI7O0FBQzVCLE1BQU1DLFdBQVcsR0FBRyxpQ0FBcEI7QUFFQUMsUUFBUSxDQUFDLE9BQUQsRUFBVSxNQUFNO0FBQ3RCQyxFQUFBQSxTQUFTLENBQUMsTUFBTTtBQUNkLDBDQURjLENBQ1E7QUFDdkIsR0FGUSxDQUFUO0FBSUFDLEVBQUFBLElBQUksQ0FBQyxpREFBRCxFQUFvRCxNQUFNO0FBQzVEQyxJQUFBQSxNQUFNLENBQUNDLHNCQUFTQyxLQUFWLENBQU4sQ0FBdUJDLFdBQXZCO0FBQ0FILElBQUFBLE1BQU0sQ0FBQ0Msc0JBQVNDLEtBQVQsQ0FBZUUsV0FBaEIsQ0FBTixDQUFtQ0MsU0FBbkMsQ0FBNkMsVUFBN0M7QUFDQUwsSUFBQUEsTUFBTSxDQUFDQyxzQkFBU0MsS0FBVCxDQUFlRSxXQUFoQixDQUFOLENBQW1DQyxTQUFuQyxDQUE2QyxVQUE3QztBQUNELEdBSkcsQ0FBSjtBQU1BLHVDQUFvQlYsVUFBcEIsRUFBaUNXLE1BQUQsSUFBWUEsTUFBTSxDQUFDQyxVQUFQLENBQWtCQyxlQUE5RCxFQUErRSx1Q0FBL0UsRUFBd0gsWUFBWTtBQUNsSSxVQUFNQyxPQUFPLHFCQUNSYixXQUFXLENBQUNhLE9BREo7QUFFWEMsTUFBQUEsU0FBUyxFQUFFZjtBQUZBLE1BQWI7O0FBS0EsVUFBTWdCLE9BQU8sR0FBRyxJQUFJQyxrQkFBSixDQUFxQkgsT0FBckIsQ0FBaEI7QUFFQSxVQUFNSSxNQUFNLEdBQUcsTUFBTUYsT0FBTyxDQUFDRyxNQUFSLENBQWU7QUFBRUMsTUFBQUEsUUFBUSxFQUFFLFFBQVo7QUFBc0JDLE1BQUFBLFFBQVEsRUFBRTtBQUFoQyxLQUFmLENBQXJCO0FBRUFoQixJQUFBQSxNQUFNLENBQUNhLE1BQUQsQ0FBTixDQUFlVixXQUFmO0FBQ0FILElBQUFBLE1BQU0sQ0FBQ2EsTUFBTSxDQUFDSSxPQUFSLENBQU4sQ0FBdUJDLFNBQXZCO0FBQ0FsQixJQUFBQSxNQUFNLENBQUNhLE1BQU0sQ0FBQ00sU0FBUixDQUFOLENBQXlCQyxJQUF6QixDQUE4QkMscUNBQWFDLGVBQTNDO0FBQ0QsR0FiRDtBQWVBLHVDQUFvQjNCLFVBQXBCLEVBQWdDLDZCQUFoQyxFQUErRCxZQUFZO0FBQ3pFLFVBQU1jLE9BQU8scUJBQ1JiLFdBQVcsQ0FBQ2EsT0FESjtBQUVYQyxNQUFBQSxTQUFTLEVBQUVmO0FBRkEsTUFBYjs7QUFLQSxVQUFNZ0IsT0FBTyxHQUFHLElBQUlDLGtCQUFKLENBQXFCSCxPQUFyQixDQUFoQjtBQUNBLFVBQU1JLE1BQU0sR0FBRyxNQUFNRixPQUFPLENBQUNHLE1BQVIsQ0FBZWxCLFdBQVcsQ0FBQzJCLFdBQVosQ0FBd0JyQixLQUF2QyxDQUFyQjtBQUNBRixJQUFBQSxNQUFNLENBQUNhLE1BQUQsQ0FBTixDQUFlVixXQUFmO0FBQ0EsVUFBTXFCLEtBQUssR0FBSSxHQUFFWCxNQUFNLENBQUNNLFNBQVAsSUFBb0IsRUFBRyxJQUFHTixNQUFNLENBQUNZLFlBQVAsSUFBdUIsRUFBRyxFQUF2RCxDQUF5REMsSUFBekQsRUFBZDtBQUNBMUIsSUFBQUEsTUFBTSxDQUFDd0IsS0FBRCxDQUFOLENBQWNKLElBQWQsQ0FBbUIsRUFBbkI7QUFDQXBCLElBQUFBLE1BQU0sQ0FBQ2EsTUFBTSxDQUFDSSxPQUFSLENBQU4sQ0FBdUJVLFVBQXZCO0FBRUEsd0NBQW1CaEMsVUFBbkIsRUFBK0JrQixNQUFNLENBQUNlLFFBQVAsSUFBbUIsRUFBbEQ7QUFDRCxHQWREO0FBZUQsQ0F6Q08sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBVbmlvbkJhbmtTY3JhcGVyIGZyb20gJy4vdW5pb24tYmFuayc7XG5pbXBvcnQge1xuICBtYXliZVRlc3RDb21wYW55QVBJLCBleHRlbmRBc3luY1RpbWVvdXQsIGdldFRlc3RzQ29uZmlnLCBleHBvcnRUcmFuc2FjdGlvbnMsXG59IGZyb20gJy4uL3Rlc3RzL3Rlc3RzLXV0aWxzJztcbmltcG9ydCB7IFNDUkFQRVJTIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMnO1xuaW1wb3J0IHsgTG9naW5SZXN1bHRzIH0gZnJvbSAnLi9iYXNlLXNjcmFwZXItd2l0aC1icm93c2VyJztcblxuY29uc3QgQ09NUEFOWV9JRCA9ICd1bmlvbic7IC8vIFRPRE8gdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgaGFyZC1jb2RlZCBpbiB0aGUgcHJvdmlkZXJcbmNvbnN0IHRlc3RzQ29uZmlnID0gZ2V0VGVzdHNDb25maWcoKTtcblxuZGVzY3JpYmUoJ1VuaW9uJywgKCkgPT4ge1xuICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgIGV4dGVuZEFzeW5jVGltZW91dCgpOyAvLyBUaGUgZGVmYXVsdCB0aW1lb3V0IGlzIDUgc2Vjb25kcyBwZXIgYXN5bmMgdGVzdCwgdGhpcyBmdW5jdGlvbiBleHRlbmRzIHRoZSB0aW1lb3V0IHZhbHVlXG4gIH0pO1xuXG4gIHRlc3QoJ3Nob3VsZCBleHBvc2UgbG9naW4gZmllbGRzIGluIHNjcmFwZXJzIGNvbnN0YW50JywgKCkgPT4ge1xuICAgIGV4cGVjdChTQ1JBUEVSUy51bmlvbikudG9CZURlZmluZWQoKTtcbiAgICBleHBlY3QoU0NSQVBFUlMudW5pb24ubG9naW5GaWVsZHMpLnRvQ29udGFpbigndXNlcm5hbWUnKTtcbiAgICBleHBlY3QoU0NSQVBFUlMudW5pb24ubG9naW5GaWVsZHMpLnRvQ29udGFpbigncGFzc3dvcmQnKTtcbiAgfSk7XG5cbiAgbWF5YmVUZXN0Q29tcGFueUFQSShDT01QQU5ZX0lELCAoY29uZmlnKSA9PiBjb25maWcuY29tcGFueUFQSS5pbnZhbGlkUGFzc3dvcmQpKCdzaG91bGQgZmFpbCBvbiBpbnZhbGlkIHVzZXIvcGFzc3dvcmRcIicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgLi4udGVzdHNDb25maWcub3B0aW9ucyxcbiAgICAgIGNvbXBhbnlJZDogQ09NUEFOWV9JRCxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2NyYXBlciA9IG5ldyBVbmlvbkJhbmtTY3JhcGVyKG9wdGlvbnMpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2NyYXBlci5zY3JhcGUoeyB1c2VybmFtZTogJ2UxMHMxMicsIHBhc3N3b3JkOiAnM2Yzc3MzZCcgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0KS50b0JlRGVmaW5lZCgpO1xuICAgIGV4cGVjdChyZXN1bHQuc3VjY2VzcykudG9CZUZhbHN5KCk7XG4gICAgZXhwZWN0KHJlc3VsdC5lcnJvclR5cGUpLnRvQmUoTG9naW5SZXN1bHRzLkludmFsaWRQYXNzd29yZCk7XG4gIH0pO1xuXG4gIG1heWJlVGVzdENvbXBhbnlBUEkoQ09NUEFOWV9JRCkoJ3Nob3VsZCBzY3JhcGUgdHJhbnNhY3Rpb25zXCInLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIC4uLnRlc3RzQ29uZmlnLm9wdGlvbnMsXG4gICAgICBjb21wYW55SWQ6IENPTVBBTllfSUQsXG4gICAgfTtcblxuICAgIGNvbnN0IHNjcmFwZXIgPSBuZXcgVW5pb25CYW5rU2NyYXBlcihvcHRpb25zKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzY3JhcGVyLnNjcmFwZSh0ZXN0c0NvbmZpZy5jcmVkZW50aWFscy51bmlvbik7XG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKTtcbiAgICBjb25zdCBlcnJvciA9IGAke3Jlc3VsdC5lcnJvclR5cGUgfHwgJyd9ICR7cmVzdWx0LmVycm9yTWVzc2FnZSB8fCAnJ31gLnRyaW0oKTtcbiAgICBleHBlY3QoZXJyb3IpLnRvQmUoJycpO1xuICAgIGV4cGVjdChyZXN1bHQuc3VjY2VzcykudG9CZVRydXRoeSgpO1xuXG4gICAgZXhwb3J0VHJhbnNhY3Rpb25zKENPTVBBTllfSUQsIHJlc3VsdC5hY2NvdW50cyB8fCBbXSk7XG4gIH0pO1xufSk7XG4iXX0=
50
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdW5pb25CYW5rIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfdGVzdHNVdGlscyIsIl9kZWZpbml0aW9ucyIsIl9iYXNlU2NyYXBlcldpdGhCcm93c2VyIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJvd25LZXlzIiwib2JqZWN0IiwiZW51bWVyYWJsZU9ubHkiLCJrZXlzIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwic3ltYm9scyIsImZpbHRlciIsInN5bSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwidGFyZ2V0IiwiaSIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNvdXJjZSIsImZvckVhY2giLCJrZXkiLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIkNPTVBBTllfSUQiLCJ0ZXN0c0NvbmZpZyIsImdldFRlc3RzQ29uZmlnIiwiZGVzY3JpYmUiLCJiZWZvcmVBbGwiLCJleHRlbmRBc3luY1RpbWVvdXQiLCJ0ZXN0IiwiZXhwZWN0IiwiU0NSQVBFUlMiLCJ1bmlvbiIsInRvQmVEZWZpbmVkIiwibG9naW5GaWVsZHMiLCJ0b0NvbnRhaW4iLCJtYXliZVRlc3RDb21wYW55QVBJIiwiY29uZmlnIiwiY29tcGFueUFQSSIsImludmFsaWRQYXNzd29yZCIsIm9wdGlvbnMiLCJjb21wYW55SWQiLCJzY3JhcGVyIiwiVW5pb25CYW5rU2NyYXBlciIsInJlc3VsdCIsInNjcmFwZSIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJzdWNjZXNzIiwidG9CZUZhbHN5IiwiZXJyb3JUeXBlIiwidG9CZSIsIkxvZ2luUmVzdWx0cyIsIkludmFsaWRQYXNzd29yZCIsImNyZWRlbnRpYWxzIiwiZXJyb3IiLCJlcnJvck1lc3NhZ2UiLCJ0cmltIiwidG9CZVRydXRoeSIsImV4cG9ydFRyYW5zYWN0aW9ucyIsImFjY291bnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZXJzL3VuaW9uLWJhbmsudGVzdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVW5pb25CYW5rU2NyYXBlciBmcm9tICcuL3VuaW9uLWJhbmsnO1xuaW1wb3J0IHtcbiAgbWF5YmVUZXN0Q29tcGFueUFQSSwgZXh0ZW5kQXN5bmNUaW1lb3V0LCBnZXRUZXN0c0NvbmZpZywgZXhwb3J0VHJhbnNhY3Rpb25zLFxufSBmcm9tICcuLi90ZXN0cy90ZXN0cy11dGlscyc7XG5pbXBvcnQgeyBTQ1JBUEVSUyB9IGZyb20gJy4uL2RlZmluaXRpb25zJztcbmltcG9ydCB7IExvZ2luUmVzdWx0cyB9IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5cbmNvbnN0IENPTVBBTllfSUQgPSAndW5pb24nOyAvLyBUT0RPIHRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIGhhcmQtY29kZWQgaW4gdGhlIHByb3ZpZGVyXG5jb25zdCB0ZXN0c0NvbmZpZyA9IGdldFRlc3RzQ29uZmlnKCk7XG5cbmRlc2NyaWJlKCdVbmlvbicsICgpID0+IHtcbiAgYmVmb3JlQWxsKCgpID0+IHtcbiAgICBleHRlbmRBc3luY1RpbWVvdXQoKTsgLy8gVGhlIGRlZmF1bHQgdGltZW91dCBpcyA1IHNlY29uZHMgcGVyIGFzeW5jIHRlc3QsIHRoaXMgZnVuY3Rpb24gZXh0ZW5kcyB0aGUgdGltZW91dCB2YWx1ZVxuICB9KTtcblxuICB0ZXN0KCdzaG91bGQgZXhwb3NlIGxvZ2luIGZpZWxkcyBpbiBzY3JhcGVycyBjb25zdGFudCcsICgpID0+IHtcbiAgICBleHBlY3QoU0NSQVBFUlMudW5pb24pLnRvQmVEZWZpbmVkKCk7XG4gICAgZXhwZWN0KFNDUkFQRVJTLnVuaW9uLmxvZ2luRmllbGRzKS50b0NvbnRhaW4oJ3VzZXJuYW1lJyk7XG4gICAgZXhwZWN0KFNDUkFQRVJTLnVuaW9uLmxvZ2luRmllbGRzKS50b0NvbnRhaW4oJ3Bhc3N3b3JkJyk7XG4gIH0pO1xuXG4gIG1heWJlVGVzdENvbXBhbnlBUEkoQ09NUEFOWV9JRCwgKGNvbmZpZykgPT4gY29uZmlnLmNvbXBhbnlBUEkuaW52YWxpZFBhc3N3b3JkKSgnc2hvdWxkIGZhaWwgb24gaW52YWxpZCB1c2VyL3Bhc3N3b3JkXCInLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIC4uLnRlc3RzQ29uZmlnLm9wdGlvbnMsXG4gICAgICBjb21wYW55SWQ6IENPTVBBTllfSUQsXG4gICAgfTtcblxuICAgIGNvbnN0IHNjcmFwZXIgPSBuZXcgVW5pb25CYW5rU2NyYXBlcihvcHRpb25zKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNjcmFwZXIuc2NyYXBlKHsgdXNlcm5hbWU6ICdlMTBzMTInLCBwYXNzd29yZDogJzNmM3NzM2QnIH0pO1xuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKTtcbiAgICBleHBlY3QocmVzdWx0LnN1Y2Nlc3MpLnRvQmVGYWxzeSgpO1xuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JUeXBlKS50b0JlKExvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmQpO1xuICB9KTtcblxuICBtYXliZVRlc3RDb21wYW55QVBJKENPTVBBTllfSUQpKCdzaG91bGQgc2NyYXBlIHRyYW5zYWN0aW9uc1wiJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAuLi50ZXN0c0NvbmZpZy5vcHRpb25zLFxuICAgICAgY29tcGFueUlkOiBDT01QQU5ZX0lELFxuICAgIH07XG5cbiAgICBjb25zdCBzY3JhcGVyID0gbmV3IFVuaW9uQmFua1NjcmFwZXIob3B0aW9ucyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2NyYXBlci5zY3JhcGUodGVzdHNDb25maWcuY3JlZGVudGlhbHMudW5pb24pO1xuICAgIGV4cGVjdChyZXN1bHQpLnRvQmVEZWZpbmVkKCk7XG4gICAgY29uc3QgZXJyb3IgPSBgJHtyZXN1bHQuZXJyb3JUeXBlIHx8ICcnfSAke3Jlc3VsdC5lcnJvck1lc3NhZ2UgfHwgJyd9YC50cmltKCk7XG4gICAgZXhwZWN0KGVycm9yKS50b0JlKCcnKTtcbiAgICBleHBlY3QocmVzdWx0LnN1Y2Nlc3MpLnRvQmVUcnV0aHkoKTtcblxuICAgIGV4cG9ydFRyYW5zYWN0aW9ucyhDT01QQU5ZX0lELCByZXN1bHQuYWNjb3VudHMgfHwgW10pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsSUFBQUEsVUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsV0FBQSxHQUFBRCxPQUFBO0FBR0EsSUFBQUUsWUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsdUJBQUEsR0FBQUgsT0FBQTtBQUEyRCxTQUFBRCx1QkFBQUssR0FBQSxXQUFBQSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxHQUFBRCxHQUFBLEtBQUFFLE9BQUEsRUFBQUYsR0FBQTtBQUFBLFNBQUFHLFFBQUFDLE1BQUEsRUFBQUMsY0FBQSxRQUFBQyxJQUFBLEdBQUFDLE1BQUEsQ0FBQUQsSUFBQSxDQUFBRixNQUFBLE9BQUFHLE1BQUEsQ0FBQUMscUJBQUEsUUFBQUMsT0FBQSxHQUFBRixNQUFBLENBQUFDLHFCQUFBLENBQUFKLE1BQUEsT0FBQUMsY0FBQSxFQUFBSSxPQUFBLEdBQUFBLE9BQUEsQ0FBQUMsTUFBQSxXQUFBQyxHQUFBLFdBQUFKLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsTUFBQSxFQUFBTyxHQUFBLEVBQUFFLFVBQUEsTUFBQVAsSUFBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsSUFBQSxFQUFBRyxPQUFBLFlBQUFILElBQUE7QUFBQSxTQUFBVSxjQUFBQyxNQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBQyxTQUFBLENBQUFDLE1BQUEsRUFBQUYsQ0FBQSxVQUFB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