gamma-app-controller 1.1.26 → 1.1.28

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.
Files changed (135) hide show
  1. package/esm2020/lib/application-controller/application-controller.module.mjs +20 -20
  2. package/esm2020/lib/application-controller/application-dataset-component/application-dataset/application-dataset.component.mjs +1 -1
  3. package/esm2020/lib/application-controller/application-dataset-component/create-dataset/create-dataset.component.mjs +1 -1
  4. package/esm2020/lib/application-controller/application-filter/application-filter.component.mjs +1 -1
  5. package/esm2020/lib/application-controller/application-menu-controller/application-menus/application-menus.component.mjs +1 -1
  6. package/esm2020/lib/application-controller/application-metric-config/all-metrics-config/all-metrics-config.component.mjs +1 -1
  7. package/esm2020/lib/application-controller/application-metric-config/create-metrics/create-metrics.component.mjs +1 -1
  8. package/esm2020/lib/application-controller/application-view-components/application-views/application-views.component.mjs +1 -1
  9. package/esm2020/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.mjs +1 -1
  10. package/esm2020/lib/application-controller/page-controller/page-config/page-config.component.mjs +11 -11
  11. package/esm2020/lib/application-controller/page-controller/page-config-multi-layout/page-config-multi-layout.component.mjs +10 -10
  12. package/esm2020/lib/application-controller/page-controller/page-controller/page-controller.component.mjs +1 -1
  13. package/esm2020/lib/application-controller/support-components/dash-chart/dash-chart.component.mjs +1 -1
  14. package/esm2020/lib/application-controller/support-components/dash-table/dash-table.component.mjs +1 -1
  15. package/esm2020/lib/application-controller/support-components/dash-today-previous/dash-today-previous.component.mjs +1 -1
  16. package/esm2020/lib/application-controller/support-components/geo-map/geo-map.component.mjs +2 -2
  17. package/esm2020/lib/application-controller/support-components/heat-map/heat-map.component.mjs +1 -1
  18. package/esm2020/lib/application-controller/support-components/single-card/single-card.component.mjs +1 -1
  19. package/esm2020/lib/application-controller/support-components/table-with-bar/table-with-bar.component.mjs +2 -2
  20. package/esm2020/lib/shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.mjs +116 -0
  21. package/esm2020/lib/shared/advanced-component/app-advance-header/app-header.component.mjs +306 -0
  22. package/esm2020/lib/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.mjs +80 -0
  23. package/esm2020/lib/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.mjs +379 -0
  24. package/esm2020/lib/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.mjs +188 -0
  25. package/esm2020/lib/shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component.mjs +435 -0
  26. package/esm2020/lib/shared/advanced-component/gamma-heatmap/gamma-heatmap.component.mjs +334 -0
  27. package/esm2020/lib/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.mjs +155 -0
  28. package/esm2020/lib/shared/advanced-component/gamma-table-with-percentage/contentSafeHtml.mjs +20 -0
  29. package/esm2020/lib/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.mjs +187 -0
  30. package/esm2020/lib/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.mjs +86 -0
  31. package/esm2020/lib/shared/advanced-component/google-geo-map/google-geo-map.component.mjs +439 -0
  32. package/esm2020/lib/shared/app-title/app-title.component.mjs +67 -0
  33. package/esm2020/lib/shared/gamam-widget/gamam-widget.component.mjs +35 -0
  34. package/esm2020/lib/shared/gamma-advance-filter/gamma-advance-filter.component.mjs +273 -0
  35. package/esm2020/lib/shared/gamma-bread-crumbs/bread-crumbs.component.mjs +142 -0
  36. package/esm2020/lib/shared/kpi-comon-service.mjs +537 -0
  37. package/esm2020/lib/{application-controller/shared → shared}/loader/loader.component.mjs +1 -1
  38. package/esm2020/lib/{application-controller/shared → shared}/loading/loading.component.mjs +1 -1
  39. package/esm2020/lib/shared/loading/loadingModule.mjs +28 -0
  40. package/esm2020/lib/shared/safeHtmlPipe.mjs +20 -0
  41. package/esm2020/lib/template-module/KpiCreationModule/create-kpi-tree.component.mjs +1 -1
  42. package/esm2020/lib/template-module/KpiCreationModule/kpiCreation.module.mjs +2 -2
  43. package/esm2020/lib/template-module/bookmarked-template/bookmarked-dataset-call.service.mjs +364 -0
  44. package/esm2020/lib/template-module/bookmarked-template/bookmarked-layout.service.mjs +121 -0
  45. package/esm2020/lib/template-module/bookmarked-template/bookmarked-template.component.mjs +816 -0
  46. package/esm2020/lib/template-module/bookmarked-template/bookmarkedTemplate.module.mjs +151 -0
  47. package/esm2020/lib/template-module/cdrConfigModule/cdr-config.component.mjs +1 -1
  48. package/esm2020/lib/template-module/cdrConfigModule/cdrConfig.module.mjs +2 -2
  49. package/esm2020/lib/template-module/defaulLandingComponent/defaultLandingComponent.module.mjs +151 -0
  50. package/esm2020/lib/template-module/defaulLandingComponent/landing-component.component.mjs +870 -0
  51. package/esm2020/lib/template-module/defaulLandingComponent/landing-component.service.mjs +121 -0
  52. package/esm2020/lib/template-module/defaulLandingComponent/landing-dataset-call.service.mjs +364 -0
  53. package/esm2020/lib/template-module/exceptionConfigModule/exception-operation.component.mjs +1 -1
  54. package/esm2020/lib/template-module/exceptionConfigModule/exceptionConfig.module.mjs +2 -2
  55. package/esm2020/lib/template-module/kpiWithMultiLayout/dynamin-modal-multi.component.mjs +180 -0
  56. package/esm2020/lib/template-module/kpiWithMultiLayout/kpi-multi-layout.service.mjs +121 -0
  57. package/esm2020/lib/template-module/kpiWithMultiLayout/kpi-with-multilayout.component.mjs +992 -0
  58. package/esm2020/lib/template-module/kpiWithMultiLayout/kpiWithMultiayout.module.mjs +156 -0
  59. package/esm2020/lib/template-module/kpiWithMultiLayout/single-layout-dataset-call.service.mjs +364 -0
  60. package/esm2020/lib/template-module/kpiWithSingleLayout/dynamin-modal.component.mjs +180 -0
  61. package/esm2020/lib/template-module/kpiWithSingleLayout/kpi-single-layout.service.mjs +121 -0
  62. package/esm2020/lib/template-module/kpiWithSingleLayout/kpi-with-dataset.component.mjs +1046 -0
  63. package/esm2020/lib/template-module/kpiWithSingleLayout/kpiWithSingleLayout.module.mjs +156 -0
  64. package/esm2020/lib/template-module/kpiWithSingleLayout/multi-layout-dataset-call.service.mjs +364 -0
  65. package/esm2020/public-api.mjs +38 -20
  66. package/fesm2015/gamma-app-controller.mjs +7025 -399
  67. package/fesm2015/gamma-app-controller.mjs.map +1 -1
  68. package/fesm2020/gamma-app-controller.mjs +6970 -399
  69. package/fesm2020/gamma-app-controller.mjs.map +1 -1
  70. package/lib/application-controller/application-controller.module.d.ts +19 -19
  71. package/lib/application-controller/page-controller/page-config/page-config.component.d.ts +9 -9
  72. package/lib/application-controller/page-controller/page-config-multi-layout/page-config-multi-layout.component.d.ts +8 -8
  73. package/lib/{application-controller/shared → shared}/advanced-component/app-advance-header/app-header.component.d.ts +18 -2
  74. package/lib/{application-controller/shared → shared}/advanced-component/gamm-single-number-card/gamm-single-number-card.component.d.ts +3 -5
  75. package/lib/{application-controller/shared → shared}/advanced-component/gamma-advance-chart/gamma-advance-chart.component.d.ts +3 -1
  76. package/lib/{application-controller/shared → shared}/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.d.ts +4 -2
  77. package/lib/{application-controller/shared → shared}/advanced-component/gamma-geo-chart/gamma-geo-chart.component.d.ts +1 -1
  78. package/lib/{application-controller/shared → shared}/advanced-component/gamma-heatmap/gamma-heatmap.component.d.ts +1 -1
  79. package/lib/{application-controller/shared → shared}/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.d.ts +1 -1
  80. package/lib/{application-controller/shared → shared}/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.d.ts +6 -2
  81. package/lib/{application-controller/shared → shared}/advanced-component/gamma-today-previous/gamma-today-previous.component.d.ts +1 -1
  82. package/lib/{application-controller/shared → shared}/advanced-component/google-geo-map/google-geo-map.component.d.ts +1 -1
  83. package/lib/{application-controller/shared → shared}/app-title/app-title.component.d.ts +1 -1
  84. package/lib/{application-controller/shared → shared}/gamam-widget/gamam-widget.component.d.ts +1 -1
  85. package/lib/{application-controller/shared → shared}/gamma-advance-filter/gamma-advance-filter.component.d.ts +3 -2
  86. package/lib/{application-controller/shared → shared}/gamma-bread-crumbs/bread-crumbs.component.d.ts +1 -1
  87. package/lib/{application-controller/shared → shared}/kpi-comon-service.d.ts +1 -1
  88. package/lib/template-module/KpiCreationModule/kpiCreation.module.d.ts +1 -1
  89. package/lib/template-module/bookmarked-template/bookmarked-dataset-call.service.d.ts +24 -0
  90. package/lib/template-module/bookmarked-template/bookmarked-layout.service.d.ts +33 -0
  91. package/lib/template-module/bookmarked-template/bookmarked-template.component.d.ts +109 -0
  92. package/lib/template-module/bookmarked-template/bookmarkedTemplate.module.d.ts +16 -0
  93. package/lib/template-module/cdrConfigModule/cdrConfig.module.d.ts +1 -1
  94. package/lib/template-module/defaulLandingComponent/defaultLandingComponent.module.d.ts +16 -0
  95. package/lib/template-module/defaulLandingComponent/landing-component.component.d.ts +109 -0
  96. package/lib/template-module/defaulLandingComponent/landing-component.service.d.ts +33 -0
  97. package/lib/template-module/defaulLandingComponent/landing-dataset-call.service.d.ts +24 -0
  98. package/lib/template-module/exceptionConfigModule/exceptionConfig.module.d.ts +1 -1
  99. package/lib/template-module/kpiWithMultiLayout/dynamin-modal-multi.component.d.ts +42 -0
  100. package/lib/template-module/kpiWithMultiLayout/kpi-multi-layout.service.d.ts +33 -0
  101. package/lib/template-module/kpiWithMultiLayout/kpi-with-multilayout.component.d.ts +117 -0
  102. package/lib/template-module/kpiWithMultiLayout/kpiWithMultiayout.module.d.ts +17 -0
  103. package/lib/template-module/kpiWithMultiLayout/single-layout-dataset-call.service.d.ts +24 -0
  104. package/lib/template-module/kpiWithSingleLayout/dynamin-modal.component.d.ts +42 -0
  105. package/lib/template-module/kpiWithSingleLayout/kpi-single-layout.service.d.ts +33 -0
  106. package/lib/template-module/kpiWithSingleLayout/kpi-with-dataset.component.d.ts +122 -0
  107. package/lib/template-module/kpiWithSingleLayout/kpiWithSingleLayout.module.d.ts +17 -0
  108. package/lib/template-module/kpiWithSingleLayout/multi-layout-dataset-call.service.d.ts +24 -0
  109. package/package.json +1 -1
  110. package/public-api.d.ts +37 -19
  111. package/esm2020/lib/application-controller/shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.mjs +0 -124
  112. package/esm2020/lib/application-controller/shared/advanced-component/app-advance-header/app-header.component.mjs +0 -220
  113. package/esm2020/lib/application-controller/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.mjs +0 -95
  114. package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.mjs +0 -362
  115. package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.mjs +0 -177
  116. package/esm2020/lib/application-controller/shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component.mjs +0 -441
  117. package/esm2020/lib/application-controller/shared/advanced-component/gamma-heatmap/gamma-heatmap.component.mjs +0 -328
  118. package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.mjs +0 -155
  119. package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/contentSafeHtml.mjs +0 -20
  120. package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.mjs +0 -157
  121. package/esm2020/lib/application-controller/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.mjs +0 -85
  122. package/esm2020/lib/application-controller/shared/advanced-component/google-geo-map/google-geo-map.component.mjs +0 -439
  123. package/esm2020/lib/application-controller/shared/app-title/app-title.component.mjs +0 -67
  124. package/esm2020/lib/application-controller/shared/gamam-widget/gamam-widget.component.mjs +0 -35
  125. package/esm2020/lib/application-controller/shared/gamma-advance-filter/gamma-advance-filter.component.mjs +0 -237
  126. package/esm2020/lib/application-controller/shared/gamma-bread-crumbs/bread-crumbs.component.mjs +0 -142
  127. package/esm2020/lib/application-controller/shared/kpi-comon-service.mjs +0 -537
  128. package/esm2020/lib/application-controller/shared/loading/loadingModule.mjs +0 -28
  129. package/esm2020/lib/application-controller/shared/safeHtmlPipe.mjs +0 -20
  130. /package/lib/{application-controller/shared → shared}/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.d.ts +0 -0
  131. /package/lib/{application-controller/shared → shared}/advanced-component/gamma-table-with-percentage/contentSafeHtml.d.ts +0 -0
  132. /package/lib/{application-controller/shared → shared}/loader/loader.component.d.ts +0 -0
  133. /package/lib/{application-controller/shared → shared}/loading/loading.component.d.ts +0 -0
  134. /package/lib/{application-controller/shared → shared}/loading/loadingModule.d.ts +0 -0
  135. /package/lib/{application-controller/shared → shared}/safeHtmlPipe.d.ts +0 -0
@@ -0,0 +1,816 @@
1
+ import { Component, ViewChild, ViewContainerRef } from '@angular/core';
2
+ import moment from '../../application-controller/moment-helper';
3
+ import { GammaAdvanceChartComponent } from '../../shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component';
4
+ import { GammaTodayPreviousComponent } from '../../shared/advanced-component/gamma-today-previous/gamma-today-previous.component';
5
+ import { AppAdvanceHeaderComponent } from '../../shared/advanced-component/app-advance-header/app-header.component';
6
+ import { GammaTableWithPercentageComponent } from '../../shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component';
7
+ import { GammSingleNumberCardComponent } from '../../shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component';
8
+ import { GammaAdvanceOperatorTableComponent } from '../../shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component';
9
+ import { AdvanceWidgetHeaderFilterComponent } from '../../shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component';
10
+ import { forkJoin } from 'rxjs';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "../../application-controller/common";
13
+ import * as i2 from "@angular/router";
14
+ import * as i3 from "./bookmarked-layout.service";
15
+ import * as i4 from "ngx-toastr";
16
+ import * as i5 from "./bookmarked-dataset-call.service";
17
+ import * as i6 from "@angular/common";
18
+ import * as i7 from "../../shared/loading/loading.component";
19
+ export class BookmarkedTemplateComponent {
20
+ constructor(commonService, activatedRoute, viewContainerRef, componentFactoryResolver, service, toastr, router, datasetService) {
21
+ this.commonService = commonService;
22
+ this.activatedRoute = activatedRoute;
23
+ this.viewContainerRef = viewContainerRef;
24
+ this.componentFactoryResolver = componentFactoryResolver;
25
+ this.service = service;
26
+ this.toastr = toastr;
27
+ this.router = router;
28
+ this.datasetService = datasetService;
29
+ this.dashbord_container = [];
30
+ this.widget_width = ['w-full', 'w-1/2', 'w-1/3', 'w-1/4', 'w-1/5', 'w-1/6'];
31
+ this.page_title = 'Dashboard';
32
+ this.dynamicComponentRefs = [];
33
+ this.componentClassMap = {
34
+ GammaAdvanceChartComponent,
35
+ GammaTodayPreviousComponent,
36
+ AppAdvanceHeaderComponent,
37
+ GammaTableWithPercentageComponent,
38
+ GammSingleNumberCardComponent,
39
+ GammaAdvanceOperatorTableComponent,
40
+ AdvanceWidgetHeaderFilterComponent
41
+ };
42
+ this.dataSourceMataData = [];
43
+ this.queryType = "mongo";
44
+ this.dataSetModal = [];
45
+ this.componentConfigDataSource = [];
46
+ this.dataSourceModal = {};
47
+ this.isDashBoardContent = false;
48
+ this.selectedViewFormComponent = {};
49
+ this.addedwidGetConfig = {
50
+ "display": true,
51
+ "widgetTitle": "",
52
+ "width": "",
53
+ "height": ""
54
+ };
55
+ this.dashBoardWidgetConfig = [];
56
+ this.selectedIndexObjForChart = {};
57
+ this.selectedContainerObjectForChart = {};
58
+ this.uniqueDataSetObject = {};
59
+ this.isDashBoardContentTypeView = true;
60
+ this.allWidgetByDataset = [];
61
+ this.stateDataSource = new Map();
62
+ this.contextMenuDataSource = [];
63
+ this.havingDataObject = {};
64
+ this.globalDefaultFilter = {};
65
+ this.kpi_breadcrumbs_container = [];
66
+ }
67
+ ngOnInit() {
68
+ this.loadingModal = true;
69
+ this.pageId = this.activatedRoute.snapshot.data['pageId'];
70
+ this.getPadeDataSource(false);
71
+ }
72
+ async getFiltersForTemplate(filter) {
73
+ this.filters = filter;
74
+ this.defaultStartDate = filter.startDate;
75
+ this.defaultEndDate = filter.endDate;
76
+ filter.operationFilter['startDate'] = filter.startDate;
77
+ filter.operationFilter['endDate'] = filter.endDate;
78
+ this.loadingModal = true;
79
+ this.dashBoardWidgetConfig = [];
80
+ await this.getPadeDataSource(true);
81
+ this.uniqueDataSetObject = {};
82
+ let apiCalls = [];
83
+ this.allWidgetByDataset.forEach(view => {
84
+ view.datasetIds.forEach(id => {
85
+ let found = this.dataSetModal.find(d => d.datasetId === id);
86
+ if (found) {
87
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, id, filter));
88
+ }
89
+ });
90
+ });
91
+ Promise.all(apiCalls).then(() => {
92
+ this.globalDefaultFilter = filter;
93
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
94
+ this.createDivElements(this.uniqueDataSetObject, true);
95
+ this.loadingModal = false;
96
+ });
97
+ }
98
+ getPadeDataSource(context) {
99
+ return new Promise((resolve, reject) => {
100
+ this.service.getAppPageDetailConfig(this.pageId).subscribe({
101
+ next: (data) => {
102
+ this.pageTitle = data.pageName;
103
+ this.dashBoardWidgetConfig = data;
104
+ if (!context) {
105
+ this.defaultStartDate = moment().subtract('30', 'days').format('YYYY-MM-DD');
106
+ this.defaultEndDate = moment().subtract('1', 'days').format('YYYY-MM-DD');
107
+ this.createDivElements(this.uniqueDataSetObject, false);
108
+ this.getComponentConfigSet();
109
+ this.loadingModal = false;
110
+ }
111
+ resolve();
112
+ },
113
+ error: (err) => {
114
+ this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Error');
115
+ reject(err);
116
+ }
117
+ });
118
+ });
119
+ }
120
+ getComponentConfigSet() {
121
+ let dataset = this.service.getAppDatasetConfigs();
122
+ let viewComponent = this.service.getAppViewConfigs();
123
+ forkJoin({
124
+ datasetConfig: dataset,
125
+ viewConfig: viewComponent
126
+ }).subscribe({
127
+ next: (({ datasetConfig, viewConfig }) => {
128
+ this.componentConfigDataSource = viewConfig;
129
+ this.dataSetModal = datasetConfig;
130
+ this.allWidgetByDataset = [];
131
+ this.dashBoardWidgetConfig.widgets.forEach(widget => {
132
+ let defaultFilters = { operationFilter: { startDate: "", endDate: "" } };
133
+ widget.filters.filterItems.forEach(element => {
134
+ if (element.filterType === 'date' || element.filterType === 'datetime') {
135
+ if (element.defaultFilterType === "dynamic" && element.momentFunction !== "" && element.defaultFilterValue !== "" && element.momentFormat !== "") {
136
+ let [count, unit] = element.defaultFilterValue.split(',');
137
+ if (element.apiName === "endDate") {
138
+ if (element.display) {
139
+ defaultFilters.operationFilter.endDate = moment()[element.momentFunction](parseInt(count), unit).format(element.momentFormat);
140
+ this.defaultEndDate = moment()[element.momentFunction](parseInt(count), unit).format(element.momentFormat);
141
+ }
142
+ }
143
+ if (element.apiName === "startDate") {
144
+ defaultFilters.operationFilter.startDate = moment()[element.momentFunction](parseInt(count), unit).format(element.momentFormat);
145
+ }
146
+ }
147
+ }
148
+ else {
149
+ if ((typeof element.filterDataSourceValue === "string" && element.filterDataSourceValue !== "") ||
150
+ (Array.isArray(element.filterDataSourceValue) && element.filterDataSourceValue.length > 0)) {
151
+ if (element.operatorName !== "") {
152
+ defaultFilters.operationFilter[element.operatorName] = Array.isArray(element.filterDataSourceValue)
153
+ ? element.filterDataSourceValue
154
+ : [element.filterDataSourceValue];
155
+ }
156
+ else {
157
+ defaultFilters.operationFilter[element.apiName] = element.filterDataSourceValue.join(",");
158
+ }
159
+ }
160
+ }
161
+ });
162
+ let urlParams = defaultFilters.operationFilter;
163
+ urlParams['pageId'] = this.pageId;
164
+ let navigation = {
165
+ queryParams: urlParams,
166
+ queryParamsHandling: "merge"
167
+ };
168
+ this.router.navigate([], navigation);
169
+ let datasetIds = new Set();
170
+ let viewIds = new Set();
171
+ widget.widgetNode.forEach(node => {
172
+ if (node.nodeProperties.display) {
173
+ node.compConfig.viewConfig.forEach(view => {
174
+ datasetIds.add(view.datasetId);
175
+ viewIds.add(view.viewId);
176
+ });
177
+ }
178
+ else {
179
+ node.compConfig.viewConfig.forEach(view => {
180
+ this.contextMenuDataSource.push({ viewId: view.viewId, viewName: node.nodeProperties.widgetTitle, displayKey: view.kpiConfig.keyToPass });
181
+ });
182
+ }
183
+ });
184
+ viewIds.forEach(element => {
185
+ let obj = {
186
+ "filters": JSON.parse(JSON.stringify(defaultFilters)),
187
+ "keyToPass": [],
188
+ "drillDownType": "natural",
189
+ "drilldownFrom": ""
190
+ };
191
+ this.stateDataSource.set(element, obj);
192
+ });
193
+ let obj = {
194
+ widgetId: widget.widgetId,
195
+ pageId: widget.pageId,
196
+ filters: defaultFilters,
197
+ datasetIds: datasetIds
198
+ };
199
+ this.allWidgetByDataset.push(obj);
200
+ });
201
+ console.log(this.stateDataSource);
202
+ this.uniqueDataSetObject = {};
203
+ let apiCalls = [];
204
+ this.allWidgetByDataset.forEach(view => {
205
+ view.datasetIds.forEach(id => {
206
+ let found = datasetConfig.find(d => d.datasetId === id);
207
+ if (found) {
208
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, id, view.filters));
209
+ }
210
+ });
211
+ });
212
+ Promise.all(apiCalls).then(() => {
213
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
214
+ this.createDivElements(this.uniqueDataSetObject, false);
215
+ this.loadingModal = false;
216
+ });
217
+ }), error: (err) => {
218
+ this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Error');
219
+ }
220
+ });
221
+ }
222
+ getDataSet() {
223
+ this.service.getAppDatasetConfigs().subscribe({
224
+ next: (data) => {
225
+ this.dataSettableDataSource = data;
226
+ }, error: (err) => {
227
+ this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Dataset Creation');
228
+ }
229
+ });
230
+ }
231
+ async createDivElements(datasetById, context) {
232
+ const container = this.dynamicContainer.nativeElement;
233
+ container.innerHTML = "";
234
+ this.dashBoardWidgetConfig.widgets.forEach(async (div) => {
235
+ const rowDiv = document.createElement('div');
236
+ let w_height = (div.widgetProperties.height == "") ? "h-auto" : 'h-[' + div.widgetProperties.height + ']';
237
+ rowDiv.classList.add(div.widgetProperties.width, w_height);
238
+ const filterDiv = document.createElement('div');
239
+ this.loadFilterComponent(div, filterDiv, div.filters.filterItems);
240
+ rowDiv.appendChild(filterDiv);
241
+ if (div.widgetNode.length != 0) {
242
+ let mainItemDiv = rowDiv.querySelector('.flex.flex-wrap');
243
+ if (context && mainItemDiv) {
244
+ mainItemDiv.innerHTML = "";
245
+ }
246
+ else {
247
+ mainItemDiv = document.createElement('div');
248
+ mainItemDiv.classList.add("flex", "flex-wrap");
249
+ rowDiv.appendChild(mainItemDiv);
250
+ }
251
+ this.loadWidgetNodes(div, mainItemDiv, datasetById);
252
+ }
253
+ container.appendChild(rowDiv);
254
+ });
255
+ }
256
+ loadWidgetNodes(div, mainItemDiv, datasetById) {
257
+ this.mainPageDivElement = mainItemDiv;
258
+ div.widgetNode.forEach(item => {
259
+ this.loadSingleWidgetNode(item, mainItemDiv, datasetById);
260
+ });
261
+ }
262
+ loadSingleWidgetNode(item, containerElement, datasetById) {
263
+ const elementId = `id-${item.id}`;
264
+ const existingElement = document.querySelector(`#${elementId}`);
265
+ if (item.nodeProperties.display && !existingElement) {
266
+ const w_height = item.nodeProperties.height === "" ? "h-auto" : `h-[${item.nodeProperties.height}]`;
267
+ const itemDiv = document.createElement('div');
268
+ itemDiv.id = elementId;
269
+ itemDiv.classList.add(item.nodeProperties.width, w_height, 'mb-2');
270
+ const widgetDiv = this.getWidgetTitleDiv(item);
271
+ itemDiv.appendChild(widgetDiv);
272
+ const innerDiv = document.createElement('div');
273
+ innerDiv.classList.add('rounded', 'justify-center', 'items-center', 'border', 'p-1', 'm-1', 'flex', 'flex-row');
274
+ item.compConfig.viewConfig.forEach(element => {
275
+ element.kpiConfig['dataSource'] = datasetById[element.datasetId];
276
+ element.kpiConfig['contextMenu'] = this.contextMenuDataSource;
277
+ element['titleParams'] = item.nodeProperties.widgetParams || "";
278
+ const comp_object = this.findWidgetById(this.dashBoardWidgetConfig.widgets, item.id);
279
+ this.loadDynamicComponent(element, comp_object, itemDiv);
280
+ });
281
+ containerElement.appendChild(itemDiv);
282
+ if (!this.isDashBoardContentTypeView) {
283
+ itemDiv.appendChild(innerDiv);
284
+ }
285
+ }
286
+ else if (existingElement) {
287
+ const itemDiv = existingElement;
288
+ itemDiv.innerHTML = '';
289
+ const widgetDiv = this.getWidgetTitleDiv(item);
290
+ itemDiv.appendChild(widgetDiv);
291
+ item.compConfig.viewConfig.forEach(element => {
292
+ element.kpiConfig['dataSource'] = datasetById[element.datasetId];
293
+ element.kpiConfig['contextMenu'] = this.contextMenuDataSource;
294
+ element['titleParams'] = item.nodeProperties.widgetParams || "";
295
+ const comp_object = this.findWidgetById(this.dashBoardWidgetConfig.widgets, item.id);
296
+ this.loadDynamicComponent(element, comp_object, itemDiv);
297
+ });
298
+ if (!this.isDashBoardContentTypeView) {
299
+ const innerDiv = document.createElement('div');
300
+ innerDiv.classList.add('rounded', 'justify-center', 'items-center', 'border', 'p-1', 'm-1', 'flex', 'flex-row');
301
+ itemDiv.appendChild(innerDiv);
302
+ }
303
+ }
304
+ }
305
+ getWidgetTitleDiv(item) {
306
+ const widgetDiv = document.createElement('div');
307
+ widgetDiv.classList.add('flex', 'items-center', 'justify-between', 'font-bold', 'text-md', 'text-gray-900', 'dark:text-white', 'border-b', 'p-3', 'bg-gray-800', 'mx-2', 'rounded-t-lg');
308
+ const titleDiv = document.createElement('div');
309
+ const params = item.nodeProperties.widgetParams || "";
310
+ titleDiv.innerText = item.nodeProperties.widgetTitle + params;
311
+ widgetDiv.appendChild(titleDiv);
312
+ const searchContainerDiv = document.createElement('div');
313
+ searchContainerDiv.classList.add('flex', 'items-center', 'ml-auto', 'space-x-2', 'justify-end');
314
+ if (item.nodeProperties.isWidgetFilter) {
315
+ const searchButton = document.createElement('button');
316
+ searchButton.innerText = 'Filter';
317
+ searchButton.classList.add('px-3', 'py-1.5', 'bg-blue-600', 'mr-2', 'text-white', 'rounded', 'hover:bg-blue-700');
318
+ this.nodeproperticeFilterDataSource = {};
319
+ this.nodeproperticeFilterDataSource['viewConfig'] = item;
320
+ this.nodeproperticeFilterDataSource['havingConfig'] = [];
321
+ searchButton.addEventListener('click', () => {
322
+ this.isWidgetFilters = true;
323
+ let filtePropertice = [];
324
+ item.compConfig.viewConfig.forEach(element => {
325
+ let key_name = this.uniqueDataSetObject[element.datasetId][0];
326
+ Object.keys(key_name).forEach(key => {
327
+ if (!filtePropertice.includes(key)) {
328
+ filtePropertice.push(key);
329
+ }
330
+ });
331
+ });
332
+ filtePropertice.forEach(element => {
333
+ let obj = {
334
+ columnName: element,
335
+ dataType: "float",
336
+ operator: "",
337
+ value: "",
338
+ };
339
+ this.nodeproperticeFilterDataSource.havingConfig.push(obj);
340
+ });
341
+ });
342
+ searchContainerDiv.appendChild(searchButton);
343
+ }
344
+ if (item.filterId) {
345
+ this.nodeproperticeFilterDataSource = {};
346
+ this.nodeproperticeFilterDataSource['viewConfig'] = item;
347
+ this.nodeproperticeFilterDataSource['havingConfig'] = [];
348
+ this.service.getAppFilterConfig(item.filterId).subscribe({
349
+ next: (data) => {
350
+ const filterDiv = document.createElement('div');
351
+ this.loadWidgetFilterComponent(item, widgetDiv, data.filterItems, item);
352
+ }, error: (err) => {
353
+ }
354
+ });
355
+ }
356
+ if (item.nodeProperties.nodefilters && item.nodeProperties.nodefilters.length !== 0) {
357
+ item.nodeProperties.nodefilters.forEach(filter => {
358
+ const filterDiv = document.createElement('div');
359
+ filterDiv.classList.add('flex', 'items-center');
360
+ if (filter.input_type === 'text') {
361
+ const textBox = document.createElement('input');
362
+ textBox.type = 'text';
363
+ textBox.placeholder = `Enter ${filter.local_column}`;
364
+ textBox.classList.add('px-2', 'py-1.5', 'rounded', 'border', 'mr-1', 'border-gray-500', 'text-gray-900', 'dark:bg-gray-700', 'dark:text-white');
365
+ const searchButton = document.createElement('button');
366
+ searchButton.innerText = 'Search';
367
+ searchButton.classList.add('px-3', 'py-1.5', 'bg-blue-600', 'mr-2', 'text-white', 'rounded', 'hover:bg-blue-700');
368
+ const separerotButton = document.createElement('div');
369
+ separerotButton.innerHTML = '|';
370
+ searchButton.addEventListener('click', () => {
371
+ const searchTerm = textBox.value;
372
+ this.getRearchResultFromInputBox(searchTerm, item, filter);
373
+ });
374
+ filterDiv.appendChild(textBox);
375
+ filterDiv.appendChild(searchButton);
376
+ filterDiv.appendChild(separerotButton);
377
+ }
378
+ searchContainerDiv.appendChild(filterDiv);
379
+ });
380
+ }
381
+ widgetDiv.appendChild(searchContainerDiv);
382
+ return widgetDiv;
383
+ }
384
+ loadDynamicComponent(data, indexObj, containerElement) {
385
+ const componentClass = this.componentClassMap[data.kpiConfig.componentName];
386
+ this.CompRefs = this.viewContainerRef.createComponent(componentClass);
387
+ const dynamicComponentInstance = this.CompRefs.instance;
388
+ dynamicComponentInstance.chartDataSource = data;
389
+ dynamicComponentInstance.kpi_name = "";
390
+ if (data.kpiConfig.componentName == "GammaAdvanceOperatorTableComponent") {
391
+ dynamicComponentInstance.oRowClick.subscribe((value) => {
392
+ this.getRowClick(value);
393
+ });
394
+ dynamicComponentInstance.onrightClickContextSelection.subscribe((value) => {
395
+ this.getContextClick(value);
396
+ });
397
+ }
398
+ const cssClass = "w-full";
399
+ this.CompRefs.location.nativeElement.classList.add(cssClass);
400
+ containerElement.appendChild(this.CompRefs.location.nativeElement);
401
+ }
402
+ loadFilterComponent(indexObj, containerElement, filterItems) {
403
+ let userName = localStorage.getItem('user_name');
404
+ let selectedDates = { startDate: this.defaultStartDate, endDate: this.defaultEndDate };
405
+ const componentClass = this.componentClassMap['AppAdvanceHeaderComponent'];
406
+ this.CompRefs = this.viewContainerRef.createComponent(componentClass);
407
+ const dynamicComponentInstance = this.CompRefs.instance;
408
+ dynamicComponentInstance.selectedDates = selectedDates;
409
+ dynamicComponentInstance.filterItems = filterItems;
410
+ dynamicComponentInstance.pageTitle = this.pageTitle;
411
+ dynamicComponentInstance.bread_crumbs_container = this.kpi_breadcrumbs_container;
412
+ dynamicComponentInstance.isEditButton = (userName && userName == "admin") ? true : false;
413
+ dynamicComponentInstance.isAdvanceButton = true;
414
+ dynamicComponentInstance.getFilterPageConfig.subscribe((value) => {
415
+ this.getFiltersForTemplate(value);
416
+ });
417
+ indexObj.compConfig.dynamicComponentRefs.push(this.CompRefs);
418
+ const cssClass = "w-full";
419
+ this.CompRefs.location.nativeElement.classList.add(cssClass);
420
+ containerElement.appendChild(this.CompRefs.location.nativeElement);
421
+ }
422
+ loadWidgetFilterComponent(indexObj, containerElement, filterItems, viewIds) {
423
+ let userName = localStorage.getItem('user_name');
424
+ let selectedDates = { startDate: this.defaultStartDate, endDate: this.defaultEndDate };
425
+ const componentClass = this.componentClassMap['AdvanceWidgetHeaderFilterComponent'];
426
+ this.CompRefs = this.viewContainerRef.createComponent(componentClass);
427
+ const dynamicComponentInstance = this.CompRefs.instance;
428
+ dynamicComponentInstance.selectedDates = selectedDates;
429
+ dynamicComponentInstance.filterItems = filterItems;
430
+ dynamicComponentInstance.viewIds = viewIds;
431
+ dynamicComponentInstance.getWidgetFilterConfig.subscribe((value) => {
432
+ this.getWidgetFilterForTemplate(value);
433
+ });
434
+ indexObj.compConfig.dynamicComponentRefs.push(this.CompRefs);
435
+ containerElement.appendChild(this.CompRefs.location.nativeElement);
436
+ }
437
+ getContextClick(event) {
438
+ const stateData = Array.from(this.stateDataSource.keys());
439
+ const currentViewIndex = stateData.indexOf(event.viewId);
440
+ const deletedViewIds = [];
441
+ for (let i = currentViewIndex + 1; i < stateData.length; i++) {
442
+ deletedViewIds.push(stateData[i]);
443
+ }
444
+ this.loadingModal = true;
445
+ this.dashBoardWidgetConfig.widgets.forEach(element => {
446
+ element.widgetNode.forEach((node, nodeIndex) => {
447
+ if (this.getElementOfCurrentView(node, event.drilldownTo)) {
448
+ let view = element.widgetNode[nodeIndex];
449
+ let apiCalls = [];
450
+ let appliedFilters = this.getSetOperatorFilter(event, this.stateDataSource.get(event.drilldownFrom));
451
+ view.compConfig.viewConfig.forEach(contentView => {
452
+ let found = this.dataSetModal.find(d => d.datasetId === contentView.datasetId);
453
+ if (found) {
454
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, contentView.datasetId, appliedFilters));
455
+ }
456
+ });
457
+ Promise.all(apiCalls).then(() => {
458
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
459
+ for (let entry of deletedViewIds) {
460
+ element.widgetNode.forEach(viewValue => {
461
+ viewValue.compConfig.viewConfig.forEach(viewId => {
462
+ if (viewId.viewId == entry) {
463
+ const exists = this.contextMenuDataSource.some(item => item.viewId === viewId.viewId);
464
+ if (!exists) {
465
+ this.contextMenuDataSource.push({
466
+ viewId: viewId.viewId,
467
+ viewName: node.nodeProperties.widgetTitle,
468
+ displayKey: viewId.kpiConfig.keyToPass
469
+ });
470
+ }
471
+ this.stateDataSource.delete(entry);
472
+ viewValue.nodeProperties['display'] = false;
473
+ const prefixedId = `id-${viewValue.id}`;
474
+ const elementToHide = document.querySelector(`#${prefixedId}`);
475
+ if (elementToHide) {
476
+ elementToHide.remove();
477
+ }
478
+ }
479
+ });
480
+ });
481
+ }
482
+ this.contextMenuDataSource = this.contextMenuDataSource.filter(e => e.displayKey !== event.keyToPass);
483
+ view.compConfig.viewConfig.forEach(val => {
484
+ let obj = {
485
+ "filters": appliedFilters,
486
+ "keyToPass": this.updateOperatorData(event.keyToPass, event.data),
487
+ "drillDownType": event.drillDownType,
488
+ "drilldownFrom": event.drilldownFrom
489
+ };
490
+ this.stateDataSource.set(val['viewId'], obj);
491
+ });
492
+ view.nodeProperties['display'] = true;
493
+ view.nodeProperties['widgetParams'] = event.tableTitle;
494
+ const prefixedId = `id-${view.id}`;
495
+ const containerElement = document.querySelector(`#${prefixedId}`);
496
+ this.loadSingleWidgetNode(view, this.mainPageDivElement, this.uniqueDataSetObject);
497
+ setTimeout(() => {
498
+ this.scrollToBottom(this.mainPageDivElement);
499
+ }, 200);
500
+ let navigation = {
501
+ queryParams: appliedFilters['operationFilter'],
502
+ queryParamsHandling: "merge"
503
+ };
504
+ this.router.navigate([], navigation);
505
+ });
506
+ }
507
+ else {
508
+ }
509
+ });
510
+ });
511
+ }
512
+ getRowClick(event) {
513
+ const stateData = Array.from(this.stateDataSource.keys());
514
+ const currentViewIndex = stateData.indexOf(event.viewId);
515
+ const deletedViewIds = [];
516
+ for (let i = currentViewIndex + 1; i < stateData.length; i++) {
517
+ deletedViewIds.push(stateData[i]);
518
+ }
519
+ const hourlyNode = this.dashBoardWidgetConfig.widgets
520
+ .map(widget => widget.widgetNode.find(node => this.getHourlyData(node)))
521
+ .find(node => node);
522
+ if (hourlyNode && event.keyToPass.includes("recordDate")) {
523
+ this.getViewByRowCLickForHourlyChart(event, hourlyNode);
524
+ }
525
+ const currentViewNode = this.dashBoardWidgetConfig.widgets
526
+ .map(widget => widget.widgetNode.find(node => this.getElementOfCurrentView(node, event.viewId)))
527
+ .find(node => node);
528
+ if (currentViewNode) {
529
+ const nextViewIndex = stateData.indexOf(event.viewId) + 1;
530
+ const nextView = this.dashBoardWidgetConfig.widgets
531
+ .map(widget => widget.widgetNode[nextViewIndex])
532
+ .find(node => node);
533
+ if (nextView) {
534
+ this.loadingModal = true;
535
+ this.getViewByRowCLick(event, nextView, deletedViewIds, currentViewNode);
536
+ }
537
+ }
538
+ }
539
+ getViewByRowCLickForHourlyChart(event, node) {
540
+ let apiCalls = [];
541
+ const deletedViewIds = [];
542
+ node.compConfig.viewConfig.forEach(item => {
543
+ let appliedFilters = this.getSetOperatorFilter(event, this.stateDataSource.get(item.viewId));
544
+ let found = this.dataSetModal.find(d => d.datasetId === item.datasetId);
545
+ deletedViewIds.push(item.viewId);
546
+ if (found) {
547
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, item.datasetId, appliedFilters));
548
+ }
549
+ });
550
+ Promise.all(apiCalls).then(() => {
551
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
552
+ this.loadSingleWidgetNode(node, this.mainPageDivElement, this.uniqueDataSetObject);
553
+ setTimeout(() => {
554
+ this.scrollToBottom(this.mainPageDivElement);
555
+ }, 200);
556
+ });
557
+ console.log(this.stateDataSource);
558
+ }
559
+ getViewByRowCLick(event, view, deletedViewIds, node) {
560
+ let apiCalls = [];
561
+ let appliedFilters = this.getSetOperatorFilter(event, this.stateDataSource.get(event.viewId));
562
+ view.compConfig.viewConfig.forEach(contentView => {
563
+ let found = this.dataSetModal.find(d => d.datasetId === contentView.datasetId);
564
+ if (found) {
565
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, contentView.datasetId, appliedFilters));
566
+ }
567
+ });
568
+ Promise.all(apiCalls).then(() => {
569
+ this.dashBoardWidgetConfig.widgets.forEach(element => {
570
+ for (let entry of deletedViewIds) {
571
+ element.widgetNode.forEach(viewValue => {
572
+ viewValue.compConfig.viewConfig.forEach(viewId => {
573
+ if (viewId.viewId == entry) {
574
+ const exists = this.contextMenuDataSource.some(item => item.viewId === viewId.viewId);
575
+ if (!exists) {
576
+ this.contextMenuDataSource.push({
577
+ viewId: viewId.viewId,
578
+ viewName: node.nodeProperties.widgetTitle,
579
+ displayKey: viewId.kpiConfig.keyToPass
580
+ });
581
+ }
582
+ this.stateDataSource.delete(entry);
583
+ viewValue.nodeProperties['display'] = false;
584
+ const prefixedId = `id-${viewValue.id}`;
585
+ const elementToHide = document.querySelector(`#${prefixedId}`);
586
+ if (elementToHide) {
587
+ elementToHide.remove();
588
+ }
589
+ }
590
+ });
591
+ });
592
+ }
593
+ });
594
+ for (let entry of deletedViewIds) {
595
+ view.compConfig.viewConfig.forEach(viewId => {
596
+ if (viewId.viewId == entry) {
597
+ const exists = this.contextMenuDataSource.some(item => item.viewId === viewId.viewId);
598
+ if (!exists) {
599
+ this.contextMenuDataSource.push({
600
+ viewId: viewId.viewId,
601
+ viewName: view.nodeProperties.widgetTitle,
602
+ displayKey: viewId.kpiConfig.keyToPass
603
+ });
604
+ }
605
+ this.stateDataSource.delete(entry);
606
+ view.nodeProperties['display'] = false;
607
+ const prefixedId = `id-${view.id}`;
608
+ const elementToHide = document.querySelector(`#${prefixedId}`);
609
+ if (elementToHide) {
610
+ elementToHide.remove();
611
+ }
612
+ }
613
+ });
614
+ }
615
+ this.contextMenuDataSource = this.contextMenuDataSource.filter(e => e.displayKey !== event.keyToPass);
616
+ view.compConfig.viewConfig.forEach(viewforDataSet => {
617
+ let obj = {
618
+ "filters": appliedFilters,
619
+ "keyToPass": this.updateOperatorData(event.keyToPass, event.data),
620
+ "drillDownType": event.drillDownType,
621
+ "drilldownFrom": event.drilldownFrom
622
+ };
623
+ this.stateDataSource.set(viewforDataSet['viewId'], obj);
624
+ });
625
+ view.nodeProperties['display'] = true;
626
+ view.nodeProperties['widgetParams'] = event.tableTitle;
627
+ const prefixedId = `id-${view.id}`;
628
+ const containerElement = document.querySelector(`#${prefixedId}`);
629
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
630
+ this.loadSingleWidgetNode(view, this.mainPageDivElement, this.uniqueDataSetObject);
631
+ setTimeout(() => {
632
+ this.scrollToBottom(this.mainPageDivElement);
633
+ }, 200);
634
+ let navigation = {
635
+ queryParams: appliedFilters['operationFilter'],
636
+ queryParamsHandling: "merge"
637
+ };
638
+ this.router.navigate([], navigation);
639
+ });
640
+ console.log(this.stateDataSource);
641
+ }
642
+ scrollToBottom(container) {
643
+ setTimeout(() => {
644
+ container.scrollIntoView({ block: 'end' });
645
+ this.loadingModal = false;
646
+ }, 0);
647
+ }
648
+ findWidgetById(configs, id) {
649
+ for (const config of configs) {
650
+ if (config.id === id) {
651
+ return config;
652
+ }
653
+ if (config.widgetNode && config.widgetNode.length > 0) {
654
+ const found = this.findWidgetById(config.widgetNode, id);
655
+ if (found) {
656
+ return found;
657
+ }
658
+ }
659
+ }
660
+ return undefined;
661
+ }
662
+ updateOperatorData(key_name, value_data) {
663
+ let operator = [];
664
+ for (const key of key_name) {
665
+ let obj = {};
666
+ obj[key] = value_data[key];
667
+ operator.push(obj);
668
+ }
669
+ return operator;
670
+ }
671
+ getElementOfCurrentView(node, viewId) {
672
+ const matchedObject = node.compConfig.viewConfig.find(object => object.viewId === viewId);
673
+ return matchedObject ? node : null;
674
+ }
675
+ getHourlyData(node) {
676
+ const matchedObject = node.compConfig.viewConfig.find(object => object.kpiConfig.formate === 'hourly');
677
+ return matchedObject ? node : null;
678
+ }
679
+ getSetOperatorFilter(objectData, previousViewStates) {
680
+ const { data, keyToPass } = objectData;
681
+ const appliedFilter = JSON.parse(JSON.stringify(previousViewStates.filters.operationFilter));
682
+ keyToPass.forEach(key => {
683
+ if (key in data) {
684
+ if (key === "recordDate" && "startDate" in appliedFilter && "endDate" in appliedFilter) {
685
+ appliedFilter.startDate = data[key];
686
+ appliedFilter.endDate = data[key];
687
+ }
688
+ else {
689
+ appliedFilter[key] = data[key];
690
+ }
691
+ }
692
+ });
693
+ const defaultoperationFilter = this.globalDefaultFilter.operationFilter;
694
+ if (defaultoperationFilter) {
695
+ Object.keys(defaultoperationFilter).forEach(key => {
696
+ if (!appliedFilter.hasOwnProperty(key)) {
697
+ appliedFilter[key] = defaultoperationFilter[key];
698
+ }
699
+ });
700
+ }
701
+ const operationFilter = {};
702
+ operationFilter['operationFilter'] = appliedFilter;
703
+ return operationFilter;
704
+ }
705
+ getRearchResultFromInputBox(inputValue, viewConfig, filterObject) {
706
+ let view = viewConfig;
707
+ let eventNode = { data: {}, keyToPass: [] };
708
+ eventNode.data[filterObject.server_column] = inputValue;
709
+ eventNode['keyToPass'] = [filterObject.server_column];
710
+ let apiCalls = [];
711
+ view.compConfig.viewConfig.forEach(contentView => {
712
+ let appliedFilters = this.getSetOperatorFilter(eventNode, this.stateDataSource.get(contentView.viewId));
713
+ let found = this.dataSetModal.find(d => d.datasetId === contentView.datasetId);
714
+ if (found) {
715
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, contentView.datasetId, appliedFilters));
716
+ }
717
+ });
718
+ viewConfig.nodeProperties['display'] = false;
719
+ const prefixedId = `id-${viewConfig.id}`;
720
+ const elementToHide = document.querySelector(`#${prefixedId}`);
721
+ if (elementToHide) {
722
+ elementToHide.remove();
723
+ }
724
+ Promise.all(apiCalls).then(() => {
725
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
726
+ this.loadingModal = true;
727
+ this.contextMenuDataSource = this.contextMenuDataSource.filter(e => e.displayKey !== viewConfig.keyToPass);
728
+ view.nodeProperties['display'] = true;
729
+ const prefixedId = `id-${view.id}`;
730
+ const containerElement = document.querySelector(`#${prefixedId}`);
731
+ this.loadSingleWidgetNode(view, this.mainPageDivElement, this.uniqueDataSetObject);
732
+ setTimeout(() => {
733
+ this.scrollToBottom(this.mainPageDivElement);
734
+ }, 200);
735
+ let params = {};
736
+ params[filterObject.server_column] = inputValue;
737
+ let navigation = {
738
+ queryParams: params,
739
+ queryParamsHandling: "merge"
740
+ };
741
+ this.router.navigate([], navigation);
742
+ });
743
+ }
744
+ submitFilter() {
745
+ let view = this.nodeproperticeFilterDataSource.viewConfig;
746
+ let apiCalls = [];
747
+ this.havingDataObject = this.nodeproperticeFilterDataSource.havingConfig.filter(value => value.value !== "");
748
+ view.compConfig.viewConfig.forEach(contentView => {
749
+ let appliedFilters = this.stateDataSource.get(contentView.viewId);
750
+ let found = this.dataSetModal.find(d => d.datasetId === contentView.datasetId);
751
+ if (found) {
752
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, contentView.datasetId, appliedFilters.filters));
753
+ }
754
+ });
755
+ Promise.all(apiCalls).then(() => {
756
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
757
+ this.nodeproperticeFilterDataSource.viewConfig.nodeProperties['display'] = false;
758
+ const prefixedId = `id-${this.nodeproperticeFilterDataSource.viewConfig.id}`;
759
+ const elementToHide = document.querySelector(`#${prefixedId}`);
760
+ if (elementToHide) {
761
+ elementToHide.remove();
762
+ }
763
+ this.loadingModal = true;
764
+ this.contextMenuDataSource = this.contextMenuDataSource.filter(e => e.displayKey !== this.nodeproperticeFilterDataSource.viewConfig.keyToPass);
765
+ this.isWidgetFilters = false;
766
+ view.nodeProperties['display'] = true;
767
+ this.loadSingleWidgetNode(view, this.mainPageDivElement, this.uniqueDataSetObject);
768
+ setTimeout(() => {
769
+ this.scrollToBottom(this.mainPageDivElement);
770
+ }, 200);
771
+ });
772
+ }
773
+ getWidgetFilterForTemplate(value) {
774
+ let apiCalls = [];
775
+ const deletedViewIds = [];
776
+ value.viewNodes.compConfig.viewConfig.forEach(item => {
777
+ let widgetFilter = this.stateDataSource.get(item.viewId);
778
+ let appliedFilters = widgetFilter.filters;
779
+ let found = this.dataSetModal.find(d => d.datasetId === item.datasetId);
780
+ deletedViewIds.push(item.viewId);
781
+ const having = Object.entries(value.operationFilter).map(([key, value]) => ({
782
+ columnName: key,
783
+ dataType: "float",
784
+ operator: "gte",
785
+ value: value
786
+ }));
787
+ if (found) {
788
+ found.config.queryConfig['havings'] = having;
789
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, item.datasetId, appliedFilters));
790
+ }
791
+ });
792
+ Promise.all(apiCalls).then(() => {
793
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
794
+ this.loadSingleWidgetNode(value.viewNodes, this.mainPageDivElement, this.uniqueDataSetObject);
795
+ setTimeout(() => {
796
+ this.scrollToBottom(this.mainPageDivElement);
797
+ }, 200);
798
+ });
799
+ }
800
+ }
801
+ BookmarkedTemplateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BookmarkedTemplateComponent, deps: [{ token: i1.CommonService }, { token: i2.ActivatedRoute }, { token: i0.ViewContainerRef }, { token: i0.ComponentFactoryResolver }, { token: i3.BookmarkedService }, { token: i4.ToastrService }, { token: i2.Router }, { token: i5.BookmarkedApplicationDatssetsCall }], target: i0.ɵɵFactoryTarget.Component });
802
+ BookmarkedTemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: BookmarkedTemplateComponent, selector: "app-bookmarked-template", viewQueries: [{ propertyName: "dynamicComponentContainer", first: true, predicate: ["dynamicComponentContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "containerRef", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef }, { propertyName: "dynamicContainer", first: true, predicate: ["dynamicContainer"], descendants: true, static: true }], ngImport: i0, template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n\n<div class=\"w-full\">\n <div class=\"flex flex-wrap \" #dynamicContainer></div>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.LoadingComponent, selector: "app-loading" }] });
803
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BookmarkedTemplateComponent, decorators: [{
804
+ type: Component,
805
+ args: [{ selector: 'app-bookmarked-template', template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n\n<div class=\"w-full\">\n <div class=\"flex flex-wrap \" #dynamicContainer></div>\n</div>" }]
806
+ }], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ActivatedRoute }, { type: i0.ViewContainerRef }, { type: i0.ComponentFactoryResolver }, { type: i3.BookmarkedService }, { type: i4.ToastrService }, { type: i2.Router }, { type: i5.BookmarkedApplicationDatssetsCall }]; }, propDecorators: { dynamicComponentContainer: [{
807
+ type: ViewChild,
808
+ args: ['dynamicComponentContainer', { read: ViewContainerRef }]
809
+ }], containerRef: [{
810
+ type: ViewChild,
811
+ args: ['container', { read: ViewContainerRef }]
812
+ }], dynamicContainer: [{
813
+ type: ViewChild,
814
+ args: ['dynamicContainer', { static: true }]
815
+ }] } });
816
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9va21hcmtlZC10ZW1wbGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL3RlbXBsYXRlLW1vZHVsZS9ib29rbWFya2VkLXRlbXBsYXRlL2Jvb2ttYXJrZWQtdGVtcGxhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi90ZW1wbGF0ZS1tb2R1bGUvYm9va21hcmtlZC10ZW1wbGF0ZS9ib29rbWFya2VkLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBaUIsU0FBUyxFQUFrRyxTQUFTLEVBQWdCLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBNLE9BQU8sTUFBTSxNQUFNLDRDQUE0QyxDQUFDO0FBRWhFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLG1GQUFtRixDQUFDO0FBQy9ILE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFGQUFxRixDQUFDO0FBQ2xJLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlFQUF5RSxDQUFDO0FBQ3BILE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLG1HQUFtRyxDQUFDO0FBQ3RKLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDJGQUEyRixDQUFDO0FBQzFJLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHFHQUFxRyxDQUFDO0FBQ3pKLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHFHQUFxRyxDQUFDO0FBS3pKLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7OztBQVFoQyxNQUFNLE9BQU8sMkJBQTJCO0lBNEV0QyxZQUNTLGFBQTRCLEVBQzNCLGNBQThCLEVBQzlCLGdCQUFrQyxFQUNsQyx3QkFB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QyxTQUFTOytCQUNFLHlCQUF5Qjt3VUFpQm5DLHlCQUF5QjtzQkFEeEIsU0FBUzt1QkFBQywyQkFBMkIsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFHbEUsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFFRCxnQkFBZ0I7c0JBQWhFLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgQ29tcG9uZW50UmVmLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIE9uRGVzdHJveSwgT25Jbml0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgTmF2aWdhdGlvbkV4dHJhcywgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCBtb21lbnQgZnJvbSAnLi4vLi4vYXBwbGljYXRpb24tY29udHJvbGxlci9tb21lbnQtaGVscGVyJztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2NvbW1vbic7XG5pbXBvcnQgeyBHYW1tYUFkdmFuY2VDaGFydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtYWR2YW5jZS1jaGFydC9nYW1tYS1hZHZhbmNlLWNoYXJ0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHYW1tYVRvZGF5UHJldmlvdXNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW1hLXRvZGF5LXByZXZpb3VzL2dhbW1hLXRvZGF5LXByZXZpb3VzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBcHBBZHZhbmNlSGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9hcHAtYWR2YW5jZS1oZWFkZXIvYXBwLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FtbWFUYWJsZVdpdGhQZXJjZW50YWdlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9nYW1tYS10YWJsZS13aXRoLXBlcmNlbnRhZ2UvZ2FtbWEtdGFibGUtd2l0aC1wZXJjZW50YWdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHYW1tU2luZ2xlTnVtYmVyQ2FyZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbS1zaW5nbGUtbnVtYmVyLWNhcmQvZ2FtbS1zaW5nbGUtbnVtYmVyLWNhcmQuY29tcG9uZW50JztcbmltcG9ydCB7IEdhbW1hQWR2YW5jZU9wZXJhdG9yVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW1hLWFkdmFuY2Utb3BlcmF0b3ItdGFibGUvZ2FtbWEtYWR2YW5jZS1vcGVyYXRvci10YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWR2YW5jZVdpZGdldEhlYWRlckZpbHRlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvYWR2YW5jZS13aWRnZXQtaGVhZGVyLWZpbHRlci9hZHZhbmNlLXdpZGdldC1oZWFkZXItZmlsdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHYW1tYUdlb0NoYXJ0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9nYW1tYS1nZW8tY2hhcnQvZ2FtbWEtZ2VvLWNoYXJ0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHYW1tYUhlYXRDaGFydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtaGVhdG1hcC9nYW1tYS1oZWF0bWFwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCb29rbWFya2VkQXBwbGljYXRpb25EYXRzc2V0c0NhbGwgfSBmcm9tICcuL2Jvb2ttYXJrZWQtZGF0YXNldC1jYWxsLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHsgZm9ya0pvaW4gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJvb2ttYXJrZWRTZXJ2aWNlIH0gZnJvbSAnLi9ib29rbWFya2VkLWxheW91dC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWJvb2ttYXJrZWQtdGVtcGxhdGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vYm9va21hcmtlZC10ZW1wbGF0ZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Jvb2ttYXJrZWQtdGVtcGxhdGUuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBCb29rbWFya2VkVGVtcGxhdGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBkYXNoYm9yZF9jb250YWluZXI6IGFueSA9IFtdO1xuICBzZWxlY3RlZF93aWR0aDogYW55O1xuICB3aWRnZXRfd2lkdGggPSBbJ3ctZnVsbCcsICd3LTEvMicsICd3LTEvMycsICd3LTEvNCcsICd3LTEvNScsICd3LTEvNiddXG4gIGxvYWRpbmdNb2RhbDogYm9vbGVhbjtcbiAgcGFnZV90aXRsZSA9ICdEYXNoYm9hcmQnO1xuICBkZWZhdWx0U3RhcnREYXRlO1xuICBkZWZhdWx0RW5kRGF0ZTtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqL1xuXG4gIEBWaWV3Q2hpbGQoJ2R5bmFtaWNDb21wb25lbnRDb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgZHluYW1pY0NvbXBvbmVudENvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIGNvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZCgnZHluYW1pY0NvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIGR5bmFtaWNDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgZHluYW1pY0NvbXBvbmVudFJlZnM6IENvbXBvbmVudFJlZjxhbnk+W10gPSBbXTtcbiAgLy8gZHluYW1pY0NvbXBvbmVudFJlZnM6IENvbXBvbmVudFJlZjxhbnk+W10gPSBbXTtcblxuICBDb21wUmVmczogQ29tcG9uZW50UmVmPGFueT47XG5cbiAgY29tcG9uZW50Q2xhc3NNYXAgPSB7XG4gICAgR2FtbWFBZHZhbmNlQ2hhcnRDb21wb25lbnQsXG4gICAgR2FtbWFUb2RheVByZXZpb3VzQ29tcG9uZW50LFxuICAgIEFwcEFkdmFuY2VIZWFkZXJDb21wb25lbnQsXG4gICAgR2FtbWFUYWJsZVdpdGhQZXJjZW50YWdlQ29tcG9uZW50LFxuICAgIEdhbW1TaW5nbGVOdW1iZXJDYXJkQ29tcG9uZW50LFxuICAgIEdhbW1hQWR2YW5jZU9wZXJhdG9yVGFibGVDb21wb25lbnQsXG4gICAgQWR2YW5jZVdpZGdldEhlYWRlckZpbHRlckNvbXBvbmVudFxuICB9O1xuICBkYXRhU291cmNlTWF0YURhdGE6IGFueSA9IFtdO1xuICBxdWVyeVR5cGUgPSBcIm1vbmdvXCI7XG4gIGRhdGFTZXRNb2RhbDogYW55ID0gW107XG4gIGNvbXBvbmVudENvbmZpZ0RhdGFTb3VyY2U6IGFueSA9IFtdO1xuICBzZWxlc2NlZERhdGFTb3VyY2U6IGFueTtcbiAgZGF0YVNvdXJjZU1vZGFsOiBhbnkgPSB7fTtcbiAgaXNEYXNoQm9hcmRDb250ZW50OiBib29sZWFuID0gZmFsc2U7XG5cbiAgc2VsZWN0ZWRWaWV3Rm9ybUNvbXBvbmVudDogYW55ID0ge307XG4gIGFkZGVkd2lkR2V0Q29uZmlnID0ge1xuICAgIFwiZGlzcGxheVwiOiB0cnVlLFxuICAgIFwid2lkZ2V0VGl0bGVcIjogXCJcIixcbiAgICBcIndpZHRoXCI6IFwiXCIsXG4gICAgXCJoZWlnaHRcIjogXCJcIlxuICB9XG5cblxuICBkYXNoQm9hcmRXaWRnZXRDb25maWc6IGFueSA9IFtcblxuICBdO1xuICBpc1dpZGdldENyZWF0aW9uQ29udGVudDogYm9vbGVhbjtcbiAgc2VsZWN0ZWRXaWR0aDogYW55O1xuICBzZWxlY3RlZEhlaWdodDogYW55O1xuICBuZXdXaWRnZXRJbmRleDogYW55O1xuICBzZWxlY3RlZEluZGV4T2JqRm9yQ2hhcnQ6IGFueSA9IHt9O1xuICBzZWxlY3RlZENvbnRhaW5lck9iamVjdEZvckNoYXJ0OiBhbnkgPSB7fTtcbiAgZGF0YVNldHRhYmxlRGF0YVNvdXJjZTogYW55O1xuICB1bmlxdWVEYXRhU2V0T2JqZWN0ID0ge307XG5cbiAgaXNEYXNoQm9hcmRDb250ZW50VHlwZVZpZXc6IGJvb2xlYW4gPSB0cnVlO1xuICBmaWx0ZXJzOiBhbnk7XG4gIGFsbFdpZGdldEJ5RGF0YXNldCA9IFtdO1xuICBwYWdlVGl0bGU6IGFueTtcbiAgc3RhdGVEYXRhU291cmNlID0gbmV3IE1hcCgpO1xuICBtYWluUGFnZURpdkVsZW1lbnQ6IGFueTtcbiAgY29udGV4dE1lbnVEYXRhU291cmNlOiBhbnkgPSBbXTtcbiAgaGF2aW5nRGF0YU9iamVjdDogYW55ID0ge307XG4gIGlzV2lkZ2V0RmlsdGVyczogYm9vbGVhbjtcbiAgbm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlOiBhbnk7XG4gIGdsb2JhbERlZmF1bHRGaWx0ZXI6IGFueSA9IHt9O1xuICBwYWdlSWQ6IGFueTtcblxuICBrcGlfYnJlYWRjcnVtYnNfY29udGFpbmVyOiBhbnkgPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIHNlcnZpY2U6IEJvb2ttYXJrZWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBkYXRhc2V0U2VydmljZTogQm9va21hcmtlZEFwcGxpY2F0aW9uRGF0c3NldHNDYWxsLFxuXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgICAvLyB0aGlzLmtwaWxpc3RTZXJ2aWNlLmxvYWRlZCQucGlwZSh0YWtlKDEpLCB0YXAobG9hZGVkID0+IHtcbiAgICAvLyAgIGlmICghbG9hZGVkKSB7XG4gICAgLy8gICAgIHRoaXMua3BpbGlzdFNlcnZpY2UuZ2V0QWxsKCk7XG4gICAgLy8gICB9XG4gICAgLy8gfSlcbiAgICAvLyApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgLy8gICB0aGlzLmtwaWxpc3RTZXJ2aWNlLmVudGl0aWVzJC5zdWJzY3JpYmUocmVzb2x2ZWREYXRhID0+IHtcbiAgICAvLyAgICAgdGhpcy5rcGlfYnJlYWRjcnVtYnNfY29udGFpbmVyID0gcmVzb2x2ZWREYXRhO1xuICAgIC8vICAgfSk7XG4gICAgLy8gfSk7XG5cbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy5wYWdlSWQgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LmRhdGFbJ3BhZ2VJZCddO1xuICAgIC8vIHRoaXMucGFnZUlkID0gXCI2MTgyODk4OS05MWIxLTQzYjAtOWJmOS03OTBiYWJiZmMxMDdcIjtcbiAgICB0aGlzLmdldFBhZGVEYXRhU291cmNlKGZhbHNlKTtcbiAgfVxuXG4gIGFzeW5jIGdldEZpbHRlcnNGb3JUZW1wbGF0ZShmaWx0ZXIpIHtcbiAgICB0aGlzLmZpbHRlcnMgPSBmaWx0ZXI7XG4gICAgdGhpcy5kZWZhdWx0U3RhcnREYXRlID0gZmlsdGVyLnN0YXJ0RGF0ZTtcbiAgICB0aGlzLmRlZmF1bHRFbmREYXRlID0gZmlsdGVyLmVuZERhdGU7XG4gICAgZmlsdGVyLm9wZXJhdGlvbkZpbHRlclsnc3RhcnREYXRlJ10gPSBmaWx0ZXIuc3RhcnREYXRlO1xuICAgIGZpbHRlci5vcGVyYXRpb25GaWx0ZXJbJ2VuZERhdGUnXSA9IGZpbHRlci5lbmREYXRlO1xuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZyA9IFtdO1xuICAgIGF3YWl0IHRoaXMuZ2V0UGFkZURhdGFTb3VyY2UodHJ1ZSk7XG4gICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0ge307XG4gICAgbGV0IGFwaUNhbGxzID0gW107XG5cbiAgICB0aGlzLmFsbFdpZGdldEJ5RGF0YXNldC5mb3JFYWNoKHZpZXcgPT4ge1xuICAgICAgdmlldy5kYXRhc2V0SWRzLmZvckVhY2goaWQgPT4ge1xuICAgICAgICBsZXQgZm91bmQgPSAodGhpcy5kYXRhU2V0TW9kYWwgYXMgYW55W10pLmZpbmQoZCA9PiBkLmRhdGFzZXRJZCA9PT0gaWQpO1xuICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICBhcGlDYWxscy5wdXNoKHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0RGF0YUZyb21EYXRhU2V0KGZvdW5kLCBpZCwgZmlsdGVyKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgUHJvbWlzZS5hbGwoYXBpQ2FsbHMpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5nbG9iYWxEZWZhdWx0RmlsdGVyID0gZmlsdGVyO1xuICAgICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0gdGhpcy5kYXRhc2V0U2VydmljZS5nZXRVbmlxdWVEYXRhU2V0T2JqZWN0KCk7XG4gICAgICB0aGlzLmNyZWF0ZURpdkVsZW1lbnRzKHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCwgdHJ1ZSk7XG4gICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0UGFkZURhdGFTb3VyY2UoY29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNlcnZpY2UuZ2V0QXBwUGFnZURldGFpbENvbmZpZyh0aGlzLnBhZ2VJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuXG4gICAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBkYXRhLnBhZ2VOYW1lO1xuICAgICAgICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnID0gZGF0YTtcblxuICAgICAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U3RhcnREYXRlID0gbW9tZW50KCkuc3VidHJhY3QoJzMwJywgJ2RheXMnKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdEVuZERhdGUgPSBtb21lbnQoKS5zdWJ0cmFjdCgnMScsICdkYXlzJykuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZURpdkVsZW1lbnRzKHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5nZXRDb21wb25lbnRDb25maWdTZXQoKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnRXJyb3InKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuXG5cbiAgZ2V0Q29tcG9uZW50Q29uZmlnU2V0KCkge1xuICAgIGxldCBkYXRhc2V0ID0gdGhpcy5zZXJ2aWNlLmdldEFwcERhdGFzZXRDb25maWdzKCk7XG4gICAgbGV0IHZpZXdDb21wb25lbnQgPSB0aGlzLnNlcnZpY2UuZ2V0QXBwVmlld0NvbmZpZ3MoKTtcblxuICAgIGZvcmtKb2luKHtcbiAgICAgIGRhdGFzZXRDb25maWc6IGRhdGFzZXQsXG4gICAgICB2aWV3Q29uZmlnOiB2aWV3Q29tcG9uZW50XG4gICAgfSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgoeyBkYXRhc2V0Q29uZmlnLCB2aWV3Q29uZmlnIH0pID0+IHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRDb25maWdEYXRhU291cmNlID0gdmlld0NvbmZpZztcbiAgICAgICAgdGhpcy5kYXRhU2V0TW9kYWwgPSBkYXRhc2V0Q29uZmlnO1xuICAgICAgICB0aGlzLmFsbFdpZGdldEJ5RGF0YXNldCA9IFtdO1xuXG4gICAgICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuZm9yRWFjaCh3aWRnZXQgPT4ge1xuICAgICAgICAgIGxldCBkZWZhdWx0RmlsdGVycyA9IHsgb3BlcmF0aW9uRmlsdGVyOiB7IHN0YXJ0RGF0ZTogXCJcIiwgZW5kRGF0ZTogXCJcIiB9IH07XG4gICAgICAgICAgd2lkZ2V0LmZpbHRlcnMuZmlsdGVySXRlbXMuZm9yRWFjaChlbGVtZW50ID0+IHtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZmlsdGVyVHlwZSA9PT0gJ2RhdGUnIHx8IGVsZW1lbnQuZmlsdGVyVHlwZSA9PT0gJ2RhdGV0aW1lJykge1xuICAgICAgICAgICAgICBpZiAoZWxlbWVudC5kZWZhdWx0RmlsdGVyVHlwZSA9PT0gXCJkeW5hbWljXCIgJiYgZWxlbWVudC5tb21lbnRGdW5jdGlvbiAhPT0gXCJcIiAmJiBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZSAhPT0gXCJcIiAmJiBlbGVtZW50Lm1vbWVudEZvcm1hdCAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGxldCBbY291bnQsIHVuaXRdID0gZWxlbWVudC5kZWZhdWx0RmlsdGVyVmFsdWUuc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5hcGlOYW1lID09PSBcImVuZERhdGVcIikge1xuICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGlzcGxheSkge1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVycy5vcGVyYXRpb25GaWx0ZXIuZW5kRGF0ZSA9IG1vbWVudCgpW2VsZW1lbnQubW9tZW50RnVuY3Rpb25dKHBhcnNlSW50KGNvdW50KSwgdW5pdCkuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0RW5kRGF0ZSA9IG1vbWVudCgpW2VsZW1lbnQubW9tZW50RnVuY3Rpb25dKHBhcnNlSW50KGNvdW50KSwgdW5pdCkuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYXBpTmFtZSA9PT0gXCJzdGFydERhdGVcIikge1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyLnN0YXJ0RGF0ZSA9IG1vbWVudCgpW2VsZW1lbnQubW9tZW50RnVuY3Rpb25dKHBhcnNlSW50KGNvdW50KSwgdW5pdCkuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAodHlwZW9mIGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlID09PSBcInN0cmluZ1wiICYmIGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlICE9PSBcIlwiKSB8fFxuICAgICAgICAgICAgICAgIChBcnJheS5pc0FycmF5KGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlKSAmJiBlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5vcGVyYXRvck5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlcltlbGVtZW50Lm9wZXJhdG9yTmFtZV0gPSBBcnJheS5pc0FycmF5KGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA/IGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogW2VsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyW2VsZW1lbnQuYXBpTmFtZV0gPSBlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZS5qb2luKFwiLFwiKTtcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHVybFBhcmFtczogYW55ID0gZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyXG4gICAgICAgICAgdXJsUGFyYW1zWydwYWdlSWQnXSA9IHRoaXMucGFnZUlkXG4gICAgICAgICAgbGV0IG5hdmlnYXRpb246IE5hdmlnYXRpb25FeHRyYXMgPSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtczogdXJsUGFyYW1zLFxuICAgICAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogXCJtZXJnZVwiXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwgbmF2aWdhdGlvbik7XG5cbiAgICAgICAgICBsZXQgZGF0YXNldElkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gICAgICAgICAgbGV0IHZpZXdJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICAgICAgICAgIHdpZGdldC53aWRnZXROb2RlLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlUHJvcGVydGllcy5kaXNwbGF5KSB7XG4gICAgICAgICAgICAgIG5vZGUuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2godmlldyA9PiB7XG4gICAgICAgICAgICAgICAgZGF0YXNldElkcy5hZGQodmlldy5kYXRhc2V0SWQpO1xuICAgICAgICAgICAgICAgIHZpZXdJZHMuYWRkKHZpZXcudmlld0lkKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKHZpZXcgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlLnB1c2goeyB2aWV3SWQ6IHZpZXcudmlld0lkLCB2aWV3TmFtZTogbm9kZS5ub2RlUHJvcGVydGllcy53aWRnZXRUaXRsZSwgZGlzcGxheUtleTogdmlldy5rcGlDb25maWcua2V5VG9QYXNzIH0pXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB2aWV3SWRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgICBcImZpbHRlcnNcIjogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkZWZhdWx0RmlsdGVycykpLFxuICAgICAgICAgICAgICBcImtleVRvUGFzc1wiOiBbXSxcbiAgICAgICAgICAgICAgXCJkcmlsbERvd25UeXBlXCI6IFwibmF0dXJhbFwiLFxuICAgICAgICAgICAgICBcImRyaWxsZG93bkZyb21cIjogXCJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdGF0ZURhdGFTb3VyY2Uuc2V0KGVsZW1lbnQsIG9iailcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgd2lkZ2V0SWQ6IHdpZGdldC53aWRnZXRJZCxcbiAgICAgICAgICAgIHBhZ2VJZDogd2lkZ2V0LnBhZ2VJZCxcbiAgICAgICAgICAgIGZpbHRlcnM6IGRlZmF1bHRGaWx0ZXJzLFxuICAgICAgICAgICAgZGF0YXNldElkczogZGF0YXNldElkc1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFsbFdpZGdldEJ5RGF0YXNldC5wdXNoKG9iaik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuc3RhdGVEYXRhU291cmNlKTtcblxuXG4gICAgICAgIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCA9IHt9O1xuICAgICAgICBsZXQgYXBpQ2FsbHMgPSBbXTtcblxuXG4gICAgICAgIHRoaXMuYWxsV2lkZ2V0QnlEYXRhc2V0LmZvckVhY2godmlldyA9PiB7XG4gICAgICAgICAgdmlldy5kYXRhc2V0SWRzLmZvckVhY2goaWQgPT4ge1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gKGRhdGFzZXRDb25maWcgYXMgYW55W10pLmZpbmQoZCA9PiBkLmRhdGFzZXRJZCA9PT0gaWQpO1xuICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgIGFwaUNhbGxzLnB1c2godGhpcy5kYXRhc2V0U2VydmljZS5nZXREYXRhRnJvbURhdGFTZXQoZm91bmQsIGlkLCB2aWV3LmZpbHRlcnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFByb21pc2UuYWxsKGFwaUNhbGxzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldFVuaXF1ZURhdGFTZXRPYmplY3QoKTtcbiAgICAgICAgICB0aGlzLmNyZWF0ZURpdkVsZW1lbnRzKHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCwgZmFsc2UpO1xuICAgICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgfSksIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdFcnJvcicpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBnZXREYXRhU2V0KCkge1xuICAgIHRoaXMuc2VydmljZS5nZXRBcHBEYXRhc2V0Q29uZmlncygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZGF0YVNldHRhYmxlRGF0YVNvdXJjZSA9IGRhdGE7XG4gICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnRGF0YXNldCBDcmVhdGlvbicpXG5cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cblxuICBhc3luYyBjcmVhdGVEaXZFbGVtZW50cyhkYXRhc2V0QnlJZCwgY29udGV4dCkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZHluYW1pY0NvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuXG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5mb3JFYWNoKGFzeW5jIGRpdiA9PiB7XG4gICAgICBjb25zdCByb3dEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGxldCB3X2hlaWdodCA9IChkaXYud2lkZ2V0UHJvcGVydGllcy5oZWlnaHQgPT0gXCJcIikgPyBcImgtYXV0b1wiIDogJ2gtWycgKyBkaXYud2lkZ2V0UHJvcGVydGllcy5oZWlnaHQgKyAnXSc7XG4gICAgICByb3dEaXYuY2xhc3NMaXN0LmFkZChkaXYud2lkZ2V0UHJvcGVydGllcy53aWR0aCwgd19oZWlnaHQpO1xuICAgICAgY29uc3QgZmlsdGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLmxvYWRGaWx0ZXJDb21wb25lbnQoZGl2LCBmaWx0ZXJEaXYsIGRpdi5maWx0ZXJzLmZpbHRlckl0ZW1zKTtcbiAgICAgIHJvd0Rpdi5hcHBlbmRDaGlsZChmaWx0ZXJEaXYpO1xuXG4gICAgICBpZiAoZGl2LndpZGdldE5vZGUubGVuZ3RoICE9IDApIHtcbiAgICAgICAgbGV0IG1haW5JdGVtRGl2ID0gcm93RGl2LnF1ZXJ5U2VsZWN0b3IoJy5mbGV4LmZsZXgtd3JhcCcpO1xuXG5cblxuICAgICAgICAvLyBJZiBjb250ZXh0IGlzIHRydWUgYW5kIG1haW5JdGVtRGl2IGV4aXN0cywgY2xlYXIgaXRzIGNvbnRlbnRzXG4gICAgICAgIGlmIChjb250ZXh0ICYmIG1haW5JdGVtRGl2KSB7XG4gICAgICAgICAgbWFpbkl0ZW1EaXYuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBDcmVhdGUgbWFpbkl0ZW1EaXYgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgICAgIG1haW5JdGVtRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgbWFpbkl0ZW1EaXYuY2xhc3NMaXN0LmFkZChcImZsZXhcIiwgXCJmbGV4LXdyYXBcIik7XG4gICAgICAgICAgcm93RGl2LmFwcGVuZENoaWxkKG1haW5JdGVtRGl2KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZFdpZGdldE5vZGVzKGRpdiwgbWFpbkl0ZW1EaXYsIGRhdGFzZXRCeUlkKTtcbiAgICAgIH1cblxuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHJvd0Rpdik7XG4gICAgfSk7XG4gIH1cbiAgbG9hZFdpZGdldE5vZGVzKGRpdjogYW55LCBtYWluSXRlbURpdjogYW55LCBkYXRhc2V0QnlJZDogYW55KSB7XG4gICAgdGhpcy5tYWluUGFnZURpdkVsZW1lbnQgPSBtYWluSXRlbURpdjtcbiAgICBkaXYud2lkZ2V0Tm9kZS5mb3JFYWNoKGl0ZW0gPT4ge1xuXG4gICAgICB0aGlzLmxvYWRTaW5nbGVXaWRnZXROb2RlKGl0ZW0sIG1haW5JdGVtRGl2LCBkYXRhc2V0QnlJZCk7XG4gICAgfSk7XG4gIH1cblxuXG4gIGxvYWRTaW5nbGVXaWRnZXROb2RlKGl0ZW06IGFueSwgY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQsIGRhdGFzZXRCeUlkOiBhbnkpIHtcbiAgICBjb25zdCBlbGVtZW50SWQgPSBgaWQtJHtpdGVtLmlkfWA7XG4gICAgY29uc3QgZXhpc3RpbmdFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7ZWxlbWVudElkfWApO1xuICAgIGlmIChpdGVtLm5vZGVQcm9wZXJ0aWVzLmRpc3BsYXkgJiYgIWV4aXN0aW5nRWxlbWVudCkge1xuICAgICAgY29uc3Qgd19oZWlnaHQgPSBpdGVtLm5vZGVQcm9wZXJ0aWVzLmhlaWdodCA9PT0gXCJcIiA/IFwiaC1hdXRvXCIgOiBgaC1bJHtpdGVtLm5vZGVQcm9wZXJ0aWVzLmhlaWdodH1dYDtcbiAgICAgIGNvbnN0IGl0ZW1EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGl0ZW1EaXYuaWQgPSBlbGVtZW50SWQ7XG4gICAgICBpdGVtRGl2LmNsYXNzTGlzdC5hZGQoaXRlbS5ub2RlUHJvcGVydGllcy53aWR0aCwgd19oZWlnaHQsICdtYi0yJyk7XG4gICAgICBjb25zdCB3aWRnZXREaXYgPSB0aGlzLmdldFdpZGdldFRpdGxlRGl2KGl0ZW0pO1xuICAgICAgaXRlbURpdi5hcHBlbmRDaGlsZCh3aWRnZXREaXYpO1xuICAgICAgY29uc3QgaW5uZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGlubmVyRGl2LmNsYXNzTGlzdC5hZGQoJ3JvdW5kZWQnLCAnanVzdGlmeS1jZW50ZXInLCAnaXRlbXMtY2VudGVyJywgJ2JvcmRlcicsICdwLTEnLCAnbS0xJywgJ2ZsZXgnLCAnZmxleC1yb3cnKTtcbiAgICAgIGl0ZW0uY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIGVsZW1lbnQua3BpQ29uZmlnWydkYXRhU291cmNlJ10gPSBkYXRhc2V0QnlJZFtlbGVtZW50LmRhdGFzZXRJZF07XG4gICAgICAgIGVsZW1lbnQua3BpQ29uZmlnWydjb250ZXh0TWVudSddID0gdGhpcy5jb250ZXh0TWVudURhdGFTb3VyY2U7XG4gICAgICAgIGVsZW1lbnRbJ3RpdGxlUGFyYW1zJ10gPSBpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZGdldFBhcmFtcyB8fCBcIlwiO1xuICAgICAgICBjb25zdCBjb21wX29iamVjdCA9IHRoaXMuZmluZFdpZGdldEJ5SWQodGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cywgaXRlbS5pZCk7XG4gICAgICAgIHRoaXMubG9hZER5bmFtaWNDb21wb25lbnQoZWxlbWVudCwgY29tcF9vYmplY3QsIGl0ZW1EaXYpO1xuICAgICAgfSk7XG4gICAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1EaXYpO1xuICAgICAgaWYgKCF0aGlzLmlzRGFzaEJvYXJkQ29udGVudFR5cGVWaWV3KSB7XG4gICAgICAgIGl0ZW1EaXYuYXBwZW5kQ2hpbGQoaW5uZXJEaXYpO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChleGlzdGluZ0VsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGl0ZW1EaXYgPSBleGlzdGluZ0VsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpdGVtRGl2LmlubmVySFRNTCA9ICcnO1xuICAgICAgY29uc3Qgd2lkZ2V0RGl2ID0gdGhpcy5nZXRXaWRnZXRUaXRsZURpdihpdGVtKTtcbiAgICAgIGl0ZW1EaXYuYXBwZW5kQ2hpbGQod2lkZ2V0RGl2KTtcbiAgICAgIGl0ZW0uY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIGVsZW1lbnQua3BpQ29uZmlnWydkYXRhU291cmNlJ10gPSBkYXRhc2V0QnlJZFtlbGVtZW50LmRhdGFzZXRJZF07XG4gICAgICAgIGVsZW1lbnQua3BpQ29uZmlnWydjb250ZXh0TWVudSddID0gdGhpcy5jb250ZXh0TWVudURhdGFTb3VyY2U7XG4gICAgICAgIGVsZW1lbnRbJ3RpdGxlUGFyYW1zJ10gPSBpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZGdldFBhcmFtcyB8fCBcIlwiO1xuICAgICAgICBjb25zdCBjb21wX29iamVjdCA9IHRoaXMuZmluZFdpZGdldEJ5SWQodGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cywgaXRlbS5pZCk7XG4gICAgICAgIHRoaXMubG9hZER5bmFtaWNDb21wb25lbnQoZWxlbWVudCwgY29tcF9vYmplY3QsIGl0ZW1EaXYpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghdGhpcy5pc0Rhc2hCb2FyZENvbnRlbnRUeXBlVmlldykge1xuICAgICAgICBjb25zdCBpbm5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBpbm5lckRpdi5jbGFzc0xpc3QuYWRkKCdyb3VuZGVkJywgJ2p1c3RpZnktY2VudGVyJywgJ2l0ZW1zLWNlbnRlcicsICdib3JkZXInLCAncC0xJywgJ20tMScsICdmbGV4JywgJ2ZsZXgtcm93Jyk7XG4gICAgICAgIGl0ZW1EaXYuYXBwZW5kQ2hpbGQoaW5uZXJEaXYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFdpZGdldFRpdGxlRGl2KGl0ZW0pIHtcbiAgICBjb25zdCB3aWRnZXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB3aWRnZXREaXYuY2xhc3NMaXN0LmFkZCgnZmxleCcsICdpdGVtcy1jZW50ZXInLCAnanVzdGlmeS1iZXR3ZWVuJywgJ2ZvbnQtYm9sZCcsICd0ZXh0LW1kJywgJ3RleHQtZ3JheS05MDAnLCAnZGFyazp0ZXh0LXdoaXRlJywgJ2JvcmRlci1iJywgJ3AtMycsICdiZy1ncmF5LTgwMCcsICdteC0yJywgJ3JvdW5kZWQtdC1sZycpO1xuICAgIGNvbnN0IHRpdGxlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29uc3QgcGFyYW1zID0gaXRlbS5ub2RlUHJvcGVydGllcy53aWRnZXRQYXJhbXMgfHwgXCJcIjtcbiAgICB0aXRsZURpdi5pbm5lclRleHQgPSBpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZGdldFRpdGxlICsgcGFyYW1zO1xuICAgIHdpZGdldERpdi5hcHBlbmRDaGlsZCh0aXRsZURpdik7XG5cbiAgICBjb25zdCBzZWFyY2hDb250YWluZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBzZWFyY2hDb250YWluZXJEaXYuY2xhc3NMaXN0LmFkZCgnZmxleCcsICdpdGVtcy1jZW50ZXInLCAnbWwtYXV0bycsICdzcGFjZS14LTInLCAnanVzdGlmeS1lbmQnKTsgLy8gbWwtYXV0byBwdXNoZXMgY29udGVudCB0byB0aGUgcmlnaHQgc2lkZVxuXG4gICAgLy8gQ2hlY2sgZm9yIHdpZGdldCBmaWx0ZXJcbiAgICBpZiAoaXRlbS5ub2RlUHJvcGVydGllcy5pc1dpZGdldEZpbHRlcikge1xuICAgICAgY29uc3Qgc2VhcmNoQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICBzZWFyY2hCdXR0b24uaW5uZXJUZXh0ID0gJ0ZpbHRlcic7XG4gICAgICBzZWFyY2hCdXR0b24uY2xhc3NMaXN0LmFkZCgncHgtMycsICdweS0xLjUnLCAnYmctYmx1ZS02MDAnLCAnbXItMicsICd0ZXh0LXdoaXRlJywgJ3JvdW5kZWQnLCAnaG92ZXI6YmctYmx1ZS03MDAnKTtcbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlID0ge307XG4gICAgICB0aGlzLm5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZVsndmlld0NvbmZpZyddID0gaXRlbTtcbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlWydoYXZpbmdDb25maWcnXSA9IFtdO1xuXG4gICAgICBzZWFyY2hCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNXaWRnZXRGaWx0ZXJzID0gdHJ1ZTtcbiAgICAgICAgbGV0IGZpbHRlUHJvcGVydGljZSA9IFtdO1xuICAgICAgICBpdGVtLmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGxldCBrZXlfbmFtZSA9IHRoaXMudW5pcXVlRGF0YVNldE9iamVjdFtlbGVtZW50LmRhdGFzZXRJZF1bMF07XG4gICAgICAgICAgT2JqZWN0LmtleXMoa2V5X25hbWUpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmICghZmlsdGVQcm9wZXJ0aWNlLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgZmlsdGVQcm9wZXJ0aWNlLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZpbHRlUHJvcGVydGljZS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICBjb2x1bW5OYW1lOiBlbGVtZW50LFxuICAgICAgICAgICAgZGF0YVR5cGU6IFwiZmxvYXRcIixcbiAgICAgICAgICAgIG9wZXJhdG9yOiBcIlwiLFxuICAgICAgICAgICAgdmFsdWU6IFwiXCIsXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlLmhhdmluZ0NvbmZpZy5wdXNoKG9iailcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHNlYXJjaENvbnRhaW5lckRpdi5hcHBlbmRDaGlsZChzZWFyY2hCdXR0b24pXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGl0ZW0gZmlsdGVySWRcbiAgICBpZiAoaXRlbS5maWx0ZXJJZCkge1xuICAgICAgdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2UgPSB7fTtcbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlWyd2aWV3Q29uZmlnJ10gPSBpdGVtO1xuICAgICAgdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2VbJ2hhdmluZ0NvbmZpZyddID0gW107XG5cbiAgICAgIHRoaXMuc2VydmljZS5nZXRBcHBGaWx0ZXJDb25maWcoaXRlbS5maWx0ZXJJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpbHRlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIHRoaXMubG9hZFdpZGdldEZpbHRlckNvbXBvbmVudChpdGVtLCB3aWRnZXREaXYsIGRhdGEuZmlsdGVySXRlbXMsIGl0ZW0pO1xuICAgICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG5cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIG5vZGUgZmlsdGVyc1xuICAgIGlmIChpdGVtLm5vZGVQcm9wZXJ0aWVzLm5vZGVmaWx0ZXJzICYmIGl0ZW0ubm9kZVByb3BlcnRpZXMubm9kZWZpbHRlcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICBpdGVtLm5vZGVQcm9wZXJ0aWVzLm5vZGVmaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGZpbHRlckRpdi5jbGFzc0xpc3QuYWRkKCdmbGV4JywgJ2l0ZW1zLWNlbnRlcicpO1xuXG4gICAgICAgIGlmIChmaWx0ZXIuaW5wdXRfdHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgY29uc3QgdGV4dEJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgICAgdGV4dEJveC50eXBlID0gJ3RleHQnO1xuICAgICAgICAgIHRleHRCb3gucGxhY2Vob2xkZXIgPSBgRW50ZXIgJHtmaWx0ZXIubG9jYWxfY29sdW1ufWA7XG4gICAgICAgICAgdGV4dEJveC5jbGFzc0xpc3QuYWRkKCdweC0yJywgJ3B5LTEuNScsICdyb3VuZGVkJywgJ2JvcmRlcicsICdtci0xJywgJ2JvcmRlci1ncmF5LTUwMCcsICd0ZXh0LWdyYXktOTAwJywgJ2Rhcms6YmctZ3JheS03MDAnLCAnZGFyazp0ZXh0LXdoaXRlJyk7XG5cbiAgICAgICAgICBjb25zdCBzZWFyY2hCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgICBzZWFyY2hCdXR0b24uaW5uZXJUZXh0ID0gJ1NlYXJjaCc7XG4gICAgICAgICAgc2VhcmNoQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ3B4LTMnLCAncHktMS41JywgJ2JnLWJsdWUtNjAwJywgJ21yLTInLCAndGV4dC13aGl0ZScsICdyb3VuZGVkJywgJ2hvdmVyOmJnLWJsdWUtNzAwJyk7XG5cbiAgICAgICAgICBjb25zdCBzZXBhcmVyb3RCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICBzZXBhcmVyb3RCdXR0b24uaW5uZXJIVE1MID0gJ3wnO1xuXG4gICAgICAgICAgc2VhcmNoQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VhcmNoVGVybSA9IHRleHRCb3gudmFsdWU7XG4gICAgICAgICAgICB0aGlzLmdldFJlYXJjaFJlc3VsdEZyb21JbnB1dEJveChzZWFyY2hUZXJtLCBpdGVtLCBmaWx0ZXIpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgZmlsdGVyRGl2LmFwcGVuZENoaWxkKHRleHRCb3gpO1xuICAgICAgICAgIGZpbHRlckRpdi5hcHBlbmRDaGlsZChzZWFyY2hCdXR0b24pO1xuICAgICAgICAgIGZpbHRlckRpdi5hcHBlbmRDaGlsZChzZXBhcmVyb3RCdXR0b24pO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VhcmNoQ29udGFpbmVyRGl2LmFwcGVuZENoaWxkKGZpbHRlckRpdik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB3aWRnZXREaXYuYXBwZW5kQ2hpbGQoc2VhcmNoQ29udGFpbmVyRGl2KTtcbiAgICByZXR1cm4gd2lkZ2V0RGl2O1xuICB9XG5cblxuXG4gIGxvYWREeW5hbWljQ29tcG9uZW50KGRhdGEsIGluZGV4T2JqLCBjb250YWluZXJFbGVtZW50KTogYW55IHtcbiAgICBjb25zdCBjb21wb25lbnRDbGFzcyA9IHRoaXMuY29tcG9uZW50Q2xhc3NNYXBbZGF0YS5rcGlDb25maWcuY29tcG9uZW50TmFtZV07XG4gICAgdGhpcy5Db21wUmVmcyA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50Q2xhc3MpO1xuICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZSA9IHRoaXMuQ29tcFJlZnMuaW5zdGFuY2U7XG5cbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuY2hhcnREYXRhU291cmNlID0gZGF0YTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2Uua3BpX25hbWUgPSBcIlwiO1xuICAgIGlmIChkYXRhLmtwaUNvbmZpZy5jb21wb25lbnROYW1lID09IFwiR2FtbWFBZHZhbmNlT3BlcmF0b3JUYWJsZUNvbXBvbmVudFwiKSB7XG4gICAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2Uub1Jvd0NsaWNrLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmdldFJvd0NsaWNrKHZhbHVlKTtcbiAgICAgIH0pO1xuICAgICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLm9ucmlnaHRDbGlja0NvbnRleHRTZWxlY3Rpb24uc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuZ2V0Q29udGV4dENsaWNrKHZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBpbmRleE9iai5jb21wQ29uZmlnLmR5bmFtaWNDb21wb25lbnRSZWZzLnB1c2godGhpcy5Db21wUmVmcyk7XG4gICAgY29uc3QgY3NzQ2xhc3MgPSBcInctZnVsbFwiO1xuICAgIHRoaXMuQ29tcFJlZnMubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGNzc0NsYXNzKTtcbiAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuQ29tcFJlZnMubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBsb2FkRmlsdGVyQ29tcG9uZW50KGluZGV4T2JqLCBjb250YWluZXJFbGVtZW50LCBmaWx0ZXJJdGVtcykge1xuICAgIGxldCB1c2VyTmFtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyX25hbWUnKVxuICAgIGxldCBzZWxlY3RlZERhdGVzID0geyBzdGFydERhdGU6IHRoaXMuZGVmYXVsdFN0YXJ0RGF0ZSwgZW5kRGF0ZTogdGhpcy5kZWZhdWx0RW5kRGF0ZSB9XG4gICAgY29uc3QgY29tcG9uZW50Q2xhc3MgPSB0aGlzLmNvbXBvbmVudENsYXNzTWFwWydBcHBBZHZhbmNlSGVhZGVyQ29tcG9uZW50J107XG4gICAgdGhpcy5Db21wUmVmcyA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50Q2xhc3MpO1xuICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZSA9IHRoaXMuQ29tcFJlZnMuaW5zdGFuY2U7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLnNlbGVjdGVkRGF0ZXMgPSBzZWxlY3RlZERhdGVzO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5maWx0ZXJJdGVtcyA9IGZpbHRlckl0ZW1zO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5wYWdlVGl0bGUgPSB0aGlzLnBhZ2VUaXRsZTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuYnJlYWRfY3J1bWJzX2NvbnRhaW5lciA9IHRoaXMua3BpX2JyZWFkY3J1bWJzX2NvbnRhaW5lcjtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuaXNFZGl0QnV0dG9uID0gKHVzZXJOYW1lICYmIHVzZXJOYW1lID09IFwiYWRtaW5cIikgPyB0cnVlIDogZmFsc2U7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmlzQWR2YW5jZUJ1dHRvbiA9IHRydWU7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmdldEZpbHRlclBhZ2VDb25maWcuc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLmdldEZpbHRlcnNGb3JUZW1wbGF0ZSh2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICBpbmRleE9iai5jb21wQ29uZmlnLmR5bmFtaWNDb21wb25lbnRSZWZzLnB1c2godGhpcy5Db21wUmVmcyk7XG4gICAgY29uc3QgY3NzQ2xhc3MgPSBcInctZnVsbFwiO1xuICAgIHRoaXMuQ29tcFJlZnMubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGNzc0NsYXNzKTtcbiAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuQ29tcFJlZnMubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XG4gIH1cbiAgbG9hZFdpZGdldEZpbHRlckNvbXBvbmVudChpbmRleE9iaiwgY29udGFpbmVyRWxlbWVudCwgZmlsdGVySXRlbXMsIHZpZXdJZHMpIHtcbiAgICBsZXQgdXNlck5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcl9uYW1lJylcbiAgICBsZXQgc2VsZWN0ZWREYXRlcyA9IHsgc3RhcnREYXRlOiB0aGlzLmRlZmF1bHRTdGFydERhdGUsIGVuZERhdGU6IHRoaXMuZGVmYXVsdEVuZERhdGUgfVxuICAgIGNvbnN0IGNvbXBvbmVudENsYXNzID0gdGhpcy5jb21wb25lbnRDbGFzc01hcFsnQWR2YW5jZVdpZGdldEhlYWRlckZpbHRlckNvbXBvbmVudCddO1xuICAgIHRoaXMuQ29tcFJlZnMgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudENsYXNzKTtcbiAgICBjb25zdCBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UgPSB0aGlzLkNvbXBSZWZzLmluc3RhbmNlO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5zZWxlY3RlZERhdGVzID0gc2VsZWN0ZWREYXRlcztcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuZmlsdGVySXRlbXMgPSBmaWx0ZXJJdGVtcztcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2Uudmlld0lkcyA9IHZpZXdJZHM7XG5cbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuZ2V0V2lkZ2V0RmlsdGVyQ29uZmlnLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5nZXRXaWRnZXRGaWx0ZXJGb3JUZW1wbGF0ZSh2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICBpbmRleE9iai5jb21wQ29uZmlnLmR5bmFtaWNDb21wb25lbnRSZWZzLnB1c2godGhpcy5Db21wUmVmcyk7XG4gICAgY29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLkNvbXBSZWZzLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgLy8gZm9yIGNvbnRleHQgbWVudSBmdW5jdGlvblxuICBnZXRDb250ZXh0Q2xpY2soZXZlbnQpIHtcbiAgICBjb25zdCBzdGF0ZURhdGEgPSBBcnJheS5mcm9tKHRoaXMuc3RhdGVEYXRhU291cmNlLmtleXMoKSk7XG4gICAgY29uc3QgY3VycmVudFZpZXdJbmRleCA9IHN0YXRlRGF0YS5pbmRleE9mKGV2ZW50LnZpZXdJZCk7XG4gICAgY29uc3QgZGVsZXRlZFZpZXdJZHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gY3VycmVudFZpZXdJbmRleCArIDE7IGkgPCBzdGF0ZURhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlbGV0ZWRWaWV3SWRzLnB1c2goc3RhdGVEYXRhW2ldKVxuICAgIH1cbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgZWxlbWVudC53aWRnZXROb2RlLmZvckVhY2goKG5vZGU6IGFueSwgbm9kZUluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0RWxlbWVudE9mQ3VycmVudFZpZXcobm9kZSwgZXZlbnQuZHJpbGxkb3duVG8pKSB7XG4gICAgICAgICAgbGV0IHZpZXcgPSBlbGVtZW50LndpZGdldE5vZGVbbm9kZUluZGV4XTtcbiAgICAgICAgICBsZXQgYXBpQ2FsbHMgPSBbXTtcbiAgICAgICAgICBsZXQgYXBwbGllZEZpbHRlcnMgPSB0aGlzLmdldFNldE9wZXJhdG9yRmlsdGVyKGV2ZW50LCB0aGlzLnN0YXRlRGF0YVNvdXJjZS5nZXQoZXZlbnQuZHJpbGxkb3duRnJvbSkpO1xuICAgICAgICAgIHZpZXcuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2goY29udGVudFZpZXcgPT4ge1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gKHRoaXMuZGF0YVNldE1vZGFsIGFzIGFueVtdKS5maW5kKGQgPT4gZC5kYXRhc2V0SWQgPT09IGNvbnRlbnRWaWV3LmRhdGFzZXRJZCk7XG4gICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChmb3VuZCwgY29udGVudFZpZXcuZGF0YXNldElkLCBhcHBsaWVkRmlsdGVycykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFByb21pc2UuYWxsKGFwaUNhbGxzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCA9IHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0VW5pcXVlRGF0YVNldE9iamVjdCgpO1xuICAgICAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgZGVsZXRlZFZpZXdJZHMpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC53aWRnZXROb2RlLmZvckVhY2godmlld1ZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICB2aWV3VmFsdWUuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2godmlld0lkID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICh2aWV3SWQudmlld0lkID09IGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlLnNvbWUoaXRlbSA9PiBpdGVtLnZpZXdJZCA9PT0gdmlld0lkLnZpZXdJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm90IGV4aXN0cywgcHVzaCB0aGUgbmV3IG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0lkOiB2aWV3SWQudmlld0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld05hbWU6IG5vZGUubm9kZVByb3BlcnRpZXMud2lkZ2V0VGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5S2V5OiB2aWV3SWQua3BpQ29uZmlnLmtleVRvUGFzc1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVEYXRhU291cmNlLmRlbGV0ZShlbnRyeSlcbiAgICAgICAgICAgICAgICAgICAgdmlld1ZhbHVlLm5vZGVQcm9wZXJ0aWVzWydkaXNwbGF5J10gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJlZml4ZWRJZCA9IGBpZC0ke3ZpZXdWYWx1ZS5pZH1gO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50VG9IaWRlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cHJlZml4ZWRJZH1gKSBhcyBIVE1MRWxlbWVudDsgLy8gQ2FzdCB0byBIVE1MRWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFRvSGlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0hpZGUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlID0gdGhpcy5jb250ZXh0TWVudURhdGFTb3VyY2UuZmlsdGVyKGUgPT4gZS5kaXNwbGF5S2V5ICE9PSBldmVudC5rZXlUb1Bhc3MpO1xuICAgICAgICAgICAgdmlldy5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaCh2YWwgPT4ge1xuICAgICAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgICAgIFwiZmlsdGVyc1wiOiBhcHBsaWVkRmlsdGVycyxcbiAgICAgICAgICAgICAgICBcImtleVRvUGFzc1wiOiB0aGlzLnVwZGF0ZU9wZXJhdG9yRGF0YShldmVudC5rZXlUb1Bhc3MsIGV2ZW50LmRhdGEpLFxuICAgICAgICAgICAgICAgIFwiZHJpbGxEb3duVHlwZVwiOiBldmVudC5kcmlsbERvd25UeXBlLFxuICAgICAgICAgICAgICAgIFwiZHJpbGxkb3duRnJvbVwiOiBldmVudC5kcmlsbGRvd25Gcm9tXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZURhdGFTb3VyY2Uuc2V0KHZhbFsndmlld0lkJ10sIG9iailcblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2aWV3Lm5vZGVQcm9wZXJ0aWVzWydkaXNwbGF5J10gPSB0cnVlO1xuICAgICAgICAgICAgdmlldy5ub2RlUHJvcGVydGllc1snd2lkZ2V0UGFyYW1zJ10gPSBldmVudC50YWJsZVRpdGxlO1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ZWRJZCA9IGBpZC0ke3ZpZXcuaWR9YDtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtwcmVmaXhlZElkfWApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5sb2FkU2luZ2xlV2lkZ2V0Tm9kZSh2aWV3LCB0aGlzLm1haW5QYWdlRGl2RWxlbWVudCwgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0KTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKHRoaXMubWFpblBhZ2VEaXZFbGVtZW50KTtcbiAgICAgICAgICAgIH0sIDIwMCk7XG5cblxuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb246IE5hdmlnYXRpb25FeHRyYXMgPSB7XG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiBhcHBsaWVkRmlsdGVyc1snb3BlcmF0aW9uRmlsdGVyJ10sXG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwibWVyZ2VcIlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCBuYXZpZ2F0aW9uKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG5vZGUubm9kZVByb3BlcnRpZXNbJ2Rpc3BsYXknXSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAvLyBmb3Igcm93IGNsaWNrIGZ1bmN0aW9uXG4gIGdldFJvd0NsaWNrKGV2ZW50KSB7XG5cbiAgICBjb25zdCBzdGF0ZURhdGEgPSBBcnJheS5mcm9tKHRoaXMuc3RhdGVEYXRhU291cmNlLmtleXMoKSk7XG4gICAgY29uc3QgY3VycmVudFZpZXdJbmRleCA9IHN0YXRlRGF0YS5pbmRleE9mKGV2ZW50LnZpZXdJZCk7XG4gICAgY29uc3QgZGVsZXRlZFZpZXdJZHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gY3VycmVudFZpZXdJbmRleCArIDE7IGkgPCBzdGF0ZURhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlbGV0ZWRWaWV3SWRzLnB1c2goc3RhdGVEYXRhW2ldKTtcbiAgICB9XG4gICAgY29uc3QgaG91cmx5Tm9kZSA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNcbiAgICAgIC5tYXAod2lkZ2V0ID0+IHdpZGdldC53aWRnZXROb2RlLmZpbmQobm9kZSA9PiB0aGlzLmdldEhvdXJseURhdGEobm9kZSkpKVxuICAgICAgLmZpbmQobm9kZSA9PiBub2RlKTtcblxuICAgIGlmIChob3VybHlOb2RlICYmIGV2ZW50LmtleVRvUGFzcy5pbmNsdWRlcyhcInJlY29yZERhdGVcIikpIHtcbiAgICAgIHRoaXMuZ2V0Vmlld0J5Um93Q0xpY2tGb3JIb3VybHlDaGFydChldmVudCwgaG91cmx5Tm9kZSk7XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRWaWV3Tm9kZSA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNcbiAgICAgIC5tYXAod2lkZ2V0ID0+IHdpZGdldC53aWRnZXROb2RlLmZpbmQobm9kZSA9PiB0aGlzLmdldEVsZW1lbnRPZkN1cnJlbnRWaWV3KG5vZGUsIGV2ZW50LnZpZXdJZCkpKVxuICAgICAgLmZpbmQobm9kZSA9PiBub2RlKTtcbiAgICBpZiAoY3VycmVudFZpZXdOb2RlKSB7XG4gICAgICBjb25zdCBuZXh0Vmlld0luZGV4ID0gc3RhdGVEYXRhLmluZGV4T2YoZXZlbnQudmlld0lkKSArIDE7XG4gICAgICBjb25zdCBuZXh0VmlldyA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNcbiAgICAgICAgLm1hcCh3aWRnZXQgPT4gd2lkZ2V0LndpZGdldE5vZGVbbmV4dFZpZXdJbmRleF0pXG4gICAgICAgIC5maW5kKG5vZGUgPT4gbm9kZSk7XG5cbiAgICAgIGlmIChuZXh0Vmlldykge1xuICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgICAgIHRoaXMuZ2V0Vmlld0J5Um93Q0xpY2soZXZlbnQsIG5leHRWaWV3LCBkZWxldGVkVmlld0lkcywgY3VycmVudFZpZXdOb2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRWaWV3QnlSb3dDTGlja0ZvckhvdXJseUNoYXJ0KGV2ZW50LCBub2RlKSB7XG4gICAgbGV0IGFwaUNhbGxzID0gW107XG4gICAgY29uc3QgZGVsZXRlZFZpZXdJZHMgPSBbXTtcbiAgICBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgbGV0IGFwcGxpZWRGaWx0ZXJzID0gdGhpcy5nZXRTZXRPcGVyYXRvckZpbHRlcihldmVudCwgdGhpcy5zdGF0ZURhdGFTb3VyY2UuZ2V0KGl0ZW0udmlld0lkKSk7XG4gICAgICBsZXQgZm91bmQgPSAodGhpcy5kYXRhU2V0TW9kYWwgYXMgYW55W10pLmZpbmQoZCA9PiBkLmRhdGFzZXRJZCA9PT0gaXRlbS5kYXRhc2V0SWQpO1xuICAgICAgZGVsZXRlZFZpZXdJZHMucHVzaChpdGVtLnZpZXdJZCk7XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChmb3VuZCwgaXRlbS5kYXRhc2V0SWQsIGFwcGxpZWRGaWx0ZXJzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgUHJvbWlzZS5hbGwoYXBpQ2FsbHMpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0gdGhpcy5kYXRhc2V0U2VydmljZS5nZXRVbmlxdWVEYXRhU2V0T2JqZWN0KCk7XG4gICAgICAvLyBub2RlLm5vZGVQcm9wZXJ0aWVzWyd3aWRnZXRQYXJhbXMnXSA9IGV2ZW50LnRhYmxlVGl0bGU7XG4gICAgICB0aGlzLmxvYWRTaW5nbGVXaWRnZXROb2RlKG5vZGUsIHRoaXMubWFpblBhZ2VEaXZFbGVtZW50LCB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5tYWluUGFnZURpdkVsZW1lbnQpO1xuICAgICAgfSwgMjAwKTtcblxuICAgIH0pO1xuICAgIC8vIH1cbiAgICBjb25zb2xlLmxvZyh0aGlzLnN0YXRlRGF0YVNvdXJjZSk7XG4gIH1cblxuICBnZXRWaWV3QnlSb3dDTGljayhldmVudCwgdmlldywgZGVsZXRlZFZpZXdJZHMsIG5vZGUpIHtcbiAgICBsZXQgYXBpQ2FsbHMgPSBbXTtcbiAgICBsZXQgYXBwbGllZEZpbHRlcnMgPSB0aGlzLmdldFNldE9wZXJhdG9yRmlsdGVyKGV2ZW50LCB0aGlzLnN0YXRlRGF0YVNvdXJjZS5nZXQoZXZlbnQudmlld0lkKSk7XG4gICAgdmlldy5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaChjb250ZW50VmlldyA9PiB7XG4gICAgICBsZXQgZm91bmQgPSAodGhpcy5kYXRhU2V0TW9kYWwgYXMgYW55W10pLmZpbmQoZCA9PiBkLmRhdGFzZXRJZCA9PT0gY29udGVudFZpZXcuZGF0YXNldElkKTtcbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICBhcGlDYWxscy5wdXNoKHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0RGF0YUZyb21EYXRhU2V0KGZvdW5kLCBjb250ZW50Vmlldy5kYXRhc2V0SWQsIGFwcGxpZWRGaWx0ZXJzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgUHJvbWlzZS5hbGwoYXBpQ2FsbHMpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiBkZWxldGVkVmlld0lkcykge1xuICAgICAgICAgIGVsZW1lbnQud2lkZ2V0Tm9kZS5mb3JFYWNoKHZpZXdWYWx1ZSA9PiB7XG4gICAgICAgICAgICB2aWV3VmFsdWUuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2godmlld0lkID0+IHtcbiAgICAgICAgICAgICAgaWYgKHZpZXdJZC52aWV3SWQgPT0gZW50cnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdHMgPSB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZS5zb21lKGl0ZW0gPT4gaXRlbS52aWV3SWQgPT09IHZpZXdJZC52aWV3SWQpO1xuICAgICAgICAgICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdmlld0lkOiB2aWV3SWQudmlld0lkLFxuICAgICAgICAgICAgICAgICAgICB2aWV3TmFtZTogbm9kZS5ub2RlUHJvcGVydGllcy53aWRnZXRUaXRsZSxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheUtleTogdmlld0lkLmtwaUNvbmZpZy5rZXlUb1Bhc3NcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVEYXRhU291cmNlLmRlbGV0ZShlbnRyeSlcbiAgICAgICAgICAgICAgICB2aWV3VmFsdWUubm9kZVByb3BlcnRpZXNbJ2Rpc3BsYXknXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZWZpeGVkSWQgPSBgaWQtJHt2aWV3VmFsdWUuaWR9YDtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50VG9IaWRlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cHJlZml4ZWRJZH1gKSBhcyBIVE1MRWxlbWVudDsgLy8gQ2FzdCB0byBIVE1MRWxlbWVudFxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50VG9IaWRlKSB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50VG9IaWRlLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKGxldCBlbnRyeSBvZiBkZWxldGVkVmlld0lkcykge1xuICAgICAgICB2aWV3LmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKHZpZXdJZCA9PiB7XG4gICAgICAgICAgaWYgKHZpZXdJZC52aWV3SWQgPT0gZW50cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlLnNvbWUoaXRlbSA9PiBpdGVtLnZpZXdJZCA9PT0gdmlld0lkLnZpZXdJZCk7XG4gICAgICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZS5wdXNoKHtcbiAgICAgICAgICAgICAgICB2aWV3SWQ6IHZpZXdJZC52aWV3SWQsXG4gICAgICAgICAgICAgICAgdmlld05hbWU6IHZpZXcubm9kZVByb3BlcnRpZXMud2lkZ2V0VGl0bGUsXG4gICAgICAgICAgICAgICAgZGlzcGxheUtleTogdmlld0lkLmtwaUNvbmZpZy5rZXlUb1Bhc3NcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc3RhdGVEYXRhU291cmNlLmRlbGV0ZShlbnRyeSlcbiAgICAgICAgICAgIHZpZXcubm9kZVByb3BlcnRpZXNbJ2Rpc3BsYXknXSA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ZWRJZCA9IGBpZC0ke3ZpZXcuaWR9YDtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRUb0hpZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtwcmVmaXhlZElkfWApIGFzIEhUTUxFbGVtZW50OyAvLyBDYXN0IHRvIEhUTUxFbGVtZW50XG4gICAgICAgICAgICBpZiAoZWxlbWVudFRvSGlkZSkge1xuICAgICAgICAgICAgICBlbGVtZW50VG9IaWRlLnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlID0gdGhpcy5jb250ZXh0TWVudURhdGFTb3VyY2UuZmlsdGVyKGUgPT4gZS5kaXNwbGF5S2V5ICE9PSBldmVudC5rZXlUb1Bhc3MpO1xuICAgICAgdmlldy5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaCh2aWV3Zm9yRGF0YVNldCA9PiB7XG5cbiAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICBcImZpbHRlcnNcIjogYXBwbGllZEZpbHRlcnMsXG4gICAgICAgICAgXCJrZXlUb1Bhc3NcIjogdGhpcy51cGRhdGVPcGVyYXRvckRhdGEoZXZlbnQua2V5VG9QYXNzLCBldmVudC5kYXRhKSxcbiAgICAgICAgICBcImRyaWxsRG93blR5cGVcIjogZXZlbnQuZHJpbGxEb3duVHlwZSxcbiAgICAgICAgICBcImRyaWxsZG93bkZyb21cIjogZXZlbnQuZHJpbGxkb3duRnJvbVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGVEYXRhU291cmNlLnNldCh2aWV3Zm9yRGF0YVNldFsndmlld0lkJ10sIG9iailcbiAgICAgIH0pO1xuICAgICAgdmlldy5ub2RlUHJvcGVydGllc1snZGlzcGxheSddID0gdHJ1ZTtcbiAgICAgIHZpZXcubm9kZVByb3BlcnRpZXNbJ3dpZGdldFBhcmFtcyddID0gZXZlbnQudGFibGVUaXRsZTtcbiAgICAgIGNvbnN0IHByZWZpeGVkSWQgPSBgaWQtJHt2aWV3LmlkfWA7XG4gICAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cHJlZml4ZWRJZH1gKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCA9IHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0VW5pcXVlRGF0YVNldE9iamVjdCgpO1xuICAgICAgdGhpcy5sb2FkU2luZ2xlV2lkZ2V0Tm9kZSh2aWV3LCB0aGlzLm1haW5QYWdlRGl2RWxlbWVudCwgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0KTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKHRoaXMubWFpblBhZ2VEaXZFbGVtZW50KTtcbiAgICAgIH0sIDIwMCk7XG4gICAgICBsZXQgbmF2aWdhdGlvbjogTmF2aWdhdGlvbkV4dHJhcyA9IHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IGFwcGxpZWRGaWx0ZXJzWydvcGVyYXRpb25GaWx0ZXInXSxcbiAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogXCJtZXJnZVwiXG4gICAgICB9O1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIG5hdmlnYXRpb24pO1xuICAgIH0pO1xuICAgIC8vIH1cbiAgICBjb25zb2xlLmxvZyh0aGlzLnN0YXRlRGF0YVNvdXJjZSk7XG4gIH1cblxuICBzY3JvbGxUb0JvdHRvbShjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb250YWluZXIuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ2VuZCcgfSk7XG4gICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgIH0sIDApO1xuICB9XG5cbiAgZmluZFdpZGdldEJ5SWQoY29uZmlnczogYW55W10sIGlkOiBzdHJpbmcpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGNvbmZpZ3MpIHtcbiAgICAgIGlmIChjb25maWcuaWQgPT09IGlkKSB7XG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLndpZGdldE5vZGUgJiYgY29uZmlnLndpZGdldE5vZGUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZmluZFdpZGdldEJ5SWQoY29uZmlnLndpZGdldE5vZGUsIGlkKTtcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB1cGRhdGVPcGVyYXRvckRhdGEoa2V5X25hbWU6IHN0cmluZ1tdLCB2YWx1ZV9kYXRhOiBhbnkpOiBhbnkge1xuICAgIGxldCBvcGVyYXRvciA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleV9uYW1lKSB7XG4gICAgICBsZXQgb2JqOiBhbnkgPSB7fTtcbiAgICAgIG9ialtrZXldID0gdmFsdWVfZGF0YVtrZXldO1xuICAgICAgb3BlcmF0b3IucHVzaChvYmopXG4gICAgfVxuICAgIHJldHVybiBvcGVyYXRvcjtcbiAgfVxuXG5cbiAgZ2V0RWxlbWVudE9mQ3VycmVudFZpZXcobm9kZSwgdmlld0lkKSB7XG4gICAgY29uc3QgbWF0Y2hlZE9iamVjdCA9IG5vZGUuY29tcENvbmZpZy52aWV3Q29uZmlnLmZpbmQob2JqZWN0ID0+IG9iamVjdC52aWV3SWQgPT09IHZpZXdJZCk7XG4gICAgcmV0dXJuIG1hdGNoZWRPYmplY3QgPyBub2RlIDogbnVsbDtcbiAgfVxuICBnZXRIb3VybHlEYXRhKG5vZGUpIHtcbiAgICBjb25zdCBtYXRjaGVkT2JqZWN0ID0gbm9kZS5jb21wQ29uZmlnLnZpZXdDb25maWcuZmluZChvYmplY3QgPT4gb2JqZWN0LmtwaUNvbmZpZy5mb3JtYXRlID09PSAnaG91cmx5Jyk7XG4gICAgcmV0dXJuIG1hdGNoZWRPYmplY3QgPyBub2RlIDogbnVsbDtcbiAgfVxuXG4gIGdldFNldE9wZXJhdG9yRmlsdGVyKG9iamVjdERhdGEsIHByZXZpb3VzVmlld1N0YXRlcykge1xuXG4gICAgY29uc3QgeyBkYXRhLCBrZXlUb1Bhc3MgfSA9IG9iamVjdERhdGE7XG4gICAgY29uc3QgYXBwbGllZEZpbHRlciA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocHJldmlvdXNWaWV3U3RhdGVzLmZpbHRlcnMub3BlcmF0aW9uRmlsdGVyKSk7XG5cbiAgICBrZXlUb1Bhc3MuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKGtleSBpbiBkYXRhKSB7XG4gICAgICAgIGlmIChrZXkgPT09IFwicmVjb3JkRGF0ZVwiICYmIFwic3RhcnREYXRlXCIgaW4gYXBwbGllZEZpbHRlciAmJiBcImVuZERhdGVcIiBpbiBhcHBsaWVkRmlsdGVyKSB7XG4gICAgICAgICAgYXBwbGllZEZpbHRlci5zdGFydERhdGUgPSBkYXRhW2tleV07XG4gICAgICAgICAgYXBwbGllZEZpbHRlci5lbmREYXRlID0gZGF0YVtrZXldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFwcGxpZWRGaWx0ZXJba2V5XSA9IGRhdGFba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGRlZmF1bHRvcGVyYXRpb25GaWx0ZXIgPSB0aGlzLmdsb2JhbERlZmF1bHRGaWx0ZXIub3BlcmF0aW9uRmlsdGVyO1xuICAgIGlmIChkZWZhdWx0b3BlcmF0aW9uRmlsdGVyKSB7XG4gICAgICBPYmplY3Qua2V5cyhkZWZhdWx0b3BlcmF0aW9uRmlsdGVyKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGlmICghYXBwbGllZEZpbHRlci5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgYXBwbGllZEZpbHRlcltrZXldID0gZGVmYXVsdG9wZXJhdGlvbkZpbHRlcltrZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBvcGVyYXRpb25GaWx0ZXIgPSB7fTtcbiAgICBvcGVyYXRpb25GaWx0ZXJbJ29wZXJhdGlvbkZpbHRlciddID0gYXBwbGllZEZpbHRlcjtcbiAgICByZXR1cm4gb3BlcmF0aW9uRmlsdGVyO1xuICB9XG5cblxuICBnZXRSZWFyY2hSZXN1bHRGcm9tSW5wdXRCb3goaW5wdXRWYWx1ZSwgdmlld0NvbmZpZywgZmlsdGVyT2JqZWN0KSB7XG4gICAgbGV0IHZpZXcgPSB2aWV3Q29uZmlnO1xuICAgIGxldCBldmVudE5vZGUgPSB7IGRhdGE6IHt9LCBrZXlUb1Bhc3M6IFtdIH1cbiAgICBldmVudE5vZGUuZGF0YVtmaWx0ZXJPYmplY3Quc2VydmVyX2NvbHVtbl0gPSBpbnB1dFZhbHVlO1xuICAgIGV2ZW50Tm9kZVsna2V5VG9QYXNzJ10gPSBbZmlsdGVyT2JqZWN0LnNlcnZlcl9jb2x1bW5dO1xuICAgIGxldCBhcGlDYWxscyA9IFtdO1xuXG4gICAgdmlldy5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaChjb250ZW50VmlldyA9PiB7XG4gICAgICBsZXQgYXBwbGllZEZpbHRlcnMgPSB0aGlzLmdldFNldE9wZXJhdG9yRmlsdGVyKGV2ZW50Tm9kZSwgdGhpcy5zdGF0ZURhdGFTb3VyY2UuZ2V0KGNvbnRlbnRWaWV3LnZpZXdJZCkpO1xuICAgICAgbGV0IGZvdW5kID0gKHRoaXMuZGF0YVNldE1vZGFsIGFzIGFueVtdKS5maW5kKGQgPT4gZC5kYXRhc2V0SWQgPT09IGNvbnRlbnRWaWV3LmRhdGFzZXRJZCk7XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChmb3VuZCwgY29udGVudFZpZXcuZGF0YXNldElkLCBhcHBsaWVkRmlsdGVycykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHZpZXdDb25maWcubm9kZVByb3BlcnRpZXNbJ2Rpc3BsYXknXSA9IGZhbHNlO1xuICAgIGNvbnN0IHByZWZpeGVkSWQgPSBgaWQtJHt2aWV3Q29uZmlnLmlkfWA7XG4gICAgY29uc3QgZWxlbWVudFRvSGlkZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3ByZWZpeGVkSWR9YCkgYXMgSFRNTEVsZW1lbnQ7IC8vIENhc3QgdG8gSFRNTEVsZW1lbnRcbiAgICBpZiAoZWxlbWVudFRvSGlkZSkge1xuICAgICAgZWxlbWVudFRvSGlkZS5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICBQcm9taXNlLmFsbChhcGlDYWxscykudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldFVuaXF1ZURhdGFTZXRPYmplY3QoKTtcblxuICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgICAgdGhpcy5jb250ZXh0TWVudURhdGFTb3VyY2UgPSB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZS5maWx0ZXIoZSA9PiBlLmRpc3BsYXlLZXkgIT09IHZpZXdDb25maWcua2V5VG9QYXNzKTtcblxuICAgICAgdmlldy5ub2RlUHJvcGVydGllc1snZGlzcGxheSddID0gdHJ1ZTtcbiAgICAgIC8vIHZpZXcubm9kZVByb3BlcnRpZXNbJ3dpZGdldFBhcmFtcyddID0gZXZlbnQudGFibGVUaXRsZTtcbiAgICAgIGNvbnN0IHByZWZpeGVkSWQgPSBgaWQtJHt2aWV3LmlkfWA7XG4gICAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cHJlZml4ZWRJZH1gKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIHRoaXMubG9hZFNpbmdsZVdpZGdldE5vZGUodmlldywgdGhpcy5tYWluUGFnZURpdkVsZW1lbnQsIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSh0aGlzLm1haW5QYWdlRGl2RWxlbWVudCk7XG4gICAgICB9LCAyMDApO1xuICAgICAgbGV0IHBhcmFtcyA9IHt9O1xuICAgICAgcGFyYW1zW2ZpbHRlck9iamVjdC5zZXJ2ZXJfY29sdW1uXSA9IGlucHV0VmFsdWU7XG4gICAgICBsZXQgbmF2aWdhdGlvbjogTmF2aWdhdGlvbkV4dHJhcyA9IHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogXCJtZXJnZVwiXG4gICAgICB9O1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIG5hdmlnYXRpb24pO1xuICAgIH0pO1xuICB9XG5cblxuICBzdWJtaXRGaWx0ZXIoKSB7XG4gICAgbGV0IHZpZXcgPSB0aGlzLm5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZS52aWV3Q29uZmlnO1xuICAgIC8vIGxldCBjYWxfdmFsdWUgPSAocGFyc2VGbG9hdChzZWFyY2hUZXJtKSAvIDEwMClcbiAgICBsZXQgYXBpQ2FsbHMgPSBbXTtcbiAgICB0aGlzLmhhdmluZ0RhdGFPYmplY3QgPSB0aGlzLm5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZS5oYXZpbmdDb25maWcuZmlsdGVyKHZhbHVlID0+IHZhbHVlLnZhbHVlICE9PSBcIlwiKTtcbiAgICB2aWV3LmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKGNvbnRlbnRWaWV3ID0+IHtcbiAgICAgIGxldCBhcHBsaWVkRmlsdGVycyA9IHRoaXMuc3RhdGVEYXRhU291cmNlLmdldChjb250ZW50Vmlldy52aWV3SWQpO1xuICAgICAgbGV0IGZvdW5kID0gKHRoaXMuZGF0YVNldE1vZGFsIGFzIGFueVtdKS5maW5kKGQgPT4gZC5kYXRhc2V0SWQgPT09IGNvbnRlbnRWaWV3LmRhdGFzZXRJZCk7XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChmb3VuZCwgY29udGVudFZpZXcuZGF0YXNldElkLCBhcHBsaWVkRmlsdGVycy5maWx0ZXJzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgUHJvbWlzZS5hbGwoYXBpQ2FsbHMpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0gdGhpcy5kYXRhc2V0U2VydmljZS5nZXRVbmlxdWVEYXRhU2V0T2JqZWN0KCk7XG5cbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlLnZpZXdDb25maWcubm9kZVByb3BlcnRpZXNbJ2Rpc3BsYXknXSA9IGZhbHNlO1xuICAgICAgY29uc3QgcHJlZml4ZWRJZCA9IGBpZC0ke3RoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlLnZpZXdDb25maWcuaWR9YDtcbiAgICAgIGNvbnN0IGVsZW1lbnRUb0hpZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtwcmVmaXhlZElkfWApIGFzIEhUTUxFbGVtZW50OyAvLyBDYXN0IHRvIEhUTUxFbGVtZW50XG4gICAgICBpZiAoZWxlbWVudFRvSGlkZSkge1xuICAgICAgICBlbGVtZW50VG9IaWRlLnJlbW92ZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgICB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZSA9IHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlLmZpbHRlcihlID0+IGUuZGlzcGxheUtleSAhPT0gdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2Uudmlld0NvbmZpZy5rZXlUb1Bhc3MpO1xuICAgICAgdGhpcy5pc1dpZGdldEZpbHRlcnMgPSBmYWxzZTtcbiAgICAgIHZpZXcubm9kZVByb3BlcnRpZXNbJ2Rpc3BsYXknXSA9IHRydWU7XG4gICAgICAvLyB2aWV3Lm5vZGVQcm9wZXJ0aWVzWyd3aWRnZXRQYXJhbXMnXSA9IGV2ZW50LnRhYmxlVGl0bGU7XG4gICAgICAvLyBjb25zdCBwcmVmaXhlZElkID0gYGlkLSR7dmlldy5pZH1gO1xuICAgICAgLy8gY29uc3QgY29udGFpbmVyRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3ByZWZpeGVkSWR9YCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICB0aGlzLmxvYWRTaW5nbGVXaWRnZXROb2RlKHZpZXcsIHRoaXMubWFpblBhZ2VEaXZFbGVtZW50LCB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5tYWluUGFnZURpdkVsZW1lbnQpO1xuICAgICAgfSwgMjAwKTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgZ2V0V2lkZ2V0RmlsdGVyRm9yVGVtcGxhdGUodmFsdWUpIHtcbiAgICBsZXQgYXBpQ2FsbHMgPSBbXTtcbiAgICBjb25zdCBkZWxldGVkVmlld0lkcyA9IFtdO1xuICAgIHZhbHVlLnZpZXdOb2Rlcy5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGxldCB3aWRnZXRGaWx0ZXIgPSB0aGlzLnN0YXRlRGF0YVNvdXJjZS5nZXQoaXRlbS52aWV3SWQpO1xuICAgICAgbGV0IGFwcGxpZWRGaWx0ZXJzID0gd2lkZ2V0RmlsdGVyLmZpbHRlcnM7XG4gICAgICBsZXQgZm91bmQgPSAodGhpcy5kYXRhU2V0TW9kYWwgYXMgYW55W10pLmZpbmQoZCA9PiBkLmRhdGFzZXRJZCA9PT0gaXRlbS5kYXRhc2V0SWQpO1xuICAgICAgZGVsZXRlZFZpZXdJZHMucHVzaChpdGVtLnZpZXdJZCk7XG4gICAgICBjb25zdCBoYXZpbmcgPSBPYmplY3QuZW50cmllcyh2YWx1ZS5vcGVyYXRpb25GaWx0ZXIpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICBjb2x1bW5OYW1lOiBrZXksXG4gICAgICAgIGRhdGFUeXBlOiBcImZsb2F0XCIsXG4gICAgICAgIG9wZXJhdG9yOiBcImd0ZVwiLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pKTtcblxuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIGZvdW5kLmNvbmZpZy5xdWVyeUNvbmZpZ1snaGF2aW5ncyddID0gaGF2aW5nO1xuICAgICAgICBhcGlDYWxscy5wdXNoKHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0RGF0YUZyb21EYXRhU2V0KGZvdW5kLCBpdGVtLmRhdGFzZXRJZCwgYXBwbGllZEZpbHRlcnMpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBQcm9taXNlLmFsbChhcGlDYWxscykudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldFVuaXF1ZURhdGFTZXRPYmplY3QoKTtcbiAgICAgIC8vIHZhbHVlLnZpZXdOb2Rlcy5ub2RlUHJvcGVydGllc1snd2lkZ2V0UGFyYW1zJ10gPSBldmVudC50YWJsZVRpdGxlO1xuICAgICAgdGhpcy5sb2FkU2luZ2xlV2lkZ2V0Tm9kZSh2YWx1ZS52aWV3Tm9kZXMsIHRoaXMubWFpblBhZ2VEaXZFbGVtZW50LCB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5tYWluUGFnZURpdkVsZW1lbnQpO1xuICAgICAgfSwgMjAwKTtcblxuICAgIH0pO1xuICAgIC8vIH1cbiAgfVxuXG59XG4iLCI8YXBwLWxvYWRpbmcgKm5nSWY9XCJsb2FkaW5nTW9kYWxcIj48L2FwcC1sb2FkaW5nPlxuXG48ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIFwiICNkeW5hbWljQ29udGFpbmVyPjwvZGl2PlxuPC9kaXY+Il19