bx-rest 1.3.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.
@@ -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.
@@ -78,7 +79,13 @@ export class HttpBXServices extends HttpServices {
78
79
  // геттером в SessionKeyServices настройки читались бы в момент вызова
79
80
  // .res(), а не в момент subscribe()/firstValueFrom(), что и обещано
80
81
  // в README как поведение "ленивого" REST-вызова.
81
- return defer(() => {
82
+ //
83
+ // withAuthRefresh() повторяет запрос после BXRestSettings.auth.refresh —
84
+ // повторной подпиской на этот же defer(), поэтому повтор заново читает
85
+ // токен, адрес и заголовки. Через httpPost/httpGet идут все запросы
86
+ // библиотеки (post/get, batch, все виды Navvy-запросов), так что повтор
87
+ // встроен только здесь.
88
+ return withAuthRefresh(defer(() => {
82
89
  const paramsClone = clone(params);
83
90
  const key = this.session.getKeyAuth();
84
91
  const auth = this.session.getAuthParams();
@@ -108,14 +115,15 @@ export class HttpBXServices extends HttpServices {
108
115
  headers: this.buildHeaders(headers, { 'Content-Type': 'application/json' }),
109
116
  }).then((response) => response.data));
110
117
  }));
111
- });
118
+ }));
112
119
  }
113
120
  httpGet(url, params = {}, settings, headers) {
114
121
  // Та же причина, что и у httpPost выше: откладываем чтение BXRestSettings
115
122
  // до подписки, чтобы `get()` вёл себя так же "лениво", как и `post()`
116
123
  // (симметрия, которой не было до этого — GET резолвил настройки в момент
117
- // вызова, а не в момент subscribe()).
118
- return defer(() => {
124
+ // вызова, а не в момент subscribe()). Повтор после продления
125
+ // авторизации — как в httpPost.
126
+ return withAuthRefresh(defer(() => {
119
127
  const paramsClone = clone(params);
120
128
  const auth = this.session.getAuthParams();
121
129
  const checkIsOn = this.session.getCheckAuthParamsIsOn();
@@ -136,7 +144,7 @@ export class HttpBXServices extends HttpServices {
136
144
  headers: this.buildHeaders(headers),
137
145
  }).then((response) => response.data));
138
146
  }));
139
- });
147
+ }));
140
148
  }
141
149
  /**
142
150
  * Заголовки запроса: `BXRestSettings.headers`, поверх них — заголовки
@@ -154,4 +162,4 @@ export class HttpBXServices extends HttpServices {
154
162
  return arr.join('.');
155
163
  }
156
164
  }
157
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSHR0cEJYLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYngtcmVzdC9zcmMvc2VydmljZXMvaHR0cC9IdHRwQlgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNwRSxPQUFPLEtBQUssTUFBTSxZQUFZLENBQUE7QUFDOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUtyQyxPQUFPLE9BQU8sTUFBTSxpQkFBaUIsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUMxRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDMUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQzVDLE9BQU8sRUFBRSxxQkFBcUIsSUFBSSxxQkFBcUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBR3RHLE1BQU0sT0FBTyxjQUFlLFNBQVEsWUFBWTtJQUU5Qzs7OztPQUlHO0lBQ0gsTUFBTSxDQUFPLEtBQXlEO1FBRXBFLElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQVMsSUFBSSxDQUFDLFlBQVksQ0FBSSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQSxDQUFDLG1CQUFtQjtRQUNuQyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUEsQ0FBQywyQ0FBMkM7UUFDN0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQy9ELFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENB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LEdBQUcsT0FBTyxJQUFJLFdBQVcsRUFBRSxDQUFBO2dCQUU1QyxPQUFPLElBQUksQ0FDVCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBSSxRQUFRLEVBQUU7b0JBQ2xDLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztpQkFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUNyQyxDQUFBO1lBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQTtRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssWUFBWSxDQUFDLE9BQWdDLEVBQUUsV0FBbUMsRUFBRTtRQUMxRixPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUE7SUFDbEUsQ0FBQztJQUVELHFCQUFxQixDQUFDLE1BQWU7UUFDbkMsT0FBTyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQWE7UUFDekIsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3RCLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IsIGZvcmtKb2luLCBmcm9tLCBkZWZlciB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCBjbG9uZSBmcm9tICdqdXN0LWNsb25lJ1xyXG5pbXBvcnQgeyBIdHRwU2VydmljZXMgfSBmcm9tICcuL2h0dHAnXHJcbmltcG9ydCB7XHJcbiAgaUJhdGNoUmVxdWVzdEFuc3dlciwgaUJhdGNoUmVxdWVzdFBhcmFtLCBpQmF0Y2hSZXF1ZXN0UGFyYW1BcnIsIGlCYXRjaFJlcXVlc3RQYXJhbUh0dHAsIGtleUJhdGNoLFxyXG59IGZyb20gJy4uLy4uL3R5cGlmaWNhdGlvbi9yZXN0L2JhdGNoL2JhdGNoUmVxdWVzdFBhcmFtJ1xyXG5pbXBvcnQgeyBpQlhSZXN0QW5zd2VyIH0gZnJvbSAnLi4vLi4vdHlwaWZpY2F0aW9uL3Jlc3QvYmFzZS9hbnN3ZXInXHJcbmltcG9ydCBmbGF0dGVuIGZyb20gJ2p1c3QtZmxhdHRlbi1pdCdcclxuaW1wb3J0IHsgaW5zdGFuY2VPZmlCWFJlc3RBbnN3ZXJTdWNjZXNzIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zL21hcFJlc3VsdCdcclxuaW1wb3J0IHsgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXHJcbmltcG9ydCB7IHByZXBhcmVCYXNlQWRkcmVzcyB9IGZyb20gJy4uL2Jhc2UnXHJcbmltcG9ydCB7IHNlcmlhbGl6ZUJpdHJpeFBhcmFtcyBhcyBzdHJpbmdpZnlCaXRyaXhQYXJhbXMgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvc2VyaWFsaXplQml0cml4UGFyYW1zJ1xyXG5pbXBvcnQgeyBpSHR0cFBhcmFtU2V0dGluZ3MgfSBmcm9tICcuLi8uLi90eXBpZmljYXRpb24vcmVzdC9zZXR0aW5ncydcclxuXHJcbmV4cG9ydCBjbGFzcyBIdHRwQlhTZXJ2aWNlcyBleHRlbmRzIEh0dHBTZXJ2aWNlcyB7XHJcblxyXG4gIC8qKlxyXG4gICAqINCd0LUg0YHRh9C40YLQsNC50YLQtSDRjdGC0L7RgiDQvNC10YLQvtC0INC+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+0LLQsC5cclxuICAgIHJldHVybiBkZWZlcigoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcmFtc0Nsb25lID0gY2xvbmUocGFyYW1zKVxyXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLnNlc3Npb24uZ2V0S2V5QXV0aCgpXHJcbiAgICAgIGNvbnN0IGF1dGggPSB0aGlzLnNlc3Npb24uZ2V0QXV0aFBhcmFtcygpXHJcbiAgICAgIGNvbnN0IGNoZWNrSXNPbiA9IHRoaXMuc2Vzc2lvbi5nZXRDaGVja0F1dGhQYXJhbXNJc09uKClcclxuXHJcbiAgICAgIGlmIChjaGVja0lzT24pIHtcclxuICAgICAgICBpZiAoIWF1dGgpIHtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IHRoaXMuc2Vzc2lvbi5nZXRBdXRoRXJyb3IoJ3Bvc3QnKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChrZXkgIT09ICdPQXV0aDInKSB7XHJcbiAgICAgICAgICBwYXJhbXNDbG9uZVtrZXldID0gYXV0aFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRCYXNlVXJsKCkucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKGJhc2VVcmwpID0+IHtcclxuICAgICAgICAgIGlmICghYmFzZVVybCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiB0aGlzLnNlc3Npb24uZ2V0QmFzZVVybEVycm9yKCdwb3N0JykpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgZnVsbFVybCA9IHByZXBhcmVCYXNlQWRkcmVzcyhiYXNlVXJsKSArIHVybFxyXG5cclxuICAgICAgICAgIGlmIChrZXkgPT09ICdzZXNzaWQnKSB7XHJcbiAgICAgICAgICAgIC8vINCf0YDQtdC+0LHRgNCw0LfRg9C10Lwg0L/QsNGA0LDQvNC10YLRgNGLINCyINGE0L7RgNC80LDRgiB4LXd3dy1mb3JtLXVybGVuY29kZWRcclxuICAgICAgICAgICAgY29uc3QgYm9keVN0cmluZyA9IHRoaXMuc2VyaWFsaXplQml0cml4UGFyYW1zKHBhcmFtc0Nsb25lKVxyXG4gICAgICAgICAgICByZXR1cm4gZnJvbShcclxuICAgICAgICAgICAgICB0aGlzLmF4aW9zSW5zdGFuY2UucG9zdDxUPihmdWxsVXJsLCBib2R5U3RyaW5nLCB7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmJ1aWxkSGVhZGVycyhoZWFkZXJzLCB7J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnfSksXHJcbiAgICAgICAgICAgICAgfSkudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmRhdGEpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZXR1cm4gZnJvbShcclxuICAgICAgICAgICAgdGhpcy5heGlvc0luc3RhbmNlLnBvc3Q8VD4oZnVsbFVybCwgcGFyYW1zQ2xvbmUsXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLnNlc3Npb24uZ2V0V2l0aENyZWRlbnRpYWxzKCksXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmJ1aWxkSGVhZGVycyhoZWFkZXJzLCB7J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ30pLFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKS50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuZGF0YSlcclxuICAgICAgICAgIClcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgaHR0cEdldDxUPihcclxuICAgIHVybDogc3RyaW5nLFxyXG4gICAgcGFyYW1zOiBhbnkgPSB7fSxcclxuICAgIHNldHRpbmdzPzogaUh0dHBQYXJhbVNldHRpbmdzLFxyXG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cclxuICApOiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQ+IHtcclxuICAgIC8vINCi0LAg0LbQtSDQv9GA0LjRh9C40L3QsCwg0YfRgtC+INC4INGDIGh0dHBQb3N0INCy0YvRiNC1OiDQvtGC0LrQu9Cw0LTRi9Cy0LDQtdC8INGH0YLQtdC90LjQtSBCWFJlc3RTZXR0aW5nc1xyXG4gICAgLy8g0LTQviDQv9C+0LTQv9C40YHQutC4LCDRh9GC0L7QsdGLIGBnZXQoKWAg0LLRkdC7INGB0LXQsdGPINGC0LDQuiDQttC1IFwi0LvQtdC90LjQstC+XCIsINC60LDQuiDQuCBgcG9zdCgpYFxyXG4gICAgLy8gKNGB0LjQvNC80LXRgtGA0LjRjywg0LrQvtGC0L7RgNC+0Lkg0L3QtSDQsdGL0LvQviDQtNC+INGN0YLQvtCz0L4g4oCUIEdFVCDRgNC10LfQvtC70LLQuNC7INC90LDRgdGC0YDQvtC50LrQuCDQsiDQvNC+0LzQtdC90YJcclxuICAgIC8vINCy0YvQt9C+0LLQsCwg0LAg0L3QtSDQsiDQvNC+0LzQtdC90YIgc3Vic2NyaWJlKCkpLlxyXG4gICAgcmV0dXJuIGRlZmVyKCgpID0+IHtcclxuICAgICAgY29uc3QgcGFyYW1zQ2xvbmUgPSBjbG9uZShwYXJhbXMpXHJcbiAgICAgIGNvbnN0IGF1dGggPSB0aGlzLnNlc3Npb24uZ2V0QXV0aFBhcmFtcygpXHJcbiAgICAgIGNvbnN0IGNoZWNrSXNPbiA9IHRoaXMuc2Vzc2lvbi5nZXRDaGVja0F1dGhQYXJhbXNJc09uKClcclxuXHJcbiAgICAgIGlmIChjaGVja0lzT24pIHtcclxuICAgICAgICBpZiAoIWF1dGgpIHtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IHRoaXMuc2Vzc2lvbi5nZXRBdXRoRXJyb3IoJ2dldCcpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcGFyYW1zQ2xvbmVbdGhpcy5zZXNzaW9uLmdldEtleUF1dGgoKV0gPSBhdXRoXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uZ2V0QmFzZVVybCgpLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChiYXNlVXJsKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWJhc2VVcmwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gdGhpcy5zZXNzaW9uLmdldEJhc2VVcmxFcnJvcignZ2V0JykpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgZnVsbFVybCA9IHByZXBhcmVCYXNlQWRkcmVzcyhiYXNlVXJsKSArIHVybFxyXG4gICAgICAgICAgY29uc3QgcXVlcnlTdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcmFtc0Nsb25lKS50b1N0cmluZygpXHJcbiAgICAgICAgICBjb25zdCBmaW5hbFVybCA9IGAke2Z1bGxVcmx9PyR7cXVlcnlTdHJpbmd9YFxyXG5cclxuICAgICAgICAgIHJldHVybiBmcm9tKFxyXG4gICAgICAgICAgICB0aGlzLmF4aW9zSW5zdGFuY2UuZ2V0PFQ+KGZpbmFsVXJsLCB7XHJcbiAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5idWlsZEhlYWRlcnMoaGVhZGVycyksXHJcbiAgICAgICAgICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5kYXRhKVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDQl9Cw0LPQvtC70L7QstC60Lgg0LfQsNC/0YDQvtGB0LA6IGBCWFJlc3RTZXR0aW5ncy5oZWFkZXJzYCwg0L/QvtCy0LXRgNGFINC90LjRhSDigJQg0LfQsNCz0L7Qu9C+0LLQutC4XHJcbiAgICog0LrQvtC90LrRgNC10YLQvdC+0LPQviDQt9Cw0L/RgNC+0YHQsCwg0L/QvtCy0LXRgNGFINCy0YHQtdCz0L4g4oCUIGByZXF1aXJlZGAuINCSIGByZXF1aXJlZGAg0LjQtNGR0YJcclxuICAgKiBgQ29udGVudC1UeXBlYDog0L7RgiDQvdC10LPQviDQt9Cw0LLQuNGB0LjRgiwg0LrQsNC6INGB0LXRgNCy0LXRgCDRgNCw0LfQsdC10YDRkdGCINGC0LXQu9C+LCDQv9C+0Y3RgtC+0LzRg1xyXG4gICAqINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjNGB0LrQuNC1INC30LDQs9C+0LvQvtCy0LrQuCDQtdCz0L4g0L3QtSDQv9C10YDQtdCx0LjQstCw0Y7Rgi5cclxuICAgKi9cclxuICBwcml2YXRlIGJ1aWxkSGVhZGVycyhoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgcmVxdWlyZWQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSkge1xyXG4gICAgcmV0dXJuIHsgLi4udGhpcy5zZXNzaW9uLmdldEhlYWRlcnMoKSwgLi4uaGVhZGVycywgLi4ucmVxdWlyZWQgfVxyXG4gIH1cclxuXHJcbiAgc2VyaWFsaXplQml0cml4UGFyYW1zKHBhcmFtczogdW5rbm93bik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gc3RyaW5naWZ5Qml0cml4UGFyYW1zKHBhcmFtcylcclxuICB9XHJcblxyXG4gIGdldE5hbWVNZXRob2QoYXJyOiBzdHJpbmdbXSkge1xyXG4gICAgcmV0dXJuIGFyci5qb2luKCcuJylcclxuICB9XHJcblxyXG59XHJcblxyXG4iXX0=
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