gamma-app-controller 1.1.9 → 1.1.12

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 (31) hide show
  1. package/esm2020/lib/application-controller/application-controller.module.mjs +10 -4
  2. package/esm2020/lib/application-controller/application-dataset-call.service.mjs +19 -4
  3. package/esm2020/lib/application-controller/application-dataset-component/application-dataset/application-dataset.component.mjs +19 -4
  4. package/esm2020/lib/application-controller/application-dataset-component/create-dataset-json/create-dataset-json.component.mjs +1 -1
  5. package/esm2020/lib/application-controller/application-dataset-component/create-dataset-sql/create-dataset-sql.component.mjs +5 -5
  6. package/esm2020/lib/application-controller/application-dataset-component/dataset-query-bulder/dataset-query-bulder.component.mjs +6 -5
  7. package/esm2020/lib/application-controller/application-dataset-component/dataset-rest-api/dataset-rest-api.component.mjs +5 -5
  8. package/esm2020/lib/application-controller/application-filter/application-filter.component.mjs +12 -7
  9. package/esm2020/lib/application-controller/application-menu-controller/application-create-menu/application-create-menu.component.mjs +25 -6
  10. package/esm2020/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.mjs +28 -7
  11. package/esm2020/lib/application-controller/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.mjs +50 -26
  12. package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.mjs +3 -8
  13. package/esm2020/lib/application-controller/shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component.mjs +154 -26
  14. package/esm2020/lib/application-controller/shared/advanced-component/google-geo-map/google-geo-map.component.mjs +124 -2
  15. package/esm2020/lib/application-controller/support-components/dash-chart/dash-chart.component.mjs +5 -5
  16. package/esm2020/lib/application-controller/support-components/dash-table/dash-table.component.mjs +9 -21
  17. package/esm2020/lib/application-controller/support-components/dash-today-previous/dash-today-previous.component.mjs +1 -2
  18. package/esm2020/lib/application-controller/support-components/geo-map/geo-map.component.mjs +36 -4
  19. package/esm2020/lib/application-controller/support-components/single-card/single-card.component.mjs +274 -0
  20. package/fesm2015/gamma-app-controller.mjs +799 -169
  21. package/fesm2015/gamma-app-controller.mjs.map +1 -1
  22. package/fesm2020/gamma-app-controller.mjs +795 -168
  23. package/fesm2020/gamma-app-controller.mjs.map +1 -1
  24. package/lib/application-controller/application-controller.module.d.ts +12 -11
  25. package/lib/application-controller/application-menu-controller/application-create-menu/application-create-menu.component.d.ts +1 -0
  26. package/lib/application-controller/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.d.ts +13 -3
  27. package/lib/application-controller/shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component.d.ts +4 -0
  28. package/lib/application-controller/shared/advanced-component/google-geo-map/google-geo-map.component.d.ts +4 -0
  29. package/lib/application-controller/support-components/geo-map/geo-map.component.d.ts +11 -0
  30. package/lib/application-controller/support-components/single-card/single-card.component.d.ts +59 -0
  31. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
1
  import { Component, EventEmitter, Input, Output, ViewChild, } from "@angular/core";
2
+ import moment from "moment";
2
3
  import * as i0 from "@angular/core";
3
4
  import * as i1 from "../../../common";
4
5
  import * as i2 from "@angular/common";
@@ -21,6 +22,7 @@ export class GoogleGeoMapComponent {
21
22
  this.isLoader = true;
22
23
  this.page_config = value;
23
24
  this.page_parms = value.titleParams;
25
+ this.sortBy = value.kpiConfig?.dataConfig?.sortBy;
24
26
  if (value.kpiConfig.dataSource &&
25
27
  value.kpiConfig.dataSource.length !== 0) {
26
28
  if (value.kpiConfig.formate == "monthly") {
@@ -53,6 +55,14 @@ export class GoogleGeoMapComponent {
53
55
  this.isLoader = false;
54
56
  }, 200);
55
57
  }
58
+ else if (this.mapTYpe == "bubbleMap") {
59
+ this.locations = value.kpiConfig.dataSource;
60
+ this.chartHeight = `${value.kpiConfig.dataConfig.size}px`;
61
+ this.tootTipColumn = value.kpiConfig.dataConfig.chart_config;
62
+ this.mapOptionForHeatMap = {
63
+ zoom: this.zoomValuForAll
64
+ };
65
+ }
56
66
  else {
57
67
  this.locations = value.kpiConfig.dataSource;
58
68
  this.chartHeight = `${value.kpiConfig.dataConfig.size}px`;
@@ -63,6 +73,27 @@ export class GoogleGeoMapComponent {
63
73
  };
64
74
  }
65
75
  }
76
+ else if (value.kpiConfig.formate == "daily") {
77
+ this.mapTYpe = value.kpiConfig.dataConfig.mapType;
78
+ const sortedData = value.kpiConfig.dataSource
79
+ .filter(record => record[this.sortBy])
80
+ .sort((a, b) => moment(b[this.sortBy]).diff(moment(a[this.sortBy])));
81
+ const mostRecentRecord = sortedData[0];
82
+ if (value.endDate) {
83
+ this.filteredObjects = sortedData.filter(data => data[this.sortBy] === value.endDate);
84
+ }
85
+ else {
86
+ this.filteredObjects = sortedData.filter(data => data[this.sortBy] === mostRecentRecord[this.sortBy]);
87
+ }
88
+ if (this.mapTYpe == "bubbleMap") {
89
+ this.locations = this.filteredObjects;
90
+ this.chartHeight = `${value.kpiConfig.dataConfig.size}px`;
91
+ this.tootTipColumn = value.kpiConfig.dataConfig.chart_config;
92
+ this.mapOptionForHeatMap = {
93
+ zoom: this.zoomValuForAll
94
+ };
95
+ }
96
+ }
66
97
  }
67
98
  }
68
99
  }
@@ -87,6 +118,11 @@ export class GoogleGeoMapComponent {
87
118
  this.initializeHeatWithMarkerMap(this.locations);
88
119
  }
89
120
  }
121
+ else {
122
+ this.isLoader = false;
123
+ this.initializeMap();
124
+ this.addBubbleMarkers();
125
+ }
90
126
  }
91
127
  loadGoogleCharts() {
92
128
  google.charts.load("current", {
@@ -145,6 +181,43 @@ export class GoogleGeoMapComponent {
145
181
  }
146
182
  initializeMap() {
147
183
  const mapOptions = this.mapOptionForHeatMap;
184
+ if (this.mapTYpe == "bubbleMap") {
185
+ mapOptions['styles'] = [
186
+ {
187
+ featureType: 'all',
188
+ stylers: [
189
+ { saturation: -100 },
190
+ { lightness: 70 },
191
+ { visibility: 'simplified' },
192
+ ],
193
+ },
194
+ {
195
+ featureType: 'administrative.country',
196
+ elementType: 'labels',
197
+ stylers: [
198
+ { lightness: -30 },
199
+ { visibility: 'on' },
200
+ { fontWeight: 'bold' },
201
+ { fontSize: '12px' }
202
+ ],
203
+ },
204
+ {
205
+ featureType: "administrative.country",
206
+ elementType: "geometry.stroke",
207
+ stylers: [
208
+ { lightness: -40 },
209
+ { weight: 1.5 },
210
+ ],
211
+ },
212
+ {
213
+ featureType: "administrative.country",
214
+ elementType: "geometry.fill",
215
+ stylers: [
216
+ { lightness: 90 }
217
+ ]
218
+ }
219
+ ];
220
+ }
148
221
  this.map = new google.maps.Map(this.googlMap.nativeElement, mapOptions);
149
222
  this.googlMap.nativeElement.style.height = this.chartHeight;
150
223
  }
@@ -163,7 +236,7 @@ export class GoogleGeoMapComponent {
163
236
  width: 32,
164
237
  height: 32,
165
238
  },
166
- } : '',
239
+ } : "",
167
240
  map: this.map,
168
241
  title: `${location.city}: $${location.total_sales_amount}`,
169
242
  });
@@ -293,6 +366,55 @@ export class GoogleGeoMapComponent {
293
366
  this.markers.forEach((marker) => marker.setMap(this.map));
294
367
  }
295
368
  }
369
+ addBubbleMarkers() {
370
+ this.prepareBubbleData();
371
+ this.locations.forEach((location) => {
372
+ const marker = new google.maps.Marker({
373
+ position: {
374
+ lat: parseFloat(location[this.page_config.kpiConfig.dataConfig.markerLatitude]),
375
+ lng: parseFloat(location[this.page_config.kpiConfig.dataConfig.markerLongitude]),
376
+ },
377
+ icon: {
378
+ path: google.maps.SymbolPath.CIRCLE,
379
+ scale: Math.round(location.sales_percentage),
380
+ fillColor: this.page_config.kpiConfig.dataConfig.bubbleColor,
381
+ fillOpacity: 0.6,
382
+ strokeWeight: 0,
383
+ },
384
+ map: this.map,
385
+ title: `${location.city}: $${location[this.page_config.kpiConfig.dataConfig.agrumentValue]}`,
386
+ });
387
+ this.bounds.extend(marker.getPosition());
388
+ this.markers.push(marker);
389
+ let stringWithoutQuotes = this.getInfoWindoData(location);
390
+ const infoWIndowData = this.getInfoWindoData(location);
391
+ const infoWindow = new google.maps.InfoWindow({
392
+ content: `<div style="height: 100%; width: 100%; color: black; font-size: 20px;">
393
+ ${infoWIndowData}
394
+ </div>`,
395
+ });
396
+ marker.addListener("click", () => {
397
+ if (this.currentInfoWindow) {
398
+ this.currentInfoWindow.close();
399
+ }
400
+ infoWindow.open(this.map, marker);
401
+ this.currentInfoWindow = infoWindow;
402
+ });
403
+ });
404
+ this.map.fitBounds(this.bounds);
405
+ }
406
+ prepareBubbleData() {
407
+ const minSales = Math.min(...this.locations.map(d => d[this.page_config.kpiConfig.dataConfig.agrumentValue]));
408
+ const maxSales = Math.max(...this.locations.map(d => d[this.page_config.kpiConfig.dataConfig.agrumentValue]));
409
+ const minPercentage = this.page_config.kpiConfig.dataConfig.bubbleMinimumSize;
410
+ const maxPercentage = this.page_config.kpiConfig.dataConfig.bubbleMaximumSize;
411
+ const normalize = (value, min, max) => {
412
+ return ((value - min) / (max - min)) * (maxPercentage - minPercentage) + minPercentage;
413
+ };
414
+ this.locations.forEach(d => {
415
+ d.sales_percentage = Math.min(Math.max(normalize(d[this.page_config.kpiConfig.dataConfig.agrumentValue], minSales, maxSales), minPercentage), maxPercentage);
416
+ });
417
+ }
296
418
  }
297
419
  GoogleGeoMapComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GoogleGeoMapComponent, deps: [{ token: i1.CommonService }], target: i0.ɵɵFactoryTarget.Component });
298
420
  GoogleGeoMapComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GoogleGeoMapComponent, selector: "app-google-geo-map", inputs: { rightClickEnable: "rightClickEnable", chartDataSource: "chartDataSource" }, outputs: { getTableConfigOutPut: "getTableConfigOutPut", oRowClick: "oRowClick", onrightClickContextSelection: "onrightClickContextSelection" }, viewQueries: [{ propertyName: "googlMap", first: true, predicate: ["googlMap"], descendants: true }], ngImport: i0, template: "\n<div class=\"mx-2 bg-gray-800\">\n <ng-container *ngIf=\"isLoader\">\n <div class=\"flex justify-center items-start bg-gray-800 p-2\">\n <app-loader></app-loader>\n </div>\n </ng-container>\n\n <div class=\"mx-2 pb-2\">\n\n <ng-container>\n <!-- <div id=\"regions_div\" style=\"width: 100%\" ></div> -->\n <div id=\"regions_div\" #googlMap style=\"width: 100%\" ></div> \n </ng-container>\n \n \n\n </div>\n\n\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.LoaderComponent, selector: "app-loader" }] });
@@ -314,4 +436,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
314
436
  type: Input,
315
437
  args: ["chartDataSource"]
316
438
  }] } });
317
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLWdlby1tYXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ29vZ2xlLWdlby1tYXAvZ29vZ2xlLWdlby1tYXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ29vZ2xlLWdlby1tYXAvZ29vZ2xlLWdlby1tYXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7Ozs7O0FBU3ZCLE1BQU0sT0FBTyxxQkFBcUI7SUFrR2hDLFlBQW1CLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBekY5Qix5QkFBb0IsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM3RCxjQUFTLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbEQsaUNBQTRCLEdBQzNDLElBQUksWUFBWSxFQUFFLENBQUM7UUFDWixxQkFBZ0IsR0FBWSxJQUFJLENBQUM7UUFlMUMsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUliLFdBQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFrRVcsQ0FBQztJQWhFcEQsSUFDSSxlQUFlLENBQUMsS0FBSztRQUN2QixJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDN0MsT0FB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QyxDQUFDLENBQUM7U0FDdkQ7YUFBTTtZQUVMLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzNEO0lBQ0gsQ0FBQzs7a0hBaGFVLHFCQUFxQjtzR0FBckIscUJBQXFCLHVZQ2xCbEMsb2ZBcUJBOzJGREhhLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxvQkFBb0I7b0dBS1AsUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVO2dCQVFKLG9CQUFvQjtzQkFBcEMsTUFBTTtnQkFDVSxTQUFTO3NCQUF6QixNQUFNO2dCQUNVLDRCQUE0QjtzQkFBNUMsTUFBTTtnQkFFRSxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBc0JGLGVBQWU7c0JBRGxCLEtBQUs7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9jb21tb25cIjtcbmRlY2xhcmUgdmFyIGdvb2dsZTogYW55O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiYXBwLWdvb2dsZS1nZW8tbWFwXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vZ29vZ2xlLWdlby1tYXAuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2dvb2dsZS1nZW8tbWFwLmNvbXBvbmVudC5zY3NzXCJdLFxufSlcbmV4cG9ydCBjbGFzcyBHb29nbGVHZW9NYXBDb21wb25lbnQge1xuICBAVmlld0NoaWxkKFwiZ29vZ2xNYXBcIikgZ29vZ2xNYXA6IEVsZW1lbnRSZWY7XG4gIGNoYXJEYXRhOiBhbnk7XG4gIGNoYXJ0SGVpZ2h0OiBhbnk7XG4gIGJhY2dyb3VuZENvbG9yOiBhbnk7XG4gIG1hcENvbG9yczogYW55O1xuICBjaGFydFR5cGU6IGFueTtcbiAgdG9vdFRpcENvbHVtbjogYW55O1xuICByZWdpb246IGFueTtcbiAgQE91dHB1dCgpIHB1YmxpYyBnZXRUYWJsZUNvbmZpZ091dFB1dDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgb1Jvd0NsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBvbnJpZ2h0Q2xpY2tDb250ZXh0U2VsZWN0aW9uOiBFdmVudEVtaXR0ZXI8YW55PiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcigpO1xuICBASW5wdXQoKSByaWdodENsaWNrRW5hYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgaXNMb2FkZXI6IGJvb2xlYW47XG4gIHBhZ2VfY29uZmlnOiBhbnk7XG4gIHBhZ2VfcGFybXM6IGFueTtcbiAgcmVnaW9uQ29kZTogYW55O1xuICAvLyBoZWF0IE1hcCBzdGFydFxuICBtYXA6IGFueTtcbiAgbG9jYXRpb25zO1xuICBtYXBUWXBlOiBhbnk7XG4gIG1hcE9wdGlvbkZvckhlYXRNYXA6IHtcbiAgICB6b29tOiBudW1iZXI7XG4gIH07XG4gIGN1cnJlbnRJbmZvV2luZG93OiBhbnk7IC8vIFRyYWNrIHRoZSBvcGVuIEluZm9XaW5kb3dcbiAgLy8gaGVhdCBNYXAgZW5kXG4gIC8vaGVhdCBvbmx5IG1hcCBzdGFydCAvL1xuICBtYXJrZXJzID0gW107XG4gIGhlYXRtYXA6IGFueTtcbiAgaGVhdG1hcERhdGE6IGFueTtcbiAgem9vbVZhbHVGb3JBbGw6IG51bWJlcjtcbiAgYm91bmRzID0gbmV3IGdvb2dsZS5tYXBzLkxhdExuZ0JvdW5kcygpO1xuICAvL2hlYXQgb25seSBtYXAgZW5kIC8vXG4gIEBJbnB1dChcImNoYXJ0RGF0YVNvdXJjZVwiKVxuICBzZXQgY2hhcnREYXRhU291cmNlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNMb2FkZXIgPSB0cnVlO1xuICAgICAgdGhpcy5wYWdlX2NvbmZpZyA9IHZhbHVlO1xuICAgICAgdGhpcy5wYWdlX3Bhcm1zID0gdmFsdWUudGl0bGVQYXJhbXM7XG5cbiAgICAgIC8vIHRoaXMuaW5Sb2FtZXJHZW9DaGFydC5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9ICcnO1xuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZS5rcGlDb25maWcuZGF0YVNvdXJjZSAmJlxuICAgICAgICB2YWx1ZS5rcGlDb25maWcuZGF0YVNvdXJjZS5sZW5ndGggIT09IDBcbiAgICAgICkge1xuICAgICAgICBpZiAodmFsdWUua3BpQ29uZmlnLmZvcm1hdGUgPT0gXCJtb250aGx5XCIpIHtcbiAgICAgICAgICB0aGlzLm1hcFRZcGUgPSB2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZy5tYXBUeXBlO1xuICAgICAgICAgIGlmICh0aGlzLm1hcFRZcGUgPT0gXCJnZW9NYXBcIikge1xuICAgICAgICAgICAgdGhpcy5yZWdpb24gPSB2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZy5yZWdpb247XG4gICAgICAgICAgICB0aGlzLnJlZ2lvbkNvZGUgPSB2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZy5yZWdpb25Db2RlO1xuICAgICAgICAgICAgdGhpcy50b290VGlwQ29sdW1uID0gdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcuY2hhcnRfY29uZmlnO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB2YWx1ZS5rcGlDb25maWcuZGF0YVNvdXJjZTtcbiAgICAgICAgICAgIHRoaXMuY2hhcnRIZWlnaHQgPSBgJHt2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZy5zaXplfXB4YDtcbiAgICAgICAgICAgIHRoaXMuY2hhcnRUeXBlID0gdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcuY2hhcnRUeXBlO1xuICAgICAgICAgICAgdGhpcy5iYWNncm91bmRDb2xvciA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgICAgIHRoaXMubWFwQ29sb3JzID0gdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcuY29sb3JzO1xuICAgICAgICAgICAgLy8gbGV0IGNvbmZpZyA9IHZhbHVlLmNoYXJ0Q29uZmlnO1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0YSA9IFtcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnW1wiYXJndW1lbnRGaWVsZFwiXSxcbiAgICAgICAgICAgICAgICB2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZ1tcImNoYXJ0VmFsdWVGaWVsZFwiXSxcbiAgICAgICAgICAgICAgICB7IHR5cGU6IFwic3RyaW5nXCIsIHJvbGU6IFwidG9vbHRpcFwiLCBwOiB7IGh0bWw6IHRydWUgfSB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgXS5jb25jYXQoXG4gICAgICAgICAgICAgIGRhdGEubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vbHRpcCA9IHRoaXMuZ2V0VG9vbHRpcChpdGVtKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgaXRlbVt2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZ1tcImFyZ3VtZW50RmllbGRcIl1dLFxuICAgICAgICAgICAgICAgICAgaXRlbVt2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZ1tcImNoYXJ0VmFsdWVGaWVsZFwiXV0sXG4gICAgICAgICAgICAgICAgICB0b29sdGlwLFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5jaGFyRGF0YSA9IGZvcm1hdHRlZERhdGE7XG4gICAgICAgICAgICAvLyB0aGlzLmxvYWRHb29nbGVDaGFydHMoKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmlzTG9hZGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgIC8vIHRoaXMubG9hZEdvb2dsZUNoYXJ0cygpO1xuICAgICAgICAgICAgfSwgMjAwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2NhdGlvbnMgPSB2YWx1ZS5rcGlDb25maWcuZGF0YVNvdXJjZTtcbiAgICAgICAgICAgIHRoaXMuY2hhcnRIZWlnaHQgPSBgJHt2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZy5zaXplfXB4YDtcbiAgICAgICAgICAgIHRoaXMudG9vdFRpcENvbHVtbiA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZztcbiAgICAgICAgICAgIHRoaXMuem9vbVZhbHVGb3JBbGwgPSBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICB0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLnpvb21cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLm1hcE9wdGlvbkZvckhlYXRNYXAgPSB7XG4gICAgICAgICAgICAgIHpvb206IHRoaXMuem9vbVZhbHVGb3JBbGxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHVibGljIGNvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIHRoaXMubG9hZEdvb2dsZUhlYXRPbmx5TWFwcyh0aGlzLmxvY2F0aW9ucyk7XG5cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tYXBUWXBlID09IFwiZ2VvTWFwXCIpIHtcbiAgICAgIHRoaXMubG9hZEdvb2dsZUNoYXJ0cygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tYXBUWXBlID09IFwiaGVhdE1hcFwiKSB7XG4gICAgICBpZiAodGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5oZWF0TWFwQ2F0ZWdvcnkgPT0gXCJoZWF0TWFwT25seVwiKSB7XG4gICAgICAgIHRoaXMuaXNMb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2FkR29vZ2xlSGVhdE9ubHlNYXBzKHRoaXMubG9jYXRpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5oZWF0TWFwQ2F0ZWdvcnkgPT0gXCJoZWF0TWFwTWFya2VyXCIpIHtcbiAgICAgICAgdGhpcy5pc0xvYWRlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVNYXAoKTtcbiAgICAgICAgdGhpcy5hZGRNYXJrZXJzKCk7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXNMb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplSGVhdFdpdGhNYXJrZXJNYXAodGhpcy5sb2NhdGlvbnMpO1xuXG4gICAgICB9XG5cbiAgICB9XG4gIH1cbiAgLy8gIEdlbyBNYXAgc3RhcnQgLy9cbiAgbG9hZEdvb2dsZUNoYXJ0cygpIHtcbiAgICBnb29nbGUuY2hhcnRzLmxvYWQoXCJjdXJyZW50XCIsIHtcbiAgICAgIHBhY2thZ2VzOiBbdGhpcy5jaGFydFR5cGVdLFxuICAgIH0pO1xuICAgIGdvb2dsZS5jaGFydHMuc2V0T25Mb2FkQ2FsbGJhY2sodGhpcy5kcmF3Q2hhcnQuYmluZCh0aGlzKSk7XG4gIH1cblxuICBkcmF3Q2hhcnQoKSB7XG4gICAgY29uc3QgZGF0YSA9IGdvb2dsZS52aXN1YWxpemF0aW9uLmFycmF5VG9EYXRhVGFibGUodGhpcy5jaGFyRGF0YSk7XG5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5nZXRPcHRpb25Db25maWcoKTtcblxuICAgIC8vIG9wdGlvbnNbJ2RhdGFNb2RlJ10gPSAncmVnaW9ucyc7XG5cbiAgICBjb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5HZW9DaGFydChcbiAgICAgIHRoaXMuZ29vZ2xNYXAubmF0aXZlRWxlbWVudFxuICAgICk7XG4gICAgdGhpcy5nb29nbE1hcC5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IHRoaXMuY2hhcnRIZWlnaHQ7XG5cbiAgICBjaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpO1xuICB9XG5cbiAgZ2V0VG9vbHRpcChkYXRhKSB7XG4gICAgbGV0IHRvb2xUaXBEYXRhID0gXCJcIjtcbiAgICB0aGlzLnRvb3RUaXBDb2x1bW4uZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBkYXRhW2VsZW1lbnQuZGF0YUZpZWxkXSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICB0b29sVGlwRGF0YSArPVxuICAgICAgICAgIFwiPGRpdiBjbGFzcz0naW5saW5lJz48Yj5cIiArXG4gICAgICAgICAgZWxlbWVudC5jYXB0aW9uICtcbiAgICAgICAgICBcIjo8L2I+PC9kaXY+IFwiICtcbiAgICAgICAgICB0aGlzLmNvbW1vblNlcnZpY2Uucm91bmRPZmZUaWxsVHdvKGRhdGFbZWxlbWVudC5kYXRhRmllbGRdLCAyKSArXG4gICAgICAgICAgXCI8YnIgLz5cIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvb2xUaXBEYXRhICs9XG4gICAgICAgICAgXCI8ZGl2IGNsYXNzPSdpbmxpbmUnPjxiPlwiICtcbiAgICAgICAgICBlbGVtZW50LmNhcHRpb24gK1xuICAgICAgICAgIFwiOjwvYj48L2Rpdj4gXCIgK1xuICAgICAgICAgIGRhdGFbZWxlbWVudC5kYXRhRmllbGRdICtcbiAgICAgICAgICBcIjxiciAvPlwiO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0b29sVGlwRGF0YTtcbiAgfVxuXG4gIGdldE9wdGlvbkNvbmZpZygpIHtcbiAgICBpZiAodGhpcy5yZWdpb24gPT0gXCJjaXR5XCIpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIHJlZ2lvbjogdGhpcy5yZWdpb25Db2RlLFxuICAgICAgICBkaXNwbGF5TW9kZTogXCJtYXJrZXJzXCIsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5iYWNncm91bmRDb2xvcixcbiAgICAgICAgdG9vbHRpcDogeyBpc0h0bWw6IHRydWUgfSxcbiAgICAgICAgY29sb3JBeGlzOiB7IGNvbG9yczogdGhpcy5tYXBDb2xvcnMgfSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLmJhY2dyb3VuZENvbG9yLFxuICAgICAgICB0b29sdGlwOiB7IGlzSHRtbDogdHJ1ZSB9LFxuICAgICAgICBjb2xvckF4aXM6IHsgY29sb3JzOiB0aGlzLm1hcENvbG9ycyB9LFxuICAgICAgfTtcbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cbiAgfVxuXG4gIC8vICBHZW8gTWFwIGVuZCAvL1xuXG4gIC8vIEhlYXQgTWFwIHN0YXJ0IC8vXG4gIGluaXRpYWxpemVNYXAoKTogdm9pZCB7XG4gICAgY29uc3QgbWFwT3B0aW9ucyA9IHRoaXMubWFwT3B0aW9uRm9ySGVhdE1hcDtcbiAgICAvLyB7XG4gICAgLy8gICBjZW50ZXI6IHsgbGF0OiAzNy4wOTAyLCBsbmc6IC05NS43MTI5IH0sIC8vIENlbnRlciBvZiB0aGUgVVNBXG4gICAgLy8gICB6b29tOiA1LFxuICAgIC8vIH07XG5cbiAgICB0aGlzLm1hcCA9IG5ldyBnb29nbGUubWFwcy5NYXAoXG4gICAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlZ2lvbnNfZGl2XCIpICxcbiAgICAgIHRoaXMuZ29vZ2xNYXAubmF0aXZlRWxlbWVudCxcbiAgICAgIG1hcE9wdGlvbnNcbiAgICApO1xuICAgIHRoaXMuZ29vZ2xNYXAubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLmNoYXJ0SGVpZ2h0O1xuICB9XG5cbiAgLy8gQWRkIG1hcmtlcnMgdG8gdGhlIG1hcFxuICBhZGRNYXJrZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmljb24pIHtcblxuICAgIH1cbiAgICB0aGlzLmxvY2F0aW9ucy5mb3JFYWNoKChsb2NhdGlvbikgPT4ge1xuICAgICAgY29uc3QgbWFya2VyID0gbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7XG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgbGF0OiBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgbG9jYXRpb25bdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5tYXJrZXJMYXRpdHVkZV1cbiAgICAgICAgICApLFxuICAgICAgICAgIGxuZzogcGFyc2VGbG9hdChcbiAgICAgICAgICAgIGxvY2F0aW9uW3RoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcubWFya2VyTG9uZ2l0dWRlXVxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIGljb246IHRoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcuaWNvbiA/IHtcbiAgICAgICAgICB1cmw6IHRoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcuaWNvbiwgLy8gUmVwbGFjZSB3aXRoIHlvdXIgaWNvbiBwYXRoXG4gICAgICAgICAgc2NhbGVkU2l6ZToge1xuICAgICAgICAgICAgd2lkdGg6IDMyLFxuICAgICAgICAgICAgaGVpZ2h0OiAzMixcbiAgICAgICAgICB9LFxuICAgICAgICB9IDogJycsXG4gICAgICAgIC8vIHRvb2x0aXBUZXh0OlxuICAgICAgICBtYXA6IHRoaXMubWFwLFxuICAgICAgICAvLyB0aXRsZTogYCR7bG9jYXRpb24uY2l0eX06ICQke2xvY2F0aW9uLnRvdGFsX3NhbGVzX2Ftb3VudH1gLFxuICAgICAgICB0aXRsZTogYCR7bG9jYXRpb24uY2l0eX06ICQke2xvY2F0aW9uLnRvdGFsX3NhbGVzX2Ftb3VudH1gLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmJvdW5kcy5leHRlbmQobWFya2VyLmdldFBvc2l0aW9uKCkpO1xuICAgICAgdGhpcy5tYXJrZXJzLnB1c2gobWFya2VyKTtcblxuICAgICAgLy8gQWRkIGFuIGluZm8gd2luZG93XG4gICAgICBsZXQgc3RyaW5nV2l0aG91dFF1b3RlcyA9IHRoaXMuZ2V0SW5mb1dpbmRvRGF0YShsb2NhdGlvbik7XG4gICAgICBjb25zdCBpbmZvV0luZG93RGF0YSA9IHRoaXMuZ2V0SW5mb1dpbmRvRGF0YShsb2NhdGlvbik7XG5cbiAgICAgIGNvbnN0IGluZm9XaW5kb3cgPSBuZXcgZ29vZ2xlLm1hcHMuSW5mb1dpbmRvdyh7XG4gICAgICAgIC8vIGNvbnRlbnQ6IGluZm9XSW5kb3dEYXRhLFxuICAgICAgICBjb250ZW50OiBgPGRpdiBzdHlsZT1cImhlaWdodDogMTAwJTsgd2lkdGg6IDEwMCU7IGNvbG9yOiBibGFjazsgZm9udC1zaXplOiAyMHB4O1wiPlxuICAgICAgICAke2luZm9XSW5kb3dEYXRhfVxuICAgICAgPC9kaXY+YCxcbiAgICAgIH0pO1xuXG4gICAgICBtYXJrZXIuYWRkTGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRJbmZvV2luZG93KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50SW5mb1dpbmRvdy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGluZm9XaW5kb3cub3Blbih0aGlzLm1hcCwgbWFya2VyKTtcbiAgICAgICAgdGhpcy5jdXJyZW50SW5mb1dpbmRvdyA9IGluZm9XaW5kb3c7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLm1hcC5maXRCb3VuZHModGhpcy5ib3VuZHMpO1xuXG5cbiAgfVxuXG4gIGdldEluZm9XaW5kb0RhdGEoZGF0YSkge1xuICAgIGxldCB0b29sVGlwRGF0YSA9IGBgO1xuICAgIHRoaXMudG9vdFRpcENvbHVtbi5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGRhdGFbZWxlbWVudC5kYXRhRmllbGRdID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHRvb2xUaXBEYXRhICs9XG4gICAgICAgICAgYDxkaXYgY2xhc3M9J2lubGluZSc+PGI+YCArXG4gICAgICAgICAgZWxlbWVudC5jYXB0aW9uICtcbiAgICAgICAgICBgOjwvYj48L2Rpdj4gYCArXG4gICAgICAgICAgdGhpcy5jb21tb25TZXJ2aWNlLnJvdW5kT2ZmVGlsbFR3byhkYXRhW2VsZW1lbnQuZGF0YUZpZWxkXSwgMikgK1xuICAgICAgICAgIGA8YnIgLz5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG9vbFRpcERhdGEgKz1cbiAgICAgICAgICBgPGRpdiBjbGFzcz0naW5saW5lJz48Yj5gICtcbiAgICAgICAgICBlbGVtZW50LmNhcHRpb24gK1xuICAgICAgICAgIGA6PC9iPjwvZGl2PiBgICtcbiAgICAgICAgICBkYXRhW2VsZW1lbnQuZGF0YUZpZWxkXSArXG4gICAgICAgICAgYDxiciAvPmA7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvb2xUaXBEYXRhO1xuICB9XG4gIC8vIEhlYXQgTWFwIEVuZCAvL1xuXG4gIC8vaGVhdCBvbmx5IG1hcCBzdGFydCAvL1xuXG4gIGxvYWRHb29nbGVIZWF0T25seU1hcHMoZGF0YSk6IHZvaWQge1xuICAgIHRoaXMuaGVhdG1hcERhdGEgPSBbXTtcbiAgICBkYXRhLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGxldCBsYXRpdHVkZSA9IHBhcnNlRmxvYXQoXG4gICAgICAgIGVsZW1lbnRbdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5tYXJrZXJMYXRpdHVkZV1cbiAgICAgICk7XG4gICAgICBsZXQgbG9ndGl0dWRlID0gcGFyc2VGbG9hdChcbiAgICAgICAgZWxlbWVudFt0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLm1hcmtlckxvbmdpdHVkZV1cbiAgICAgICk7XG4gICAgICAvLyBsZXQgd2VpZ2h0ID0gKGNlbGxOb2RlLnByb3BlcnRpZXNbJ1dlaWdodCddICE9IHVuZGVmaW5lZCkgPyBjZWxsTm9kZS5wcm9wZXJ0aWVzWydXZWlnaHQnXSA6IFwiTkFcIjtcbiAgICAgIHRoaXMuaGVhdG1hcERhdGEucHVzaCh7XG4gICAgICAgIGxvY2F0aW9uOiBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKGxhdGl0dWRlLCBsb2d0aXR1ZGUpXG4gICAgICAgIC8vIHdlaWdodDogcGFyc2VGbG9hdCh3ZWlnaHQpLFxuXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYm91bmRzLmV4dGVuZChuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKGxhdGl0dWRlLCBsb2d0aXR1ZGUpKTtcbiAgICB9KTtcbiAgICBjb25zdCBtYXBPcHRpb25zID0ge1xuICAgICAgem9vbTogdGhpcy56b29tVmFsdUZvckFsbFxuICAgIH07XG5cblxuXG5cbiAgICB0aGlzLm1hcCA9IG5ldyBnb29nbGUubWFwcy5NYXAodGhpcy5nb29nbE1hcC5uYXRpdmVFbGVtZW50LCBtYXBPcHRpb25zKTtcbiAgICB0aGlzLmdvb2dsTWFwLm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5jaGFydEhlaWdodDtcbiAgICB0aGlzLm1hcC5maXRCb3VuZHModGhpcy5ib3VuZHMpO1xuICAgIHRoaXMuaGVhdG1hcCA9IG5ldyBnb29nbGUubWFwcy52aXN1YWxpemF0aW9uLkhlYXRtYXBMYXllcih7XG4gICAgICBkYXRhOiB0aGlzLmhlYXRtYXBEYXRhLFxuICAgICAgbWFwOiB0aGlzLm1hcCxcbiAgICB9KTtcblxuXG4gIH1cblxuXG4gIC8vaGVhdCBvbmx5IG1hcCBlbmQgLy9cblxuICAvL2hlYXQgYW5kIE1hcmtlciAgbWFwIFN0YXJ0IC8vXG4gIGluaXRpYWxpemVIZWF0V2l0aE1hcmtlck1hcChkYXRhKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBtYXBcbiAgICB0aGlzLm1hcCA9IG5ldyBnb29nbGUubWFwcy5NYXAodGhpcy5nb29nbE1hcC5uYXRpdmVFbGVtZW50LCB7XG4gICAgICAvLyBjZW50ZXI6IHsgbGF0OiAzNy43NzQ5LCBsbmc6IC0xMjIuNDE5NCB9LFxuICAgICAgem9vbTogcGFyc2VGbG9hdChcbiAgICAgICAgdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy56b29tXG4gICAgICApLFxuICAgIH0pO1xuICAgIHRoaXMuZ29vZ2xNYXAubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLmNoYXJ0SGVpZ2h0O1xuICAgIC8vIEluaXRpYWxpemUgaGVhdG1hcCBsYXllclxuICAgIHRoaXMuaGVhdG1hcERhdGEgPSBbXTtcbiAgICBkYXRhLmZvckVhY2goZWxlbWVudCA9PiB7XG5cbiAgICAgIGxldCBsYXRpdHVkZSA9IHBhcnNlRmxvYXQoXG4gICAgICAgIGVsZW1lbnRbdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5tYXJrZXJMYXRpdHVkZV1cbiAgICAgICk7XG4gICAgICBsZXQgbG9ndGl0dWRlID0gcGFyc2VGbG9hdChcbiAgICAgICAgZWxlbWVudFt0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLm1hcmtlckxvbmdpdHVkZV1cbiAgICAgICk7XG4gICAgICB0aGlzLmhlYXRtYXBEYXRhLnB1c2goe1xuICAgICAgICBsb2NhdGlvbjogbmV3IGdvb2dsZS5tYXBzLkxhdExuZyhsYXRpdHVkZSwgbG9ndGl0dWRlKVxuICAgICAgfSk7XG4gICAgICB0aGlzLmJvdW5kcy5leHRlbmQobmV3IGdvb2dsZS5tYXBzLkxhdExuZyhsYXRpdHVkZSwgbG9ndGl0dWRlKSk7XG4gICAgfSk7XG4gICAgdGhpcy5oZWF0bWFwID0gbmV3IGdvb2dsZS5tYXBzLnZpc3VhbGl6YXRpb24uSGVhdG1hcExheWVyKHtcbiAgICAgIGRhdGE6IHRoaXMuaGVhdG1hcERhdGEsXG4gICAgICBtYXA6IHRoaXMubWFwLFxuICAgIH0pO1xuICAgIC8vIEluaXRpYWxpemUgbWFya2Vyc1xuICAgIHRoaXMubG9jYXRpb25zLmZvckVhY2goKGxvY2F0aW9uKSA9PiB7XG4gICAgICBjb25zdCBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHtcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICBsYXQ6IHBhcnNlRmxvYXQoXG4gICAgICAgICAgICBsb2NhdGlvblt0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLm1hcmtlckxhdGl0dWRlXVxuICAgICAgICAgICksXG4gICAgICAgICAgbG5nOiBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgbG9jYXRpb25bdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5tYXJrZXJMb25naXR1ZGVdXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgaWNvbjogdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5pY29uID8ge1xuICAgICAgICAgIHVybDogdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5pY29uLCAvLyBSZXBsYWNlIHdpdGggeW91ciBpY29uIHBhdGhcbiAgICAgICAgICBzY2FsZWRTaXplOiB7XG4gICAgICAgICAgICB3aWR0aDogMzIsXG4gICAgICAgICAgICBoZWlnaHQ6IDMyLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gOiAnJyxcbiAgICAgICAgLy8gdG9vbHRpcFRleHQ6XG4gICAgICAgIG1hcDogdGhpcy5tYXAsXG4gICAgICAgIC8vIHRpdGxlOiBgJHtsb2NhdGlvbi5jaXR5fTogJCR7bG9jYXRpb24udG90YWxfc2FsZXNfYW1vdW50fWAsXG4gICAgICAgIHRpdGxlOiBgJHtsb2NhdGlvbi5jaXR5fTogJCR7bG9jYXRpb24udG90YWxfc2FsZXNfYW1vdW50fWAsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYm91bmRzLmV4dGVuZChtYXJrZXIuZ2V0UG9zaXRpb24oKSk7XG4gICAgICB0aGlzLm1hcmtlcnMucHVzaChtYXJrZXIpO1xuXG4gICAgICAvLyBBZGQgYW4gaW5mbyB3aW5kb3dcblxuICAgICAgLy8gQWRkIGFuIGluZm8gd2luZG93XG4gICAgICBjb25zdCBpbmZvV0luZG93RGF0YSA9IHRoaXMuZ2V0SW5mb1dpbmRvRGF0YShsb2NhdGlvbik7XG4gICAgICBjb25zdCBpbmZvV2luZG93ID0gbmV3IGdvb2dsZS5tYXBzLkluZm9XaW5kb3coe1xuICAgICAgICBjb250ZW50OiBgPGRpdiBzdHlsZT1cImhlaWdodDogMTAwJTsgd2lkdGg6IDEwMCU7IGNvbG9yOiBibGFjazsgZm9udC1zaXplOiAyMHB4O1wiPlxuICAgICAgICAgICAgJHtpbmZvV0luZG93RGF0YX1cbiAgICAgICAgICA8L2Rpdj5gLFxuICAgICAgfSk7XG5cblxuICAgICAgbWFya2VyLmFkZExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50SW5mb1dpbmRvdykge1xuICAgICAgICAgIHRoaXMuY3VycmVudEluZm9XaW5kb3cuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpbmZvV2luZG93Lm9wZW4odGhpcy5tYXAsIG1hcmtlcik7XG4gICAgICAgIHRoaXMuY3VycmVudEluZm9XaW5kb3cgPSBpbmZvV2luZG93O1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5tYXAuZml0Qm91bmRzKHRoaXMuYm91bmRzKTtcblxuICAgIC8vIEFkZCBsaXN0ZW5lciBmb3Igem9vbSBjaGFuZ2VzXG4gICAgdGhpcy5tYXAuYWRkTGlzdGVuZXIoJ3pvb21fY2hhbmdlZCcsICgpID0+IHRoaXMuaGFuZGxlWm9vbUNoYW5nZSgpKTtcbiAgfVxuXG4gIGhhbmRsZVpvb21DaGFuZ2UoKSB7XG4gICAgY29uc3Qgem9vbUxldmVsID0gdGhpcy5tYXAuZ2V0Wm9vbSgpO1xuICAgIGlmICh6b29tTGV2ZWwgPCA1KSB7XG4gICAgICAvLyBTaG93IGhlYXRtYXAgYW5kIGhpZGUgbWFya2Vyc1xuICAgICAgdGhpcy5oZWF0bWFwLnNldE1hcCh0aGlzLm1hcCk7XG4gICAgICB0aGlzLm1hcmtlcnMuZm9yRWFjaCgobWFya2VyKSA9PiBtYXJrZXIuc2V0TWFwKG51bGwpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGlkZSBoZWF0bWFwIGFuZCBzaG93IG1hcmtlcnNcbiAgICAgIHRoaXMuaGVhdG1hcC5zZXRNYXAobnVsbCk7XG4gICAgICB0aGlzLm1hcmtlcnMuZm9yRWFjaCgobWFya2VyKSA9PiBtYXJrZXIuc2V0TWFwKHRoaXMubWFwKSk7XG4gICAgfVxuICB9XG5cbiAgLy9oZWF0IGFuZCBNYXJrZXIgIG1hcCBFbmQgLy9cbn1cbiIsIlxuPGRpdiBjbGFzcz1cIm14LTIgYmctZ3JheS04MDBcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNMb2FkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtc3RhcnQgYmctZ3JheS04MDAgcC0yXCI+XG4gICAgICAgICAgICA8YXBwLWxvYWRlcj48L2FwcC1sb2FkZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiBjbGFzcz1cIm14LTIgcGItMlwiPlxuXG4gICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIDxkaXYgaWQ9XCJyZWdpb25zX2RpdlwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIiA+PC9kaXY+ICAgLS0+XG4gICAgICAgIDxkaXYgaWQ9XCJyZWdpb25zX2RpdlwiICNnb29nbE1hcCBzdHlsZT1cIndpZHRoOiAxMDAlXCIgPjwvZGl2PiAgICBcbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgXG4gICAgICAgXG5cbiAgICA8L2Rpdj5cblxuXG48L2Rpdj5cbiJdfQ==
439
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLWdlby1tYXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ29vZ2xlLWdlby1tYXAvZ29vZ2xlLWdlby1tYXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ29vZ2xlLWdlby1tYXAvZ29vZ2xlLWdlby1tYXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDOzs7OztBQVE1QixNQUFNLE9BQU8scUJBQXFCO0lBbUloQyxZQUFtQixhQUE0QjtRQUE1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQTFIOUIseUJBQW9CLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDN0QsY0FBUyxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2xELGlDQUE0QixHQUMzQyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ1oscUJBQWdCLEdBQVksSUFBSSxDQUFDO1FBZTFDLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFJYixXQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBbUdXLENBQUM7SUEvRnBELElBQ0ksZUFBZSxDQUFDLEtBQUs7UUFDdkIsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FB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Q0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3BDLE9BQU8sQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQyxHQUFHLGFBQWEsQ0FBQztRQUN6RixDQUFDLENBQUM7UUFHRixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN6QixDQUFDLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUMvSixDQUFDLENBQUMsQ0FBQztJQUVELENBQUM7O2tIQTdqQlUscUJBQXFCO3NHQUFyQixxQkFBcUIsdVlDbkJsQyxvZkFxQkE7MkZERmEscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG9CQUFvQjtvR0FLUCxRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVU7Z0JBUUosb0JBQW9CO3NCQUFwQyxNQUFNO2dCQUNVLFNBQVM7c0JBQXpCLE1BQU07Z0JBQ1UsNEJBQTRCO3NCQUE1QyxNQUFNO2dCQUVFLGdCQUFnQjtzQkFBeEIsS0FBSztnQkF3QkYsZUFBZTtzQkFEbEIsS0FBSzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCI7XG5kZWNsYXJlIHZhciBnb29nbGU6IGFueTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImFwcC1nb29nbGUtZ2VvLW1hcFwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2dvb2dsZS1nZW8tbWFwLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9nb29nbGUtZ2VvLW1hcC5jb21wb25lbnQuc2Nzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgR29vZ2xlR2VvTWFwQ29tcG9uZW50IHtcbiAgQFZpZXdDaGlsZChcImdvb2dsTWFwXCIpIGdvb2dsTWFwOiBFbGVtZW50UmVmO1xuICBjaGFyRGF0YTogYW55O1xuICBjaGFydEhlaWdodDogYW55O1xuICBiYWNncm91bmRDb2xvcjogYW55O1xuICBtYXBDb2xvcnM6IGFueTtcbiAgY2hhcnRUeXBlOiBhbnk7XG4gIHRvb3RUaXBDb2x1bW46IGFueTtcbiAgcmVnaW9uOiBhbnk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgZ2V0VGFibGVDb25maWdPdXRQdXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9Sb3dDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgb25yaWdodENsaWNrQ29udGV4dFNlbGVjdGlvbjogRXZlbnRFbWl0dGVyPGFueT4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQElucHV0KCkgcmlnaHRDbGlja0VuYWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIGlzTG9hZGVyOiBib29sZWFuO1xuICBwYWdlX2NvbmZpZzogYW55O1xuICBwYWdlX3Bhcm1zOiBhbnk7XG4gIHJlZ2lvbkNvZGU6IGFueTtcbiAgLy8gaGVhdCBNYXAgc3RhcnRcbiAgbWFwOiBhbnk7XG4gIGxvY2F0aW9ucztcbiAgbWFwVFlwZTogYW55O1xuICBtYXBPcHRpb25Gb3JIZWF0TWFwOiB7XG4gICAgem9vbTogbnVtYmVyO1xuICB9O1xuICBjdXJyZW50SW5mb1dpbmRvdzogYW55OyAvLyBUcmFjayB0aGUgb3BlbiBJbmZvV2luZG93XG4gIC8vIGhlYXQgTWFwIGVuZFxuICAvL2hlYXQgb25seSBtYXAgc3RhcnQgLy9cbiAgbWFya2VycyA9IFtdO1xuICBoZWF0bWFwOiBhbnk7XG4gIGhlYXRtYXBEYXRhOiBhbnk7XG4gIHpvb21WYWx1Rm9yQWxsOiBudW1iZXI7XG4gIGJvdW5kcyA9IG5ldyBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMoKTtcbiAgLy9oZWF0IG9ubHkgbWFwIGVuZCAvL1xuICBzb3J0Qnk6IGFueTtcbiAgZmlsdGVyZWRPYmplY3RzOiBhbnk7XG4gIEBJbnB1dChcImNoYXJ0RGF0YVNvdXJjZVwiKVxuICBzZXQgY2hhcnREYXRhU291cmNlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNMb2FkZXIgPSB0cnVlO1xuICAgICAgdGhpcy5wYWdlX2NvbmZpZyA9IHZhbHVlO1xuICAgICAgdGhpcy5wYWdlX3Bhcm1zID0gdmFsdWUudGl0bGVQYXJhbXM7XG4gICAgICB0aGlzLnNvcnRCeSA9IHZhbHVlLmtwaUNvbmZpZz8uZGF0YUNvbmZpZz8uc29ydEJ5O1xuXG4gICAgICAvLyB0aGlzLmluUm9hbWVyR2VvQ2hhcnQubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAnJztcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUua3BpQ29uZmlnLmRhdGFTb3VyY2UgJiZcbiAgICAgICAgdmFsdWUua3BpQ29uZmlnLmRhdGFTb3VyY2UubGVuZ3RoICE9PSAwXG4gICAgICApIHtcbiAgICAgICAgaWYgKHZhbHVlLmtwaUNvbmZpZy5mb3JtYXRlID09IFwibW9udGhseVwiKSB7XG4gICAgICAgICAgdGhpcy5tYXBUWXBlID0gdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcubWFwVHlwZTtcbiAgICAgICAgICBpZiAodGhpcy5tYXBUWXBlID09IFwiZ2VvTWFwXCIpIHtcbiAgICAgICAgICAgIHRoaXMucmVnaW9uID0gdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcucmVnaW9uO1xuICAgICAgICAgICAgdGhpcy5yZWdpb25Db2RlID0gdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcucmVnaW9uQ29kZTtcbiAgICAgICAgICAgIHRoaXMudG9vdFRpcENvbHVtbiA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZztcbiAgICAgICAgICAgIGxldCBkYXRhID0gdmFsdWUua3BpQ29uZmlnLmRhdGFTb3VyY2U7XG4gICAgICAgICAgICB0aGlzLmNoYXJ0SGVpZ2h0ID0gYCR7dmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcuc2l6ZX1weGA7XG4gICAgICAgICAgICB0aGlzLmNoYXJ0VHlwZSA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmNoYXJ0VHlwZTtcbiAgICAgICAgICAgIHRoaXMuYmFjZ3JvdW5kQ29sb3IgPSB2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgICAgICB0aGlzLm1hcENvbG9ycyA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmNvbG9ycztcbiAgICAgICAgICAgIC8vIGxldCBjb25maWcgPSB2YWx1ZS5jaGFydENvbmZpZztcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGEgPSBbXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZ1tcImFyZ3VtZW50RmllbGRcIl0sXG4gICAgICAgICAgICAgICAgdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWdbXCJjaGFydFZhbHVlRmllbGRcIl0sXG4gICAgICAgICAgICAgICAgeyB0eXBlOiBcInN0cmluZ1wiLCByb2xlOiBcInRvb2x0aXBcIiwgcDogeyBodG1sOiB0cnVlIH0gfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIF0uY29uY2F0KFxuICAgICAgICAgICAgICBkYXRhLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb2x0aXAgPSB0aGlzLmdldFRvb2x0aXAoaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgIGl0ZW1bdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWdbXCJhcmd1bWVudEZpZWxkXCJdXSxcbiAgICAgICAgICAgICAgICAgIGl0ZW1bdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWdbXCJjaGFydFZhbHVlRmllbGRcIl1dLFxuICAgICAgICAgICAgICAgICAgdG9vbHRpcCxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuY2hhckRhdGEgPSBmb3JtYXR0ZWREYXRhO1xuICAgICAgICAgICAgLy8gdGhpcy5sb2FkR29vZ2xlQ2hhcnRzKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5pc0xvYWRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAvLyB0aGlzLmxvYWRHb29nbGVDaGFydHMoKTtcbiAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgICAgfSBlbHNlIGlmKHRoaXMubWFwVFlwZSA9PSBcImJ1YmJsZU1hcFwiKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2F0aW9ucyA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhU291cmNlO1xuICAgICAgICAgICAgdGhpcy5jaGFydEhlaWdodCA9IGAke3ZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLnNpemV9cHhgO1xuICAgICAgICAgICAgdGhpcy50b290VGlwQ29sdW1uID0gdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcuY2hhcnRfY29uZmlnO1xuICAgICAgICAgICAgdGhpcy5tYXBPcHRpb25Gb3JIZWF0TWFwID0ge1xuICAgICAgICAgICAgICB6b29tOiB0aGlzLnpvb21WYWx1Rm9yQWxsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5sb2NhdGlvbnMgPSB2YWx1ZS5rcGlDb25maWcuZGF0YVNvdXJjZTtcbiAgICAgICAgICAgIHRoaXMuY2hhcnRIZWlnaHQgPSBgJHt2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZy5zaXplfXB4YDtcbiAgICAgICAgICAgIHRoaXMudG9vdFRpcENvbHVtbiA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZztcbiAgICAgICAgICAgIHRoaXMuem9vbVZhbHVGb3JBbGwgPSBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICB0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLnpvb21cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLm1hcE9wdGlvbkZvckhlYXRNYXAgPSB7XG4gICAgICAgICAgICAgIHpvb206IHRoaXMuem9vbVZhbHVGb3JBbGxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICB9XG4gICAgICAgIH1lbHNlIFxuICAgICAgICBpZih2YWx1ZS5rcGlDb25maWcuZm9ybWF0ZSA9PSBcImRhaWx5XCIpe1xuICAgICAgICAgIHRoaXMubWFwVFlwZSA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLm1hcFR5cGU7XG4gICAgICAgICAgY29uc3Qgc29ydGVkRGF0YSA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhU291cmNlXG4gICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHJlY29yZCA9PiByZWNvcmRbdGhpcy5zb3J0QnldKVxuICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IG1vbWVudChiW3RoaXMuc29ydEJ5XSkuZGlmZihtb21lbnQoYVt0aGlzLnNvcnRCeV0pKSk7XG4gICAgICAgICAgICAgICAgICAgY29uc3QgbW9zdFJlY2VudFJlY29yZCA9IHNvcnRlZERhdGFbMF07XG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5lbmREYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkT2JqZWN0cyA9IHNvcnRlZERhdGEuZmlsdGVyKGRhdGEgPT4gZGF0YVt0aGlzLnNvcnRCeV0gPT09IHZhbHVlLmVuZERhdGUpO1xuICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkT2JqZWN0cyA9IHNvcnRlZERhdGEuZmlsdGVyKGRhdGEgPT4gZGF0YVt0aGlzLnNvcnRCeV0gPT09IG1vc3RSZWNlbnRSZWNvcmRbdGhpcy5zb3J0QnldKTtcbiAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICBpZih0aGlzLm1hcFRZcGUgPT0gXCJidWJibGVNYXBcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9ucyA9IHRoaXMuZmlsdGVyZWRPYmplY3RzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0SGVpZ2h0ID0gYCR7dmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcuc2l6ZX1weGA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vdFRpcENvbHVtbiA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBPcHRpb25Gb3JIZWF0TWFwID0ge1xuICAgICAgICAgICAgICAgICAgICAgIHpvb206IHRoaXMuem9vbVZhbHVGb3JBbGxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyB0aGlzLmxvYWRHb29nbGVIZWF0T25seU1hcHModGhpcy5sb2NhdGlvbnMpO1xuXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWFwVFlwZSA9PSBcImdlb01hcFwiKSB7XG4gICAgICB0aGlzLmxvYWRHb29nbGVDaGFydHMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWFwVFlwZSA9PSBcImhlYXRNYXBcIikge1xuICAgICAgaWYgKHRoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcuaGVhdE1hcENhdGVnb3J5ID09IFwiaGVhdE1hcE9ubHlcIikge1xuICAgICAgICB0aGlzLmlzTG9hZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMubG9hZEdvb2dsZUhlYXRPbmx5TWFwcyh0aGlzLmxvY2F0aW9ucyk7XG4gICAgICAgIFxuICAgICAgfSBlbHNlIGlmICh0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmhlYXRNYXBDYXRlZ29yeSA9PSBcImhlYXRNYXBNYXJrZXJcIikge1xuICAgICAgICB0aGlzLmlzTG9hZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZU1hcCgpO1xuICAgICAgICB0aGlzLmFkZE1hcmtlcnMoKTtcbiAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIC8vICAgdGhpcy5sb2FkTWFwKCk7XG4gICAgICAgIC8vIH0sIDApO1xuICAgICAgICBcblxuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzTG9hZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUhlYXRXaXRoTWFya2VyTWFwKHRoaXMubG9jYXRpb25zKTtcblxuICAgICAgfVxuXG4gICAgfWVsc2V7XG4gICAgICB0aGlzLmlzTG9hZGVyID0gZmFsc2U7XG4gICAgICB0aGlzLmluaXRpYWxpemVNYXAoKTtcbiAgICAgIHRoaXMuYWRkQnViYmxlTWFya2VycygpO1xuICAgIH1cbiAgfVxuICAvLyAgR2VvIE1hcCBzdGFydCAvL1xuICBsb2FkR29vZ2xlQ2hhcnRzKCkge1xuICAgIGdvb2dsZS5jaGFydHMubG9hZChcImN1cnJlbnRcIiwge1xuICAgICAgcGFja2FnZXM6IFt0aGlzLmNoYXJ0VHlwZV0sXG4gICAgfSk7XG4gICAgZ29vZ2xlLmNoYXJ0cy5zZXRPbkxvYWRDYWxsYmFjayh0aGlzLmRyYXdDaGFydC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGRyYXdDaGFydCgpIHtcbiAgICBjb25zdCBkYXRhID0gZ29vZ2xlLnZpc3VhbGl6YXRpb24uYXJyYXlUb0RhdGFUYWJsZSh0aGlzLmNoYXJEYXRhKTtcblxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbkNvbmZpZygpO1xuXG4gICAgLy8gb3B0aW9uc1snZGF0YU1vZGUnXSA9ICdyZWdpb25zJztcblxuICAgIGNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkdlb0NoYXJ0KFxuICAgICAgdGhpcy5nb29nbE1hcC5uYXRpdmVFbGVtZW50XG4gICAgKTtcbiAgICB0aGlzLmdvb2dsTWFwLm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5jaGFydEhlaWdodDtcblxuICAgIGNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7XG4gIH1cblxuICBnZXRUb29sdGlwKGRhdGEpIHtcbiAgICBsZXQgdG9vbFRpcERhdGEgPSBcIlwiO1xuICAgIHRoaXMudG9vdFRpcENvbHVtbi5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGRhdGFbZWxlbWVudC5kYXRhRmllbGRdID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHRvb2xUaXBEYXRhICs9XG4gICAgICAgICAgXCI8ZGl2IGNsYXNzPSdpbmxpbmUnPjxiPlwiICtcbiAgICAgICAgICBlbGVtZW50LmNhcHRpb24gK1xuICAgICAgICAgIFwiOjwvYj48L2Rpdj4gXCIgK1xuICAgICAgICAgIHRoaXMuY29tbW9uU2VydmljZS5yb3VuZE9mZlRpbGxUd28oZGF0YVtlbGVtZW50LmRhdGFGaWVsZF0sIDIpICtcbiAgICAgICAgICBcIjxiciAvPlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG9vbFRpcERhdGEgKz1cbiAgICAgICAgICBcIjxkaXYgY2xhc3M9J2lubGluZSc+PGI+XCIgK1xuICAgICAgICAgIGVsZW1lbnQuY2FwdGlvbiArXG4gICAgICAgICAgXCI6PC9iPjwvZGl2PiBcIiArXG4gICAgICAgICAgZGF0YVtlbGVtZW50LmRhdGFGaWVsZF0gK1xuICAgICAgICAgIFwiPGJyIC8+XCI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvb2xUaXBEYXRhO1xuICB9XG5cbiAgZ2V0T3B0aW9uQ29uZmlnKCkge1xuICAgIGlmICh0aGlzLnJlZ2lvbiA9PSBcImNpdHlcIikge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgcmVnaW9uOiB0aGlzLnJlZ2lvbkNvZGUsXG4gICAgICAgIGRpc3BsYXlNb2RlOiBcIm1hcmtlcnNcIixcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLmJhY2dyb3VuZENvbG9yLFxuICAgICAgICB0b29sdGlwOiB7IGlzSHRtbDogdHJ1ZSB9LFxuICAgICAgICBjb2xvckF4aXM6IHsgY29sb3JzOiB0aGlzLm1hcENvbG9ycyB9LFxuICAgICAgfTtcbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuYmFjZ3JvdW5kQ29sb3IsXG4gICAgICAgIHRvb2x0aXA6IHsgaXNIdG1sOiB0cnVlIH0sXG4gICAgICAgIGNvbG9yQXhpczogeyBjb2xvcnM6IHRoaXMubWFwQ29sb3JzIH0sXG4gICAgICB9O1xuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuICB9XG5cbiAgLy8gIEdlbyBNYXAgZW5kIC8vXG5cbiAgLy8gSGVhdCBNYXAgc3RhcnQgLy9cbiAgaW5pdGlhbGl6ZU1hcCgpOiB2b2lkIHtcbiAgICBjb25zdCBtYXBPcHRpb25zID0gdGhpcy5tYXBPcHRpb25Gb3JIZWF0TWFwO1xuICAgIC8vIHtcbiAgICAvLyAgIGNlbnRlcjogeyBsYXQ6IDM3LjA5MDIsIGxuZzogLTk1LjcxMjkgfSwgLy8gQ2VudGVyIG9mIHRoZSBVU0FcbiAgICAvLyAgIHpvb206IDUsXG4gICAgLy8gfTtcblxuICAgIGlmKHRoaXMubWFwVFlwZSA9PSBcImJ1YmJsZU1hcFwiKXtcbiAgICAgIG1hcE9wdGlvbnNbJ3N0eWxlcyddID0gIFtcbiAgICAgICAge1xuICAgICAgICAgIGZlYXR1cmVUeXBlOiAnYWxsJyxcbiAgICAgICAgICBzdHlsZXJzOiBbXG4gICAgICAgICAgICB7IHNhdHVyYXRpb246IC0xMDAgfSxcbiAgICAgICAgICAgIHsgbGlnaHRuZXNzOiA3MCB9LFxuICAgICAgICAgICAgeyB2aXNpYmlsaXR5OiAnc2ltcGxpZmllZCcgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZmVhdHVyZVR5cGU6ICdhZG1pbmlzdHJhdGl2ZS5jb3VudHJ5JyxcbiAgICAgICAgICBlbGVtZW50VHlwZTogJ2xhYmVscycsXG4gICAgICAgICAgc3R5bGVyczogW1xuICAgICAgICAgICAgeyBsaWdodG5lc3M6IC0zMCB9LCAvLyBEYXJrZW4gbGFiZWxzIGZ1cnRoZXJcbiAgICAgICAgICAgIHsgdmlzaWJpbGl0eTogJ29uJyB9LFxuICAgICAgICAgICAgeyBmb250V2VpZ2h0OiAnYm9sZCcgfSwgLy8gTWFrZSBsYWJlbHMgYm9sZFxuICAgICAgICAgICAgeyBmb250U2l6ZTogJzEycHgnIH0gLy8gSW5jcmVhc2UgZm9udCBzaXplXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZlYXR1cmVUeXBlOiBcImFkbWluaXN0cmF0aXZlLmNvdW50cnlcIixcbiAgICAgICAgICBlbGVtZW50VHlwZTogXCJnZW9tZXRyeS5zdHJva2VcIixcbiAgICAgICAgICBzdHlsZXJzOiBbXG4gICAgICAgICAgICB7IGxpZ2h0bmVzczogLTQwIH0sIC8vIERhcmtlbiBib3JkZXJzIHNpZ25pZmljYW50bHlcbiAgICAgICAgICAgIHsgd2VpZ2h0OiAxLjUgfSwgLy8gSW5jcmVhc2UgYm9yZGVyIHRoaWNrbmVzc1xuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmZWF0dXJlVHlwZTogXCJhZG1pbmlzdHJhdGl2ZS5jb3VudHJ5XCIsXG4gICAgICAgICAgZWxlbWVudFR5cGU6IFwiZ2VvbWV0cnkuZmlsbFwiLFxuICAgICAgICAgIHN0eWxlcnM6IFtcbiAgICAgICAgICAgIHsgbGlnaHRuZXNzOiA5MCB9IC8vIEtlZXAgZmlsbCB2ZXJ5IGxpZ2h0XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICAgXG5cbiAgICB0aGlzLm1hcCA9IG5ldyBnb29nbGUubWFwcy5NYXAoXG4gICAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlZ2lvbnNfZGl2XCIpICxcbiAgICAgIHRoaXMuZ29vZ2xNYXAubmF0aXZlRWxlbWVudCxcbiAgICAgIG1hcE9wdGlvbnNcbiAgICApO1xuICAgIHRoaXMuZ29vZ2xNYXAubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLmNoYXJ0SGVpZ2h0O1xuICB9XG5cbiAgLy8gQWRkIG1hcmtlcnMgdG8gdGhlIG1hcFxuICBhZGRNYXJrZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmljb24pIHtcblxuICAgIH1cbiAgICB0aGlzLmxvY2F0aW9ucy5mb3JFYWNoKChsb2NhdGlvbikgPT4ge1xuICAgICAgY29uc3QgbWFya2VyID0gbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7XG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgbGF0OiBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgbG9jYXRpb25bdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5tYXJrZXJMYXRpdHVkZV1cbiAgICAgICAgICApLFxuICAgICAgICAgIGxuZzogcGFyc2VGbG9hdChcbiAgICAgICAgICAgIGxvY2F0aW9uW3RoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcubWFya2VyTG9uZ2l0dWRlXVxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIGljb246IHRoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcuaWNvbiA/IHtcbiAgICAgICAgICB1cmw6IHRoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcuaWNvbiwgLy8gUmVwbGFjZSB3aXRoIHlvdXIgaWNvbiBwYXRoXG4gICAgICAgICAgc2NhbGVkU2l6ZToge1xuICAgICAgICAgICAgd2lkdGg6IDMyLFxuICAgICAgICAgICAgaGVpZ2h0OiAzMixcbiAgICAgICAgICB9LFxuICAgICAgICB9IDogXCJcIixcbiAgICAgICAgLy8gdG9vbHRpcFRleHQ6XG4gICAgICAgIG1hcDogdGhpcy5tYXAsXG4gICAgICAgIC8vIHRpdGxlOiBgJHtsb2NhdGlvbi5jaXR5fTogJCR7bG9jYXRpb24udG90YWxfc2FsZXNfYW1vdW50fWAsXG4gICAgICAgIHRpdGxlOiBgJHtsb2NhdGlvbi5jaXR5fTogJCR7bG9jYXRpb24udG90YWxfc2FsZXNfYW1vdW50fWAsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYm91bmRzLmV4dGVuZChtYXJrZXIuZ2V0UG9zaXRpb24oKSk7XG4gICAgICB0aGlzLm1hcmtlcnMucHVzaChtYXJrZXIpO1xuXG4gICAgICAvLyBBZGQgYW4gaW5mbyB3aW5kb3dcbiAgICAgIGxldCBzdHJpbmdXaXRob3V0UXVvdGVzID0gdGhpcy5nZXRJbmZvV2luZG9EYXRhKGxvY2F0aW9uKTtcbiAgICAgIGNvbnN0IGluZm9XSW5kb3dEYXRhID0gdGhpcy5nZXRJbmZvV2luZG9EYXRhKGxvY2F0aW9uKTtcblxuICAgICAgY29uc3QgaW5mb1dpbmRvdyA9IG5ldyBnb29nbGUubWFwcy5JbmZvV2luZG93KHtcbiAgICAgICAgLy8gY29udGVudDogaW5mb1dJbmRvd0RhdGEsXG4gICAgICAgIGNvbnRlbnQ6IGA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJTsgY29sb3I6IGJsYWNrOyBmb250LXNpemU6IDIwcHg7XCI+XG4gICAgICAgICR7aW5mb1dJbmRvd0RhdGF9XG4gICAgICA8L2Rpdj5gLFxuICAgICAgfSk7XG5cbiAgICAgIG1hcmtlci5hZGRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEluZm9XaW5kb3cpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRJbmZvV2luZG93LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaW5mb1dpbmRvdy5vcGVuKHRoaXMubWFwLCBtYXJrZXIpO1xuICAgICAgICB0aGlzLmN1cnJlbnRJbmZvV2luZG93ID0gaW5mb1dpbmRvdztcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMubWFwLmZpdEJvdW5kcyh0aGlzLmJvdW5kcyk7XG5cblxuICB9XG5cbiAgZ2V0SW5mb1dpbmRvRGF0YShkYXRhKSB7XG4gICAgbGV0IHRvb2xUaXBEYXRhID0gYGA7XG4gICAgdGhpcy50b290VGlwQ29sdW1uLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZGF0YVtlbGVtZW50LmRhdGFGaWVsZF0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgdG9vbFRpcERhdGEgKz1cbiAgICAgICAgICBgPGRpdiBjbGFzcz0naW5saW5lJz48Yj5gICtcbiAgICAgICAgICBlbGVtZW50LmNhcHRpb24gK1xuICAgICAgICAgIGA6PC9iPjwvZGl2PiBgICtcbiAgICAgICAgICB0aGlzLmNvbW1vblNlcnZpY2Uucm91bmRPZmZUaWxsVHdvKGRhdGFbZWxlbWVudC5kYXRhRmllbGRdLCAyKSArXG4gICAgICAgICAgYDxiciAvPmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b29sVGlwRGF0YSArPVxuICAgICAgICAgIGA8ZGl2IGNsYXNzPSdpbmxpbmUnPjxiPmAgK1xuICAgICAgICAgIGVsZW1lbnQuY2FwdGlvbiArXG4gICAgICAgICAgYDo8L2I+PC9kaXY+IGAgK1xuICAgICAgICAgIGRhdGFbZWxlbWVudC5kYXRhRmllbGRdICtcbiAgICAgICAgICBgPGJyIC8+YDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdG9vbFRpcERhdGE7XG4gIH1cbiAgLy8gSGVhdCBNYXAgRW5kIC8vXG5cbiAgLy9oZWF0IG9ubHkgbWFwIHN0YXJ0IC8vXG5cbiAgbG9hZEdvb2dsZUhlYXRPbmx5TWFwcyhkYXRhKTogdm9pZCB7XG4gICAgdGhpcy5oZWF0bWFwRGF0YSA9IFtdO1xuICAgIGRhdGEuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgbGV0IGxhdGl0dWRlID0gcGFyc2VGbG9hdChcbiAgICAgICAgZWxlbWVudFt0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLm1hcmtlckxhdGl0dWRlXVxuICAgICAgKTtcbiAgICAgIGxldCBsb2d0aXR1ZGUgPSBwYXJzZUZsb2F0KFxuICAgICAgICBlbGVtZW50W3RoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcubWFya2VyTG9uZ2l0dWRlXVxuICAgICAgKTtcbiAgICAgIC8vIGxldCB3ZWlnaHQgPSAoY2VsbE5vZGUucHJvcGVydGllc1snV2VpZ2h0J10gIT0gdW5kZWZpbmVkKSA/IGNlbGxOb2RlLnByb3BlcnRpZXNbJ1dlaWdodCddIDogXCJOQVwiO1xuICAgICAgdGhpcy5oZWF0bWFwRGF0YS5wdXNoKHtcbiAgICAgICAgbG9jYXRpb246IG5ldyBnb29nbGUubWFwcy5MYXRMbmcobGF0aXR1ZGUsIGxvZ3RpdHVkZSlcbiAgICAgICAgLy8gd2VpZ2h0OiBwYXJzZUZsb2F0KHdlaWdodCksXG5cbiAgICAgIH0pO1xuICAgICAgdGhpcy5ib3VuZHMuZXh0ZW5kKG5ldyBnb29nbGUubWFwcy5MYXRMbmcobGF0aXR1ZGUsIGxvZ3RpdHVkZSkpO1xuICAgIH0pO1xuICAgIGNvbnN0IG1hcE9wdGlvbnMgPSB7XG4gICAgICB6b29tOiB0aGlzLnpvb21WYWx1Rm9yQWxsXG4gICAgfTtcblxuXG5cblxuICAgIHRoaXMubWFwID0gbmV3IGdvb2dsZS5tYXBzLk1hcCh0aGlzLmdvb2dsTWFwLm5hdGl2ZUVsZW1lbnQsIG1hcE9wdGlvbnMpO1xuICAgIHRoaXMuZ29vZ2xNYXAubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLmNoYXJ0SGVpZ2h0O1xuICAgIHRoaXMubWFwLmZpdEJvdW5kcyh0aGlzLmJvdW5kcyk7XG4gICAgdGhpcy5oZWF0bWFwID0gbmV3IGdvb2dsZS5tYXBzLnZpc3VhbGl6YXRpb24uSGVhdG1hcExheWVyKHtcbiAgICAgIGRhdGE6IHRoaXMuaGVhdG1hcERhdGEsXG4gICAgICBtYXA6IHRoaXMubWFwLFxuICAgIH0pO1xuXG5cbiAgfVxuXG5cbiAgLy9oZWF0IG9ubHkgbWFwIGVuZCAvL1xuXG4gIC8vaGVhdCBhbmQgTWFya2VyICBtYXAgU3RhcnQgLy9cbiAgaW5pdGlhbGl6ZUhlYXRXaXRoTWFya2VyTWFwKGRhdGEpIHtcbiAgICAvLyBJbml0aWFsaXplIG1hcFxuICAgIHRoaXMubWFwID0gbmV3IGdvb2dsZS5tYXBzLk1hcCh0aGlzLmdvb2dsTWFwLm5hdGl2ZUVsZW1lbnQsIHtcbiAgICAgIC8vIGNlbnRlcjogeyBsYXQ6IDM3Ljc3NDksIGxuZzogLTEyMi40MTk0IH0sXG4gICAgICB6b29tOiBwYXJzZUZsb2F0KFxuICAgICAgICB0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLnpvb21cbiAgICAgICksXG4gICAgfSk7XG4gICAgdGhpcy5nb29nbE1hcC5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IHRoaXMuY2hhcnRIZWlnaHQ7XG4gICAgLy8gSW5pdGlhbGl6ZSBoZWF0bWFwIGxheWVyXG4gICAgdGhpcy5oZWF0bWFwRGF0YSA9IFtdO1xuICAgIGRhdGEuZm9yRWFjaChlbGVtZW50ID0+IHtcblxuICAgICAgbGV0IGxhdGl0dWRlID0gcGFyc2VGbG9hdChcbiAgICAgICAgZWxlbWVudFt0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLm1hcmtlckxhdGl0dWRlXVxuICAgICAgKTtcbiAgICAgIGxldCBsb2d0aXR1ZGUgPSBwYXJzZUZsb2F0KFxuICAgICAgICBlbGVtZW50W3RoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcubWFya2VyTG9uZ2l0dWRlXVxuICAgICAgKTtcbiAgICAgIHRoaXMuaGVhdG1hcERhdGEucHVzaCh7XG4gICAgICAgIGxvY2F0aW9uOiBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKGxhdGl0dWRlLCBsb2d0aXR1ZGUpXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYm91bmRzLmV4dGVuZChuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKGxhdGl0dWRlLCBsb2d0aXR1ZGUpKTtcbiAgICB9KTtcbiAgICB0aGlzLmhlYXRtYXAgPSBuZXcgZ29vZ2xlLm1hcHMudmlzdWFsaXphdGlvbi5IZWF0bWFwTGF5ZXIoe1xuICAgICAgZGF0YTogdGhpcy5oZWF0bWFwRGF0YSxcbiAgICAgIG1hcDogdGhpcy5tYXAsXG4gICAgfSk7XG4gICAgLy8gSW5pdGlhbGl6ZSBtYXJrZXJzXG4gICAgdGhpcy5sb2NhdGlvbnMuZm9yRWFjaCgobG9jYXRpb24pID0+IHtcbiAgICAgIGNvbnN0IG1hcmtlciA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoe1xuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIGxhdDogcGFyc2VGbG9hdChcbiAgICAgICAgICAgIGxvY2F0aW9uW3RoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcubWFya2VyTGF0aXR1ZGVdXG4gICAgICAgICAgKSxcbiAgICAgICAgICBsbmc6IHBhcnNlRmxvYXQoXG4gICAgICAgICAgICBsb2NhdGlvblt0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLm1hcmtlckxvbmdpdHVkZV1cbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBpY29uOiB0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmljb24gPyB7XG4gICAgICAgICAgdXJsOiB0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmljb24sIC8vIFJlcGxhY2Ugd2l0aCB5b3VyIGljb24gcGF0aFxuICAgICAgICAgIHNjYWxlZFNpemU6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzMixcbiAgICAgICAgICAgIGhlaWdodDogMzIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSA6ICcnLFxuICAgICAgICAvLyB0b29sdGlwVGV4dDpcbiAgICAgICAgbWFwOiB0aGlzLm1hcCxcbiAgICAgICAgLy8gdGl0bGU6IGAke2xvY2F0aW9uLmNpdHl9OiAkJHtsb2NhdGlvbi50b3RhbF9zYWxlc19hbW91bnR9YCxcbiAgICAgICAgdGl0bGU6IGAke2xvY2F0aW9uLmNpdHl9OiAkJHtsb2NhdGlvbi50b3RhbF9zYWxlc19hbW91bnR9YCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ib3VuZHMuZXh0ZW5kKG1hcmtlci5nZXRQb3NpdGlvbigpKTtcbiAgICAgIHRoaXMubWFya2Vycy5wdXNoKG1hcmtlcik7XG5cbiAgICAgIC8vIEFkZCBhbiBpbmZvIHdpbmRvd1xuXG4gICAgICAvLyBBZGQgYW4gaW5mbyB3aW5kb3dcbiAgICAgIGNvbnN0IGluZm9XSW5kb3dEYXRhID0gdGhpcy5nZXRJbmZvV2luZG9EYXRhKGxvY2F0aW9uKTtcbiAgICAgIGNvbnN0IGluZm9XaW5kb3cgPSBuZXcgZ29vZ2xlLm1hcHMuSW5mb1dpbmRvdyh7XG4gICAgICAgIGNvbnRlbnQ6IGA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJTsgY29sb3I6IGJsYWNrOyBmb250LXNpemU6IDIwcHg7XCI+XG4gICAgICAgICAgICAke2luZm9XSW5kb3dEYXRhfVxuICAgICAgICAgIDwvZGl2PmAsXG4gICAgICB9KTtcblxuXG4gICAgICBtYXJrZXIuYWRkTGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRJbmZvV2luZG93KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50SW5mb1dpbmRvdy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGluZm9XaW5kb3cub3Blbih0aGlzLm1hcCwgbWFya2VyKTtcbiAgICAgICAgdGhpcy5jdXJyZW50SW5mb1dpbmRvdyA9IGluZm9XaW5kb3c7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLm1hcC5maXRCb3VuZHModGhpcy5ib3VuZHMpO1xuXG4gICAgLy8gQWRkIGxpc3RlbmVyIGZvciB6b29tIGNoYW5nZXNcbiAgICB0aGlzLm1hcC5hZGRMaXN0ZW5lcignem9vbV9jaGFuZ2VkJywgKCkgPT4gdGhpcy5oYW5kbGVab29tQ2hhbmdlKCkpO1xuICB9XG5cbiAgaGFuZGxlWm9vbUNoYW5nZSgpIHtcbiAgICBjb25zdCB6b29tTGV2ZWwgPSB0aGlzLm1hcC5nZXRab29tKCk7XG4gICAgaWYgKHpvb21MZXZlbCA8IDUpIHtcbiAgICAgIC8vIFNob3cgaGVhdG1hcCBhbmQgaGlkZSBtYXJrZXJzXG4gICAgICB0aGlzLmhlYXRtYXAuc2V0TWFwKHRoaXMubWFwKTtcbiAgICAgIHRoaXMubWFya2Vycy5mb3JFYWNoKChtYXJrZXIpID0+IG1hcmtlci5zZXRNYXAobnVsbCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIaWRlIGhlYXRtYXAgYW5kIHNob3cgbWFya2Vyc1xuICAgICAgdGhpcy5oZWF0bWFwLnNldE1hcChudWxsKTtcbiAgICAgIHRoaXMubWFya2Vycy5mb3JFYWNoKChtYXJrZXIpID0+IG1hcmtlci5zZXRNYXAodGhpcy5tYXApKTtcbiAgICB9XG4gIH1cblxuICAvL2hlYXQgYW5kIE1hcmtlciAgbWFwIEVuZCAvL1xuXG4gIC8vQnViYmxlIENoYXJ0IFN0YXJ0XG4gIGFkZEJ1YmJsZU1hcmtlcnMoKTogdm9pZCB7XG4gICB0aGlzLnByZXBhcmVCdWJibGVEYXRhKCk7XG4gICAgdGhpcy5sb2NhdGlvbnMuZm9yRWFjaCgobG9jYXRpb24pID0+IHtcbiAgICAgIGNvbnN0IG1hcmtlciA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoe1xuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIGxhdDogcGFyc2VGbG9hdChcbiAgICAgICAgICAgIGxvY2F0aW9uW3RoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcubWFya2VyTGF0aXR1ZGVdXG4gICAgICAgICAgKSxcbiAgICAgICAgICBsbmc6IHBhcnNlRmxvYXQoXG4gICAgICAgICAgICBsb2NhdGlvblt0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLm1hcmtlckxvbmdpdHVkZV1cbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBpY29uOiB7XG4gICAgICAgICAgcGF0aDogZ29vZ2xlLm1hcHMuU3ltYm9sUGF0aC5DSVJDTEUsXG4gICAgICAgICAgc2NhbGU6IE1hdGgucm91bmQobG9jYXRpb24uc2FsZXNfcGVyY2VudGFnZSksIC8vIEFkanVzdCBidWJibGUgc2l6ZVxuICAgICAgICAgIGZpbGxDb2xvcjogdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5idWJibGVDb2xvcixcbiAgICAgICAgICBmaWxsT3BhY2l0eTogMC42LFxuICAgICAgICAgIHN0cm9rZVdlaWdodDogMCxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gdG9vbHRpcFRleHQ6XG4gICAgICAgIG1hcDogdGhpcy5tYXAsXG4gICAgICAgIC8vIHRpdGxlOiBgJHtsb2NhdGlvbi5jaXR5fTogJCR7bG9jYXRpb24udG90YWxfc2FsZXNfYW1vdW50fWAsXG4gICAgICAgIHRpdGxlOiBgJHtsb2NhdGlvbi5jaXR5fTogJCR7bG9jYXRpb25bdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5hZ3J1bWVudFZhbHVlXX1gLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmJvdW5kcy5leHRlbmQobWFya2VyLmdldFBvc2l0aW9uKCkpO1xuICAgICAgdGhpcy5tYXJrZXJzLnB1c2gobWFya2VyKTtcblxuICAgICAgLy8gQWRkIGFuIGluZm8gd2luZG93XG4gICAgICBsZXQgc3RyaW5nV2l0aG91dFF1b3RlcyA9IHRoaXMuZ2V0SW5mb1dpbmRvRGF0YShsb2NhdGlvbik7XG4gICAgICBjb25zdCBpbmZvV0luZG93RGF0YSA9IHRoaXMuZ2V0SW5mb1dpbmRvRGF0YShsb2NhdGlvbik7XG5cbiAgICAgIGNvbnN0IGluZm9XaW5kb3cgPSBuZXcgZ29vZ2xlLm1hcHMuSW5mb1dpbmRvdyh7XG4gICAgICAgIC8vIGNvbnRlbnQ6IGluZm9XSW5kb3dEYXRhLFxuICAgICAgICBjb250ZW50OiBgPGRpdiBzdHlsZT1cImhlaWdodDogMTAwJTsgd2lkdGg6IDEwMCU7IGNvbG9yOiBibGFjazsgZm9udC1zaXplOiAyMHB4O1wiPlxuICAgICAgICAke2luZm9XSW5kb3dEYXRhfVxuICAgICAgPC9kaXY+YCxcbiAgICAgIH0pO1xuXG4gICAgICBtYXJrZXIuYWRkTGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRJbmZvV2luZG93KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50SW5mb1dpbmRvdy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGluZm9XaW5kb3cub3Blbih0aGlzLm1hcCwgbWFya2VyKTtcbiAgICAgICAgdGhpcy5jdXJyZW50SW5mb1dpbmRvdyA9IGluZm9XaW5kb3c7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLm1hcC5maXRCb3VuZHModGhpcy5ib3VuZHMpO1xuXG5cbiAgfVxuXG4gIHByZXBhcmVCdWJibGVEYXRhKCl7XG4gICAgLy8gU3RlcCAxOiBGaW5kIG1pbiBhbmQgbWF4IHRvdGFsX3NhbGVzX2Ftb3VudFxuY29uc3QgbWluU2FsZXMgPSBNYXRoLm1pbiguLi50aGlzLmxvY2F0aW9ucy5tYXAoZCA9PiBkW3RoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcuYWdydW1lbnRWYWx1ZV0pKTtcbmNvbnN0IG1heFNhbGVzID0gTWF0aC5tYXgoLi4udGhpcy5sb2NhdGlvbnMubWFwKGQgPT4gZFt0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmFncnVtZW50VmFsdWVdKSk7XG5cbi8vIFN0ZXAgMjogRGVmaW5lIG1pbiBhbmQgbWF4IHBlcmNlbnRhZ2UgdmFsdWVzXG5jb25zdCBtaW5QZXJjZW50YWdlID0gdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5idWJibGVNaW5pbXVtU2l6ZTtcbmNvbnN0IG1heFBlcmNlbnRhZ2UgPSB0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmJ1YmJsZU1heGltdW1TaXplO1xuXG4vLyBTdGVwIDM6IE5vcm1hbGl6ZSBmdW5jdGlvblxuY29uc3Qgbm9ybWFsaXplID0gKHZhbHVlLCBtaW4sIG1heCkgPT4ge1xuICByZXR1cm4gKCh2YWx1ZSAtIG1pbikgLyAobWF4IC0gbWluKSkgKiAobWF4UGVyY2VudGFnZSAtIG1pblBlcmNlbnRhZ2UpICsgbWluUGVyY2VudGFnZTtcbn07XG5cbi8vIFN0ZXAgNDogQXNzaWduIGNhbGN1bGF0ZWQgcGVyY2VudGFnZSB0byBlYWNoIG9iamVjdFxudGhpcy5sb2NhdGlvbnMuZm9yRWFjaChkID0+IHtcbiAgZC5zYWxlc19wZXJjZW50YWdlID0gTWF0aC5taW4oTWF0aC5tYXgobm9ybWFsaXplKGRbdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5hZ3J1bWVudFZhbHVlXSwgbWluU2FsZXMsIG1heFNhbGVzKSwgbWluUGVyY2VudGFnZSksIG1heFBlcmNlbnRhZ2UpO1xufSk7XG5cbiAgfVxuIFxuXG5cbiAgLy9CdWJibGUgQ2hhcnQgRW5kXG59XG4iLCJcbjxkaXYgY2xhc3M9XCJteC0yIGJnLWdyYXktODAwXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTG9hZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLXN0YXJ0IGJnLWdyYXktODAwIHAtMlwiPlxuICAgICAgICAgICAgPGFwcC1sb2FkZXI+PC9hcHAtbG9hZGVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXYgY2xhc3M9XCJteC0yIHBiLTJcIj5cblxuICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSA8ZGl2IGlkPVwicmVnaW9uc19kaXZcIiBzdHlsZT1cIndpZHRoOiAxMDAlXCIgPjwvZGl2PiAgIC0tPlxuICAgICAgICA8ZGl2IGlkPVwicmVnaW9uc19kaXZcIiAjZ29vZ2xNYXAgc3R5bGU9XCJ3aWR0aDogMTAwJVwiID48L2Rpdj4gICAgXG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIFxuICAgICAgIFxuXG4gICAgPC9kaXY+XG5cblxuPC9kaXY+XG4iXX0=