@netgrif/components-core 6.0.3 → 6.0.4
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/netgrif-components-core.umd.js +166 -61
- package/bundles/netgrif-components-core.umd.js.map +1 -1
- package/bundles/netgrif-components-core.umd.min.js +2 -2
- package/bundles/netgrif-components-core.umd.min.js.map +1 -1
- package/esm2015/lib/data-fields/file-field/abstract-file-field.component.js +2 -2
- package/esm2015/lib/groups/services/next-group.service.js +3 -2
- package/esm2015/lib/resources/abstract-endpoint/abstract-resource.service.js +3 -2
- package/esm2015/lib/resources/engine-endpoint/public/public-task-resource.service.js +1 -1
- package/esm2015/lib/search/models/category/case/case-dataset.js +3 -6
- package/esm2015/lib/search/models/category/case/case-simple-dataset.js +3 -3
- package/esm2015/lib/search/models/category/case/case-title.js +13 -3
- package/esm2015/lib/search/models/category/case/case-visual-id.js +13 -3
- package/esm2015/lib/search/models/category/category.js +10 -2
- package/esm2015/lib/search/models/operator/substring.js +3 -3
- package/esm2015/lib/search/search-keyword-resolver-service/search-index-resolver.service.js +18 -3
- package/esm2015/lib/search/search-service/search.service.js +3 -2
- package/esm2015/lib/side-menu/content-components/new-case/abstract-new-case.component.js +6 -1
- package/esm2015/lib/task/services/finish-task.service.js +18 -13
- package/esm2015/lib/task/services/task-data.service.js +2 -1
- package/esm2015/lib/user/services/user-list.service.js +4 -3
- package/esm2015/lib/utility/pagination/load-all-pages.js +4 -3
- package/esm2015/lib/utility/pagination/pagination-params.js +19 -0
- package/esm2015/lib/utility/pagination/pagination-sort.js +17 -0
- package/esm2015/lib/utility/public-api.js +3 -1
- package/esm2015/lib/utility/tests/mocks/mock-endpoint.js +4 -3
- package/esm2015/lib/view/abstract/sortable-view.js +4 -3
- package/esm2015/lib/view/case-view/service/case-view-service.js +6 -4
- package/esm2015/lib/view/public-api.js +3 -1
- package/esm2015/lib/view/task-view/service/task-view.service.js +6 -4
- package/esm2015/lib/view/tree-case-view/tree-component/case-tree.service.js +19 -5
- package/esm2015/lib/view/tree-case-view/tree-component/model/tree-case-view-configuration.js +2 -0
- package/esm2015/lib/view/tree-case-view/tree-component/model/tree-configuration-injection-token.js +3 -0
- package/esm2015/lib/view/workflow-view/workflow-view.service.js +4 -11
- package/esm5/lib/data-fields/file-field/abstract-file-field.component.js +2 -2
- package/esm5/lib/groups/services/next-group.service.js +3 -2
- package/esm5/lib/resources/abstract-endpoint/abstract-resource.service.js +3 -2
- package/esm5/lib/resources/engine-endpoint/public/public-task-resource.service.js +1 -1
- package/esm5/lib/search/models/category/case/case-dataset.js +3 -6
- package/esm5/lib/search/models/category/case/case-simple-dataset.js +3 -3
- package/esm5/lib/search/models/category/case/case-title.js +19 -4
- package/esm5/lib/search/models/category/case/case-visual-id.js +19 -4
- package/esm5/lib/search/models/category/category.js +10 -2
- package/esm5/lib/search/models/operator/substring.js +3 -3
- package/esm5/lib/search/search-keyword-resolver-service/search-index-resolver.service.js +17 -2
- package/esm5/lib/search/search-service/search.service.js +3 -2
- package/esm5/lib/side-menu/content-components/new-case/abstract-new-case.component.js +6 -1
- package/esm5/lib/task/services/finish-task.service.js +18 -13
- package/esm5/lib/task/services/task-data.service.js +2 -1
- package/esm5/lib/user/services/user-list.service.js +4 -3
- package/esm5/lib/utility/pagination/load-all-pages.js +4 -3
- package/esm5/lib/utility/pagination/pagination-params.js +19 -0
- package/esm5/lib/utility/pagination/pagination-sort.js +17 -0
- package/esm5/lib/utility/public-api.js +3 -1
- package/esm5/lib/utility/tests/mocks/mock-endpoint.js +4 -3
- package/esm5/lib/view/abstract/sortable-view.js +4 -3
- package/esm5/lib/view/case-view/service/case-view-service.js +6 -4
- package/esm5/lib/view/public-api.js +3 -1
- package/esm5/lib/view/task-view/service/task-view.service.js +6 -4
- package/esm5/lib/view/tree-case-view/tree-component/case-tree.service.js +19 -5
- package/esm5/lib/view/tree-case-view/tree-component/model/tree-case-view-configuration.js +2 -0
- package/esm5/lib/view/tree-case-view/tree-component/model/tree-configuration-injection-token.js +3 -0
- package/esm5/lib/view/workflow-view/workflow-view.service.js +4 -11
- package/fesm2015/netgrif-components-core.js +154 -61
- package/fesm2015/netgrif-components-core.js.map +1 -1
- package/fesm5/netgrif-components-core.js +165 -62
- package/fesm5/netgrif-components-core.js.map +1 -1
- package/lib/search/models/category/case/case-dataset.d.ts +0 -2
- package/lib/search/models/category/case/case-title.d.ts +4 -1
- package/lib/search/models/category/case/case-visual-id.d.ts +4 -1
- package/lib/search/models/category/category.d.ts +7 -0
- package/lib/search/search-keyword-resolver-service/search-index-resolver.service.d.ts +12 -0
- package/lib/side-menu/content-components/new-case/abstract-new-case.component.d.ts +1 -0
- package/lib/task/services/finish-task.service.d.ts +5 -0
- package/lib/utility/pagination/pagination-params.d.ts +17 -0
- package/lib/utility/pagination/pagination-sort.d.ts +13 -0
- package/lib/utility/public-api.d.ts +2 -0
- package/lib/view/public-api.d.ts +2 -0
- package/lib/view/tree-case-view/tree-component/case-tree.service.d.ts +4 -1
- package/lib/view/tree-case-view/tree-component/model/tree-case-view-configuration.d.ts +9 -0
- package/lib/view/tree-case-view/tree-component/model/tree-configuration-injection-token.d.ts +3 -0
- package/lib/view/workflow-view/workflow-view.service.d.ts +0 -1
- package/netgrif-components-core.metadata.json +1 -1
- package/package.json +2 -2
- package/schematics/collection.json +0 -3
|
@@ -21,8 +21,11 @@ import { NAE_OPTION_SELECTOR_COMPONENT } from '../../../side-menu/content-compon
|
|
|
21
21
|
import { SimpleFilter } from '../../../filter/models/simple-filter';
|
|
22
22
|
import { ResultWithAfterActions } from '../../../utility/result-with-after-actions';
|
|
23
23
|
import { refreshTree } from '../../../utility/refresh-tree';
|
|
24
|
+
import { NAE_TREE_CASE_VIEW_CONFIGURATION } from './model/tree-configuration-injection-token';
|
|
25
|
+
import { PaginationParams } from '../../../utility/pagination/pagination-params';
|
|
26
|
+
import { createSortParam, PaginationSort } from '../../../utility/pagination/pagination-sort';
|
|
24
27
|
export class CaseTreeService {
|
|
25
|
-
constructor(_caseResourceService, _treeCaseViewService, _taskResourceService, _logger, _processService, _sideMenuService, _translateService, _optionSelectorComponent) {
|
|
28
|
+
constructor(_caseResourceService, _treeCaseViewService, _taskResourceService, _logger, _processService, _sideMenuService, _translateService, _optionSelectorComponent, _treeConfiguration) {
|
|
26
29
|
this._caseResourceService = _caseResourceService;
|
|
27
30
|
this._treeCaseViewService = _treeCaseViewService;
|
|
28
31
|
this._taskResourceService = _taskResourceService;
|
|
@@ -31,6 +34,7 @@ export class CaseTreeService {
|
|
|
31
34
|
this._sideMenuService = _sideMenuService;
|
|
32
35
|
this._translateService = _translateService;
|
|
33
36
|
this._optionSelectorComponent = _optionSelectorComponent;
|
|
37
|
+
this._treeConfiguration = _treeConfiguration;
|
|
34
38
|
/**
|
|
35
39
|
* Weather the tree is eager loaded or not.
|
|
36
40
|
*
|
|
@@ -39,6 +43,11 @@ export class CaseTreeService {
|
|
|
39
43
|
* It is not recommended to eager load large trees as each node sends a separate backend request to load its data.
|
|
40
44
|
*/
|
|
41
45
|
this._isEagerLoaded = false;
|
|
46
|
+
if (!this._treeConfiguration) {
|
|
47
|
+
this._treeConfiguration = {
|
|
48
|
+
pageSize: CaseTreeService.DEFAULT_PAGE_SIZE
|
|
49
|
+
};
|
|
50
|
+
}
|
|
42
51
|
this._treeDataSource = new MatTreeNestedDataSource();
|
|
43
52
|
this._treeControl = new NestedTreeControl(node => node.children);
|
|
44
53
|
_treeCaseViewService.reloadCase$.asObservable().subscribe(() => {
|
|
@@ -296,7 +305,9 @@ export class CaseTreeService {
|
|
|
296
305
|
}
|
|
297
306
|
const done = new ReplaySubject(1);
|
|
298
307
|
let params = new HttpParams();
|
|
299
|
-
params = params.set(
|
|
308
|
+
params = params.set(PaginationParams.PAGE_SIZE, `${this._treeConfiguration.pageSize}`)
|
|
309
|
+
.set(PaginationParams.PAGE_NUMBER, `${pageNumber}`)
|
|
310
|
+
.set(PaginationParams.PAGE_SORT, createSortParam('creationDate', PaginationSort.ASCENDING));
|
|
300
311
|
this._caseResourceService.getCases(requestBody, params).subscribe(page => {
|
|
301
312
|
if (!hasContent(page)) {
|
|
302
313
|
this._logger.error('Child cases invalid page content', page);
|
|
@@ -817,6 +828,7 @@ export class CaseTreeService {
|
|
|
817
828
|
return result;
|
|
818
829
|
}
|
|
819
830
|
}
|
|
831
|
+
CaseTreeService.DEFAULT_PAGE_SIZE = 50;
|
|
820
832
|
CaseTreeService.ctorParameters = () => [
|
|
821
833
|
{ type: CaseResourceService },
|
|
822
834
|
{ type: TreeCaseViewService },
|
|
@@ -825,7 +837,8 @@ CaseTreeService.ctorParameters = () => [
|
|
|
825
837
|
{ type: ProcessService },
|
|
826
838
|
{ type: SideMenuService },
|
|
827
839
|
{ type: TranslateService },
|
|
828
|
-
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_OPTION_SELECTOR_COMPONENT,] }] }
|
|
840
|
+
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_OPTION_SELECTOR_COMPONENT,] }] },
|
|
841
|
+
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_TREE_CASE_VIEW_CONFIGURATION,] }] }
|
|
829
842
|
];
|
|
830
843
|
CaseTreeService.decorators = [
|
|
831
844
|
{ type: Injectable }
|
|
@@ -838,6 +851,7 @@ CaseTreeService.ctorParameters = () => [
|
|
|
838
851
|
{ type: ProcessService },
|
|
839
852
|
{ type: SideMenuService },
|
|
840
853
|
{ type: TranslateService },
|
|
841
|
-
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_OPTION_SELECTOR_COMPONENT,] }] }
|
|
854
|
+
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_OPTION_SELECTOR_COMPONENT,] }] },
|
|
855
|
+
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_TREE_CASE_VIEW_CONFIGURATION,] }] }
|
|
842
856
|
];
|
|
843
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzZS10cmVlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmV0Z3JpZi9jb21wb25lbnRzLWNvcmUvIiwic291cmNlcyI6WyJsaWIvdmlldy90cmVlLWNhc2Utdmlldy90cmVlLWNvbXBvbmVudC9jYXNlLXRyZWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBYSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFdEUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDBEQUEwRCxDQUFDO0FBQzdGLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSwwREFBMEQsQ0FBQztBQUM3RixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFHdEUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUM5RSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFDdEUsT0FBTyxFQUFDLFFBQVEsRUFBYyxFQUFFLEVBQUUsYUFBYSxFQUF5QixVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFaEcsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDN0UsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ25DLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSw4Q0FBOEMsQ0FBQztBQUN4RSxPQUFPLEVB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IE9uRGVzdHJveSwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGaWx0ZXJ9IGZyb20gJy4uLy4uLy4uL2ZpbHRlci9tb2RlbHMvZmlsdGVyJztcbmltcG9ydCB7SHR0cFBhcmFtc30gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtDYXNlUmVzb3VyY2VTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMvZW5naW5lLWVuZHBvaW50L2Nhc2UtcmVzb3VyY2Uuc2VydmljZSc7XG5pbXBvcnQge0Nhc2VUcmVlTm9kZX0gZnJvbSAnLi9tb2RlbC9jYXNlLXRyZWUtbm9kZSc7XG5pbXBvcnQge1RyZWVDYXNlVmlld1NlcnZpY2V9IGZyb20gJy4uL3RyZWUtY2FzZS12aWV3LnNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrUmVzb3VyY2VTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMvZW5naW5lLWVuZHBvaW50L3Rhc2stcmVzb3VyY2Uuc2VydmljZSc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge0ltbWVkaWF0ZURhdGF9IGZyb20gJy4uLy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvaW1tZWRpYXRlLWRhdGEnO1xuaW1wb3J0IHtDYXNlfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2Nhc2UnO1xuaW1wb3J0IHtQcm9jZXNzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vcHJvY2Vzcy9wcm9jZXNzLnNlcnZpY2UnO1xuaW1wb3J0IHtTaWRlTWVudVNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL3NpZGUtbWVudS9zZXJ2aWNlcy9zaWRlLW1lbnUuc2VydmljZSc7XG5pbXBvcnQge1NpZGVNZW51U2l6ZX0gZnJvbSAnLi4vLi4vLi4vc2lkZS1tZW51L21vZGVscy9zaWRlLW1lbnUtc2l6ZSc7XG5pbXBvcnQge2ZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aHJvd0Vycm9yfSBmcm9tICdyeGpzJztcbmltcG9ydCB7UGFnZX0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9wYWdlJztcbmltcG9ydCB7VHJlZVBldHJpZmxvd0lkZW50aWZpZXJzfSBmcm9tICcuLi9tb2RlbC90cmVlLXBldHJpZmxvdy1pZGVudGlmaWVycyc7XG5pbXBvcnQge3RhcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7aGFzQ29udGVudH0gZnJvbSAnLi4vLi4vLi4vdXRpbGl0eS9wYWdpbmF0aW9uL3BhZ2UtaGFzLWNvbnRlbnQnO1xuaW1wb3J0IHtOZXN0ZWRUcmVlQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RyZWUnO1xuaW1wb3J0IHtNYXRUcmVlTmVzdGVkRGF0YVNvdXJjZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdHJlZSc7XG5pbXBvcnQge29mVm9pZH0gZnJvbSAnLi4vLi4vLi4vdXRpbGl0eS9vZi12b2lkJztcbmltcG9ydCB7Q2FzZUdldFJlcXVlc3RCb2R5fSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2Nhc2UtZ2V0LXJlcXVlc3QtYm9keSc7XG5pbXBvcnQge2dldEltbWVkaWF0ZURhdGF9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvZ2V0LWltbWVkaWF0ZS1kYXRhJztcbmltcG9ydCB7TkFFX09QVElPTl9TRUxFQ1RPUl9DT01QT05FTlR9IGZyb20gJy4uLy4uLy4uL3NpZGUtbWVudS9jb250ZW50LWNvbXBvbmVudHMvaW5qZWN0aW9uLXRva2Vucyc7XG5pbXBvcnQge1NpbXBsZUZpbHRlcn0gZnJvbSAnLi4vLi4vLi4vZmlsdGVyL21vZGVscy9zaW1wbGUtZmlsdGVyJztcbmltcG9ydCB7Q2FzZVRyZWVQYXRofSBmcm9tICcuL21vZGVsL2Nhc2UtdHJlZS1wYXRoJztcbmltcG9ydCB7RXhwYW5zaW9uVHJlZX0gZnJvbSAnLi9tb2RlbC9leHBhbnNpb24tdHJlZSc7XG5pbXBvcnQge1Jlc3VsdFdpdGhBZnRlckFjdGlvbnN9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvcmVzdWx0LXdpdGgtYWZ0ZXItYWN0aW9ucyc7XG5pbXBvcnQge0V2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZX0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9tZXNzYWdlLXJlc291cmNlJztcbmltcG9ydCB7U2V0RGF0YUV2ZW50T3V0Y29tZX0gZnJvbSAnLi4vLi4vLi4vZXZlbnQvbW9kZWwvZXZlbnQtb3V0Y29tZXMvZGF0YS1vdXRjb21lcy9zZXQtZGF0YS1ldmVudC1vdXRjb21lJztcbmltcG9ydCB7Q3JlYXRlQ2FzZUV2ZW50T3V0Y29tZX0gZnJvbSAnLi4vLi4vLi4vZXZlbnQvbW9kZWwvZXZlbnQtb3V0Y29tZXMvY2FzZS1vdXRjb21lcy9jcmVhdGUtY2FzZS1ldmVudC1vdXRjb21lJztcbmltcG9ydCB7cmVmcmVzaFRyZWV9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvcmVmcmVzaC10cmVlJztcblxuLyoqXG4gKiBBbiBpbnRlcm5hbCBoZWxwZXIgb2JqZWN0LCB0aGF0IGlzIHVzZWQgdG8gcmV0dXJuIHR3byB2YWx1ZXMgZnJvbSBhIGZ1bmN0aW9uLlxuICovXG5pbnRlcmZhY2UgQ2FzZVVwZGF0ZVJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZSB2aXNpYmxlIG9uIHRoZSB0cmVlIGNoYW5nZWRcbiAgICAgKi9cbiAgICB2aXNpYmxlVHJlZVByb3BlcnRpZXNDaGFuZ2VkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIG5vZGVzIGNoaWxkcmVuIGNoYW5nZWRcbiAgICAgKi9cbiAgICBjaGlsZHJlbkNoYW5nZWQ6IGJvb2xlYW47XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDYXNlVHJlZVNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gICAgcHJvdGVjdGVkIF9jdXJyZW50Tm9kZTogQ2FzZVRyZWVOb2RlO1xuICAgIHByaXZhdGUgX3Jvb3ROb2Rlc0ZpbHRlcjogRmlsdGVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RyZWVEYXRhU291cmNlOiBNYXRUcmVlTmVzdGVkRGF0YVNvdXJjZTxDYXNlVHJlZU5vZGU+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RyZWVDb250cm9sOiBOZXN0ZWRUcmVlQ29udHJvbDxDYXNlVHJlZU5vZGU+O1xuICAgIHByaXZhdGUgX3RyZWVSb290TG9hZGVkJDogUmVwbGF5U3ViamVjdDxib29sZWFuPjtcbiAgICBwcml2YXRlIF9yb290Tm9kZTogQ2FzZVRyZWVOb2RlO1xuICAgIHByaXZhdGUgX3Nob3dSb290OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdlYXRoZXIgdGhlIHRyZWUgaXMgZWFnZXIgbG9hZGVkIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gZWFnZXIgbG9hZCBsYXJnZSB0cmVlcyBhcyBlYWNoIG5vZGUgc2VuZHMgYSBzZXBhcmF0ZSBiYWNrZW5kIHJlcXVlc3QgdG8gbG9hZCBpdHMgZGF0YS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9pc0VhZ2VyTG9hZGVkID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogc3RyaW5nIGlkIG9mIHRoZSBjYXNlLCB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyByZWxvYWRlZCwgYHVuZGVmaW5lZGAgaWYgbm8gY2FzZSBpcyBjdXJyZW50bHkgYmVpbmcgcmVsb2FkZWRcbiAgICAgKi9cbiAgICBwcml2YXRlIF9yZWxvYWRlZENhc2VJZDogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9jYXNlUmVzb3VyY2VTZXJ2aWNlOiBDYXNlUmVzb3VyY2VTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdHJlZUNhc2VWaWV3U2VydmljZTogVHJlZUNhc2VWaWV3U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Rhc2tSZXNvdXJjZVNlcnZpY2U6IFRhc2tSZXNvdXJjZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9sb2dnZXI6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9wcm9jZXNzU2VydmljZTogUHJvY2Vzc1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9zaWRlTWVudVNlcnZpY2U6IFNpZGVNZW51U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3RyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChOQUVfT1BUSU9OX1NFTEVDVE9SX0NPTVBPTkVOVCkgcHJvdGVjdGVkIF9vcHRpb25TZWxlY3RvckNvbXBvbmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuX3RyZWVEYXRhU291cmNlID0gbmV3IE1hdFRyZWVOZXN0ZWREYXRhU291cmNlPENhc2VUcmVlTm9kZT4oKTtcbiAgICAgICAgdGhpcy5fdHJlZUNvbnRyb2wgPSBuZXcgTmVzdGVkVHJlZUNvbnRyb2w8Q2FzZVRyZWVOb2RlPihub2RlID0+IG5vZGUuY2hpbGRyZW4pO1xuICAgICAgICBfdHJlZUNhc2VWaWV3U2VydmljZS5yZWxvYWRDYXNlJC5hc09ic2VydmFibGUoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWxvYWRDdXJyZW50Q2FzZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fdHJlZVJvb3RMb2FkZWQkID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oMSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3RyZWVSb290TG9hZGVkJC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcm9vdEZpbHRlcihmaWx0ZXI6IEZpbHRlcikge1xuICAgICAgICB0aGlzLl9yb290Tm9kZXNGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gW107XG4gICAgICAgIHRoaXMubG9hZFRyZWVSb290KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhU291cmNlKCk6IE1hdFRyZWVOZXN0ZWREYXRhU291cmNlPENhc2VUcmVlTm9kZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJlZURhdGFTb3VyY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0cmVlQ29udHJvbCgpOiBOZXN0ZWRUcmVlQ29udHJvbDxDYXNlVHJlZU5vZGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyZWVDb250cm9sO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY3VycmVudE5vZGUoKTogQ2FzZVRyZWVOb2RlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnROb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGEgdmFsdWUgd2hlbmV2ZXIgYSBuZXcgcm9vdCBub2RlIEZpbHRlciBpcyBzZXQuXG4gICAgICpcbiAgICAgKiBgdHJ1ZWAgaXMgZW1pdHRlZCBpZiB0aGUgcm9vdCBub2RlIHdhcyBzdWNjZXNzZnVsbHkgbG9hZGVkLiBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIE9uIHN1YnNjcmlwdGlvbiBlbWl0cyB0aGUgbGFzdCBlbWl0dGVkIHZhbHVlIChpZiBhbnkpIHRvIHRoZSBzdWJzY3JpYmVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdHJlZVJvb3RMb2FkZWQkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJlZVJvb3RMb2FkZWQkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgX2N1cnJlbnRDYXNlKCk6IENhc2UgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudE5vZGUgPyB0aGlzLl9jdXJyZW50Tm9kZS5jYXNlIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGFuIGBPYnNlcnZhYmxlYCBvZiB0aGUge0BsaW5rIExvYWRpbmdFbWl0dGVyfSByZXByZXNlbnRpbmcgdGhlIGxvYWRpbmcgc3RhdGUgb2YgdGhlIHJvb3Qgbm9kZS5cbiAgICAgKiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSB0cmVlIGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAgICpcbiAgICAgKiBXYWl0IGZvciBhbiBlbWlzc2lvbiBvbiB0aGUgW3RyZWVSb290TG9hZGVkJF17QGxpbmsgQ2FzZVRyZWVTZXJ2aWNlI3RyZWVSb290TG9hZGVkJH0gc3RyZWFtIGJlZm9yZSBnZXR0aW5nIHRoaXMgT2JzZXJ2YWJsZS5cbiAgICAgKlxuICAgICAqIFRoZSBmaXJzdCB2YWx1ZSBlbWl0dGVkIGJ5IHRoZSBPYnNlcnZhYmxlIGlzIGBmYWxzZWAsIHdoZW4gdGhlIHRyZWUgZmluaXNoZXMgaW5pdGlhbGl6aW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm9vdE5vZGVMb2FkaW5nJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fcm9vdE5vZGUgPyB0aGlzLl9yb290Tm9kZS5sb2FkaW5nQ2hpbGRyZW4uYXNPYnNlcnZhYmxlKCkgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYW4gYE9ic2VydmFibGVgIG9mIHRoZSB7QGxpbmsgTG9hZGluZ0VtaXR0ZXJ9IHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSByb290IG5vZGUgaXMgY3VycmVudGx5XG4gICAgICogaW4gdGhlIHByb2Nlc3Mgb2YgYWRkaW5nIGEgbmV3IGNoaWxkIG5vZGUgb3Igbm90LlxuICAgICAqIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIHRyZWUgaGFzIG5vdCB5ZXQgYmVlbiBpbml0aWFsaXplZC5cbiAgICAgKlxuICAgICAqIFdhaXQgZm9yIGFuIGVtaXNzaW9uIG9uIHRoZSBbdHJlZVJvb3RMb2FkZWQkXXtAbGluayBDYXNlVHJlZVNlcnZpY2UjdHJlZVJvb3RMb2FkZWQkfSBzdHJlYW0gYmVmb3JlIGdldHRpbmcgdGhpcyBPYnNlcnZhYmxlLlxuICAgICAqXG4gICAgICogVGhlIGZpcnN0IHZhbHVlIGVtaXR0ZWQgYnkgdGhlIE9ic2VydmFibGUgaXMgYGZhbHNlYCwgd2hlbiB0aGUgdHJlZSBmaW5pc2hlcyBpbml0aWFsaXppbmcuXG4gICAgICovXG4gICAgcHVibGljIGdldCByb290Tm9kZUFkZGluZ0NoaWxkJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fcm9vdE5vZGUgPyB0aGlzLl9yb290Tm9kZS5hZGRpbmdOb2RlLmFzT2JzZXJ2YWJsZSgpIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdlYXRoZXIgdGhlIHRyZWUgaXMgZWFnZXIgbG9hZGVkIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gZWFnZXIgbG9hZCBsYXJnZSB0cmVlcyBhcyBlYWNoIG5vZGUgc2VuZHMgYSBzZXBhcmF0ZSBiYWNrZW5kIHJlcXVlc3QgdG8gbG9hZCBpdHMgZGF0YS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzRWFnZXJMb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0VhZ2VyTG9hZGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdlYXRoZXIgdGhlIHRyZWUgaXMgZWFnZXIgbG9hZGVkIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gZWFnZXIgbG9hZCBsYXJnZSB0cmVlcyBhcyBlYWNoIG5vZGUgc2VuZHMgYSBzZXBhcmF0ZSBiYWNrZW5kIHJlcXVlc3QgdG8gbG9hZCBpdHMgZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlYWdlciB0aGUgbmV3IHNldHRpbmcgZm9yIGVhZ2VyIGxvYWRpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGlzRWFnZXJMb2FkZWQoZWFnZXI6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5faXNFYWdlckxvYWRlZCA9IGVhZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGFuZCBwb3B1bGF0ZXMgdGhlIHRvcG1vc3QgbGV2ZWwgb2YgdGhlIHRyZWUuXG4gICAgICpcbiAgICAgKiBUaGUgZGlzcGxheWVkIGNhc2VzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoaXMgb2JqZWN0J3MgW3Jvb3RGaWx0ZXJde0BsaW5rIENhc2VUcmVlU2VydmljZSNyb290RmlsdGVyfS5cbiAgICAgKlxuICAgICAqIENhc2VzIGFyZSBsb2FkZWQgb25lIHBhZ2UgYXQgYSB0aW1lIGFuZCB0aGUgdHJlZSBpcyByZWZyZXNoZWQgYWZ0ZXIgZWFjaCBwYWdlLlxuICAgICAqIFtmaW5pc2hlZExvYWRpbmdGaXJzdExldmVsJF17QGxpbmsgQ2FzZVRyZWVTZXJ2aWNlI3RyZWVSb290TG9hZGVkJH1cbiAgICAgKiB3aWxsIGVtaXQgYHRydWVgIG9uY2UgdGhlIGxhc3QgcGFnZSBsb2FkcyBzdWNjZXNzZnVsbHkuXG4gICAgICogYGZhbHNlYCB3aWxsIGJlIGVtaXR0ZWQgaWYgYW55IG9mIHRoZSByZXF1ZXN0cyBmYWlsLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBsb2FkVHJlZVJvb3QoKSB7XG4gICAgICAgIGlmICh0aGlzLl9yb290Tm9kZXNGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2Nhc2VSZXNvdXJjZVNlcnZpY2Uuc2VhcmNoQ2FzZXModGhpcy5fcm9vdE5vZGVzRmlsdGVyKS5zdWJzY3JpYmUocGFnZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0NvbnRlbnQocGFnZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcm9vdE5vZGUgPSBuZXcgQ2FzZVRyZWVOb2RlKHBhZ2UuY29udGVudFswXSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2UuY29udGVudC5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdGaWx0ZXIgZm9yIHRyZWUgcm9vdCByZXR1cm5lZCBtb3JlIHRoYW4gb25lIGNhc2UuIFVzaW5nIHRoZSBmaXJzdCB2YWx1ZSBhcyB0cmVlIHJvb3QuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmVlUm9vdExvYWRlZCQubmV4dCh0cnVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ1RyZWUgcm9vdCBjYW5ub3QgYmUgZ2VuZXJhdGVkIGZyb20gdGhlIHByb3ZpZGVkIGZpbHRlcicsIHBhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ1Jvb3Qgbm9kZSBvZiB0aGUgY2FzZSB0cmVlIGNvdWxkIG5vdCBiZSBsb2FkZWQnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJlZVJvb3RMb2FkZWQkLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBsb2FkZWQgdHJlZSByb290IHRvIHRoZSBkaXNwbGF5IGJhc2VkIG9uIHRoZSBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSBzaG93Um9vdCB3aGV0aGVyIHRoZSByb290IG9mIHRoZSB0cmVlIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRyZWUgb3Igbm90LlxuICAgICAqIElmIHRoZSByb290IGlzIG5vdCBkaXNwbGF5ZWQgaXQncyBjaGlsZHJlbiB3aWxsIGJlIGRpc3BsYXllZCBvbiB0aGUgZmlyc3QgbGV2ZWwuXG4gICAgICogQHJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW4gdGhlIHRyZWUgZmluaXNoZXMgaW5pdGlhbGl6YXRpb24uXG4gICAgICovXG4gICAgcHVibGljIGluaXRpYWxpemVUcmVlKHNob3dSb290OiBib29sZWFuKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignU2V0IGEgRmlsdGVyIGJlZm9yZSBpbml0aWFsaXppbmcgdGhlIGNhc2UgdHJlZScpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IobmV3IEVycm9yKCdTZXQgYSBGaWx0ZXIgYmVmb3JlIGluaXRpYWxpemluZyB0aGUgY2FzZSB0cmVlJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2hvd1Jvb3QgPSBzaG93Um9vdDtcblxuICAgICAgICBpZiAoc2hvd1Jvb3QpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gW3RoaXMuX3Jvb3ROb2RlXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5fcm9vdE5vZGUuY2hpbGRyZW47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0OiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgICAgICBpZiAoIXNob3dSb290IHx8IHRoaXMuX2lzRWFnZXJMb2FkZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBSZXBsYXlTdWJqZWN0PHZvaWQ+KDEpO1xuICAgICAgICAgICAgcmV0ID0gcmVzdWx0LmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5leHBhbmROb2RlKHRoaXMuX3Jvb3ROb2RlKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRyZWUoKTtcbiAgICAgICAgICAgICAgICByZXN1bHQubmV4dCgpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hUcmVlKCk7XG4gICAgICAgICAgICByZXQgPSBvZlZvaWQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdGlmaWVzIHRoZSBwYXJlbnQgVHJlZUNhc2VWaWV3IHRoYXQgYSBjYXNlIHdhcyBjbGlja2VkIGluIHRoZSB0cmVlIGFuZCBpdCdzIFRhc2sgc2hvdWxkIGJlIGRpc3BsYXllZFxuICAgICAqL1xuICAgIHB1YmxpYyBjaGFuZ2VBY3RpdmVOb2RlKG5vZGU6IENhc2VUcmVlTm9kZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jdXJyZW50Tm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMuX3RyZWVDYXNlVmlld1NlcnZpY2UubG9hZFRhc2skLm5leHQobm9kZSA/IG5vZGUuY2FzZSA6IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgZXhwYW5zaW9uIHN0YXRlIG9mIGEgbm9kZVxuICAgICAqIEBwYXJhbSBub2RlIHRoZSB7QGxpbmsgQ2FzZVRyZWVOb2RlfSB3aG8ncyBjb250ZW50IHNob3VsZCBiZSB0b2dnbGVkXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZU5vZGUobm9kZTogQ2FzZVRyZWVOb2RlKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl90cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpKSB7XG4gICAgICAgICAgICB0aGlzLl90cmVlQ29udHJvbC5jb2xsYXBzZShub2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kTm9kZShub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4cGFuZHMgdGhlIHRhcmdldCBub2RlIGluIHRoZSB0cmVlIGFuZCByZWxvYWRzIGl0J3MgY2hpbGRyZW4gaWYgdGhleSBhcmUgbWFya2VkIGFzIGRpcnR5XG4gICAgICogQHBhcmFtIG5vZGUgdGhlIHtAbGluayBDYXNlVHJlZU5vZGV9IHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkXG4gICAgICogQHJldHVybnMgZW1pdHMgYHRydWVgIGlmIHRoZSBub2RlIGlzIGV4cGFuZGVkIGFuZCBgZmFsc2VgIGlmIG5vdC4gSWYgdGhlIGV4cGFuc2lvbiBjYXVzZXMgbW9yZSBub2RlIGV4cGFuc2lvbnNcbiAgICAgKiAoZS5nLiBlYWdlciBsb2FkZWQgdHJlZSkgdGhlbiwgdGhlIE9ic2VydmFibGUgZW1pdHMgYWZ0ZXIgYWxsIHRoZSBzdWJ0cmVlIGV4cGFuc2lvbnMgY29tcGxldGUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGV4cGFuZE5vZGUobm9kZTogQ2FzZVRyZWVOb2RlKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnUmVxdWVzdGluZyBleHBhbnNpb24gb2YgdHJlZSBub2RlJywgbm9kZS50b0xvZ2dhYmxlRm9ybSgpKTtcblxuICAgICAgICBpZiAobm9kZS5sb2FkaW5nQ2hpbGRyZW4uaXNBY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnTm9kZSByZXF1ZXN0ZWQgZm9yIGV4cGFuc2lvbiBpcyBsb2FkaW5nLiBFeHBhbnNpb24gY2FuY2VsZWQuJyk7XG4gICAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFub2RlLmRpcnR5Q2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnTm9kZSByZXF1ZXN0ZWQgZm9yIGV4cGFuc2lvbiBoYXMgY2xlYW4gY2hpbGRyZW4uIFNpbXBsZSBleHBhbnNpb24uJyk7XG4gICAgICAgICAgICB0aGlzLnRyZWVDb250cm9sLmV4cGFuZChub2RlKTtcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJldCA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuICAgICAgICB0aGlzLnVwZGF0ZU5vZGVDaGlsZHJlbihub2RlKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdOb2RlIHJlcXVlc3RlZCBmb3IgZXhwYW5zaW9uIHdpdGggZGlydHkgY2hpbGRyZW4gaGFkIGl0cyBjaGlsZHJlbiByZWxvYWRlZC4nKTtcbiAgICAgICAgICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ05vZGUgZXhwYW5kZWQuJywgbm9kZS50b0xvZ2dhYmxlRm9ybSgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVDb250cm9sLmV4cGFuZChub2RlKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNFYWdlckxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoYEVhZ2VyIGxvYWRpbmcgY2hpbGRyZW4gb2YgdHJlZSBub2RlIHdpdGggY2FzZSBpZCAnJHtub2RlLmNhc2Uuc3RyaW5nSWR9J2ApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbm5lck9ic2VydmFibGVzID0gbm9kZS5jaGlsZHJlbi5tYXAoY2hpbGROb2RlID0+IHRoaXMuZXhwYW5kTm9kZShjaGlsZE5vZGUpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9ya0pvaW4gZG9lc24ndCBlbWl0IHdpdGggMCBpbnB1dCBvYnNlcnZhYmxlc1xuICAgICAgICAgICAgICAgICAgICBpbm5lck9ic2VydmFibGVzLnB1c2gob2YodHJ1ZSkpO1xuICAgICAgICAgICAgICAgICAgICBmb3JrSm9pbihpbm5lck9ic2VydmFibGVzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0Lm5leHQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXQuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0Lm5leHQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0Lm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJldC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciBkaXJ0eSBjaGlsZHJlbiBuZWVkIHRvIGJlIHJlbG9hZGVkIGFuZCByZWxvYWRzIHRoZW0gaWYgbmVlZGVkLlxuICAgICAqIEBwYXJhbSBub2RlIHRoZSB7QGxpbmsgQ2FzZVRyZWVOb2RlfSB3aG8ncyBjaGlsZHJlbiBhcmUgdXBkYXRlZFxuICAgICAqIEByZXR1cm5zIGVtaXRzIHdoZW4gbG9hZGluZyBmaW5pc2hlc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCB1cGRhdGVOb2RlQ2hpbGRyZW4obm9kZTogQ2FzZVRyZWVOb2RlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIG5vZGUubG9hZGluZ0NoaWxkcmVuLm9uKCk7XG5cbiAgICAgICAgY29uc3QgY2hpbGRyZW5DYXNlUmVmID0gZ2V0SW1tZWRpYXRlRGF0YShub2RlLmNhc2UsIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DSElMRFJFTl9DQVNFX1JFRik7XG4gICAgICAgIGlmICghY2hpbGRyZW5DYXNlUmVmIHx8IGNoaWxkcmVuQ2FzZVJlZi52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFRyZWUoKTtcbiAgICAgICAgICAgIG5vZGUuZGlydHlDaGlsZHJlbiA9IGZhbHNlO1xuICAgICAgICAgICAgbm9kZS5sb2FkaW5nQ2hpbGRyZW4ub2ZmKCk7XG4gICAgICAgICAgICByZXR1cm4gb2ZWb2lkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IGNoaWxkcmVuQ2FzZVJlZi52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ2hpbGRyZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZE5vZGUgPT4gZXhpc3RpbmdDaGlsZHJlbi5hZGQoY2hpbGROb2RlLmNhc2Uuc3RyaW5nSWQpKTtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbkNhc2VSZWYudmFsdWUuZXZlcnkoY2FzZUlkID0+IGV4aXN0aW5nQ2hpbGRyZW4uaGFzKGNhc2VJZCkpKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5kaXJ0eUNoaWxkcmVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbm9kZS5sb2FkaW5nQ2hpbGRyZW4ub2ZmKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mVm9pZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlUGFnZU9mQ2hpbGRyZW4obm9kZSwgMCkucGlwZShcbiAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRyZWUoKTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5kaXJ0eUNoaWxkcmVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUubG9hZGluZ0NoaWxkcmVuLm9mZigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyBldmVyeSBwYWdlIG9mIGNoaWxkcmVuIGZyb20gdGhlIGdpdmVuIG51bWJlciBhbmQgdXBkYXRlcyB0aGUgZXhpc3RpbmcgY2hpbGRyZW4uXG4gICAgICpcbiAgICAgKiBNaXNzaW5nIG5vZGVzIGFyZSByZW1vdmVkLiBFeGlzdGluZyBub2RlcyBhcmUgbWFya2VkIGFzIGRpcnR5LiBOZXcgbm9kZXMgYXJlIGFkZGVkLlxuICAgICAqXG4gICAgICogTm9kZXMgYXJlIHJldHVybmVkIGluIHRoZWlyIGluc2VydGlvbiBvcmRlci5cbiAgICAgKiBAcGFyYW0gbm9kZSB0aGUge0BsaW5rIENhc2VUcmVlTm9kZX0gd2hvJ3MgY2hpbGRyZW4gYXJlIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gcGFnZU51bWJlciB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBwYWdlIHRoYXQgc2hvdWxkIGJlIGxvYWRlZC4gQWxsIGZvbGxvd2luZyBwYWdlcyBhcmUgbG9hZGVkIGFzIHdlbGxcbiAgICAgKiBAcmV0dXJucyBuZXh0IGlzIGVtaXR0ZWQgd2hlbiBsb2FkaW5nIG9mIGFsbCBwYWdlcyBjb21wbGV0ZXMgKHJlZ2FyZGxlc3Mgb2YgdGhlIG91dGNvbWUpXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHVwZGF0ZVBhZ2VPZkNoaWxkcmVuKG5vZGU6IENhc2VUcmVlTm9kZSwgcGFnZU51bWJlcjogbnVtYmVyKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gdGhpcy5jcmVhdGVDaGlsZFJlcXVlc3RCb2R5KG5vZGUpO1xuICAgICAgICBpZiAoIXJlcXVlc3RCb2R5KSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0Nhbm5vdCBjcmVhdGUgZmlsdGVyIHRvIGZpbmQgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIG5vZGUnLCBub2RlLmNhc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IobmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIGZpbHRlciB0byBmaW5kIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBub2RlJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZG9uZSA9IG5ldyBSZXBsYXlTdWJqZWN0PHZvaWQ+KDEpO1xuXG4gICAgICAgIGxldCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdwYWdlJywgYCR7cGFnZU51bWJlcn1gKS5zZXQoJ3NvcnQnLCAnY3JlYXRpb25EYXRlLGFzYycpO1xuICAgICAgICB0aGlzLl9jYXNlUmVzb3VyY2VTZXJ2aWNlLmdldENhc2VzKHJlcXVlc3RCb2R5LCBwYXJhbXMpLnN1YnNjcmliZShwYWdlID0+IHtcbiAgICAgICAgICAgIGlmICghaGFzQ29udGVudChwYWdlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ2hpbGQgY2FzZXMgaW52YWxpZCBwYWdlIGNvbnRlbnQnLCBwYWdlKTtcbiAgICAgICAgICAgICAgICBkb25lLm5leHQoKTtcbiAgICAgICAgICAgICAgICBkb25lLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRDaGlsZHJlbldpdGhOZXdQYWdlKG5vZGUsIHBhZ2UpO1xuXG4gICAgICAgICAgICBpZiAocGFnZU51bWJlciArIDEgPCBwYWdlLnBhZ2luYXRpb24udG90YWxQYWdlcykge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGFnZU9mQ2hpbGRyZW4obm9kZSwgcGFnZU51bWJlciArIDEpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICBkb25lLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvbmUubmV4dCgpO1xuICAgICAgICAgICAgICAgIGRvbmUuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0NoaWxkIGNhc2VzIGNvdWxkIG5vdCBiZSBsb2FkZWQnLCBlcnJvcik7XG4gICAgICAgICAgICBkb25lLm5leHQoKTtcbiAgICAgICAgICAgIGRvbmUuY29tcGxldGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRvbmUuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIHtAbGluayBDYXNlVHJlZU5vZGV9IHdpdGggW0Nhc2VzXXtAbGluayBDYXNlfSBmcm9tIHRoZSBwcm92aWRlZCB7QGxpbmsgUGFnZX0uXG4gICAgICogQHBhcmFtIG5vZGUgdGhlIHtAbGluayBDYXNlVHJlZU5vZGV9IHdobydzIGNoaWxkcmVuIGFyZSB1cGRhdGVkXG4gICAgICogQHBhcmFtIHBhZ2UgdGhlIHtAbGluayBQYWdlfSB0aGF0IGNvbnRhaW5zIHRoZSB1cGRhdGVkIGNoaWxkcmVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRDaGlsZHJlbldpdGhOZXdQYWdlKG5vZGU6IENhc2VUcmVlTm9kZSwgcGFnZTogUGFnZTxDYXNlPik6IHZvaWQge1xuICAgICAgICBwYWdlLmNvbnRlbnQuZm9yRWFjaCgobmV3Q2FzZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcGFnZS5wYWdpbmF0aW9uLnNpemUgKiBwYWdlLnBhZ2luYXRpb24ubnVtYmVyICsgaW5kZXg7XG4gICAgICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBub2RlLmNoaWxkcmVuLmxlbmd0aCAmJiBub2RlLmNoaWxkcmVuW3Bvc2l0aW9uXS5jYXNlLnN0cmluZ0lkICE9PSBuZXdDYXNlLnN0cmluZ0lkKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5zcGxpY2UocG9zaXRpb24sIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSBwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4ucHVzaChuZXcgQ2FzZVRyZWVOb2RlKG5ld0Nhc2UsIG5vZGUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbltwb3NpdGlvbl0uY2FzZSA9IG5ld0Nhc2U7XG4gICAgICAgICAgICAgICAgbm9kZS5kaXJ0eUNoaWxkcmVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVDb250cm9sLmNvbGxhcHNlRGVzY2VuZGFudHMobm9kZS5jaGlsZHJlbltwb3NpdGlvbl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gbm9kZSB0aGUge0BsaW5rIENhc2VUcmVlTm9kZX0gd2hvJ3MgY2hpbGRyZW4gdGhlIHtAbGluayBGaWx0ZXJ9IHNob3VsZCByZXR1cm5cbiAgICAgKiBAcmV0dXJucyBhIHJlcXVlc3QgYm9keSB0aGF0IGZpbmRzIGFsbCBjaGlsZCBjYXNlcyBvZiB0aGUgZ2l2ZW4gYG5vZGVgLlxuICAgICAqIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIHByb3ZpZGVkIGBub2RlYCBkb2Vzbid0IGNvbnRhaW4gZW5vdWdoIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSB0aGUgcmVxdWVzdCBib2R5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVDaGlsZFJlcXVlc3RCb2R5KG5vZGU6IENhc2VUcmVlTm9kZSk6IENhc2VHZXRSZXF1ZXN0Qm9keSB7XG4gICAgICAgIGNvbnN0IGNoaWxkQ2FzZVJlZiA9IGdldEltbWVkaWF0ZURhdGEobm9kZS5jYXNlLCBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0hJTERSRU5fQ0FTRV9SRUYpO1xuICAgICAgICBpZiAoIWNoaWxkQ2FzZVJlZikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7c3RyaW5nSWQ6IChjaGlsZENhc2VSZWYudmFsdWUgYXMgQXJyYXk8c3RyaW5nPil9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjaGlsZCB0byB0aGUgcm9vdCBub2RlLlxuICAgICAqXG4gICAgICogVXNlZnVsIGlmIHlvdSBhcmUgdXNpbmcgdGhlIGxheW91dCB3aGVyZSB0aGUgcm9vdCBub2RlIGlzIGhpZGRlbi5cbiAgICAgKiBAcmV0dXJucyBlbWl0cyBgdHJ1ZWAgaWYgdGhlIGNoaWxkIHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQsIGBmYWxzZWAgaWYgbm90XG4gICAgICovXG4gICAgcHVibGljIGFkZFJvb3RDaGlsZE5vZGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHJldCA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuICAgICAgICB0aGlzLmFkZENoaWxkTm9kZSh0aGlzLl9yb290Tm9kZSkuc3Vic2NyaWJlKGFkZGVkID0+IHtcbiAgICAgICAgICAgIGlmIChhZGRlZCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fc2hvd1Jvb3QgJiYgdGhpcy5fdHJlZURhdGFTb3VyY2UuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJlZURhdGFTb3VyY2UuZGF0YSA9IHRoaXMuX3Jvb3ROb2RlLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hUcmVlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0Lm5leHQoYWRkZWQpO1xuICAgICAgICAgICAgcmV0LmNvbXBsZXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgY2hpbGQgbm9kZSB0byB0aGUgZ2l2ZW4gbm9kZSBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgbm9kZSdzIGNhc2VcbiAgICAgKiBAcmV0dXJucyBlbWl0cyBgdHJ1ZWAgaWYgdGhlIGNoaWxkIHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQsIGBmYWxzZWAgaWYgbm90XG4gICAgICovXG4gICAgcHVibGljIGFkZENoaWxkTm9kZShjbGlja2VkTm9kZTogQ2FzZVRyZWVOb2RlKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIGNsaWNrZWROb2RlLmFkZGluZ05vZGUub24oKTtcbiAgICAgICAgY29uc3QgY2FzZVJlZkZpZWxkID0gZ2V0SW1tZWRpYXRlRGF0YShjbGlja2VkTm9kZS5jYXNlLCBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0hJTERSRU5fQ0FTRV9SRUYpO1xuXG4gICAgICAgIGlmIChjYXNlUmVmRmllbGQuYWxsb3dlZE5ldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoYENhc2UgJHtjbGlja2VkTm9kZS5jYXNlLnN0cmluZ0lkfSBjYW4gYWRkIG5ldyB0cmVlIG5vZGVzIGJ1dCBoYXMgbm8gYWxsb3dlZCBuZXRzYCk7XG4gICAgICAgICAgICBjbGlja2VkTm9kZS5hZGRpbmdOb2RlLm9mZigpO1xuICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJldCA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuXG4gICAgICAgIGlmIChjYXNlUmVmRmllbGQuYWxsb3dlZE5ldHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFuZEFkZENoaWxkQ2FzZShjYXNlUmVmRmllbGQuYWxsb3dlZE5ldHNbMF0sIGNsaWNrZWROb2RlLCByZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc1NlcnZpY2UuZ2V0TmV0cyhjYXNlUmVmRmllbGQuYWxsb3dlZE5ldHMpLnN1YnNjcmliZShuZXRzID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzaWRlTWV1UmVmID0gdGhpcy5fc2lkZU1lbnVTZXJ2aWNlLm9wZW4odGhpcy5fb3B0aW9uU2VsZWN0b3JDb21wb25lbnQsIFNpZGVNZW51U2l6ZS5NRURJVU0sIHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGNsaWNrZWROb2RlLmNhc2UudGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IG5ldHMubWFwKG5ldCA9PiAoe3RleHQ6IG5ldC50aXRsZSwgdmFsdWU6IG5ldC5pZGVudGlmaWVyfSkpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IHNpZGVNZW51U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgc2lkZU1lbnVTdWJzY3JpcHRpb24gPSBzaWRlTWV1UmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhZXZlbnQuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVBbmRBZGRDaGlsZENhc2UoZXZlbnQuZGF0YS52YWx1ZSwgY2xpY2tlZE5vZGUsIHJldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWRlTWVudVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2tlZE5vZGUuYWRkaW5nTm9kZS5vZmYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY2FzZSBhbmQgYWRkcyBpdCB0byB0aGUgY2hpbGRyZW4gb2YgdGhlIHNwZWNpZmllZCBub2RlXG4gICAgICogQHBhcmFtIHByb2Nlc3NJZGVudGlmaWVyIGlkZW50aWZpZXIgb2YgdGhlIHByb2Nlc3MgdGhhdCBzaG91bGQgYmUgY3JlYXRlZFxuICAgICAqIEBwYXJhbSBjbGlja2VkTm9kZSB0aGUgbm9kZSB0aGF0IGlzIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBjYXNlXG4gICAgICogQHBhcmFtIG9wZXJhdGlvblJlc3VsdCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gd2lsbCBiZSBlbWl0dGVkIGludG8gdGhpcyBzdHJlYW0gd2hlbiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVBbmRBZGRDaGlsZENhc2UocHJvY2Vzc0lkZW50aWZpZXI6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrZWROb2RlOiBDYXNlVHJlZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25SZXN1bHQ6IFN1YmplY3Q8Ym9vbGVhbj4pIHtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc1NlcnZpY2UuZ2V0TmV0KHByb2Nlc3NJZGVudGlmaWVyKS5zdWJzY3JpYmUobmV0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkVGl0bGVJbW1lZGlhdGUgPSBnZXRJbW1lZGlhdGVEYXRhKGNsaWNrZWROb2RlLmNhc2UsIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DSElMRF9OT0RFX1RJVExFKTtcbiAgICAgICAgICAgIGxldCBjaGlsZFRpdGxlID0gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjYXNlVHJlZS5uZXdOb2RlRGVmYXVsdE5hbWUnKTtcbiAgICAgICAgICAgIGlmICghIWNoaWxkVGl0bGVJbW1lZGlhdGUpIHtcbiAgICAgICAgICAgICAgICBjaGlsZFRpdGxlID0gY2hpbGRUaXRsZUltbWVkaWF0ZS52YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoISFuZXQuZGVmYXVsdENhc2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRUaXRsZSA9IG5ldC5kZWZhdWx0Q2FzZU5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9jYXNlUmVzb3VyY2VTZXJ2aWNlLmNyZWF0ZUNhc2Uoe1xuICAgICAgICAgICAgICAgIHRpdGxlOiBjaGlsZFRpdGxlLFxuICAgICAgICAgICAgICAgIG5ldElkOiBuZXQuc3RyaW5nSWRcbiAgICAgICAgICAgIH0pLnN1YnNjcmliZSgob3V0Y29tZVJlc291cmNlOiBFdmVudE91dGNvbWVNZXNzYWdlUmVzb3VyY2UpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYXNlUmVmRmllbGQgPSBnZXRJbW1lZGlhdGVEYXRhKGNsaWNrZWROb2RlLmNhc2UsIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DSElMRFJFTl9DQVNFX1JFRik7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0Q2FzZVJlZlZhbHVlID0gWy4uLmNhc2VSZWZGaWVsZC52YWx1ZSwgKG91dGNvbWVSZXNvdXJjZS5vdXRjb21lIGFzIENyZWF0ZUNhc2VFdmVudE91dGNvbWUpLmFDYXNlLnN0cmluZ0lkXTtcbiAgICAgICAgICAgICAgICB0aGlzLnBlcmZvcm1DYXNlUmVmQ2FsbChjbGlja2VkTm9kZS5jYXNlLnN0cmluZ0lkLCBzZXRDYXNlUmVmVmFsdWUpLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVDaGFuZ2UgPT4gdGhpcy51cGRhdGVUcmVlQWZ0ZXJDaGlsZEFkZChjbGlja2VkTm9kZSwgdmFsdWVDaGFuZ2UgPyB2YWx1ZUNoYW5nZSA6IHNldENhc2VSZWZWYWx1ZSwgb3BlcmF0aW9uUmVzdWx0KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgdHJlZSBhZnRlciBhZGRpbmcgYSBuZXcgY2hpbGRcbiAgICAgKiBAcGFyYW0gY2xpY2tlZE5vZGUgdGhlIHBhcmVudCBub2RlXG4gICAgICogQHBhcmFtIG5ld0Nhc2VSZWZWYWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSBwYXJlbnQgbm9kZSdzIGNhc2UgcmVmXG4gICAgICogQHBhcmFtIG9wZXJhdGlvblJlc3VsdCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gd2lsbCBiZSBlbWl0dGVkIGludG8gdGhpcyBzdHJlYW0gd2hlbiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCB1cGRhdGVUcmVlQWZ0ZXJDaGlsZEFkZChjbGlja2VkTm9kZTogQ2FzZVRyZWVOb2RlLCBuZXdDYXNlUmVmVmFsdWU6IEFycmF5PHN0cmluZz4sIG9wZXJhdGlvblJlc3VsdDogU3ViamVjdDxib29sZWFuPik6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZU5vZGVDaGlsZHJlbkZyb21DaGFuZ2VkRmllbGRzKGNsaWNrZWROb2RlLCBuZXdDYXNlUmVmVmFsdWUpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgICAgY2xpY2tlZE5vZGUuYWRkaW5nTm9kZS5vZmYoKTtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kTm9kZShjbGlja2VkTm9kZSkuc3Vic2NyaWJlKGV4cGFuZFN1Y2Nlc3MgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChleHBhbmRTdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQWN0aXZlTm9kZShjbGlja2VkTm9kZS5jaGlsZHJlbltjbGlja2VkTm9kZS5jaGlsZHJlbi5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5leGVjdXRlQWZ0ZXJBY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9wZXJhdGlvblJlc3VsdC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvblJlc3VsdC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJlbW92ZXMgdGhlIHByb3ZpZGVkIG5vbi1yb290IG5vZGUgaWYgdGhlIHVuZGVybHlpbmcgY2FzZSBhbGxvd3MgaXQuXG4gICAgICpcbiAgICAgKiBUaGUgdW5kZXJseWluZyBjYXNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FzZSByZWYgb2YgaXQncyBwYXJlbnQgZWxlbWVudCB3aXRoIHRoZSBoZWxwIGZyb20gdGhlIGByZW1vdmVgXG4gICAgICogb3BlcmF0aW9uIHByb3ZpZGVkIGJ5IGNhc2UgcmVmIGl0c2VsZi5cbiAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0aGF0IHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIHRyZWVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlTm9kZShub2RlOiBDYXNlVHJlZU5vZGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFub2RlLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdDYXNlIHRyZWUgZG9lc25cXCd0IHN1cHBvcnQgcmVtb3ZhbCBvZiB0aGUgcm9vdCBub2RlLCBhcyBpdCBoYXMgbm8gcGFyZW50IGNhc2UgcmVmLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5yZW1vdmluZ05vZGUub24oKTtcbiAgICAgICAgY29uc3QgY2FzZVJlZkltbWVkaWF0ZSA9IGdldEltbWVkaWF0ZURhdGEobm9kZS5wYXJlbnQuY2FzZSwgVHJlZVBldHJpZmxvd0lkZW50aWZpZXJzLkNISUxEUkVOX0NBU0VfUkVGKTtcbiAgICAgICAgY29uc3Qgc2V0Q2FzZVJlZlZhbHVlID0gKGNhc2VSZWZJbW1lZGlhdGUudmFsdWUgYXMgQXJyYXk8c3RyaW5nPikuZmlsdGVyKGlkID0+IGlkICE9PSBub2RlLmNhc2Uuc3RyaW5nSWQpO1xuICAgICAgICB0aGlzLnBlcmZvcm1DYXNlUmVmQ2FsbChub2RlLnBhcmVudC5jYXNlLnN0cmluZ0lkLCBzZXRDYXNlUmVmVmFsdWUpLnN1YnNjcmliZShjYXNlUmVmQ2hhbmdlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0Nhc2VSZWZWYWx1ZSA9IGNhc2VSZWZDaGFuZ2UgPyBjYXNlUmVmQ2hhbmdlIDogc2V0Q2FzZVJlZlZhbHVlO1xuICAgICAgICAgICAgdGhpcy5kZWxldGVSZW1vdmVkTm9kZXMobm9kZS5wYXJlbnQsIG5ld0Nhc2VSZWZWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVDaGlsZHJlbkZyb21DaGFuZ2VkRmllbGRzKG5vZGUucGFyZW50LCBuZXdDYXNlUmVmVmFsdWUpO1xuXG4gICAgICAgICAgICBub2RlLnJlbW92aW5nTm9kZS5vZmYoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kZXNlbGVjdE5vZGVJZkRlc2NlbmRhbnRPZihub2RlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHBhbmRzIGFsbCBub2RlcyBpbiB0aGUgdHJlZSBkaWN0YXRlZCBieSB0aGUgYXJndW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGF0aCBub2RlcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZCBhbG9uZyB3aXRoIHRoZWlyIHBhdGggZnJvbSB0aGUgcm9vdCBub2RlXG4gICAgICovXG4gICAgcHVibGljIGV4cGFuZFBhdGgocGF0aDogQ2FzZVRyZWVQYXRoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcm9vdE5vZGUgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YVswXTtcbiAgICAgICAgd2hpbGUgKHJvb3ROb2RlLnBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByb290Tm9kZSA9IHJvb3ROb2RlLnBhcmVudDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV4cGFuZExldmVsKFtyb290Tm9kZV0sIHRoaXMuY29udmVydFBhdGhUb0V4cGFuc2lvblRyZWUocGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybXMgYSB7QExpbmsgQ2FzZVRyZWVQYXRofSBvYmplY3QgaW50byBhbiB7QGxpbmsgRXhwYW5zaW9uVHJlZX0gb2JqZWN0LlxuICAgICAqIFRoZSByZXN1bHQgaGFzIGFsbCB0aGUgY29tbW9uIHBhdGhzIG1lcmdlZCBpbnRvIHNpbmdsZSBicmFuY2hlcyBvZiB0aGUgcmVzdWx0aW5nIHRyZWUgc3RydWN0dXJlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhdGhzIG5vZGVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkIGFsb25nIHdpdGggdGhlaXIgcGF0aCBmcm9tIHRoZSByb290IG5vZGVcbiAgICAgKiBAcmV0dXJucyBhbiB7QGxpbmsgRXhwYW5zaW9uVHJlZX0gZXF1aXZhbGVudCB0byB0aGUgcHJvdmlkZWQge0BsaW5rIENhc2VUcmVlUGF0aH1cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29udmVydFBhdGhUb0V4cGFuc2lvblRyZWUocGF0aHM6IENhc2VUcmVlUGF0aCk6IEV4cGFuc2lvblRyZWUge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhwYXRocykuZm9yRWFjaChwYXRoID0+IHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IHJlc3VsdDtcbiAgICAgICAgICAgIHBhdGguZm9yRWFjaChub2RlSWQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZVtub2RlSWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGVbbm9kZUlkXSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlW25vZGVJZF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgZXhwYW5kcyBhbGwgbm9kZXMgZnJvbSB0aGUgcHJvdmlkZWQgYXJyYXkgb2Ygbm9kZXMsIHRoYXQgYXBwZWFyIGluIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHtAbGluayBFeHBhbnNpb25UcmVlfSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGV2ZWxOb2RlcyBub2RlcyBmcm9tIHdoaWNoIHRoZSBleHBhbnNpb24gc2hvdWxkIHN0YXJ0XG4gICAgICogQHBhcmFtIHRhcmdldHMgYSB0cmVlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIG5vZGVzIHRoYXQgYXJlIHRvIGJlIGV4cGFuZGVkIHJlY3Vyc2l2ZWx5LlxuICAgICAqIFRoZSB0b3AgbGV2ZWwgbm9kZXMgYXJlIGV4cGFuZGVkIGZpcnN0LCBmcm9tIHRoZSBwcm92aWRlZCBgbGV2ZWxOb2Rlc2AuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGV4cGFuZExldmVsKGxldmVsTm9kZXM6IEFycmF5PENhc2VUcmVlTm9kZT4sIHRhcmdldHM6IEV4cGFuc2lvblRyZWUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGVzaXJlZElkcyA9IG5ldyBTZXQoT2JqZWN0LmtleXModGFyZ2V0cykpO1xuICAgICAgICBpZiAoZGVzaXJlZElkcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXZlbE5vZGVzLmZvckVhY2gobiA9PiB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gbjtcbiAgICAgICAgICAgIGlmICghZGVzaXJlZElkcy5oYXMobm9kZS5jYXNlLnN0cmluZ0lkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZXhwYW5kTm9kZShub2RlKS5zdWJzY3JpYmUoc3VjY2VzcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnQ291bGQgbm90IGV4cGFuZCB0cmVlIG5vZGUgd2l0aCBJRDogJyArIG5vZGUuY2FzZS5zdHJpbmdJZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5leHBhbmRMZXZlbChub2RlLmNoaWxkcmVuLCB0YXJnZXRzW25vZGUuY2FzZS5zdHJpbmdJZF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgdGhlIHN1YnRyZWVzIHJvb3RlZCBhdCB0aGUgbm9kZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcGFyZW50IG5vZGUncyBjaGlsZCBjYXNlIHJlZiB2YWx1ZXMsXG4gICAgICogYnV0IGFyZSBubyBsb25nZXIgcHJlc2VudCBpbiB0aGUgbmV3IHZhbHVlXG4gICAgICogQHBhcmFtIHBhcmVudE5vZGUgYW4gaW5uZXIgbm9kZSBvZiB0aGUgdHJlZSB0aGF0IGhhZCBzb21lIG9mIGl0J3MgY2hpbGRyZW4gcmVtb3ZlZFxuICAgICAqIEBwYXJhbSBuZXdDYXNlUmVmVmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcGFyZW50IG5vZGUncyBjYXNlIHJlZlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBkZWxldGVSZW1vdmVkTm9kZXMocGFyZW50Tm9kZTogQ2FzZVRyZWVOb2RlLCBuZXdDYXNlUmVmVmFsdWU6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZENoaWxkcmVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGdldEltbWVkaWF0ZURhdGEocGFyZW50Tm9kZS5jYXNlLCBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0hJTERSRU5fQ0FTRV9SRUYpLnZhbHVlLmZvckVhY2goaWQgPT4gcmVtb3ZlZENoaWxkcmVuLmFkZChpZCkpO1xuICAgICAgICBuZXdDYXNlUmVmVmFsdWUuZm9yRWFjaChpZCA9PiByZW1vdmVkQ2hpbGRyZW4uZGVsZXRlKGlkKSk7XG4gICAgICAgIHJlbW92ZWRDaGlsZHJlbi5mb3JFYWNoKHJlbW92ZWRJZCA9PiB0aGlzLl9jYXNlUmVzb3VyY2VTZXJ2aWNlLmRlbGV0ZUNhc2UocmVtb3ZlZElkLCB0cnVlKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZU1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdSZW1vdmFsIG9mIGNoaWxkIGNhc2UgdW5zdWNjZXNzZnVsJywgcmVzcG9uc2VNZXNzYWdlLmVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3RzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbm9kZSBpZiBpdCBpcyBhIGRlc2NlbmRhbnQgb2YgdGhlIHByb3ZpZGVkIG5vZGVcbiAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB3aG8ncyBkZXNjZW5kYW50cyBzaG91bGQgYmUgZGVzZWxlY3RlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBkZXNlbGVjdE5vZGVJZkRlc2NlbmRhbnRPZihub2RlOiBDYXNlVHJlZU5vZGUpOiB2b2lkIHtcbiAgICAgICAgbGV0IGJ1YmJsaW5nTm9kZSA9IHRoaXMuY3VycmVudE5vZGU7XG4gICAgICAgIHdoaWxlIChidWJibGluZ05vZGUgJiYgYnViYmxpbmdOb2RlICE9PSB0aGlzLl9yb290Tm9kZSkge1xuICAgICAgICAgICAgaWYgKGJ1YmJsaW5nTm9kZSA9PT0gbm9kZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQWN0aXZlTm9kZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnViYmxpbmdOb2RlID0gYnViYmxpbmdOb2RlLnBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgYmFja2VuZCBjYWxsIG9uIHRoZSBnaXZlbiBjYXNlLCBhbmQgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNhc2UgcmVmIGZpZWxkIGluIHRoZSB0cmFuc2l0aW9uIGRlZmluZWQgYnlcbiAgICAgKiBbQ0FTRV9SRUZfVFJBTlNJVElPTl17QGxpbmsgVHJlZVBldHJpZmxvd0lkZW50aWZpZXJzI0NBU0VfUkVGX1RSQU5TSVRJT059LlxuICAgICAqIEBwYXJhbSBjYXNlSWQgc3RyaW5nIElEIG9mIHRoZSBjYXNlIHRoYXQgc2hvdWxkIGhhdmUgaXQncyB0cmVlIGNhc2UgcmVmIHNldFxuICAgICAqIEBwYXJhbSBuZXdDYXNlUmVmVmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY2FzZSByZWYgZmllbGRcbiAgICAgKi9cbiAgICBwcml2YXRlIHBlcmZvcm1DYXNlUmVmQ2FsbChjYXNlSWQ6IHN0cmluZywgbmV3Q2FzZVJlZlZhbHVlOiBBcnJheTxzdHJpbmc+KTogT2JzZXJ2YWJsZTxBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCQgPSBuZXcgUmVwbGF5U3ViamVjdDxBcnJheTxzdHJpbmc+PigxKTtcblxuICAgICAgICB0aGlzLl90YXNrUmVzb3VyY2VTZXJ2aWNlLmdldFRhc2tzKFNpbXBsZUZpbHRlci5mcm9tVGFza1F1ZXJ5KHtcbiAgICAgICAgICAgIGNhc2U6IHtpZDogY2FzZUlkfSxcbiAgICAgICAgICAgIHRyYW5zaXRpb25JZDogVHJlZVBldHJpZmxvd0lkZW50aWZpZXJzLkNBU0VfUkVGX1RSQU5TSVRJT05cbiAgICAgICAgfSkpLnN1YnNjcmliZShwYWdlID0+IHtcbiAgICAgICAgICAgIGlmICghaGFzQ29udGVudChwYWdlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ2FzZSByZWYgYWNjZXNzb3IgdGFzayBkb2VzblxcJ3QgZXhpc3QhJyk7XG4gICAgICAgICAgICAgICAgcmVzdWx0JC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdGFzayA9IHBhZ2UuY29udGVudFswXTtcblxuICAgICAgICAgICAgdGhpcy5fdGFza1Jlc291cmNlU2VydmljZS5hc3NpZ25UYXNrKHRhc2suc3RyaW5nSWQpLnN1YnNjcmliZShhc3NpZ25SZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFhc3NpZ25SZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ2FzZSByZWYgYWNjZXNzb3IgdGFzayBjb3VsZCBub3QgYmUgYXNzaWduZWQnLCBhc3NpZ25SZXNwb25zZS5lcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHt9O1xuICAgICAgICAgICAgICAgIGJvZHlbVHJlZVBldHJpZmxvd0lkZW50aWZpZXJzLkNISUxEUkVOX0NBU0VfUkVGXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Nhc2VSZWYnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3Q2FzZVJlZlZhbHVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl90YXNrUmVzb3VyY2VTZXJ2aWNlLnNldERhdGEodGFzay5zdHJpbmdJZCwgYm9keSkuc3Vic2NyaWJlKChvdXRjb21lUmVzb3VyY2U6IEV2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VkRmllbGRzID0gKG91dGNvbWVSZXNvdXJjZS5vdXRjb21lIGFzIFNldERhdGFFdmVudE91dGNvbWUpLmNoYW5nZWRGaWVsZHMuY2hhbmdlZEZpZWxkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FzZVJlZkNoYW5nZXMgPSBjaGFuZ2VkRmllbGRzW1RyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DSElMRFJFTl9DQVNFX1JFRl07XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCQubmV4dChjYXNlUmVmQ2hhbmdlcyA/IGNhc2VSZWZDaGFuZ2VzLnZhbHVlIDogdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0JC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrUmVzb3VyY2VTZXJ2aWNlLmZpbmlzaFRhc2sodGFzay5zdHJpbmdJZCkuc3Vic2NyaWJlKGZpbmlzaFJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hSZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdDYXNlIHJlZiBhY2Nlc3NvciB0YXNrIGZpbmlzaGVkJywgZmluaXNoUmVzcG9uc2Uuc3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ2FzZSByZWYgYWNjZXNzb3IgdGFzayBmaW5pc2ggZmFpbGVkJywgZmluaXNoUmVzcG9uc2UuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ291bGQgbm90IHNldCBkYXRhIHRvIHRyZWUgY2FzZSByZWYnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCQuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0Nhc2UgcmVmIGFjY2Vzc29yIHRhc2sgY291bGQgbm90IGJlIGFzc2lnbmVkJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCQuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0Nhc2UgcmVmIGFjY2Vzc29yIHRhc2sgY291bGQgbm90IGJlIGZvdW5kJywgZXJyb3IpO1xuICAgICAgICAgICAgcmVzdWx0JC5jb21wbGV0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYW4gdXBkYXRlIGFmdGVyIGFkZGluZyBvciByZW1vdmluZyBhIG5vZGUgZnJvbSB0aGUgdHJlZS5cbiAgICAgKlxuICAgICAqIElmIG9ubHkgb25lIG5vZGUgd2FzIGFkZGVkIGFkZHMgaXQgaW50byB0aGUgdHJlZVxuICAgICAqXG4gICAgICogSWYgb25seSBvbmUgbm9kZSB3YXMgcmVtb3ZlZCByZW1vdmVzIGl0IGZyb20gdGhlIHRyZWVcbiAgICAgKlxuICAgICAqIE90aGVyd2lzZSBjb2xsYXBzZXMgdGhlIGFmZmVjdGVkIG5vZGUgYW5kIG1hcmtzIGl0J3MgY2hpbGRyZW4gYXMgZGlydHlcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhZmZlY3RlZE5vZGUgbm9kZSB0aGF0IGhhZCBpdCdzIGNoaWxkcmVuIGNoYW5nZWRcbiAgICAgKiBAcGFyYW0gbmV3Q2FzZVJlZlZhbHVlIG5ldyB2YWx1ZSBvZiB0aGUgY2FzZVJlZiBmaWVsZCByZXR1cm5lZCBieSBiYWNrZW5kXG4gICAgICogQHJldHVybnMgYW4gYE9ic2VydmFibGVgIHRoYXQgZW1pdHMgYW4gb2JqZWN0IHdpdGggdGhlIFtyZXN1bHRde0BsaW5rIFJlc3VsdFdpdGhBZnRlckFjdGlvbnMjcmVzdWx0fSBhdHRyaWJ1dGUgc2V0IHRvIGB0cnVlYCBpZlxuICAgICAqIHRoZSB1cGRhdGUgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVOb2RlQ2hpbGRyZW5Gcm9tQ2hhbmdlZEZpZWxkcyhhZmZlY3RlZE5vZGU6IENhc2VUcmVlTm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nhc2VSZWZWYWx1ZTogQXJyYXk8c3RyaW5nPik6IE9ic2VydmFibGU8UmVzdWx0V2l0aEFmdGVyQWN0aW9uczxib29sZWFuPj4ge1xuICAgICAgICBjb25zdCBjYXNlUmVmRmllbGQgPSBnZXRJbW1lZGlhdGVEYXRhKGFmZmVjdGVkTm9kZS5jYXNlLCBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0hJTERSRU5fQ0FTRV9SRUYpO1xuICAgICAgICBjb25zdCBuZXdDaGlsZHJlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBuZXdDYXNlUmVmVmFsdWUuZm9yRWFjaChpZCA9PiBuZXdDaGlsZHJlbi5hZGQoaWQpKTtcblxuICAgICAgICBsZXQgbnVtYmVyT2ZNaXNzaW5nQ2hpbGRyZW4gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhc2VSZWZGaWVsZC52YWx1ZS5sZW5ndGggJiYgbnVtYmVyT2ZNaXNzaW5nQ2hpbGRyZW4gPCAyOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghbmV3Q2hpbGRyZW4uaGFzKGNhc2VSZWZGaWVsZC52YWx1ZVtpXSkpIHtcbiAgICAgICAgICAgICAgICBudW1iZXJPZk1pc3NpbmdDaGlsZHJlbisrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhhY3RseU9uZUNoaWxkQWRkZWQgPSBjYXNlUmVmRmllbGQudmFsdWUubGVuZ3RoICsgMSA9PT0gbmV3Q2FzZVJlZlZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgJiYgY2FzZVJlZkZpZWxkLnZhbHVlLmV2ZXJ5KGl0ID0+IG5ld0NoaWxkcmVuLmhhcyhpdCkpO1xuXG4gICAgICAgIGNvbnN0IGV4YWN0bHlPbmVDaGlsZFJlbW92ZWQgPSBjYXNlUmVmRmllbGQudmFsdWUubGVuZ3RoIC0gMSA9PT0gbmV3Q2FzZVJlZlZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgJiYgbnVtYmVyT2ZNaXNzaW5nQ2hpbGRyZW4gPT09IDE7XG5cbiAgICAgICAgaWYgKCFleGFjdGx5T25lQ2hpbGRBZGRlZCAmJiAhZXhhY3RseU9uZUNoaWxkUmVtb3ZlZCkge1xuICAgICAgICAgICAgY2FzZVJlZkZpZWxkLnZhbHVlID0gbmV3Q2FzZVJlZlZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fdHJlZUNvbnRyb2wuY29sbGFwc2VEZXNjZW5kYW50cyhhZmZlY3RlZE5vZGUpO1xuICAgICAgICAgICAgYWZmZWN0ZWROb2RlLmRpcnR5Q2hpbGRyZW4gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIG9mKG5ldyBSZXN1bHRXaXRoQWZ0ZXJBY3Rpb25zKHRydWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleGFjdGx5T25lQ2hpbGRBZGRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0NoaWxkTm9kZUFkZChhZmZlY3RlZE5vZGUsIGNhc2VSZWZGaWVsZCwgbmV3Q2FzZVJlZlZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NDaGlsZE5vZGVSZW1vdmUoYWZmZWN0ZWROb2RlLCBjYXNlUmVmRmllbGQsIG5ld0NoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgY2hpbGQgbm9kZSB0byB0aGUgYGFmZmVjdGVkTm9kZWAgYnkgYWRkaW5nIHRoZSBsYXN0IENhc2UgZnJvbSB0aGUgYG5ld0Nhc2VSZWZWYWx1ZWBcbiAgICAgKiBAcGFyYW0gYWZmZWN0ZWROb2RlIHRoZSBub2RlIGluIHRoZSB0cmVlIHRoYXQgaGFkIGEgY2hpbGQgYWRkZWQgLSB0aGUgcGFyZW50IG5vZGVcbiAgICAgKiBAcGFyYW0gY2FzZVJlZkZpZWxkIHRoZSBjYXNlIHJlZiBmaWVsZCBvZiB0aGUgYWZmZWN0ZWQgbm9kZVxuICAgICAqIEBwYXJhbSBuZXdDYXNlUmVmVmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY2FzZSByZWYgZmllbGQgaW4gdGhlIG5vZGVcbiAgICAgKiBAcmV0dXJucyBhbiBgT2JzZXJ2YWJsZWAgdGhhdCBlbWl0cyBgdHJ1ZWAgaWYgYSBub2RlIHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcm9jZXNzQ2hpbGROb2RlQWRkKGFmZmVjdGVkTm9kZTogQ2FzZVRyZWVOb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VSZWZGaWVsZDogSW1tZWRpYXRlRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDYXNlUmVmVmFsdWU6IEFycmF5PHN0cmluZz4pOiBPYnNlcnZhYmxlPFJlc3VsdFdpdGhBZnRlckFjdGlvbnM8Ym9vbGVhbj4+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0JCA9IG5ldyBSZXBsYXlTdWJqZWN0PFJlc3VsdFdpdGhBZnRlckFjdGlvbnM8Ym9vbGVhbj4+KDEpO1xuXG4gICAgICAgIGNhc2VSZWZGaWVsZC52YWx1ZSA9IG5ld0Nhc2VSZWZWYWx1ZTtcbiAgICAgICAgdGhpcy5fY2FzZVJlc291cmNlU2VydmljZS5nZXRPbmVDYXNlKG5ld0Nhc2VSZWZWYWx1ZVtuZXdDYXNlUmVmVmFsdWUubGVuZ3RoIC0gMV0pLnN1YnNjcmliZShjaGlsZENhc2UgPT4ge1xuICAgICAgICAgICAgaWYgKGNoaWxkQ2FzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnUHVzaGluZyBjaGlsZCBub2RlIHRvIHRyZWUnLCB7Y2hpbGRDYXNlLCBhZmZlY3RlZE5vZGU6IGFmZmVjdGVkTm9kZS50b0xvZ2dhYmxlRm9ybSgpfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gdGhpcy5wdXNoQ2hpbGRUb1RyZWUoYWZmZWN0ZWROb2RlLCBjaGlsZENhc2UpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCQubmV4dChuZXcgUmVzdWx0V2l0aEFmdGVyQWN0aW9ucyh0cnVlLCBbKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNFYWdlckxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdFYWdlcmx5IGV4cGFuZGluZyBhIG5ld2x5IGFkZGVkIG5vZGUuJywgY2hpbGROb2RlLnRvTG9nZ2FibGVGb3JtKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBhbmROb2RlKGNoaWxkTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ05ldyBjaGlsZCBjYXNlIHdhcyBub3QgZm91bmQsIGlsbGVnYWwgc3RhdGUnLCBjaGlsZENhc2UpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCQubmV4dChuZXcgUmVzdWx0V2l0aEFmdGVyQWN0aW9ucyhmYWxzZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0JC5jb21wbGV0ZSgpO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ05ldyBjaGlsZCBub2RlIGNhc2UgY291bGQgbm90IGJlIGZvdW5kJywgZXJyb3IpO1xuICAgICAgICAgICAgcmVzdWx0JC5uZXh0KG5ldyBSZXN1bHRXaXRoQWZ0ZXJBY3Rpb25zKGZhbHNlKSk7XG4gICAgICAgICAgICByZXN1bHQkLmNvbXBsZXRlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgY2hpbGQgbm9kZSB0byB0aGUgdGFyZ2V0IHBhcmVudCBub2RlLlxuICAgICAqIEBwYXJhbSBwYXJlbnROb2RlIHRoZSBub2RlcyB3aG9zZSBjaGlsZCBzaG91bGQgYmUgYWRkZWRcbiAgICAgKiBAcGFyYW0gY2hpbGRDYXNlIHRoZSBjaGlsZCBjYXNlXG4gICAgICogQHJldHVybnMgdGhlIG5ld2x5IGFkZGVkIG5vZGVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcHVzaENoaWxkVG9UcmVlKHBhcmVudE5vZGU6IENhc2VUcmVlTm9kZSwgY2hpbGRDYXNlOiBDYXNlKTogQ2FzZVRyZWVOb2RlIHtcbiAgICAgICAgY29uc3QgY2hpbGROb2RlID0gbmV3IENhc2VUcmVlTm9kZShjaGlsZENhc2UsIHBhcmVudE5vZGUpO1xuICAgICAgICBwYXJlbnROb2RlLmNoaWxkcmVuLnB1c2goY2hpbGROb2RlKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoVHJlZSgpO1xuICAgICAgICByZXR1cm4gY2hpbGROb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGRlbGV0ZWQgbm9kZSBmcm9tIHRoZSBjaGlsZHJlbiBvZiB0aGUgYGFmZmVjdGVkTm9kZWBcbiAgICAgKiBAcGFyYW0gYWZmZWN0ZWROb2RlIHRoZSBub2RlIGluIHRoZSB0cmVlIHRoYXQgaGFkIGl0J3MgY2hpbGQgcmVtb3ZlZFxuICAgICAqIEBwYXJhbSBjYXNlUmVmRmllbGQgdGhlIGNhc2UgcmVmIGZpZWxkIG9mIHRoZSBhZmZlY3RlZCBub2RlXG4gICAgICogQHBhcmFtIG5ld0Nhc2VSZWZWYWx1ZXMgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY2FzZSByZWYgZmllbGQgaW4gdGhlIG5vZGVcbiAgICAgKiBAcmV0dXJucyBhbiBgT2JzZXJ2YWJsZWAgdGhhdCBlbWl0cyBgdHJ1ZWAgd2hlbiB0aGUgcmVtb3ZlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDaGlsZE5vZGVSZW1vdmUoYWZmZWN0ZWROb2RlOiBDYXNlVHJlZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVJlZkZpZWxkOiBJbW1lZGlhdGVEYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nhc2VSZWZWYWx1ZXM6IFNldDxzdHJpbmc+KTogT2JzZXJ2YWJsZTxSZXN1bHRXaXRoQWZ0ZXJBY3Rpb25zPGJvb2xlYW4+PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2FzZVJlZkZpZWxkLnZhbHVlLmZpbmRJbmRleChpdCA9PiAhbmV3Q2FzZVJlZlZhbHVlcy5oYXMoaXQpKTtcbiAgICAgICAgY2FzZVJlZkZpZWxkLnZhbHVlLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGFmZmVjdGVkTm9kZS5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB0aGlzLnJlZnJlc2hUcmVlKCk7XG4gICAgICAgIHJldHVybiBvZihuZXcgUmVzdWx0V2l0aEFmdGVyQWN0aW9ucyh0cnVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqIEZvcmNlcyBhIHJlcmVuZGVyIG9mIHRoZSB0cmVlIGNvbnRlbnRcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlZnJlc2hUcmVlKCk6IHZvaWQge1xuICAgICAgICByZWZyZXNoVHJlZSh0aGlzLl90cmVlRGF0YVNvdXJjZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsb2FkcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGNhc2Ugbm9kZS4gVGhlIHtAbGluayBDYXNlfSBvYmplY3QgaGVsZCBpbiB0aGUge0BsaW5rIENhc2VUcmVlTm9kZX0gaW5zdGFuY2UgaXMgbm90IHJlcGxhY2VkLFxuICAgICAqIGJ1dCB0aGUgbmV3IENhc2UgaXMgYE9iamVjdC5hc3NpZ25gLWVkIGludG8gaXQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBDYXNlIGluc3RhbmNlIGlzIHVuY2hhbmdlZCBidXQgcmVmZXJlbmNlc1xuICAgICAqIHRvIGFsbCBpdCdzIG5vbi1wcmltaXRpdmUgYXR0cmlidXRlcyBhcmUgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIElmIGEgcmVsb2FkIG9mIHRoZSBjdXJyZW50IG5vZGUgaXMgaW5pdGlhdGVkIGJlZm9yZSB0aGUgcHJldmlvdXMgb25lIGNvbXBsZXRlZCwgdGhlIG5ldyBvbmUgaXMgaWdub3JlZC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY2FzZSBjaGFuZ2VkIGJlZm9yZSBhIHJlc3BvbnNlIGZyb20gYmFja2VuZCB3YXMgcmVjZWl2ZWQgdGhlIHJlc3BvbnNlIGlzIGlnbm9yZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdGhlIHBhcmVudCBub2RlLCBub3IgdGhlIGNoaWxkIG5vZGVzIGFyZSByZWxvYWRlZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVsb2FkQ3VycmVudENhc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fY3VycmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnTm8gVHJlZSBDYXNlIE5vZGUgc2VsZWN0ZWQsIG5vdGhpbmcgdG8gcmVsb2FkJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JlbG9hZGVkQ2FzZUlkICYmIHRoaXMuX2N1cnJlbnROb2RlLmNhc2Uuc3RyaW5nSWQgIT09IHRoaXMuX3JlbG9hZGVkQ2FzZUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ1JlbG9hZCBvZiB0aGUgY3VycmVudCBjYXNlIGFscmVhZHkgaW4gcHJvZ3Jlc3MnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZWxvYWRlZENhc2VJZCA9IHRoaXMuX2N1cnJlbnROb2RlLmNhc2Uuc3RyaW5nSWQ7XG4gICAgICAgIHRoaXMuX2Nhc2VSZXNvdXJjZVNlcnZpY2UuZ2V0T25lQ2FzZSh0aGlzLl9jdXJyZW50Q2FzZS5zdHJpbmdJZCkuc3Vic2NyaWJlKHJlbG9hZGVkQ3VycmVudENhc2UgPT4ge1xuICAgICAgICAgICAgaWYgKCFyZWxvYWRlZEN1cnJlbnRDYXNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdDdXJyZW50IENhc2UgVHJlZSBOb2RlIGNvdWxkIG5vdCBiZSByZWxvYWRlZC4gSW52YWxpZCBzZXJ2ZXIgcmVzcG9uc2UnLCByZWxvYWRlZEN1cnJlbnRDYXNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudE5vZGUgJiYgcmVsb2FkZWRDdXJyZW50Q2FzZS5zdHJpbmdJZCA9PT0gdGhpcy5fY3VycmVudE5vZGUuY2FzZS5zdHJpbmdJZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbG9hZGVkQ2FzZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZSA9IHRoaXMuZGV0ZXJtaW5lQ2FzZVVwZGF0ZSh0aGlzLl9jdXJyZW50Q2FzZSwgcmVsb2FkZWRDdXJyZW50Q2FzZSk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jdXJyZW50Q2FzZSwgcmVsb2FkZWRDdXJyZW50Q2FzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJlZUNhc2VWaWV3U2VydmljZS5sb2FkVGFzayQubmV4dCh0aGlzLl9jdXJyZW50Q2FzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZS52aXNpYmxlVHJlZVByb3BlcnRpZXNDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRyZWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZS5jaGlsZHJlbkNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudE5vZGUuZGlydHlDaGlsZHJlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kTm9kZSh0aGlzLl9jdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnQ3VycmVudCBDYXNlIFRyZWUgTm9kZSByZWxvYWRlZCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ0Rpc2NhcmRpbmcgY2FzZSByZWxvYWQgcmVzcG9uc2UsIHNpbmNlIHRoZSBjdXJyZW50IG5vZGUgaGFzIGNoYW5nZWQgYmVmb3JlIGl0cyBjYXNlIHdhcyByZWNlaXZlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0N1cnJlbnQgQ2FzZSBUcmVlIE5vZGUgcmVsb2FkIHJlcXVlc3QgZmFpbGVkJywgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIGFubnkgb2YgdGhlIGNhc2UgYXR0cmlidXRlcyB0aGF0IGFyZSB2aXNpYmxlIG9uIHRoZSB0cmVlIGNoYW5nZWQuXG4gICAgICogQHBhcmFtIG9sZENhc2UgdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIENhc2Ugb2JqZWN0LCB0aGF0IGlzIGN1cnJlbnRseSBkaXNwbGF5ZWQgb24gdGhlIHRyZWVcbiAgICAgKiBAcGFyYW0gbmV3Q2FzZSB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIENhc2Ugb2JqZWN0LCB0aGF0IHNob3VsZCByZXBsYWNlIHRoZSBvbGQgb25lXG4gICAgICovXG4gICAgcHJpdmF0ZSBkZXRlcm1pbmVDYXNlVXBkYXRlKG9sZENhc2U6IENhc2UsIG5ld0Nhc2U6IENhc2UpOiBDYXNlVXBkYXRlUmVzdWx0IHtcbiAgICAgICAgY29uc3QgdmlzaWJsZUF0dHJpYnV0ZXMgPSBbXG4gICAgICAgICAgICBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0FOX0FERF9DSElMRFJFTixcbiAgICAgICAgICAgIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DQU5fUkVNT1ZFX05PREUsXG4gICAgICAgICAgICBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQkVGT1JFX1RFWFRfSUNPTixcbiAgICAgICAgICAgIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5UUkVFX0FERF9JQ09OXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgcmVzdWx0OiBDYXNlVXBkYXRlUmVzdWx0ID0ge1xuICAgICAgICAgICAgdmlzaWJsZVRyZWVQcm9wZXJ0aWVzQ2hhbmdlZDogdHJ1ZSwgLy8gZm9yIHNob3J0LWNpcmN1aXRpbmcgdGhlIGV2YWx1YXRpb24sIGlmIG5vZGVzIGNoaWxkcmVuIGNoYW5nZWRcbiAgICAgICAgICAgIGNoaWxkcmVuQ2hhbmdlZDogZmFsc2VcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBvbGRDaGlsZENhc2VSZWYgPSBnZXRJbW1lZGlhdGVEYXRhKG9sZENhc2UsIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DSElMRFJFTl9DQVNFX1JFRik7XG4gICAgICAgIGlmIChvbGRDaGlsZENhc2VSZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3Qgb2xkQ2hpbGRyZW4gPSBuZXcgU2V0KG9sZENoaWxkQ2FzZVJlZi52YWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBuZXdDaGlsZHJlbiA9IG5ldyBTZXQoZ2V0SW1tZWRpYXRlRGF0YShuZXdDYXNlLCBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0hJTERSRU5fQ0FTRV9SRUYpLnZhbHVlKTtcblxuICAgICAgICAgICAgcmVzdWx0LmNoaWxkcmVuQ2hhbmdlZCA9IG9sZENoaWxkcmVuLnNpemUgIT09IG5ld0NoaWxkcmVuLnNpemU7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5jaGlsZHJlbkNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuY2hpbGRyZW5DaGFuZ2VkID0gQXJyYXkuZnJvbShvbGRDaGlsZHJlbikuc29tZShjaGlsZElkID0+ICFuZXdDaGlsZHJlbi5oYXMoY2hpbGRJZCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzaG9ydC1jaXJjdWl0XG4gICAgICAgICAgICBpZiAocmVzdWx0LmNoaWxkcmVuQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQudmlzaWJsZVRyZWVQcm9wZXJ0aWVzQ2hhbmdlZCA9IHZpc2libGVBdHRyaWJ1dGVzLnNvbWUoYXR0cmlidXRlID0+IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRJbW1lZGlhdGVEYXRhKG9sZENhc2UsIGF0dHJpYnV0ZSlcbiAgICAgICAgICAgICAgICAmJiBnZXRJbW1lZGlhdGVEYXRhKG9sZENhc2UsIGF0dHJpYnV0ZSkudmFsdWUgIT09IGdldEltbWVkaWF0ZURhdGEobmV3Q2FzZSwgYXR0cmlidXRlKS52YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4iXX0=
|
|
857
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzZS10cmVlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmV0Z3JpZi9jb21wb25lbnRzLWNvcmUvIiwic291cmNlcyI6WyJsaWIvdmlldy90cmVlLWNhc2Utdmlldy90cmVlLWNvbXBvbmVudC9jYXNlLXRyZWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBYSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFdEUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDBEQUEwRCxDQUFDO0FBQzdGLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSwwREFBMEQsQ0FBQztBQUM3RixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFHdEUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUM5RSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFDdEUsT0FBTyxFQUFDLFFBQVEsRUFBYyxFQUFFLEVBQUUsYUFBYSxFQUF5QixVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFaEcsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDN0UsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ25DLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSw4Q0FBOEMsQ0FBQztBQUN4RSxPQUFPLEVB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Z0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsS0FBSyxLQUFLLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDckcsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDOztBQTEzQnNCLGlDQUFpQixHQUFHLEVBQUUsQ0FBQzs7WUFzQkYsbUJBQW1CO1lBQ25CLG1CQUFtQjtZQUNuQixtQkFBbUI7WUFDaEMsYUFBYTtZQUNMLGNBQWM7WUFDYixlQUFlO1lBQ2QsZ0JBQWdCOzRDQUM1QyxRQUFRLFlBQUksTUFBTSxTQUFDLDZCQUE2Qjs0Q0FDaEQsUUFBUSxZQUFJLE1BQU0sU0FBQyxnQ0FBZ0M7OztZQWpDbkUsVUFBVTs7O1lBakRILG1CQUFtQjtZQUVuQixtQkFBbUI7WUFDbkIsbUJBQW1CO1lBQ25CLGFBQWE7WUFHYixjQUFjO1lBQ2QsZUFBZTtZQU1mLGdCQUFnQjs0Q0FtRVAsUUFBUSxZQUFJLE1BQU0sU0FBQyw2QkFBNkI7NENBQ2hELFFBQVEsWUFBSSxNQUFNLFNBQUMsZ0NBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIE9uRGVzdHJveSwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGaWx0ZXJ9IGZyb20gJy4uLy4uLy4uL2ZpbHRlci9tb2RlbHMvZmlsdGVyJztcbmltcG9ydCB7SHR0cFBhcmFtc30gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtDYXNlUmVzb3VyY2VTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMvZW5naW5lLWVuZHBvaW50L2Nhc2UtcmVzb3VyY2Uuc2VydmljZSc7XG5pbXBvcnQge0Nhc2VUcmVlTm9kZX0gZnJvbSAnLi9tb2RlbC9jYXNlLXRyZWUtbm9kZSc7XG5pbXBvcnQge1RyZWVDYXNlVmlld1NlcnZpY2V9IGZyb20gJy4uL3RyZWUtY2FzZS12aWV3LnNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrUmVzb3VyY2VTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMvZW5naW5lLWVuZHBvaW50L3Rhc2stcmVzb3VyY2Uuc2VydmljZSc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge0ltbWVkaWF0ZURhdGF9IGZyb20gJy4uLy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvaW1tZWRpYXRlLWRhdGEnO1xuaW1wb3J0IHtDYXNlfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2Nhc2UnO1xuaW1wb3J0IHtQcm9jZXNzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vcHJvY2Vzcy9wcm9jZXNzLnNlcnZpY2UnO1xuaW1wb3J0IHtTaWRlTWVudVNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL3NpZGUtbWVudS9zZXJ2aWNlcy9zaWRlLW1lbnUuc2VydmljZSc7XG5pbXBvcnQge1NpZGVNZW51U2l6ZX0gZnJvbSAnLi4vLi4vLi4vc2lkZS1tZW51L21vZGVscy9zaWRlLW1lbnUtc2l6ZSc7XG5pbXBvcnQge2ZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aHJvd0Vycm9yfSBmcm9tICdyeGpzJztcbmltcG9ydCB7UGFnZX0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9wYWdlJztcbmltcG9ydCB7VHJlZVBldHJpZmxvd0lkZW50aWZpZXJzfSBmcm9tICcuLi9tb2RlbC90cmVlLXBldHJpZmxvdy1pZGVudGlmaWVycyc7XG5pbXBvcnQge3RhcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7aGFzQ29udGVudH0gZnJvbSAnLi4vLi4vLi4vdXRpbGl0eS9wYWdpbmF0aW9uL3BhZ2UtaGFzLWNvbnRlbnQnO1xuaW1wb3J0IHtOZXN0ZWRUcmVlQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RyZWUnO1xuaW1wb3J0IHtNYXRUcmVlTmVzdGVkRGF0YVNvdXJjZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdHJlZSc7XG5pbXBvcnQge29mVm9pZH0gZnJvbSAnLi4vLi4vLi4vdXRpbGl0eS9vZi12b2lkJztcbmltcG9ydCB7Q2FzZUdldFJlcXVlc3RCb2R5fSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2Nhc2UtZ2V0LXJlcXVlc3QtYm9keSc7XG5pbXBvcnQge2dldEltbWVkaWF0ZURhdGF9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvZ2V0LWltbWVkaWF0ZS1kYXRhJztcbmltcG9ydCB7TkFFX09QVElPTl9TRUxFQ1RPUl9DT01QT05FTlR9IGZyb20gJy4uLy4uLy4uL3NpZGUtbWVudS9jb250ZW50LWNvbXBvbmVudHMvaW5qZWN0aW9uLXRva2Vucyc7XG5pbXBvcnQge1NpbXBsZUZpbHRlcn0gZnJvbSAnLi4vLi4vLi4vZmlsdGVyL21vZGVscy9zaW1wbGUtZmlsdGVyJztcbmltcG9ydCB7Q2FzZVRyZWVQYXRofSBmcm9tICcuL21vZGVsL2Nhc2UtdHJlZS1wYXRoJztcbmltcG9ydCB7RXhwYW5zaW9uVHJlZX0gZnJvbSAnLi9tb2RlbC9leHBhbnNpb24tdHJlZSc7XG5pbXBvcnQge1Jlc3VsdFdpdGhBZnRlckFjdGlvbnN9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvcmVzdWx0LXdpdGgtYWZ0ZXItYWN0aW9ucyc7XG5pbXBvcnQge0V2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZX0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9tZXNzYWdlLXJlc291cmNlJztcbmltcG9ydCB7U2V0RGF0YUV2ZW50T3V0Y29tZX0gZnJvbSAnLi4vLi4vLi4vZXZlbnQvbW9kZWwvZXZlbnQtb3V0Y29tZXMvZGF0YS1vdXRjb21lcy9zZXQtZGF0YS1ldmVudC1vdXRjb21lJztcbmltcG9ydCB7Q3JlYXRlQ2FzZUV2ZW50T3V0Y29tZX0gZnJvbSAnLi4vLi4vLi4vZXZlbnQvbW9kZWwvZXZlbnQtb3V0Y29tZXMvY2FzZS1vdXRjb21lcy9jcmVhdGUtY2FzZS1ldmVudC1vdXRjb21lJztcbmltcG9ydCB7cmVmcmVzaFRyZWV9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvcmVmcmVzaC10cmVlJztcbmltcG9ydCB7TkFFX1RSRUVfQ0FTRV9WSUVXX0NPTkZJR1VSQVRJT059IGZyb20gJy4vbW9kZWwvdHJlZS1jb25maWd1cmF0aW9uLWluamVjdGlvbi10b2tlbic7XG5pbXBvcnQge1RyZWVDYXNlVmlld0NvbmZpZ3VyYXRpb259IGZyb20gJy4vbW9kZWwvdHJlZS1jYXNlLXZpZXctY29uZmlndXJhdGlvbic7XG5pbXBvcnQge1BhZ2luYXRpb25QYXJhbXN9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLXBhcmFtcyc7XG5pbXBvcnQge2NyZWF0ZVNvcnRQYXJhbSwgUGFnaW5hdGlvblNvcnR9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLXNvcnQnO1xuXG4vKipcbiAqIEFuIGludGVybmFsIGhlbHBlciBvYmplY3QsIHRoYXQgaXMgdXNlZCB0byByZXR1cm4gdHdvIHZhbHVlcyBmcm9tIGEgZnVuY3Rpb24uXG4gKi9cbmludGVyZmFjZSBDYXNlVXBkYXRlUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBhdHRyaWJ1dGVzIHRoYXQgYXJlIHZpc2libGUgb24gdGhlIHRyZWUgY2hhbmdlZFxuICAgICAqL1xuICAgIHZpc2libGVUcmVlUHJvcGVydGllc0NoYW5nZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgbm9kZXMgY2hpbGRyZW4gY2hhbmdlZFxuICAgICAqL1xuICAgIGNoaWxkcmVuQ2hhbmdlZDogYm9vbGVhbjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENhc2VUcmVlU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfUEFHRV9TSVpFID0gNTA7XG5cbiAgICBwcm90ZWN0ZWQgX2N1cnJlbnROb2RlOiBDYXNlVHJlZU5vZGU7XG4gICAgcHJpdmF0ZSBfcm9vdE5vZGVzRmlsdGVyOiBGaWx0ZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfdHJlZURhdGFTb3VyY2U6IE1hdFRyZWVOZXN0ZWREYXRhU291cmNlPENhc2VUcmVlTm9kZT47XG4gICAgcHJpdmF0ZSByZWFkb25seSBfdHJlZUNvbnRyb2w6IE5lc3RlZFRyZWVDb250cm9sPENhc2VUcmVlTm9kZT47XG4gICAgcHJpdmF0ZSBfdHJlZVJvb3RMb2FkZWQkOiBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+O1xuICAgIHByaXZhdGUgX3Jvb3ROb2RlOiBDYXNlVHJlZU5vZGU7XG4gICAgcHJpdmF0ZSBfc2hvd1Jvb3Q6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2VhdGhlciB0aGUgdHJlZSBpcyBlYWdlciBsb2FkZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBlYWdlciBsb2FkIGxhcmdlIHRyZWVzIGFzIGVhY2ggbm9kZSBzZW5kcyBhIHNlcGFyYXRlIGJhY2tlbmQgcmVxdWVzdCB0byBsb2FkIGl0cyBkYXRhLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2lzRWFnZXJMb2FkZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBzdHJpbmcgaWQgb2YgdGhlIGNhc2UsIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIHJlbG9hZGVkLCBgdW5kZWZpbmVkYCBpZiBubyBjYXNlIGlzIGN1cnJlbnRseSBiZWluZyByZWxvYWRlZFxuICAgICAqL1xuICAgIHByaXZhdGUgX3JlbG9hZGVkQ2FzZUlkOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX2Nhc2VSZXNvdXJjZVNlcnZpY2U6IENhc2VSZXNvdXJjZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90cmVlQ2FzZVZpZXdTZXJ2aWNlOiBUcmVlQ2FzZVZpZXdTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdGFza1Jlc291cmNlU2VydmljZTogVGFza1Jlc291cmNlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2xvZ2dlcjogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Byb2Nlc3NTZXJ2aWNlOiBQcm9jZXNzU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3NpZGVNZW51U2VydmljZTogU2lkZU1lbnVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5BRV9PUFRJT05fU0VMRUNUT1JfQ09NUE9ORU5UKSBwcm90ZWN0ZWQgX29wdGlvblNlbGVjdG9yQ29tcG9uZW50OiBhbnksXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChOQUVfVFJFRV9DQVNFX1ZJRVdfQ09ORklHVVJBVElPTikgcHJvdGVjdGVkIF90cmVlQ29uZmlndXJhdGlvbjogVHJlZUNhc2VWaWV3Q29uZmlndXJhdGlvbikge1xuICAgICAgICBpZiAoIXRoaXMuX3RyZWVDb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl90cmVlQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBwYWdlU2l6ZTogQ2FzZVRyZWVTZXJ2aWNlLkRFRkFVTFRfUEFHRV9TSVpFXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdHJlZURhdGFTb3VyY2UgPSBuZXcgTWF0VHJlZU5lc3RlZERhdGFTb3VyY2U8Q2FzZVRyZWVOb2RlPigpO1xuICAgICAgICB0aGlzLl90cmVlQ29udHJvbCA9IG5ldyBOZXN0ZWRUcmVlQ29udHJvbDxDYXNlVHJlZU5vZGU+KG5vZGUgPT4gbm9kZS5jaGlsZHJlbik7XG4gICAgICAgIF90cmVlQ2FzZVZpZXdTZXJ2aWNlLnJlbG9hZENhc2UkLmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbG9hZEN1cnJlbnRDYXNlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmVlUm9vdExvYWRlZCQgPSBuZXcgUmVwbGF5U3ViamVjdDxib29sZWFuPigxKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdHJlZVJvb3RMb2FkZWQkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCByb290RmlsdGVyKGZpbHRlcjogRmlsdGVyKSB7XG4gICAgICAgIHRoaXMuX3Jvb3ROb2Rlc0ZpbHRlciA9IGZpbHRlcjtcbiAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBbXTtcbiAgICAgICAgdGhpcy5sb2FkVHJlZVJvb3QoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGFTb3VyY2UoKTogTWF0VHJlZU5lc3RlZERhdGFTb3VyY2U8Q2FzZVRyZWVOb2RlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmVlRGF0YVNvdXJjZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRyZWVDb250cm9sKCk6IE5lc3RlZFRyZWVDb250cm9sPENhc2VUcmVlTm9kZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJlZUNvbnRyb2w7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50Tm9kZSgpOiBDYXNlVHJlZU5vZGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudE5vZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYSB2YWx1ZSB3aGVuZXZlciBhIG5ldyByb290IG5vZGUgRmlsdGVyIGlzIHNldC5cbiAgICAgKlxuICAgICAqIGB0cnVlYCBpcyBlbWl0dGVkIGlmIHRoZSByb290IG5vZGUgd2FzIHN1Y2Nlc3NmdWxseSBsb2FkZWQuIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogT24gc3Vic2NyaXB0aW9uIGVtaXRzIHRoZSBsYXN0IGVtaXR0ZWQgdmFsdWUgKGlmIGFueSkgdG8gdGhlIHN1YnNjcmliZXIuXG4gICAgICovXG4gICAgcHVibGljIGdldCB0cmVlUm9vdExvYWRlZCQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmVlUm9vdExvYWRlZCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBfY3VycmVudENhc2UoKTogQ2FzZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50Tm9kZSA/IHRoaXMuX2N1cnJlbnROb2RlLmNhc2UgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYW4gYE9ic2VydmFibGVgIG9mIHRoZSB7QGxpbmsgTG9hZGluZ0VtaXR0ZXJ9IHJlcHJlc2VudGluZyB0aGUgbG9hZGluZyBzdGF0ZSBvZiB0aGUgcm9vdCBub2RlLlxuICAgICAqIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIHRyZWUgaGFzIG5vdCB5ZXQgYmVlbiBpbml0aWFsaXplZC5cbiAgICAgKlxuICAgICAqIFdhaXQgZm9yIGFuIGVtaXNzaW9uIG9uIHRoZSBbdHJlZVJvb3RMb2FkZWQkXXtAbGluayBDYXNlVHJlZVNlcnZpY2UjdHJlZVJvb3RMb2FkZWQkfSBzdHJlYW0gYmVmb3JlIGdldHRpbmcgdGhpcyBPYnNlcnZhYmxlLlxuICAgICAqXG4gICAgICogVGhlIGZpcnN0IHZhbHVlIGVtaXR0ZWQgYnkgdGhlIE9ic2VydmFibGUgaXMgYGZhbHNlYCwgd2hlbiB0aGUgdHJlZSBmaW5pc2hlcyBpbml0aWFsaXppbmcuXG4gICAgICovXG4gICAgcHVibGljIGdldCByb290Tm9kZUxvYWRpbmckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9yb290Tm9kZSA/IHRoaXMuX3Jvb3ROb2RlLmxvYWRpbmdDaGlsZHJlbi5hc09ic2VydmFibGUoKSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBhbiBgT2JzZXJ2YWJsZWAgb2YgdGhlIHtAbGluayBMb2FkaW5nRW1pdHRlcn0gcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIHJvb3Qgbm9kZSBpcyBjdXJyZW50bHlcbiAgICAgKiBpbiB0aGUgcHJvY2VzcyBvZiBhZGRpbmcgYSBuZXcgY2hpbGQgbm9kZSBvciBub3QuXG4gICAgICogUmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgdHJlZSBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLlxuICAgICAqXG4gICAgICogV2FpdCBmb3IgYW4gZW1pc3Npb24gb24gdGhlIFt0cmVlUm9vdExvYWRlZCRde0BsaW5rIENhc2VUcmVlU2VydmljZSN0cmVlUm9vdExvYWRlZCR9IHN0cmVhbSBiZWZvcmUgZ2V0dGluZyB0aGlzIE9ic2VydmFibGUuXG4gICAgICpcbiAgICAgKiBUaGUgZmlyc3QgdmFsdWUgZW1pdHRlZCBieSB0aGUgT2JzZXJ2YWJsZSBpcyBgZmFsc2VgLCB3aGVuIHRoZSB0cmVlIGZpbmlzaGVzIGluaXRpYWxpemluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvb3ROb2RlQWRkaW5nQ2hpbGQkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9yb290Tm9kZSA/IHRoaXMuX3Jvb3ROb2RlLmFkZGluZ05vZGUuYXNPYnNlcnZhYmxlKCkgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2VhdGhlciB0aGUgdHJlZSBpcyBlYWdlciBsb2FkZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBlYWdlciBsb2FkIGxhcmdlIHRyZWVzIGFzIGVhY2ggbm9kZSBzZW5kcyBhIHNlcGFyYXRlIGJhY2tlbmQgcmVxdWVzdCB0byBsb2FkIGl0cyBkYXRhLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNFYWdlckxvYWRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRWFnZXJMb2FkZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2VhdGhlciB0aGUgdHJlZSBpcyBlYWdlciBsb2FkZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBlYWdlciBsb2FkIGxhcmdlIHRyZWVzIGFzIGVhY2ggbm9kZSBzZW5kcyBhIHNlcGFyYXRlIGJhY2tlbmQgcmVxdWVzdCB0byBsb2FkIGl0cyBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVhZ2VyIHRoZSBuZXcgc2V0dGluZyBmb3IgZWFnZXIgbG9hZGluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgaXNFYWdlckxvYWRlZChlYWdlcjogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9pc0VhZ2VyTG9hZGVkID0gZWFnZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgYW5kIHBvcHVsYXRlcyB0aGUgdG9wbW9zdCBsZXZlbCBvZiB0aGUgdHJlZS5cbiAgICAgKlxuICAgICAqIFRoZSBkaXNwbGF5ZWQgY2FzZXMgYXJlIGRldGVybWluZWQgYnkgdGhpcyBvYmplY3QncyBbcm9vdEZpbHRlcl17QGxpbmsgQ2FzZVRyZWVTZXJ2aWNlI3Jvb3RGaWx0ZXJ9LlxuICAgICAqXG4gICAgICogQ2FzZXMgYXJlIGxvYWRlZCBvbmUgcGFnZSBhdCBhIHRpbWUgYW5kIHRoZSB0cmVlIGlzIHJlZnJlc2hlZCBhZnRlciBlYWNoIHBhZ2UuXG4gICAgICogW2ZpbmlzaGVkTG9hZGluZ0ZpcnN0TGV2ZWwkXXtAbGluayBDYXNlVHJlZVNlcnZpY2UjdHJlZVJvb3RMb2FkZWQkfVxuICAgICAqIHdpbGwgZW1pdCBgdHJ1ZWAgb25jZSB0aGUgbGFzdCBwYWdlIGxvYWRzIHN1Y2Nlc3NmdWxseS5cbiAgICAgKiBgZmFsc2VgIHdpbGwgYmUgZW1pdHRlZCBpZiBhbnkgb2YgdGhlIHJlcXVlc3RzIGZhaWwuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGxvYWRUcmVlUm9vdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Jvb3ROb2Rlc0ZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5fY2FzZVJlc291cmNlU2VydmljZS5zZWFyY2hDYXNlcyh0aGlzLl9yb290Tm9kZXNGaWx0ZXIpLnN1YnNjcmliZShwYWdlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzQ29udGVudChwYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yb290Tm9kZSA9IG5ldyBDYXNlVHJlZU5vZGUocGFnZS5jb250ZW50WzBdLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFnZS5jb250ZW50Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0ZpbHRlciBmb3IgdHJlZSByb290IHJldHVybmVkIG1vcmUgdGhhbiBvbmUgY2FzZS4gVXNpbmcgdGhlIGZpcnN0IHZhbHVlIGFzIHRyZWUgcm9vdC4uLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyZWVSb290TG9hZGVkJC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignVHJlZSByb290IGNhbm5vdCBiZSBnZW5lcmF0ZWQgZnJvbSB0aGUgcHJvdmlkZWQgZmlsdGVyJywgcGFnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignUm9vdCBub2RlIG9mIHRoZSBjYXNlIHRyZWUgY291bGQgbm90IGJlIGxvYWRlZCcsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90cmVlUm9vdExvYWRlZCQubmV4dChmYWxzZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIGxvYWRlZCB0cmVlIHJvb3QgdG8gdGhlIGRpc3BsYXkgYmFzZWQgb24gdGhlIHNldHRpbmcuXG4gICAgICogQHBhcmFtIHNob3dSb290IHdoZXRoZXIgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgdHJlZSBvciBub3QuXG4gICAgICogSWYgdGhlIHJvb3QgaXMgbm90IGRpc3BsYXllZCBpdCdzIGNoaWxkcmVuIHdpbGwgYmUgZGlzcGxheWVkIG9uIHRoZSBmaXJzdCBsZXZlbC5cbiAgICAgKiBAcmV0dXJucyBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgd2hlbiB0aGUgdHJlZSBmaW5pc2hlcyBpbml0aWFsaXphdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdGlhbGl6ZVRyZWUoc2hvd1Jvb3Q6IGJvb2xlYW4pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdTZXQgYSBGaWx0ZXIgYmVmb3JlIGluaXRpYWxpemluZyB0aGUgY2FzZSB0cmVlJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihuZXcgRXJyb3IoJ1NldCBhIEZpbHRlciBiZWZvcmUgaW5pdGlhbGl6aW5nIHRoZSBjYXNlIHRyZWUnKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zaG93Um9vdCA9IHNob3dSb290O1xuXG4gICAgICAgIGlmIChzaG93Um9vdCkge1xuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBbdGhpcy5fcm9vdE5vZGVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLl9yb290Tm9kZS5jaGlsZHJlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXQ6IE9ic2VydmFibGU8dm9pZD47XG4gICAgICAgIGlmICghc2hvd1Jvb3QgfHwgdGhpcy5faXNFYWdlckxvYWRlZCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFJlcGxheVN1YmplY3Q8dm9pZD4oMSk7XG4gICAgICAgICAgICByZXQgPSByZXN1bHQuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZE5vZGUodGhpcy5fcm9vdE5vZGUpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVHJlZSgpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5uZXh0KCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFRyZWUoKTtcbiAgICAgICAgICAgIHJldCA9IG9mVm9pZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm90aWZpZXMgdGhlIHBhcmVudCBUcmVlQ2FzZVZpZXcgdGhhdCBhIGNhc2Ugd2FzIGNsaWNrZWQgaW4gdGhlIHRyZWUgYW5kIGl0J3MgVGFzayBzaG91bGQgYmUgZGlzcGxheWVkXG4gICAgICovXG4gICAgcHVibGljIGNoYW5nZUFjdGl2ZU5vZGUobm9kZTogQ2FzZVRyZWVOb2RlIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnROb2RlID0gbm9kZTtcbiAgICAgICAgdGhpcy5fdHJlZUNhc2VWaWV3U2VydmljZS5sb2FkVGFzayQubmV4dChub2RlID8gbm9kZS5jYXNlIDogdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSBleHBhbnNpb24gc3RhdGUgb2YgYSBub2RlXG4gICAgICogQHBhcmFtIG5vZGUgdGhlIHtAbGluayBDYXNlVHJlZU5vZGV9IHdobydzIGNvbnRlbnQgc2hvdWxkIGJlIHRvZ2dsZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlTm9kZShub2RlOiBDYXNlVHJlZU5vZGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX3RyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyZWVDb250cm9sLmNvbGxhcHNlKG5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5leHBhbmROb2RlKG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhwYW5kcyB0aGUgdGFyZ2V0IG5vZGUgaW4gdGhlIHRyZWUgYW5kIHJlbG9hZHMgaXQncyBjaGlsZHJlbiBpZiB0aGV5IGFyZSBtYXJrZWQgYXMgZGlydHlcbiAgICAgKiBAcGFyYW0gbm9kZSB0aGUge0BsaW5rIENhc2VUcmVlTm9kZX0gdGhhdCBzaG91bGQgYmUgZXhwYW5kZWRcbiAgICAgKiBAcmV0dXJucyBlbWl0cyBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgZXhwYW5kZWQgYW5kIGBmYWxzZWAgaWYgbm90LiBJZiB0aGUgZXhwYW5zaW9uIGNhdXNlcyBtb3JlIG5vZGUgZXhwYW5zaW9uc1xuICAgICAqIChlLmcuIGVhZ2VyIGxvYWRlZCB0cmVlKSB0aGVuLCB0aGUgT2JzZXJ2YWJsZSBlbWl0cyBhZnRlciBhbGwgdGhlIHN1YnRyZWUgZXhwYW5zaW9ucyBjb21wbGV0ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZXhwYW5kTm9kZShub2RlOiBDYXNlVHJlZU5vZGUpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdSZXF1ZXN0aW5nIGV4cGFuc2lvbiBvZiB0cmVlIG5vZGUnLCBub2RlLnRvTG9nZ2FibGVGb3JtKCkpO1xuXG4gICAgICAgIGlmIChub2RlLmxvYWRpbmdDaGlsZHJlbi5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdOb2RlIHJlcXVlc3RlZCBmb3IgZXhwYW5zaW9uIGlzIGxvYWRpbmcuIEV4cGFuc2lvbiBjYW5jZWxlZC4nKTtcbiAgICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5vZGUuZGlydHlDaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdOb2RlIHJlcXVlc3RlZCBmb3IgZXhwYW5zaW9uIGhhcyBjbGVhbiBjaGlsZHJlbi4gU2ltcGxlIGV4cGFuc2lvbi4nKTtcbiAgICAgICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kKG5vZGUpO1xuICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmV0ID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oMSk7XG4gICAgICAgIHRoaXMudXBkYXRlTm9kZUNoaWxkcmVuKG5vZGUpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ05vZGUgcmVxdWVzdGVkIGZvciBleHBhbnNpb24gd2l0aCBkaXJ0eSBjaGlsZHJlbiBoYWQgaXRzIGNoaWxkcmVuIHJlbG9hZGVkLicpO1xuICAgICAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnTm9kZSBleHBhbmRlZC4nLCBub2RlLnRvTG9nZ2FibGVGb3JtKCkpO1xuICAgICAgICAgICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kKG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc0VhZ2VyTG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZyhgRWFnZXIgbG9hZGluZyBjaGlsZHJlbiBvZiB0cmVlIG5vZGUgd2l0aCBjYXNlIGlkICcke25vZGUuY2FzZS5zdHJpbmdJZH0nYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyT2JzZXJ2YWJsZXMgPSBub2RlLmNoaWxkcmVuLm1hcChjaGlsZE5vZGUgPT4gdGhpcy5leHBhbmROb2RlKGNoaWxkTm9kZSkpO1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3JrSm9pbiBkb2Vzbid0IGVtaXQgd2l0aCAwIGlucHV0IG9ic2VydmFibGVzXG4gICAgICAgICAgICAgICAgICAgIGlubmVyT2JzZXJ2YWJsZXMucHVzaChvZih0cnVlKSk7XG4gICAgICAgICAgICAgICAgICAgIGZvcmtKb2luKGlubmVyT2JzZXJ2YWJsZXMpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXQubmV4dCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXQubmV4dCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0LmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXQubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0LmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmV0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIGRpcnR5IGNoaWxkcmVuIG5lZWQgdG8gYmUgcmVsb2FkZWQgYW5kIHJlbG9hZHMgdGhlbSBpZiBuZWVkZWQuXG4gICAgICogQHBhcmFtIG5vZGUgdGhlIHtAbGluayBDYXNlVHJlZU5vZGV9IHdobydzIGNoaWxkcmVuIGFyZSB1cGRhdGVkXG4gICAgICogQHJldHVybnMgZW1pdHMgd2hlbiBsb2FkaW5nIGZpbmlzaGVzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHVwZGF0ZU5vZGVDaGlsZHJlbihub2RlOiBDYXNlVHJlZU5vZGUpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgbm9kZS5sb2FkaW5nQ2hpbGRyZW4ub24oKTtcblxuICAgICAgICBjb25zdCBjaGlsZHJlbkNhc2VSZWYgPSBnZXRJbW1lZGlhdGVEYXRhKG5vZGUuY2FzZSwgVHJlZVBldHJpZmxvd0lkZW50aWZpZXJzLkNISUxEUkVOX0NBU0VfUkVGKTtcbiAgICAgICAgaWYgKCFjaGlsZHJlbkNhc2VSZWYgfHwgY2hpbGRyZW5DYXNlUmVmLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IFtdO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoVHJlZSgpO1xuICAgICAgICAgICAgbm9kZS5kaXJ0eUNoaWxkcmVuID0gZmFsc2U7XG4gICAgICAgICAgICBub2RlLmxvYWRpbmdDaGlsZHJlbi5vZmYoKTtcbiAgICAgICAgICAgIHJldHVybiBvZlZvaWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gY2hpbGRyZW5DYXNlUmVmLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdDaGlsZHJlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkTm9kZSA9PiBleGlzdGluZ0NoaWxkcmVuLmFkZChjaGlsZE5vZGUuY2FzZS5zdHJpbmdJZCkpO1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuQ2FzZVJlZi52YWx1ZS5ldmVyeShjYXNlSWQgPT4gZXhpc3RpbmdDaGlsZHJlbi5oYXMoY2FzZUlkKSkpIHtcbiAgICAgICAgICAgICAgICBub2RlLmRpcnR5Q2hpbGRyZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBub2RlLmxvYWRpbmdDaGlsZHJlbi5vZmYoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2ZWb2lkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVQYWdlT2ZDaGlsZHJlbihub2RlLCAwKS5waXBlKFxuICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVHJlZSgpO1xuICAgICAgICAgICAgICAgICAgICBub2RlLmRpcnR5Q2hpbGRyZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5sb2FkaW5nQ2hpbGRyZW4ub2ZmKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGV2ZXJ5IHBhZ2Ugb2YgY2hpbGRyZW4gZnJvbSB0aGUgZ2l2ZW4gbnVtYmVyIGFuZCB1cGRhdGVzIHRoZSBleGlzdGluZyBjaGlsZHJlbi5cbiAgICAgKlxuICAgICAqIE1pc3Npbmcgbm9kZXMgYXJlIHJlbW92ZWQuIEV4aXN0aW5nIG5vZGVzIGFyZSBtYXJrZWQgYXMgZGlydHkuIE5ldyBub2RlcyBhcmUgYWRkZWQuXG4gICAgICpcbiAgICAgKiBOb2RlcyBhcmUgcmV0dXJuZWQgaW4gdGhlaXIgaW5zZXJ0aW9uIG9yZGVyLlxuICAgICAqIEBwYXJhbSBub2RlIHRoZSB7QGxpbmsgQ2FzZVRyZWVOb2RlfSB3aG8ncyBjaGlsZHJlbiBhcmUgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBwYWdlTnVtYmVyIHRoZSBudW1iZXIgb2YgdGhlIGZpcnN0IHBhZ2UgdGhhdCBzaG91bGQgYmUgbG9hZGVkLiBBbGwgZm9sbG93aW5nIHBhZ2VzIGFyZSBsb2FkZWQgYXMgd2VsbFxuICAgICAqIEByZXR1cm5zIG5leHQgaXMgZW1pdHRlZCB3aGVuIGxvYWRpbmcgb2YgYWxsIHBhZ2VzIGNvbXBsZXRlcyAocmVnYXJkbGVzcyBvZiB0aGUgb3V0Y29tZSlcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdXBkYXRlUGFnZU9mQ2hpbGRyZW4obm9kZTogQ2FzZVRyZWVOb2RlLCBwYWdlTnVtYmVyOiBudW1iZXIpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSB0aGlzLmNyZWF0ZUNoaWxkUmVxdWVzdEJvZHkobm9kZSk7XG4gICAgICAgIGlmICghcmVxdWVzdEJvZHkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ2Fubm90IGNyZWF0ZSBmaWx0ZXIgdG8gZmluZCBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gbm9kZScsIG5vZGUuY2FzZSk7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgZmlsdGVyIHRvIGZpbmQgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIG5vZGUnKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkb25lID0gbmV3IFJlcGxheVN1YmplY3Q8dm9pZD4oMSk7XG5cbiAgICAgICAgbGV0IHBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoUGFnaW5hdGlvblBhcmFtcy5QQUdFX1NJWkUsIGAke3RoaXMuX3RyZWVDb25maWd1cmF0aW9uLnBhZ2VTaXplfWApXG4gICAgICAgICAgICAgICAgICAgICAgIC5zZXQoUGFnaW5hdGlvblBhcmFtcy5QQUdFX05VTUJFUiwgYCR7cGFnZU51bWJlcn1gKVxuICAgICAgICAgICAgICAgICAgICAgICAuc2V0KFBhZ2luYXRpb25QYXJhbXMuUEFHRV9TT1JULCBjcmVhdGVTb3J0UGFyYW0oJ2NyZWF0aW9uRGF0ZScsIFBhZ2luYXRpb25Tb3J0LkFTQ0VORElORykpO1xuICAgICAgICB0aGlzLl9jYXNlUmVzb3VyY2VTZXJ2aWNlLmdldENhc2VzKHJlcXVlc3RCb2R5LCBwYXJhbXMpLnN1YnNjcmliZShwYWdlID0+IHtcbiAgICAgICAgICAgIGlmICghaGFzQ29udGVudChwYWdlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ2hpbGQgY2FzZXMgaW52YWxpZCBwYWdlIGNvbnRlbnQnLCBwYWdlKTtcbiAgICAgICAgICAgICAgICBkb25lLm5leHQoKTtcbiAgICAgICAgICAgICAgICBkb25lLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRDaGlsZHJlbldpdGhOZXdQYWdlKG5vZGUsIHBhZ2UpO1xuXG4gICAgICAgICAgICBpZiAocGFnZU51bWJlciArIDEgPCBwYWdlLnBhZ2luYXRpb24udG90YWxQYWdlcykge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGFnZU9mQ2hpbGRyZW4obm9kZSwgcGFnZU51bWJlciArIDEpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICBkb25lLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvbmUubmV4dCgpO1xuICAgICAgICAgICAgICAgIGRvbmUuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0NoaWxkIGNhc2VzIGNvdWxkIG5vdCBiZSBsb2FkZWQnLCBlcnJvcik7XG4gICAgICAgICAgICBkb25lLm5leHQoKTtcbiAgICAgICAgICAgIGRvbmUuY29tcGxldGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRvbmUuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIHtAbGluayBDYXNlVHJlZU5vZGV9IHdpdGggW0Nhc2VzXXtAbGluayBDYXNlfSBmcm9tIHRoZSBwcm92aWRlZCB7QGxpbmsgUGFnZX0uXG4gICAgICogQHBhcmFtIG5vZGUgdGhlIHtAbGluayBDYXNlVHJlZU5vZGV9IHdobydzIGNoaWxkcmVuIGFyZSB1cGRhdGVkXG4gICAgICogQHBhcmFtIHBhZ2UgdGhlIHtAbGluayBQYWdlfSB0aGF0IGNvbnRhaW5zIHRoZSB1cGRhdGVkIGNoaWxkcmVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRDaGlsZHJlbldpdGhOZXdQYWdlKG5vZGU6IENhc2VUcmVlTm9kZSwgcGFnZTogUGFnZTxDYXNlPik6IHZvaWQge1xuICAgICAgICBwYWdlLmNvbnRlbnQuZm9yRWFjaCgobmV3Q2FzZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcGFnZS5wYWdpbmF0aW9uLnNpemUgKiBwYWdlLnBhZ2luYXRpb24ubnVtYmVyICsgaW5kZXg7XG4gICAgICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBub2RlLmNoaWxkcmVuLmxlbmd0aCAmJiBub2RlLmNoaWxkcmVuW3Bvc2l0aW9uXS5jYXNlLnN0cmluZ0lkICE9PSBuZXdDYXNlLnN0cmluZ0lkKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5zcGxpY2UocG9zaXRpb24sIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSBwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4ucHVzaChuZXcgQ2FzZVRyZWVOb2RlKG5ld0Nhc2UsIG5vZGUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbltwb3NpdGlvbl0uY2FzZSA9IG5ld0Nhc2U7XG4gICAgICAgICAgICAgICAgbm9kZS5kaXJ0eUNoaWxkcmVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVDb250cm9sLmNvbGxhcHNlRGVzY2VuZGFudHMobm9kZS5jaGlsZHJlbltwb3NpdGlvbl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gbm9kZSB0aGUge0BsaW5rIENhc2VUcmVlTm9kZX0gd2hvJ3MgY2hpbGRyZW4gdGhlIHtAbGluayBGaWx0ZXJ9IHNob3VsZCByZXR1cm5cbiAgICAgKiBAcmV0dXJucyBhIHJlcXVlc3QgYm9keSB0aGF0IGZpbmRzIGFsbCBjaGlsZCBjYXNlcyBvZiB0aGUgZ2l2ZW4gYG5vZGVgLlxuICAgICAqIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIHByb3ZpZGVkIGBub2RlYCBkb2Vzbid0IGNvbnRhaW4gZW5vdWdoIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSB0aGUgcmVxdWVzdCBib2R5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVDaGlsZFJlcXVlc3RCb2R5KG5vZGU6IENhc2VUcmVlTm9kZSk6IENhc2VHZXRSZXF1ZXN0Qm9keSB7XG4gICAgICAgIGNvbnN0IGNoaWxkQ2FzZVJlZiA9IGdldEltbWVkaWF0ZURhdGEobm9kZS5jYXNlLCBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0hJTERSRU5fQ0FTRV9SRUYpO1xuICAgICAgICBpZiAoIWNoaWxkQ2FzZVJlZikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7c3RyaW5nSWQ6IChjaGlsZENhc2VSZWYudmFsdWUgYXMgQXJyYXk8c3RyaW5nPil9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjaGlsZCB0byB0aGUgcm9vdCBub2RlLlxuICAgICAqXG4gICAgICogVXNlZnVsIGlmIHlvdSBhcmUgdXNpbmcgdGhlIGxheW91dCB3aGVyZSB0aGUgcm9vdCBub2RlIGlzIGhpZGRlbi5cbiAgICAgKiBAcmV0dXJucyBlbWl0cyBgdHJ1ZWAgaWYgdGhlIGNoaWxkIHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQsIGBmYWxzZWAgaWYgbm90XG4gICAgICovXG4gICAgcHVibGljIGFkZFJvb3RDaGlsZE5vZGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHJldCA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuICAgICAgICB0aGlzLmFkZENoaWxkTm9kZSh0aGlzLl9yb290Tm9kZSkuc3Vic2NyaWJlKGFkZGVkID0+IHtcbiAgICAgICAgICAgIGlmIChhZGRlZCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fc2hvd1Jvb3QgJiYgdGhpcy5fdHJlZURhdGFTb3VyY2UuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJlZURhdGFTb3VyY2UuZGF0YSA9IHRoaXMuX3Jvb3ROb2RlLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hUcmVlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0Lm5leHQoYWRkZWQpO1xuICAgICAgICAgICAgcmV0LmNvbXBsZXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgY2hpbGQgbm9kZSB0byB0aGUgZ2l2ZW4gbm9kZSBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgbm9kZSdzIGNhc2VcbiAgICAgKiBAcmV0dXJucyBlbWl0cyBgdHJ1ZWAgaWYgdGhlIGNoaWxkIHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQsIGBmYWxzZWAgaWYgbm90XG4gICAgICovXG4gICAgcHVibGljIGFkZENoaWxkTm9kZShjbGlja2VkTm9kZTogQ2FzZVRyZWVOb2RlKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIGNsaWNrZWROb2RlLmFkZGluZ05vZGUub24oKTtcbiAgICAgICAgY29uc3QgY2FzZVJlZkZpZWxkID0gZ2V0SW1tZWRpYXRlRGF0YShjbGlja2VkTm9kZS5jYXNlLCBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0hJTERSRU5fQ0FTRV9SRUYpO1xuXG4gICAgICAgIGlmIChjYXNlUmVmRmllbGQuYWxsb3dlZE5ldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoYENhc2UgJHtjbGlja2VkTm9kZS5jYXNlLnN0cmluZ0lkfSBjYW4gYWRkIG5ldyB0cmVlIG5vZGVzIGJ1dCBoYXMgbm8gYWxsb3dlZCBuZXRzYCk7XG4gICAgICAgICAgICBjbGlja2VkTm9kZS5hZGRpbmdOb2RlLm9mZigpO1xuICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJldCA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuXG4gICAgICAgIGlmIChjYXNlUmVmRmllbGQuYWxsb3dlZE5ldHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFuZEFkZENoaWxkQ2FzZShjYXNlUmVmRmllbGQuYWxsb3dlZE5ldHNbMF0sIGNsaWNrZWROb2RlLCByZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc1NlcnZpY2UuZ2V0TmV0cyhjYXNlUmVmRmllbGQuYWxsb3dlZE5ldHMpLnN1YnNjcmliZShuZXRzID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzaWRlTWV1UmVmID0gdGhpcy5fc2lkZU1lbnVTZXJ2aWNlLm9wZW4odGhpcy5fb3B0aW9uU2VsZWN0b3JDb21wb25lbnQsIFNpZGVNZW51U2l6ZS5NRURJVU0sIHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGNsaWNrZWROb2RlLmNhc2UudGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IG5ldHMubWFwKG5ldCA9PiAoe3RleHQ6IG5ldC50aXRsZSwgdmFsdWU6IG5ldC5pZGVudGlmaWVyfSkpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IHNpZGVNZW51U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgc2lkZU1lbnVTdWJzY3JpcHRpb24gPSBzaWRlTWV1UmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhZXZlbnQuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVBbmRBZGRDaGlsZENhc2UoZXZlbnQuZGF0YS52YWx1ZSwgY2xpY2tlZE5vZGUsIHJldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWRlTWVudVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2tlZE5vZGUuYWRkaW5nTm9kZS5vZmYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY2FzZSBhbmQgYWRkcyBpdCB0byB0aGUgY2hpbGRyZW4gb2YgdGhlIHNwZWNpZmllZCBub2RlXG4gICAgICogQHBhcmFtIHByb2Nlc3NJZGVudGlmaWVyIGlkZW50aWZpZXIgb2YgdGhlIHByb2Nlc3MgdGhhdCBzaG91bGQgYmUgY3JlYXRlZFxuICAgICAqIEBwYXJhbSBjbGlja2VkTm9kZSB0aGUgbm9kZSB0aGF0IGlzIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBjYXNlXG4gICAgICogQHBhcmFtIG9wZXJhdGlvblJlc3VsdCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gd2lsbCBiZSBlbWl0dGVkIGludG8gdGhpcyBzdHJlYW0gd2hlbiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVBbmRBZGRDaGlsZENhc2UocHJvY2Vzc0lkZW50aWZpZXI6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrZWROb2RlOiBDYXNlVHJlZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25SZXN1bHQ6IFN1YmplY3Q8Ym9vbGVhbj4pIHtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc1NlcnZpY2UuZ2V0TmV0KHByb2Nlc3NJZGVudGlmaWVyKS5zdWJzY3JpYmUobmV0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkVGl0bGVJbW1lZGlhdGUgPSBnZXRJbW1lZGlhdGVEYXRhKGNsaWNrZWROb2RlLmNhc2UsIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DSElMRF9OT0RFX1RJVExFKTtcbiAgICAgICAgICAgIGxldCBjaGlsZFRpdGxlID0gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjYXNlVHJlZS5uZXdOb2RlRGVmYXVsdE5hbWUnKTtcbiAgICAgICAgICAgIGlmICghIWNoaWxkVGl0bGVJbW1lZGlhdGUpIHtcbiAgICAgICAgICAgICAgICBjaGlsZFRpdGxlID0gY2hpbGRUaXRsZUltbWVkaWF0ZS52YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoISFuZXQuZGVmYXVsdENhc2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRUaXRsZSA9IG5ldC5kZWZhdWx0Q2FzZU5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9jYXNlUmVzb3VyY2VTZXJ2aWNlLmNyZWF0ZUNhc2Uoe1xuICAgICAgICAgICAgICAgIHRpdGxlOiBjaGlsZFRpdGxlLFxuICAgICAgICAgICAgICAgIG5ldElkOiBuZXQuc3RyaW5nSWRcbiAgICAgICAgICAgIH0pLnN1YnNjcmliZSgob3V0Y29tZVJlc291cmNlOiBFdmVudE91dGNvbWVNZXNzYWdlUmVzb3VyY2UpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYXNlUmVmRmllbGQgPSBnZXRJbW1lZGlhdGVEYXRhKGNsaWNrZWROb2RlLmNhc2UsIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DSElMRFJFTl9DQVNFX1JFRik7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0Q2FzZVJlZlZhbHVlID0gWy4uLmNhc2VSZWZGaWVsZC52YWx1ZSwgKG91dGNvbWVSZXNvdXJjZS5vdXRjb21lIGFzIENyZWF0ZUNhc2VFdmVudE91dGNvbWUpLmFDYXNlLnN0cmluZ0lkXTtcbiAgICAgICAgICAgICAgICB0aGlzLnBlcmZvcm1DYXNlUmVmQ2FsbChjbGlja2VkTm9kZS5jYXNlLnN0cmluZ0lkLCBzZXRDYXNlUmVmVmFsdWUpLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVDaGFuZ2UgPT4gdGhpcy51cGRhdGVUcmVlQWZ0ZXJDaGlsZEFkZChjbGlja2VkTm9kZSwgdmFsdWVDaGFuZ2UgPyB2YWx1ZUNoYW5nZSA6IHNldENhc2VSZWZWYWx1ZSwgb3BlcmF0aW9uUmVzdWx0KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgdHJlZSBhZnRlciBhZGRpbmcgYSBuZXcgY2hpbGRcbiAgICAgKiBAcGFyYW0gY2xpY2tlZE5vZGUgdGhlIHBhcmVudCBub2RlXG4gICAgICogQHBhcmFtIG5ld0Nhc2VSZWZWYWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSBwYXJlbnQgbm9kZSdzIGNhc2UgcmVmXG4gICAgICogQHBhcmFtIG9wZXJhdGlvblJlc3VsdCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gd2lsbCBiZSBlbWl0dGVkIGludG8gdGhpcyBzdHJlYW0gd2hlbiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCB1cGRhdGVUcmVlQWZ0ZXJDaGlsZEFkZChjbGlja2VkTm9kZTogQ2FzZVRyZWVOb2RlLCBuZXdDYXNlUmVmVmFsdWU6IEFycmF5PHN0cmluZz4sIG9wZXJhdGlvblJlc3VsdDogU3ViamVjdDxib29sZWFuPik6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZU5vZGVDaGlsZHJlbkZyb21DaGFuZ2VkRmllbGRzKGNsaWNrZWROb2RlLCBuZXdDYXNlUmVmVmFsdWUpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgICAgY2xpY2tlZE5vZGUuYWRkaW5nTm9kZS5vZmYoKTtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kTm9kZShjbGlja2VkTm9kZSkuc3Vic2NyaWJlKGV4cGFuZFN1Y2Nlc3MgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChleHBhbmRTdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQWN0aXZlTm9kZShjbGlja2VkTm9kZS5jaGlsZHJlbltjbGlja2VkTm9kZS5jaGlsZHJlbi5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5leGVjdXRlQWZ0ZXJBY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9wZXJhdGlvblJlc3VsdC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvblJlc3VsdC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJlbW92ZXMgdGhlIHByb3ZpZGVkIG5vbi1yb290IG5vZGUgaWYgdGhlIHVuZGVybHlpbmcgY2FzZSBhbGxvd3MgaXQuXG4gICAgICpcbiAgICAgKiBUaGUgdW5kZXJseWluZyBjYXNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FzZSByZWYgb2YgaXQncyBwYXJlbnQgZWxlbWVudCB3aXRoIHRoZSBoZWxwIGZyb20gdGhlIGByZW1vdmVgXG4gICAgICogb3BlcmF0aW9uIHByb3ZpZGVkIGJ5IGNhc2UgcmVmIGl0c2VsZi5cbiAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0aGF0IHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIHRyZWVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlTm9kZShub2RlOiBDYXNlVHJlZU5vZGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFub2RlLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdDYXNlIHRyZWUgZG9lc25cXCd0IHN1cHBvcnQgcmVtb3ZhbCBvZiB0aGUgcm9vdCBub2RlLCBhcyBpdCBoYXMgbm8gcGFyZW50IGNhc2UgcmVmLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5yZW1vdmluZ05vZGUub24oKTtcbiAgICAgICAgY29uc3QgY2FzZVJlZkltbWVkaWF0ZSA9IGdldEltbWVkaWF0ZURhdGEobm9kZS5wYXJlbnQuY2FzZSwgVHJlZVBldHJpZmxvd0lkZW50aWZpZXJzLkNISUxEUkVOX0NBU0VfUkVGKTtcbiAgICAgICAgY29uc3Qgc2V0Q2FzZVJlZlZhbHVlID0gKGNhc2VSZWZJbW1lZGlhdGUudmFsdWUgYXMgQXJyYXk8c3RyaW5nPikuZmlsdGVyKGlkID0+IGlkICE9PSBub2RlLmNhc2Uuc3RyaW5nSWQpO1xuICAgICAgICB0aGlzLnBlcmZvcm1DYXNlUmVmQ2FsbChub2RlLnBhcmVudC5jYXNlLnN0cmluZ0lkLCBzZXRDYXNlUmVmVmFsdWUpLnN1YnNjcmliZShjYXNlUmVmQ2hhbmdlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0Nhc2VSZWZWYWx1ZSA9IGNhc2VSZWZDaGFuZ2UgPyBjYXNlUmVmQ2hhbmdlIDogc2V0Q2FzZVJlZlZhbHVlO1xuICAgICAgICAgICAgdGhpcy5kZWxldGVSZW1vdmVkTm9kZXMobm9kZS5wYXJlbnQsIG5ld0Nhc2VSZWZWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVDaGlsZHJlbkZyb21DaGFuZ2VkRmllbGRzKG5vZGUucGFyZW50LCBuZXdDYXNlUmVmVmFsdWUpO1xuXG4gICAgICAgICAgICBub2RlLnJlbW92aW5nTm9kZS5vZmYoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kZXNlbGVjdE5vZGVJZkRlc2NlbmRhbnRPZihub2RlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHBhbmRzIGFsbCBub2RlcyBpbiB0aGUgdHJlZSBkaWN0YXRlZCBieSB0aGUgYXJndW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGF0aCBub2RlcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZCBhbG9uZyB3aXRoIHRoZWlyIHBhdGggZnJvbSB0aGUgcm9vdCBub2RlXG4gICAgICovXG4gICAgcHVibGljIGV4cGFuZFBhdGgocGF0aDogQ2FzZVRyZWVQYXRoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcm9vdE5vZGUgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YVswXTtcbiAgICAgICAgd2hpbGUgKHJvb3ROb2RlLnBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByb290Tm9kZSA9IHJvb3ROb2RlLnBhcmVudDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV4cGFuZExldmVsKFtyb290Tm9kZV0sIHRoaXMuY29udmVydFBhdGhUb0V4cGFuc2lvblRyZWUocGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybXMgYSB7QExpbmsgQ2FzZVRyZWVQYXRofSBvYmplY3QgaW50byBhbiB7QGxpbmsgRXhwYW5zaW9uVHJlZX0gb2JqZWN0LlxuICAgICAqIFRoZSByZXN1bHQgaGFzIGFsbCB0aGUgY29tbW9uIHBhdGhzIG1lcmdlZCBpbnRvIHNpbmdsZSBicmFuY2hlcyBvZiB0aGUgcmVzdWx0aW5nIHRyZWUgc3RydWN0dXJlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhdGhzIG5vZGVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkIGFsb25nIHdpdGggdGhlaXIgcGF0aCBmcm9tIHRoZSByb290IG5vZGVcbiAgICAgKiBAcmV0dXJucyBhbiB7QGxpbmsgRXhwYW5zaW9uVHJlZX0gZXF1aXZhbGVudCB0byB0aGUgcHJvdmlkZWQge0BsaW5rIENhc2VUcmVlUGF0aH1cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29udmVydFBhdGhUb0V4cGFuc2lvblRyZWUocGF0aHM6IENhc2VUcmVlUGF0aCk6IEV4cGFuc2lvblRyZWUge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhwYXRocykuZm9yRWFjaChwYXRoID0+IHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IHJlc3VsdDtcbiAgICAgICAgICAgIHBhdGguZm9yRWFjaChub2RlSWQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZVtub2RlSWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGVbbm9kZUlkXSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlW25vZGVJZF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgZXhwYW5kcyBhbGwgbm9kZXMgZnJvbSB0aGUgcHJvdmlkZWQgYXJyYXkgb2Ygbm9kZXMsIHRoYXQgYXBwZWFyIGluIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHtAbGluayBFeHBhbnNpb25UcmVlfSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGV2ZWxOb2RlcyBub2RlcyBmcm9tIHdoaWNoIHRoZSBleHBhbnNpb24gc2hvdWxkIHN0YXJ0XG4gICAgICogQHBhcmFtIHRhcmdldHMgYSB0cmVlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIG5vZGVzIHRoYXQgYXJlIHRvIGJlIGV4cGFuZGVkIHJlY3Vyc2l2ZWx5LlxuICAgICAqIFRoZSB0b3AgbGV2ZWwgbm9kZXMgYXJlIGV4cGFuZGVkIGZpcnN0LCBmcm9tIHRoZSBwcm92aWRlZCBgbGV2ZWxOb2Rlc2AuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGV4cGFuZExldmVsKGxldmVsTm9kZXM6IEFycmF5PENhc2VUcmVlTm9kZT4sIHRhcmdldHM6IEV4cGFuc2lvblRyZWUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGVzaXJlZElkcyA9IG5ldyBTZXQoT2JqZWN0LmtleXModGFyZ2V0cykpO1xuICAgICAgICBpZiAoZGVzaXJlZElkcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXZlbE5vZGVzLmZvckVhY2gobiA9PiB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gbjtcbiAgICAgICAgICAgIGlmICghZGVzaXJlZElkcy5oYXMobm9kZS5jYXNlLnN0cmluZ0lkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZXhwYW5kTm9kZShub2RlKS5zdWJzY3JpYmUoc3VjY2VzcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnQ291bGQgbm90IGV4cGFuZCB0cmVlIG5vZGUgd2l0aCBJRDogJyArIG5vZGUuY2FzZS5zdHJpbmdJZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5leHBhbmRMZXZlbChub2RlLmNoaWxkcmVuLCB0YXJnZXRzW25vZGUuY2FzZS5zdHJpbmdJZF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgdGhlIHN1YnRyZWVzIHJvb3RlZCBhdCB0aGUgbm9kZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcGFyZW50IG5vZGUncyBjaGlsZCBjYXNlIHJlZiB2YWx1ZXMsXG4gICAgICogYnV0IGFyZSBubyBsb25nZXIgcHJlc2VudCBpbiB0aGUgbmV3IHZhbHVlXG4gICAgICogQHBhcmFtIHBhcmVudE5vZGUgYW4gaW5uZXIgbm9kZSBvZiB0aGUgdHJlZSB0aGF0IGhhZCBzb21lIG9mIGl0J3MgY2hpbGRyZW4gcmVtb3ZlZFxuICAgICAqIEBwYXJhbSBuZXdDYXNlUmVmVmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcGFyZW50IG5vZGUncyBjYXNlIHJlZlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBkZWxldGVSZW1vdmVkTm9kZXMocGFyZW50Tm9kZTogQ2FzZVRyZWVOb2RlLCBuZXdDYXNlUmVmVmFsdWU6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZENoaWxkcmVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGdldEltbWVkaWF0ZURhdGEocGFyZW50Tm9kZS5jYXNlLCBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0hJTERSRU5fQ0FTRV9SRUYpLnZhbHVlLmZvckVhY2goaWQgPT4gcmVtb3ZlZENoaWxkcmVuLmFkZChpZCkpO1xuICAgICAgICBuZXdDYXNlUmVmVmFsdWUuZm9yRWFjaChpZCA9PiByZW1vdmVkQ2hpbGRyZW4uZGVsZXRlKGlkKSk7XG4gICAgICAgIHJlbW92ZWRDaGlsZHJlbi5mb3JFYWNoKHJlbW92ZWRJZCA9PiB0aGlzLl9jYXNlUmVzb3VyY2VTZXJ2aWNlLmRlbGV0ZUNhc2UocmVtb3ZlZElkLCB0cnVlKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZU1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdSZW1vdmFsIG9mIGNoaWxkIGNhc2UgdW5zdWNjZXNzZnVsJywgcmVzcG9uc2VNZXNzYWdlLmVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3RzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbm9kZSBpZiBpdCBpcyBhIGRlc2NlbmRhbnQgb2YgdGhlIHByb3ZpZGVkIG5vZGVcbiAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB3aG8ncyBkZXNjZW5kYW50cyBzaG91bGQgYmUgZGVzZWxlY3RlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBkZXNlbGVjdE5vZGVJZkRlc2NlbmRhbnRPZihub2RlOiBDYXNlVHJlZU5vZGUpOiB2b2lkIHtcbiAgICAgICAgbGV0IGJ1YmJsaW5nTm9kZSA9IHRoaXMuY3VycmVudE5vZGU7XG4gICAgICAgIHdoaWxlIChidWJibGluZ05vZGUgJiYgYnViYmxpbmdOb2RlICE9PSB0aGlzLl9yb290Tm9kZSkge1xuICAgICAgICAgICAgaWYgKGJ1YmJsaW5nTm9kZSA9PT0gbm9kZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQWN0aXZlTm9kZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnViYmxpbmdOb2RlID0gYnViYmxpbmdOb2RlLnBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgYmFja2VuZCBjYWxsIG9uIHRoZSBnaXZlbiBjYXNlLCBhbmQgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNhc2UgcmVmIGZpZWxkIGluIHRoZSB0cmFuc2l0aW9uIGRlZmluZWQgYnlcbiAgICAgKiBbQ0FTRV9SRUZfVFJBTlNJVElPTl17QGxpbmsgVHJlZVBldHJpZmxvd0lkZW50aWZpZXJzI0NBU0VfUkVGX1RSQU5TSVRJT059LlxuICAgICAqIEBwYXJhbSBjYXNlSWQgc3RyaW5nIElEIG9mIHRoZSBjYXNlIHRoYXQgc2hvdWxkIGhhdmUgaXQncyB0cmVlIGNhc2UgcmVmIHNldFxuICAgICAqIEBwYXJhbSBuZXdDYXNlUmVmVmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY2FzZSByZWYgZmllbGRcbiAgICAgKi9cbiAgICBwcml2YXRlIHBlcmZvcm1DYXNlUmVmQ2FsbChjYXNlSWQ6IHN0cmluZywgbmV3Q2FzZVJlZlZhbHVlOiBBcnJheTxzdHJpbmc+KTogT2JzZXJ2YWJsZTxBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCQgPSBuZXcgUmVwbGF5U3ViamVjdDxBcnJheTxzdHJpbmc+PigxKTtcblxuICAgICAgICB0aGlzLl90YXNrUmVzb3VyY2VTZXJ2aWNlLmdldFRhc2tzKFNpbXBsZUZpbHRlci5mcm9tVGFza1F1ZXJ5KHtcbiAgICAgICAgICAgIGNhc2U6IHtpZDogY2FzZUlkfSxcbiAgICAgICAgICAgIHRyYW5zaXRpb25JZDogVHJlZVBldHJpZmxvd0lkZW50aWZpZXJzLkNBU0VfUkVGX1RSQU5TSVRJT05cbiAgICAgICAgfSkpLnN1YnNjcmliZShwYWdlID0+IHtcbiAgICAgICAgICAgIGlmICghaGFzQ29udGVudChwYWdlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ2FzZSByZWYgYWNjZXNzb3IgdGFzayBkb2VzblxcJ3QgZXhpc3QhJyk7XG4gICAgICAgICAgICAgICAgcmVzdWx0JC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdGFzayA9IHBhZ2UuY29udGVudFswXTtcblxuICAgICAgICAgICAgdGhpcy5fdGFza1Jlc291cmNlU2VydmljZS5hc3NpZ25UYXNrKHRhc2suc3RyaW5nSWQpLnN1YnNjcmliZShhc3NpZ25SZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFhc3NpZ25SZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ2FzZSByZWYgYWNjZXNzb3IgdGFzayBjb3VsZCBub3QgYmUgYXNzaWduZWQnLCBhc3NpZ25SZXNwb25zZS5lcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHt9O1xuICAgICAgICAgICAgICAgIGJvZHlbVHJlZVBldHJpZmxvd0lkZW50aWZpZXJzLkNISUxEUkVOX0NBU0VfUkVGXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Nhc2VSZWYnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3Q2FzZVJlZlZhbHVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl90YXNrUmVzb3VyY2VTZXJ2aWNlLnNldERhdGEodGFzay5zdHJpbmdJZCwgYm9keSkuc3Vic2NyaWJlKChvdXRjb21lUmVzb3VyY2U6IEV2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VkRmllbGRzID0gKG91dGNvbWVSZXNvdXJjZS5vdXRjb21lIGFzIFNldERhdGFFdmVudE91dGNvbWUpLmNoYW5nZWRGaWVsZHMuY2hhbmdlZEZpZWxkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FzZVJlZkNoYW5nZXMgPSBjaGFuZ2VkRmllbGRzW1RyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DSElMRFJFTl9DQVNFX1JFRl07XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCQubmV4dChjYXNlUmVmQ2hhbmdlcyA/IGNhc2VSZWZDaGFuZ2VzLnZhbHVlIDogdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0JC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrUmVzb3VyY2VTZXJ2aWNlLmZpbmlzaFRhc2sodGFzay5zdHJpbmdJZCkuc3Vic2NyaWJlKGZpbmlzaFJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hSZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdDYXNlIHJlZiBhY2Nlc3NvciB0YXNrIGZpbmlzaGVkJywgZmluaXNoUmVzcG9uc2Uuc3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ2FzZSByZWYgYWNjZXNzb3IgdGFzayBmaW5pc2ggZmFpbGVkJywgZmluaXNoUmVzcG9uc2UuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignQ291bGQgbm90IHNldCBkYXRhIHRvIHRyZWUgY2FzZSByZWYnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCQuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0Nhc2UgcmVmIGFjY2Vzc29yIHRhc2sgY291bGQgbm90IGJlIGFzc2lnbmVkJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCQuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0Nhc2UgcmVmIGFjY2Vzc29yIHRhc2sgY291bGQgbm90IGJlIGZvdW5kJywgZXJyb3IpO1xuICAgICAgICAgICAgcmVzdWx0JC5jb21wbGV0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYW4gdXBkYXRlIGFmdGVyIGFkZGluZyBvciByZW1vdmluZyBhIG5vZGUgZnJvbSB0aGUgdHJlZS5cbiAgICAgKlxuICAgICAqIElmIG9ubHkgb25lIG5vZGUgd2FzIGFkZGVkIGFkZHMgaXQgaW50byB0aGUgdHJlZVxuICAgICAqXG4gICAgICogSWYgb25seSBvbmUgbm9kZSB3YXMgcmVtb3ZlZCByZW1vdmVzIGl0IGZyb20gdGhlIHRyZWVcbiAgICAgKlxuICAgICAqIE90aGVyd2lzZSBjb2xsYXBzZXMgdGhlIGFmZmVjdGVkIG5vZGUgYW5kIG1hcmtzIGl0J3MgY2hpbGRyZW4gYXMgZGlydHlcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhZmZlY3RlZE5vZGUgbm9kZSB0aGF0IGhhZCBpdCdzIGNoaWxkcmVuIGNoYW5nZWRcbiAgICAgKiBAcGFyYW0gbmV3Q2FzZVJlZlZhbHVlIG5ldyB2YWx1ZSBvZiB0aGUgY2FzZVJlZiBmaWVsZCByZXR1cm5lZCBieSBiYWNrZW5kXG4gICAgICogQHJldHVybnMgYW4gYE9ic2VydmFibGVgIHRoYXQgZW1pdHMgYW4gb2JqZWN0IHdpdGggdGhlIFtyZXN1bHRde0BsaW5rIFJlc3VsdFdpdGhBZnRlckFjdGlvbnMjcmVzdWx0fSBhdHRyaWJ1dGUgc2V0IHRvIGB0cnVlYCBpZlxuICAgICAqIHRoZSB1cGRhdGUgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSBhbmQgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVOb2RlQ2hpbGRyZW5Gcm9tQ2hhbmdlZEZpZWxkcyhhZmZlY3RlZE5vZGU6IENhc2VUcmVlTm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nhc2VSZWZWYWx1ZTogQXJyYXk8c3RyaW5nPik6IE9ic2VydmFibGU8UmVzdWx0V2l0aEFmdGVyQWN0aW9uczxib29sZWFuPj4ge1xuICAgICAgICBjb25zdCBjYXNlUmVmRmllbGQgPSBnZXRJbW1lZGlhdGVEYXRhKGFmZmVjdGVkTm9kZS5jYXNlLCBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0hJTERSRU5fQ0FTRV9SRUYpO1xuICAgICAgICBjb25zdCBuZXdDaGlsZHJlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBuZXdDYXNlUmVmVmFsdWUuZm9yRWFjaChpZCA9PiBuZXdDaGlsZHJlbi5hZGQoaWQpKTtcblxuICAgICAgICBsZXQgbnVtYmVyT2ZNaXNzaW5nQ2hpbGRyZW4gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhc2VSZWZGaWVsZC52YWx1ZS5sZW5ndGggJiYgbnVtYmVyT2ZNaXNzaW5nQ2hpbGRyZW4gPCAyOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghbmV3Q2hpbGRyZW4uaGFzKGNhc2VSZWZGaWVsZC52YWx1ZVtpXSkpIHtcbiAgICAgICAgICAgICAgICBudW1iZXJPZk1pc3NpbmdDaGlsZHJlbisrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhhY3RseU9uZUNoaWxkQWRkZWQgPSBjYXNlUmVmRmllbGQudmFsdWUubGVuZ3RoICsgMSA9PT0gbmV3Q2FzZVJlZlZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgJiYgY2FzZVJlZkZpZWxkLnZhbHVlLmV2ZXJ5KGl0ID0+IG5ld0NoaWxkcmVuLmhhcyhpdCkpO1xuXG4gICAgICAgIGNvbnN0IGV4YWN0bHlPbmVDaGlsZFJlbW92ZWQgPSBjYXNlUmVmRmllbGQudmFsdWUubGVuZ3RoIC0gMSA9PT0gbmV3Q2FzZVJlZlZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgJiYgbnVtYmVyT2ZNaXNzaW5nQ2hpbGRyZW4gPT09IDE7XG5cbiAgICAgICAgaWYgKCFleGFjdGx5T25lQ2hpbGRBZGRlZCAmJiAhZXhhY3RseU9uZUNoaWxkUmVtb3ZlZCkge1xuICAgICAgICAgICAgY2FzZVJlZkZpZWxkLnZhbHVlID0gbmV3Q2FzZVJlZlZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fdHJlZUNvbnRyb2wuY29sbGFwc2VEZXNjZW5kYW50cyhhZmZlY3RlZE5vZGUpO1xuICAgICAgICAgICAgYWZmZWN0ZWROb2RlLmRpcnR5Q2hpbGRyZW4gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIG9mKG5ldyBSZXN1bHRXaXRoQWZ0ZXJBY3Rpb25zKHRydWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleGFjdGx5T25lQ2hpbGRBZGRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0NoaWxkTm9kZUFkZChhZmZlY3RlZE5vZGUsIGNhc2VSZWZGaWVsZCwgbmV3Q2FzZVJlZlZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NDaGlsZE5vZGVSZW1vdmUoYWZmZWN0ZWROb2RlLCBjYXNlUmVmRmllbGQsIG5ld0NoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgY2hpbGQgbm9kZSB0byB0aGUgYGFmZmVjdGVkTm9kZWAgYnkgYWRkaW5nIHRoZSBsYXN0IENhc2UgZnJvbSB0aGUgYG5ld0Nhc2VSZWZWYWx1ZWBcbiAgICAgKiBAcGFyYW0gYWZmZWN0ZWROb2RlIHRoZSBub2RlIGluIHRoZSB0cmVlIHRoYXQgaGFkIGEgY2hpbGQgYWRkZWQgLSB0aGUgcGFyZW50IG5vZGVcbiAgICAgKiBAcGFyYW0gY2FzZVJlZkZpZWxkIHRoZSBjYXNlIHJlZiBmaWVsZCBvZiB0aGUgYWZmZWN0ZWQgbm9kZVxuICAgICAqIEBwYXJhbSBuZXdDYXNlUmVmVmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY2FzZSByZWYgZmllbGQgaW4gdGhlIG5vZGVcbiAgICAgKiBAcmV0dXJucyBhbiBgT2JzZXJ2YWJsZWAgdGhhdCBlbWl0cyBgdHJ1ZWAgaWYgYSBub2RlIHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcm9jZXNzQ2hpbGROb2RlQWRkKGFmZmVjdGVkTm9kZTogQ2FzZVRyZWVOb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VSZWZGaWVsZDogSW1tZWRpYXRlRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDYXNlUmVmVmFsdWU6IEFycmF5PHN0cmluZz4pOiBPYnNlcnZhYmxlPFJlc3VsdFdpdGhBZnRlckFjdGlvbnM8Ym9vbGVhbj4+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0JCA9IG5ldyBSZXBsYXlTdWJqZWN0PFJlc3VsdFdpdGhBZnRlckFjdGlvbnM8Ym9vbGVhbj4+KDEpO1xuXG4gICAgICAgIGNhc2VSZWZGaWVsZC52YWx1ZSA9IG5ld0Nhc2VSZWZWYWx1ZTtcbiAgICAgICAgdGhpcy5fY2FzZVJlc291cmNlU2VydmljZS5nZXRPbmVDYXNlKG5ld0Nhc2VSZWZWYWx1ZVtuZXdDYXNlUmVmVmFsdWUubGVuZ3RoIC0gMV0pLnN1YnNjcmliZShjaGlsZENhc2UgPT4ge1xuICAgICAgICAgICAgaWYgKGNoaWxkQ2FzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnUHVzaGluZyBjaGlsZCBub2RlIHRvIHRyZWUnLCB7Y2hpbGRDYXNlLCBhZmZlY3RlZE5vZGU6IGFmZmVjdGVkTm9kZS50b0xvZ2dhYmxlRm9ybSgpfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gdGhpcy5wdXNoQ2hpbGRUb1RyZWUoYWZmZWN0ZWROb2RlLCBjaGlsZENhc2UpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCQubmV4dChuZXcgUmVzdWx0V2l0aEFmdGVyQWN0aW9ucyh0cnVlLCBbKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNFYWdlckxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdFYWdlcmx5IGV4cGFuZGluZyBhIG5ld2x5IGFkZGVkIG5vZGUuJywgY2hpbGROb2RlLnRvTG9nZ2FibGVGb3JtKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBhbmROb2RlKGNoaWxkTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ05ldyBjaGlsZCBjYXNlIHdhcyBub3QgZm91bmQsIGlsbGVnYWwgc3RhdGUnLCBjaGlsZENhc2UpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCQubmV4dChuZXcgUmVzdWx0V2l0aEFmdGVyQWN0aW9ucyhmYWxzZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0JC5jb21wbGV0ZSgpO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ05ldyBjaGlsZCBub2RlIGNhc2UgY291bGQgbm90IGJlIGZvdW5kJywgZXJyb3IpO1xuICAgICAgICAgICAgcmVzdWx0JC5uZXh0KG5ldyBSZXN1bHRXaXRoQWZ0ZXJBY3Rpb25zKGZhbHNlKSk7XG4gICAgICAgICAgICByZXN1bHQkLmNvbXBsZXRlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgY2hpbGQgbm9kZSB0byB0aGUgdGFyZ2V0IHBhcmVudCBub2RlLlxuICAgICAqIEBwYXJhbSBwYXJlbnROb2RlIHRoZSBub2RlcyB3aG9zZSBjaGlsZCBzaG91bGQgYmUgYWRkZWRcbiAgICAgKiBAcGFyYW0gY2hpbGRDYXNlIHRoZSBjaGlsZCBjYXNlXG4gICAgICogQHJldHVybnMgdGhlIG5ld2x5IGFkZGVkIG5vZGVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcHVzaENoaWxkVG9UcmVlKHBhcmVudE5vZGU6IENhc2VUcmVlTm9kZSwgY2hpbGRDYXNlOiBDYXNlKTogQ2FzZVRyZWVOb2RlIHtcbiAgICAgICAgY29uc3QgY2hpbGROb2RlID0gbmV3IENhc2VUcmVlTm9kZShjaGlsZENhc2UsIHBhcmVudE5vZGUpO1xuICAgICAgICBwYXJlbnROb2RlLmNoaWxkcmVuLnB1c2goY2hpbGROb2RlKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoVHJlZSgpO1xuICAgICAgICByZXR1cm4gY2hpbGROb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGRlbGV0ZWQgbm9kZSBmcm9tIHRoZSBjaGlsZHJlbiBvZiB0aGUgYGFmZmVjdGVkTm9kZWBcbiAgICAgKiBAcGFyYW0gYWZmZWN0ZWROb2RlIHRoZSBub2RlIGluIHRoZSB0cmVlIHRoYXQgaGFkIGl0J3MgY2hpbGQgcmVtb3ZlZFxuICAgICAqIEBwYXJhbSBjYXNlUmVmRmllbGQgdGhlIGNhc2UgcmVmIGZpZWxkIG9mIHRoZSBhZmZlY3RlZCBub2RlXG4gICAgICogQHBhcmFtIG5ld0Nhc2VSZWZWYWx1ZXMgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY2FzZSByZWYgZmllbGQgaW4gdGhlIG5vZGVcbiAgICAgKiBAcmV0dXJucyBhbiBgT2JzZXJ2YWJsZWAgdGhhdCBlbWl0cyBgdHJ1ZWAgd2hlbiB0aGUgcmVtb3ZlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDaGlsZE5vZGVSZW1vdmUoYWZmZWN0ZWROb2RlOiBDYXNlVHJlZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVJlZkZpZWxkOiBJbW1lZGlhdGVEYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nhc2VSZWZWYWx1ZXM6IFNldDxzdHJpbmc+KTogT2JzZXJ2YWJsZTxSZXN1bHRXaXRoQWZ0ZXJBY3Rpb25zPGJvb2xlYW4+PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2FzZVJlZkZpZWxkLnZhbHVlLmZpbmRJbmRleChpdCA9PiAhbmV3Q2FzZVJlZlZhbHVlcy5oYXMoaXQpKTtcbiAgICAgICAgY2FzZVJlZkZpZWxkLnZhbHVlLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGFmZmVjdGVkTm9kZS5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB0aGlzLnJlZnJlc2hUcmVlKCk7XG4gICAgICAgIHJldHVybiBvZihuZXcgUmVzdWx0V2l0aEFmdGVyQWN0aW9ucyh0cnVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqIEZvcmNlcyBhIHJlcmVuZGVyIG9mIHRoZSB0cmVlIGNvbnRlbnRcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlZnJlc2hUcmVlKCk6IHZvaWQge1xuICAgICAgICByZWZyZXNoVHJlZSh0aGlzLl90cmVlRGF0YVNvdXJjZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsb2FkcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGNhc2Ugbm9kZS4gVGhlIHtAbGluayBDYXNlfSBvYmplY3QgaGVsZCBpbiB0aGUge0BsaW5rIENhc2VUcmVlTm9kZX0gaW5zdGFuY2UgaXMgbm90IHJlcGxhY2VkLFxuICAgICAqIGJ1dCB0aGUgbmV3IENhc2UgaXMgYE9iamVjdC5hc3NpZ25gLWVkIGludG8gaXQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBDYXNlIGluc3RhbmNlIGlzIHVuY2hhbmdlZCBidXQgcmVmZXJlbmNlc1xuICAgICAqIHRvIGFsbCBpdCdzIG5vbi1wcmltaXRpdmUgYXR0cmlidXRlcyBhcmUgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIElmIGEgcmVsb2FkIG9mIHRoZSBjdXJyZW50IG5vZGUgaXMgaW5pdGlhdGVkIGJlZm9yZSB0aGUgcHJldmlvdXMgb25lIGNvbXBsZXRlZCwgdGhlIG5ldyBvbmUgaXMgaWdub3JlZC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY2FzZSBjaGFuZ2VkIGJlZm9yZSBhIHJlc3BvbnNlIGZyb20gYmFja2VuZCB3YXMgcmVjZWl2ZWQgdGhlIHJlc3BvbnNlIGlzIGlnbm9yZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdGhlIHBhcmVudCBub2RlLCBub3IgdGhlIGNoaWxkIG5vZGVzIGFyZSByZWxvYWRlZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVsb2FkQ3VycmVudENhc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fY3VycmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnTm8gVHJlZSBDYXNlIE5vZGUgc2VsZWN0ZWQsIG5vdGhpbmcgdG8gcmVsb2FkJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JlbG9hZGVkQ2FzZUlkICYmIHRoaXMuX2N1cnJlbnROb2RlLmNhc2Uuc3RyaW5nSWQgIT09IHRoaXMuX3JlbG9hZGVkQ2FzZUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ1JlbG9hZCBvZiB0aGUgY3VycmVudCBjYXNlIGFscmVhZHkgaW4gcHJvZ3Jlc3MnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZWxvYWRlZENhc2VJZCA9IHRoaXMuX2N1cnJlbnROb2RlLmNhc2Uuc3RyaW5nSWQ7XG4gICAgICAgIHRoaXMuX2Nhc2VSZXNvdXJjZVNlcnZpY2UuZ2V0T25lQ2FzZSh0aGlzLl9jdXJyZW50Q2FzZS5zdHJpbmdJZCkuc3Vic2NyaWJlKHJlbG9hZGVkQ3VycmVudENhc2UgPT4ge1xuICAgICAgICAgICAgaWYgKCFyZWxvYWRlZEN1cnJlbnRDYXNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdDdXJyZW50IENhc2UgVHJlZSBOb2RlIGNvdWxkIG5vdCBiZSByZWxvYWRlZC4gSW52YWxpZCBzZXJ2ZXIgcmVzcG9uc2UnLCByZWxvYWRlZEN1cnJlbnRDYXNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudE5vZGUgJiYgcmVsb2FkZWRDdXJyZW50Q2FzZS5zdHJpbmdJZCA9PT0gdGhpcy5fY3VycmVudE5vZGUuY2FzZS5zdHJpbmdJZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbG9hZGVkQ2FzZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZSA9IHRoaXMuZGV0ZXJtaW5lQ2FzZVVwZGF0ZSh0aGlzLl9jdXJyZW50Q2FzZSwgcmVsb2FkZWRDdXJyZW50Q2FzZSk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jdXJyZW50Q2FzZSwgcmVsb2FkZWRDdXJyZW50Q2FzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJlZUNhc2VWaWV3U2VydmljZS5sb2FkVGFzayQubmV4dCh0aGlzLl9jdXJyZW50Q2FzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZS52aXNpYmxlVHJlZVByb3BlcnRpZXNDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRyZWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZS5jaGlsZHJlbkNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudE5vZGUuZGlydHlDaGlsZHJlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kTm9kZSh0aGlzLl9jdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnQ3VycmVudCBDYXNlIFRyZWUgTm9kZSByZWxvYWRlZCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ0Rpc2NhcmRpbmcgY2FzZSByZWxvYWQgcmVzcG9uc2UsIHNpbmNlIHRoZSBjdXJyZW50IG5vZGUgaGFzIGNoYW5nZWQgYmVmb3JlIGl0cyBjYXNlIHdhcyByZWNlaXZlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ0N1cnJlbnQgQ2FzZSBUcmVlIE5vZGUgcmVsb2FkIHJlcXVlc3QgZmFpbGVkJywgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIGFubnkgb2YgdGhlIGNhc2UgYXR0cmlidXRlcyB0aGF0IGFyZSB2aXNpYmxlIG9uIHRoZSB0cmVlIGNoYW5nZWQuXG4gICAgICogQHBhcmFtIG9sZENhc2UgdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIENhc2Ugb2JqZWN0LCB0aGF0IGlzIGN1cnJlbnRseSBkaXNwbGF5ZWQgb24gdGhlIHRyZWVcbiAgICAgKiBAcGFyYW0gbmV3Q2FzZSB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIENhc2Ugb2JqZWN0LCB0aGF0IHNob3VsZCByZXBsYWNlIHRoZSBvbGQgb25lXG4gICAgICovXG4gICAgcHJpdmF0ZSBkZXRlcm1pbmVDYXNlVXBkYXRlKG9sZENhc2U6IENhc2UsIG5ld0Nhc2U6IENhc2UpOiBDYXNlVXBkYXRlUmVzdWx0IHtcbiAgICAgICAgY29uc3QgdmlzaWJsZUF0dHJpYnV0ZXMgPSBbXG4gICAgICAgICAgICBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0FOX0FERF9DSElMRFJFTixcbiAgICAgICAgICAgIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DQU5fUkVNT1ZFX05PREUsXG4gICAgICAgICAgICBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQkVGT1JFX1RFWFRfSUNPTixcbiAgICAgICAgICAgIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5UUkVFX0FERF9JQ09OXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgcmVzdWx0OiBDYXNlVXBkYXRlUmVzdWx0ID0ge1xuICAgICAgICAgICAgdmlzaWJsZVRyZWVQcm9wZXJ0aWVzQ2hhbmdlZDogdHJ1ZSwgLy8gZm9yIHNob3J0LWNpcmN1aXRpbmcgdGhlIGV2YWx1YXRpb24sIGlmIG5vZGVzIGNoaWxkcmVuIGNoYW5nZWRcbiAgICAgICAgICAgIGNoaWxkcmVuQ2hhbmdlZDogZmFsc2VcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBvbGRDaGlsZENhc2VSZWYgPSBnZXRJbW1lZGlhdGVEYXRhKG9sZENhc2UsIFRyZWVQZXRyaWZsb3dJZGVudGlmaWVycy5DSElMRFJFTl9DQVNFX1JFRik7XG4gICAgICAgIGlmIChvbGRDaGlsZENhc2VSZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3Qgb2xkQ2hpbGRyZW4gPSBuZXcgU2V0KG9sZENoaWxkQ2FzZVJlZi52YWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBuZXdDaGlsZHJlbiA9IG5ldyBTZXQoZ2V0SW1tZWRpYXRlRGF0YShuZXdDYXNlLCBUcmVlUGV0cmlmbG93SWRlbnRpZmllcnMuQ0hJTERSRU5fQ0FTRV9SRUYpLnZhbHVlKTtcblxuICAgICAgICAgICAgcmVzdWx0LmNoaWxkcmVuQ2hhbmdlZCA9IG9sZENoaWxkcmVuLnNpemUgIT09IG5ld0NoaWxkcmVuLnNpemU7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5jaGlsZHJlbkNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuY2hpbGRyZW5DaGFuZ2VkID0gQXJyYXkuZnJvbShvbGRDaGlsZHJlbikuc29tZShjaGlsZElkID0+ICFuZXdDaGlsZHJlbi5oYXMoY2hpbGRJZCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzaG9ydC1jaXJjdWl0XG4gICAgICAgICAgICBpZiAocmVzdWx0LmNoaWxkcmVuQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQudmlzaWJsZVRyZWVQcm9wZXJ0aWVzQ2hhbmdlZCA9IHZpc2libGVBdHRyaWJ1dGVzLnNvbWUoYXR0cmlidXRlID0+IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRJbW1lZGlhdGVEYXRhKG9sZENhc2UsIGF0dHJpYnV0ZSlcbiAgICAgICAgICAgICAgICAmJiBnZXRJbW1lZGlhdGVEYXRhKG9sZENhc2UsIGF0dHJpYnV0ZSkudmFsdWUgIT09IGdldEltbWVkaWF0ZURhdGEobmV3Q2FzZSwgYXR0cmlidXRlKS52YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1jYXNlLXZpZXctY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BuZXRncmlmL2NvbXBvbmVudHMtY29yZS8iLCJzb3VyY2VzIjpbImxpYi92aWV3L3RyZWUtY2FzZS12aWV3L3RyZWUtY29tcG9uZW50L21vZGVsL3RyZWUtY2FzZS12aWV3LWNvbmZpZ3VyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29udGFpbnMgY29uZmlndXJhdGlvbiBvZiB0aGUgdHJlZSBjYXNlIHZpZXcgc2VydmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVDYXNlVmlld0NvbmZpZ3VyYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBwYWdlIHNpemUgb2YgcmVxdWVzdHMgZm9yIGxvYWRpbmcgbm9kZSBjaGlsZHJlblxuICAgICAqL1xuICAgIHBhZ2VTaXplOiBudW1iZXI7XG59XG4iXX0=
|
package/esm2015/lib/view/tree-case-view/tree-component/model/tree-configuration-injection-token.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
export const NAE_TREE_CASE_VIEW_CONFIGURATION = new InjectionToken('NaeTreeCaseViewConfiguration');
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1jb25maWd1cmF0aW9uLWluamVjdGlvbi10b2tlbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BuZXRncmlmL2NvbXBvbmVudHMtY29yZS8iLCJzb3VyY2VzIjpbImxpYi92aWV3L3RyZWUtY2FzZS12aWV3L3RyZWUtY29tcG9uZW50L21vZGVsL3RyZWUtY29uZmlndXJhdGlvbi1pbmplY3Rpb24tdG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUk3QyxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFJLGNBQWMsQ0FBNEIsOEJBQThCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0aW9uVG9rZW59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtUcmVlQ2FzZVZpZXdDb25maWd1cmF0aW9ufSBmcm9tICcuL3RyZWUtY2FzZS12aWV3LWNvbmZpZ3VyYXRpb24nO1xuXG5cbmV4cG9ydCBjb25zdCBOQUVfVFJFRV9DQVNFX1ZJRVdfQ09ORklHVVJBVElPTiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxUcmVlQ2FzZVZpZXdDb25maWd1cmF0aW9uPignTmFlVHJlZUNhc2VWaWV3Q29uZmlndXJhdGlvbicpO1xuIl19
|