devextreme-angular
Version:
Angular UI and visualization components based on DevExtreme widgets
217 lines • 34.1 kB
JavaScript
/*!
* devextreme-angular
* Version: 24.2.6
* Build date: Mon Mar 17 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file in the root of the project for details.
*
* https://github.com/DevExpress/devextreme-angular
*/
/* eslint-disable @typescript-eslint/no-floating-promises */
import { HttpEventType, HttpParams, } from '@angular/common/http';
import { throwError, Subject } from 'rxjs';
import { takeUntil, timeoutWith } from 'rxjs/operators';
import { Deferred } from 'devextreme/core/utils/deferred';
import { isDefined } from 'devextreme/core/utils/type';
import { getWindow } from 'devextreme/core/utils/window';
import { isCrossDomain, evalCrossDomainScript, getRequestOptions, getJsonpCallbackName, getRequestHeaders as getAjaxRequestHeaders, getAcceptHeader, getMethod, evalScript, } from 'devextreme/core/utils/ajax_utils';
const PARSER_ERROR = 'parsererror';
const SUCCESS = 'success';
const ERROR = 'error';
const NO_CONTENT = 'nocontent';
const TIMEOUT = 'timeout';
const STATUS_ABORT = 0;
const CONTENT_TYPE = 'Content-Type';
const URLENCODED = 'application/x-www-form-urlencoded';
function assignResponseProps(xhrSurrogate, response) {
const getResponseHeader = (name) => response.headers.get(name);
function makeResponseText() {
const body = 'error' in response ? response.error : response.body;
if (typeof body !== 'string' || String(getResponseHeader(CONTENT_TYPE)).startsWith('application/json')) {
return JSON.stringify(body);
}
return body;
}
Object.assign(xhrSurrogate, {
status: response.status,
statusText: response.statusText,
getResponseHeader,
responseText: makeResponseText(),
});
return xhrSurrogate;
}
function isGetMethod(options) {
return getMethod(options) === 'GET';
}
function isCacheNeed(options) {
if (options.cache === undefined) {
return !(isUsedScript(options) || isUsedJSONP(options));
}
return options.cache;
}
function isUsedScript(options) {
return options.dataType === 'script';
}
function isUsedJSONP(options) {
return options.dataType === 'jsonp';
}
function getRequestHeaders(options) {
const headers = getAjaxRequestHeaders(options);
const { upload } = options;
if (!headers.Accept) {
headers.Accept = getAcceptHeader(options);
}
if (!upload && !isGetMethod(options) && !headers[CONTENT_TYPE]) {
headers[CONTENT_TYPE] = options.contentType || `${URLENCODED};charset=utf-8`;
}
return Object.keys(headers).reduce((acc, key) => {
if (isDefined(headers[key])) {
acc[key] = headers[key];
}
return acc;
}, {});
}
function rejectIfAborted(deferred, xhrSurrogate, callback) {
if (xhrSurrogate.aborted) {
deferred.reject({ status: STATUS_ABORT, statusText: 'aborted', ok: false });
callback?.();
}
}
function getJsonpParameters(options) {
const patchedOptions = { ...options };
const callbackName = getJsonpCallbackName(patchedOptions);
return { callbackName, data: patchedOptions.data };
}
function addJsonpCallback(callbackName, deferred, xhrSurrogate) {
getWindow()[callbackName] = (data) => deferred.resolve(data, SUCCESS, xhrSurrogate);
}
function sendRequestByScript(url, deferred, xhrSurrogate) {
evalCrossDomainScript(url).then(() => deferred.resolve(null, SUCCESS, xhrSurrogate), () => deferred.reject(xhrSurrogate, ERROR));
}
function getRequestCallbacks(options, deferred, xhrSurrogate) {
return {
next(response) {
if (isUsedJSONP(options)) {
return options.crossDomain
? deferred.resolve(response, 'success', assignResponseProps(xhrSurrogate, response))
: evalScript(response.body);
}
if (isUsedScript(options)) {
evalScript(response.body);
}
return deferred.resolve(response.body, response.body ? 'success' : NO_CONTENT, assignResponseProps(xhrSurrogate, response));
},
error(error) {
error = error && typeof error === 'object' ? error : { error };
let errorStatus = error?.statusText === TIMEOUT ? TIMEOUT : 'error';
errorStatus = options.dataType === 'json' && error?.message?.includes?.('parsing')
? PARSER_ERROR
: errorStatus;
return deferred.reject(assignResponseProps(xhrSurrogate, { status: 400, ...error }), errorStatus, error);
},
complete() {
rejectIfAborted(deferred, xhrSurrogate);
},
};
}
function getUploadCallbacks(options, deferred, xhrSurrogate) {
let total = 0;
let isUploadStarted = false;
return {
next: (event) => {
if (!isUploadStarted
&& [HttpEventType.UploadProgress, HttpEventType.Sent].includes(event.type)) {
options.upload.onloadstart?.(event);
isUploadStarted = true;
}
if (event.type === HttpEventType.UploadProgress) {
total += event.loaded;
options.upload.onprogress?.({ ...event, total });
}
else if (event.type === HttpEventType.Response) {
xhrSurrogate.status = event.status;
xhrSurrogate.statusText = event.statusText;
xhrSurrogate.response = event;
const result = options?.dataType === 'json' && typeof event.body === 'object'
? event.body
: xhrSurrogate;
return deferred.resolve(result, SUCCESS);
}
return null;
},
error(error) {
error = error && typeof error === 'object' ? error : { error };
return deferred.reject(assignResponseProps(xhrSurrogate, { status: 400, ...error }), error.status, error);
},
complete() {
rejectIfAborted(deferred, xhrSurrogate, () => {
options.upload?.onabort?.(xhrSurrogate);
});
},
};
}
export const sendRequestFactory = (httpClient) => (options) => {
const abort$ = new Subject();
const deferred = Deferred();
const result = deferred.promise();
const isGet = isGetMethod(options);
const isJSONP = isUsedJSONP(options);
const isScript = isUsedScript(options);
options.crossDomain = isCrossDomain(options.url);
options.cache = isCacheNeed(options);
const headers = getRequestHeaders(options);
const xhrSurrogate = {
type: 'XMLHttpRequestSurrogate',
aborted: false,
abort() {
this.aborted = true;
abort$.next();
},
};
result.abort = () => xhrSurrogate.abort();
if (!options.crossDomain && isJSONP) {
const { callbackName, data } = getJsonpParameters(options);
options.data = { ...options.data, ...data };
addJsonpCallback(callbackName, deferred, xhrSurrogate);
}
const { url, parameters: data } = getRequestOptions(options, headers);
const { upload, beforeSend, xhrFields } = options;
beforeSend?.(xhrSurrogate);
if (options.crossDomain && isScript && !xhrSurrogate.aborted) {
sendRequestByScript(url, deferred, xhrSurrogate);
return result;
}
if (options.cache === false && isGet && data) {
data._ = Date.now() + 1;
}
const makeBody = () => (!upload && typeof data === 'object' && headers[CONTENT_TYPE].indexOf(URLENCODED) === 0
? Object.keys(data).reduce((httpParams, key) => httpParams.set(key, data[key]), new HttpParams()).toString()
: data);
const body = isGet ? undefined : makeBody();
const params = isGet ? data : undefined;
const request = options.crossDomain && isJSONP
? httpClient.jsonp(url, options.jsonp || 'callback')
: httpClient.request(getMethod(options), url, {
params,
body,
headers,
reportProgress: true,
withCredentials: xhrFields?.withCredentials,
observe: upload ? 'events' : 'response',
responseType: options.responseType || (isScript || isJSONP ? 'text' : options.dataType),
});
const subscriptionCallbacks = upload
? getUploadCallbacks
: getRequestCallbacks;
request.pipe.apply(request, [
takeUntil(abort$),
...options.timeout
? [timeoutWith(options.timeout, throwError({ statusText: TIMEOUT, status: 0, ok: false }))]
: [],
]).subscribe(subscriptionCallbacks(options, deferred, xhrSurrogate));
return result;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWpheC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2Rpc3QvaHR0cC9hamF4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBRUgsNERBQTREO0FBQzVELE9BQU8sRUFDTyxhQUFhLEVBQUUsVUFBVSxHQUN0QyxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFFBQVEsRUFBZSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDekQsT0FBTyxFQUNMLGFBQWEsRUFDYixxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixpQkFBaUIsSUFBSSxxQkFBcUIsRUFDMUMsZUFBZSxFQUNmLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSxrQ0FBa0MsQ0FBQztBQWtCMUMsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDO0FBQ25DLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUMxQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUM7QUFDdEIsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDO0FBQy9CLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUMxQixNQUFNLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDdkIsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDO0FBQ3BDLE1BQU0sVUFBVSxHQUFHLG1DQUFtQyxDQUFDO0FBRXZELFNBQVMsbUJBQW1CLENBQUMsWUFBMEIsRUFBRSxRQUErQztJQUN0RyxNQUFNLGlCQUFpQixHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV2RSxTQUFTLGdCQUFnQjtRQUN2QixNQUFNLElBQUksR0FBRyxPQUFPLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBRWxFLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7WUFDdkcsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRTtRQUMxQixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07UUFDdkIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1FBQy9CLGlCQUFpQjtRQUNqQixZQUFZLEVBQUUsZ0JBQWdCLEVBQUU7S0FDakMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE9BQWdCO0lBQ25DLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssQ0FBQztBQUN0QyxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsT0FBZ0I7SUFDbkMsSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxPQUFnQjtJQUNwQyxPQUFPLE9BQU8sQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDO0FBQ3ZDLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxPQUFnQjtJQUNuQyxPQUFPLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDO0FBQ3RDLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLE9BQWdCO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFFM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNwQixPQUFPLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQy9ELE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLEdBQUcsVUFBVSxnQkFBZ0IsQ0FBQztJQUMvRSxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUM5QyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzVCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ1QsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLFFBQXdCLEVBQUUsWUFBMEIsRUFBRSxRQUFxQjtJQUNsRyxJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN6QixRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLFFBQVEsRUFBRSxFQUFFLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsT0FBZ0I7SUFDMUMsTUFBTSxjQUFjLEdBQUcsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO0lBQ3RDLE1BQU0sWUFBWSxHQUFHLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRTFELE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNyRCxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxZQUFvQixFQUFFLFFBQXdCLEVBQUUsWUFBMEI7SUFDbEcsU0FBUyxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztBQUN0RixDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxHQUFXLEVBQUUsUUFBd0IsRUFBRSxZQUEwQjtJQUM1RixxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQzdCLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsRUFDbkQsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQzNDLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxPQUFnQixFQUFFLFFBQXdCLEVBQUUsWUFBMEI7SUFDakcsT0FBTztRQUNMLElBQUksQ0FBQyxRQUEyQjtZQUM5QixJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUN6QixPQUFPLE9BQU8sQ0FBQyxXQUFXO29CQUN4QixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDcEYsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUVELElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUIsQ0FBQztZQUVELE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FDckIsUUFBUSxDQUFDLElBQUksRUFDYixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFDdEMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUM1QyxDQUFDO1FBQ0osQ0FBQztRQUNELEtBQUssQ0FBQyxLQUF3QjtZQUM1QixLQUFLLEdBQUcsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBa0MsQ0FBQztZQUMvRixJQUFJLFdBQVcsR0FBRyxLQUFLLEVBQUUsVUFBVSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFFcEUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxRQUFRLEtBQUssTUFBTSxJQUFJLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUNoRixDQUFDLENBQUMsWUFBWTtnQkFDZCxDQUFDLENBQUMsV0FBVyxDQUFDO1lBRWhCLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUF1QixDQUFDLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hJLENBQUM7UUFDRCxRQUFRO1lBQ04sZUFBZSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMxQyxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLE9BQWdCLEVBQUUsUUFBd0IsRUFBRSxZQUEwQjtJQUNoRyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFFNUIsT0FBTztRQUNMLElBQUksRUFBRSxDQUFDLEtBQXdCLEVBQUUsRUFBRTtZQUNqQyxJQUFJLENBQUMsZUFBZTttQkFDYixDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDL0UsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDcEMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUN6QixDQUFDO1lBRUQsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDaEQsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQ3RCLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELENBQUM7aUJBQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDakQsWUFBWSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUNuQyxZQUFZLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7Z0JBQzNDLFlBQVksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO2dCQUU5QixNQUFNLE1BQU0sR0FBRyxPQUFPLEVBQUUsUUFBUSxLQUFLLE1BQU0sSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUTtvQkFDM0UsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJO29CQUNaLENBQUMsQ0FBQyxZQUFZLENBQUM7Z0JBRWpCLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELEtBQUssQ0FBQyxLQUF3QjtZQUM1QixLQUFLLEdBQUcsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBa0MsQ0FBQztZQUMvRixPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBdUIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakksQ0FBQztRQUNELFFBQVE7WUFDTixlQUFlLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUU7Z0JBQzNDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDMUMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLFVBQXNCLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBZ0IsRUFBRSxFQUFFO0lBQ2pGLE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFDbkMsTUFBTSxRQUFRLEdBQW1CLFFBQVEsRUFBRSxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQVksQ0FBQztJQUM1QyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV2QyxPQUFPLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakQsT0FBTyxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFckMsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsTUFBTSxZQUFZLEdBQWlCO1FBQ2pDLElBQUksRUFBRSx5QkFBeUI7UUFDL0IsT0FBTyxFQUFFLEtBQUs7UUFDZCxLQUFLO1lBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDcEIsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hCLENBQUM7S0FDRixDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7SUFFMUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksT0FBTyxFQUFFLENBQUM7UUFDcEMsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUzRCxPQUFPLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFFNUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsTUFBTSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUVsRCxVQUFVLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUUzQixJQUFJLE9BQU8sQ0FBQyxXQUFXLElBQUksUUFBUSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzdELG1CQUFtQixDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDakQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxLQUFLLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQzVHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FDeEIsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDbkQsSUFBSSxVQUFVLEVBQUUsQ0FDakIsQ0FBQyxRQUFRLEVBQUU7UUFDWixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFVixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUV4QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLE9BQU87UUFDNUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksVUFBVSxDQUFDO1FBQ3BELENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUNsQixTQUFTLENBQUMsT0FBTyxDQUFDLEVBQ2xCLEdBQUcsRUFDSDtZQUNFLE1BQU07WUFDTixJQUFJO1lBQ0osT0FBTztZQUNQLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLGVBQWUsRUFBRSxTQUFTLEVBQUUsZUFBZTtZQUMzQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVU7WUFDdkMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7U0FDeEYsQ0FDRixDQUFDO0lBRUosTUFBTSxxQkFBcUIsR0FBRyxNQUFNO1FBQ2xDLENBQUMsQ0FBQyxrQkFBa0I7UUFDcEIsQ0FBQyxDQUFDLG1CQUFtQixDQUFDO0lBRXhCLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtRQUMxQixTQUFTLENBQUMsTUFBTSxDQUFRO1FBQ3hCLEdBQUcsT0FBTyxDQUFDLE9BQU87WUFDaEIsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFRLENBQUM7WUFDbEcsQ0FBQyxDQUFDLEVBQUU7S0FDUCxDQUFDLENBQUMsU0FBUyxDQUNWLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQ3ZELENBQUM7SUFFRixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGRldmV4dHJlbWUtYW5ndWxhclxuICogVmVyc2lvbjogMjQuMi42XG4gKiBCdWlsZCBkYXRlOiBNb24gTWFyIDE3IDIwMjVcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTIgLSAyMDI1IERldmVsb3BlciBFeHByZXNzIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRFxuICpcbiAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXNcbiAqIG9mIHRoZSBNSVQgbGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QgZm9yIGRldGFpbHMuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL0RldkV4cHJlc3MvZGV2ZXh0cmVtZS1hbmd1bGFyXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzICovXHJcbmltcG9ydCB7XHJcbiAgSHR0cENsaWVudCwgSHR0cEV2ZW50VHlwZSwgSHR0cFBhcmFtcywgSHR0cEV2ZW50LCBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cFJlc3BvbnNlLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgdGhyb3dFcnJvciwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwsIHRpbWVvdXRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBEZWZlcnJlZCwgRGVmZXJyZWRPYmogfSBmcm9tICdkZXZleHRyZW1lL2NvcmUvdXRpbHMvZGVmZXJyZWQnO1xyXG5pbXBvcnQgeyBpc0RlZmluZWQgfSBmcm9tICdkZXZleHRyZW1lL2NvcmUvdXRpbHMvdHlwZSc7XHJcbmltcG9ydCB7IGdldFdpbmRvdyB9IGZyb20gJ2RldmV4dHJlbWUvY29yZS91dGlscy93aW5kb3cnO1xyXG5pbXBvcnQge1xyXG4gIGlzQ3Jvc3NEb21haW4sXHJcbiAgZXZhbENyb3NzRG9tYWluU2NyaXB0LFxyXG4gIGdldFJlcXVlc3RPcHRpb25zLFxyXG4gIGdldEpzb25wQ2FsbGJhY2tOYW1lLFxyXG4gIGdldFJlcXVlc3RIZWFkZXJzIGFzIGdldEFqYXhSZXF1ZXN0SGVhZGVycyxcclxuICBnZXRBY2NlcHRIZWFkZXIsXHJcbiAgZ2V0TWV0aG9kLFxyXG4gIGV2YWxTY3JpcHQsXHJcbn0gZnJvbSAnZGV2ZXh0cmVtZS9jb3JlL3V0aWxzL2FqYXhfdXRpbHMnO1xyXG5cclxudHlwZSBSZXN1bHQgPSBQcm9taXNlPGFueT4gJiB7IGFib3J0OiAoKSA9PiB2b2lkIH07XHJcbnR5cGUgRGVmZXJyZWRSZXN1bHQgPSBEZWZlcnJlZE9iajxhbnk+O1xyXG5pbnRlcmZhY2UgT3B0aW9ucyB7XHJcbiAgdXJsOiBzdHJpbmc7XHJcbiAgW2tleTogc3RyaW5nXTogYW55O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgWEhSU3Vycm9nYXRlIHtcclxuICB0eXBlPzogc3RyaW5nO1xyXG4gIGFib3J0ZWQ6IGJvb2xlYW47XHJcbiAgYWJvcnQ6ICgpID0+IHZvaWQ7XHJcbiAgcmVzcG9uc2U/OiBIdHRwUmVzcG9uc2U8b2JqZWN0PjtcclxuICBzdGF0dXM/OiBudW1iZXI7XHJcbiAgc3RhdHVzVGV4dD86IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgUEFSU0VSX0VSUk9SID0gJ3BhcnNlcmVycm9yJztcclxuY29uc3QgU1VDQ0VTUyA9ICdzdWNjZXNzJztcclxuY29uc3QgRVJST1IgPSAnZXJyb3InO1xyXG5jb25zdCBOT19DT05URU5UID0gJ25vY29udGVudCc7XHJcbmNvbnN0IFRJTUVPVVQgPSAndGltZW91dCc7XHJcbmNvbnN0IFNUQVRVU19BQk9SVCA9IDA7XHJcbmNvbnN0IENPTlRFTlRfVFlQRSA9ICdDb250ZW50LVR5cGUnO1xyXG5jb25zdCBVUkxFTkNPREVEID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XHJcblxyXG5mdW5jdGlvbiBhc3NpZ25SZXNwb25zZVByb3BzKHhoclN1cnJvZ2F0ZTogWEhSU3Vycm9nYXRlLCByZXNwb25zZTogSHR0cFJlc3BvbnNlPGFueT4gfCBIdHRwRXJyb3JSZXNwb25zZSkge1xyXG4gIGNvbnN0IGdldFJlc3BvbnNlSGVhZGVyID0gKG5hbWU6IHN0cmluZykgPT4gcmVzcG9uc2UuaGVhZGVycy5nZXQobmFtZSk7XHJcblxyXG4gIGZ1bmN0aW9uIG1ha2VSZXNwb25zZVRleHQoKSB7XHJcbiAgICBjb25zdCBib2R5ID0gJ2Vycm9yJyBpbiByZXNwb25zZSA/IHJlc3BvbnNlLmVycm9yIDogcmVzcG9uc2UuYm9keTtcclxuXHJcbiAgICBpZiAodHlwZW9mIGJvZHkgIT09ICdzdHJpbmcnIHx8IFN0cmluZyhnZXRSZXNwb25zZUhlYWRlcihDT05URU5UX1RZUEUpKS5zdGFydHNXaXRoKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcclxuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGJvZHkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBib2R5O1xyXG4gIH1cclxuXHJcbiAgT2JqZWN0LmFzc2lnbih4aHJTdXJyb2dhdGUsIHtcclxuICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxyXG4gICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcclxuICAgIGdldFJlc3BvbnNlSGVhZGVyLFxyXG4gICAgcmVzcG9uc2VUZXh0OiBtYWtlUmVzcG9uc2VUZXh0KCksXHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiB4aHJTdXJyb2dhdGU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzR2V0TWV0aG9kKG9wdGlvbnM6IE9wdGlvbnMpIHtcclxuICByZXR1cm4gZ2V0TWV0aG9kKG9wdGlvbnMpID09PSAnR0VUJztcclxufVxyXG5cclxuZnVuY3Rpb24gaXNDYWNoZU5lZWQob3B0aW9uczogT3B0aW9ucykge1xyXG4gIGlmIChvcHRpb25zLmNhY2hlID09PSB1bmRlZmluZWQpIHtcclxuICAgIHJldHVybiAhKGlzVXNlZFNjcmlwdChvcHRpb25zKSB8fCBpc1VzZWRKU09OUChvcHRpb25zKSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gb3B0aW9ucy5jYWNoZTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNVc2VkU2NyaXB0KG9wdGlvbnM6IE9wdGlvbnMpIHtcclxuICByZXR1cm4gb3B0aW9ucy5kYXRhVHlwZSA9PT0gJ3NjcmlwdCc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzVXNlZEpTT05QKG9wdGlvbnM6IE9wdGlvbnMpIHtcclxuICByZXR1cm4gb3B0aW9ucy5kYXRhVHlwZSA9PT0gJ2pzb25wJztcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0UmVxdWVzdEhlYWRlcnMob3B0aW9uczogT3B0aW9ucykge1xyXG4gIGNvbnN0IGhlYWRlcnMgPSBnZXRBamF4UmVxdWVzdEhlYWRlcnMob3B0aW9ucyk7XHJcbiAgY29uc3QgeyB1cGxvYWQgfSA9IG9wdGlvbnM7XHJcblxyXG4gIGlmICghaGVhZGVycy5BY2NlcHQpIHtcclxuICAgIGhlYWRlcnMuQWNjZXB0ID0gZ2V0QWNjZXB0SGVhZGVyKG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgaWYgKCF1cGxvYWQgJiYgIWlzR2V0TWV0aG9kKG9wdGlvbnMpICYmICFoZWFkZXJzW0NPTlRFTlRfVFlQRV0pIHtcclxuICAgIGhlYWRlcnNbQ09OVEVOVF9UWVBFXSA9IG9wdGlvbnMuY29udGVudFR5cGUgfHwgYCR7VVJMRU5DT0RFRH07Y2hhcnNldD11dGYtOGA7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gT2JqZWN0LmtleXMoaGVhZGVycykucmVkdWNlKChhY2MsIGtleSkgPT4ge1xyXG4gICAgaWYgKGlzRGVmaW5lZChoZWFkZXJzW2tleV0pKSB7XHJcbiAgICAgIGFjY1trZXldID0gaGVhZGVyc1trZXldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFjYztcclxuICB9LCB7fSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlamVjdElmQWJvcnRlZChkZWZlcnJlZDogRGVmZXJyZWRSZXN1bHQsIHhoclN1cnJvZ2F0ZTogWEhSU3Vycm9nYXRlLCBjYWxsYmFjaz86ICgpID0+IHZvaWQpIHtcclxuICBpZiAoeGhyU3Vycm9nYXRlLmFib3J0ZWQpIHtcclxuICAgIGRlZmVycmVkLnJlamVjdCh7IHN0YXR1czogU1RBVFVTX0FCT1JULCBzdGF0dXNUZXh0OiAnYWJvcnRlZCcsIG9rOiBmYWxzZSB9KTtcclxuICAgIGNhbGxiYWNrPy4oKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEpzb25wUGFyYW1ldGVycyhvcHRpb25zOiBPcHRpb25zKSB7XHJcbiAgY29uc3QgcGF0Y2hlZE9wdGlvbnMgPSB7IC4uLm9wdGlvbnMgfTtcclxuICBjb25zdCBjYWxsYmFja05hbWUgPSBnZXRKc29ucENhbGxiYWNrTmFtZShwYXRjaGVkT3B0aW9ucyk7XHJcblxyXG4gIHJldHVybiB7IGNhbGxiYWNrTmFtZSwgZGF0YTogcGF0Y2hlZE9wdGlvbnMuZGF0YSB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRKc29ucENhbGxiYWNrKGNhbGxiYWNrTmFtZTogc3RyaW5nLCBkZWZlcnJlZDogRGVmZXJyZWRSZXN1bHQsIHhoclN1cnJvZ2F0ZTogWEhSU3Vycm9nYXRlKSB7XHJcbiAgZ2V0V2luZG93KClbY2FsbGJhY2tOYW1lXSA9IChkYXRhKSA9PiBkZWZlcnJlZC5yZXNvbHZlKGRhdGEsIFNVQ0NFU1MsIHhoclN1cnJvZ2F0ZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNlbmRSZXF1ZXN0QnlTY3JpcHQodXJsOiBzdHJpbmcsIGRlZmVycmVkOiBEZWZlcnJlZFJlc3VsdCwgeGhyU3Vycm9nYXRlOiBYSFJTdXJyb2dhdGUpIHtcclxuICBldmFsQ3Jvc3NEb21haW5TY3JpcHQodXJsKS50aGVuKFxyXG4gICAgKCkgPT4gZGVmZXJyZWQucmVzb2x2ZShudWxsLCBTVUNDRVNTLCB4aHJTdXJyb2dhdGUpLFxyXG4gICAgKCkgPT4gZGVmZXJyZWQucmVqZWN0KHhoclN1cnJvZ2F0ZSwgRVJST1IpLFxyXG4gICk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFJlcXVlc3RDYWxsYmFja3Mob3B0aW9uczogT3B0aW9ucywgZGVmZXJyZWQ6IERlZmVycmVkUmVzdWx0LCB4aHJTdXJyb2dhdGU6IFhIUlN1cnJvZ2F0ZSkge1xyXG4gIHJldHVybiB7XHJcbiAgICBuZXh0KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8YW55Pikge1xyXG4gICAgICBpZiAoaXNVc2VkSlNPTlAob3B0aW9ucykpIHtcclxuICAgICAgICByZXR1cm4gb3B0aW9ucy5jcm9zc0RvbWFpblxyXG4gICAgICAgICAgPyBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlLCAnc3VjY2VzcycsIGFzc2lnblJlc3BvbnNlUHJvcHMoeGhyU3Vycm9nYXRlLCByZXNwb25zZSkpXHJcbiAgICAgICAgICA6IGV2YWxTY3JpcHQocmVzcG9uc2UuYm9keSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChpc1VzZWRTY3JpcHQob3B0aW9ucykpIHtcclxuICAgICAgICBldmFsU2NyaXB0KHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZGVmZXJyZWQucmVzb2x2ZShcclxuICAgICAgICByZXNwb25zZS5ib2R5LFxyXG4gICAgICAgIHJlc3BvbnNlLmJvZHkgPyAnc3VjY2VzcycgOiBOT19DT05URU5ULFxyXG4gICAgICAgIGFzc2lnblJlc3BvbnNlUHJvcHMoeGhyU3Vycm9nYXRlLCByZXNwb25zZSksXHJcbiAgICAgICk7XHJcbiAgICB9LFxyXG4gICAgZXJyb3IoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSB7XHJcbiAgICAgIGVycm9yID0gZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyA/IGVycm9yIDogeyBlcnJvciB9IGFzIHVua25vd24gYXMgSHR0cEVycm9yUmVzcG9uc2U7XHJcbiAgICAgIGxldCBlcnJvclN0YXR1cyA9IGVycm9yPy5zdGF0dXNUZXh0ID09PSBUSU1FT1VUID8gVElNRU9VVCA6ICdlcnJvcic7XHJcblxyXG4gICAgICBlcnJvclN0YXR1cyA9IG9wdGlvbnMuZGF0YVR5cGUgPT09ICdqc29uJyAmJiBlcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXM/LigncGFyc2luZycpXHJcbiAgICAgICAgPyBQQVJTRVJfRVJST1JcclxuICAgICAgICA6IGVycm9yU3RhdHVzO1xyXG5cclxuICAgICAgcmV0dXJuIGRlZmVycmVkLnJlamVjdChhc3NpZ25SZXNwb25zZVByb3BzKHhoclN1cnJvZ2F0ZSwgeyBzdGF0dXM6IDQwMCwgLi4uZXJyb3IgfSBhcyBIdHRwRXJyb3JSZXNwb25zZSksIGVycm9yU3RhdHVzLCBlcnJvcik7XHJcbiAgICB9LFxyXG4gICAgY29tcGxldGUoKSB7XHJcbiAgICAgIHJlamVjdElmQWJvcnRlZChkZWZlcnJlZCwgeGhyU3Vycm9nYXRlKTtcclxuICAgIH0sXHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0VXBsb2FkQ2FsbGJhY2tzKG9wdGlvbnM6IE9wdGlvbnMsIGRlZmVycmVkOiBEZWZlcnJlZFJlc3VsdCwgeGhyU3Vycm9nYXRlOiBYSFJTdXJyb2dhdGUpIHtcclxuICBsZXQgdG90YWwgPSAwO1xyXG4gIGxldCBpc1VwbG9hZFN0YXJ0ZWQgPSBmYWxzZTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIG5leHQ6IChldmVudDogSHR0cEV2ZW50PE9iamVjdD4pID0+IHtcclxuICAgICAgaWYgKCFpc1VwbG9hZFN0YXJ0ZWRcclxuICAgICAgICAgICYmIFtIdHRwRXZlbnRUeXBlLlVwbG9hZFByb2dyZXNzLCBIdHRwRXZlbnRUeXBlLlNlbnRdLmluY2x1ZGVzKGV2ZW50LnR5cGUpKSB7XHJcbiAgICAgICAgb3B0aW9ucy51cGxvYWQub25sb2Fkc3RhcnQ/LihldmVudCk7XHJcbiAgICAgICAgaXNVcGxvYWRTdGFydGVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuVXBsb2FkUHJvZ3Jlc3MpIHtcclxuICAgICAgICB0b3RhbCArPSBldmVudC5sb2FkZWQ7XHJcbiAgICAgICAgb3B0aW9ucy51cGxvYWQub25wcm9ncmVzcz8uKHsgLi4uZXZlbnQsIHRvdGFsIH0pO1xyXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuUmVzcG9uc2UpIHtcclxuICAgICAgICB4aHJTdXJyb2dhdGUuc3RhdHVzID0gZXZlbnQuc3RhdHVzO1xyXG4gICAgICAgIHhoclN1cnJvZ2F0ZS5zdGF0dXNUZXh0ID0gZXZlbnQuc3RhdHVzVGV4dDtcclxuICAgICAgICB4aHJTdXJyb2dhdGUucmVzcG9uc2UgPSBldmVudDtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9ucz8uZGF0YVR5cGUgPT09ICdqc29uJyAmJiB0eXBlb2YgZXZlbnQuYm9keSA9PT0gJ29iamVjdCdcclxuICAgICAgICAgID8gZXZlbnQuYm9keVxyXG4gICAgICAgICAgOiB4aHJTdXJyb2dhdGU7XHJcblxyXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5yZXNvbHZlKHJlc3VsdCwgU1VDQ0VTUyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9LFxyXG4gICAgZXJyb3IoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSB7XHJcbiAgICAgIGVycm9yID0gZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyA/IGVycm9yIDogeyBlcnJvciB9IGFzIHVua25vd24gYXMgSHR0cEVycm9yUmVzcG9uc2U7XHJcbiAgICAgIHJldHVybiBkZWZlcnJlZC5yZWplY3QoYXNzaWduUmVzcG9uc2VQcm9wcyh4aHJTdXJyb2dhdGUsIHsgc3RhdHVzOiA0MDAsIC4uLmVycm9yIH0gYXMgSHR0cEVycm9yUmVzcG9uc2UpLCBlcnJvci5zdGF0dXMsIGVycm9yKTtcclxuICAgIH0sXHJcbiAgICBjb21wbGV0ZSgpIHtcclxuICAgICAgcmVqZWN0SWZBYm9ydGVkKGRlZmVycmVkLCB4aHJTdXJyb2dhdGUsICgpID0+IHtcclxuICAgICAgICBvcHRpb25zLnVwbG9hZD8ub25hYm9ydD8uKHhoclN1cnJvZ2F0ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2VuZFJlcXVlc3RGYWN0b3J5ID0gKGh0dHBDbGllbnQ6IEh0dHBDbGllbnQpID0+IChvcHRpb25zOiBPcHRpb25zKSA9PiB7XHJcbiAgY29uc3QgYWJvcnQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBjb25zdCBkZWZlcnJlZDogRGVmZXJyZWRSZXN1bHQgPSBEZWZlcnJlZCgpO1xyXG4gIGNvbnN0IHJlc3VsdCA9IGRlZmVycmVkLnByb21pc2UoKSBhcyBSZXN1bHQ7XHJcbiAgY29uc3QgaXNHZXQgPSBpc0dldE1ldGhvZChvcHRpb25zKTtcclxuICBjb25zdCBpc0pTT05QID0gaXNVc2VkSlNPTlAob3B0aW9ucyk7XHJcbiAgY29uc3QgaXNTY3JpcHQgPSBpc1VzZWRTY3JpcHQob3B0aW9ucyk7XHJcblxyXG4gIG9wdGlvbnMuY3Jvc3NEb21haW4gPSBpc0Nyb3NzRG9tYWluKG9wdGlvbnMudXJsKTtcclxuICBvcHRpb25zLmNhY2hlID0gaXNDYWNoZU5lZWQob3B0aW9ucyk7XHJcblxyXG4gIGNvbnN0IGhlYWRlcnMgPSBnZXRSZXF1ZXN0SGVhZGVycyhvcHRpb25zKTtcclxuICBjb25zdCB4aHJTdXJyb2dhdGU6IFhIUlN1cnJvZ2F0ZSA9IHtcclxuICAgIHR5cGU6ICdYTUxIdHRwUmVxdWVzdFN1cnJvZ2F0ZScsXHJcbiAgICBhYm9ydGVkOiBmYWxzZSxcclxuICAgIGFib3J0KCkge1xyXG4gICAgICB0aGlzLmFib3J0ZWQgPSB0cnVlO1xyXG4gICAgICBhYm9ydCQubmV4dCgpO1xyXG4gICAgfSxcclxuICB9O1xyXG5cclxuICByZXN1bHQuYWJvcnQgPSAoKSA9PiB4aHJTdXJyb2dhdGUuYWJvcnQoKTtcclxuXHJcbiAgaWYgKCFvcHRpb25zLmNyb3NzRG9tYWluICYmIGlzSlNPTlApIHtcclxuICAgIGNvbnN0IHsgY2FsbGJhY2tOYW1lLCBkYXRhIH0gPSBnZXRKc29ucFBhcmFtZXRlcnMob3B0aW9ucyk7XHJcblxyXG4gICAgb3B0aW9ucy5kYXRhID0geyAuLi5vcHRpb25zLmRhdGEsIC4uLmRhdGEgfTtcclxuXHJcbiAgICBhZGRKc29ucENhbGxiYWNrKGNhbGxiYWNrTmFtZSwgZGVmZXJyZWQsIHhoclN1cnJvZ2F0ZSk7XHJcbiAgfVxyXG5cclxuICBjb25zdCB7IHVybCwgcGFyYW1ldGVyczogZGF0YSB9ID0gZ2V0UmVxdWVzdE9wdGlvbnMob3B0aW9ucywgaGVhZGVycyk7XHJcbiAgY29uc3QgeyB1cGxvYWQsIGJlZm9yZVNlbmQsIHhockZpZWxkcyB9ID0gb3B0aW9ucztcclxuXHJcbiAgYmVmb3JlU2VuZD8uKHhoclN1cnJvZ2F0ZSk7XHJcblxyXG4gIGlmIChvcHRpb25zLmNyb3NzRG9tYWluICYmIGlzU2NyaXB0ICYmICF4aHJTdXJyb2dhdGUuYWJvcnRlZCkge1xyXG4gICAgc2VuZFJlcXVlc3RCeVNjcmlwdCh1cmwsIGRlZmVycmVkLCB4aHJTdXJyb2dhdGUpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIGlmIChvcHRpb25zLmNhY2hlID09PSBmYWxzZSAmJiBpc0dldCAmJiBkYXRhKSB7XHJcbiAgICBkYXRhLl8gPSBEYXRlLm5vdygpICsgMTtcclxuICB9XHJcblxyXG4gIGNvbnN0IG1ha2VCb2R5ID0gKCkgPT4gKCF1cGxvYWQgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmIGhlYWRlcnNbQ09OVEVOVF9UWVBFXS5pbmRleE9mKFVSTEVOQ09ERUQpID09PSAwXHJcbiAgICA/IE9iamVjdC5rZXlzKGRhdGEpLnJlZHVjZShcclxuICAgICAgKGh0dHBQYXJhbXMsIGtleSkgPT4gaHR0cFBhcmFtcy5zZXQoa2V5LCBkYXRhW2tleV0pLFxyXG4gICAgICBuZXcgSHR0cFBhcmFtcygpLFxyXG4gICAgKS50b1N0cmluZygpXHJcbiAgICA6IGRhdGEpO1xyXG5cclxuICBjb25zdCBib2R5ID0gaXNHZXQgPyB1bmRlZmluZWQgOiBtYWtlQm9keSgpO1xyXG4gIGNvbnN0IHBhcmFtcyA9IGlzR2V0ID8gZGF0YSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3QgcmVxdWVzdCA9IG9wdGlvbnMuY3Jvc3NEb21haW4gJiYgaXNKU09OUFxyXG4gICAgPyBodHRwQ2xpZW50Lmpzb25wKHVybCwgb3B0aW9ucy5qc29ucCB8fCAnY2FsbGJhY2snKVxyXG4gICAgOiBodHRwQ2xpZW50LnJlcXVlc3QoXHJcbiAgICAgIGdldE1ldGhvZChvcHRpb25zKSxcclxuICAgICAgdXJsLFxyXG4gICAgICB7XHJcbiAgICAgICAgcGFyYW1zLFxyXG4gICAgICAgIGJvZHksXHJcbiAgICAgICAgaGVhZGVycyxcclxuICAgICAgICByZXBvcnRQcm9ncmVzczogdHJ1ZSxcclxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHhockZpZWxkcz8ud2l0aENyZWRlbnRpYWxzLFxyXG4gICAgICAgIG9ic2VydmU6IHVwbG9hZCA/ICdldmVudHMnIDogJ3Jlc3BvbnNlJyxcclxuICAgICAgICByZXNwb25zZVR5cGU6IG9wdGlvbnMucmVzcG9uc2VUeXBlIHx8IChpc1NjcmlwdCB8fCBpc0pTT05QID8gJ3RleHQnIDogb3B0aW9ucy5kYXRhVHlwZSksXHJcbiAgICAgIH0sXHJcbiAgICApO1xyXG5cclxuICBjb25zdCBzdWJzY3JpcHRpb25DYWxsYmFja3MgPSB1cGxvYWRcclxuICAgID8gZ2V0VXBsb2FkQ2FsbGJhY2tzXHJcbiAgICA6IGdldFJlcXVlc3RDYWxsYmFja3M7XHJcblxyXG4gIHJlcXVlc3QucGlwZS5hcHBseShyZXF1ZXN0LCBbXHJcbiAgICB0YWtlVW50aWwoYWJvcnQkKSBhcyBhbnksXHJcbiAgICAuLi5vcHRpb25zLnRpbWVvdXRcclxuICAgICAgPyBbdGltZW91dFdpdGgob3B0aW9ucy50aW1lb3V0LCB0aHJvd0Vycm9yKHsgc3RhdHVzVGV4dDogVElNRU9VVCwgc3RhdHVzOiAwLCBvazogZmFsc2UgfSkpIGFzIGFueV1cclxuICAgICAgOiBbXSxcclxuICBdKS5zdWJzY3JpYmUoXHJcbiAgICBzdWJzY3JpcHRpb25DYWxsYmFja3Mob3B0aW9ucywgZGVmZXJyZWQsIHhoclN1cnJvZ2F0ZSksXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufTtcclxuIl19