@mgrcto/angular-odata-v401
Version:
Odata Library for Angular made with Angular CLI
210 lines • 35.7 kB
JavaScript
import { throwError } from 'rxjs';
import { catchError, map } from 'rxjs/operators';
import { HttpHeaders } from '@angular/common/http';
import { ODataExecReturnType } from './angularODataEnums';
import { ODataOperation } from './angularODataOperation';
export class ODataQuery extends ODataOperation {
constructor(typeName, config, http) {
super(typeName, config, http);
this._filter = "";
this._top = 0;
this._skip = 0;
this._search = "";
this._orderBy = [];
this._apply = [];
this._maxPerPage = 0;
this._customQueryOptions = [];
this._customQueryHeaders = [];
this._entitiesUri = config.getEntitiesUri(this.typeName);
}
Filter(filter) {
if (filter) {
this._filter = filter;
}
return this;
}
Search(search) {
if (search) {
this._search = search;
}
return this;
}
Top(top) {
if (top > -1) {
this._top = top;
}
return this;
}
Skip(skip) {
if (skip > -1) {
this._skip = skip;
}
return this;
}
OrderBy(orderBy) {
if (orderBy) {
this._orderBy = this.toStringArray(orderBy);
}
return this;
}
MaxPerPage(maxPerPage) {
if (maxPerPage > -1) {
this._maxPerPage = maxPerPage;
}
return this;
}
Apply(apply) {
if (apply) {
this._apply = this.toStringArray(apply);
}
return this;
}
CustomQueryOptions(customOptions) {
if (customOptions) {
this._customQueryOptions = Array.isArray(customOptions) ? customOptions : [customOptions];
}
return this;
}
CustomQueryHeaders(customHeaders) {
if (customHeaders) {
this._customQueryHeaders = Array.isArray(customHeaders) ? customHeaders : [customHeaders];
}
return this;
}
GetUrl(returnType) {
let url = this._entitiesUri;
if (returnType === ODataExecReturnType.Count) {
url = `${url}/${this.config.keys.count}`;
}
const params = this.getQueryParams(this.config.defaultRequestOptions.params);
if (params.keys().length > 0) {
return `${url}?${params}`;
}
return url;
}
Exec(returnType) {
const requestOptions = this.getQueryRequestOptions(returnType);
switch (returnType) {
case ODataExecReturnType.Count:
return this.execGetCount(requestOptions);
case ODataExecReturnType.PagedResult:
return this.execGetArrayDataWithCount(this._entitiesUri, requestOptions);
case ODataExecReturnType.MetadataResult:
return this.execGetArrayDataWithMetadata(this._entitiesUri, requestOptions);
default:
return this.execGetArrayData(requestOptions);
}
}
ExecWithCount() {
return this.Exec(ODataExecReturnType.PagedResult);
}
NextPage(pagedResult) {
const requestOptions = this.getQueryRequestOptions(ODataExecReturnType.PagedResult);
return this.execGetArrayDataWithCount(pagedResult.nextLink, requestOptions);
}
execGetCount(requestOptions) {
const countUrl = `${this._entitiesUri}/${this.config.keys.count}`;
return this.http.get(countUrl, requestOptions)
.pipe(map(res => this.extractDataAsNumber(res, this.config)), catchError((err, caught) => {
if (this.config.handleError) {
this.config.handleError(err, caught);
}
return throwError(err);
}));
}
execGetArrayDataWithCount(url, requestOptions) {
return this.http.get(url, requestOptions)
.pipe(map(res => this.extractArrayDataWithCount(res, this.config)), catchError((err, caught) => {
if (this.config.handleError) {
this.config.handleError(err, caught);
}
return throwError(err);
}));
}
execGetArrayDataWithMetadata(url, requestOptions) {
return this.http.get(url, requestOptions)
.pipe(map(res => this.extractArrayDataWithMetadata(res, this.config)), catchError((err, caught) => {
if (this.config.handleError) {
this.config.handleError(err, caught);
}
return throwError(err);
}));
}
execGetArrayData(requestOptions) {
return this.http.get(this._entitiesUri, requestOptions)
.pipe(map(res => this.extractArrayData(res, this.config)), catchError((err, caught) => {
if (this.config.handleError) {
this.config.handleError(err, caught);
}
return throwError(err);
}));
}
getQueryRequestOptions(returnType) {
const options = Object.assign({}, this.config.defaultRequestOptions);
options.params = this.getQueryParams(options.params);
options.headers = this.getQueryHeaders(options.headers, returnType);
return options;
}
getQueryHeaders(headers, returnType) {
if (!headers) {
headers = new HttpHeaders();
}
if (this._maxPerPage > 0) {
headers = headers.set('Prefer', `${this.config.keys.maxPerPage}=${this._maxPerPage}`);
}
headers = headers.set(`${this.config.keys.metadata}`, `${(returnType && returnType >= ODataExecReturnType.PagedResult) ? 'full' : 'none'}`);
if (this._customQueryHeaders.length > 0) {
this._customQueryHeaders.forEach(customQueryHeader => {
headers = headers.set(customQueryHeader.key, customQueryHeader.value);
});
}
return headers;
}
getQueryParams(aParams) {
let params = super.getParams(aParams);
if (this._filter) {
params = params.append(this.config.keys.filter, this._filter);
}
if (this._search) {
params = params.append(this.config.keys.search, this._search);
}
if (this._top > 0) {
params = params.append(this.config.keys.top, this._top.toString());
}
if (this._skip > 0) {
params = params.append(this.config.keys.skip, this._skip.toString());
}
if (this._orderBy.length > 0) {
params = params.append(this.config.keys.orderBy, this.toCommaString(this._orderBy));
}
if (this._apply.length > 0) {
params = params.append(this.config.keys.apply, this.toCommaString(this._apply));
}
if (this._customQueryOptions.length > 0) {
this._customQueryOptions.forEach(customQueryOption => (params = params.append(this.checkReservedCustomQueryOptionKey(customQueryOption.key), customQueryOption.value)));
}
return params;
}
extractDataAsNumber(res, config) {
return config.extractQueryResultDataAsNumber(res);
}
extractArrayData(res, config) {
return config.extractQueryResultData(res);
}
extractArrayDataWithCount(res, config) {
return config.extractQueryResultDataWithCount(res);
}
extractArrayDataWithMetadata(res, config) {
return config.extractQueryResultDataWithMetadata(res);
}
checkReservedCustomQueryOptionKey(key) {
if (key === null || key === undefined) {
throw new Error('Custom query options MUST NOT be null or undefined.');
}
if (key.indexOf('$') === 0 || key.indexOf('@') === 0) {
throw new Error('Custom query options MUST NOT begin with a $ or @ character.');
}
return key;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhck9EYXRhUXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhLXY0MDEvc3JjL2xpYi9vZGF0YS9hbmd1bGFyT0RhdGFRdWVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsT0FBTyxFQUFpQyxXQUFXLEVBQTRCLE1BQU0sc0JBQXNCLENBQUM7QUFHNUcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBU3pELE1BQU0sT0FBTyxVQUFjLFNBQVEsY0FBaUI7SUFhaEQsWUFBWSxRQUFnQixFQUFFLE1BQTBCLEVBQUUsSUFBZ0I7UUFDdEUsS0FBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFaMUIsWUFBTyxHQUFXLEVBQUUsQ0FBQztRQUNyQixTQUFJLEdBQVksQ0FBQyxDQUFDO1FBQ2xCLFVBQUssR0FBVyxDQUFDLENBQUM7UUFDbEIsWUFBTyxHQUFXLEVBQUUsQ0FBQztRQUNyQixhQUFRLEdBQWEsRUFBRSxDQUFDO1FBQ3hCLFdBQU0sR0FBYSxFQUFFLENBQUM7UUFFdEIsZ0JBQVcsR0FBWSxDQUFDLENBQUM7UUFDekIsd0JBQW1CLEdBQW1CLEVBQUUsQ0FBQztRQUN6Qyx3QkFBbUIsR0FBbUIsRUFBRSxDQUFDO1FBSzdDLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVNLE1BQU0sQ0FBQyxNQUFjO1FBQ3hCLElBQUksTUFBTSxFQUFFO1lBQ1IsSUFBSSxDQUFD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QUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQzFGLENBQUMsQ0FBQztTQUNOO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVPLG1CQUFtQixDQUFDLEdBQXlCLEVBQUUsTUFBMEI7UUFDN0UsT0FBTyxNQUFNLENBQUMsOEJBQThCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEdBQXlDLEVBQUUsTUFBMEI7UUFDMUYsT0FBTyxNQUFNLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVPLHlCQUF5QixDQUFDLEdBQXlDLEVBQUUsTUFBMEI7UUFDbkcsT0FBTyxNQUFNLENBQUMsK0JBQStCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVPLDRCQUE0QixDQUFDLEdBQXlDLEVBQUUsTUFBMEI7UUFDeEcsT0FBTyxNQUFNLENBQUMsa0NBQWtDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVPLGlDQUFpQyxDQUFDLEdBQVc7UUFDakQsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1NBQzFFO1FBQ0QsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7U0FDbkY7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLCBIdHRwUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG5pbXBvcnQgeyBPRGF0YUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL2FuZ3VsYXJPRGF0YUNvbmZpZ3VyYXRpb24nO1xyXG5pbXBvcnQgeyBPRGF0YUV4ZWNSZXR1cm5UeXBlIH0gZnJvbSAnLi9hbmd1bGFyT0RhdGFFbnVtcyc7XHJcbmltcG9ydCB7IE9EYXRhTWV0YWRhdGFSZXN1bHQgfSBmcm9tICcuL2FuZ3VsYXJPRGF0YU1ldGFkYXRhUmVzdWx0JztcclxuaW1wb3J0IHsgT0RhdGFPcGVyYXRpb24gfSBmcm9tICcuL2FuZ3VsYXJPRGF0YU9wZXJhdGlvbic7XHJcbmltcG9ydCB7IE9EYXRhUGFnZWRSZXN1bHQgfSBmcm9tICcuL2FuZ3VsYXJPRGF0YVBhZ2VkUmVzdWx0JztcclxuaW1wb3J0IHsgSU9EYXRhUmVzcG9uc2VNb2RlbCB9IGZyb20gJy4vYW5ndWxhck9EYXRhUmVzcG9uc2VNb2RlbCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbU9wdGlvbntcclxuICAgIGtleTpzdHJpbmc7XHJcbiAgICB2YWx1ZTphbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBPRGF0YVF1ZXJ5PFQ+IGV4dGVuZHMgT0RhdGFPcGVyYXRpb248VD4ge1xyXG5cclxuICAgIHByaXZhdGUgX2ZpbHRlcjogc3RyaW5nID0gXCJcIjtcclxuICAgIHByaXZhdGUgX3RvcDogbnVtYmVyICA9IDA7XHJcbiAgICBwcml2YXRlIF9za2lwOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfc2VhcmNoOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHJpdmF0ZSBfb3JkZXJCeTogc3RyaW5nW10gPSBbXTtcclxuICAgIHByaXZhdGUgX2FwcGx5OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfZW50aXRpZXNVcmk6IHN0cmluZztcclxuICAgIHByaXZhdGUgX21heFBlclBhZ2U6IG51bWJlciAgPSAwO1xyXG4gICAgcHJpdmF0ZSBfY3VzdG9tUXVlcnlPcHRpb25zOiBDdXN0b21PcHRpb25bXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfY3VzdG9tUXVlcnlIZWFkZXJzOiBDdXN0b21PcHRpb25bXSA9IFtdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHR5cGVOYW1lOiBzdHJpbmcsIGNvbmZpZzogT0RhdGFDb25maWd1cmF0aW9uLCBodHRwOiBIdHRwQ2xpZW50KSB7XHJcbiAgICAgICAgc3VwZXIodHlwZU5hbWUsIGNvbmZpZywgaHR0cCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2VudGl0aWVzVXJpID0gY29uZmlnLmdldEVudGl0aWVzVXJpKHRoaXMudHlwZU5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBGaWx0ZXIoZmlsdGVyOiBzdHJpbmcpOiBPRGF0YVF1ZXJ5PFQ+IHtcclxuICAgICAgICBpZiAoZmlsdGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlciA9IGZpbHRlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFNlYXJjaChzZWFyY2g6IHN0cmluZyk6IE9EYXRhUXVlcnk8VD4ge1xyXG4gICAgICAgIGlmIChzZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2VhcmNoID0gc2VhcmNoO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgVG9wKHRvcDogbnVtYmVyKTogT0RhdGFRdWVyeTxUPiB7XHJcbiAgICAgICAgaWYgKHRvcCA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RvcCA9IHRvcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFNraXAoc2tpcDogbnVtYmVyKTogT0RhdGFRdWVyeTxUPiB7XHJcbiAgICAgICAgaWYgKHNraXAgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLl9za2lwID0gc2tpcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIE9yZGVyQnkob3JkZXJCeTogc3RyaW5nIHwgc3RyaW5nW10pOiBPRGF0YVF1ZXJ5PFQ+IHtcclxuICAgICAgICBpZiAob3JkZXJCeSkge1xyXG4gICAgICAgICAgICB0aGlzLl9vcmRlckJ5ID0gdGhpcy50b1N0cmluZ0FycmF5KG9yZGVyQnkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgTWF4UGVyUGFnZShtYXhQZXJQYWdlOiBudW1iZXIpOiBPRGF0YVF1ZXJ5PFQ+IHtcclxuICAgICAgICBpZiAobWF4UGVyUGFnZSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21heFBlclBhZ2UgPSBtYXhQZXJQYWdlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQXBwbHkoYXBwbHk6IHN0cmluZyB8IHN0cmluZ1tdKTogT0RhdGFRdWVyeTxUPiB7XHJcbiAgICAgICAgaWYgKGFwcGx5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FwcGx5ID0gdGhpcy50b1N0cmluZ0FycmF5KGFwcGx5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEN1c3RvbVF1ZXJ5T3B0aW9ucyhjdXN0b21PcHRpb25zOiBDdXN0b21PcHRpb24gfCBDdXN0b21PcHRpb25bXSk6IE9EYXRhUXVlcnk8VD4ge1xyXG4gICAgICAgIGlmIChjdXN0b21PcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2N1c3RvbVF1ZXJ5T3B0aW9ucyA9IEFycmF5LmlzQXJyYXkoY3VzdG9tT3B0aW9ucykgPyBjdXN0b21PcHRpb25zIDogW2N1c3RvbU9wdGlvbnNdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ3VzdG9tUXVlcnlIZWFkZXJzKGN1c3RvbUhlYWRlcnM6IEN1c3RvbU9wdGlvbiB8IEN1c3RvbU9wdGlvbltdKTogT0RhdGFRdWVyeTxUPiB7XHJcbiAgICAgIGlmIChjdXN0b21IZWFkZXJzKSB7XHJcbiAgICAgICAgICB0aGlzLl9jdXN0b21RdWVyeUhlYWRlcnMgPSBBcnJheS5pc0FycmF5KGN1c3RvbUhlYWRlcnMpID8gY3VzdG9tSGVhZGVycyA6IFtjdXN0b21IZWFkZXJzXTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0VXJsKHJldHVyblR5cGU/OiBPRGF0YUV4ZWNSZXR1cm5UeXBlKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLl9lbnRpdGllc1VyaTtcclxuICAgICAgICBpZiAocmV0dXJuVHlwZSA9PT0gT0RhdGFFeGVjUmV0dXJuVHlwZS5Db3VudCkge1xyXG4gICAgICAgICAgICB1cmwgPSBgJHt1cmx9LyR7dGhpcy5jb25maWcua2V5cy5jb3VudH1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwYXJhbXM6IEh0dHBQYXJhbXMgPSB0aGlzLmdldFF1ZXJ5UGFyYW1zKHRoaXMuY29uZmlnLmRlZmF1bHRSZXF1ZXN0T3B0aW9ucy5wYXJhbXMpO1xyXG4gICAgICAgIGlmIChwYXJhbXMua2V5cygpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGAke3VybH0/JHtwYXJhbXN9YDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB1cmw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEV4ZWMoKTogT2JzZXJ2YWJsZTxUW10+O1xyXG4gICAgcHVibGljIEV4ZWMocmV0dXJuVHlwZTogT0RhdGFFeGVjUmV0dXJuVHlwZS5Db3VudCk6IE9ic2VydmFibGU8bnVtYmVyPjtcclxuICAgIHB1YmxpYyBFeGVjKHJldHVyblR5cGU6IE9EYXRhRXhlY1JldHVyblR5cGUuUGFnZWRSZXN1bHQpOiBPYnNlcnZhYmxlPE9EYXRhUGFnZWRSZXN1bHQ8VD4+O1xyXG4gICAgcHVibGljIEV4ZWMocmV0dXJuVHlwZTogT0RhdGFFeGVjUmV0dXJuVHlwZS5NZXRhZGF0YVJlc3VsdCk6IE9ic2VydmFibGU8T0RhdGFNZXRhZGF0YVJlc3VsdDxUPj47XHJcbiAgICBwdWJsaWMgRXhlYyhyZXR1cm5UeXBlPzogT0RhdGFFeGVjUmV0dXJuVHlwZSk6IE9ic2VydmFibGU8VFtdIHwgT0RhdGFQYWdlZFJlc3VsdDxUPiB8IE9EYXRhTWV0YWRhdGFSZXN1bHQ8VD4gfCBudW1iZXI+IHtcclxuICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9uczoge1xyXG4gICAgICAgICAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnM7XHJcbiAgICAgICAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XHJcbiAgICAgICAgICAgIHBhcmFtcz86IEh0dHBQYXJhbXM7XHJcbiAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbjtcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xyXG4gICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuO1xyXG4gICAgICAgIH0gPSB0aGlzLmdldFF1ZXJ5UmVxdWVzdE9wdGlvbnMocmV0dXJuVHlwZSk7XHJcbiAgICAgICAgc3dpdGNoIChyZXR1cm5UeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgT0RhdGFFeGVjUmV0dXJuVHlwZS5Db3VudDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4ZWNHZXRDb3VudChyZXF1ZXN0T3B0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIE9EYXRhRXhlY1JldHVyblR5cGUuUGFnZWRSZXN1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leGVjR2V0QXJyYXlEYXRhV2l0aENvdW50KHRoaXMuX2VudGl0aWVzVXJpLCByZXF1ZXN0T3B0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIE9EYXRhRXhlY1JldHVyblR5cGUuTWV0YWRhdGFSZXN1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leGVjR2V0QXJyYXlEYXRhV2l0aE1ldGFkYXRhKHRoaXMuX2VudGl0aWVzVXJpLCByZXF1ZXN0T3B0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhlY0dldEFycmF5RGF0YShyZXF1ZXN0T3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBFeGVjV2l0aENvdW50KCk6IE9ic2VydmFibGU8T0RhdGFQYWdlZFJlc3VsdDxUPj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkV4ZWMoT0RhdGFFeGVjUmV0dXJuVHlwZS5QYWdlZFJlc3VsdCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIE5leHRQYWdlKHBhZ2VkUmVzdWx0OiBPRGF0YVBhZ2VkUmVzdWx0PFQ+KTogT2JzZXJ2YWJsZTxPRGF0YVBhZ2VkUmVzdWx0PFQ+PiB7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdE9wdGlvbnM6IHtcclxuICAgICAgICAgICAgaGVhZGVycz86IEh0dHBIZWFkZXJzO1xyXG4gICAgICAgICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xyXG4gICAgICAgICAgICBwYXJhbXM/OiBIdHRwUGFyYW1zO1xyXG4gICAgICAgICAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW47XHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcclxuICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbjtcclxuICAgICAgICB9ID0gdGhpcy5nZXRRdWVyeVJlcXVlc3RPcHRpb25zKE9EYXRhRXhlY1JldHVyblR5cGUuUGFnZWRSZXN1bHQpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5leGVjR2V0QXJyYXlEYXRhV2l0aENvdW50KHBhZ2VkUmVzdWx0Lm5leHRMaW5rLCByZXF1ZXN0T3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjR2V0Q291bnQocmVxdWVzdE9wdGlvbnM6IHtcclxuICAgICAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnM7XHJcbiAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcclxuICAgICAgICBwYXJhbXM/OiBIdHRwUGFyYW1zO1xyXG4gICAgICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbjtcclxuICAgICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbjtcclxuICAgIH0pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgICAgIGNvbnN0IGNvdW50VXJsID0gYCR7dGhpcy5fZW50aXRpZXNVcml9LyR7dGhpcy5jb25maWcua2V5cy5jb3VudH1gO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PG51bWJlcj4oY291bnRVcmwsIHJlcXVlc3RPcHRpb25zKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIG1hcChyZXMgPT4gdGhpcy5leHRyYWN0RGF0YUFzTnVtYmVyKHJlcywgdGhpcy5jb25maWcpKSxcclxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogYW55LCBjYXVnaHQ6IE9ic2VydmFibGU8bnVtYmVyPikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5oYW5kbGVFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5oYW5kbGVFcnJvcihlcnIsIGNhdWdodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycik7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZXhlY0dldEFycmF5RGF0YVdpdGhDb3VudCh1cmw6IHN0cmluZywgcmVxdWVzdE9wdGlvbnM6IHtcclxuICAgICAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnM7XHJcbiAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcclxuICAgICAgICBwYXJhbXM/OiBIdHRwUGFyYW1zO1xyXG4gICAgICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbjtcclxuICAgICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbjtcclxuICAgIH0pOiBPYnNlcnZhYmxlPE9EYXRhUGFnZWRSZXN1bHQ8VD4+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJT0RhdGFSZXNwb25zZU1vZGVsPFQ+Pih1cmwsIHJlcXVlc3RPcHRpb25zKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIG1hcChyZXMgPT4gdGhpcy5leHRyYWN0QXJyYXlEYXRhV2l0aENvdW50KHJlcywgdGhpcy5jb25maWcpKSxcclxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogYW55LCBjYXVnaHQ6IE9ic2VydmFibGU8T0RhdGFQYWdlZFJlc3VsdDxUPj4pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcuaGFuZGxlRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuaGFuZGxlRXJyb3IoZXJyLCBjYXVnaHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnIpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGV4ZWNHZXRBcnJheURhdGFXaXRoTWV0YWRhdGEodXJsOiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zOiB7XHJcbiAgICAgIGhlYWRlcnM/OiBIdHRwSGVhZGVycztcclxuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJztcclxuICAgICAgcGFyYW1zPzogSHR0cFBhcmFtcztcclxuICAgICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuO1xyXG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XHJcbiAgICAgIHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW47XHJcbiAgICB9KTogT2JzZXJ2YWJsZTxPRGF0YU1ldGFkYXRhUmVzdWx0PFQ+PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElPRGF0YVJlc3BvbnNlTW9kZWw8VD4+KHVybCwgcmVxdWVzdE9wdGlvbnMpXHJcbiAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICBtYXAocmVzID0+IHRoaXMuZXh0cmFjdEFycmF5RGF0YVdpdGhNZXRhZGF0YShyZXMsIHRoaXMuY29uZmlnKSksXHJcbiAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSwgY2F1Z2h0OiBPYnNlcnZhYmxlPE9EYXRhTWV0YWRhdGFSZXN1bHQ8VD4+KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5oYW5kbGVFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuaGFuZGxlRXJyb3IoZXJyLCBjYXVnaHQpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycik7XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjR2V0QXJyYXlEYXRhKHJlcXVlc3RPcHRpb25zOiB7XHJcbiAgICAgICAgaGVhZGVycz86IEh0dHBIZWFkZXJzO1xyXG4gICAgICAgIG9ic2VydmU6ICdyZXNwb25zZSc7XHJcbiAgICAgICAgcGFyYW1zPzogSHR0cFBhcmFtcztcclxuICAgICAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW47XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xyXG4gICAgICAgIHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW47XHJcbiAgICB9KTogT2JzZXJ2YWJsZTxUW10+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJT0RhdGFSZXNwb25zZU1vZGVsPFQ+Pih0aGlzLl9lbnRpdGllc1VyaSwgcmVxdWVzdE9wdGlvbnMpXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgbWFwKHJlcyA9PiB0aGlzLmV4dHJhY3RBcnJheURhdGEocmVzLCB0aGlzLmNvbmZpZykpLFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBhbnksIGNhdWdodDogT2JzZXJ2YWJsZTxBcnJheTxUPj4pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcuaGFuZGxlRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuaGFuZGxlRXJyb3IoZXJyLCBjYXVnaHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnIpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFF1ZXJ5UmVxdWVzdE9wdGlvbnMocmV0dXJuVHlwZT8gOiBPRGF0YUV4ZWNSZXR1cm5UeXBlKToge1xyXG4gICAgICAgIGhlYWRlcnM/OiBIdHRwSGVhZGVycztcclxuICAgICAgICBvYnNlcnZlOiAncmVzcG9uc2UnO1xyXG4gICAgICAgIHBhcmFtcz86IEh0dHBQYXJhbXM7XHJcbiAgICAgICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuO1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcclxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuO1xyXG4gICAgfSB7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY29uZmlnLmRlZmF1bHRSZXF1ZXN0T3B0aW9ucyk7XHJcbiAgICAgICAgb3B0aW9ucy5wYXJhbXMgPSB0aGlzLmdldFF1ZXJ5UGFyYW1zKG9wdGlvbnMucGFyYW1zKTtcclxuICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSB0aGlzLmdldFF1ZXJ5SGVhZGVycyhvcHRpb25zLmhlYWRlcnMsIHJldHVyblR5cGUpO1xyXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0UXVlcnlIZWFkZXJzKGhlYWRlcnM6IEh0dHBIZWFkZXJzLCByZXR1cm5UeXBlPzogT0RhdGFFeGVjUmV0dXJuVHlwZSk6IEh0dHBIZWFkZXJzIHtcclxuICAgICAgaWYgKCFoZWFkZXJzKSB7XHJcbiAgICAgICAgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKHRoaXMuX21heFBlclBhZ2UgPiAwKXtcclxuICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ1ByZWZlcicsIGAke3RoaXMuY29uZmlnLmtleXMubWF4UGVyUGFnZX09JHt0aGlzLl9tYXhQZXJQYWdlfWApO1xyXG4gICAgICB9XHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldChgJHt0aGlzLmNvbmZpZy5rZXlzLm1ldGFkYXRhfWAsIGAkeyhyZXR1cm5UeXBlICYmIHJldHVyblR5cGUgPj0gT0RhdGFFeGVjUmV0dXJuVHlwZS5QYWdlZFJlc3VsdCk/ICdmdWxsJyA6ICdub25lJ31gKTtcclxuICAgICAgaWYgKHRoaXMuX2N1c3RvbVF1ZXJ5SGVhZGVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5fY3VzdG9tUXVlcnlIZWFkZXJzLmZvckVhY2goY3VzdG9tUXVlcnlIZWFkZXIgPT4ge1xyXG4gICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KGN1c3RvbVF1ZXJ5SGVhZGVyLmtleSwgY3VzdG9tUXVlcnlIZWFkZXIudmFsdWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBoZWFkZXJzO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0UXVlcnlQYXJhbXMoYVBhcmFtcz86SHR0cFBhcmFtcyk6IEh0dHBQYXJhbXMge1xyXG4gICAgICAgIGxldCBwYXJhbXMgPSBzdXBlci5nZXRQYXJhbXMoYVBhcmFtcyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9maWx0ZXIpIHtcclxuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCh0aGlzLmNvbmZpZy5rZXlzLmZpbHRlciwgdGhpcy5fZmlsdGVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zZWFyY2gpIHtcclxuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCh0aGlzLmNvbmZpZy5rZXlzLnNlYXJjaCwgdGhpcy5fc2VhcmNoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl90b3AgPiAwKSB7XHJcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQodGhpcy5jb25maWcua2V5cy50b3AsIHRoaXMuX3RvcC50b1N0cmluZygpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9za2lwID4gMCkge1xyXG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKHRoaXMuY29uZmlnLmtleXMuc2tpcCwgdGhpcy5fc2tpcC50b1N0cmluZygpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9vcmRlckJ5Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCh0aGlzLmNvbmZpZy5rZXlzLm9yZGVyQnksIHRoaXMudG9Db21tYVN0cmluZyh0aGlzLl9vcmRlckJ5KSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fYXBwbHkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKHRoaXMuY29uZmlnLmtleXMuYXBwbHksIHRoaXMudG9Db21tYVN0cmluZyh0aGlzLl9hcHBseSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2N1c3RvbVF1ZXJ5T3B0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2N1c3RvbVF1ZXJ5T3B0aW9ucy5mb3JFYWNoKGN1c3RvbVF1ZXJ5T3B0aW9uID0+IChwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja1Jlc2VydmVkQ3VzdG9tUXVlcnlPcHRpb25LZXkoY3VzdG9tUXVlcnlPcHRpb24ua2V5KSwgY3VzdG9tUXVlcnlPcHRpb24udmFsdWUpXHJcbiAgICAgICAgICAgICkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHBhcmFtcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGV4dHJhY3REYXRhQXNOdW1iZXIocmVzOiBIdHRwUmVzcG9uc2U8bnVtYmVyPiwgY29uZmlnOiBPRGF0YUNvbmZpZ3VyYXRpb24pOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBjb25maWcuZXh0cmFjdFF1ZXJ5UmVzdWx0RGF0YUFzTnVtYmVyKHJlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleHRyYWN0QXJyYXlEYXRhKHJlczogSHR0cFJlc3BvbnNlPElPRGF0YVJlc3BvbnNlTW9kZWw8VD4+LCBjb25maWc6IE9EYXRhQ29uZmlndXJhdGlvbik6IFRbXSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZy5leHRyYWN0UXVlcnlSZXN1bHREYXRhKHJlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleHRyYWN0QXJyYXlEYXRhV2l0aENvdW50KHJlczogSHR0cFJlc3BvbnNlPElPRGF0YVJlc3BvbnNlTW9kZWw8VD4+LCBjb25maWc6IE9EYXRhQ29uZmlndXJhdGlvbik6IE9EYXRhUGFnZWRSZXN1bHQ8VD4ge1xyXG4gICAgICAgIHJldHVybiBjb25maWcuZXh0cmFjdFF1ZXJ5UmVzdWx0RGF0YVdpdGhDb3VudChyZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZXh0cmFjdEFycmF5RGF0YVdpdGhNZXRhZGF0YShyZXM6IEh0dHBSZXNwb25zZTxJT0RhdGFSZXNwb25zZU1vZGVsPFQ+PiwgY29uZmlnOiBPRGF0YUNvbmZpZ3VyYXRpb24pOiBPRGF0YU1ldGFkYXRhUmVzdWx0PFQ+IHtcclxuICAgICAgcmV0dXJuIGNvbmZpZy5leHRyYWN0UXVlcnlSZXN1bHREYXRhV2l0aE1ldGFkYXRhKHJlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja1Jlc2VydmVkQ3VzdG9tUXVlcnlPcHRpb25LZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmIChrZXkgPT09IG51bGwgfHwga2V5ID09PSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0N1c3RvbSBxdWVyeSBvcHRpb25zIE1VU1QgTk9UIGJlIG51bGwgb3IgdW5kZWZpbmVkLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoa2V5LmluZGV4T2YoJyQnKSA9PT0gMCB8fCBrZXkuaW5kZXhPZignQCcpID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ3VzdG9tIHF1ZXJ5IG9wdGlvbnMgTVVTVCBOT1QgYmVnaW4gd2l0aCBhICQgb3IgQCBjaGFyYWN0ZXIuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9XHJcbn1cclxuIl19