@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
226 lines • 34.1 kB
JavaScript
import { Inject, Injectable, Optional } from '@angular/core';
import { AbstractSortableViewComponent } from '../abstract/sortable-view';
import { BehaviorSubject, of } from 'rxjs';
import { Net } from '../../process/net';
import { catchError, concatMap, map, mergeMap, scan, tap } from 'rxjs/operators';
import { HttpParams } from '@angular/common/http';
import { LoadingEmitter } from '../../utility/loading-emitter';
import { hasContent } from '../../utility/pagination/page-has-content';
import { NAE_WORKFLOW_SERVICE_CONFIRM_DELETE, NAE_WORKFLOW_SERVICE_FILTER } from './models/injection-token-workflow-service';
import { arrayToObservable } from '../../utility/array-to-observable';
import { PaginationParams } from '../../utility/pagination/pagination-params';
import * as i0 from "@angular/core";
import * as i1 from "../../resources/engine-endpoint/petri-net-resource.service";
import * as i2 from "../../logger/services/logger.service";
import * as i3 from "../../dialog/services/dialog.service";
import * as i4 from "../../snack-bar/services/snack-bar.service";
import * as i5 from "@ngx-translate/core";
import * as i6 from "../../search/search-keyword-resolver-service/search-index-resolver.service";
export class WorkflowViewService extends AbstractSortableViewComponent {
_petriNetResource;
_log;
_dialogService;
_snackBarService;
_translate;
// TODO 19.10.2020 - Add support for requests with context (filter), same as Case- and TaskViewServices
_loading$;
_workflows$;
_clear;
_nextPage$;
_endOfData;
_pagination;
_baseFilter;
_showDeleteConfirmationDialog;
constructor(_petriNetResource, _log, _dialogService, _snackBarService, _translate, resolver, injectedBaseFilter, confirmDelete) {
super(resolver);
this._petriNetResource = _petriNetResource;
this._log = _log;
this._dialogService = _dialogService;
this._snackBarService = _snackBarService;
this._translate = _translate;
this._loading$ = new LoadingEmitter();
this._clear = false;
this._endOfData = false;
this._pagination = {
size: 25,
totalElements: undefined,
totalPages: undefined,
number: -1
};
this._nextPage$ = new BehaviorSubject(Object.assign({}, this._pagination, { number: 0 }));
this._baseFilter = injectedBaseFilter !== null ? injectedBaseFilter : {};
this._showDeleteConfirmationDialog = confirmDelete === null || confirmDelete;
const workflowsMap = this._nextPage$.pipe(mergeMap(p => this.loadPage(p)), map(petriNets => {
if (this._clear) {
// we set an empty value to the virtual scroll and then replace it by the real value forcing it to redraw its content
const results = [{ content: [], stopLoading: false }, { content: petriNets, stopLoading: true }];
return arrayToObservable(results);
}
else {
return of({ content: petriNets, stopLoading: true });
}
}), concatMap(o => o), map(o => {
if (o.stopLoading) {
this._loading$.off();
}
return o.content;
}), map(petriNets => {
return petriNets.reduce((acc, cur) => {
return { ...acc, [cur.stringId]: cur };
}, {});
}), scan((acc, petriNetsMap) => {
if (this._clear) {
this._clear = false;
return { ...petriNetsMap };
}
return { ...acc, ...petriNetsMap };
}, {}));
this._workflows$ = workflowsMap.pipe(map(v => Object.values(v)));
}
ngOnDestroy() {
super.ngOnDestroy();
this._loading$.complete();
this._nextPage$.complete();
}
get loading() {
return this._loading$.isActive;
}
get loading$() {
return this._loading$.asObservable();
}
get workflows$() {
return this._workflows$;
}
setSearchTitle(title) {
this._baseFilter.title = title;
this.reload();
}
clearSearchTitle() {
this._baseFilter.title = undefined;
this.reload();
}
loadPage(pageRequest) {
if (pageRequest.number < 0) {
return of([]);
}
let params = new HttpParams();
params = this.addSortParams(params);
params = this.addPageParams(params, pageRequest);
this._loading$.on();
let request;
if (this._baseFilter.title !== undefined) {
request = this._petriNetResource.searchElasticPetriNets(this._baseFilter, params);
}
else {
request = this._petriNetResource.searchPetriNets(this._baseFilter, params);
}
return request.pipe(catchError(err => {
this._log.error('Loading Petri nets has failed!', err);
return of({ content: [], pagination: { ...this._pagination } });
}), tap(res => {
Object.assign(this._pagination, res.pagination);
}), tap(res => {
this._endOfData = !hasContent(res)
|| res.pagination.number === res.pagination.totalPages - 1;
}), map((netsPage) => {
if (hasContent(netsPage)) {
const array = [];
netsPage.content.forEach(net => {
array.push(new Net(net));
});
return array;
}
return [];
}));
}
nextPage(renderedRange, totalLoaded, pagination) {
if (this._endOfData) {
return;
}
if (renderedRange.end === totalLoaded) {
let p = pagination;
if (p === undefined) {
p = Object.assign({}, this._pagination);
p.number += 1;
}
this._nextPage$.next(p);
}
}
reload() {
if (!this._workflows$ || !this._pagination) {
return;
}
this._endOfData = false;
this._clear = true;
const p = Object.assign({}, this._pagination);
p.number = 0;
const range = {
start: -1,
end: 0
};
this.nextPage(range, 0, p);
}
/**
* Opens a dialog (if configured) and then asks the service to delete the selected workflow.
* @param workflow the workflow that should be deleted
*/
deleteWorkflow(workflow) {
if (this._showDeleteConfirmationDialog) {
const confirmationText = this._translate.instant('workflow.delete').toUpperCase();
this._dialogService.openPromptDialog(this._translate.instant('workflow.dialog.header', { name: workflow.title, version: workflow.version }), this._translate.instant('workflow.dialog.content'), this._translate.instant('workflow.dialog.typeToConfirm', { delete: confirmationText }))
.afterClosed().subscribe(result => {
if (result !== undefined && result.prompt === confirmationText) {
this._deleteWorkflow(workflow);
}
else {
this._snackBarService.openGenericSnackBar(this._translate.instant('workflow.snackBar.deleteCanceled'), 'info');
}
});
}
else {
this._deleteWorkflow(workflow);
}
}
/**
* Sends the workflow delete to backend and processes the result.
* @param workflow the workflow that should be deleted
*/
_deleteWorkflow(workflow) {
this._petriNetResource.deletePetriNet(workflow.stringId).subscribe(response => {
this._snackBarService.openSuccessSnackBar(this._translate.instant('workflow.snackBar.deleteInProgress'));
this._log.info('Process delete success. Server response: ' + response.success);
this.reload();
}, error => {
this._snackBarService.openErrorSnackBar(this._translate.instant('workflow.snackBar.deleteError'));
this._log.error('Process delete failed. Server response: ' + error);
});
}
getMetaFieldSortId() {
return this._lastHeaderSearchState.fieldIdentifier;
}
getDefaultSortParam() {
// TODO 7.4.2020 - workflow sorting and searching
return '';
}
addPageParams(params, pagination) {
params = params.set(PaginationParams.PAGE_SIZE, `${pagination.size}`);
params = params.set(PaginationParams.PAGE_NUMBER, `${pagination.number}`);
return params;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WorkflowViewService, deps: [{ token: i1.PetriNetResourceService }, { token: i2.LoggerService }, { token: i3.DialogService }, { token: i4.SnackBarService }, { token: i5.TranslateService }, { token: i6.SearchIndexResolverService }, { token: NAE_WORKFLOW_SERVICE_FILTER, optional: true }, { token: NAE_WORKFLOW_SERVICE_CONFIRM_DELETE, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WorkflowViewService });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WorkflowViewService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.PetriNetResourceService }, { type: i2.LoggerService }, { type: i3.DialogService }, { type: i4.SnackBarService }, { type: i5.TranslateService }, { type: i6.SearchIndexResolverService }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [NAE_WORKFLOW_SERVICE_FILTER]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [NAE_WORKFLOW_SERVICE_CONFIRM_DELETE]
}] }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3ctdmlldy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzLWNvcmUvc3JjL2xpYi92aWV3L3dvcmtmbG93LXZpZXcvd29ya2Zsb3ctdmlldy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBQUMsNkJBQTZCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUV4RSxPQUFPLEVBQUMsZUFBZSxFQUFjLEVBQUUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNyRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDdEMsT0FBTyxFQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHL0UsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRWhELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUc3RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFFckUsT0FBTyxFQUNILG1DQUFtQyxFQUNuQywyQkFBMkIsRUFDOUIsTUFBTSwyQ0FBMkMsQ0FBQztBQUluRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUVwRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQzs7Ozs7Ozs7QUFJNUUsTUFBTSxPQUFPLG1CQUFvQixTQUFRLDZCQUE2QjtJQVk1QztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBZHRCLHVHQUF1RztJQUM3RixTQUFTLENBQWlCO0lBQzFCLFdBQVcsQ0FBeUI7SUFDcEMsTUFBTSxDQUFVO0lBQ2hCLFVBQVUsQ0FBOEI7SUFDeEMsVUFBVSxDQUFVO0lBQ3BCLFdBQVcsQ0FBYTtJQUN4QixXQUFXLENBQXNCO0lBQ2pDLDZCQUE2QixDQUFVO0lBRWpELFlBQXNCLGlCQUEwQyxFQUMxQyxJQUFtQixFQUNuQixjQUE2QixFQUM3QixnQkFBaUMsRUFDakMsVUFBNEIsRUFDdEMsUUFBb0MsRUFDYSxrQkFBdUMsRUFDL0IsYUFBc0I7UUFDdkYsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBUkUsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUF5QjtRQUMxQyxTQUFJLEdBQUosSUFBSSxDQUFlO1FBQ25CLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzdCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7UUFDakMsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFLOUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUc7WUFDZixJQUFJLEVBQUUsRUFBRTtZQUNSLGFBQWEsRUFBRSxTQUFTO1lBQ3hCLFVBQVUsRUFBRSxTQUFTO1lBQ3JCLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDYixDQUFDO1FBQ0YsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FDakMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUNuRCxDQUFDO1FBRUYsSUFBSSxDQUFDLFdBQVcsR0FBRyxrQkFBa0IsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekUsSUFBSSxDQUFDLDZCQUE2QixHQUFHLGFBQWEsS0FBSyxJQUFJLElBQUksYUFBYSxDQUFDO1FBRTdFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUNyQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQy9CLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNaLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDYixxSEFBcUg7Z0JBQ3JILE1BQU0sT0FBTyxHQUFHLENBQUMsRUFBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUMsRUFBRSxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7Z0JBQzdGLE9BQU8saUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDckM7aUJBQU07Z0JBQ0gsT0FBTyxFQUFFLENBQUMsRUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO2FBQ3REO1FBQ0wsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNKLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRTtnQkFDZixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ3hCO1lBQ0QsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNaLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtnQkFDakMsT0FBTyxFQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsRUFBQyxDQUFDO1lBQ3pDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxFQUNGLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsRUFBRTtZQUN2QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLE9BQU8sRUFBQyxHQUFHLFlBQVksRUFBQyxDQUFDO2FBQzVCO1lBQ0QsT0FBTyxFQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsWUFBWSxFQUFDLENBQUM7UUFDckMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUNULENBQUM7UUFFRixJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQ2hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDN0IsQ0FBQztJQUNOLENBQUM7SUFFRCxXQUFXO1FBQ1AsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDakIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzVCLENBQUM7SUFFTSxjQUFjLENBQUMsS0FBYTtRQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDL0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFTSxnQkFBZ0I7UUFDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1FBQ25DLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRU0sUUFBUSxDQUFDLFdBQXVCO1FBQ25DLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDeEIsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDakI7UUFDRCxJQUFJLE1BQU0sR0FBZSxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQzFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBRXBCLElBQUksT0FBNEMsQ0FBQztRQUNqRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN0QyxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDckY7YUFBTTtZQUNILE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDOUU7UUFDRCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQ2YsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdkQsT0FBTyxFQUFFLENBQUMsRUFBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBQyxFQUFDLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDTixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNOLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO21CQUMzQixHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLENBQUMsUUFBaUMsRUFBRSxFQUFFO1lBQ3RDLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUN0QixNQUFNLEtBQUssR0FBZSxFQUFFLENBQUM7Z0JBQzdCLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUMzQixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzdCLENBQUMsQ0FBQyxDQUFDO2dCQUNILE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBQ0QsT0FBTyxFQUFFLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ04sQ0FBQztJQUVNLFFBQVEsQ0FBQyxhQUF3QixFQUFFLFdBQW1CLEVBQUUsVUFBdUI7UUFDbEYsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pCLE9BQU87U0FDVjtRQUVELElBQUksYUFBYSxDQUFDLEdBQUcsS0FBSyxXQUFXLEVBQUU7WUFDbkMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDO1lBQ25CLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDakIsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDeEMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7YUFDakI7WUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMzQjtJQUNMLENBQUM7SUFFTSxNQUFNO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3hDLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNiLE1BQU0sS0FBSyxHQUFHO1lBQ1YsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNULEdBQUcsRUFBRSxDQUFDO1NBQ1QsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksY0FBYyxDQUFDLFFBQWE7UUFDL0IsSUFBSSxJQUFJLENBQUMsNkJBQTZCLEVBQUU7WUFDcEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRWxGLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLEVBQUMsQ0FBQyxFQUNwRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxFQUNsRCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsRUFBRSxFQUFDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBQyxDQUFDLENBQUM7aUJBQ3BGLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDbEMsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssZ0JBQWdCLEVBQUU7b0JBQzVELElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ2xDO3FCQUFNO29CQUNILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2lCQUNsSDtZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ047YUFBTTtZQUNILElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDbEM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ08sZUFBZSxDQUFDLFFBQWE7UUFDbkMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3RFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLENBQUM7WUFDekcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsMkNBQTJDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQy9FLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQixDQUFDLEVBQ0QsS0FBSyxDQUFDLEVBQUU7WUFDSixJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsK0JBQStCLENBQUMsQ0FBQyxDQUFDO1lBQ2xHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLDBDQUEwQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQ3hFLENBQUMsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQUVTLGtCQUFrQjtRQUN4QixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxlQUFlLENBQUM7SUFDdkQsQ0FBQztJQUVTLG1CQUFtQjtRQUN6QixpREFBaUQ7UUFDakQsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRVMsYUFBYSxDQUFDLE1BQWtCLEVBQUUsVUFBc0I7UUFDOUQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDMUUsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQzt3R0FuT1EsbUJBQW1CLDROQWtCSSwyQkFBMkIsNkJBQzNCLG1DQUFtQzs0R0FuQjFELG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFEL0IsVUFBVTs7MEJBbUJNLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsMkJBQTJCOzswQkFDOUMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxtQ0FBbUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Fic3RyYWN0U29ydGFibGVWaWV3Q29tcG9uZW50fSBmcm9tICcuLi9hYnN0cmFjdC9zb3J0YWJsZS12aWV3JztcbmltcG9ydCB7UGV0cmlOZXRSZXNvdXJjZVNlcnZpY2V9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9lbmdpbmUtZW5kcG9pbnQvcGV0cmktbmV0LXJlc291cmNlLnNlcnZpY2UnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIG9mfSBmcm9tICdyeGpzJztcbmltcG9ydCB7TmV0fSBmcm9tICcuLi8uLi9wcm9jZXNzL25ldCc7XG5pbXBvcnQge2NhdGNoRXJyb3IsIGNvbmNhdE1hcCwgbWFwLCBtZXJnZU1hcCwgc2NhbiwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge1BldHJpTmV0UmVmZXJlbmNlfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL3BldHJpLW5ldC1yZWZlcmVuY2UnO1xuaW1wb3J0IHtIdHRwUGFyYW1zfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge1BhZ2luYXRpb259IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvcGFnaW5hdGlvbic7XG5pbXBvcnQge0xvYWRpbmdFbWl0dGVyfSBmcm9tICcuLi8uLi91dGlsaXR5L2xvYWRpbmctZW1pdHRlcic7XG5pbXBvcnQge1BhZ2V9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvcGFnZSc7XG5pbXBvcnQge0xpc3RSYW5nZX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7aGFzQ29udGVudH0gZnJvbSAnLi4vLi4vdXRpbGl0eS9wYWdpbmF0aW9uL3BhZ2UtaGFzLWNvbnRlbnQnO1xuaW1wb3J0IHtQZXRyaU5ldFJlcXVlc3RCb2R5fSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL3BldHJpLW5ldC1yZXF1ZXN0LWJvZHknO1xuaW1wb3J0IHtcbiAgICBOQUVfV09SS0ZMT1dfU0VSVklDRV9DT05GSVJNX0RFTEVURSxcbiAgICBOQUVfV09SS0ZMT1dfU0VSVklDRV9GSUxURVJcbn0gZnJvbSAnLi9tb2RlbHMvaW5qZWN0aW9uLXRva2VuLXdvcmtmbG93LXNlcnZpY2UnO1xuaW1wb3J0IHtEaWFsb2dTZXJ2aWNlfSBmcm9tICcuLi8uLi9kaWFsb2cvc2VydmljZXMvZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHtTbmFja0JhclNlcnZpY2V9IGZyb20gJy4uLy4uL3NuYWNrLWJhci9zZXJ2aWNlcy9zbmFjay1iYXIuc2VydmljZSc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHthcnJheVRvT2JzZXJ2YWJsZX0gZnJvbSAnLi4vLi4vdXRpbGl0eS9hcnJheS10by1vYnNlcnZhYmxlJztcbmltcG9ydCB7U2VhcmNoSW5kZXhSZXNvbHZlclNlcnZpY2V9IGZyb20gJy4uLy4uL3NlYXJjaC9zZWFyY2gta2V5d29yZC1yZXNvbHZlci1zZXJ2aWNlL3NlYXJjaC1pbmRleC1yZXNvbHZlci5zZXJ2aWNlJztcbmltcG9ydCB7UGFnaW5hdGlvblBhcmFtc30gZnJvbSAnLi4vLi4vdXRpbGl0eS9wYWdpbmF0aW9uL3BhZ2luYXRpb24tcGFyYW1zJztcblxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dWaWV3U2VydmljZSBleHRlbmRzIEFic3RyYWN0U29ydGFibGVWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICAgIC8vIFRPRE8gMTkuMTAuMjAyMCAtIEFkZCBzdXBwb3J0IGZvciByZXF1ZXN0cyB3aXRoIGNvbnRleHQgKGZpbHRlciksIHNhbWUgYXMgQ2FzZS0gYW5kIFRhc2tWaWV3U2VydmljZXNcbiAgICBwcm90ZWN0ZWQgX2xvYWRpbmckOiBMb2FkaW5nRW1pdHRlcjtcbiAgICBwcm90ZWN0ZWQgX3dvcmtmbG93cyQ6IE9ic2VydmFibGU8QXJyYXk8TmV0Pj47XG4gICAgcHJvdGVjdGVkIF9jbGVhcjogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgX25leHRQYWdlJDogQmVoYXZpb3JTdWJqZWN0PFBhZ2luYXRpb24+O1xuICAgIHByb3RlY3RlZCBfZW5kT2ZEYXRhOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfcGFnaW5hdGlvbjogUGFnaW5hdGlvbjtcbiAgICBwcm90ZWN0ZWQgX2Jhc2VGaWx0ZXI6IFBldHJpTmV0UmVxdWVzdEJvZHk7XG4gICAgcHJvdGVjdGVkIF9zaG93RGVsZXRlQ29uZmlybWF0aW9uRGlhbG9nOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9wZXRyaU5ldFJlc291cmNlOiBQZXRyaU5ldFJlc291cmNlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2xvZzogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2RpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9zbmFja0JhclNlcnZpY2U6IFNuYWNrQmFyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3RyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICByZXNvbHZlcjogU2VhcmNoSW5kZXhSZXNvbHZlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChOQUVfV09SS0ZMT1dfU0VSVklDRV9GSUxURVIpIGluamVjdGVkQmFzZUZpbHRlcjogUGV0cmlOZXRSZXF1ZXN0Qm9keSxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5BRV9XT1JLRkxPV19TRVJWSUNFX0NPTkZJUk1fREVMRVRFKSBjb25maXJtRGVsZXRlOiBib29sZWFuKSB7XG4gICAgICAgIHN1cGVyKHJlc29sdmVyKTtcbiAgICAgICAgdGhpcy5fbG9hZGluZyQgPSBuZXcgTG9hZGluZ0VtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fY2xlYXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZW5kT2ZEYXRhID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BhZ2luYXRpb24gPSB7XG4gICAgICAgICAgICBzaXplOiAyNSxcbiAgICAgICAgICAgIHRvdGFsRWxlbWVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRvdGFsUGFnZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG51bWJlcjogLTFcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fbmV4dFBhZ2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQYWdpbmF0aW9uPihcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3BhZ2luYXRpb24sIHtudW1iZXI6IDB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuX2Jhc2VGaWx0ZXIgPSBpbmplY3RlZEJhc2VGaWx0ZXIgIT09IG51bGwgPyBpbmplY3RlZEJhc2VGaWx0ZXIgOiB7fTtcbiAgICAgICAgdGhpcy5fc2hvd0RlbGV0ZUNvbmZpcm1hdGlvbkRpYWxvZyA9IGNvbmZpcm1EZWxldGUgPT09IG51bGwgfHwgY29uZmlybURlbGV0ZTtcblxuICAgICAgICBjb25zdCB3b3JrZmxvd3NNYXAgPSB0aGlzLl9uZXh0UGFnZSQucGlwZShcbiAgICAgICAgICAgIG1lcmdlTWFwKHAgPT4gdGhpcy5sb2FkUGFnZShwKSksXG4gICAgICAgICAgICBtYXAocGV0cmlOZXRzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2xlYXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2V0IGFuIGVtcHR5IHZhbHVlIHRvIHRoZSB2aXJ0dWFsIHNjcm9sbCBhbmQgdGhlbiByZXBsYWNlIGl0IGJ5IHRoZSByZWFsIHZhbHVlIGZvcmNpbmcgaXQgdG8gcmVkcmF3IGl0cyBjb250ZW50XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbe2NvbnRlbnQ6IFtdLCBzdG9wTG9hZGluZzogZmFsc2V9LCB7Y29udGVudDogcGV0cmlOZXRzLCBzdG9wTG9hZGluZzogdHJ1ZX1dO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlUb09ic2VydmFibGUocmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHtjb250ZW50OiBwZXRyaU5ldHMsIHN0b3BMb2FkaW5nOiB0cnVlfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjb25jYXRNYXAobyA9PiBvKSxcbiAgICAgICAgICAgIG1hcChvID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoby5zdG9wTG9hZGluZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2FkaW5nJC5vZmYoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG8uY29udGVudDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbWFwKHBldHJpTmV0cyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBldHJpTmV0cy5yZWR1Y2UoKGFjYywgY3VyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7Li4uYWNjLCBbY3VyLnN0cmluZ0lkXTogY3VyfTtcbiAgICAgICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNjYW4oKGFjYywgcGV0cmlOZXRzTWFwKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NsZWFyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7Li4ucGV0cmlOZXRzTWFwfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsuLi5hY2MsIC4uLnBldHJpTmV0c01hcH07XG4gICAgICAgICAgICB9LCB7fSlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLl93b3JrZmxvd3MkID0gd29ya2Zsb3dzTWFwLnBpcGUoXG4gICAgICAgICAgICBtYXAodiA9PiBPYmplY3QudmFsdWVzKHYpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgICAgICB0aGlzLl9sb2FkaW5nJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9uZXh0UGFnZSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkaW5nJC5pc0FjdGl2ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvYWRpbmckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB3b3JrZmxvd3MkKCk6IE9ic2VydmFibGU8QXJyYXk8TmV0Pj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya2Zsb3dzJDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0U2VhcmNoVGl0bGUodGl0bGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9iYXNlRmlsdGVyLnRpdGxlID0gdGl0bGU7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyU2VhcmNoVGl0bGUoKSB7XG4gICAgICAgIHRoaXMuX2Jhc2VGaWx0ZXIudGl0bGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRQYWdlKHBhZ2VSZXF1ZXN0OiBQYWdpbmF0aW9uKTogT2JzZXJ2YWJsZTxBcnJheTxOZXQ+PiB7XG4gICAgICAgIGlmIChwYWdlUmVxdWVzdC5udW1iZXIgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgICAgICBwYXJhbXMgPSB0aGlzLmFkZFNvcnRQYXJhbXMocGFyYW1zKTtcbiAgICAgICAgcGFyYW1zID0gdGhpcy5hZGRQYWdlUGFyYW1zKHBhcmFtcywgcGFnZVJlcXVlc3QpO1xuICAgICAgICB0aGlzLl9sb2FkaW5nJC5vbigpO1xuXG4gICAgICAgIGxldCByZXF1ZXN0OiBPYnNlcnZhYmxlPFBhZ2U8UGV0cmlOZXRSZWZlcmVuY2U+PjtcbiAgICAgICAgaWYgKHRoaXMuX2Jhc2VGaWx0ZXIudGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVxdWVzdCA9IHRoaXMuX3BldHJpTmV0UmVzb3VyY2Uuc2VhcmNoRWxhc3RpY1BldHJpTmV0cyh0aGlzLl9iYXNlRmlsdGVyLCBwYXJhbXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVxdWVzdCA9IHRoaXMuX3BldHJpTmV0UmVzb3VyY2Uuc2VhcmNoUGV0cmlOZXRzKHRoaXMuX2Jhc2VGaWx0ZXIsIHBhcmFtcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcXVlc3QucGlwZShcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoJ0xvYWRpbmcgUGV0cmkgbmV0cyBoYXMgZmFpbGVkIScsIGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKHtjb250ZW50OiBbXSwgcGFnaW5hdGlvbjogey4uLnRoaXMuX3BhZ2luYXRpb259fSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRhcChyZXMgPT4ge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fcGFnaW5hdGlvbiwgcmVzLnBhZ2luYXRpb24pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0YXAocmVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbmRPZkRhdGEgPSAhaGFzQ29udGVudChyZXMpXG4gICAgICAgICAgICAgICAgICAgIHx8IHJlcy5wYWdpbmF0aW9uLm51bWJlciA9PT0gcmVzLnBhZ2luYXRpb24udG90YWxQYWdlcyAtIDE7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1hcCgobmV0c1BhZ2U6IFBhZ2U8UGV0cmlOZXRSZWZlcmVuY2U+KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0NvbnRlbnQobmV0c1BhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5OiBBcnJheTxOZXQ+ID0gW107XG4gICAgICAgICAgICAgICAgICAgIG5ldHNQYWdlLmNvbnRlbnQuZm9yRWFjaChuZXQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChuZXcgTmV0KG5ldCkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZXh0UGFnZShyZW5kZXJlZFJhbmdlOiBMaXN0UmFuZ2UsIHRvdGFsTG9hZGVkOiBudW1iZXIsIHBhZ2luYXRpb24/OiBQYWdpbmF0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbmRPZkRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZW5kZXJlZFJhbmdlLmVuZCA9PT0gdG90YWxMb2FkZWQpIHtcbiAgICAgICAgICAgIGxldCBwID0gcGFnaW5hdGlvbjtcbiAgICAgICAgICAgIGlmIChwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcGFnaW5hdGlvbik7XG4gICAgICAgICAgICAgICAgcC5udW1iZXIgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX25leHRQYWdlJC5uZXh0KHApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlbG9hZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl93b3JrZmxvd3MkIHx8ICF0aGlzLl9wYWdpbmF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lbmRPZkRhdGEgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY2xlYXIgPSB0cnVlO1xuICAgICAgICBjb25zdCBwID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcGFnaW5hdGlvbik7XG4gICAgICAgIHAubnVtYmVyID0gMDtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB7XG4gICAgICAgICAgICBzdGFydDogLTEsXG4gICAgICAgICAgICBlbmQ6IDBcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5uZXh0UGFnZShyYW5nZSwgMCwgcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgYSBkaWFsb2cgKGlmIGNvbmZpZ3VyZWQpIGFuZCB0aGVuIGFza3MgdGhlIHNlcnZpY2UgdG8gZGVsZXRlIHRoZSBzZWxlY3RlZCB3b3JrZmxvdy5cbiAgICAgKiBAcGFyYW0gd29ya2Zsb3cgdGhlIHdvcmtmbG93IHRoYXQgc2hvdWxkIGJlIGRlbGV0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlV29ya2Zsb3cod29ya2Zsb3c6IE5ldCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fc2hvd0RlbGV0ZUNvbmZpcm1hdGlvbkRpYWxvZykge1xuICAgICAgICAgICAgY29uc3QgY29uZmlybWF0aW9uVGV4dCA9IHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCd3b3JrZmxvdy5kZWxldGUnKS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICAgICAgICB0aGlzLl9kaWFsb2dTZXJ2aWNlLm9wZW5Qcm9tcHREaWFsb2coXG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3dvcmtmbG93LmRpYWxvZy5oZWFkZXInLCB7bmFtZTogd29ya2Zsb3cudGl0bGUsIHZlcnNpb246IHdvcmtmbG93LnZlcnNpb259KSxcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgnd29ya2Zsb3cuZGlhbG9nLmNvbnRlbnQnKSxcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgnd29ya2Zsb3cuZGlhbG9nLnR5cGVUb0NvbmZpcm0nLCB7ZGVsZXRlOiBjb25maXJtYXRpb25UZXh0fSkpXG4gICAgICAgICAgICAgICAgLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdC5wcm9tcHQgPT09IGNvbmZpcm1hdGlvblRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsZXRlV29ya2Zsb3cod29ya2Zsb3cpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyU2VydmljZS5vcGVuR2VuZXJpY1NuYWNrQmFyKHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCd3b3JrZmxvdy5zbmFja0Jhci5kZWxldGVDYW5jZWxlZCcpLCAnaW5mbycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZGVsZXRlV29ya2Zsb3cod29ya2Zsb3cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZHMgdGhlIHdvcmtmbG93IGRlbGV0ZSB0byBiYWNrZW5kIGFuZCBwcm9jZXNzZXMgdGhlIHJlc3VsdC5cbiAgICAgKiBAcGFyYW0gd29ya2Zsb3cgdGhlIHdvcmtmbG93IHRoYXQgc2hvdWxkIGJlIGRlbGV0ZWRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2RlbGV0ZVdvcmtmbG93KHdvcmtmbG93OiBOZXQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcGV0cmlOZXRSZXNvdXJjZS5kZWxldGVQZXRyaU5ldCh3b3JrZmxvdy5zdHJpbmdJZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zbmFja0JhclNlcnZpY2Uub3BlblN1Y2Nlc3NTbmFja0Jhcih0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgnd29ya2Zsb3cuc25hY2tCYXIuZGVsZXRlSW5Qcm9ncmVzcycpKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2cuaW5mbygnUHJvY2VzcyBkZWxldGUgc3VjY2Vzcy4gU2VydmVyIHJlc3BvbnNlOiAnICsgcmVzcG9uc2Uuc3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc25hY2tCYXJTZXJ2aWNlLm9wZW5FcnJvclNuYWNrQmFyKHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCd3b3JrZmxvdy5zbmFja0Jhci5kZWxldGVFcnJvcicpKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoJ1Byb2Nlc3MgZGVsZXRlIGZhaWxlZC4gU2VydmVyIHJlc3BvbnNlOiAnICsgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRNZXRhRmllbGRTb3J0SWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RIZWFkZXJTZWFyY2hTdGF0ZS5maWVsZElkZW50aWZpZXI7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldERlZmF1bHRTb3J0UGFyYW0oKTogc3RyaW5nIHtcbiAgICAgICAgLy8gVE9ETyA3LjQuMjAyMCAtIHdvcmtmbG93IHNvcnRpbmcgYW5kIHNlYXJjaGluZ1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFkZFBhZ2VQYXJhbXMocGFyYW1zOiBIdHRwUGFyYW1zLCBwYWdpbmF0aW9uOiBQYWdpbmF0aW9uKTogSHR0cFBhcmFtcyB7XG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoUGFnaW5hdGlvblBhcmFtcy5QQUdFX1NJWkUsIGAke3BhZ2luYXRpb24uc2l6ZX1gKTtcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNldChQYWdpbmF0aW9uUGFyYW1zLlBBR0VfTlVNQkVSLCBgJHtwYWdpbmF0aW9uLm51bWJlcn1gKTtcbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG5cbn1cbiJdfQ==