israeli-bank-scrapers 6.1.1 → 6.1.2

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 (79) hide show
  1. package/lib/assertNever.js +7 -5
  2. package/lib/constants.js +16 -13
  3. package/lib/definitions.js +113 -109
  4. package/lib/helpers/browser.js +13 -9
  5. package/lib/helpers/dates.js +19 -18
  6. package/lib/helpers/debug.js +9 -9
  7. package/lib/helpers/elements-interactions.js +82 -78
  8. package/lib/helpers/fetch.js +85 -82
  9. package/lib/helpers/navigation.js +28 -24
  10. package/lib/helpers/storage.js +11 -10
  11. package/lib/helpers/transactions.js +32 -33
  12. package/lib/helpers/waiting.js +42 -45
  13. package/lib/index.js +82 -15
  14. package/lib/scrapers/amex.js +13 -11
  15. package/lib/scrapers/amex.test.d.ts +1 -0
  16. package/lib/scrapers/amex.test.js +49 -0
  17. package/lib/scrapers/base-beinleumi-group.js +239 -233
  18. package/lib/scrapers/base-isracard-amex.js +273 -273
  19. package/lib/scrapers/base-scraper-with-browser.js +263 -241
  20. package/lib/scrapers/base-scraper-with-browser.test.d.ts +1 -0
  21. package/lib/scrapers/base-scraper-with-browser.test.js +53 -0
  22. package/lib/scrapers/base-scraper.js +82 -82
  23. package/lib/scrapers/behatsdaa.js +103 -98
  24. package/lib/scrapers/behatsdaa.test.d.ts +1 -0
  25. package/lib/scrapers/behatsdaa.test.js +46 -0
  26. package/lib/scrapers/beinleumi.js +13 -11
  27. package/lib/scrapers/beinleumi.test.d.ts +1 -0
  28. package/lib/scrapers/beinleumi.test.js +47 -0
  29. package/lib/scrapers/beyahad-bishvilha.js +132 -132
  30. package/lib/scrapers/beyahad-bishvilha.test.d.ts +1 -0
  31. package/lib/scrapers/beyahad-bishvilha.test.js +47 -0
  32. package/lib/scrapers/discount.js +101 -97
  33. package/lib/scrapers/discount.test.d.ts +1 -0
  34. package/lib/scrapers/discount.test.js +49 -0
  35. package/lib/scrapers/errors.js +25 -22
  36. package/lib/scrapers/factory.js +67 -66
  37. package/lib/scrapers/factory.test.d.ts +1 -0
  38. package/lib/scrapers/factory.test.js +19 -0
  39. package/lib/scrapers/hapoalim.js +175 -162
  40. package/lib/scrapers/hapoalim.test.d.ts +1 -0
  41. package/lib/scrapers/hapoalim.test.js +47 -0
  42. package/lib/scrapers/interface.js +5 -2
  43. package/lib/scrapers/isracard.js +13 -11
  44. package/lib/scrapers/isracard.test.d.ts +1 -0
  45. package/lib/scrapers/isracard.test.js +49 -0
  46. package/lib/scrapers/leumi.js +170 -167
  47. package/lib/scrapers/leumi.test.d.ts +1 -0
  48. package/lib/scrapers/leumi.test.js +47 -0
  49. package/lib/scrapers/massad.js +13 -11
  50. package/lib/scrapers/max.js +261 -261
  51. package/lib/scrapers/max.test.d.ts +1 -0
  52. package/lib/scrapers/max.test.js +65 -0
  53. package/lib/scrapers/mercantile.js +16 -14
  54. package/lib/scrapers/mercantile.test.d.ts +1 -0
  55. package/lib/scrapers/mercantile.test.js +45 -0
  56. package/lib/scrapers/mizrahi.js +154 -158
  57. package/lib/scrapers/mizrahi.test.d.ts +1 -0
  58. package/lib/scrapers/mizrahi.test.js +53 -0
  59. package/lib/scrapers/one-zero-queries.js +7 -4
  60. package/lib/scrapers/one-zero.js +221 -176
  61. package/lib/scrapers/one-zero.test.d.ts +1 -0
  62. package/lib/scrapers/one-zero.test.js +51 -0
  63. package/lib/scrapers/otsar-hahayal.js +13 -11
  64. package/lib/scrapers/otsar-hahayal.test.d.ts +1 -0
  65. package/lib/scrapers/otsar-hahayal.test.js +47 -0
  66. package/lib/scrapers/pagi.js +13 -11
  67. package/lib/scrapers/pagi.test.d.ts +1 -0
  68. package/lib/scrapers/pagi.test.js +47 -0
  69. package/lib/scrapers/union-bank.js +173 -172
  70. package/lib/scrapers/union-bank.test.d.ts +1 -0
  71. package/lib/scrapers/union-bank.test.js +47 -0
  72. package/lib/scrapers/visa-cal.js +250 -254
  73. package/lib/scrapers/visa-cal.test.d.ts +1 -0
  74. package/lib/scrapers/visa-cal.test.js +49 -0
  75. package/lib/scrapers/yahav.js +206 -190
  76. package/lib/scrapers/yahav.test.d.ts +1 -0
  77. package/lib/scrapers/yahav.test.js +49 -0
  78. package/lib/transactions.js +16 -13
  79. package/package.json +8 -3
@@ -1,281 +1,277 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const moment_1 = __importDefault(require("moment"));
7
- const debug_1 = require("../helpers/debug");
8
- const elements_interactions_1 = require("../helpers/elements-interactions");
9
- const fetch_1 = require("../helpers/fetch");
10
- const navigation_1 = require("../helpers/navigation");
11
- const storage_1 = require("../helpers/storage");
12
- const transactions_1 = require("../helpers/transactions");
13
- const waiting_1 = require("../helpers/waiting");
14
- const transactions_2 = require("../transactions");
15
- const base_scraper_with_browser_1 = require("./base-scraper-with-browser");
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _moment = _interopRequireDefault(require("moment"));
8
+ var _debug = require("../helpers/debug");
9
+ var _elementsInteractions = require("../helpers/elements-interactions");
10
+ var _fetch = require("../helpers/fetch");
11
+ var _navigation = require("../helpers/navigation");
12
+ var _storage = require("../helpers/storage");
13
+ var _transactions = require("../helpers/transactions");
14
+ var _waiting = require("../helpers/waiting");
15
+ var _transactions2 = require("../transactions");
16
+ var _baseScraperWithBrowser = require("./base-scraper-with-browser");
17
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
18
  const LOGIN_URL = 'https://www.cal-online.co.il/';
17
19
  const TRANSACTIONS_REQUEST_ENDPOINT = 'https://api.cal-online.co.il/Transactions/api/transactionsDetails/getCardTransactionsDetails';
18
20
  const PENDING_TRANSACTIONS_REQUEST_ENDPOINT = 'https://api.cal-online.co.il/Transactions/api/approvals/getClearanceRequests';
19
21
  const InvalidPasswordMessage = 'שם המשתמש או הסיסמה שהוזנו שגויים';
20
- const debug = (0, debug_1.getDebug)('visa-cal');
21
- var TrnTypeCode;
22
- (function (TrnTypeCode) {
23
- TrnTypeCode["regular"] = "5";
24
- TrnTypeCode["credit"] = "6";
25
- TrnTypeCode["installments"] = "8";
26
- TrnTypeCode["standingOrder"] = "9";
27
- })(TrnTypeCode || (TrnTypeCode = {}));
22
+ const debug = (0, _debug.getDebug)('visa-cal');
23
+ var TrnTypeCode = /*#__PURE__*/function (TrnTypeCode) {
24
+ TrnTypeCode["regular"] = "5";
25
+ TrnTypeCode["credit"] = "6";
26
+ TrnTypeCode["installments"] = "8";
27
+ TrnTypeCode["standingOrder"] = "9";
28
+ return TrnTypeCode;
29
+ }(TrnTypeCode || {});
28
30
  function isPending(transaction) {
29
- return transaction.debCrdDate === undefined; // an arbitrary field that only appears in a completed transaction
31
+ return transaction.debCrdDate === undefined; // an arbitrary field that only appears in a completed transaction
30
32
  }
31
33
  function isCardTransactionDetails(result) {
32
- return result.result !== undefined;
34
+ return result.result !== undefined;
33
35
  }
34
36
  function isCardPendingTransactionDetails(result) {
35
- return result.result !== undefined;
37
+ return result.result !== undefined;
36
38
  }
37
39
  async function getLoginFrame(page) {
38
- let frame = null;
39
- debug('wait until login frame found');
40
- await (0, waiting_1.waitUntil)(() => {
41
- frame = page.frames().find(f => f.url().includes('connect')) || null;
42
- return Promise.resolve(!!frame);
43
- }, 'wait for iframe with login form', 10000, 1000);
44
- if (!frame) {
45
- debug('failed to find login frame for 10 seconds');
46
- throw new Error('failed to extract login iframe');
47
- }
48
- return frame;
40
+ let frame = null;
41
+ debug('wait until login frame found');
42
+ await (0, _waiting.waitUntil)(() => {
43
+ frame = page.frames().find(f => f.url().includes('connect')) || null;
44
+ return Promise.resolve(!!frame);
45
+ }, 'wait for iframe with login form', 10000, 1000);
46
+ if (!frame) {
47
+ debug('failed to find login frame for 10 seconds');
48
+ throw new Error('failed to extract login iframe');
49
+ }
50
+ return frame;
49
51
  }
50
52
  async function hasInvalidPasswordError(page) {
51
- const frame = await getLoginFrame(page);
52
- const errorFound = await (0, elements_interactions_1.elementPresentOnPage)(frame, 'div.general-error > div');
53
- const errorMessage = errorFound
54
- ? await (0, elements_interactions_1.pageEval)(frame, 'div.general-error > div', '', item => {
55
- return item.innerText;
56
- })
57
- : '';
58
- return errorMessage === InvalidPasswordMessage;
53
+ const frame = await getLoginFrame(page);
54
+ const errorFound = await (0, _elementsInteractions.elementPresentOnPage)(frame, 'div.general-error > div');
55
+ const errorMessage = errorFound ? await (0, _elementsInteractions.pageEval)(frame, 'div.general-error > div', '', item => {
56
+ return item.innerText;
57
+ }) : '';
58
+ return errorMessage === InvalidPasswordMessage;
59
59
  }
60
60
  async function hasChangePasswordForm(page) {
61
- const frame = await getLoginFrame(page);
62
- const errorFound = await (0, elements_interactions_1.elementPresentOnPage)(frame, '.change-password-subtitle');
63
- return errorFound;
61
+ const frame = await getLoginFrame(page);
62
+ const errorFound = await (0, _elementsInteractions.elementPresentOnPage)(frame, '.change-password-subtitle');
63
+ return errorFound;
64
64
  }
65
65
  function getPossibleLoginResults() {
66
- debug('return possible login results');
67
- const urls = {
68
- [base_scraper_with_browser_1.LoginResults.Success]: [/dashboard/i],
69
- [base_scraper_with_browser_1.LoginResults.InvalidPassword]: [
70
- async (options) => {
71
- const page = options?.page;
72
- if (!page) {
73
- return false;
74
- }
75
- return hasInvalidPasswordError(page);
76
- },
77
- ],
78
- // [LoginResults.AccountBlocked]: [], // TODO add when reaching this scenario
79
- [base_scraper_with_browser_1.LoginResults.ChangePassword]: [
80
- async (options) => {
81
- const page = options?.page;
82
- if (!page) {
83
- return false;
84
- }
85
- return hasChangePasswordForm(page);
86
- },
87
- ],
88
- };
89
- return urls;
66
+ debug('return possible login results');
67
+ const urls = {
68
+ [_baseScraperWithBrowser.LoginResults.Success]: [/dashboard/i],
69
+ [_baseScraperWithBrowser.LoginResults.InvalidPassword]: [async options => {
70
+ const page = options?.page;
71
+ if (!page) {
72
+ return false;
73
+ }
74
+ return hasInvalidPasswordError(page);
75
+ }],
76
+ // [LoginResults.AccountBlocked]: [], // TODO add when reaching this scenario
77
+ [_baseScraperWithBrowser.LoginResults.ChangePassword]: [async options => {
78
+ const page = options?.page;
79
+ if (!page) {
80
+ return false;
81
+ }
82
+ return hasChangePasswordForm(page);
83
+ }]
84
+ };
85
+ return urls;
90
86
  }
91
87
  function createLoginFields(credentials) {
92
- debug('create login fields for username and password');
93
- return [
94
- { selector: '[formcontrolname="userName"]', value: credentials.username },
95
- { selector: '[formcontrolname="password"]', value: credentials.password },
96
- ];
88
+ debug('create login fields for username and password');
89
+ return [{
90
+ selector: '[formcontrolname="userName"]',
91
+ value: credentials.username
92
+ }, {
93
+ selector: '[formcontrolname="password"]',
94
+ value: credentials.password
95
+ }];
97
96
  }
98
97
  function convertParsedDataToTransactions(data, pendingData) {
99
- const pendingTransactions = pendingData?.result
100
- ? pendingData.result.cardsList.flatMap(card => card.authDetalisList)
101
- : [];
102
- const bankAccounts = data.flatMap(monthData => monthData.result.bankAccounts);
103
- const regularDebitDays = bankAccounts.flatMap(accounts => accounts.debitDates);
104
- const immediateDebitDays = bankAccounts.flatMap(accounts => accounts.immidiateDebits.debitDays);
105
- const completedTransactions = [...regularDebitDays, ...immediateDebitDays].flatMap(debitDate => debitDate.transactions);
106
- const all = [...pendingTransactions, ...completedTransactions];
107
- return all.map(transaction => {
108
- const numOfPayments = isPending(transaction) ? transaction.numberOfPayments : transaction.numOfPayments;
109
- const installments = numOfPayments
110
- ? {
111
- number: isPending(transaction) ? 1 : transaction.curPaymentNum,
112
- total: numOfPayments,
113
- }
114
- : undefined;
115
- const date = (0, moment_1.default)(transaction.trnPurchaseDate);
116
- let chargedAmount = isPending(transaction) ? transaction.trnAmt * -1 : transaction.amtBeforeConvAndIndex * -1;
117
- let originalAmount = transaction.trnAmt * -1;
118
- if (transaction.trnTypeCode === TrnTypeCode.credit) {
119
- chargedAmount = isPending(transaction) ? transaction.trnAmt : transaction.amtBeforeConvAndIndex;
120
- originalAmount = transaction.trnAmt;
121
- }
122
- const result = {
123
- identifier: !isPending(transaction) ? transaction.trnIntId : undefined,
124
- type: [TrnTypeCode.regular, TrnTypeCode.standingOrder].includes(transaction.trnTypeCode)
125
- ? transactions_2.TransactionTypes.Normal
126
- : transactions_2.TransactionTypes.Installments,
127
- status: isPending(transaction) ? transactions_2.TransactionStatuses.Pending : transactions_2.TransactionStatuses.Completed,
128
- date: installments ? date.add(installments.number - 1, 'month').toISOString() : date.toISOString(),
129
- processedDate: isPending(transaction) ? date.toISOString() : new Date(transaction.debCrdDate).toISOString(),
130
- originalAmount,
131
- originalCurrency: transaction.trnCurrencySymbol,
132
- chargedAmount,
133
- chargedCurrency: !isPending(transaction) ? transaction.debCrdCurrencySymbol : undefined,
134
- description: transaction.merchantName,
135
- memo: transaction.transTypeCommentDetails.toString(),
136
- category: transaction.branchCodeDesc,
137
- };
138
- if (installments) {
139
- result.installments = installments;
140
- }
141
- return result;
142
- });
143
- }
144
- class VisaCalScraper extends base_scraper_with_browser_1.BaseScraperWithBrowser {
145
- openLoginPopup = async () => {
146
- debug('open login popup, wait until login button available');
147
- await (0, elements_interactions_1.waitUntilElementFound)(this.page, '#ccLoginDesktopBtn', true);
148
- debug('click on the login button');
149
- await (0, elements_interactions_1.clickButton)(this.page, '#ccLoginDesktopBtn');
150
- debug('get the frame that holds the login');
151
- const frame = await getLoginFrame(this.page);
152
- debug('wait until the password login tab header is available');
153
- await (0, elements_interactions_1.waitUntilElementFound)(frame, '#regular-login');
154
- debug('navigate to the password login tab');
155
- await (0, elements_interactions_1.clickButton)(frame, '#regular-login');
156
- debug('wait until the password login tab is active');
157
- await (0, elements_interactions_1.waitUntilElementFound)(frame, 'regular-login');
158
- return frame;
159
- };
160
- async getCards() {
161
- const initData = await (0, waiting_1.waitUntil)(() => (0, storage_1.getFromSessionStorage)(this.page, 'init'), 'get init data in session storage', 10000, 1000);
162
- if (!initData) {
163
- throw new Error("could not find 'init' data in session storage");
164
- }
165
- return initData?.result.cards.map(({ cardUniqueId, last4Digits }) => ({ cardUniqueId, last4Digits }));
98
+ const pendingTransactions = pendingData?.result ? pendingData.result.cardsList.flatMap(card => card.authDetalisList) : [];
99
+ const bankAccounts = data.flatMap(monthData => monthData.result.bankAccounts);
100
+ const regularDebitDays = bankAccounts.flatMap(accounts => accounts.debitDates);
101
+ const immediateDebitDays = bankAccounts.flatMap(accounts => accounts.immidiateDebits.debitDays);
102
+ const completedTransactions = [...regularDebitDays, ...immediateDebitDays].flatMap(debitDate => debitDate.transactions);
103
+ const all = [...pendingTransactions, ...completedTransactions];
104
+ return all.map(transaction => {
105
+ const numOfPayments = isPending(transaction) ? transaction.numberOfPayments : transaction.numOfPayments;
106
+ const installments = numOfPayments ? {
107
+ number: isPending(transaction) ? 1 : transaction.curPaymentNum,
108
+ total: numOfPayments
109
+ } : undefined;
110
+ const date = (0, _moment.default)(transaction.trnPurchaseDate);
111
+ let chargedAmount = isPending(transaction) ? transaction.trnAmt * -1 : transaction.amtBeforeConvAndIndex * -1;
112
+ let originalAmount = transaction.trnAmt * -1;
113
+ if (transaction.trnTypeCode === TrnTypeCode.credit) {
114
+ chargedAmount = isPending(transaction) ? transaction.trnAmt : transaction.amtBeforeConvAndIndex;
115
+ originalAmount = transaction.trnAmt;
166
116
  }
167
- async getAuthorizationHeader() {
168
- const authModule = await (0, storage_1.getFromSessionStorage)(this.page, 'auth-module');
169
- if (!authModule) {
170
- throw new Error("could not find 'auth-module' in session storage");
171
- }
172
- return `CALAuthScheme ${authModule.auth.calConnectToken}`;
173
- }
174
- async getXSiteId() {
175
- /*
176
- I don't know if the constant below will change in the feature.
177
- If so, use the next code:
178
-
179
- return this.page.evaluate(() => new Ut().xSiteId);
180
-
181
- To get the classname search for 'xSiteId' in the page source
182
- class Ut {
183
- constructor(_e, on, yn) {
184
- this.store = _e,
185
- this.config = on,
186
- this.eventBusService = yn,
187
- this.xSiteId = "09031987-273E-2311-906C-8AF85B17C8D9",
188
- */
189
- return Promise.resolve('09031987-273E-2311-906C-8AF85B17C8D9');
117
+ const result = {
118
+ identifier: !isPending(transaction) ? transaction.trnIntId : undefined,
119
+ type: [TrnTypeCode.regular, TrnTypeCode.standingOrder].includes(transaction.trnTypeCode) ? _transactions2.TransactionTypes.Normal : _transactions2.TransactionTypes.Installments,
120
+ status: isPending(transaction) ? _transactions2.TransactionStatuses.Pending : _transactions2.TransactionStatuses.Completed,
121
+ date: installments ? date.add(installments.number - 1, 'month').toISOString() : date.toISOString(),
122
+ processedDate: isPending(transaction) ? date.toISOString() : new Date(transaction.debCrdDate).toISOString(),
123
+ originalAmount,
124
+ originalCurrency: transaction.trnCurrencySymbol,
125
+ chargedAmount,
126
+ chargedCurrency: !isPending(transaction) ? transaction.debCrdCurrencySymbol : undefined,
127
+ description: transaction.merchantName,
128
+ memo: transaction.transTypeCommentDetails.toString(),
129
+ category: transaction.branchCodeDesc
130
+ };
131
+ if (installments) {
132
+ result.installments = installments;
190
133
  }
191
- getLoginOptions(credentials) {
192
- return {
193
- loginUrl: `${LOGIN_URL}`,
194
- fields: createLoginFields(credentials),
195
- submitButtonSelector: 'button[type="submit"]',
196
- possibleResults: getPossibleLoginResults(),
197
- checkReadiness: async () => (0, elements_interactions_1.waitUntilElementFound)(this.page, '#ccLoginDesktopBtn'),
198
- preAction: this.openLoginPopup,
199
- postAction: async () => {
200
- try {
201
- await (0, navigation_1.waitForNavigation)(this.page);
202
- const currentUrl = await (0, navigation_1.getCurrentUrl)(this.page);
203
- if (currentUrl.endsWith('site-tutorial')) {
204
- await (0, elements_interactions_1.clickButton)(this.page, 'button.btn-close');
205
- }
206
- }
207
- catch (e) {
208
- const currentUrl = await (0, navigation_1.getCurrentUrl)(this.page);
209
- if (currentUrl.endsWith('dashboard'))
210
- return;
211
- const requiresChangePassword = await hasChangePasswordForm(this.page);
212
- if (requiresChangePassword)
213
- return;
214
- throw e;
215
- }
216
- },
217
- userAgent: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
218
- };
134
+ return result;
135
+ });
136
+ }
137
+ class VisaCalScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser {
138
+ openLoginPopup = async () => {
139
+ debug('open login popup, wait until login button available');
140
+ await (0, _elementsInteractions.waitUntilElementFound)(this.page, '#ccLoginDesktopBtn', true);
141
+ debug('click on the login button');
142
+ await (0, _elementsInteractions.clickButton)(this.page, '#ccLoginDesktopBtn');
143
+ debug('get the frame that holds the login');
144
+ const frame = await getLoginFrame(this.page);
145
+ debug('wait until the password login tab header is available');
146
+ await (0, _elementsInteractions.waitUntilElementFound)(frame, '#regular-login');
147
+ debug('navigate to the password login tab');
148
+ await (0, _elementsInteractions.clickButton)(frame, '#regular-login');
149
+ debug('wait until the password login tab is active');
150
+ await (0, _elementsInteractions.waitUntilElementFound)(frame, 'regular-login');
151
+ return frame;
152
+ };
153
+ async getCards() {
154
+ const initData = await (0, _waiting.waitUntil)(() => (0, _storage.getFromSessionStorage)(this.page, 'init'), 'get init data in session storage', 10000, 1000);
155
+ if (!initData) {
156
+ throw new Error("could not find 'init' data in session storage");
219
157
  }
220
- async fetchData() {
221
- const defaultStartMoment = (0, moment_1.default)().subtract(1, 'years').subtract(6, 'months').add(1, 'day');
222
- const startDate = this.options.startDate || defaultStartMoment.toDate();
223
- const startMoment = moment_1.default.max(defaultStartMoment, (0, moment_1.default)(startDate));
224
- debug(`fetch transactions starting ${startMoment.format()}`);
225
- const Authorization = await this.getAuthorizationHeader();
226
- const cards = await this.getCards();
227
- const xSiteId = await this.getXSiteId();
228
- const futureMonthsToScrape = this.options.futureMonthsToScrape ?? 1;
229
- const accounts = await Promise.all(cards.map(async (card) => {
230
- const finalMonthToFetchMoment = (0, moment_1.default)().add(futureMonthsToScrape, 'month');
231
- const months = finalMonthToFetchMoment.diff(startMoment, 'months');
232
- const allMonthsData = [];
233
- debug(`fetch pending transactions for card ${card.cardUniqueId}`);
234
- let pendingData = await (0, fetch_1.fetchPostWithinPage)(this.page, PENDING_TRANSACTIONS_REQUEST_ENDPOINT, { cardUniqueIDArray: [card.cardUniqueId] }, {
235
- Authorization,
236
- 'X-Site-Id': xSiteId,
237
- 'Content-Type': 'application/json',
238
- });
239
- debug(`fetch completed transactions for card ${card.cardUniqueId}`);
240
- for (let i = 0; i <= months; i += 1) {
241
- const month = finalMonthToFetchMoment.clone().subtract(i, 'months');
242
- const monthData = await (0, fetch_1.fetchPostWithinPage)(this.page, TRANSACTIONS_REQUEST_ENDPOINT, { cardUniqueId: card.cardUniqueId, month: month.format('M'), year: month.format('YYYY') }, {
243
- Authorization,
244
- 'X-Site-Id': xSiteId,
245
- 'Content-Type': 'application/json',
246
- });
247
- if (monthData?.statusCode !== 1)
248
- throw new Error(`failed to fetch transactions for card ${card.last4Digits}. Message: ${monthData?.title || ''}`);
249
- if (!isCardTransactionDetails(monthData)) {
250
- throw new Error('monthData is not of type CardTransactionDetails');
251
- }
252
- allMonthsData.push(monthData);
253
- }
254
- if (pendingData?.statusCode !== 1 && pendingData?.statusCode !== 96) {
255
- debug(`failed to fetch pending transactions for card ${card.last4Digits}. Message: ${pendingData?.title || ''}`);
256
- pendingData = null;
257
- }
258
- else if (!isCardPendingTransactionDetails(pendingData)) {
259
- debug('pendingData is not of type CardTransactionDetails');
260
- pendingData = null;
261
- }
262
- const transactions = convertParsedDataToTransactions(allMonthsData, pendingData);
263
- debug('filer out old transactions');
264
- const txns = (this.options.outputData?.enableTransactionsFilterByDate ?? true)
265
- ? (0, transactions_1.filterOldTransactions)(transactions, (0, moment_1.default)(startDate), this.options.combineInstallments || false)
266
- : transactions;
267
- return {
268
- txns,
269
- accountNumber: card.last4Digits,
270
- };
271
- }));
272
- debug('return the scraped accounts');
273
- debug(JSON.stringify(accounts, null, 2));
274
- return {
275
- success: true,
276
- accounts,
277
- };
158
+ return initData?.result.cards.map(({
159
+ cardUniqueId,
160
+ last4Digits
161
+ }) => ({
162
+ cardUniqueId,
163
+ last4Digits
164
+ }));
165
+ }
166
+ async getAuthorizationHeader() {
167
+ const authModule = await (0, _storage.getFromSessionStorage)(this.page, 'auth-module');
168
+ if (!authModule) {
169
+ throw new Error("could not find 'auth-module' in session storage");
278
170
  }
171
+ return `CALAuthScheme ${authModule.auth.calConnectToken}`;
172
+ }
173
+ async getXSiteId() {
174
+ /*
175
+ I don't know if the constant below will change in the feature.
176
+ If so, use the next code:
177
+ return this.page.evaluate(() => new Ut().xSiteId);
178
+ To get the classname search for 'xSiteId' in the page source
179
+ class Ut {
180
+ constructor(_e, on, yn) {
181
+ this.store = _e,
182
+ this.config = on,
183
+ this.eventBusService = yn,
184
+ this.xSiteId = "09031987-273E-2311-906C-8AF85B17C8D9",
185
+ */
186
+ return Promise.resolve('09031987-273E-2311-906C-8AF85B17C8D9');
187
+ }
188
+ getLoginOptions(credentials) {
189
+ return {
190
+ loginUrl: `${LOGIN_URL}`,
191
+ fields: createLoginFields(credentials),
192
+ submitButtonSelector: 'button[type="submit"]',
193
+ possibleResults: getPossibleLoginResults(),
194
+ checkReadiness: async () => (0, _elementsInteractions.waitUntilElementFound)(this.page, '#ccLoginDesktopBtn'),
195
+ preAction: this.openLoginPopup,
196
+ postAction: async () => {
197
+ try {
198
+ await (0, _navigation.waitForNavigation)(this.page);
199
+ const currentUrl = await (0, _navigation.getCurrentUrl)(this.page);
200
+ if (currentUrl.endsWith('site-tutorial')) {
201
+ await (0, _elementsInteractions.clickButton)(this.page, 'button.btn-close');
202
+ }
203
+ } catch (e) {
204
+ const currentUrl = await (0, _navigation.getCurrentUrl)(this.page);
205
+ if (currentUrl.endsWith('dashboard')) return;
206
+ const requiresChangePassword = await hasChangePasswordForm(this.page);
207
+ if (requiresChangePassword) return;
208
+ throw e;
209
+ }
210
+ },
211
+ userAgent: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
212
+ };
213
+ }
214
+ async fetchData() {
215
+ const defaultStartMoment = (0, _moment.default)().subtract(1, 'years').subtract(6, 'months').add(1, 'day');
216
+ const startDate = this.options.startDate || defaultStartMoment.toDate();
217
+ const startMoment = _moment.default.max(defaultStartMoment, (0, _moment.default)(startDate));
218
+ debug(`fetch transactions starting ${startMoment.format()}`);
219
+ const Authorization = await this.getAuthorizationHeader();
220
+ const cards = await this.getCards();
221
+ const xSiteId = await this.getXSiteId();
222
+ const futureMonthsToScrape = this.options.futureMonthsToScrape ?? 1;
223
+ const accounts = await Promise.all(cards.map(async card => {
224
+ const finalMonthToFetchMoment = (0, _moment.default)().add(futureMonthsToScrape, 'month');
225
+ const months = finalMonthToFetchMoment.diff(startMoment, 'months');
226
+ const allMonthsData = [];
227
+ debug(`fetch pending transactions for card ${card.cardUniqueId}`);
228
+ let pendingData = await (0, _fetch.fetchPostWithinPage)(this.page, PENDING_TRANSACTIONS_REQUEST_ENDPOINT, {
229
+ cardUniqueIDArray: [card.cardUniqueId]
230
+ }, {
231
+ Authorization,
232
+ 'X-Site-Id': xSiteId,
233
+ 'Content-Type': 'application/json'
234
+ });
235
+ debug(`fetch completed transactions for card ${card.cardUniqueId}`);
236
+ for (let i = 0; i <= months; i += 1) {
237
+ const month = finalMonthToFetchMoment.clone().subtract(i, 'months');
238
+ const monthData = await (0, _fetch.fetchPostWithinPage)(this.page, TRANSACTIONS_REQUEST_ENDPOINT, {
239
+ cardUniqueId: card.cardUniqueId,
240
+ month: month.format('M'),
241
+ year: month.format('YYYY')
242
+ }, {
243
+ Authorization,
244
+ 'X-Site-Id': xSiteId,
245
+ 'Content-Type': 'application/json'
246
+ });
247
+ if (monthData?.statusCode !== 1) throw new Error(`failed to fetch transactions for card ${card.last4Digits}. Message: ${monthData?.title || ''}`);
248
+ if (!isCardTransactionDetails(monthData)) {
249
+ throw new Error('monthData is not of type CardTransactionDetails');
250
+ }
251
+ allMonthsData.push(monthData);
252
+ }
253
+ if (pendingData?.statusCode !== 1 && pendingData?.statusCode !== 96) {
254
+ debug(`failed to fetch pending transactions for card ${card.last4Digits}. Message: ${pendingData?.title || ''}`);
255
+ pendingData = null;
256
+ } else if (!isCardPendingTransactionDetails(pendingData)) {
257
+ debug('pendingData is not of type CardTransactionDetails');
258
+ pendingData = null;
259
+ }
260
+ const transactions = convertParsedDataToTransactions(allMonthsData, pendingData);
261
+ debug('filer out old transactions');
262
+ const txns = this.options.outputData?.enableTransactionsFilterByDate ?? true ? (0, _transactions.filterOldTransactions)(transactions, (0, _moment.default)(startDate), this.options.combineInstallments || false) : transactions;
263
+ return {
264
+ txns,
265
+ accountNumber: card.last4Digits
266
+ };
267
+ }));
268
+ debug('return the scraped accounts');
269
+ debug(JSON.stringify(accounts, null, 2));
270
+ return {
271
+ success: true,
272
+ accounts
273
+ };
274
+ }
279
275
  }
280
- exports.default = VisaCalScraper;
281
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzYS1jYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyYXBlcnMvdmlzYS1jYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsNENBQTRDO0FBQzVDLDRFQUFzSDtBQUN0SCw0Q0FBdUQ7QUFDdkQsc0RBQXlFO0FBQ3pFLGdEQUEyRDtBQUMzRCwwREFBZ0U7QUFDaEUsZ0RBQStDO0FBQy9DLGtEQUFvSDtBQUNwSCwyRUFBc0c7QUFHdEcsTUFBTSxTQUFTLEdBQUcsK0JBQStCLENBQUM7QUFDbEQsTUFBTSw2QkFBNkIsR0FDakMsOEZBQThGLENBQUM7QUFDakcsTUFBTSxxQ0FBcUMsR0FDekMsOEVBQThFLENBQUM7QUFFakYsTUFBTSxzQkFBc0IsR0FBRyxtQ0FBbUMsQ0FBQztBQUVuRSxNQUFNLEtBQUssR0FBRyxJQUFBLGdCQUFRLEVBQUMsVUFBVSxDQUFDLENBQUM7QUFFbkMsSUFBSyxXQUtKO0FBTEQsV0FBSyxXQUFXO0lBQ2QsNEJBQWEsQ0FBQTtJQUNiLDJCQUFZLENBQUE7SUFDWixpQ0FBa0IsQ0FBQTtJQUNsQixrQ0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTEksV0FBVyxLQUFYLFdBQVcsUUFLZjtBQXlIRCxTQUFTLFNBQVMsQ0FDaEIsV0FBMkQ7SUFFM0QsT0FBUSxXQUFrQyxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUMsQ0FBQyxrRUFBa0U7QUFDekksQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQy9CLE1BQTREO0lBRTVELE9BQVEsTUFBaUMsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDO0FBQ2pFLENBQUM7QUFFRCxTQUFTLCtCQUErQixDQUN0QyxNQUFtRTtJQUVuRSxPQUFRLE1BQXdDLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQztBQUN4RSxDQUFDO0FBRUQsS0FBSyxVQUFVLGFBQWEsQ0FBQyxJQUFVO0lBQ3JDLElBQUksS0FBSyxHQUFpQixJQUFJLENBQUM7SUFD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cUIsRUFBQyxZQUFZLEVBQUUsSUFBQSxnQkFBTSxFQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLElBQUksS0FBSyxDQUFDO2dCQUNuRyxDQUFDLENBQUMsWUFBWSxDQUFDO1lBRW5CLE9BQU87Z0JBQ0wsSUFBSTtnQkFDSixhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVc7YUFDVCxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUVyQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJO1lBQ2IsUUFBUTtTQUNULENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxrQkFBZSxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyB0eXBlIEZyYW1lLCB0eXBlIFBhZ2UgfSBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IHsgZ2V0RGVidWcgfSBmcm9tICcuLi9oZWxwZXJzL2RlYnVnJztcbmltcG9ydCB7IGNsaWNrQnV0dG9uLCBlbGVtZW50UHJlc2VudE9uUGFnZSwgcGFnZUV2YWwsIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCB9IGZyb20gJy4uL2hlbHBlcnMvZWxlbWVudHMtaW50ZXJhY3Rpb25zJztcbmltcG9ydCB7IGZldGNoUG9zdFdpdGhpblBhZ2UgfSBmcm9tICcuLi9oZWxwZXJzL2ZldGNoJztcbmltcG9ydCB7IGdldEN1cnJlbnRVcmwsIHdhaXRGb3JOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vaGVscGVycy9uYXZpZ2F0aW9uJztcbmltcG9ydCB7IGdldEZyb21TZXNzaW9uU3RvcmFnZSB9IGZyb20gJy4uL2hlbHBlcnMvc3RvcmFnZSc7XG5pbXBvcnQgeyBmaWx0ZXJPbGRUcmFuc2FjdGlvbnMgfSBmcm9tICcuLi9oZWxwZXJzL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyB3YWl0VW50aWwgfSBmcm9tICcuLi9oZWxwZXJzL3dhaXRpbmcnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TdGF0dXNlcywgVHJhbnNhY3Rpb25UeXBlcywgdHlwZSBUcmFuc2FjdGlvbiwgdHlwZSBUcmFuc2FjdGlvbnNBY2NvdW50IH0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIsIExvZ2luUmVzdWx0cywgdHlwZSBMb2dpbk9wdGlvbnMgfSBmcm9tICcuL2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXInO1xuaW1wb3J0IHsgdHlwZSBTY3JhcGVyU2NyYXBpbmdSZXN1bHQgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5cbmNvbnN0IExPR0lOX1VSTCA9ICdodHRwczovL3d3dy5jYWwtb25saW5lLmNvLmlsLyc7XG5jb25zdCBUUkFOU0FDVElPTlNfUkVRVUVTVF9FTkRQT0lOVCA9XG4gICdodHRwczovL2FwaS5jYWwtb25saW5lLmNvLmlsL1RyYW5zYWN0aW9ucy9hcGkvdHJhbnNhY3Rpb25zRGV0YWlscy9nZXRDYXJkVHJhbnNhY3Rpb25zRGV0YWlscyc7XG5jb25zdCBQRU5ESU5HX1RSQU5TQUNUSU9OU19SRVFVRVNUX0VORFBPSU5UID1cbiAgJ2h0dHBzOi8vYXBpLmNhbC1vbmxpbmUuY28uaWwvVHJhbnNhY3Rpb25zL2FwaS9hcHByb3ZhbHMvZ2V0Q2xlYXJhbmNlUmVxdWVzdHMnO1xuXG5jb25zdCBJbnZhbGlkUGFzc3dvcmRNZXNzYWdlID0gJ9ep150g15TXntep16rXntepINeQ15Ug15TXodeZ16HXnteUINep15TXldeW16DXlSDXqdeS15XXmdeZ150nO1xuXG5jb25zdCBkZWJ1ZyA9IGdldERlYnVnKCd2aXNhLWNhbCcpO1xuXG5lbnVtIFRyblR5cGVDb2RlIHtcbiAgcmVndWxhciA9ICc1JyxcbiAgY3JlZGl0ID0gJzYnLFxuICBpbnN0YWxsbWVudHMgPSAnOCcsXG4gIHN0YW5kaW5nT3JkZXIgPSAnOScsXG59XG5cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBhbXRCZWZvcmVDb252QW5kSW5kZXg6IG51bWJlcjtcbiAgYnJhbmNoQ29kZURlc2M6IHN0cmluZztcbiAgY2FzaEFjY01hbmFnZXJOYW1lOiBudWxsO1xuICBjYXNoQWNjb3VudE1hbmFnZXI6IG51bGw7XG4gIGNhc2hBY2NvdW50VHJuQW10OiBudW1iZXI7XG4gIGNoYXJnZUV4dGVybmFsVG9DYXJkQ29tbWVudDogc3RyaW5nO1xuICBjb21tZW50czogW107XG4gIGN1clBheW1lbnROdW06IG51bWJlcjtcbiAgZGViQ3JkQ3VycmVuY3lTeW1ib2w6IEN1cnJlbmN5U3ltYm9sO1xuICBkZWJDcmREYXRlOiBzdHJpbmc7XG4gIGRlYml0U3ByZWFkSW5kOiBib29sZWFuO1xuICBkaXNjb3VudEFtb3VudDogdW5rbm93bjtcbiAgZGlzY291bnRSZWFzb246IHVua25vd247XG4gIGltbWVkaWF0ZUNvbW1lbnRzOiBbXTtcbiAgaXNJbW1lZGlhdGVDb21tZW50SW5kOiBib29sZWFuO1xuICBpc0ltbWVkaWF0ZUhIS0luZDogYm9vbGVhbjtcbiAgaXNNYXJnYXJpdGE6IGJvb2xlYW47XG4gIGlzU3ByZWFkUGF5bWVuc3RBYnJvYWQ6IGJvb2xlYW47XG4gIGxpbmtlZENvbW1lbnRzOiBbXTtcbiAgbWVyY2hhbnRBZGRyZXNzOiBzdHJpbmc7XG4gIG1lcmNoYW50TmFtZTogc3RyaW5nO1xuICBtZXJjaGFudFBob25lTm86IHN0cmluZztcbiAgbnVtT2ZQYXltZW50czogbnVtYmVyO1xuICBvbkdvaW5nVHJhbnNhY3Rpb25zQ29tbWVudDogc3RyaW5nO1xuICByZWZ1bmRJbmQ6IGJvb2xlYW47XG4gIHJvdW5kaW5nQW1vdW50OiB1bmtub3duO1xuICByb3VuZGluZ1JlYXNvbjogdW5rbm93bjtcbiAgdG9rZW5JbmQ6IDA7XG4gIHRva2VuTnVtYmVyUGFydDQ6ICcnO1xuICB0cmFuc0NhcmRQcmVzZW50SW5kOiBib29sZWFuO1xuICB0cmFuc1R5cGVDb21tZW50RGV0YWlsczogW107XG4gIHRybkFtdDogbnVtYmVyO1xuICB0cm5DdXJyZW5jeVN5bWJvbDogQ3VycmVuY3lTeW1ib2w7XG4gIHRybkV4YWNXYXk6IG51bWJlcjtcbiAgdHJuSW50SWQ6IHN0cmluZztcbiAgdHJuTnVtYXJldG9yOiBudW1iZXI7XG4gIHRyblB1cmNoYXNlRGF0ZTogc3RyaW5nO1xuICB0cm5UeXBlOiBzdHJpbmc7XG4gIHRyblR5cGVDb2RlOiBUcm5UeXBlQ29kZTtcbiAgd2FsbGV0UHJvdmlkZXJDb2RlOiAwO1xuICB3YWxsZXRQcm92aWRlckRlc2M6ICcnO1xuICBlYXJseVBheW1lbnRJbmQ6IGJvb2xlYW47XG59XG5pbnRlcmZhY2UgU2NyYXBlZFBlbmRpbmdUcmFuc2FjdGlvbiB7XG4gIG1lcmNoYW50SUQ6IHN0cmluZztcbiAgbWVyY2hhbnROYW1lOiBzdHJpbmc7XG4gIHRyblB1cmNoYXNlRGF0ZTogc3RyaW5nO1xuICB3YWxsZXRUcmFuSW5kOiBudW1iZXI7XG4gIHRyYW5zYWN0aW9uc09yaWdpbjogbnVtYmVyO1xuICB0cm5BbXQ6IG51bWJlcjtcbiAgdHBhQXBwcm92YWxBbW91bnQ6IHVua25vd247XG4gIHRybkN1cnJlbmN5U3ltYm9sOiBDdXJyZW5jeVN5bWJvbDtcbiAgdHJuVHlwZUNvZGU6IFRyblR5cGVDb2RlO1xuICB0cm5UeXBlOiBzdHJpbmc7XG4gIGJyYW5jaENvZGVEZXNjOiBzdHJpbmc7XG4gIHRyYW5zQ2FyZFByZXNlbnRJbmQ6IGJvb2xlYW47XG4gIGo1SW5kaWNhdG9yOiBzdHJpbmc7XG4gIG51bWJlck9mUGF5bWVudHM6IG51bWJlcjtcbiAgZmlyc3RQYXltZW50QW1vdW50OiBudW1iZXI7XG4gIHRyYW5zVHlwZUNvbW1lbnREZXRhaWxzOiBbXTtcbn1cbmludGVyZmFjZSBJbml0UmVzcG9uc2Uge1xuICByZXN1bHQ6IHtcbiAgICBjYXJkczoge1xuICAgICAgY2FyZFVuaXF1ZUlkOiBzdHJpbmc7XG4gICAgICBsYXN0NERpZ2l0czogc3RyaW5nO1xuICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgICB9W107XG4gIH07XG59XG50eXBlIEN1cnJlbmN5U3ltYm9sID0gc3RyaW5nO1xuaW50ZXJmYWNlIENhcmRUcmFuc2FjdGlvbkRldGFpbHNFcnJvciB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbn1cbmludGVyZmFjZSBDYXJkVHJhbnNhY3Rpb25EZXRhaWxzIGV4dGVuZHMgQ2FyZFRyYW5zYWN0aW9uRGV0YWlsc0Vycm9yIHtcbiAgcmVzdWx0OiB7XG4gICAgYmFua0FjY291bnRzOiB7XG4gICAgICBiYW5rQWNjb3VudE51bTogc3RyaW5nO1xuICAgICAgYmFua05hbWU6IHN0cmluZztcbiAgICAgIGNob2ljZUV4dGVybmFsVHJhbnNhY3Rpb25zOiBhbnk7XG4gICAgICBjdXJyZW50QmFua0FjY291bnRJbmQ6IGJvb2xlYW47XG4gICAgICBkZWJpdERhdGVzOiB7XG4gICAgICAgIGJhc2tldEFtb3VudENvbW1lbnQ6IHVua25vd247XG4gICAgICAgIGNob2ljZUhIS0RlYml0OiBudW1iZXI7XG4gICAgICAgIGRhdGU6IHN0cmluZztcbiAgICAgICAgZGViaXRSZWFzb246IHVua25vd247XG4gICAgICAgIGZpeERlYml0QW1vdW50OiBudW1iZXI7XG4gICAgICAgIGZyb21QdXJjaGFzZURhdGU6IHN0cmluZztcbiAgICAgICAgaXNDaG9pY2VSZXBhaW1lbnQ6IGJvb2xlYW47XG4gICAgICAgIHRvUHVyY2hhc2VEYXRlOiBzdHJpbmc7XG4gICAgICAgIHRvdGFsQmFza2V0QW1vdW50OiBudW1iZXI7XG4gICAgICAgIHRvdGFsRGViaXRzOiB7XG4gICAgICAgICAgY3VycmVuY3lTeW1ib2w6IEN1cnJlbmN5U3ltYm9sO1xuICAgICAgICAgIGFtb3VudDogbnVtYmVyO1xuICAgICAgICB9W107XG4gICAgICAgIHRyYW5zYWN0aW9uczogU2NyYXBlZFRyYW5zYWN0aW9uW107XG4gICAgICB9W107XG4gICAgICBpbW1pZGlhdGVEZWJpdHM6IHsgdG90YWxEZWJpdHM6IFtdOyBkZWJpdERheXM6IFtdIH07XG4gICAgfVtdO1xuICAgIGJsb2NrZWRDYXJkSW5kOiBib29sZWFuO1xuICB9O1xuICBzdGF0dXNDb2RlOiAxO1xuICBzdGF0dXNEZXNjcmlwdGlvbjogc3RyaW5nO1xuICBzdGF0dXNUaXRsZTogc3RyaW5nO1xufVxuaW50ZXJmYWNlIENhcmRQZW5kaW5nVHJhbnNhY3Rpb25EZXRhaWxzIGV4dGVuZHMgQ2FyZFRyYW5zYWN0aW9uRGV0YWlsc0Vycm9yIHtcbiAgcmVzdWx0OiB7XG4gICAgY2FyZHNMaXN0OiB7XG4gICAgICBjYXJkVW5pcXVlSUQ6IHN0cmluZztcbiAgICAgIGF1dGhEZXRhbGlzTGlzdDogU2NyYXBlZFBlbmRpbmdUcmFuc2FjdGlvbltdO1xuICAgIH1bXTtcbiAgfTtcbiAgc3RhdHVzQ29kZTogMTtcbiAgc3RhdHVzRGVzY3JpcHRpb246IHN0cmluZztcbiAgc3RhdHVzVGl0bGU6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gaXNQZW5kaW5nKFxuICB0cmFuc2FjdGlvbjogU2NyYXBlZFRyYW5zYWN0aW9uIHwgU2NyYXBlZFBlbmRpbmdUcmFuc2FjdGlvbixcbik6IHRyYW5zYWN0aW9uIGlzIFNjcmFwZWRQZW5kaW5nVHJhbnNhY3Rpb24ge1xuICByZXR1cm4gKHRyYW5zYWN0aW9uIGFzIFNjcmFwZWRUcmFuc2FjdGlvbikuZGViQ3JkRGF0ZSA9PT0gdW5kZWZpbmVkOyAvLyBhbiBhcmJpdHJhcnkgZmllbGQgdGhhdCBvbmx5IGFwcGVhcnMgaW4gYSBjb21wbGV0ZWQgdHJhbnNhY3Rpb25cbn1cblxuZnVuY3Rpb24gaXNDYXJkVHJhbnNhY3Rpb25EZXRhaWxzKFxuICByZXN1bHQ6IENhcmRUcmFuc2FjdGlvbkRldGFpbHMgfCBDYXJkVHJhbnNhY3Rpb25EZXRhaWxzRXJyb3IsXG4pOiByZXN1bHQgaXMgQ2FyZFRyYW5zYWN0aW9uRGV0YWlscyB7XG4gIHJldHVybiAocmVzdWx0IGFzIENhcmRUcmFuc2FjdGlvbkRldGFpbHMpLnJlc3VsdCAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0NhcmRQZW5kaW5nVHJhbnNhY3Rpb25EZXRhaWxzKFxuICByZXN1bHQ6IENhcmRQZW5kaW5nVHJhbnNhY3Rpb25EZXRhaWxzIHwgQ2FyZFRyYW5zYWN0aW9uRGV0YWlsc0Vycm9yLFxuKTogcmVzdWx0IGlzIENhcmRQZW5kaW5nVHJhbnNhY3Rpb25EZXRhaWxzIHtcbiAgcmV0dXJuIChyZXN1bHQgYXMgQ2FyZFBlbmRpbmdUcmFuc2FjdGlvbkRldGFpbHMpLnJlc3VsdCAhPT0gdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMb2dpbkZyYW1lKHBhZ2U6IFBhZ2UpIHtcbiAgbGV0IGZyYW1lOiBGcmFtZSB8IG51bGwgPSBudWxsO1xuICBkZWJ1Zygnd2FpdCB1bnRpbCBsb2dpbiBmcmFtZSBmb3VuZCcpO1xuICBhd2FpdCB3YWl0VW50aWwoXG4gICAgKCkgPT4ge1xuICAgICAgZnJhbWUgPSBwYWdlLmZyYW1lcygpLmZpbmQoZiA9PiBmLnVybCgpLmluY2x1ZGVzKCdjb25uZWN0JykpIHx8IG51bGw7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCEhZnJhbWUpO1xuICAgIH0sXG4gICAgJ3dhaXQgZm9yIGlmcmFtZSB3aXRoIGxvZ2luIGZvcm0nLFxuICAgIDEwMDAwLFxuICAgIDEwMDAsXG4gICk7XG5cbiAgaWYgKCFmcmFtZSkge1xuICAgIGRlYnVnKCdmYWlsZWQgdG8gZmluZCBsb2dpbiBmcmFtZSBmb3IgMTAgc2Vjb25kcycpO1xuICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGV4dHJhY3QgbG9naW4gaWZyYW1lJyk7XG4gIH1cblxuICByZXR1cm4gZnJhbWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc0ludmFsaWRQYXNzd29yZEVycm9yKHBhZ2U6IFBhZ2UpIHtcbiAgY29uc3QgZnJhbWUgPSBhd2FpdCBnZXRMb2dpbkZyYW1lKHBhZ2UpO1xuICBjb25zdCBlcnJvckZvdW5kID0gYXdhaXQgZWxlbWVudFByZXNlbnRPblBhZ2UoZnJhbWUsICdkaXYuZ2VuZXJhbC1lcnJvciA+IGRpdicpO1xuICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvckZvdW5kXG4gICAgPyBhd2FpdCBwYWdlRXZhbChmcmFtZSwgJ2Rpdi5nZW5lcmFsLWVycm9yID4gZGl2JywgJycsIGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4gKGl0ZW0gYXMgSFRNTERpdkVsZW1lbnQpLmlubmVyVGV4dDtcbiAgICAgIH0pXG4gICAgOiAnJztcbiAgcmV0dXJuIGVycm9yTWVzc2FnZSA9PT0gSW52YWxpZFBhc3N3b3JkTWVzc2FnZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFzQ2hhbmdlUGFzc3dvcmRGb3JtKHBhZ2U6IFBhZ2UpIHtcbiAgY29uc3QgZnJhbWUgPSBhd2FpdCBnZXRMb2dpbkZyYW1lKHBhZ2UpO1xuICBjb25zdCBlcnJvckZvdW5kID0gYXdhaXQgZWxlbWVudFByZXNlbnRPblBhZ2UoZnJhbWUsICcuY2hhbmdlLXBhc3N3b3JkLXN1YnRpdGxlJyk7XG4gIHJldHVybiBlcnJvckZvdW5kO1xufVxuXG5mdW5jdGlvbiBnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cygpIHtcbiAgZGVidWcoJ3JldHVybiBwb3NzaWJsZSBsb2dpbiByZXN1bHRzJyk7XG4gIGNvbnN0IHVybHM6IExvZ2luT3B0aW9uc1sncG9zc2libGVSZXN1bHRzJ10gPSB7XG4gICAgW0xvZ2luUmVzdWx0cy5TdWNjZXNzXTogWy9kYXNoYm9hcmQvaV0sXG4gICAgW0xvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmRdOiBbXG4gICAgICBhc3luYyAob3B0aW9ucz86IHsgcGFnZT86IFBhZ2UgfSkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlID0gb3B0aW9ucz8ucGFnZTtcbiAgICAgICAgaWYgKCFwYWdlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNJbnZhbGlkUGFzc3dvcmRFcnJvcihwYWdlKTtcbiAgICAgIH0sXG4gICAgXSxcbiAgICAvLyBbTG9naW5SZXN1bHRzLkFjY291bnRCbG9ja2VkXTogW10sIC8vIFRPRE8gYWRkIHdoZW4gcmVhY2hpbmcgdGhpcyBzY2VuYXJpb1xuICAgIFtMb2dpblJlc3VsdHMuQ2hhbmdlUGFzc3dvcmRdOiBbXG4gICAgICBhc3luYyAob3B0aW9ucz86IHsgcGFnZT86IFBhZ2UgfSkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlID0gb3B0aW9ucz8ucGFnZTtcbiAgICAgICAgaWYgKCFwYWdlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNDaGFuZ2VQYXNzd29yZEZvcm0ocGFnZSk7XG4gICAgICB9LFxuICAgIF0sXG4gIH07XG4gIHJldHVybiB1cmxzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgZGVidWcoJ2NyZWF0ZSBsb2dpbiBmaWVsZHMgZm9yIHVzZXJuYW1lIGFuZCBwYXNzd29yZCcpO1xuICByZXR1cm4gW1xuICAgIHsgc2VsZWN0b3I6ICdbZm9ybWNvbnRyb2xuYW1lPVwidXNlck5hbWVcIl0nLCB2YWx1ZTogY3JlZGVudGlhbHMudXNlcm5hbWUgfSxcbiAgICB7IHNlbGVjdG9yOiAnW2Zvcm1jb250cm9sbmFtZT1cInBhc3N3b3JkXCJdJywgdmFsdWU6IGNyZWRlbnRpYWxzLnBhc3N3b3JkIH0sXG4gIF07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRQYXJzZWREYXRhVG9UcmFuc2FjdGlvbnMoXG4gIGRhdGE6IENhcmRUcmFuc2FjdGlvbkRldGFpbHNbXSxcbiAgcGVuZGluZ0RhdGE/OiBDYXJkUGVuZGluZ1RyYW5zYWN0aW9uRGV0YWlscyB8IG51bGwsXG4pOiBUcmFuc2FjdGlvbltdIHtcbiAgY29uc3QgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IHBlbmRpbmdEYXRhPy5yZXN1bHRcbiAgICA/IHBlbmRpbmdEYXRhLnJlc3VsdC5jYXJkc0xpc3QuZmxhdE1hcChjYXJkID0+IGNhcmQuYXV0aERldGFsaXNMaXN0KVxuICAgIDogW107XG5cbiAgY29uc3QgYmFua0FjY291bnRzID0gZGF0YS5mbGF0TWFwKG1vbnRoRGF0YSA9PiBtb250aERhdGEucmVzdWx0LmJhbmtBY2NvdW50cyk7XG4gIGNvbnN0IHJlZ3VsYXJEZWJpdERheXMgPSBiYW5rQWNjb3VudHMuZmxhdE1hcChhY2NvdW50cyA9PiBhY2NvdW50cy5kZWJpdERhdGVzKTtcbiAgY29uc3QgaW1tZWRpYXRlRGViaXREYXlzID0gYmFua0FjY291bnRzLmZsYXRNYXAoYWNjb3VudHMgPT4gYWNjb3VudHMuaW1taWRpYXRlRGViaXRzLmRlYml0RGF5cyk7XG4gIGNvbnN0IGNvbXBsZXRlZFRyYW5zYWN0aW9ucyA9IFsuLi5yZWd1bGFyRGViaXREYXlzLCAuLi5pbW1lZGlhdGVEZWJpdERheXNdLmZsYXRNYXAoXG4gICAgZGViaXREYXRlID0+IGRlYml0RGF0ZS50cmFuc2FjdGlvbnMsXG4gICk7XG5cbiAgY29uc3QgYWxsOiAoU2NyYXBlZFRyYW5zYWN0aW9uIHwgU2NyYXBlZFBlbmRpbmdUcmFuc2FjdGlvbilbXSA9IFsuLi5wZW5kaW5nVHJhbnNhY3Rpb25zLCAuLi5jb21wbGV0ZWRUcmFuc2FjdGlvbnNdO1xuXG4gIHJldHVybiBhbGwubWFwKHRyYW5zYWN0aW9uID0+IHtcbiAgICBjb25zdCBudW1PZlBheW1lbnRzID0gaXNQZW5kaW5nKHRyYW5zYWN0aW9uKSA/IHRyYW5zYWN0aW9uLm51bWJlck9mUGF5bWVudHMgOiB0cmFuc2FjdGlvbi5udW1PZlBheW1lbnRzO1xuICAgIGNvbnN0IGluc3RhbGxtZW50cyA9IG51bU9mUGF5bWVudHNcbiAgICAgID8ge1xuICAgICAgICAgIG51bWJlcjogaXNQZW5kaW5nKHRyYW5zYWN0aW9uKSA/IDEgOiB0cmFuc2FjdGlvbi5jdXJQYXltZW50TnVtLFxuICAgICAgICAgIHRvdGFsOiBudW1PZlBheW1lbnRzLFxuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGRhdGUgPSBtb21lbnQodHJhbnNhY3Rpb24udHJuUHVyY2hhc2VEYXRlKTtcblxuICAgIGxldCBjaGFyZ2VkQW1vdW50ID0gaXNQZW5kaW5nKHRyYW5zYWN0aW9uKSA/IHRyYW5zYWN0aW9uLnRybkFtdCAqIC0xIDogdHJhbnNhY3Rpb24uYW10QmVmb3JlQ29udkFuZEluZGV4ICogLTE7XG4gICAgbGV0IG9yaWdpbmFsQW1vdW50ID0gdHJhbnNhY3Rpb24udHJuQW10ICogLTE7XG5cbiAgICBpZiAodHJhbnNhY3Rpb24udHJuVHlwZUNvZGUgPT09IFRyblR5cGVDb2RlLmNyZWRpdCkge1xuICAgICAgY2hhcmdlZEFtb3VudCA9IGlzUGVuZGluZyh0cmFuc2FjdGlvbikgPyB0cmFuc2FjdGlvbi50cm5BbXQgOiB0cmFuc2FjdGlvbi5hbXRCZWZvcmVDb252QW5kSW5kZXg7XG4gICAgICBvcmlnaW5hbEFtb3VudCA9IHRyYW5zYWN0aW9uLnRybkFtdDtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQ6IFRyYW5zYWN0aW9uID0ge1xuICAgICAgaWRlbnRpZmllcjogIWlzUGVuZGluZyh0cmFuc2FjdGlvbikgPyB0cmFuc2FjdGlvbi50cm5JbnRJZCA6IHVuZGVmaW5lZCxcbiAgICAgIHR5cGU6IFtUcm5UeXBlQ29kZS5yZWd1bGFyLCBUcm5UeXBlQ29kZS5zdGFuZGluZ09yZGVyXS5pbmNsdWRlcyh0cmFuc2FjdGlvbi50cm5UeXBlQ29kZSlcbiAgICAgICAgPyBUcmFuc2FjdGlvblR5cGVzLk5vcm1hbFxuICAgICAgICA6IFRyYW5zYWN0aW9uVHlwZXMuSW5zdGFsbG1lbnRzLFxuICAgICAgc3RhdHVzOiBpc1BlbmRpbmcodHJhbnNhY3Rpb24pID8gVHJhbnNhY3Rpb25TdGF0dXNlcy5QZW5kaW5nIDogVHJhbnNhY3Rpb25TdGF0dXNlcy5Db21wbGV0ZWQsXG4gICAgICBkYXRlOiBpbnN0YWxsbWVudHMgPyBkYXRlLmFkZChpbnN0YWxsbWVudHMubnVtYmVyIC0gMSwgJ21vbnRoJykudG9JU09TdHJpbmcoKSA6IGRhdGUudG9JU09TdHJpbmcoKSxcbiAgICAgIHByb2Nlc3NlZERhdGU6IGlzUGVuZGluZyh0cmFuc2FjdGlvbikgPyBkYXRlLnRvSVNPU3RyaW5nKCkgOiBuZXcgRGF0ZSh0cmFuc2FjdGlvbi5kZWJDcmREYXRlKS50b0lTT1N0cmluZygpLFxuICAgICAgb3JpZ2luYWxBbW91bnQsXG4gICAgICBvcmlnaW5hbEN1cnJlbmN5OiB0cmFuc2FjdGlvbi50cm5DdXJyZW5jeVN5bWJvbCxcbiAgICAgIGNoYXJnZWRBbW91bnQsXG4gICAgICBjaGFyZ2VkQ3VycmVuY3k6ICFpc1BlbmRpbmcodHJhbnNhY3Rpb24pID8gdHJhbnNhY3Rpb24uZGViQ3JkQ3VycmVuY3lTeW1ib2wgOiB1bmRlZmluZWQsXG4gICAgICBkZXNjcmlwdGlvbjogdHJhbnNhY3Rpb24ubWVyY2hhbnROYW1lLFxuICAgICAgbWVtbzogdHJhbnNhY3Rpb24udHJhbnNUeXBlQ29tbWVudERldGFpbHMudG9TdHJpbmcoKSxcbiAgICAgIGNhdGVnb3J5OiB0cmFuc2FjdGlvbi5icmFuY2hDb2RlRGVzYyxcbiAgICB9O1xuXG4gICAgaWYgKGluc3RhbGxtZW50cykge1xuICAgICAgcmVzdWx0Lmluc3RhbGxtZW50cyA9IGluc3RhbGxtZW50cztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbn1cblxudHlwZSBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscyA9IHsgdXNlcm5hbWU6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZyB9O1xuXG5jbGFzcyBWaXNhQ2FsU2NyYXBlciBleHRlbmRzIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXI8U2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHM+IHtcbiAgb3BlbkxvZ2luUG9wdXAgPSBhc3luYyAoKSA9PiB7XG4gICAgZGVidWcoJ29wZW4gbG9naW4gcG9wdXAsIHdhaXQgdW50aWwgbG9naW4gYnV0dG9uIGF2YWlsYWJsZScpO1xuICAgIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZCh0aGlzLnBhZ2UsICcjY2NMb2dpbkRlc2t0b3BCdG4nLCB0cnVlKTtcbiAgICBkZWJ1ZygnY2xpY2sgb24gdGhlIGxvZ2luIGJ1dHRvbicpO1xuICAgIGF3YWl0IGNsaWNrQnV0dG9uKHRoaXMucGFnZSwgJyNjY0xvZ2luRGVza3RvcEJ0bicpO1xuICAgIGRlYnVnKCdnZXQgdGhlIGZyYW1lIHRoYXQgaG9sZHMgdGhlIGxvZ2luJyk7XG4gICAgY29uc3QgZnJhbWUgPSBhd2FpdCBnZXRMb2dpbkZyYW1lKHRoaXMucGFnZSk7XG4gICAgZGVidWcoJ3dhaXQgdW50aWwgdGhlIHBhc3N3b3JkIGxvZ2luIHRhYiBoZWFkZXIgaXMgYXZhaWxhYmxlJyk7XG4gICAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKGZyYW1lLCAnI3JlZ3VsYXItbG9naW4nKTtcbiAgICBkZWJ1ZygnbmF2aWdhdGUgdG8gdGhlIHBhc3N3b3JkIGxvZ2luIHRhYicpO1xuICAgIGF3YWl0IGNsaWNrQnV0dG9uKGZyYW1lLCAnI3JlZ3VsYXItbG9naW4nKTtcbiAgICBkZWJ1Zygnd2FpdCB1bnRpbCB0aGUgcGFzc3dvcmQgbG9naW4gdGFiIGlzIGFjdGl2ZScpO1xuICAgIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChmcmFtZSwgJ3JlZ3VsYXItbG9naW4nKTtcblxuICAgIHJldHVybiBmcmFtZTtcbiAgfTtcblxuICBhc3luYyBnZXRDYXJkcygpIHtcbiAgICBjb25zdCBpbml0RGF0YSA9IGF3YWl0IHdhaXRVbnRpbChcbiAgICAgICgpID0+IGdldEZyb21TZXNzaW9uU3RvcmFnZTxJbml0UmVzcG9uc2U+KHRoaXMucGFnZSwgJ2luaXQnKSxcbiAgICAgICdnZXQgaW5pdCBkYXRhIGluIHNlc3Npb24gc3RvcmFnZScsXG4gICAgICAxMDAwMCxcbiAgICAgIDEwMDAsXG4gICAgKTtcbiAgICBpZiAoIWluaXREYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb3VsZCBub3QgZmluZCAnaW5pdCcgZGF0YSBpbiBzZXNzaW9uIHN0b3JhZ2VcIik7XG4gICAgfVxuICAgIHJldHVybiBpbml0RGF0YT8ucmVzdWx0LmNhcmRzLm1hcCgoeyBjYXJkVW5pcXVlSWQsIGxhc3Q0RGlnaXRzIH0pID0+ICh7IGNhcmRVbmlxdWVJZCwgbGFzdDREaWdpdHMgfSkpO1xuICB9XG5cbiAgYXN5bmMgZ2V0QXV0aG9yaXphdGlvbkhlYWRlcigpIHtcbiAgICBjb25zdCBhdXRoTW9kdWxlID0gYXdhaXQgZ2V0RnJvbVNlc3Npb25TdG9yYWdlPHsgYXV0aDogeyBjYWxDb25uZWN0VG9rZW46IHN0cmluZyB9IH0+KHRoaXMucGFnZSwgJ2F1dGgtbW9kdWxlJyk7XG4gICAgaWYgKCFhdXRoTW9kdWxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb3VsZCBub3QgZmluZCAnYXV0aC1tb2R1bGUnIGluIHNlc3Npb24gc3RvcmFnZVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGBDQUxBdXRoU2NoZW1lICR7YXV0aE1vZHVsZS5hdXRoLmNhbENvbm5lY3RUb2tlbn1gO1xuICB9XG5cbiAgYXN5bmMgZ2V0WFNpdGVJZCgpIHtcbiAgICAvKlxuICAgICAgSSBkb24ndCBrbm93IGlmIHRoZSBjb25zdGFudCBiZWxvdyB3aWxsIGNoYW5nZSBpbiB0aGUgZmVhdHVyZS5cbiAgICAgIElmIHNvLCB1c2UgdGhlIG5leHQgY29kZTpcblxuICAgICAgcmV0dXJuIHRoaXMucGFnZS5ldmFsdWF0ZSgoKSA9PiBuZXcgVXQoKS54U2l0ZUlkKTtcblxuICAgICAgVG8gZ2V0IHRoZSBjbGFzc25hbWUgc2VhcmNoIGZvciAneFNpdGVJZCcgaW4gdGhlIHBhZ2Ugc291cmNlXG4gICAgICBjbGFzcyBVdCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKF9lLCBvbiwgeW4pIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBfZSxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnID0gb24sXG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzU2VydmljZSA9IHluLFxuICAgICAgICAgICAgdGhpcy54U2l0ZUlkID0gXCIwOTAzMTk4Ny0yNzNFLTIzMTEtOTA2Qy04QUY4NUIxN0M4RDlcIixcbiAgICAqL1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoJzA5MDMxOTg3LTI3M0UtMjMxMS05MDZDLThBRjg1QjE3QzhEOScpO1xuICB9XG5cbiAgZ2V0TG9naW5PcHRpb25zKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscyk6IExvZ2luT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvZ2luVXJsOiBgJHtMT0dJTl9VUkx9YCxcbiAgICAgIGZpZWxkczogY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHMpLFxuICAgICAgc3VibWl0QnV0dG9uU2VsZWN0b3I6ICdidXR0b25bdHlwZT1cInN1Ym1pdFwiXScsXG4gICAgICBwb3NzaWJsZVJlc3VsdHM6IGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKCksXG4gICAgICBjaGVja1JlYWRpbmVzczogYXN5bmMgKCkgPT4gd2FpdFVudGlsRWxlbWVudEZvdW5kKHRoaXMucGFnZSwgJyNjY0xvZ2luRGVza3RvcEJ0bicpLFxuICAgICAgcHJlQWN0aW9uOiB0aGlzLm9wZW5Mb2dpblBvcHVwLFxuICAgICAgcG9zdEFjdGlvbjogYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHdhaXRGb3JOYXZpZ2F0aW9uKHRoaXMucGFnZSk7XG4gICAgICAgICAgY29uc3QgY3VycmVudFVybCA9IGF3YWl0IGdldEN1cnJlbnRVcmwodGhpcy5wYWdlKTtcbiAgICAgICAgICBpZiAoY3VycmVudFVybC5lbmRzV2l0aCgnc2l0ZS10dXRvcmlhbCcpKSB7XG4gICAgICAgICAgICBhd2FpdCBjbGlja0J1dHRvbih0aGlzLnBhZ2UsICdidXR0b24uYnRuLWNsb3NlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFVybCA9IGF3YWl0IGdldEN1cnJlbnRVcmwodGhpcy5wYWdlKTtcbiAgICAgICAgICBpZiAoY3VycmVudFVybC5lbmRzV2l0aCgnZGFzaGJvYXJkJykpIHJldHVybjtcbiAgICAgICAgICBjb25zdCByZXF1aXJlc0NoYW5nZVBhc3N3b3JkID0gYXdhaXQgaGFzQ2hhbmdlUGFzc3dvcmRGb3JtKHRoaXMucGFnZSk7XG4gICAgICAgICAgaWYgKHJlcXVpcmVzQ2hhbmdlUGFzc3dvcmQpIHJldHVybjtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXNlckFnZW50OlxuICAgICAgICAnTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzguMC4zOTA0LjEwOCBTYWZhcmkvNTM3LjM2JyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCk6IFByb21pc2U8U2NyYXBlclNjcmFwaW5nUmVzdWx0PiB7XG4gICAgY29uc3QgZGVmYXVsdFN0YXJ0TW9tZW50ID0gbW9tZW50KCkuc3VidHJhY3QoMSwgJ3llYXJzJykuc3VidHJhY3QoNiwgJ21vbnRocycpLmFkZCgxLCAnZGF5Jyk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5vcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnQgPSBtb21lbnQubWF4KGRlZmF1bHRTdGFydE1vbWVudCwgbW9tZW50KHN0YXJ0RGF0ZSkpO1xuICAgIGRlYnVnKGBmZXRjaCB0cmFuc2FjdGlvbnMgc3RhcnRpbmcgJHtzdGFydE1vbWVudC5mb3JtYXQoKX1gKTtcblxuICAgIGNvbnN0IEF1dGhvcml6YXRpb24gPSBhd2FpdCB0aGlzLmdldEF1dGhvcml6YXRpb25IZWFkZXIoKTtcbiAgICBjb25zdCBjYXJkcyA9IGF3YWl0IHRoaXMuZ2V0Q2FyZHMoKTtcbiAgICBjb25zdCB4U2l0ZUlkID0gYXdhaXQgdGhpcy5nZXRYU2l0ZUlkKCk7XG4gICAgY29uc3QgZnV0dXJlTW9udGhzVG9TY3JhcGUgPSB0aGlzLm9wdGlvbnMuZnV0dXJlTW9udGhzVG9TY3JhcGUgPz8gMTtcblxuICAgIGNvbnN0IGFjY291bnRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjYXJkcy5tYXAoYXN5bmMgY2FyZCA9PiB7XG4gICAgICAgIGNvbnN0IGZpbmFsTW9udGhUb0ZldGNoTW9tZW50ID0gbW9tZW50KCkuYWRkKGZ1dHVyZU1vbnRoc1RvU2NyYXBlLCAnbW9udGgnKTtcbiAgICAgICAgY29uc3QgbW9udGhzID0gZmluYWxNb250aFRvRmV0Y2hNb21lbnQuZGlmZihzdGFydE1vbWVudCwgJ21vbnRocycpO1xuXG4gICAgICAgIGNvbnN0IGFsbE1vbnRoc0RhdGE6IENhcmRUcmFuc2FjdGlvbkRldGFpbHNbXSA9IFtdO1xuXG4gICAgICAgIGRlYnVnKGBmZXRjaCBwZW5kaW5nIHRyYW5zYWN0aW9ucyBmb3IgY2FyZCAke2NhcmQuY2FyZFVuaXF1ZUlkfWApO1xuICAgICAgICBsZXQgcGVuZGluZ0RhdGEgPSBhd2FpdCBmZXRjaFBvc3RXaXRoaW5QYWdlPENhcmRQZW5kaW5nVHJhbnNhY3Rpb25EZXRhaWxzIHwgQ2FyZFRyYW5zYWN0aW9uRGV0YWlsc0Vycm9yPihcbiAgICAgICAgICB0aGlzLnBhZ2UsXG4gICAgICAgICAgUEVORElOR19UUkFOU0FDVElPTlNfUkVRVUVTVF9FTkRQT0lOVCxcbiAgICAgICAgICB7IGNhcmRVbmlxdWVJREFycmF5OiBbY2FyZC5jYXJkVW5pcXVlSWRdIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgQXV0aG9yaXphdGlvbixcbiAgICAgICAgICAgICdYLVNpdGUtSWQnOiB4U2l0ZUlkLFxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGRlYnVnKGBmZXRjaCBjb21wbGV0ZWQgdHJhbnNhY3Rpb25zIGZvciBjYXJkICR7Y2FyZC5jYXJkVW5pcXVlSWR9YCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IG1vbnRoczsgaSArPSAxKSB7XG4gICAgICAgICAgY29uc3QgbW9udGggPSBmaW5hbE1vbnRoVG9GZXRjaE1vbWVudC5jbG9uZSgpLnN1YnRyYWN0KGksICdtb250aHMnKTtcbiAgICAgICAgICBjb25zdCBtb250aERhdGEgPSBhd2FpdCBmZXRjaFBvc3RXaXRoaW5QYWdlPENhcmRUcmFuc2FjdGlvbkRldGFpbHMgfCBDYXJkVHJhbnNhY3Rpb25EZXRhaWxzRXJyb3I+KFxuICAgICAgICAgICAgdGhpcy5wYWdlLFxuICAgICAgICAgICAgVFJBTlNBQ1RJT05TX1JFUVVFU1RfRU5EUE9JTlQsXG4gICAgICAgICAgICB7IGNhcmRVbmlxdWVJZDogY2FyZC5jYXJkVW5pcXVlSWQsIG1vbnRoOiBtb250aC5mb3JtYXQoJ00nKSwgeWVhcjogbW9udGguZm9ybWF0KCdZWVlZJykgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbixcbiAgICAgICAgICAgICAgJ1gtU2l0ZS1JZCc6IHhTaXRlSWQsXG4gICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAobW9udGhEYXRhPy5zdGF0dXNDb2RlICE9PSAxKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgZmFpbGVkIHRvIGZldGNoIHRyYW5zYWN0aW9ucyBmb3IgY2FyZCAke2NhcmQubGFzdDREaWdpdHN9LiBNZXNzYWdlOiAke21vbnRoRGF0YT8udGl0bGUgfHwgJyd9YCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIWlzQ2FyZFRyYW5zYWN0aW9uRGV0YWlscyhtb250aERhdGEpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21vbnRoRGF0YSBpcyBub3Qgb2YgdHlwZSBDYXJkVHJhbnNhY3Rpb25EZXRhaWxzJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWxsTW9udGhzRGF0YS5wdXNoKG1vbnRoRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGVuZGluZ0RhdGE/LnN0YXR1c0NvZGUgIT09IDEgJiYgcGVuZGluZ0RhdGE/LnN0YXR1c0NvZGUgIT09IDk2KSB7XG4gICAgICAgICAgZGVidWcoXG4gICAgICAgICAgICBgZmFpbGVkIHRvIGZldGNoIHBlbmRpbmcgdHJhbnNhY3Rpb25zIGZvciBjYXJkICR7Y2FyZC5sYXN0NERpZ2l0c30uIE1lc3NhZ2U6ICR7cGVuZGluZ0RhdGE/LnRpdGxlIHx8ICcnfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwZW5kaW5nRGF0YSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzQ2FyZFBlbmRpbmdUcmFuc2FjdGlvbkRldGFpbHMocGVuZGluZ0RhdGEpKSB7XG4gICAgICAgICAgZGVidWcoJ3BlbmRpbmdEYXRhIGlzIG5vdCBvZiB0eXBlIENhcmRUcmFuc2FjdGlvbkRldGFpbHMnKTtcbiAgICAgICAgICBwZW5kaW5nRGF0YSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSBjb252ZXJ0UGFyc2VkRGF0YVRvVHJhbnNhY3Rpb25zKGFsbE1vbnRoc0RhdGEsIHBlbmRpbmdEYXRhKTtcblxuICAgICAgICBkZWJ1ZygnZmlsZXIgb3V0IG9sZCB0cmFuc2FjdGlvbnMnKTtcbiAgICAgICAgY29uc3QgdHhucyA9XG4gICAgICAgICAgKHRoaXMub3B0aW9ucy5vdXRwdXREYXRhPy5lbmFibGVUcmFuc2FjdGlvbnNGaWx0ZXJCeURhdGUgPz8gdHJ1ZSlcbiAgICAgICAgICAgID8gZmlsdGVyT2xkVHJhbnNhY3Rpb25zKHRyYW5zYWN0aW9ucywgbW9tZW50KHN0YXJ0RGF0ZSksIHRoaXMub3B0aW9ucy5jb21iaW5lSW5zdGFsbG1lbnRzIHx8IGZhbHNlKVxuICAgICAgICAgICAgOiB0cmFuc2FjdGlvbnM7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eG5zLFxuICAgICAgICAgIGFjY291bnROdW1iZXI6IGNhcmQubGFzdDREaWdpdHMsXG4gICAgICAgIH0gYXMgVHJhbnNhY3Rpb25zQWNjb3VudDtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBkZWJ1ZygncmV0dXJuIHRoZSBzY3JhcGVkIGFjY291bnRzJyk7XG5cbiAgICBkZWJ1ZyhKU09OLnN0cmluZ2lmeShhY2NvdW50cywgbnVsbCwgMikpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgYWNjb3VudHMsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBWaXNhQ2FsU2NyYXBlcjtcbiJdfQ==
276
+ var _default = exports.default = VisaCalScraper;
277
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZGVidWciLCJfZWxlbWVudHNJbnRlcmFjdGlvbnMiLCJfZmV0Y2giLCJfbmF2aWdhdGlvbiIsIl9zdG9yYWdlIiwiX3RyYW5zYWN0aW9ucyIsIl93YWl0aW5nIiwiX3RyYW5zYWN0aW9uczIiLCJfYmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIkxPR0lOX1VSTCIsIlRSQU5TQUNUSU9OU19SRVFVRVNUX0VORFBPSU5UIiwiUEVORElOR19UUkFOU0FDVElPTlNfUkVRVUVTVF9FTkRQT0lOVCIsIkludmFsaWRQYXNzd29yZE1lc3NhZ2UiLCJkZWJ1ZyIsImdldERlYnVnIiwiVHJuVHlwZUNvZGUiLCJpc1BlbmRpbmciLCJ0cmFuc2FjdGlvbiIsImRlYkNyZERhdGUiLCJ1bmRlZmluZWQiLCJpc0NhcmRUcmFuc2FjdGlvbkRldGFpbHMiLCJyZXN1bHQiLCJpc0NhcmRQZW5kaW5nVHJhbnNhY3Rpb25EZXRhaWxzIiwiZ2V0TG9naW5GcmFtZSIsInBhZ2UiLCJmcmFtZSIsIndhaXRVbnRpbCIsImZyYW1lcyIsImZpbmQiLCJmIiwidXJsIiwiaW5jbHVkZXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsIkVycm9yIiwiaGFzSW52YWxpZFBhc3N3b3JkRXJyb3IiLCJlcnJvckZvdW5kIiwiZWxlbWVudFByZXNlbnRPblBhZ2UiLCJlcnJvck1lc3NhZ2UiLCJwYWdlRXZhbCIsIml0ZW0iLCJpbm5lclRleHQiLCJoYXNDaGFuZ2VQYXNzd29yZEZvcm0iLCJnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cyIsInVybHMiLCJMb2dpblJlc3VsdHMiLCJTdWNjZXNzIiwiSW52YWxpZFBhc3N3b3JkIiwib3B0aW9ucyIsIkNoYW5nZVBhc3N3b3JkIiwiY3JlYXRlTG9naW5GaWVsZHMiLCJjcmVkZW50aWFscyIsInNlbGVjdG9yIiwidmFsdWUiLCJ1c2VybmFtZSIsInBhc3N3b3JkIiwiY29udmVydFBhcnNlZERhdGFUb1RyYW5zYWN0aW9ucyIsImRhdGEiLCJwZW5kaW5nRGF0YSIsInBlbmRpbmdUcmFuc2FjdGlvbnMiLCJjYXJkc0xpc3QiLCJmbGF0TWFwIiwiY2FyZCIsImF1dGhEZXRhbGlzTGlzdCIsImJhbmtBY2NvdW50cyIsIm1vbnRoRGF0YSIsInJlZ3VsYXJEZWJpdERheXMiLCJhY2NvdW50cyIsImRlYml0RGF0ZXMiLCJpbW1lZGlhdGVEZWJpdERheXMiLCJpbW1pZGlhdGVEZWJpdHMiLCJkZWJpdERheXMiLCJjb21wbGV0ZWRUcmFuc2FjdGlvbnMiLCJkZWJpdERhdGUiLCJ0cmFuc2FjdGlvbnMiLCJhbGwiLCJtYXAiLCJudW1PZlBheW1lbnRzIiwibnVtYmVyT2ZQYXltZW50cyIsImluc3RhbGxtZW50cyIsIm51bWJlciIsImN1clBheW1lbnROdW0iLCJ0b3RhbCIsImRhdGUiLCJtb21lbnQiLCJ0cm5QdXJjaGFzZURhdGUiLCJjaGFyZ2VkQW1vdW50IiwidHJuQW10IiwiYW10QmVmb3JlQ29udkFuZEluZGV4Iiwib3JpZ2luYWxBbW91bnQiLCJ0cm5UeXBlQ29kZSIsImNyZWRpdCIsImlkZW50aWZpZXIiLCJ0cm5JbnRJZCIsInR5cGUiLCJyZWd1bGFyIiwic3RhbmRpbmdPcmRlciIsIlRyYW5zYWN0aW9uVHlwZXMiLCJOb3JtYWwiLCJJbnN0YWxsbWVudHMiLCJzdGF0dXMiLCJUcmFuc2FjdGlvblN0YXR1c2VzIiwiUGVuZGluZyIsIkNvbXBsZXRlZCIsImFkZCIsInRvSVNPU3RyaW5nIiwicHJvY2Vzc2VkRGF0ZSIsIkRhdGUiLCJvcmlnaW5hbEN1cnJlbmN5IiwidHJuQ3VycmVuY3lTeW1ib2wiLCJjaGFyZ2VkQ3VycmVuY3kiLCJkZWJDcmRDdXJyZW5jeVN5bWJvbCIsImRlc2NyaXB0aW9uIiwibWVyY2hhbnROYW1lIiwibWVtbyIsInRyYW5zVHlwZUNvbW1lbnREZXRhaWxzIiwidG9TdHJpbmciLCJjYXRlZ29yeSIsImJyYW5jaENvZGVEZXNjIiwiVmlzYUNhbFNjcmFwZXIiLCJCYXNlU2NyYXBlcldpdGhCcm93c2VyIiwib3BlbkxvZ2luUG9wdXAiLCJ3YWl0VW50aWxFbGVtZW50Rm91bmQiLCJjbGlja0J1dHRvbiIsImdldENhcmRzIiwiaW5pdERhdGEiLCJnZXRGcm9tU2Vzc2lvblN0b3JhZ2UiLCJjYXJkcyIsImNhcmRVbmlxdWVJZCIsImxhc3Q0RGlnaXRzIiwiZ2V0QXV0aG9yaXphdGlvbkhlYWRlciIsImF1dGhNb2R1bGUiLCJhdXRoIiwiY2FsQ29ubmVjdFRva2VuIiwiZ2V0WFNpdGVJZCIsImdldExvZ2luT3B0aW9ucyIsImxvZ2luVXJsIiwiZmllbGRzIiwic3VibWl0QnV0dG9uU2VsZWN0b3IiLCJwb3NzaWJsZVJlc3VsdHMiLCJjaGVja1JlYWRpbmVzcyIsInByZUFjdGlvbiIsInBvc3RBY3Rpb24iLCJ3YWl0Rm9yTmF2aWdhdGlvbiIsImN1cnJlbnRVcmwiLCJnZXRDdXJyZW50VXJsIiwiZW5kc1dpdGgiLCJyZXF1aXJlc0NoYW5nZVBhc3N3b3JkIiwidXNlckFnZW50IiwiZmV0Y2hEYXRhIiwiZGVmYXVsdFN0YXJ0TW9tZW50Iiwic3VidHJhY3QiLCJzdGFydERhdGUiLCJ0b0RhdGUiLCJzdGFydE1vbWVudCIsIm1heCIsImZvcm1hdCIsIkF1dGhvcml6YXRpb24iLCJ4U2l0ZUlkIiwiZnV0dXJlTW9udGhzVG9TY3JhcGUiLCJmaW5hbE1vbnRoVG9GZXRjaE1vbWVudCIsIm1vbnRocyIsImRpZmYiLCJhbGxNb250aHNEYXRhIiwiZmV0Y2hQb3N0V2l0aGluUGFnZSIsImNhcmRVbmlxdWVJREFycmF5IiwiaSIsIm1vbnRoIiwiY2xvbmUiLCJ5ZWFyIiwic3RhdHVzQ29kZSIsInRpdGxlIiwicHVzaCIsInR4bnMiLCJvdXRwdXREYXRhIiwiZW5hYmxlVHJhbnNhY3Rpb25zRmlsdGVyQnlEYXRlIiwiZmlsdGVyT2xkVHJhbnNhY3Rpb25zIiwiY29tYmluZUluc3RhbGxtZW50cyIsImFjY291bnROdW1iZXIiLCJKU09OIiwic3RyaW5naWZ5Iiwic3VjY2VzcyIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy92aXNhLWNhbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyB0eXBlIEZyYW1lLCB0eXBlIFBhZ2UgfSBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IHsgZ2V0RGVidWcgfSBmcm9tICcuLi9oZWxwZXJzL2RlYnVnJztcbmltcG9ydCB7IGNsaWNrQnV0dG9uLCBlbGVtZW50UHJlc2VudE9uUGFnZSwgcGFnZUV2YWwsIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCB9IGZyb20gJy4uL2hlbHBlcnMvZWxlbWVudHMtaW50ZXJhY3Rpb25zJztcbmltcG9ydCB7IGZldGNoUG9zdFdpdGhpblBhZ2UgfSBmcm9tICcuLi9oZWxwZXJzL2ZldGNoJztcbmltcG9ydCB7IGdldEN1cnJlbnRVcmwsIHdhaXRGb3JOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vaGVscGVycy9uYXZpZ2F0aW9uJztcbmltcG9ydCB7IGdldEZyb21TZXNzaW9uU3RvcmFnZSB9IGZyb20gJy4uL2hlbHBlcnMvc3RvcmFnZSc7XG5pbXBvcnQgeyBmaWx0ZXJPbGRUcmFuc2FjdGlvbnMgfSBmcm9tICcuLi9oZWxwZXJzL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyB3YWl0VW50aWwgfSBmcm9tICcuLi9oZWxwZXJzL3dhaXRpbmcnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TdGF0dXNlcywgVHJhbnNhY3Rpb25UeXBlcywgdHlwZSBUcmFuc2FjdGlvbiwgdHlwZSBUcmFuc2FjdGlvbnNBY2NvdW50IH0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIsIExvZ2luUmVzdWx0cywgdHlwZSBMb2dpbk9wdGlvbnMgfSBmcm9tICcuL2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXInO1xuaW1wb3J0IHsgdHlwZSBTY3JhcGVyU2NyYXBpbmdSZXN1bHQgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5cbmNvbnN0IExPR0lOX1VSTCA9ICdodHRwczovL3d3dy5jYWwtb25saW5lLmNvLmlsLyc7XG5jb25zdCBUUkFOU0FDVElPTlNfUkVRVUVTVF9FTkRQT0lOVCA9XG4gICdodHRwczovL2FwaS5jYWwtb25saW5lLmNvLmlsL1RyYW5zYWN0aW9ucy9hcGkvdHJhbnNhY3Rpb25zRGV0YWlscy9nZXRDYXJkVHJhbnNhY3Rpb25zRGV0YWlscyc7XG5jb25zdCBQRU5ESU5HX1RSQU5TQUNUSU9OU19SRVFVRVNUX0VORFBPSU5UID1cbiAgJ2h0dHBzOi8vYXBpLmNhbC1vbmxpbmUuY28uaWwvVHJhbnNhY3Rpb25zL2FwaS9hcHByb3ZhbHMvZ2V0Q2xlYXJhbmNlUmVxdWVzdHMnO1xuXG5jb25zdCBJbnZhbGlkUGFzc3dvcmRNZXNzYWdlID0gJ9ep150g15TXntep16rXntepINeQ15Ug15TXodeZ16HXnteUINep15TXldeW16DXlSDXqdeS15XXmdeZ150nO1xuXG5jb25zdCBkZWJ1ZyA9IGdldERlYnVnKCd2aXNhLWNhbCcpO1xuXG5lbnVtIFRyblR5cGVDb2RlIHtcbiAgcmVndWxhciA9ICc1JyxcbiAgY3JlZGl0ID0gJzYnLFxuICBpbnN0YWxsbWVudHMgPSAnOCcsXG4gIHN0YW5kaW5nT3JkZXIgPSAnOScsXG59XG5cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBhbXRCZWZvcmVDb252QW5kSW5kZXg6IG51bWJlcjtcbiAgYnJhbmNoQ29kZURlc2M6IHN0cmluZztcbiAgY2FzaEFjY01hbmFnZXJOYW1lOiBudWxsO1xuICBjYXNoQWNjb3VudE1hbmFnZXI6IG51bGw7XG4gIGNhc2hBY2NvdW50VHJuQW10OiBudW1iZXI7XG4gIGNoYXJnZUV4dGVybmFsVG9DYXJkQ29tbWVudDogc3RyaW5nO1xuICBjb21tZW50czogW107XG4gIGN1clBheW1lbnROdW06IG51bWJlcjtcbiAgZGViQ3JkQ3VycmVuY3lTeW1ib2w6IEN1cnJlbmN5U3ltYm9sO1xuICBkZWJDcmREYXRlOiBzdHJpbmc7XG4gIGRlYml0U3ByZWFkSW5kOiBib29sZWFuO1xuICBkaXNjb3VudEFtb3VudDogdW5rbm93bjtcbiAgZGlzY291bnRSZWFzb246IHVua25vd247XG4gIGltbWVkaWF0ZUNvbW1lbnRzOiBbXTtcbiAgaXNJbW1lZGlhdGVDb21tZW50SW5kOiBib29sZWFuO1xuICBpc0ltbWVkaWF0ZUhIS0luZDogYm9vbGVhbjtcbiAgaXNNYXJnYXJpdGE6IGJvb2xlYW47XG4gIGlzU3ByZWFkUGF5bWVuc3RBYnJvYWQ6IGJvb2xlYW47XG4gIGxpbmtlZENvbW1lbnRzOiBbXTtcbiAgbWVyY2hhbnRBZGRyZXNzOiBzdHJpbmc7XG4gIG1lcmNoYW50TmFtZTogc3RyaW5nO1xuICBtZXJjaGFudFBob25lTm86IHN0cmluZztcbiAgbnVtT2ZQYXltZW50czogbnVtYmVyO1xuICBvbkdvaW5nVHJhbnNhY3Rpb25zQ29tbWVudDogc3RyaW5nO1xuICByZWZ1bmRJbmQ6IGJvb2xlYW47XG4gIHJvdW5kaW5nQW1vdW50OiB1bmtub3duO1xuICByb3VuZGluZ1JlYXNvbjogdW5rbm93bjtcbiAgdG9rZW5JbmQ6IDA7XG4gIHRva2VuTnVtYmVyUGFydDQ6ICcnO1xuICB0cmFuc0NhcmRQcmVzZW50SW5kOiBib29sZWFuO1xuICB0cmFuc1R5cGVDb21tZW50RGV0YWlsczogW107XG4gIHRybkFtdDogbnVtYmVyO1xuICB0cm5DdXJyZW5jeVN5bWJvbDogQ3VycmVuY3lTeW1ib2w7XG4gIHRybkV4YWNXYXk6IG51bWJlcjtcbiAgdHJuSW50SWQ6IHN0cmluZztcbiAgdHJuTnVtYXJldG9yOiBudW1iZXI7XG4gIHRyblB1cmNoYXNlRGF0ZTogc3RyaW5nO1xuICB0cm5UeXBlOiBzdHJpbmc7XG4gIHRyblR5cGVDb2RlOiBUcm5UeXBlQ29kZTtcbiAgd2FsbGV0UHJvdmlkZXJDb2RlOiAwO1xuICB3YWxsZXRQcm92aWRlckRlc2M6ICcnO1xuICBlYXJseVBheW1lbnRJbmQ6IGJvb2xlYW47XG59XG5pbnRlcmZhY2UgU2NyYXBlZFBlbmRpbmdUcmFuc2FjdGlvbiB7XG4gIG1lcmNoYW50SUQ6IHN0cmluZztcbiAgbWVyY2hhbnROYW1lOiBzdHJpbmc7XG4gIHRyblB1cmNoYXNlRGF0ZTogc3RyaW5nO1xuICB3YWxsZXRUcmFuSW5kOiBudW1iZXI7XG4gIHRyYW5zYWN0aW9uc09yaWdpbjogbnVtYmVyO1xuICB0cm5BbXQ6IG51bWJlcjtcbiAgdHBhQXBwcm92YWxBbW91bnQ6IHVua25vd247XG4gIHRybkN1cnJlbmN5U3ltYm9sOiBDdXJyZW5jeVN5bWJvbDtcbiAgdHJuVHlwZUNvZGU6IFRyblR5cGVDb2RlO1xuICB0cm5UeXBlOiBzdHJpbmc7XG4gIGJyYW5jaENvZGVEZXNjOiBzdHJpbmc7XG4gIHRyYW5zQ2FyZFByZXNlbnRJbmQ6IGJvb2xlYW47XG4gIGo1SW5kaWNhdG9yOiBzdHJpbmc7XG4gIG51bWJlck9mUGF5bWVudHM6IG51bWJlcjtcbiAgZmlyc3RQYXltZW50QW1vdW50OiBudW1iZXI7XG4gIHRyYW5zVHlwZUNvbW1lbnREZXRhaWxzOiBbXTtcbn1cbmludGVyZmFjZSBJbml0UmVzcG9uc2Uge1xuICByZXN1bHQ6IHtcbiAgICBjYXJkczoge1xuICAgICAgY2FyZFVuaXF1ZUlkOiBzdHJpbmc7XG4gICAgICBsYXN0NERpZ2l0czogc3RyaW5nO1xuICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgICB9W107XG4gIH07XG59XG50eXBlIEN1cnJlbmN5U3ltYm9sID0gc3RyaW5nO1xuaW50ZXJmYWNlIENhcmRUcmFuc2FjdGlvbkRldGFpbHNFcnJvciB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbn1cbmludGVyZmFjZSBDYXJkVHJhbnNhY3Rpb25EZXRhaWxzIGV4dGVuZHMgQ2FyZFRyYW5zYWN0aW9uRGV0YWlsc0Vycm9yIHtcbiAgcmVzdWx0OiB7XG4gICAgYmFua0FjY291bnRzOiB7XG4gICAgICBiYW5rQWNjb3VudE51bTogc3RyaW5nO1xuICAgICAgYmFua05hbWU6IHN0cmluZztcbiAgICAgIGNob2ljZUV4dGVybmFsVHJhbnNhY3Rpb25zOiBhbnk7XG4gICAgICBjdXJyZW50QmFua0FjY291bnRJbmQ6IGJvb2xlYW47XG4gICAgICBkZWJpdERhdGVzOiB7XG4gICAgICAgIGJhc2tldEFtb3VudENvbW1lbnQ6IHVua25vd247XG4gICAgICAgIGNob2ljZUhIS0RlYml0OiBudW1iZXI7XG4gICAgICAgIGRhdGU6IHN0cmluZztcbiAgICAgICAgZGViaXRSZWFzb246IHVua25vd247XG4gICAgICAgIGZpeERlYml0QW1vdW50OiBudW1iZXI7XG4gICAgICAgIGZyb21QdXJjaGFzZURhdGU6IHN0cmluZztcbiAgICAgICAgaXNDaG9pY2VSZXBhaW1lbnQ6IGJvb2xlYW47XG4gICAgICAgIHRvUHVyY2hhc2VEYXRlOiBzdHJpbmc7XG4gICAgICAgIHRvdGFsQmFza2V0QW1vdW50OiBudW1iZXI7XG4gICAgICAgIHRvdGFsRGViaXRzOiB7XG4gICAgICAgICAgY3VycmVuY3lTeW1ib2w6IEN1cnJlbmN5U3ltYm9sO1xuICAgICAgICAgIGFtb3VudDogbnVtYmVyO1xuICAgICAgICB9W107XG4gICAgICAgIHRyYW5zYWN0aW9uczogU2NyYXBlZFRyYW5zYWN0aW9uW107XG4gICAgICB9W107XG4gICAgICBpbW1pZGlhdGVEZWJpdHM6IHsgdG90YWxEZWJpdHM6IFtdOyBkZWJpdERheXM6IFtdIH07XG4gICAgfVtdO1xuICAgIGJsb2NrZWRDYXJkSW5kOiBib29sZWFuO1xuICB9O1xuICBzdGF0dXNDb2RlOiAxO1xuICBzdGF0dXNEZXNjcmlwdGlvbjogc3RyaW5nO1xuICBzdGF0dXNUaXRsZTogc3RyaW5nO1xufVxuaW50ZXJmYWNlIENhcmRQZW5kaW5nVHJhbnNhY3Rpb25EZXRhaWxzIGV4dGVuZHMgQ2FyZFRyYW5zYWN0aW9uRGV0YWlsc0Vycm9yIHtcbiAgcmVzdWx0OiB7XG4gICAgY2FyZHNMaXN0OiB7XG4gICAgICBjYXJkVW5pcXVlSUQ6IHN0cmluZztcbiAgICAgIGF1dGhEZXRhbGlzTGlzdDogU2NyYXBlZFBlbmRpbmdUcmFuc2FjdGlvbltdO1xuICAgIH1bXTtcbiAgfTtcbiAgc3RhdHVzQ29kZTogMTtcbiAgc3RhdHVzRGVzY3JpcHRpb246IHN0cmluZztcbiAgc3RhdHVzVGl0bGU6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gaXNQZW5kaW5nKFxuICB0cmFuc2FjdGlvbjogU2NyYXBlZFRyYW5zYWN0aW9uIHwgU2NyYXBlZFBlbmRpbmdUcmFuc2FjdGlvbixcbik6IHRyYW5zYWN0aW9uIGlzIFNjcmFwZWRQZW5kaW5nVHJhbnNhY3Rpb24ge1xuICByZXR1cm4gKHRyYW5zYWN0aW9uIGFzIFNjcmFwZWRUcmFuc2FjdGlvbikuZGViQ3JkRGF0ZSA9PT0gdW5kZWZpbmVkOyAvLyBhbiBhcmJpdHJhcnkgZmllbGQgdGhhdCBvbmx5IGFwcGVhcnMgaW4gYSBjb21wbGV0ZWQgdHJhbnNhY3Rpb25cbn1cblxuZnVuY3Rpb24gaXNDYXJkVHJhbnNhY3Rpb25EZXRhaWxzKFxuICByZXN1bHQ6IENhcmRUcmFuc2FjdGlvbkRldGFpbHMgfCBDYXJkVHJhbnNhY3Rpb25EZXRhaWxzRXJyb3IsXG4pOiByZXN1bHQgaXMgQ2FyZFRyYW5zYWN0aW9uRGV0YWlscyB7XG4gIHJldHVybiAocmVzdWx0IGFzIENhcmRUcmFuc2FjdGlvbkRldGFpbHMpLnJlc3VsdCAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0NhcmRQZW5kaW5nVHJhbnNhY3Rpb25EZXRhaWxzKFxuICByZXN1bHQ6IENhcmRQZW5kaW5nVHJhbnNhY3Rpb25EZXRhaWxzIHwgQ2FyZFRyYW5zYWN0aW9uRGV0YWlsc0Vycm9yLFxuKTogcmVzdWx0IGlzIENhcmRQZW5kaW5nVHJhbnNhY3Rpb25EZXRhaWxzIHtcbiAgcmV0dXJuIChyZXN1bHQgYXMgQ2FyZFBlbmRpbmdUcmFuc2FjdGlvbkRldGFpbHMpLnJlc3VsdCAhPT0gdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMb2dpbkZyYW1lKHBhZ2U6IFBhZ2UpIHtcbiAgbGV0IGZyYW1lOiBGcmFtZSB8IG51bGwgPSBudWxsO1xuICBkZWJ1Zygnd2FpdCB1bnRpbCBsb2dpbiBmcmFtZSBmb3VuZCcpO1xuICBhd2FpdCB3YWl0VW50aWwoXG4gICAgKCkgPT4ge1xuICAgICAgZnJhbWUgPSBwYWdlLmZyYW1lcygpLmZpbmQoZiA9PiBmLnVybCgpLmluY2x1ZGVzKCdjb25uZWN0JykpIHx8IG51bGw7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCEhZnJhbWUpO1xuICAgIH0sXG4gICAgJ3dhaXQgZm9yIGlmcmFtZSB3aXRoIGxvZ2luIGZvcm0nLFxuICAgIDEwMDAwLFxuICAgIDEwMDAsXG4gICk7XG5cbiAgaWYgKCFmcmFtZSkge1xuICAgIGRlYnVnKCdmYWlsZWQgdG8gZmluZCBsb2dpbiBmcmFtZSBmb3IgMTAgc2Vjb25kcycpO1xuICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGV4dHJhY3QgbG9naW4gaWZyYW1lJyk7XG4gIH1cblxuICByZXR1cm4gZnJhbWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc0ludmFsaWRQYXNzd29yZEVycm9yKHBhZ2U6IFBhZ2UpIHtcbiAgY29uc3QgZnJhbWUgPSBhd2FpdCBnZXRMb2dpbkZyYW1lKHBhZ2UpO1xuICBjb25zdCBlcnJvckZvdW5kID0gYXdhaXQgZWxlbWVudFByZXNlbnRPblBhZ2UoZnJhbWUsICdkaXYuZ2VuZXJhbC1lcnJvciA+IGRpdicpO1xuICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvckZvdW5kXG4gICAgPyBhd2FpdCBwYWdlRXZhbChmcmFtZSwgJ2Rpdi5nZW5lcmFsLWVycm9yID4gZGl2JywgJycsIGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4gKGl0ZW0gYXMgSFRNTERpdkVsZW1lbnQpLmlubmVyVGV4dDtcbiAgICAgIH0pXG4gICAgOiAnJztcbiAgcmV0dXJuIGVycm9yTWVzc2FnZSA9PT0gSW52YWxpZFBhc3N3b3JkTWVzc2FnZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFzQ2hhbmdlUGFzc3dvcmRGb3JtKHBhZ2U6IFBhZ2UpIHtcbiAgY29uc3QgZnJhbWUgPSBhd2FpdCBnZXRMb2dpbkZyYW1lKHBhZ2UpO1xuICBjb25zdCBlcnJvckZvdW5kID0gYXdhaXQgZWxlbWVudFByZXNlbnRPblBhZ2UoZnJhbWUsICcuY2hhbmdlLXBhc3N3b3JkLXN1YnRpdGxlJyk7XG4gIHJldHVybiBlcnJvckZvdW5kO1xufVxuXG5mdW5jdGlvbiBnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cygpIHtcbiAgZGVidWcoJ3JldHVybiBwb3NzaWJsZSBsb2dpbiByZXN1bHRzJyk7XG4gIGNvbnN0IHVybHM6IExvZ2luT3B0aW9uc1sncG9zc2libGVSZXN1bHRzJ10gPSB7XG4gICAgW0xvZ2luUmVzdWx0cy5TdWNjZXNzXTogWy9kYXNoYm9hcmQvaV0sXG4gICAgW0xvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmRdOiBbXG4gICAgICBhc3luYyAob3B0aW9ucz86IHsgcGFnZT86IFBhZ2UgfSkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlID0gb3B0aW9ucz8ucGFnZTtcbiAgICAgICAgaWYgKCFwYWdlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNJbnZhbGlkUGFzc3dvcmRFcnJvcihwYWdlKTtcbiAgICAgIH0sXG4gICAgXSxcbiAgICAvLyBbTG9naW5SZXN1bHRzLkFjY291bnRCbG9ja2VkXTogW10sIC8vIFRPRE8gYWRkIHdoZW4gcmVhY2hpbmcgdGhpcyBzY2VuYXJpb1xuICAgIFtMb2dpblJlc3VsdHMuQ2hhbmdlUGFzc3dvcmRdOiBbXG4gICAgICBhc3luYyAob3B0aW9ucz86IHsgcGFnZT86IFBhZ2UgfSkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlID0gb3B0aW9ucz8ucGFnZTtcbiAgICAgICAgaWYgKCFwYWdlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNDaGFuZ2VQYXNzd29yZEZvcm0ocGFnZSk7XG4gICAgICB9LFxuICAgIF0sXG4gIH07XG4gIHJldHVybiB1cmxzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgZGVidWcoJ2NyZWF0ZSBsb2dpbiBmaWVsZHMgZm9yIHVzZXJuYW1lIGFuZCBwYXNzd29yZCcpO1xuICByZXR1cm4gW1xuICAgIHsgc2VsZWN0b3I6ICdbZm9ybWNvbnRyb2xuYW1lPVwidXNlck5hbWVcIl0nLCB2YWx1ZTogY3JlZGVudGlhbHMudXNlcm5hbWUgfSxcbiAgICB7IHNlbGVjdG9yOiAnW2Zvcm1jb250cm9sbmFtZT1cInBhc3N3b3JkXCJdJywgdmFsdWU6IGNyZWRlbnRpYWxzLnBhc3N3b3JkIH0sXG4gIF07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRQYXJzZWREYXRhVG9UcmFuc2FjdGlvbnMoXG4gIGRhdGE6IENhcmRUcmFuc2FjdGlvbkRldGFpbHNbXSxcbiAgcGVuZGluZ0RhdGE/OiBDYXJkUGVuZGluZ1RyYW5zYWN0aW9uRGV0YWlscyB8IG51bGwsXG4pOiBUcmFuc2FjdGlvbltdIHtcbiAgY29uc3QgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IHBlbmRpbmdEYXRhPy5yZXN1bHRcbiAgICA/IHBlbmRpbmdEYXRhLnJlc3VsdC5jYXJkc0xpc3QuZmxhdE1hcChjYXJkID0+IGNhcmQuYXV0aERldGFsaXNMaXN0KVxuICAgIDogW107XG5cbiAgY29uc3QgYmFua0FjY291bnRzID0gZGF0YS5mbGF0TWFwKG1vbnRoRGF0YSA9PiBtb250aERhdGEucmVzdWx0LmJhbmtBY2NvdW50cyk7XG4gIGNvbnN0IHJlZ3VsYXJEZWJpdERheXMgPSBiYW5rQWNjb3VudHMuZmxhdE1hcChhY2NvdW50cyA9PiBhY2NvdW50cy5kZWJpdERhdGVzKTtcbiAgY29uc3QgaW1tZWRpYXRlRGViaXREYXlzID0gYmFua0FjY291bnRzLmZsYXRNYXAoYWNjb3VudHMgPT4gYWNjb3VudHMuaW1taWRpYXRlRGViaXRzLmRlYml0RGF5cyk7XG4gIGNvbnN0IGNvbXBsZXRlZFRyYW5zYWN0aW9ucyA9IFsuLi5yZWd1bGFyRGViaXREYXlzLCAuLi5pbW1lZGlhdGVEZWJpdERheXNdLmZsYXRNYXAoXG4gICAgZGViaXREYXRlID0+IGRlYml0RGF0ZS50cmFuc2FjdGlvbnMsXG4gICk7XG5cbiAgY29uc3QgYWxsOiAoU2NyYXBlZFRyYW5zYWN0aW9uIHwgU2NyYXBlZFBlbmRpbmdUcmFuc2FjdGlvbilbXSA9IFsuLi5wZW5kaW5nVHJhbnNhY3Rpb25zLCAuLi5jb21wbGV0ZWRUcmFuc2FjdGlvbnNdO1xuXG4gIHJldHVybiBhbGwubWFwKHRyYW5zYWN0aW9uID0+IHtcbiAgICBjb25zdCBudW1PZlBheW1lbnRzID0gaXNQZW5kaW5nKHRyYW5zYWN0aW9uKSA/IHRyYW5zYWN0aW9uLm51bWJlck9mUGF5bWVudHMgOiB0cmFuc2FjdGlvbi5udW1PZlBheW1lbnRzO1xuICAgIGNvbnN0IGluc3RhbGxtZW50cyA9IG51bU9mUGF5bWVudHNcbiAgICAgID8ge1xuICAgICAgICAgIG51bWJlcjogaXNQZW5kaW5nKHRyYW5zYWN0aW9uKSA/IDEgOiB0cmFuc2FjdGlvbi5jdXJQYXltZW50TnVtLFxuICAgICAgICAgIHRvdGFsOiBudW1PZlBheW1lbnRzLFxuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGRhdGUgPSBtb21lbnQodHJhbnNhY3Rpb24udHJuUHVyY2hhc2VEYXRlKTtcblxuICAgIGxldCBjaGFyZ2VkQW1vdW50ID0gaXNQZW5kaW5nKHRyYW5zYWN0aW9uKSA/IHRyYW5zYWN0aW9uLnRybkFtdCAqIC0xIDogdHJhbnNhY3Rpb24uYW10QmVmb3JlQ29udkFuZEluZGV4ICogLTE7XG4gICAgbGV0IG9yaWdpbmFsQW1vdW50ID0gdHJhbnNhY3Rpb24udHJuQW10ICogLTE7XG5cbiAgICBpZiAodHJhbnNhY3Rpb24udHJuVHlwZUNvZGUgPT09IFRyblR5cGVDb2RlLmNyZWRpdCkge1xuICAgICAgY2hhcmdlZEFtb3VudCA9IGlzUGVuZGluZyh0cmFuc2FjdGlvbikgPyB0cmFuc2FjdGlvbi50cm5BbXQgOiB0cmFuc2FjdGlvbi5hbXRCZWZvcmVDb252QW5kSW5kZXg7XG4gICAgICBvcmlnaW5hbEFtb3VudCA9IHRyYW5zYWN0aW9uLnRybkFtdDtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQ6IFRyYW5zYWN0aW9uID0ge1xuICAgICAgaWRlbnRpZmllcjogIWlzUGVuZGluZyh0cmFuc2FjdGlvbikgPyB0cmFuc2FjdGlvbi50cm5JbnRJZCA6IHVuZGVmaW5lZCxcbiAgICAgIHR5cGU6IFtUcm5UeXBlQ29kZS5yZWd1bGFyLCBUcm5UeXBlQ29kZS5zdGFuZGluZ09yZGVyXS5pbmNsdWRlcyh0cmFuc2FjdGlvbi50cm5UeXBlQ29kZSlcbiAgICAgICAgPyBUcmFuc2FjdGlvblR5cGVzLk5vcm1hbFxuICAgICAgICA6IFRyYW5zYWN0aW9uVHlwZXMuSW5zdGFsbG1lbnRzLFxuICAgICAgc3RhdHVzOiBpc1BlbmRpbmcodHJhbnNhY3Rpb24pID8gVHJhbnNhY3Rpb25TdGF0dXNlcy5QZW5kaW5nIDogVHJhbnNhY3Rpb25TdGF0dXNlcy5Db21wbGV0ZWQsXG4gICAgICBkYXRlOiBpbnN0YWxsbWVudHMgPyBkYXRlLmFkZChpbnN0YWxsbWVudHMubnVtYmVyIC0gMSwgJ21vbnRoJykudG9JU09TdHJpbmcoKSA6IGRhdGUudG9JU09TdHJpbmcoKSxcbiAgICAgIHByb2Nlc3NlZERhdGU6IGlzUGVuZGluZyh0cmFuc2FjdGlvbikgPyBkYXRlLnRvSVNPU3RyaW5nKCkgOiBuZXcgRGF0ZSh0cmFuc2FjdGlvbi5kZWJDcmREYXRlKS50b0lTT1N0cmluZygpLFxuICAgICAgb3JpZ2luYWxBbW91bnQsXG4gICAgICBvcmlnaW5hbEN1cnJlbmN5OiB0cmFuc2FjdGlvbi50cm5DdXJyZW5jeVN5bWJvbCxcbiAgICAgIGNoYXJnZWRBbW91bnQsXG4gICAgICBjaGFyZ2VkQ3VycmVuY3k6ICFpc1BlbmRpbmcodHJhbnNhY3Rpb24pID8gdHJhbnNhY3Rpb24uZGViQ3JkQ3VycmVuY3lTeW1ib2wgOiB1bmRlZmluZWQsXG4gICAgICBkZXNjcmlwdGlvbjogdHJhbnNhY3Rpb24ubWVyY2hhbnROYW1lLFxuICAgICAgbWVtbzogdHJhbnNhY3Rpb24udHJhbnNUeXBlQ29tbWVudERldGFpbHMudG9TdHJpbmcoKSxcbiAgICAgIGNhdGVnb3J5OiB0cmFuc2FjdGlvbi5icmFuY2hDb2RlRGVzYyxcbiAgICB9O1xuXG4gICAgaWYgKGluc3RhbGxtZW50cykge1xuICAgICAgcmVzdWx0Lmluc3RhbGxtZW50cyA9IGluc3RhbGxtZW50cztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbn1cblxudHlwZSBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscyA9IHsgdXNlcm5hbWU6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZyB9O1xuXG5jbGFzcyBWaXNhQ2FsU2NyYXBlciBleHRlbmRzIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXI8U2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHM+IHtcbiAgb3BlbkxvZ2luUG9wdXAgPSBhc3luYyAoKSA9PiB7XG4gICAgZGVidWcoJ29wZW4gbG9naW4gcG9wdXAsIHdhaXQgdW50aWwgbG9naW4gYnV0dG9uIGF2YWlsYWJsZScpO1xuICAgIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZCh0aGlzLnBhZ2UsICcjY2NMb2dpbkRlc2t0b3BCdG4nLCB0cnVlKTtcbiAgICBkZWJ1ZygnY2xpY2sgb24gdGhlIGxvZ2luIGJ1dHRvbicpO1xuICAgIGF3YWl0IGNsaWNrQnV0dG9uKHRoaXMucGFnZSwgJyNjY0xvZ2luRGVza3RvcEJ0bicpO1xuICAgIGRlYnVnKCdnZXQgdGhlIGZyYW1lIHRoYXQgaG9sZHMgdGhlIGxvZ2luJyk7XG4gICAgY29uc3QgZnJhbWUgPSBhd2FpdCBnZXRMb2dpbkZyYW1lKHRoaXMucGFnZSk7XG4gICAgZGVidWcoJ3dhaXQgdW50aWwgdGhlIHBhc3N3b3JkIGxvZ2luIHRhYiBoZWFkZXIgaXMgYXZhaWxhYmxlJyk7XG4gICAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKGZyYW1lLCAnI3JlZ3VsYXItbG9naW4nKTtcbiAgICBkZWJ1ZygnbmF2aWdhdGUgdG8gdGhlIHBhc3N3b3JkIGxvZ2luIHRhYicpO1xuICAgIGF3YWl0IGNsaWNrQnV0dG9uKGZyYW1lLCAnI3JlZ3VsYXItbG9naW4nKTtcbiAgICBkZWJ1Zygnd2FpdCB1bnRpbCB0aGUgcGFzc3dvcmQgbG9naW4gdGFiIGlzIGFjdGl2ZScpO1xuICAgIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChmcmFtZSwgJ3JlZ3VsYXItbG9naW4nKTtcblxuICAgIHJldHVybiBmcmFtZTtcbiAgfTtcblxuICBhc3luYyBnZXRDYXJkcygpIHtcbiAgICBjb25zdCBpbml0RGF0YSA9IGF3YWl0IHdhaXRVbnRpbChcbiAgICAgICgpID0+IGdldEZyb21TZXNzaW9uU3RvcmFnZTxJbml0UmVzcG9uc2U+KHRoaXMucGFnZSwgJ2luaXQnKSxcbiAgICAgICdnZXQgaW5pdCBkYXRhIGluIHNlc3Npb24gc3RvcmFnZScsXG4gICAgICAxMDAwMCxcbiAgICAgIDEwMDAsXG4gICAgKTtcbiAgICBpZiAoIWluaXREYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb3VsZCBub3QgZmluZCAnaW5pdCcgZGF0YSBpbiBzZXNzaW9uIHN0b3JhZ2VcIik7XG4gICAgfVxuICAgIHJldHVybiBpbml0RGF0YT8ucmVzdWx0LmNhcmRzLm1hcCgoeyBjYXJkVW5pcXVlSWQsIGxhc3Q0RGlnaXRzIH0pID0+ICh7IGNhcmRVbmlxdWVJZCwgbGFzdDREaWdpdHMgfSkpO1xuICB9XG5cbiAgYXN5bmMgZ2V0QXV0aG9yaXphdGlvbkhlYWRlcigpIHtcbiAgICBjb25zdCBhdXRoTW9kdWxlID0gYXdhaXQgZ2V0RnJvbVNlc3Npb25TdG9yYWdlPHsgYXV0aDogeyBjYWxDb25uZWN0VG9rZW46IHN0cmluZyB9IH0+KHRoaXMucGFnZSwgJ2F1dGgtbW9kdWxlJyk7XG4gICAgaWYgKCFhdXRoTW9kdWxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb3VsZCBub3QgZmluZCAnYXV0aC1tb2R1bGUnIGluIHNlc3Npb24gc3RvcmFnZVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGBDQUxBdXRoU2NoZW1lICR7YXV0aE1vZHVsZS5hdXRoLmNhbENvbm5lY3RUb2tlbn1gO1xuICB9XG5cbiAgYXN5bmMgZ2V0WFNpdGVJZCgpIHtcbiAgICAvKlxuICAgICAgSSBkb24ndCBrbm93IGlmIHRoZSBjb25zdGFudCBiZWxvdyB3aWxsIGNoYW5nZSBpbiB0aGUgZmVhdHVyZS5cbiAgICAgIElmIHNvLCB1c2UgdGhlIG5leHQgY29kZTpcblxuICAgICAgcmV0dXJuIHRoaXMucGFnZS5ldmFsdWF0ZSgoKSA9PiBuZXcgVXQoKS54U2l0ZUlkKTtcblxuICAgICAgVG8gZ2V0IHRoZSBjbGFzc25hbWUgc2VhcmNoIGZvciAneFNpdGVJZCcgaW4gdGhlIHBhZ2Ugc291cmNlXG4gICAgICBjbGFzcyBVdCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKF9lLCBvbiwgeW4pIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBfZSxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnID0gb24sXG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzU2VydmljZSA9IHluLFxuICAgICAgICAgICAgdGhpcy54U2l0ZUlkID0gXCIwOTAzMTk4Ny0yNzNFLTIzMTEtOTA2Qy04QUY4NUIxN0M4RDlcIixcbiAgICAqL1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoJzA5MDMxOTg3LTI3M0UtMjMxMS05MDZDLThBRjg1QjE3QzhEOScpO1xuICB9XG5cbiAgZ2V0TG9naW5PcHRpb25zKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscyk6IExvZ2luT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvZ2luVXJsOiBgJHtMT0dJTl9VUkx9YCxcbiAgICAgIGZpZWxkczogY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHMpLFxuICAgICAgc3VibWl0QnV0dG9uU2VsZWN0b3I6ICdidXR0b25bdHlwZT1cInN1Ym1pdFwiXScsXG4gICAgICBwb3NzaWJsZVJlc3VsdHM6IGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKCksXG4gICAgICBjaGVja1JlYWRpbmVzczogYXN5bmMgKCkgPT4gd2FpdFVudGlsRWxlbWVudEZvdW5kKHRoaXMucGFnZSwgJyNjY0xvZ2luRGVza3RvcEJ0bicpLFxuICAgICAgcHJlQWN0aW9uOiB0aGlzLm9wZW5Mb2dpblBvcHVwLFxuICAgICAgcG9zdEFjdGlvbjogYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHdhaXRGb3JOYXZpZ2F0aW9uKHRoaXMucGFnZSk7XG4gICAgICAgICAgY29uc3QgY3VycmVudFVybCA9IGF3YWl0IGdldEN1cnJlbnRVcmwodGhpcy5wYWdlKTtcbiAgICAgICAgICBpZiAoY3VycmVudFVybC5lbmRzV2l0aCgnc2l0ZS10dXRvcmlhbCcpKSB7XG4gICAgICAgICAgICBhd2FpdCBjbGlja0J1dHRvbih0aGlzLnBhZ2UsICdidXR0b24uYnRuLWNsb3NlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFVybCA9IGF3YWl0IGdldEN1cnJlbnRVcmwodGhpcy5wYWdlKTtcbiAgICAgICAgICBpZiAoY3VycmVudFVybC5lbmRzV2l0aCgnZGFzaGJvYXJkJykpIHJldHVybjtcbiAgICAgICAgICBjb25zdCByZXF1aXJlc0NoYW5nZVBhc3N3b3JkID0gYXdhaXQgaGFzQ2hhbmdlUGFzc3dvcmRGb3JtKHRoaXMucGFnZSk7XG4gICAgICAgICAgaWYgKHJlcXVpcmVzQ2hhbmdlUGFzc3dvcmQpIHJldHVybjtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXNlckFnZW50OlxuICAgICAgICAnTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzguMC4zOTA0LjEwOCBTYWZhcmkvNTM3LjM2JyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCk6IFByb21pc2U8U2NyYXBlclNjcmFwaW5nUmVzdWx0PiB7XG4gICAgY29uc3QgZGVmYXVsdFN0YXJ0TW9tZW50ID0gbW9tZW50KCkuc3VidHJhY3QoMSwgJ3llYXJzJykuc3VidHJhY3QoNiwgJ21vbnRocycpLmFkZCgxLCAnZGF5Jyk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5vcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnQgPSBtb21lbnQubWF4KGRlZmF1bHRTdGFydE1vbWVudCwgbW9tZW50KHN0YXJ0RGF0ZSkpO1xuICAgIGRlYnVnKGBmZXRjaCB0cmFuc2FjdGlvbnMgc3RhcnRpbmcgJHtzdGFydE1vbWVudC5mb3JtYXQoKX1gKTtcblxuICAgIGNvbnN0IEF1dGhvcml6YXRpb24gPSBhd2FpdCB0aGlzLmdldEF1dGhvcml6YXRpb25IZWFkZXIoKTtcbiAgICBjb25zdCBjYXJkcyA9IGF3YWl0IHRoaXMuZ2V0Q2FyZHMoKTtcbiAgICBjb25zdCB4U2l0ZUlkID0gYXdhaXQgdGhpcy5nZXRYU2l0ZUlkKCk7XG4gICAgY29uc3QgZnV0dXJlTW9udGhzVG9TY3JhcGUgPSB0aGlzLm9wdGlvbnMuZnV0dXJlTW9udGhzVG9TY3JhcGUgPz8gMTtcblxuICAgIGNvbnN0IGFjY291bnRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjYXJkcy5tYXAoYXN5bmMgY2FyZCA9PiB7XG4gICAgICAgIGNvbnN0IGZpbmFsTW9udGhUb0ZldGNoTW9tZW50ID0gbW9tZW50KCkuYWRkKGZ1dHVyZU1vbnRoc1RvU2NyYXBlLCAnbW9udGgnKTtcbiAgICAgICAgY29uc3QgbW9udGhzID0gZmluYWxNb250aFRvRmV0Y2hNb21lbnQuZGlmZihzdGFydE1vbWVudCwgJ21vbnRocycpO1xuXG4gICAgICAgIGNvbnN0IGFsbE1vbnRoc0RhdGE6IENhcmRUcmFuc2FjdGlvbkRldGFpbHNbXSA9IFtdO1xuXG4gICAgICAgIGRlYnVnKGBmZXRjaCBwZW5kaW5nIHRyYW5zYWN0aW9ucyBmb3IgY2FyZCAke2NhcmQuY2FyZFVuaXF1ZUlkfWApO1xuICAgICAgICBsZXQgcGVuZGluZ0RhdGEgPSBhd2FpdCBmZXRjaFBvc3RXaXRoaW5QYWdlPENhcmRQZW5kaW5nVHJhbnNhY3Rpb25EZXRhaWxzIHwgQ2FyZFRyYW5zYWN0aW9uRGV0YWlsc0Vycm9yPihcbiAgICAgICAgICB0aGlzLnBhZ2UsXG4gICAgICAgICAgUEVORElOR19UUkFOU0FDVElPTlNfUkVRVUVTVF9FTkRQT0lOVCxcbiAgICAgICAgICB7IGNhcmRVbmlxdWVJREFycmF5OiBbY2FyZC5jYXJkVW5pcXVlSWRdIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgQXV0aG9yaXphdGlvbixcbiAgICAgICAgICAgICdYLVNpdGUtSWQnOiB4U2l0ZUlkLFxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGRlYnVnKGBmZXRjaCBjb21wbGV0ZWQgdHJhbnNhY3Rpb25zIGZvciBjYXJkICR7Y2FyZC5jYXJkVW5pcXVlSWR9YCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IG1vbnRoczsgaSArPSAxKSB7XG4gICAgICAgICAgY29uc3QgbW9udGggPSBmaW5hbE1vbnRoVG9GZXRjaE1vbWVudC5jbG9uZSgpLnN1YnRyYWN0KGksICdtb250aHMnKTtcbiAgICAgICAgICBjb25zdCBtb250aERhdGEgPSBhd2FpdCBmZXRjaFBvc3RXaXRoaW5QYWdlPENhcmRUcmFuc2FjdGlvbkRldGFpbHMgfCBDYXJkVHJhbnNhY3Rpb25EZXRhaWxzRXJyb3I+KFxuICAgICAgICAgICAgdGhpcy5wYWdlLFxuICAgICAgICAgICAgVFJBTlNBQ1RJT05TX1JFUVVFU1RfRU5EUE9JTlQsXG4gICAgICAgICAgICB7IGNhcmRVbmlxdWVJZDogY2FyZC5jYXJkVW5pcXVlSWQsIG1vbnRoOiBtb250aC5mb3JtYXQoJ00nKSwgeWVhcjogbW9udGguZm9ybWF0KCdZWVlZJykgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbixcbiAgICAgICAgICAgICAgJ1gtU2l0ZS1JZCc6IHhTaXRlSWQsXG4gICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAobW9udGhEYXRhPy5zdGF0dXNDb2RlICE9PSAxKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgZmFpbGVkIHRvIGZldGNoIHRyYW5zYWN0aW9ucyBmb3IgY2FyZCAke2NhcmQubGFzdDREaWdpdHN9LiBNZXNzYWdlOiAke21vbnRoRGF0YT8udGl0bGUgfHwgJyd9YCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIWlzQ2FyZFRyYW5zYWN0aW9uRGV0YWlscyhtb250aERhdGEpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21vbnRoRGF0YSBpcyBub3Qgb2YgdHlwZSBDYXJkVHJhbnNhY3Rpb25EZXRhaWxzJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWxsTW9udGhzRGF0YS5wdXNoKG1vbnRoRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGVuZGluZ0RhdGE/LnN0YXR1c0NvZGUgIT09IDEgJiYgcGVuZGluZ0RhdGE/LnN0YXR1c0NvZGUgIT09IDk2KSB7XG4gICAgICAgICAgZGVidWcoXG4gICAgICAgICAgICBgZmFpbGVkIHRvIGZldGNoIHBlbmRpbmcgdHJhbnNhY3Rpb25zIGZvciBjYXJkICR7Y2FyZC5sYXN0NERpZ2l0c30uIE1lc3NhZ2U6ICR7cGVuZGluZ0RhdGE/LnRpdGxlIHx8ICcnfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwZW5kaW5nRGF0YSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzQ2FyZFBlbmRpbmdUcmFuc2FjdGlvbkRldGFpbHMocGVuZGluZ0RhdGEpKSB7XG4gICAgICAgICAgZGVidWcoJ3BlbmRpbmdEYXRhIGlzIG5vdCBvZiB0eXBlIENhcmRUcmFuc2FjdGlvbkRldGFpbHMnKTtcbiAgICAgICAgICBwZW5kaW5nRGF0YSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSBjb252ZXJ0UGFyc2VkRGF0YVRvVHJhbnNhY3Rpb25zKGFsbE1vbnRoc0RhdGEsIHBlbmRpbmdEYXRhKTtcblxuICAgICAgICBkZWJ1ZygnZmlsZXIgb3V0IG9sZCB0cmFuc2FjdGlvbnMnKTtcbiAgICAgICAgY29uc3QgdHhucyA9XG4gICAgICAgICAgKHRoaXMub3B0aW9ucy5vdXRwdXREYXRhPy5lbmFibGVUcmFuc2FjdGlvbnNGaWx0ZXJCeURhdGUgPz8gdHJ1ZSlcbiAgICAgICAgICAgID8gZmlsdGVyT2xkVHJhbnNhY3Rpb25zKHRyYW5zYWN0aW9ucywgbW9tZW50KHN0YXJ0RGF0ZSksIHRoaXMub3B0aW9ucy5jb21iaW5lSW5zdGFsbG1lbnRzIHx8IGZhbHNlKVxuICAgICAgICAgICAgOiB0cmFuc2FjdGlvbnM7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eG5zLFxuICAgICAgICAgIGFjY291bnROdW1iZXI6IGNhcmQubGFzdDREaWdpdHMsXG4gICAgICAgIH0gYXMgVHJhbnNhY3Rpb25zQWNjb3VudDtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBkZWJ1ZygncmV0dXJuIHRoZSBzY3JhcGVkIGFjY291bnRzJyk7XG5cbiAgICBkZWJ1ZyhKU09OLnN0cmluZ2lmeShhY2NvdW50cywgbnVsbCwgMikpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgYWNjb3VudHMsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBWaXNhQ2FsU2NyYXBlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsTUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUscUJBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFdBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFFBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLGFBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFFBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLGNBQUEsR0FBQVIsT0FBQTtBQUNBLElBQUFTLHVCQUFBLEdBQUFULE9BQUE7QUFBc0csU0FBQUQsdUJBQUFXLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFHdEcsTUFBTUcsU0FBUyxHQUFHLCtCQUErQjtBQUNqRCxNQUFNQyw2QkFBNkIsR0FDakMsOEZBQThGO0FBQ2hHLE1BQU1DLHFDQUFxQyxHQUN6Qyw4RUFBOEU7QUFFaEYsTUFBTUMsc0JBQXNCLEdBQUcsbUNBQW1DO0FBRWxFLE1BQU1DLEtBQUssR0FBRyxJQUFBQyxlQUFRLEVBQUMsVUFBVSxDQUFDO0FBQUMsSUFFOUJDLFdBQVcsMEJBQVhBLFdBQVc7RUFBWEEsV0FBVztFQUFYQSxXQUFXO0VBQVhBLFdBQVc7RUFBWEEsV0FBVztFQUFBLE9BQVhBLFdBQVc7QUFBQSxFQUFYQSxXQUFXO0FBOEhoQixTQUFTQyxTQUFTQSxDQUNoQkMsV0FBMkQs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