bx-rest 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +53 -0
- package/README.en.md +235 -2
- package/README.md +235 -2
- package/esm2022/functions/errors.mjs +18 -2
- package/esm2022/public-api.mjs +6 -2
- package/esm2022/rest/base.mjs +3 -3
- package/esm2022/services/frame/frame.mjs +347 -0
- package/esm2022/services/frame/transport.mjs +224 -0
- package/esm2022/services/frame/types.mjs +2 -0
- package/esm2022/services/http/HttpBX.mjs +39 -17
- package/esm2022/services/http/authRefresh.mjs +89 -0
- package/esm2022/services/http/sessionKey.mjs +8 -1
- package/esm2022/services/navvy/extends/navvy-pag-base.mjs +25 -4
- package/esm2022/services/navvy/navvy-alternative-pagination-navigation.mjs +2 -2
- package/esm2022/services/navvy/navvy-pag-nav-result-key-object.mjs +2 -2
- package/esm2022/services/navvy/navvy-pag-nav-result-key.mjs +2 -2
- package/esm2022/services/navvy/navvy-pag-nav-tasks.mjs +2 -2
- package/esm2022/services/navvy/navvy-pag-nav-with-useless-key.mjs +2 -2
- package/esm2022/services/navvy/navvy-pag.mjs +2 -2
- package/esm2022/typification/settings.mjs +1 -1
- package/fesm2022/bx-rest.mjs +820 -101
- package/fesm2022/bx-rest.mjs.map +1 -1
- package/functions/errors.d.ts +17 -0
- package/package.json +1 -1
- package/public-api.d.ts +5 -1
- package/rest/base.d.ts +1 -1
- package/services/frame/frame.d.ts +191 -0
- package/services/frame/transport.d.ts +75 -0
- package/services/frame/types.d.ts +123 -0
- package/services/http/HttpBX.d.ts +15 -4
- package/services/http/authRefresh.d.ts +19 -0
- package/services/http/sessionKey.d.ts +5 -0
- package/services/navvy/extends/navvy-pag-base.d.ts +11 -0
- package/typification/settings.d.ts +24 -0
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Обмен сообщениями между iframe приложения и порталом Bitrix24 — тот
|
|
3
|
+
* транспорт, на котором построены команды BX24.js: страница приложения шлёт
|
|
4
|
+
* команду родительскому окну портала через postMessage, портал отвечает
|
|
5
|
+
* сообщением с тем же callbackId.
|
|
6
|
+
*
|
|
7
|
+
* ВНИМАНИЕ: протокол внутренний и недокументированный — Bitrix24 может
|
|
8
|
+
* изменить его без предупреждения. Транспорт повторяет BX24.js
|
|
9
|
+
* (https://api.bitrix24.com/api/v1/, скачан 2026-10-29, Last-Modified
|
|
10
|
+
* 2022-03-17, sha256 945ad491df8ffb7490b89f4914a439b5a3f575c950c3480562815716a3e07f23)
|
|
11
|
+
* и сверен с ответной стороной портала — `/bitrix/js/rest/applayout.js`
|
|
12
|
+
* (Last-Modified 2024-05-15, sha256 3efd6ab57a4778493a26d10ae0987a82e19fc012ed9935f5c6afa78c4052fcb5).
|
|
13
|
+
* Всё знание о протоколе — только в этом модуле (`services/frame`).
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Ошибка обращения к порталу из iframe. `code`:
|
|
17
|
+
* - `NOT_IN_FRAME` — страница открыта не в iframe приложения Bitrix24;
|
|
18
|
+
* - `TIMEOUT` — портал не ответил за отведённое время;
|
|
19
|
+
* - `NO_AUTH` — портал ответил без токена;
|
|
20
|
+
* - `BAD_RESPONSE` — ответ портала не удалось разобрать;
|
|
21
|
+
* - `CANCELLED` — ожидание отменено через `signal` или новым вызовом того же диалога;
|
|
22
|
+
* - `ACCESS_DENIED` — команда доступна только администратору портала.
|
|
23
|
+
*/
|
|
24
|
+
export class BXRestFrameError extends Error {
|
|
25
|
+
constructor(code, message) {
|
|
26
|
+
super(message);
|
|
27
|
+
this.code = code;
|
|
28
|
+
this.name = 'BXRestFrameError';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Параметры портала (DOMAIN, PROTOCOL, APP_SID) читаются в конструкторе —
|
|
33
|
+
* так же, как это делает BX24.js, из `window.name`: портал задаёт имя
|
|
34
|
+
* iframe приложения в виде `DOMAIN|PROTOCOL|APP_SID`. Если там их нет —
|
|
35
|
+
* из query страницы (`?DOMAIN=…&PROTOCOL=…&APP_SID=…`), с которым портал
|
|
36
|
+
* открывает обработчик приложения. Конструктор не бросает исключений:
|
|
37
|
+
* вне iframe ошибку вернут сами команды.
|
|
38
|
+
*/
|
|
39
|
+
export class FrameTransport {
|
|
40
|
+
constructor() {
|
|
41
|
+
this.frame = readPortalFrame();
|
|
42
|
+
}
|
|
43
|
+
/** Домен портала из параметров фрейма — как `BX24.getDomain()`. */
|
|
44
|
+
get domain() {
|
|
45
|
+
return this.frame?.domain ?? '';
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Команда, на которую портал не отвечает (`reloadWindow`, `imCallTo`, ...).
|
|
49
|
+
* Вне iframe бросает `BXRestFrameError` с кодом `NOT_IN_FRAME`.
|
|
50
|
+
*/
|
|
51
|
+
post(command, params) {
|
|
52
|
+
this.send(this.requireFrame(), command, params, '');
|
|
53
|
+
}
|
|
54
|
+
/** Команда с одним ответом портала. */
|
|
55
|
+
request(command, params, options) {
|
|
56
|
+
return new Promise((resolve, reject) => {
|
|
57
|
+
let frame;
|
|
58
|
+
try {
|
|
59
|
+
frame = this.requireFrame();
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
reject(error);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const { timeout, onTimeout = 'reject', signal } = options;
|
|
66
|
+
if (signal?.aborted) {
|
|
67
|
+
reject(cancelled(command));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const callbackId = uniqId();
|
|
71
|
+
let timer;
|
|
72
|
+
const finish = () => {
|
|
73
|
+
clearTimeout(timer);
|
|
74
|
+
stopListening();
|
|
75
|
+
signal?.removeEventListener('abort', onAbort);
|
|
76
|
+
};
|
|
77
|
+
const onAbort = () => {
|
|
78
|
+
finish();
|
|
79
|
+
reject(cancelled(command));
|
|
80
|
+
};
|
|
81
|
+
const stopListening = this.listen(frame, callbackId, payload => {
|
|
82
|
+
finish();
|
|
83
|
+
const answer = parsePayload(payload);
|
|
84
|
+
if (answer.ok) {
|
|
85
|
+
resolve(answer.value);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// В тексте ошибки — только команда, без тела ответа: в нём бывают токены
|
|
89
|
+
reject(new BXRestFrameError('BAD_RESPONSE', `Bitrix24 answered ${command} with a payload that is not JSON.`));
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
if (timeout !== false) {
|
|
93
|
+
timer = setTimeout(() => {
|
|
94
|
+
finish();
|
|
95
|
+
if (onTimeout === 'resolve') {
|
|
96
|
+
resolve(undefined);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
reject(new BXRestFrameError('TIMEOUT', [
|
|
100
|
+
`Bitrix24 did not answer ${command} within ${timeout} ms:`,
|
|
101
|
+
'the page is not opened inside a Bitrix24 portal iframe, or the portal could not process the command.'
|
|
102
|
+
].join(' ')));
|
|
103
|
+
}
|
|
104
|
+
}, timeout);
|
|
105
|
+
}
|
|
106
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
107
|
+
this.send(frame, command, params, callbackId);
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Команда, на которую портал отвечает многократно (`placementBindEvent`):
|
|
112
|
+
* `handler` вызывается на каждый ответ. Возвращает функцию отписки —
|
|
113
|
+
* она только перестаёт слушать: отменить подписку на стороне портала
|
|
114
|
+
* протокол не позволяет. Вне iframe бросает `BXRestFrameError`.
|
|
115
|
+
*/
|
|
116
|
+
subscribe(command, params, handler) {
|
|
117
|
+
const frame = this.requireFrame();
|
|
118
|
+
const callbackId = uniqId();
|
|
119
|
+
const stopListening = this.listen(frame, callbackId, payload => {
|
|
120
|
+
const answer = parsePayload(payload);
|
|
121
|
+
if (answer.ok) {
|
|
122
|
+
handler(answer.value);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
this.send(frame, command, params, callbackId);
|
|
126
|
+
return stopListening;
|
|
127
|
+
}
|
|
128
|
+
requireFrame() {
|
|
129
|
+
if (!this.frame) {
|
|
130
|
+
throw new BXRestFrameError('NOT_IN_FRAME', 'Bitrix24 frame parameters (DOMAIN, APP_SID) were not found in window.name or in the URL query: '
|
|
131
|
+
+ 'the page is not opened as a Bitrix24 application.');
|
|
132
|
+
}
|
|
133
|
+
if (window.parent === window) {
|
|
134
|
+
throw new BXRestFrameError('NOT_IN_FRAME', 'The page is not opened inside an iframe, so there is no Bitrix24 portal to send commands to.');
|
|
135
|
+
}
|
|
136
|
+
return this.frame;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Формат — как у BX24.js. Обычно строка `команда:параметры:callbackId:APP_SID`
|
|
140
|
+
* (портал разбирает её с конца, поэтому параметры и callbackId могут быть
|
|
141
|
+
* пустыми); для команд с `:` в имени — объект.
|
|
142
|
+
*/
|
|
143
|
+
send(frame, command, params, callbackId) {
|
|
144
|
+
const message = command.includes(':')
|
|
145
|
+
? { method: command, params: params ? params : '', callback: callbackId, appSid: frame.appSid }
|
|
146
|
+
: `${command}:${params ? JSON.stringify(params) : ''}:${callbackId}:${frame.appSid}`;
|
|
147
|
+
window.parent.postMessage(message, frame.origin);
|
|
148
|
+
}
|
|
149
|
+
/** Ответ портала — строка `callbackId:JSON` (или `callbackId:`, если ответ пустой). */
|
|
150
|
+
listen(frame, callbackId, onAnswer) {
|
|
151
|
+
const portalWindow = window.parent;
|
|
152
|
+
const onMessage = (event) => {
|
|
153
|
+
// Ответ принимаем только от родительского окна и только с origin
|
|
154
|
+
// портала — BX24.js проверяет лишь origin
|
|
155
|
+
if (event.source !== portalWindow || event.origin !== frame.origin || typeof event.data !== 'string') {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const separator = event.data.indexOf(':');
|
|
159
|
+
const id = separator < 0 ? event.data : event.data.slice(0, separator);
|
|
160
|
+
if (id === callbackId) {
|
|
161
|
+
onAnswer(separator < 0 ? '' : event.data.slice(separator + 1));
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
window.addEventListener('message', onMessage);
|
|
165
|
+
return () => window.removeEventListener('message', onMessage);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function parsePayload(payload) {
|
|
169
|
+
if (payload === '') {
|
|
170
|
+
return { ok: true, value: undefined };
|
|
171
|
+
}
|
|
172
|
+
try {
|
|
173
|
+
return { ok: true, value: JSON.parse(payload) };
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return { ok: false };
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function cancelled(command) {
|
|
180
|
+
return new BXRestFrameError('CANCELLED', `Waiting for the Bitrix24 answer to ${command} was cancelled.`);
|
|
181
|
+
}
|
|
182
|
+
function readPortalFrame() {
|
|
183
|
+
if (typeof window === 'undefined') {
|
|
184
|
+
return undefined;
|
|
185
|
+
}
|
|
186
|
+
// BX24.js: window.name = 'DOMAIN|PROTOCOL|APP_SID'
|
|
187
|
+
const [nameDomain, nameProtocol, nameAppSid] = (typeof window.name === 'string' ? window.name : '').split('|');
|
|
188
|
+
const fromName = toPortalFrame(nameDomain, nameProtocol, nameAppSid);
|
|
189
|
+
if (fromName) {
|
|
190
|
+
return fromName;
|
|
191
|
+
}
|
|
192
|
+
try {
|
|
193
|
+
const query = new URLSearchParams(window.location?.search ?? '');
|
|
194
|
+
return toPortalFrame(query.get('DOMAIN'), query.get('PROTOCOL'), query.get('APP_SID'));
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
return undefined;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function toPortalFrame(rawDomain, rawProtocol, appSid) {
|
|
201
|
+
// Как BX24.js: порт по умолчанию отрезается, PROTOCOL 1 — https
|
|
202
|
+
const domain = (rawDomain ?? '').replace(/:(80|443)$/, '');
|
|
203
|
+
if (!domain || !appSid) {
|
|
204
|
+
return undefined;
|
|
205
|
+
}
|
|
206
|
+
const protocol = (Number.parseInt(rawProtocol ?? '', 10) || 0) ? 'https' : 'http';
|
|
207
|
+
try {
|
|
208
|
+
const url = new URL(`${protocol}://${domain}`);
|
|
209
|
+
// В DOMAIN должен быть только хост (и порт) — никаких путей и логинов
|
|
210
|
+
if (url.host !== domain.toLowerCase() || url.username || url.password) {
|
|
211
|
+
return undefined;
|
|
212
|
+
}
|
|
213
|
+
return { domain, origin: url.origin, appSid };
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
function uniqId() {
|
|
220
|
+
const bytes = new Uint8Array(16);
|
|
221
|
+
globalThis.crypto.getRandomValues(bytes);
|
|
222
|
+
return Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('');
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYngtcmVzdC9zcmMvc2VydmljZXMvZnJhbWUvdHJhbnNwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFLSDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxLQUFLO0lBQ3pDLFlBQ2tCLElBQTBCLEVBQzFDLE9BQWU7UUFFZixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFIRSxTQUFJLEdBQUosSUFBSSxDQUFzQjtRQUkxQyxJQUFJLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFBO0lBQ2hDLENBQUM7Q0FDRjtBQXFCRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFJekI7UUFDRSxJQUFJLENBQUMsS0FBSyxHQUFHLGVBQWUsRUFBRSxDQUFBO0lBQ2hDLENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUE7SUFDakMsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksQ0FBQyxPQUFlLEVBQUUsTUFBZTtRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ3JELENBQUM7SUFFRCx1Q0FBdUM7SUFDdkMsT0FBTyxDQUFDLE9BQWUsRUFBRSxNQUFlLEVBQUUsT0FBNEI7UUFDcEUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxJQUFJLEtBQWtCLENBQUE7WUFDdEIsSUFBSSxDQUFDO2dCQUNILEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7WUFDN0IsQ0FBQztZQUFDLE9BQU8sS0FBSyxF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QztBQUNILENBQUM7QUFFRCxTQUFTLE1BQU07SUFDYixNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNoQyxVQUFVLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN4QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQy9FLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqINCe0LHQvNC10L0g0YHQvtC+0LHRidC10L3QuNGP0LzQuCDQvNC10LbQtNGDIGlmcmFtZSDQv9GA0LjQu9C+0LbQtdC90LjRjyDQuCDQv9C+0YDRgtCw0LvQvtC8IEJpdHJpeDI0IOKAlCDRgtC+0YJcbiAqINGC0YDQsNC90YHQv9C+0YDRgiwg0L3QsCDQutC+0YLQvtGA0L7QvCDQv9C+0YHRgtGA0L7QtdC90Ysg0LrQvtC80LDQvdC00YsgQlgyNC5qczog0YHRgtGA0LDQvdC40YbQsCDQv9GA0LjQu9C+0LbQtdC90LjRjyDRiNC70ZHRglxuICog0LrQvtC80LDQvdC00YMg0YDQvtC00LjRgtC10LvRjNGB0LrQvtC80YMg0L7QutC90YMg0L/QvtGA0YLQsNC70LAg0YfQtdGA0LXQtyBwb3N0TWVzc2FnZSwg0L/QvtGA0YLQsNC7INC+0YLQstC10YfQsNC10YJcbiAqINGB0L7QvtCx0YnQtdC90LjQtdC8INGBINGC0LXQvCDQttC1IGNhbGxiYWNrSWQuXG4gKlxuICog0JLQndCY0JzQkNCd0JjQlTog0L/RgNC+0YLQvtC60L7QuyDQstC90YPRgtGA0LXQvdC90LjQuSDQuCDQvdC10LTQvtC60YPQvNC10L3RgtC40YDQvtCy0LDQvdC90YvQuSDigJQgQml0cml4MjQg0LzQvtC20LXRglxuICog0LjQt9C80LXQvdC40YLRjCDQtdCz0L4g0LHQtdC3INC/0YDQtdC00YPQv9GA0LXQttC00LXQvdC40Y8uINCi0YDQsNC90YHQv9C+0YDRgiDQv9C+0LLRgtC+0YDRj9C10YIgQlgyNC5qc1xuICogKGh0dHBzOi8vYXBpLmJpdHJpeDI0LmNvbS9hcGkvdjEvLCDRgdC60LDRh9Cw0L0gMjAyNi0xMC0yOSwgTGFzdC1Nb2RpZmllZFxuICogMjAyMi0wMy0xNywgc2hhMjU2IDk0NWFkNDkxZGY4ZmZiNzQ5MGI4OWY0OTE0YTQzOWI1YTNmNTc1Yzk1MGMzNDgwNTYyODE1NzE2YTNlMDdmMjMpXG4gKiDQuCDRgdCy0LXRgNC10L0g0YEg0L7RgtCy0LXRgtC90L7QuSDRgdGC0L7RgNC+0L3QvtC5INC/0L7RgNGC0LDQu9CwIOKAlCBgL2JpdHJpeC9qcy9yZXN0L2FwcGxheW91dC5qc2BcbiAqIChMYXN0LU1vZGlmaWVkIDIwMjQtMDUtMTUsIHNoYTI1NiAzZWZkNmFiNTdhNDc3ODQ5M2EyNmQxMGFlMDk4N2E4MmUxOWZjMDEyZWQ5OTM1ZjVjNmFmYTc4YzQwNTJmY2I1KS5cbiAqINCS0YHRkSDQt9C90LDQvdC40LUg0L4g0L/RgNC+0YLQvtC60L7Qu9C1IOKAlCDRgtC+0LvRjNC60L4g0LIg0Y3RgtC+0Lwg0LzQvtC00YPQu9C1IChgc2VydmljZXMvZnJhbWVgKS5cbiAqL1xuXG5leHBvcnQgdHlwZSBCWFJlc3RGcmFtZUVycm9yQ29kZSA9XG4gICdOT1RfSU5fRlJBTUUnIHwgJ1RJTUVPVVQnIHwgJ05PX0FVVEgnIHwgJ0JBRF9SRVNQT05TRScgfCAnQ0FOQ0VMTEVEJyB8ICdBQ0NFU1NfREVOSUVEJ1xuXG4vKipcbiAqINCe0YjQuNCx0LrQsCDQvtCx0YDQsNGJ0LXQvdC40Y8g0Log0L/QvtGA0YLQsNC70YMg0LjQtyBpZnJhbWUuIGBjb2RlYDpcbiAqIC0gYE5PVF9JTl9GUkFNRWAg4oCUINGB0YLRgNCw0L3QuNGG0LAg0L7RgtC60YDRi9GC0LAg0L3QtSDQsiBpZnJhbWUg0L/RgNC40LvQvtC20LXQvdC40Y8gQml0cml4MjQ7XG4gKiAtIGBUSU1FT1VUYCDigJQg0L/QvtGA0YLQsNC7INC90LUg0L7RgtCy0LXRgtC40Lsg0LfQsCDQvtGC0LLQtdC00ZHQvdC90L7QtSDQstGA0LXQvNGPO1xuICogLSBgTk9fQVVUSGAg4oCUINC/0L7RgNGC0LDQuyDQvtGC0LLQtdGC0LjQuyDQsdC10Lcg0YLQvtC60LXQvdCwO1xuICogLSBgQkFEX1JFU1BPTlNFYCDigJQg0L7RgtCy0LXRgiDQv9C+0YDRgtCw0LvQsCDQvdC1INGD0LTQsNC70L7RgdGMINGA0LDQt9C+0LHRgNCw0YLRjDtcbiAqIC0gYENBTkNFTExFRGAg4oCUINC+0LbQuNC00LDQvdC40LUg0L7RgtC80LXQvdC10L3QviDRh9C10YDQtdC3IGBzaWduYWxgINC40LvQuCDQvdC+0LLRi9C8INCy0YvQt9C+0LLQvtC8INGC0L7Qs9C+INC20LUg0LTQuNCw0LvQvtCz0LA7XG4gKiAtIGBBQ0NFU1NfREVOSUVEYCDigJQg0LrQvtC80LDQvdC00LAg0LTQvtGB0YLRg9C/0L3QsCDRgtC+0LvRjNC60L4g0LDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YDRgyDQv9C+0YDRgtCw0LvQsC5cbiAqL1xuZXhwb3J0IGNsYXNzIEJYUmVzdEZyYW1lRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBjb2RlOiBCWFJlc3RGcmFtZUVycm9yQ29kZSxcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICB0aGlzLm5hbWUgPSAnQlhSZXN0RnJhbWVFcnJvcidcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZyYW1lUmVxdWVzdE9wdGlvbnMge1xuICAvKiog0KHQutC+0LvRjNC60L4g0LbQtNCw0YLRjCDQvtGC0LLQtdGC0LAsINC80YE7IGBmYWxzZWAg4oCUINCx0LXQtyDQvtCz0YDQsNC90LjRh9C10L3QuNGPICjQtNC40LDQu9C+0LPQuCwg0YHQu9Cw0LnQtNC10YDRiykuICovXG4gIHRpbWVvdXQ6IG51bWJlciB8IGZhbHNlXG4gIC8qKlxuICAgKiDQp9GC0L4g0LTQtdC70LDRgtGMLCDQtdGB0LvQuCDQv9C+0YDRgtCw0Lsg0L3QtSDQvtGC0LLQtdGC0LjQuyDQt9CwIGB0aW1lb3V0YDogYCdyZWplY3QnYCDigJQg0L7RiNC40LHQutCwXG4gICAqIGBUSU1FT1VUYCAo0L/QviDRg9C80L7Qu9GH0LDQvdC40Y4pLCBgJ3Jlc29sdmUnYCDigJQg0LfQsNCy0LXRgNGI0LjRgtGM0YHRjyDRgSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIG9uVGltZW91dD86ICdyZWplY3QnIHwgJ3Jlc29sdmUnXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsXG59XG5cbmludGVyZmFjZSBQb3J0YWxGcmFtZSB7XG4gIC8qKiDQmtCw0Log0LXQs9C+INC+0YLQtNCw0ZHRgiDQv9C+0YDRgtCw0LssINCx0LXQtyBgOjgwYC9gOjQ0M2AuICovXG4gIGRvbWFpbjogc3RyaW5nXG4gIC8qKiBgaHR0cHM6Ly/QtNC+0LzQtdC9YCDigJQgdGFyZ2V0T3JpZ2luINC60L7QvNCw0L3QtCDQuCDQvtC20LjQtNCw0LXQvNGL0Lkgb3JpZ2luINC+0YLQstC10YLQvtCyLiAqL1xuICBvcmlnaW46IHN0cmluZ1xuICBhcHBTaWQ6IHN0cmluZ1xufVxuXG4vKipcbiAqINCf0LDRgNCw0LzQtdGC0YDRiyDQv9C+0YDRgtCw0LvQsCAoRE9NQUlOLCBQUk9UT0NPTCwgQVBQX1NJRCkg0YfQuNGC0LDRjtGC0YHRjyDQsiDQutC+0L3RgdGC0YDRg9C60YLQvtGA0LUg4oCUXG4gKiDRgtCw0Log0LbQtSwg0LrQsNC6INGN0YLQviDQtNC10LvQsNC10YIgQlgyNC5qcywg0LjQtyBgd2luZG93Lm5hbWVgOiDQv9C+0YDRgtCw0Lsg0LfQsNC00LDRkdGCINC40LzRj1xuICogaWZyYW1lINC/0YDQuNC70L7QttC10L3QuNGPINCyINCy0LjQtNC1IGBET01BSU58UFJPVE9DT0x8QVBQX1NJRGAuINCV0YHQu9C4INGC0LDQvCDQuNGFINC90LXRgiDigJRcbiAqINC40LcgcXVlcnkg0YHRgtGA0LDQvdC40YbRiyAoYD9ET01BSU494oCmJlBST1RPQ09MPeKApiZBUFBfU0lEPeKApmApLCDRgSDQutC+0YLQvtGA0YvQvCDQv9C+0YDRgtCw0LtcbiAqINC+0YLQutGA0YvQstCw0LXRgiDQvtCx0YDQsNCx0L7RgtGH0LjQuiDQv9GA0LjQu9C+0LbQtdC90LjRjy4g0JrQvtC90YHRgtGA0YPQutGC0L7RgCDQvdC1INCx0YDQvtGB0LDQtdGCINC40YHQutC70Y7Rh9C10L3QuNC5OlxuICog0LLQvdC1IGlmcmFtZSDQvtGI0LjQsdC60YMg0LLQtdGA0L3Rg9GCINGB0LDQvNC4INC60L7QvNCw0L3QtNGLLlxuICovXG5leHBvcnQgY2xhc3MgRnJhbWVUcmFuc3BvcnQge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZnJhbWU6IFBvcnRhbEZyYW1lIHwgdW5kZWZpbmVkXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5mcmFtZSA9IHJlYWRQb3J0YWxGcmFtZSgpXG4gIH1cblxuICAvKiog0JTQvtC80LXQvSDQv9C+0YDRgtCw0LvQsCDQuNC3INC/0LDRgNCw0LzQtdGC0YDQvtCyINGE0YDQtdC50LzQsCDigJQg0LrQsNC6IGBCWDI0LmdldERvbWFpbigpYC4gKi9cbiAgZ2V0IGRvbWFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZyYW1lPy5kb21haW4gPz8gJydcbiAgfVxuXG4gIC8qKlxuICAgKiDQmtC+0LzQsNC90LTQsCwg0L3QsCDQutC+0YLQvtGA0YPRjiDQv9C+0YDRgtCw0Lsg0L3QtSDQvtGC0LLQtdGH0LDQtdGCIChgcmVsb2FkV2luZG93YCwgYGltQ2FsbFRvYCwgLi4uKS5cbiAgICog0JLQvdC1IGlmcmFtZSDQsdGA0L7RgdCw0LXRgiBgQlhSZXN0RnJhbWVFcnJvcmAg0YEg0LrQvtC00L7QvCBgTk9UX0lOX0ZSQU1FYC5cbiAgICovXG4gIHBvc3QoY29tbWFuZDogc3RyaW5nLCBwYXJhbXM6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnNlbmQodGhpcy5yZXF1aXJlRnJhbWUoKSwgY29tbWFuZCwgcGFyYW1zLCAnJylcbiAgfVxuXG4gIC8qKiDQmtC+0LzQsNC90LTQsCDRgSDQvtC00L3QuNC8INC+0YLQstC10YLQvtC8INC/0L7RgNGC0LDQu9CwLiAqL1xuICByZXF1ZXN0KGNvbW1hbmQ6IHN0cmluZywgcGFyYW1zOiB1bmtub3duLCBvcHRpb25zOiBGcmFtZVJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBmcmFtZTogUG9ydGFsRnJhbWVcbiAgICAgIHRyeSB7XG4gICAgICAgIGZyYW1lID0gdGhpcy5yZXF1aXJlRnJhbWUoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdGltZW91dCwgb25UaW1lb3V0ID0gJ3JlamVjdCcsIHNpZ25hbCB9ID0gb3B0aW9uc1xuICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgICByZWplY3QoY2FuY2VsbGVkKGNvbW1hbmQpKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FsbGJhY2tJZCA9IHVuaXFJZCgpXG4gICAgICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkXG4gICAgICBjb25zdCBmaW5pc2ggPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcilcbiAgICAgICAgc3RvcExpc3RlbmluZygpXG4gICAgICAgIHNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KVxuICAgICAgfVxuICAgICAgY29uc3Qgb25BYm9ydCA9ICgpID0+IHtcbiAgICAgICAgZmluaXNoKClcbiAgICAgICAgcmVqZWN0KGNhbmNlbGxlZChjb21tYW5kKSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0b3BMaXN0ZW5pbmcgPSB0aGlzLmxpc3RlbihmcmFtZSwgY2FsbGJhY2tJZCwgcGF5bG9hZCA9PiB7XG4gICAgICAgIGZpbmlzaCgpXG4gICAgICAgIGNvbnN0IGFuc3dlciA9IHBhcnNlUGF5bG9hZChwYXlsb2FkKVxuICAgICAgICBpZiAoYW5zd2VyLm9rKSB7XG4gICAgICAgICAgcmVzb2x2ZShhbnN3ZXIudmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8g0JIg0YLQtdC60YHRgtC1INC+0YjQuNCx0LrQuCDigJQg0YLQvtC70YzQutC+INC60L7QvNCw0L3QtNCwLCDQsdC10Lcg0YLQtdC70LAg0L7RgtCy0LXRgtCwOiDQsiDQvdGR0Lwg0LHRi9Cy0LDRjtGCINGC0L7QutC10L3Ri1xuICAgICAgICAgIHJlamVjdChuZXcgQlhSZXN0RnJhbWVFcnJvcignQkFEX1JFU1BPTlNFJywgYEJpdHJpeDI0IGFuc3dlcmVkICR7Y29tbWFuZH0gd2l0aCBhIHBheWxvYWQgdGhhdCBpcyBub3QgSlNPTi5gKSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgaWYgKHRpbWVvdXQgIT09IGZhbHNlKSB7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgZmluaXNoKClcbiAgICAgICAgICBpZiAob25UaW1lb3V0ID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QobmV3IEJYUmVzdEZyYW1lRXJyb3IoJ1RJTUVPVVQnLCBbXG4gICAgICAgICAgICAgIGBCaXRyaXgyNCBkaWQgbm90IGFuc3dlciAke2NvbW1hbmR9IHdpdGhpbiAke3RpbWVvdXR9IG1zOmAsXG4gICAgICAgICAgICAgICd0aGUgcGFnZSBpcyBub3Qgb3BlbmVkIGluc2lkZSBhIEJpdHJpeDI0IHBvcnRhbCBpZnJhbWUsIG9yIHRoZSBwb3J0YWwgY291bGQgbm90IHByb2Nlc3MgdGhlIGNvbW1hbmQuJ1xuICAgICAgICAgICAgXS5qb2luKCcgJykpKVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGltZW91dClcbiAgICAgIH1cbiAgICAgIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSlcblxuICAgICAgdGhpcy5zZW5kKGZyYW1lLCBjb21tYW5kLCBwYXJhbXMsIGNhbGxiYWNrSWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiDQmtC+0LzQsNC90LTQsCwg0L3QsCDQutC+0YLQvtGA0YPRjiDQv9C+0YDRgtCw0Lsg0L7RgtCy0LXRh9Cw0LXRgiDQvNC90L7Qs9C+0LrRgNCw0YLQvdC+IChgcGxhY2VtZW50QmluZEV2ZW50YCk6XG4gICAqIGBoYW5kbGVyYCDQstGL0LfRi9Cy0LDQtdGC0YHRjyDQvdCwINC60LDQttC00YvQuSDQvtGC0LLQtdGCLiDQktC+0LfQstGA0LDRidCw0LXRgiDRhNGD0L3QutGG0LjRjiDQvtGC0L/QuNGB0LrQuCDigJRcbiAgICog0L7QvdCwINGC0L7Qu9GM0LrQviDQv9C10YDQtdGB0YLQsNGR0YIg0YHQu9GD0YjQsNGC0Yw6INC+0YLQvNC10L3QuNGC0Ywg0L/QvtC00L/QuNGB0LrRgyDQvdCwINGB0YLQvtGA0L7QvdC1INC/0L7RgNGC0LDQu9CwXG4gICAqINC/0YDQvtGC0L7QutC+0Lsg0L3QtSDQv9C+0LfQstC+0LvRj9C10YIuINCS0L3QtSBpZnJhbWUg0LHRgNC+0YHQsNC10YIgYEJYUmVzdEZyYW1lRXJyb3JgLlxuICAgKi9cbiAgc3Vic2NyaWJlKGNvbW1hbmQ6IHN0cmluZywgcGFyYW1zOiB1bmtub3duLCBoYW5kbGVyOiAoZGF0YTogdW5rbm93bikgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIGNvbnN0IGZyYW1lID0gdGhpcy5yZXF1aXJlRnJhbWUoKVxuICAgIGNvbnN0IGNhbGxiYWNrSWQgPSB1bmlxSWQoKVxuICAgIGNvbnN0IHN0b3BMaXN0ZW5pbmcgPSB0aGlzLmxpc3RlbihmcmFtZSwgY2FsbGJhY2tJZCwgcGF5bG9hZCA9PiB7XG4gICAgICBjb25zdCBhbnN3ZXIgPSBwYXJzZVBheWxvYWQocGF5bG9hZClcbiAgICAgIGlmIChhbnN3ZXIub2spIHtcbiAgICAgICAgaGFuZGxlcihhbnN3ZXIudmFsdWUpXG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLnNlbmQoZnJhbWUsIGNvbW1hbmQsIHBhcmFtcywgY2FsbGJhY2tJZClcbiAgICByZXR1cm4gc3RvcExpc3RlbmluZ1xuICB9XG5cbiAgcHJpdmF0ZSByZXF1aXJlRnJhbWUoKTogUG9ydGFsRnJhbWUge1xuICAgIGlmICghdGhpcy5mcmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEJYUmVzdEZyYW1lRXJyb3IoJ05PVF9JTl9GUkFNRScsXG4gICAgICAgICdCaXRyaXgyNCBmcmFtZSBwYXJhbWV0ZXJzIChET01BSU4sIEFQUF9TSUQpIHdlcmUgbm90IGZvdW5kIGluIHdpbmRvdy5uYW1lIG9yIGluIHRoZSBVUkwgcXVlcnk6ICdcbiAgICAgICAgKyAndGhlIHBhZ2UgaXMgbm90IG9wZW5lZCBhcyBhIEJpdHJpeDI0IGFwcGxpY2F0aW9uLicpXG4gICAgfVxuICAgIGlmICh3aW5kb3cucGFyZW50ID09PSB3aW5kb3cpIHtcbiAgICAgIHRocm93IG5ldyBCWFJlc3RGcmFtZUVycm9yKCdOT1RfSU5fRlJBTUUnLFxuICAgICAgICAnVGhlIHBhZ2UgaXMgbm90IG9wZW5lZCBpbnNpZGUgYW4gaWZyYW1lLCBzbyB0aGVyZSBpcyBubyBCaXRyaXgyNCBwb3J0YWwgdG8gc2VuZCBjb21tYW5kcyB0by4nKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mcmFtZVxuICB9XG5cbiAgLyoqXG4gICAqINCk0L7RgNC80LDRgiDigJQg0LrQsNC6INGDIEJYMjQuanMuINCe0LHRi9GH0L3QviDRgdGC0YDQvtC60LAgYNC60L7QvNCw0L3QtNCwOtC/0LDRgNCw0LzQtdGC0YDRizpjYWxsYmFja0lkOkFQUF9TSURgXG4gICAqICjQv9C+0YDRgtCw0Lsg0YDQsNC30LHQuNGA0LDQtdGCINC10ZEg0YEg0LrQvtC90YbQsCwg0L/QvtGN0YLQvtC80YMg0L/QsNGA0LDQvNC10YLRgNGLINC4IGNhbGxiYWNrSWQg0LzQvtCz0YPRgiDQsdGL0YLRjFxuICAgKiDQv9GD0YHRgtGL0LzQuCk7INC00LvRjyDQutC+0LzQsNC90LQg0YEgYDpgINCyINC40LzQtdC90Lgg4oCUINC+0LHRitC10LrRgi5cbiAgICovXG4gIHByaXZhdGUgc2VuZChmcmFtZTogUG9ydGFsRnJhbWUsIGNvbW1hbmQ6IHN0cmluZywgcGFyYW1zOiB1bmtub3duLCBjYWxsYmFja0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBtZXNzYWdlID0gY29tbWFuZC5pbmNsdWRlcygnOicpXG4gICAgICA/IHsgbWV0aG9kOiBjb21tYW5kLCBwYXJhbXM6IHBhcmFtcyA/IHBhcmFtcyA6ICcnLCBjYWxsYmFjazogY2FsbGJhY2tJZCwgYXBwU2lkOiBmcmFtZS5hcHBTaWQgfVxuICAgICAgOiBgJHtjb21tYW5kfToke3BhcmFtcyA/IEpTT04uc3RyaW5naWZ5KHBhcmFtcykgOiAnJ306JHtjYWxsYmFja0lkfToke2ZyYW1lLmFwcFNpZH1gXG4gICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZShtZXNzYWdlLCBmcmFtZS5vcmlnaW4pXG4gIH1cblxuICAvKiog0J7RgtCy0LXRgiDQv9C+0YDRgtCw0LvQsCDigJQg0YHRgtGA0L7QutCwIGBjYWxsYmFja0lkOkpTT05gICjQuNC70LggYGNhbGxiYWNrSWQ6YCwg0LXRgdC70Lgg0L7RgtCy0LXRgiDQv9GD0YHRgtC+0LkpLiAqL1xuICBwcml2YXRlIGxpc3RlbihmcmFtZTogUG9ydGFsRnJhbWUsIGNhbGxiYWNrSWQ6IHN0cmluZywgb25BbnN3ZXI6IChwYXlsb2FkOiBzdHJpbmcpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgICBjb25zdCBwb3J0YWxXaW5kb3cgPSB3aW5kb3cucGFyZW50XG4gICAgY29uc3Qgb25NZXNzYWdlID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgIC8vINCe0YLQstC10YIg0L/RgNC40L3QuNC80LDQtdC8INGC0L7Qu9GM0LrQviDQvtGCINGA0L7QtNC40YLQtdC70YzRgdC60L7Qs9C+INC+0LrQvdCwINC4INGC0L7Qu9GM0LrQviDRgSBvcmlnaW5cbiAgICAgIC8vINC/0L7RgNGC0LDQu9CwIOKAlCBCWDI0LmpzINC/0YDQvtCy0LXRgNGP0LXRgiDQu9C40YjRjCBvcmlnaW5cbiAgICAgIGlmIChldmVudC5zb3VyY2UgIT09IHBvcnRhbFdpbmRvdyB8fCBldmVudC5vcmlnaW4gIT09IGZyYW1lLm9yaWdpbiB8fCB0eXBlb2YgZXZlbnQuZGF0YSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCBzZXBhcmF0b3IgPSBldmVudC5kYXRhLmluZGV4T2YoJzonKVxuICAgICAgY29uc3QgaWQgPSBzZXBhcmF0b3IgPCAwID8gZXZlbnQuZGF0YSA6IGV2ZW50LmRhdGEuc2xpY2UoMCwgc2VwYXJhdG9yKVxuICAgICAgaWYgKGlkID09PSBjYWxsYmFja0lkKSB7XG4gICAgICAgIG9uQW5zd2VyKHNlcGFyYXRvciA8IDAgPyAnJyA6IGV2ZW50LmRhdGEuc2xpY2Uoc2VwYXJhdG9yICsgMSkpXG4gICAgICB9XG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgb25NZXNzYWdlKVxuICAgIHJldHVybiAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIG9uTWVzc2FnZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVBheWxvYWQocGF5bG9hZDogc3RyaW5nKTogeyBvazogdHJ1ZSwgdmFsdWU6IHVua25vd24gfSB8IHsgb2s6IGZhbHNlIH0ge1xuICBpZiAocGF5bG9hZCA9PT0gJycpIHtcbiAgICByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IEpTT04ucGFyc2UocGF5bG9hZCkgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBvazogZmFsc2UgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNhbmNlbGxlZChjb21tYW5kOiBzdHJpbmcpOiBCWFJlc3RGcmFtZUVycm9yIHtcbiAgcmV0dXJuIG5ldyBCWFJlc3RGcmFtZUVycm9yKCdDQU5DRUxMRUQnLCBgV2FpdGluZyBmb3IgdGhlIEJpdHJpeDI0IGFuc3dlciB0byAke2NvbW1hbmR9IHdhcyBjYW5jZWxsZWQuYClcbn1cblxuZnVuY3Rpb24gcmVhZFBvcnRhbEZyYW1lKCk6IFBvcnRhbEZyYW1lIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLy8gQlgyNC5qczogd2luZG93Lm5hbWUgPSAnRE9NQUlOfFBST1RPQ09MfEFQUF9TSUQnXG4gIGNvbnN0IFtuYW1lRG9tYWluLCBuYW1lUHJvdG9jb2wsIG5hbWVBcHBTaWRdID0gKHR5cGVvZiB3aW5kb3cubmFtZSA9PT0gJ3N0cmluZycgPyB3aW5kb3cubmFtZSA6ICcnKS5zcGxpdCgnfCcpXG4gIGNvbnN0IGZyb21OYW1lID0gdG9Qb3J0YWxGcmFtZShuYW1lRG9tYWluLCBuYW1lUHJvdG9jb2wsIG5hbWVBcHBTaWQpXG4gIGlmIChmcm9tTmFtZSkge1xuICAgIHJldHVybiBmcm9tTmFtZVxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBxdWVyeSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uPy5zZWFyY2ggPz8gJycpXG4gICAgcmV0dXJuIHRvUG9ydGFsRnJhbWUocXVlcnkuZ2V0KCdET01BSU4nKSwgcXVlcnkuZ2V0KCdQUk9UT0NPTCcpLCBxdWVyeS5nZXQoJ0FQUF9TSUQnKSlcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG59XG5cbmZ1bmN0aW9uIHRvUG9ydGFsRnJhbWUoXG4gIHJhd0RvbWFpbjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgcmF3UHJvdG9jb2w6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGFwcFNpZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogUG9ydGFsRnJhbWUgfCB1bmRlZmluZWQge1xuICAvLyDQmtCw0LogQlgyNC5qczog0L/QvtGA0YIg0L/QviDRg9C80L7Qu9GH0LDQvdC40Y4g0L7RgtGA0LXQt9Cw0LXRgtGB0Y8sIFBST1RPQ09MIDEg4oCUIGh0dHBzXG4gIGNvbnN0IGRvbWFpbiA9IChyYXdEb21haW4gPz8gJycpLnJlcGxhY2UoLzooODB8NDQzKSQvLCAnJylcbiAgaWYgKCFkb21haW4gfHwgIWFwcFNpZCkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuICBjb25zdCBwcm90b2NvbCA9IChOdW1iZXIucGFyc2VJbnQocmF3UHJvdG9jb2wgPz8gJycsIDEwKSB8fCAwKSA/ICdodHRwcycgOiAnaHR0cCdcblxuICB0cnkge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYCR7cHJvdG9jb2x9Oi8vJHtkb21haW59YClcbiAgICAvLyDQkiBET01BSU4g0LTQvtC70LbQtdC9INCx0YvRgtGMINGC0L7Qu9GM0LrQviDRhdC+0YHRgiAo0Lgg0L/QvtGA0YIpIOKAlCDQvdC40LrQsNC60LjRhSDQv9GD0YLQtdC5INC4INC70L7Qs9C40L3QvtCyXG4gICAgaWYgKHVybC5ob3N0ICE9PSBkb21haW4udG9Mb3dlckNhc2UoKSB8fCB1cmwudXNlcm5hbWUgfHwgdXJsLnBhc3N3b3JkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuICAgIHJldHVybiB7IGRvbWFpbiwgb3JpZ2luOiB1cmwub3JpZ2luLCBhcHBTaWQgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuZnVuY3Rpb24gdW5pcUlkKCk6IHN0cmluZyB7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTYpXG4gIGdsb2JhbFRoaXMuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhieXRlcylcbiAgcmV0dXJuIEFycmF5LmZyb20oYnl0ZXMsIGJ5dGUgPT4gYnl0ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJylcbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ieC1yZXN0L3NyYy9zZXJ2aWNlcy9mcmFtZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBCWFJlc3RGcmFtZU9wdGlvbnMge1xuICAvKipcbiAgICog0KHQutC+0LvRjNC60L4g0LbQtNCw0YLRjCDQvtGC0LLQtdGC0LAg0L/QvtGA0YLQsNC70LAg0L3QsCDQutC+0LzQsNC90LTRgywg0LzRgS4g0J/QviDRg9C80L7Qu9GH0LDQvdC40Y4gMTAwMDAuINCS0L3QtVxuICAgKiBpZnJhbWUg0L/QvtGA0YLQsNC70LAg0L7RgtCy0LXRgtCwINC90LUg0LHRg9C00LXRgiDQvdC40LrQvtCz0LTQsC4g0JTQuNCw0LvQvtCz0Lgg0Lgg0YHQu9Cw0LnQtNC10YDRiyDQttC00YPRglxuICAgKiDQv9C+0LvRjNC30L7QstCw0YLQtdC70Y8g0LHQtdC3INC+0LPRgNCw0L3QuNGH0LXQvdC40Y8uXG4gICAqL1xuICB0aW1lb3V0PzogbnVtYmVyXG59XG5cbi8qKlxuICog0JDQstGC0L7RgNC40LfQsNGG0LjRjyDQv9GA0LjQu9C+0LbQtdC90LjRjyDigJQg0LIg0YLQvtC8INC20LUg0LLQuNC00LUsINGH0YLQviDRgyBgQlgyNC5nZXRBdXRoKClgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIGlCWFJlc3RGcmFtZUF1dGgge1xuICBhY2Nlc3NfdG9rZW46IHN0cmluZ1xuICByZWZyZXNoX3Rva2VuOiBzdHJpbmdcbiAgLyoqXG4gICAqINCc0L7QvNC10L3RgiDQuNGB0YLQtdGH0LXQvdC40Y8gYGFjY2Vzc190b2tlbmAg4oCUINC80LjQu9C70LjRgdC10LrRg9C90LTRiyDRgSAxINGP0L3QstCw0YDRjyAxOTcwINCz0L7QtNCwLFxuICAgKiDQutCw0Log0YMgYEJYMjQuZ2V0QXV0aCgpYC4g0J3QtSDRgdGA0L7QuiDQttC40LfQvdC4INCyINGB0LXQutGD0L3QtNCw0YUsINC60LDQuiDQsiDQvtGC0LLQtdGC0LVcbiAgICogT0F1dGgt0YHQtdGA0LLQtdGA0LAhINCh0YDQsNCy0L3QuNCy0LDQudGC0LUg0YEgYERhdGUubm93KClgLlxuICAgKi9cbiAgZXhwaXJlc19pbjogbnVtYmVyXG4gIC8qKiDQkNC00YDQtdGBINC/0L7RgNGC0LDQu9CwINCx0LXQtyDQv9GA0L7RgtC+0LrQvtC70LAsINC90LDQv9GA0LjQvNC10YAgYG15Y29tcGFueS5iaXRyaXgyNC5ydWAuICovXG4gIGRvbWFpbjogc3RyaW5nXG4gIC8qKiDQn9C+0YHRgtC+0Y/QvdC90YvQuSDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDQv9C+0YDRgtCw0LvQsC4gKi9cbiAgbWVtYmVyX2lkOiBzdHJpbmdcbn1cblxuLyoqXG4gKiDQlNCw0L3QvdGL0LUsINC60L7RgtC+0YDRi9C1INC/0L7RgNGC0LDQuyDQv9C10YDQtdC00LDRkdGCINC/0YDQuNC70L7QttC10L3QuNGOINC/0YDQuCDQt9Cw0L/Rg9GB0LrQtSAoYGdldEluaXREYXRhYCksIOKAlFxuICog0LHQtdC3INGC0L7QutC10L3QvtCyOiDQuNGFINC+0YLQtNCw0ZHRgiBgZ2V0QXV0aCgpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBpQlhSZXN0RnJhbWVJbml0IHtcbiAgLyoqINCQ0LTRgNC10YEg0L/QvtGA0YLQsNC70LAg0LHQtdC3INC/0YDQvtGC0L7QutC+0LvQsCDigJQg0LrQsNC6IGBCWDI0LmdldERvbWFpbigpYC4gKi9cbiAgZG9tYWluOiBzdHJpbmdcbiAgLyoqINCv0LfRi9C6INC40L3RgtC10YDRhNC10LnRgdCwIOKAlCDQutCw0LogYEJYMjQuZ2V0TGFuZygpYC4gKi9cbiAgbGFuZzogc3RyaW5nXG4gIC8qKiDQn9GD0YLRjCDQuiBSRVNUINC90LAg0L/QvtGA0YLQsNC70LUsINC90LDQv9GA0LjQvNC10YAgYC9yZXN0YC4gKi9cbiAgcGF0aDogc3RyaW5nXG4gIC8qKiDQn9C+0YDRgtCw0Lsg0L7RgtC60YDRi9GCINC/0L4gaHR0cHMuICovXG4gIGh0dHBzOiBib29sZWFuXG4gIG1lbWJlcklkOiBzdHJpbmdcbiAgLyoqINCf0L7Qu9GM0LfQvtCy0LDRgtC10LvRjCDigJQg0LDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YAg0L/QvtGA0YLQsNC70LAsINC60LDQuiBgQlgyNC5pc0FkbWluKClgLiAqL1xuICBpc0FkbWluOiBib29sZWFuXG4gIC8qKlxuICAgKiDQodGC0YDQsNC90LjRhtCwINC+0YLQutGA0YvRgtCwINC60LDQuiDRg9GB0YLQsNC90L7QstGJ0LjQuiDQv9GA0LjQu9C+0LbQtdC90LjRjzog0YPRgdGC0LDQvdC+0LLQutGDINC30LDQstC10YDRiNCw0LXRglxuICAgKiBgaW5zdGFsbEZpbmlzaCgpYC5cbiAgICovXG4gIGluc3RhbGw6IGJvb2xlYW5cbiAgLyoqXG4gICAqINCf0LXRgNCy0YvQuSDQt9Cw0L/Rg9GB0Log0L/RgNC40LvQvtC20LXQvdC40Y8g0Y3RgtC40Lwg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9C10LwgKNGN0YLQvtC5INCy0LXRgNGB0LjQuCkuINCf0L7RgNGC0LDQu1xuICAgKiDRgdC+0L7QsdGJ0LDQtdGCINC10LPQviDRgtC+0LvRjNC60L4g0LIg0L/QtdGA0LLQvtC8INC+0YLQstC10YLQtSDQvdCwIGBnZXRJbml0RGF0YWAg0LfQsCDQt9Cw0LPRgNGD0LfQutGDINGB0YLRgNCw0L3QuNGG0YsuXG4gICAqL1xuICBmaXJzdFJ1bjogYm9vbGVhblxuICAvKiog0JrQvtC0INCy0YHRgtGA0LDQuNCy0LDQvdC40Y8sINC90LDQv9GA0LjQvNC10YAgYERFRkFVTFRgINC40LvQuCBgQ1JNX0RFQUxfREVUQUlMX1RBQmAuICovXG4gIHBsYWNlbWVudDogc3RyaW5nXG4gIHBsYWNlbWVudE9wdGlvbnM6IHVua25vd25cbiAgdXNlck9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGFwcE9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG59XG5cbi8qKiDQoNCw0LfQvNC10YAg0YTRgNC10LnQvNCwLCDQutC+0YLQvtGA0YvQuSDQstGL0YHRgtCw0LLQuNC7INC/0L7RgNGC0LDQuy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgaUJYUmVzdEZyYW1lU2l6ZSB7XG4gIHdpZHRoOiBudW1iZXJcbiAgaGVpZ2h0OiBudW1iZXJcbn1cblxuLyoqINCh0L7RgtGA0YPQtNC90LjQuiDQuNC3INC00LjQsNC70L7Qs9CwIGBzZWxlY3RVc2VyKClgL2BzZWxlY3RVc2VycygpYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgaUJYUmVzdEZyYW1lVXNlciB7XG4gIC8qKiDQn9GA0LjRhdC+0LTQuNGCINGB0YLRgNC+0LrQvtC5LiAqL1xuICBpZDogc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICAvKiog0KDQsNCx0L7RgtCw0LXRgiDQsiDQv9C+0LTRgNCw0LfQtNC10LvQtdC90LjQuCwg0L/QvtC00YfQuNC90ZHQvdC90L7QvCDRgtC10LrRg9GJ0LXQvNGDINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRji4gKi9cbiAgc3ViOiBib29sZWFuXG4gIC8qKiDQoNGD0LrQvtCy0L7QtNC40YIg0L/QvtC00YDQsNC30LTQtdC70LXQvdC40LXQvCDRgtC10LrRg9GJ0LXQs9C+INC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjyDQuNC70Lgg0LLRi9GI0LXRgdGC0L7Rj9GJ0LjQvC4gKi9cbiAgc3VwOiBib29sZWFuXG4gIHBvc2l0aW9uOiBzdHJpbmcgfCBudWxsXG4gIC8qKiDQn9GD0YLRjCDQuiDQsNCy0LDRgtCw0YDRgyDQvtGC0L3QvtGB0LjRgtC10LvRjNC90L4g0LDQtNGA0LXRgdCwINC/0L7RgNGC0LDQu9CwLiAqL1xuICBwaG90bzogc3RyaW5nXG4gIHVybDogc3RyaW5nXG59XG5cbi8qKiDQn9GA0LDQstC+INC00L7RgdGC0YPQv9CwINC40Lcg0LTQuNCw0LvQvtCz0LAgYHNlbGVjdEFjY2VzcygpYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgaUJYUmVzdEZyYW1lQWNjZXNzIHtcbiAgLyoqINCY0YHRgtC+0YfQvdC40Log0LrQvtC00LA6IGBpbnRyYW5ldGAsIGBzb2NuZXRncm91cGAsIGBncm91cGAsIC4uLiAqL1xuICBwcm92aWRlcjogc3RyaW5nXG4gIC8qKiDQmtC+0LQg0LTQvtGB0YLRg9C/0LAsINC90LDQv9GA0LjQvNC10YAgYElVMWAsIGBENWAsIGBTRzRfS2AuICovXG4gIGlkOiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIEJYUmVzdEZyYW1lQ3JtVHlwZSA9ICdsZWFkJyB8ICdjb250YWN0JyB8ICdjb21wYW55JyB8ICdkZWFsJyB8ICdxdW90ZSdcblxuZXhwb3J0IGludGVyZmFjZSBpQlhSZXN0RnJhbWVDcm1TZWxlY3RPcHRpb25zIHtcbiAgLyoqINCa0LDQutC40LUg0YLQuNC/0Ysg0L7QsdGK0LXQutGC0L7QsiDQv9C+0LrQsNC30YvQstCw0YLRjC4gKi9cbiAgZW50aXR5VHlwZT86IEJYUmVzdEZyYW1lQ3JtVHlwZVtdXG4gIC8qKiDQnNC+0LbQvdC+INCy0YvQsdGA0LDRgtGMINC90LXRgdC60L7Qu9GM0LrQviDQvtCx0YrQtdC60YLQvtCyLiAqL1xuICBtdWx0aXBsZT86IGJvb2xlYW5cbiAgLyoqINCe0LHRitC10LrRgtGLLCDQvtGC0LzQtdGH0LXQvdC90YvQtSDQv9GA0Lgg0L7RgtC60YDRi9GC0LjQuDog0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YDRiyDQv9C+INGC0LjQv9Cw0LwuICovXG4gIHZhbHVlPzogUGFydGlhbDxSZWNvcmQ8QlhSZXN0RnJhbWVDcm1UeXBlLCBudW1iZXJbXT4+XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsXG59XG5cbi8qKiDQntCx0YrQtdC60YIgQ1JNINC40Lcg0LTQuNCw0LvQvtCz0LAgYHNlbGVjdENSTSgpYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgaUJYUmVzdEZyYW1lQ3JtRW50aXR5IHtcbiAgLyoqINChINC/0YDQtdGE0LjQutGB0L7QvCDRgtC40L/QsDogYExfYCwgYENfYCwgYENPX2AsIGBEX2AsIGBRX2AuICovXG4gIGlkOiBzdHJpbmdcbiAgdHlwZTogQlhSZXN0RnJhbWVDcm1UeXBlXG4gIHBsYWNlOiBzdHJpbmdcbiAgdGl0bGU6IHN0cmluZ1xuICBkZXNjOiBzdHJpbmdcbiAgdXJsPzogc3RyaW5nXG4gIGltYWdlPzogc3RyaW5nXG59XG5cbi8qKiDQoNC10LfRg9C70YzRgtCw0YIgYHNlbGVjdENSTSgpYDog0L7QsdGK0LXQutGC0Ysg0L/QviDRgtC40L/QsNC8LCDQstC90YPRgtGA0Lgg4oCUINC/0L7QtCDQutC70Y7Rh9Cw0LzQuCBgMGAsIGAxYCwgLi4uICovXG5leHBvcnQgdHlwZSBpQlhSZXN0RnJhbWVDcm1TZWxlY3Rpb24gPSBQYXJ0aWFsPFJlY29yZDxCWFJlc3RGcmFtZUNybVR5cGUsIFJlY29yZDxzdHJpbmcsIGlCWFJlc3RGcmFtZUNybUVudGl0eT4+PlxuXG4vKiog0KDQtdC30YPQu9GM0YLQsNGCIGBvcGVuUGF0aCgpYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgaUJYUmVzdEZyYW1lT3BlblBhdGhSZXN1bHQge1xuICAvKiogYGNsb3NlYCDigJQg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GMINC30LDQutGA0YvQuyDRgdC70LDQudC00LXRgDsgYGVycm9yYCDigJQg0L/Rg9GC0Ywg0L3QtSDQvtGC0LrRgNGL0LvRgdGPLiAqL1xuICByZXN1bHQ6ICdjbG9zZScgfCAnZXJyb3InXG4gIC8qKiBgUEFUSF9OT1RfQVZBSUxBQkxFYCDQuNC70LggYE1FVEhPRF9OT1RfU1VQUE9SVEVEX09OX0RFVklDRWAuICovXG4gIGVycm9yQ29kZT86IHN0cmluZ1xufVxuXG4vKiog0JrQvtC80LDQvdC00Ysg0Lgg0YHQvtCx0YvRgtC40Y8g0YLQtdC60YPRidC10LPQviDQstGB0YLRgNCw0LjQstCw0L3QuNGPLiAqL1xuZXhwb3J0IGludGVyZmFjZSBpQlhSZXN0RnJhbWVQbGFjZW1lbnRJbnRlcmZhY2Uge1xuICBjb21tYW5kOiBzdHJpbmdbXVxuICBldmVudDogc3RyaW5nW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBpQlhSZXN0RnJhbWVQbGFjZW1lbnRJbmZvIHtcbiAgcGxhY2VtZW50OiBzdHJpbmdcbiAgb3B0aW9uczogdW5rbm93blxufVxuIl19
|
|
@@ -6,6 +6,7 @@ import { instanceOfiBXRestAnswerSuccess } from '../../functions/mapResult';
|
|
|
6
6
|
import { switchMap } from 'rxjs/operators';
|
|
7
7
|
import { prepareBaseAddress } from '../base';
|
|
8
8
|
import { serializeBitrixParams as stringifyBitrixParams } from '../../functions/serializeBitrixParams';
|
|
9
|
+
import { withAuthRefresh } from './authRefresh';
|
|
9
10
|
export class HttpBXServices extends HttpServices {
|
|
10
11
|
/**
|
|
11
12
|
* Не считайте этот метод образцом/финальным API.
|
|
@@ -53,27 +54,38 @@ export class HttpBXServices extends HttpServices {
|
|
|
53
54
|
*
|
|
54
55
|
* @param name
|
|
55
56
|
* @param params
|
|
57
|
+
* @param restApi
|
|
58
|
+
* @param headers заголовки только для этого запроса, поверх `BXRestSettings.headers`
|
|
56
59
|
*/
|
|
57
|
-
post(name, params = {}, restApi = false) {
|
|
60
|
+
post(name, params = {}, restApi = false, headers) {
|
|
58
61
|
const method = this.getNameMethod(name);
|
|
59
|
-
return this.httpPost(restApi ? `api/${method}` : method, params);
|
|
62
|
+
return this.httpPost(restApi ? `api/${method}` : method, params, undefined, headers);
|
|
60
63
|
}
|
|
61
64
|
/**
|
|
62
65
|
* Второстепенный метод для запросов. По возможности лучше не использовать
|
|
63
66
|
*
|
|
64
67
|
* @param name
|
|
65
68
|
* @param params
|
|
69
|
+
* @param headers заголовки только для этого запроса, поверх `BXRestSettings.headers`
|
|
66
70
|
*/
|
|
67
|
-
get(name, params = {}) {
|
|
68
|
-
return this.httpGet(this.getNameMethod(name), params);
|
|
71
|
+
get(name, params = {}, headers) {
|
|
72
|
+
return this.httpGet(this.getNameMethod(name), params, undefined, headers);
|
|
69
73
|
}
|
|
70
|
-
|
|
74
|
+
// settings — только для совместимости сигнатуры с HttpServices: здесь тело
|
|
75
|
+
// уходит JSON-ом/urlencoded, и пересчёт дат из iHttpParamSettings не нужен.
|
|
76
|
+
httpPost(url, params = {}, settings, headers) {
|
|
71
77
|
// defer() откладывает всё содержимое (в том числе чтение BXRestSettings
|
|
72
78
|
// через this.session.*) до реальной подписки — иначе даже с "живым"
|
|
73
79
|
// геттером в SessionKeyServices настройки читались бы в момент вызова
|
|
74
80
|
// .res(), а не в момент subscribe()/firstValueFrom(), что и обещано
|
|
75
81
|
// в README как поведение "ленивого" REST-вызова.
|
|
76
|
-
|
|
82
|
+
//
|
|
83
|
+
// withAuthRefresh() повторяет запрос после BXRestSettings.auth.refresh —
|
|
84
|
+
// повторной подпиской на этот же defer(), поэтому повтор заново читает
|
|
85
|
+
// токен, адрес и заголовки. Через httpPost/httpGet идут все запросы
|
|
86
|
+
// библиотеки (post/get, batch, все виды Navvy-запросов), так что повтор
|
|
87
|
+
// встроен только здесь.
|
|
88
|
+
return withAuthRefresh(defer(() => {
|
|
77
89
|
const paramsClone = clone(params);
|
|
78
90
|
const key = this.session.getKeyAuth();
|
|
79
91
|
const auth = this.session.getAuthParams();
|
|
@@ -95,24 +107,23 @@ export class HttpBXServices extends HttpServices {
|
|
|
95
107
|
// Преобразуем параметры в формат x-www-form-urlencoded
|
|
96
108
|
const bodyString = this.serializeBitrixParams(paramsClone);
|
|
97
109
|
return from(this.axiosInstance.post(fullUrl, bodyString, {
|
|
98
|
-
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
110
|
+
headers: this.buildHeaders(headers, { 'Content-Type': 'application/x-www-form-urlencoded' }),
|
|
99
111
|
}).then((response) => response.data));
|
|
100
112
|
}
|
|
101
113
|
return from(this.axiosInstance.post(fullUrl, paramsClone, {
|
|
102
114
|
withCredentials: this.session.getWithCredentials(),
|
|
103
|
-
headers: {
|
|
104
|
-
'Content-Type': 'application/json',
|
|
105
|
-
}
|
|
115
|
+
headers: this.buildHeaders(headers, { 'Content-Type': 'application/json' }),
|
|
106
116
|
}).then((response) => response.data));
|
|
107
117
|
}));
|
|
108
|
-
});
|
|
118
|
+
}));
|
|
109
119
|
}
|
|
110
|
-
httpGet(url, params = {}) {
|
|
120
|
+
httpGet(url, params = {}, settings, headers) {
|
|
111
121
|
// Та же причина, что и у httpPost выше: откладываем чтение BXRestSettings
|
|
112
122
|
// до подписки, чтобы `get()` вёл себя так же "лениво", как и `post()`
|
|
113
123
|
// (симметрия, которой не было до этого — GET резолвил настройки в момент
|
|
114
|
-
// вызова, а не в момент subscribe()).
|
|
115
|
-
|
|
124
|
+
// вызова, а не в момент subscribe()). Повтор после продления
|
|
125
|
+
// авторизации — как в httpPost.
|
|
126
|
+
return withAuthRefresh(defer(() => {
|
|
116
127
|
const paramsClone = clone(params);
|
|
117
128
|
const auth = this.session.getAuthParams();
|
|
118
129
|
const checkIsOn = this.session.getCheckAuthParamsIsOn();
|
|
@@ -129,9 +140,20 @@ export class HttpBXServices extends HttpServices {
|
|
|
129
140
|
const fullUrl = prepareBaseAddress(baseUrl) + url;
|
|
130
141
|
const queryString = new URLSearchParams(paramsClone).toString();
|
|
131
142
|
const finalUrl = `${fullUrl}?${queryString}`;
|
|
132
|
-
return from(this.axiosInstance.get(finalUrl
|
|
143
|
+
return from(this.axiosInstance.get(finalUrl, {
|
|
144
|
+
headers: this.buildHeaders(headers),
|
|
145
|
+
}).then((response) => response.data));
|
|
133
146
|
}));
|
|
134
|
-
});
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Заголовки запроса: `BXRestSettings.headers`, поверх них — заголовки
|
|
151
|
+
* конкретного запроса, поверх всего — `required`. В `required` идёт
|
|
152
|
+
* `Content-Type`: от него зависит, как сервер разберёт тело, поэтому
|
|
153
|
+
* пользовательские заголовки его не перебивают.
|
|
154
|
+
*/
|
|
155
|
+
buildHeaders(headers, required = {}) {
|
|
156
|
+
return { ...this.session.getHeaders(), ...headers, ...required };
|
|
135
157
|
}
|
|
136
158
|
serializeBitrixParams(params) {
|
|
137
159
|
return stringifyBitrixParams(params);
|
|
@@ -140,4 +162,4 @@ export class HttpBXServices extends HttpServices {
|
|
|
140
162
|
return arr.join('.');
|
|
141
163
|
}
|
|
142
164
|
}
|
|
143
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSHR0cEJYLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYngtcmVzdC9zcmMvc2VydmljZXMvaHR0cC9IdHRwQlgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNwRSxPQUFPLEtBQUssTUFBTSxZQUFZLENBQUE7QUFDOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUtyQyxPQUFPLE9BQU8sTUFBTSxpQkFBaUIsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUMxRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDMUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQzVDLE9BQU8sRUFBRSxxQkFBcUIsSUFBSSxxQkFBcUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBRXRHLE1BQU0sT0FBTyxjQUFlLFNBQVEsWUFBWTtJQUU5Qzs7OztPQUlHO0lBQ0gsTUFBTSxDQUFPLEtBQXlEO1FBRXBFLElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQVMsSUFBSSxDQUFDLFlBQVksQ0FBSSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQSxDQUFDLG1CQUFtQjtRQUNuQyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUEsQ0FBQywyQ0FBMkM7UUFDN0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQy9ELFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENB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QTtJQUNKLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxNQUFlO1FBQ25DLE9BQU8scUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDdEMsQ0FBQztJQUVELGFBQWEsQ0FBQyxHQUFhO1FBQ3pCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN0QixDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yLCBmb3JrSm9pbiwgZnJvbSwgZGVmZXIgfSBmcm9tICdyeGpzJ1xyXG5pbXBvcnQgY2xvbmUgZnJvbSAnanVzdC1jbG9uZSdcclxuaW1wb3J0IHsgSHR0cFNlcnZpY2VzIH0gZnJvbSAnLi9odHRwJ1xyXG5pbXBvcnQge1xyXG4gIGlCYXRjaFJlcXVlc3RBbnN3ZXIsIGlCYXRjaFJlcXVlc3RQYXJhbSwgaUJhdGNoUmVxdWVzdFBhcmFtQXJyLCBpQmF0Y2hSZXF1ZXN0UGFyYW1IdHRwLCBrZXlCYXRjaCxcclxufSBmcm9tICcuLi8uLi90eXBpZmljYXRpb24vcmVzdC9iYXRjaC9iYXRjaFJlcXVlc3RQYXJhbSdcclxuaW1wb3J0IHsgaUJYUmVzdEFuc3dlciB9IGZyb20gJy4uLy4uL3R5cGlmaWNhdGlvbi9yZXN0L2Jhc2UvYW5zd2VyJ1xyXG5pbXBvcnQgZmxhdHRlbiBmcm9tICdqdXN0LWZsYXR0ZW4taXQnXHJcbmltcG9ydCB7IGluc3RhbmNlT2ZpQlhSZXN0QW5zd2VyU3VjY2VzcyB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucy9tYXBSZXN1bHQnXHJcbmltcG9ydCB7IHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xyXG5pbXBvcnQgeyBwcmVwYXJlQmFzZUFkZHJlc3MgfSBmcm9tICcuLi9iYXNlJ1xyXG5pbXBvcnQgeyBzZXJpYWxpemVCaXRyaXhQYXJhbXMgYXMgc3RyaW5naWZ5Qml0cml4UGFyYW1zIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zL3NlcmlhbGl6ZUJpdHJpeFBhcmFtcydcclxuXHJcbmV4cG9ydCBjbGFzcyBIdHRwQlhTZXJ2aWNlcyBleHRlbmRzIEh0dHBTZXJ2aWNlcyB7XHJcblxyXG4gIC8qKlxyXG4gICAqINCd0LUg0YHRh9C40YLQsNC50YLQtSDRjdGC0L7RgiDQvNC10YLQvtC0INC+0LHRgNCw0LfRhtC+0Lwv0YTQuNC90LDQu9GM0L3Ri9C8IEFQSS5cclxuICAgKiBUT0RPOiDQo9C00LDQu9C40YLRjCDQtNCw0L3QvdGL0Lkg0LzQtdGC0L7QtCDQv9C+0YHQu9C1INGA0LXQsNC70LjQt9Cw0YbQuNC4INC10LPQviDQsiDRgNCw0LfQtNC10LvQtSBOYXZ2eVxyXG4gICAqIEBwYXJhbSBwYXJhbVxyXG4gICAqL1xyXG4gIGJyYW5jaDxULCBBPihwYXJhbTogaUJhdGNoUmVxdWVzdFBhcmFtQXJyPFQ+IHwgaUJhdGNoUmVxdWVzdFBhcmFtPFQ+W10pXHJcbiAgICA6IE9ic2VydmFibGU8aUJhdGNoUmVxdWVzdEFuc3dlcjxBPltdIHwgdW5kZWZpbmVkPiB7XHJcbiAgICBsZXQgcHJlcGFyZVBhcmFtID0gT2JqZWN0LmVudHJpZXM8c3RyaW5nPih0aGlzLnByZXBhcmVCYXRjaDxUPihwYXJhbSkpXHJcbiAgICBjb25zdCBzaXplID0gNTAgLy8g0LHQvtC70YzRiNC1INC90LUg0L7RgtC00LDRgdGCXHJcbiAgICBsZXQgc3ViYXJyYXkgPSBbXSAvL9C80LDRgdGB0LjQsiDQsiDQutC+0YLQvtGA0YvQuSDQsdGD0LTQtdGCINCy0YvQstC10LTQtdC9INGA0LXQt9GD0LvRjNGC0LDRgi5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5jZWlsKHByZXBhcmVQYXJhbS5sZW5ndGggLyBzaXplKTsgaSsrKSB7XHJcbiAgICAgIHN1YmFycmF5W2ldID0gcHJlcGFyZVBhcmFtLnNsaWNlKChpICogc2l6ZSksIChpICogc2l6ZSkgKyBzaXplKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAgc3ViYXJyYXkubWFwKGkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBQb3N0KCdiYXRjaC5qc29uJywge1xyXG4gICAgICAgICAgaGFsdDogMCxcclxuICAgICAgICAgIGNtZDogT2JqZWN0LmFzc2lnbih7fSwgLi4uaS5tYXAoeCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7W3hbMF1dOiB4WzFdfVxyXG4gICAgICAgICAgfSkpXHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgICkgYXMgT2JzZXJ2YWJsZTxpQmF0Y2hSZXF1ZXN0QW5zd2VyPEE+W10+XHJcbiAgfVxyXG5cclxuICBwcmVwYXJlQmF0Y2g8VD4ocGFyYW06IGlCYXRjaFJlcXVlc3RQYXJhbUFycjxUPiB8IGlCYXRjaFJlcXVlc3RQYXJhbTxUPltdKTogaUJhdGNoUmVxdWVzdFBhcmFtSHR0cCB7XHJcbiAgICBsZXQgcmVzOiBpQmF0Y2hSZXF1ZXN0UGFyYW1IdHRwID0gT2JqZWN0LmtleXMocGFyYW0pLnJlZHVjZShcclxuICAgICAgKG9iaiwga2V5KSA9PiB7XHJcbiAgICAgICAgb2JqW2tleV0gPSAnJ1xyXG4gICAgICAgIHJldHVybiBvYmpcclxuICAgICAgfSxcclxuICAgICAge30gYXMgaUJhdGNoUmVxdWVzdFBhcmFtSHR0cFxyXG4gICAgKVxyXG4gICAgZm9yIChsZXQga2V5IGluIHBhcmFtKSB7XHJcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fCB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyAmJiBwYXJhbVtrZXldLnBhcmFtKSB7XHJcbiAgICAgICAgcmVzW2tleV0gPSBwYXJhbVtrZXldLm5hbWUgKyAnPycgKyBzdHJpbmdpZnlCaXRyaXhQYXJhbXMocGFyYW1ba2V5XS5wYXJhbSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc1xyXG4gIH1cclxuXHJcbiAgbWFwQnJhbmNoUmVzdWx0PFQ+KHJlczogaUJhdGNoUmVxdWVzdEFuc3dlcjxUPltdKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihbXSwgLi4ucmVzLm1hcChpID0+XHJcbiAgICAgIChpbnN0YW5jZU9maUJYUmVzdEFuc3dlclN1Y2Nlc3MoaSkgJiYgaW5zdGFuY2VPZmlCWFJlc3RBbnN3ZXJTdWNjZXNzKGkucmVzdWx0KSkgPyBpLnJlc3VsdC5yZXN1bHQgOiB1bmRlZmluZWQpXHJcbiAgICApIGFzIFJlY29yZDxrZXlCYXRjaCwgVD5cclxuICB9XHJcblxyXG4gIG1hcEJyYW5jaFJlc3VsdFdpdGhvdXRLZXk8VD4ocmVzOiBpQmF0Y2hSZXF1ZXN0QW5zd2VyPFQ+W10pOiBUW10ge1xyXG4gICAgcmV0dXJuIGZsYXR0ZW48VD4oT2JqZWN0LmFzc2lnbihbXSwgLi4ucmVzLm1hcChpID0+XHJcbiAgICAgIChpbnN0YW5jZU9maUJYUmVzdEFuc3dlclN1Y2Nlc3MoaSkgJiYgaW5zdGFuY2VPZmlCWFJlc3RBbnN3ZXJTdWNjZXNzKGkucmVzdWx0KSlcclxuICAgICAgICA/IGkucmVzdWx0LnJlc3VsdFxyXG4gICAgICAgIDogdW5kZWZpbmVkKSlcclxuICAgIClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCe0YHQvdC+0LLQvdC+0Lkg0LzQtdGC0L7QtCDQtNC70Y8g0LfQsNC/0YDQvtGB0L7QslxyXG4gICAqXHJcbiAgICogQHBhcmFtIG5hbWVcclxuICAgKiBAcGFyYW0gcGFyYW1zXHJcbiAgICovXHJcbiAgcG9zdDxUPihuYW1lOiBzdHJpbmdbXSwgcGFyYW1zOiBhbnkgPSB7fSwgcmVzdEFwaSA9IGZhbHNlKSB7XHJcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLmdldE5hbWVNZXRob2QobmFtZSlcclxuICAgIHJldHVybiB0aGlzLmh0dHBQb3N0PGlCWFJlc3RBbnN3ZXI8VD4+KHJlc3RBcGkgPyBgYXBpLyR7bWV0aG9kfWAgOiBtZXRob2QsIHBhcmFtcylcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCS0YLQvtGA0L7RgdGC0LXQv9C10L3QvdGL0Lkg0LzQtdGC0L7QtCDQtNC70Y8g0LfQsNC/0YDQvtGB0L7Qsi4g0J/QviDQstC+0LfQvNC+0LbQvdC+0YHRgtC4INC70YPRh9GI0LUg0L3QtSDQuNGB0L/QvtC70YzQt9C+0LLQsNGC0YxcclxuICAgKlxyXG4gICAqIEBwYXJhbSBuYW1lXHJcbiAgICogQHBhcmFtIHBhcmFtc1xyXG4gICAqL1xyXG4gIGdldDxUPihuYW1lOiBzdHJpbmdbXSwgcGFyYW1zOiBhbnkgPSB7fSkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cEdldDxpQlhSZXN0QW5zd2VyPFQ+Pih0aGlzLmdldE5hbWVNZXRob2QobmFtZSksIHBhcmFtcylcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGh0dHBQb3N0PFQ+KHVybDogc3RyaW5nLCBwYXJhbXM6IGFueSA9IHt9KTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPiB7XHJcbiAgICAvLyBkZWZlcigpINC+0YLQutC70LDQtNGL0LLQsNC10YIg0LLRgdGRINGB0L7QtNC10YDQttC40LzQvtC1ICjQsiDRgtC+0Lwg0YfQuNGB0LvQtSDRh9GC0LXQvdC40LUgQlhSZXN0U2V0dGluZ3NcclxuICAgIC8vINGH0LXRgNC10LcgdGhpcy5zZXNzaW9uLiopINC00L4g0YDQtdCw0LvRjNC90L7QuSDQv9C+0LTQv9C40YHQutC4IOKAlCDQuNC90LDRh9C1INC00LDQttC1INGBIFwi0LbQuNCy0YvQvFwiXHJcbiAgICAvLyDQs9C10YLRgtC10YDQvtC8INCyIFNlc3Npb25LZXlTZXJ2aWNlcyDQvdCw0YHRgtGA0L7QudC60Lgg0YfQuNGC0LDQu9C40YHRjCDQsdGLINCyINC80L7QvNC10L3RgiDQstGL0LfQvtCy0LBcclxuICAgIC8vIC5yZXMoKSwg0LAg0L3QtSDQsiDQvNC+0LzQtdC90YIgc3Vic2NyaWJlKCkvZmlyc3RWYWx1ZUZyb20oKSwg0YfRgtC+INC4INC+0LHQtdGJ0LDQvdC+XHJcbiAgICAvLyDQsiBSRUFETUUg0LrQsNC6INC/0L7QstC10LTQtdC90LjQtSBcItC70LXQvdC40LLQvtCz0L5cIiBSRVNULdCy0YvQt9C+0LLQsC5cclxuICAgIHJldHVybiBkZWZlcigoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcmFtc0Nsb25lID0gY2xvbmUocGFyYW1zKVxyXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLnNlc3Npb24uZ2V0S2V5QXV0aCgpXHJcbiAgICAgIGNvbnN0IGF1dGggPSB0aGlzLnNlc3Npb24uZ2V0QXV0aFBhcmFtcygpXHJcbiAgICAgIGNvbnN0IGNoZWNrSXNPbiA9IHRoaXMuc2Vzc2lvbi5nZXRDaGVja0F1dGhQYXJhbXNJc09uKClcclxuXHJcbiAgICAgIGlmIChjaGVja0lzT24pIHtcclxuICAgICAgICBpZiAoIWF1dGgpIHtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IHRoaXMuc2Vzc2lvbi5nZXRBdXRoRXJyb3IoJ3Bvc3QnKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChrZXkgIT09ICdPQXV0aDInKSB7XHJcbiAgICAgICAgICBwYXJhbXNDbG9uZVtrZXldID0gYXV0aFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRCYXNlVXJsKCkucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKGJhc2VVcmwpID0+IHtcclxuICAgICAgICAgIGlmICghYmFzZVVybCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiB0aGlzLnNlc3Npb24uZ2V0QmFzZVVybEVycm9yKCdwb3N0JykpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgZnVsbFVybCA9IHByZXBhcmVCYXNlQWRkcmVzcyhiYXNlVXJsKSArIHVybFxyXG5cclxuICAgICAgICAgIGlmIChrZXkgPT09ICdzZXNzaWQnKSB7XHJcbiAgICAgICAgICAgIC8vINCf0YDQtdC+0LHRgNCw0LfRg9C10Lwg0L/QsNGA0LDQvNC10YLRgNGLINCyINGE0L7RgNC80LDRgiB4LXd3dy1mb3JtLXVybGVuY29kZWRcclxuICAgICAgICAgICAgY29uc3QgYm9keVN0cmluZyA9IHRoaXMuc2VyaWFsaXplQml0cml4UGFyYW1zKHBhcmFtc0Nsb25lKVxyXG4gICAgICAgICAgICByZXR1cm4gZnJvbShcclxuICAgICAgICAgICAgICB0aGlzLmF4aW9zSW5zdGFuY2UucG9zdDxUPihmdWxsVXJsLCBib2R5U3RyaW5nLCB7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnfSxcclxuICAgICAgICAgICAgICB9KS50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuZGF0YSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiBmcm9tKFxyXG4gICAgICAgICAgICB0aGlzLmF4aW9zSW5zdGFuY2UucG9zdDxUPihmdWxsVXJsLCBwYXJhbXNDbG9uZSxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuc2Vzc2lvbi5nZXRXaXRoQ3JlZGVudGlhbHMoKSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICkudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmRhdGEpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGh0dHBHZXQ8VD4odXJsOiBzdHJpbmcsIHBhcmFtczogYW55ID0ge30pOiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQ+IHtcclxuICAgIC8vINCi0LAg0LbQtSDQv9GA0LjRh9C40L3QsCwg0YfRgtC+INC4INGDIGh0dHBQb3N0INCy0YvRiNC1OiDQvtGC0LrQu9Cw0LTRi9Cy0LDQtdC8INGH0YLQtdC90LjQtSBCWFJlc3RTZXR0aW5nc1xyXG4gICAgLy8g0LTQviDQv9C+0LTQv9C40YHQutC4LCDRh9GC0L7QsdGLIGBnZXQoKWAg0LLRkdC7INGB0LXQsdGPINGC0LDQuiDQttC1IFwi0LvQtdC90LjQstC+XCIsINC60LDQuiDQuCBgcG9zdCgpYFxyXG4gICAgLy8gKNGB0LjQvNC80LXRgtGA0LjRjywg0LrQvtGC0L7RgNC+0Lkg0L3QtSDQsdGL0LvQviDQtNC+INGN0YLQvtCz0L4g4oCUIEdFVCDRgNC10LfQvtC70LLQuNC7INC90LDRgdGC0YDQvtC50LrQuCDQsiDQvNC+0LzQtdC90YJcclxuICAgIC8vINCy0YvQt9C+0LLQsCwg0LAg0L3QtSDQsiDQvNC+0LzQtdC90YIgc3Vic2NyaWJlKCkpLlxyXG4gICAgcmV0dXJuIGRlZmVyKCgpID0+IHtcclxuICAgICAgY29uc3QgcGFyYW1zQ2xvbmUgPSBjbG9uZShwYXJhbXMpXHJcbiAgICAgIGNvbnN0IGF1dGggPSB0aGlzLnNlc3Npb24uZ2V0QXV0aFBhcmFtcygpXHJcbiAgICAgIGNvbnN0IGNoZWNrSXNPbiA9IHRoaXMuc2Vzc2lvbi5nZXRDaGVja0F1dGhQYXJhbXNJc09uKClcclxuXHJcbiAgICAgIGlmIChjaGVja0lzT24pIHtcclxuICAgICAgICBpZiAoIWF1dGgpIHtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IHRoaXMuc2Vzc2lvbi5nZXRBdXRoRXJyb3IoJ2dldCcpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcGFyYW1zQ2xvbmVbdGhpcy5zZXNzaW9uLmdldEtleUF1dGgoKV0gPSBhdXRoXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uZ2V0QmFzZVVybCgpLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChiYXNlVXJsKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWJhc2VVcmwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gdGhpcy5zZXNzaW9uLmdldEJhc2VVcmxFcnJvcignZ2V0JykpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgZnVsbFVybCA9IHByZXBhcmVCYXNlQWRkcmVzcyhiYXNlVXJsKSArIHVybFxyXG4gICAgICAgICAgY29uc3QgcXVlcnlTdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcmFtc0Nsb25lKS50b1N0cmluZygpXHJcbiAgICAgICAgICBjb25zdCBmaW5hbFVybCA9IGAke2Z1bGxVcmx9PyR7cXVlcnlTdHJpbmd9YFxyXG5cclxuICAgICAgICAgIHJldHVybiBmcm9tKFxyXG4gICAgICAgICAgICB0aGlzLmF4aW9zSW5zdGFuY2UuZ2V0PFQ+KGZpbmFsVXJsKS50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuZGF0YSlcclxuICAgICAgICAgIClcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgc2VyaWFsaXplQml0cml4UGFyYW1zKHBhcmFtczogdW5rbm93bik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gc3RyaW5naWZ5Qml0cml4UGFyYW1zKHBhcmFtcylcclxuICB9XHJcblxyXG4gIGdldE5hbWVNZXRob2QoYXJyOiBzdHJpbmdbXSkge1xyXG4gICAgcmV0dXJuIGFyci5qb2luKCcuJylcclxuICB9XHJcblxyXG59XHJcblxyXG4iXX0=
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSHR0cEJYLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYngtcmVzdC9zcmMvc2VydmljZXMvaHR0cC9IdHRwQlgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNwRSxPQUFPLEtBQUssTUFBTSxZQUFZLENBQUE7QUFDOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUtyQyxPQUFPLE9BQU8sTUFBTSxpQkFBaUIsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUMxRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDMUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQzVDLE9BQU8sRUFBRSxxQkFBcUIsSUFBSSxxQkFBcUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBRXRHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFL0MsTUFBTSxPQUFPLGNBQWUsU0FBUSxZQUFZO0lBRTlDOzs7O09BSUc7SUFDSCxNQUFNLENBQU8sS0FBeUQ7UUFFcEUsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBUyxJQUFJLENBQUMsWUFBWSxDQUFJLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDdEUsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFBLENBQUMsbUJBQW1CO1FBQ25DLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQSxDQUFDLDJDQUEyQztRQUM3RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENB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OUQsQ0FBQztnQkFFRCxNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUE7Z0JBQ2pELE1BQU0sV0FBVyxHQUFHLElBQUksZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFBO2dCQUMvRCxNQUFNLFFBQVEsR0FBRyxHQUFHLE9BQU8sSUFBSSxXQUFXLEVBQUUsQ0FBQTtnQkFFNUMsT0FBTyxJQUFJLENBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUksUUFBUSxFQUFFO29CQUNsQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7aUJBQ3BDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDckMsQ0FBQTtZQUNILENBQUMsQ0FBQyxDQUNILENBQUE7UUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssWUFBWSxDQUFDLE9BQWdDLEVBQUUsV0FBbUMsRUFBRTtRQUMxRixPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUE7SUFDbEUsQ0FBQztJQUVELHFCQUFxQixDQUFDLE1BQWU7UUFDbkMsT0FBTyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQWE7UUFDekIsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3RCLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IsIGZvcmtKb2luLCBmcm9tLCBkZWZlciB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCBjbG9uZSBmcm9tICdqdXN0LWNsb25lJ1xyXG5pbXBvcnQgeyBIdHRwU2VydmljZXMgfSBmcm9tICcuL2h0dHAnXHJcbmltcG9ydCB7XHJcbiAgaUJhdGNoUmVxdWVzdEFuc3dlciwgaUJhdGNoUmVxdWVzdFBhcmFtLCBpQmF0Y2hSZXF1ZXN0UGFyYW1BcnIsIGlCYXRjaFJlcXVlc3RQYXJhbUh0dHAsIGtleUJhdGNoLFxyXG59IGZyb20gJy4uLy4uL3R5cGlmaWNhdGlvbi9yZXN0L2JhdGNoL2JhdGNoUmVxdWVzdFBhcmFtJ1xyXG5pbXBvcnQgeyBpQlhSZXN0QW5zd2VyIH0gZnJvbSAnLi4vLi4vdHlwaWZpY2F0aW9uL3Jlc3QvYmFzZS9hbnN3ZXInXHJcbmltcG9ydCBmbGF0dGVuIGZyb20gJ2p1c3QtZmxhdHRlbi1pdCdcclxuaW1wb3J0IHsgaW5zdGFuY2VPZmlCWFJlc3RBbnN3ZXJTdWNjZXNzIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zL21hcFJlc3VsdCdcclxuaW1wb3J0IHsgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXHJcbmltcG9ydCB7IHByZXBhcmVCYXNlQWRkcmVzcyB9IGZyb20gJy4uL2Jhc2UnXHJcbmltcG9ydCB7IHNlcmlhbGl6ZUJpdHJpeFBhcmFtcyBhcyBzdHJpbmdpZnlCaXRyaXhQYXJhbXMgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvc2VyaWFsaXplQml0cml4UGFyYW1zJ1xyXG5pbXBvcnQgeyBpSHR0cFBhcmFtU2V0dGluZ3MgfSBmcm9tICcuLi8uLi90eXBpZmljYXRpb24vcmVzdC9zZXR0aW5ncydcclxuaW1wb3J0IHsgd2l0aEF1dGhSZWZyZXNoIH0gZnJvbSAnLi9hdXRoUmVmcmVzaCdcclxuXHJcbmV4cG9ydCBjbGFzcyBIdHRwQlhTZXJ2aWNlcyBleHRlbmRzIEh0dHBTZXJ2aWNlcyB7XHJcblxyXG4gIC8qKlxyXG4gICAqINCd0LUg0YHRh9C40YLQsNC50YLQtSDRjdGC0L7RgiDQvNC10YLQvtC0INC+0LHRgNCw0LfRhtC+0Lwv0YTQuNC90LDQu9GM0L3Ri9C8IEFQSS5cclxuICAgKiBUT0RPOiDQo9C00LDQu9C40YLRjCDQtNCw0L3QvdGL0Lkg0LzQtdGC0L7QtCDQv9C+0YHQu9C1INGA0LXQsNC70LjQt9Cw0YbQuNC4INC10LPQviDQsiDRgNCw0LfQtNC10LvQtSBOYXZ2eVxyXG4gICAqIEBwYXJhbSBwYXJhbVxyXG4gICAqL1xyXG4gIGJyYW5jaDxULCBBPihwYXJhbTogaUJhdGNoUmVxdWVzdFBhcmFtQXJyPFQ+IHwgaUJhdGNoUmVxdWVzdFBhcmFtPFQ+W10pXHJcbiAgICA6IE9ic2VydmFibGU8aUJhdGNoUmVxdWVzdEFuc3dlcjxBPltdIHwgdW5kZWZpbmVkPiB7XHJcbiAgICBsZXQgcHJlcGFyZVBhcmFtID0gT2JqZWN0LmVudHJpZXM8c3RyaW5nPih0aGlzLnByZXBhcmVCYXRjaDxUPihwYXJhbSkpXHJcbiAgICBjb25zdCBzaXplID0gNTAgLy8g0LHQvtC70YzRiNC1INC90LUg0L7RgtC00LDRgdGCXHJcbiAgICBsZXQgc3ViYXJyYXkgPSBbXSAvL9C80LDRgdGB0LjQsiDQsiDQutC+0YLQvtGA0YvQuSDQsdGD0LTQtdGCINCy0YvQstC10LTQtdC9INGA0LXQt9GD0LvRjNGC0LDRgi5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5jZWlsKHByZXBhcmVQYXJhbS5sZW5ndGggLyBzaXplKTsgaSsrKSB7XHJcbiAgICAgIHN1YmFycmF5W2ldID0gcHJlcGFyZVBhcmFtLnNsaWNlKChpICogc2l6ZSksIChpICogc2l6ZSkgKyBzaXplKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAgc3ViYXJyYXkubWFwKGkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBQb3N0KCdiYXRjaC5qc29uJywge1xyXG4gICAgICAgICAgaGFsdDogMCxcclxuICAgICAgICAgIGNtZDogT2JqZWN0LmFzc2lnbih7fSwgLi4uaS5tYXAoeCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7W3hbMF1dOiB4WzFdfVxyXG4gICAgICAgICAgfSkpXHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgICkgYXMgT2JzZXJ2YWJsZTxpQmF0Y2hSZXF1ZXN0QW5zd2VyPEE+W10+XHJcbiAgfVxyXG5cclxuICBwcmVwYXJlQmF0Y2g8VD4ocGFyYW06IGlCYXRjaFJlcXVlc3RQYXJhbUFycjxUPiB8IGlCYXRjaFJlcXVlc3RQYXJhbTxUPltdKTogaUJhdGNoUmVxdWVzdFBhcmFtSHR0cCB7XHJcbiAgICBsZXQgcmVzOiBpQmF0Y2hSZXF1ZXN0UGFyYW1IdHRwID0gT2JqZWN0LmtleXMocGFyYW0pLnJlZHVjZShcclxuICAgICAgKG9iaiwga2V5KSA9PiB7XHJcbiAgICAgICAgb2JqW2tleV0gPSAnJ1xyXG4gICAgICAgIHJldHVybiBvYmpcclxuICAgICAgfSxcclxuICAgICAge30gYXMgaUJhdGNoUmVxdWVzdFBhcmFtSHR0cFxyXG4gICAgKVxyXG4gICAgZm9yIChsZXQga2V5IGluIHBhcmFtKSB7XHJcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fCB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyAmJiBwYXJhbVtrZXldLnBhcmFtKSB7XHJcbiAgICAgICAgcmVzW2tleV0gPSBwYXJhbVtrZXldLm5hbWUgKyAnPycgKyBzdHJpbmdpZnlCaXRyaXhQYXJhbXMocGFyYW1ba2V5XS5wYXJhbSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc1xyXG4gIH1cclxuXHJcbiAgbWFwQnJhbmNoUmVzdWx0PFQ+KHJlczogaUJhdGNoUmVxdWVzdEFuc3dlcjxUPltdKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihbXSwgLi4ucmVzLm1hcChpID0+XHJcbiAgICAgIChpbnN0YW5jZU9maUJYUmVzdEFuc3dlclN1Y2Nlc3MoaSkgJiYgaW5zdGFuY2VPZmlCWFJlc3RBbnN3ZXJTdWNjZXNzKGkucmVzdWx0KSkgPyBpLnJlc3VsdC5yZXN1bHQgOiB1bmRlZmluZWQpXHJcbiAgICApIGFzIFJlY29yZDxrZXlCYXRjaCwgVD5cclxuICB9XHJcblxyXG4gIG1hcEJyYW5jaFJlc3VsdFdpdGhvdXRLZXk8VD4ocmVzOiBpQmF0Y2hSZXF1ZXN0QW5zd2VyPFQ+W10pOiBUW10ge1xyXG4gICAgcmV0dXJuIGZsYXR0ZW48VD4oT2JqZWN0LmFzc2lnbihbXSwgLi4ucmVzLm1hcChpID0+XHJcbiAgICAgIChpbnN0YW5jZU9maUJYUmVzdEFuc3dlclN1Y2Nlc3MoaSkgJiYgaW5zdGFuY2VPZmlCWFJlc3RBbnN3ZXJTdWNjZXNzKGkucmVzdWx0KSlcclxuICAgICAgICA/IGkucmVzdWx0LnJlc3VsdFxyXG4gICAgICAgIDogdW5kZWZpbmVkKSlcclxuICAgIClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCe0YHQvdC+0LLQvdC+0Lkg0LzQtdGC0L7QtCDQtNC70Y8g0LfQsNC/0YDQvtGB0L7QslxyXG4gICAqXHJcbiAgICogQHBhcmFtIG5hbWVcclxuICAgKiBAcGFyYW0gcGFyYW1zXHJcbiAgICogQHBhcmFtIHJlc3RBcGlcclxuICAgKiBAcGFyYW0gaGVhZGVycyDQt9Cw0LPQvtC70L7QstC60Lgg0YLQvtC70YzQutC+INC00LvRjyDRjdGC0L7Qs9C+INC30LDQv9GA0L7RgdCwLCDQv9C+0LLQtdGA0YUgYEJYUmVzdFNldHRpbmdzLmhlYWRlcnNgXHJcbiAgICovXHJcbiAgcG9zdDxUPihuYW1lOiBzdHJpbmdbXSwgcGFyYW1zOiBhbnkgPSB7fSwgcmVzdEFwaSA9IGZhbHNlLCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xyXG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5nZXROYW1lTWV0aG9kKG5hbWUpXHJcbiAgICByZXR1cm4gdGhpcy5odHRwUG9zdDxpQlhSZXN0QW5zd2VyPFQ+PihyZXN0QXBpID8gYGFwaS8ke21ldGhvZH1gIDogbWV0aG9kLCBwYXJhbXMsIHVuZGVmaW5lZCwgaGVhZGVycylcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCS0YLQvtGA0L7RgdGC0LXQv9C10L3QvdGL0Lkg0LzQtdGC0L7QtCDQtNC70Y8g0LfQsNC/0YDQvtGB0L7Qsi4g0J/QviDQstC+0LfQvNC+0LbQvdC+0YHRgtC4INC70YPRh9GI0LUg0L3QtSDQuNGB0L/QvtC70YzQt9C+0LLQsNGC0YxcclxuICAgKlxyXG4gICAqIEBwYXJhbSBuYW1lXHJcbiAgICogQHBhcmFtIHBhcmFtc1xyXG4gICAqIEBwYXJhbSBoZWFkZXJzINC30LDQs9C+0LvQvtCy0LrQuCDRgtC+0LvRjNC60L4g0LTQu9GPINGN0YLQvtCz0L4g0LfQsNC/0YDQvtGB0LAsINC/0L7QstC10YDRhSBgQlhSZXN0U2V0dGluZ3MuaGVhZGVyc2BcclxuICAgKi9cclxuICBnZXQ8VD4obmFtZTogc3RyaW5nW10sIHBhcmFtczogYW55ID0ge30sIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwR2V0PGlCWFJlc3RBbnN3ZXI8VD4+KHRoaXMuZ2V0TmFtZU1ldGhvZChuYW1lKSwgcGFyYW1zLCB1bmRlZmluZWQsIGhlYWRlcnMpXHJcbiAgfVxyXG5cclxuICAvLyBzZXR0aW5ncyDigJQg0YLQvtC70YzQutC+INC00LvRjyDRgdC+0LLQvNC10YHRgtC40LzQvtGB0YLQuCDRgdC40LPQvdCw0YLRg9GA0Ysg0YEgSHR0cFNlcnZpY2VzOiDQt9C00LXRgdGMINGC0LXQu9C+XHJcbiAgLy8g0YPRhdC+0LTQuNGCIEpTT04t0L7QvC91cmxlbmNvZGVkLCDQuCDQv9C10YDQtdGB0YfRkdGCINC00LDRgiDQuNC3IGlIdHRwUGFyYW1TZXR0aW5ncyDQvdC1INC90YPQttC10L0uXHJcbiAgb3ZlcnJpZGUgaHR0cFBvc3Q8VD4oXHJcbiAgICB1cmw6IHN0cmluZyxcclxuICAgIHBhcmFtczogYW55ID0ge30sXHJcbiAgICBzZXR0aW5ncz86IGlIdHRwUGFyYW1TZXR0aW5ncyxcclxuICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XHJcbiAgKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPiB7XHJcbiAgICAvLyBkZWZlcigpINC+0YLQutC70LDQtNGL0LLQsNC10YIg0LLRgdGRINGB0L7QtNC10YDQttC40LzQvtC1ICjQsiDRgtC+0Lwg0YfQuNGB0LvQtSDRh9GC0LXQvdC40LUgQlhSZXN0U2V0dGluZ3NcclxuICAgIC8vINGH0LXRgNC10LcgdGhpcy5zZXNzaW9uLiopINC00L4g0YDQtdCw0LvRjNC90L7QuSDQv9C+0LTQv9C40YHQutC4IOKAlCDQuNC90LDRh9C1INC00LDQttC1INGBIFwi0LbQuNCy0YvQvFwiXHJcbiAgICAvLyDQs9C10YLRgtC10YDQvtC8INCyIFNlc3Npb25LZXlTZXJ2aWNlcyDQvdCw0YHRgtGA0L7QudC60Lgg0YfQuNGC0LDQu9C40YHRjCDQsdGLINCyINC80L7QvNC10L3RgiDQstGL0LfQvtCy0LBcclxuICAgIC8vIC5yZXMoKSwg0LAg0L3QtSDQsiDQvNC+0LzQtdC90YIgc3Vic2NyaWJlKCkvZmlyc3RWYWx1ZUZyb20oKSwg0YfRgtC+INC4INC+0LHQtdGJ0LDQvdC+XHJcbiAgICAvLyDQsiBSRUFETUUg0LrQsNC6INC/0L7QstC10LTQtdC90LjQtSBcItC70LXQvdC40LLQvtCz0L5cIiBSRVNULdCy0YvQt9C+0LLQsC5cclxuICAgIC8vXHJcbiAgICAvLyB3aXRoQXV0aFJlZnJlc2goKSDQv9C+0LLRgtC+0YDRj9C10YIg0LfQsNC/0YDQvtGBINC/0L7RgdC70LUgQlhSZXN0U2V0dGluZ3MuYXV0aC5yZWZyZXNoIOKAlFxyXG4gICAgLy8g0L/QvtCy0YLQvtGA0L3QvtC5INC/0L7QtNC/0LjRgdC60L7QuSDQvdCwINGN0YLQvtGCINC20LUgZGVmZXIoKSwg0L/QvtGN0YLQvtC80YMg0L/QvtCy0YLQvtGAINC30LDQvdC+0LLQviDRh9C40YLQsNC10YJcclxuICAgIC8vINGC0L7QutC10L0sINCw0LTRgNC10YEg0Lgg0LfQsNCz0L7Qu9C+0LLQutC4LiDQp9C10YDQtdC3IGh0dHBQb3N0L2h0dHBHZXQg0LjQtNGD0YIg0LLRgdC1INC30LDQv9GA0L7RgdGLXHJcbiAgICAvLyDQsdC40LHQu9C40L7RgtC10LrQuCAocG9zdC9nZXQsIGJhdGNoLCDQstGB0LUg0LLQuNC00YsgTmF2dnkt0LfQsNC/0YDQvtGB0L7QsiksINGC0LDQuiDRh9GC0L4g0L/QvtCy0YLQvtGAXHJcbiAgICAvLyDQstGB0YLRgNC+0LXQvSDRgtC+0LvRjNC60L4g0LfQtNC10YHRjC5cclxuICAgIHJldHVybiB3aXRoQXV0aFJlZnJlc2goZGVmZXIoKCkgPT4ge1xyXG4gICAgICBjb25zdCBwYXJhbXNDbG9uZSA9IGNsb25lKHBhcmFtcylcclxuICAgICAgY29uc3Qga2V5ID0gdGhpcy5zZXNzaW9uLmdldEtleUF1dGgoKVxyXG4gICAgICBjb25zdCBhdXRoID0gdGhpcy5zZXNzaW9uLmdldEF1dGhQYXJhbXMoKVxyXG4gICAgICBjb25zdCBjaGVja0lzT24gPSB0aGlzLnNlc3Npb24uZ2V0Q2hlY2tBdXRoUGFyYW1zSXNPbigpXHJcblxyXG4gICAgICBpZiAoY2hlY2tJc09uKSB7XHJcbiAgICAgICAgaWYgKCFhdXRoKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiB0aGlzLnNlc3Npb24uZ2V0QXV0aEVycm9yKCdwb3N0JykpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoa2V5ICE9PSAnT0F1dGgyJykge1xyXG4gICAgICAgICAgcGFyYW1zQ2xvbmVba2V5XSA9IGF1dGhcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uZ2V0QmFzZVVybCgpLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChiYXNlVXJsKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWJhc2VVcmwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gdGhpcy5zZXNzaW9uLmdldEJhc2VVcmxFcnJvcigncG9zdCcpKVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGZ1bGxVcmwgPSBwcmVwYXJlQmFzZUFkZHJlc3MoYmFzZVVybCkgKyB1cmxcclxuXHJcbiAgICAgICAgICBpZiAoa2V5ID09PSAnc2Vzc2lkJykge1xyXG4gICAgICAgICAgICAvLyDQn9GA0LXQvtCx0YDQsNC30YPQtdC8INC/0LDRgNCw0LzQtdGC0YDRiyDQsiDRhNC+0YDQvNCw0YIgeC13d3ctZm9ybS11cmxlbmNvZGVkXHJcbiAgICAgICAgICAgIGNvbnN0IGJvZHlTdHJpbmcgPSB0aGlzLnNlcmlhbGl6ZUJpdHJpeFBhcmFtcyhwYXJhbXNDbG9uZSlcclxuICAgICAgICAgICAgcmV0dXJuIGZyb20oXHJcbiAgICAgICAgICAgICAgdGhpcy5heGlvc0luc3RhbmNlLnBvc3Q8VD4oZnVsbFVybCwgYm9keVN0cmluZywge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5idWlsZEhlYWRlcnMoaGVhZGVycywgeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ30pLFxyXG4gICAgICAgICAgICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5kYXRhKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGZyb20oXHJcbiAgICAgICAgICAgIHRoaXMuYXhpb3NJbnN0YW5jZS5wb3N0PFQ+KGZ1bGxVcmwsIHBhcmFtc0Nsb25lLFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5zZXNzaW9uLmdldFdpdGhDcmVkZW50aWFscygpLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5idWlsZEhlYWRlcnMoaGVhZGVycywgeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9KSxcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICkudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmRhdGEpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgfSkpXHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBodHRwR2V0PFQ+KFxyXG4gICAgdXJsOiBzdHJpbmcsXHJcbiAgICBwYXJhbXM6IGFueSA9IHt9LFxyXG4gICAgc2V0dGluZ3M/OiBpSHR0cFBhcmFtU2V0dGluZ3MsXHJcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxyXG4gICk6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD4ge1xyXG4gICAgLy8g0KLQsCDQttC1INC/0YDQuNGH0LjQvdCwLCDRh9GC0L4g0Lgg0YMgaHR0cFBvc3Qg0LLRi9GI0LU6INC+0YLQutC70LDQtNGL0LLQsNC10Lwg0YfRgtC10L3QuNC1IEJYUmVzdFNldHRpbmdzXHJcbiAgICAvLyDQtNC+INC/0L7QtNC/0LjRgdC60LgsINGH0YLQvtCx0YsgYGdldCgpYCDQstGR0Lsg0YHQtdCx0Y8g0YLQsNC6INC20LUgXCLQu9C10L3QuNCy0L5cIiwg0LrQsNC6INC4IGBwb3N0KClgXHJcbiAgICAvLyAo0YHQuNC80LzQtdGC0YDQuNGPLCDQutC+0YLQvtGA0L7QuSDQvdC1INCx0YvQu9C+INC00L4g0Y3RgtC+0LPQviDigJQgR0VUINGA0LXQt9C+0LvQstC40Lsg0L3QsNGB0YLRgNC+0LnQutC4INCyINC80L7QvNC10L3RglxyXG4gICAgLy8g0LLRi9C30L7QstCwLCDQsCDQvdC1INCyINC80L7QvNC10L3RgiBzdWJzY3JpYmUoKSkuINCf0L7QstGC0L7RgCDQv9C+0YHQu9C1INC/0YDQvtC00LvQtdC90LjRj1xyXG4gICAgLy8g0LDQstGC0L7RgNC40LfQsNGG0LjQuCDigJQg0LrQsNC6INCyIGh0dHBQb3N0LlxyXG4gICAgcmV0dXJuIHdpdGhBdXRoUmVmcmVzaChkZWZlcigoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcmFtc0Nsb25lID0gY2xvbmUocGFyYW1zKVxyXG4gICAgICBjb25zdCBhdXRoID0gdGhpcy5zZXNzaW9uLmdldEF1dGhQYXJhbXMoKVxyXG4gICAgICBjb25zdCBjaGVja0lzT24gPSB0aGlzLnNlc3Npb24uZ2V0Q2hlY2tBdXRoUGFyYW1zSXNPbigpXHJcblxyXG4gICAgICBpZiAoY2hlY2tJc09uKSB7XHJcbiAgICAgICAgaWYgKCFhdXRoKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiB0aGlzLnNlc3Npb24uZ2V0QXV0aEVycm9yKCdnZXQnKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHBhcmFtc0Nsb25lW3RoaXMuc2Vzc2lvbi5nZXRLZXlBdXRoKCldID0gYXV0aFxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmdldEJhc2VVcmwoKS5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoYmFzZVVybCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFiYXNlVXJsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IHRoaXMuc2Vzc2lvbi5nZXRCYXNlVXJsRXJyb3IoJ2dldCcpKVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGZ1bGxVcmwgPSBwcmVwYXJlQmFzZUFkZHJlc3MoYmFzZVVybCkgKyB1cmxcclxuICAgICAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXNDbG9uZSkudG9TdHJpbmcoKVxyXG4gICAgICAgICAgY29uc3QgZmluYWxVcmwgPSBgJHtmdWxsVXJsfT8ke3F1ZXJ5U3RyaW5nfWBcclxuXHJcbiAgICAgICAgICByZXR1cm4gZnJvbShcclxuICAgICAgICAgICAgdGhpcy5heGlvc0luc3RhbmNlLmdldDxUPihmaW5hbFVybCwge1xyXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuYnVpbGRIZWFkZXJzKGhlYWRlcnMpLFxyXG4gICAgICAgICAgICB9KS50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuZGF0YSlcclxuICAgICAgICAgIClcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICB9KSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCX0LDQs9C+0LvQvtCy0LrQuCDQt9Cw0L/RgNC+0YHQsDogYEJYUmVzdFNldHRpbmdzLmhlYWRlcnNgLCDQv9C+0LLQtdGA0YUg0L3QuNGFIOKAlCDQt9Cw0LPQvtC70L7QstC60LhcclxuICAgKiDQutC+0L3QutGA0LXRgtC90L7Qs9C+INC30LDQv9GA0L7RgdCwLCDQv9C+0LLQtdGA0YUg0LLRgdC10LPQviDigJQgYHJlcXVpcmVkYC4g0JIgYHJlcXVpcmVkYCDQuNC00ZHRglxyXG4gICAqIGBDb250ZW50LVR5cGVgOiDQvtGCINC90LXQs9C+INC30LDQstC40YHQuNGCLCDQutCw0Log0YHQtdGA0LLQtdGAINGA0LDQt9Cx0LXRgNGR0YIg0YLQtdC70L4sINC/0L7RjdGC0L7QvNGDXHJcbiAgICog0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC40LUg0LfQsNCz0L7Qu9C+0LLQutC4INC10LPQviDQvdC1INC/0LXRgNC10LHQuNCy0LDRjtGCLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYnVpbGRIZWFkZXJzKGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCByZXF1aXJlZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9KSB7XHJcbiAgICByZXR1cm4geyAuLi50aGlzLnNlc3Npb24uZ2V0SGVhZGVycygpLCAuLi5oZWFkZXJzLCAuLi5yZXF1aXJlZCB9XHJcbiAgfVxyXG5cclxuICBzZXJpYWxpemVCaXRyaXhQYXJhbXMocGFyYW1zOiB1bmtub3duKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBzdHJpbmdpZnlCaXRyaXhQYXJhbXMocGFyYW1zKVxyXG4gIH1cclxuXHJcbiAgZ2V0TmFtZU1ldGhvZChhcnI6IHN0cmluZ1tdKSB7XHJcbiAgICByZXR1cm4gYXJyLmpvaW4oJy4nKVxyXG4gIH1cclxuXHJcbn1cclxuXHJcbiJdfQ==
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { defer, from, throwError } from 'rxjs';
|
|
2
|
+
import { catchError, switchMap } from 'rxjs/operators';
|
|
3
|
+
import axios from 'axios';
|
|
4
|
+
import { BXRestSettings } from '../../settings';
|
|
5
|
+
import { parseBXRestErrorBody } from '../../functions/errors';
|
|
6
|
+
/**
|
|
7
|
+
* Коды ошибок Bitrix, которые лечатся продлением токена. `expired_token` —
|
|
8
|
+
* единственный системный код, для которого документация Bitrix24 советует
|
|
9
|
+
* "обновить токены и повторить вызов". `invalid_token` в списке системных
|
|
10
|
+
* ошибок документации нет, но так же считает официальный `@bitrix24/b24jssdk`.
|
|
11
|
+
*
|
|
12
|
+
* Остальные системные ошибки тоже приходят со статусом 401
|
|
13
|
+
* (`insufficient_scope`, `NO_AUTH_FOUND`, `ACCESS_DENIED`,
|
|
14
|
+
* `INVALID_CREDENTIALS`, `user_access_error`, ...), но новый токен их
|
|
15
|
+
* не исправит — поэтому смотрим на код, а не только на статус.
|
|
16
|
+
*/
|
|
17
|
+
const AUTH_ERROR_CODES = ['expired_token', 'invalid_token'];
|
|
18
|
+
/**
|
|
19
|
+
* Условие продления по умолчанию (`BXRestSettings.auth.isAuthError`):
|
|
20
|
+
* - ответ с ошибкой Bitrix `expired_token` или `invalid_token` — при любом статусе;
|
|
21
|
+
* - ответ 401 без тела ошибки Bitrix — например, пустой ответ своего
|
|
22
|
+
* бэкенд-прокси, у которого нет действующего токена.
|
|
23
|
+
*
|
|
24
|
+
* Ответ 401 с другим кодом Bitrix ошибкой авторизации не считается.
|
|
25
|
+
*/
|
|
26
|
+
export function isBXRestAuthError(error) {
|
|
27
|
+
if (!axios.isAxiosError(error) || !error.response) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
const parsed = parseBXRestErrorBody(error.response.data);
|
|
31
|
+
if (parsed) {
|
|
32
|
+
return AUTH_ERROR_CODES.includes(parsed.error);
|
|
33
|
+
}
|
|
34
|
+
return error.response.status === 401;
|
|
35
|
+
}
|
|
36
|
+
// Общее на всю библиотеку состояние продления — как и сами BXRestSettings.
|
|
37
|
+
// pendingRefresh — идущее сейчас продление, его ждут все упавшие запросы;
|
|
38
|
+
// refreshCount — сколько продлений уже завершилось успешно.
|
|
39
|
+
let pendingRefresh;
|
|
40
|
+
let refreshCount = 0;
|
|
41
|
+
function sharedRefresh(refresh) {
|
|
42
|
+
if (!pendingRefresh) {
|
|
43
|
+
pendingRefresh = Promise.resolve()
|
|
44
|
+
// Через then, чтобы синхронное исключение в refresh() тоже стало
|
|
45
|
+
// отклонённым промисом, а не вылетело из catchError
|
|
46
|
+
.then(() => refresh())
|
|
47
|
+
.then(() => {
|
|
48
|
+
refreshCount++;
|
|
49
|
+
})
|
|
50
|
+
.finally(() => {
|
|
51
|
+
pendingRefresh = undefined;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return pendingRefresh;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Повтор запроса после продления авторизации (`BXRestSettings.auth.refresh`).
|
|
58
|
+
*
|
|
59
|
+
* `request$` должен быть "холодным" и читать настройки при подписке (как
|
|
60
|
+
* `defer()` в HttpBXServices): повтор — это повторная подписка, поэтому
|
|
61
|
+
* токен, адрес и заголовки берутся уже новые. На второй попытке ошибка не
|
|
62
|
+
* перехватывается — запрос повторяется не больше одного раза.
|
|
63
|
+
*/
|
|
64
|
+
export function withAuthRefresh(request$) {
|
|
65
|
+
return defer(() => {
|
|
66
|
+
const { refresh, isAuthError = isBXRestAuthError } = BXRestSettings.value.auth;
|
|
67
|
+
if (!refresh) {
|
|
68
|
+
return request$;
|
|
69
|
+
}
|
|
70
|
+
const refreshCountAtStart = refreshCount;
|
|
71
|
+
return request$.pipe(catchError((error) => {
|
|
72
|
+
if (!isAuthError(error)) {
|
|
73
|
+
return throwError(() => error);
|
|
74
|
+
}
|
|
75
|
+
// Пока этот запрос был в пути, токен уже продлили по ошибке другого
|
|
76
|
+
// запроса — повторяем без нового продления
|
|
77
|
+
const refreshed = (refreshCount !== refreshCountAtStart)
|
|
78
|
+
? Promise.resolve()
|
|
79
|
+
: sharedRefresh(refresh);
|
|
80
|
+
return from(refreshed).pipe(catchError((refreshError) => {
|
|
81
|
+
if (error && typeof error === 'object') {
|
|
82
|
+
error.authRefreshError = refreshError;
|
|
83
|
+
}
|
|
84
|
+
return throwError(() => error);
|
|
85
|
+
}), switchMap(() => request$));
|
|
86
|
+
}));
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aFJlZnJlc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ieC1yZXN0L3NyYy9zZXJ2aWNlcy9odHRwL2F1dGhSZWZyZXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFjLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ3RELE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUN6QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDL0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFFN0Q7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLENBQUE7QUFFM0Q7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFjO0lBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDeEQsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLE9BQU8sZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNoRCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUE7QUFDdEMsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSwwRUFBMEU7QUFDMUUsNERBQTREO0FBQzVELElBQUksY0FBeUMsQ0FBQTtBQUM3QyxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUE7QUFFcEIsU0FBUyxhQUFhLENBQUMsT0FBK0I7SUFDcEQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BCLGNBQWMsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQ2hDLGlFQUFpRTtZQUNqRSxvREFBb0Q7YUFDbkQsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ3JCLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDVCxZQUFZLEVBQUUsQ0FBQTtRQUNoQixDQUFDLENBQUM7YUFDRCxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQ1osY0FBYyxHQUFHLFNBQVMsQ0FBQTtRQUM1QixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFDRCxPQUFPLGNBQWMsQ0FBQTtBQUN2QixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUksUUFBdUI7SUFDeEQsT0FBTyxLQUFLLENBQUMsR0FBRyxFQUFFO1FBQ2hCLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxHQUFHLGlCQUFpQixFQUFFLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUE7UUFDOUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTyxRQUFRLENBQUE7UUFDakIsQ0FBQztRQUVELE1BQU0sbUJBQW1CLEdBQUcsWUFBWSxDQUFBO1FBQ3hDLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FDbEIsVUFBVSxDQUFDLENBQUMsS0FBYyxFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN4QixPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNoQyxDQUFDO1lBQ0Qsb0VBQW9FO1lBQ3BFLDJDQUEyQztZQUMzQyxNQUFNLFNBQVMsR0FBRyxDQUFDLFlBQVksS0FBSyxtQkFBbUIsQ0FBQztnQkFDdEQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0JBQ25CLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUE7WUFFMUIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUN6QixVQUFVLENBQUMsQ0FBQyxZQUFxQixFQUFFLEVBQUU7Z0JBQ25DLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUN0QyxLQUF3QyxDQUFDLGdCQUFnQixHQUFHLFlBQVksQ0FBQTtnQkFDM0UsQ0FBQztnQkFDRCxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNoQyxDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQzFCLENBQUE7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmZXIsIGZyb20sIE9ic2VydmFibGUsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnXG5pbXBvcnQgeyBCWFJlc3RTZXR0aW5ncyB9IGZyb20gJy4uLy4uL3NldHRpbmdzJ1xuaW1wb3J0IHsgcGFyc2VCWFJlc3RFcnJvckJvZHkgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvZXJyb3JzJ1xuXG4vKipcbiAqINCa0L7QtNGLINC+0YjQuNCx0L7QuiBCaXRyaXgsINC60L7RgtC+0YDRi9C1INC70LXRh9Cw0YLRgdGPINC/0YDQvtC00LvQtdC90LjQtdC8INGC0L7QutC10L3QsC4gYGV4cGlyZWRfdG9rZW5gIOKAlFxuICog0LXQtNC40L3RgdGC0LLQtdC90L3Ri9C5INGB0LjRgdGC0LXQvNC90YvQuSDQutC+0LQsINC00LvRjyDQutC+0YLQvtGA0L7Qs9C+INC00L7QutGD0LzQtdC90YLQsNGG0LjRjyBCaXRyaXgyNCDRgdC+0LLQtdGC0YPQtdGCXG4gKiBcItC+0LHQvdC+0LLQuNGC0Ywg0YLQvtC60LXQvdGLINC4INC/0L7QstGC0L7RgNC40YLRjCDQstGL0LfQvtCyXCIuIGBpbnZhbGlkX3Rva2VuYCDQsiDRgdC/0LjRgdC60LUg0YHQuNGB0YLQtdC80L3Ri9GFXG4gKiDQvtGI0LjQsdC+0Log0LTQvtC60YPQvNC10L3RgtCw0YbQuNC4INC90LXRgiwg0L3QviDRgtCw0Log0LbQtSDRgdGH0LjRgtCw0LXRgiDQvtGE0LjRhtC40LDQu9GM0L3Ri9C5IGBAYml0cml4MjQvYjI0anNzZGtgLlxuICpcbiAqINCe0YHRgtCw0LvRjNC90YvQtSDRgdC40YHRgtC10LzQvdGL0LUg0L7RiNC40LHQutC4INGC0L7QttC1INC/0YDQuNGF0L7QtNGP0YIg0YHQviDRgdGC0LDRgtGD0YHQvtC8IDQwMVxuICogKGBpbnN1ZmZpY2llbnRfc2NvcGVgLCBgTk9fQVVUSF9GT1VORGAsIGBBQ0NFU1NfREVOSUVEYCxcbiAqIGBJTlZBTElEX0NSRURFTlRJQUxTYCwgYHVzZXJfYWNjZXNzX2Vycm9yYCwgLi4uKSwg0L3QviDQvdC+0LLRi9C5INGC0L7QutC10L0g0LjRhVxuICog0L3QtSDQuNGB0L/RgNCw0LLQuNGCIOKAlCDQv9C+0Y3RgtC+0LzRgyDRgdC80L7RgtGA0LjQvCDQvdCwINC60L7QtCwg0LAg0L3QtSDRgtC+0LvRjNC60L4g0L3QsCDRgdGC0LDRgtGD0YEuXG4gKi9cbmNvbnN0IEFVVEhfRVJST1JfQ09ERVMgPSBbJ2V4cGlyZWRfdG9rZW4nLCAnaW52YWxpZF90b2tlbiddXG5cbi8qKlxuICog0KPRgdC70L7QstC40LUg0L/RgNC+0LTQu9C10L3QuNGPINC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOIChgQlhSZXN0U2V0dGluZ3MuYXV0aC5pc0F1dGhFcnJvcmApOlxuICogLSDQvtGC0LLQtdGCINGBINC+0YjQuNCx0LrQvtC5IEJpdHJpeCBgZXhwaXJlZF90b2tlbmAg0LjQu9C4IGBpbnZhbGlkX3Rva2VuYCDigJQg0L/RgNC4INC70Y7QsdC+0Lwg0YHRgtCw0YLRg9GB0LU7XG4gKiAtINC+0YLQstC10YIgNDAxINCx0LXQtyDRgtC10LvQsCDQvtGI0LjQsdC60LggQml0cml4IOKAlCDQvdCw0L/RgNC40LzQtdGALCDQv9GD0YHRgtC+0Lkg0L7RgtCy0LXRgiDRgdCy0L7QtdCz0L5cbiAqICAg0LHRjdC60LXQvdC0LdC/0YDQvtC60YHQuCwg0YMg0LrQvtGC0L7RgNC+0LPQviDQvdC10YIg0LTQtdC50YHRgtCy0YPRjtGJ0LXQs9C+INGC0L7QutC10L3QsC5cbiAqXG4gKiDQntGC0LLQtdGCIDQwMSDRgSDQtNGA0YPQs9C40Lwg0LrQvtC00L7QvCBCaXRyaXgg0L7RiNC40LHQutC+0Lkg0LDQstGC0L7RgNC40LfQsNGG0LjQuCDQvdC1INGB0YfQuNGC0LDQtdGC0YHRjy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQlhSZXN0QXV0aEVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghYXhpb3MuaXNBeGlvc0Vycm9yKGVycm9yKSB8fCAhZXJyb3IucmVzcG9uc2UpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBwYXJzZWQgPSBwYXJzZUJYUmVzdEVycm9yQm9keShlcnJvci5yZXNwb25zZS5kYXRhKVxuICBpZiAocGFyc2VkKSB7XG4gICAgcmV0dXJuIEFVVEhfRVJST1JfQ09ERVMuaW5jbHVkZXMocGFyc2VkLmVycm9yKVxuICB9XG4gIHJldHVybiBlcnJvci5yZXNwb25zZS5zdGF0dXMgPT09IDQwMVxufVxuXG4vLyDQntCx0YnQtdC1INC90LAg0LLRgdGOINCx0LjQsdC70LjQvtGC0LXQutGDINGB0L7RgdGC0L7Rj9C90LjQtSDQv9GA0L7QtNC70LXQvdC40Y8g4oCUINC60LDQuiDQuCDRgdCw0LzQuCBCWFJlc3RTZXR0aW5ncy5cbi8vIHBlbmRpbmdSZWZyZXNoIOKAlCDQuNC00YPRidC10LUg0YHQtdC50YfQsNGBINC/0YDQvtC00LvQtdC90LjQtSwg0LXQs9C+INC20LTRg9GCINCy0YHQtSDRg9C/0LDQstGI0LjQtSDQt9Cw0L/RgNC+0YHRiztcbi8vIHJlZnJlc2hDb3VudCDigJQg0YHQutC+0LvRjNC60L4g0L/RgNC+0LTQu9C10L3QuNC5INGD0LbQtSDQt9Cw0LLQtdGA0YjQuNC70L7RgdGMINGD0YHQv9C10YjQvdC+LlxubGV0IHBlbmRpbmdSZWZyZXNoOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkXG5sZXQgcmVmcmVzaENvdW50ID0gMFxuXG5mdW5jdGlvbiBzaGFyZWRSZWZyZXNoKHJlZnJlc2g6ICgpID0+IFByb21pc2U8dW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFwZW5kaW5nUmVmcmVzaCkge1xuICAgIHBlbmRpbmdSZWZyZXNoID0gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgIC8vINCn0LXRgNC10LcgdGhlbiwg0YfRgtC+0LHRiyDRgdC40L3RhdGA0L7QvdC90L7QtSDQuNGB0LrQu9GO0YfQtdC90LjQtSDQsiByZWZyZXNoKCkg0YLQvtC20LUg0YHRgtCw0LvQvlxuICAgICAgLy8g0L7RgtC60LvQvtC90ZHQvdC90YvQvCDQv9GA0L7QvNC40YHQvtC8LCDQsCDQvdC1INCy0YvQu9C10YLQtdC70L4g0LjQtyBjYXRjaEVycm9yXG4gICAgICAudGhlbigoKSA9PiByZWZyZXNoKCkpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHJlZnJlc2hDb3VudCsrXG4gICAgICB9KVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBwZW5kaW5nUmVmcmVzaCA9IHVuZGVmaW5lZFxuICAgICAgfSlcbiAgfVxuICByZXR1cm4gcGVuZGluZ1JlZnJlc2hcbn1cblxuLyoqXG4gKiDQn9C+0LLRgtC+0YAg0LfQsNC/0YDQvtGB0LAg0L/QvtGB0LvQtSDQv9GA0L7QtNC70LXQvdC40Y8g0LDQstGC0L7RgNC40LfQsNGG0LjQuCAoYEJYUmVzdFNldHRpbmdzLmF1dGgucmVmcmVzaGApLlxuICpcbiAqIGByZXF1ZXN0JGAg0LTQvtC70LbQtdC9INCx0YvRgtGMIFwi0YXQvtC70L7QtNC90YvQvFwiINC4INGH0LjRgtCw0YLRjCDQvdCw0YHRgtGA0L7QudC60Lgg0L/RgNC4INC/0L7QtNC/0LjRgdC60LUgKNC60LDQulxuICogYGRlZmVyKClgINCyIEh0dHBCWFNlcnZpY2VzKTog0L/QvtCy0YLQvtGAIOKAlCDRjdGC0L4g0L/QvtCy0YLQvtGA0L3QsNGPINC/0L7QtNC/0LjRgdC60LAsINC/0L7RjdGC0L7QvNGDXG4gKiDRgtC+0LrQtdC9LCDQsNC00YDQtdGBINC4INC30LDQs9C+0LvQvtCy0LrQuCDQsdC10YDRg9GC0YHRjyDRg9C20LUg0L3QvtCy0YvQtS4g0J3QsCDQstGC0L7RgNC+0Lkg0L/QvtC/0YvRgtC60LUg0L7RiNC40LHQutCwINC90LVcbiAqINC/0LXRgNC10YXQstCw0YLRi9Cy0LDQtdGC0YHRjyDigJQg0LfQsNC/0YDQvtGBINC/0L7QstGC0L7RgNGP0LXRgtGB0Y8g0L3QtSDQsdC+0LvRjNGI0LUg0L7QtNC90L7Qs9C+INGA0LDQt9CwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aEF1dGhSZWZyZXNoPFQ+KHJlcXVlc3QkOiBPYnNlcnZhYmxlPFQ+KTogT2JzZXJ2YWJsZTxUPiB7XG4gIHJldHVybiBkZWZlcigoKSA9PiB7XG4gICAgY29uc3QgeyByZWZyZXNoLCBpc0F1dGhFcnJvciA9IGlzQlhSZXN0QXV0aEVycm9yIH0gPSBCWFJlc3RTZXR0aW5ncy52YWx1ZS5hdXRoXG4gICAgaWYgKCFyZWZyZXNoKSB7XG4gICAgICByZXR1cm4gcmVxdWVzdCRcbiAgICB9XG5cbiAgICBjb25zdCByZWZyZXNoQ291bnRBdFN0YXJ0ID0gcmVmcmVzaENvdW50XG4gICAgcmV0dXJuIHJlcXVlc3QkLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAoIWlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKVxuICAgICAgICB9XG4gICAgICAgIC8vINCf0L7QutCwINGN0YLQvtGCINC30LDQv9GA0L7RgSDQsdGL0Lsg0LIg0L/Rg9GC0LgsINGC0L7QutC10L0g0YPQttC1INC/0YDQvtC00LvQuNC70Lgg0L/QviDQvtGI0LjQsdC60LUg0LTRgNGD0LPQvtCz0L5cbiAgICAgICAgLy8g0LfQsNC/0YDQvtGB0LAg4oCUINC/0L7QstGC0L7RgNGP0LXQvCDQsdC10Lcg0L3QvtCy0L7Qs9C+INC/0YDQvtC00LvQtdC90LjRj1xuICAgICAgICBjb25zdCByZWZyZXNoZWQgPSAocmVmcmVzaENvdW50ICE9PSByZWZyZXNoQ291bnRBdFN0YXJ0KVxuICAgICAgICAgID8gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICA6IHNoYXJlZFJlZnJlc2gocmVmcmVzaClcblxuICAgICAgICByZXR1cm4gZnJvbShyZWZyZXNoZWQpLnBpcGUoXG4gICAgICAgICAgY2F0Y2hFcnJvcigocmVmcmVzaEVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAoZXJyb3IgYXMgeyBhdXRoUmVmcmVzaEVycm9yPzogdW5rbm93biB9KS5hdXRoUmVmcmVzaEVycm9yID0gcmVmcmVzaEVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcilcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gcmVxdWVzdCQpXG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgKVxuICB9KVxufVxuIl19
|