@tomerh2001/israeli-bank-scrapers 6.3.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +425 -0
- package/lib/assertNever.d.ts +1 -0
- package/lib/assertNever.js +10 -0
- package/lib/constants.d.ts +10 -0
- package/lib/constants.js +17 -0
- package/lib/definitions.d.ts +105 -0
- package/lib/definitions.js +116 -0
- package/lib/helpers/browser.d.ts +10 -0
- package/lib/helpers/browser.js +21 -0
- package/lib/helpers/dates.d.ts +2 -0
- package/lib/helpers/dates.js +22 -0
- package/lib/helpers/debug.d.ts +2 -0
- package/lib/helpers/debug.js +12 -0
- package/lib/helpers/elements-interactions.d.ts +17 -0
- package/lib/helpers/elements-interactions.js +111 -0
- package/lib/helpers/fetch.d.ts +6 -0
- package/lib/helpers/fetch.js +111 -0
- package/lib/helpers/navigation.d.ts +6 -0
- package/lib/helpers/navigation.js +39 -0
- package/lib/helpers/storage.d.ts +2 -0
- package/lib/helpers/storage.js +14 -0
- package/lib/helpers/transactions.d.ts +5 -0
- package/lib/helpers/transactions.js +47 -0
- package/lib/helpers/waiting.d.ts +13 -0
- package/lib/helpers/waiting.js +58 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.js +85 -0
- package/lib/scrapers/amex.d.ts +6 -0
- package/lib/scrapers/amex.js +17 -0
- package/lib/scrapers/amex.test.d.ts +1 -0
- package/lib/scrapers/amex.test.js +49 -0
- package/lib/scrapers/base-beinleumi-group.d.ts +66 -0
- package/lib/scrapers/base-beinleumi-group.js +428 -0
- package/lib/scrapers/base-isracard-amex.d.ts +23 -0
- package/lib/scrapers/base-isracard-amex.js +324 -0
- package/lib/scrapers/base-scraper-with-browser.d.ts +57 -0
- package/lib/scrapers/base-scraper-with-browser.js +291 -0
- package/lib/scrapers/base-scraper-with-browser.test.d.ts +1 -0
- package/lib/scrapers/base-scraper-with-browser.test.js +53 -0
- package/lib/scrapers/base-scraper.d.ts +19 -0
- package/lib/scrapers/base-scraper.js +91 -0
- package/lib/scrapers/behatsdaa.d.ts +11 -0
- package/lib/scrapers/behatsdaa.js +113 -0
- package/lib/scrapers/behatsdaa.test.d.ts +1 -0
- package/lib/scrapers/behatsdaa.test.js +46 -0
- package/lib/scrapers/beinleumi.d.ts +7 -0
- package/lib/scrapers/beinleumi.js +15 -0
- package/lib/scrapers/beinleumi.test.d.ts +1 -0
- package/lib/scrapers/beinleumi.test.js +47 -0
- package/lib/scrapers/beyahad-bishvilha.d.ts +30 -0
- package/lib/scrapers/beyahad-bishvilha.js +149 -0
- package/lib/scrapers/beyahad-bishvilha.test.d.ts +1 -0
- package/lib/scrapers/beyahad-bishvilha.test.js +47 -0
- package/lib/scrapers/discount.d.ts +22 -0
- package/lib/scrapers/discount.js +120 -0
- package/lib/scrapers/discount.test.d.ts +1 -0
- package/lib/scrapers/discount.test.js +49 -0
- package/lib/scrapers/errors.d.ts +16 -0
- package/lib/scrapers/errors.js +32 -0
- package/lib/scrapers/factory.d.ts +2 -0
- package/lib/scrapers/factory.js +70 -0
- package/lib/scrapers/factory.test.d.ts +1 -0
- package/lib/scrapers/factory.test.js +19 -0
- package/lib/scrapers/hapoalim.d.ts +24 -0
- package/lib/scrapers/hapoalim.js +198 -0
- package/lib/scrapers/hapoalim.test.d.ts +1 -0
- package/lib/scrapers/hapoalim.test.js +47 -0
- package/lib/scrapers/interface.d.ts +186 -0
- package/lib/scrapers/interface.js +6 -0
- package/lib/scrapers/isracard.d.ts +6 -0
- package/lib/scrapers/isracard.js +17 -0
- package/lib/scrapers/isracard.test.d.ts +1 -0
- package/lib/scrapers/isracard.test.js +49 -0
- package/lib/scrapers/leumi.d.ts +21 -0
- package/lib/scrapers/leumi.js +200 -0
- package/lib/scrapers/leumi.test.d.ts +1 -0
- package/lib/scrapers/leumi.test.js +47 -0
- package/lib/scrapers/massad.d.ts +7 -0
- package/lib/scrapers/massad.js +15 -0
- package/lib/scrapers/max.d.ts +37 -0
- package/lib/scrapers/max.js +299 -0
- package/lib/scrapers/max.test.d.ts +1 -0
- package/lib/scrapers/max.test.js +64 -0
- package/lib/scrapers/mercantile.d.ts +20 -0
- package/lib/scrapers/mercantile.js +18 -0
- package/lib/scrapers/mercantile.test.d.ts +1 -0
- package/lib/scrapers/mercantile.test.js +45 -0
- package/lib/scrapers/mizrahi.d.ts +35 -0
- package/lib/scrapers/mizrahi.js +265 -0
- package/lib/scrapers/mizrahi.test.d.ts +1 -0
- package/lib/scrapers/mizrahi.test.js +56 -0
- package/lib/scrapers/one-zero-queries.d.ts +2 -0
- package/lib/scrapers/one-zero-queries.js +560 -0
- package/lib/scrapers/one-zero.d.ts +36 -0
- package/lib/scrapers/one-zero.js +238 -0
- package/lib/scrapers/one-zero.test.d.ts +1 -0
- package/lib/scrapers/one-zero.test.js +51 -0
- package/lib/scrapers/otsar-hahayal.d.ts +7 -0
- package/lib/scrapers/otsar-hahayal.js +15 -0
- package/lib/scrapers/otsar-hahayal.test.d.ts +1 -0
- package/lib/scrapers/otsar-hahayal.test.js +47 -0
- package/lib/scrapers/pagi.d.ts +7 -0
- package/lib/scrapers/pagi.js +15 -0
- package/lib/scrapers/pagi.test.d.ts +1 -0
- package/lib/scrapers/pagi.test.js +47 -0
- package/lib/scrapers/union-bank.d.ts +23 -0
- package/lib/scrapers/union-bank.js +242 -0
- package/lib/scrapers/union-bank.test.d.ts +1 -0
- package/lib/scrapers/union-bank.test.js +47 -0
- package/lib/scrapers/visa-cal.d.ts +20 -0
- package/lib/scrapers/visa-cal.js +318 -0
- package/lib/scrapers/visa-cal.test.d.ts +1 -0
- package/lib/scrapers/visa-cal.test.js +49 -0
- package/lib/scrapers/yahav.d.ts +25 -0
- package/lib/scrapers/yahav.js +247 -0
- package/lib/scrapers/yahav.test.d.ts +1 -0
- package/lib/scrapers/yahav.test.js +49 -0
- package/lib/transactions.d.ts +47 -0
- package/lib/transactions.js +17 -0
- package/package.json +91 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _moment = _interopRequireDefault(require("moment"));
|
|
8
|
+
var _constants = require("../constants");
|
|
9
|
+
var _debug = require("../helpers/debug");
|
|
10
|
+
var _elementsInteractions = require("../helpers/elements-interactions");
|
|
11
|
+
var _navigation = require("../helpers/navigation");
|
|
12
|
+
var _transactions = require("../transactions");
|
|
13
|
+
var _baseScraperWithBrowser = require("./base-scraper-with-browser");
|
|
14
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
|
+
const debug = (0, _debug.getDebug)('leumi');
|
|
16
|
+
const BASE_URL = 'https://hb2.bankleumi.co.il';
|
|
17
|
+
const LOGIN_URL = 'https://www.leumi.co.il/';
|
|
18
|
+
const TRANSACTIONS_URL = `${BASE_URL}/eBanking/SO/SPA.aspx#/ts/BusinessAccountTrx?WidgetPar=1`;
|
|
19
|
+
const FILTERED_TRANSACTIONS_URL = `${BASE_URL}/ChannelWCF/Broker.svc/ProcessRequest?moduleName=UC_SO_27_GetBusinessAccountTrx`;
|
|
20
|
+
const DATE_FORMAT = 'DD.MM.YY';
|
|
21
|
+
const ACCOUNT_BLOCKED_MSG = 'המנוי חסום';
|
|
22
|
+
const INVALID_PASSWORD_MSG = 'אחד או יותר מפרטי ההזדהות שמסרת שגויים. ניתן לנסות שוב';
|
|
23
|
+
function getPossibleLoginResults() {
|
|
24
|
+
const urls = {
|
|
25
|
+
[_baseScraperWithBrowser.LoginResults.Success]: [/ebanking\/SO\/SPA.aspx/i],
|
|
26
|
+
[_baseScraperWithBrowser.LoginResults.InvalidPassword]: [async options => {
|
|
27
|
+
if (!options || !options.page) {
|
|
28
|
+
throw new Error('missing page options argument');
|
|
29
|
+
}
|
|
30
|
+
const errorMessage = await (0, _elementsInteractions.pageEvalAll)(options.page, 'svg#Capa_1', '', element => {
|
|
31
|
+
return element[0]?.parentElement?.children[1]?.innerText;
|
|
32
|
+
});
|
|
33
|
+
return errorMessage?.startsWith(INVALID_PASSWORD_MSG);
|
|
34
|
+
}],
|
|
35
|
+
[_baseScraperWithBrowser.LoginResults.AccountBlocked]: [
|
|
36
|
+
// NOTICE - might not be relevant starting the Leumi re-design during 2022 Sep
|
|
37
|
+
async options => {
|
|
38
|
+
if (!options || !options.page) {
|
|
39
|
+
throw new Error('missing page options argument');
|
|
40
|
+
}
|
|
41
|
+
const errorMessage = await (0, _elementsInteractions.pageEvalAll)(options.page, '.errHeader', '', label => {
|
|
42
|
+
return label[0]?.innerText;
|
|
43
|
+
});
|
|
44
|
+
return errorMessage?.startsWith(ACCOUNT_BLOCKED_MSG);
|
|
45
|
+
}],
|
|
46
|
+
[_baseScraperWithBrowser.LoginResults.ChangePassword]: ['https://hb2.bankleumi.co.il/authenticate'] // NOTICE - might not be relevant starting the Leumi re-design during 2022 Sep
|
|
47
|
+
};
|
|
48
|
+
return urls;
|
|
49
|
+
}
|
|
50
|
+
function createLoginFields(credentials) {
|
|
51
|
+
return [{
|
|
52
|
+
selector: 'input[placeholder="שם משתמש"]',
|
|
53
|
+
value: credentials.username
|
|
54
|
+
}, {
|
|
55
|
+
selector: 'input[placeholder="סיסמה"]',
|
|
56
|
+
value: credentials.password
|
|
57
|
+
}];
|
|
58
|
+
}
|
|
59
|
+
function extractTransactionsFromPage(transactions, status) {
|
|
60
|
+
if (transactions === null || transactions.length === 0) {
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
const result = transactions.map(rawTransaction => {
|
|
64
|
+
const date = (0, _moment.default)(rawTransaction.DateUTC).milliseconds(0).toISOString();
|
|
65
|
+
const newTransaction = {
|
|
66
|
+
status,
|
|
67
|
+
type: _transactions.TransactionTypes.Normal,
|
|
68
|
+
date,
|
|
69
|
+
processedDate: date,
|
|
70
|
+
description: rawTransaction.Description || '',
|
|
71
|
+
identifier: rawTransaction.ReferenceNumberLong,
|
|
72
|
+
memo: rawTransaction.AdditionalData || '',
|
|
73
|
+
originalCurrency: _constants.SHEKEL_CURRENCY,
|
|
74
|
+
chargedAmount: rawTransaction.Amount,
|
|
75
|
+
originalAmount: rawTransaction.Amount
|
|
76
|
+
};
|
|
77
|
+
return newTransaction;
|
|
78
|
+
});
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
function hangProcess(timeout) {
|
|
82
|
+
return new Promise(resolve => {
|
|
83
|
+
setTimeout(() => {
|
|
84
|
+
resolve();
|
|
85
|
+
}, timeout);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async function clickByXPath(page, xpath) {
|
|
89
|
+
await page.waitForSelector(xpath, {
|
|
90
|
+
timeout: 30000,
|
|
91
|
+
visible: true
|
|
92
|
+
});
|
|
93
|
+
const elm = await page.$$(xpath);
|
|
94
|
+
await elm[0].click();
|
|
95
|
+
}
|
|
96
|
+
function removeSpecialCharacters(str) {
|
|
97
|
+
return str.replace(/[^0-9/-]/g, '');
|
|
98
|
+
}
|
|
99
|
+
async function fetchTransactionsForAccount(page, startDate, accountId) {
|
|
100
|
+
// DEVELOPER NOTICE the account number received from the server is being altered at
|
|
101
|
+
// runtime for some accounts after 1-2 seconds so we need to hang the process for a short while.
|
|
102
|
+
await hangProcess(4000);
|
|
103
|
+
await (0, _elementsInteractions.waitUntilElementFound)(page, 'button[title="חיפוש מתקדם"]', true);
|
|
104
|
+
await (0, _elementsInteractions.clickButton)(page, 'button[title="חיפוש מתקדם"]');
|
|
105
|
+
await (0, _elementsInteractions.waitUntilElementFound)(page, 'bll-radio-button', true);
|
|
106
|
+
await (0, _elementsInteractions.clickButton)(page, 'bll-radio-button:not([checked])');
|
|
107
|
+
await (0, _elementsInteractions.waitUntilElementFound)(page, 'input[formcontrolname="txtInputFrom"]', true);
|
|
108
|
+
await (0, _elementsInteractions.fillInput)(page, 'input[formcontrolname="txtInputFrom"]', startDate.format(DATE_FORMAT));
|
|
109
|
+
|
|
110
|
+
// we must blur the from control otherwise the search will use the previous value
|
|
111
|
+
await page.focus("button[aria-label='סנן']");
|
|
112
|
+
await (0, _elementsInteractions.clickButton)(page, "button[aria-label='סנן']");
|
|
113
|
+
const finalResponse = await page.waitForResponse(response => {
|
|
114
|
+
return response.url() === FILTERED_TRANSACTIONS_URL && response.request().method() === 'POST';
|
|
115
|
+
});
|
|
116
|
+
const responseJson = await finalResponse.json();
|
|
117
|
+
const accountNumber = accountId.replace('/', '_').replace(/[^\d-_]/g, '');
|
|
118
|
+
const response = JSON.parse(responseJson.jsonResp);
|
|
119
|
+
const pendingTransactions = response.TodayTransactionsItems;
|
|
120
|
+
const transactions = response.HistoryTransactionsItems;
|
|
121
|
+
const balance = response.BalanceDisplay ? parseFloat(response.BalanceDisplay) : undefined;
|
|
122
|
+
const pendingTxns = extractTransactionsFromPage(pendingTransactions, _transactions.TransactionStatuses.Pending);
|
|
123
|
+
const completedTxns = extractTransactionsFromPage(transactions, _transactions.TransactionStatuses.Completed);
|
|
124
|
+
const txns = [...pendingTxns, ...completedTxns];
|
|
125
|
+
return {
|
|
126
|
+
accountNumber,
|
|
127
|
+
balance,
|
|
128
|
+
txns
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
async function fetchTransactions(page, startDate) {
|
|
132
|
+
const accounts = [];
|
|
133
|
+
|
|
134
|
+
// DEVELOPER NOTICE the account number received from the server is being altered at
|
|
135
|
+
// runtime for some accounts after 1-2 seconds so we need to hang the process for a short while.
|
|
136
|
+
await hangProcess(4000);
|
|
137
|
+
const accountsIds = await page.evaluate(() => Array.from(document.querySelectorAll('app-masked-number-combo span.display-number-li'), e => e.textContent));
|
|
138
|
+
|
|
139
|
+
// due to a bug, the altered value might include undesired signs like & that should be removed
|
|
140
|
+
|
|
141
|
+
if (!accountsIds.length) {
|
|
142
|
+
throw new Error('Failed to extract or parse the account number');
|
|
143
|
+
}
|
|
144
|
+
for (const accountId of accountsIds) {
|
|
145
|
+
if (accountsIds.length > 1) {
|
|
146
|
+
// get list of accounts and check accountId
|
|
147
|
+
await clickByXPath(page, 'xpath///*[contains(@class, "number") and contains(@class, "combo-inner")]');
|
|
148
|
+
await clickByXPath(page, `xpath///span[contains(text(), '${accountId}')]`);
|
|
149
|
+
}
|
|
150
|
+
accounts.push(await fetchTransactionsForAccount(page, startDate, removeSpecialCharacters(accountId)));
|
|
151
|
+
}
|
|
152
|
+
return accounts;
|
|
153
|
+
}
|
|
154
|
+
async function navigateToLogin(page) {
|
|
155
|
+
const loginButtonSelector = '.enter-account a[originaltitle="כניסה לחשבונך"]';
|
|
156
|
+
debug('wait for homepage to click on login button');
|
|
157
|
+
await (0, _elementsInteractions.waitUntilElementFound)(page, loginButtonSelector);
|
|
158
|
+
debug('navigate to login page');
|
|
159
|
+
const loginUrl = await (0, _elementsInteractions.pageEval)(page, loginButtonSelector, null, element => {
|
|
160
|
+
return element.href;
|
|
161
|
+
});
|
|
162
|
+
debug(`navigating to page (${loginUrl})`);
|
|
163
|
+
await page.goto(loginUrl);
|
|
164
|
+
debug('waiting for page to be loaded (networkidle2)');
|
|
165
|
+
await (0, _navigation.waitForNavigation)(page, {
|
|
166
|
+
waitUntil: 'networkidle2'
|
|
167
|
+
});
|
|
168
|
+
debug('waiting for components of login to enter credentials');
|
|
169
|
+
await Promise.all([(0, _elementsInteractions.waitUntilElementFound)(page, 'input[placeholder="שם משתמש"]', true), (0, _elementsInteractions.waitUntilElementFound)(page, 'input[placeholder="סיסמה"]', true), (0, _elementsInteractions.waitUntilElementFound)(page, 'button[type="submit"]', true)]);
|
|
170
|
+
}
|
|
171
|
+
async function waitForPostLogin(page) {
|
|
172
|
+
await Promise.race([(0, _elementsInteractions.waitUntilElementFound)(page, 'a[title="דלג לחשבון"]', true, 60000), (0, _elementsInteractions.waitUntilElementFound)(page, 'div.main-content', false, 60000), page.waitForSelector(`xpath//div[contains(string(),"${INVALID_PASSWORD_MSG}")]`), (0, _elementsInteractions.waitUntilElementFound)(page, 'form[action="/changepassword"]', true, 60000) // not sure if they kept this one
|
|
173
|
+
]);
|
|
174
|
+
}
|
|
175
|
+
class LeumiScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser {
|
|
176
|
+
getLoginOptions(credentials) {
|
|
177
|
+
return {
|
|
178
|
+
loginUrl: LOGIN_URL,
|
|
179
|
+
fields: createLoginFields(credentials),
|
|
180
|
+
submitButtonSelector: "button[type='submit']",
|
|
181
|
+
checkReadiness: async () => navigateToLogin(this.page),
|
|
182
|
+
postAction: async () => waitForPostLogin(this.page),
|
|
183
|
+
possibleResults: getPossibleLoginResults()
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
async fetchData() {
|
|
187
|
+
const minimumStartMoment = (0, _moment.default)().subtract(3, 'years').add(1, 'day');
|
|
188
|
+
const defaultStartMoment = (0, _moment.default)().subtract(1, 'years').add(1, 'day');
|
|
189
|
+
const startDate = this.options.startDate || defaultStartMoment.toDate();
|
|
190
|
+
const startMoment = _moment.default.max(minimumStartMoment, (0, _moment.default)(startDate));
|
|
191
|
+
await this.navigateTo(TRANSACTIONS_URL);
|
|
192
|
+
const accounts = await fetchTransactions(this.page, startMoment);
|
|
193
|
+
return {
|
|
194
|
+
success: true,
|
|
195
|
+
accounts
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
var _default = exports.default = LeumiScraper;
|
|
200
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29uc3RhbnRzIiwiX2RlYnVnIiwiX2VsZW1lbnRzSW50ZXJhY3Rpb25zIiwiX25hdmlnYXRpb24iLCJfdHJhbnNhY3Rpb25zIiwiX2Jhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJkZWJ1ZyIsImdldERlYnVnIiwiQkFTRV9VUkwiLCJMT0dJTl9VUkwiLCJUUkFOU0FDVElPTlNfVVJMIiwiRklMVEVSRURfVFJBTlNBQ1RJT05TX1VSTCIsIkRBVEVfRk9STUFUIiwiQUNDT1VOVF9CTE9DS0VEX01TRyIsIklOVkFMSURfUEFTU1dPUkRfTVNHIiwiZ2V0UG9zc2libGVMb2dpblJlc3VsdHMiLCJ1cmxzIiwiTG9naW5SZXN1bHRzIiwiU3VjY2VzcyIsIkludmFsaWRQYXNzd29yZCIsIm9wdGlvbnMiLCJwYWdlIiwiRXJyb3IiLCJlcnJvck1lc3NhZ2UiLCJwYWdlRXZhbEFsbCIsImVsZW1lbnQiLCJwYXJlbnRFbGVtZW50IiwiY2hpbGRyZW4iLCJpbm5lclRleHQiLCJzdGFydHNXaXRoIiwiQWNjb3VudEJsb2NrZWQiLCJsYWJlbCIsIkNoYW5nZVBhc3N3b3JkIiwiY3JlYXRlTG9naW5GaWVsZHMiLCJjcmVkZW50aWFscyIsInNlbGVjdG9yIiwidmFsdWUiLCJ1c2VybmFtZSIsInBhc3N3b3JkIiwiZXh0cmFjdFRyYW5zYWN0aW9uc0Zyb21QYWdlIiwidHJhbnNhY3Rpb25zIiwic3RhdHVzIiwibGVuZ3RoIiwicmVzdWx0IiwibWFwIiwicmF3VHJhbnNhY3Rpb24iLCJkYXRlIiwibW9tZW50IiwiRGF0ZVVUQyIsIm1pbGxpc2Vjb25kcyIsInRvSVNPU3RyaW5nIiwibmV3VHJhbnNhY3Rpb24iLCJ0eXBlIiwiVHJhbnNhY3Rpb25UeXBlcyIsIk5vcm1hbCIsInByb2Nlc3NlZERhdGUiLCJkZXNjcmlwdGlvbiIsIkRlc2NyaXB0aW9uIiwiaWRlbnRpZmllciIsIlJlZmVyZW5jZU51bWJlckxvbmciLCJtZW1vIiwiQWRkaXRpb25hbERhdGEiLCJvcmlnaW5hbEN1cnJlbmN5IiwiU0hFS0VMX0NVUlJFTkNZIiwiY2hhcmdlZEFtb3VudCIsIkFtb3VudCIsIm9yaWdpbmFsQW1vdW50IiwiaGFuZ1Byb2Nlc3MiLCJ0aW1lb3V0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRUaW1lb3V0IiwiY2xpY2tCeVhQYXRoIiwieHBhdGgiLCJ3YWl0Rm9yU2VsZWN0b3IiLCJ2aXNpYmxlIiwiZWxtIiwiJCQiLCJjbGljayIsInJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzIiwic3RyIiwicmVwbGFjZSIsImZldGNoVHJhbnNhY3Rpb25zRm9yQWNjb3VudCIsInN0YXJ0RGF0ZSIsImFjY291bnRJZCIsIndhaXRVbnRpbEVsZW1lbnRGb3VuZCIsImNsaWNrQnV0dG9uIiwiZmlsbElucHV0IiwiZm9ybWF0IiwiZm9jdXMiLCJmaW5hbFJlc3BvbnNlIiwid2FpdEZvclJlc3BvbnNlIiwicmVzcG9uc2UiLCJ1cmwiLCJyZXF1ZXN0IiwibWV0aG9kIiwicmVzcG9uc2VKc29uIiwianNvbiIsImFjY291bnROdW1iZXIiLCJKU09OIiwicGFyc2UiLCJqc29uUmVzcCIsInBlbmRpbmdUcmFuc2FjdGlvbnMiLCJUb2RheVRyYW5zYWN0aW9uc0l0ZW1zIiwiSGlzdG9yeVRyYW5zYWN0aW9uc0l0ZW1zIiwiYmFsYW5jZSIsIkJhbGFuY2VEaXNwbGF5IiwicGFyc2VGbG9hdCIsInVuZGVmaW5lZCIsInBlbmRpbmdUeG5zIiwiVHJhbnNhY3Rpb25TdGF0dXNlcyIsIlBlbmRpbmciLCJjb21wbGV0ZWRUeG5zIiwiQ29tcGxldGVkIiwidHhucyIsImZldGNoVHJhbnNhY3Rpb25zIiwiYWNjb3VudHMiLCJhY2NvdW50c0lkcyIsImV2YWx1YXRlIiwiQXJyYXkiLCJmcm9tIiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yQWxsIiwidGV4dENvbnRlbnQiLCJwdXNoIiwibmF2aWdhdGVUb0xvZ2luIiwibG9naW5CdXR0b25TZWxlY3RvciIsImxvZ2luVXJsIiwicGFnZUV2YWwiLCJocmVmIiwiZ290byIsIndhaXRGb3JOYXZpZ2F0aW9uIiwid2FpdFVudGlsIiwiYWxsIiwid2FpdEZvclBvc3RMb2dpbiIsInJhY2UiLCJMZXVtaVNjcmFwZXIiLCJCYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiZ2V0TG9naW5PcHRpb25zIiwiZmllbGRzIiwic3VibWl0QnV0dG9uU2VsZWN0b3IiLCJjaGVja1JlYWRpbmVzcyIsInBvc3RBY3Rpb24iLCJwb3NzaWJsZVJlc3VsdHMiLCJmZXRjaERhdGEiLCJtaW5pbXVtU3RhcnRNb21lbnQiLCJzdWJ0cmFjdCIsImFkZCIsImRlZmF1bHRTdGFydE1vbWVudCIsInRvRGF0ZSIsInN0YXJ0TW9tZW50IiwibWF4IiwibmF2aWdhdGVUbyIsInN1Y2Nlc3MiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyYXBlcnMvbGV1bWkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCwgeyB0eXBlIE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyB0eXBlIFBhZ2UgfSBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IHsgU0hFS0VMX0NVUlJFTkNZIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IGdldERlYnVnIH0gZnJvbSAnLi4vaGVscGVycy9kZWJ1Zyc7XG5pbXBvcnQgeyBjbGlja0J1dHRvbiwgZmlsbElucHV0LCBwYWdlRXZhbCwgcGFnZUV2YWxBbGwsIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCB9IGZyb20gJy4uL2hlbHBlcnMvZWxlbWVudHMtaW50ZXJhY3Rpb25zJztcbmltcG9ydCB7IHdhaXRGb3JOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vaGVscGVycy9uYXZpZ2F0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uU3RhdHVzZXMsIFRyYW5zYWN0aW9uVHlwZXMsIHR5cGUgVHJhbnNhY3Rpb24sIHR5cGUgVHJhbnNhY3Rpb25zQWNjb3VudCB9IGZyb20gJy4uL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBCYXNlU2NyYXBlcldpdGhCcm93c2VyLCBMb2dpblJlc3VsdHMsIHR5cGUgTG9naW5PcHRpb25zIH0gZnJvbSAnLi9iYXNlLXNjcmFwZXItd2l0aC1icm93c2VyJztcbmltcG9ydCB7IHR5cGUgU2NyYXBlclNjcmFwaW5nUmVzdWx0IH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5jb25zdCBkZWJ1ZyA9IGdldERlYnVnKCdsZXVtaScpO1xuY29uc3QgQkFTRV9VUkwgPSAnaHR0cHM6Ly9oYjIuYmFua2xldW1pLmNvLmlsJztcbmNvbnN0IExPR0lOX1VSTCA9ICdodHRwczovL3d3dy5sZXVtaS5jby5pbC8nO1xuY29uc3QgVFJBTlNBQ1RJT05TX1VSTCA9IGAke0JBU0VfVVJMfS9lQmFua2luZy9TTy9TUEEuYXNweCMvdHMvQnVzaW5lc3NBY2NvdW50VHJ4P1dpZGdldFBhcj0xYDtcbmNvbnN0IEZJTFRFUkVEX1RSQU5TQUNUSU9OU19VUkwgPSBgJHtCQVNFX1VSTH0vQ2hhbm5lbFdDRi9Ccm9rZXIuc3ZjL1Byb2Nlc3NSZXF1ZXN0P21vZHVsZU5hbWU9VUNfU09fMjdfR2V0QnVzaW5lc3NBY2NvdW50VHJ4YDtcblxuY29uc3QgREFURV9GT1JNQVQgPSAnREQuTU0uWVknO1xuY29uc3QgQUNDT1VOVF9CTE9DS0VEX01TRyA9ICfXlNee16DXldeZINeX16HXldedJztcbmNvbnN0IElOVkFMSURfUEFTU1dPUkRfTVNHID0gJ9eQ15fXkyDXkNeVINeZ15XXqteoINee16TXqNeY15kg15TXlNeW15PXlNeV16og16nXnteh16jXqiDXqdeS15XXmdeZ150uINeg15nXqtefINec16DXodeV16og16nXldeRJztcblxuZnVuY3Rpb24gZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKSB7XG4gIGNvbnN0IHVybHM6IExvZ2luT3B0aW9uc1sncG9zc2libGVSZXN1bHRzJ10gPSB7XG4gICAgW0xvZ2luUmVzdWx0cy5TdWNjZXNzXTogWy9lYmFua2luZ1xcL1NPXFwvU1BBLmFzcHgvaV0sXG4gICAgW0xvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmRdOiBbXG4gICAgICBhc3luYyBvcHRpb25zID0+IHtcbiAgICAgICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLnBhZ2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFnZSBvcHRpb25zIGFyZ3VtZW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYXdhaXQgcGFnZUV2YWxBbGwob3B0aW9ucy5wYWdlLCAnc3ZnI0NhcGFfMScsICcnLCBlbGVtZW50ID0+IHtcbiAgICAgICAgICByZXR1cm4gKGVsZW1lbnRbMF0/LnBhcmVudEVsZW1lbnQ/LmNoaWxkcmVuWzFdIGFzIEhUTUxEaXZFbGVtZW50KT8uaW5uZXJUZXh0O1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZXJyb3JNZXNzYWdlPy5zdGFydHNXaXRoKElOVkFMSURfUEFTU1dPUkRfTVNHKTtcbiAgICAgIH0sXG4gICAgXSxcbiAgICBbTG9naW5SZXN1bHRzLkFjY291bnRCbG9ja2VkXTogW1xuICAgICAgLy8gTk9USUNFIC0gbWlnaHQgbm90IGJlIHJlbGV2YW50IHN0YXJ0aW5nIHRoZSBMZXVtaSByZS1kZXNpZ24gZHVyaW5nIDIwMjIgU2VwXG4gICAgICBhc3luYyBvcHRpb25zID0+IHtcbiAgICAgICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLnBhZ2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFnZSBvcHRpb25zIGFyZ3VtZW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYXdhaXQgcGFnZUV2YWxBbGwob3B0aW9ucy5wYWdlLCAnLmVyckhlYWRlcicsICcnLCBsYWJlbCA9PiB7XG4gICAgICAgICAgcmV0dXJuIChsYWJlbFswXSBhcyBIVE1MRWxlbWVudCk/LmlubmVyVGV4dDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZT8uc3RhcnRzV2l0aChBQ0NPVU5UX0JMT0NLRURfTVNHKTtcbiAgICAgIH0sXG4gICAgXSxcbiAgICBbTG9naW5SZXN1bHRzLkNoYW5nZVBhc3N3b3JkXTogWydodHRwczovL2hiMi5iYW5rbGV1bWkuY28uaWwvYXV0aGVudGljYXRlJ10sIC8vIE5PVElDRSAtIG1pZ2h0IG5vdCBiZSByZWxldmFudCBzdGFydGluZyB0aGUgTGV1bWkgcmUtZGVzaWduIGR1cmluZyAyMDIyIFNlcFxuICB9O1xuICByZXR1cm4gdXJscztcbn1cblxuZnVuY3Rpb24gY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHM6IFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzKSB7XG4gIHJldHVybiBbXG4gICAgeyBzZWxlY3RvcjogJ2lucHV0W3BsYWNlaG9sZGVyPVwi16nXnSDXntep16rXntepXCJdJywgdmFsdWU6IGNyZWRlbnRpYWxzLnVzZXJuYW1lIH0sXG4gICAgeyBzZWxlY3RvcjogJ2lucHV0W3BsYWNlaG9sZGVyPVwi16HXmdeh157XlFwiXScsIHZhbHVlOiBjcmVkZW50aWFscy5wYXNzd29yZCB9LFxuICBdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0VHJhbnNhY3Rpb25zRnJvbVBhZ2UodHJhbnNhY3Rpb25zOiBhbnlbXSwgc3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c2VzKTogVHJhbnNhY3Rpb25bXSB7XG4gIGlmICh0cmFuc2FjdGlvbnMgPT09IG51bGwgfHwgdHJhbnNhY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogVHJhbnNhY3Rpb25bXSA9IHRyYW5zYWN0aW9ucy5tYXAocmF3VHJhbnNhY3Rpb24gPT4ge1xuICAgIGNvbnN0IGRhdGUgPSBtb21lbnQocmF3VHJhbnNhY3Rpb24uRGF0ZVVUQykubWlsbGlzZWNvbmRzKDApLnRvSVNPU3RyaW5nKCk7XG4gICAgY29uc3QgbmV3VHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uID0ge1xuICAgICAgc3RhdHVzLFxuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlcy5Ob3JtYWwsXG4gICAgICBkYXRlLFxuICAgICAgcHJvY2Vzc2VkRGF0ZTogZGF0ZSxcbiAgICAgIGRlc2NyaXB0aW9uOiByYXdUcmFuc2FjdGlvbi5EZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgIGlkZW50aWZpZXI6IHJhd1RyYW5zYWN0aW9uLlJlZmVyZW5jZU51bWJlckxvbmcsXG4gICAgICBtZW1vOiByYXdUcmFuc2FjdGlvbi5BZGRpdGlvbmFsRGF0YSB8fCAnJyxcbiAgICAgIG9yaWdpbmFsQ3VycmVuY3k6IFNIRUtFTF9DVVJSRU5DWSxcbiAgICAgIGNoYXJnZWRBbW91bnQ6IHJhd1RyYW5zYWN0aW9uLkFtb3VudCxcbiAgICAgIG9yaWdpbmFsQW1vdW50OiByYXdUcmFuc2FjdGlvbi5BbW91bnQsXG4gICAgfTtcblxuICAgIHJldHVybiBuZXdUcmFuc2FjdGlvbjtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaGFuZ1Byb2Nlc3ModGltZW91dDogbnVtYmVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9LCB0aW1lb3V0KTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsaWNrQnlYUGF0aChwYWdlOiBQYWdlLCB4cGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKHhwYXRoLCB7IHRpbWVvdXQ6IDMwMDAwLCB2aXNpYmxlOiB0cnVlIH0pO1xuICBjb25zdCBlbG0gPSBhd2FpdCBwYWdlLiQkKHhwYXRoKTtcbiAgYXdhaXQgZWxtWzBdLmNsaWNrKCk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXjAtOS8tXS9nLCAnJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoVHJhbnNhY3Rpb25zRm9yQWNjb3VudChcbiAgcGFnZTogUGFnZSxcbiAgc3RhcnREYXRlOiBNb21lbnQsXG4gIGFjY291bnRJZDogc3RyaW5nLFxuKTogUHJvbWlzZTxUcmFuc2FjdGlvbnNBY2NvdW50PiB7XG4gIC8vIERFVkVMT1BFUiBOT1RJQ0UgdGhlIGFjY291bnQgbnVtYmVyIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlciBpcyBiZWluZyBhbHRlcmVkIGF0XG4gIC8vIHJ1bnRpbWUgZm9yIHNvbWUgYWNjb3VudHMgYWZ0ZXIgMS0yIHNlY29uZHMgc28gd2UgbmVlZCB0byBoYW5nIHRoZSBwcm9jZXNzIGZvciBhIHNob3J0IHdoaWxlLlxuICBhd2FpdCBoYW5nUHJvY2Vzcyg0MDAwKTtcblxuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJ2J1dHRvblt0aXRsZT1cIteX15nXpNeV16kg157Xqten15PXnVwiXScsIHRydWUpO1xuICBhd2FpdCBjbGlja0J1dHRvbihwYWdlLCAnYnV0dG9uW3RpdGxlPVwi15fXmdek15XXqSDXnteq16fXk9edXCJdJyk7XG4gIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnYmxsLXJhZGlvLWJ1dHRvbicsIHRydWUpO1xuICBhd2FpdCBjbGlja0J1dHRvbihwYWdlLCAnYmxsLXJhZGlvLWJ1dHRvbjpub3QoW2NoZWNrZWRdKScpO1xuXG4gIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnaW5wdXRbZm9ybWNvbnRyb2xuYW1lPVwidHh0SW5wdXRGcm9tXCJdJywgdHJ1ZSk7XG5cbiAgYXdhaXQgZmlsbElucHV0KHBhZ2UsICdpbnB1dFtmb3JtY29udHJvbG5hbWU9XCJ0eHRJbnB1dEZyb21cIl0nLCBzdGFydERhdGUuZm9ybWF0KERBVEVfRk9STUFUKSk7XG5cbiAgLy8gd2UgbXVzdCBibHVyIHRoZSBmcm9tIGNvbnRyb2wgb3RoZXJ3aXNlIHRoZSBzZWFyY2ggd2lsbCB1c2UgdGhlIHByZXZpb3VzIHZhbHVlXG4gIGF3YWl0IHBhZ2UuZm9jdXMoXCJidXR0b25bYXJpYS1sYWJlbD0n16HXoNefJ11cIik7XG5cbiAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgXCJidXR0b25bYXJpYS1sYWJlbD0n16HXoNefJ11cIik7XG4gIGNvbnN0IGZpbmFsUmVzcG9uc2UgPSBhd2FpdCBwYWdlLndhaXRGb3JSZXNwb25zZShyZXNwb25zZSA9PiB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLnVybCgpID09PSBGSUxURVJFRF9UUkFOU0FDVElPTlNfVVJMICYmIHJlc3BvbnNlLnJlcXVlc3QoKS5tZXRob2QoKSA9PT0gJ1BPU1QnO1xuICB9KTtcblxuICBjb25zdCByZXNwb25zZUpzb246IGFueSA9IGF3YWl0IGZpbmFsUmVzcG9uc2UuanNvbigpO1xuXG4gIGNvbnN0IGFjY291bnROdW1iZXIgPSBhY2NvdW50SWQucmVwbGFjZSgnLycsICdfJykucmVwbGFjZSgvW15cXGQtX10vZywgJycpO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5wYXJzZShyZXNwb25zZUpzb24uanNvblJlc3ApO1xuXG4gIGNvbnN0IHBlbmRpbmdUcmFuc2FjdGlvbnMgPSByZXNwb25zZS5Ub2RheVRyYW5zYWN0aW9uc0l0ZW1zO1xuICBjb25zdCB0cmFuc2FjdGlvbnMgPSByZXNwb25zZS5IaXN0b3J5VHJhbnNhY3Rpb25zSXRlbXM7XG4gIGNvbnN0IGJhbGFuY2UgPSByZXNwb25zZS5CYWxhbmNlRGlzcGxheSA/IHBhcnNlRmxvYXQocmVzcG9uc2UuQmFsYW5jZURpc3BsYXkpIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHBlbmRpbmdUeG5zID0gZXh0cmFjdFRyYW5zYWN0aW9uc0Zyb21QYWdlKHBlbmRpbmdUcmFuc2FjdGlvbnMsIFRyYW5zYWN0aW9uU3RhdHVzZXMuUGVuZGluZyk7XG4gIGNvbnN0IGNvbXBsZXRlZFR4bnMgPSBleHRyYWN0VHJhbnNhY3Rpb25zRnJvbVBhZ2UodHJhbnNhY3Rpb25zLCBUcmFuc2FjdGlvblN0YXR1c2VzLkNvbXBsZXRlZCk7XG4gIGNvbnN0IHR4bnMgPSBbLi4ucGVuZGluZ1R4bnMsIC4uLmNvbXBsZXRlZFR4bnNdO1xuXG4gIHJldHVybiB7XG4gICAgYWNjb3VudE51bWJlcixcbiAgICBiYWxhbmNlLFxuICAgIHR4bnMsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoVHJhbnNhY3Rpb25zKHBhZ2U6IFBhZ2UsIHN0YXJ0RGF0ZTogTW9tZW50KTogUHJvbWlzZTxUcmFuc2FjdGlvbnNBY2NvdW50W10+IHtcbiAgY29uc3QgYWNjb3VudHM6IFRyYW5zYWN0aW9uc0FjY291bnRbXSA9IFtdO1xuXG4gIC8vIERFVkVMT1BFUiBOT1RJQ0UgdGhlIGFjY291bnQgbnVtYmVyIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlciBpcyBiZWluZyBhbHRlcmVkIGF0XG4gIC8vIHJ1bnRpbWUgZm9yIHNvbWUgYWNjb3VudHMgYWZ0ZXIgMS0yIHNlY29uZHMgc28gd2UgbmVlZCB0byBoYW5nIHRoZSBwcm9jZXNzIGZvciBhIHNob3J0IHdoaWxlLlxuICBhd2FpdCBoYW5nUHJvY2Vzcyg0MDAwKTtcblxuICBjb25zdCBhY2NvdW50c0lkcyA9IChhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+XG4gICAgQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdhcHAtbWFza2VkLW51bWJlci1jb21ibyBzcGFuLmRpc3BsYXktbnVtYmVyLWxpJyksIGUgPT4gZS50ZXh0Q29udGVudCksXG4gICkpIGFzIHN0cmluZ1tdO1xuXG4gIC8vIGR1ZSB0byBhIGJ1ZywgdGhlIGFsdGVyZWQgdmFsdWUgbWlnaHQgaW5jbHVkZSB1bmRlc2lyZWQgc2lnbnMgbGlrZSAmIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWRcblxuICBpZiAoIWFjY291bnRzSWRzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGV4dHJhY3Qgb3IgcGFyc2UgdGhlIGFjY291bnQgbnVtYmVyJyk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGFjY291bnRJZCBvZiBhY2NvdW50c0lkcykge1xuICAgIGlmIChhY2NvdW50c0lkcy5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBnZXQgbGlzdCBvZiBhY2NvdW50cyBhbmQgY2hlY2sgYWNjb3VudElkXG4gICAgICBhd2FpdCBjbGlja0J5WFBhdGgocGFnZSwgJ3hwYXRoLy8vKltjb250YWlucyhAY2xhc3MsIFwibnVtYmVyXCIpIGFuZCBjb250YWlucyhAY2xhc3MsIFwiY29tYm8taW5uZXJcIildJyk7XG4gICAgICBhd2FpdCBjbGlja0J5WFBhdGgocGFnZSwgYHhwYXRoLy8vc3Bhbltjb250YWlucyh0ZXh0KCksICcke2FjY291bnRJZH0nKV1gKTtcbiAgICB9XG5cbiAgICBhY2NvdW50cy5wdXNoKGF3YWl0IGZldGNoVHJhbnNhY3Rpb25zRm9yQWNjb3VudChwYWdlLCBzdGFydERhdGUsIHJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKGFjY291bnRJZCkpKTtcbiAgfVxuXG4gIHJldHVybiBhY2NvdW50cztcbn1cblxuYXN5bmMgZnVuY3Rpb24gbmF2aWdhdGVUb0xvZ2luKHBhZ2U6IFBhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbG9naW5CdXR0b25TZWxlY3RvciA9ICcuZW50ZXItYWNjb3VudCBhW29yaWdpbmFsdGl0bGU9XCLXm9eg15nXodeUINec15fXqdeR15XXoNeaXCJdJztcbiAgZGVidWcoJ3dhaXQgZm9yIGhvbWVwYWdlIHRvIGNsaWNrIG9uIGxvZ2luIGJ1dHRvbicpO1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgbG9naW5CdXR0b25TZWxlY3Rvcik7XG4gIGRlYnVnKCduYXZpZ2F0ZSB0byBsb2dpbiBwYWdlJyk7XG4gIGNvbnN0IGxvZ2luVXJsID0gYXdhaXQgcGFnZUV2YWwocGFnZSwgbG9naW5CdXR0b25TZWxlY3RvciwgbnVsbCwgZWxlbWVudCA9PiB7XG4gICAgcmV0dXJuIChlbGVtZW50IGFzIGFueSkuaHJlZjtcbiAgfSk7XG4gIGRlYnVnKGBuYXZpZ2F0aW5nIHRvIHBhZ2UgKCR7bG9naW5Vcmx9KWApO1xuICBhd2FpdCBwYWdlLmdvdG8obG9naW5VcmwpO1xuICBkZWJ1Zygnd2FpdGluZyBmb3IgcGFnZSB0byBiZSBsb2FkZWQgKG5ldHdvcmtpZGxlMiknKTtcbiAgYXdhaXQgd2FpdEZvck5hdmlnYXRpb24ocGFnZSwgeyB3YWl0VW50aWw6ICduZXR3b3JraWRsZTInIH0pO1xuICBkZWJ1Zygnd2FpdGluZyBmb3IgY29tcG9uZW50cyBvZiBsb2dpbiB0byBlbnRlciBjcmVkZW50aWFscycpO1xuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICdpbnB1dFtwbGFjZWhvbGRlcj1cItep150g157Xqdeq157XqVwiXScsIHRydWUpLFxuICAgIHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnaW5wdXRbcGxhY2Vob2xkZXI9XCLXodeZ16HXnteUXCJdJywgdHJ1ZSksXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICdidXR0b25bdHlwZT1cInN1Ym1pdFwiXScsIHRydWUpLFxuICBdKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvclBvc3RMb2dpbihwYWdlOiBQYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICdhW3RpdGxlPVwi15PXnNeSINec15fXqdeR15XXn1wiXScsIHRydWUsIDYwMDAwKSxcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJ2Rpdi5tYWluLWNvbnRlbnQnLCBmYWxzZSwgNjAwMDApLFxuICAgIHBhZ2Uud2FpdEZvclNlbGVjdG9yKGB4cGF0aC8vZGl2W2NvbnRhaW5zKHN0cmluZygpLFwiJHtJTlZBTElEX1BBU1NXT1JEX01TR31cIildYCksXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICdmb3JtW2FjdGlvbj1cIi9jaGFuZ2VwYXNzd29yZFwiXScsIHRydWUsIDYwMDAwKSwgLy8gbm90IHN1cmUgaWYgdGhleSBrZXB0IHRoaXMgb25lXG4gIF0pO1xufVxuXG50eXBlIFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzID0geyB1c2VybmFtZTogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH07XG5cbmNsYXNzIExldW1pU2NyYXBlciBleHRlbmRzIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXI8U2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHM+IHtcbiAgZ2V0TG9naW5PcHRpb25zKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscykge1xuICAgIHJldHVybiB7XG4gICAgICBsb2dpblVybDogTE9HSU5fVVJMLFxuICAgICAgZmllbGRzOiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFscyksXG4gICAgICBzdWJtaXRCdXR0b25TZWxlY3RvcjogXCJidXR0b25bdHlwZT0nc3VibWl0J11cIixcbiAgICAgIGNoZWNrUmVhZGluZXNzOiBhc3luYyAoKSA9PiBuYXZpZ2F0ZVRvTG9naW4odGhpcy5wYWdlKSxcbiAgICAgIHBvc3RBY3Rpb246IGFzeW5jICgpID0+IHdhaXRGb3JQb3N0TG9naW4odGhpcy5wYWdlKSxcbiAgICAgIHBvc3NpYmxlUmVzdWx0czogZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCk6IFByb21pc2U8U2NyYXBlclNjcmFwaW5nUmVzdWx0PiB7XG4gICAgY29uc3QgbWluaW11bVN0YXJ0TW9tZW50ID0gbW9tZW50KCkuc3VidHJhY3QoMywgJ3llYXJzJykuYWRkKDEsICdkYXknKTtcbiAgICBjb25zdCBkZWZhdWx0U3RhcnRNb21lbnQgPSBtb21lbnQoKS5zdWJ0cmFjdCgxLCAneWVhcnMnKS5hZGQoMSwgJ2RheScpO1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMub3B0aW9ucy5zdGFydERhdGUgfHwgZGVmYXVsdFN0YXJ0TW9tZW50LnRvRGF0ZSgpO1xuICAgIGNvbnN0IHN0YXJ0TW9tZW50ID0gbW9tZW50Lm1heChtaW5pbXVtU3RhcnRNb21lbnQsIG1vbWVudChzdGFydERhdGUpKTtcblxuICAgIGF3YWl0IHRoaXMubmF2aWdhdGVUbyhUUkFOU0FDVElPTlNfVVJMKTtcblxuICAgIGNvbnN0IGFjY291bnRzID0gYXdhaXQgZmV0Y2hUcmFuc2FjdGlvbnModGhpcy5wYWdlLCBzdGFydE1vbWVudCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGFjY291bnRzLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGV1bWlTY3JhcGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBQyxVQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxNQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxxQkFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksV0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssYUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sdUJBQUEsR0FBQU4sT0FBQTtBQUFzRyxTQUFBRCx1QkFBQVEsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQUd0RyxNQUFNRyxLQUFLLEdBQUcsSUFBQUMsZUFBUSxFQUFDLE9BQU8sQ0FBQztBQUMvQixNQUFNQyxRQUFRLEdBQUcsNkJBQTZCO0FBQzlDLE1BQU1DLFNBQVMsR0FBRywwQkFBMEI7QUFDNUMsTUFBTUMsZ0JBQWdCLEdBQUcsR0FBR0YsUUFBUSwwREFBMEQ7QUFDOUYsTUFBTUcseUJBQXlCLEdBQUcsR0FB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _leumi = _interopRequireDefault(require("./leumi"));
|
|
4
|
+
var _testsUtils = require("../tests/tests-utils");
|
|
5
|
+
var _definitions = require("../definitions");
|
|
6
|
+
var _baseScraperWithBrowser = require("./base-scraper-with-browser");
|
|
7
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
const COMPANY_ID = 'leumi'; // TODO this property should be hard-coded in the provider
|
|
9
|
+
const testsConfig = (0, _testsUtils.getTestsConfig)();
|
|
10
|
+
describe('Leumi legacy scraper', () => {
|
|
11
|
+
beforeAll(() => {
|
|
12
|
+
(0, _testsUtils.extendAsyncTimeout)(); // The default timeout is 5 seconds per async test, this function extends the timeout value
|
|
13
|
+
});
|
|
14
|
+
test('should expose login fields in scrapers constant', () => {
|
|
15
|
+
expect(_definitions.SCRAPERS.leumi).toBeDefined();
|
|
16
|
+
expect(_definitions.SCRAPERS.leumi.loginFields).toContain('username');
|
|
17
|
+
expect(_definitions.SCRAPERS.leumi.loginFields).toContain('password');
|
|
18
|
+
});
|
|
19
|
+
(0, _testsUtils.maybeTestCompanyAPI)(COMPANY_ID, config => config.companyAPI.invalidPassword)('should fail on invalid user/password"', async () => {
|
|
20
|
+
const options = {
|
|
21
|
+
...testsConfig.options,
|
|
22
|
+
companyId: COMPANY_ID
|
|
23
|
+
};
|
|
24
|
+
const scraper = new _leumi.default(options);
|
|
25
|
+
const result = await scraper.scrape({
|
|
26
|
+
username: 'e10s12',
|
|
27
|
+
password: '3f3ss3d'
|
|
28
|
+
});
|
|
29
|
+
expect(result).toBeDefined();
|
|
30
|
+
expect(result.success).toBeFalsy();
|
|
31
|
+
expect(result.errorType).toBe(_baseScraperWithBrowser.LoginResults.InvalidPassword);
|
|
32
|
+
});
|
|
33
|
+
(0, _testsUtils.maybeTestCompanyAPI)(COMPANY_ID)('should scrape transactions', async () => {
|
|
34
|
+
const options = {
|
|
35
|
+
...testsConfig.options,
|
|
36
|
+
companyId: COMPANY_ID
|
|
37
|
+
};
|
|
38
|
+
const scraper = new _leumi.default(options);
|
|
39
|
+
const result = await scraper.scrape(testsConfig.credentials.leumi);
|
|
40
|
+
expect(result).toBeDefined();
|
|
41
|
+
const error = `${result.errorType || ''} ${result.errorMessage || ''}`.trim();
|
|
42
|
+
expect(error).toBe('');
|
|
43
|
+
expect(result.success).toBeTruthy();
|
|
44
|
+
(0, _testsUtils.exportTransactions)(COMPANY_ID, result.accounts || []);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGV1bWkiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl90ZXN0c1V0aWxzIiwiX2RlZmluaXRpb25zIiwiX2Jhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJDT01QQU5ZX0lEIiwidGVzdHNDb25maWciLCJnZXRUZXN0c0NvbmZpZyIsImRlc2NyaWJlIiwiYmVmb3JlQWxsIiwiZXh0ZW5kQXN5bmNUaW1lb3V0IiwidGVzdCIsImV4cGVjdCIsIlNDUkFQRVJTIiwibGV1bWkiLCJ0b0JlRGVmaW5lZCIsImxvZ2luRmllbGRzIiwidG9Db250YWluIiwibWF5YmVUZXN0Q29tcGFueUFQSSIsImNvbmZpZyIsImNvbXBhbnlBUEkiLCJpbnZhbGlkUGFzc3dvcmQiLCJvcHRpb25zIiwiY29tcGFueUlkIiwic2NyYXBlciIsIkxldW1pU2NyYXBlciIsInJlc3VsdCIsInNjcmFwZSIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJzdWNjZXNzIiwidG9CZUZhbHN5IiwiZXJyb3JUeXBlIiwidG9CZSIsIkxvZ2luUmVzdWx0cyIsIkludmFsaWRQYXNzd29yZCIsImNyZWRlbnRpYWxzIiwiZXJyb3IiLCJlcnJvck1lc3NhZ2UiLCJ0cmltIiwidG9CZVRydXRoeSIsImV4cG9ydFRyYW5zYWN0aW9ucyIsImFjY291bnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZXJzL2xldW1pLnRlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExldW1pU2NyYXBlciBmcm9tICcuL2xldW1pJztcbmltcG9ydCB7IG1heWJlVGVzdENvbXBhbnlBUEksIGV4dGVuZEFzeW5jVGltZW91dCwgZ2V0VGVzdHNDb25maWcsIGV4cG9ydFRyYW5zYWN0aW9ucyB9IGZyb20gJy4uL3Rlc3RzL3Rlc3RzLXV0aWxzJztcbmltcG9ydCB7IFNDUkFQRVJTIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMnO1xuaW1wb3J0IHsgTG9naW5SZXN1bHRzIH0gZnJvbSAnLi9iYXNlLXNjcmFwZXItd2l0aC1icm93c2VyJztcblxuY29uc3QgQ09NUEFOWV9JRCA9ICdsZXVtaSc7IC8vIFRPRE8gdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgaGFyZC1jb2RlZCBpbiB0aGUgcHJvdmlkZXJcbmNvbnN0IHRlc3RzQ29uZmlnID0gZ2V0VGVzdHNDb25maWcoKTtcblxuZGVzY3JpYmUoJ0xldW1pIGxlZ2FjeSBzY3JhcGVyJywgKCkgPT4ge1xuICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgIGV4dGVuZEFzeW5jVGltZW91dCgpOyAvLyBUaGUgZGVmYXVsdCB0aW1lb3V0IGlzIDUgc2Vjb25kcyBwZXIgYXN5bmMgdGVzdCwgdGhpcyBmdW5jdGlvbiBleHRlbmRzIHRoZSB0aW1lb3V0IHZhbHVlXG4gIH0pO1xuXG4gIHRlc3QoJ3Nob3VsZCBleHBvc2UgbG9naW4gZmllbGRzIGluIHNjcmFwZXJzIGNvbnN0YW50JywgKCkgPT4ge1xuICAgIGV4cGVjdChTQ1JBUEVSUy5sZXVtaSkudG9CZURlZmluZWQoKTtcbiAgICBleHBlY3QoU0NSQVBFUlMubGV1bWkubG9naW5GaWVsZHMpLnRvQ29udGFpbigndXNlcm5hbWUnKTtcbiAgICBleHBlY3QoU0NSQVBFUlMubGV1bWkubG9naW5GaWVsZHMpLnRvQ29udGFpbigncGFzc3dvcmQnKTtcbiAgfSk7XG5cbiAgbWF5YmVUZXN0Q29tcGFueUFQSShDT01QQU5ZX0lELCBjb25maWcgPT4gY29uZmlnLmNvbXBhbnlBUEkuaW52YWxpZFBhc3N3b3JkKShcbiAgICAnc2hvdWxkIGZhaWwgb24gaW52YWxpZCB1c2VyL3Bhc3N3b3JkXCInLFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIC4uLnRlc3RzQ29uZmlnLm9wdGlvbnMsXG4gICAgICAgIGNvbXBhbnlJZDogQ09NUEFOWV9JRCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHNjcmFwZXIgPSBuZXcgTGV1bWlTY3JhcGVyKG9wdGlvbnMpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzY3JhcGVyLnNjcmFwZSh7IHVzZXJuYW1lOiAnZTEwczEyJywgcGFzc3dvcmQ6ICczZjNzczNkJyB9KTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuc3VjY2VzcykudG9CZUZhbHN5KCk7XG4gICAgICBleHBlY3QocmVzdWx0LmVycm9yVHlwZSkudG9CZShMb2dpblJlc3VsdHMuSW52YWxpZFBhc3N3b3JkKTtcbiAgICB9LFxuICApO1xuXG4gIG1heWJlVGVzdENvbXBhbnlBUEkoQ09NUEFOWV9JRCkoJ3Nob3VsZCBzY3JhcGUgdHJhbnNhY3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAuLi50ZXN0c0NvbmZpZy5vcHRpb25zLFxuICAgICAgY29tcGFueUlkOiBDT01QQU5ZX0lELFxuICAgIH07XG5cbiAgICBjb25zdCBzY3JhcGVyID0gbmV3IExldW1pU2NyYXBlcihvcHRpb25zKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzY3JhcGVyLnNjcmFwZSh0ZXN0c0NvbmZpZy5jcmVkZW50aWFscy5sZXVtaSk7XG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKTtcbiAgICBjb25zdCBlcnJvciA9IGAke3Jlc3VsdC5lcnJvclR5cGUgfHwgJyd9ICR7cmVzdWx0LmVycm9yTWVzc2FnZSB8fCAnJ31gLnRyaW0oKTtcbiAgICBleHBlY3QoZXJyb3IpLnRvQmUoJycpO1xuICAgIGV4cGVjdChyZXN1bHQuc3VjY2VzcykudG9CZVRydXRoeSgpO1xuXG4gICAgZXhwb3J0VHJhbnNhY3Rpb25zKENPTVBBTllfSUQsIHJlc3VsdC5hY2NvdW50cyB8fCBbXSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsV0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsWUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsdUJBQUEsR0FBQUgsT0FBQTtBQUEyRCxTQUFBRCx1QkFBQUssQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQUUzRCxNQUFNRyxVQUFVLEdBQUcsT0FBTyxDQUFDLENBQUM7QUFDNUIsTUFBTUMsV0FBVyxHQUFHLElBQUFDLDBCQUFjLEVBQUMsQ0FBQztBQUVwQ0MsUUFBUSxDQUFDLHNCQUFzQixFQUFFLE1BQU07RUFDckNDLFNBQVMsQ0FBQyxNQUFNO0lBQ2QsSUFBQUMsOEJBQWtCLEVBQUMsQ0FBQyxDQUFDLENBQUM7RUFDeEIsQ0FBQyxDQUFDO0VBRUZDLElBQUksQ0FBQyxpREFBaUQsRUFBRSxNQUFNO0lBQzVEQyxNQUFNLENBQUNDLHFCQUFRLENBQUNDLEtBQUssQ0FBQyxDQUFDQyxXQUFXLENBQUMsQ0FBQztJQUNwQ0gsTUFBTSxDQUFDQyxxQkFBUSxDQUFDQyxLQUFLLENBQUNFLFdBQVcsQ0FBQyxDQUFDQyxTQUFTLENBQUMsVUFBVSxDQUFDO0lBQ3hETCxNQUFNLENBQUNDLHFCQUFRLENBQUNDLEtBQUssQ0FBQ0UsV0FBVyxDQUFDLENBQUNDLFNBQVMsQ0FBQyxVQUFVLENBQUM7RUFDMUQsQ0FBQyxDQUFDO0VBRUYsSUFBQUMsK0JBQW1CLEVBQUNiLFVBQVUsRUFBRWMsTUFBTSxJQUFJQSxNQUFNLENBQUNDLFVBQVUsQ0FBQ0MsZUFBZSxDQUFDLENBQzFFLHVDQUF1QyxFQUN2QyxZQUFZO0lBQ1YsTUFBTUMsT0FBTyxHQUFHO01BQ2QsR0FBR2hCLFdBQVcsQ0FBQ2dCLE9BQU87TUFDdEJDLFNBQVMsRUFBRWxCO0lBQ2IsQ0FBQztJQUVELE1BQU1tQixPQUFPLEdBQUcsSUFBSUMsY0FBWSxDQUFDSCxPQUFPLENBQUM7SUFFekMsTUFBTUksTUFBTSxHQUFHLE1BQU1GLE9BQU8sQ0FBQ0csTUFBTSxDQUFDO01BQUVDLFFBQVEsRUFBRSxRQUFRO01BQUVDLFFBQVEsRUFBRTtJQUFVLENBQUMsQ0FBQztJQUVoRmpCLE1BQU0sQ0FBQ2MsTUFBTSxDQUFDLENBQUNYLFdBQVcsQ0FBQyxDQUFDO0lBQzVCSCxNQUFNLENBQUNjLE1BQU0sQ0FBQ0ksT0FBTyxDQUFDLENBQUNDLFNBQVMsQ0FBQyxDQUFDO0lBQ2xDbkIsTUFBTSxDQUFDYyxNQUFNLENBQUNNLFNBQVMsQ0FBQyxDQUFDQyxJQUFJLENBQUNDLG9DQUFZLENBQUNDLGVBQWUsQ0FBQztFQUM3RCxDQUNGLENBQUM7RUFFRCxJQUFBakIsK0JBQW1CLEVBQUNiLFVBQVUsQ0FBQyxDQUFDLDRCQUE0QixFQUFFLFlBQVk7SUFDeEUsTUFBTWlCLE9BQU8sR0FBRztNQUNkLEdBQUdoQixXQUFXLENBQUNnQixPQUFPO01BQ3RCQyxTQUFTLEVBQUVsQjtJQUNiLENBQUM7SUFFRCxNQUFNbUIsT0FBTyxHQUFHLElBQUlDLGNBQVksQ0FBQ0gsT0FBTyxDQUFDO0lBQ3pDLE1BQU1JLE1BQU0sR0FBRyxNQUFNRixPQUFPLENBQUNHLE1BQU0sQ0FBQ3JCLFdBQVcsQ0FBQzhCLFdBQVcsQ0FBQ3RCLEtBQUssQ0FBQztJQUNsRUYsTUFBTSxDQUFDYyxNQUFNLENBQUMsQ0FBQ1gsV0FBVyxDQUFDLENBQUM7SUFDNUIsTUFBTXNCLEtBQUssR0FBRyxHQUFHWCxNQUFNLENBQUNNLFNBQVMsSUFBSSxFQUFFLElBQUlOLE1BQU0sQ0FBQ1ksWUFBWSxJQUFJLEVBQUUsRUFBRSxDQUFDQyxJQUFJLENBQUMsQ0FBQztJQUM3RTNCLE1BQU0sQ0FBQ3lCLEtBQUssQ0FBQyxDQUFDSixJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ3RCckIsTUFBTSxDQUFDYyxNQUFNLENBQUNJLE9BQU8sQ0FBQyxDQUFDVSxVQUFVLENBQUMsQ0FBQztJQUVuQyxJQUFBQyw4QkFBa0IsRUFBQ3BDLFVBQVUsRUFBRXFCLE1BQU0sQ0FBQ2dCLFFBQVEsSUFBSSxFQUFFLENBQUM7RUFDdkQsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _baseBeinleumiGroup = _interopRequireDefault(require("./base-beinleumi-group"));
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
class MassadScraper extends _baseBeinleumiGroup.default {
|
|
10
|
+
BASE_URL = 'https://online.bankmassad.co.il';
|
|
11
|
+
LOGIN_URL = `${this.BASE_URL}/MatafLoginService/MatafLoginServlet?bankId=MASADPRTAL&site=Private&KODSAFA=HE`;
|
|
12
|
+
TRANSACTIONS_URL = `${this.BASE_URL}/wps/myportal/FibiMenu/Online/OnAccountMngment/OnBalanceTrans/PrivateAccountFlow`;
|
|
13
|
+
}
|
|
14
|
+
var _default = exports.default = MassadScraper;
|
|
15
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYmFzZUJlaW5sZXVtaUdyb3VwIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJNYXNzYWRTY3JhcGVyIiwiQmVpbmxldW1pR3JvdXBCYXNlU2NyYXBlciIsIkJBU0VfVVJMIiwiTE9HSU5fVVJMIiwiVFJBTlNBQ1RJT05TX1VSTCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy9tYXNzYWQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJlaW5sZXVtaUdyb3VwQmFzZVNjcmFwZXIgZnJvbSAnLi9iYXNlLWJlaW5sZXVtaS1ncm91cCc7XG5cbmNsYXNzIE1hc3NhZFNjcmFwZXIgZXh0ZW5kcyBCZWlubGV1bWlHcm91cEJhc2VTY3JhcGVyIHtcbiAgQkFTRV9VUkwgPSAnaHR0cHM6Ly9vbmxpbmUuYmFua21hc3NhZC5jby5pbCc7XG5cbiAgTE9HSU5fVVJMID0gYCR7dGhpcy5CQVNFX1VSTH0vTWF0YWZMb2dpblNlcnZpY2UvTWF0YWZMb2dpblNlcnZsZXQ/YmFua0lkPU1BU0FEUFJUQUwmc2l0ZT1Qcml2YXRlJktPRFNBRkE9SEVgO1xuXG4gIFRSQU5TQUNUSU9OU19VUkwgPSBgJHt0aGlzLkJBU0VfVVJMfS93cHMvbXlwb3J0YWwvRmliaU1lbnUvT25saW5lL09uQWNjb3VudE1uZ21lbnQvT25CYWxhbmNlVHJhbnMvUHJpdmF0ZUFjY291bnRGbG93YDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFzc2FkU2NyYXBlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsbUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUErRCxTQUFBRCx1QkFBQUUsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQUUvRCxNQUFNRyxhQUFhLFNBQVNDLDJCQUF5QixDQUFDO0VBQ3BEQyxRQUFRLEdBQUcsaUNBQWlDO0VBRTVDQyxTQUFTLEdBQUcsR0FBRyxJQUFJLENBQUNELFFBQVEsZ0ZBQWdGO0VBRTVHRSxnQkFBZ0IsR0FBRyxHQUFHLElBQUksQ0FBQ0YsUUFBUSxrRkFBa0Y7QUFDdkg7QUFBQyxJQUFBRyxRQUFBLEdBQUFDLE9BQUEsQ0FBQVAsT0FBQSxHQUVjQyxhQUFhIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type Transaction } from '../transactions';
|
|
2
|
+
import { BaseScraperWithBrowser, type LoginOptions } from './base-scraper-with-browser';
|
|
3
|
+
export interface ScrapedTransaction {
|
|
4
|
+
shortCardNumber: string;
|
|
5
|
+
paymentDate?: string;
|
|
6
|
+
purchaseDate: string;
|
|
7
|
+
actualPaymentAmount: string;
|
|
8
|
+
paymentCurrency: number | null;
|
|
9
|
+
originalCurrency: string;
|
|
10
|
+
originalAmount: number;
|
|
11
|
+
planName: string;
|
|
12
|
+
planTypeId: number;
|
|
13
|
+
comments: string;
|
|
14
|
+
merchantName: string;
|
|
15
|
+
categoryId: number;
|
|
16
|
+
fundsTransferComment?: string;
|
|
17
|
+
fundsTransferReceiverOrTransfer?: string;
|
|
18
|
+
dealData?: {
|
|
19
|
+
arn: string;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export declare function getMemo({ comments, fundsTransferReceiverOrTransfer, fundsTransferComment, }: Pick<ScrapedTransaction, 'comments' | 'fundsTransferReceiverOrTransfer' | 'fundsTransferComment'>): string;
|
|
23
|
+
type ScraperSpecificCredentials = {
|
|
24
|
+
username: string;
|
|
25
|
+
password: string;
|
|
26
|
+
};
|
|
27
|
+
declare class MaxScraper extends BaseScraperWithBrowser<ScraperSpecificCredentials> {
|
|
28
|
+
getLoginOptions(credentials: ScraperSpecificCredentials): LoginOptions;
|
|
29
|
+
fetchData(): Promise<{
|
|
30
|
+
success: boolean;
|
|
31
|
+
accounts: {
|
|
32
|
+
accountNumber: string;
|
|
33
|
+
txns: Transaction[];
|
|
34
|
+
}[];
|
|
35
|
+
}>;
|
|
36
|
+
}
|
|
37
|
+
export default MaxScraper;
|