@datorama/core 22.12.8-rc → 22.12.8-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/datorama-core.umd.js +8 -7
- package/bundles/datorama-core.umd.js.map +1 -1
- package/bundles/datorama-core.umd.min.js +2 -2
- package/bundles/datorama-core.umd.min.js.map +1 -1
- package/datorama-core.metadata.json +1 -1
- package/esm2015/lib/grid-v2/grid-store/grid.service.js +7 -6
- package/esm2015/lib/grid-v2/grid-toolbar/grid-toolbar.component.js +4 -4
- package/esm5/lib/grid-v2/grid-store/grid.service.js +7 -6
- package/esm5/lib/grid-v2/grid-toolbar/grid-toolbar.component.js +4 -4
- package/fesm2015/datorama-core.js +8 -7
- package/fesm2015/datorama-core.js.map +1 -1
- package/fesm5/datorama-core.js +8 -7
- package/fesm5/datorama-core.js.map +1 -1
- package/lib/grid-v2/grid-store/grid.service.d.ts +3 -3
- package/lib/grid-v2/grid-toolbar/grid-toolbar.component.d.ts +1 -1
- package/package.json +1 -1
|
@@ -21,7 +21,7 @@ import { DATO_CORE_LOGGER } from '../../event-logger';
|
|
|
21
21
|
import { size } from '../../utils/collection';
|
|
22
22
|
import { OperatorTypes } from '../../operator-toggler/operator-toggler.types';
|
|
23
23
|
import { deepmerge } from '../../internal/deep-merge';
|
|
24
|
-
import { combineLatest } from 'rxjs';
|
|
24
|
+
import { combineLatest, Subject } from 'rxjs';
|
|
25
25
|
import { triggerWindowResize } from '../../utils/user-agent';
|
|
26
26
|
import { getColField, getColumnsSizes, isHtmlAllowedForCol, tryParsePivotValue } from './util';
|
|
27
27
|
import { DatoGridMultiSelectColumnHeaderComponent } from '../grid-column-header/grid-multi-select-header/grid-multi-select-header.component';
|
|
@@ -36,6 +36,7 @@ var GridService = /** @class */ (function () {
|
|
|
36
36
|
this.logger = logger;
|
|
37
37
|
this.treeConfig = defaultGridTreeLabel;
|
|
38
38
|
this.pageNumberToReturnAfterRefresh = -1;
|
|
39
|
+
this.reloadGridActionsSubject = new Subject();
|
|
39
40
|
this.CHECKBOX_SELECTION_COL_ID = 'grid-checkbox-selection';
|
|
40
41
|
}
|
|
41
42
|
Object.defineProperty(GridService.prototype, "treeData", {
|
|
@@ -68,11 +69,11 @@ var GridService = /** @class */ (function () {
|
|
|
68
69
|
? context
|
|
69
70
|
: deepmerge(this.gridRef.gridOptions.context || {}, context);
|
|
70
71
|
};
|
|
71
|
-
GridService.prototype.
|
|
72
|
-
this.
|
|
72
|
+
GridService.prototype.reloadGridActions = function () {
|
|
73
|
+
this.reloadGridActionsSubject.next();
|
|
73
74
|
};
|
|
74
|
-
GridService.prototype.
|
|
75
|
-
return this.
|
|
75
|
+
GridService.prototype.onReloadGridActions = function () {
|
|
76
|
+
return this.reloadGridActionsSubject.asObservable();
|
|
76
77
|
};
|
|
77
78
|
/**
|
|
78
79
|
* @deprecated use selectRows instead
|
|
@@ -1164,4 +1165,4 @@ var GridService = /** @class */ (function () {
|
|
|
1164
1165
|
return GridService;
|
|
1165
1166
|
}());
|
|
1166
1167
|
export { GridService };
|
|
1167
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRhdG9yYW1hL2NvcmUvIiwic291cmNlcyI6WyJsaWIvZ3JpZC12Mi9ncmlkLXN0b3JlL2dyaWQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQXdCLE1BQU0sZUFBZSxDQUFDO0FBZXpFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUNMLG9CQUFvQixFQUtwQixzQkFBc0IsRUFRdkIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBU2xGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBa0IsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBSUwsbUJBQW1CLEVBT25CLHVDQUF1QyxFQUN2QyxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLDJCQUEy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R0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQztRQUVoRSxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3RCLElBQUEsK0JBQU8sQ0FBa0M7WUFDakQsSUFBTSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUM3RCxJQUFNLGVBQWUsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQXRDLENBQXNDLENBQUMsQ0FBQztZQUVoRyxPQUFPLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUNyRDtRQUVELE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDOztnQkF2cUNnQixTQUFTO2dCQUNMLFNBQVM7Z0JBQ1Qsb0JBQW9CO2dCQUNqQixZQUFZO2dCQUNiLFdBQVc7Z0RBQy9CLE1BQU0sU0FBQyxxQkFBcUI7Z0RBQzVCLE1BQU0sU0FBQyxnQkFBZ0I7O0lBakNmLFdBQVc7UUFEdkIsVUFBVSxFQUFFO1FBaUNSLFdBQUEsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUE7UUFDN0IsV0FBQSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTt5Q0FOVixTQUFTO1lBQ0wsU0FBUztZQUNULG9CQUFvQjtZQUNqQixZQUFZO1lBQ2IsV0FBVztPQS9CdkIsV0FBVyxDQW1zQ3ZCO0lBQUQsa0JBQUM7Q0FBQSxBQW5zQ0QsSUFtc0NDO1NBbnNDWSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0b0dyaWRBcGkgfSBmcm9tICcuLi9ncmlkLWNvbnRyb2xsZXIvZ3JpZC1jb250cm9sbGVyLnR5cGVzJztcbmltcG9ydCB7XG4gIENlbGxDbGFzc1BhcmFtcyxcbiAgQ29sR3JvdXBEZWYsXG4gIENvbHVtbixcbiAgR2V0Q29udGV4dE1lbnVJdGVtc1BhcmFtcyxcbiAgR3JpZE9wdGlvbnMsXG4gIElDZWxsUmVuZGVyZXJQYXJhbXMsXG4gIElHZXRSb3dzUGFyYW1zLFxuICBSb3dOb2RlLFxuICBSb3dOb2RlVHJhbnNhY3Rpb24sXG4gIFJvd1NlbGVjdGVkRXZlbnRcbn0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHknO1xuaW1wb3J0IHsgUm93RGF0YVRyYW5zYWN0aW9uIH0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHkvZGlzdC9saWIvcm93TW9kZWxzL2NsaWVudFNpZGUvY2xpZW50U2lkZVJvd01vZGVsJztcbmltcG9ydCB7IEdyaWRRdWVyeSB9IGZyb20gJy4vZ3JpZC5xdWVyeSc7XG5pbXBvcnQgeyBEYXRvQ29yZUVycm9yIH0gZnJvbSAnLi4vLi4vZXJyb3JzJztcbmltcG9ydCB7IERhdG9UcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0b0N1c3RvbUhlYWRlclRlbXBsYXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vZ3JpZC1jdXN0b20taGVhZGVyL2N1c3RvbS1oZWFkZXItdGVtcGxhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBEYXRvRmlsdGVyQ29uZGl0aW9ucyxcbiAgRGF0b0dyaWRDb25kaXRpb25hbEZpbHRlcixcbiAgRGF0b0dyaWRFeHRlcm5hbEZpbHRlcixcbiAgRGF0b0dyaWRGaWx0ZXIsXG4gIERhdG9HcmlkRmlsdGVyQ29uZGl0aW9uLFxuICBEYXRvR3JpZEZpbHRlclNlY3Rpb25zLFxuICBEYXRvR3JpZEZpbHRlcnNNYXAsXG4gIERhdG9HcmlkUmFuZ2VGaWx0ZXJDb25kaXRpb24sXG4gIFNlcnZlclNpZGVQYWdpbmF0aW9uQ29uZGl0aW9uLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcixcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXJzLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkxpc3RDb25kaXRpb24sXG4gIFNlcnZlclNpZGVQYWdpbmF0aW9uUmFuZ2VDb25kaXRpb25cbn0gZnJvbSAnLi4vZ3JpZC1maWx0ZXIvZ3JpZC1maWx0ZXIudHlwZXMnO1xuaW1wb3J0IHsgY29lcmNlQXJyYXkgfSBmcm9tICcuLi8uLi91dGlscy9jb2VyY2lvbic7XG5pbXBvcnQgeyBpc0VtcHR5LCBpc0Z1bmN0aW9uLCBpc05pbCwgaXNTdHJpbmcgfSBmcm9tICcuLi8uLi91dGlscy92YWxpZGF0b3JzJztcbmltcG9ydCB7IHZhbGlkYXRlRmlsdGVyIH0gZnJvbSAnLi4vZ3JpZC1maWx0ZXIvZmlsdGVyLXZhbGlkYXRvcic7XG5pbXBvcnQgeyBBZ0dyaWROZzIgfSBmcm9tICdhZy1ncmlkLWFuZ3VsYXInO1xuaW1wb3J0IHsgSWNvblJlZ2lzdHJ5LCBTdmdSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ljb24tcmVnaXN0cnknO1xuaW1wb3J0IHsgZ2V0VmlzaWJsZUFjdGlvbnMsIHRvb2xiYXJBY3Rpb25Ub0NvbnRleHRBY3Rpb24gfSBmcm9tICcuLi9ncmlkLXYyLnV0aWwnO1xuaW1wb3J0IHtcbiAgRGF0b0dyaWRTZXR0aW5ncyxcbiAgTm9ybWFsaXplT3B0aW9uc1BhcmFtcyxcbiAgUGl2b3RDb2x1bW5EYXRhLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkNvbmZpZyxcbiAgU3VjY2Vzc1dyYXBwZXJQYXJhbXNcbn0gZnJvbSAnLi9ncmlkLnN0b3JlLnR5cGVzJztcbmltcG9ydCB7IFJvd0FjdGlvbiB9IGZyb20gJy4uL2dyaWQtdG9vbGJhci9ncmlkLXRvb2xiYXIudHlwZXMnO1xuaW1wb3J0IHsgY29weVRvQ2xpcGJvYXJkIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9jbGlwYm9hcmQuZGlyZWN0aXZlJztcbmltcG9ydCB7IEdyaWRTdG9yZSB9IGZyb20gJy4vZ3JpZC5zdG9yZSc7XG5pbXBvcnQgeyBEQVRPX0dSSURfU1RPUkFHRV9BUEksIEdyaWRTdG9yYWdlQVBJIH0gZnJvbSAnLi4vZ3JpZC1zZXR0aW5ncyc7XG5pbXBvcnQge1xuICBBY3Rpb25Db252ZXJ0ZXJQYXJhbXMsXG4gIERhdG9HcmlkQWxpZ25tZW50LFxuICBEYXRvR3JpZENvbHVtbkRlZixcbiAgRGF0b0dyaWRDb2x1bW5UeXBlcyxcbiAgRGF0b0dyaWRHZXRSb3dzUGFyYW1zLFxuICBEYXRvR3JpZE9wdGlvbnMsXG4gIERhdG9HcmlkU2VydmVyU29ydCxcbiAgRGF0b0dyaWRTZXJ2ZXJTb3J0RGlyZWN0aW9uLFxuICBEYXRvR3JpZFNvcnQsXG4gIERhdG9HcmlkVHJlZUNvbmZpZyxcbiAgZWRpdGFibGVDZWxsUmVuZGVyZXJXaXRoU2VhcmNoSGlnaGxpZ2h0LFxuICBHcmlkTWluV2lkdGhzLFxuICBHcmlkUm93U2VsZWN0aW9uVHlwZSxcbiAgc2VhcmNoSGlnaGxpZ2h0Q2VsbFJlbmRlcmVyXG59IGZyb20gJy4uL2dyaWQvZ3JpZC12Mi50eXBlcyc7XG5cbmltcG9ydCB7IGNvbnZlcnRUb1RyZWVEYXRhLCBkZWZhdWx0R3JpZE9wdGlvbnMsIGRlZmF1bHRHcmlkVHJlZUxhYmVsIH0gZnJvbSAnLi4vZ3JpZC9ncmlkLXYyLmNvbmZpZyc7XG5pbXBvcnQgeyBkaWZmIH0gZnJvbSAnLi4vLi4vdXRpbHMvb2JqZWN0JztcbmltcG9ydCB7IHVudGlsRGVzdHJveWVkIH0gZnJvbSAnbmd4LXRha2UtdW50aWwtZGVzdHJveSc7XG5pbXBvcnQgeyBDb3JlRXZlbnRMb2dnZXIsIENvcmVFdmVudFR5cGVzLCBEQVRPX0NPUkVfTE9HR0VSIH0gZnJvbSAnLi4vLi4vZXZlbnQtbG9nZ2VyJztcbmltcG9ydCB7IEhhc2hNYXAgfSBmcm9tICcuLi8uLi91dGlscy90eXBlcyc7XG5pbXBvcnQgeyBzaXplIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29sbGVjdGlvbic7XG5pbXBvcnQgeyBPcGVyYXRvclR5cGVzIH0gZnJvbSAnLi4vLi4vb3BlcmF0b3ItdG9nZ2xlci9vcGVyYXRvci10b2dnbGVyLnR5cGVzJztcbmltcG9ydCB7IGRlZXBtZXJnZSB9IGZyb20gJy4uLy4uL2ludGVybmFsL2RlZXAtbWVyZ2UnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdHJpZ2dlcldpbmRvd1Jlc2l6ZSB9IGZyb20gJy4uLy4uL3V0aWxzL3VzZXItYWdlbnQnO1xuaW1wb3J0IHsgZ2V0Q29sRmllbGQsIGdldENvbHVtbnNTaXplcywgaXNIdG1sQWxsb3dlZEZvckNvbCwgdHJ5UGFyc2VQaXZvdFZhbHVlIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IERhdG9HcmlkTXVsdGlTZWxlY3RDb2x1bW5IZWFkZXJDb21wb25lbnQgfSBmcm9tICcuLi9ncmlkLWNvbHVtbi1oZWFkZXIvZ3JpZC1tdWx0aS1zZWxlY3QtaGVhZGVyL2dyaWQtbXVsdGktc2VsZWN0LWhlYWRlci5jb21wb25lbnQnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgR3JpZFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBhcGk6IERhdG9HcmlkQXBpO1xuICB0cmVlQ29uZmlnOiBEYXRvR3JpZFRyZWVDb25maWcgPSBkZWZhdWx0R3JpZFRyZWVMYWJlbDtcbiAgaXNQaXZvdE1vZGU6IGJvb2xlYW47XG5cbiAgLyoqIEBpbnRlcm5hbCAtIHVzZWQgZm9yIHNlcnZlciBzaWRlIGJ5IHZhbHVlIGZpbHRlciAqL1xuICBfb3JpZ2luYWxHZXRSb3dzOiAocGFyYW1zOiBEYXRvR3JpZEdldFJvd3NQYXJhbXMpID0+IHZvaWQ7XG4gIHByaXZhdGUgaW5pdGlhbFNldHRpbmdzOiBEYXRvR3JpZFNldHRpbmdzO1xuICBwcml2YXRlIGdyaWROYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgZ3JpZFJlZjogQWdHcmlkTmcyO1xuICBwcml2YXRlIGN1c3RvbUhlYWRlcnNUZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxEYXRvQ3VzdG9tSGVhZGVyVGVtcGxhdGVDb21wb25lbnQ+O1xuICBwcml2YXRlIGlzVHJlZURhdGE6IGJvb2xlYW47XG4gIHByaXZhdGUgcGFnZU51bWJlclRvUmV0dXJuQWZ0ZXJSZWZyZXNoID0gLTE7XG4gIHByaXZhdGUgbGFzdFRvdGFsUm93czogbnVtYmVyO1xuICBwcml2YXRlIHVwZGF0ZUdyaWRBY3Rpb25zU3ViamVjdDogU3ViamVjdDxib29sZWFuPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IENIRUNLQk9YX1NFTEVDVElPTl9DT0xfSUQgPSAnZ3JpZC1jaGVja2JveC1zZWxlY3Rpb24nO1xuXG4gIHNldCB0cmVlRGF0YShpc1RyZWVEYXRhOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc1RyZWVEYXRhID0gaXNUcmVlRGF0YTtcbiAgfVxuXG4gIGdldCB0cmVlRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyZWVEYXRhO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzdG9yZTogR3JpZFN0b3JlLFxuICAgIHByaXZhdGUgZ3JpZFF1ZXJ5OiBHcmlkUXVlcnksXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IERhdG9UcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgaWNvblJlZ2lzdHJ5OiBJY29uUmVnaXN0cnksXG4gICAgcHJpdmF0ZSBzdmdSZWdpc3RyeTogU3ZnUmVnaXN0cnksXG4gICAgQEluamVjdChEQVRPX0dSSURfU1RPUkFHRV9BUEkpIHByaXZhdGUgc3RvcmFnZUFQSTogR3JpZFN0b3JhZ2VBUEksXG4gICAgQEluamVjdChEQVRPX0NPUkVfTE9HR0VSKSBwcml2YXRlIGxvZ2dlcjogQ29yZUV2ZW50TG9nZ2VyXG4gICkge31cblxuICBuZ09uRGVzdHJveSgpIHt9XG5cbiAgLyoqIEBpbnRlcm5hbCAtIHVzZWQgdG8gaW5pdCB0aGUgc2VydmljZSAqL1xuICBfc2V0QXBpKGFwaTogRGF0b0dyaWRBcGksIGdyaWRSZWY6IEFnR3JpZE5nMikge1xuICAgIHRoaXMuYXBpID0gYXBpO1xuICAgIHRoaXMuZ3JpZFJlZiA9IGdyaWRSZWY7XG4gICAgdGhpcy5ncmlkTmFtZSA9IChncmlkUmVmLmdyaWRPcHRpb25zIGFzIERhdG9HcmlkT3B0aW9ucykuZ3JpZE5hbWU7XG4gICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7XG4gICAgICBlbmFibGVkOiB0aGlzLmlzU2VydmVyU2lkZVBhZ2luYXRpb24oZ3JpZFJlZi5ncmlkT3B0aW9ucylcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihncmlkT3B0aW9uczogR3JpZE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ3JpZE9wdGlvbnMucm93TW9kZWxUeXBlID09PSAnaW5maW5pdGUnO1xuICB9XG5cbiAgdXBkYXRlR3JpZENvbnRleHQoY29udGV4dCA9IHt9LCByZXBsYWNlID0gZmFsc2UpIHtcbiAgICB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLmNvbnRleHQgPSByZXBsYWNlXG4gICAgICA/IGNvbnRleHRcbiAgICAgIDogZGVlcG1lcmdlKHRoaXMuZ3JpZFJlZi5ncmlkT3B0aW9ucy5jb250ZXh0IHx8IHt9LCBjb250ZXh0KTtcbiAgfVxuXG4gIHVwZGF0ZUdyaWRBY3Rpb25zKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlR3JpZEFjdGlvbnNTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gIH1cblxuICBnZXRVcGRhdGVHcmlkQWN0aW9uc1N0YXR1cygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVHcmlkQWN0aW9uc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHNlbGVjdFJvd3MgaW5zdGVhZFxuICAgKiBAcGFyYW0gcm93XG4gICAqL1xuICBzZXRTZWxlY3RlZFJvd3M8VD4ocm93OiAoVCAmIFJvd05vZGUpIHwgKFRbXSAmIFJvd05vZGVbXSkpIHtcbiAgICB0aGlzLnNlbGVjdFJvd3Mocm93KTtcbiAgfVxuXG4gIHNlbGVjdFJvd3M8VD4ocm93OiAoVCAmIFJvd05vZGUpIHwgKFRbXSAmIFJvd05vZGVbXSkpIHtcbiAgICBjb25zdCByb3dOb2RlcyA9IGNvZXJjZUFycmF5KHJvdykuZmlsdGVyKHJvd05vZGUgPT4gIXJvd05vZGUuaXNTZWxlY3RlZCgpKTtcbiAgICBjb25zdCBsYXN0Tm9kZSA9IHJvd05vZGVzLnBvcCgpO1xuICAgIHJvd05vZGVzLmZvckVhY2gocm93Tm9kZSA9PiByb3dOb2RlLnNldFNlbGVjdGVkKHRydWUsIGZhbHNlLCB0cnVlKSk7XG4gICAgaWYgKGxhc3ROb2RlKSB7XG4gICAgICBsYXN0Tm9kZS5zZXRTZWxlY3RlZCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBkZXNlbGVjdFJvd3M8VD4ocm93OiAoVCAmIFJvd05vZGUpIHwgKFRbXSAmIFJvd05vZGVbXSkpIHtcbiAgICBjb25zdCByb3dOb2RlcyA9IGNvZXJjZUFycmF5KHJvdykuZmlsdGVyKHJvd05vZGUgPT4gcm93Tm9kZS5pc1NlbGVjdGVkKCkpO1xuICAgIGNvbnN0IGxhc3ROb2RlID0gcm93Tm9kZXMucG9wKCk7XG4gICAgcm93Tm9kZXMuZm9yRWFjaChyb3dOb2RlID0+IHJvd05vZGUuc2V0U2VsZWN0ZWQoZmFsc2UsIGZhbHNlLCB0cnVlKSk7XG4gICAgaWYgKGxhc3ROb2RlKSB7XG4gICAgICBsYXN0Tm9kZS5zZXRTZWxlY3RlZChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgc2V0Um93czxUPihkYXRhOiBUW10sIGZpdENvbnRhaW5lciA9IGZhbHNlLCB0cmVlQ29uZmlnOiBQYXJ0aWFsPERhdG9HcmlkVHJlZUNvbmZpZz4gPSB7fSkge1xuICAgIHRoaXMuZ3JpZFF1ZXJ5LmdyaWRSZWFkeSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNUcmVlRGF0YSkge1xuICAgICAgICB0aGlzLnRyZWVDb25maWcgPSB7XG4gICAgICAgICAgLi4uZGVmYXVsdEdyaWRUcmVlTGFiZWwsXG4gICAgICAgICAgLi4udHJlZUNvbmZpZ1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCB0cmVlRGF0ZSA9IGNvbnZlcnRUb1RyZWVEYXRhKGRhdGEsIHRoaXMudHJlZUNvbmZpZyk7XG4gICAgICAgIHRoaXMuYXBpLmdyaWQuc2V0Um93RGF0YSh0cmVlRGF0ZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNQaXZvdE1vZGUpIHtcbiAgICAgICAgdGhpcy5zZXRQaXZvdE1vZGVSb3dzPFQ+KGRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hcGkuZ3JpZC5zZXRSb3dEYXRhKGRhdGEpO1xuICAgICAgfVxuICAgICAgaWYgKGZpdENvbnRhaW5lcikge1xuICAgICAgICB0aGlzLmZpdEdyaWQoJ2NvbnRhaW5lcicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJpZ2dlcldpbmRvd1Jlc2l6ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0RGF0YXNvdXJjZShnZXRSb3dzOiAocGFyYW1zOiBEYXRvR3JpZEdldFJvd3NQYXJhbXMpID0+IHZvaWQsIHJldHVyblRvQ3VycmVudFBhZ2UgPSBmYWxzZSwgc2hvd0xvYWRpbmcgPSBmYWxzZSkge1xuICAgIHJldHVyblRvQ3VycmVudFBhZ2UgJiYgdGhpcy51cGRhdGVQYWdlVG9LZWVwT25SZWZyZXNoU2VydmVyRGF0YSgpO1xuICAgIHNob3dMb2FkaW5nICYmIHRoaXMuc2V0TG9hZGluZyh0cnVlKTtcbiAgICB0aGlzLl9vcmlnaW5hbEdldFJvd3MgPSBnZXRSb3dzO1xuICAgIHRoaXMuYXBpLmdyaWQuc2V0RGF0YXNvdXJjZSh7IGdldFJvd3M6IHRoaXMud3JhcEdldFJvd3ModGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKSwgZ2V0Um93cykgfSk7XG4gIH1cblxuICByZWZyZXNoU2VydmVyRGF0YShrZWVwQ3VycmVudFBhZ2UgPSBmYWxzZSwgc2hvd0xvYWRpbmcgPSBmYWxzZSkge1xuICAgIGtlZXBDdXJyZW50UGFnZSAmJiB0aGlzLnVwZGF0ZVBhZ2VUb0tlZXBPblJlZnJlc2hTZXJ2ZXJEYXRhKCk7XG4gICAgc2hvd0xvYWRpbmcgJiYgdGhpcy5zZXRMb2FkaW5nKHRydWUpO1xuICAgIHRoaXMuYXBpLmdyaWQuc2V0RGF0YXNvdXJjZSh7IGdldFJvd3M6IHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCkuZGF0YXNvdXJjZS5nZXRSb3dzIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYWdlVG9LZWVwT25SZWZyZXNoU2VydmVyRGF0YSgpIHtcbiAgICAvLyBLZWVwaW5nIHRoZSBjdXJyZW50IHBhZ2Ugb24gc2VydmVyIHJlZnJlc2ggaXMgY3VycmVudGx5IGF2YWlsYWJsZSBvbmx5IHdoZW4gbm8gcGFnZSBjbGllbnQgY2FjaGluZyBpcyBlbmFibGVkXG4gICAgaWYgKHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCkubWF4QmxvY2tzSW5DYWNoZSA9PT0gMSkge1xuICAgICAgdGhpcy5wYWdlTnVtYmVyVG9SZXR1cm5BZnRlclJlZnJlc2ggPSB0aGlzLmFwaS5ncmlkLnBhZ2luYXRpb25HZXRDdXJyZW50UGFnZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFkZFJvd3M8VD4ocm93OiBULCBpbmRleD86IG51bWJlcik6IFJvd05vZGVUcmFuc2FjdGlvbiB7XG4gICAgY29uc3Qgcm93cyA9IGNvZXJjZUFycmF5KHJvdyk7XG4gICAgY29uc3QgZGF0YTogUm93RGF0YVRyYW5zYWN0aW9uID0geyBhZGQ6IHJvd3MgfTtcbiAgICBpZiAoIWlzTmlsKGluZGV4KSkge1xuICAgICAgZGF0YS5hZGRJbmRleCA9IGluZGV4O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hcGkuZ3JpZC51cGRhdGVSb3dEYXRhKGRhdGEpO1xuICB9XG5cbiAgdXBkYXRlUm93czxUPihyb3c6IFRbXSk6IGFueSB7XG4gICAgY29uc3Qgcm93cyA9IGNvZXJjZUFycmF5KHJvdyk7XG4gICAgcmV0dXJuIHRoaXMuYXBpLmdyaWQudXBkYXRlUm93RGF0YSh7IHVwZGF0ZTogcm93cyB9KTtcbiAgfVxuXG4gIHVwZGF0ZVJvd1ZhbHVlPFQ+KHJvdzogUm93Tm9kZSwga2V5OiBzdHJpbmcsIG5ld1ZhbHVlOiBUKTtcbiAgdXBkYXRlUm93VmFsdWU8VD4oaWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIG5ld1ZhbHVlOiBUKTtcbiAgdXBkYXRlUm93VmFsdWU8VD4ocm93OiBzdHJpbmcgfCBSb3dOb2RlLCBrZXk6IHN0cmluZywgbmV3VmFsdWU6IFQpIHtcbiAgICBjb25zdCByb3dOb2RlID0gaXNTdHJpbmcocm93KSA/IHRoaXMuYXBpLmdyaWQuZ2V0Um93Tm9kZShyb3cpIDogcm93O1xuICAgIHJvd05vZGUuc2V0RGF0YVZhbHVlKGtleSwgbmV3VmFsdWUpO1xuICB9XG5cbiAgcmVtb3ZlUm93cyhyb3c6IFJvd05vZGUgfCBSb3dOb2RlW10pOiBSb3dOb2RlVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHJvd3MgPSBjb2VyY2VBcnJheShyb3cpLm1hcCgoeyBkYXRhIH0pID0+IGRhdGEpO1xuICAgIHJldHVybiB0aGlzLmFwaS5ncmlkLnVwZGF0ZVJvd0RhdGEoeyByZW1vdmU6IHJvd3MgfSk7XG4gIH1cblxuICByZW1vdmVTZWxlY3RlZFJvd3MoKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5ncmlkUXVlcnkuZ2V0U2VsZWN0ZWRSb3dOb2RlcygpO1xuICAgIHJldHVybiB0aGlzLnJlbW92ZVJvd3Moc2VsZWN0ZWRSb3dzKTtcbiAgfVxuXG4gIGNsZWFyVGFibGUoKSB7XG4gICAgdGhpcy5zZXRSb3dzKFtdKTtcbiAgfVxuXG4gIHVwZGF0ZUNvbHVtbnMoY29sRGVmczogRGF0b0dyaWRDb2x1bW5EZWYgfCBEYXRvR3JpZENvbHVtbkRlZltdLCByZWxvYWRTZXR0aW5ncyA9IGZhbHNlKSB7XG4gICAgaWYgKCFjb2xEZWZzKSB7XG4gICAgICB0aHJvdyBuZXcgRGF0b0NvcmVFcnJvcignTm8gY29sdW1uRGVmcyB3ZXJlIHByb3ZpZGVkLiDwn5W18J+Pu+KAjeKZgO+4jycpO1xuICAgIH1cbiAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5ub3JtYWxpemVDb2x1bW5zKGNvZXJjZUFycmF5KGNvbERlZnMpKTtcbiAgICBjb25zdCBzYXZlZFNldHRpbmdzID0gcmVsb2FkU2V0dGluZ3MgJiYgdGhpcy5ncmlkUXVlcnkuZ2V0Q3VycmVudEdyaWRTZXR0aW5ncygpO1xuICAgIHRoaXMuYXBpLmdyaWQuc2V0Q29sdW1uRGVmcyhub3JtYWxpemVkKTtcbiAgICBpZiAoc2F2ZWRTZXR0aW5ncykge1xuICAgICAgdGhpcy5sb2FkU2F2ZWRTZXR0aW5ncyhzYXZlZFNldHRpbmdzKTtcbiAgICB9XG4gIH1cblxuICBub3JtYWxpemVPcHRpb25zKHBhcmFtczogTm9ybWFsaXplT3B0aW9uc1BhcmFtcykge1xuICAgIHRoaXMuY3VzdG9tSGVhZGVyc1RlbXBsYXRlcyA9IHBhcmFtcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzO1xuICAgIGNvbnN0IGhlYWRlckNvbXBvbmVudFBhcmFtcyA9IHsgZ3JpZFNlcnZpY2U6IHRoaXMsIGdyaWRRdWVyeTogdGhpcy5ncmlkUXVlcnkgfTtcbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuYXV0b0dyb3VwQ29sdW1uRGVmID0ge1xuICAgICAgLi4uaGVhZGVyQ29tcG9uZW50UGFyYW1zLFxuICAgICAgLi4ucGFyYW1zLmdyaWRPcHRpb25zLmF1dG9Hcm91cENvbHVtbkRlZlxuICAgIH07XG5cbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZGVmYXVsdENvbERlZiA9IHtcbiAgICAgIC4uLnBhcmFtcy5ncmlkT3B0aW9ucy5kZWZhdWx0Q29sRGVmLFxuICAgICAgaGVhZGVyQ29tcG9uZW50UGFyYW1zXG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVTZWFyY2ggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlU2VhcmNoID0gcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZVYyXzE7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZUJhY2tncm91bmQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlQmFja2dyb3VuZCA9IHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVWMl8xO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBhcmFtcy5ncmlkT3B0aW9ucy5zaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLnNob3dNdWx0aVNlbGVjdGlvbkNoZWNrYm94ZXMgPVxuICAgICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlVjJfMSAmJiBwYXJhbXMuZ3JpZE9wdGlvbnMucm93U2VsZWN0aW9uICE9PSBHcmlkUm93U2VsZWN0aW9uVHlwZS5TSU5HTEU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaEhpZ2hsaWdodCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVTZWFyY2hIaWdobGlnaHQgPVxuICAgICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlU2VhcmNoICYmIGRlZmF1bHRHcmlkT3B0aW9ucy5lbmFibGVTZWFyY2hIaWdobGlnaHQ7XG4gICAgfVxuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5jb2x1bW5EZWZzID0gdGhpcy5ub3JtYWxpemVDb2x1bW5zKHBhcmFtcy5ncmlkT3B0aW9ucy5jb2x1bW5EZWZzLCBwYXJhbXMuZ3JpZE9wdGlvbnMpO1xuXG4gICAgLyoqIEFkZCBjb3JlIGZpbHRlcnMgKi9cbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuaXNFeHRlcm5hbEZpbHRlclByZXNlbnQgPSAoKSA9PiB0cnVlO1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5kb2VzRXh0ZXJuYWxGaWx0ZXJQYXNzID0gKHJvdzogUm93Tm9kZSkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdmFsaWRhdGVGaWx0ZXIoeyByb3csIGFwaTogdGhpcy5ncmlkUXVlcnkuYXBpLmdyaWQgfSwgdGhpcy5ncmlkUXVlcnkuZ2V0RmlsdGVyKCkpICYmIHRoaXMucm93TWF0Y2hlc1NlYXJjaChyb3cpXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKiogV3JhcCB0aGUgc2VydmVyIHNpZGUgcGFnaW5hdGlvbiBnZXQgcm93cyBmdW5jdGlvbiAqL1xuICAgIGlmICh0aGlzLmlzU2VydmVyU2lkZVBhZ2luYXRpb24ocGFyYW1zLmdyaWRPcHRpb25zKSkge1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmJsb2NrTG9hZERlYm91bmNlTWlsbGlzID0gMzAwO1xuICAgICAgdGhpcy5fb3JpZ2luYWxHZXRSb3dzID0gcGFyYW1zLmdyaWRPcHRpb25zLmRhdGFzb3VyY2UuZ2V0Um93cztcbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5kYXRhc291cmNlLmdldFJvd3MgPSB0aGlzLndyYXBHZXRSb3dzKHBhcmFtcy5ncmlkT3B0aW9ucyk7XG4gICAgICAvKiBUaGUgY2FjaGUgc2l6ZSBpcyBzeW5jZWQgd2l0aCB0aGUgcGFnaW5hdGlvbiBwYWdlIHNpemUgKi9cbiAgICAgIGNvbnN0IGNhY2hlU2l6ZSA9IHBhcmFtcy5ncmlkT3B0aW9ucy5wYWdpbmF0aW9uUGFnZVNpemU7XG4gICAgICBpZiAoY2FjaGVTaXplKSB7XG4gICAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5jYWNoZUJsb2NrU2l6ZSA9IGNhY2hlU2l6ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRWRpdGFibGUgY2VsbCAqL1xuICAgIHRoaXMuaW5pdEVkaXRhYmxlQ29sdW1uc0NlbGxDbGFzcyhwYXJhbXMpO1xuXG4gICAgLyoqIFdyYXAgY29udGV4dCBtZW51ICovXG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmdldENvbnRleHRNZW51SXRlbXMgPSB0aGlzLndyYXBDb250ZXh0TWVudUJ1aWxkZXIocGFyYW1zKTtcblxuICAgIC8qKiBTYXZlIGdyaWQgc2V0dGluZ3MgKi9cbiAgICBjb25zdCB7IHNhdmVTZXR0aW5ncywgZ3JpZE5hbWUgfSA9IHBhcmFtcy5ncmlkT3B0aW9ucztcbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuc2F2ZVNldHRpbmdzID0gc2F2ZVNldHRpbmdzICE9PSBmYWxzZSAmJiAhaXNOaWwoZ3JpZE5hbWUpO1xuXG4gICAgLyoqIFNlcnZlciBTaWRlIFBhZ2luYXRpb24gZm9yIHNlbGVjdCBhbGwgb3B0aW9uICovXG4gICAgdGhpcy5pbml0T25Sb3dTZWxlY3RlZEZvclNlcnZlclNpZGVQYWdpbmF0aW9uKHBhcmFtcyk7XG5cbiAgICAvKiogQWRkIHBpdm90IHNwZWNpZmljIHJlcXVpcmVkIHNldHRpbmdzICovXG4gICAgaWYgKHBhcmFtcy5ncmlkT3B0aW9ucy5waXZvdE1vZGUpIHtcbiAgICAgIHRoaXMuaW5pdFBpdm90U2Vjb25kYXJ5Q29sc1Byb2Nlc3MocGFyYW1zKTtcbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5zYXZlU2V0dGluZ3MgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmdyaWRPcHRpb25zLnVzZVBpdm90R3JpZFN0eWxlKSB7XG4gICAgICBjb25zdCByb3dIZWlnaHQgPSAzMDtcblxuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLnJvd0hlaWdodCA9IHJvd0hlaWdodDtcbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5kZWZhdWx0Q29sRGVmID0ge1xuICAgICAgICAuLi5wYXJhbXMuZ3JpZE9wdGlvbnMuZGVmYXVsdENvbERlZixcbiAgICAgICAgY2VsbENsYXNzUnVsZXM6IHRoaXMuZ2V0UGl2b3RNb2RlQ2VsbENsYXNzUnVsZXMoKSxcbiAgICAgICAgaGVhZGVyQ2xhc3M6IHRoaXMuZ2V0UGl2b3RIZWFkZXJDbGFzcy5iaW5kKHRoaXMpLFxuICAgICAgICBjZWxsU3R5bGU6IHBhcmFtcyA9PiB7XG4gICAgICAgICAgY29uc3Qgc3R5bGU6IGFueSA9IHsgbGluZUhlaWdodDogYCR7cm93SGVpZ2h0fXB4YCB9O1xuXG4gICAgICAgICAgaWYgKHBhcmFtcy5jb2xEZWYudHlwZSA9PT0gRGF0b0dyaWRDb2x1bW5UeXBlcy5OdW1iZXIpIHtcbiAgICAgICAgICAgIHN0eWxlLnRleHRBbGlnbiA9ICdlbmQnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmF1dG9Hcm91cENvbHVtbkRlZiA9IHtcbiAgICAgICAgLi4ucGFyYW1zLmdyaWRPcHRpb25zLmF1dG9Hcm91cENvbHVtbkRlZixcbiAgICAgICAgY2VsbENsYXNzUnVsZXM6IHRoaXMuZ2V0UGl2b3RNb2RlQ2VsbENsYXNzUnVsZXMoKSxcbiAgICAgICAgaGVhZGVyQ2xhc3M6IHRoaXMuZ2V0UGl2b3RIZWFkZXJDbGFzcy5iaW5kKHRoaXMpXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXMuZ3JpZE9wdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGdldFBpdm90SGVhZGVyQ2xhc3MocGFyYW1zKSB7XG4gICAgY29uc3QgZ3JpZFF1ZXJ5ID0gcGFyYW1zLmNvbERlZi5oZWFkZXJDb21wb25lbnRQYXJhbXMuZ3JpZFF1ZXJ5O1xuICAgIGxldCBjZWxsQ2xhc3MgPSAnJztcblxuICAgIGlmIChncmlkUXVlcnkgJiYgZ3JpZFF1ZXJ5LmFwaSkge1xuICAgICAgY29uc3QgeyBjb2x1bW5zIH0gPSBncmlkUXVlcnkuYXBpIGFzIERhdG9HcmlkQXBpO1xuICAgICAgLyoqIFVzZSBnZXRQaXZvdFJlc3VsdENvbHVtbnMgZnJvbSB2ZXIgMjggKi9cbiAgICAgIGNvbnN0IHBpdm90Q29sdW1ucyA9IGNvbHVtbnMuZ2V0U2Vjb25kYXJ5Q29sdW1ucygpO1xuXG4gICAgICBpZiAocGl2b3RDb2x1bW5zICYmIHBpdm90Q29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNlbGxDbGFzcyArPSAndG9wLWJvcmRlcic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNlbGxDbGFzcztcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplQ29sdW1ucyhjb2xEZWZzOiBEYXRvR3JpZENvbHVtbkRlZltdLCBncmlkT3B0aW9uczogRGF0b0dyaWRPcHRpb25zID0gbnVsbCk6IERhdG9HcmlkQ29sdW1uRGVmW10ge1xuICAgIGlmICghZ3JpZE9wdGlvbnMpIHtcbiAgICAgIGdyaWRPcHRpb25zID0gdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlZENvbERlZnMgPSBjb2xEZWZzLm1hcCgoY29sOiBEYXRvR3JpZENvbHVtbkRlZikgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHtcbiAgICAgICAgLi4uY29sLFxuICAgICAgICBoZWFkZXJOYW1lOiB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oY29sLmhlYWRlck5hbWUpXG4gICAgICB9O1xuICAgICAgLyoqIEFkanVzdCB0aGUgd2lkdGggaW4gY2FzZSB0aGUgY29sdW1uIGhhcyBpbmZvICovXG4gICAgICBpZiAoY29sLmluZm8pIHtcbiAgICAgICAgbm9ybWFsaXplZC5taW5XaWR0aCA9IGNvbC5taW5XaWR0aCB8fCBHcmlkTWluV2lkdGhzLldpdGhfSW5mbztcbiAgICAgIH1cbiAgICAgIGlmICghY29sLmNvbElkKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQuY29sSWQgPSBjb2wuZmllbGQ7XG4gICAgICB9XG4gICAgICBpZiAobm9ybWFsaXplZC50eXBlID09PSBEYXRvR3JpZENvbHVtblR5cGVzLkl0ZW1zICYmICFub3JtYWxpemVkLmZpbHRlcnNDb25maWcpIHtcbiAgICAgICAgbm9ybWFsaXplZC5maWx0ZXJzQ29uZmlnID0geyBzZWN0aW9uczogRGF0b0dyaWRGaWx0ZXJTZWN0aW9ucy5Db25kaXRpb25hbCB9O1xuICAgICAgfVxuICAgICAgdGhpcy5ub3JtYWxpemVDb2x1bW5TZWFyY2hDb25maWcoZ3JpZE9wdGlvbnMsIGNvbCwgbm9ybWFsaXplZCk7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFkZE11bHRpU2VsZWN0SGVhZGVyQ29sdW1uSWZSZXF1aXJlZCh1cGRhdGVkQ29sRGVmcywgZ3JpZE9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVDb2x1bW5TZWFyY2hDb25maWcoXG4gICAgZ3JpZE9wdGlvbnM6IERhdG9HcmlkT3B0aW9ucyxcbiAgICBjb2w6IERhdG9HcmlkQ29sdW1uRGVmLFxuICAgIG5vcm1hbGl6ZWQ6IERhdG9HcmlkQ29sdW1uRGVmXG4gICkge1xuICAgIC8qKiBDaGVjayBpZiBjb2x1bW4gc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gc2VhcmNoICoqL1xuICAgIGNvbnN0IGlzU2VydmVyUGFnaW5hdGlvbiA9IHRoaXMuaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihncmlkT3B0aW9ucyk7XG4gICAgaWYgKHR5cGVvZiBjb2wuaW5jbHVkZUluU2VhcmNoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKGlzU2VydmVyUGFnaW5hdGlvbiAmJiBjb2wudHlwZSA9PT0gRGF0b0dyaWRDb2x1bW5UeXBlcy5EYXRlKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQuaW5jbHVkZUluU2VhcmNoID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub3JtYWxpemVkLmluY2x1ZGVJblNlYXJjaCA9XG4gICAgICAgICAgdHlwZW9mIGdyaWRPcHRpb25zLmNvbHVtbnNJbmNsdWRlZEluU2VhcmNoQnlEZWZhdWx0ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgPyBncmlkT3B0aW9ucy5jb2x1bW5zSW5jbHVkZWRJblNlYXJjaEJ5RGVmYXVsdFxuICAgICAgICAgICAgOiBkZWZhdWx0R3JpZE9wdGlvbnMuY29sdW1uc0luY2x1ZGVkSW5TZWFyY2hCeURlZmF1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIG5vcm1hbGl6ZWQuaW5jbHVkZUluU2VhcmNoICYmXG4gICAgICAhdGhpcy5oYXNDZWxsUmVuZGVyZXIobm9ybWFsaXplZCwgZ3JpZE9wdGlvbnMpICYmXG4gICAgICBncmlkT3B0aW9ucy5lbmFibGVTZWFyY2hIaWdobGlnaHRcbiAgICApIHtcbiAgICAgIG5vcm1hbGl6ZWQuY2VsbFJlbmRlcmVyID0gKHBhcmFtczogSUNlbGxSZW5kZXJlclBhcmFtcykgPT4ge1xuICAgICAgICBjb25zdCBhbGxvd0hUTUwgPSBpc0h0bWxBbGxvd2VkRm9yQ29sKGdyaWRPcHRpb25zLCBwYXJhbXMuY29sRGVmKTtcbiAgICAgICAgY29uc3QgaXNFZGl0YWJsZSA9XG4gICAgICAgICAgKGlzRnVuY3Rpb24obm9ybWFsaXplZC5lZGl0YWJsZSkgJiYgbm9ybWFsaXplZC5lZGl0YWJsZShwYXJhbXMpKSB8fFxuICAgICAgICAgICghaXNGdW5jdGlvbihub3JtYWxpemVkLmVkaXRhYmxlKSAmJiBub3JtYWxpemVkLmVkaXRhYmxlKTtcblxuICAgICAgICByZXR1cm4gaXNFZGl0YWJsZVxuICAgICAgICAgID8gZWRpdGFibGVDZWxsUmVuZGVyZXJXaXRoU2VhcmNoSGlnaGxpZ2h0KHBhcmFtcywgdGhpcy5ncmlkUXVlcnkuZ2V0U2VhcmNoVGVybSgpLCBhbGxvd0hUTUwpXG4gICAgICAgICAgOiBzZWFyY2hIaWdobGlnaHRDZWxsUmVuZGVyZXIocGFyYW1zLCB0aGlzLmdyaWRRdWVyeS5nZXRTZWFyY2hUZXJtKCksIGFsbG93SFRNTCk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzQ2VsbFJlbmRlcmVyKGNvbHVtbjogRGF0b0dyaWRDb2x1bW5EZWYsIGdyaWRPcHRpb25zOiBEYXRvR3JpZE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICBpZiAoY29sdW1uLmNlbGxSZW5kZXJlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSBjb2x1bW4udHlwZSBhcyBzdHJpbmc7XG4gICAgY29uc3QgY29sdW1uVHlwZUhhc0NlbGxSZW5kZXJlciA9IChvcHRpb25zOiBQYXJ0aWFsPERhdG9HcmlkT3B0aW9ucz4pOiBib29sZWFuID0+XG4gICAgICBvcHRpb25zLmNvbHVtblR5cGVzICYmICEhb3B0aW9ucy5jb2x1bW5UeXBlc1t0eXBlXSAmJiAhIW9wdGlvbnMuY29sdW1uVHlwZXNbdHlwZV0uY2VsbFJlbmRlcmVyO1xuXG4gICAgcmV0dXJuIGNvbHVtblR5cGVIYXNDZWxsUmVuZGVyZXIoZ3JpZE9wdGlvbnMpIHx8IGNvbHVtblR5cGVIYXNDZWxsUmVuZGVyZXIoZGVmYXVsdEdyaWRPcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTXVsdGlTZWxlY3RIZWFkZXJDb2x1bW5JZlJlcXVpcmVkKFxuICAgIGNvbHVtbkRlZnM6IERhdG9HcmlkQ29sdW1uRGVmW10sXG4gICAgZ3JpZE9wdGlvbnM6IERhdG9HcmlkT3B0aW9uc1xuICApOiBEYXRvR3JpZENvbHVtbkRlZltdIHtcbiAgICBjb25zdCBzaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzID0gZ3JpZE9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMuc2hvd011bHRpU2VsZWN0aW9uQ2hlY2tib3hlcztcbiAgICBjb25zdCByb3dTZWxlY3Rpb24gPVxuICAgICAgZ3JpZE9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMucm93U2VsZWN0aW9uID8gZ3JpZE9wdGlvbnMucm93U2VsZWN0aW9uIDogZGVmYXVsdEdyaWRPcHRpb25zLnJvd1NlbGVjdGlvbjtcblxuICAgIGlmIChzaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzICYmIHJvd1NlbGVjdGlvbiA9PT0gR3JpZFJvd1NlbGVjdGlvblR5cGUuTVVMVElQTEUpIHtcbiAgICAgIGNvbnN0IGNoZWNrYm94ZXNDb2x1bW46IERhdG9HcmlkQ29sdW1uRGVmID0ge1xuICAgICAgICBjb2xJZDogdGhpcy5DSEVDS0JPWF9TRUxFQ1RJT05fQ09MX0lELFxuICAgICAgICBjaGVja2JveFNlbGVjdGlvbjogdHJ1ZSxcbiAgICAgICAgaGVhZGVyQ29tcG9uZW50RnJhbWV3b3JrOiBEYXRvR3JpZE11bHRpU2VsZWN0Q29sdW1uSGVhZGVyQ29tcG9uZW50LFxuICAgICAgICB3aWR0aDogMzAsXG4gICAgICAgIG1heFdpZHRoOiAzMCxcbiAgICAgICAgc3VwcHJlc3NTaXplVG9GaXQ6IHRydWUsXG4gICAgICAgIGNlbGxDbGFzczogJ2NoZWNrYm94LXNlbGVjdGlvbi1jZWxsJyxcbiAgICAgICAgaGVhZGVyQ2xhc3M6ICdoZWFkZXItY2hlY2tib3gtc2VsZWN0aW9uLWNlbGwnLFxuICAgICAgICByZXNpemFibGU6IGZhbHNlLFxuICAgICAgICBwaW5uZWQ6ICdsZWZ0JyxcbiAgICAgICAgbG9ja1Bvc2l0aW9uOiB0cnVlLFxuICAgICAgICBpbmNsdWRlSW5TZWFyY2g6IGZhbHNlXG4gICAgICB9O1xuICAgICAgcmV0dXJuIFtjaGVja2JveGVzQ29sdW1uLCAuLi5jb2x1bW5EZWZzXTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbkRlZnM7XG4gIH1cblxuICBwcml2YXRlIGluaXRPblJvd1NlbGVjdGVkRm9yU2VydmVyU2lkZVBhZ2luYXRpb24oeyBncmlkT3B0aW9ucyB9OiBOb3JtYWxpemVPcHRpb25zUGFyYW1zKSB7XG4gICAgaWYgKCF0aGlzLmlzU2VydmVyU2lkZVBhZ2luYXRpb24oZ3JpZE9wdGlvbnMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4dGVybmFsT25Sb3dTZWxlY3RlZCA9IGdyaWRPcHRpb25zLm9uUm93U2VsZWN0ZWQ7XG4gICAgZ3JpZE9wdGlvbnMub25Sb3dTZWxlY3RlZCA9IChldnQ6IFJvd1NlbGVjdGVkRXZlbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLmdyaWRRdWVyeS5pc1NlcnZlclNlbGVjdEFsbFJvd3NFbmFibGVkKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBldnQubm9kZTtcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IG5vZGUuaXNTZWxlY3RlZCgpO1xuICAgICAgICBjb25zdCB7IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCB9ID0gdGhpcy5ncmlkUXVlcnkuc2VydmVyU2lkZUNvbmZpZztcbiAgICAgICAgY29uc3QgaXNFeGNsdWRlZCA9IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbC5pbmNsdWRlcyhub2RlLmlkKTtcbiAgICAgICAgaWYgKGlzU2VsZWN0ZWQgJiYgaXNFeGNsdWRlZCkge1xuICAgICAgICAgIHRoaXMuc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oe1xuICAgICAgICAgICAgZXhjbHVkZWRGcm9tU2VsZWN0QWxsOiBleGNsdWRlZEZyb21TZWxlY3RBbGwuZmlsdGVyKChub2RlSWQ6IHN0cmluZykgPT4gbm9kZUlkICE9PSBub2RlLmlkKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc1NlbGVjdGVkICYmICFpc0V4Y2x1ZGVkKSB7XG4gICAgICAgICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbDogWy4uLmV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCwgbm9kZS5pZF0gfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChleHRlcm5hbE9uUm93U2VsZWN0ZWQpIHtcbiAgICAgICAgZXh0ZXJuYWxPblJvd1NlbGVjdGVkKGV2dCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcm93TWF0Y2hlc1NlYXJjaChyb3c6IFJvd05vZGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZWFyY2hUZXJtID0gKHRoaXMuZ3JpZFF1ZXJ5LmdldFNlYXJjaFRlcm0oKSB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgaWYgKGlzRW1wdHkoc2VhcmNoVGVybSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKS5pbmNsdWRlSGlkZGVuQ29sdW1uc0luU2VhcmNoXG4gICAgICA/IHRoaXMuZ3JpZFF1ZXJ5LmdldEFsbENvbHVtbnMoKVxuICAgICAgOiB0aGlzLmdyaWRRdWVyeS5nZXRBbGxEaXNwbGF5ZWRDb2x1bW5zKCk7XG4gICAgZm9yIChjb25zdCBjb2wgb2YgY29sdW1ucykge1xuICAgICAgY29uc3QgY29sRGVmID0gdGhpcy5hcGkuZ3JpZC5nZXRDb2x1bW5EZWYoY29sLmdldENvbElkKCkpIGFzIERhdG9HcmlkQ29sdW1uRGVmO1xuICAgICAgaWYgKCFjb2xEZWYuaW5jbHVkZUluU2VhcmNoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3Qgcm93VmFsdWUgPSAodGhpcy5hcGkuZ3JpZC5nZXRWYWx1ZShjb2wuZ2V0Q29sSWQoKSwgcm93KSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHJvd1ZhbHVlLmluY2x1ZGVzKHNlYXJjaFRlcm0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGZpdEdyaWQoJ2NvbnRhaW5lcicpIGluc3RlYWRcbiAgICovXG4gIGZpdFRvQ29udGFpbmVyKCkge1xuICAgIHRoaXMuYXBpLmdyaWQuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xuICB9XG5cbiAgZ2V0Q3VzdG9tSGVhZGVyKGZpZWxkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzKSB7XG4gICAgICBjb25zdCBzcGVjaWZpYyA9IHRoaXMuY3VzdG9tSGVhZGVyc1RlbXBsYXRlcy5maW5kKCh7IGNvbHVtbiB9KSA9PiBjb2x1bW4gPT09IGZpZWxkKTtcbiAgICAgIGNvbnN0IGNvbW1vbiA9IHRoaXMuY3VzdG9tSGVhZGVyc1RlbXBsYXRlcy5maW5kKCh7IGNvbHVtbiB9KSA9PiAhY29sdW1uKTtcbiAgICAgIGlmIChzcGVjaWZpYyB8fCBjb21tb24pIHtcbiAgICAgICAgY29uc3QgeyBtb3JlTWVudSwgY3VzdG9tSGVhZGVyIH0gPSB7XG4gICAgICAgICAgbW9yZU1lbnU6IChzcGVjaWZpYyAmJiBzcGVjaWZpYy5tb3JlTWVudSkgfHwgKGNvbW1vbiAmJiBjb21tb24ubW9yZU1lbnUpLFxuICAgICAgICAgIGN1c3RvbUhlYWRlcjogKHNwZWNpZmljICYmIHNwZWNpZmljLmN1c3RvbUhlYWRlcikgfHwgKGNvbW1vbiAmJiBjb21tb24uY3VzdG9tSGVhZGVyKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4geyBtb3JlTWVudTogbW9yZU1lbnUgJiYgbW9yZU1lbnUudHBsLCBjdXN0b21IZWFkZXI6IGN1c3RvbUhlYWRlciAmJiBjdXN0b21IZWFkZXIudHBsIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY2xlYXJBbGxGaWx0ZXJzKCkge1xuICAgIHRoaXMuc3RvcmUudXBkYXRlKHN0YXRlID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgLi4uc3RhdGUuc2V0dGluZ3MsXG4gICAgICAgICAgZmlsdGVyOiB7fSxcbiAgICAgICAgICBzZWFyY2hUZXJtOiBudWxsXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5ub3RpZnlGaWx0ZXJVcGRhdGUoKTtcbiAgfVxuXG4gIGNsZWFyQ29sdW1uRmlsdGVyKGNvbHVtbkZpZWxkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7IFtjb2x1bW5GaWVsZF06IGRlbGV0ZWQsIC4uLmZpbHRlciB9ID0gdGhpcy5ncmlkUXVlcnkuZ2V0RmlsdGVyKCk7XG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncyxcbiAgICAgICAgICBmaWx0ZXJcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLm5vdGlmeUZpbHRlclVwZGF0ZSgpO1xuICB9XG5cbiAgc2V0Q29sdW1uRmlsdGVyKGNvbHVtbjogQ29sdW1uLCBmaWx0ZXI6IERhdG9HcmlkRmlsdGVyLCBub3RpZnlHcmlkID0gdHJ1ZSkge1xuICAgIHRoaXMuX2xvZ0V2ZW50KENvcmVFdmVudFR5cGVzLkdSSURfRklMVEVSX0FQUExJRUQsIHtcbiAgICAgIGNvbHVtbjogY29sdW1uLmdldENvbElkKCksXG4gICAgICBudW1PZkNvbmRpdGlvbnM6IChmaWx0ZXIuY29uZGl0aW9uYWwgJiYgZmlsdGVyLmNvbmRpdGlvbmFsLmNvbmRpdGlvbnMubGVuZ3RoKSB8fCAwLFxuICAgICAgYnlWYWx1ZTogISFmaWx0ZXIuYnlWYWx1ZSA/ICdZZXMnIDogJ05vJ1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVGaWx0ZXIoY29sdW1uLCBmaWx0ZXIpO1xuXG4gICAgaWYgKG5vdGlmeUdyaWQpIHtcbiAgICAgIHRoaXMubm90aWZ5RmlsdGVyVXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0R3JpZEZpbHRlcnMoZmlsdGVyczogRGF0b0dyaWRFeHRlcm5hbEZpbHRlcltdKSB7XG4gICAgaWYgKHRoaXMuYXBpICYmIGZpbHRlcnMpIHtcbiAgICAgIGxldCBhcHBsaWVkRmlsdGVyID0ge307XG5cbiAgICAgIGZvciAoY29uc3QgeyBmaWx0ZXIsIGZpZWxkIH0gb2YgZmlsdGVycykge1xuICAgICAgICBhcHBsaWVkRmlsdGVyW2ZpZWxkXSA9IGZpbHRlcjtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVTZXR0aW5ncyh7IGZpbHRlcjogYXBwbGllZEZpbHRlciB9KTtcbiAgICAgIHRoaXMubm90aWZ5RmlsdGVyVXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0U29ydEJ5Q29sdW1uKGNvbElkLCBzb3J0KSB7XG4gICAgY29uc3Qgc29ydFRvU2V0ID0gdGhpcy5ncmlkUXVlcnkuZ2V0U29ydCh7IGNvbElkLCBzb3J0IH0pO1xuXG4gICAgdGhpcy5zZXRHcmlkU29ydChzb3J0VG9TZXQpO1xuICB9XG5cbiAgc2V0R3JpZFNvcnQoZ3JpZFNvcnQ6IERhdG9HcmlkU29ydCkge1xuICAgIGlmIChncmlkU29ydCAmJiB0aGlzLmFwaSAmJiB0aGlzLmFwaS5ncmlkLmdldERpc3BsYXllZFJvd0NvdW50KCkgPiAwKSB7XG4gICAgICBjb25zdCB7IGNvbElkLCBzb3J0LCBzb3J0SW5kZXggfSA9IGdyaWRTb3J0O1xuICAgICAgY29uc3QgZ3JpZENvbHVtbnMgPSB0aGlzLmFwaS5jb2x1bW5zLmdldEFsbEdyaWRDb2x1bW5zKCk7XG5cbiAgICAgIGlmIChncmlkQ29sdW1ucykge1xuICAgICAgICBsZXQgc29ydFRvQXBwbHkgPSBncmlkU29ydDtcbiAgICAgICAgLyoqIFNvcnQgYnkgY29sdW1uIGlkICovXG4gICAgICAgIGNvbnN0IGNvbHVtbkJ5SWQgPSBncmlkQ29sdW1ucy5maW5kKChjb2w6IENvbHVtbikgPT4ge1xuICAgICAgICAgIHJldHVybiAoY29sLmdldENvbERlZigpLnNob3dSb3dHcm91cCB8fCBjb2wuZ2V0Q29sSWQoKSkgPT09IGNvbElkO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY29sdW1uQnlJZCkge1xuICAgICAgICAgIHNvcnRUb0FwcGx5ID0geyBjb2xJZDogY29sdW1uQnlJZC5nZXRDb2xJZCgpLCBzb3J0IH07XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzTmlsKHNvcnRJbmRleCkpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZUNvbHVtbnMgPSB0aGlzLmFwaS5jb2x1bW5zLmdldFZhbHVlQ29sdW1ucygpO1xuICAgICAgICAgIGNvbnN0IHZhbHVlQ29sdW1uID0gdmFsdWVDb2x1bW5zLmZpbmQoKGNvbDogQ29sdW1uKSA9PiBjb2wuZ2V0Q29sSWQoKSA9PT0gY29sSWQpO1xuICAgICAgICAgIGNvbnN0IGlzUGl2b3RDb2xJZCA9IGNvbElkLnN0YXJ0c1dpdGgoJ3Bpdm90Jyk7XG5cbiAgICAgICAgICBpZiAoaXNQaXZvdENvbElkIHx8IHZhbHVlQ29sdW1uKSB7XG4gICAgICAgICAgICAvKiogQ29sdW1uIGlzIHBpdm90IHZhbHVlIGNvbHVtbiwgc29ydCBieSBpbmRleCAqL1xuICAgICAgICAgICAgY29uc3QgY29sdW1uQnlJbmRleCA9IGdyaWRDb2x1bW5zW3NvcnRJbmRleF07XG5cbiAgICAgICAgICAgIHNvcnRUb0FwcGx5ID0geyBjb2xJZDogY29sdW1uQnlJbmRleC5nZXRDb2xJZCgpLCBzb3J0LCBzb3J0SW5kZXggfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKHsgc29ydDogc29ydFRvQXBwbHkgfSk7XG4gICAgICAgIHRoaXMuYXBpLmdyaWQuc2V0U29ydE1vZGVsKFtzb3J0VG9BcHBseV0pO1xuXG4gICAgICAgIGlmICgodGhpcy5ncmlkUmVmLmdyaWRPcHRpb25zIGFzIERhdG9HcmlkT3B0aW9ucykudXNlUGl2b3RHcmlkU3R5bGUpIHtcbiAgICAgICAgICB0aGlzLmFwaS5ncmlkLnJlZHJhd1Jvd3MoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRmlsdGVyKGNvbHVtbjogQ29sdW1uLCBmaWx0ZXI6IERhdG9HcmlkRmlsdGVyKSB7XG4gICAgY29uc3QgY29sRmllbGQgPSBnZXRDb2xGaWVsZChjb2x1bW4uZ2V0Q29sRGVmKCkpO1xuXG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncyxcbiAgICAgICAgICBmaWx0ZXI6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLmZpbHRlcixcbiAgICAgICAgICAgIFtjb2xGaWVsZF06IGZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldFNlYXJjaFRlcm0oc2VhcmNoVGVybTogc3RyaW5nKSB7XG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncyxcbiAgICAgICAgICBzZWFyY2hUZXJtXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5ub3RpZnlGaWx0ZXJVcGRhdGUoKTtcbiAgfVxuXG4gIHNldFNlcnZlclNpZGVQYWdpbmF0aW9uKGNvbmZpZzogUGFydGlhbDxTZXJ2ZXJTaWRlUGFnaW5hdGlvbkNvbmZpZz4pIHtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXJ2ZXJTaWRlUGFnaW5hdGlvbjoge1xuICAgICAgICAgIC4uLnN0YXRlLnNlcnZlclNpZGVQYWdpbmF0aW9uLFxuICAgICAgICAgIC4uLmNvbmZpZ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc2V0TG9hZGluZyhzaG93OiBib29sZWFuKSB7XG4gICAgaWYgKHNob3cpIHtcbiAgICAgIHRoaXMuYXBpLmdyaWQuc2hvd0xvYWRpbmdPdmVybGF5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXBpLmdyaWQuZ2V0RGlzcGxheWVkUm93Q291bnQoKSA9PT0gMCA/IHRoaXMuc2V0T3ZlcmxheSh0cnVlKSA6IHRoaXMuc2V0T3ZlcmxheShmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBzZXRPdmVybGF5IGluc3RlYWRcbiAgICogQHBhcmFtIHNob3dcbiAgICovXG4gIHNldE5vRGF0YShzaG93OiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRPdmVybGF5KHNob3cpO1xuICB9XG5cbiAgc2V0T3ZlcmxheShzaG93OiBib29sZWFuKSB7XG4gICAgc2hvdyA/IHRoaXMuYXBpLmdyaWQuc2hvd05vUm93c092ZXJsYXkoKSA6IHRoaXMuYXBpLmdyaWQuaGlkZU92ZXJsYXkoKTtcbiAgfVxuXG4gIHVwZGF0ZVNldHRpbmdzKHNldHRpbmdzOiBQYXJ0aWFsPERhdG9HcmlkU2V0dGluZ3M+KSB7XG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncyxcbiAgICAgICAgICAuLi5zZXR0aW5nc1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZml0R3JpZCh0bzogJ2NvbnRhaW5lcicgfCAnY29udGVudCcpIHtcbiAgICB0byA9PT0gJ2NvbnRhaW5lcicgPyB0aGlzLmFwaS5ncmlkLnNpemVDb2x1bW5zVG9GaXQoKSA6IHRoaXMuYXBpLmNvbHVtbnMuYXV0b1NpemVBbGxDb2x1bW5zKCk7XG4gICAgY29uc3QgZ3JpZEFsaWdubWVudCA9IHRvID09PSAnY29udGFpbmVyJyA/IERhdG9HcmlkQWxpZ25tZW50LkZJVF9UT19DT05UQUlORVIgOiBEYXRvR3JpZEFsaWdubWVudC5GSVRfVE9fQ09OVEVOVDtcbiAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKHsgZ3JpZEFsaWdubWVudCwgY29sdW1uc1NpemVzOiBudWxsIH0pO1xuICB9XG5cbiAgc2F2ZVNldHRpbmdzVG9TZXJ2ZXIoc2V0dGluZ3M6IFBhcnRpYWw8RGF0b0dyaWRTZXR0aW5ncz4pIHtcbiAgICBjb25zdCBpc0dsb2JhbCA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCkuaXNHbG9iYWxTZXR0aW5ncztcbiAgICB0aGlzLnN0b3JhZ2VBUEkuc2V0KHRoaXMuZ3JpZE5hbWUsIHNldHRpbmdzLCBpc0dsb2JhbCk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsIHVzZWQgdG8gbG9nIGdyaWQgZXZlbnRzIHRvIHRoZSBwbGF0Zm9ybSdzIGxvZ2dpbmcgc2VydmljZVxuICAgKi9cbiAgX2xvZ0V2ZW50KGV2ZW50VHlwZTogQ29yZUV2ZW50VHlwZXMsIGV2ZW50UHJvcGVydGllcz86IEhhc2hNYXA8YW55Pikge1xuICAgIHRoaXMubG9nZ2VyLmxvZ0V2ZW50KGV2ZW50VHlwZSwgeyB0YWJsZTogdGhpcy5ncmlkTmFtZSwgLi4uZXZlbnRQcm9wZXJ0aWVzIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB3cmFwU3VjY2Vzc0NhbGxiYWNrKHsgc3VjY2Vzc0NiLCBwYWdlTnVtYmVyLCBpc1BlbmRpbmdSZXR1cm5Ub1BhZ2UgfTogU3VjY2Vzc1dyYXBwZXJQYXJhbXMpIHtcbiAgICByZXR1cm4gKHJvd3NUaGlzQmxvY2s6IGFueVtdLCB0b3RhbFJvd3M6IG51bWJlcikgPT4ge1xuICAgICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7IHRvdGFsUm93cywgaGFzRXJyb3I6IGZhbHNlIH0pO1xuICAgICAgc3VjY2Vzc0NiKHJvd3NUaGlzQmxvY2ssIHRvdGFsUm93cyk7XG4gICAgICB0aGlzLmdyaWRRdWVyeS5fc2VydmVyRGF0YUxvYWRlZC5uZXh0KHtcbiAgICAgICAgYXBpOiB0aGlzLmFwaS5ncmlkLFxuICAgICAgICBjb2x1bW5BcGk6IHRoaXMuYXBpLmNvbHVtbnMsXG4gICAgICAgIHR5cGU6ICdTZXJ2ZXJEYXRhTG9hZGVkJyxcbiAgICAgICAgcGFnaW5hdGlvblBhZ2U6IHBhZ2VOdW1iZXJcbiAgICAgIH0pO1xuICAgICAgaWYgKCFpc1BlbmRpbmdSZXR1cm5Ub1BhZ2UpIHtcbiAgICAgICAgdGhpcy5zZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgLyoqIHNvIHRoZSBncmlkIGZpdHMgaW4gZXZlcnkgbmV3IGRhdGEgaW5wdXQgKi9cbiAgICAgICAgdHJpZ2dlcldpbmRvd1Jlc2l6ZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0VG90YWxSb3dzID0gdG90YWxSb3dzO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHdyYXBHZXRSb3dzKG9wdGlvbnM6IERhdG9HcmlkT3B0aW9ucywgZ2V0Um93cz86IChwYXJhbXM6IERhdG9HcmlkR2V0Um93c1BhcmFtcykgPT4gdm9pZCkge1xuICAgIGNvbnN0IGdldFJvd3NDYiA9IGdldFJvd3MgfHwgb3B0aW9ucy5kYXRhc291cmNlLmdldFJvd3M7XG4gICAgcmV0dXJuIChnZXRSb3dzUGFyYW1zOiBJR2V0Um93c1BhcmFtcykgPT4ge1xuICAgICAgY29uc3QgeyBzdGFydFJvdywgZW5kUm93LCBzb3J0TW9kZWwsIHN1Y2Nlc3NDYWxsYmFjayB9ID0gZ2V0Um93c1BhcmFtcztcbiAgICAgIGNvbnN0IHBhZ2VTaXplID0gb3B0aW9ucy5wYWdpbmF0aW9uUGFnZVNpemUgfHwgMTAwO1xuICAgICAgY29uc3QgaXNSZXR1cm5Ub0N1cnJlbnRQYWdlUmVxdWlyZWQgPSB0aGlzLnBhZ2VOdW1iZXJUb1JldHVybkFmdGVyUmVmcmVzaCA+IDA7XG4gICAgICBjb25zdCBpc1BlbmRpbmdSZXR1cm5Ub1BhZ2UgPSBpc1JldHVyblRvQ3VycmVudFBhZ2VSZXF1aXJlZCAmJiBzdGFydFJvdyA9PT0gMDtcblxuICAgICAgY29uc3QgcGFnZU51bWJlciA9IGlzUmV0dXJuVG9DdXJyZW50UGFnZVJlcXVpcmVkXG4gICAgICAgID8gdGhpcy5wYWdlTnVtYmVyVG9SZXR1cm5BZnRlclJlZnJlc2ggKyAxXG4gICAgICAgIDogTWF0aC5jZWlsKGVuZFJvdyAvIHBhZ2VTaXplKTtcblxuICAgICAgdGhpcy5wYWdlTnVtYmVyVG9SZXR1cm5BZnRlclJlZnJlc2ggPSAtMTtcblxuICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5ncmlkUXVlcnkuZ2V0RmlsdGVyKCk7XG4gICAgICBjb25zdCBuZXdQYXJhbXM6IERhdG9HcmlkR2V0Um93c1BhcmFtcyA9IHtcbiAgICAgICAgLi4uZ2V0Um93c1BhcmFtcyxcbiAgICAgICAgZmFpbENhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7IGhhc0Vycm9yOiB0cnVlIH0pO1xuICAgICAgICAgIHRoaXMuc2V0T3ZlcmxheSh0cnVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgc3VjY2Vzc0NhbGxiYWNrOiB0aGlzLndyYXBTdWNjZXNzQ2FsbGJhY2soeyBwYWdlTnVtYmVyLCBzdWNjZXNzQ2I6IHN1Y2Nlc3NDYWxsYmFjaywgaXNQZW5kaW5nUmV0dXJuVG9QYWdlIH0pLFxuICAgICAgICBzZXJ2ZXJDb25maWc6IHtcbiAgICAgICAgICBwYWdlU2l6ZSxcbiAgICAgICAgICBwYWdlTnVtYmVyLFxuICAgICAgICAgIGNvbHVtbkZpbHRlcnM6IGlzRW1wdHkoZmlsdGVyKSB8fCBvcHRpb25zLmVuYWJsZVYyXzEgPyBudWxsIDogdGhpcy5idWlsZFNlcnZlclJlcXVlc3RGaWx0ZXJzKGZpbHRlciksXG4gICAgICAgICAgZmlsdGVyOiBvcHRpb25zLmVuYWJsZVYyXzEgPyB0aGlzLmJ1aWxkU2VydmVyUmVxdWVzdEZpbHRlcnNfdjJfMShvcHRpb25zLmNvbHVtbkRlZnMpIDogbnVsbCxcbiAgICAgICAgICBzb3J0OiB0aGlzLmJ1aWxkU2VydmVyUmVxdWVzdFNvcnQoc29ydE1vZGVsKVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKGlzUGVuZGluZ1JldHVyblRvUGFnZSkge1xuICAgICAgICAvLyBTY2VuYXJpbyB0aGUgZm9sbG93aW5nIGhhbmRsZXMgLSBzZXJ2ZXIgcmVmcmVzaCB3aGVyZSBpdCB3YXMgcmVxdWVzdGVkIHRvIGtlZXAgdGhlIGN1cnJlbnQgcGFnZS5cbiAgICAgICAgLy8gVGhlIHByb2JsZW0gLSBnZXRSb3dzIHdpbGwgaW5pdGlhbGx5IGJlIGNhbGxlZCBmb3IgcGFnZSAxIChhdXRvbWF0aWNhbGx5IGhhcHBlbnMgd2hlbiBjYWxsaW5nIGFnLWdyaWQncyBzZXREYXRhU291cmNlKS5cbiAgICAgICAgLy8gSW4gb3JkZXIgdG8gdHJpZ2dlciBpdCBhZ2Fpbiwgc3VjY2Vzc0NhbGxiYWNrIGlzIGNhbGxlZCB3aXRoIHRoZSBkZXNpcmVkIHBhZ2UuXG4gICAgICAgIC8vIGZha2VHZXRSb3dzIGlzIHVzZWQgaW4gb3JkZXIgdG8gYXZvaWQgcmV0cmlldmluZyB0aGUgdW5uZWNlc3NhcnkgcmVhbCBkYXRhIGZvciBwYWdlIDEuXG4gICAgICAgIGNvbnN0IGZha2VHZXRSb3dzID0gKHsgc3VjY2Vzc0NhbGxiYWNrIH06IERhdG9HcmlkR2V0Um93c1BhcmFtcykgPT4ge1xuICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhbXSwgdGhpcy5sYXN0VG90YWxSb3dzKTtcbiAgICAgICAgfTtcbiAgICAgICAgZmFrZUdldFJvd3MobmV3UGFyYW1zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdldFJvd3NDYihuZXdQYXJhbXMpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGluaXRFZGl0YWJsZUNvbHVtbnNDZWxsQ2xhc3MocGFyYW1zOiBOb3JtYWxpemVPcHRpb25zUGFyYW1zKSB7XG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmNvbHVtbkRlZnMuZm9yRWFjaChjb2xEZWYgPT4ge1xuICAgICAgaWYgKGNvbERlZi5lZGl0YWJsZSkge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihjb2xEZWYuZWRpdGFibGUpKSB7XG4gICAgICAgICAgY29uc3QgaW5pdGlhbENlbGxDbGFzcyA9IGNvbERlZi5jZWxsQ2xhc3M7XG4gICAgICAgICAgY29sRGVmLmNlbGxDbGFzcyA9IChjZWxsQ2xhc3NQYXJhbXM6IENlbGxDbGFzc1BhcmFtcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNFZGl0YWJsZSA9IChjb2xEZWYuZWRpdGFibGUgYXMgRnVuY3Rpb24pKGNlbGxDbGFzc1BhcmFtcyBhcyBhbnkpO1xuICAgICAgICAgICAgaWYgKGlzRWRpdGFibGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZWRpdGFibGVSZXN1bHQgPSB0aGlzLmFkZEVkaXRhYmxlQ2VsbENsYXNzKGluaXRpYWxDZWxsQ2xhc3MpO1xuICAgICAgICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihlZGl0YWJsZVJlc3VsdCkgPyBlZGl0YWJsZVJlc3VsdChjZWxsQ2xhc3NQYXJhbXMpIDogZWRpdGFibGVSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihpbml0aWFsQ2VsbENsYXNzKSA/IGluaXRpYWxDZWxsQ2xhc3MoY2VsbENsYXNzUGFyYW1zKSA6IGluaXRpYWxDZWxsQ2xhc3M7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2xEZWYuY2VsbENsYXNzID0gdGhpcy5hZGRFZGl0YWJsZUNlbGxDbGFzcyhjb2xEZWYuY2VsbENsYXNzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB3cmFwQ29udGV4dE1lbnVCdWlsZGVyKHBhcmFtczogTm9ybWFsaXplT3B0aW9uc1BhcmFtcykge1xuICAgIGNvbnN0IHsgY3VzdG9tQ29udGV4dE1lbnUgfSA9IHBhcmFtcy5ncmlkT3B0aW9ucztcbiAgICBjb25zdCBhbGxBY3Rpb25zID0gaXNGdW5jdGlvbihjdXN0b21Db250ZXh0TWVudSkgPyBjdXN0b21Db250ZXh0TWVudShwYXJhbXMucm93QWN0aW9ucykgOiBwYXJhbXMucm93QWN0aW9ucztcbiAgICB0aGlzLnRyYW5zbGF0ZUFjdGlvbkxhYmVscyhhbGxBY3Rpb25zKTtcbiAgICBjb25zdCBjb3B5QWN0aW9uOiBSb3dBY3Rpb24gPSB7XG4gICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKCdjb3JlLmNvcHktY2VsbCcpLFxuICAgICAgaWNvbjogJ2NvcHknLFxuICAgICAga2V5OiAnQ29weSBDZWxsJ1xuICAgIH07XG4gICAgcmV0dXJuICh7IG5vZGUsIGNvbHVtbiwgY29udGV4dCB9OiBHZXRDb250ZXh0TWVudUl0ZW1zUGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCBvbkhvdmVyQWN0aW9uTWVudSA9IGNvbnRleHQgJiYgY29udGV4dC5jb250ZXh0TWVudSAmJiBjb250ZXh0LmNvbnRleHRNZW51LmZyb21PbkhvdmVyO1xuICAgICAgaWYgKCFub2RlKSByZXR1cm4gW107XG4gICAgICBsZXQgc2VsZWN0ZWQgPSBbbm9kZV07XG4gICAgICBsZXQgcm93c0NvdW50ID0gMTtcbiAgICAgIGlmIChvbkhvdmVyQWN0aW9uTWVudSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUdyaWRDb250ZXh0KHsgY29udGV4dE1lbnU6IHsgZnJvbU9uSG92ZXI6IGZhbHNlIH0gfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb3B5QWN0aW9uLm9uQ2xpY2sgPSAoW3Jvd10pID0+IHtcbiAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHRoaXMuYXBpLmdyaWQuZ2V0VmFsdWUoY29sdW1uLmdldENvbElkKCksIHJvdyk7XG4gICAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gY29sdW1uLmdldENvbERlZigpLnZhbHVlRm9ybWF0dGVyO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZm9ybWF0dGVyID8gZm9ybWF0dGVyKHJhd1ZhbHVlKSA6IHJhd1ZhbHVlO1xuICAgICAgICAgIGNvcHlUb0NsaXBib2FyZCh2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChub2RlLmlzU2VsZWN0ZWQoKSkge1xuICAgICAgICAgIHNlbGVjdGVkID0gdGhpcy5ncmlkUXVlcnkuZ2V0U2VsZWN0ZWRSb3dOb2RlcygpO1xuICAgICAgICAgIHJvd3NDb3VudCA9IHNpemUoc2VsZWN0ZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB2aXNpYmxlQWN0aW9ucyA9IGdldFZpc2libGVBY3Rpb25zKFxuICAgICAgICBhbGxBY3Rpb25zLFxuICAgICAgICByb3dzQ291bnQsXG4gICAgICAgIHNlbGVjdGVkLFxuICAgICAgICB0aGlzLmdyaWRRdWVyeS5pc1NlcnZlclNlbGVjdEFsbFJvd3NFbmFibGVkXG4gICAgICApLmZpbHRlcigoeyB2aXNpYmxlIH0pID0+IHZpc2libGUpO1xuICAgICAgbGV0IHRvb2xiYXJBY3Rpb25zID0gW2NvcHlBY3Rpb25dO1xuICAgICAgaWYgKG9uSG92ZXJBY3Rpb25NZW51KSB7XG4gICAgICAgIHRvb2xiYXJBY3Rpb25zID0gdmlzaWJsZUFjdGlvbnM7XG4gICAgICB9IGVsc2UgaWYgKHZpc2libGVBY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdG9vbGJhckFjdGlvbnMgPSBbeyAuLi5jb3B5QWN0aW9uLCBzZXBhcmF0b3I6IHRydWUgfSwgLi4udmlzaWJsZUFjdGlvbnNdO1xuICAgICAgfVxuICAgICAgY29uc3QgY29udmVydGVyUGFyYW1zOiBBY3Rpb25Db252ZXJ0ZXJQYXJhbXMgPSB7XG4gICAgICAgIHRvb2xiYXJBY3Rpb25zLFxuICAgICAgICBzZWxlY3RlZFJvd3M6IHNlbGVjdGVkLFxuICAgICAgICBpY29uUmVnaXN0cnk6IHRoaXMuc3ZnUmVnaXN0cnksXG4gICAgICAgIG5vZGUsXG4gICAgICAgIGxvZ2dlcjoge1xuICAgICAgICAgIGxvZzogdGhpcy5fbG9nRXZlbnQuYmluZCh0aGlzKSxcbiAgICAgICAgICBldmVudE9yaWdpbjogb25Ib3ZlckFjdGlvbk1lbnUgPyAnT24gSG92ZXInIDogJ0NvbnRleHQgTWVudSdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiB0b29sYmFyQWN0aW9uVG9Db250ZXh0QWN0aW9uKGNvbnZlcnRlclBhcmFtcyk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNsYXRlQWN0aW9uTGFiZWxzKGFsbEFjdGlvbnM6IFJvd0FjdGlvbltdKSB7XG4gICAgYWxsQWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICBhY3Rpb24ubGFiZWwgPSB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oYWN0aW9uLmxhYmVsKTtcbiAgICAgIGlmIChhY3Rpb24uc3ViTWVudSkge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZUFjdGlvbkxhYmVscyhhY3Rpb24uc3ViTWVudSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBsb2FkU2F2ZWRTZXR0aW5ncyhzZXR0aW5nczogUGFydGlhbDxEYXRvR3JpZFNldHRpbmdzPikge1xuICAgIGNvbnN0IHtcbiAgICAgIHNvcnQsXG4gICAgICBoaWRkZW5Db2x1bW5zLFxuICAgICAgZmlsdGVyLFxuICAgICAgZ3JvdXBlZENvbHVtbnMsXG4gICAgICBjb2x1bW5zU2l6ZXMsXG4gICAgICBwaW5uZWRDb2x1bW5zLFxuICAgICAgY29sdW1uc09yZGVyLFxuICAgICAgZ3JpZEFsaWdubWVudFxuICAgIH0gPSBzZXR0aW5ncztcbiAgICBjb25zdCB7IGdyaWQsIGNvbHVtbnMgfSA9IHRoaXMuYXBpO1xuICAgIC8qIEhpZGUgY29sdW1ucyAqL1xuICAgIC8qIE5PVEU6IGNvbHVtbnMgb3JkZXIgYXJlIHRyZWF0ZWQgYXMgdGhlIGN1cnJlbnRseSB2aXNpYmxlIGNvbHVtbnMgKi9cbiAgICBjb2x1bW5zLnNldENvbHVtbnNWaXNpYmxlKHRoaXMuaW5pdGlhbFNldHRpbmdzLmNvbHVtbnNPcmRlciwgdHJ1ZSk7XG4gICAgY29uc3QgY29sdW1uVG9IaWRlID0gIWlzTmlsKGhpZGRlbkNvbHVtbnMpID8gaGlkZGVuQ29sdW1ucyA6IHRoaXMuaW5pdGlhbFNldHRpbmdzLmhpZGRlbkNvbHVtbnM7XG4gICAgY29sdW1ucy5zZXRDb2x1bW5zVmlzaWJsZShjb2x1bW5Ub0hpZGUsIGZhbHNlKTtcblxuICAgIC8qIEFwcGx5IGZpbHRlcnMgKi9cbiAgICBpZiAoZmlsdGVyKSB7XG4gICAgICBncmlkLm9uRmlsdGVyQ2hhbmdlZCgpO1xuICAgIH1cblxuICAgIC8qIEdyb3VwIGNvbHVtbnMgKi9cbiAgICBjb25zdCBhbGxHcm91cGVkQ29sdW1ucyA9IGNvbHVtbnMuZ2V0Um93R3JvdXBDb2x1bW5zKCk7XG4gICAgbGV0IHJlbW92ZUdyb3VwZWQ7XG4gICAgaWYgKGdyb3VwZWRDb2x1bW5zKSB7XG4gICAgICByZW1vdmVHcm91cGVkID0gYWxsR3JvdXBlZENvbHVtbnMuZmlsdGVyKGNvbCA9PiAhZ3JvdXBlZENvbHVtbnMuaW5jbHVkZXMoY29sLmdldENvbElkKCkpKTtcbiAgICAgIGNvbHVtbnMuYWRkUm93R3JvdXBDb2x1bW5zKGdyb3VwZWRDb2x1bW5zKTtcbiAgICAgIGNvbHVtbnMuc2V0Q29sdW1uc1Zpc2libGUoZ3JvdXBlZENvbHVtbnMsIGZhbHNlKTtcbiAgICB9XG4gICAgY29sdW1ucy5yZW1vdmVSb3dHcm91cENvbHVtbnMocmVtb3ZlR3JvdXBlZCk7XG4gICAgY29sdW1ucy5zZXRDb2x1bW5zVmlzaWJsZShyZW1vdmVHcm91cGVkLCB0cnVlKTtcblxuICAgIC8qIEFwcGx5IHNvcnQgKi9cbiAgICBjb25zdCBncmlkU29ydCA9IHNvcnQgfHwgdGhpcy5pbml0aWFsU2V0dGluZ3Muc29ydDtcbiAgICBncmlkLnNldFNvcnRNb2RlbChncmlkU29ydCA/IFtncmlkU29ydF0gOiBudWxsKTtcblxuICAgIC8qIEFsaWduIGdyaWQgKi9cbiAgICBpZiAoZ3JpZEFsaWdubWVudCA9PT0gRGF0b0dyaWRBbGlnbm1lbnQuQ1VTVE9NKSB7XG4gICAgICAvKiBTZXQgY29sdW1uIHNpemVzICovXG4gICAgICBjb2x1bW5zU2l6ZXMgJiZcbiAgICAgICAgT2JqZWN0LmtleXMoY29sdW1uc1NpemVzKS5mb3JFYWNoKGNvbElkID0+IHtcbiAgICAgICAgICBpZiAoY29sdW1uc1NpemVzW2NvbElkXSA9PT0gRGF0b0dyaWRBbGlnbm1lbnQuRklUX1RPX0NPTlRFTlQpIHtcbiAgICAgICAgICAgIGNvbHVtbnMuYXV0b1NpemVDb2x1bW4oY29sSWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb2x1bW5zLnNldENvbHVtbldpZHRoKGNvbElkLCBjb2x1bW5zU2l6ZXNbY29sSWRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBncmlkQWxpZ25tZW50ID09PSBEYXRvR3JpZEFsaWdubWVudC5GSVRfVE9fQ09OVEVOVCA/IGNvbHVtbnMuYXV0b1NpemVBbGxDb2x1bW5zKCkgOiBncmlkLnNpemVDb2x1bW5zVG9GaXQoKTtcbiAgICB9XG5cbiAgICAvKiBQaW4gY29sdW1ucyBsZWZ0ICovXG4gICAgY29uc3QgZmlsdGVyZWRQaW5uZWRDb2x1bW5zID0gcGlubmVkQ29sdW1uc1xuICAgICAgPyBwaW5uZWRDb2x1bW5zLmZpbHRlcigoY29sOiBzdHJpbmcpID0+IGNvbCAhPT0gdGhpcy5DSEVDS0JPWF9TRUxFQ1RJT05fQ09MX0lEKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGZpbHRlcmVkQ29sdW1ucyA9IGNvbHVtbnNPcmRlclxuICAgICAgPyBjb2x1bW5zT3JkZXIuZmlsdGVyKChjb2w6IHN0cmluZykgPT4gY29sICE9PSB0aGlzLkNIRUNLQk9YX1NFTEVDVElPTl9DT0xfSUQpXG4gICAgICA6IG51bGw7XG4gICAgc2l6ZShmaWx0ZXJlZFBpbm5lZENvbHVtbnMpID4gMFxuICAgICAgPyBjb2x1bW5zLnNldENvbHVtbnNQaW5uZWQoZmlsdGVyZWRQaW5uZWRDb2x1bW5zLCAnbGVmdCcpXG4gICAgICA6IGZpbHRlcmVkQ29sdW1ucyAmJiBjb2x1bW5zLnNldENvbHVtbnNQaW5uZWQoZmlsdGVyZWRDb2x1bW5zLCBudWxsKTtcblxuICAgIC8qIE9yZGVyIGNvbHVtbnMgKi9cbiAgICBjb2x1bW5zT3JkZXIgJiYgY29sdW1ucy5tb3ZlQ29sdW1ucyhjb2x1bW5zT3JkZXIsIDApO1xuICB9XG5cbiAgZ2V0U2V0dGluZ3NEaWZmKCk6IFBhcnRpYWw8RGF0b0dyaWRTZXR0aW5ncz4ge1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEN1cnJlbnRHcmlkU2V0dGluZ3MoKTtcbiAgICByZXR1cm4gZGlmZihjdXJyZW50U3RhdGUsIHRoaXMuaW5pdGlhbFNldHRpbmdzKTtcbiAgfVxuXG4gIHJlc2V0VGFibGVTZXR0aW5ncygpIHtcbiAgICBjb25zdCB7IGZpbHRlciwgLi4ucmVzdCB9ID0gdGhpcy5pbml0aWFsU2V0dGluZ3M7XG4gICAgY29uc3QgeyBjb2x1bW5zIH0gPSB0aGlzLmFwaTtcbiAgICBjb25zdCBvcmlnaW5hbENvbFNpemVzID0gZ2V0Q29sdW1uc1NpemVzKGNvbHVtbnMuZ2V0QWxsR3JpZENvbHVtbnMoKSwgdHJ1ZSk7XG4gICAgY29uc3QgZ3JpZEFsaWdubWVudCA9IGlzRW1wdHkob3JpZ2luYWxDb2xTaXplcykgPyByZXN0LmdyaWRBbGlnbm1lbnQgOiBEYXRvR3JpZEFsaWdubWVudC5DVVNUT007XG4gICAgY29uc3QgbmV3U2V0dGluZ3MgPSB7IC4uLnJlc3QsIGNvbHVtbnNTaXplczogb3JpZ2luYWxDb2xTaXplcywgZ3JpZEFsaWdubWVudCB9O1xuICAgIHRoaXMudXBkYXRlU2V0dGluZ3MobmV3U2V0dGluZ3MpO1xuICAgIHRoaXMubG9hZFNhdmVkU2V0dGluZ3MobmV3U2V0dGluZ3MpO1xuICAgIHRoaXMuc2F2ZVNldHRpbmdzVG9TZXJ2ZXIoeyBmaWx0ZXIgfSk7XG4gIH1cblxuICBpbml0U2V0dGluZ3Moc2F2ZWRTZXR0aW5nczogUGFydGlhbDxEYXRvR3JpZFNldHRpbmdzPikge1xuICAgIHRoaXMuaW5pdGlhbFNldHRpbmdzID0gdGhpcy5ncmlkUXVlcnkuZ2V0Q3VycmVudEdyaWRTZXR0aW5ncygpO1xuICAgIHRoaXMudXBkYXRlU2V0dGluZ3Moc2F2ZWRTZXR0aW5ncyk7XG4gICAgdGhpcy5sb2FkU2F2ZWRTZXR0aW5ncyhzYXZlZFNldHRpbmdzKTtcbiAgfVxuXG4gIG5vdGlmeUZpbHRlclVwZGF0ZSgpIHtcbiAgICBjb25zdCB3YXRjaCA9IFt0aGlzLmdyaWRSZWYuZmlsdGVyQ2hhbmdlZC5hc09ic2VydmFibGUoKV07XG4gICAgaWYgKHRoaXMuZ3JpZFF1ZXJ5LmlzU2VydmVyU2lkZSkge1xuICAgICAgd2F0Y2gucHVzaCh0aGlzLmdyaWRRdWVyeS5zZXJ2ZXJEYXRhTG9hZGVkJCk7XG4gICAgICB0aGlzLnNldExvYWRpbmcodHJ1ZSk7XG4gICAgfVxuICAgIGNvbWJpbmVMYXRlc3Qod2F0Y2gpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgdW50aWxEZXN0cm95ZWQodGhpcylcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCByb3dzQWZ0ZXJGaWx0ZXIgPSB0aGlzLmFwaS5ncmlkLmdldERpc3BsYXllZFJvd0NvdW50KCk7XG4gICAgICAgIHRoaXMuc2V0T3ZlcmxheShyb3dzQWZ0ZXJGaWx0ZXIgPT09IDApO1xuICAgICAgfSk7XG4gICAgdGhpcy5hcGkuZ3JpZC5vbkZpbHRlckNoYW5nZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTZXJ2ZXJSZXF1ZXN0RmlsdGVycyhmaWx0ZXI6IERhdG9HcmlkRmlsdGVyc01hcCk6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVycyB7XG4gICAgY29uc3QgY29sdW1uc0ZpbHRlcnM6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVycyA9IHt9O1xuICAgIGZvciAoY29uc3QgW2NvbHVtbiwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGZpbHRlcikpIHtcbiAgICAgIGNvbnN0IHsgYnlWYWx1ZSwgY29uZGl0aW9uYWwgfSA9IHZhbHVlO1xuICAgICAgaWYgKGJ5VmFsdWUpIHtcbiAgICAgICAgY29sdW1uc0ZpbHRlcnNbY29sdW1uXSA9IHtcbiAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5BTkQsXG4gICAgICAgICAgZmlsdGVyczogW2J5VmFsdWVdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoY29uZGl0aW9uYWwpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uYWxGaWx0ZXIgPSB7XG4gICAgICAgICAgb3BlcmF0b3I6IGNvbmRpdGlvbmFsLm9wZXJhdG9yLFxuICAgICAgICAgIGZpbHRlcnM6IGNvbmRpdGlvbmFsLmNvbmRpdGlvbnMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBjb25kaXRpb24sIHZhbHVlIH0gPSBpdGVtO1xuICAgICAgICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuSU5fUkFOR0UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHZhbHVlLFxuICAgICAgICAgICAgICAgIGVuZDogKGl0ZW0gYXMgRGF0b0dyaWRSYW5nZUZpbHRlckNvbmRpdGlvbikucmFuZ2VFbmRcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtIGFzIERhdG9HcmlkRmlsdGVyQ29uZGl0aW9uO1xuICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgICAgIGlmIChieVZhbHVlKSB7XG4gICAgICAgICAgY29sdW1uc0ZpbHRlcnNbY29sdW1uXS5maWx0ZXJzLnB1c2goY29uZGl0aW9uYWxGaWx0ZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbHVtbnNGaWx0ZXJzW2NvbHVtbl0gPSBjb25kaXRpb25hbEZpbHRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb2x1bW5zRmlsdGVycztcbiAgfVxuXG4gIGJ1aWxkU2VydmVyUmVxdWVzdEZpbHRlcnNfdjJfMShncmlkQ29sdW1uczogRGF0b0dyaWRDb2x1bW5EZWZbXSk6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyIHtcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmdyaWRRdWVyeS5nZXRGaWx0ZXIoKTtcbiAgICBjb25zdCBzZWFyY2hUZXJtID0gdGhpcy5ncmlkUXVlcnkuZ2V0U2VhcmNoVGVybSgpO1xuXG4gICAgbGV0IGNvbHVtbkZpbHRlcnMgPSB0aGlzLmJ1aWxkU2VydmVyQ29sdW1uRmlsdGVyc192Ml8xKGZpbHRlcik7XG4gICAgaWYgKGNvbHVtbkZpbHRlcnMuZXZlcnkoKHsgb3BlcmF0b3IgfTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIpID0+IG9wZXJhdG9yID09PSBPcGVyYXRvclR5cGVzLkFORCkpIHtcbiAgICAgIGNvbnN0IGZsYXR0ZW5lZEZpbHRlcnMgPSBjb2x1bW5GaWx0ZXJzXG4gICAgICAgIC5tYXAoKHsgZmlsdGVycyB9OiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcikgPT4gZmlsdGVycylcbiAgICAgICAgLnJlZHVjZSgoYXJyLCByZXMpID0+IHJlcy5jb25jYXQoYXJyKSwgW10pO1xuICAgICAgY29sdW1uRmlsdGVycyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCxcbiAgICAgICAgICBmaWx0ZXJzOiBmbGF0dGVuZWRGaWx0ZXJzXG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtbkZpbHRlcjogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIgPVxuICAgICAgc2l6ZShjb2x1bW5GaWx0ZXJzKSA+IDFcbiAgICAgICAgPyB7IG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCwgZmlsdGVyczogY29sdW1uRmlsdGVycyB9XG4gICAgICAgIDogc2l6ZShjb2x1bW5GaWx0ZXJzKSA9PT0gMVxuICAgICAgICA/IGNvbHVtbkZpbHRlcnNbMF1cbiAgICAgICAgOiBudWxsO1xuICAgIGlmICghc2VhcmNoVGVybSkge1xuICAgICAgcmV0dXJuIGNvbHVtbkZpbHRlcjtcbiAgICB9XG4gICAgY29uc3QgeyBpbmNsdWRlSGlkZGVuQ29sdW1uc0luU2VhcmNoIH0gPSB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpO1xuICAgIGNvbnN0IHNlYXJjaGFibGVDb2x1bW5zID0gZ3JpZENvbHVtbnMuZmlsdGVyKChjb2xEZWY6IERhdG9HcmlkQ29sdW1uRGVmKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb2xEZWYuaW5jbHVkZUluU2VhcmNoICYmIChpbmNsdWRlSGlkZGVuQ29sdW1uc0luU2VhcmNoIHx8IHRoaXMuYXBpLmNvbHVtbnMuZ2V0Q29sdW1uKGNvbERlZi5jb2xJZCkuaXNWaXNpYmxlKCkpXG4gICAgICApO1xuICAgIH0pO1xuICAgIGNvbnN0IHNlYXJjaEZpbHRlcnM6IFNlcnZlclNpZGVQYWdpbmF0aW9uQ29uZGl0aW9uW10gPSBzZWFyY2hhYmxlQ29sdW1ucy5tYXAoKHsgZmllbGQgfTogRGF0b0dyaWRDb2x1bW5EZWYpID0+ICh7XG4gICAgICBjb25kaXRpb246IERhdG9GaWx0ZXJDb25kaXRpb25zLkNPTlRBSU5TLFxuICAgICAgdmFsdWU6IHNlYXJjaFRlcm0sXG4gICAgICBjb2x1bW46IGZpZWxkXG4gICAgfSkpO1xuICAgIGNvbnN0IHNlYXJjaEZpbHRlcjogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIgPVxuICAgICAgc2l6ZShzZWFyY2hGaWx0ZXJzKSA+IDAgPyB7IG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLk9SLCBmaWx0ZXJzOiBzZWFyY2hGaWx0ZXJzIH0gOiBudWxsO1xuICAgIGlmICghY29sdW1uRmlsdGVyKSB7XG4gICAgICByZXR1cm4gc2VhcmNoRmlsdGVyO1xuICAgIH1cbiAgICByZXR1cm4geyBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5BTkQsIGZpbHRlcnM6IFtjb2x1bW5GaWx0ZXIsIHNlYXJjaEZpbHRlcl0gfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTZXJ2ZXJDb2x1bW5GaWx0ZXJzX3YyXzEoZmlsdGVyOiBEYXRvR3JpZEZpbHRlcnNNYXApOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcltdIHtcbiAgICBsZXQgY29sdW1uRmlsdGVyczogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXJbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbY29sdW1uLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmlsdGVyKSkge1xuICAgICAgbGV0IGNvbHVtbkZpbHRlcjogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIgPSBudWxsO1xuICAgICAgY29uc3QgeyBieVZhbHVlLCBjb25kaXRpb25hbCB9ID0gdmFsdWU7XG4gICAgICBpZiAoYnlWYWx1ZSkge1xuICAgICAgICBjb2x1bW5GaWx0ZXIgPSB7XG4gICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuQU5ELFxuICAgICAgICAgIGZpbHRlcnM6IFt7IGNvbHVtbiwgLi4uYnlWYWx1ZSB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGNvbmRpdGlvbmFsKSB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbmFsRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciA9IHRoaXMuZ2V0U2VydmVyQ29uZGl0aW9uYWxGaWx0ZXIoY29uZGl0aW9uYWwsIGNvbHVtbik7XG4gICAgICAgIGlmIChjb2x1bW5GaWx0ZXIpIHtcbiAgICAgICAgICBjb2x1bW5GaWx0ZXIuZmlsdGVycy5wdXNoKGNvbmRpdGlvbmFsRmlsdGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2x1bW5GaWx0ZXIgPSBjb25kaXRpb25hbEZpbHRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29sdW1uRmlsdGVycy5wdXNoKGNvbHVtbkZpbHRlcik7XG4gICAgfVxuICAgIHJldHVybiBjb2x1bW5GaWx0ZXJzO1xuICB9XG5cbiAgZ2V0RmlsdGVyRm9yU2VydmVyQWN0aW9uT25TZWxlY3RBbGwoKTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIge1xuICAgIGNvbnN0IHsgZXhjbHVkZWRGcm9tU2VsZWN0QWxsIH0gPSB0aGlzLmdyaWRRdWVyeS5zZXJ2ZXJTaWRlQ29uZmlnO1xuICAgIGNvbnN0IHsgY29sdW1uRGVmcywgaWRDb2x1bW5LZXkgfSA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCk7XG4gICAgY29uc3QgbWFpbkZpbHRlciA9IHRoaXMuYnVpbGRTZXJ2ZXJSZXF1ZXN0RmlsdGVyc192Ml8xKGNvbHVtbkRlZnMpO1xuICAgIGlmIChpc0VtcHR5KGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCkpIHtcbiAgICAgIHJldHVybiBtYWluRmlsdGVyO1xuICAgIH1cbiAgICBjb25zdCBleGNsdWRlZFJvd3NGaWx0ZXI6IFNlcnZlclNpZGVQYWdpbmF0aW9uTGlzdENvbmRpdGlvbiA9IHtcbiAgICAgIGNvbmRpdGlvbjogRGF0b0ZpbHRlckNvbmRpdGlvbnMuTk9UX0lOX0xJU1QsXG4gICAgICB2YWx1ZXM6IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCxcbiAgICAgIGNvbHVtbjogaWRDb2x1bW5LZXlcbiAgICB9O1xuICAgIGNvbnN0IGZpbHRlcnMgPSBtYWluRmlsdGVyID8gW21haW5GaWx0ZXIsIGV4Y2x1ZGVkUm93c0ZpbHRlcl0gOiBbZXhjbHVkZWRSb3dzRmlsdGVyXTtcbiAgICByZXR1cm4geyBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5BTkQsIGZpbHRlcnMgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VydmVyQ29uZGl0aW9uYWxGaWx0ZXIoXG4gICAgY29uZGl0aW9uYWxGaWx0ZXI6IERhdG9HcmlkQ29uZGl0aW9uYWxGaWx0ZXIsXG4gICAgY29sdW1uOiBzdHJpbmdcbiAgKTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIge1xuICAgIHJldHVybiB7XG4gICAgICBvcGVyYXRvcjogY29uZGl0aW9uYWxGaWx0ZXIub3BlcmF0b3IsXG4gICAgICBmaWx0ZXJzOiBjb25kaXRpb25hbEZpbHRlci5jb25kaXRpb25zLm1hcChpdGVtID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25kaXRpb24sIHZhbHVlIH0gPSBpdGVtO1xuICAgICAgICBpZiAoY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JTl9SQU5HRSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICBzdGFydDogdmFsdWUsXG4gICAgICAgICAgICBlbmQ6IChpdGVtIGFzIERhdG9HcmlkUmFuZ2VGaWx0ZXJDb25kaXRpb24pLnJhbmdlRW5kLFxuICAgICAgICAgICAgY29sdW1uXG4gICAgICAgICAgfSBhcyBTZXJ2ZXJTaWRlUGFnaW5hdGlvblJhbmdlQ29uZGl0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklTX0VNUFRZIHx8IGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuTk9UX0VNUFRZKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbjogRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfRU1QVFksXG4gICAgICAgICAgICB2YWx1ZTogY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JU19FTVBUWSA/ICd0cnVlJyA6ICdmYWxzZScsXG4gICAgICAgICAgICBjb2x1bW5cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklTX05VTEwgfHwgY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5OT1RfTlVMTCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb25kaXRpb246IERhdG9GaWx0ZXJDb25kaXRpb25zLklTX05VTEwsXG4gICAgICAgICAgICB2YWx1ZTogY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JU19OVUxMID8gJ3RydWUnIDogJ2ZhbHNlJyxcbiAgICAgICAgICAgIGNvbHVtblxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSwgY29sdW1uIH0gYXMgU2VydmVyU2lkZVBhZ2luYXRpb25Db25kaXRpb247XG4gICAgICB9KVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2VydmVyUmVxdWVzdFNvcnQoc29ydE1vZGVsOiBEYXRvR3JpZFNvcnRbXSk6IERhdG9HcmlkU2VydmVyU29ydFtdIHtcbiAgICByZXR1cm4gc29ydE1vZGVsLm1hcCgoeyBjb2xJZCwgc29ydCB9KSA9PiAoe1xuICAgICAgY29sdW1uOiBjb2xJZCxcbiAgICAgIHNvcnRPcmRlcjogc29ydC50b1VwcGVyQ2FzZSgpIGFzIERhdG9HcmlkU2VydmVyU29ydERpcmVjdGlvblxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRWRpdGFibGVDZWxsQ2xhc3MoXG4gICAgY2VsbENsYXNzVmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIHwgKChjZWxsQ2xhc3NQYXJhbXM6IENlbGxDbGFzc1BhcmFtcykgPT4gc3RyaW5nIHwgc3RyaW5nW10pXG4gICkge1xuICAgIGlmIChpc05pbChjZWxsQ2xhc3NWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnZGF0by1lZGl0YWJsZS1jZWxsJztcbiAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oY2VsbENsYXNzVmFsdWUpKSB7XG4gICAgICByZXR1cm4gY2VsbENsYXNzUGFyYW1zID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RWRpdGFibGVDbGFzc0FycmF5KGNlbGxDbGFzc1ZhbHVlKGNlbGxDbGFzc1BhcmFtcykpO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0RWRpdGFibGVDbGFzc0FycmF5KGNlbGxDbGFzc1ZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RWRpdGFibGVDbGFzc0FycmF5KGN1cnJlbnRDbGFzczogc3RyaW5nIHwgc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY2VsbENsYXNzID0gY29lcmNlQXJyYXkoY3VycmVudENsYXNzKTtcbiAgICBjZWxsQ2xhc3MucHVzaCgnZGF0by1lZGl0YWJsZS1jZWxsJyk7XG4gICAgcmV0dXJuIGNlbGxDbGFzcztcbiAgfVxuXG4gIHNlbGVjdEFsbEN1cnJlbnRQYWdlUm93cyhpc1NlbGVjdGVkID0gdHJ1ZSwgY29uc2lkZXJFeGNsdWRlZCA9IGZhbHNlKSB7XG4gICAgbGV0IHJvd3NGb3JTZWxlY3Rpb24gPSB0aGlzLmdyaWRRdWVyeS5nZXRDdXJyZW50UGFnZVJvd3MoKTtcbiAgICBpZiAoY29uc2lkZXJFeGNsdWRlZCkge1xuICAgICAgY29uc3QgeyBleGNsdWRlZEZyb21TZWxlY3RBbGwgfSA9IHRoaXMuZ3JpZFF1ZXJ5LnNlcnZlclNpZGVDb25maWc7XG4gICAgICBpZiAoIWlzRW1wdHkoZXhjbHVkZWRGcm9tU2VsZWN0QWxsKSkge1xuICAgICAgICByb3dzRm9yU2VsZWN0aW9uID0gcm93c0ZvclNlbGVjdGlvbi5maWx0ZXIoKHsgaWQgfTogUm93Tm9kZSkgPT4gIWV4Y2x1ZGVkRnJvbVNlbGVjdEFsbC5pbmNsdWRlcyhpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpc1NlbGVjdGVkID8gdGhpcy5zZWxlY3RSb3dzKHJvd3NGb3JTZWxlY3Rpb24pIDogdGhpcy5kZXNlbGVjdFJvd3Mocm93c0ZvclNlbGVjdGlvbik7XG4gIH1cblxuICBkZXNlbGVjdEFsbFJvd3MoKSB7XG4gICAgdGhpcy5hcGkuZ3JpZC5kZXNlbGVjdEFsbCgpO1xuICAgIGlmICh0aGlzLmdyaWRRdWVyeS5pc1NlcnZlclNlbGVjdEFsbFJvd3NFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFNlcnZlclNpZGVQYWdpbmF0aW9uKHsgc2VsZWN0QWxsUm93c0VuYWJsZWQ6IGZhbHNlLCBleGNsdWRlZEZyb21TZWxlY3RBbGw6IFtdIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlc29sdmVSb3dBY3Rpb25zVmlzaWJpbGl0eSgpIHtcbiAgICB0aGlzLmdyaWRRdWVyeS5fcm93QWN0aW9uVmlzaWJpbGl0eUNoYW5nZWQubmV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gcGl2b3RpbmcsXG4gICAqIHdlIGFkZCB0aGUgZmllbGQgbmFtZSB0byB0aGUgY29sdW1uIGhlYWRlciBjbGFzcyBpbiBvcmRlciB0byBhY2Nlc3MgaXQgdGhyb3VnaCB0aGUgYXV0byBnZW5lcmF0ZWQgcGl2b3QgY29sdW1uLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0UGl2b3RTZWNvbmRhcnlDb2xzUHJvY2Vzcyh7IGdyaWRPcHRpb25zIH06IE5vcm1hbGl6ZU9wdGlvbnNQYXJhbXMpIHtcbiAgICAvKiogVXNlIHByb2Nlc3NQaXZvdFJlc3VsdENvbERlZiBmcm9tIHZlciAyOCAqL1xuICAgIGdyaWRPcHRpb25zLnByb2Nlc3NTZWNvbmRhcnlDb2xEZWYgPSBjb2xEZWYgPT4ge1xuICAgICAgY29uc3QgdXNlclByb3ZpZGVkQ29sRGVmID0gY29sRGVmLnBpdm90VmFsdWVDb2x1bW4gJiYgY29sRGVmLnBpdm90VmFsdWVDb2x1bW4uZ2V0VXNlclByb3ZpZGVkQ29sRGVmKCk7XG5cbiAgICAgIGlmICh1c2VyUHJvdmlkZWRDb2xEZWYpIHtcbiAgICAgICAgY29sRGVmLmZpbHRlciA9IHVzZXJQcm92aWRlZENvbERlZi5maWx0ZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb2xEZWYucGl2b3RLZXlzKSB7XG4gICAgICAgIGNvbERlZi5waXZvdEtleXMgPSBjb2xEZWYucGl2b3RLZXlzLm1hcChrZXkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZEtleSA9IHRyeVBhcnNlUGl2b3RWYWx1ZShrZXkpO1xuXG4gICAgICAgICAgcmV0dXJuIChwYXJzZWRLZXkgJiYgcGFyc2VkS2V5LnZhbHVlKSB8fCAnJztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKiBVc2UgcHJvY2Vzc1Bpdm90UmVzdWx0Q29sR3JvdXBEZSBmcm9tIHZlciAyOCAqL1xuICAgIGdyaWRPcHRpb25zLnByb2Nlc3NTZWNvbmRhcnlDb2xHcm91cERlZiA9IChjb2xHcm91cERlZjogQ29sR3JvdXBEZWYpID0+IHtcbiAgICAgIGlmIChjb2xHcm91cERlZi5oZWFkZXJOYW1lKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFZhbHVlID0gdHJ5UGFyc2VQaXZvdFZhbHVlKGNvbEdyb3VwRGVmLmhlYWRlck5hbWUpO1xuXG4gICAgICAgIGlmIChwYXJzZWRWYWx1ZSkge1xuICAgICAgICAgIGNvbnN0IHsgZmllbGQsIHZhbHVlIH0gPSBwYXJzZWRWYWx1ZTtcblxuICAgICAgICAgIGNvbEdyb3VwRGVmLmhlYWRlckNsYXNzID0gW2ZpZWxkXTtcbiAgICAgICAgICBjb2xHcm91cERlZi5oZWFkZXJOYW1lID0gdmFsdWU7XG5cbiAgICAgICAgICBpZiAoY29sR3JvdXBEZWYuY2hpbGRyZW4gJiYgY29sR3JvdXBEZWYuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29sR3JvdXBEZWYuaGVhZGVyQ2xhc3MucHVzaCgnZ3JvdXAtcGl2b3QtY2VsbCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb2xHcm91cERlZi5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBbY29sQ2hpbGRdOiBhbnkgPSBjb2xHcm91cERlZi5jaGlsZHJlbjtcbiAgICAgICAgY29uc3QgcGl2b3RUb3RhbENvbHVtbklkcyA9IGNvbENoaWxkICYmIGNvbENoaWxkLnBpdm90VG90YWxDb2x1bW5JZHM7XG5cbiAgICAgICAgaWYgKHBpdm90VG90YWxDb2x1bW5JZHMgJiYgcGl2b3RUb3RhbENvbHVtbklkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29sR3JvdXBEZWYuaGVhZGVyQ2xhc3MgPSBbJ3RvdGFsLXBpdm90LWNlbGwnXTtcbiAgICAgICAgICBjb2xHcm91cERlZi5oZWFkZXJOYW1lID0gdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKCdjb3JlLnRvdGFsJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbEdyb3VwRGVmLmhlYWRlckNsYXNzID0gWydlbXB0eS1waXZvdC1oZWFkZXInXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbEdyb3VwRGVmLnBpdm90S2V5cykge1xuICAgICAgICBjb2xHcm91cERlZi5waXZvdEtleXMgPSBjb2xHcm91cERlZi5waXZvdEtleXMubWFwKGtleSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkS2V5ID0gdHJ5UGFyc2VQaXZvdFZhbHVlKGtleSk7XG5cbiAgICAgICAgICByZXR1cm4gKHBhcnNlZEtleSAmJiBwYXJzZWRLZXkudmFsdWUpIHx8ICcnO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQaXZvdE1vZGVSb3dzPFQ+KGRhdGE6IFRbXSkge1xuICAgIGNvbnN0IHBpdm90Q29sdW1ucyA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEFsbFBpdm90Q29sdW1ucygpO1xuICAgIGNvbnN0IGNvbnZlcnRlZERhdGEgPSBkYXRhLm1hcCgoY3VycmVudFZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgbWFwcGVkVmFsdWVzID0geyAuLi5jdXJyZW50VmFsdWUgfTtcblxuICAgICAgZm9yIChjb25zdCBjb2wgb2YgcGl2b3RDb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29sLmdldENvbERlZigpLmZpZWxkO1xuICAgICAgICBjb25zdCBwaXZvdFZhbHVlOiBQaXZvdENvbHVtbkRhdGEgPSB7IGZpZWxkLCB2YWx1ZTogY3VycmVudFZhbHVlW2ZpZWxkXSB9O1xuXG4gICAgICAgIG1hcHBlZFZhbHVlc1tmaWVsZF0gPSBKU09OLnN0cmluZ2lmeShwaXZvdFZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hcHBlZFZhbHVlcztcbiAgICB9KTtcblxuICAgIHRoaXMuYXBpLmdyaWQuc2V0Um93RGF0YShjb252ZXJ0ZWREYXRhKTtcbiAgfVxuXG4gIC8qKiBObyBkZWNsYXJlZCBpbnRlcmZhY2UgaW4gY3VycmVudCBncmlkIHZlcnNpb24geWV0LlxuICAgKiAgUmVmZXIgZG9jcyAtIGh0dHBzOi8vd3d3LmFnLWdyaWQuY29tL2FuZ3VsYXItZGF0YS1ncmlkL2NlbGwtc3R5bGVzLyNjZWxsLWNsYXNzLXJ1bGVzICovXG4gIHByaXZhdGUgZ2V0UGl2b3RNb2RlQ2VsbENsYXNzUnVsZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdwcmltYXJ5LTAtYmFja2dyb3VuZC1jb2xvcic6IHRoaXMuaXNMZWFmR3JvdXBFdmVuQ2VsbC5iaW5kKHRoaXMpLFxuICAgICAgJ3ByaW1hcnktMTAwLWJhY2tncm91bmQtY29sb3IgcG9pbnRlciBkYXRvLXNpbXBsZS1ib2xkJzogdGhpcy5pc1Jvd0dyb3VwVmFsdWVkQ2VsbC5iaW5kKHRoaXMpXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgaXNMZWFmR3JvdXBFdmVuQ2VsbChwYXJhbXM6IENlbGxDbGFzc1BhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgbGVhZkdyb3VwLCBjaGlsZEluZGV4LCByb3dHcm91cEluZGV4IH0gPSBwYXJhbXMubm9kZTtcbiAgICBjb25zdCBjb2xJbmRleCA9IHRoaXMuZ2V0Q2VsbENsYXNzUnVsZUNvbEluZGV4KHBhcmFtcyk7XG5cbiAgICByZXR1cm4gcm93R3JvdXBJbmRleCA8PSBjb2xJbmRleCAmJiBsZWFmR3JvdXAgJiYgY2hpbGRJbmRleCAlIDIgPT09IDA7XG4gIH1cblxuICBwcml2YXRlIGlzUm93R3JvdXBWYWx1ZWRDZWxsKHBhcmFtczogQ2VsbENsYXNzUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBsZWFmR3JvdXAsIHJvd0dyb3VwSW5kZXggfSA9IHBhcmFtcy5ub2RlO1xuICAgIGNvbnN0IGNvbEluZGV4ID0gdGhpcy5nZXRDZWxsQ2xhc3NSdWxlQ29sSW5kZXgocGFyYW1zKTtcblxuICAgIHJldHVybiByb3dHcm91cEluZGV4IDw9IGNvbEluZGV4ICYmICFsZWFmR3JvdXA7XG4gIH1cblxuICBwcml2YXRlIGdldENlbGxDbGFzc1J1bGVDb2xJbmRleChwYXJhbXM6IENlbGxDbGFzc1BhcmFtcyk6IG51bWJlciB7XG4gICAgY29uc3QgZ3JpZFF1ZXJ5ID0gcGFyYW1zLmNvbERlZi5oZWFkZXJDb21wb25lbnRQYXJhbXMuZ3JpZFF1ZXJ5O1xuXG4gICAgaWYgKGdyaWRRdWVyeSAmJiBncmlkUXVlcnkuYXBpKSB7XG4gICAgICBjb25zdCB7IGNvbHVtbnMgfSA9IGdyaWRRdWVyeS5hcGkgYXMgRGF0b0dyaWRBcGk7XG4gICAgICBjb25zdCBhbGxEaXNwbGF5ZWRDb2x1bW5zID0gY29sdW1ucy5nZXRBbGxEaXNwbGF5ZWRDb2x1bW5zKCk7XG4gICAgICBjb25zdCBkaXNwbGF5ZWRDb2x1bW4gPSBhbGxEaXNwbGF5ZWRDb2x1bW5zLmZpbmQoY29sID0+IGNvbC5nZXRDb2xJZCgpID09PSBwYXJhbXMuY29sRGVmLmNvbElkKTtcblxuICAgICAgcmV0dXJuIGFsbERpc3BsYXllZENvbHVtbnMuaW5kZXhPZihkaXNwbGF5ZWRDb2x1bW4pO1xuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfVxufVxuIl19
|
|
1168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRhdG9yYW1hL2NvcmUvIiwic291cmNlcyI6WyJsaWIvZ3JpZC12Mi9ncmlkLXN0b3JlL2dyaWQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQXdCLE1BQU0sZUFBZSxDQUFDO0FBZXpFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUNMLG9CQUFvQixFQUtwQixzQkFBc0IsRUFRdkIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBU2xGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBa0IsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBSUwsbUJBQW1CLEVBT25CLHVDQUF1QyxFQUN2QyxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLDJCQUEyQixFQUM1QixNQUFNLHVCQUF1QixDQUFDO0FBRS9CLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFtQyxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXZGLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQy9GLE9BQU8sRUFBRSx3Q0FBd0MsRUFBRSxNQUFNLG1GQUFtRixDQUFDO0FBRzdJO0lBMEJFLHFCQUNVLEtBQWdCLEVBQ2hCLFNBQW9CLEVBQ3BCLFNBQStCLEVBQy9CLFlBQTBCLEVBQzFCLFdBQXdCLEVBQ08sVUFBMEIsRUFDL0IsTUFBdUI7UUFOakQsVUFBSyxHQUFMLEtBQUssQ0FBVztRQUNoQixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGNBQVMsR0FBVCxTQUFTLENBQXNCO1FBQy9CLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ08sZUFBVSxHQUFWLFVBQVUsQ0FBZ0I7UUFDL0IsV0FBTSxHQUFOLE1BQU0sQ0FBaUI7UUEvQjNELGVBQVUsR0FBdUIsb0JBQW9CLENBQUM7UUFVOUMsbUNBQThCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFcEMsNkJBQXdCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUVoQyw4QkFBeUIsR0FBRyx5QkFBeUIsQ0FBQztJQWtCcEUsQ0FBQztJQWhCSixzQkFBSSxpQ0FBUTthQUlaO1lBQ0UsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3pCLENBQUM7YUFORCxVQUFhLFVBQW1CO1lBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQy9CLENBQUM7OztPQUFBO0lBZ0JELGlDQUFXLEdBQVgsY0FBZSxDQUFDO0lBRWhCLDJDQUEyQztJQUMzQyw2QkFBTyxHQUFQLFVBQVEsR0FBZ0IsRUFBRSxPQUFrQjtRQUMxQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUksT0FBTyxDQUFDLFdBQStCLENBQUMsUUFBUSxDQUFDO1FBQ2xFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztZQUMzQixPQUFPLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7U0FDMUQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLDRDQUFzQixHQUE5QixVQUErQixXQUF3QjtRQUNyRCxPQUFPLFdBQVcsQ0FBQyxZQUFZLEtBQUssVUFBVSxDQUFDO0lBQ2pELENBQUM7SUFFRCx1Q0FBaUIsR0FBakIsVUFBa0IsT0FBWSxFQUFFLE9BQWU7UUFBN0Isd0JBQUEsRUFBQSxZQUFZO1FBQUUsd0JBQUEsRUFBQSxlQUFlO1FBQzdDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUMsT0FBTyxHQUFHLE9BQU87WUFDL0MsQ0FBQyxDQUFDLE9BQU87WUFDVCxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELHVDQUFpQixHQUFqQjtRQUNFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQseUNBQW1CLEdBQW5CO1FBQ0UsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7T0FHRztJQUNILHFDQUFlLEdBQWYsVUFBbUIsR0FBc0M7UUFDdkQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsZ0NBQVUsR0FBVixVQUFjLEdBQXNDO1FBQ2xELElBQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQSxPQUFPLElBQUksT0FBQSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBckIsQ0FBcUIsQ0FBQyxDQUFDO1FBQzNFLElBQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNoQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUEsT0FBTyxJQUFJLE9BQUEsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUF0QyxDQUFzQyxDQUFDLENBQUM7UUFDcEUsSUFBSSxRQUFRLEVBQUU7WUFDWixRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVELGtDQUFZLEdBQVosVUFBZ0IsR0FBc0M7UUFDcEQsSUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFBLE9BQU8sSUFBSSxPQUFBLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBcEIsQ0FBb0IsQ0FBQyxDQUFDO1FBQzFFLElBQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNoQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUEsT0FBTyxJQUFJLE9BQUEsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUF2QyxDQUF1QyxDQUFDLENBQUM7UUFDckUsSUFBSSxRQUFRLEVBQUU7WUFDWixRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzdCO0lBQ0gsQ0FBQztJQUVELDZCQUFPLEdBQVAsVUFBVyxJQUFTLEVBQUUsWUFBb0IsRUFBRSxVQUE0QztRQUF4RixpQkFvQkM7UUFwQnFCLDZCQUFBLEVBQUEsb0JBQW9CO1FBQUUsMkJBQUEsRUFBQSxlQUE0QztRQUN0RixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2hELElBQUksS0FBSSxDQUFDLFVBQVUsRUFBRTtnQkFDbkIsS0FBSSxDQUFDLFVBQVUseUJBQ1Ysb0JBQW9CLEdBQ3BCLFVBQVUsQ0FDZCxDQUFDO2dCQUNGLElBQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzFELEtBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNwQztpQkFBTSxJQUFJLEtBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQzNCLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBSSxJQUFJLENBQUMsQ0FBQzthQUNoQztpQkFBTTtnQkFDTCxLQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDaEM7WUFDRCxJQUFJLFlBQVksRUFBRTtnQkFDaEIsS0FBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUMzQjtpQkFBTTtnQkFDTCxtQkFBbUIsRUFBRSxDQUFDO2FBQ3ZCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsbUNBQWEsR0FBYixVQUFjLE9BQWdELEVBQUUsbUJBQTJCLEVBQUUsV0FBbUI7UUFBaEQsb0NBQUEsRUFBQSwyQkFBMkI7UUFBRSw0QkFBQSxFQUFBLG1CQUFtQjtRQUM5RyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsbUNBQW1DLEVBQUUsQ0FBQztRQUNsRSxXQUFXLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7SUFFRCx1Q0FBaUIsR0FBakIsVUFBa0IsZUFBdUIsRUFBRSxXQUFtQjtRQUE1QyxnQ0FBQSxFQUFBLHVCQUF1QjtRQUFFLDRCQUFBLEVBQUEsbUJBQW1CO1FBQzVELGVBQWUsSUFBSSxJQUFJLENBQUMsbUNBQW1DLEVBQUUsQ0FBQztRQUM5RCxXQUFXLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRU8seURBQW1DLEdBQTNDO1FBQ0UsZ0hBQWdIO1FBQ2hILElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxnQkFBZ0IsS0FBSyxDQUFDLEVBQUU7WUFDMUQsSUFBSSxDQUFDLDhCQUE4QixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7U0FDaEY7SUFDSCxDQUFDO0lBRUQsNkJBQU8sR0FBUCxVQUFXLEdBQU0sRUFBRSxLQUFjO1FBQy9CLElBQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFNLElBQUksR0FBdUIsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUN2QjtRQUNELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxnQ0FBVSxHQUFWLFVBQWMsR0FBUTtRQUNwQixJQUFNLElBQUksR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBSUQsb0NBQWMsR0FBZCxVQUFrQixHQUFxQixFQUFFLEdBQVcsRUFBRSxRQUFXO1FBQy9ELElBQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDcEUsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELGdDQUFVLEdBQVYsVUFBVyxHQUF3QjtRQUNqQyxJQUFNLElBQUksR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUMsRUFBUTtnQkFBTixjQUFJO1lBQU8sT0FBQSxJQUFJO1FBQUosQ0FBSSxDQUFDLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsd0NBQWtCLEdBQWxCO1FBQ0UsSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzFELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsZ0NBQVUsR0FBVjtRQUNFLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUVELG1DQUFhLEdBQWIsVUFBYyxPQUFnRCxFQUFFLGNBQXNCO1FBQXRCLCtCQUFBLEVBQUEsc0JBQXNCO1FBQ3BGLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixNQUFNLElBQUksYUFBYSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDakU7UUFDRCxJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDL0QsSUFBTSxhQUFhLEdBQUcsY0FBYyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNoRixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEMsSUFBSSxhQUFhLEVBQUU7WUFDakIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3ZDO0lBQ0gsQ0FBQztJQUVELHNDQUFnQixHQUFoQixVQUFpQixNQUE4QjtRQUEvQyxpQkE4RkM7UUE3RkMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQztRQUM1RCxJQUFNLHFCQUFxQixHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQy9FLE1BQU0sQ0FBQyxXQUFXLENBQUMsa0JBQWtCLHlCQUNoQyxxQkFBcUIsR0FDckIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FDekMsQ0FBQztRQUVGLE1BQU0sQ0FBQyxXQUFXLENBQUMsYUFBYSx5QkFDM0IsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEtBQ25DLHFCQUFxQix1QkFBQSxHQUN0QixDQUFDO1FBQ0YsSUFBSSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxLQUFLLFdBQVcsRUFBRTtZQUMxRCxNQUFNLENBQUMsV0FBVyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQztTQUNqRTtRQUNELElBQUksT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLGdCQUFnQixLQUFLLFdBQVcsRUFBRTtZQUM5RCxNQUFNLENBQUMsV0FBVyxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDO1NBQ3JFO1FBQ0QsSUFBSSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsNEJBQTRCLEtBQUssV0FBVyxFQUFFO1lBQzFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsNEJBQTRCO2dCQUM3QyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLFlBQVksS0FBSyxvQkFBb0IsQ0FBQyxNQUFNLENBQUM7U0FDcEc7UUFDRCxJQUFJLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsS0FBSyxXQUFXLEVBQUU7WUFDbkUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUI7Z0JBQ3RDLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxJQUFJLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDO1NBQy9FO1FBQ0QsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV6Ryx1QkFBdUI7UUFDdkIsTUFBTSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsR0FBRyxjQUFNLE9BQUEsSUFBSSxFQUFKLENBQUksQ0FBQztRQUN4RCxNQUFNLENBQUMsV0FBVyxDQUFDLHNCQUFzQixHQUFHLFVBQUMsR0FBWTtZQUN2RCxPQUFPLENBQ0wsY0FBYyxDQUFDLEVBQUUsR0FBRyxLQUFBLEVBQUUsR0FBRyxFQUFFLEtBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxLQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQ2hILENBQUM7UUFDSixDQUFDLENBQUM7UUFFRix3REFBd0Q7UUFDeEQsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ25ELE1BQU0sQ0FBQyxXQUFXLENBQUMsdUJBQXVCLEdBQUcsR0FBRyxDQUFDO1lBQ2pELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFDOUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzdFLDREQUE0RDtZQUM1RCxJQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDO1lBQ3hELElBQUksU0FBUyxFQUFFO2dCQUNiLE1BQU0sQ0FBQyxXQUFXLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQzthQUMvQztTQUNGO1FBRUQsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUxQyx3QkFBd0I7UUFDeEIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFN0UseUJBQXlCO1FBQ25CLElBQUEsdUJBQStDLEVBQTdDLDhCQUFZLEVBQUUsc0JBQStCLENBQUM7UUFDdEQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEdBQUcsWUFBWSxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU3RSxtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXRELDJDQUEyQztRQUMzQyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFO1lBQ2hDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQyxNQUFNLENBQUMsV0FBVyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7U0FDekM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUU7WUFDeEMsSUFBTSxXQUFTLEdBQUcsRUFBRSxDQUFDO1lBRXJCLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLFdBQVMsQ0FBQztZQUN6QyxNQUFNLENBQUMsV0FBVyxDQUFDLGFBQWEseUJBQzNCLE1BQU0sQ0FBQyxXQUFXLENBQUMsYUFBYSxLQUNuQyxjQUFjLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixFQUFFLEVBQ2pELFdBQVcsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUNoRCxTQUFTLEVBQUUsVUFBQSxNQUFNO29CQUNmLElBQU0sS0FBSyxHQUFRLEVBQUUsVUFBVSxFQUFLLFdBQVMsT0FBSSxFQUFFLENBQUM7b0JBRXBELElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsTUFBTSxFQUFFO3dCQUNyRCxLQUFLLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztxQkFDekI7b0JBRUQsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQyxHQUNGLENBQUM7WUFFRixNQUFNLENBQUMsV0FBVyxDQUFDLGtCQUFrQix5QkFDaEMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsS0FDeEMsY0FBYyxFQUFFLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUNqRCxXQUFXLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FDakQsQ0FBQztTQUNIO1FBRUQsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQzVCLENBQUM7SUFFTyx5Q0FBbUIsR0FBM0IsVUFBNEIsTUFBTTtRQUNoQyxJQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQztRQUNoRSxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFFbkIsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN0QixJQUFBLCtCQUFPLENBQWtDO1lBQ2pELDRDQUE0QztZQUM1QyxJQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUVuRCxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDM0MsU0FBUyxJQUFJLFlBQVksQ0FBQzthQUMzQjtTQUNGO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVPLHNDQUFnQixHQUF4QixVQUF5QixPQUE0QixFQUFFLFdBQW1DO1FBQTFGLGlCQXdCQztRQXhCc0QsNEJBQUEsRUFBQSxrQkFBbUM7UUFDeEYsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUMvQztRQUNELElBQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBQyxHQUFzQjtZQUN4RCxJQUFNLFVBQVUseUJBQ1gsR0FBRyxLQUNOLFVBQVUsRUFBRSxLQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQ3JELENBQUM7WUFDRixtREFBbUQ7WUFDbkQsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFO2dCQUNaLFVBQVUsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsSUFBSSxhQUFhLENBQUMsU0FBUyxDQUFDO2FBQy9EO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUU7Z0JBQ2QsVUFBVSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO2FBQzlCO1lBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUU7Z0JBQzlFLFVBQVUsQ0FBQyxhQUFhLEdBQUcsRUFBRSxRQUFRLEVBQUUsc0JBQXNCLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDN0U7WUFDRCxLQUFJLENBQUMsMkJBQTJCLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvRCxPQUFPLFVBQVUsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxDQUFDLG9DQUFvQyxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRU8saURBQTJCLEdBQW5DLFVBQ0UsV0FBNEIsRUFDNUIsR0FBc0IsRUFDdEIsVUFBNkI7UUFIL0IsaUJBaUNDO1FBNUJDLHNEQUFzRDtRQUN0RCxJQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwRSxJQUFJLE9BQU8sR0FBRyxDQUFDLGVBQWUsS0FBSyxXQUFXLEVBQUU7WUFDOUMsSUFBSSxrQkFBa0IsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLElBQUksRUFBRTtnQkFDL0QsVUFBVSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7YUFDcEM7aUJBQU07Z0JBQ0wsVUFBVSxDQUFDLGVBQWU7b0JBQ3hCLE9BQU8sV0FBVyxDQUFDLGdDQUFnQyxLQUFLLFdBQVc7d0JBQ2pFLENBQUMsQ0FBQyxXQUFXLENBQUMsZ0NBQWdDO3dCQUM5QyxDQUFDLENBQUMsa0JBQWtCLENBQUMsZ0NBQWdDLENBQUM7YUFDM0Q7U0FDRjtRQUNELElBQ0UsVUFBVSxDQUFDLGVBQWU7WUFDMUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUM7WUFDOUMsV0FBVyxDQUFDLHFCQUFxQixFQUNqQztZQUNBLFVBQVUsQ0FBQyxZQUFZLEdBQUcsVUFBQyxNQUEyQjtnQkFDcEQsSUFBTSxTQUFTLEdBQUcsbUJBQW1CLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbEUsSUFBTSxVQUFVLEdBQ2QsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2hFLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFNUQsT0FBTyxVQUFVO29CQUNmLENBQUMsQ0FBQyx1Q0FBdUMsQ0FBQyxNQUFNLEVBQUUsS0FBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxTQUFTLENBQUM7b0JBQzVGLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLEVBQUUsS0FBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNyRixDQUFDLENBQUM7U0FDSDtJQUNILENBQUM7SUFFTyxxQ0FBZSxHQUF2QixVQUF3QixNQUF5QixFQUFFLFdBQTRCO1FBQzdFLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRTtZQUN2QixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQWMsQ0FBQztRQUNuQyxJQUFNLHlCQUF5QixHQUFHLFVBQUMsT0FBaUM7WUFDbEUsT0FBQSxPQUFPLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVk7UUFBOUYsQ0FBOEYsQ0FBQztRQUVqRyxPQUFPLHlCQUF5QixDQUFDLFdBQVcsQ0FBQyxJQUFJLHlCQUF5QixDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVPLDBEQUFvQyxHQUE1QyxVQUNFLFVBQStCLEVBQy9CLFdBQTRCO1FBRTVCLElBQU0sNEJBQTRCLEdBQUcsV0FBVyxJQUFJLFdBQVcsQ0FBQyw0QkFBNEIsQ0FBQztRQUM3RixJQUFNLFlBQVksR0FDaEIsV0FBVyxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQztRQUV2RyxJQUFJLDRCQUE0QixJQUFJLFlBQVksS0FBSyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUU7WUFDbEYsSUFBTSxnQkFBZ0IsR0FBc0I7Z0JBQzFDLEtBQUssRUFBRSxJQUFJLENBQUMseUJBQXlCO2dCQUNyQyxpQkFBaUIsRUFBRSxJQUFJO2dCQUN2Qix3QkFBd0IsRUFBRSx3Q0FBd0M7Z0JBQ2xFLEtBQUssRUFBRSxFQUFFO2dCQUNULFFBQVEsRUFBRSxFQUFFO2dCQUNaLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLFNBQVMsRUFBRSx5QkFBeUI7Z0JBQ3BDLFdBQVcsRUFBRSxnQ0FBZ0M7Z0JBQzdDLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixNQUFNLEVBQUUsTUFBTTtnQkFDZCxZQUFZLEVBQUUsSUFBSTtnQkFDbEIsZUFBZSxFQUFFLEtBQUs7YUFDdkIsQ0FBQztZQUNGLGlCQUFRLGdCQUFnQixHQUFLLFVBQVUsRUFBRTtTQUMxQztRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFTyw4REFBd0MsR0FBaEQsVUFBaUQsRUFBdUM7UUFBeEYsaUJBdUJDO1lBdkJrRCw0QkFBVztRQUM1RCxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQzdDLE9BQU87U0FDUjtRQUNELElBQU0scUJBQXFCLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUN4RCxXQUFXLENBQUMsYUFBYSxHQUFHLFVBQUMsR0FBcUI7WUFDaEQsSUFBSSxLQUFJLENBQUMsU0FBUyxDQUFDLDRCQUE0QixFQUFFO2dCQUMvQyxJQUFNLE1BQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO2dCQUN0QixJQUFNLFVBQVUsR0FBRyxNQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzdCLElBQUEsOEVBQXFCLENBQXFDO2dCQUNsRSxJQUFNLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsTUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLFVBQVUsSUFBSSxVQUFVLEVBQUU7b0JBQzVCLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQzt3QkFDM0IscUJBQXFCLEVBQUUscUJBQXFCLENBQUMsTUFBTSxDQUFDLFVBQUMsTUFBYyxJQUFLLE9BQUEsTUFBTSxLQUFLLE1BQUksQ0FBQyxFQUFFLEVBQWxCLENBQWtCLENBQUM7cUJBQzVGLENBQUMsQ0FBQztpQkFDSjtxQkFBTSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUNyQyxLQUFJLENBQUMsdUJBQXVCLENBQUMsRUFBRSxxQkFBcUIsV0FBTSxxQkFBcUIsR0FBRSxNQUFJLENBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUM5RjthQUNGO1lBQ0QsSUFBSSxxQkFBcUIsRUFBRTtnQkFDekIscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDNUI7UUFDSCxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sc0NBQWdCLEdBQXhCLFVBQXlCLEdBQVk7O1FBQ25DLElBQU0sVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMvRSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN2QixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyw0QkFBNEI7WUFDMUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFO1lBQ2hDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLENBQUM7O1lBQzVDLEtBQWtCLElBQUEsWUFBQSxTQUFBLE9BQU8sQ0FBQSxnQ0FBQSxxREFBRTtnQkFBdEIsSUFBTSxHQUFHLG9CQUFBO2dCQUNaLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQXNCLENBQUM7Z0JBQy9FLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFO29CQUMzQixTQUFTO2lCQUNWO2dCQUNELElBQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDOUYsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFO29CQUNqQyxPQUFPLElBQUksQ0FBQztpQkFDYjthQUNGOzs7Ozs7Ozs7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILG9DQUFjLEdBQWQ7UUFDRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCxxQ0FBZSxHQUFmLFVBQWdCLEtBQWE7UUFDM0IsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDL0IsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxVQUFDLEVBQVU7b0JBQVIsa0JBQU07Z0JBQU8sT0FBQSxNQUFNLEtBQUssS0FBSztZQUFoQixDQUFnQixDQUFDLENBQUM7WUFDcEYsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxVQUFDLEVBQVU7b0JBQVIsa0JBQU07Z0JBQU8sT0FBQSxDQUFDLE1BQU07WUFBUCxDQUFPLENBQUMsQ0FBQztZQUN6RSxJQUFJLFFBQVEsSUFBSSxNQUFNLEVBQUU7Z0JBQ2hCLElBQUE7OztpQkFHTCxFQUhPLHNCQUFRLEVBQUUsOEJBR2pCLENBQUM7Z0JBQ0YsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLElBQUksUUFBUSxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsWUFBWSxJQUFJLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQzthQUMvRjtTQUNGO1FBRUQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQscUNBQWUsR0FBZjtRQUNFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsS0FBSztZQUNyQixPQUFPO2dCQUNMLFFBQVEsd0JBQ0gsS0FBSyxDQUFDLFFBQVEsS0FDakIsTUFBTSxFQUFFLEVBQUUsRUFDVixVQUFVLEVBQUUsSUFBSSxHQUNqQjthQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCx1Q0FBaUIsR0FBakIsVUFBa0IsV0FBbUI7UUFDbkMsSUFBOEMsK0JBQTBCLEVBQWhFLGdCQUFhLEVBQWIsZ0JBQXNCLEVBQUUsNERBQXdDLENBQUM7UUFDekUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxLQUFLO1lBQ3JCLE9BQU87Z0JBQ0wsUUFBUSx3QkFDSCxLQUFLLENBQUMsUUFBUSxLQUNqQixNQUFNLFFBQUEsR0FDUDthQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxxQ0FBZSxHQUFmLFVBQWdCLE1BQWMsRUFBRSxNQUFzQixFQUFFLFVBQWlCO1FBQWpCLDJCQUFBLEVBQUEsaUJBQWlCO1FBQ3ZFLElBQUksQ0FBQyxTQUFTLHFEQUFxQztZQUNqRCxNQUFNLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUN6QixlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDbEYsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDekMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFbEMsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUMzQjtJQUNILENBQUM7SUFFRCxvQ0FBYyxHQUFkLFVBQWUsT0FBaUM7O1FBQzlDLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEVBQUU7WUFDdkIsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDOztnQkFFdkIsS0FBZ0MsSUFBQSxZQUFBLFNBQUEsT0FBTyxDQUFBLGdDQUFBLHFEQUFFO29CQUE5QixJQUFBLHNCQUFpQixFQUFmLGtCQUFNLEVBQUUsZ0JBQUs7b0JBQ3hCLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUM7aUJBQy9COzs7Ozs7Ozs7WUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRUQscUNBQWUsR0FBZixVQUFnQixLQUFLLEVBQUUsSUFBSTtRQUN6QixJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssT0FBQSxFQUFFLElBQUksTUFBQSxFQUFFLENBQUMsQ0FBQztRQUUxRCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxpQ0FBVyxHQUFYLFVBQVksUUFBc0I7UUFDaEMsSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUM1RCxJQUFBLHdCQUFLLEVBQUUsb0JBQUksRUFBRSw4QkFBUyxDQUFjO1lBQzVDLElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFFekQsSUFBSSxXQUFXLEVBQUU7Z0JBQ2YsSUFBSSxXQUFXLEdBQUcsUUFBUSxDQUFDO2dCQUMzQix3QkFBd0I7Z0JBQ3hCLElBQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBQyxHQUFXO29CQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLFlBQVksSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxPQUFLLENBQUM7Z0JBQ3BFLENBQUMsQ0FBQyxDQUFDO2dCQUVILElBQUksVUFBVSxFQUFFO29CQUNkLFdBQVcsR0FBRyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxNQUFBLEVBQUUsQ0FBQztpQkFDdEQ7cUJBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRTtvQkFDNUIsSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3hELElBQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBQyxHQUFXLElBQUssT0FBQSxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssT0FBSyxFQUF4QixDQUF3QixDQUFDLENBQUM7b0JBQ2pGLElBQU0sWUFBWSxHQUFHLE9BQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBRS9DLElBQUksWUFBWSxJQUFJLFdBQVcsRUFBRTt3QkFDL0Isa0RBQWtEO3dCQUNsRCxJQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7d0JBRTdDLFdBQVcsR0FBRyxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxNQUFBLEVBQUUsU0FBUyxXQUFBLEVBQUUsQ0FBQztxQkFDcEU7aUJBQ0Y7Z0JBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUUxQyxJQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBK0IsQ0FBQyxpQkFBaUIsRUFBRTtvQkFDbkUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7aUJBQzVCO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFTyxrQ0FBWSxHQUFwQixVQUFxQixNQUFjLEVBQUUsTUFBc0I7UUFDekQsSUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsS0FBSzs7WUFDckIsT0FBTztnQkFDTCxRQUFRLHdCQUNILEtBQUssQ0FBQyxRQUFRLEtBQ2pCLE1BQU0sd0JBQ0QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLGdCQUN2QixRQUFRLElBQUcsTUFBTSxTQUVyQjthQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxtQ0FBYSxHQUFiLFVBQWMsVUFBa0I7UUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxLQUFLO1lBQ3JCLE9BQU87Z0JBQ0wsUUFBUSx3QkFDSCxLQUFLLENBQUMsUUFBUSxLQUNqQixVQUFVLFlBQUEsR0FDWDthQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCw2Q0FBdUIsR0FBdkIsVUFBd0IsTUFBMkM7UUFDakUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxLQUFLO1lBQ3JCLE9BQU87Z0JBQ0wsb0JBQW9CLHdCQUNmLEtBQUssQ0FBQyxvQkFBb0IsR0FDMUIsTUFBTSxDQUNWO2FBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdDQUFVLEdBQVYsVUFBVyxJQUFhO1FBQ3RCLElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUNwQzthQUFNO1lBQ0wsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDN0Y7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsK0JBQVMsR0FBVCxVQUFVLElBQWE7UUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsZ0NBQVUsR0FBVixVQUFXLElBQWE7UUFDdEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBRUQsb0NBQWMsR0FBZCxVQUFlLFFBQW1DO1FBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsS0FBSztZQUNyQixPQUFPO2dCQUNMLFFBQVEsd0JBQ0gsS0FBSyxDQUFDLFFBQVEsR0FDZCxRQUFRLENBQ1o7YUFDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsNkJBQU8sR0FBUCxVQUFRLEVBQTJCO1FBQ2pDLEVBQUUsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDOUYsSUFBTSxhQUFhLEdBQUcsRUFBRSxLQUFLLFdBQVcsQ0FBQyxDQUFDLDBCQUFvQyxDQUFDLHVCQUFpQyxDQUFDO1FBQ2pILElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxhQUFhLGVBQUEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsMENBQW9CLEdBQXBCLFVBQXFCLFFBQW1DO1FBQ3RELElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7UUFDbEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsK0JBQVMsR0FBVCxVQUFVLFNBQXlCLEVBQUUsZUFBOEI7UUFDakUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxhQUFJLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFLLGVBQWUsRUFBRyxDQUFDO0lBQ2hGLENBQUM7SUFFTyx5Q0FBbUIsR0FBM0IsVUFBNEIsRUFBc0U7UUFBbEcsaUJBaUJDO1lBakI2Qix3QkFBUyxFQUFFLDBCQUFVLEVBQUUsZ0RBQXFCO1FBQ3hFLE9BQU8sVUFBQyxhQUFvQixFQUFFLFNBQWlCO1lBQzdDLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLFNBQVMsV0FBQSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzdELFNBQVMsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDcEMsS0FBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7Z0JBQ3BDLEdBQUcsRUFBRSxLQUFJLENBQUMsR0FBRyxDQUFDLElBQUk7Z0JBQ2xCLFNBQVMsRUFBRSxLQUFJLENBQUMsR0FBRyxDQUFDLE9BQU87Z0JBQzNCLElBQUksRUFBRSxrQkFBa0I7Z0JBQ3hCLGNBQWMsRUFBRSxVQUFVO2FBQzNCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxxQkFBcUIsRUFBRTtnQkFDMUIsS0FBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkIsK0NBQStDO2dCQUMvQyxtQkFBbUIsRUFBRSxDQUFDO2FBQ3ZCO1lBQ0QsS0FBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7UUFDakMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVPLGlDQUFXLEdBQW5CLFVBQW9CLE9BQXdCLEVBQUUsT0FBaUQ7UUFBL0YsaUJBMkNDO1FBMUNDLElBQU0sU0FBUyxHQUFHLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUN4RCxPQUFPLFVBQUMsYUFBNkI7WUFDM0IsSUFBQSxpQ0FBUSxFQUFFLDZCQUFNLEVBQUUsbUNBQVMsRUFBRSwrQ0FBZSxDQUFtQjtZQUN2RSxJQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsa0JBQWtCLElBQUksR0FBRyxDQUFDO1lBQ25ELElBQU0sNkJBQTZCLEdBQUcsS0FBSSxDQUFDLDhCQUE4QixHQUFHLENBQUMsQ0FBQztZQUM5RSxJQUFNLHFCQUFxQixHQUFHLDZCQUE2QixJQUFJLFFBQVEsS0FBSyxDQUFDLENBQUM7WUFFOUUsSUFBTSxVQUFVLEdBQUcsNkJBQTZCO2dCQUM5QyxDQUFDLENBQUMsS0FBSSxDQUFDLDhCQUE4QixHQUFHLENBQUM7Z0JBQ3pDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQztZQUVqQyxLQUFJLENBQUMsOEJBQThCLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFekMsSUFBTSxNQUFNLEdBQUcsS0FBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxQyxJQUFNLFNBQVMseUJBQ1YsYUFBYSxLQUNoQixZQUFZLEVBQUU7b0JBQ1osS0FBSSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ2pELEtBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3hCLENBQUMsRUFDRCxlQUFlLEVBQUUsS0FBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsVUFBVSxZQUFBLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxxQkFBcUIsdUJBQUEsRUFBRSxDQUFDLEVBQzVHLFlBQVksRUFBRTtvQkFDWixRQUFRLFVBQUE7b0JBQ1IsVUFBVSxZQUFBO29CQUNWLGFBQWEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDO29CQUNwRyxNQUFNLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtvQkFDM0YsSUFBSSxFQUFFLEtBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUM7aUJBQzdDLEdBQ0YsQ0FBQztZQUNGLElBQUkscUJBQXFCLEVBQUU7Z0JBQ3pCLG1HQUFtRztnQkFDbkcsMEhBQTBIO2dCQUMxSCxpRkFBaUY7Z0JBQ2pGLHlGQUF5RjtnQkFDekYsSUFBTSxXQUFXLEdBQUcsVUFBQyxFQUEwQzt3QkFBeEMsb0NBQWU7b0JBQ3BDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsS0FBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMxQyxDQUFDLENBQUM7Z0JBQ0YsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3hCO2lCQUFNO2dCQUNMLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUN0QjtRQUNILENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTyxrREFBNEIsR0FBcEMsVUFBcUMsTUFBOEI7UUFBbkUsaUJBa0JDO1FBakJDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFBLE1BQU07WUFDMUMsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO2dCQUNuQixJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBQy9CLElBQU0sa0JBQWdCLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztvQkFDMUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxVQUFDLGVBQWdDO3dCQUNsRCxJQUFNLFVBQVUsR0FBSSxNQUFNLENBQUMsUUFBcUIsQ0FBQyxlQUFzQixDQUFDLENBQUM7d0JBQ3pFLElBQUksVUFBVSxFQUFFOzRCQUNkLElBQU0sY0FBYyxHQUFHLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBZ0IsQ0FBQyxDQUFDOzRCQUNuRSxPQUFPLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7eUJBQ3RGO3dCQUNELE9BQU8sVUFBVSxDQUFDLGtCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBZ0IsQ0FBQztvQkFDN0YsQ0FBQyxDQUFDO2lCQUNIO3FCQUFNO29CQUNMLE1BQU0sQ0FBQyxTQUFTLEdBQUcsS0FBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDaEU7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLDRDQUFzQixHQUE5QixVQUErQixNQUE4QjtRQUE3RCxpQkFvREM7UUFuRFMsSUFBQSx3REFBaUIsQ0FBd0I7UUFDakQsSUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUM1RyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkMsSUFBTSxVQUFVLEdBQWM7WUFDNUIsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDO1lBQ2pELElBQUksRUFBRSxNQUFNO1lBQ1osR0FBRyxFQUFFLFdBQVc7U0FDakIsQ0FBQztRQUNGLE9BQU8sVUFBQyxFQUFvRDtnQkFBbEQsY0FBSSxFQUFFLGtCQUFNLEVBQUUsb0JBQU87WUFDN0IsSUFBTSxpQkFBaUIsR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztZQUM1RixJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUNyQixJQUFJLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNsQixJQUFJLGlCQUFpQixFQUFFO2dCQUNyQixLQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQ2pFO2lCQUFNO2dCQUNMLFVBQVUsQ0FBQyxPQUFPLEdBQUcsVUFBQyxFQUFLO3dCQUFMLGtCQUFLLEVBQUosV0FBRztvQkFDeEIsSUFBTSxRQUFRLEdBQUcsS0FBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDaEUsSUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQztvQkFDcEQsSUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztvQkFDekQsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN6QixDQUFDLENBQUM7Z0JBQ0YsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUU7b0JBQ3JCLFFBQVEsR0FBRyxLQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFFLENBQUM7b0JBQ2hELFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQzVCO2FBQ0Y7WUFDRCxJQUFNLGNBQWMsR0FBRyxpQkFBaUIsQ0FDdEMsVUFBVSxFQUNWLFNBQVMsRUFDVCxRQUFRLEVBQ1IsS0FBSSxDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsQ0FDNUMsQ0FBQyxNQUFNLENBQUMsVUFBQyxFQUFXO29CQUFULG9CQUFPO2dCQUFPLE9BQUEsT0FBTztZQUFQLENBQU8sQ0FBQyxDQUFDO1lBQ25DLElBQUksY0FBYyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEMsSUFBSSxpQkFBaUIsRUFBRTtnQkFDckIsY0FBYyxHQUFHLGNBQWMsQ0FBQzthQUNqQztpQkFBTSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNwQyxjQUFjLG1DQUFTLFVBQVUsS0FBRSxTQUFTLEVBQUUsSUFBSSxNQUFPLGNBQWMsQ0FBQyxDQUFDO2FBQzFFO1lBQ0QsSUFBTSxlQUFlLEdBQTBCO2dCQUM3QyxjQUFjLGdCQUFBO2dCQUNkLFlBQVksRUFBRSxRQUFRO2dCQUN0QixZQUFZLEVBQUUsS0FBSSxDQUFDLFdBQVc7Z0JBQzlCLElBQUksTUFBQTtnQkFDSixNQUFNLEVBQUU7b0JBQ04sR0FBRyxFQUFFLEtBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQztvQkFDOUIsV0FBVyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWM7aUJBQzdEO2FBQ0YsQ0FBQztZQUNGLE9BQU8sNEJBQTRCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVPLDJDQUFxQixHQUE3QixVQUE4QixVQUF1QjtRQUFyRCxpQkFPQztRQU5DLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBQSxNQUFNO1lBQ3ZCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtnQkFDbEIsS0FBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM1QztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHVDQUFpQixHQUFqQixVQUFrQixRQUFtQztRQUFyRCxpQkFrRUM7UUFoRUcsSUFBQSxvQkFBSSxFQUNKLHNDQUFhLEVBQ2Isd0JBQU0sRUFDTix3Q0FBYyxFQUNkLG9DQUFZLEVBQ1osc0NBQWEsRUFDYixvQ0FBWSxFQUNaLHNDQUFhLENBQ0Y7UUFDUCxJQUFBLGFBQTRCLEVBQTFCLGNBQUksRUFBRSxvQkFBb0IsQ0FBQztRQUNuQyxrQkFBa0I7UUFDbEIsc0VBQXNFO1FBQ3RFLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuRSxJQUFNLFlBQVksR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQztRQUNoRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRS9DLG1CQUFtQjtRQUNuQixJQUFJLE1BQU0sRUFBRTtZQUNWLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN4QjtRQUVELG1CQUFtQjtRQUNuQixJQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3ZELElBQUksYUFBYSxDQUFDO1FBQ2xCLElBQUksY0FBYyxFQUFFO1lBQ2xCLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQXhDLENBQXdDLENBQUMsQ0FBQztZQUMxRixPQUFPLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDM0MsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNsRDtRQUNELE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3QyxPQUFPLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRS9DLGdCQUFnQjtRQUNoQixJQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7UUFDbkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhELGdCQUFnQjtRQUNoQixJQUFJLGFBQWEsbUJBQTZCLEVBQUU7WUFDOUMsc0JBQXNCO1lBQ3RCLFlBQVk7Z0JBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxLQUFLO29CQUNyQyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsMkJBQXFDLEVBQUU7d0JBQzVELE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQy9CO3lCQUFNO3dCQUNMLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO3FCQUNwRDtnQkFDSCxDQUFDLENBQUMsQ0FBQztTQUNOO2FBQU07WUFDTCxhQUFhLDJCQUFxQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDN0c7UUFFRCxzQkFBc0I7UUFDdEIsSUFBTSxxQkFBcUIsR0FBRyxhQUFhO1lBQ3pDLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQUMsR0FBVyxJQUFLLE9BQUEsR0FBRyxLQUFLLEtBQUksQ0FBQyx5QkFBeUIsRUFBdEMsQ0FBc0MsQ0FBQztZQUMvRSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ1QsSUFBTSxlQUFlLEdBQUcsWUFBWTtZQUNsQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFDLEdBQVcsSUFBSyxPQUFBLEdBQUcsS0FBSyxLQUFJLENBQUMseUJBQXlCLEVBQXRDLENBQXNDLENBQUM7WUFDOUUsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNULElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUM7WUFDN0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUM7WUFDekQsQ0FBQyxDQUFDLGVBQWUsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXZFLG1CQUFtQjtRQUNuQixZQUFZLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELHFDQUFlLEdBQWY7UUFDRSxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDN0QsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsd0NBQWtCLEdBQWxCO1FBQ0UsSUFBTSx5QkFBMEMsRUFBeEMsa0JBQU0sRUFBRSw2QkFBZ0MsQ0FBQztRQUN6QyxJQUFBLDBCQUFPLENBQWM7UUFDN0IsSUFBTSxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUUsSUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxlQUF5QixDQUFDO1FBQ2hHLElBQU0sV0FBVyx5QkFBUSxJQUFJLEtBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGFBQWEsZUFBQSxHQUFFLENBQUM7UUFDL0UsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsTUFBTSxRQUFBLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxrQ0FBWSxHQUFaLFVBQWEsYUFBd0M7UUFDbkQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDL0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELHdDQUFrQixHQUFsQjtRQUFBLGlCQWdCQztRQWZDLElBQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUMxRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFO1lBQy9CLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkI7UUFDRCxhQUFhLENBQUMsS0FBSyxDQUFDO2FBQ2pCLElBQUksQ0FDSCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUNyQjthQUNBLFNBQVMsQ0FBQztZQUNULElBQU0sZUFBZSxHQUFHLEtBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDN0QsS0FBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7UUFDTCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRU8sK0NBQXlCLEdBQWpDLFVBQWtDLE1BQTBCOztRQUMxRCxJQUFNLGNBQWMsR0FBZ0MsRUFBRSxDQUFDOztZQUN2RCxLQUE4QixJQUFBLEtBQUEsU0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBLGdCQUFBLDRCQUFFO2dCQUEzQyxJQUFBLHdCQUFlLEVBQWQsY0FBTSxFQUFFLGFBQUs7Z0JBQ2YsSUFBQSx1QkFBTyxFQUFFLCtCQUFXLENBQVc7Z0JBQ3ZDLElBQUksT0FBTyxFQUFFO29CQUNYLGNBQWMsQ0FBQyxNQUFNLENBQUMsR0FBRzt3QkFDdkIsUUFBUSxFQUFFLGFBQWEsQ0FBQyxHQUFHO3dCQUMzQixPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7cUJBQ25CLENBQUM7aUJBQ0g7Z0JBQ0QsSUFBSSxXQUFXLEVBQUU7b0JBQ2YsSUFBTSxpQkFBaUIsR0FBRzt3QkFDeEIsUUFBUSxFQUFFLFdBQVcsQ0FBQyxRQUFRO3dCQUM5QixPQUFPLEVBQUUsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBQSxJQUFJOzRCQUM5QixJQUFBLDBCQUFTLEVBQUUsa0JBQUssQ0FBVTs0QkFDbEMsSUFBSSxTQUFTLEtBQUssb0JBQW9CLENBQUMsUUFBUSxFQUFFO2dDQUMvQyxPQUFPO29DQUNMLFNBQVMsV0FBQTtvQ0FDVCxLQUFLLEVBQUUsS0FBSztvQ0FDWixHQUFHLEVBQUcsSUFBcUMsQ0FBQyxRQUFRO2lDQUNyRCxDQUFDOzZCQUNIOzRCQUNELE9BQU8sSUFBK0IsQ0FBQzt3QkFDekMsQ0FBQyxDQUFDO3FCQUNILENBQUM7b0JBQ0YsSUFBSSxPQUFPLEVBQUU7d0JBQ1gsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztxQkFDeEQ7eUJBQU07d0JBQ0wsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLGlCQUFpQixDQUFDO3FCQUM1QztpQkFDRjthQUNGOzs7Ozs7Ozs7UUFFRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQsb0RBQThCLEdBQTlCLFVBQStCLFdBQWdDO1FBQS9ELGlCQTBDQztRQXpDQyxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzFDLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFbEQsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9ELElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxVQUFDLEVBQXdDO2dCQUF0QyxzQkFBUTtZQUFtQyxPQUFBLFFBQVEsS0FBSyxhQUFhLENBQUMsR0FBRztRQUE5QixDQUE4QixDQUFDLEVBQUU7WUFDckcsSUFBTSxnQkFBZ0IsR0FBRyxhQUFhO2lCQUNuQyxHQUFHLENBQUMsVUFBQyxFQUF1QztvQkFBckMsb0JBQU87Z0JBQW1DLE9BQUEsT0FBTztZQUFQLENBQU8sQ0FBQztpQkFDekQsTUFBTSxDQUFDLFVBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSyxPQUFBLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQWYsQ0FBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLGFBQWEsR0FBRztnQkFDZDtvQkFDRSxRQUFRLEVBQUUsYUFBYSxDQUFDLEdBQUc7b0JBQzNCLE9BQU8sRUFBRSxnQkFBZ0I7aUJBQzFCO2FBQ0YsQ0FBQztTQUNIO1FBQ0QsSUFBTSxZQUFZLEdBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUU7WUFDekQsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO2dCQUMzQixDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNYLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixPQUFPLFlBQVksQ0FBQztTQUNyQjtRQUNPLElBQUEsMkZBQTRCLENBQXFDO1FBQ3pFLElBQU0saUJBQWlCLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFDLE1BQXlCO1lBQ3JFLE9BQU8sQ0FDTCxNQUFNLENBQUMsZUFBZSxJQUFJLENBQUMsNEJBQTRCLElBQUksS0FBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUNqSCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFNLGFBQWEsR0FBb0MsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQUMsRUFBNEI7Z0JBQTFCLGdCQUFLO1lBQTBCLE9BQUEsQ0FBQztnQkFDOUcsU0FBUyxFQUFFLG9CQUFvQixDQUFDLFFBQVE7Z0JBQ3hDLEtBQUssRUFBRSxVQUFVO2dCQUNqQixNQUFNLEVBQUUsS0FBSzthQUNkLENBQUM7UUFKNkcsQ0FJN0csQ0FBQyxDQUFDO1FBQ0osSUFBTSxZQUFZLEdBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDMUYsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixPQUFPLFlBQVksQ0FBQztTQUNyQjtRQUNELE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQztJQUNoRixDQUFDO0lBRU8sbURBQTZCLEdBQXJDLFVBQXNDLE1BQTBCOztRQUM5RCxJQUFJLGFBQWEsR0FBaUMsRUFBRSxDQUFDOztZQUVyRCxLQUE4QixJQUFBLEtBQUEsU0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBLGdCQUFBLDRCQUFFO2dCQUEzQyxJQUFBLHdCQUFlLEVBQWQsY0FBTSxFQUFFLGFBQUs7Z0JBQ3ZCLElBQUksWUFBWSxHQUErQixJQUFJLENBQUM7Z0JBQzVDLElBQUEsdUJBQU8sRUFBRSwrQkFBVyxDQUFXO2dCQUN2QyxJQUFJLE9BQU8sRUFBRTtvQkFDWCxZQUFZLEdBQUc7d0JBQ2IsUUFBUSxFQUFFLGFBQWEsQ0FBQyxHQUFHO3dCQUMzQixPQUFPLEVBQUUsWUFBRyxNQUFNLFFBQUEsSUFBSyxPQUFPLEVBQUc7cUJBQ2xDLENBQUM7aUJBQ0g7Z0JBQ0QsSUFBSSxXQUFXLEVBQUU7b0JBQ2YsSUFBTSxpQkFBaUIsR0FBK0IsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDM0csSUFBSSxZQUFZLEVBQUU7d0JBQ2hCLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7cUJBQzlDO3lCQUFNO3dCQUNMLFlBQVksR0FBRyxpQkFBaUIsQ0FBQztxQkFDbEM7aUJBQ0Y7Z0JBQ0QsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNsQzs7Ozs7Ozs7O1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVELHlEQUFtQyxHQUFuQztRQUNVLElBQUEsNkVBQXFCLENBQXFDO1FBQzVELElBQUEsb0NBQTZELEVBQTNELDBCQUFVLEVBQUUsNEJBQStDLENBQUM7UUFDcEUsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25FLElBQUksT0FBTyxDQUFDLHFCQUFxQixDQUFDLEVBQUU7WUFDbEMsT0FBTyxVQUFVLENBQUM7U0FDbkI7UUFDRCxJQUFNLGtCQUFrQixHQUFzQztZQUM1RCxTQUFTLEVBQUUsb0JBQW9CLENBQUMsV0FBVztZQUMzQyxNQUFNLEVBQUUscUJBQXFCO1lBQzdCLE1BQU0sRUFBRSxXQUFXO1NBQ3BCLENBQUM7UUFDRixJQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNyRixPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxTQUFBLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRU8sZ0RBQTBCLEdBQWxDLFVBQ0UsaUJBQTRDLEVBQzVDLE1BQWM7UUFFZCxPQUFPO1lBQ0wsUUFBUSxFQUFFLGlCQUFpQixDQUFDLFFBQVE7WUFDcEMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBQSxJQUFJO2dCQUNwQyxJQUFBLDBCQUFTLEVBQUUsa0JBQUssQ0FBVTtnQkFDbEMsSUFBSSxTQUFTLEtBQUssb0JBQW9CLENBQUMsUUFBUSxFQUFFO29CQUMvQyxPQUFPO3dCQUNMLFNBQVMsV0FBQTt3QkFDVCxLQUFLLEVBQUUsS0FBSzt3QkFDWixHQUFHLEVBQUcsSUFBcUMsQ0FBQyxRQUFRO3dCQUNwRCxNQUFNLFFBQUE7cUJBQytCLENBQUM7aUJBQ3pDO2dCQUNELElBQUksU0FBUyxLQUFLLG9CQUFvQixDQUFDLFFBQVEsSUFBSSxTQUFTLEtBQUssb0JBQW9CLENBQUMsU0FBUyxFQUFFO29CQUMvRixPQUFPO3dCQUNMLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxRQUFRO3dCQUN4QyxLQUFLLEVBQUUsU0FBUyxLQUFLLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPO3dCQUNyRSxNQUFNLFFBQUE7cUJBQ1AsQ0FBQztpQkFDSDtnQkFDRCxJQUFJLFNBQVMsS0FBSyxvQkFBb0IsQ0FBQyxPQUFPLElBQUksU0FBUyxLQUFLLG9CQUFvQixDQUFDLFFBQVEsRUFBRTtvQkFDN0YsT0FBTzt3QkFDTCxTQUFTLEVBQUUsb0JBQW9CLENBQUMsT0FBTzt3QkFDdkMsS0FBSyxFQUFFLFNBQVMsS0FBSyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTzt3QkFDcEUsTUFBTSxRQUFBO3FCQUNQLENBQUM7aUJBQ0g7Z0JBQ0QsT0FBTyxzQkFBSyxJQUFJLEtBQUUsTUFBTSxRQUFBLEdBQW1DLENBQUM7WUFDOUQsQ0FBQyxDQUFDO1NBQ0gsQ0FBQztJQUNKLENBQUM7SUFFTyw0Q0FBc0IsR0FBOUIsVUFBK0IsU0FBeUI7UUFDdEQsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQUMsRUFBZTtnQkFBYixnQkFBSyxFQUFFLGNBQUk7WUFBTyxPQUFBLENBQUM7Z0JBQ3pDLE1BQU0sRUFBRSxLQUFLO2dCQUNiLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFpQzthQUM3RCxDQUFDO1FBSHdDLENBR3hDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTywwQ0FBb0IsR0FBNUIsVUFDRSxjQUE2RjtRQUQvRixpQkFXQztRQVJDLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQ3pCLE9BQU8sb0JBQW9CLENBQUM7U0FDN0I7YUFBTSxJQUFJLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUNyQyxPQUFPLFVBQUEsZUFBZTtnQkFDcEIsT0FBTyxLQUFJLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7WUFDckUsQ0FBQyxDQUFDO1NBQ0g7UUFDRCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRU8sMkNBQXFCLEdBQTdCLFVBQThCLFlBQStCO1FBQzNELElBQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1QyxTQUFTLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDckMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELDhDQUF3QixHQUF4QixVQUF5QixVQUFpQixFQUFFLGdCQUF3QjtRQUEzQywyQkFBQSxFQUFBLGlCQUFpQjtRQUFFLGlDQUFBLEVBQUEsd0JBQXdCO1FBQ2xFLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNELElBQUksZ0JBQWdCLEVBQUU7WUFDWixJQUFBLCtFQUFxQixDQUFxQztZQUNsRSxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUFxQixDQUFDLEVBQUU7Z0JBQ25DLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxVQUFDLEVBQWU7d0JBQWIsVUFBRTtvQkFBZ0IsT0FBQSxDQUFDLHVCQUFxQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQW5DLENBQW1DLENBQUMsQ0FBQzthQUN0RztTQUNGO1FBQ0QsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQscUNBQWUsR0FBZjtRQUNFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsRUFBRTtZQUMvQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUscUJBQXFCLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUMxRjtJQUNILENBQUM7SUFFRCxpREFBMkIsR0FBM0I7UUFDRSxJQUFJLENBQUMsU0FBUyxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRDs7O09BR0c7SUFDSyxtREFBNkIsR0FBckMsVUFBc0MsRUFBdUM7UUFBN0UsaUJBcURDO1lBckR1Qyw0QkFBVztRQUNqRCwrQ0FBK0M7UUFDL0MsV0FBVyxDQUFDLHNCQUFzQixHQUFHLFVBQUEsTUFBTTtZQUN6QyxJQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUV0RyxJQUFJLGtCQUFrQixFQUFFO2dCQUN0QixNQUFNLENBQUMsTUFBTSxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQzthQUMzQztZQUVELElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRTtnQkFDcEIsTUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFBLEdBQUc7b0JBQ3pDLElBQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUUxQyxPQUFPLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzlDLENBQUMsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUM7UUFFRixtREFBbUQ7UUFDbkQsV0FBVyxDQUFDLDJCQUEyQixHQUFHLFVBQUMsV0FBd0I7WUFDakUsSUFBSSxXQUFXLENBQUMsVUFBVSxFQUFFO2dCQUMxQixJQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBRS9ELElBQUksV0FBVyxFQUFFO29CQUNQLElBQUEseUJBQUssRUFBRSx5QkFBSyxDQUFpQjtvQkFFckMsV0FBVyxDQUFDLFdBQVcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNsQyxXQUFXLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztvQkFFL0IsSUFBSSxXQUFXLENBQUMsUUFBUSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDM0QsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztxQkFDbEQ7aUJBQ0Y7YUFDRjtpQkFBTSxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3pCLElBQUEsb0NBQXNDLEVBQXJDLGdCQUFxQyxDQUFDO2dCQUM3QyxJQUFNLG1CQUFtQixHQUFHLFFBQVEsSUFBSSxRQUFRLENBQUMsbUJBQW1CLENBQUM7Z0JBRXJFLElBQUksbUJBQW1CLElBQUksbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDekQsV0FBVyxDQUFDLFdBQVcsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7b0JBQy9DLFdBQVcsQ0FBQyxVQUFVLEdBQUcsS0FBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQ2pFO2FBQ0Y7aUJBQU07Z0JBQ0wsV0FBVyxDQUFDLFdBQVcsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7YUFDbEQ7WUFFRCxJQUFJLFdBQVcsQ0FBQyxTQUFTLEVBQUU7Z0JBQ3pCLFdBQVcsQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBQSxHQUFHO29CQUNuRCxJQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFFMUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM5QyxDQUFDLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVPLHNDQUFnQixHQUF4QixVQUE0QixJQUFTO1FBQ25DLElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN6RCxJQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQUMsWUFBWSxFQUFFLEtBQUs7O1lBQ2pELElBQU0sWUFBWSxnQkFBUSxZQUFZLENBQUUsQ0FBQzs7Z0JBRXpDLEtBQWtCLElBQUEsaUJBQUEsU0FBQSxZQUFZLENBQUEsMENBQUEsb0VBQUU7b0JBQTNCLElBQU0sR0FBRyx5QkFBQTtvQkFDWixJQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDO29CQUNwQyxJQUFNLFVBQVUsR0FBb0IsRUFBRSxLQUFLLE9BQUEsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBRTFFLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUNsRDs7Ozs7Ozs7O1lBRUQsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOytGQUMyRjtJQUNuRixnREFBMEIsR0FBbEM7UUFDRSxPQUFPO1lBQ0wsNEJBQTRCLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDakUsdURBQXVELEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDOUYsQ0FBQztJQUNKLENBQUM7SUFFTyx5Q0FBbUIsR0FBM0IsVUFBNEIsTUFBdUI7UUFDM0MsSUFBQSxnQkFBc0QsRUFBcEQsd0JBQVMsRUFBRSwwQkFBVSxFQUFFLGdDQUE2QixDQUFDO1FBQzdELElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV2RCxPQUFPLGFBQWEsSUFBSSxRQUFRLElBQUksU0FBUyxJQUFJLFVBQVUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFTywwQ0FBb0IsR0FBNUIsVUFBNkIsTUFBdUI7UUFDNUMsSUFBQSxnQkFBMEMsRUFBeEMsd0JBQVMsRUFBRSxnQ0FBNkIsQ0FBQztRQUNqRCxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdkQsT0FBTyxhQUFhLElBQUksUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ2pELENBQUM7SUFFTyw4Q0FBd0IsR0FBaEMsVUFBaUMsTUFBdUI7UUFDdEQsSUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUM7UUFFaEUsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN0QixJQUFBLCtCQUFPLENBQWtDO1lBQ2pELElBQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDN0QsSUFBTSxlQUFlLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUF0QyxDQUFzQyxDQUFDLENBQUM7WUFFaEcsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDckQ7UUFFRCxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQzs7Z0JBdnFDZ0IsU0FBUztnQkFDTCxTQUFTO2dCQUNULG9CQUFvQjtnQkFDakIsWUFBWTtnQkFDYixXQUFXO2dEQUMvQixNQUFNLFNBQUMscUJBQXFCO2dEQUM1QixNQUFNLFNBQUMsZ0JBQWdCOztJQWpDZixXQUFXO1FBRHZCLFVBQVUsRUFBRTtRQWlDUixXQUFBLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO1FBQzdCLFdBQUEsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUE7eUNBTlYsU0FBUztZQUNMLFNBQVM7WUFDVCxvQkFBb0I7WUFDakIsWUFBWTtZQUNiLFdBQVc7T0EvQnZCLFdBQVcsQ0Ftc0N2QjtJQUFELGtCQUFDO0NBQUEsQUFuc0NELElBbXNDQztTQW5zQ1ksV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBRdWVyeUxpc3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdG9HcmlkQXBpIH0gZnJvbSAnLi4vZ3JpZC1jb250cm9sbGVyL2dyaWQtY29udHJvbGxlci50eXBlcyc7XG5pbXBvcnQge1xuICBDZWxsQ2xhc3NQYXJhbXMsXG4gIENvbEdyb3VwRGVmLFxuICBDb2x1bW4sXG4gIEdldENvbnRleHRNZW51SXRlbXNQYXJhbXMsXG4gIEdyaWRPcHRpb25zLFxuICBJQ2VsbFJlbmRlcmVyUGFyYW1zLFxuICBJR2V0Um93c1BhcmFtcyxcbiAgUm93Tm9kZSxcbiAgUm93Tm9kZVRyYW5zYWN0aW9uLFxuICBSb3dTZWxlY3RlZEV2ZW50XG59IGZyb20gJ2FnLWdyaWQtY29tbXVuaXR5JztcbmltcG9ydCB7IFJvd0RhdGFUcmFuc2FjdGlvbiB9IGZyb20gJ2FnLWdyaWQtY29tbXVuaXR5L2Rpc3QvbGliL3Jvd01vZGVscy9jbGllbnRTaWRlL2NsaWVudFNpZGVSb3dNb2RlbCc7XG5pbXBvcnQgeyBHcmlkUXVlcnkgfSBmcm9tICcuL2dyaWQucXVlcnknO1xuaW1wb3J0IHsgRGF0b0NvcmVFcnJvciB9IGZyb20gJy4uLy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBEYXRvVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyYW5zbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IERhdG9DdXN0b21IZWFkZXJUZW1wbGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2dyaWQtY3VzdG9tLWhlYWRlci9jdXN0b20taGVhZGVyLXRlbXBsYXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgRGF0b0ZpbHRlckNvbmRpdGlvbnMsXG4gIERhdG9HcmlkQ29uZGl0aW9uYWxGaWx0ZXIsXG4gIERhdG9HcmlkRXh0ZXJuYWxGaWx0ZXIsXG4gIERhdG9HcmlkRmlsdGVyLFxuICBEYXRvR3JpZEZpbHRlckNvbmRpdGlvbixcbiAgRGF0b0dyaWRGaWx0ZXJTZWN0aW9ucyxcbiAgRGF0b0dyaWRGaWx0ZXJzTWFwLFxuICBEYXRvR3JpZFJhbmdlRmlsdGVyQ29uZGl0aW9uLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkNvbmRpdGlvbixcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIsXG4gIFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVycyxcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25MaXN0Q29uZGl0aW9uLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvblJhbmdlQ29uZGl0aW9uXG59IGZyb20gJy4uL2dyaWQtZmlsdGVyL2dyaWQtZmlsdGVyLnR5cGVzJztcbmltcG9ydCB7IGNvZXJjZUFycmF5IH0gZnJvbSAnLi4vLi4vdXRpbHMvY29lcmNpb24nO1xuaW1wb3J0IHsgaXNFbXB0eSwgaXNGdW5jdGlvbiwgaXNOaWwsIGlzU3RyaW5nIH0gZnJvbSAnLi4vLi4vdXRpbHMvdmFsaWRhdG9ycyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUZpbHRlciB9IGZyb20gJy4uL2dyaWQtZmlsdGVyL2ZpbHRlci12YWxpZGF0b3InO1xuaW1wb3J0IHsgQWdHcmlkTmcyIH0gZnJvbSAnYWctZ3JpZC1hbmd1bGFyJztcbmltcG9ydCB7IEljb25SZWdpc3RyeSwgU3ZnUmVnaXN0cnkgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pY29uLXJlZ2lzdHJ5JztcbmltcG9ydCB7IGdldFZpc2libGVBY3Rpb25zLCB0b29sYmFyQWN0aW9uVG9Db250ZXh0QWN0aW9uIH0gZnJvbSAnLi4vZ3JpZC12Mi51dGlsJztcbmltcG9ydCB7XG4gIERhdG9HcmlkU2V0dGluZ3MsXG4gIE5vcm1hbGl6ZU9wdGlvbnNQYXJhbXMsXG4gIFBpdm90Q29sdW1uRGF0YSxcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25Db25maWcsXG4gIFN1Y2Nlc3NXcmFwcGVyUGFyYW1zXG59IGZyb20gJy4vZ3JpZC5zdG9yZS50eXBlcyc7XG5pbXBvcnQgeyBSb3dBY3Rpb24gfSBmcm9tICcuLi9ncmlkLXRvb2xiYXIvZ3JpZC10b29sYmFyLnR5cGVzJztcbmltcG9ydCB7IGNvcHlUb0NsaXBib2FyZCB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvY2xpcGJvYXJkLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBHcmlkU3RvcmUgfSBmcm9tICcuL2dyaWQuc3RvcmUnO1xuaW1wb3J0IHsgREFUT19HUklEX1NUT1JBR0VfQVBJLCBHcmlkU3RvcmFnZUFQSSB9IGZyb20gJy4uL2dyaWQtc2V0dGluZ3MnO1xuaW1wb3J0IHtcbiAgQWN0aW9uQ29udmVydGVyUGFyYW1zLFxuICBEYXRvR3JpZEFsaWdubWVudCxcbiAgRGF0b0dyaWRDb2x1bW5EZWYsXG4gIERhdG9HcmlkQ29sdW1uVHlwZXMsXG4gIERhdG9HcmlkR2V0Um93c1BhcmFtcyxcbiAgRGF0b0dyaWRPcHRpb25zLFxuICBEYXRvR3JpZFNlcnZlclNvcnQsXG4gIERhdG9HcmlkU2VydmVyU29ydERpcmVjdGlvbixcbiAgRGF0b0dyaWRTb3J0LFxuICBEYXRvR3JpZFRyZWVDb25maWcsXG4gIGVkaXRhYmxlQ2VsbFJlbmRlcmVyV2l0aFNlYXJjaEhpZ2hsaWdodCxcbiAgR3JpZE1pbldpZHRocyxcbiAgR3JpZFJvd1NlbGVjdGlvblR5cGUsXG4gIHNlYXJjaEhpZ2hsaWdodENlbGxSZW5kZXJlclxufSBmcm9tICcuLi9ncmlkL2dyaWQtdjIudHlwZXMnO1xuXG5pbXBvcnQgeyBjb252ZXJ0VG9UcmVlRGF0YSwgZGVmYXVsdEdyaWRPcHRpb25zLCBkZWZhdWx0R3JpZFRyZWVMYWJlbCB9IGZyb20gJy4uL2dyaWQvZ3JpZC12Mi5jb25maWcnO1xuaW1wb3J0IHsgZGlmZiB9IGZyb20gJy4uLy4uL3V0aWxzL29iamVjdCc7XG5pbXBvcnQgeyB1bnRpbERlc3Ryb3llZCB9IGZyb20gJ25neC10YWtlLXVudGlsLWRlc3Ryb3knO1xuaW1wb3J0IHsgQ29yZUV2ZW50TG9nZ2VyLCBDb3JlRXZlbnRUeXBlcywgREFUT19DT1JFX0xPR0dFUiB9IGZyb20gJy4uLy4uL2V2ZW50LWxvZ2dlcic7XG5pbXBvcnQgeyBIYXNoTWFwIH0gZnJvbSAnLi4vLi4vdXRpbHMvdHlwZXMnO1xuaW1wb3J0IHsgc2l6ZSB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHsgT3BlcmF0b3JUeXBlcyB9IGZyb20gJy4uLy4uL29wZXJhdG9yLXRvZ2dsZXIvb3BlcmF0b3ItdG9nZ2xlci50eXBlcyc7XG5pbXBvcnQgeyBkZWVwbWVyZ2UgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC9kZWVwLW1lcmdlJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRyaWdnZXJXaW5kb3dSZXNpemUgfSBmcm9tICcuLi8uLi91dGlscy91c2VyLWFnZW50JztcbmltcG9ydCB7IGdldENvbEZpZWxkLCBnZXRDb2x1bW5zU2l6ZXMsIGlzSHRtbEFsbG93ZWRGb3JDb2wsIHRyeVBhcnNlUGl2b3RWYWx1ZSB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBEYXRvR3JpZE11bHRpU2VsZWN0Q29sdW1uSGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vZ3JpZC1jb2x1bW4taGVhZGVyL2dyaWQtbXVsdGktc2VsZWN0LWhlYWRlci9ncmlkLW11bHRpLXNlbGVjdC1oZWFkZXIuY29tcG9uZW50JztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEdyaWRTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgYXBpOiBEYXRvR3JpZEFwaTtcbiAgdHJlZUNvbmZpZzogRGF0b0dyaWRUcmVlQ29uZmlnID0gZGVmYXVsdEdyaWRUcmVlTGFiZWw7XG4gIGlzUGl2b3RNb2RlOiBib29sZWFuO1xuXG4gIC8qKiBAaW50ZXJuYWwgLSB1c2VkIGZvciBzZXJ2ZXIgc2lkZSBieSB2YWx1ZSBmaWx0ZXIgKi9cbiAgX29yaWdpbmFsR2V0Um93czogKHBhcmFtczogRGF0b0dyaWRHZXRSb3dzUGFyYW1zKSA9PiB2b2lkO1xuICBwcml2YXRlIGluaXRpYWxTZXR0aW5nczogRGF0b0dyaWRTZXR0aW5ncztcbiAgcHJpdmF0ZSBncmlkTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGdyaWRSZWY6IEFnR3JpZE5nMjtcbiAgcHJpdmF0ZSBjdXN0b21IZWFkZXJzVGVtcGxhdGVzOiBRdWVyeUxpc3Q8RGF0b0N1c3RvbUhlYWRlclRlbXBsYXRlQ29tcG9uZW50PjtcbiAgcHJpdmF0ZSBpc1RyZWVEYXRhOiBib29sZWFuO1xuICBwcml2YXRlIHBhZ2VOdW1iZXJUb1JldHVybkFmdGVyUmVmcmVzaCA9IC0xO1xuICBwcml2YXRlIGxhc3RUb3RhbFJvd3M6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWxvYWRHcmlkQWN0aW9uc1N1YmplY3QgPSBuZXcgU3ViamVjdCgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgQ0hFQ0tCT1hfU0VMRUNUSU9OX0NPTF9JRCA9ICdncmlkLWNoZWNrYm94LXNlbGVjdGlvbic7XG5cbiAgc2V0IHRyZWVEYXRhKGlzVHJlZURhdGE6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzVHJlZURhdGEgPSBpc1RyZWVEYXRhO1xuICB9XG5cbiAgZ2V0IHRyZWVEYXRhKCkge1xuICAgIHJldHVybiB0aGlzLmlzVHJlZURhdGE7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN0b3JlOiBHcmlkU3RvcmUsXG4gICAgcHJpdmF0ZSBncmlkUXVlcnk6IEdyaWRRdWVyeSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogRGF0b1RyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpY29uUmVnaXN0cnk6IEljb25SZWdpc3RyeSxcbiAgICBwcml2YXRlIHN2Z1JlZ2lzdHJ5OiBTdmdSZWdpc3RyeSxcbiAgICBASW5qZWN0KERBVE9fR1JJRF9TVE9SQUdFX0FQSSkgcHJpdmF0ZSBzdG9yYWdlQVBJOiBHcmlkU3RvcmFnZUFQSSxcbiAgICBASW5qZWN0KERBVE9fQ09SRV9MT0dHRVIpIHByaXZhdGUgbG9nZ2VyOiBDb3JlRXZlbnRMb2dnZXJcbiAgKSB7fVxuXG4gIG5nT25EZXN0cm95KCkge31cblxuICAvKiogQGludGVybmFsIC0gdXNlZCB0byBpbml0IHRoZSBzZXJ2aWNlICovXG4gIF9zZXRBcGkoYXBpOiBEYXRvR3JpZEFwaSwgZ3JpZFJlZjogQWdHcmlkTmcyKSB7XG4gICAgdGhpcy5hcGkgPSBhcGk7XG4gICAgdGhpcy5ncmlkUmVmID0gZ3JpZFJlZjtcbiAgICB0aGlzLmdyaWROYW1lID0gKGdyaWRSZWYuZ3JpZE9wdGlvbnMgYXMgRGF0b0dyaWRPcHRpb25zKS5ncmlkTmFtZTtcbiAgICB0aGlzLnNldFNlcnZlclNpZGVQYWdpbmF0aW9uKHtcbiAgICAgIGVuYWJsZWQ6IHRoaXMuaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihncmlkUmVmLmdyaWRPcHRpb25zKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NlcnZlclNpZGVQYWdpbmF0aW9uKGdyaWRPcHRpb25zOiBHcmlkT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBncmlkT3B0aW9ucy5yb3dNb2RlbFR5cGUgPT09ICdpbmZpbml0ZSc7XG4gIH1cblxuICB1cGRhdGVHcmlkQ29udGV4dChjb250ZXh0ID0ge30sIHJlcGxhY2UgPSBmYWxzZSkge1xuICAgIHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCkuY29udGV4dCA9IHJlcGxhY2VcbiAgICAgID8gY29udGV4dFxuICAgICAgOiBkZWVwbWVyZ2UodGhpcy5ncmlkUmVmLmdyaWRPcHRpb25zLmNvbnRleHQgfHwge30sIGNvbnRleHQpO1xuICB9XG5cbiAgcmVsb2FkR3JpZEFjdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWxvYWRHcmlkQWN0aW9uc1N1YmplY3QubmV4dCgpO1xuICB9XG5cbiAgb25SZWxvYWRHcmlkQWN0aW9ucygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJlbG9hZEdyaWRBY3Rpb25zU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2VsZWN0Um93cyBpbnN0ZWFkXG4gICAqIEBwYXJhbSByb3dcbiAgICovXG4gIHNldFNlbGVjdGVkUm93czxUPihyb3c6IChUICYgUm93Tm9kZSkgfCAoVFtdICYgUm93Tm9kZVtdKSkge1xuICAgIHRoaXMuc2VsZWN0Um93cyhyb3cpO1xuICB9XG5cbiAgc2VsZWN0Um93czxUPihyb3c6IChUICYgUm93Tm9kZSkgfCAoVFtdICYgUm93Tm9kZVtdKSkge1xuICAgIGNvbnN0IHJvd05vZGVzID0gY29lcmNlQXJyYXkocm93KS5maWx0ZXIocm93Tm9kZSA9PiAhcm93Tm9kZS5pc1NlbGVjdGVkKCkpO1xuICAgIGNvbnN0IGxhc3ROb2RlID0gcm93Tm9kZXMucG9wKCk7XG4gICAgcm93Tm9kZXMuZm9yRWFjaChyb3dOb2RlID0+IHJvd05vZGUuc2V0U2VsZWN0ZWQodHJ1ZSwgZmFsc2UsIHRydWUpKTtcbiAgICBpZiAobGFzdE5vZGUpIHtcbiAgICAgIGxhc3ROb2RlLnNldFNlbGVjdGVkKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGRlc2VsZWN0Um93czxUPihyb3c6IChUICYgUm93Tm9kZSkgfCAoVFtdICYgUm93Tm9kZVtdKSkge1xuICAgIGNvbnN0IHJvd05vZGVzID0gY29lcmNlQXJyYXkocm93KS5maWx0ZXIocm93Tm9kZSA9PiByb3dOb2RlLmlzU2VsZWN0ZWQoKSk7XG4gICAgY29uc3QgbGFzdE5vZGUgPSByb3dOb2Rlcy5wb3AoKTtcbiAgICByb3dOb2Rlcy5mb3JFYWNoKHJvd05vZGUgPT4gcm93Tm9kZS5zZXRTZWxlY3RlZChmYWxzZSwgZmFsc2UsIHRydWUpKTtcbiAgICBpZiAobGFzdE5vZGUpIHtcbiAgICAgIGxhc3ROb2RlLnNldFNlbGVjdGVkKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBzZXRSb3dzPFQ+KGRhdGE6IFRbXSwgZml0Q29udGFpbmVyID0gZmFsc2UsIHRyZWVDb25maWc6IFBhcnRpYWw8RGF0b0dyaWRUcmVlQ29uZmlnPiA9IHt9KSB7XG4gICAgdGhpcy5ncmlkUXVlcnkuZ3JpZFJlYWR5JC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc1RyZWVEYXRhKSB7XG4gICAgICAgIHRoaXMudHJlZUNvbmZpZyA9IHtcbiAgICAgICAgICAuLi5kZWZhdWx0R3JpZFRyZWVMYWJlbCxcbiAgICAgICAgICAuLi50cmVlQ29uZmlnXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHRyZWVEYXRlID0gY29udmVydFRvVHJlZURhdGEoZGF0YSwgdGhpcy50cmVlQ29uZmlnKTtcbiAgICAgICAgdGhpcy5hcGkuZ3JpZC5zZXRSb3dEYXRhKHRyZWVEYXRlKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Bpdm90TW9kZSkge1xuICAgICAgICB0aGlzLnNldFBpdm90TW9kZVJvd3M8VD4oZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFwaS5ncmlkLnNldFJvd0RhdGEoZGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAoZml0Q29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMuZml0R3JpZCgnY29udGFpbmVyJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyV2luZG93UmVzaXplKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXREYXRhc291cmNlKGdldFJvd3M6IChwYXJhbXM6IERhdG9HcmlkR2V0Um93c1BhcmFtcykgPT4gdm9pZCwgcmV0dXJuVG9DdXJyZW50UGFnZSA9IGZhbHNlLCBzaG93TG9hZGluZyA9IGZhbHNlKSB7XG4gICAgcmV0dXJuVG9DdXJyZW50UGFnZSAmJiB0aGlzLnVwZGF0ZVBhZ2VUb0tlZXBPblJlZnJlc2hTZXJ2ZXJEYXRhKCk7XG4gICAgc2hvd0xvYWRpbmcgJiYgdGhpcy5zZXRMb2FkaW5nKHRydWUpO1xuICAgIHRoaXMuX29yaWdpbmFsR2V0Um93cyA9IGdldFJvd3M7XG4gICAgdGhpcy5hcGkuZ3JpZC5zZXREYXRhc291cmNlKHsgZ2V0Um93czogdGhpcy53cmFwR2V0Um93cyh0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLCBnZXRSb3dzKSB9KTtcbiAgfVxuXG4gIHJlZnJlc2hTZXJ2ZXJEYXRhKGtlZXBDdXJyZW50UGFnZSA9IGZhbHNlLCBzaG93TG9hZGluZyA9IGZhbHNlKSB7XG4gICAga2VlcEN1cnJlbnRQYWdlICYmIHRoaXMudXBkYXRlUGFnZVRvS2VlcE9uUmVmcmVzaFNlcnZlckRhdGEoKTtcbiAgICBzaG93TG9hZGluZyAmJiB0aGlzLnNldExvYWRpbmcodHJ1ZSk7XG4gICAgdGhpcy5hcGkuZ3JpZC5zZXREYXRhc291cmNlKHsgZ2V0Um93czogdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKS5kYXRhc291cmNlLmdldFJvd3MgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhZ2VUb0tlZXBPblJlZnJlc2hTZXJ2ZXJEYXRhKCkge1xuICAgIC8vIEtlZXBpbmcgdGhlIGN1cnJlbnQgcGFnZSBvbiBzZXJ2ZXIgcmVmcmVzaCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIG9ubHkgd2hlbiBubyBwYWdlIGNsaWVudCBjYWNoaW5nIGlzIGVuYWJsZWRcbiAgICBpZiAodGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKS5tYXhCbG9ja3NJbkNhY2hlID09PSAxKSB7XG4gICAgICB0aGlzLnBhZ2VOdW1iZXJUb1JldHVybkFmdGVyUmVmcmVzaCA9IHRoaXMuYXBpLmdyaWQucGFnaW5hdGlvbkdldEN1cnJlbnRQYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgYWRkUm93czxUPihyb3c6IFQsIGluZGV4PzogbnVtYmVyKTogUm93Tm9kZVRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCByb3dzID0gY29lcmNlQXJyYXkocm93KTtcbiAgICBjb25zdCBkYXRhOiBSb3dEYXRhVHJhbnNhY3Rpb24gPSB7IGFkZDogcm93cyB9O1xuICAgIGlmICghaXNOaWwoaW5kZXgpKSB7XG4gICAgICBkYXRhLmFkZEluZGV4ID0gaW5kZXg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFwaS5ncmlkLnVwZGF0ZVJvd0RhdGEoZGF0YSk7XG4gIH1cblxuICB1cGRhdGVSb3dzPFQ+KHJvdzogVFtdKTogYW55IHtcbiAgICBjb25zdCByb3dzID0gY29lcmNlQXJyYXkocm93KTtcbiAgICByZXR1cm4gdGhpcy5hcGkuZ3JpZC51cGRhdGVSb3dEYXRhKHsgdXBkYXRlOiByb3dzIH0pO1xuICB9XG5cbiAgdXBkYXRlUm93VmFsdWU8VD4ocm93OiBSb3dOb2RlLCBrZXk6IHN0cmluZywgbmV3VmFsdWU6IFQpO1xuICB1cGRhdGVSb3dWYWx1ZTxUPihpZDogc3RyaW5nLCBrZXk6IHN0cmluZywgbmV3VmFsdWU6IFQpO1xuICB1cGRhdGVSb3dWYWx1ZTxUPihyb3c6IHN0cmluZyB8IFJvd05vZGUsIGtleTogc3RyaW5nLCBuZXdWYWx1ZTogVCkge1xuICAgIGNvbnN0IHJvd05vZGUgPSBpc1N0cmluZyhyb3cpID8gdGhpcy5hcGkuZ3JpZC5nZXRSb3dOb2RlKHJvdykgOiByb3c7XG4gICAgcm93Tm9kZS5zZXREYXRhVmFsdWUoa2V5LCBuZXdWYWx1ZSk7XG4gIH1cblxuICByZW1vdmVSb3dzKHJvdzogUm93Tm9kZSB8IFJvd05vZGVbXSk6IFJvd05vZGVUcmFuc2FjdGlvbiB7XG4gICAgY29uc3Qgcm93cyA9IGNvZXJjZUFycmF5KHJvdykubWFwKCh7IGRhdGEgfSkgPT4gZGF0YSk7XG4gICAgcmV0dXJuIHRoaXMuYXBpLmdyaWQudXBkYXRlUm93RGF0YSh7IHJlbW92ZTogcm93cyB9KTtcbiAgfVxuXG4gIHJlbW92ZVNlbGVjdGVkUm93cygpIHtcbiAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLmdyaWRRdWVyeS5nZXRTZWxlY3RlZFJvd05vZGVzKCk7XG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlUm93cyhzZWxlY3RlZFJvd3MpO1xuICB9XG5cbiAgY2xlYXJUYWJsZSgpIHtcbiAgICB0aGlzLnNldFJvd3MoW10pO1xuICB9XG5cbiAgdXBkYXRlQ29sdW1ucyhjb2xEZWZzOiBEYXRvR3JpZENvbHVtbkRlZiB8IERhdG9HcmlkQ29sdW1uRGVmW10sIHJlbG9hZFNldHRpbmdzID0gZmFsc2UpIHtcbiAgICBpZiAoIWNvbERlZnMpIHtcbiAgICAgIHRocm93IG5ldyBEYXRvQ29yZUVycm9yKCdObyBjb2x1bW5EZWZzIHdlcmUgcHJvdmlkZWQuIPCflbXwn4+74oCN4pmA77iPJyk7XG4gICAgfVxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZUNvbHVtbnMoY29lcmNlQXJyYXkoY29sRGVmcykpO1xuICAgIGNvbnN0IHNhdmVkU2V0dGluZ3MgPSByZWxvYWRTZXR0aW5ncyAmJiB0aGlzLmdyaWRRdWVyeS5nZXRDdXJyZW50R3JpZFNldHRpbmdzKCk7XG4gICAgdGhpcy5hcGkuZ3JpZC5zZXRDb2x1bW5EZWZzKG5vcm1hbGl6ZWQpO1xuICAgIGlmIChzYXZlZFNldHRpbmdzKSB7XG4gICAgICB0aGlzLmxvYWRTYXZlZFNldHRpbmdzKHNhdmVkU2V0dGluZ3MpO1xuICAgIH1cbiAgfVxuXG4gIG5vcm1hbGl6ZU9wdGlvbnMocGFyYW1zOiBOb3JtYWxpemVPcHRpb25zUGFyYW1zKSB7XG4gICAgdGhpcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzID0gcGFyYW1zLmN1c3RvbUhlYWRlcnNUZW1wbGF0ZXM7XG4gICAgY29uc3QgaGVhZGVyQ29tcG9uZW50UGFyYW1zID0geyBncmlkU2VydmljZTogdGhpcywgZ3JpZFF1ZXJ5OiB0aGlzLmdyaWRRdWVyeSB9O1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5hdXRvR3JvdXBDb2x1bW5EZWYgPSB7XG4gICAgICAuLi5oZWFkZXJDb21wb25lbnRQYXJhbXMsXG4gICAgICAuLi5wYXJhbXMuZ3JpZE9wdGlvbnMuYXV0b0dyb3VwQ29sdW1uRGVmXG4gICAgfTtcblxuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5kZWZhdWx0Q29sRGVmID0ge1xuICAgICAgLi4ucGFyYW1zLmdyaWRPcHRpb25zLmRlZmF1bHRDb2xEZWYsXG4gICAgICBoZWFkZXJDb21wb25lbnRQYXJhbXNcbiAgICB9O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVTZWFyY2ggPSBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlVjJfMTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlQmFja2dyb3VuZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVCYWNrZ3JvdW5kID0gcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZVYyXzE7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGFyYW1zLmdyaWRPcHRpb25zLnNob3dNdWx0aVNlbGVjdGlvbkNoZWNrYm94ZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuc2hvd011bHRpU2VsZWN0aW9uQ2hlY2tib3hlcyA9XG4gICAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVWMl8xICYmIHBhcmFtcy5ncmlkT3B0aW9ucy5yb3dTZWxlY3Rpb24gIT09IEdyaWRSb3dTZWxlY3Rpb25UeXBlLlNJTkdMRTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlU2VhcmNoSGlnaGxpZ2h0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaEhpZ2hsaWdodCA9XG4gICAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVTZWFyY2ggJiYgZGVmYXVsdEdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaEhpZ2hsaWdodDtcbiAgICB9XG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmNvbHVtbkRlZnMgPSB0aGlzLm5vcm1hbGl6ZUNvbHVtbnMocGFyYW1zLmdyaWRPcHRpb25zLmNvbHVtbkRlZnMsIHBhcmFtcy5ncmlkT3B0aW9ucyk7XG5cbiAgICAvKiogQWRkIGNvcmUgZmlsdGVycyAqL1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5pc0V4dGVybmFsRmlsdGVyUHJlc2VudCA9ICgpID0+IHRydWU7XG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmRvZXNFeHRlcm5hbEZpbHRlclBhc3MgPSAocm93OiBSb3dOb2RlKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB2YWxpZGF0ZUZpbHRlcih7IHJvdywgYXBpOiB0aGlzLmdyaWRRdWVyeS5hcGkuZ3JpZCB9LCB0aGlzLmdyaWRRdWVyeS5nZXRGaWx0ZXIoKSkgJiYgdGhpcy5yb3dNYXRjaGVzU2VhcmNoKHJvdylcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKiBXcmFwIHRoZSBzZXJ2ZXIgc2lkZSBwYWdpbmF0aW9uIGdldCByb3dzIGZ1bmN0aW9uICovXG4gICAgaWYgKHRoaXMuaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihwYXJhbXMuZ3JpZE9wdGlvbnMpKSB7XG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuYmxvY2tMb2FkRGVib3VuY2VNaWxsaXMgPSAzMDA7XG4gICAgICB0aGlzLl9vcmlnaW5hbEdldFJvd3MgPSBwYXJhbXMuZ3JpZE9wdGlvbnMuZGF0YXNvdXJjZS5nZXRSb3dzO1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmRhdGFzb3VyY2UuZ2V0Um93cyA9IHRoaXMud3JhcEdldFJvd3MocGFyYW1zLmdyaWRPcHRpb25zKTtcbiAgICAgIC8qIFRoZSBjYWNoZSBzaXplIGlzIHN5bmNlZCB3aXRoIHRoZSBwYWdpbmF0aW9uIHBhZ2Ugc2l6ZSAqL1xuICAgICAgY29uc3QgY2FjaGVTaXplID0gcGFyYW1zLmdyaWRPcHRpb25zLnBhZ2luYXRpb25QYWdlU2l6ZTtcbiAgICAgIGlmIChjYWNoZVNpemUpIHtcbiAgICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmNhY2hlQmxvY2tTaXplID0gY2FjaGVTaXplO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBFZGl0YWJsZSBjZWxsICovXG4gICAgdGhpcy5pbml0RWRpdGFibGVDb2x1bW5zQ2VsbENsYXNzKHBhcmFtcyk7XG5cbiAgICAvKiogV3JhcCBjb250ZXh0IG1lbnUgKi9cbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZ2V0Q29udGV4dE1lbnVJdGVtcyA9IHRoaXMud3JhcENvbnRleHRNZW51QnVpbGRlcihwYXJhbXMpO1xuXG4gICAgLyoqIFNhdmUgZ3JpZCBzZXR0aW5ncyAqL1xuICAgIGNvbnN0IHsgc2F2ZVNldHRpbmdzLCBncmlkTmFtZSB9ID0gcGFyYW1zLmdyaWRPcHRpb25zO1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5zYXZlU2V0dGluZ3MgPSBzYXZlU2V0dGluZ3MgIT09IGZhbHNlICYmICFpc05pbChncmlkTmFtZSk7XG5cbiAgICAvKiogU2VydmVyIFNpZGUgUGFnaW5hdGlvbiBmb3Igc2VsZWN0IGFsbCBvcHRpb24gKi9cbiAgICB0aGlzLmluaXRPblJvd1NlbGVjdGVkRm9yU2VydmVyU2lkZVBhZ2luYXRpb24ocGFyYW1zKTtcblxuICAgIC8qKiBBZGQgcGl2b3Qgc3BlY2lmaWMgcmVxdWlyZWQgc2V0dGluZ3MgKi9cbiAgICBpZiAocGFyYW1zLmdyaWRPcHRpb25zLnBpdm90TW9kZSkge1xuICAgICAgdGhpcy5pbml0UGl2b3RTZWNvbmRhcnlDb2xzUHJvY2VzcyhwYXJhbXMpO1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLnNhdmVTZXR0aW5ncyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZ3JpZE9wdGlvbnMudXNlUGl2b3RHcmlkU3R5bGUpIHtcbiAgICAgIGNvbnN0IHJvd0hlaWdodCA9IDMwO1xuXG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMucm93SGVpZ2h0ID0gcm93SGVpZ2h0O1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmRlZmF1bHRDb2xEZWYgPSB7XG4gICAgICAgIC4uLnBhcmFtcy5ncmlkT3B0aW9ucy5kZWZhdWx0Q29sRGVmLFxuICAgICAgICBjZWxsQ2xhc3NSdWxlczogdGhpcy5nZXRQaXZvdE1vZGVDZWxsQ2xhc3NSdWxlcygpLFxuICAgICAgICBoZWFkZXJDbGFzczogdGhpcy5nZXRQaXZvdEhlYWRlckNsYXNzLmJpbmQodGhpcyksXG4gICAgICAgIGNlbGxTdHlsZTogcGFyYW1zID0+IHtcbiAgICAgICAgICBjb25zdCBzdHlsZTogYW55ID0geyBsaW5lSGVpZ2h0OiBgJHtyb3dIZWlnaHR9cHhgIH07XG5cbiAgICAgICAgICBpZiAocGFyYW1zLmNvbERlZi50eXBlID09PSBEYXRvR3JpZENvbHVtblR5cGVzLk51bWJlcikge1xuICAgICAgICAgICAgc3R5bGUudGV4dEFsaWduID0gJ2VuZCc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuYXV0b0dyb3VwQ29sdW1uRGVmID0ge1xuICAgICAgICAuLi5wYXJhbXMuZ3JpZE9wdGlvbnMuYXV0b0dyb3VwQ29sdW1uRGVmLFxuICAgICAgICBjZWxsQ2xhc3NSdWxlczogdGhpcy5nZXRQaXZvdE1vZGVDZWxsQ2xhc3NSdWxlcygpLFxuICAgICAgICBoZWFkZXJDbGFzczogdGhpcy5nZXRQaXZvdEhlYWRlckNsYXNzLmJpbmQodGhpcylcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcy5ncmlkT3B0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGl2b3RIZWFkZXJDbGFzcyhwYXJhbXMpIHtcbiAgICBjb25zdCBncmlkUXVlcnkgPSBwYXJhbXMuY29sRGVmLmhlYWRlckNvbXBvbmVudFBhcmFtcy5ncmlkUXVlcnk7XG4gICAgbGV0IGNlbGxDbGFzcyA9ICcnO1xuXG4gICAgaWYgKGdyaWRRdWVyeSAmJiBncmlkUXVlcnkuYXBpKSB7XG4gICAgICBjb25zdCB7IGNvbHVtbnMgfSA9IGdyaWRRdWVyeS5hcGkgYXMgRGF0b0dyaWRBcGk7XG4gICAgICAvKiogVXNlIGdldFBpdm90UmVzdWx0Q29sdW1ucyBmcm9tIHZlciAyOCAqL1xuICAgICAgY29uc3QgcGl2b3RDb2x1bW5zID0gY29sdW1ucy5nZXRTZWNvbmRhcnlDb2x1bW5zKCk7XG5cbiAgICAgIGlmIChwaXZvdENvbHVtbnMgJiYgcGl2b3RDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2VsbENsYXNzICs9ICd0b3AtYm9yZGVyJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2VsbENsYXNzO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVDb2x1bW5zKGNvbERlZnM6IERhdG9HcmlkQ29sdW1uRGVmW10sIGdyaWRPcHRpb25zOiBEYXRvR3JpZE9wdGlvbnMgPSBudWxsKTogRGF0b0dyaWRDb2x1bW5EZWZbXSB7XG4gICAgaWYgKCFncmlkT3B0aW9ucykge1xuICAgICAgZ3JpZE9wdGlvbnMgPSB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVkQ29sRGVmcyA9IGNvbERlZnMubWFwKChjb2w6IERhdG9HcmlkQ29sdW1uRGVmKSA9PiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0ge1xuICAgICAgICAuLi5jb2wsXG4gICAgICAgIGhlYWRlck5hbWU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShjb2wuaGVhZGVyTmFtZSlcbiAgICAgIH07XG4gICAgICAvKiogQWRqdXN0IHRoZSB3aWR0aCBpbiBjYXNlIHRoZSBjb2x1bW4gaGFzIGluZm8gKi9cbiAgICAgIGlmIChjb2wuaW5mbykge1xuICAgICAgICBub3JtYWxpemVkLm1pbldpZHRoID0gY29sLm1pbldpZHRoIHx8IEdyaWRNaW5XaWR0aHMuV2l0aF9JbmZvO1xuICAgICAgfVxuICAgICAgaWYgKCFjb2wuY29sSWQpIHtcbiAgICAgICAgbm9ybWFsaXplZC5jb2xJZCA9IGNvbC5maWVsZDtcbiAgICAgIH1cbiAgICAgIGlmIChub3JtYWxpemVkLnR5cGUgPT09IERhdG9HcmlkQ29sdW1uVHlwZXMuSXRlbXMgJiYgIW5vcm1hbGl6ZWQuZmlsdGVyc0NvbmZpZykge1xuICAgICAgICBub3JtYWxpemVkLmZpbHRlcnNDb25maWcgPSB7IHNlY3Rpb25zOiBEYXRvR3JpZEZpbHRlclNlY3Rpb25zLkNvbmRpdGlvbmFsIH07XG4gICAgICB9XG4gICAgICB0aGlzLm5vcm1hbGl6ZUNvbHVtblNlYXJjaENvbmZpZyhncmlkT3B0aW9ucywgY29sLCBub3JtYWxpemVkKTtcbiAgICAgIHJldHVybiBub3JtYWxpemVkO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYWRkTXVsdGlTZWxlY3RIZWFkZXJDb2x1bW5JZlJlcXVpcmVkKHVwZGF0ZWRDb2xEZWZzLCBncmlkT3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUNvbHVtblNlYXJjaENvbmZpZyhcbiAgICBncmlkT3B0aW9uczogRGF0b0dyaWRPcHRpb25zLFxuICAgIGNvbDogRGF0b0dyaWRDb2x1bW5EZWYsXG4gICAgbm9ybWFsaXplZDogRGF0b0dyaWRDb2x1bW5EZWZcbiAgKSB7XG4gICAgLyoqIENoZWNrIGlmIGNvbHVtbiBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBzZWFyY2ggKiovXG4gICAgY29uc3QgaXNTZXJ2ZXJQYWdpbmF0aW9uID0gdGhpcy5pc1NlcnZlclNpZGVQYWdpbmF0aW9uKGdyaWRPcHRpb25zKTtcbiAgICBpZiAodHlwZW9mIGNvbC5pbmNsdWRlSW5TZWFyY2ggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAoaXNTZXJ2ZXJQYWdpbmF0aW9uICYmIGNvbC50eXBlID09PSBEYXRvR3JpZENvbHVtblR5cGVzLkRhdGUpIHtcbiAgICAgICAgbm9ybWFsaXplZC5pbmNsdWRlSW5TZWFyY2ggPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vcm1hbGl6ZWQuaW5jbHVkZUluU2VhcmNoID1cbiAgICAgICAgICB0eXBlb2YgZ3JpZE9wdGlvbnMuY29sdW1uc0luY2x1ZGVkSW5TZWFyY2hCeURlZmF1bHQgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IGdyaWRPcHRpb25zLmNvbHVtbnNJbmNsdWRlZEluU2VhcmNoQnlEZWZhdWx0XG4gICAgICAgICAgICA6IGRlZmF1bHRHcmlkT3B0aW9ucy5jb2x1bW5zSW5jbHVkZWRJblNlYXJjaEJ5RGVmYXVsdDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgbm9ybWFsaXplZC5pbmNsdWRlSW5TZWFyY2ggJiZcbiAgICAgICF0aGlzLmhhc0NlbGxSZW5kZXJlcihub3JtYWxpemVkLCBncmlkT3B0aW9ucykgJiZcbiAgICAgIGdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaEhpZ2hsaWdodFxuICAgICkge1xuICAgICAgbm9ybWFsaXplZC5jZWxsUmVuZGVyZXIgPSAocGFyYW1zOiBJQ2VsbFJlbmRlcmVyUGFyYW1zKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbG93SFRNTCA9IGlzSHRtbEFsbG93ZWRGb3JDb2woZ3JpZE9wdGlvbnMsIHBhcmFtcy5jb2xEZWYpO1xuICAgICAgICBjb25zdCBpc0VkaXRhYmxlID1cbiAgICAgICAgICAoaXNGdW5jdGlvbihub3JtYWxpemVkLmVkaXRhYmxlKSAmJiBub3JtYWxpemVkLmVkaXRhYmxlKHBhcmFtcykpIHx8XG4gICAgICAgICAgKCFpc0Z1bmN0aW9uKG5vcm1hbGl6ZWQuZWRpdGFibGUpICYmIG5vcm1hbGl6ZWQuZWRpdGFibGUpO1xuXG4gICAgICAgIHJldHVybiBpc0VkaXRhYmxlXG4gICAgICAgICAgPyBlZGl0YWJsZUNlbGxSZW5kZXJlcldpdGhTZWFyY2hIaWdobGlnaHQocGFyYW1zLCB0aGlzLmdyaWRRdWVyeS5nZXRTZWFyY2hUZXJtKCksIGFsbG93SFRNTClcbiAgICAgICAgICA6IHNlYXJjaEhpZ2hsaWdodENlbGxSZW5kZXJlcihwYXJhbXMsIHRoaXMuZ3JpZFF1ZXJ5LmdldFNlYXJjaFRlcm0oKSwgYWxsb3dIVE1MKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYXNDZWxsUmVuZGVyZXIoY29sdW1uOiBEYXRvR3JpZENvbHVtbkRlZiwgZ3JpZE9wdGlvbnM6IERhdG9HcmlkT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIGlmIChjb2x1bW4uY2VsbFJlbmRlcmVyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IGNvbHVtbi50eXBlIGFzIHN0cmluZztcbiAgICBjb25zdCBjb2x1bW5UeXBlSGFzQ2VsbFJlbmRlcmVyID0gKG9wdGlvbnM6IFBhcnRpYWw8RGF0b0dyaWRPcHRpb25zPik6IGJvb2xlYW4gPT5cbiAgICAgIG9wdGlvbnMuY29sdW1uVHlwZXMgJiYgISFvcHRpb25zLmNvbHVtblR5cGVzW3R5cGVdICYmICEhb3B0aW9ucy5jb2x1bW5UeXBlc1t0eXBlXS5jZWxsUmVuZGVyZXI7XG5cbiAgICByZXR1cm4gY29sdW1uVHlwZUhhc0NlbGxSZW5kZXJlcihncmlkT3B0aW9ucykgfHwgY29sdW1uVHlwZUhhc0NlbGxSZW5kZXJlcihkZWZhdWx0R3JpZE9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRNdWx0aVNlbGVjdEhlYWRlckNvbHVtbklmUmVxdWlyZWQoXG4gICAgY29sdW1uRGVmczogRGF0b0dyaWRDb2x1bW5EZWZbXSxcbiAgICBncmlkT3B0aW9uczogRGF0b0dyaWRPcHRpb25zXG4gICk6IERhdG9HcmlkQ29sdW1uRGVmW10ge1xuICAgIGNvbnN0IHNob3dNdWx0aVNlbGVjdGlvbkNoZWNrYm94ZXMgPSBncmlkT3B0aW9ucyAmJiBncmlkT3B0aW9ucy5zaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzO1xuICAgIGNvbnN0IHJvd1NlbGVjdGlvbiA9XG4gICAgICBncmlkT3B0aW9ucyAmJiBncmlkT3B0aW9ucy5yb3dTZWxlY3Rpb24gPyBncmlkT3B0aW9ucy5yb3dTZWxlY3Rpb24gOiBkZWZhdWx0R3JpZE9wdGlvbnMucm93U2VsZWN0aW9uO1xuXG4gICAgaWYgKHNob3dNdWx0aVNlbGVjdGlvbkNoZWNrYm94ZXMgJiYgcm93U2VsZWN0aW9uID09PSBHcmlkUm93U2VsZWN0aW9uVHlwZS5NVUxUSVBMRSkge1xuICAgICAgY29uc3QgY2hlY2tib3hlc0NvbHVtbjogRGF0b0dyaWRDb2x1bW5EZWYgPSB7XG4gICAgICAgIGNvbElkOiB0aGlzLkNIRUNLQk9YX1NFTEVDVElPTl9DT0xfSUQsXG4gICAgICAgIGNoZWNrYm94U2VsZWN0aW9uOiB0cnVlLFxuICAgICAgICBoZWFkZXJDb21wb25lbnRGcmFtZXdvcms6IERhdG9HcmlkTXVsdGlTZWxlY3RDb2x1bW5IZWFkZXJDb21wb25lbnQsXG4gICAgICAgIHdpZHRoOiAzMCxcbiAgICAgICAgbWF4V2lkdGg6IDMwLFxuICAgICAgICBzdXBwcmVzc1NpemVUb0ZpdDogdHJ1ZSxcbiAgICAgICAgY2VsbENsYXNzOiAnY2hlY2tib3gtc2VsZWN0aW9uLWNlbGwnLFxuICAgICAgICBoZWFkZXJDbGFzczogJ2hlYWRlci1jaGVja2JveC1zZWxlY3Rpb24tY2VsbCcsXG4gICAgICAgIHJlc2l6YWJsZTogZmFsc2UsXG4gICAgICAgIHBpbm5lZDogJ2xlZnQnLFxuICAgICAgICBsb2NrUG9zaXRpb246IHRydWUsXG4gICAgICAgIGluY2x1ZGVJblNlYXJjaDogZmFsc2VcbiAgICAgIH07XG4gICAgICByZXR1cm4gW2NoZWNrYm94ZXNDb2x1bW4sIC4uLmNvbHVtbkRlZnNdO1xuICAgIH1cbiAgICByZXR1cm4gY29sdW1uRGVmcztcbiAgfVxuXG4gIHByaXZhdGUgaW5pdE9uUm93U2VsZWN0ZWRGb3JTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7IGdyaWRPcHRpb25zIH06IE5vcm1hbGl6ZU9wdGlvbnNQYXJhbXMpIHtcbiAgICBpZiAoIXRoaXMuaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihncmlkT3B0aW9ucykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXh0ZXJuYWxPblJvd1NlbGVjdGVkID0gZ3JpZE9wdGlvbnMub25Sb3dTZWxlY3RlZDtcbiAgICBncmlkT3B0aW9ucy5vblJvd1NlbGVjdGVkID0gKGV2dDogUm93U2VsZWN0ZWRFdmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZ3JpZFF1ZXJ5LmlzU2VydmVyU2VsZWN0QWxsUm93c0VuYWJsZWQpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGV2dC5ub2RlO1xuICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gbm9kZS5pc1NlbGVjdGVkKCk7XG4gICAgICAgIGNvbnN0IHsgZXhjbHVkZWRGcm9tU2VsZWN0QWxsIH0gPSB0aGlzLmdyaWRRdWVyeS5zZXJ2ZXJTaWRlQ29uZmlnO1xuICAgICAgICBjb25zdCBpc0V4Y2x1ZGVkID0gZXhjbHVkZWRGcm9tU2VsZWN0QWxsLmluY2x1ZGVzKG5vZGUuaWQpO1xuICAgICAgICBpZiAoaXNTZWxlY3RlZCAmJiBpc0V4Y2x1ZGVkKSB7XG4gICAgICAgICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7XG4gICAgICAgICAgICBleGNsdWRlZEZyb21TZWxlY3RBbGw6IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbC5maWx0ZXIoKG5vZGVJZDogc3RyaW5nKSA9PiBub2RlSWQgIT09IG5vZGUuaWQpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzU2VsZWN0ZWQgJiYgIWlzRXhjbHVkZWQpIHtcbiAgICAgICAgICB0aGlzLnNldFNlcnZlclNpZGVQYWdpbmF0aW9uKHsgZXhjbHVkZWRGcm9tU2VsZWN0QWxsOiBbLi4uZXhjbHVkZWRGcm9tU2VsZWN0QWxsLCBub2RlLmlkXSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGV4dGVybmFsT25Sb3dTZWxlY3RlZCkge1xuICAgICAgICBleHRlcm5hbE9uUm93U2VsZWN0ZWQoZXZ0KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSByb3dNYXRjaGVzU2VhcmNoKHJvdzogUm93Tm9kZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSAodGhpcy5ncmlkUXVlcnkuZ2V0U2VhcmNoVGVybSgpIHx8ICcnKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICBpZiAoaXNFbXB0eShzZWFyY2hUZXJtKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLmluY2x1ZGVIaWRkZW5Db2x1bW5zSW5TZWFyY2hcbiAgICAgID8gdGhpcy5ncmlkUXVlcnkuZ2V0QWxsQ29sdW1ucygpXG4gICAgICA6IHRoaXMuZ3JpZFF1ZXJ5LmdldEFsbERpc3BsYXllZENvbHVtbnMoKTtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2x1bW5zKSB7XG4gICAgICBjb25zdCBjb2xEZWYgPSB0aGlzLmFwaS5ncmlkLmdldENvbHVtbkRlZihjb2wuZ2V0Q29sSWQoKSkgYXMgRGF0b0dyaWRDb2x1bW5EZWY7XG4gICAgICBpZiAoIWNvbERlZi5pbmNsdWRlSW5TZWFyY2gpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCByb3dWYWx1ZSA9ICh0aGlzLmFwaS5ncmlkLmdldFZhbHVlKGNvbC5nZXRDb2xJZCgpLCByb3cpIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAocm93VmFsdWUuaW5jbHVkZXMoc2VhcmNoVGVybSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZml0R3JpZCgnY29udGFpbmVyJykgaW5zdGVhZFxuICAgKi9cbiAgZml0VG9Db250YWluZXIoKSB7XG4gICAgdGhpcy5hcGkuZ3JpZC5zaXplQ29sdW1uc1RvRml0KCk7XG4gIH1cblxuICBnZXRDdXN0b21IZWFkZXIoZmllbGQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmN1c3RvbUhlYWRlcnNUZW1wbGF0ZXMpIHtcbiAgICAgIGNvbnN0IHNwZWNpZmljID0gdGhpcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzLmZpbmQoKHsgY29sdW1uIH0pID0+IGNvbHVtbiA9PT0gZmllbGQpO1xuICAgICAgY29uc3QgY29tbW9uID0gdGhpcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzLmZpbmQoKHsgY29sdW1uIH0pID0+ICFjb2x1bW4pO1xuICAgICAgaWYgKHNwZWNpZmljIHx8IGNvbW1vbikge1xuICAgICAgICBjb25zdCB7IG1vcmVNZW51LCBjdXN0b21IZWFkZXIgfSA9IHtcbiAgICAgICAgICBtb3JlTWVudTogKHNwZWNpZmljICYmIHNwZWNpZmljLm1vcmVNZW51KSB8fCAoY29tbW9uICYmIGNvbW1vbi5tb3JlTWVudSksXG4gICAgICAgICAgY3VzdG9tSGVhZGVyOiAoc3BlY2lmaWMgJiYgc3BlY2lmaWMuY3VzdG9tSGVhZGVyKSB8fCAoY29tbW9uICYmIGNvbW1vbi5jdXN0b21IZWFkZXIpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7IG1vcmVNZW51OiBtb3JlTWVudSAmJiBtb3JlTWVudS50cGwsIGN1c3RvbUhlYWRlcjogY3VzdG9tSGVhZGVyICYmIGN1c3RvbUhlYWRlci50cGwgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjbGVhckFsbEZpbHRlcnMoKSB7XG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncyxcbiAgICAgICAgICBmaWx0ZXI6IHt9LFxuICAgICAgICAgIHNlYXJjaFRlcm06IG51bGxcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLm5vdGlmeUZpbHRlclVwZGF0ZSgpO1xuICB9XG5cbiAgY2xlYXJDb2x1bW5GaWx0ZXIoY29sdW1uRmllbGQ6IHN0cmluZykge1xuICAgIGNvbnN0IHsgW2NvbHVtbkZpZWxkXTogZGVsZXRlZCwgLi4uZmlsdGVyIH0gPSB0aGlzLmdyaWRRdWVyeS5nZXRGaWx0ZXIoKTtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLFxuICAgICAgICAgIGZpbHRlclxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMubm90aWZ5RmlsdGVyVXBkYXRlKCk7XG4gIH1cblxuICBzZXRDb2x1bW5GaWx0ZXIoY29sdW1uOiBDb2x1bW4sIGZpbHRlcjogRGF0b0dyaWRGaWx0ZXIsIG5vdGlmeUdyaWQgPSB0cnVlKSB7XG4gICAgdGhpcy5fbG9nRXZlbnQoQ29yZUV2ZW50VHlwZXMuR1JJRF9GSUxURVJfQVBQTElFRCwge1xuICAgICAgY29sdW1uOiBjb2x1bW4uZ2V0Q29sSWQoKSxcbiAgICAgIG51bU9mQ29uZGl0aW9uczogKGZpbHRlci5jb25kaXRpb25hbCAmJiBmaWx0ZXIuY29uZGl0aW9uYWwuY29uZGl0aW9ucy5sZW5ndGgpIHx8IDAsXG4gICAgICBieVZhbHVlOiAhIWZpbHRlci5ieVZhbHVlID8gJ1llcycgOiAnTm8nXG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZUZpbHRlcihjb2x1bW4sIGZpbHRlcik7XG5cbiAgICBpZiAobm90aWZ5R3JpZCkge1xuICAgICAgdGhpcy5ub3RpZnlGaWx0ZXJVcGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBzZXRHcmlkRmlsdGVycyhmaWx0ZXJzOiBEYXRvR3JpZEV4dGVybmFsRmlsdGVyW10pIHtcbiAgICBpZiAodGhpcy5hcGkgJiYgZmlsdGVycykge1xuICAgICAgbGV0IGFwcGxpZWRGaWx0ZXIgPSB7fTtcblxuICAgICAgZm9yIChjb25zdCB7IGZpbHRlciwgZmllbGQgfSBvZiBmaWx0ZXJzKSB7XG4gICAgICAgIGFwcGxpZWRGaWx0ZXJbZmllbGRdID0gZmlsdGVyO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKHsgZmlsdGVyOiBhcHBsaWVkRmlsdGVyIH0pO1xuICAgICAgdGhpcy5ub3RpZnlGaWx0ZXJVcGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBzZXRTb3J0QnlDb2x1bW4oY29sSWQsIHNvcnQpIHtcbiAgICBjb25zdCBzb3J0VG9TZXQgPSB0aGlzLmdyaWRRdWVyeS5nZXRTb3J0KHsgY29sSWQsIHNvcnQgfSk7XG5cbiAgICB0aGlzLnNldEdyaWRTb3J0KHNvcnRUb1NldCk7XG4gIH1cblxuICBzZXRHcmlkU29ydChncmlkU29ydDogRGF0b0dyaWRTb3J0KSB7XG4gICAgaWYgKGdyaWRTb3J0ICYmIHRoaXMuYXBpICYmIHRoaXMuYXBpLmdyaWQuZ2V0RGlzcGxheWVkUm93Q291bnQoKSA+IDApIHtcbiAgICAgIGNvbnN0IHsgY29sSWQsIHNvcnQsIHNvcnRJbmRleCB9ID0gZ3JpZFNvcnQ7XG4gICAgICBjb25zdCBncmlkQ29sdW1ucyA9IHRoaXMuYXBpLmNvbHVtbnMuZ2V0QWxsR3JpZENvbHVtbnMoKTtcblxuICAgICAgaWYgKGdyaWRDb2x1bW5zKSB7XG4gICAgICAgIGxldCBzb3J0VG9BcHBseSA9IGdyaWRTb3J0O1xuICAgICAgICAvKiogU29ydCBieSBjb2x1bW4gaWQgKi9cbiAgICAgICAgY29uc3QgY29sdW1uQnlJZCA9IGdyaWRDb2x1bW5zLmZpbmQoKGNvbDogQ29sdW1uKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChjb2wuZ2V0Q29sRGVmKCkuc2hvd1Jvd0dyb3VwIHx8IGNvbC5nZXRDb2xJZCgpKSA9PT0gY29sSWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChjb2x1bW5CeUlkKSB7XG4gICAgICAgICAgc29ydFRvQXBwbHkgPSB7IGNvbElkOiBjb2x1bW5CeUlkLmdldENvbElkKCksIHNvcnQgfTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNOaWwoc29ydEluZGV4KSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlQ29sdW1ucyA9IHRoaXMuYXBpLmNvbHVtbnMuZ2V0VmFsdWVDb2x1bW5zKCk7XG4gICAgICAgICAgY29uc3QgdmFsdWVDb2x1bW4gPSB2YWx1ZUNvbHVtbnMuZmluZCgoY29sOiBDb2x1bW4pID0+IGNvbC5nZXRDb2xJZCgpID09PSBjb2xJZCk7XG4gICAgICAgICAgY29uc3QgaXNQaXZvdENvbElkID0gY29sSWQuc3RhcnRzV2l0aCgncGl2b3QnKTtcblxuICAgICAgICAgIGlmIChpc1Bpdm90Q29sSWQgfHwgdmFsdWVDb2x1bW4pIHtcbiAgICAgICAgICAgIC8qKiBDb2x1bW4gaXMgcGl2b3QgdmFsdWUgY29sdW1uLCBzb3J0IGJ5IGluZGV4ICovXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5CeUluZGV4ID0gZ3JpZENvbHVtbnNbc29ydEluZGV4XTtcblxuICAgICAgICAgICAgc29ydFRvQXBwbHkgPSB7IGNvbElkOiBjb2x1bW5CeUluZGV4LmdldENvbElkKCksIHNvcnQsIHNvcnRJbmRleCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlU2V0dGluZ3MoeyBzb3J0OiBzb3J0VG9BcHBseSB9KTtcbiAgICAgICAgdGhpcy5hcGkuZ3JpZC5zZXRTb3J0TW9kZWwoW3NvcnRUb0FwcGx5XSk7XG5cbiAgICAgICAgaWYgKCh0aGlzLmdyaWRSZWYuZ3JpZE9wdGlvbnMgYXMgRGF0b0dyaWRPcHRpb25zKS51c2VQaXZvdEdyaWRTdHlsZSkge1xuICAgICAgICAgIHRoaXMuYXBpLmdyaWQucmVkcmF3Um93cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGaWx0ZXIoY29sdW1uOiBDb2x1bW4sIGZpbHRlcjogRGF0b0dyaWRGaWx0ZXIpIHtcbiAgICBjb25zdCBjb2xGaWVsZCA9IGdldENvbEZpZWxkKGNvbHVtbi5nZXRDb2xEZWYoKSk7XG5cbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLFxuICAgICAgICAgIGZpbHRlcjoge1xuICAgICAgICAgICAgLi4uc3RhdGUuc2V0dGluZ3MuZmlsdGVyLFxuICAgICAgICAgICAgW2NvbEZpZWxkXTogZmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc2V0U2VhcmNoVGVybShzZWFyY2hUZXJtOiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLFxuICAgICAgICAgIHNlYXJjaFRlcm1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLm5vdGlmeUZpbHRlclVwZGF0ZSgpO1xuICB9XG5cbiAgc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oY29uZmlnOiBQYXJ0aWFsPFNlcnZlclNpZGVQYWdpbmF0aW9uQ29uZmlnPikge1xuICAgIHRoaXMuc3RvcmUudXBkYXRlKHN0YXRlID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlcnZlclNpZGVQYWdpbmF0aW9uOiB7XG4gICAgICAgICAgLi4uc3RhdGUuc2VydmVyU2lkZVBhZ2luYXRpb24sXG4gICAgICAgICAgLi4uY29uZmlnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBzZXRMb2FkaW5nKHNob3c6IGJvb2xlYW4pIHtcbiAgICBpZiAoc2hvdykge1xuICAgICAgdGhpcy5hcGkuZ3JpZC5zaG93TG9hZGluZ092ZXJsYXkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hcGkuZ3JpZC5nZXREaXNwbGF5ZWRSb3dDb3VudCgpID09PSAwID8gdGhpcy5zZXRPdmVybGF5KHRydWUpIDogdGhpcy5zZXRPdmVybGF5KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHNldE92ZXJsYXkgaW5zdGVhZFxuICAgKiBAcGFyYW0gc2hvd1xuICAgKi9cbiAgc2V0Tm9EYXRhKHNob3c6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldE92ZXJsYXkoc2hvdyk7XG4gIH1cblxuICBzZXRPdmVybGF5KHNob3c6IGJvb2xlYW4pIHtcbiAgICBzaG93ID8gdGhpcy5hcGkuZ3JpZC5zaG93Tm9Sb3dzT3ZlcmxheSgpIDogdGhpcy5hcGkuZ3JpZC5oaWRlT3ZlcmxheSgpO1xuICB9XG5cbiAgdXBkYXRlU2V0dGluZ3Moc2V0dGluZ3M6IFBhcnRpYWw8RGF0b0dyaWRTZXR0aW5ncz4pIHtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLFxuICAgICAgICAgIC4uLnNldHRpbmdzXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBmaXRHcmlkKHRvOiAnY29udGFpbmVyJyB8ICdjb250ZW50Jykge1xuICAgIHRvID09PSAnY29udGFpbmVyJyA/IHRoaXMuYXBpLmdyaWQuc2l6ZUNvbHVtbnNUb0ZpdCgpIDogdGhpcy5hcGkuY29sdW1ucy5hdXRvU2l6ZUFsbENvbHVtbnMoKTtcbiAgICBjb25zdCBncmlkQWxpZ25tZW50ID0gdG8gPT09ICdjb250YWluZXInID8gRGF0b0dyaWRBbGlnbm1lbnQuRklUX1RPX0NPTlRBSU5FUiA6IERhdG9HcmlkQWxpZ25tZW50LkZJVF9UT19DT05URU5UO1xuICAgIHRoaXMudXBkYXRlU2V0dGluZ3MoeyBncmlkQWxpZ25tZW50LCBjb2x1bW5zU2l6ZXM6IG51bGwgfSk7XG4gIH1cblxuICBzYXZlU2V0dGluZ3NUb1NlcnZlcihzZXR0aW5nczogUGFydGlhbDxEYXRvR3JpZFNldHRpbmdzPikge1xuICAgIGNvbnN0IGlzR2xvYmFsID0gdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKS5pc0dsb2JhbFNldHRpbmdzO1xuICAgIHRoaXMuc3RvcmFnZUFQSS5zZXQodGhpcy5ncmlkTmFtZSwgc2V0dGluZ3MsIGlzR2xvYmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgdXNlZCB0byBsb2cgZ3JpZCBldmVudHMgdG8gdGhlIHBsYXRmb3JtJ3MgbG9nZ2luZyBzZXJ2aWNlXG4gICAqL1xuICBfbG9nRXZlbnQoZXZlbnRUeXBlOiBDb3JlRXZlbnRUeXBlcywgZXZlbnRQcm9wZXJ0aWVzPzogSGFzaE1hcDxhbnk+KSB7XG4gICAgdGhpcy5sb2dnZXIubG9nRXZlbnQoZXZlbnRUeXBlLCB7IHRhYmxlOiB0aGlzLmdyaWROYW1lLCAuLi5ldmVudFByb3BlcnRpZXMgfSk7XG4gIH1cblxuICBwcml2YXRlIHdyYXBTdWNjZXNzQ2FsbGJhY2soeyBzdWNjZXNzQ2IsIHBhZ2VOdW1iZXIsIGlzUGVuZGluZ1JldHVyblRvUGFnZSB9OiBTdWNjZXNzV3JhcHBlclBhcmFtcykge1xuICAgIHJldHVybiAocm93c1RoaXNCbG9jazogYW55W10sIHRvdGFsUm93czogbnVtYmVyKSA9PiB7XG4gICAgICB0aGlzLnNldFNlcnZlclNpZGVQYWdpbmF0aW9uKHsgdG90YWxSb3dzLCBoYXNFcnJvcjogZmFsc2UgfSk7XG4gICAgICBzdWNjZXNzQ2Iocm93c1RoaXNCbG9jaywgdG90YWxSb3dzKTtcbiAgICAgIHRoaXMuZ3JpZFF1ZXJ5Ll9zZXJ2ZXJEYXRhTG9hZGVkLm5leHQoe1xuICAgICAgICBhcGk6IHRoaXMuYXBpLmdyaWQsXG4gICAgICAgIGNvbHVtbkFwaTogdGhpcy5hcGkuY29sdW1ucyxcbiAgICAgICAgdHlwZTogJ1NlcnZlckRhdGFMb2FkZWQnLFxuICAgICAgICBwYWdpbmF0aW9uUGFnZTogcGFnZU51bWJlclxuICAgICAgfSk7XG4gICAgICBpZiAoIWlzUGVuZGluZ1JldHVyblRvUGFnZSkge1xuICAgICAgICB0aGlzLnNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgICAvKiogc28gdGhlIGdyaWQgZml0cyBpbiBldmVyeSBuZXcgZGF0YSBpbnB1dCAqL1xuICAgICAgICB0cmlnZ2VyV2luZG93UmVzaXplKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmxhc3RUb3RhbFJvd3MgPSB0b3RhbFJvd3M7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgd3JhcEdldFJvd3Mob3B0aW9uczogRGF0b0dyaWRPcHRpb25zLCBnZXRSb3dzPzogKHBhcmFtczogRGF0b0dyaWRHZXRSb3dzUGFyYW1zKSA9PiB2b2lkKSB7XG4gICAgY29uc3QgZ2V0Um93c0NiID0gZ2V0Um93cyB8fCBvcHRpb25zLmRhdGFzb3VyY2UuZ2V0Um93cztcbiAgICByZXR1cm4gKGdldFJvd3NQYXJhbXM6IElHZXRSb3dzUGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCB7IHN0YXJ0Um93LCBlbmRSb3csIHNvcnRNb2RlbCwgc3VjY2Vzc0NhbGxiYWNrIH0gPSBnZXRSb3dzUGFyYW1zO1xuICAgICAgY29uc3QgcGFnZVNpemUgPSBvcHRpb25zLnBhZ2luYXRpb25QYWdlU2l6ZSB8fCAxMDA7XG4gICAgICBjb25zdCBpc1JldHVyblRvQ3VycmVudFBhZ2VSZXF1aXJlZCA9IHRoaXMucGFnZU51bWJlclRvUmV0dXJuQWZ0ZXJSZWZyZXNoID4gMDtcbiAgICAgIGNvbnN0IGlzUGVuZGluZ1JldHVyblRvUGFnZSA9IGlzUmV0dXJuVG9DdXJyZW50UGFnZVJlcXVpcmVkICYmIHN0YXJ0Um93ID09PSAwO1xuXG4gICAgICBjb25zdCBwYWdlTnVtYmVyID0gaXNSZXR1cm5Ub0N1cnJlbnRQYWdlUmVxdWlyZWRcbiAgICAgICAgPyB0aGlzLnBhZ2VOdW1iZXJUb1JldHVybkFmdGVyUmVmcmVzaCArIDFcbiAgICAgICAgOiBNYXRoLmNlaWwoZW5kUm93IC8gcGFnZVNpemUpO1xuXG4gICAgICB0aGlzLnBhZ2VOdW1iZXJUb1JldHVybkFmdGVyUmVmcmVzaCA9IC0xO1xuXG4gICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmdyaWRRdWVyeS5nZXRGaWx0ZXIoKTtcbiAgICAgIGNvbnN0IG5ld1BhcmFtczogRGF0b0dyaWRHZXRSb3dzUGFyYW1zID0ge1xuICAgICAgICAuLi5nZXRSb3dzUGFyYW1zLFxuICAgICAgICBmYWlsQ2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnNldFNlcnZlclNpZGVQYWdpbmF0aW9uKHsgaGFzRXJyb3I6IHRydWUgfSk7XG4gICAgICAgICAgdGhpcy5zZXRPdmVybGF5KHRydWUpO1xuICAgICAgICB9LFxuICAgICAgICBzdWNjZXNzQ2FsbGJhY2s6IHRoaXMud3JhcFN1Y2Nlc3NDYWxsYmFjayh7IHBhZ2VOdW1iZXIsIHN1Y2Nlc3NDYjogc3VjY2Vzc0NhbGxiYWNrLCBpc1BlbmRpbmdSZXR1cm5Ub1BhZ2UgfSksXG4gICAgICAgIHNlcnZlckNvbmZpZzoge1xuICAgICAgICAgIHBhZ2VTaXplLFxuICAgICAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICAgICAgY29sdW1uRmlsdGVyczogaXNFbXB0eShmaWx0ZXIpIHx8IG9wdGlvbnMuZW5hYmxlVjJfMSA/IG51bGwgOiB0aGlzLmJ1aWxkU2VydmVyUmVxdWVzdEZpbHRlcnMoZmlsdGVyKSxcbiAgICAgICAgICBmaWx0ZXI6IG9wdGlvbnMuZW5hYmxlVjJfMSA/IHRoaXMuYnVpbGRTZXJ2ZXJSZXF1ZXN0RmlsdGVyc192Ml8xKG9wdGlvbnMuY29sdW1uRGVmcykgOiBudWxsLFxuICAgICAgICAgIHNvcnQ6IHRoaXMuYnVpbGRTZXJ2ZXJSZXF1ZXN0U29ydChzb3J0TW9kZWwpXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAoaXNQZW5kaW5nUmV0dXJuVG9QYWdlKSB7XG4gICAgICAgIC8vIFNjZW5hcmlvIHRoZSBmb2xsb3dpbmcgaGFuZGxlcyAtIHNlcnZlciByZWZyZXNoIHdoZXJlIGl0IHdhcyByZXF1ZXN0ZWQgdG8ga2VlcCB0aGUgY3VycmVudCBwYWdlLlxuICAgICAgICAvLyBUaGUgcHJvYmxlbSAtIGdldFJvd3Mgd2lsbCBpbml0aWFsbHkgYmUgY2FsbGVkIGZvciBwYWdlIDEgKGF1dG9tYXRpY2FsbHkgaGFwcGVucyB3aGVuIGNhbGxpbmcgYWctZ3JpZCdzIHNldERhdGFTb3VyY2UpLlxuICAgICAgICAvLyBJbiBvcmRlciB0byB0cmlnZ2VyIGl0IGFnYWluLCBzdWNjZXNzQ2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggdGhlIGRlc2lyZWQgcGFnZS5cbiAgICAgICAgLy8gZmFrZUdldFJvd3MgaXMgdXNlZCBpbiBvcmRlciB0byBhdm9pZCByZXRyaWV2aW5nIHRoZSB1bm5lY2Vzc2FyeSByZWFsIGRhdGEgZm9yIHBhZ2UgMS5cbiAgICAgICAgY29uc3QgZmFrZUdldFJvd3MgPSAoeyBzdWNjZXNzQ2FsbGJhY2sgfTogRGF0b0dyaWRHZXRSb3dzUGFyYW1zKSA9PiB7XG4gICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKFtdLCB0aGlzLmxhc3RUb3RhbFJvd3MpO1xuICAgICAgICB9O1xuICAgICAgICBmYWtlR2V0Um93cyhuZXdQYXJhbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2V0Um93c0NiKG5ld1BhcmFtcyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEVkaXRhYmxlQ29sdW1uc0NlbGxDbGFzcyhwYXJhbXM6IE5vcm1hbGl6ZU9wdGlvbnNQYXJhbXMpIHtcbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuY29sdW1uRGVmcy5mb3JFYWNoKGNvbERlZiA9PiB7XG4gICAgICBpZiAoY29sRGVmLmVkaXRhYmxlKSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGNvbERlZi5lZGl0YWJsZSkpIHtcbiAgICAgICAgICBjb25zdCBpbml0aWFsQ2VsbENsYXNzID0gY29sRGVmLmNlbGxDbGFzcztcbiAgICAgICAgICBjb2xEZWYuY2VsbENsYXNzID0gKGNlbGxDbGFzc1BhcmFtczogQ2VsbENsYXNzUGFyYW1zKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0VkaXRhYmxlID0gKGNvbERlZi5lZGl0YWJsZSBhcyBGdW5jdGlvbikoY2VsbENsYXNzUGFyYW1zIGFzIGFueSk7XG4gICAgICAgICAgICBpZiAoaXNFZGl0YWJsZSkge1xuICAgICAgICAgICAgICBjb25zdCBlZGl0YWJsZVJlc3VsdCA9IHRoaXMuYWRkRWRpdGFibGVDZWxsQ2xhc3MoaW5pdGlhbENlbGxDbGFzcyk7XG4gICAgICAgICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKGVkaXRhYmxlUmVzdWx0KSA/IGVkaXRhYmxlUmVzdWx0KGNlbGxDbGFzc1BhcmFtcykgOiBlZGl0YWJsZVJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKGluaXRpYWxDZWxsQ2xhc3MpID8gaW5pdGlhbENlbGxDbGFzcyhjZWxsQ2xhc3NQYXJhbXMpIDogaW5pdGlhbENlbGxDbGFzcztcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbERlZi5jZWxsQ2xhc3MgPSB0aGlzLmFkZEVkaXRhYmxlQ2VsbENsYXNzKGNvbERlZi5jZWxsQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHdyYXBDb250ZXh0TWVudUJ1aWxkZXIocGFyYW1zOiBOb3JtYWxpemVPcHRpb25zUGFyYW1zKSB7XG4gICAgY29uc3QgeyBjdXN0b21Db250ZXh0TWVudSB9ID0gcGFyYW1zLmdyaWRPcHRpb25zO1xuICAgIGNvbnN0IGFsbEFjdGlvbnMgPSBpc0Z1bmN0aW9uKGN1c3RvbUNvbnRleHRNZW51KSA/IGN1c3RvbUNvbnRleHRNZW51KHBhcmFtcy5yb3dBY3Rpb25zKSA6IHBhcmFtcy5yb3dBY3Rpb25zO1xuICAgIHRoaXMudHJhbnNsYXRlQWN0aW9uTGFiZWxzKGFsbEFjdGlvbnMpO1xuICAgIGNvbnN0IGNvcHlBY3Rpb246IFJvd0FjdGlvbiA9IHtcbiAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oJ2NvcmUuY29weS1jZWxsJyksXG4gICAgICBpY29uOiAnY29weScsXG4gICAgICBrZXk6ICdDb3B5IENlbGwnXG4gICAgfTtcbiAgICByZXR1cm4gKHsgbm9kZSwgY29sdW1uLCBjb250ZXh0IH06IEdldENvbnRleHRNZW51SXRlbXNQYXJhbXMpID0+IHtcbiAgICAgIGNvbnN0IG9uSG92ZXJBY3Rpb25NZW51ID0gY29udGV4dCAmJiBjb250ZXh0LmNvbnRleHRNZW51ICYmIGNvbnRleHQuY29udGV4dE1lbnUuZnJvbU9uSG92ZXI7XG4gICAgICBpZiAoIW5vZGUpIHJldHVybiBbXTtcbiAgICAgIGxldCBzZWxlY3RlZCA9IFtub2RlXTtcbiAgICAgIGxldCByb3dzQ291bnQgPSAxO1xuICAgICAgaWYgKG9uSG92ZXJBY3Rpb25NZW51KSB7XG4gICAgICAgIHRoaXMudXBkYXRlR3JpZENvbnRleHQoeyBjb250ZXh0TWVudTogeyBmcm9tT25Ib3ZlcjogZmFsc2UgfSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvcHlBY3Rpb24ub25DbGljayA9IChbcm93XSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gdGhpcy5hcGkuZ3JpZC5nZXRWYWx1ZShjb2x1bW4uZ2V0Q29sSWQoKSwgcm93KTtcbiAgICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBjb2x1bW4uZ2V0Q29sRGVmKCkudmFsdWVGb3JtYXR0ZXI7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBmb3JtYXR0ZXIgPyBmb3JtYXR0ZXIocmF3VmFsdWUpIDogcmF3VmFsdWU7XG4gICAgICAgICAgY29weVRvQ2xpcGJvYXJkKHZhbHVlKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG5vZGUuaXNTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgc2VsZWN0ZWQgPSB0aGlzLmdyaWRRdWVyeS5nZXRTZWxlY3RlZFJvd05vZGVzKCk7XG4gICAgICAgICAgcm93c0NvdW50ID0gc2l6ZShzZWxlY3RlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHZpc2libGVBY3Rpb25zID0gZ2V0VmlzaWJsZUFjdGlvbnMoXG4gICAgICAgIGFsbEFjdGlvbnMsXG4gICAgICAgIHJvd3NDb3VudCxcbiAgICAgICAgc2VsZWN0ZWQsXG4gICAgICAgIHRoaXMuZ3JpZFF1ZXJ5LmlzU2VydmVyU2VsZWN0QWxsUm93c0VuYWJsZWRcbiAgICAgICkuZmlsdGVyKCh7IHZpc2libGUgfSkgPT4gdmlzaWJsZSk7XG4gICAgICBsZXQgdG9vbGJhckFjdGlvbnMgPSBbY29weUFjdGlvbl07XG4gICAgICBpZiAob25Ib3ZlckFjdGlvbk1lbnUpIHtcbiAgICAgICAgdG9vbGJhckFjdGlvbnMgPSB2aXNpYmxlQWN0aW9ucztcbiAgICAgIH0gZWxzZSBpZiAodmlzaWJsZUFjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0b29sYmFyQWN0aW9ucyA9IFt7IC4uLmNvcHlBY3Rpb24sIHNlcGFyYXRvcjogdHJ1ZSB9LCAuLi52aXNpYmxlQWN0aW9uc107XG4gICAgICB9XG4gICAgICBjb25zdCBjb252ZXJ0ZXJQYXJhbXM6IEFjdGlvbkNvbnZlcnRlclBhcmFtcyA9IHtcbiAgICAgICAgdG9vbGJhckFjdGlvbnMsXG4gICAgICAgIHNlbGVjdGVkUm93czogc2VsZWN0ZWQsXG4gICAgICAgIGljb25SZWdpc3RyeTogdGhpcy5zdmdSZWdpc3RyeSxcbiAgICAgICAgbm9kZSxcbiAgICAgICAgbG9nZ2VyOiB7XG4gICAgICAgICAgbG9nOiB0aGlzLl9sb2dFdmVudC5iaW5kKHRoaXMpLFxuICAgICAgICAgIGV2ZW50T3JpZ2luOiBvbkhvdmVyQWN0aW9uTWVudSA/ICdPbiBIb3ZlcicgOiAnQ29udGV4dCBNZW51J1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHRvb2xiYXJBY3Rpb25Ub0NvbnRleHRBY3Rpb24oY29udmVydGVyUGFyYW1zKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2xhdGVBY3Rpb25MYWJlbHMoYWxsQWN0aW9uczogUm93QWN0aW9uW10pIHtcbiAgICBhbGxBY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgIGFjdGlvbi5sYWJlbCA9IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShhY3Rpb24ubGFiZWwpO1xuICAgICAgaWYgKGFjdGlvbi5zdWJNZW51KSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlQWN0aW9uTGFiZWxzKGFjdGlvbi5zdWJNZW51KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRTYXZlZFNldHRpbmdzKHNldHRpbmdzOiBQYXJ0aWFsPERhdG9HcmlkU2V0dGluZ3M+KSB7XG4gICAgY29uc3Qge1xuICAgICAgc29ydCxcbiAgICAgIGhpZGRlbkNvbHVtbnMsXG4gICAgICBmaWx0ZXIsXG4gICAgICBncm91cGVkQ29sdW1ucyxcbiAgICAgIGNvbHVtbnNTaXplcyxcbiAgICAgIHBpbm5lZENvbHVtbnMsXG4gICAgICBjb2x1bW5zT3JkZXIsXG4gICAgICBncmlkQWxpZ25tZW50XG4gICAgfSA9IHNldHRpbmdzO1xuICAgIGNvbnN0IHsgZ3JpZCwgY29sdW1ucyB9ID0gdGhpcy5hcGk7XG4gICAgLyogSGlkZSBjb2x1bW5zICovXG4gICAgLyogTk9URTogY29sdW1ucyBvcmRlciBhcmUgdHJlYXRlZCBhcyB0aGUgY3VycmVudGx5IHZpc2libGUgY29sdW1ucyAqL1xuICAgIGNvbHVtbnMuc2V0Q29sdW1uc1Zpc2libGUodGhpcy5pbml0aWFsU2V0dGluZ3MuY29sdW1uc09yZGVyLCB0cnVlKTtcbiAgICBjb25zdCBjb2x1bW5Ub0hpZGUgPSAhaXNOaWwoaGlkZGVuQ29sdW1ucykgPyBoaWRkZW5Db2x1bW5zIDogdGhpcy5pbml0aWFsU2V0dGluZ3MuaGlkZGVuQ29sdW1ucztcbiAgICBjb2x1bW5zLnNldENvbHVtbnNWaXNpYmxlKGNvbHVtblRvSGlkZSwgZmFsc2UpO1xuXG4gICAgLyogQXBwbHkgZmlsdGVycyAqL1xuICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgIGdyaWQub25GaWx0ZXJDaGFuZ2VkKCk7XG4gICAgfVxuXG4gICAgLyogR3JvdXAgY29sdW1ucyAqL1xuICAgIGNvbnN0IGFsbEdyb3VwZWRDb2x1bW5zID0gY29sdW1ucy5nZXRSb3dHcm91cENvbHVtbnMoKTtcbiAgICBsZXQgcmVtb3ZlR3JvdXBlZDtcbiAgICBpZiAoZ3JvdXBlZENvbHVtbnMpIHtcbiAgICAgIHJlbW92ZUdyb3VwZWQgPSBhbGxHcm91cGVkQ29sdW1ucy5maWx0ZXIoY29sID0+ICFncm91cGVkQ29sdW1ucy5pbmNsdWRlcyhjb2wuZ2V0Q29sSWQoKSkpO1xuICAgICAgY29sdW1ucy5hZGRSb3dHcm91cENvbHVtbnMoZ3JvdXBlZENvbHVtbnMpO1xuICAgICAgY29sdW1ucy5zZXRDb2x1bW5zVmlzaWJsZShncm91cGVkQ29sdW1ucywgZmFsc2UpO1xuICAgIH1cbiAgICBjb2x1bW5zLnJlbW92ZVJvd0dyb3VwQ29sdW1ucyhyZW1vdmVHcm91cGVkKTtcbiAgICBjb2x1bW5zLnNldENvbHVtbnNWaXNpYmxlKHJlbW92ZUdyb3VwZWQsIHRydWUpO1xuXG4gICAgLyogQXBwbHkgc29ydCAqL1xuICAgIGNvbnN0IGdyaWRTb3J0ID0gc29ydCB8fCB0aGlzLmluaXRpYWxTZXR0aW5ncy5zb3J0O1xuICAgIGdyaWQuc2V0U29ydE1vZGVsKGdyaWRTb3J0ID8gW2dyaWRTb3J0XSA6IG51bGwpO1xuXG4gICAgLyogQWxpZ24gZ3JpZCAqL1xuICAgIGlmIChncmlkQWxpZ25tZW50ID09PSBEYXRvR3JpZEFsaWdubWVudC5DVVNUT00pIHtcbiAgICAgIC8qIFNldCBjb2x1bW4gc2l6ZXMgKi9cbiAgICAgIGNvbHVtbnNTaXplcyAmJlxuICAgICAgICBPYmplY3Qua2V5cyhjb2x1bW5zU2l6ZXMpLmZvckVhY2goY29sSWQgPT4ge1xuICAgICAgICAgIGlmIChjb2x1bW5zU2l6ZXNbY29sSWRdID09PSBEYXRvR3JpZEFsaWdubWVudC5GSVRfVE9fQ09OVEVOVCkge1xuICAgICAgICAgICAgY29sdW1ucy5hdXRvU2l6ZUNvbHVtbihjb2xJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbHVtbnMuc2V0Q29sdW1uV2lkdGgoY29sSWQsIGNvbHVtbnNTaXplc1tjb2xJZF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyaWRBbGlnbm1lbnQgPT09IERhdG9HcmlkQWxpZ25tZW50LkZJVF9UT19DT05URU5UID8gY29sdW1ucy5hdXRvU2l6ZUFsbENvbHVtbnMoKSA6IGdyaWQuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xuICAgIH1cblxuICAgIC8qIFBpbiBjb2x1bW5zIGxlZnQgKi9cbiAgICBjb25zdCBmaWx0ZXJlZFBpbm5lZENvbHVtbnMgPSBwaW5uZWRDb2x1bW5zXG4gICAgICA/IHBpbm5lZENvbHVtbnMuZmlsdGVyKChjb2w6IHN0cmluZykgPT4gY29sICE9PSB0aGlzLkNIRUNLQk9YX1NFTEVDVElPTl9DT0xfSUQpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgZmlsdGVyZWRDb2x1bW5zID0gY29sdW1uc09yZGVyXG4gICAgICA/IGNvbHVtbnNPcmRlci5maWx0ZXIoKGNvbDogc3RyaW5nKSA9PiBjb2wgIT09IHRoaXMuQ0hFQ0tCT1hfU0VMRUNUSU9OX0NPTF9JRClcbiAgICAgIDogbnVsbDtcbiAgICBzaXplKGZpbHRlcmVkUGlubmVkQ29sdW1ucykgPiAwXG4gICAgICA/IGNvbHVtbnMuc2V0Q29sdW1uc1Bpbm5lZChmaWx0ZXJlZFBpbm5lZENvbHVtbnMsICdsZWZ0JylcbiAgICAgIDogZmlsdGVyZWRDb2x1bW5zICYmIGNvbHVtbnMuc2V0Q29sdW1uc1Bpbm5lZChmaWx0ZXJlZENvbHVtbnMsIG51bGwpO1xuXG4gICAgLyogT3JkZXIgY29sdW1ucyAqL1xuICAgIGNvbHVtbnNPcmRlciAmJiBjb2x1bW5zLm1vdmVDb2x1bW5zKGNvbHVtbnNPcmRlciwgMCk7XG4gIH1cblxuICBnZXRTZXR0aW5nc0RpZmYoKTogUGFydGlhbDxEYXRvR3JpZFNldHRpbmdzPiB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5ncmlkUXVlcnkuZ2V0Q3VycmVudEdyaWRTZXR0aW5ncygpO1xuICAgIHJldHVybiBkaWZmKGN1cnJlbnRTdGF0ZSwgdGhpcy5pbml0aWFsU2V0dGluZ3MpO1xuICB9XG5cbiAgcmVzZXRUYWJsZVNldHRpbmdzKCkge1xuICAgIGNvbnN0IHsgZmlsdGVyLCAuLi5yZXN0IH0gPSB0aGlzLmluaXRpYWxTZXR0aW5ncztcbiAgICBjb25zdCB7IGNvbHVtbnMgfSA9IHRoaXMuYXBpO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29sU2l6ZXMgPSBnZXRDb2x1bW5zU2l6ZXMoY29sdW1ucy5nZXRBbGxHcmlkQ29sdW1ucygpLCB0cnVlKTtcbiAgICBjb25zdCBncmlkQWxpZ25tZW50ID0gaXNFbXB0eShvcmlnaW5hbENvbFNpemVzKSA/IHJlc3QuZ3JpZEFsaWdubWVudCA6IERhdG9HcmlkQWxpZ25tZW50LkNVU1RPTTtcbiAgICBjb25zdCBuZXdTZXR0aW5ncyA9IHsgLi4ucmVzdCwgY29sdW1uc1NpemVzOiBvcmlnaW5hbENvbFNpemVzLCBncmlkQWxpZ25tZW50IH07XG4gICAgdGhpcy51cGRhdGVTZXR0aW5ncyhuZXdTZXR0aW5ncyk7XG4gICAgdGhpcy5sb2FkU2F2ZWRTZXR0aW5ncyhuZXdTZXR0aW5ncyk7XG4gICAgdGhpcy5zYXZlU2V0dGluZ3NUb1NlcnZlcih7IGZpbHRlciB9KTtcbiAgfVxuXG4gIGluaXRTZXR0aW5ncyhzYXZlZFNldHRpbmdzOiBQYXJ0aWFsPERhdG9HcmlkU2V0dGluZ3M+KSB7XG4gICAgdGhpcy5pbml0aWFsU2V0dGluZ3MgPSB0aGlzLmdyaWRRdWVyeS5nZXRDdXJyZW50R3JpZFNldHRpbmdzKCk7XG4gICAgdGhpcy51cGRhdGVTZXR0aW5ncyhzYXZlZFNldHRpbmdzKTtcbiAgICB0aGlzLmxvYWRTYXZlZFNldHRpbmdzKHNhdmVkU2V0dGluZ3MpO1xuICB9XG5cbiAgbm90aWZ5RmlsdGVyVXBkYXRlKCkge1xuICAgIGNvbnN0IHdhdGNoID0gW3RoaXMuZ3JpZFJlZi5maWx0ZXJDaGFuZ2VkLmFzT2JzZXJ2YWJsZSgpXTtcbiAgICBpZiAodGhpcy5ncmlkUXVlcnkuaXNTZXJ2ZXJTaWRlKSB7XG4gICAgICB3YXRjaC5wdXNoKHRoaXMuZ3JpZFF1ZXJ5LnNlcnZlckRhdGFMb2FkZWQkKTtcbiAgICAgIHRoaXMuc2V0TG9hZGluZyh0cnVlKTtcbiAgICB9XG4gICAgY29tYmluZUxhdGVzdCh3YXRjaClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICB1bnRpbERlc3Ryb3llZCh0aGlzKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvd3NBZnRlckZpbHRlciA9IHRoaXMuYXBpLmdyaWQuZ2V0RGlzcGxheWVkUm93Q291bnQoKTtcbiAgICAgICAgdGhpcy5zZXRPdmVybGF5KHJvd3NBZnRlckZpbHRlciA9PT0gMCk7XG4gICAgICB9KTtcbiAgICB0aGlzLmFwaS5ncmlkLm9uRmlsdGVyQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNlcnZlclJlcXVlc3RGaWx0ZXJzKGZpbHRlcjogRGF0b0dyaWRGaWx0ZXJzTWFwKTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXJzIHtcbiAgICBjb25zdCBjb2x1bW5zRmlsdGVyczogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXJzID0ge307XG4gICAgZm9yIChjb25zdCBbY29sdW1uLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmlsdGVyKSkge1xuICAgICAgY29uc3QgeyBieVZhbHVlLCBjb25kaXRpb25hbCB9ID0gdmFsdWU7XG4gICAgICBpZiAoYnlWYWx1ZSkge1xuICAgICAgICBjb2x1bW5zRmlsdGVyc1tjb2x1bW5dID0ge1xuICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCxcbiAgICAgICAgICBmaWx0ZXJzOiBbYnlWYWx1ZV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25kaXRpb25hbCkge1xuICAgICAgICBjb25zdCBjb25kaXRpb25hbEZpbHRlciA9IHtcbiAgICAgICAgICBvcGVyYXRvcjogY29uZGl0aW9uYWwub3BlcmF0b3IsXG4gICAgICAgICAgZmlsdGVyczogY29uZGl0aW9uYWwuY29uZGl0aW9ucy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGNvbmRpdGlvbiwgdmFsdWUgfSA9IGl0ZW07XG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JTl9SQU5HRSkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgICAgICBzdGFydDogdmFsdWUsXG4gICAgICAgICAgICAgICAgZW5kOiAoaXRlbSBhcyBEYXRvR3JpZFJhbmdlRmlsdGVyQ29uZGl0aW9uKS5yYW5nZUVuZFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0gYXMgRGF0b0dyaWRGaWx0ZXJDb25kaXRpb247XG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGJ5VmFsdWUpIHtcbiAgICAgICAgICBjb2x1bW5zRmlsdGVyc1tjb2x1bW5dLmZpbHRlcnMucHVzaChjb25kaXRpb25hbEZpbHRlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29sdW1uc0ZpbHRlcnNbY29sdW1uXSA9IGNvbmRpdGlvbmFsRmlsdGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHVtbnNGaWx0ZXJzO1xuICB9XG5cbiAgYnVpbGRTZXJ2ZXJSZXF1ZXN0RmlsdGVyc192Ml8xKGdyaWRDb2x1bW5zOiBEYXRvR3JpZENvbHVtbkRlZltdKTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEZpbHRlcigpO1xuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSB0aGlzLmdyaWRRdWVyeS5nZXRTZWFyY2hUZXJtKCk7XG5cbiAgICBsZXQgY29sdW1uRmlsdGVycyA9IHRoaXMuYnVpbGRTZXJ2ZXJDb2x1bW5GaWx0ZXJzX3YyXzEoZmlsdGVyKTtcbiAgICBpZiAoY29sdW1uRmlsdGVycy5ldmVyeSgoeyBvcGVyYXRvciB9OiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcikgPT4gb3BlcmF0b3IgPT09IE9wZXJhdG9yVHlwZXMuQU5EKSkge1xuICAgICAgY29uc3QgZmxhdHRlbmVkRmlsdGVycyA9IGNvbHVtbkZpbHRlcnNcbiAgICAgICAgLm1hcCgoeyBmaWx0ZXJzIH06IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyKSA9PiBmaWx0ZXJzKVxuICAgICAgICAucmVkdWNlKChhcnIsIHJlcykgPT4gcmVzLmNvbmNhdChhcnIpLCBbXSk7XG4gICAgICBjb2x1bW5GaWx0ZXJzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuQU5ELFxuICAgICAgICAgIGZpbHRlcnM6IGZsYXR0ZW5lZEZpbHRlcnNcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciA9XG4gICAgICBzaXplKGNvbHVtbkZpbHRlcnMpID4gMVxuICAgICAgICA/IHsgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuQU5ELCBmaWx0ZXJzOiBjb2x1bW5GaWx0ZXJzIH1cbiAgICAgICAgOiBzaXplKGNvbHVtbkZpbHRlcnMpID09PSAxXG4gICAgICAgID8gY29sdW1uRmlsdGVyc1swXVxuICAgICAgICA6IG51bGw7XG4gICAgaWYgKCFzZWFyY2hUZXJtKSB7XG4gICAgICByZXR1cm4gY29sdW1uRmlsdGVyO1xuICAgIH1cbiAgICBjb25zdCB7IGluY2x1ZGVIaWRkZW5Db2x1bW5zSW5TZWFyY2ggfSA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCk7XG4gICAgY29uc3Qgc2VhcmNoYWJsZUNvbHVtbnMgPSBncmlkQ29sdW1ucy5maWx0ZXIoKGNvbERlZjogRGF0b0dyaWRDb2x1bW5EZWYpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbERlZi5pbmNsdWRlSW5TZWFyY2ggJiYgKGluY2x1ZGVIaWRkZW5Db2x1bW5zSW5TZWFyY2ggfHwgdGhpcy5hcGkuY29sdW1ucy5nZXRDb2x1bW4oY29sRGVmLmNvbElkKS5pc1Zpc2libGUoKSlcbiAgICAgICk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2VhcmNoRmlsdGVyczogU2VydmVyU2lkZVBhZ2luYXRpb25Db25kaXRpb25bXSA9IHNlYXJjaGFibGVDb2x1bW5zLm1hcCgoeyBmaWVsZCB9OiBEYXRvR3JpZENvbHVtbkRlZikgPT4gKHtcbiAgICAgIGNvbmRpdGlvbjogRGF0b0ZpbHRlckNvbmRpdGlvbnMuQ09OVEFJTlMsXG4gICAgICB2YWx1ZTogc2VhcmNoVGVybSxcbiAgICAgIGNvbHVtbjogZmllbGRcbiAgICB9KSk7XG4gICAgY29uc3Qgc2VhcmNoRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciA9XG4gICAgICBzaXplKHNlYXJjaEZpbHRlcnMpID4gMCA/IHsgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuT1IsIGZpbHRlcnM6IHNlYXJjaEZpbHRlcnMgfSA6IG51bGw7XG4gICAgaWYgKCFjb2x1bW5GaWx0ZXIpIHtcbiAgICAgIHJldHVybiBzZWFyY2hGaWx0ZXI7XG4gICAgfVxuICAgIHJldHVybiB7IG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCwgZmlsdGVyczogW2NvbHVtbkZpbHRlciwgc2VhcmNoRmlsdGVyXSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNlcnZlckNvbHVtbkZpbHRlcnNfdjJfMShmaWx0ZXI6IERhdG9HcmlkRmlsdGVyc01hcCk6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyW10ge1xuICAgIGxldCBjb2x1bW5GaWx0ZXJzOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtjb2x1bW4sIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmaWx0ZXIpKSB7XG4gICAgICBsZXQgY29sdW1uRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciA9IG51bGw7XG4gICAgICBjb25zdCB7IGJ5VmFsdWUsIGNvbmRpdGlvbmFsIH0gPSB2YWx1ZTtcbiAgICAgIGlmIChieVZhbHVlKSB7XG4gICAgICAgIGNvbHVtbkZpbHRlciA9IHtcbiAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5BTkQsXG4gICAgICAgICAgZmlsdGVyczogW3sgY29sdW1uLCAuLi5ieVZhbHVlIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoY29uZGl0aW9uYWwpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uYWxGaWx0ZXI6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyID0gdGhpcy5nZXRTZXJ2ZXJDb25kaXRpb25hbEZpbHRlcihjb25kaXRpb25hbCwgY29sdW1uKTtcbiAgICAgICAgaWYgKGNvbHVtbkZpbHRlcikge1xuICAgICAgICAgIGNvbHVtbkZpbHRlci5maWx0ZXJzLnB1c2goY29uZGl0aW9uYWxGaWx0ZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbHVtbkZpbHRlciA9IGNvbmRpdGlvbmFsRmlsdGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb2x1bW5GaWx0ZXJzLnB1c2goY29sdW1uRmlsdGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbkZpbHRlcnM7XG4gIH1cblxuICBnZXRGaWx0ZXJGb3JTZXJ2ZXJBY3Rpb25PblNlbGVjdEFsbCgpOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciB7XG4gICAgY29uc3QgeyBleGNsdWRlZEZyb21TZWxlY3RBbGwgfSA9IHRoaXMuZ3JpZFF1ZXJ5LnNlcnZlclNpZGVDb25maWc7XG4gICAgY29uc3QgeyBjb2x1bW5EZWZzLCBpZENvbHVtbktleSB9ID0gdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKTtcbiAgICBjb25zdCBtYWluRmlsdGVyID0gdGhpcy5idWlsZFNlcnZlclJlcXVlc3RGaWx0ZXJzX3YyXzEoY29sdW1uRGVmcyk7XG4gICAgaWYgKGlzRW1wdHkoZXhjbHVkZWRGcm9tU2VsZWN0QWxsKSkge1xuICAgICAgcmV0dXJuIG1haW5GaWx0ZXI7XG4gICAgfVxuICAgIGNvbnN0IGV4Y2x1ZGVkUm93c0ZpbHRlcjogU2VydmVyU2lkZVBhZ2luYXRpb25MaXN0Q29uZGl0aW9uID0ge1xuICAgICAgY29uZGl0aW9uOiBEYXRvRmlsdGVyQ29uZGl0aW9ucy5OT1RfSU5fTElTVCxcbiAgICAgIHZhbHVlczogZXhjbHVkZWRGcm9tU2VsZWN0QWxsLFxuICAgICAgY29sdW1uOiBpZENvbHVtbktleVxuICAgIH07XG4gICAgY29uc3QgZmlsdGVycyA9IG1haW5GaWx0ZXIgPyBbbWFpbkZpbHRlciwgZXhjbHVkZWRSb3dzRmlsdGVyXSA6IFtleGNsdWRlZFJvd3NGaWx0ZXJdO1xuICAgIHJldHVybiB7IG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCwgZmlsdGVycyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZXJ2ZXJDb25kaXRpb25hbEZpbHRlcihcbiAgICBjb25kaXRpb25hbEZpbHRlcjogRGF0b0dyaWRDb25kaXRpb25hbEZpbHRlcixcbiAgICBjb2x1bW46IHN0cmluZ1xuICApOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZXJhdG9yOiBjb25kaXRpb25hbEZpbHRlci5vcGVyYXRvcixcbiAgICAgIGZpbHRlcnM6IGNvbmRpdGlvbmFsRmlsdGVyLmNvbmRpdGlvbnMubWFwKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmRpdGlvbiwgdmFsdWUgfSA9IGl0ZW07XG4gICAgICAgIGlmIChjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklOX1JBTkdFKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgIHN0YXJ0OiB2YWx1ZSxcbiAgICAgICAgICAgIGVuZDogKGl0ZW0gYXMgRGF0b0dyaWRSYW5nZUZpbHRlckNvbmRpdGlvbikucmFuZ2VFbmQsXG4gICAgICAgICAgICBjb2x1bW5cbiAgICAgICAgICB9IGFzIFNlcnZlclNpZGVQYWdpbmF0aW9uUmFuZ2VDb25kaXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfRU1QVFkgfHwgY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5OT1RfRU1QVFkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29uZGl0aW9uOiBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JU19FTVBUWSxcbiAgICAgICAgICAgIHZhbHVlOiBjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklTX0VNUFRZID8gJ3RydWUnIDogJ2ZhbHNlJyxcbiAgICAgICAgICAgIGNvbHVtblxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfTlVMTCB8fCBjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLk5PVF9OVUxMKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbjogRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfTlVMTCxcbiAgICAgICAgICAgIHZhbHVlOiBjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklTX05VTEwgPyAndHJ1ZScgOiAnZmFsc2UnLFxuICAgICAgICAgICAgY29sdW1uXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyAuLi5pdGVtLCBjb2x1bW4gfSBhcyBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkNvbmRpdGlvbjtcbiAgICAgIH0pXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTZXJ2ZXJSZXF1ZXN0U29ydChzb3J0TW9kZWw6IERhdG9HcmlkU29ydFtdKTogRGF0b0dyaWRTZXJ2ZXJTb3J0W10ge1xuICAgIHJldHVybiBzb3J0TW9kZWwubWFwKCh7IGNvbElkLCBzb3J0IH0pID0+ICh7XG4gICAgICBjb2x1bW46IGNvbElkLFxuICAgICAgc29ydE9yZGVyOiBzb3J0LnRvVXBwZXJDYXNlKCkgYXMgRGF0b0dyaWRTZXJ2ZXJTb3J0RGlyZWN0aW9uXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRFZGl0YWJsZUNlbGxDbGFzcyhcbiAgICBjZWxsQ2xhc3NWYWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCAoKGNlbGxDbGFzc1BhcmFtczogQ2VsbENsYXNzUGFyYW1zKSA9PiBzdHJpbmcgfCBzdHJpbmdbXSlcbiAgKSB7XG4gICAgaWYgKGlzTmlsKGNlbGxDbGFzc1ZhbHVlKSkge1xuICAgICAgcmV0dXJuICdkYXRvLWVkaXRhYmxlLWNlbGwnO1xuICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihjZWxsQ2xhc3NWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBjZWxsQ2xhc3NQYXJhbXMgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRFZGl0YWJsZUNsYXNzQXJyYXkoY2VsbENsYXNzVmFsdWUoY2VsbENsYXNzUGFyYW1zKSk7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRFZGl0YWJsZUNsYXNzQXJyYXkoY2VsbENsYXNzVmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFZGl0YWJsZUNsYXNzQXJyYXkoY3VycmVudENsYXNzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjZWxsQ2xhc3MgPSBjb2VyY2VBcnJheShjdXJyZW50Q2xhc3MpO1xuICAgIGNlbGxDbGFzcy5wdXNoKCdkYXRvLWVkaXRhYmxlLWNlbGwnKTtcbiAgICByZXR1cm4gY2VsbENsYXNzO1xuICB9XG5cbiAgc2VsZWN0QWxsQ3VycmVudFBhZ2VSb3dzKGlzU2VsZWN0ZWQgPSB0cnVlLCBjb25zaWRlckV4Y2x1ZGVkID0gZmFsc2UpIHtcbiAgICBsZXQgcm93c0ZvclNlbGVjdGlvbiA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEN1cnJlbnRQYWdlUm93cygpO1xuICAgIGlmIChjb25zaWRlckV4Y2x1ZGVkKSB7XG4gICAgICBjb25zdCB7IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCB9ID0gdGhpcy5ncmlkUXVlcnkuc2VydmVyU2lkZUNvbmZpZztcbiAgICAgIGlmICghaXNFbXB0eShleGNsdWRlZEZyb21TZWxlY3RBbGwpKSB7XG4gICAgICAgIHJvd3NGb3JTZWxlY3Rpb24gPSByb3dzRm9yU2VsZWN0aW9uLmZpbHRlcigoeyBpZCB9OiBSb3dOb2RlKSA9PiAhZXhjbHVkZWRGcm9tU2VsZWN0QWxsLmluY2x1ZGVzKGlkKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlzU2VsZWN0ZWQgPyB0aGlzLnNlbGVjdFJvd3Mocm93c0ZvclNlbGVjdGlvbikgOiB0aGlzLmRlc2VsZWN0Um93cyhyb3dzRm9yU2VsZWN0aW9uKTtcbiAgfVxuXG4gIGRlc2VsZWN0QWxsUm93cygpIHtcbiAgICB0aGlzLmFwaS5ncmlkLmRlc2VsZWN0QWxsKCk7XG4gICAgaWYgKHRoaXMuZ3JpZFF1ZXJ5LmlzU2VydmVyU2VsZWN0QWxsUm93c0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oeyBzZWxlY3RBbGxSb3dzRW5hYmxlZDogZmFsc2UsIGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbDogW10gfSk7XG4gICAgfVxuICB9XG5cbiAgcmVzb2x2ZVJvd0FjdGlvbnNWaXNpYmlsaXR5KCkge1xuICAgIHRoaXMuZ3JpZFF1ZXJ5Ll9yb3dBY3Rpb25WaXNpYmlsaXR5Q2hhbmdlZC5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBwaXZvdGluZyxcbiAgICogd2UgYWRkIHRoZSBmaWVsZCBuYW1lIHRvIHRoZSBjb2x1bW4gaGVhZGVyIGNsYXNzIGluIG9yZGVyIHRvIGFjY2VzcyBpdCB0aHJvdWdoIHRoZSBhdXRvIGdlbmVyYXRlZCBwaXZvdCBjb2x1bW4uXG4gICAqL1xuICBwcml2YXRlIGluaXRQaXZvdFNlY29uZGFyeUNvbHNQcm9jZXNzKHsgZ3JpZE9wdGlvbnMgfTogTm9ybWFsaXplT3B0aW9uc1BhcmFtcykge1xuICAgIC8qKiBVc2UgcHJvY2Vzc1Bpdm90UmVzdWx0Q29sRGVmIGZyb20gdmVyIDI4ICovXG4gICAgZ3JpZE9wdGlvbnMucHJvY2Vzc1NlY29uZGFyeUNvbERlZiA9IGNvbERlZiA9PiB7XG4gICAgICBjb25zdCB1c2VyUHJvdmlkZWRDb2xEZWYgPSBjb2xEZWYucGl2b3RWYWx1ZUNvbHVtbiAmJiBjb2xEZWYucGl2b3RWYWx1ZUNvbHVtbi5nZXRVc2VyUHJvdmlkZWRDb2xEZWYoKTtcblxuICAgICAgaWYgKHVzZXJQcm92aWRlZENvbERlZikge1xuICAgICAgICBjb2xEZWYuZmlsdGVyID0gdXNlclByb3ZpZGVkQ29sRGVmLmZpbHRlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbERlZi5waXZvdEtleXMpIHtcbiAgICAgICAgY29sRGVmLnBpdm90S2V5cyA9IGNvbERlZi5waXZvdEtleXMubWFwKGtleSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkS2V5ID0gdHJ5UGFyc2VQaXZvdFZhbHVlKGtleSk7XG5cbiAgICAgICAgICByZXR1cm4gKHBhcnNlZEtleSAmJiBwYXJzZWRLZXkudmFsdWUpIHx8ICcnO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIFVzZSBwcm9jZXNzUGl2b3RSZXN1bHRDb2xHcm91cERlIGZyb20gdmVyIDI4ICovXG4gICAgZ3JpZE9wdGlvbnMucHJvY2Vzc1NlY29uZGFyeUNvbEdyb3VwRGVmID0gKGNvbEdyb3VwRGVmOiBDb2xHcm91cERlZikgPT4ge1xuICAgICAgaWYgKGNvbEdyb3VwRGVmLmhlYWRlck5hbWUpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVmFsdWUgPSB0cnlQYXJzZVBpdm90VmFsdWUoY29sR3JvdXBEZWYuaGVhZGVyTmFtZSk7XG5cbiAgICAgICAgaWYgKHBhcnNlZFZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgeyBmaWVsZCwgdmFsdWUgfSA9IHBhcnNlZFZhbHVlO1xuXG4gICAgICAgICAgY29sR3JvdXBEZWYuaGVhZGVyQ2xhc3MgPSBbZmllbGRdO1xuICAgICAgICAgIGNvbEdyb3VwRGVmLmhlYWRlck5hbWUgPSB2YWx1ZTtcblxuICAgICAgICAgIGlmIChjb2xHcm91cERlZi5jaGlsZHJlbiAmJiBjb2xHcm91cERlZi5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb2xHcm91cERlZi5oZWFkZXJDbGFzcy5wdXNoKCdncm91cC1waXZvdC1jZWxsJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbEdyb3VwRGVmLmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IFtjb2xDaGlsZF06IGFueSA9IGNvbEdyb3VwRGVmLmNoaWxkcmVuO1xuICAgICAgICBjb25zdCBwaXZvdFRvdGFsQ29sdW1uSWRzID0gY29sQ2hpbGQgJiYgY29sQ2hpbGQucGl2b3RUb3RhbENvbHVtbklkcztcblxuICAgICAgICBpZiAocGl2b3RUb3RhbENvbHVtbklkcyAmJiBwaXZvdFRvdGFsQ29sdW1uSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb2xHcm91cERlZi5oZWFkZXJDbGFzcyA9IFsndG90YWwtcGl2b3QtY2VsbCddO1xuICAgICAgICAgIGNvbEdyb3VwRGVmLmhlYWRlck5hbWUgPSB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oJ2NvcmUudG90YWwnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sR3JvdXBEZWYuaGVhZGVyQ2xhc3MgPSBbJ2VtcHR5LXBpdm90LWhlYWRlciddO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29sR3JvdXBEZWYucGl2b3RLZXlzKSB7XG4gICAgICAgIGNvbEdyb3VwRGVmLnBpdm90S2V5cyA9IGNvbEdyb3VwRGVmLnBpdm90S2V5cy5tYXAoa2V5ID0+IHtcbiAgICAgICAgICBjb25zdCBwYXJzZWRLZXkgPSB0cnlQYXJzZVBpdm90VmFsdWUoa2V5KTtcblxuICAgICAgICAgIHJldHVybiAocGFyc2VkS2V5ICYmIHBhcnNlZEtleS52YWx1ZSkgfHwgJyc7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNldFBpdm90TW9kZVJvd3M8VD4oZGF0YTogVFtdKSB7XG4gICAgY29uc3QgcGl2b3RDb2x1bW5zID0gdGhpcy5ncmlkUXVlcnkuZ2V0QWxsUGl2b3RDb2x1bW5zKCk7XG4gICAgY29uc3QgY29udmVydGVkRGF0YSA9IGRhdGEubWFwKChjdXJyZW50VmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBtYXBwZWRWYWx1ZXMgPSB7IC4uLmN1cnJlbnRWYWx1ZSB9O1xuXG4gICAgICBmb3IgKGNvbnN0IGNvbCBvZiBwaXZvdENvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb2wuZ2V0Q29sRGVmKCkuZmllbGQ7XG4gICAgICAgIGNvbnN0IHBpdm90VmFsdWU6IFBpdm90Q29sdW1uRGF0YSA9IHsgZmllbGQsIHZhbHVlOiBjdXJyZW50VmFsdWVbZmllbGRdIH07XG5cbiAgICAgICAgbWFwcGVkVmFsdWVzW2ZpZWxkXSA9IEpTT04uc3RyaW5naWZ5KHBpdm90VmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWFwcGVkVmFsdWVzO1xuICAgIH0pO1xuXG4gICAgdGhpcy5hcGkuZ3JpZC5zZXRSb3dEYXRhKGNvbnZlcnRlZERhdGEpO1xuICB9XG5cbiAgLyoqIE5vIGRlY2xhcmVkIGludGVyZmFjZSBpbiBjdXJyZW50IGdyaWQgdmVyc2lvbiB5ZXQuXG4gICAqICBSZWZlciBkb2NzIC0gaHR0cHM6Ly93d3cuYWctZ3JpZC5jb20vYW5ndWxhci1kYXRhLWdyaWQvY2VsbC1zdHlsZXMvI2NlbGwtY2xhc3MtcnVsZXMgKi9cbiAgcHJpdmF0ZSBnZXRQaXZvdE1vZGVDZWxsQ2xhc3NSdWxlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ3ByaW1hcnktMC1iYWNrZ3JvdW5kLWNvbG9yJzogdGhpcy5pc0xlYWZHcm91cEV2ZW5DZWxsLmJpbmQodGhpcyksXG4gICAgICAncHJpbWFyeS0xMDAtYmFja2dyb3VuZC1jb2xvciBwb2ludGVyIGRhdG8tc2ltcGxlLWJvbGQnOiB0aGlzLmlzUm93R3JvdXBWYWx1ZWRDZWxsLmJpbmQodGhpcylcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBpc0xlYWZHcm91cEV2ZW5DZWxsKHBhcmFtczogQ2VsbENsYXNzUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBsZWFmR3JvdXAsIGNoaWxkSW5kZXgsIHJvd0dyb3VwSW5kZXggfSA9IHBhcmFtcy5ub2RlO1xuICAgIGNvbnN0IGNvbEluZGV4ID0gdGhpcy5nZXRDZWxsQ2xhc3NSdWxlQ29sSW5kZXgocGFyYW1zKTtcblxuICAgIHJldHVybiByb3dHcm91cEluZGV4IDw9IGNvbEluZGV4ICYmIGxlYWZHcm91cCAmJiBjaGlsZEluZGV4ICUgMiA9PT0gMDtcbiAgfVxuXG4gIHByaXZhdGUgaXNSb3dHcm91cFZhbHVlZENlbGwocGFyYW1zOiBDZWxsQ2xhc3NQYXJhbXMpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IGxlYWZHcm91cCwgcm93R3JvdXBJbmRleCB9ID0gcGFyYW1zLm5vZGU7XG4gICAgY29uc3QgY29sSW5kZXggPSB0aGlzLmdldENlbGxDbGFzc1J1bGVDb2xJbmRleChwYXJhbXMpO1xuXG4gICAgcmV0dXJuIHJvd0dyb3VwSW5kZXggPD0gY29sSW5kZXggJiYgIWxlYWZHcm91cDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2VsbENsYXNzUnVsZUNvbEluZGV4KHBhcmFtczogQ2VsbENsYXNzUGFyYW1zKTogbnVtYmVyIHtcbiAgICBjb25zdCBncmlkUXVlcnkgPSBwYXJhbXMuY29sRGVmLmhlYWRlckNvbXBvbmVudFBhcmFtcy5ncmlkUXVlcnk7XG5cbiAgICBpZiAoZ3JpZFF1ZXJ5ICYmIGdyaWRRdWVyeS5hcGkpIHtcbiAgICAgIGNvbnN0IHsgY29sdW1ucyB9ID0gZ3JpZFF1ZXJ5LmFwaSBhcyBEYXRvR3JpZEFwaTtcbiAgICAgIGNvbnN0IGFsbERpc3BsYXllZENvbHVtbnMgPSBjb2x1bW5zLmdldEFsbERpc3BsYXllZENvbHVtbnMoKTtcbiAgICAgIGNvbnN0IGRpc3BsYXllZENvbHVtbiA9IGFsbERpc3BsYXllZENvbHVtbnMuZmluZChjb2wgPT4gY29sLmdldENvbElkKCkgPT09IHBhcmFtcy5jb2xEZWYuY29sSWQpO1xuXG4gICAgICByZXR1cm4gYWxsRGlzcGxheWVkQ29sdW1ucy5pbmRleE9mKGRpc3BsYXllZENvbHVtbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG4iXX0=
|