ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
422 lines • 59.8 kB
JavaScript
import { EventEmitter } from '@angular/core';
import { combineLatest } from 'rxjs';
import { OFormLayoutDialogComponent } from '../../../layouts/form-layout/dialog/o-form-layout-dialog.component';
import { NavigationService } from '../../../services/navigation.service';
import { Codes } from '../../../util/codes';
import { SQLTypes } from '../../../util/sqltypes';
import { Util } from '../../../util/util';
import { OFormConfirmExitService } from './o-form-confirm-exit.service';
import { OFormLayoutManagerBase } from '../../../layouts/form-layout/o-form-layout-manager-base.class';
export class OFormNavigationClass {
constructor(injector, form, router, actRoute) {
this.injector = injector;
this.form = form;
this.router = router;
this.actRoute = actRoute;
this.urlSegments = [];
this.onUrlParamChangedStream = new EventEmitter();
this.navigationStream = new EventEmitter();
this.navigationService = injector.get(NavigationService);
this.confirmExitService = injector.get(OFormConfirmExitService);
try {
this.formLayoutManager = this.injector.get(OFormLayoutManagerBase);
}
catch (e) {
}
try {
this.formLayoutDialog = this.injector.get(OFormLayoutDialogComponent);
}
catch (e) {
}
if (this.formLayoutDialog && !this.formLayoutManager) {
this.formLayoutManager = this.formLayoutDialog.formLayoutManager;
}
const self = this;
this.combinedNavigationStream = combineLatest([self.onUrlParamChangedStream.asObservable()]);
this.combinedNavigationStream.subscribe(valArr => {
if (Util.isArray(valArr) && valArr.length === 1 && valArr[0]) {
self.navigationStream.emit(true);
}
});
}
initialize() {
}
destroy() {
if (this.qParamSub) {
this.qParamSub.unsubscribe();
}
if (this.urlParamSub) {
this.urlParamSub.unsubscribe();
}
if (this.urlSub) {
this.urlSub.unsubscribe();
}
if (this.combinedNavigationStreamSubscription) {
this.combinedNavigationStreamSubscription.unsubscribe();
}
}
subscribeToQueryParams() {
if (this.formLayoutManager) {
const cacheData = this.formLayoutManager.getFormCacheData();
if (Util.isDefined(cacheData)) {
this.queryParams = cacheData.queryParams || {};
this.parseQueryParams();
}
}
else {
const self = this;
this.qParamSub = this.actRoute.queryParams.subscribe(params => {
if (params) {
self.queryParams = params;
self.parseQueryParams();
}
});
}
}
parseQueryParams() {
const isDetail = this.queryParams[Codes.IS_DETAIL];
this.form.isDetailForm = this.formLayoutManager ? false : (isDetail === 'true');
}
subscribeToUrlParams() {
if (this.formLayoutManager) {
const cacheData = this.formLayoutManager.getFormCacheData();
if (Util.isDefined(cacheData)) {
this.urlParams = cacheData.params;
this.parseUrlParams();
}
}
else {
const self = this;
this.urlParamSub = this.actRoute.params.subscribe(params => {
self.urlParams = params;
this.parseUrlParams();
});
}
}
parseUrlParams() {
if (Util.isDefined(this.urlParams) && Util.isDefined(this.urlParams[Codes.PARENT_KEYS_KEY])) {
this.form.formParentKeysValues = Util.decodeParentKeys(this.urlParams[Codes.PARENT_KEYS_KEY]);
}
if (this.urlParams) {
this.onUrlParamChangedStream.emit(true);
}
}
subscribeToUrl() {
if (this.formLayoutManager) {
const cacheData = this.formLayoutManager.getFormCacheData();
if (Util.isDefined(cacheData)) {
this.urlSegments = cacheData.urlSegments;
}
}
else {
const self = this;
this.urlSub = this.actRoute.url.subscribe(urlSegments => {
self.urlSegments = urlSegments;
});
}
}
subscribeToCacheChanges() {
const formCache = this.form.getFormCache();
if (!Util.isDefined(formCache)) {
return;
}
this.cacheStateSubscription = formCache.onCacheStateChanges.subscribe(() => {
const initialStateChanged = this.form.isInitialStateChanged();
const triggerExitConfirm = this.form.confirmExit && this.form.isInitialStateChanged(this.form.ignoreOnExit);
this.setModifiedState(initialStateChanged, triggerExitConfirm);
});
}
getCurrentKeysValues() {
let filter = {};
if (this.urlParams) {
filter = this.getFilterFromObject(this.urlParams);
}
return filter;
}
getFilterFromObject(objectParam) {
const filter = {};
if (!objectParam || Object.keys(objectParam).length === 0) {
return filter;
}
if (this.form.keysArray) {
this.form.keysArray.forEach((key, index) => {
if (objectParam[key]) {
filter[key] = SQLTypes.parseUsingSQLType(objectParam[key], this.form.keysSqlTypesArray[index]);
}
});
}
Object.keys(this.form._pKeysEquiv).forEach((item, index) => {
const urlVal = objectParam[this.form._pKeysEquiv[item]];
if (urlVal) {
filter[item] = SQLTypes.parseUsingSQLType(urlVal, this.form.keysSqlTypesArray[index]);
}
});
return filter;
}
getFilterFromUrlParams() {
const filter = Object.assign({}, this.getUrlParams() || {});
const urlParamsKeys = Object.keys(filter || {});
if (urlParamsKeys.length > 0) {
urlParamsKeys.forEach(key => {
if (key === Codes.PARENT_KEYS_KEY) {
delete filter[key];
Object.assign(filter, this.form.formParentKeysValues);
}
});
}
return filter;
}
getUrlSegments() {
return this.urlSegments;
}
getQueryParams() {
return this.queryParams;
}
setUrlParams(val) {
this.urlParams = val;
}
getUrlParams() {
return this.urlParams;
}
setModifiedState(modified, confirmExit) {
if (this.formLayoutManager) {
this.formLayoutManager.setModifiedState(this.form.getAttribute(), modified, confirmExit);
}
}
updateNavigation() {
if (this.formLayoutManager) {
const isInInsertMode = this.form.isInInsertMode();
let formData;
if (isInInsertMode) {
formData = {};
formData.new_tab_title = 'LAYOUT_MANANGER.INSERTION_MODE_TITLE';
}
else if (this.formLayoutManager.allowToUpdateNavigation(this.form.getAttribute())) {
formData = {};
Object.keys(this.form.formData).forEach(key => {
formData[key] = this.form.formData[key].value;
});
}
if (formData) {
this.formLayoutManager.updateNavigation(formData, this.form.getKeysValues(), isInInsertMode);
}
}
}
navigateBack(options) {
if (this.formLayoutManager) {
this.formLayoutManager.closeDetail(options);
}
else if (this.navigationService) {
this.navigationService.removeLastItem();
if (options && options.ignoreNavigation) {
return;
}
const navData = this.navigationService.getLastItem();
if (navData) {
let extras = {};
extras[Codes.QUERY_PARAMS] = navData.queryParams;
if (options?.exitWithoutConfirmation) {
const ignore = { [Codes.IGNORE_CAN_DEACTIVATE]: options.exitWithoutConfirmation };
extras.queryParams = {
...extras.queryParams, ...ignore
};
}
this.router.navigate([navData.url], extras);
}
}
}
closeDetailAction(options) {
if (this.formLayoutManager) {
this.formLayoutManager.closeDetail(options);
}
else if (this.navigationService) {
this.form.beforeCloseDetail.emit();
if (!this.navigationService.removeLastItemsUntilMain()) {
this.navigationService.removeLastItem();
}
if (options && options.ignoreNavigation) {
return;
}
let navData = this.navigationService.getLastItem();
if (navData) {
if (this.navigationService.isCurrentRoute(navData.url)) {
this.navigationService.removeLastItem();
navData = this.navigationService.getLastItem();
}
let extras = {};
extras.queryParams = { ...navData.queryParams };
if (options && options.exitWithoutConfirmation) {
const ignore = { [Codes.IGNORE_CAN_DEACTIVATE]: options.exitWithoutConfirmation };
Object.assign(extras.queryParams, ignore);
}
this.router.navigate([navData.url], extras).then(val => {
if (val && options && options.changeToolbarMode) {
this.form.getFormToolbar().setInitialMode();
}
});
}
}
}
stayInRecordAfterInsert(insertedKeys) {
if (this.navigationService && this.form.keysArray && insertedKeys) {
if (this.formLayoutManager) {
const closeOpts = { exitWithoutConfirmation: true };
this.formLayoutManager.closeDetail(closeOpts);
this.formLayoutManager.setAsActiveFormLayoutManager();
}
else {
this.navigationService.removeLastItem();
}
let params = [];
this.form.keysArray.forEach((current) => {
if (insertedKeys[current]) {
params.push(insertedKeys[current]);
}
});
let extras = {};
let qParams = Object.assign({}, this.getQueryParams(), Codes.getIsDetailObject());
delete qParams[Codes.INSERTION_MODE];
qParams[Codes.IGNORE_CAN_DEACTIVATE] = true;
extras[Codes.QUERY_PARAMS] = qParams;
let route = [];
const navData = this.navigationService.getLastMainNavigationRouteData();
if (navData) {
let url = navData.url;
const detailRoute = navData.getDetailFormRoute();
if (Util.isDefined(detailRoute)) {
route.push(detailRoute);
const detailIndex = url.lastIndexOf('/' + detailRoute);
if (detailIndex !== -1) {
url = url.substring(0, detailIndex);
}
}
route.unshift(url);
route.push(...params);
this.navigationService.deleteActiveFormMode(navData);
}
else {
extras.relativeTo = this.actRoute;
route = ['../', ...params];
}
this.router.navigate(route, extras);
}
}
goInsertMode(options) {
if (this.formLayoutManager && this.formLayoutManager.allowNavigation()) {
this.form.setInsertMode();
}
else if (this.navigationService) {
if (this.formLayoutManager) {
this.formLayoutManager.setAsActiveFormLayoutManager();
}
let route = [];
const extras = {};
const navData = this.navigationService.getLastMainNavigationRouteData();
if (!this.formLayoutManager && navData) {
route.push(navData.url);
const detailRoute = navData.getDetailFormRoute();
if (Util.isDefined(detailRoute)) {
route.push(detailRoute);
}
route.push(navData.getInsertFormRoute());
}
else {
extras.relativeTo = this.actRoute;
route = [Codes.DEFAULT_INSERT_ROUTE];
if (this.formLayoutManager && this.formLayoutManager.isTabMode()) {
extras.queryParams = {};
extras.queryParams[Codes.INSERTION_MODE] = 'true';
extras.queryParams[Codes.IGNORE_CAN_DEACTIVATE] = true;
}
}
this.storeNavigationFormRoutes('insertFormRoute', !!this.formLayoutManager);
this.router.navigate(route, extras).then((val) => {
if (val && options && options.changeToolbarMode) {
this.form.getFormToolbar().setInsertMode();
}
});
}
}
goEditMode(options) {
if (this.formLayoutManager && this.formLayoutManager.allowNavigation()) {
this.form.setUpdateMode();
}
else if (this.navigationService) {
let route = [];
const extras = {};
if (this.form.isDetailForm) {
extras[Codes.QUERY_PARAMS] = Codes.getIsDetailObject();
}
extras[Codes.QUERY_PARAMS] = Object.assign({}, this.getQueryParams(), extras[Codes.QUERY_PARAMS] || {});
const params = [];
const urlParams = this.getUrlParams();
this.form.keysArray.forEach(key => {
if (urlParams[key]) {
params.push(urlParams[key]);
}
});
const navData = this.navigationService.getPreviousRouteData();
if (Util.isDefined(navData)) {
route.push(navData.url);
const detailRoute = navData.getDetailFormRoute();
if (Util.isDefined(detailRoute)) {
route.push(detailRoute);
}
route.push(...params);
route.push(navData.getEditFormRoute());
}
else {
extras.relativeTo = this.actRoute;
route = ['../', ...params, Codes.DEFAULT_EDIT_ROUTE];
}
this.storeNavigationFormRoutes('editFormRoute');
this.form.beforeUpdateMode.emit();
this.router.navigate(route, extras).then((val) => {
if (val && options && options.changeToolbarMode) {
this.form.getFormToolbar().setEditMode();
}
});
}
}
getNestedLevelsNumber() {
let actRoute = this.actRoute;
let i = 0;
while (actRoute.parent) {
actRoute = actRoute.parent;
actRoute.url.subscribe((x) => {
if (x && x.length) {
i++;
}
});
}
return i;
}
getFullUrlSegments() {
let fullUrlSegments = [];
const router = this.router;
if (router && router.url && router.url.length) {
const root = router.parseUrl(router.url).root;
if (root && root.hasChildren() && root.children.primary) {
fullUrlSegments = root.children.primary.segments;
}
}
return fullUrlSegments;
}
showConfirmDiscardChanges(ignoreAttrs = []) {
return this.confirmExitService.subscribeToDiscardChanges(this.form, ignoreAttrs);
}
storeNavigationFormRoutes(activeMode, mainFormLayoutManagerComponent) {
const prevRouteData = this.navigationService.getPreviousRouteData();
if (!Util.isDefined(prevRouteData)) {
return;
}
const formRoutes = prevRouteData.formRoutes;
this.navigationService.storeFormRoutes({
detailFormRoute: formRoutes ? formRoutes.detailFormRoute : Codes.DEFAULT_DETAIL_ROUTE,
editFormRoute: formRoutes ? formRoutes.editFormRoute : Codes.DEFAULT_EDIT_ROUTE,
insertFormRoute: formRoutes ? formRoutes.insertFormRoute : Codes.DEFAULT_INSERT_ROUTE,
mainFormLayoutManagerComponent
}, activeMode);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1mb3JtLm5hdmlnYXRpb24uY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy9mb3JtL25hdmlnYXRpb24vby1mb3JtLm5hdmlnYXRpb24uY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUV2RCxPQUFPLEVBQUUsYUFBYSxFQUE0QixNQUFNLE1BQU0sQ0FBQztBQUUvRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvRUFBb0UsQ0FBQztBQUNoSCxPQUFPLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0sc0NBQXNDLENBQUM7QUFLMUYsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFeEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0RBQStELENBQUM7QUFFdkcsTUFBTSxPQUFPLG9CQUFvQjtJQTBCL0IsWUFDWSxRQUFrQixFQUNsQixJQUFlLEVBQ2YsTUFBYyxFQUNkLFFBQXdCO1FBSHhCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsU0FBSSxHQUFKLElBQUksQ0FBVztRQUNmLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxhQUFRLEdBQVIsUUFBUSxDQUFnQjtRQWYxQixnQkFBVyxHQUFRLEVBQUUsQ0FBQztRQUl0Qiw0QkFBdUIsR0FBMEIsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUVoRixxQkFBZ0IsR0FBMEIsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQVczRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFFaEUsSUFBSTtZQUNGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1NBQ3BFO1FBQUMsT0FBTyxDQUFDLEVBQUU7U0FFWDtRQUVELElBQUk7WUFDRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQztTQUN2RTtRQUFDLE9BQU8sQ0FBQyxFQUFFO1NBRVg7UUFFRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUNwRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDO1NBQ2xFO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTdGLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDL0MsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDNUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNsQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFVBQVU7SUFDVixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQzlCO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDaEM7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQzNCO1FBQ0QsSUFBSSxJQUFJLENBQUMsb0NBQW9DLEVBQUU7WUFDN0MsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3pEO0lBQ0gsQ0FBQztJQUVELHNCQUFzQjtRQUNwQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixNQUFNLFNBQVMsR0FBa0MsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDM0YsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUM3QixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO2dCQUMvQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzthQUN6QjtTQUNGO2FBQU07WUFDTCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7WUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzVELElBQUksTUFBTSxFQUFFO29CQUNWLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO29CQUMxQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztpQkFDekI7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixNQUFNLFNBQVMsR0FBa0MsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDM0YsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUN2QjtTQUNGO2FBQU07WUFDTCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7WUFDbEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3pELElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO2dCQUN4QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFO1lBQzNGLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7U0FDL0Y7UUFHRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6QztJQUNILENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsTUFBTSxTQUFTLEdBQWtDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNGLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDO2FBQzFDO1NBQ0Y7YUFBTTtZQUNMLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztZQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDdEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7WUFDakMsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRCx1QkFBdUI7UUFDckIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUM5QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDekUsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDOUQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDNUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDbkQ7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sbUJBQW1CLENBQUMsV0FBZ0I7UUFDMUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3pELE9BQU8sTUFBTSxDQUFDO1NBQ2Y7UUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDekMsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ3BCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDaEc7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN6RCxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4RCxJQUFJLE1BQU0sRUFBRTtnQkFDVixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDdkY7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxzQkFBc0I7UUFDcEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDNUIsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDMUIsSUFBSSxHQUFHLEtBQUssS0FBSyxDQUFDLGVBQWUsRUFBRTtvQkFDakMsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ25CLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztpQkFDdkQ7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELFlBQVksQ0FBQyxHQUFXO1FBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFUyxnQkFBZ0IsQ0FBQyxRQUFpQixFQUFFLFdBQW9CO1FBQ2hFLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztTQUMxRjtJQUNILENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2xELElBQUksUUFBUSxDQUFDO1lBQ2IsSUFBSSxjQUFjLEVBQUU7Z0JBQ2xCLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JBQ2QsUUFBUSxDQUFDLGFBQWEsR0FBRyxzQ0FBc0MsQ0FBQzthQUNqRTtpQkFBTSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUU7Z0JBQ25GLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDNUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDaEQsQ0FBQyxDQUFDLENBQUM7YUFDSjtZQUNELElBQUksUUFBUSxFQUFFO2dCQUNaLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQzthQUM5RjtTQUNGO0lBQ0gsQ0FBQztJQUVELFlBQVksQ0FBQyxPQUFhO1FBQ3hCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDN0M7YUFBTSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUNqQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEMsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLGdCQUFnQixFQUFFO2dCQUN2QyxPQUFPO2FBQ1I7WUFDRCxNQUFNLE9BQU8sR0FBb0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RFLElBQUksT0FBTyxFQUFFO2dCQUNYLElBQUksTUFBTSxHQUFvQixFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztnQkFDakQsSUFBSSxPQUFPLEVBQUUsdUJBQXVCLEVBQUU7b0JBQ3BDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsRUFBRSxPQUFPLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztvQkFDbEYsTUFBTSxDQUFDLFdBQVcsR0FBRzt3QkFDbkIsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLEdBQUcsTUFBTTtxQkFDakMsQ0FBQztpQkFDSDtnQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQzthQUM3QztTQUNGO0lBQ0gsQ0FBQztJQUVELGlCQUFpQixDQUFDLE9BQWE7UUFDN0IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM3QzthQUFNLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsRUFBRSxFQUFFO2dCQUV0RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDekM7WUFDRCxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3ZDLE9BQU87YUFDUjtZQUNELElBQUksT0FBTyxHQUFvQixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDcEUsSUFBSSxPQUFPLEVBQUU7Z0JBRVgsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDdEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN4QyxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDO2lCQUNoRDtnQkFDRCxJQUFJLE1BQU0sR0FBcUIsRUFBRSxDQUFDO2dCQUNsQyxNQUFNLENBQUMsV0FBVyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2hELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRTtvQkFDOUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO29CQUNsRixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7aUJBQzNDO2dCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDckQsSUFBSSxHQUFHLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTt3QkFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztxQkFDN0M7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDSjtTQUNGO0lBQ0gsQ0FBQztJQUVELHVCQUF1QixDQUFDLFlBQW9CO1FBQzFDLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLFlBQVksRUFBRTtZQUNqRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDMUIsTUFBTSxTQUFTLEdBQWlDLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBQ2xGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO2FBQ3ZEO2lCQUFNO2dCQUVMLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUN6QztZQUNELElBQUksTUFBTSxHQUFVLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDdEMsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7aUJBQ3BDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLE1BQU0sR0FBcUIsRUFBRSxDQUFDO1lBQ2xDLElBQUksT0FBTyxHQUFRLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1lBRXZGLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUVyQyxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQ3JDLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNmLE1BQU0sT0FBTyxHQUFvQixJQUFJLENBQUMsaUJBQWlCLENBQUMsOEJBQThCLEVBQUUsQ0FBQztZQUN6RixJQUFJLE9BQU8sRUFBRTtnQkFDWCxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO2dCQUN0QixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDakQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFO29CQUMvQixLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUN4QixNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsQ0FBQztvQkFDdkQsSUFBSSxXQUFXLEtBQUssQ0FBQyxDQUFDLEVBQUU7d0JBQ3RCLEdBQUcsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztxQkFDckM7aUJBQ0Y7Z0JBQ0QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO2dCQUV0QixJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDdEQ7aUJBQU07Z0JBQ0wsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNsQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQzthQUM1QjtZQUNELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNyQztJQUNILENBQUM7SUFLRCxZQUFZLENBQUMsT0FBYTtRQUN4QixJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFDdEUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUMzQjthQUFNLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ2pDLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsNEJBQTRCLEVBQUUsQ0FBQzthQUN2RDtZQUVELElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNmLE1BQU0sTUFBTSxHQUFxQixFQUFFLENBQUM7WUFDcEMsTUFBTSxPQUFPLEdBQW9CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1lBQ3pGLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksT0FBTyxFQUFFO2dCQUN0QyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDeEIsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ2pELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRTtvQkFDL0IsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDekI7Z0JBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO2FBQzFDO2lCQUFNO2dCQUNMLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDbEMsS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBQ3JDLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsRUFBRTtvQkFDaEUsTUFBTSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7b0JBQ3hCLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztvQkFDbEQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsR0FBRyxJQUFJLENBQUM7aUJBQ3hEO2FBQ0Y7WUFDRCxJQUFJLENBQUMseUJBQXlCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzVFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDL0MsSUFBSSxHQUFHLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTtvQkFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztpQkFDNUM7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUtELFVBQVUsQ0FBQyxPQUFhO1FBQ3RCLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLEVBQUUsRUFBRTtZQUN0RSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQzNCO2FBQU0sSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDakMsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2YsTUFBTSxNQUFNLEdBQXFCLEVBQUUsQ0FBQztZQUNwQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUMxQixNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQ3hEO1lBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUV4RyxNQUFNLE1BQU0sR0FBVSxFQUFFLENBQUM7WUFDekIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDaEMsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ2xCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQzdCO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBb0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDL0UsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUMzQixLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDeEIsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ2pELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRTtvQkFDL0IsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDekI7Z0JBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO2dCQUN0QixLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7YUFDeEM7aUJBQU07Z0JBQ0wsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNsQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxNQUFNLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDdEQ7WUFDRCxJQUFJLENBQUMseUJBQXlCLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQy9DLElBQUksR0FBRyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsaUJBQWlCLEVBQUU7b0JBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7aUJBQzFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFLRCxxQkFBcUI7UUFDbkIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixPQUFPLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDdEIsUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDM0IsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRTtvQkFDakIsQ0FBQyxFQUFFLENBQUM7aUJBQ0w7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBS0Qsa0JBQWtCO1FBQ2hCLElBQUksZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUN6QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUU7WUFDN0MsTUFBTSxJQUFJLEdBQW9CLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMvRCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3ZELGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7YUFDbEQ7U0FDRjtRQUNELE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxjQUF3QixFQUFFO1FBQ2xELE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVTLHlCQUF5QixDQUFDLFVBQWtCLEVBQUUsOEJBQXdDO1FBQzlGLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3BFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ2xDLE9BQU87U0FDUjtRQUNELE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUM7UUFDNUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQztZQUNyQyxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CO1lBQ3JGLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxrQkFBa0I7WUFDL0UsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLG9CQUFvQjtZQUNyRiw4QkFBOEI7U0FDL0IsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNqQixDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgTmF2aWdhdGlvbkV4dHJhcywgUm91dGVyLCBVcmxTZWdtZW50R3JvdXAgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE9Gb3JtTGF5b3V0RGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vbGF5b3V0cy9mb3JtLWxheW91dC9kaWFsb2cvby1mb3JtLWxheW91dC1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlLCBPTmF2aWdhdGlvbkl0ZW0gfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgRm9ybUxheW91dENsb3NlRGV0YWlsT3B0aW9ucyxcbiAgRm9ybUxheW91dERldGFpbENvbXBvbmVudERhdGFcbn0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvZm9ybS1sYXlvdXQtZGV0YWlsLWNvbXBvbmVudC1kYXRhLnR5cGUnO1xuaW1wb3J0IHsgQ29kZXMgfSBmcm9tICcuLi8uLi8uLi91dGlsL2NvZGVzJztcbmltcG9ydCB7IFNRTFR5cGVzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC9zcWx0eXBlcyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IE9Gb3JtQ29uZmlybUV4aXRTZXJ2aWNlIH0gZnJvbSAnLi9vLWZvcm0tY29uZmlybS1leGl0LnNlcnZpY2UnO1xuaW1wb3J0IHsgT0Zvcm1CYXNlIH0gZnJvbSAnLi4vby1mb3JtLWJhc2UuY2xhc3MnO1xuaW1wb3J0IHsgT0Zvcm1MYXlvdXRNYW5hZ2VyQmFzZSB9IGZyb20gJy4uLy4uLy4uL2xheW91dHMvZm9ybS1sYXlvdXQvby1mb3JtLWxheW91dC1tYW5hZ2VyLWJhc2UuY2xhc3MnO1xuXG5leHBvcnQgY2xhc3MgT0Zvcm1OYXZpZ2F0aW9uQ2xhc3Mge1xuXG4gIGZvcm1MYXlvdXRNYW5hZ2VyOiBPRm9ybUxheW91dE1hbmFnZXJCYXNlO1xuICBmb3JtTGF5b3V0RGlhbG9nOiBPRm9ybUxheW91dERpYWxvZ0NvbXBvbmVudDtcblxuICBwcm90ZWN0ZWQgbmF2aWdhdGlvblNlcnZpY2U6IE5hdmlnYXRpb25TZXJ2aWNlO1xuICBwcm90ZWN0ZWQgY29uZmlybUV4aXRTZXJ2aWNlOiBPRm9ybUNvbmZpcm1FeGl0U2VydmljZTtcblxuICBwcm90ZWN0ZWQgcVBhcmFtU3ViOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBxdWVyeVBhcmFtczogYW55O1xuXG4gIHByb3RlY3RlZCB1cmxQYXJhbVN1YjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgdXJsUGFyYW1zOiBvYmplY3Q7XG5cbiAgcHJvdGVjdGVkIHVybFN1YjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgdXJsU2VnbWVudHM6IGFueSA9IFtdO1xuXG4gIHByb3RlY3RlZCBjb21iaW5lZE5hdmlnYXRpb25TdHJlYW06IE9ic2VydmFibGU8YW55PjtcbiAgcHJvdGVjdGVkIGNvbWJpbmVkTmF2aWdhdGlvblN0cmVhbVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgb25VcmxQYXJhbUNoYW5nZWRTdHJlYW06IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBwdWJsaWMgbmF2aWdhdGlvblN0cmVhbTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIHByb3RlY3RlZCBvbkNsb3NlVGFiU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBjYWNoZVN0YXRlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgZm9ybTogT0Zvcm1CYXNlLFxuICAgIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcixcbiAgICBwcm90ZWN0ZWQgYWN0Um91dGU6IEFjdGl2YXRlZFJvdXRlXG4gICkge1xuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UgPSBpbmplY3Rvci5nZXQoTmF2aWdhdGlvblNlcnZpY2UpO1xuICAgIHRoaXMuY29uZmlybUV4aXRTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KE9Gb3JtQ29uZmlybUV4aXRTZXJ2aWNlKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyID0gdGhpcy5pbmplY3Rvci5nZXQoT0Zvcm1MYXlvdXRNYW5hZ2VyQmFzZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gTm8gcGFyZW50IGZvcm1MYXlvdXRNYW5hZ2VyXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZm9ybUxheW91dERpYWxvZyA9IHRoaXMuaW5qZWN0b3IuZ2V0KE9Gb3JtTGF5b3V0RGlhbG9nQ29tcG9uZW50KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBObyBwYXJlbnQgZm9ybSBsYXlvdXQgZGlhbG9nXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZm9ybUxheW91dERpYWxvZyAmJiAhdGhpcy5mb3JtTGF5b3V0TWFuYWdlcikge1xuICAgICAgdGhpcy5mb3JtTGF5b3V0TWFuYWdlciA9IHRoaXMuZm9ybUxheW91dERpYWxvZy5mb3JtTGF5b3V0TWFuYWdlcjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICB0aGlzLmNvbWJpbmVkTmF2aWdhdGlvblN0cmVhbSA9IGNvbWJpbmVMYXRlc3QoW3NlbGYub25VcmxQYXJhbUNoYW5nZWRTdHJlYW0uYXNPYnNlcnZhYmxlKCldKTtcblxuICAgIHRoaXMuY29tYmluZWROYXZpZ2F0aW9uU3RyZWFtLnN1YnNjcmliZSh2YWxBcnIgPT4ge1xuICAgICAgaWYgKFV0aWwuaXNBcnJheSh2YWxBcnIpICYmIHZhbEFyci5sZW5ndGggPT09IDEgJiYgdmFsQXJyWzBdKSB7XG4gICAgICAgIHNlbGYubmF2aWdhdGlvblN0cmVhbS5lbWl0KHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMucVBhcmFtU3ViKSB7XG4gICAgICB0aGlzLnFQYXJhbVN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy51cmxQYXJhbVN1Yikge1xuICAgICAgdGhpcy51cmxQYXJhbVN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy51cmxTdWIpIHtcbiAgICAgIHRoaXMudXJsU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbWJpbmVkTmF2aWdhdGlvblN0cmVhbVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5jb21iaW5lZE5hdmlnYXRpb25TdHJlYW1TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBzdWJzY3JpYmVUb1F1ZXJ5UGFyYW1zKCkge1xuICAgIGlmICh0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyKSB7XG4gICAgICBjb25zdCBjYWNoZURhdGE6IEZvcm1MYXlvdXREZXRhaWxDb21wb25lbnREYXRhID0gdGhpcy5mb3JtTGF5b3V0TWFuYWdlci5nZXRGb3JtQ2FjaGVEYXRhKCk7XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQoY2FjaGVEYXRhKSkge1xuICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zID0gY2FjaGVEYXRhLnF1ZXJ5UGFyYW1zIHx8IHt9O1xuICAgICAgICB0aGlzLnBhcnNlUXVlcnlQYXJhbXMoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICB0aGlzLnFQYXJhbVN1YiA9IHRoaXMuYWN0Um91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XG4gICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICBzZWxmLnF1ZXJ5UGFyYW1zID0gcGFyYW1zO1xuICAgICAgICAgIHNlbGYucGFyc2VRdWVyeVBhcmFtcygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhcnNlUXVlcnlQYXJhbXMoKSB7XG4gICAgY29uc3QgaXNEZXRhaWwgPSB0aGlzLnF1ZXJ5UGFyYW1zW0NvZGVzLklTX0RFVEFJTF07XG4gICAgLy8gZW5zdXJpbmcgaXNkZXRhaWwgPSBmYWxzZSB3aGVuIHVzaW5nIGZvcm0gbGF5b3V0IG1hbmFnZXJcbiAgICB0aGlzLmZvcm0uaXNEZXRhaWxGb3JtID0gdGhpcy5mb3JtTGF5b3V0TWFuYWdlciA/IGZhbHNlIDogKGlzRGV0YWlsID09PSAndHJ1ZScpO1xuICB9XG5cbiAgc3Vic2NyaWJlVG9VcmxQYXJhbXMoKSB7XG4gICAgaWYgKHRoaXMuZm9ybUxheW91dE1hbmFnZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlRGF0YTogRm9ybUxheW91dERldGFpbENvbXBvbmVudERhdGEgPSB0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyLmdldEZvcm1DYWNoZURhdGEoKTtcbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChjYWNoZURhdGEpKSB7XG4gICAgICAgIHRoaXMudXJsUGFyYW1zID0gY2FjaGVEYXRhLnBhcmFtcztcbiAgICAgICAgdGhpcy5wYXJzZVVybFBhcmFtcygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgIHRoaXMudXJsUGFyYW1TdWIgPSB0aGlzLmFjdFJvdXRlLnBhcmFtcy5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgICAgc2VsZi51cmxQYXJhbXMgPSBwYXJhbXM7XG4gICAgICAgIHRoaXMucGFyc2VVcmxQYXJhbXMoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VVcmxQYXJhbXMoKSB7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMudXJsUGFyYW1zKSAmJiBVdGlsLmlzRGVmaW5lZCh0aGlzLnVybFBhcmFtc1tDb2Rlcy5QQVJFTlRfS0VZU19LRVldKSkge1xuICAgICAgdGhpcy5mb3JtLmZvcm1QYXJlbnRLZXlzVmFsdWVzID0gVXRpbC5kZWNvZGVQYXJlbnRLZXlzKHRoaXMudXJsUGFyYW1zW0NvZGVzLlBBUkVOVF9LRVlTX0tFWV0pO1xuICAgIH1cbiAgICAvLyBUT0RPIE9idGFpbiAnZGF0YXR5cGUnIG9mIGVhY2gga2V5IGNvbnRhaW5lZCBpbnRvIHVybFBhcmFtcyBmb3JcbiAgICAvLyBmb3IgYnVpbGRpbmcgY29ycmVjdGx5IHF1ZXJ5IGZpbHRlciEhISFcbiAgICBpZiAodGhpcy51cmxQYXJhbXMpIHtcbiAgICAgIHRoaXMub25VcmxQYXJhbUNoYW5nZWRTdHJlYW0uZW1pdCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBzdWJzY3JpYmVUb1VybCgpIHtcbiAgICBpZiAodGhpcy5mb3JtTGF5b3V0TWFuYWdlcikge1xuICAgICAgY29uc3QgY2FjaGVEYXRhOiBGb3JtTGF5b3V0RGV0YWlsQ29tcG9uZW50RGF0YSA9IHRoaXMuZm9ybUxheW91dE1hbmFnZXIuZ2V0Rm9ybUNhY2hlRGF0YSgpO1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNhY2hlRGF0YSkpIHtcbiAgICAgICAgdGhpcy51cmxTZWdtZW50cyA9IGNhY2hlRGF0YS51cmxTZWdtZW50cztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICB0aGlzLnVybFN1YiA9IHRoaXMuYWN0Um91dGUudXJsLnN1YnNjcmliZSh1cmxTZWdtZW50cyA9PiB7XG4gICAgICAgIHNlbGYudXJsU2VnbWVudHMgPSB1cmxTZWdtZW50cztcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHN1YnNjcmliZVRvQ2FjaGVDaGFuZ2VzKCkge1xuICAgIGNvbnN0IGZvcm1DYWNoZSA9IHRoaXMuZm9ybS5nZXRGb3JtQ2FjaGUoKTtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKGZvcm1DYWNoZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jYWNoZVN0YXRlU3Vic2NyaXB0aW9uID0gZm9ybUNhY2hlLm9uQ2FjaGVTdGF0ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IGluaXRpYWxTdGF0ZUNoYW5nZWQgPSB0aGlzLmZvcm0uaXNJbml0aWFsU3RhdGVDaGFuZ2VkKCk7XG4gICAgICBjb25zdCB0cmlnZ2VyRXhpdENvbmZpcm0gPSB0aGlzLmZvcm0uY29uZmlybUV4aXQgJiYgdGhpcy5mb3JtLmlzSW5pdGlhbFN0YXRlQ2hhbmdlZCh0aGlzLmZvcm0uaWdub3JlT25FeGl0KTtcbiAgICAgIHRoaXMuc2V0TW9kaWZpZWRTdGF0ZShpbml0aWFsU3RhdGVDaGFuZ2VkLCB0cmlnZ2VyRXhpdENvbmZpcm0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q3VycmVudEtleXNWYWx1ZXMoKTogb2JqZWN0IHtcbiAgICBsZXQgZmlsdGVyID0ge307XG4gICAgaWYgKHRoaXMudXJsUGFyYW1zKSB7XG4gICAgICBmaWx0ZXIgPSB0aGlzLmdldEZpbHRlckZyb21PYmplY3QodGhpcy51cmxQYXJhbXMpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsdGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGaWx0ZXJGcm9tT2JqZWN0KG9iamVjdFBhcmFtOiBhbnkpIHtcbiAgICBjb25zdCBmaWx0ZXIgPSB7fTtcbiAgICBpZiAoIW9iamVjdFBhcmFtIHx8IE9iamVjdC5rZXlzKG9iamVjdFBhcmFtKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmaWx0ZXI7XG4gICAgfVxuICAgIGlmICh0aGlzLmZvcm0ua2V5c0FycmF5KSB7XG4gICAgICB0aGlzLmZvcm0ua2V5c0FycmF5LmZvckVhY2goKGtleSwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKG9iamVjdFBhcmFtW2tleV0pIHtcbiAgICAgICAgICBmaWx0ZXJba2V5XSA9IFNRTFR5cGVzLnBhcnNlVXNpbmdTUUxUeXBlKG9iamVjdFBhcmFtW2tleV0sIHRoaXMuZm9ybS5rZXlzU3FsVHlwZXNBcnJheVtpbmRleF0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgT2JqZWN0LmtleXModGhpcy5mb3JtLl9wS2V5c0VxdWl2KS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdXJsVmFsID0gb2JqZWN0UGFyYW1bdGhpcy5mb3JtLl9wS2V5c0VxdWl2W2l0ZW1dXTtcbiAgICAgIGlmICh1cmxWYWwpIHtcbiAgICAgICAgZmlsdGVyW2l0ZW1dID0gU1FMVHlwZXMucGFyc2VVc2luZ1NRTFR5cGUodXJsVmFsLCB0aGlzLmZvcm0ua2V5c1NxbFR5cGVzQXJyYXlbaW5kZXhdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmlsdGVyO1xuICB9XG5cbiAgZ2V0RmlsdGVyRnJvbVVybFBhcmFtcygpIHtcbiAgICBjb25zdCBmaWx0ZXIgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmdldFVybFBhcmFtcygpIHx8IHt9KTtcbiAgICBjb25zdCB1cmxQYXJhbXNLZXlzID0gT2JqZWN0LmtleXMoZmlsdGVyIHx8IHt9KTtcbiAgICBpZiAodXJsUGFyYW1zS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB1cmxQYXJhbXNLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKGtleSA9PT0gQ29kZXMuUEFSRU5UX0tFWVNfS0VZKSB7XG4gICAgICAgICAgZGVsZXRlIGZpbHRlcltrZXldO1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24oZmlsdGVyLCB0aGlzLmZvcm0uZm9ybVBhcmVudEtleXNWYWx1ZXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlcjtcbiAgfVxuXG4gIGdldFVybFNlZ21lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLnVybFNlZ21lbnRzO1xuICB9XG5cbiAgZ2V0UXVlcnlQYXJhbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlQYXJhbXM7XG4gIH1cblxuICBzZXRVcmxQYXJhbXModmFsOiBvYmplY3QpIHtcbiAgICB0aGlzLnVybFBhcmFtcyA9IHZhbDtcbiAgfVxuXG4gIGdldFVybFBhcmFtcygpIHtcbiAgICByZXR1cm4gdGhpcy51cmxQYXJhbXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0TW9kaWZpZWRTdGF0ZShtb2RpZmllZDogYm9vbGVhbiwgY29uZmlybUV4aXQ6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5mb3JtTGF5b3V0TWFuYWdlcikge1xuICAgICAgdGhpcy5mb3JtTGF5b3V0TWFuYWdlci5zZXRNb2RpZmllZFN0YXRlKHRoaXMuZm9ybS5nZXRBdHRyaWJ1dGUoKSwgbW9kaWZpZWQsIGNvbmZpcm1FeGl0KTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVOYXZpZ2F0aW9uKCkge1xuICAgIGlmICh0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyKSB7XG4gICAgICBjb25zdCBpc0luSW5zZXJ0TW9kZSA9IHRoaXMuZm9ybS5pc0luSW5zZXJ0TW9kZSgpO1xuICAgICAgbGV0IGZvcm1EYXRhO1xuICAgICAgaWYgKGlzSW5JbnNlcnRNb2RlKSB7XG4gICAgICAgIGZvcm1EYXRhID0ge307XG4gICAgICAgIGZvcm1EYXRhLm5ld190YWJfdGl0bGUgPSAnTEFZT1VUX01BTkFOR0VSLklOU0VSVElPTl9NT0RFX1RJVExFJztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtTGF5b3V0TWFuYWdlci5hbGxvd1RvVXBkYXRlTmF2aWdhdGlvbih0aGlzLmZvcm0uZ2V0QXR0cmlidXRlKCkpKSB7XG4gICAgICAgIGZvcm1EYXRhID0ge307XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybS5mb3JtRGF0YSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGZvcm1EYXRhW2tleV0gPSB0aGlzLmZvcm0uZm9ybURhdGFba2V5XS52YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZm9ybURhdGEpIHtcbiAgICAgICAgdGhpcy5mb3JtTGF5b3V0TWFuYWdlci51cGRhdGVOYXZpZ2F0aW9uKGZvcm1EYXRhLCB0aGlzLmZvcm0uZ2V0S2V5c1ZhbHVlcygpLCBpc0luSW5zZXJ0TW9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmF2aWdhdGVCYWNrKG9wdGlvbnM/OiBhbnkpIHtcbiAgICBpZiAodGhpcy5mb3JtTGF5b3V0TWFuYWdlcikge1xuICAgICAgdGhpcy5mb3JtTGF5b3V0TWFuYWdlci5jbG9zZURldGFpbChvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubmF2aWdhdGlvblNlcnZpY2UpIHtcbiAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVtb3ZlTGFzdEl0ZW0oKTtcbiAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaWdub3JlTmF2aWdhdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBuYXZEYXRhOiBPTmF2aWdhdGlvbkl0ZW0gPSB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldExhc3RJdGVtKCk7XG4gICAgICBpZiAobmF2RGF0YSkge1xuICAgICAgICBsZXQgZXh0cmFzOk5hdmlnYXRpb25FeHRyYXMgPSB7fTtcbiAgICAgICAgZXh0cmFzW0NvZGVzLlFVRVJZX1BBUkFNU10gPSBuYXZEYXRhLnF1ZXJ5UGFyYW1zO1xuICAgICAgICBpZiAob3B0aW9ucz8uZXhpdFdpdGhvdXRDb25maXJtYXRpb24pIHtcbiAgICAgICAgICBjb25zdCBpZ25vcmUgPSB7IFtDb2Rlcy5JR05PUkVfQ0FOX0RFQUNUSVZBVEVdOiBvcHRpb25zLmV4aXRXaXRob3V0Q29uZmlybWF0aW9uIH07XG4gICAgICAgICAgZXh0cmFzLnF1ZXJ5UGFyYW1zID0ge1xuICAgICAgICAgICAgLi4uZXh0cmFzLnF1ZXJ5UGFyYW1zLCAuLi5pZ25vcmVcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtuYXZEYXRhLnVybF0sIGV4dHJhcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2xvc2VEZXRhaWxBY3Rpb24ob3B0aW9ucz86IGFueSkge1xuICAgIGlmICh0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyKSB7XG4gICAgICB0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyLmNsb3NlRGV0YWlsKG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5uYXZpZ2F0aW9uU2VydmljZSkge1xuICAgICAgdGhpcy5mb3JtLmJlZm9yZUNsb3NlRGV0YWlsLmVtaXQoKTtcbiAgICAgIC8vIGByZW1vdmVMYXN0SXRlbXNVbnRpbE1haW5gIG1heSBub3QgcmVtb3ZlIGFsbCBuZWNlc3NhcnkgaXRlbXMgc28gY3VycmVudCByb3V0ZSB3aWxsIGJlIGNoZWNrZWQgYmVsb3dcbiAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZW1vdmVMYXN0SXRlbXNVbnRpbE1haW4oKSkge1xuICAgICAgICAvLyBgcmVtb3ZlTGFzdEl0ZW1zVW50aWxNYWluYCBkaWRuJ3QgZmluZCB0aGUgbWFpbiBuYXZpZ2F0aW9uIGl0ZW1cbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZW1vdmVMYXN0SXRlbSgpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5pZ25vcmVOYXZpZ2F0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBuYXZEYXRhOiBPTmF2aWdhdGlvbkl0ZW0gPSB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldExhc3RJdGVtKCk7XG4gICAgICBpZiAobmF2RGF0YSkge1xuICAgICAgICAvLyBpZiBuYXZEYXRhIHJvdXRlIGlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHJvdXRlLCByZW1vdmUgbGFzdCBpd