@igo2/geo 17.0.0-next.7 → 17.0.0-next.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/icons/cross_black_18px.svg +88 -88
- package/assets/icons/place_blue_36px.svg +55 -55
- package/assets/icons/place_green_36px.svg +55 -55
- package/assets/icons/place_red_36px.svg +55 -55
- package/assets/icons/place_yellow_36px.svg +55 -55
- package/assets/images/north-direction.png +0 -0
- package/esm2022/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +3 -3
- package/esm2022/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +3 -3
- package/esm2022/lib/catalog/catalog-browser/catalog-browser.component.mjs +3 -3
- package/esm2022/lib/catalog/catalog-browser/catalog-browser.module.mjs +4 -4
- package/esm2022/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +3 -3
- package/esm2022/lib/catalog/catalog-library/catalog-library-item.component.mjs +3 -3
- package/esm2022/lib/catalog/catalog-library/catalog-library.component.mjs +11 -17
- package/esm2022/lib/catalog/catalog-library/catalog-library.module.mjs +4 -4
- package/esm2022/lib/catalog/catalog.module.mjs +4 -4
- package/esm2022/lib/catalog/shared/catalog.service.mjs +3 -3
- package/esm2022/lib/catalog/shared/index.mjs +1 -1
- package/esm2022/lib/datasource/index.mjs +1 -1
- package/esm2022/lib/datasource/shared/capabilities.service.mjs +3 -3
- package/esm2022/lib/datasource/shared/datasource.service.mjs +3 -3
- package/esm2022/lib/datasource/shared/datasources/index.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/wfs.service.mjs +3 -3
- package/esm2022/lib/datasource/shared/options/options-api.service.mjs +3 -3
- package/esm2022/lib/directions/directions-buttons/directions-buttons.component.mjs +3 -3
- package/esm2022/lib/directions/directions-buttons/index.mjs +1 -1
- package/esm2022/lib/directions/directions-inputs/directions-inputs.component.mjs +3 -3
- package/esm2022/lib/directions/directions-inputs/index.mjs +1 -1
- package/esm2022/lib/directions/directions-results/directions-results.component.mjs +3 -3
- package/esm2022/lib/directions/directions-results/index.mjs +1 -1
- package/esm2022/lib/directions/directions-sources/index.mjs +1 -1
- package/esm2022/lib/directions/directions-sources/osrm-directions-source.mjs +3 -3
- package/esm2022/lib/directions/directions.component.mjs +3 -3
- package/esm2022/lib/directions/directions.module.mjs +4 -4
- package/esm2022/lib/directions/shared/directions-source.service.mjs +1 -1
- package/esm2022/lib/directions/shared/directions.enum.mjs +1 -1
- package/esm2022/lib/directions/shared/directions.service.mjs +19 -5
- package/esm2022/lib/directions/shared/index.mjs +1 -1
- package/esm2022/lib/download/download-button/download-button.component.mjs +3 -3
- package/esm2022/lib/download/download-button/index.mjs +1 -1
- package/esm2022/lib/download/download.module.mjs +4 -4
- package/esm2022/lib/download/index.mjs +1 -1
- package/esm2022/lib/download/shared/download.interface.mjs +1 -1
- package/esm2022/lib/download/shared/download.service.mjs +3 -3
- package/esm2022/lib/download/shared/index.mjs +1 -1
- package/esm2022/lib/draw/draw/draw-layer-popup.component.mjs +3 -3
- package/esm2022/lib/draw/draw/draw-popup.component.mjs +4 -4
- package/esm2022/lib/draw/draw/draw-shorcuts.component.mjs +3 -3
- package/esm2022/lib/draw/draw/draw.component.mjs +4 -4
- package/esm2022/lib/draw/draw/draw.module.mjs +4 -4
- package/esm2022/lib/draw/drawingTool.module.mjs +4 -4
- package/esm2022/lib/draw/index.mjs +1 -1
- package/esm2022/lib/draw/shared/draw-icon.service.mjs +3 -3
- package/esm2022/lib/feature/feature-details/feature-details.component.mjs +3 -3
- package/esm2022/lib/feature/feature-details/feature-details.directive.mjs +3 -3
- package/esm2022/lib/feature/feature-details/feature-details.module.mjs +4 -4
- package/esm2022/lib/feature/feature-form/feature-form.component.mjs +3 -3
- package/esm2022/lib/feature/feature-form/feature-form.module.mjs +4 -4
- package/esm2022/lib/feature/feature.module.mjs +4 -4
- package/esm2022/lib/feature/shared/feature.enums.mjs +1 -1
- package/esm2022/lib/filter/filter.module.mjs +4 -4
- package/esm2022/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +3 -3
- package/esm2022/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +3 -3
- package/esm2022/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +4 -4
- package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.mjs +3 -3
- package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +3 -3
- package/esm2022/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +3 -3
- package/esm2022/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +3 -3
- package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +3 -3
- package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +3 -3
- package/esm2022/lib/filter/shared/filterable-datasource.pipe.mjs +3 -3
- package/esm2022/lib/filter/shared/ogc-filter-time.service.mjs +3 -3
- package/esm2022/lib/filter/shared/ogc-filter.service.mjs +3 -3
- package/esm2022/lib/filter/shared/spatial-filter.service.mjs +3 -3
- package/esm2022/lib/filter/shared/time-filter.service.mjs +3 -3
- package/esm2022/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +3 -3
- package/esm2022/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +3 -3
- package/esm2022/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +4 -4
- package/esm2022/lib/filter/time-filter-button/time-filter-button.component.mjs +3 -3
- package/esm2022/lib/filter/time-filter-form/time-filter-form.component.mjs +3 -3
- package/esm2022/lib/filter/time-filter-item/time-filter-item.component.mjs +3 -3
- package/esm2022/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +3 -3
- package/esm2022/lib/filter/time-filter-list/time-filter-list.component.mjs +3 -3
- package/esm2022/lib/geo.module.mjs +4 -4
- package/esm2022/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +3 -3
- package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +4 -4
- package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +4 -4
- package/esm2022/lib/geometry/geometry.module.mjs +4 -4
- package/esm2022/lib/geometry/shared/controls/index.mjs +1 -1
- package/esm2022/lib/geometry/shared/index.mjs +1 -1
- package/esm2022/lib/import-export/export-button/export-button.component.mjs +3 -3
- package/esm2022/lib/import-export/export-button/index.mjs +1 -1
- package/esm2022/lib/import-export/import-export/import-export.component.mjs +4 -4
- package/esm2022/lib/import-export/import-export/index.mjs +1 -1
- package/esm2022/lib/import-export/import-export.module.mjs +4 -4
- package/esm2022/lib/import-export/shared/drop-geo-file.directive.mjs +3 -3
- package/esm2022/lib/import-export/shared/export.errors.mjs +1 -1
- package/esm2022/lib/import-export/shared/export.service.mjs +3 -3
- package/esm2022/lib/import-export/shared/import.service.mjs +3 -3
- package/esm2022/lib/import-export/shared/index.mjs +1 -1
- package/esm2022/lib/layer/layer-item/layer-item.component.mjs +3 -3
- package/esm2022/lib/layer/layer-legend/layer-legend.component.mjs +3 -3
- package/esm2022/lib/layer/layer-legend-item/layer-legend-item.component.mjs +3 -3
- package/esm2022/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +3 -3
- package/esm2022/lib/layer/layer-legend-list/layer-legend-list.component.mjs +3 -3
- package/esm2022/lib/layer/layer-list/layer-list-binding.directive.mjs +3 -3
- package/esm2022/lib/layer/layer-list/layer-list.component.mjs +17 -23
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.component.mjs +3 -3
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.service.mjs +3 -3
- package/esm2022/lib/layer/layer.module.mjs +4 -4
- package/esm2022/lib/layer/shared/layer.service.mjs +3 -3
- package/esm2022/lib/layer/shared/layers/index.mjs +1 -1
- package/esm2022/lib/layer/track-feature-button/track-feature-button.component.mjs +3 -3
- package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +3 -3
- package/esm2022/lib/map/baselayers-switcher/mini-basemap.component.mjs +3 -3
- package/esm2022/lib/map/geolocate-button/geolocate-button.component.mjs +3 -3
- package/esm2022/lib/map/home-extent-button/home-extent-button.component.mjs +3 -3
- package/esm2022/lib/map/info-section/info-section.component.mjs +3 -3
- package/esm2022/lib/map/map-browser/map-browser.component.mjs +3 -3
- package/esm2022/lib/map/map-center/map-center.component.mjs +3 -3
- package/esm2022/lib/map/map.module.mjs +4 -4
- package/esm2022/lib/map/menu-button/menu-button.component.mjs +3 -3
- package/esm2022/lib/map/offline-button/offline-button.component.mjs +3 -3
- package/esm2022/lib/map/rotation-button/rotation-button.component.mjs +3 -3
- package/esm2022/lib/map/shared/hover-feature.directive.mjs +3 -3
- package/esm2022/lib/map/shared/map-pointer-position.directive.mjs +3 -3
- package/esm2022/lib/map/shared/map.service.mjs +3 -3
- package/esm2022/lib/map/shared/mapOffline.directive.mjs +3 -3
- package/esm2022/lib/map/shared/projection.service.mjs +3 -3
- package/esm2022/lib/map/swipe-control/swipe-control.component.mjs +3 -3
- package/esm2022/lib/map/wake-lock-button/wake-lock-button.component.mjs +3 -3
- package/esm2022/lib/map/zoom-button/zoom-button.component.mjs +3 -3
- package/esm2022/lib/measure/measure.module.mjs +4 -4
- package/esm2022/lib/measure/measurer/measure-format.pipe.mjs +3 -3
- package/esm2022/lib/measure/measurer/measurer-dialog.component.mjs +3 -3
- package/esm2022/lib/measure/measurer/measurer-item.component.mjs +3 -3
- package/esm2022/lib/measure/measurer/measurer.component.mjs +4 -4
- package/esm2022/lib/measure/measurer/measurer.module.mjs +4 -4
- package/esm2022/lib/measure/shared/index.mjs +1 -1
- package/esm2022/lib/metadata/metadata-button/index.mjs +1 -1
- package/esm2022/lib/metadata/metadata-button/metadata-button.component.mjs +8 -8
- package/esm2022/lib/metadata/metadata.module.mjs +4 -4
- package/esm2022/lib/metadata/shared/index.mjs +1 -1
- package/esm2022/lib/metadata/shared/metadata.service.mjs +4 -4
- package/esm2022/lib/offline/geoDB/configFileToGeoDB.service.mjs +3 -3
- package/esm2022/lib/offline/geoDB/geoDB.service.mjs +3 -3
- package/esm2022/lib/offline/geoDB/index.mjs +1 -1
- package/esm2022/lib/offline/layerDB/layerDB.service.mjs +3 -3
- package/esm2022/lib/offline/shared/geo-network.service.mjs +3 -3
- package/esm2022/lib/offline/shared/index.mjs +1 -1
- package/esm2022/lib/overlay/index.mjs +1 -1
- package/esm2022/lib/overlay/overlay.module.mjs +4 -4
- package/esm2022/lib/overlay/shared/overlay.directive.mjs +3 -3
- package/esm2022/lib/overlay/shared/overlay.service.mjs +3 -3
- package/esm2022/lib/print/index.mjs +1 -1
- package/esm2022/lib/print/print/print.component.mjs +5 -5
- package/esm2022/lib/print/print-form/index.mjs +1 -1
- package/esm2022/lib/print/print-form/print-form.component.mjs +18 -6
- package/esm2022/lib/print/print.module.mjs +4 -4
- package/esm2022/lib/print/shared/index.mjs +1 -1
- package/esm2022/lib/print/shared/print.interface.mjs +1 -1
- package/esm2022/lib/print/shared/print.service.mjs +96 -58
- package/esm2022/lib/query/index.mjs +1 -1
- package/esm2022/lib/query/query.module.mjs +4 -4
- package/esm2022/lib/query/shared/query-search-source.mjs +3 -3
- package/esm2022/lib/query/shared/query.directive.mjs +3 -3
- package/esm2022/lib/query/shared/query.enums.mjs +1 -1
- package/esm2022/lib/query/shared/query.service.mjs +3 -3
- package/esm2022/lib/search/search-bar/search-bar.component.mjs +3 -3
- package/esm2022/lib/search/search-bar/search-bar.module.mjs +4 -4
- package/esm2022/lib/search/search-results/save-feature-dialog.component.mjs +3 -3
- package/esm2022/lib/search/search-results/search-results-add-button.component.mjs +3 -3
- package/esm2022/lib/search/search-results/search-results-item.component.mjs +3 -3
- package/esm2022/lib/search/search-results/search-results.component.mjs +3 -3
- package/esm2022/lib/search/search-results/search-results.module.mjs +4 -4
- package/esm2022/lib/search/search-selector/search-selector.component.mjs +3 -3
- package/esm2022/lib/search/search-selector/search-selector.module.mjs +4 -4
- package/esm2022/lib/search/search-settings/search-settings.component.mjs +3 -3
- package/esm2022/lib/search/search-settings/search-settings.module.mjs +4 -4
- package/esm2022/lib/search/search.module.mjs +4 -4
- package/esm2022/lib/search/shared/search-pointer-summary.directive.mjs +3 -3
- package/esm2022/lib/search/shared/search.service.mjs +3 -3
- package/esm2022/lib/search/shared/sources/cadastre.mjs +3 -3
- package/esm2022/lib/search/shared/sources/coordinates.mjs +6 -6
- package/esm2022/lib/search/shared/sources/icherche.mjs +9 -9
- package/esm2022/lib/search/shared/sources/ilayer.mjs +6 -6
- package/esm2022/lib/search/shared/sources/nominatim.interfaces.mjs +1 -1
- package/esm2022/lib/search/shared/sources/nominatim.mjs +3 -3
- package/esm2022/lib/search/shared/sources/storedqueries.mjs +6 -6
- package/esm2022/lib/search/shared/sources/workspace.mjs +3 -3
- package/esm2022/lib/style/style-list/style-list.module.mjs +4 -4
- package/esm2022/lib/style/style-list/style-list.service.mjs +3 -3
- package/esm2022/lib/style/style-modal/drawing/style-modal-drawing.component.mjs +3 -3
- package/esm2022/lib/style/style-modal/layer/style-modal-layer.component.mjs +3 -3
- package/esm2022/lib/style/style-modal/layer-button/style-modal-layer-button.component.mjs +3 -3
- package/esm2022/lib/style/style-service/draw-style.service.mjs +3 -3
- package/esm2022/lib/style/style-service/style.service.mjs +3 -3
- package/esm2022/lib/style/style.module.mjs +4 -4
- package/esm2022/lib/toast/index.mjs +1 -1
- package/esm2022/lib/toast/toast.component.mjs +3 -3
- package/esm2022/lib/toast/toast.module.mjs +4 -4
- package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.service.mjs +3 -3
- package/esm2022/lib/wkt/index.mjs +1 -1
- package/esm2022/lib/wkt/shared/index.mjs +1 -1
- package/esm2022/lib/wkt/shared/wkt.service.mjs +3 -3
- package/esm2022/lib/wkt/wkt.module.mjs +4 -4
- package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.component.mjs +3 -3
- package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.module.mjs +4 -4
- package/esm2022/lib/workspace/index.mjs +1 -1
- package/esm2022/lib/workspace/shared/edition-workspace.service.mjs +3 -3
- package/esm2022/lib/workspace/shared/feature-workspace.service.mjs +3 -3
- package/esm2022/lib/workspace/shared/index.mjs +1 -1
- package/esm2022/lib/workspace/shared/wfs-workspace.service.mjs +3 -3
- package/esm2022/lib/workspace/shared/wms-workspace.service.mjs +3 -3
- package/esm2022/lib/workspace/widgets/index.mjs +1 -1
- package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +3 -3
- package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.module.mjs +4 -4
- package/esm2022/lib/workspace/workspace-selector/workspace-selector.directive.mjs +3 -3
- package/esm2022/lib/workspace/workspace-selector/workspace-selector.module.mjs +4 -4
- package/esm2022/lib/workspace/workspace-updator/workspace-updator.directive.mjs +3 -3
- package/esm2022/lib/workspace/workspace-updator/workspace-updator.module.mjs +4 -4
- package/esm2022/lib/workspace/workspace.module.mjs +4 -4
- package/fesm2022/igo2-geo.mjs +736 -682
- package/fesm2022/igo2-geo.mjs.map +1 -1
- package/lib/catalog/catalog-library/catalog-library.component.d.ts +1 -4
- package/lib/directions/shared/directions.service.d.ts +1 -0
- package/lib/layer/layer-list/layer-list.component.d.ts +1 -4
- package/lib/print/print-form/print-form.component.d.ts +4 -1
- package/lib/print/shared/print.interface.d.ts +1 -0
- package/lib/print/shared/print.service.d.ts +16 -10
- package/lib/wkt/shared/wkt.service.d.ts +1 -1
- package/locale/en.geo.json +2 -1
- package/locale/fr.geo.json +2 -1
- package/package.json +6 -6
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { DOCUMENT } from '@angular/common';
|
|
1
2
|
import { HttpClient } from '@angular/common/http';
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
+
import { Inject, Injectable } from '@angular/core';
|
|
3
4
|
import { SecureImagePipe } from '@igo2/common/image';
|
|
4
5
|
import { ActivityService } from '@igo2/core/activity';
|
|
5
6
|
import { ConfigService } from '@igo2/core/config';
|
|
@@ -28,6 +29,7 @@ export class PrintService {
|
|
|
28
29
|
activityService;
|
|
29
30
|
languageService;
|
|
30
31
|
configService;
|
|
32
|
+
document;
|
|
31
33
|
zipFile;
|
|
32
34
|
nbFileToProcess;
|
|
33
35
|
activityId;
|
|
@@ -42,12 +44,13 @@ export class PrintService {
|
|
|
42
44
|
commentFontStyle: 'normal',
|
|
43
45
|
commentFontSize: 12
|
|
44
46
|
};
|
|
45
|
-
constructor(http, messageService, activityService, languageService, configService) {
|
|
47
|
+
constructor(http, messageService, activityService, languageService, configService, document) {
|
|
46
48
|
this.http = http;
|
|
47
49
|
this.messageService = messageService;
|
|
48
50
|
this.activityService = activityService;
|
|
49
51
|
this.languageService = languageService;
|
|
50
52
|
this.configService = configService;
|
|
53
|
+
this.document = document;
|
|
51
54
|
}
|
|
52
55
|
print(map, options) {
|
|
53
56
|
const status$ = new Subject();
|
|
@@ -91,18 +94,20 @@ export class PrintService {
|
|
|
91
94
|
if (options.comment !== undefined && options.comment !== '') {
|
|
92
95
|
this.addComment(doc, options.comment, baseMargins, verticalSpacing);
|
|
93
96
|
}
|
|
94
|
-
|
|
95
|
-
this.addProjScale(doc, map, resolution, options.showProjection, options.showScale, baseMargins, verticalSpacing);
|
|
96
|
-
}
|
|
97
|
+
this.handleFooter(map, doc, options, resolution, verticalSpacing, baseMargins);
|
|
97
98
|
const width = pageWidth - baseMargins[3] - baseMargins[1];
|
|
98
99
|
const height = pageHeight - baseMargins[0] - baseMargins[2];
|
|
99
100
|
const size = [width, height];
|
|
100
101
|
this.addMap(doc, map, resolution, size, baseMargins, legendPostion).subscribe(async (status) => {
|
|
101
102
|
if (status === SubjectStatus.Done) {
|
|
102
|
-
await this.handleMeasureLayer(doc, map, baseMargins);
|
|
103
103
|
const width = this.imgSizeAdded[0];
|
|
104
104
|
const height = this.imgSizeAdded[1];
|
|
105
105
|
this.addGeoRef(doc, map, width, height, baseMargins);
|
|
106
|
+
await this.handleMeasureLayer(doc, map, baseMargins);
|
|
107
|
+
if (options.showNorthArrow) {
|
|
108
|
+
const northArrowCanvas = await this.createNorthDirectionArrow(map.viewController.getRotation());
|
|
109
|
+
await this.addNorthArrowInDoc(doc, northArrowCanvas, baseMargins, legendPostion, width);
|
|
110
|
+
}
|
|
106
111
|
if (options.legendPosition !== 'none') {
|
|
107
112
|
if (['topleft', 'topright', 'bottomleft', 'bottomright'].indexOf(options.legendPosition) > -1) {
|
|
108
113
|
await this.addLegendSamePage(doc, map, baseMargins, resolution, options.legendPosition);
|
|
@@ -314,40 +319,56 @@ export class PrintService {
|
|
|
314
319
|
doc.text(textToAdd, textMarginLeft, textMarginTop);
|
|
315
320
|
}
|
|
316
321
|
/**
|
|
317
|
-
* Add projection and/or scale to the document
|
|
318
|
-
* @param doc - pdf document
|
|
322
|
+
* Add attribution and/or (projection and/or scale) to the document
|
|
319
323
|
* @param map - Map of the app
|
|
320
|
-
* @param
|
|
321
|
-
* @param
|
|
322
|
-
* @param
|
|
324
|
+
* @param doc - pdf document
|
|
325
|
+
* @param options - Print options
|
|
326
|
+
* @param resolution - cart resolution
|
|
323
327
|
* @param baseMargins - top | right | bottom | left
|
|
324
328
|
* @param verticalSpacing - calculate text position and map height
|
|
325
329
|
*/
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
330
|
+
async handleFooter(map, doc, options, resolution, verticalSpacing, baseMargins) {
|
|
331
|
+
let text = '';
|
|
332
|
+
const attributionText = this.getAttributionText(map);
|
|
333
|
+
if (attributionText) {
|
|
334
|
+
text += attributionText + '. ';
|
|
335
|
+
}
|
|
336
|
+
if (options.showProjection === true || options.showScale === true) {
|
|
337
|
+
text += this.getProjScale(map, options, resolution);
|
|
338
|
+
}
|
|
339
|
+
if (text) {
|
|
340
|
+
baseMargins[2] += verticalSpacing;
|
|
341
|
+
}
|
|
331
342
|
const xPosition = baseMargins[3];
|
|
332
343
|
const marginBottom = baseMargins[2];
|
|
333
344
|
// calculate text position Y
|
|
334
345
|
const yPosition = doc.internal.pageSize.height - marginBottom + verticalSpacing;
|
|
346
|
+
this.addTextInPdfDoc(doc, text, this.TEXTPDFFONT.commentFont, this.TEXTPDFFONT.commentFontStyle, this.TEXTPDFFONT.commentFontSize, xPosition, yPosition);
|
|
347
|
+
}
|
|
348
|
+
getAttributionText(map) {
|
|
349
|
+
const mapOverlayHtml = map.ol.getOverlayContainerStopEvent();
|
|
350
|
+
const htmlAttribution = mapOverlayHtml
|
|
351
|
+
.getElementsByClassName('ol-attribution')[0]
|
|
352
|
+
.cloneNode(true);
|
|
353
|
+
htmlAttribution.getElementsByTagName('button')[0].remove();
|
|
354
|
+
return htmlAttribution.innerText;
|
|
355
|
+
}
|
|
356
|
+
getProjScale(map, options, dpi) {
|
|
357
|
+
const translate = this.languageService.translate;
|
|
335
358
|
let textProjScale = '';
|
|
336
|
-
if (
|
|
359
|
+
if (options.showProjection === true) {
|
|
337
360
|
const projText = translate.instant('igo.geo.printForm.projection');
|
|
338
361
|
textProjScale += projText + ': ' + map.projection;
|
|
339
362
|
}
|
|
340
|
-
if (
|
|
341
|
-
if (
|
|
363
|
+
if (options.showScale === true) {
|
|
364
|
+
if (options.showProjection === true) {
|
|
342
365
|
textProjScale += ' ';
|
|
343
366
|
}
|
|
344
367
|
const scaleText = translate.instant('igo.geo.printForm.scale');
|
|
345
368
|
const mapScale = map.viewController.getScale(dpi);
|
|
346
369
|
textProjScale += scaleText + ': ~ 1 / ' + formatScale(mapScale);
|
|
347
370
|
}
|
|
348
|
-
|
|
349
|
-
doc.setFontSize(projScaleSize);
|
|
350
|
-
doc.text(textProjScale, xPosition, yPosition);
|
|
371
|
+
return textProjScale;
|
|
351
372
|
}
|
|
352
373
|
/**
|
|
353
374
|
* Add the legend to the document
|
|
@@ -608,10 +629,6 @@ export class PrintService {
|
|
|
608
629
|
const mapOverlayHTML = map.ol
|
|
609
630
|
.getOverlayContainerStopEvent()
|
|
610
631
|
.cloneNode(true);
|
|
611
|
-
// add North Direction to mapOverly
|
|
612
|
-
await this.addNorthDirection(mapOverlayHTML, position);
|
|
613
|
-
// add map Attribution designe to print
|
|
614
|
-
await this.addAttribution(mapOverlayHTML);
|
|
615
632
|
// set 'OverlayContainer' size to print size
|
|
616
633
|
mapOverlayHTML.style.width = canvas.width + 'px';
|
|
617
634
|
mapOverlayHTML.style.height = canvas.height + 'px';
|
|
@@ -631,7 +648,12 @@ export class PrintService {
|
|
|
631
648
|
scale: 1,
|
|
632
649
|
backgroundColor: null,
|
|
633
650
|
allowTaint: true,
|
|
634
|
-
useCORS: true
|
|
651
|
+
useCORS: true,
|
|
652
|
+
ignoreElements: (element) => {
|
|
653
|
+
return element instanceof HTMLElement
|
|
654
|
+
? element.className.includes('ol-attribution')
|
|
655
|
+
: false;
|
|
656
|
+
}
|
|
635
657
|
});
|
|
636
658
|
if (canvasOverlayHTML.width !== 0 && canvasOverlayHTML.height !== 0) {
|
|
637
659
|
context.drawImage(canvasOverlayHTML, 0, 0);
|
|
@@ -639,34 +661,43 @@ export class PrintService {
|
|
|
639
661
|
// remove 'mapOverlayHTML' after generating canvas
|
|
640
662
|
mapOverlayHTML.remove();
|
|
641
663
|
}
|
|
642
|
-
async
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
664
|
+
async addNorthArrowInDoc(doc, arrawCanvas, baseMargins, legendPosition, width, yPosition = 0) {
|
|
665
|
+
let xPosition = 0;
|
|
666
|
+
let northArrowDimension = 0;
|
|
667
|
+
if (doc instanceof CanvasRenderingContext2D) {
|
|
668
|
+
northArrowDimension = 50;
|
|
669
|
+
xPosition =
|
|
670
|
+
legendPosition === 'topright' ? 0 : width - northArrowDimension;
|
|
671
|
+
doc.drawImage(arrawCanvas, xPosition, yPosition, northArrowDimension, northArrowDimension);
|
|
649
672
|
}
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
673
|
+
else {
|
|
674
|
+
northArrowDimension = 16;
|
|
675
|
+
xPosition = legendPosition === 'topright' ? 10 : width - baseMargins[1];
|
|
676
|
+
yPosition = baseMargins[0];
|
|
677
|
+
doc.addImage(arrawCanvas.toDataURL(), xPosition, yPosition, northArrowDimension, northArrowDimension);
|
|
655
678
|
}
|
|
656
|
-
HTMLButton.parentElement.style.background = 'transparent';
|
|
657
|
-
HTMLButton.style.color = '#000';
|
|
658
|
-
mapOverlayHTML.appendChild(northDirection);
|
|
659
679
|
}
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
680
|
+
/**
|
|
681
|
+
* @param rotation - map rotation 'rad' unit
|
|
682
|
+
*
|
|
683
|
+
*/
|
|
684
|
+
async createNorthDirectionArrow(rotation) {
|
|
685
|
+
const div = this.document.createElement('div');
|
|
686
|
+
div.style.maxWidth = '50mm';
|
|
687
|
+
div.style.maxHeight = '50mm';
|
|
688
|
+
div.style.textAlign = 'center';
|
|
689
|
+
const img = this.document.createElement('img');
|
|
690
|
+
img.src = './assets/igo2/geo/images/north-direction.png';
|
|
691
|
+
img.style.maxWidth = '50mm';
|
|
692
|
+
img.style.maxHeight = '50mm';
|
|
693
|
+
img.style.transform = 'rotate(' + rotation + 'rad)';
|
|
694
|
+
img.style.padding = '5mm';
|
|
695
|
+
div.appendChild(img);
|
|
696
|
+
this.document.body.appendChild(div);
|
|
697
|
+
const canvas = await html2canvas(div, { backgroundColor: null });
|
|
698
|
+
this.removeHtmlElement(div);
|
|
699
|
+
if (canvas) {
|
|
700
|
+
return canvas;
|
|
670
701
|
}
|
|
671
702
|
}
|
|
672
703
|
/**
|
|
@@ -682,7 +713,7 @@ export class PrintService {
|
|
|
682
713
|
* @param doZipFile - Indicate if we do a zip with the file
|
|
683
714
|
* @return Image file of the map with extension format given as parameter
|
|
684
715
|
*/
|
|
685
|
-
downloadMapImage(map, printResolution, format = 'png', projection = false, scale = false, title = '', subtitle = '', comment = '', doZipFile = true, legendPosition) {
|
|
716
|
+
downloadMapImage(map, printResolution, format = 'png', projection = false, scale = false, title = '', subtitle = '', comment = '', doZipFile = true, legendPosition, showNorthArrow) {
|
|
686
717
|
const status$ = new Subject();
|
|
687
718
|
this.activityId = this.activityService.register();
|
|
688
719
|
const translate = this.languageService.translate;
|
|
@@ -815,6 +846,10 @@ export class PrintService {
|
|
|
815
846
|
}
|
|
816
847
|
}
|
|
817
848
|
newContext.drawImage(mapResultCanvas, 0, positionHCanvas);
|
|
849
|
+
if (showNorthArrow) {
|
|
850
|
+
const northArrowCanvas = await this.createNorthDirectionArrow(map.viewController.getRotation());
|
|
851
|
+
await this.addNorthArrowInDoc(newContext, northArrowCanvas, null, legendPosition, width, positionHCanvas);
|
|
852
|
+
}
|
|
818
853
|
let status = SubjectStatus.Done;
|
|
819
854
|
let fileNameWithExt = 'map.' + format;
|
|
820
855
|
if (format.toLowerCase() === 'tiff') {
|
|
@@ -1098,13 +1133,16 @@ export class PrintService {
|
|
|
1098
1133
|
}
|
|
1099
1134
|
return n * k;
|
|
1100
1135
|
}
|
|
1101
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.
|
|
1102
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.
|
|
1136
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: PrintService, deps: [{ token: i1.HttpClient }, { token: i2.MessageService }, { token: i3.ActivityService }, { token: i4.LanguageService }, { token: i5.ConfigService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1137
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: PrintService, providedIn: 'root' });
|
|
1103
1138
|
}
|
|
1104
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.
|
|
1139
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: PrintService, decorators: [{
|
|
1105
1140
|
type: Injectable,
|
|
1106
1141
|
args: [{
|
|
1107
1142
|
providedIn: 'root'
|
|
1108
1143
|
}]
|
|
1109
|
-
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.MessageService }, { type: i3.ActivityService }, { type: i4.LanguageService }, { type: i5.ConfigService }
|
|
1110
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL3ByaW50L3NoYXJlZC9wcmludC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU1QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sV0FBVyxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLE9BQU8sSUFBSSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxHQUFHLElBQUksS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sWUFBWSxNQUFNLFVBQVUsQ0FBQztBQUVwQyxPQUFPLEVB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b24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFNlY3VyZUltYWdlUGlwZSB9IGZyb20gJ0BpZ28yL2NvbW1vbi9pbWFnZSc7XG5pbXBvcnQgeyBBY3Rpdml0eVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL2FjdGl2aXR5JztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL2NvbmZpZyc7XG5pbXBvcnQgeyBMYW5ndWFnZVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL2xhbmd1YWdlJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9tZXNzYWdlJztcbmltcG9ydCB7IFN1YmplY3RTdGF0dXMgfSBmcm9tICdAaWdvMi91dGlscyc7XG5cbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IGh0bWwyY2FudmFzIGZyb20gJ2h0bWwyY2FudmFzJztcbmltcG9ydCBqc1BERiBmcm9tICdqc3BkZic7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIEpTWmlwIH0gZnJvbSAnanN6aXAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZm9ya0pvaW4gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCBhcyByeE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTGVnZW5kTWFwVmlld09wdGlvbnMgfSBmcm9tICcuLi8uLi9sYXllci9zaGFyZWQvbGF5ZXJzL2xlZ2VuZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZ2V0TGF5ZXJzTGVnZW5kcyB9IGZyb20gJy4uLy4uL2xheWVyL3V0aWxzL291dHB1dExlZ2VuZCc7XG5pbXBvcnQgeyBJZ29NYXAgfSBmcm9tICcuLi8uLi9tYXAvc2hhcmVkL21hcCc7XG5pbXBvcnQgeyBmb3JtYXRTY2FsZSB9IGZyb20gJy4uLy4uL21hcC9zaGFyZWQvbWFwLnV0aWxzJztcbmltcG9ydCBHZW9QZGZQbHVnaW4gZnJvbSAnLi9nZW9wZGYnO1xuaW1wb3J0IHsgUHJpbnRPcHRpb25zLCBUZXh0UGRmU2l6ZUFuZE1hcmdpbiB9IGZyb20gJy4vcHJpbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIFByaW50TGVnZW5kUG9zaXRpb24sXG4gIFByaW50UGFwZXJGb3JtYXQsXG4gIFByaW50UmVzb2x1dGlvblxufSBmcm9tICcuL3ByaW50LnR5cGUnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBOYXZpZ2F0b3Ige1xuICAgIG1zU2F2ZUJsb2I/OiAoYmxvYjogYW55LCBkZWZhdWx0TmFtZT86IHN0cmluZykgPT4gYm9vbGVhbjtcbiAgfVxufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQcmludFNlcnZpY2Uge1xuICB6aXBGaWxlOiBKU1ppcDtcbiAgbmJGaWxlVG9Qcm9jZXNzOiBudW1iZXI7XG4gIGFjdGl2aXR5SWQ6IHN0cmluZztcbiAgbWFwUHJpbnRFeHRlbnQ6IEFycmF5PG51bWJlcj47XG4gIGltZ1NpemVBZGRlZDogQXJyYXk8bnVtYmVyPjtcblxuICBURVhUUERGRk9OVCA9IHtcbiAgICB0aXRsZUZvbnQ6ICd0aW1lcycsXG4gICAgdGl0bGVGb250U3R5bGU6ICdib2xkJyxcbiAgICBzdWJ0aXRsZUZvbnQ6ICd0aW1lcycsXG4gICAgc3VidGl0bGVGb250U3R5bGU6ICdib2xkJyxcbiAgICBjb21tZW50Rm9udDogJ3RpbWVzJyxcbiAgICBjb21tZW50Rm9udFN0eWxlOiAnbm9ybWFsJyxcbiAgICBjb21tZW50Rm9udFNpemU6IDEyXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aXZpdHlTZXJ2aWNlOiBBY3Rpdml0eVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2VcbiAgKSB7fVxuXG4gIHByaW50KG1hcDogSWdvTWFwLCBvcHRpb25zOiBQcmludE9wdGlvbnMpOiBTdWJqZWN0PGFueT4ge1xuICAgIGNvbnN0IHN0YXR1cyQgPSBuZXcgU3ViamVjdCgpO1xuICAgIGNvbnN0IHBhcGVyRm9ybWF0OiBzdHJpbmcgPSBvcHRpb25zLnBhcGVyRm9ybWF0O1xuICAgIGNvbnN0IHJlc29sdXRpb24gPSArb3B0aW9ucy5yZXNvbHV0aW9uOyAvLyBEZWZhdWx0IGlzIDk2XG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSBvcHRpb25zLm9yaWVudGF0aW9uO1xuICAgIGNvbnN0IGxlZ2VuZFBvc3Rpb24gPSBvcHRpb25zLmxlZ2VuZFBvc2l0aW9uO1xuICAgIHRoaXMuYWN0aXZpdHlJZCA9IHRoaXMuYWN0aXZpdHlTZXJ2aWNlLnJlZ2lzdGVyKCk7XG5cbiAgICBHZW9QZGZQbHVnaW4oanNQREYuQVBJKTtcblxuICAgIGNvbnN0IGRvYyA9IG5ldyBqc1BERih7XG4gICAgICBvcmllbnRhdGlvbixcbiAgICAgIGZvcm1hdDogcGFwZXJGb3JtYXQudG9Mb3dlckNhc2UoKSxcbiAgICAgIHVuaXQ6ICdtbScgLy8gZGVmYXVsdFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyB3aWR0aDogcGFnZVdpZHRoLCBoZWlnaHQ6IHBhZ2VIZWlnaHQgfSA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZTtcblxuICAgIC8qKiB0b3AgfCByaWdodCB8IGJvdHRvbSB8IGxlZnQgKi9cbiAgICBjb25zdCBiYXNlTWFyZ2luczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMTAsIDEwLCAxMCwgMTBdO1xuXG4gICAgbGV0IHRpdGxlU2l6ZXM6IFRleHRQZGZTaXplQW5kTWFyZ2luO1xuICAgIGxldCBzdWJ0aXRsZVNpemVzOiBUZXh0UGRmU2l6ZUFuZE1hcmdpbjtcblxuICAgIC8vIGlmIHBhcGVyIGZvcm1hdCBBMSBvciBBMCBhZGQgbWFyZ2luIHRvcFxuICAgIGlmIChcbiAgICAgIChvcHRpb25zLnRpdGxlICE9PSAnJyB8fCBvcHRpb25zLnN1YnRpdGxlICE9PSAnJykgJiZcbiAgICAgIChwYXBlckZvcm1hdCA9PT0gUHJpbnRQYXBlckZvcm1hdC5BMSB8fFxuICAgICAgICBwYXBlckZvcm1hdCA9PT0gUHJpbnRQYXBlckZvcm1hdC5BMClcbiAgICApIHtcbiAgICAgIGJhc2VNYXJnaW5zWzBdICs9IDEwO1xuICAgIH1cbiAgICAvLyBQREYgdGl0bGVcbiAgICBjb25zdCBmb250U2l6ZUluUHQgPSBNYXRoLnJvdW5kKDIgKiAocGFnZUhlaWdodCArIDE0NSkgKiAwLjA1KSAvIDI7IC8vY2FsY3VsYXRlIHRoZSBmb250U2l6ZSB0aXRsZSBmcm9tIHRoZSBwYWdlIGhlaWdodC5cbiAgICBpZiAob3B0aW9ucy50aXRsZSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMudGl0bGUgIT09ICcnKSB7XG4gICAgICB0aXRsZVNpemVzID0gdGhpcy5nZXRUZXh0UGRmT2JqZWN0U2l6ZUFuZE1hcmcoXG4gICAgICAgIG9wdGlvbnMudGl0bGUsXG4gICAgICAgIGJhc2VNYXJnaW5zLFxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnRpdGxlRm9udCxcbiAgICAgICAgZm9udFNpemVJblB0LFxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnRpdGxlRm9udFN0eWxlLFxuICAgICAgICBkb2NcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuYWRkVGV4dEluUGRmRG9jKFxuICAgICAgICBkb2MsXG4gICAgICAgIG9wdGlvbnMudGl0bGUsXG4gICAgICAgIHRoaXMuVEVYVFBERkZPTlQudGl0bGVGb250LFxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnRpdGxlRm9udFN0eWxlLFxuICAgICAgICB0aXRsZVNpemVzLmZvbnRTaXplLFxuICAgICAgICB0aXRsZVNpemVzLm1hcmdpbkxlZnQgKyBiYXNlTWFyZ2luc1szXSxcbiAgICAgICAgYmFzZU1hcmdpbnNbMF1cbiAgICAgICk7XG5cbiAgICAgIGJhc2VNYXJnaW5zWzBdID0gdGl0bGVTaXplcy5oZWlnaHQgKyBiYXNlTWFyZ2luc1swXTsgLy8gY3VtdWxhdGl2ZSBtYXJnaW4gdG9wIGZvciBuZXh0IGVsZW0gdG8gcGxhY2UgaW4gcGRmIGRvY1xuICAgIH1cblxuICAgIC8vIFBERiBzdWJ0aXRsZVxuICAgIGlmIChvcHRpb25zLnN1YnRpdGxlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5zdWJ0aXRsZSAhPT0gJycpIHtcbiAgICAgIHN1YnRpdGxlU2l6ZXMgPSB0aGlzLmdldFRleHRQZGZPYmplY3RTaXplQW5kTWFyZyhcbiAgICAgICAgb3B0aW9ucy5zdWJ0aXRsZSxcbiAgICAgICAgYmFzZU1hcmdpbnMsXG4gICAgICAgIHRoaXMuVEVYVFBERkZPTlQuc3VidGl0bGVGb250LFxuICAgICAgICBvcHRpb25zLnRpdGxlICE9PSAnJyA/IHRpdGxlU2l6ZXMuZm9udFNpemUgKiAwLjcgOiBmb250U2l6ZUluUHQgKiAwLjcsIC8vIDcwJSBzaXplIG9mIHRpdGxlXG4gICAgICAgIHRoaXMuVEVYVFBERkZPTlQuc3VidGl0bGVGb250U3R5bGUsXG4gICAgICAgIGRvY1xuICAgICAgKTtcblxuICAgICAgdGhpcy5hZGRUZXh0SW5QZGZEb2MoXG4gICAgICAgIGRvYyxcbiAgICAgICAgb3B0aW9ucy5zdWJ0aXRsZSxcbiAgICAgICAgdGhpcy5URVhUUERGRk9OVC5zdWJ0aXRsZUZvbnQsXG4gICAgICAgIHRoaXMuVEVYVFBERkZPTlQuc3VidGl0bGVGb250U3R5bGUsXG4gICAgICAgIHN1YnRpdGxlU2l6ZXMuZm9udFNpemUsXG4gICAgICAgIHN1YnRpdGxlU2l6ZXMubWFyZ2luTGVmdCArIGJhc2VNYXJnaW5zWzNdLFxuICAgICAgICBiYXNlTWFyZ2luc1swXVxuICAgICAgKTtcblxuICAgICAgYmFzZU1hcmdpbnNbMF0gKz0gNTsgLy8gY3VtdWxhdGl2ZSBtYXJnIHRvcCBmb3IgbmV4dCBlbGVtIHRvIHBsYWNlIGluIHBkZiBkb2MuIDUgaXMgYSBmaXggaXQgY291bGQgYmUgYWRqdXN0XG4gICAgfVxuXG4gICAgY29uc3QgdmVydGljYWxTcGFjaW5nOiBudW1iZXIgPSA1O1xuICAgIGlmIChvcHRpb25zLmNvbW1lbnQgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmNvbW1lbnQgIT09ICcnKSB7XG4gICAgICB0aGlzLmFkZENvbW1lbnQoZG9jLCBvcHRpb25zLmNvbW1lbnQsIGJhc2VNYXJnaW5zLCB2ZXJ0aWNhbFNwYWNpbmcpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNob3dQcm9qZWN0aW9uID09PSB0cnVlIHx8IG9wdGlvbnMuc2hvd1NjYWxlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmFkZFByb2pTY2FsZShcbiAgICAgICAgZG9jLFxuICAgICAgICBtYXAsXG4gICAgICAgIHJlc29sdXRpb24sXG4gICAgICAgIG9wdGlvbnMuc2hvd1Byb2plY3Rpb24sXG4gICAgICAgIG9wdGlvbnMuc2hvd1NjYWxlLFxuICAgICAgICBiYXNlTWFyZ2lucyxcbiAgICAgICAgdmVydGljYWxTcGFjaW5nXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdpZHRoID0gcGFnZVdpZHRoIC0gYmFzZU1hcmdpbnNbM10gLSBiYXNlTWFyZ2luc1sxXTtcbiAgICBjb25zdCBoZWlnaHQgPSBwYWdlSGVpZ2h0IC0gYmFzZU1hcmdpbnNbMF0gLSBiYXNlTWFyZ2luc1syXTtcbiAgICBjb25zdCBzaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW3dpZHRoLCBoZWlnaHRdO1xuXG4gICAgdGhpcy5hZGRNYXAoXG4gICAgICBkb2MsXG4gICAgICBtYXAsXG4gICAgICByZXNvbHV0aW9uLFxuICAgICAgc2l6ZSxcbiAgICAgIGJhc2VNYXJnaW5zLFxuICAgICAgbGVnZW5kUG9zdGlvblxuICAgICkuc3Vic2NyaWJlKGFzeW5jIChzdGF0dXM6IFN1YmplY3RTdGF0dXMpID0+IHtcbiAgICAgIGlmIChzdGF0dXMgPT09IFN1YmplY3RTdGF0dXMuRG9uZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZU1lYXN1cmVMYXllcihkb2MsIG1hcCwgYmFzZU1hcmdpbnMpO1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuaW1nU2l6ZUFkZGVkWzBdO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmltZ1NpemVBZGRlZFsxXTtcbiAgICAgICAgdGhpcy5hZGRHZW9SZWYoZG9jLCBtYXAsIHdpZHRoLCBoZWlnaHQsIGJhc2VNYXJnaW5zKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5sZWdlbmRQb3NpdGlvbiAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgWyd0b3BsZWZ0JywgJ3RvcHJpZ2h0JywgJ2JvdHRvbWxlZnQnLCAnYm90dG9tcmlnaHQnXS5pbmRleE9mKFxuICAgICAgICAgICAgICBvcHRpb25zLmxlZ2VuZFBvc2l0aW9uXG4gICAgICAgICAgICApID4gLTFcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkTGVnZW5kU2FtZVBhZ2UoXG4gICAgICAgICAgICAgIGRvYyxcbiAgICAgICAgICAgICAgbWFwLFxuICAgICAgICAgICAgICBiYXNlTWFyZ2lucyxcbiAgICAgICAgICAgICAgcmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgb3B0aW9ucy5sZWdlbmRQb3NpdGlvblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMubGVnZW5kUG9zaXRpb24gPT09ICduZXdwYWdlJykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRMZWdlbmQoZG9jLCBtYXAsIGJhc2VNYXJnaW5zLCByZXNvbHV0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zYXZlRG9jKGRvYyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXR1cyA9PT0gU3ViamVjdFN0YXR1cy5Eb25lIHx8IHN0YXR1cyA9PT0gU3ViamVjdFN0YXR1cy5FcnJvcikge1xuICAgICAgICB0aGlzLmFjdGl2aXR5U2VydmljZS51bnJlZ2lzdGVyKHRoaXMuYWN0aXZpdHlJZCk7XG4gICAgICAgIHN0YXR1cyQubmV4dChTdWJqZWN0U3RhdHVzLkRvbmUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHN0YXR1cyQ7XG4gIH1cbiAgLy8gcmVmIEdlb01vb3NlIGh0dHBzOi8vZ2l0aHViLmNvbS9nZW9tb29zZS9nbTMvdHJlZS9tYWluL3NyYy9nbTMvY29tcG9uZW50cy9wcmludFxuICBhZGRHZW9SZWYoXG4gICAgZG9jLFxuICAgIG1hcDogSWdvTWFwLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgYmFzZU1hcmdpbnM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdXG4gICkge1xuICAgIGNvbnN0IHVuaXQgPSAnbW0nO1xuICAgIGNvbnN0IGRvY0hlaWdodCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRIZWlnaHQoKTtcblxuICAgIC8vIHgseSA9IG1hcmdpbiBsZWZ0LWJvdHRvbSBjb3JuZXIgZm9yIGltZyBpbiBwZGYgZG9jXG4gICAgY29uc3QgeCA9IGJhc2VNYXJnaW5zWzNdO1xuICAgIGNvbnN0IHkgPSBkb2NIZWlnaHQgLSBiYXNlTWFyZ2luc1swXSAtIGhlaWdodDtcblxuICAgIGxldCBwZGZfZXh0ZW50cyA9IFt4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHRdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGRmX2V4dGVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBkZl9leHRlbnRzW2ldID0gdGhpcy5wZGZfdW5pdHMycG9pbnRzKHBkZl9leHRlbnRzW2ldLCB1bml0KTtcbiAgICB9XG4gICAgZG9jLnNldEdlb0FyZWEocGRmX2V4dGVudHMsIHRoaXMubWFwUHJpbnRFeHRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBtZWFzdXJlIG92ZXJsYXkgb24gdGhlIG1hcCBvbiB0aGUgZG9jdW1lbnQgd2hlbiB0aGUgbWVhc3VyZSBsYXllciBpcyBwcmVzZW50XG4gICAqIEBwYXJhbSAgZG9jIC0gUGRmIGRvY3VtZW50IHdoZXJlIG1lYXN1cmUgdG9vbHRpcCB3aWxsIGJlIGFkZGVkXG4gICAqIEBwYXJhbSAgbWFwIC0gTWFwIG9mIHRoZSBhcHBcbiAgICogQHBhcmFtICBiYXNlTWFyZ2lucyAtIFBhZ2UgbWFyZ2luc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVNZWFzdXJlTGF5ZXIoXG4gICAgZG9jOiBqc1BERixcbiAgICBtYXA6IElnb01hcCxcbiAgICBiYXNlTWFyZ2luczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl1cbiAgKSB7XG4gICAgaWYgKFxuICAgICAgbWFwLmxheWVycy5maW5kKFxuICAgICAgICAobGF5ZXIpID0+IGxheWVyLnZpc2libGUgJiYgbGF5ZXIuaWQuc3RhcnRzV2l0aCgnaWdvLW1lYXN1cmVzLScpXG4gICAgICApXG4gICAgKSB7XG4gICAgICBsZXQgY2FudmFzT3ZlcmxheUhUTUxNZWFzdXJlcztcbiAgICAgIGNvbnN0IG1hcE92ZXJsYXlNZWFzdXJlc0hUTUwgPSBtYXAub2wuZ2V0T3ZlcmxheUNvbnRhaW5lcigpO1xuICAgICAgYXdhaXQgaHRtbDJjYW52YXMobWFwT3ZlcmxheU1lYXN1cmVzSFRNTCwge1xuICAgICAgICBzY2FsZTogMSxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBudWxsXG4gICAgICB9KS50aGVuKChlKSA9PiB7XG4gICAgICAgIGNhbnZhc092ZXJsYXlIVE1MTWVhc3VyZXMgPSBlO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmFkZENhbnZhcyhkb2MsIGNhbnZhc092ZXJsYXlIVE1MTWVhc3VyZXMsIGJhc2VNYXJnaW5zKTsgLy8gdGhpcyBhZGRzIG1lYXN1cmUgb3ZlcmxheXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGh0bWwgY29kZSBmb3IgYWxsIGxheWVycyBsZWdlbmRcbiAgICogQHBhcmFtICBtYXAgSWdvTWFwXG4gICAqIEBwYXJhbSAgd2lkdGggVGhlIHdpZHRoIHRoYXQgdGhlIGxlZ2VuZCBuZWVkIHRvIGJlXG4gICAqIEByZXR1cm4gSHRtbCBjb2RlIGZvciB0aGUgbGVnZW5kXG4gICAqL1xuICBnZXRMYXllcnNMZWdlbmRIdG1sKFxuICAgIG1hcDogSWdvTWFwLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuICAgICAgbGV0IGh0bWwgPSAnJztcbiAgICAgIGNvbnN0IGxlZ2VuZHMgPSBnZXRMYXllcnNMZWdlbmRzKG1hcC5sYXllcnMsIHtcbiAgICAgICAgcmVzb2x1dGlvbjogbWFwLnZpZXdDb250cm9sbGVyLmdldFJlc29sdXRpb24oKSxcbiAgICAgICAgZXh0ZW50OiBtYXAudmlld0NvbnRyb2xsZXIuZ2V0RXh0ZW50KCksXG4gICAgICAgIHByb2plY3Rpb246IG1hcC52aWV3Q29udHJvbGxlci5nZXRPbFByb2plY3Rpb24oKS5nZXRDb2RlKCksXG4gICAgICAgIC8vIHNjYWxlOiBtYXAudmlld0NvbnRyb2xsZXIuZ2V0U2NhbGUocmVzb2x1dGlvbiksXG4gICAgICAgIHNpemU6IG1hcC5vbC5nZXRTaXplKClcbiAgICAgIH0gYXMgTGVnZW5kTWFwVmlld09wdGlvbnMpO1xuXG4gICAgICBpZiAobGVnZW5kcy5maWx0ZXIoKGwpID0+IGwuZGlzcGxheSA9PT0gdHJ1ZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG9ic2VydmVyLm5leHQoaHRtbCk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIERlZmluZSBpbXBvcnRhbnQgc3R5bGUgdG8gYmUgc3VyZSB0aGF0IGFsbCBjb250YWluZXIgaXMgY29udmVydFxuICAgICAgLy8gdG8gaW1hZ2Ugbm90IGp1c3QgdmlzaWJsZSBwYXJ0XG4gICAgICBodG1sICs9ICc8c3R5bGUgbWVkaWE9XCJzY3JlZW5cIiB0eXBlPVwidGV4dC9jc3NcIj4nO1xuICAgICAgaHRtbCArPVxuICAgICAgICAnLmh0bWwyY2FudmFzLWNvbnRhaW5lciB7IHdpZHRoOiAnICtcbiAgICAgICAgd2lkdGggK1xuICAgICAgICAnbW0gIWltcG9ydGFudDsgaGVpZ2h0OiAyMDAwcHggIWltcG9ydGFudDsgfSc7XG4gICAgICBodG1sICs9ICd0YWJsZS50YWJsZUxlZ2VuZCB7dGFibGUtbGF5b3V0OiBhdXRvO30nO1xuICAgICAgaHRtbCArPVxuICAgICAgICAnZGl2LnN0eWxlTGVnZW5kIHtwYWRkaW5nLXRvcDogNXB4OyBwYWRkaW5nLXJpZ2h0OjVweDtwYWRkaW5nLWxlZnQ6NXB4O3BhZGRpbmctYm90dG9tOjVweDt9JztcbiAgICAgIGh0bWwgKz0gJzwvc3R5bGU+JztcbiAgICAgIC8vIFRoZSBmb250IHNpemUgd2lsbCBhbHNvIGJlIGxvd2VyZWQgYWZ0ZXJ3YXJkcyAoZ2xvYmFsbHkgYWxvbmcgdGhlIGxlZ2VuZCBzaXplKVxuICAgICAgLy8gdGhpcyBhbGxvd3MgaGF2aW5nIGEgZ29vZCByZWxhdGl2ZSBmb250IHNpemUgaGVyZSBhbmQgdG8ga2VlcCBhanVzdGluZyB0aGUgbGVnZW5kIHNpemVcbiAgICAgIC8vIHdoaWxlIGtlZXBpbmcgZ29vZCByZWxhdGl2ZSBmb250IHNpemVcbiAgICAgIGh0bWwgKz0gJzxmb250IHNpemU9XCIzXCIgZmFjZT1cIlRpbWVzXCIgPic7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwic3R5bGVMZWdlbmRcIj4nO1xuICAgICAgaHRtbCArPSAnPHRhYmxlIGNsYXNzPVwidGFibGVMZWdlbmRcIiA+JztcblxuICAgICAgLy8gRm9yIGVhY2ggbGVnZW5kLCBkZWZpbmUgYW4gaHRtbCB0YWJsZSBjZWxsXG4gICAgICBjb25zdCBpbWFnZXMkID0gbGVnZW5kc1xuICAgICAgICAuZmlsdGVyKChsKSA9PiBsLmRpc3BsYXkgJiYgbC5pc0luUmVzb2x1dGlvbnNSYW5nZSA9PT0gdHJ1ZSlcbiAgICAgICAgLm1hcCgobGVnZW5kKSA9PlxuICAgICAgICAgIHRoaXMuZ2V0RGF0YUltYWdlKGxlZ2VuZC51cmwpLnBpcGUoXG4gICAgICAgICAgICByeE1hcCgoZGF0YUltYWdlKSA9PiB7XG4gICAgICAgICAgICAgIGxldCBodG1sSW1nID1cbiAgICAgICAgICAgICAgICAnPHRyPjx0ZD4nICsgbGVnZW5kLnRpdGxlLnRvVXBwZXJDYXNlKCkgKyAnPC90ZD48L3RyPic7XG4gICAgICAgICAgICAgIGh0bWxJbWcgKz0gJzx0cj48dGQ+PGltZyBzcmM9XCInICsgZGF0YUltYWdlICsgJ1wiPjwvdGQ+PC90cj4nO1xuICAgICAgICAgICAgICByZXR1cm4gaHRtbEltZztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgZm9ya0pvaW4oaW1hZ2VzJCkuc3Vic2NyaWJlKChkYXRhSW1hZ2VzKSA9PiB7XG4gICAgICAgIGh0bWwgPSBkYXRhSW1hZ2VzLnJlZHVjZSgoYWNjLCBjdXJyZW50KSA9PiAoYWNjICs9IGN1cnJlbnQpLCBodG1sKTtcbiAgICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgICBvYnNlcnZlci5uZXh0KGh0bWwpO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXREYXRhSW1hZ2UodXJsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGNvbnN0IHNlY3VyZUlNRyA9IG5ldyBTZWN1cmVJbWFnZVBpcGUodGhpcy5odHRwLCB0aGlzLmNvbmZpZ1NlcnZpY2UpO1xuICAgIHJldHVybiBzZWN1cmVJTUcudHJhbnNmb3JtKHVybCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB0aGUgbGVnZW5kIGluIGEgc2luZ2xlIGltYWdlXG4gICAqICogQHBhcmFtICBmb3JtYXQgLSBJbWFnZSBmb3JtYXQuIGRlZmF1bHQgdmFsdWUgdG8gXCJwbmdcIlxuICAgKiBAcmV0dXJuIFRoZSBpbWFnZSBvZiB0aGUgbGVnZW5kXG4gICAqL1xuICBhc3luYyBnZXRMYXllcnNMZWdlbmRJbWFnZShcbiAgICBtYXAsXG4gICAgZm9ybWF0OiBzdHJpbmcgPSAncG5nJyxcbiAgICBkb1ppcEZpbGU6IGJvb2xlYW4sXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyXG4gICkge1xuICAgIGNvbnN0IHN0YXR1cyQgPSBuZXcgU3ViamVjdCgpO1xuICAgIC8vIEdldCBodG1sIGNvZGUgZm9yIHRoZSBsZWdlbmRcbiAgICBjb25zdCB3aWR0aCA9IDIwMDsgLy8gbWlsaW1ldGVycyB1bml0LCBvcmlnaW5hbGx5IGRlZmluZSBmb3IgZG9jdW1lbnQgcGRmXG4gICAgbGV0IGh0bWwgPSBhd2FpdCB0aGlzLmdldExheWVyc0xlZ2VuZEh0bWwoXG4gICAgICBtYXAsXG4gICAgICB3aWR0aCxcbiAgICAgIHJlc29sdXRpb25cbiAgICApLnRvUHJvbWlzZSgpO1xuICAgIGZvcm1hdCA9IGZvcm1hdC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gSWYgbm8gbGVnZW5kIHNob3cgTm8gTEVHRU5EIGluIGFuIGltYWdlXG4gICAgaWYgKGh0bWwubGVuZ3RoID09PSAwKSB7XG4gICAgICBodG1sID0gJzxmb250IHNpemU9XCIxMlwiIGZhY2U9XCJDb3VyaWVyIE5ld1wiID4nO1xuICAgICAgaHRtbCArPSAnPGRpdiBhbGlnbj1cImNlbnRlclwiPjxiPk5PIExFR0VORDwvYj48L2Rpdj4nO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgZGl2IHRvIGNvbnRhaW4gaHRtbCBjb2RlIGZvciBsZWdlbmRcbiAgICBjb25zdCBkaXYgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBkaXYuc3R5bGUudG9wID0gJzAnO1xuICAgIGRpdi5zdHlsZS56SW5kZXggPSAnLTEnO1xuICAgIC8vIEFkZCBodG1sIGNvZGUgdG8gY29udmVydCBpbiB0aGUgbmV3IHdpbmRvd1xuICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XG4gICAgZGl2LmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICBhd2FpdCB0aGlzLnRpbWVvdXQoMSk7XG4gICAgY29uc3QgY2FudmFzID0gYXdhaXQgaHRtbDJjYW52YXMoZGl2LCB7IHVzZUNPUlM6IHRydWUgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgIH0pO1xuICAgIHRoaXMucmVtb3ZlSHRtbEVsZW1lbnQoZGl2KTtcbiAgICBpZiAoY2FudmFzKSB7XG4gICAgICBsZXQgc3RhdHVzID0gU3ViamVjdFN0YXR1cy5Eb25lO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFkb1ppcEZpbGUpIHtcbiAgICAgICAgICAvLyBTYXZlIHRoZSBjYW52YXMgYXMgZmlsZVxuICAgICAgICAgIHRoaXMuc2F2ZUNhbnZhc0ltYWdlQXNGaWxlKGNhbnZhcywgJ2xlZ2VuZEltYWdlJywgZm9ybWF0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBZGQgdGhlIGNhbnZhcyB0byB6aXBcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlQ2FudmFGaWxlVG9aaXAoY2FudmFzLCAnbGVnZW5kSW1hZ2UnICsgJy4nICsgZm9ybWF0KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRXJyb3I7XG4gICAgICB9XG4gICAgICBzdGF0dXMkLm5leHQoc3RhdHVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdHVzJDtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlSHRtbEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gIH1cblxuICBnZXRUZXh0UGRmT2JqZWN0U2l6ZUFuZE1hcmcoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIG1hcmdpbnMsXG4gICAgZm9udDogc3RyaW5nLFxuICAgIGZvbnRTaXplSW5QdDogbnVtYmVyLFxuICAgIGZvbnRTdHlsZTogc3RyaW5nLFxuICAgIGRvYzoganNQREZcbiAgKTogVGV4dFBkZlNpemVBbmRNYXJnaW4ge1xuICAgIGNvbnN0IHBkZlJlc29sdXRpb24gPSA5NjtcbiAgICBjb25zdCBkb2NXaWR0aCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRXaWR0aCgpO1xuICAgIGNvbnN0IHBhZ2VXaWR0aCA9IGRvY1dpZHRoIC0gbWFyZ2luc1sxXSAtIG1hcmdpbnNbM107XG5cbiAgICAvLyBpbXBvcnRhbnQgdG8gc2V0IGl0IGZpcnN0LCB0aGUgdGV4dERpbWVuc2lvbiBjaGFuZ2Ugd2hlbiBmb250IGNoYW5nZSFcbiAgICBkb2Muc2V0Rm9udChmb250LCBmb250U3R5bGUpO1xuICAgIGRvYy5zZXRGb250U2l6ZShmb250U2l6ZUluUHQpO1xuXG4gICAgbGV0IHRleHREaW1lbnNpb25zID0gZG9jLmdldFRleHREaW1lbnNpb25zKHRleHQpO1xuICAgIGxldCB0ZXh0TWFyZ2luTGVmdDogbnVtYmVyO1xuXG4gICAgaWYgKHRleHREaW1lbnNpb25zLncgPiBwYWdlV2lkdGgpIHtcbiAgICAgIC8vIGlmIHRoZSB0ZXh0IGlzIHRvIGxvbmcsIHJlZHVjZSBmb250U2l6ZSA3MCUgYW5kIHRoZSBvdmVyZmxvdyB3aXRoIGJlIGN1dCBpbiBwcmludC4uLlxuICAgICAgdGV4dE1hcmdpbkxlZnQgPSAwO1xuICAgICAgZm9udFNpemVJblB0ID0gZm9udFNpemVJblB0ICogMC43O1xuICAgICAgZG9jLnNldEZvbnRTaXplKGZvbnRTaXplSW5QdCk7XG4gICAgICB0ZXh0RGltZW5zaW9ucyA9IGRvYy5nZXRUZXh0RGltZW5zaW9ucyh0ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dE1hcmdpbkxlZnQgPSAocGFnZVdpZHRoIC0gdGV4dERpbWVuc2lvbnMudykgLyAyO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBmb250U2l6ZTogZm9udFNpemVJblB0LFxuICAgICAgbWFyZ2luTGVmdDogdGV4dE1hcmdpbkxlZnQsXG4gICAgICBoZWlnaHQ6IHRleHREaW1lbnNpb25zLmhcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBjb21tZW50IHRvIHRoZSBkb2N1bWVudFxuICAgKiBAcGFyYW0gIGRvYyAtIHBkZiBkb2N1bWVudFxuICAgKiBAcGFyYW0gIGNvbW1lbnQgLSBDb21tZW50IHRvIGFkZCBpbiB0aGUgZG9jdW1lbnRcbiAgICogQHBhcmFtIGJhc2VNYXJnaW5zIC0gdG9wIHwgcmlnaHQgfCBib3R0b20gfCBsZWZ0XG4gICAqIEBwYXJhbSB2ZXJ0aWNhbFNwYWNpbmcgLSBjYWxjdWxhdGUgdGV4dCBwb3NpdGlvbiBhbmQgbWFwIGhlaWdodFxuICAgKi9cbiAgcHJpdmF0ZSBhZGRDb21tZW50KFxuICAgIGRvYzoganNQREYsXG4gICAgY29tbWVudDogc3RyaW5nLFxuICAgIGJhc2VNYXJnaW5zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICB2ZXJ0aWNhbFNwYWNpbmc6IG51bWJlclxuICApIHtcbiAgICAvLyBjYWxjdWxhdGUgbWFwIGltYWdlIGhlaWdodFxuICAgIGJhc2VNYXJnaW5zWzJdICs9IHZlcnRpY2FsU3BhY2luZztcblxuICAgIGNvbnN0IHhQb3NpdGlvbiA9IGJhc2VNYXJnaW5zWzNdOyAvL21hcmdpbiBsZWZ0IGFuZCBib3R0b20gaXMgZml4XG4gICAgY29uc3QgbWFyZ2luQm90dG9tID0gYmFzZU1hcmdpbnNbMl07XG4gICAgLy8gY2FsY3VsYXRlIHRleHQgcG9zaXRpb24gWVxuICAgIGNvbnN0IHlQb3NpdGlvbiA9XG4gICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0IC0gbWFyZ2luQm90dG9tICsgdmVydGljYWxTcGFjaW5nO1xuXG4gICAgdGhpcy5hZGRUZXh0SW5QZGZEb2MoXG4gICAgICBkb2MsXG4gICAgICBjb21tZW50LFxuICAgICAgdGhpcy5URVhUUERGRk9OVC5jb21tZW50Rm9udCxcbiAgICAgIHRoaXMuVEVYVFBERkZPTlQuY29tbWVudEZvbnRTdHlsZSxcbiAgICAgIHRoaXMuVEVYVFBERkZPTlQuY29tbWVudEZvbnRTaXplLFxuICAgICAgeFBvc2l0aW9uLFxuICAgICAgeVBvc2l0aW9uLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFkZFRleHRJblBkZkRvYyhcbiAgICBkb2M6IGpzUERGLFxuICAgIHRleHRUb0FkZDogc3RyaW5nLFxuICAgIHRleHRGb250OiBzdHJpbmcsXG4gICAgdGV4dEZvbnRTdHlsZTogc3RyaW5nLFxuICAgIHRleHRGb250U2l6ZTogbnVtYmVyLFxuICAgIHRleHRNYXJnaW5MZWZ0OiBudW1iZXIsXG4gICAgdGV4dE1hcmdpblRvcDogbnVtYmVyLFxuICAgIGlzQ29tbWVudDogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIGRvYy5zZXRGb250KHRleHRGb250LCB0ZXh0Rm9udFN0eWxlKTtcbiAgICBkb2Muc2V0Rm9udFNpemUodGV4dEZvbnRTaXplKTtcblxuICAgIGlmIChpc0NvbW1lbnQpIHtcbiAgICAgIHRleHRUb0FkZCA9IGRvYy5zcGxpdFRleHRUb1NpemUoXG4gICAgICAgIHRleHRUb0FkZCxcbiAgICAgICAgZG9jLmludGVybmFsLnBhZ2VTaXplLmdldFdpZHRoKCkgLSB0ZXh0TWFyZ2luTGVmdCAqIDNcbiAgICAgICk7XG4gICAgfVxuICAgIGRvYy50ZXh0KHRleHRUb0FkZCwgdGV4dE1hcmdpbkxlZnQsIHRleHRNYXJnaW5Ub3ApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBwcm9qZWN0aW9uIGFuZC9vciBzY2FsZSB0byB0aGUgZG9jdW1lbnRcbiAgICogQHBhcmFtICBkb2MgLSBwZGYgZG9jdW1lbnRcbiAgICogQHBhcmFtICBtYXAgLSBNYXAgb2YgdGhlIGFwcFxuICAgKiBAcGFyYW0gIGRwaSAtIERQSSByZXNvbHV0aW9uIG9mIHRoZSBkb2N1bWVudFxuICAgKiBAcGFyYW0gIHByb2plY3Rpb24gLSBCb29sIHRvIGluZGljYXRlIGlmIHByb2plY3Rpb24gbmVlZCB0byBiZSBhZGRlZFxuICAgKiBAcGFyYW0gIHNjYWxlIC0gQm9vbCB0byBpbmRpY2F0ZSBpZiBzY2FsZSBuZWVkIHRvIGJlIGFkZGVkXG4gICAqIEBwYXJhbSBiYXNlTWFyZ2lucyAtIHRvcCB8IHJpZ2h0IHwgYm90dG9tIHwgbGVmdFxuICAgKiBAcGFyYW0gdmVydGljYWxTcGFjaW5nIC0gY2FsY3VsYXRlIHRleHQgcG9zaXRpb24gYW5kIG1hcCBoZWlnaHRcbiAgICovXG4gIHByaXZhdGUgYWRkUHJvalNjYWxlKFxuICAgIGRvYzoganNQREYsXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgZHBpOiBudW1iZXIsXG4gICAgcHJvamVjdGlvbjogYm9vbGVhbixcbiAgICBzY2FsZTogYm9vbGVhbixcbiAgICBiYXNlTWFyZ2luczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgdmVydGljYWxTcGFjaW5nOiBudW1iZXJcbiAgKSB7XG4gICAgLy8gY2FsY3VsYXRlIG1hcCBpbWFnZSBoZWlnaHRcbiAgICBiYXNlTWFyZ2luc1syXSArPSB2ZXJ0aWNhbFNwYWNpbmc7XG4gICAgY29uc3QgdHJhbnNsYXRlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlO1xuICAgIGNvbnN0IHByb2pTY2FsZVNpemUgPSAxMjtcbiAgICBjb25zdCB4UG9zaXRpb24gPSBiYXNlTWFyZ2luc1szXTtcbiAgICBjb25zdCBtYXJnaW5Cb3R0b20gPSBiYXNlTWFyZ2luc1syXTtcbiAgICAvLyBjYWxjdWxhdGUgdGV4dCBwb3NpdGlvbiBZXG4gICAgY29uc3QgeVBvc2l0aW9uID1cbiAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQgLSBtYXJnaW5Cb3R0b20gKyB2ZXJ0aWNhbFNwYWNpbmc7XG5cbiAgICBsZXQgdGV4dFByb2pTY2FsZTogc3RyaW5nID0gJyc7XG4gICAgaWYgKHByb2plY3Rpb24gPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHByb2pUZXh0ID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8ucHJpbnRGb3JtLnByb2plY3Rpb24nKTtcbiAgICAgIHRleHRQcm9qU2NhbGUgKz0gcHJvalRleHQgKyAnOiAnICsgbWFwLnByb2plY3Rpb247XG4gICAgfVxuICAgIGlmIChzY2FsZSA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKHByb2plY3Rpb24gPT09IHRydWUpIHtcbiAgICAgICAgdGV4dFByb2pTY2FsZSArPSAnICAgJztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNjYWxlVGV4dCA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLnByaW50Rm9ybS5zY2FsZScpO1xuICAgICAgY29uc3QgbWFwU2NhbGUgPSBtYXAudmlld0NvbnRyb2xsZXIuZ2V0U2NhbGUoZHBpKTtcbiAgICAgIHRleHRQcm9qU2NhbGUgKz0gc2NhbGVUZXh0ICsgJzogfiAxIC8gJyArIGZvcm1hdFNjYWxlKG1hcFNjYWxlKTtcbiAgICB9XG4gICAgZG9jLnNldEZvbnQodGhpcy5URVhUUERGRk9OVC5jb21tZW50Rm9udCk7XG4gICAgZG9jLnNldEZvbnRTaXplKHByb2pTY2FsZVNpemUpO1xuICAgIGRvYy50ZXh0KHRleHRQcm9qU2NhbGUsIHhQb3NpdGlvbiwgeVBvc2l0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIGxlZ2VuZCB0byB0aGUgZG9jdW1lbnRcbiAgICogQHBhcmFtICBkb2MgLSBQZGYgZG9jdW1lbnQgd2hlcmUgbGVnZW5kIHdpbGwgYmUgYWRkZWRcbiAgICogQHBhcmFtICBtYXAgLSBNYXAgb2YgdGhlIGFwcFxuICAgKiBAcGFyYW0gIG1hcmdpbnMgLSBQYWdlIG1hcmdpbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYWRkTGVnZW5kKFxuICAgIGRvYzoganNQREYsXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgbWFyZ2luczogQXJyYXk8bnVtYmVyPixcbiAgICByZXNvbHV0aW9uOiBudW1iZXJcbiAgKSB7XG4gICAgLy8gR2V0IGh0bWwgY29kZSBmb3IgdGhlIGxlZ2VuZFxuICAgIGNvbnN0IHdpZHRoID0gZG9jLmludGVybmFsLnBhZ2VTaXplLndpZHRoO1xuICAgIGNvbnN0IGh0bWwgPSBhd2FpdCB0aGlzLmdldExheWVyc0xlZ2VuZEh0bWwoXG4gICAgICBtYXAsXG4gICAgICB3aWR0aCxcbiAgICAgIHJlc29sdXRpb25cbiAgICApLnRvUHJvbWlzZSgpO1xuICAgIC8vIElmIG5vIGxlZ2VuZCwgc2F2ZSB0aGUgbWFwIGRpcmVjdGx5XG4gICAgaWYgKGh0bWwgPT09ICcnKSB7XG4gICAgICBhd2FpdCB0aGlzLnNhdmVEb2MoZG9jKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgZGl2IHRvIGNvbnRhaW4gaHRtbCBjb2RlIGZvciBsZWdlbmRcbiAgICBjb25zdCBkaXYgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBkaXYuc3R5bGUudG9wID0gJzAnO1xuICAgIGRpdi5zdHlsZS56SW5kZXggPSAnLTEnO1xuXG4gICAgLy8gQWRkIGh0bWwgY29kZSB0byBjb252ZXJ0IGluIHRoZSBuZXcgd2luZG93XG4gICAgd2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgIGF3YWl0IHRoaXMudGltZW91dCgxKTtcbiAgICBjb25zdCBjYW52YXMgPSBhd2FpdCBodG1sMmNhbnZhcyhkaXYsIHsgdXNlQ09SUzogdHJ1ZSB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgfSk7XG4gICAgdGhpcy5yZW1vdmVIdG1sRWxlbWVudChkaXYpO1xuICAgIGlmIChjYW52YXMpIHtcbiAgICAgIGNvbnN0IHBvdXJjZW50YWdlUmVkdWN0aW9uID0gMC44NTtcbiAgICAgIGNvbnN0IGltYWdlU2l6ZSA9IFtcbiAgICAgICAgKHBvdXJjZW50YWdlUmVkdWN0aW9uICogKDI1LjQgKiBjYW52YXMud2lkdGgpKSAvIHJlc29sdXRpb24sXG4gICAgICAgIChwb3VyY2VudGFnZVJlZHVjdGlvbiAqICgyNS40ICogY2FudmFzLmhlaWdodCkpIC8gcmVzb2x1dGlvblxuICAgICAgXTtcbiAgICAgIGxldCBpbWdEYXRhO1xuICAgICAgZG9jLmFkZFBhZ2UoKTtcbiAgICAgIGltZ0RhdGEgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICAgIGRvYy5hZGRJbWFnZShpbWdEYXRhLCAnUE5HJywgMTAsIDEwLCBpbWFnZVNpemVbMF0sIGltYWdlU2l6ZVsxXSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zYXZlRG9jKGRvYyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSBsZWdlbmQgdG8gdGhlIGRvY3VtZW50XG4gICAqIEBwYXJhbSAgZG9jIC0gUGRmIGRvY3VtZW50IHdoZXJlIGxlZ2VuZCB3aWxsIGJlIGFkZGVkXG4gICAqIEBwYXJhbSAgbWFwIC0gTWFwIG9mIHRoZSBhcHBcbiAgICogQHBhcmFtICBiYXNlTWFyZ2lucyAtIFBhZ2UgbWFyZ2luc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhZGRMZWdlbmRTYW1lUGFnZShcbiAgICBkb2M6IGpzUERGLFxuICAgIG1hcDogSWdvTWFwLFxuICAgIGJhc2VNYXJnaW5zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICByZXNvbHV0aW9uOiBudW1iZXIsXG4gICAgbGVnZW5kUG9zaXRpb246IHN0cmluZ1xuICApIHtcbiAgICAvLyBHZXQgaHRtbCBjb2RlIGZvciB0aGUgbGVnZW5kXG4gICAgY29uc3Qgd2lkdGggPSBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGg7XG4gICAgY29uc3QgaHRtbCA9IGF3YWl0IHRoaXMuZ2V0TGF5ZXJzTGVnZW5kSHRtbChcbiAgICAgIG1hcCxcbiAgICAgIHdpZHRoLFxuICAgICAgcmVzb2x1dGlvblxuICAgICkudG9Qcm9taXNlKCk7XG4gICAgLy8gSWYgbm8gbGVnZW5kLCBzYXZlIHRoZSBtYXAgZGlyZWN0bHlcbiAgICBpZiAoaHRtbCA9PT0gJycpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZURvYyhkb2MpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIENyZWF0ZSBkaXYgdG8gY29udGFpbiBodG1sIGNvZGUgZm9yIGxlZ2VuZFxuICAgIGNvbnN0IGRpdiA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGRpdi5zdHlsZS50b3AgPSAnMCc7XG4gICAgZGl2LnN0eWxlLnpJbmRleCA9ICctMSc7XG4gICAgLy8gQWRkIGh0bWwgY29kZSB0byBjb252ZXJ0IGluIHRoZSBuZXcgd2luZG93XG4gICAgd2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcbiAgICBhd2FpdCB0aGlzLnRpbWVvdXQoMSk7XG4gICAgY29uc3QgY2FudmFzID0gYXdhaXQgaHRtbDJjYW52YXMoZGl2LCB7IHVzZUNPUlM6IHRydWUgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgIH0pO1xuICAgIHRoaXMucmVtb3ZlSHRtbEVsZW1lbnQoZGl2KTtcbiAgICBsZXQgbWFyZ2luc0xlZ2VuZDtcbiAgICBpZiAoY2FudmFzKSB7XG4gICAgICBjb25zdCBwb3VyY2VudGFnZVJlZHVjdGlvbiA9IDAuODU7XG4gICAgICBjb25zdCBpbWFnZVNpemUgPSBbXG4gICAgICAgIChwb3VyY2VudGFnZVJlZHVjdGlvbiAqICgyNS40ICogY2FudmFzLndpZHRoKSkgLyByZXNvbHV0aW9uLFxuICAgICAgICAocG91cmNlbnRhZ2VSZWR1Y3Rpb24gKiAoMjUuNCAqIGNhbnZhcy5oZWlnaHQpKSAvIHJlc29sdXRpb25cbiAgICAgIF07XG4gICAgICAvLyBNb3ZlIHRoZSBsZWdlbmQgdG8gdGhlIGNvcnJlY3QgcG9zaXRpb24gb24gdGhlIHBhZ2VcbiAgICAgIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gJ2JvdHRvbXJpZ2h0Jykge1xuICAgICAgICBtYXJnaW5zTGVnZW5kID0gW1xuICAgICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQgLSBiYXNlTWFyZ2luc1syXSAtIGltYWdlU2l6ZVsxXSxcbiAgICAgICAgICBiYXNlTWFyZ2luc1sxXSxcbiAgICAgICAgICBiYXNlTWFyZ2luc1syXSxcbiAgICAgICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGggLSBiYXNlTWFyZ2luc1sxXSAtIGltYWdlU2l6ZVswXVxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gJ3RvcHJpZ2h0Jykge1xuICAgICAgICBtYXJnaW5zTGVnZW5kID0gW1xuICAgICAgICAgIGJhc2VNYXJnaW5zWzBdLFxuICAgICAgICAgIGJhc2VNYXJnaW5zWzFdLFxuICAgICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQgLSBiYXNlTWFyZ2luc1swXSAtIGltYWdlU2l6ZVsxXSxcbiAgICAgICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGggLSBiYXNlTWFyZ2luc1sxXSAtIGltYWdlU2l6ZVswXVxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gJ2JvdHRvbWxlZnQnKSB7XG4gICAgICAgIC8vIFdoZW4gdGhlIGxlZ2VuZCBpcyBpbiB0aGUgYm90dG9tIGxlZnQsIHJhaXNlIHRoZSBsZWdlbmQgc2xpZ2h0bHkgdXB3YXJkIHNvIHRoYXQgYXR0cmlidXRpb25zIGFyZSB2aXNpYmxlXG4gICAgICAgIG1hcmdpbnNMZWdlbmQgPSBbXG4gICAgICAgICAgZG9jLmludGVybmFsLnBhZ2VTaXplLmhlaWdodCAtIGJhc2VNYXJnaW5zWzJdIC0gaW1hZ2VTaXplWzFdLFxuICAgICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aCAtIGJhc2VNYXJnaW5zWzNdIC0gaW1hZ2VTaXplWzBdLFxuICAgICAgICAgIGJhc2VNYXJnaW5zWzJdLFxuICAgICAgICAgIGJhc2VNYXJnaW5zWzNdXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAndG9wbGVmdCcpIHtcbiAgICAgICAgbWFyZ2luc0xlZ2VuZCA9IFtcbiAgICAgICAgICBiYXNlTWFyZ2luc1swXSxcbiAgICAgICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGggLSBiYXNlTWFyZ2luc1szXSAtIGltYWdlU2l6ZVswXSxcbiAgICAgICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0IC0gYmFzZU1hcmdpbnNbMF0gLSBpbWFnZVNpemVbMV0sXG4gICAgICAgICAgYmFzZU1hcmdpbnNbM11cbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWRkQ2FudmFzKGRvYywgY2FudmFzLCBtYXJnaW5zTGVnZW5kKTsgLy8gdGhpcyBhZGRzIHRoZSBsZWdlbmRcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZURvYyhkb2MpO1xuICAgIH1cbiAgfVxuXG4gIGRlZmluZU5iRmlsZVRvUHJvY2VzcyhuYkZpbGVUb1Byb2Nlc3MpIHtcbiAgICB0aGlzLm5iRmlsZVRvUHJvY2VzcyA9IG5iRmlsZVRvUHJvY2VzcztcbiAgfVxuXG4gIHByaXZhdGUgdGltZW91dChtcykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDYW52YXMoXG4gICAgZG9jOiBqc1BERixcbiAgICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LFxuICAgIGJhc2VNYXJnaW5zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXVxuICApIHtcbiAgICBsZXQgaW1hZ2U7XG4gICAgaWYgKGNhbnZhcykge1xuICAgICAgaW1hZ2UgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoaW1hZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGltYWdlLmxlbmd0aCA8IDIwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdXYXJuaW5nOiBBbiBpbWFnZSBjYW5ub3QgYmUgcHJpbnQgaW4gcGRmIGZpbGUnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgaW1hZ2VTaXplID0gdGhpcy5nZXRJbWFnZVNpemVUb0ZpdFBkZihkb2MsIGNhbnZhcywgYmFzZU1hcmdpbnMpO1xuICAgICAgZG9jLmFkZEltYWdlKFxuICAgICAgICBpbWFnZSxcbiAgICAgICAgJ1BORycsXG4gICAgICAgIGJhc2VNYXJnaW5zWzNdLFxuICAgICAgICBiYXNlTWFyZ2luc1swXSxcbiAgICAgICAgaW1hZ2VTaXplWzBdLFxuICAgICAgICBpbWFnZVNpemVbMV1cbiAgICAgICk7XG4gICAgICBkb2MucmVjdChiYXNlTWFyZ2luc1szXSwgYmFzZU1hcmdpbnNbMF0sIGltYWdlU2l6ZVswXSwgaW1hZ2VTaXplWzFdKTtcbiAgICAgIHRoaXMuaW1nU2l6ZUFkZGVkID0gaW1hZ2VTaXplOyAvLyBrZWVwIGltZyBzaXplIGZvciBnZW9yZWYgbGF0ZXJcbiAgICB9XG4gIH1cblxuICAvLyBUT0RPIGZpeCBwcmludGluZyB3aXRoIGltYWdlIHJlc29sdXRpb25cbiAgYWRkTWFwKFxuICAgIGRvYzoganNQREYsXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyLFxuICAgIGltYWdlRGltZW5zaW9uczogW251bWJlciwgbnVtYmVyXSxcbiAgICBiYXNlTWFyZ2luczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgbGVnZW5kUG9zdGlvbjogUHJpbnRMZWdlbmRQb3NpdGlvblxuICApIHtcbiAgICBjb25zdCBtYXBTaXplID0gbWFwLm9sLmdldFNpemUoKSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICAgIGNvbnN0IHZpZXdSZXNvbHV0aW9uID0gbWFwLm9sLmdldFZpZXcoKS5nZXRSZXNvbHV0aW9uKCk7XG4gICAgY29uc3QgZGltZW5zaW9uUGl4ZWxzID0gdGhpcy5zZXRNYXBSZXNvbHV0aW9uKFxuICAgICAgbWFwLFxuICAgICAgaW1hZ2VEaW1lbnNpb25zLFxuICAgICAgcmVzb2x1dGlvbixcbiAgICAgIHZpZXdSZXNvbHV0aW9uXG4gICAgKTtcbiAgICBjb25zdCBzdGF0dXMkID0gbmV3IFN1YmplY3QoKTtcblxuICAgIGxldCB0aW1lb3V0O1xuICAgIG1hcC5vbC5vbmNlKCdyZW5kZXJjb21wbGV0ZScsIGFzeW5jIChldmVudDogYW55KSA9PiB7XG4gICAgICBjb25zdCBtYXBDYW52YXMgPSBldmVudC50YXJnZXRcbiAgICAgICAgLmdldFZpZXdwb3J0KClcbiAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdjYW52YXMnKSBhcyBIVE1MQ29sbGVjdGlvbk9mPEhUTUxDYW52YXNFbGVtZW50PjtcblxuICAgICAgY29uc3QgbWFwUmVzdWx0Q2FudmFzID0gYXdhaXQgdGhpcy5kcmF3TWFwKGRpbWVuc2lvblBpeGVscywgbWFwQ2FudmFzKTtcblxuICAgICAgdGhpcy5tYXBQcmludEV4dGVudCA9IG1hcC52aWV3Q29udHJvbGxlci5nZXRFeHRlbnQoJ0VQU0c6Mzg1NycpO1xuXG4gICAgICB0aGlzLnJlc2V0T3JpZ2luYWxNYXBTaXplKG1hcCwgbWFwU2l6ZSwgdmlld1Jlc29sdXRpb24pO1xuXG4gICAgICBhd2FpdCB0aGlzLmRyYXdNYXBDb250cm9scyhtYXAsIG1hcFJlc3VsdENhbnZhcywgbGVnZW5kUG9zdGlvbik7XG5cbiAgICAgIGNvbnN0IG1hcFN0YXR1cyQkID0gbWFwLnN0YXR1cyQuc3Vic2NyaWJlKChtYXBTdGF0dXM6IFN1YmplY3RTdGF0dXMpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICBpZiAobWFwU3RhdHVzICE9PSBTdWJqZWN0U3RhdHVzLkRvbmUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbWFwU3RhdHVzJCQudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgbGV0IHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRG9uZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAobWFwUmVzdWx0Q2FudmFzLndpZHRoICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmFkZENhbnZhcyhkb2MsIG1hcFJlc3VsdENhbnZhcywgYmFzZU1hcmdpbnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgc3RhdHVzID0gU3ViamVjdFN0YXR1cy5FcnJvcjtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmVycm9yKFxuICAgICAgICAgICAgJ2lnby5nZW8ucHJpbnRGb3JtLmNvcnNFcnJvck1lc3NhZ2VCb2R5JyxcbiAgICAgICAgICAgICdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlSGVhZGVyJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdHVzJC5uZXh0KHN0YXR1cyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgbm8gbG9hZGluZyBhcyBzdGFydGVkIGFmdGVyIDIwMG1zLCB0aGVuIHByb2JhYmx5IG5vIGxvYWRpbmdcbiAgICAgIC8vIGlzIHJlcXVpcmVkLlxuICAgICAgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbWFwU3RhdHVzJCQudW5zdWJzY3JpYmUoKTtcblxuICAgICAgICBsZXQgc3RhdHVzID0gU3ViamVjdFN0YXR1cy5Eb25lO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChtYXBSZXN1bHRDYW52YXMud2lkdGggIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQ2FudmFzKGRvYywgbWFwUmVzdWx0Q2FudmFzLCBiYXNlTWFyZ2lucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBzdGF0dXMgPSBTdWJqZWN0U3RhdHVzLkVycm9yO1xuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoXG4gICAgICAgICAgICAnaWdvLmdlby5wcmludEZvcm0uY29yc0Vycm9yTWVzc2FnZUJvZHknLFxuICAgICAgICAgICAgJ2lnby5nZW8ucHJpbnRGb3JtLmNvcnNFcnJvck1lc3NhZ2VIZWFkZXInXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2V0T3JpZ2luYWxNYXBTaXplKG1hcCwgbWFwU2l6ZSwgdmlld1Jlc29sdXRpb24pO1xuICAgICAgICBzdGF0dXMkLm5leHQoc3RhdHVzKTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3RhdHVzJDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TWFwUmVzb2x1dGlvbihcbiAgICBtYXA6IElnb01hcCxcbiAgICBpbml0aWFsU2l6ZTogW251bWJlciwgbnVtYmVyXSxcbiAgICByZXNvbHV0aW9uOiBudW1iZXIsXG4gICAgdmlld1Jlc29sdXRpb246IG51bWJlclxuICApOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICBjb25zdCBtYXBTaXplID0gbWFwLm9sLmdldFNpemUoKTtcbiAgICBjb25zdCB3aWR0aFBpeGVscyA9IE1hdGgucm91bmQoKGluaXRpYWxTaXplWzBdICogcmVzb2x1dGlvbikgLyAyNS40KTtcbiAgICBjb25zdCBoZWlnaHRQaXhlbHMgPSBNYXRoLnJvdW5kKChpbml0aWFsU2l6ZVsxXSAqIHJlc29sdXRpb24pIC8gMjUuNCk7XG5cbiAgICAvLyBTZXQgcHJpbnQgc2l6ZVxuICAgIGNvbnN0IHByaW50U2l6ZSA9IFt3aWR0aFBpeGVscywgaGVpZ2h0UGl4ZWxzXTtcbiAgICBtYXAub2wuc2V0U2l6ZShwcmludFNpemUpO1xuICAgIGNvbnN0IHNjYWxpbmcgPSBNYXRoLm1pbihcbiAgICAgIHdpZHRoUGl4ZWxzIC8gbWFwU2l6ZVswXSxcbiAgICAgIGhlaWdodFBpeGVscyAvIG1hcFNpemVbMV1cbiAgICApO1xuICAgIG1hcC5vbC5nZXRWaWV3KCkuc2V0UmVzb2x1dGlvbih2aWV3UmVzb2x1dGlvbiAvIHNjYWxpbmcpO1xuXG4gICAgcmV0dXJuIFt3aWR0aFBpeGVscywgaGVpZ2h0UGl4ZWxzXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRPcmlnaW5hbE1hcFNpemUoXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgaW5pdGlhbFNpemU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgdmlld1Jlc29sdXRpb246IG51bWJlclxuICApIHtcbiAgICBtYXAub2wuc2V0U2l6ZShpbml0aWFsU2l6ZSk7XG4gICAgbWFwLm9sLmdldFZpZXcoKS5zZXRSZXNvbHV0aW9uKHZpZXdSZXNvbHV0aW9uKTtcbiAgICBtYXAub2wudXBkYXRlU2l6ZSgpO1xuICAgIG1hcC5vbC5yZW5kZXJTeW5jKCk7XG4gIH1cblxuICBhc3luYyBkcmF3TWFwKFxuICAgIHNpemU6IEFycmF5PG51bWJlcj4sXG4gICAgbWFwQ2FudmFzOiBIVE1MQ29sbGVjdGlvbk9mPEhUTUxDYW52YXNFbGVtZW50PlxuICApOiBQcm9taXNlPEhUTUxDYW52YXNFbGVtZW50PiB7XG4gICAgY29uc3QgbWFwUmVzdWx0Q2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgbWFwUmVzdWx0Q2FudmFzLndpZHRoID0gc2l6ZVswXTtcbiAgICBtYXBSZXN1bHRDYW52YXMuaGVpZ2h0ID0gc2l6ZVsxXTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBtYXBDYW52YXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBjYW52YXMgPSBtYXBDYW52YXNbaW5kZXhdO1xuICAgICAgaWYgKGNhbnZhcy53aWR0aCA+IDApIHtcbiAgICAgICAgdGhpcy5oYW5kbGVDYW52YXMoY2FudmFzLCBtYXBSZXN1bHRDYW52YXMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwUmVzdWx0Q2FudmFzO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDYW52YXMoXG4gICAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCxcbiAgICBtYXBSZXN1bHRDYW52YXM6IEhUTUxDYW52YXNFbGVtZW50XG4gICkge1xuICAgIGNvbnN0IG1hcENvbnRleHRSZXN1bHQgPSBtYXBSZXN1bHRDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBjb25zdCBvcGFjaXR5ID0gY2FudmFzLnBhcmVudEVsZW1lbnQuc3R5bGUub3BhY2l0eSB8fCBjYW52YXMuc3R5bGUub3BhY2l0eTtcbiAgICBtYXBDb250ZXh0UmVzdWx0Lmdsb2JhbEFscGhhID0gb3BhY2l0eSA9PT0gJycgPyAxIDogTnVtYmVyKG9wYWNpdHkpO1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IGNhbnZhcy5zdHlsZS50cmFuc2Zvcm07XG4gICAgbGV0IG1hdHJpeDogbnVtYmVyW107XG4gICAgaWYgKHRyYW5zZm9ybSkge1xuICAgICAgLy8gR2V0IHRoZSB0cmFuc2Zvcm0gcGFyYW1ldGVycyBmcm9tIHRoZSBzdHlsZSdzIHRyYW5zZm9ybSBtYXRyaXhcbiAgICAgIG1hdHJpeCA9IHRyYW5zZm9ybVxuICAgICAgICAubWF0Y2goL15tYXRyaXhcXCgoW15cXChdKilcXCkkLylbMV1cbiAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgLm1hcChOdW1iZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXRyaXggPSBbXG4gICAgICAgIHBhcnNlRmxvYXQoY2FudmFzLnN0eWxlLndpZHRoKSAvIGNhbnZhcy53aWR0aCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgcGFyc2VGbG9hdChjYW52YXMuc3R5bGUuaGVpZ2h0KSAvIGNhbnZhcy5oZWlnaHQsXG4gICAgICAgIDAsXG4gICAgICAgIDBcbiAgICAgIF07XG4gICAgfVxuICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUuc2V0VHJhbnNmb3JtLmFwcGx5KFxuICAgICAgbWFwQ29udGV4dFJlc3VsdCxcbiAgICAgIG1hdHJpeFxuICAgICk7XG4gICAgY29uc3QgYmFja2dyb3VuZENvbG9yID0gY2FudmFzLnBhcmVudEVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yO1xuICAgIGlmIChiYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgIG1hcENvbnRleHRSZXN1bHQuZmlsbFN0eWxlID0gYmFja2dyb3VuZENvbG9yO1xuICAgICAgbWFwQ29udGV4dFJlc3VsdC5maWxsUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgIH1cbiAgICBtYXBDb250ZXh0UmVzdWx0LmRyYXdJbWFnZShjYW52YXMsIDAsIDApO1xuICAgIG1hcENvbnRleHRSZXN1bHQuZ2xvYmFsQWxwaGEgPSAxO1xuICAgIC8vIHJlc2V0IGNhbnZhcyB0cmFuc2Zvcm0gdG8gaW5pdGlhbFxuICAgIG1hcENvbnRleHRSZXN1bHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICB9XG5cbiAgYXN5bmMgZHJhd01hcENvbnRyb2xzKFxuICAgIG1hcDogSWdvTWFwLFxuICAgIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsXG4gICAgcG9zaXRpb246IFByaW50TGVnZW5kUG9zaXRpb25cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIC8vIEdldCB0aGUgc2NhbGUgYW5kIGF0dHJpYnV0aW9uXG4gICAgLy8gd2UgdXNlIGNsb25lTm9kZSB0byBtb2RpZnkgdGhlIG5vZGVzIHRvIHByaW50IHdpdGhvdXQgbW9kaWZ5aW5nIGl0IG9uIHRoZSBwYWdlLCB1c2luZyBkZWVwOnRydWUgdG8gZ2V0IGNoaWxkcmVuXG4gICAgY29uc3QgbWFwT3ZlcmxheUhUTUwgPSBtYXAub2xcbiAgICAgIC5nZXRPdmVybGF5Q29udGFpbmVyU3RvcEV2ZW50KClcbiAgICAgIC5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gYWRkIE5vcnRoIERpcmVjdGlvbiB0byBtYXBPdmVybHlcbiAgICBhd2FpdCB0aGlzLmFkZE5vcnRoRGlyZWN0aW9uKG1hcE92ZXJsYXlIVE1MLCBwb3NpdGlvbik7XG4gICAgLy8gYWRkIG1hcCBBdHRyaWJ1dGlvbiBkZXNpZ25lIHRvIHByaW50XG4gICAgYXdhaXQgdGhpcy5hZGRBdHRyaWJ1dGlvbihtYXBPdmVybGF5SFRNTCk7XG5cbiAgICAvLyBzZXQgJ092ZXJsYXlDb250YWluZXInIHNpemUgdG8gcHJpbnQgc2l6ZVxuICAgIG1hcE92ZXJsYXlIVE1MLnN0eWxlLndpZHRoID0gY2FudmFzLndpZHRoICsgJ3B4JztcbiAgICBtYXBPdmVybGF5SFRNTC5zdHlsZS5oZWlnaHQgPSBjYW52YXMuaGVpZ2h0ICsgJ3B4JztcbiAgICAvLyB3ZSBhZGQgemluZGV4IC0xIHRvIG5vdCBzaG93IG1vZGlmaWNhdGlvbiB0byB0aGUgdXNlclxuICAgIG1hcE92ZXJsYXlIVE1MLnN0eWxlLnpJbmRleCA9ICctMSc7XG4gICAgLy8gYW5kIG1ha2Ugc3VyZSBodG1sMmNhbnZhcyB0byByZW5kZXIgdGhlIGltYWdlIGNvcnJlY3RseVxuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnb2wtdmlld3BvcnQnKVswXVxuICAgICAgLmFwcGVuZENoaWxkKG1hcE92ZXJsYXlIVE1MKTtcbiAgICAvLyBDaGFuZ2UgdGhlIHN0eWxlcyBvZiBoeXBlcmxpbmsgaW4gdGhlIHByaW50ZWQgdmVyc2lvblxuICAgIC8vIFRyYW5zZm9ybSB0aGUgT3ZlcmxheSBpbnRvIGEgY2FudmFzXG4gICAgLy8gc2NhbGUgaXMgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgaW4gZ29vZ2xlIGNocm9tZVxuICAgIC8vIGJhY2tncm91bmQgYXMgbnVsbCBiZWNhdXNlIG90aGVyd2lzZSBpdCBpcyB3aGl0ZSBhbmQgY292ZXIgdGhlIG1hcFxuICAgIC8vIGFsbG93dGFpbnQgaXMgdG8gYWxsb3cgcmVuZGVyaW5nIGltYWdlcyBpbiB0aGUgYXR0cmlidXRpb25zXG4gICAgLy8gdXNlQ09SUzogdHJ1ZSBwb3VyIHBlcm1ldHRyZSBkZSByZW5kZXJlciBsZXMgaW1hZ2VzIChuZSBtYXJjaGUgcGFzIGVuIGxvY2FsKVxuICAgIGNvbnN0IGNhbnZhc092ZXJsYXlIVE1MID0gYXdhaXQgaHRtbDJjYW52YXMobWFwT3ZlcmxheUhUTUwsIHtcbiAgICAgIHNjYWxlOiAxLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBudWxsLFxuICAgICAgYWxsb3dUYWludDogdHJ1ZSxcbiAgICAgIHVzZUNPUlM6IHRydWVcbiAgICB9KTtcblxuICAgIGlmIChjYW52YXNPdmVybGF5SFRNTC53aWR0aCAhPT0gMCAmJiBjYW52YXNPdmVybGF5SFRNTC5oZWlnaHQgIT09IDApIHtcbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGNhbnZhc092ZXJsYXlIVE1MLCAwLCAwKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgJ21hcE92ZXJsYXlIVE1MJyBhZnRlciBnZW5lcmF0aW5nIGNhbnZhc1xuICAgIG1hcE92ZXJsYXlIVE1MLnJlbW92ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGROb3J0aERpcmVjdGlvbihcbiAgICBtYXBPdmVybGF5SFRNTDogSFRNTEVsZW1lbnQsXG4gICAgcG9zaXRpb246IFByaW50TGVnZW5kUG9zaXRpb25cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm9ydGhEaXJlY3Rpb24gPSBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpZ28tcm90YXRpb24tYnV0dG9uJylbMF1cbiAgICAgIC5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgSFRNTEJ1dHRvbiA9IG5vcnRoRGlyZWN0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKFxuICAgICAgJ2J1dHRvbidcbiAgICApWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghSFRNTEJ1dHRvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIGluIGNhc2UgbGVnZW5kIHBvc2l0aW9uIGlzIHRvcHJpZ2h0XG4gICAgLy8gd2UgY2hhbmdlIHJvdGF0ZSBidG4gdG8gdG9wbGVmdFxuICAgIGlmIChwb3NpdGlvbiA9PT0gJ3RvcHJpZ2h0Jykge1xuICAgICAgbm9ydGhEaXJlY3Rpb24uc3R5bGUud2lkdGggPSAnaW5oZXJpdCc7XG4gICAgICBub3J0aERpcmVjdGlvbi5zdHlsZS5sZWZ0ID0gJzEwcHgnO1xuICAgIH1cbiAgICBIVE1MQnV0dG9uLnBhcmVudEVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7XG4gICAgSFRNTEJ1dHRvbi5zdHlsZS5jb2xvciA9ICcjMDAwJztcbiAgICBtYXBPdmVybGF5SFRNTC5hcHBlbmRDaGlsZChub3J0aERpcmVjdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZEF0dHJpYnV0aW9uKG1hcE92ZXJsYXlIVE1MOiBIVE1MRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IEhUTUxhdHRyaWJ1dGlvbiA9XG4gICAgICBtYXBPdmVybGF5SFRNTC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdvbC1hdHRyaWJ1dGlvbicpWzBdO1xuICAgIGNvbnN0IEhUTUxCdXR0b24gPSBIVE1MYXR0cmlidXRpb24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpWzBdO1xuICAgIGlmICghSFRNTEJ1dHRvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIEhUTUxCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWh0bWwyY2FudmFzLWlnbm9yZScsICd0cnVlJyk7XG4gICAgY29uc3Qgb2xDb2xsYXBzZWQ6IGJvb2xlYW4gPVxuICAgICAgSFRNTGF0dHJpYnV0aW9uLmNsYXNzTGlzdC5jb250YWlucygnb2wtY29sbGFwc2VkJyk7XG4gICAgaWYgKG9sQ29sbGFwc2VkKSB7XG4gICAgICBIVE1MYXR0cmlidXRpb24uY2xhc3NMaXN0LnJlbW92ZSgnb2wtY29sbGFwc2VkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkIGFuIGltYWdlIG9mIHRoZSBtYXAgd2l0aCBhZGRpdGlvbiBvZiBpbmZvcm1hdGlvbnNcbiAgICogQHBhcmFtICBtYXAgLSBNYXAgb2YgdGhlIGFwcFxuICAgKiBAcGFyYW0gIGZvcm1hdCAtIEltYWdlIGZvcm1hdC4gZGVmYXVsdCB2YWx1ZSB0byBcInBuZ1wiXG4gICAqIEBwYXJhbSAgcHJvamVjdGlvbiAtIEluZGljYXRlIGlmIHByb2plY3Rpb24gbmVlZCB0byBiZSBhZGQuIERlZmF1bHQgdG8gZmFsc2VcbiAgICogQHBhcmFtICBzY2FsZSAtIEluZGljYXRlIGlmIHNjYWxlIG5lZWQgdG8gYmUgYWRkLiBEZWZhdWx0IHRvIGZhbHNlXG4gICAqIEBwYXJhbSAgbGVnZW5kIC0gSW5kaWNhdGUgaWYgdGhlIGxlZ2VuZCBvZiBsYXllcnMgbmVlZCB0byBiZSBkb3dubG9hZC4gRGVmYXVsdCB0byBmYWxzZVxuICAgKiBAcGFyYW0gIHRpdGxlIC0gVGl0bGUgdG8gYWRkIGZvciB0aGUgbWFwIC0gRGVmYXVsdCB0byBibGFua1xuICAgKiBAcGFyYW0gIHN1YnRpdGxlIC0gU3VidGl0bGUgdG8gYWRkIGZvciB0aGUgbWFwIC0gRGVmYXVsdCB0byBibGFua1xuICAgKiBAcGFyYW0gIGNvbW1lbnQgLSBDb21tZW50IHRvIGFkZCBmb3IgdGhlIG1hcCAtIERlZmF1bHQgdG8gYmxhbmtcbiAgICogQHBhcmFtICBkb1ppcEZpbGUgLSBJbmRpY2F0ZSBpZiB3ZSBkbyBhIHppcCB3aXRoIHRoZSBmaWxlXG4gICAqIEByZXR1cm4gSW1hZ2UgZmlsZSBvZiB0aGUgbWFwIHdpdGggZXh0ZW5zaW9uIGZvcm1hdCBnaXZlbiBhcyBwYXJhbWV0ZXJcbiAgICovXG4gIGRvd25sb2FkTWFwSW1hZ2UoXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgcHJpbnRSZXNvbHV0aW9uOiBQcmludFJlc29sdXRpb24sXG4gICAgZm9ybWF0ID0gJ3BuZycsXG4gICAgcHJvamVjdGlvbiA9IGZhbHNlLFxuICAgIHNjYWxlID0gZmFsc2UsXG4gICAgdGl0bGUgPSAnJyxcbiAgICBzdWJ0aXRsZSA9ICcnLFxuICAgIGNvbW1lbnQgPSAnJyxcbiAgICBkb1ppcEZpbGUgPSB0cnVlLFxuICAgIGxlZ2VuZFBvc2l0aW9uOiBQcmludExlZ2VuZFBvc2l0aW9uXG4gICkge1xuICAgIGNvbnN0IHN0YXR1cyQgPSBuZXcgU3ViamVjdCgpO1xuICAgIHRoaXMuYWN0aXZpdHlJZCA9IHRoaXMuYWN0aXZpdHlTZXJ2aWNlLnJlZ2lzdGVyKCk7XG4gICAgY29uc3QgdHJhbnNsYXRlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlO1xuICAgIGZvcm1hdCA9IGZvcm1hdC50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHJlc29sdXRpb24gPSArcHJpbnRSZXNvbHV0aW9uO1xuICAgIGNvbnN0IGluaXRpYWxNYXBTaXplID0gbWFwLm9sLmdldFNpemUoKSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICAgIGNvbnN0IHZpZXdSZXNvbHV0aW9uID0gbWFwLm9sLmdldFZpZXcoKS5nZXRSZXNvbHV0aW9uKCk7XG5cbiAgICBtYXAub2wub25jZSgncmVuZGVyY29tcGxldGUnLCBhc3luYyAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgY29uc3Qgc2l6ZSA9IG1hcC5vbC5nZXRTaXplKCk7XG4gICAgICBjb25zdCBtYXBDYW52YXMgPSBldmVudC50YXJnZXRcbiAgICAgICAgLmdldFZpZXdwb3J0KClcbiAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdjYW52YXMnKSBhcyBIVE1MQ29sbGVjdGlvbk9mPEhUTUxDYW52YXNFbGVtZW50PjtcbiAgICAgIGNvbnN0IG1hcFJlc3VsdENhbnZhcyA9IGF3YWl0IHRoaXMuZHJhd01hcChzaXplLCBtYXBDYW52YXMpO1xuXG4gICAgICB0aGlzLnJlc2V0T3JpZ2luYWxNYXBTaXplKG1hcCwgaW5pdGlhbE1hcFNpemUsIHZpZXdSZXNvbHV0aW9uKTtcblxuICAgICAgYXdhaXQgdGhpcy5kcmF3TWFwQ29udHJvbHMobWFwLCBtYXBSZXN1bHRDYW52YXMsIGxlZ2VuZFBvc2l0aW9uKTtcbiAgICAgIC8vIENoZWNrIHRoZSBsZWdlbmRQb3NpdGlvblxuICAgICAgaWYgKGxlZ2VuZFBvc2l0aW9uICE9PSAnbm9uZScpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIFsndG9wbGVmdCcsICd0b3ByaWdodCcsICdib3R0b21sZWZ0JywgJ2JvdHRvbXJpZ2h0J10uaW5kZXhPZihcbiAgICAgICAgICAgIGxlZ2VuZFBvc2l0aW9uXG4gICAgICAgICAgKSA+IC0xXG4gICAgICAgICkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRkTGVnZW5kVG9JbWFnZShcbiAgICAgICAgICAgIG1hcFJlc3VsdENhbnZhcyxcbiAgICAgICAgICAgIG1hcCxcbiAgICAgICAgICAgIHJlc29sdXRpb24sXG4gICAgICAgICAgICBsZWdlbmRQb3NpdGlvbixcbiAgICAgICAgICAgIGZvcm1hdFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAobGVnZW5kUG9zaXRpb24gPT09ICduZXdwYWdlJykge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0TGF5ZXJzTGVnZW5kSW1hZ2UobWFwLCBmb3JtYXQsIGRvWmlwRmlsZSwgcmVzb2x1dGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGFkZCBvdGhlciBpbmZvcm1hdGlvbiB0byBmaW5hbCBjYW52YXMgYmVmb3JlIGV4cG9ydGluZ1xuICAgICAgY29uc3QgbmV3Q2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjb25zdCBuZXdDb250ZXh0ID0gbmV3Q2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAvLyBQb3N0aW9uIGluIGhlaWdodCB0byBzZXQgdGhlIGNhbnZhcyBpbiBuZXcgY2FudmFzXG4gICAgICBsZXQgcG9zaXRpb25IQ2FudmFzID0gMDtcbiAgICAgIC8vIEdldCBoZWlnaHQvd2lkdGggb2YgbWFwIGNhbnZhc1xuICAgICAgY29uc3Qgd2lkdGggPSBtYXBSZXN1bHRDYW52YXMud2lkdGg7XG4gICAgICBsZXQgaGVpZ2h0ID0gbWFwUmVzdWx0Q2FudmFzLmhlaWdodDtcbiAgICAgIC8vIFNldCBGb250IHRvIGNhbGN1bGF0ZSBjb21tZW50IHdpZHRoXG4gICAgICBuZXdDb250ZXh0LmZvbnQgPSAnMjBweCBDYWxpYnJpJztcbiAgICAgIGNvbnN0IGNvbW1lbnRXaWR0aCA9IG5ld0NvbnRleHQubWVhc3VyZVRleHQoY29tbWVudCkud2lkdGg7XG4gICAgICAvLyBBZGQgaGVpZ2h0IGZvciB0aXRsZSBpZiBkZWZpbmVkXG4gICAgICBoZWlnaHQgPSB0aXRsZSAhPT0gJycgPyBoZWlnaHQgKyAzMCA6IGhlaWdodDtcbiAgICAgIC8vIEFkZCBoZWlnaHQgZm9yIHRpdGxlIGlmIGRlZmluZWRcbiAgICAgIGhlaWdodCA9IHN1YnRpdGxlICE9PSAnJyA/IGhlaWdodCArIDMwIDogaGVpZ2h0O1xuICAgICAgLy8gQWRkIGhlaWdodCBmb3IgcHJvamVjdGlvbiBvciBzY2FsZSAoc2FtZSBsaW5lKSBpZiBkZWZpbmVkXG4gICAgICBoZWlnaHQgPSBwcm9qZWN0aW9uICE9PSBmYWxzZSB8fCBzY2FsZSAhPT0gZmFsc2UgPyBoZWlnaHQgKyAzMCA6IGhlaWdodDtcbiAgICAgIGNvbnN0IHBvc2l0aW9uSFByb2pTY2FsZSA9IGhlaWdodCAtIDEwO1xuICAgICAgLy8gRGVmaW5lIG51bWJlciBvZiBsaW5lIGRlcGVuZGluZyBvZiB0aGUgY29tbWVudCBsZW5ndGhcbiAgICAgIGNvbnN0IGNvbW1lbnROYkxpbmUgPSBNYXRoLmNlaWwoY29tbWVudFdpZHRoIC8gd2lkdGgpO1xuICAgICAgLy8gQWRkIGhlaWdodCBmb3IgbXVsdGlsaW5lIGNvbW1lbnQgaWYgZGVmaW5lZFxuICAgICAgaGVpZ2h0ID0gY29tbWVudCAhPT0gJycgPyBoZWlnaHQgKyBjb21tZW50TmJMaW5lICogMzAgOiBoZWlnaHQ7XG4gICAgICBsZXQgcG9zaXRpb25IQ29tbWVudCA9IGhlaWdodCAtIGNvbW1lbnROYkxpbmUgKiAyMCArIDU7XG4gICAgICAvLyBTZXQgdGhlIG5ldyBjYW52YXMgd2l0aCB0aGUgbmV3IGNhbGN1bGF0ZWQgc2l6ZVxuICAgICAgbmV3Q2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICBuZXdDYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICBpZiAoWydibXAnLCAnZ2lmJywgJ2pwZWcnLCAncG5nJywgJ3RpZmYnXS5pbmRleE9mKGZvcm1hdCkgPiAtMSkge1xuICAgICAgICAvLyBQYXRjaCBKcGVnIGRlZmF1bHQgYmxhY2sgYmFja2dyb3VuZCB0byB3aGl0ZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgZm9ybWF0ID09PSAnanBlZycgfHxcbiAgICAgICAgICB0aXRsZSAhPT0gJycgfHxcbiAgICAgICAgICBzdWJ0aXRsZSAhPT0gJycgfHxcbiAgICAgICAgICBjb21tZW50ICE9PSAnJyB8fFxuICAgICAgICAgIHByb2plY3Rpb24gIT09IGZhbHNlIHx8XG4gICAgICAgICAgc2NhbGUgIT09IGZhbHNlXG4gICAgICAgICkge1xuICAgICAgICAgIG5ld0NvbnRleHQuZmlsbFN0eWxlID0gJyNmZmZmZmYnO1xuICAgICAgICAgIG5ld0NvbnRleHQuZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgbmV3Q29udGV4dC5maWxsU3R5bGUgPSAnIzAwMDAwMCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIElmIGEgdGl0bGUgbmVlZCB0byBiZSBhZGRlZCB0byBjYW52YXNcbiAgICAgIGlmICh0aXRsZSAhPT0gJycpIHtcbiAgICAgICAgLy8gU2V0IGZvbnQgZm9yIHRpdGxlXG4gICAgICAgIC8vIEFkanVzdCBhY2NvcmRpbmcgdG8gdGl0bGUgbGVuZ3RoXG4gICAgICAgIG5ld0NvbnRleHQuZm9udCA9ICcyNnB4IENhbGlicmknO1xuICAgICAgICBwb3NpdGlvbkhDYW52YXMgPSAzMDtcbiAgICAgICAgbmV3Q29udGV4dC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dCh0aXRsZSwgd2lkdGggLyAyLCAyMCwgd2lkdGggKiAwLjkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3VidGl0bGUgIT09ICcnKSB7XG4gICAgICAgIC8vIFNldCBmb250IGZvciBzdWJ0aXRsZVxuICAgICAgICAvLyBBZGp1c3QgYWNjb3JkaW5nIHRvIHRpdGxlIGxlbmd0aFxuICAgICAgICBuZXdDb250ZXh0LmZvbnQgPSAnMjZweCBDYWxpYnJpJztcbiAgICAgICAgcG9zaXRpb25IQ2FudmFzID0gNjA7XG4gICAgICAgIG5ld0NvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIG5ld0NvbnRleHQuZmlsbFRleHQoc3VidGl0bGUsIHdpZHRoIC8gMiwgNTAsIHdpZHRoICogMC45KTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGZvbnQgZm9yIG5leHQgc2VjdGlvblxuICAgICAgbmV3Q29udGV4dC5mb250ID0gJzIwcHggQ2FsaWJyaSc7XG4gICAgICAvLyBJZiBwcm9qZWN0aW9uIG9yL2VuZCBzY2FsZSBuZWVkIHRvIGJlIGFkZGVkIHRvIGNhbnZhc1xuICAgICAgaWYgKHByb2plY3Rpb24gIT09IGZhbHNlIHx8IHNjYWxlICE9PSBmYWxzZSkge1xuICAgICAgICBsZXQgcHJvamVjdGlvblNjYWxlVGV4dCA9ICcnO1xuICAgICAgICBpZiAocHJvamVjdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBjb25zdCBwcm9qVGV4dCA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLnByaW50Rm9ybS5wcm9qZWN0aW9uJyk7XG4gICAgICAgICAgcHJvamVjdGlvblNjYWxlVGV4dCA9IHByb2pUZXh0ICsgJzogJyArIG1hcC5wcm9qZWN0aW9uICsgJyAgICAgICAgICc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2NhbGUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgY29uc3Qgc2NhbGVUZXh0ID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8ucHJpbnRGb3JtLnNjYWxlJyk7XG4gICAgICAgICAgY29uc3QgbWFwU2NhbGUgPSBtYXAudmlld0NvbnRyb2xsZXIuZ2V0U2NhbGUocmVzb2x1dGlvbik7XG4gICAgICAgICAgcHJvamVjdGlvblNjYWxlVGV4dCArPSBzY2FsZVRleHQgKyAnOiB+IDEgLyAnICsgZm9ybWF0U2NhbGUobWFwU2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIG5ld0NvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIG5ld0NvbnRleHQuZmlsbFRleHQoXG4gICAgICAgICAgcHJvamVjdGlvblNjYWxlVGV4dCxcbiAgICAgICAgICB3aWR0aCAvIDIsXG4gICAgICAgICAgcG9zaXRpb25IUHJvalNjYWxlLFxuICAgICAgICAgIHdpZHRoICogMC45XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGEgY29tbWVudCBuZWVkIHRvIGJlIGFkZGVkIHRvIGNhbnZhc1xuICAgICAgaWYgKGNvbW1lbnQgIT09ICcnKSB7XG4gICAgICAgIG5ld0NvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIC8vIElmIG9ubHkgb25lIGxpbmUsIG5vIG5lZWQgdG8gbXVsdGlsaW5lIHRoZSBjb21tZW50XG4gICAgICAgIGlmIChjb21tZW50TmJMaW5lID09PSAxKSB7XG4gICAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dChjb21tZW50LCB3aWR0aCAvIDIsIHBvc2l0aW9uSENvbW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNlcGFyYXRlIHRoZSBzZXRlbnNlcyB0byBiZSBhcHByb3guIHRoZSBzYW1lIGxlbmd0aFxuICAgICAgICAgIGNvbnN0IG5iQ29tbWVudENoYXIgPSBjb21tZW50Lmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBDb21tZW50TGVuZ3RoVG9DdXQgPSBNYXRoLmZsb29yKG5iQ29tbWVudENoYXIgLyBjb21tZW50TmJMaW5lKTtcbiAgICAgICAgICBsZXQgY29tbWVudEN1cnJlbnRMaW5lID0gJyc7XG4gICAgICAgICAgbGV0IHBvc2l0aW9uRmlyc3RDdXRDaGFyID0gMDtcbiAgICAgICAgICBsZXQgcG9zaXRpb25MYXN0Qmxhbms7XG4gICAgICAgICAgLy8gTG9vcCBmb3IgdGhlIG51bWJlciBvZiBsaW5lIGNhbGN1bGF0ZWRcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1lbnROYkxpbmU7IGkrKykge1xuICAgICAgICAgICAgLy8gRm9yIGFsbCBsaW5lIGV4Y2VwdCBsYXN0XG4gICAgICAgICAgICBpZiAoY29tbWVudE5iTGluZSAtIDEgPiBpKSB7XG4gICAgICAgICAgICAgIC8vIEdldCBjb21tZW50IGN1cnJlbnQgbGluZSB0byBmaW5kIHRoZSByaWdodCBwbGFjZSB0dSBjdXQgY29tbWVudFxuICAgICAgICAgICAgICBjb21tZW50Q3VycmVudExpbmUgPSBjb21tZW50LnN1YnN0cihcbiAgICAgICAgICAgICAgICBwb3NpdGlvbkZpcnN0Q3V0Q2hhcixcbiAgICAgICAgICAgICAgICBDb21tZW50TGVuZ3RoVG9DdXRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgLy8gQ3V0IHRoZSBzZXRlbmNlIGF0IGJsYW5rXG4gICAgICAgICAgICAgIHBvc2l0aW9uTGFzdEJsYW5rID0gY29tbWVudEN1cnJlbnRMaW5lLmxhc3RJbmRleE9mKCcgJyk7XG4gICAgICAgICAgICAgIG5ld0NvbnRleHQuZmlsbFRleHQoXG4gICAgICAgICAgICAgICAgY29tbWVudEN1cnJlbnRMaW5lLnN1YnN0cigwLCBwb3NpdGlvbkxhc3RCbGFuayksXG4gICAgICAgICAgICAgICAgd2lkdGggLyAyLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uSENvbW1lbnRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcG9zaXRpb25GaXJzdEN1dENoYXIgKz0gcG9zaXRpb25MYXN0Qmxhbms7XG4gICAgICAgICAgICAgIC8vIEdvIHRvIG5leHQgbGluZSBmb3IgaW5zZXJ0aW9uXG4gICAgICAgICAgICAgIHBvc2l0aW9uSENvbW1lbnQgKz0gMjA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBEb24ndCBjdXQgbGFzdCBwYXJ0XG4gICAgICAgICAgICAgIG5ld0NvbnRleHQuZmlsbFRleHQoXG4gICAgICAgICAgICAgICAgY29tbWVudC5zdWJzdHIocG9zaXRpb25GaXJzdEN1dENoYXIpLFxuICAgICAgICAgICAgICAgIHdpZHRoIC8gMixcbiAgICAgICAgICAgICAgICBwb3NpdGlvbkhDb21tZW50XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5ld0NvbnRleHQuZHJhd0ltYWdlKG1hcFJlc3VsdENhbnZhcywgMCwgcG9zaXRpb25IQ2FudmFzKTtcblxuICAgICAgbGV0IHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRG9uZTtcbiAgICAgIGxldCBmaWxlTmFtZVdpdGhFeHQgPSAnbWFwLicgKyBmb3JtYXQ7XG4gICAgICBpZiAoZm9ybWF0LnRvTG93ZXJDYXNlKCkgPT09ICd0aWZmJykge1xuICAgICAgICBmaWxlTmFtZVdpdGhFeHQgPVxuICAgICAgICAgICdtYXAnICsgbWFwLnByb2plY3Rpb24ucmVwbGFjZSgnOicsICdfJykgKyAnLicgKyBmb3JtYXQ7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFNhdmUgdGhlIGNhbnZhcyBhcyBmaWxlXG4gICAgICAgIGlmICghZG9aaXBGaWxlKSB7XG4gICAgICAgICAgdGhpcy5zYXZlQ2FudmFzSW1hZ2VBc0ZpbGUobmV3Q2FudmFzLCBmaWxlTmFtZVdpdGhFeHQsIGZvcm1hdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0LnRvTG93ZXJDYXNlKCkgPT09ICd0aWZmJykge1xuICAgICAgICAgIC8vIEFkZCB0aGUgY2FudmFzIHRvIHppcFxuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVDYW52YUZpbGVUb1ppcChuZXdDYW52YXMsIGZpbGVOYW1lV2l0aEV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQWRkIHRoZSBjYW52YXMgdG8gemlwXG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbnZhRmlsZVRvWmlwKG5ld0NhbnZhcywgZmlsZU5hbWVXaXRoRXh0KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRXJyb3I7XG4gICAgICB9XG4gICAgICBzdGF0dXMkLm5leHQoc3RhdHVzKTtcblxuICAgICAgaWYgKGZvcm1hdC50b0xvd2VyQ2FzZSgpID09PSAndGlmZicpIHtcbiAgICAgICAgY29uc3QgdGZ3RmlsZU5hbWVXaXRoRXh0ID1cbiAgICAgICAgICBmaWxlTmFtZVdpdGhFeHQuc3Vic3RyaW5nKFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGZpbGVOYW1lV2l0aEV4dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJy50aWZmJylcbiAgICAgICAgICApICsgJy50ZncnO1xuICAgICAgICBjb25zdCB0aXdDb250ZW50ID0gdGhpcy5nZXRXb3JsZEZpbGVJbmZvcm1hdGlvbihtYXApO1xuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3Rpd0NvbnRlbnRdLCB7XG4gICAgICAgICAgdHlwZTogJ3RleHQvcGxhaW47Y2hhcnNldD11dGYtOCdcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZG9aaXBGaWxlKSB7XG4gICAgICAgICAgLy8gc2F2ZUFzIGF1dG9tYXRpY2x5IHJlcGxhY2UgJzonIGZvciAnXydcbiAgICAgICAgICBzYXZlQXMoYmxvYiwgdGZ3RmlsZU5hbWVXaXRoRXh0KTtcbiAgICAgICAgICB0aGlzLnNhdmVGaWxlUHJvY2Vzc2luZygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFkZCB0aGUgY2FudmFzIHRvIHppcFxuICAgICAgICAgIHRoaXMuYWRkRmlsZVRvWmlwKHRmd0ZpbGVOYW1lV2l0aEV4dCwgYmxvYik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuc2V0TWFwSW1hZ2VSZXNvbHV0aW9uKG1hcCwgaW5pdGlhbE1hcFNpemUsIHJlc29sdXRpb24sIHZpZXdSZXNvbHV0aW9uKTtcblxuICAgIHJldHVybiBzdGF0dXMkO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRNYXBJbWFnZVJlc29sdXRpb24oXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgaW5pdGlhbE1hcFNpemU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyLFxuICAgIHZpZXdSZXNvbHV0aW9uOiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgc2NhbGVGYWN0b3IgPSByZXNvbHV0aW9uIC8gOTY7XG4gICAgY29uc3QgbmV3TWFwU2l6ZSA9IFtcbiAgICAgIE1hdGgucm91bmQoaW5pdGlhbE1hcFNpemVbMF0gKiBzY2FsZUZhY3RvciksIC8vIHdpZHRoXG4gICAgICBNYXRoLnJvdW5kKGluaXRpYWxNYXBTaXplWzFdICogc2NhbGVGYWN0b3IpIC8vIGhlaWdodFxuICAgIF07XG4gICAgbWFwLm9sLnNldFNpemUobmV3TWFwU2l6ZSk7XG4gICAgY29uc3Qgc2NhbGluZyA9IE1hdGgubWluKFxuICAgICAgbmV3TWFwU2l6ZVswXSAvIGluaXRpYWxNYXBTaXplWzBdLFxuICAgICAgbmV3TWFwU2l6ZVsxXSAvIGluaXRpYWxNYXBTaXplWzFdXG4gICAgKTtcbiAgICBjb25zdCB2aWV3ID0gbWFwLm9sLmdldFZpZXcoKTtcbiAgICB2aWV3LnNldFJlc29sdXRpb24odmlld1Jlc29sdXRpb24gLyBzY2FsaW5nKTtcbiAgICBtYXAub2wucmVuZGVyU3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbmQgQWRkIExlZ2VuZCB0byB0aGUgbWFwIGNhbnZhc1xuICAgKiBAcGFyYW0gIGNhbnZhcyBDYW52YXMgb2YgdGhlIG1hcFxuICAgKiBAcGFyYW0gIG1hcCBNYXAgb2YgdGhlIGFwcFxuICAgKiBAcGFyYW0gIHJlc29sdXRpb24gUmVzb2x1dGlvbiBvZiBtYXBcbiAgICogQHBhcmFtICBsZWdlbmRQb3NpdGlvbiBMZWdlbmQgcG9zaXRpb25cbiAgICogQHBhcmFtICBmb3JtYXQgSW1hZ2UgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFkZExlZ2VuZFRvSW1hZ2UoXG4gICAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCxcbiAgICBtYXA6IElnb01hcCxcbiAgICByZXNvbHV0aW9uOiBudW1iZXIsXG4gICAgbGVnZW5kUG9zaXRpb246IHN0cmluZyxcbiAgICBmb3JtYXQ6IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCBmaWxlTmFtZVdpdGhFeHQgPSAnbWFwLicgKyBmb3JtYXQ7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgLy8gR2V0IGh0bWwgY29kZSBmb3IgdGhlIGxlZ2VuZFxuICAgIGNvbnN0IGh0bWwgPSBhd2FpdCB0aGlzLmdldExheWVyc0xlZ2VuZEh0bWwoXG4gICAgICBtYXAsXG4gICAgICBjYW52YXMud2lkdGgsXG4gICAgICByZXNvbHV0aW9uXG4gICAgKS50b1Byb21pc2UoKTtcbiAgICAvLyBJZiBubyBsZWdlbmQsIHNhdmUgdGhlIG1hcCBkaXJlY3RseVxuICAgIGlmIChodG1sID09PSAnJykge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlQ2FudmFzSW1hZ2VBc0ZpbGUoY2FudmFzLCBmaWxlTmFtZVdpdGhFeHQsIGZvcm1hdCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gQ3JlYXRlIGRpdiB0byBjb250YWluIGh0bWwgY29kZSBmb3IgbGVnZW5kXG4gICAgY29uc3QgZGl2ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgZGl2LnN0eWxlLnRvcCA9ICcwJztcbiAgICBkaXYuc3R5bGUuekluZGV4ID0gJy0xJztcbiAgICAvLyBBZGQgaHRtbCBjb2RlIHRvIGNvbnZlcnQgaW4gdGhlIG5ldyB3aW5kb3dcbiAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO1xuICAgIGRpdi5pbm5lckhUTUwgPSBodG1sO1xuICAgIGF3YWl0IHRoaXMudGltZW91dCgxKTtcbiAgICBjb25zdCBjYW52YXNMZWdlbmQgPSBhd2FpdCBodG1sMmNhbnZhcyhkaXYsIHsgdXNlQ09SUzogdHJ1ZSB9KS5jYXRjaChcbiAgICAgIChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBpZiAoY2FudmFzTGVnZW5kKSB7XG4gICAgICBjb25zdCBjYW52YXNIZWlnaHQgPSBjYW52YXMuaGVpZ2h0O1xuICAgICAgY29uc3QgY2FudmFzV2lkdGggPSBjYW52YXMud2lkdGg7XG4gICAgICBjb25zdCBsZWdlbmRIZWlnaHQgPSBjYW52YXNMZWdlbmQuaGVpZ2h0O1xuICAgICAgY29uc3QgbGVnZW5kV2lkdGggPSBjYW52YXNMZWdlbmQud2lkdGg7XG4gICAgICAvLyBNb3ZlIHRoZSBsZWdlbmQgdG8gdGhlIGNvcnJlY3QgcG9zaXRpb24gb24gdGhlIHBhZ2VcbiAgICAgIGNvbnN0IG9mZnNldCA9IGNhbnZhc0hlaWdodCAqIDAuMDE7XG4gICAgICBsZXQgbGVnZW5kWDogbnVtYmVyO1xuICAgICAgbGV0IGxlZ2VuZFk6IG51bWJlcjtcblxuICAgICAgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAnYm90dG9tcmlnaHQnKSB7XG4gICAgICAgIGxlZ2VuZFggPSBjYW52YXNXaWR0aCAtIGxlZ2VuZFdpZHRoIC0gb2Zmc2V0O1xuICAgICAgICBsZWdlbmRZID0gY2FudmFzSGVpZ2h0IC0gbGVnZW5kSGVpZ2h0IC0gb2Zmc2V0O1xuICAgICAgfSBlbHNlIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gJ3RvcHJpZ2h0Jykge1xuICAgICAgICBsZWdlbmRYID0gY2FudmFzV2lkdGggLSBsZWdlbmRXaWR0aCAtIG9mZnNldDtcbiAgICAgICAgbGVnZW5kWSA9IG9mZnNldDtcbiAgICAgIH0gZWxzZSBpZiAobGVnZW5kUG9zaXRpb24gPT09ICdib3R0b21sZWZ0Jykge1xuICAgICAgICBsZWdlbmRYID0gb2Zmc2V0O1xuICAgICAgICBsZWdlbmRZID0gY2FudmFzSGVpZ2h0IC0gbGVnZW5kSGVpZ2h0IC0gb2Zmc2V0IC0gMTU7XG4gICAgICB9IGVsc2UgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAndG9wbGVmdCcpIHtcbiAgICAgICAgbGVnZW5kWCA9IG9mZnNldDtcbiAgICAgICAgbGVnZW5kWSA9IG9mZnNldDtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5kcmF3SW1hZ2UoXG4gICAgICAgIGNhbnZhc0xlZ2VuZCxcbiAgICAgICAgbGVnZW5kWCxcbiAgICAgICAgbGVnZW5kWSxcbiAgICAgICAgbGVnZW5kV2lkdGgsXG4gICAgICAgIGxlZ2VuZEhlaWdodFxuICAgICAgKTtcbiAgICAgIGNvbnRleHQuc3Ryb2tlUmVjdChsZWdlbmRYLCBsZWdlbmRZLCBsZWdlbmRXaWR0aCwgbGVnZW5kSGVpZ2h0KTtcbiAgICAgIHRoaXMucmVtb3ZlSHRtbEVsZW1lbnQoZGl2KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyTWFwKG1hcCwgc2l6ZSwgZXh0ZW50KSB7XG4gICAgbWFwLm9sLnVwZGF0ZVNpemUoKTtcbiAgICBtYXAub2wucmVuZGVyU3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgZG9jdW1lbnRcbiAgICogQHBhcmFtICBkb2MgLSBEb2N1bWVudCB0byBzYXZlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZURvYyhkb2M6IGpzUERGKSB7XG4gICAgYXdhaXQgZG9jLnNhdmUoJ21hcF9nZW9yZWYucGRmJywgeyByZXR1cm5Qcm9taXNlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgYmVzdCBJbWFnZSBzaXplIHRvIGZpdCBpbiBwZGZcbiAgICogQHBhcmFtIGRvYyAtIFBkZiBEb2N1bWVudFxuICAgKiBAcGFyYW0gY2FudmFzIC0gQ2FudmFzIG9mIGltYWdlXG4gICAqIEBwYXJhbSBtYXJnaW5zIC0gUGFnZSBtYXJnaW5zXG4gICAqL1xuICBnZXRJbWFnZVNpemVUb0ZpdFBkZihkb2MsIGNhbnZhcywgbWFyZ2lucykge1xuICAgIC8vIERlZmluZSB2YXJpYWJsZSB0byBjYWxjdWxhdGUgYmVzdCBzaXplIHRvIGZpdCBpbiBvbmUgcGFnZVxuICAgIGNvbnN0IHBhZ2VIZWlnaHQgPVxuICAgICAgZG9jLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpIC0gKG1hcmdpbnNbMF0gKyBtYXJnaW5zWzJdKTtcbiAgICBjb25zdCBwYWdlV2lkdGggPVxuICAgICAgZG9jLmludGVybmFsLnBhZ2VTaXplLmdldFdpZHRoKCkgLSAobWFyZ2luc1sxXSArIG1hcmdpbnNbM10pO1xuICAgIGNvbnN0IGNhbkhlaWdodCA9IHRoaXMucGRmX3VuaXRzMnBvaW50cyhjYW52YXMuaGVpZ2h0LCAnbW0nKTtcbiAgICBjb25zdCBjYW5XaWR0aCA9IHRoaXMucGRmX3VuaXRzMnBvaW50cyhjYW52YXMud2lkdGgsICdtbScpO1xuXG4gICAgY29uc3QgaGVpZ2h0UmF0aW8gPSBjYW5IZWlnaHQgLyBwYWdlSGVpZ2h0O1xuICAgIGNvbnN0IHdpZHRoUmF0aW8gPSBjYW5XaWR0aCAvIHBhZ2VXaWR0aDtcbiAgICBjb25zdCBtYXhSYXRpbyA9IGhlaWdodFJhdGlvID4gd2lkdGhSYXRpbyA/IGhlaWdodFJhdGlvIDogd2lkdGhSYXRpbztcbiAgICBjb25zdCBpbWdIZWlnaCA9IG1heFJhdGlvID4gMSA/IGNhbkhlaWdodCAvIG1heFJhdGlvIDogY2FuSGVpZ2h0O1xuICAgIGNvbnN0IGltZ1dpZHRoID0gbWF4UmF0aW8gPiAxID8gY2FuV2lkdGggLyBtYXhSYXRpbyA6IGNhbldpZHRoO1xuICAgIHJldHVybiBbaW1nV2lkdGgsIGltZ0hlaWdoXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB3b3JsZCBmaWxlIGluZm9ybWF0aW9uIGZvciB0aWZmXG4gICAqIEBwYXJhbSAgbWFwIC0gTWFwIG9mIHRoZSBhcHBcbiAgICovXG4gIHByaXZhdGUgZ2V0V29ybGRGaWxlSW5mb3JtYXRpb24obWFwKSB7XG4gICAgY29uc3QgY3VycmVudFJlc29sdXRpb24gPSBtYXAudmlld0NvbnRyb2xsZXIuZ2V0UmVzb2x1dGlvbigpO1xuICAgIGNvbnN0IGN1cnJlbnRFeHRlbnQgPSBtYXAudmlld0NvbnRyb2xsZXIuZ2V0RXh0ZW50KCk7IC8vIFJldHVybiBbbWlueCwgbWlueSwgbWF4eCwgbWF4eV1cbiAgICByZXR1cm4gW1xuICAgICAgY3VycmVudFJlc29sdXRpb24sXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC1jdXJyZW50UmVzb2x1dGlvbixcbiAgICAgIGN1cnJlbnRFeHRlbnRbMF0gKyBjdXJyZW50UmVzb2x1dGlvbiAvIDAuNSxcbiAgICAgIGN1cnJlbnRFeHRlbnRbM10gLSBjdXJyZW50UmVzb2x1dGlvbiAvIDAuNVxuICAgIF0uam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBjYW52YXMgaW1hZ2UgYXMgZmlsZVxuICAgKiBAcGFyYW0gY2FudmFzIC0gQ2FudmFzIHRvIHNhdmVcbiAgICogQHBhcmFtIG5hbWUgLSBOYW1lIG9mIHRoZSBmaWxlXG4gICAqIEBwYXJhbSBmb3JtYXQgLSBmaWxlIGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSBzYXZlQ2FudmFzSW1hZ2VBc0ZpbGUoY2FudmFzLCBuYW1lV2l0aEV4dCwgZm9ybWF0KSB7XG4gICAgY29uc3QgYmxvYkZvcm1hdCA9ICdpbWFnZS8nICsgZm9ybWF0O1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNhbnZhcy50b0RhdGFVUkwoKTsgLy8gSnVzdCB0byBtYWtlIHRoZSBjYXRjaCB0cmlnZ2VyIHdpaHRvdXQgdG9CbG9iIEVycm9yIHRocm93IG5vdCBjYXRjaGVkXG4gICAgICBjYW52YXMudG9CbG9iKChibG9iKSA9PiB7XG4gICAgICAgIC8vIGRvd25sb2FkIGltYWdlXG4gICAgICAgIHNhdmVBcyhibG9iLCBuYW1lV2l0aEV4dCk7XG4gICAgICAgIHRoYXQuc2F2ZUZpbGVQcm9jZXNzaW5nKCk7XG4gICAgICB9LCBibG9iRm9ybWF0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoXG4gICAgICAgICdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlQm9keScsXG4gICAgICAgICdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlSGVhZGVyJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGZpbGUgdG8gYSB6aXBcbiAgICogQHBhcmFtIGNhbnZhcyAtIEZpbGUgdG8gYWRkIHRvIHRoZSB6aXBcbiAgICogQHBhcmFtICBuYW1lIC1OYW1lIG9mIHRoZSBmaWxlb3ZlcnZpZXdcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVDYW52YUZpbGVUb1ppcChjYW52YXMsIG5hbWUpIHtcbiAgICBjb25zdCBibG9iRm9ybWF0ID0gJ2ltYWdlLycgKyAnanBlZyc7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaGFzT3duUHJvcGVydHkoJ3ppcEZpbGUnKSB8fFxuICAgICAgdHlwZW9mIHRoaXMuemlwRmlsZSA9PT0gJ3VuZGVmaW5lZCdcbiAgICApIHtcbiAgICAgIHRoaXMuemlwRmlsZSA9IG5ldyBKU1ppcCgpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjYW52YXMudG9EYXRhVVJMKCk7IC8vIEp1c3QgdG8gbWFrZSB0aGUgY2F0Y2ggdHJpZ2dlciB3aWh0b3V0IHRvQmxvYiBFcnJvciB0aHJvdyBub3QgY2F0Y2hlZFxuICAgICAgaWYgKG5hdmlnYXRvci5tc1NhdmVCbG9iKSB7XG4gICAgICAgIHRoaXMuYWRkRmlsZVRvWmlwKG5hbWUsIGNhbnZhcy5tc1RvQmxvYigpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbnZhcy50b0Jsb2IoKGJsb2IpID0+IHtcbiAgICAgICAgICB0aGF0LmFkZEZpbGVUb1ppcChuYW1lLCBibG9iKTtcbiAgICAgICAgfSwgYmxvYkZvcm1hdCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmVycm9yKFxuICAgICAgICAnaWdvLmdlby5wcmludEZvcm0uY29yc0Vycm9yTWVzc2FnZUJvZHknLFxuICAgICAgICAnaWdvLmdlby5wcmludEZvcm0uY29yc0Vycm9yTWVzc2FnZUhlYWRlcidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBmaWxlIHRvIHppcCwgaWYgYWxsIGZpbGUgYXJlIHppcHBlZCwgZG93bmxvYWRcbiAgICogQHBhcmFtIG5hbWUgLSBOYW1lIG9mIHRoZSBmaWxlc1xuICAgKiBAcGFyYW0gYmxvYiAtIENvbnRhaW4gb2YgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhZGRGaWxlVG9aaXAobmFtZSwgYmxvYikge1xuICAgIC8vIGFkZCBmaWxlIHRvIHppcFxuICAgIHRoaXMuemlwRmlsZS5maWxlKG5hbWUsIGJsb2IpO1xuICAgIHRoaXMubmJGaWxlVG9Qcm9jZXNzLS07XG5cbiAgICAvLyBJZiBhbGwgZmlsZXMgYXJlIHByb2NjZXNzZWRcbiAgICBpZiAodGhpcy5uYkZpbGVUb1Byb2Nlc3MgPT09IDApIHtcbiAgICAgIC8vIERvd25sb2FkIHppcCBmaWxlXG4gICAgICB0aGlzLmdldFppcEZpbGUoKTtcbiAgICAgIC8vIFN0b3AgbG9hZGluZ1xuICAgICAgdGhpcy5hY3Rpdml0eVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLmFjdGl2aXR5SWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2F2ZUZpbGVQcm9jZXNzaW5nKCkge1xuICAgIHRoaXMubmJGaWxlVG9Qcm9jZXNzLS07XG5cbiAgICAvLyBJZiBhbGwgZmlsZXMgYXJlIHByb2NjZXNzZWRcbiAgICBpZiAodGhpcy5uYkZpbGVUb1Byb2Nlc3MgPT09IDApIHtcbiAgICAgIC8vIFN0b3AgbG9hZGluZ1xuICAgICAgdGhpcy5hY3Rpdml0eVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLmFjdGl2aXR5SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHppcHBlZCBmaWxlXG4gICAqIEByZXR1cm4gUmV0dW4gYSB6aXAgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRaaXBGaWxlKCkge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgIHRoaXMuemlwRmlsZS5nZW5lcmF0ZUFzeW5jKHsgdHlwZTogJ2Jsb2InIH0pLnRoZW4oKGJsb2IpID0+IHtcbiAgICAgIC8vIDEpIGdlbmVyYXRlIHRoZSB6aXAgZmlsZVxuICAgICAgc2F2ZUFzKGJsb2IsICdtYXAuemlwJyk7XG4gICAgICBkZWxldGUgdGhhdC56aXBGaWxlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBwZGZfdW5pdHMycG9pbnRzKG4sIHVuaXQpOiBudW1iZXIge1xuICAgIGxldCBrID0gMTtcblxuICAgIC8vIHRoaXMgY29kZSBpcyBib3Jyb3dlZCBmcm9tIGpzUERGXG4gICAgLy8gIGFzIGl0IGRvZXMgbm90IGV4cG9zZSBhIHB1YmxpYyBBUElcbiAgICAvLyAgZm9yIGNvbnZlcnRpbmcgdW5pdHMgdG8gcG9pbnRzLlxuICAgIHN3aXRjaCAodW5pdCkge1xuICAgICAgY2FzZSAncHQnOlxuICAgICAgICBrID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtbSc6XG4gICAgICAgIGsgPSA3MiAvIDI1LjQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY20nOlxuICAgICAgICBrID0gNzIgLyAyLjU0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2luJzpcbiAgICAgICAgayA9IDcyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3B4JzpcbiAgICAgICAgayA9IDk2IC8gNzI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncGMnOlxuICAgICAgICBrID0gMTI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZW0nOlxuICAgICAgICBrID0gMTI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXgnOlxuICAgICAgICBrID0gNjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdW5pdDogJyArIHVuaXQpO1xuICAgIH1cblxuICAgIHJldHVybiBuICogaztcbiAgfVxufVxuIl19
|
|
1144
|
+
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.MessageService }, { type: i3.ActivityService }, { type: i4.LanguageService }, { type: i5.ConfigService }, { type: Document, decorators: [{
|
|
1145
|
+
type: Inject,
|
|
1146
|
+
args: [DOCUMENT]
|
|
1147
|
+
}] }] });
|
|
1148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL3ByaW50L3NoYXJlZC9wcmludC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTVDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxXQUFXLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsT0FBTyxJQUFJLEtBQUssRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLEdBQUcsSUFBSSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc5QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJB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QUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFVixtQ0FBbUM7UUFDbkMsc0NBQXNDO1FBQ3RDLG1DQUFtQztRQUNuQyxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2IsS0FBSyxJQUFJO2dCQUNQLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ04sTUFBTTtZQUNSLEtBQUssSUFBSTtnQkFDUCxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztnQkFDZCxNQUFNO1lBQ1IsS0FBSyxJQUFJO2dCQUNQLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO2dCQUNkLE1BQU07WUFDUixLQUFLLElBQUk7Z0JBQ1AsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDUCxNQUFNO1lBQ1IsS0FBSyxJQUFJO2dCQUNQLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUNaLE1BQU07WUFDUixLQUFLLElBQUk7Z0JBQ1AsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDUCxNQUFNO1lBQ1IsS0FBSyxJQUFJO2dCQUNQLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ1AsTUFBTTtZQUNSLEtBQUssSUFBSTtnQkFDUCxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNOLE1BQU07WUFDUjtnQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZixDQUFDO3VHQTUvQ1UsWUFBWSxxS0F1QmIsUUFBUTsyR0F2QlAsWUFBWSxjQUZYLE1BQU07OzJGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkF3QkksTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTZWN1cmVJbWFnZVBpcGUgfSBmcm9tICdAaWdvMi9jb21tb24vaW1hZ2UnO1xuaW1wb3J0IHsgQWN0aXZpdHlTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9hY3Rpdml0eSc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9jb25maWcnO1xuaW1wb3J0IHsgTGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9sYW5ndWFnZSc7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUvbWVzc2FnZSc7XG5pbXBvcnQgeyBTdWJqZWN0U3RhdHVzIH0gZnJvbSAnQGlnbzIvdXRpbHMnO1xuXG5pbXBvcnQgeyBzYXZlQXMgfSBmcm9tICdmaWxlLXNhdmVyJztcbmltcG9ydCBodG1sMmNhbnZhcyBmcm9tICdodG1sMmNhbnZhcyc7XG5pbXBvcnQganNQREYgZnJvbSAnanNwZGYnO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBKU1ppcCB9IGZyb20gJ2pzemlwJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIGZvcmtKb2luIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgYXMgcnhNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IExlZ2VuZE1hcFZpZXdPcHRpb25zIH0gZnJvbSAnLi4vLi4vbGF5ZXIvc2hhcmVkL2xheWVycy9sZWdlbmQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGdldExheWVyc0xlZ2VuZHMgfSBmcm9tICcuLi8uLi9sYXllci91dGlscy9vdXRwdXRMZWdlbmQnO1xuaW1wb3J0IHsgSWdvTWFwIH0gZnJvbSAnLi4vLi4vbWFwL3NoYXJlZC9tYXAnO1xuaW1wb3J0IHsgZm9ybWF0U2NhbGUgfSBmcm9tICcuLi8uLi9tYXAvc2hhcmVkL21hcC51dGlscyc7XG5pbXBvcnQgR2VvUGRmUGx1Z2luIGZyb20gJy4vZ2VvcGRmJztcbmltcG9ydCB7IFByaW50T3B0aW9ucywgVGV4dFBkZlNpemVBbmRNYXJnaW4gfSBmcm9tICcuL3ByaW50LmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBQcmludExlZ2VuZFBvc2l0aW9uLFxuICBQcmludFBhcGVyRm9ybWF0LFxuICBQcmludFJlc29sdXRpb25cbn0gZnJvbSAnLi9wcmludC50eXBlJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgTmF2aWdhdG9yIHtcbiAgICBtc1NhdmVCbG9iPzogKGJsb2I6IGFueSwgZGVmYXVsdE5hbWU/OiBzdHJpbmcpID0+IGJvb2xlYW47XG4gIH1cbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUHJpbnRTZXJ2aWNlIHtcbiAgemlwRmlsZTogSlNaaXA7XG4gIG5iRmlsZVRvUHJvY2VzczogbnVtYmVyO1xuICBhY3Rpdml0eUlkOiBzdHJpbmc7XG4gIG1hcFByaW50RXh0ZW50OiBBcnJheTxudW1iZXI+O1xuICBpbWdTaXplQWRkZWQ6IEFycmF5PG51bWJlcj47XG5cbiAgVEVYVFBERkZPTlQgPSB7XG4gICAgdGl0bGVGb250OiAndGltZXMnLFxuICAgIHRpdGxlRm9udFN0eWxlOiAnYm9sZCcsXG4gICAgc3VidGl0bGVGb250OiAndGltZXMnLFxuICAgIHN1YnRpdGxlRm9udFN0eWxlOiAnYm9sZCcsXG4gICAgY29tbWVudEZvbnQ6ICd0aW1lcycsXG4gICAgY29tbWVudEZvbnRTdHlsZTogJ25vcm1hbCcsXG4gICAgY29tbWVudEZvbnRTaXplOiAxMlxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGl2aXR5U2VydmljZTogQWN0aXZpdHlTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50XG4gICkge31cblxuICBwcmludChtYXA6IElnb01hcCwgb3B0aW9uczogUHJpbnRPcHRpb25zKTogU3ViamVjdDxhbnk+IHtcbiAgICBjb25zdCBzdGF0dXMkID0gbmV3IFN1YmplY3QoKTtcbiAgICBjb25zdCBwYXBlckZvcm1hdDogc3RyaW5nID0gb3B0aW9ucy5wYXBlckZvcm1hdDtcbiAgICBjb25zdCByZXNvbHV0aW9uID0gK29wdGlvbnMucmVzb2x1dGlvbjsgLy8gRGVmYXVsdCBpcyA5NlxuICAgIGNvbnN0IG9yaWVudGF0aW9uID0gb3B0aW9ucy5vcmllbnRhdGlvbjtcbiAgICBjb25zdCBsZWdlbmRQb3N0aW9uID0gb3B0aW9ucy5sZWdlbmRQb3NpdGlvbjtcbiAgICB0aGlzLmFjdGl2aXR5SWQgPSB0aGlzLmFjdGl2aXR5U2VydmljZS5yZWdpc3RlcigpO1xuXG4gICAgR2VvUGRmUGx1Z2luKGpzUERGLkFQSSk7XG5cbiAgICBjb25zdCBkb2MgPSBuZXcganNQREYoe1xuICAgICAgb3JpZW50YXRpb24sXG4gICAgICBmb3JtYXQ6IHBhcGVyRm9ybWF0LnRvTG93ZXJDYXNlKCksXG4gICAgICB1bml0OiAnbW0nIC8vIGRlZmF1bHRcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgd2lkdGg6IHBhZ2VXaWR0aCwgaGVpZ2h0OiBwYWdlSGVpZ2h0IH0gPSBkb2MuaW50ZXJuYWwucGFnZVNpemU7XG5cbiAgICAvKiogdG9wIHwgcmlnaHQgfCBib3R0b20gfCBsZWZ0ICovXG4gICAgY29uc3QgYmFzZU1hcmdpbnM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEwLCAxMCwgMTAsIDEwXTtcblxuICAgIGxldCB0aXRsZVNpemVzOiBUZXh0UGRmU2l6ZUFuZE1hcmdpbjtcbiAgICBsZXQgc3VidGl0bGVTaXplczogVGV4dFBkZlNpemVBbmRNYXJnaW47XG5cbiAgICAvLyBpZiBwYXBlciBmb3JtYXQgQTEgb3IgQTAgYWRkIG1hcmdpbiB0b3BcbiAgICBpZiAoXG4gICAgICAob3B0aW9ucy50aXRsZSAhPT0gJycgfHwgb3B0aW9ucy5zdWJ0aXRsZSAhPT0gJycpICYmXG4gICAgICAocGFwZXJGb3JtYXQgPT09IFByaW50UGFwZXJGb3JtYXQuQTEgfHxcbiAgICAgICAgcGFwZXJGb3JtYXQgPT09IFByaW50UGFwZXJGb3JtYXQuQTApXG4gICAgKSB7XG4gICAgICBiYXNlTWFyZ2luc1swXSArPSAxMDtcbiAgICB9XG4gICAgLy8gUERGIHRpdGxlXG4gICAgY29uc3QgZm9udFNpemVJblB0ID0gTWF0aC5yb3VuZCgyICogKHBhZ2VIZWlnaHQgKyAxNDUpICogMC4wNSkgLyAyOyAvL2NhbGN1bGF0ZSB0aGUgZm9udFNpemUgdGl0bGUgZnJvbSB0aGUgcGFnZSBoZWlnaHQuXG4gICAgaWYgKG9wdGlvbnMudGl0bGUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnRpdGxlICE9PSAnJykge1xuICAgICAgdGl0bGVTaXplcyA9IHRoaXMuZ2V0VGV4dFBkZk9iamVjdFNpemVBbmRNYXJnKFxuICAgICAgICBvcHRpb25zLnRpdGxlLFxuICAgICAgICBiYXNlTWFyZ2lucyxcbiAgICAgICAgdGhpcy5URVhUUERGRk9OVC50aXRsZUZvbnQsXG4gICAgICAgIGZvbnRTaXplSW5QdCxcbiAgICAgICAgdGhpcy5URVhUUERGRk9OVC50aXRsZUZvbnRTdHlsZSxcbiAgICAgICAgZG9jXG4gICAgICApO1xuXG4gICAgICB0aGlzLmFkZFRleHRJblBkZkRvYyhcbiAgICAgICAgZG9jLFxuICAgICAgICBvcHRpb25zLnRpdGxlLFxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnRpdGxlRm9udCxcbiAgICAgICAgdGhpcy5URVhUUERGRk9OVC50aXRsZUZvbnRTdHlsZSxcbiAgICAgICAgdGl0bGVTaXplcy5mb250U2l6ZSxcbiAgICAgICAgdGl0bGVTaXplcy5tYXJnaW5MZWZ0ICsgYmFzZU1hcmdpbnNbM10sXG4gICAgICAgIGJhc2VNYXJnaW5zWzBdXG4gICAgICApO1xuXG4gICAgICBiYXNlTWFyZ2luc1swXSA9IHRpdGxlU2l6ZXMuaGVpZ2h0ICsgYmFzZU1hcmdpbnNbMF07IC8vIGN1bXVsYXRpdmUgbWFyZ2luIHRvcCBmb3IgbmV4dCBlbGVtIHRvIHBsYWNlIGluIHBkZiBkb2NcbiAgICB9XG5cbiAgICAvLyBQREYgc3VidGl0bGVcbiAgICBpZiAob3B0aW9ucy5zdWJ0aXRsZSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuc3VidGl0bGUgIT09ICcnKSB7XG4gICAgICBzdWJ0aXRsZVNpemVzID0gdGhpcy5nZXRUZXh0UGRmT2JqZWN0U2l6ZUFuZE1hcmcoXG4gICAgICAgIG9wdGlvbnMuc3VidGl0bGUsXG4gICAgICAgIGJhc2VNYXJnaW5zLFxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnN1YnRpdGxlRm9udCxcbiAgICAgICAgb3B0aW9ucy50aXRsZSAhPT0gJycgPyB0aXRsZVNpemVzLmZvbnRTaXplICogMC43IDogZm9udFNpemVJblB0ICogMC43LCAvLyA3MCUgc2l6ZSBvZiB0aXRsZVxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnN1YnRpdGxlRm9udFN0eWxlLFxuICAgICAgICBkb2NcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuYWRkVGV4dEluUGRmRG9jKFxuICAgICAgICBkb2MsXG4gICAgICAgIG9wdGlvbnMuc3VidGl0bGUsXG4gICAgICAgIHRoaXMuVEVYVFBERkZPTlQuc3VidGl0bGVGb250LFxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnN1YnRpdGxlRm9udFN0eWxlLFxuICAgICAgICBzdWJ0aXRsZVNpemVzLmZvbnRTaXplLFxuICAgICAgICBzdWJ0aXRsZVNpemVzLm1hcmdpbkxlZnQgKyBiYXNlTWFyZ2luc1szXSxcbiAgICAgICAgYmFzZU1hcmdpbnNbMF1cbiAgICAgICk7XG5cbiAgICAgIGJhc2VNYXJnaW5zWzBdICs9IDU7IC8vIGN1bXVsYXRpdmUgbWFyZyB0b3AgZm9yIG5leHQgZWxlbSB0byBwbGFjZSBpbiBwZGYgZG9jLiA1IGlzIGEgZml4IGl0IGNvdWxkIGJlIGFkanVzdFxuICAgIH1cblxuICAgIGNvbnN0IHZlcnRpY2FsU3BhY2luZzogbnVtYmVyID0gNTtcbiAgICBpZiAob3B0aW9ucy5jb21tZW50ICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5jb21tZW50ICE9PSAnJykge1xuICAgICAgdGhpcy5hZGRDb21tZW50KGRvYywgb3B0aW9ucy5jb21tZW50LCBiYXNlTWFyZ2lucywgdmVydGljYWxTcGFjaW5nKTtcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZUZvb3RlcihcbiAgICAgIG1hcCxcbiAgICAgIGRvYyxcbiAgICAgIG9wdGlvbnMsXG4gICAgICByZXNvbHV0aW9uLFxuICAgICAgdmVydGljYWxTcGFjaW5nLFxuICAgICAgYmFzZU1hcmdpbnNcbiAgICApO1xuXG4gICAgY29uc3Qgd2lkdGggPSBwYWdlV2lkdGggLSBiYXNlTWFyZ2luc1szXSAtIGJhc2VNYXJnaW5zWzFdO1xuICAgIGNvbnN0IGhlaWdodCA9IHBhZ2VIZWlnaHQgLSBiYXNlTWFyZ2luc1swXSAtIGJhc2VNYXJnaW5zWzJdO1xuICAgIGNvbnN0IHNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbd2lkdGgsIGhlaWdodF07XG5cbiAgICB0aGlzLmFkZE1hcChcbiAgICAgIGRvYyxcbiAgICAgIG1hcCxcbiAgICAgIHJlc29sdXRpb24sXG4gICAgICBzaXplLFxuICAgICAgYmFzZU1hcmdpbnMsXG4gICAgICBsZWdlbmRQb3N0aW9uXG4gICAgKS5zdWJzY3JpYmUoYXN5bmMgKHN0YXR1czogU3ViamVjdFN0YXR1cykgPT4ge1xuICAgICAgaWYgKHN0YXR1cyA9PT0gU3ViamVjdFN0YXR1cy5Eb25lKSB7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5pbWdTaXplQWRkZWRbMF07XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaW1nU2l6ZUFkZGVkWzFdO1xuICAgICAgICB0aGlzLmFkZEdlb1JlZihkb2MsIG1hcCwgd2lkdGgsIGhlaWdodCwgYmFzZU1hcmdpbnMpO1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZU1lYXN1cmVMYXllcihkb2MsIG1hcCwgYmFzZU1hcmdpbnMpO1xuICAgICAgICBpZiAob3B0aW9ucy5zaG93Tm9ydGhBcnJvdykge1xuICAgICAgICAgIGNvbnN0IG5vcnRoQXJyb3dDYW52YXMgPSBhd2FpdCB0aGlzLmNyZWF0ZU5vcnRoRGlyZWN0aW9uQXJyb3coXG4gICAgICAgICAgICBtYXAudmlld0NvbnRyb2xsZXIuZ2V0Um90YXRpb24oKVxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGROb3J0aEFycm93SW5Eb2MoXG4gICAgICAgICAgICBkb2MsXG4gICAgICAgICAgICBub3J0aEFycm93Q2FudmFzLFxuICAgICAgICAgICAgYmFzZU1hcmdpbnMsXG4gICAgICAgICAgICBsZWdlbmRQb3N0aW9uLFxuICAgICAgICAgICAgd2lkdGhcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubGVnZW5kUG9zaXRpb24gIT09ICdub25lJykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIFsndG9wbGVmdCcsICd0b3ByaWdodCcsICdib3R0b21sZWZ0JywgJ2JvdHRvbXJpZ2h0J10uaW5kZXhPZihcbiAgICAgICAgICAgICAgb3B0aW9ucy5sZWdlbmRQb3NpdGlvblxuICAgICAgICAgICAgKSA+IC0xXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkZExlZ2VuZFNhbWVQYWdlKFxuICAgICAgICAgICAgICBkb2MsXG4gICAgICAgICAgICAgIG1hcCxcbiAgICAgICAgICAgICAgYmFzZU1hcmdpbnMsXG4gICAgICAgICAgICAgIHJlc29sdXRpb24sXG4gICAgICAgICAgICAgIG9wdGlvbnMubGVnZW5kUG9zaXRpb25cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmxlZ2VuZFBvc2l0aW9uID09PSAnbmV3cGFnZScpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkTGVnZW5kKGRvYywgbWFwLCBiYXNlTWFyZ2lucywgcmVzb2x1dGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZURvYyhkb2MpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0dXMgPT09IFN1YmplY3RTdGF0dXMuRG9uZSB8fCBzdGF0dXMgPT09IFN1YmplY3RTdGF0dXMuRXJyb3IpIHtcbiAgICAgICAgdGhpcy5hY3Rpdml0eVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLmFjdGl2aXR5SWQpO1xuICAgICAgICBzdGF0dXMkLm5leHQoU3ViamVjdFN0YXR1cy5Eb25lKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBzdGF0dXMkO1xuICB9XG4gIC8vIHJlZiBHZW9Nb29zZSBodHRwczovL2dpdGh1Yi5jb20vZ2VvbW9vc2UvZ20zL3RyZWUvbWFpbi9zcmMvZ20zL2NvbXBvbmVudHMvcHJpbnRcbiAgYWRkR2VvUmVmKFxuICAgIGRvYyxcbiAgICBtYXA6IElnb01hcCxcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICAgIGJhc2VNYXJnaW5zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXVxuICApIHtcbiAgICBjb25zdCB1bml0ID0gJ21tJztcbiAgICBjb25zdCBkb2NIZWlnaHQgPSBkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCk7XG5cbiAgICAvLyB4LHkgPSBtYXJnaW4gbGVmdC1ib3R0b20gY29ybmVyIGZvciBpbWcgaW4gcGRmIGRvY1xuICAgIGNvbnN0IHggPSBiYXNlTWFyZ2luc1szXTtcbiAgICBjb25zdCB5ID0gZG9jSGVpZ2h0IC0gYmFzZU1hcmdpbnNbMF0gLSBoZWlnaHQ7XG5cbiAgICBsZXQgcGRmX2V4dGVudHMgPSBbeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0XTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBkZl9leHRlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwZGZfZXh0ZW50c1tpXSA9IHRoaXMucGRmX3VuaXRzMnBvaW50cyhwZGZfZXh0ZW50c1tpXSwgdW5pdCk7XG4gICAgfVxuICAgIGRvYy5zZXRHZW9BcmVhKHBkZl9leHRlbnRzLCB0aGlzLm1hcFByaW50RXh0ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgbWVhc3VyZSBvdmVybGF5IG9uIHRoZSBtYXAgb24gdGhlIGRvY3VtZW50IHdoZW4gdGhlIG1lYXN1cmUgbGF5ZXIgaXMgcHJlc2VudFxuICAgKiBAcGFyYW0gIGRvYyAtIFBkZiBkb2N1bWVudCB3aGVyZSBtZWFzdXJlIHRvb2x0aXAgd2lsbCBiZSBhZGRlZFxuICAgKiBAcGFyYW0gIG1hcCAtIE1hcCBvZiB0aGUgYXBwXG4gICAqIEBwYXJhbSAgYmFzZU1hcmdpbnMgLSBQYWdlIG1hcmdpbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlTWVhc3VyZUxheWVyKFxuICAgIGRvYzoganNQREYsXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgYmFzZU1hcmdpbnM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdXG4gICkge1xuICAgIGlmIChcbiAgICAgIG1hcC5sYXllcnMuZmluZChcbiAgICAgICAgKGxheWVyKSA9PiBsYXllci52aXNpYmxlICYmIGxheWVyLmlkLnN0YXJ0c1dpdGgoJ2lnby1tZWFzdXJlcy0nKVxuICAgICAgKVxuICAgICkge1xuICAgICAgbGV0IGNhbnZhc092ZXJsYXlIVE1MTWVhc3VyZXM7XG4gICAgICBjb25zdCBtYXBPdmVybGF5TWVhc3VyZXNIVE1MID0gbWFwLm9sLmdldE92ZXJsYXlDb250YWluZXIoKTtcbiAgICAgIGF3YWl0IGh0bWwyY2FudmFzKG1hcE92ZXJsYXlNZWFzdXJlc0hUTUwsIHtcbiAgICAgICAgc2NhbGU6IDEsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogbnVsbFxuICAgICAgfSkudGhlbigoZSkgPT4ge1xuICAgICAgICBjYW52YXNPdmVybGF5SFRNTE1lYXN1cmVzID0gZTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hZGRDYW52YXMoZG9jLCBjYW52YXNPdmVybGF5SFRNTE1lYXN1cmVzLCBiYXNlTWFyZ2lucyk7IC8vIHRoaXMgYWRkcyBtZWFzdXJlIG92ZXJsYXlzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBodG1sIGNvZGUgZm9yIGFsbCBsYXllcnMgbGVnZW5kXG4gICAqIEBwYXJhbSAgbWFwIElnb01hcFxuICAgKiBAcGFyYW0gIHdpZHRoIFRoZSB3aWR0aCB0aGF0IHRoZSBsZWdlbmQgbmVlZCB0byBiZVxuICAgKiBAcmV0dXJuIEh0bWwgY29kZSBmb3IgdGhlIGxlZ2VuZFxuICAgKi9cbiAgZ2V0TGF5ZXJzTGVnZW5kSHRtbChcbiAgICBtYXA6IElnb01hcCxcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIHJlc29sdXRpb246IG51bWJlclxuICApOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+IHtcbiAgICAgIGxldCBodG1sID0gJyc7XG4gICAgICBjb25zdCBsZWdlbmRzID0gZ2V0TGF5ZXJzTGVnZW5kcyhtYXAubGF5ZXJzLCB7XG4gICAgICAgIHJlc29sdXRpb246IG1hcC52aWV3Q29udHJvbGxlci5nZXRSZXNvbHV0aW9uKCksXG4gICAgICAgIGV4dGVudDogbWFwLnZpZXdDb250cm9sbGVyLmdldEV4dGVudCgpLFxuICAgICAgICBwcm9qZWN0aW9uOiBtYXAudmlld0NvbnRyb2xsZXIuZ2V0T2xQcm9qZWN0aW9uKCkuZ2V0Q29kZSgpLFxuICAgICAgICAvLyBzY2FsZTogbWFwLnZpZXdDb250cm9sbGVyLmdldFNjYWxlKHJlc29sdXRpb24pLFxuICAgICAgICBzaXplOiBtYXAub2wuZ2V0U2l6ZSgpXG4gICAgICB9IGFzIExlZ2VuZE1hcFZpZXdPcHRpb25zKTtcblxuICAgICAgaWYgKGxlZ2VuZHMuZmlsdGVyKChsKSA9PiBsLmRpc3BsYXkgPT09IHRydWUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBvYnNlcnZlci5uZXh0KGh0bWwpO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBEZWZpbmUgaW1wb3J0YW50IHN0eWxlIHRvIGJlIHN1cmUgdGhhdCBhbGwgY29udGFpbmVyIGlzIGNvbnZlcnRcbiAgICAgIC8vIHRvIGltYWdlIG5vdCBqdXN0IHZpc2libGUgcGFydFxuICAgICAgaHRtbCArPSAnPHN0eWxlIG1lZGlhPVwic2NyZWVuXCIgdHlwZT1cInRleHQvY3NzXCI+JztcbiAgICAgIGh0bWwgKz1cbiAgICAgICAgJy5odG1sMmNhbnZhcy1jb250YWluZXIgeyB3aWR0aDogJyArXG4gICAgICAgIHdpZHRoICtcbiAgICAgICAgJ21tICFpbXBvcnRhbnQ7IGhlaWdodDogMjAwMHB4ICFpbXBvcnRhbnQ7IH0nO1xuICAgICAgaHRtbCArPSAndGFibGUudGFibGVMZWdlbmQge3RhYmxlLWxheW91dDogYXV0bzt9JztcbiAgICAgIGh0bWwgKz1cbiAgICAgICAgJ2Rpdi5zdHlsZUxlZ2VuZCB7cGFkZGluZy10b3A6IDVweDsgcGFkZGluZy1yaWdodDo1cHg7cGFkZGluZy1sZWZ0OjVweDtwYWRkaW5nLWJvdHRvbTo1cHg7fSc7XG4gICAgICBodG1sICs9ICc8L3N0eWxlPic7XG4gICAgICAvLyBUaGUgZm9udCBzaXplIHdpbGwgYWxzbyBiZSBsb3dlcmVkIGFmdGVyd2FyZHMgKGdsb2JhbGx5IGFsb25nIHRoZSBsZWdlbmQgc2l6ZSlcbiAgICAgIC8vIHRoaXMgYWxsb3dzIGhhdmluZyBhIGdvb2QgcmVsYXRpdmUgZm9udCBzaXplIGhlcmUgYW5kIHRvIGtlZXAgYWp1c3RpbmcgdGhlIGxlZ2VuZCBzaXplXG4gICAgICAvLyB3aGlsZSBrZWVwaW5nIGdvb2QgcmVsYXRpdmUgZm9udCBzaXplXG4gICAgICBodG1sICs9ICc8Zm9udCBzaXplPVwiM1wiIGZhY2U9XCJUaW1lc1wiID4nO1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInN0eWxlTGVnZW5kXCI+JztcbiAgICAgIGh0bWwgKz0gJzx0YWJsZSBjbGFzcz1cInRhYmxlTGVnZW5kXCIgPic7XG5cbiAgICAgIC8vIEZvciBlYWNoIGxlZ2VuZCwgZGVmaW5lIGFuIGh0bWwgdGFibGUgY2VsbFxuICAgICAgY29uc3QgaW1hZ2VzJCA9IGxlZ2VuZHNcbiAgICAgICAgLmZpbHRlcigobCkgPT4gbC5kaXNwbGF5ICYmIGwuaXNJblJlc29sdXRpb25zUmFuZ2UgPT09IHRydWUpXG4gICAgICAgIC5tYXAoKGxlZ2VuZCkgPT5cbiAgICAgICAgICB0aGlzLmdldERhdGFJbWFnZShsZWdlbmQudXJsKS5waXBlKFxuICAgICAgICAgICAgcnhNYXAoKGRhdGFJbWFnZSkgPT4ge1xuICAgICAgICAgICAgICBsZXQgaHRtbEltZyA9XG4gICAgICAgICAgICAgICAgJzx0cj48dGQ+JyArIGxlZ2VuZC50aXRsZS50b1VwcGVyQ2FzZSgpICsgJzwvdGQ+PC90cj4nO1xuICAgICAgICAgICAgICBodG1sSW1nICs9ICc8dHI+PHRkPjxpbWcgc3JjPVwiJyArIGRhdGFJbWFnZSArICdcIj48L3RkPjwvdHI+JztcbiAgICAgICAgICAgICAgcmV0dXJuIGh0bWxJbWc7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIGZvcmtKb2luKGltYWdlcyQpLnN1YnNjcmliZSgoZGF0YUltYWdlcykgPT4ge1xuICAgICAgICBodG1sID0gZGF0YUltYWdlcy5yZWR1Y2UoKGFjYywgY3VycmVudCkgPT4gKGFjYyArPSBjdXJyZW50KSwgaHRtbCk7XG4gICAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChodG1sKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RGF0YUltYWdlKHVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCBzZWN1cmVJTUcgPSBuZXcgU2VjdXJlSW1hZ2VQaXBlKHRoaXMuaHR0cCwgdGhpcy5jb25maWdTZXJ2aWNlKTtcbiAgICByZXR1cm4gc2VjdXJlSU1HLnRyYW5zZm9ybSh1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgdGhlIGxlZ2VuZCBpbiBhIHNpbmdsZSBpbWFnZVxuICAgKiAqIEBwYXJhbSAgZm9ybWF0IC0gSW1hZ2UgZm9ybWF0LiBkZWZhdWx0IHZhbHVlIHRvIFwicG5nXCJcbiAgICogQHJldHVybiBUaGUgaW1hZ2Ugb2YgdGhlIGxlZ2VuZFxuICAgKi9cbiAgYXN5bmMgZ2V0TGF5ZXJzTGVnZW5kSW1hZ2UoXG4gICAgbWFwLFxuICAgIGZvcm1hdDogc3RyaW5nID0gJ3BuZycsXG4gICAgZG9aaXBGaWxlOiBib29sZWFuLFxuICAgIHJlc29sdXRpb246IG51bWJlclxuICApIHtcbiAgICBjb25zdCBzdGF0dXMkID0gbmV3IFN1YmplY3QoKTtcbiAgICAvLyBHZXQgaHRtbCBjb2RlIGZvciB0aGUgbGVnZW5kXG4gICAgY29uc3Qgd2lkdGggPSAyMDA7IC8vIG1pbGltZXRlcnMgdW5pdCwgb3JpZ2luYWxseSBkZWZpbmUgZm9yIGRvY3VtZW50IHBkZlxuICAgIGxldCBodG1sID0gYXdhaXQgdGhpcy5nZXRMYXllcnNMZWdlbmRIdG1sKFxuICAgICAgbWFwLFxuICAgICAgd2lkdGgsXG4gICAgICByZXNvbHV0aW9uXG4gICAgKS50b1Byb21pc2UoKTtcbiAgICBmb3JtYXQgPSBmb3JtYXQudG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIElmIG5vIGxlZ2VuZCBzaG93IE5vIExFR0VORCBpbiBhbiBpbWFnZVxuICAgIGlmIChodG1sLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaHRtbCA9ICc8Zm9udCBzaXplPVwiMTJcIiBmYWNlPVwiQ291cmllciBOZXdcIiA+JztcbiAgICAgIGh0bWwgKz0gJzxkaXYgYWxpZ249XCJjZW50ZXJcIj48Yj5OTyBMRUdFTkQ8L2I+PC9kaXY+JztcbiAgICB9XG4gICAgLy8gQ3JlYXRlIGRpdiB0byBjb250YWluIGh0bWwgY29kZSBmb3IgbGVnZW5kXG4gICAgY29uc3QgZGl2ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgZGl2LnN0eWxlLnRvcCA9ICcwJztcbiAgICBkaXYuc3R5bGUuekluZGV4ID0gJy0xJztcbiAgICAvLyBBZGQgaHRtbCBjb2RlIHRvIGNvbnZlcnQgaW4gdGhlIG5ldyB3aW5kb3dcbiAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO1xuICAgIGRpdi5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgYXdhaXQgdGhpcy50aW1lb3V0KDEpO1xuICAgIGNvbnN0IGNhbnZhcyA9IGF3YWl0IGh0bWwyY2FudmFzKGRpdiwgeyB1c2VDT1JTOiB0cnVlIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlbW92ZUh0bWxFbGVtZW50KGRpdik7XG4gICAgaWYgKGNhbnZhcykge1xuICAgICAgbGV0IHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRG9uZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghZG9aaXBGaWxlKSB7XG4gICAgICAgICAgLy8gU2F2ZSB0aGUgY2FudmFzIGFzIGZpbGVcbiAgICAgICAgICB0aGlzLnNhdmVDYW52YXNJbWFnZUFzRmlsZShjYW52YXMsICdsZWdlbmRJbWFnZScsIGZvcm1hdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQWRkIHRoZSBjYW52YXMgdG8gemlwXG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbnZhRmlsZVRvWmlwKGNhbnZhcywgJ2xlZ2VuZEltYWdlJyArICcuJyArIGZvcm1hdCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzdGF0dXMgPSBTdWJqZWN0U3RhdHVzLkVycm9yO1xuICAgICAgfVxuICAgICAgc3RhdHVzJC5uZXh0KHN0YXR1cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXR1cyQ7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUh0bWxFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICB9XG5cbiAgZ2V0VGV4dFBkZk9iamVjdFNpemVBbmRNYXJnKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBtYXJnaW5zLFxuICAgIGZvbnQ6IHN0cmluZyxcbiAgICBmb250U2l6ZUluUHQ6IG51bWJlcixcbiAgICBmb250U3R5bGU6IHN0cmluZyxcbiAgICBkb2M6IGpzUERGXG4gICk6IFRleHRQZGZTaXplQW5kTWFyZ2luIHtcbiAgICBjb25zdCBwZGZSZXNvbHV0aW9uID0gOTY7XG4gICAgY29uc3QgZG9jV2lkdGggPSBkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0V2lkdGgoKTtcbiAgICBjb25zdCBwYWdlV2lkdGggPSBkb2NXaWR0aCAtIG1hcmdpbnNbMV0gLSBtYXJnaW5zWzNdO1xuXG4gICAgLy8gaW1wb3J0YW50IHRvIHNldCBpdCBmaXJzdCwgdGhlIHRleHREaW1lbnNpb24gY2hhbmdlIHdoZW4gZm9udCBjaGFuZ2UhXG4gICAgZG9jLnNldEZvbnQoZm9udCwgZm9udFN0eWxlKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoZm9udFNpemVJblB0KTtcblxuICAgIGxldCB0ZXh0RGltZW5zaW9ucyA9IGRvYy5nZXRUZXh0RGltZW5zaW9ucyh0ZXh0KTtcbiAgICBsZXQgdGV4dE1hcmdpbkxlZnQ6IG51bWJlcjtcblxuICAgIGlmICh0ZXh0RGltZW5zaW9ucy53ID4gcGFnZVdpZHRoKSB7XG4gICAgICAvLyBpZiB0aGUgdGV4dCBpcyB0byBsb25nLCByZWR1Y2UgZm9udFNpemUgNzAlIGFuZCB0aGUgb3ZlcmZsb3cgd2l0aCBiZSBjdXQgaW4gcHJpbnQuLi5cbiAgICAgIHRleHRNYXJnaW5MZWZ0ID0gMDtcbiAgICAgIGZvbnRTaXplSW5QdCA9IGZvbnRTaXplSW5QdCAqIDAuNztcbiAgICAgIGRvYy5zZXRGb250U2l6ZShmb250U2l6ZUluUHQpO1xuICAgICAgdGV4dERpbWVuc2lvbnMgPSBkb2MuZ2V0VGV4dERpbWVuc2lvbnModGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRleHRNYXJnaW5MZWZ0ID0gKHBhZ2VXaWR0aCAtIHRleHREaW1lbnNpb25zLncpIC8gMjtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZm9udFNpemU6IGZvbnRTaXplSW5QdCxcbiAgICAgIG1hcmdpbkxlZnQ6IHRleHRNYXJnaW5MZWZ0LFxuICAgICAgaGVpZ2h0OiB0ZXh0RGltZW5zaW9ucy5oXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgY29tbWVudCB0byB0aGUgZG9jdW1lbnRcbiAgICogQHBhcmFtICBkb2MgLSBwZGYgZG9jdW1lbnRcbiAgICogQHBhcmFtICBjb21tZW50IC0gQ29tbWVudCB0byBhZGQgaW4gdGhlIGRvY3VtZW50XG4gICAqIEBwYXJhbSBiYXNlTWFyZ2lucyAtIHRvcCB8IHJpZ2h0IHwgYm90dG9tIHwgbGVmdFxuICAgKiBAcGFyYW0gdmVydGljYWxTcGFjaW5nIC0gY2FsY3VsYXRlIHRleHQgcG9zaXRpb24gYW5kIG1hcCBoZWlnaHRcbiAgICovXG4gIHByaXZhdGUgYWRkQ29tbWVudChcbiAgICBkb2M6IGpzUERGLFxuICAgIGNvbW1lbnQ6IHN0cmluZyxcbiAgICBiYXNlTWFyZ2luczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgdmVydGljYWxTcGFjaW5nOiBudW1iZXJcbiAgKSB7XG4gICAgLy8gY2FsY3VsYXRlIG1hcCBpbWFnZSBoZWlnaHRcbiAgICBiYXNlTWFyZ2luc1syXSArPSB2ZXJ0aWNhbFNwYWNpbmc7XG5cbiAgICBjb25zdCB4UG9zaXRpb24gPSBiYXNlTWFyZ2luc1szXTsgLy9tYXJnaW4gbGVmdCBhbmQgYm90dG9tIGlzIGZpeFxuICAgIGNvbnN0IG1hcmdpbkJvdHRvbSA9IGJhc2VNYXJnaW5zWzJdO1xuICAgIC8vIGNhbGN1bGF0ZSB0ZXh0IHBvc2l0aW9uIFlcbiAgICBjb25zdCB5UG9zaXRpb24gPVxuICAgICAgZG9jLmludGVybmFsLnBhZ2VTaXplLmhlaWdodCAtIG1hcmdpbkJvdHRvbSArIHZlcnRpY2FsU3BhY2luZztcblxuICAgIHRoaXMuYWRkVGV4dEluUGRmRG9jKFxuICAgICAgZG9jLFxuICAgICAgY29tbWVudCxcbiAgICAgIHRoaXMuVEVYVFBERkZPTlQuY29tbWVudEZvbnQsXG4gICAgICB0aGlzLlRFWFRQREZGT05ULmNvbW1lbnRGb250U3R5bGUsXG4gICAgICB0aGlzLlRFWFRQREZGT05ULmNvbW1lbnRGb250U2l6ZSxcbiAgICAgIHhQb3NpdGlvbixcbiAgICAgIHlQb3NpdGlvbixcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRUZXh0SW5QZGZEb2MoXG4gICAgZG9jOiBqc1BERixcbiAgICB0ZXh0VG9BZGQ6IHN0cmluZyxcbiAgICB0ZXh0Rm9udDogc3RyaW5nLFxuICAgIHRleHRGb250U3R5bGU6IHN0cmluZyxcbiAgICB0ZXh0Rm9udFNpemU6IG51bWJlcixcbiAgICB0ZXh0TWFyZ2luTGVmdDogbnVtYmVyLFxuICAgIHRleHRNYXJnaW5Ub3A6IG51bWJlcixcbiAgICBpc0NvbW1lbnQ6IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICBkb2Muc2V0Rm9udCh0ZXh0Rm9udCwgdGV4dEZvbnRTdHlsZSk7XG4gICAgZG9jLnNldEZvbnRTaXplKHRleHRGb250U2l6ZSk7XG5cbiAgICBpZiAoaXNDb21tZW50KSB7XG4gICAgICB0ZXh0VG9BZGQgPSBkb2Muc3BsaXRUZXh0VG9TaXplKFxuICAgICAgICB0ZXh0VG9BZGQsXG4gICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRXaWR0aCgpIC0gdGV4dE1hcmdpbkxlZnQgKiAzXG4gICAgICApO1xuICAgIH1cbiAgICBkb2MudGV4dCh0ZXh0VG9BZGQsIHRleHRNYXJnaW5MZWZ0LCB0ZXh0TWFyZ2luVG9wKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYXR0cmlidXRpb24gYW5kL29yIChwcm9qZWN0aW9uIGFuZC9vciBzY2FsZSkgdG8gdGhlIGRvY3VtZW50XG4gICAqIEBwYXJhbSAgbWFwIC0gTWFwIG9mIHRoZSBhcHBcbiAgICogQHBhcmFtICBkb2MgLSBwZGYgZG9jdW1lbnRcbiAgICogQHBhcmFtICBvcHRpb25zIC0gUHJpbnQgb3B0aW9uc1xuICAgKiBAcGFyYW0gIHJlc29sdXRpb24gLSBjYXJ0IHJlc29sdXRpb25cbiAgICogQHBhcmFtIGJhc2VNYXJnaW5zIC0gdG9wIHwgcmlnaHQgfCBib3R0b20gfCBsZWZ0XG4gICAqIEBwYXJhbSB2ZXJ0aWNhbFNwYWNpbmcgLSBjYWxjdWxhdGUgdGV4dCBwb3NpdGlvbiBhbmQgbWFwIGhlaWdodFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGb290ZXIoXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgZG9jOiBqc1BERixcbiAgICBvcHRpb25zOiBQcmludE9wdGlvbnMsXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyLFxuICAgIHZlcnRpY2FsU3BhY2luZzogbnVtYmVyLFxuICAgIGJhc2VNYXJnaW5zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXVxuICApIHtcbiAgICBsZXQgdGV4dDogc3RyaW5nID0gJyc7XG5cbiAgICBjb25zdCBhdHRyaWJ1dGlvblRleHQ6IHN0cmluZyA9IHRoaXMuZ2V0QXR0cmlidXRpb25UZXh0KG1hcCk7XG4gICAgaWYgKGF0dHJpYnV0aW9uVGV4dCkge1xuICAgICAgdGV4dCArPSBhdHRyaWJ1dGlvblRleHQgKyAnLiAnO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5zaG93UHJvamVjdGlvbiA9PT0gdHJ1ZSB8fCBvcHRpb25zLnNob3dTY2FsZSA9PT0gdHJ1ZSkge1xuICAgICAgdGV4dCArPSB0aGlzLmdldFByb2pTY2FsZShtYXAsIG9wdGlvbnMsIHJlc29sdXRpb24pO1xuICAgIH1cblxuICAgIGlmICh0ZXh0KSB7XG4gICAgICBiYXNlTWFyZ2luc1syXSArPSB2ZXJ0aWNhbFNwYWNpbmc7XG4gICAgfVxuXG4gICAgY29uc3QgeFBvc2l0aW9uID0gYmFzZU1hcmdpbnNbM107XG4gICAgY29uc3QgbWFyZ2luQm90dG9tID0gYmFzZU1hcmdpbnNbMl07XG4gICAgLy8gY2FsY3VsYXRlIHRleHQgcG9zaXRpb24gWVxuICAgIGNvbnN0IHlQb3NpdGlvbiA9XG4gICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0IC0gbWFyZ2luQm90dG9tICsgdmVydGljYWxTcGFjaW5nO1xuXG4gICAgdGhpcy5hZGRUZXh0SW5QZGZEb2MoXG4gICAgICBkb2MsXG4gICAgICB0ZXh0LFxuICAgICAgdGhpcy5URVhUUERGRk9OVC5jb21tZW50Rm9udCxcbiAgICAgIHRoaXMuVEVYVFBERkZPTlQuY29tbWVudEZvbnRTdHlsZSxcbiAgICAgIHRoaXMuVEVYVFBERkZPTlQuY29tbWVudEZvbnRTaXplLFxuICAgICAgeFBvc2l0aW9uLFxuICAgICAgeVBvc2l0aW9uXG4gICAgKTtcbiAgfVxuXG4gIGdldEF0dHJpYnV0aW9uVGV4dChtYXA6IElnb01hcCk6IHN0cmluZyB7XG4gICAgY29uc3QgbWFwT3ZlcmxheUh0bWwgPSBtYXAub2wuZ2V0T3ZlcmxheUNvbnRhaW5lclN0b3BFdmVudCgpIGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IGh0bWxBdHRyaWJ1dGlvbiA9IG1hcE92ZXJsYXlIdG1sXG4gICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnb2wtYXR0cmlidXRpb24nKVswXVxuICAgICAgLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcbiAgICBodG1sQXR0cmlidXRpb24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpWzBdLnJlbW92ZSgpO1xuICAgIHJldHVybiBodG1sQXR0cmlidXRpb24uaW5uZXJUZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcm9qU2NhbGUoXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgb3B0aW9uczogUHJpbnRPcHRpb25zLFxuICAgIGRwaTogbnVtYmVyXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgdHJhbnNsYXRlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlO1xuICAgIGxldCB0ZXh0UHJvalNjYWxlOiBzdHJpbmcgPSAnJztcbiAgICBpZiAob3B0aW9ucy5zaG93UHJvamVjdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgcHJvalRleHQgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5wcmludEZvcm0ucHJvamVjdGlvbicpO1xuICAgICAgdGV4dFByb2pTY2FsZSArPSBwcm9qVGV4dCArICc6ICcgKyBtYXAucHJvamVjdGlvbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc2hvd1NjYWxlID09PSB0cnVlKSB7XG4gICAgICBpZiAob3B0aW9ucy5zaG93UHJvamVjdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICB0ZXh0UHJvalNjYWxlICs9ICcgICAnO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2NhbGVUZXh0ID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8ucHJpbnRGb3JtLnNjYWxlJyk7XG4gICAgICBjb25zdCBtYXBTY2FsZSA9IG1hcC52aWV3Q29udHJvbGxlci5nZXRTY2FsZShkcGkpO1xuICAgICAgdGV4dFByb2pTY2FsZSArPSBzY2FsZVRleHQgKyAnOiB+IDEgLyAnICsgZm9ybWF0U2NhbGUobWFwU2NhbGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dFByb2pTY2FsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIGxlZ2VuZCB0byB0aGUgZG9jdW1lbnRcbiAgICogQHBhcmFtICBkb2MgLSBQZGYgZG9jdW1lbnQgd2hlcmUgbGVnZW5kIHdpbGwgYmUgYWRkZWRcbiAgICogQHBhcmFtICBtYXAgLSBNYXAgb2YgdGhlIGFwcFxuICAgKiBAcGFyYW0gIG1hcmdpbnMgLSBQYWdlIG1hcmdpbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYWRkTGVnZW5kKFxuICAgIGRvYzoganNQREYsXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgbWFyZ2luczogQXJyYXk8bnVtYmVyPixcbiAgICByZXNvbHV0aW9uOiBudW1iZXJcbiAgKSB7XG4gICAgLy8gR2V0IGh0bWwgY29kZSBmb3IgdGhlIGxlZ2VuZFxuICAgIGNvbnN0IHdpZHRoID0gZG9jLmludGVybmFsLnBhZ2VTaXplLndpZHRoO1xuICAgIGNvbnN0IGh0bWwgPSBhd2FpdCB0aGlzLmdldExheWVyc0xlZ2VuZEh0bWwoXG4gICAgICBtYXAsXG4gICAgICB3aWR0aCxcbiAgICAgIHJlc29sdXRpb25cbiAgICApLnRvUHJvbWlzZSgpO1xuICAgIC8vIElmIG5vIGxlZ2VuZCwgc2F2ZSB0aGUgbWFwIGRpcmVjdGx5XG4gICAgaWYgKGh0bWwgPT09ICcnKSB7XG4gICAgICBhd2FpdCB0aGlzLnNhdmVEb2MoZG9jKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgZGl2IHRvIGNvbnRhaW4gaHRtbCBjb2RlIGZvciBsZWdlbmRcbiAgICBjb25zdCBkaXYgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBkaXYuc3R5bGUudG9wID0gJzAnO1xuICAgIGRpdi5zdHlsZS56SW5kZXggPSAnLTEnO1xuXG4gICAgLy8gQWRkIGh0bWwgY29kZSB0byBjb252ZXJ0IGluIHRoZSBuZXcgd2luZG93XG4gICAgd2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgIGF3YWl0IHRoaXMudGltZW91dCgxKTtcbiAgICBjb25zdCBjYW52YXMgPSBhd2FpdCBodG1sMmNhbnZhcyhkaXYsIHsgdXNlQ09SUzogdHJ1ZSB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgfSk7XG4gICAgdGhpcy5yZW1vdmVIdG1sRWxlbWVudChkaXYpO1xuICAgIGlmIChjYW52YXMpIHtcbiAgICAgIGNvbnN0IHBvdXJjZW50YWdlUmVkdWN0aW9uID0gMC44NTtcbiAgICAgIGNvbnN0IGltYWdlU2l6ZSA9IFtcbiAgICAgICAgKHBvdXJjZW50YWdlUmVkdWN0aW9uICogKDI1LjQgKiBjYW52YXMud2lkdGgpKSAvIHJlc29sdXRpb24sXG4gICAgICAgIChwb3VyY2VudGFnZVJlZHVjdGlvbiAqICgyNS40ICogY2FudmFzLmhlaWdodCkpIC8gcmVzb2x1dGlvblxuICAgICAgXTtcbiAgICAgIGxldCBpbWdEYXRhO1xuICAgICAgZG9jLmFkZFBhZ2UoKTtcbiAgICAgIGltZ0RhdGEgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICAgIGRvYy5hZGRJbWFnZShpbWdEYXRhLCAnUE5HJywgMTAsIDEwLCBpbWFnZVNpemVbMF0sIGltYWdlU2l6ZVsxXSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zYXZlRG9jKGRvYyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSBsZWdlbmQgdG8gdGhlIGRvY3VtZW50XG4gICAqIEBwYXJhbSAgZG9jIC0gUGRmIGRvY3VtZW50IHdoZXJlIGxlZ2VuZCB3aWxsIGJlIGFkZGVkXG4gICAqIEBwYXJhbSAgbWFwIC0gTWFwIG9mIHRoZSBhcHBcbiAgICogQHBhcmFtICBiYXNlTWFyZ2lucyAtIFBhZ2UgbWFyZ2luc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhZGRMZWdlbmRTYW1lUGFnZShcbiAgICBkb2M6IGpzUERGLFxuICAgIG1hcDogSWdvTWFwLFxuICAgIGJhc2VNYXJnaW5zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICByZXNvbHV0aW9uOiBudW1iZXIsXG4gICAgbGVnZW5kUG9zaXRpb246IHN0cmluZ1xuICApIHtcbiAgICAvLyBHZXQgaHRtbCBjb2RlIGZvciB0aGUgbGVnZW5kXG4gICAgY29uc3Qgd2lkdGggPSBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGg7XG4gICAgY29uc3QgaHRtbCA9IGF3YWl0IHRoaXMuZ2V0TGF5ZXJzTGVnZW5kSHRtbChcbiAgICAgIG1hcCxcbiAgICAgIHdpZHRoLFxuICAgICAgcmVzb2x1dGlvblxuICAgICkudG9Qcm9taXNlKCk7XG4gICAgLy8gSWYgbm8gbGVnZW5kLCBzYXZlIHRoZSBtYXAgZGlyZWN0bHlcbiAgICBpZiAoaHRtbCA9PT0gJycpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZURvYyhkb2MpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIENyZWF0ZSBkaXYgdG8gY29udGFpbiBodG1sIGNvZGUgZm9yIGxlZ2VuZFxuICAgIGNvbnN0IGRpdiA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGRpdi5zdHlsZS50b3AgPSAnMCc7XG4gICAgZGl2LnN0eWxlLnpJbmRleCA9ICctMSc7XG4gICAgLy8gQWRkIGh0bWwgY29kZSB0byBjb252ZXJ0IGluIHRoZSBuZXcgd2luZG93XG4gICAgd2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcbiAgICBhd2FpdCB0aGlzLnRpbWVvdXQoMSk7XG4gICAgY29uc3QgY2FudmFzID0gYXdhaXQgaHRtbDJjYW52YXMoZGl2LCB7IHVzZUNPUlM6IHRydWUgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgIH0pO1xuICAgIHRoaXMucmVtb3ZlSHRtbEVsZW1lbnQoZGl2KTtcbiAgICBsZXQgbWFyZ2luc0xlZ2VuZDtcbiAgICBpZiAoY2FudmFzKSB7XG4gICAgICBjb25zdCBwb3VyY2VudGFnZVJlZHVjdGlvbiA9IDAuODU7XG4gICAgICBjb25zdCBpbWFnZVNpemUgPSBbXG4gICAgICAgIChwb3VyY2VudGFnZVJlZHVjdGlvbiAqICgyNS40ICogY2FudmFzLndpZHRoKSkgLyByZXNvbHV0aW9uLFxuICAgICAgICAocG91cmNlbnRhZ2VSZWR1Y3Rpb24gKiAoMjUuNCAqIGNhbnZhcy5oZWlnaHQpKSAvIHJlc29sdXRpb25cbiAgICAgIF07XG4gICAgICAvLyBNb3ZlIHRoZSBsZWdlbmQgdG8gdGhlIGNvcnJlY3QgcG9zaXRpb24gb24gdGhlIHBhZ2VcbiAgICAgIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gJ2JvdHRvbXJpZ2h0Jykge1xuICAgICAgICBtYXJnaW5zTGVnZW5kID0gW1xuICAgICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQgLSBiYXNlTWFyZ2luc1syXSAtIGltYWdlU2l6ZVsxXSxcbiAgICAgICAgICBiYXNlTWFyZ2luc1sxXSxcbiAgICAgICAgICBiYXNlTWFyZ2luc1syXSxcbiAgICAgICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGggLSBiYXNlTWFyZ2luc1sxXSAtIGltYWdlU2l6ZVswXVxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gJ3RvcHJpZ2h0Jykge1xuICAgICAgICBtYXJnaW5zTGVnZW5kID0gW1xuICAgICAgICAgIGJhc2VNYXJnaW5zWzBdLFxuICAgICAgICAgIGJhc2VNYXJnaW5zWzFdLFxuICAgICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQgLSBiYXNlTWFyZ2luc1swXSAtIGltYWdlU2l6ZVsxXSxcbiAgICAgICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGggLSBiYXNlTWFyZ2luc1sxXSAtIGltYWdlU2l6ZVswXVxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gJ2JvdHRvbWxlZnQnKSB7XG4gICAgICAgIC8vIFdoZW4gdGhlIGxlZ2VuZCBpcyBpbiB0aGUgYm90dG9tIGxlZnQsIHJhaXNlIHRoZSBsZWdlbmQgc2xpZ2h0bHkgdXB3YXJkIHNvIHRoYXQgYXR0cmlidXRpb25zIGFyZSB2aXNpYmxlXG4gICAgICAgIG1hcmdpbnNMZWdlbmQgPSBbXG4gICAgICAgICAgZG9jLmludGVybmFsLnBhZ2VTaXplLmhlaWdodCAtIGJhc2VNYXJnaW5zWzJdIC0gaW1hZ2VTaXplWzFdLFxuICAgICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aCAtIGJhc2VNYXJnaW5zWzNdIC0gaW1hZ2VTaXplWzBdLFxuICAgICAgICAgIGJhc2VNYXJnaW5zWzJdLFxuICAgICAgICAgIGJhc2VNYXJnaW5zWzNdXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAndG9wbGVmdCcpIHtcbiAgICAgICAgbWFyZ2luc0xlZ2VuZCA9IFtcbiAgICAgICAgICBiYXNlTWFyZ2luc1swXSxcbiAgICAgICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGggLSBiYXNlTWFyZ2luc1szXSAtIGltYWdlU2l6ZVswXSxcbiAgICAgICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0IC0gYmFzZU1hcmdpbnNbMF0gLSBpbWFnZVNpemVbMV0sXG4gICAgICAgICAgYmFzZU1hcmdpbnNbM11cbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWRkQ2FudmFzKGRvYywgY2FudmFzLCBtYXJnaW5zTGVnZW5kKTsgLy8gdGhpcyBhZGRzIHRoZSBsZWdlbmRcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZURvYyhkb2MpO1xuICAgIH1cbiAgfVxuXG4gIGRlZmluZU5iRmlsZVRvUHJvY2VzcyhuYkZpbGVUb1Byb2Nlc3MpIHtcbiAgICB0aGlzLm5iRmlsZVRvUHJvY2VzcyA9IG5iRmlsZVRvUHJvY2VzcztcbiAgfVxuXG4gIHByaXZhdGUgdGltZW91dChtcykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDYW52YXMoXG4gICAgZG9jOiBqc1BERixcbiAgICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LFxuICAgIGJhc2VNYXJnaW5zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXVxuICApIHtcbiAgICBsZXQgaW1hZ2U7XG4gICAgaWYgKGNhbnZhcykge1xuICAgICAgaW1hZ2UgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoaW1hZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGltYWdlLmxlbmd0aCA8IDIwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdXYXJuaW5nOiBBbiBpbWFnZSBjYW5ub3QgYmUgcHJpbnQgaW4gcGRmIGZpbGUnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgaW1hZ2VTaXplID0gdGhpcy5nZXRJbWFnZVNpemVUb0ZpdFBkZihkb2MsIGNhbnZhcywgYmFzZU1hcmdpbnMpO1xuICAgICAgZG9jLmFkZEltYWdlKFxuICAgICAgICBpbWFnZSxcbiAgICAgICAgJ1BORycsXG4gICAgICAgIGJhc2VNYXJnaW5zWzNdLFxuICAgICAgICBiYXNlTWFyZ2luc1swXSxcbiAgICAgICAgaW1hZ2VTaXplWzBdLFxuICAgICAgICBpbWFnZVNpemVbMV1cbiAgICAgICk7XG4gICAgICBkb2MucmVjdChiYXNlTWFyZ2luc1szXSwgYmFzZU1hcmdpbnNbMF0sIGltYWdlU2l6ZVswXSwgaW1hZ2VTaXplWzFdKTtcbiAgICAgIHRoaXMuaW1nU2l6ZUFkZGVkID0gaW1hZ2VTaXplOyAvLyBrZWVwIGltZyBzaXplIGZvciBnZW9yZWYgbGF0ZXJcbiAgICB9XG4gIH1cblxuICAvLyBUT0RPIGZpeCBwcmludGluZyB3aXRoIGltYWdlIHJlc29sdXRpb25cbiAgYWRkTWFwKFxuICAgIGRvYzoganNQREYsXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyLFxuICAgIGltYWdlRGltZW5zaW9uczogW251bWJlciwgbnVtYmVyXSxcbiAgICBiYXNlTWFyZ2luczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgbGVnZW5kUG9zdGlvbjogUHJpbnRMZWdlbmRQb3NpdGlvblxuICApIHtcbiAgICBjb25zdCBtYXBTaXplID0gbWFwLm9sLmdldFNpemUoKSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICAgIGNvbnN0IHZpZXdSZXNvbHV0aW9uID0gbWFwLm9sLmdldFZpZXcoKS5nZXRSZXNvbHV0aW9uKCk7XG4gICAgY29uc3QgZGltZW5zaW9uUGl4ZWxzID0gdGhpcy5zZXRNYXBSZXNvbHV0aW9uKFxuICAgICAgbWFwLFxuICAgICAgaW1hZ2VEaW1lbnNpb25zLFxuICAgICAgcmVzb2x1dGlvbixcbiAgICAgIHZpZXdSZXNvbHV0aW9uXG4gICAgKTtcbiAgICBjb25zdCBzdGF0dXMkID0gbmV3IFN1YmplY3QoKTtcblxuICAgIGxldCB0aW1lb3V0O1xuICAgIG1hcC5vbC5vbmNlKCdyZW5kZXJjb21wbGV0ZScsIGFzeW5jIChldmVudDogYW55KSA9PiB7XG4gICAgICBjb25zdCBtYXBDYW52YXMgPSBldmVudC50YXJnZXRcbiAgICAgICAgLmdldFZpZXdwb3J0KClcbiAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdjYW52YXMnKSBhcyBIVE1MQ29sbGVjdGlvbk9mPEhUTUxDYW52YXNFbGVtZW50PjtcblxuICAgICAgY29uc3QgbWFwUmVzdWx0Q2FudmFzID0gYXdhaXQgdGhpcy5kcmF3TWFwKGRpbWVuc2lvblBpeGVscywgbWFwQ2FudmFzKTtcblxuICAgICAgdGhpcy5tYXBQcmludEV4dGVudCA9IG1hcC52aWV3Q29udHJvbGxlci5nZXRFeHRlbnQoJ0VQU0c6Mzg1NycpO1xuXG4gICAgICB0aGlzLnJlc2V0T3JpZ2luYWxNYXBTaXplKG1hcCwgbWFwU2l6ZSwgdmlld1Jlc29sdXRpb24pO1xuICAgICAgYXdhaXQgdGhpcy5kcmF3TWFwQ29udHJvbHMobWFwLCBtYXBSZXN1bHRDYW52YXMsIGxlZ2VuZFBvc3Rpb24pO1xuXG4gICAgICBjb25zdCBtYXBTdGF0dXMkJCA9IG1hcC5zdGF0dXMkLnN1YnNjcmliZSgobWFwU3RhdHVzOiBTdWJqZWN0U3RhdHVzKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKG1hcFN0YXR1cyAhPT0gU3ViamVjdFN0YXR1cy5Eb25lKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG1hcFN0YXR1cyQkLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGxldCBzdGF0dXMgPSBTdWJqZWN0U3RhdHVzLkRvbmU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKG1hcFJlc3VsdENhbnZhcy53aWR0aCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5hZGRDYW52YXMoZG9jLCBtYXBSZXN1bHRDYW52YXMsIGJhc2VNYXJnaW5zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRXJyb3I7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5lcnJvcihcbiAgICAgICAgICAgICdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlQm9keScsXG4gICAgICAgICAgICAnaWdvLmdlby5wcmludEZvcm0uY29yc0Vycm9yTWVzc2FnZUhlYWRlcidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHN0YXR1cyQubmV4dChzdGF0dXMpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIG5vIGxvYWRpbmcgYXMgc3RhcnRlZCBhZnRlciAyMDBtcywgdGhlbiBwcm9iYWJseSBubyBsb2FkaW5nXG4gICAgICAvLyBpcyByZXF1aXJlZC5cbiAgICAgIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIG1hcFN0YXR1cyQkLnVuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgbGV0IHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRG9uZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAobWFwUmVzdWx0Q2FudmFzLndpZHRoICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmFkZENhbnZhcyhkb2MsIG1hcFJlc3VsdENhbnZhcywgYmFzZU1hcmdpbnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgc3RhdHVzID0gU3ViamVjdFN0YXR1cy5FcnJvcjtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmVycm9yKFxuICAgICAgICAgICAgJ2lnby5nZW8ucHJpbnRGb3JtLmNvcnNFcnJvck1lc3NhZ2VCb2R5JyxcbiAgICAgICAgICAgICdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlSGVhZGVyJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldE9yaWdpbmFsTWFwU2l6ZShtYXAsIG1hcFNpemUsIHZpZXdSZXNvbHV0aW9uKTtcbiAgICAgICAgc3RhdHVzJC5uZXh0KHN0YXR1cyk7XG4gICAgICB9LCAyMDApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHN0YXR1cyQ7XG4gIH1cblxuICBwcml2YXRlIHNldE1hcFJlc29sdXRpb24oXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgaW5pdGlhbFNpemU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyLFxuICAgIHZpZXdSZXNvbHV0aW9uOiBudW1iZXJcbiAgKTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgY29uc3QgbWFwU2l6ZSA9IG1hcC5vbC5nZXRTaXplKCk7XG4gICAgY29uc3Qgd2lkdGhQaXhlbHMgPSBNYXRoLnJvdW5kKChpbml0aWFsU2l6ZVswXSAqIHJlc29sdXRpb24pIC8gMjUuNCk7XG4gICAgY29uc3QgaGVpZ2h0UGl4ZWxzID0gTWF0aC5yb3VuZCgoaW5pdGlhbFNpemVbMV0gKiByZXNvbHV0aW9uKSAvIDI1LjQpO1xuXG4gICAgLy8gU2V0IHByaW50IHNpemVcbiAgICBjb25zdCBwcmludFNpemUgPSBbd2lkdGhQaXhlbHMsIGhlaWdodFBpeGVsc107XG4gICAgbWFwLm9sLnNldFNpemUocHJpbnRTaXplKTtcbiAgICBjb25zdCBzY2FsaW5nID0gTWF0aC5taW4oXG4gICAgICB3aWR0aFBpeGVscyAvIG1hcFNpemVbMF0sXG4gICAgICBoZWlnaHRQaXhlbHMgLyBtYXBTaXplWzFdXG4gICAgKTtcbiAgICBtYXAub2wuZ2V0VmlldygpLnNldFJlc29sdXRpb24odmlld1Jlc29sdXRpb24gLyBzY2FsaW5nKTtcblxuICAgIHJldHVybiBbd2lkdGhQaXhlbHMsIGhlaWdodFBpeGVsc107XG4gIH1cblxuICBwcml2YXRlIHJlc2V0T3JpZ2luYWxNYXBTaXplKFxuICAgIG1hcDogSWdvTWFwLFxuICAgIGluaXRpYWxTaXplOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIHZpZXdSZXNvbHV0aW9uOiBudW1iZXJcbiAgKSB7XG4gICAgbWFwLm9sLnNldFNpemUoaW5pdGlhbFNpemUpO1xuICAgIG1hcC5vbC5nZXRWaWV3KCkuc2V0UmVzb2x1dGlvbih2aWV3UmVzb2x1dGlvbik7XG4gICAgbWFwLm9sLnVwZGF0ZVNpemUoKTtcbiAgICBtYXAub2wucmVuZGVyU3luYygpO1xuICB9XG5cbiAgYXN5bmMgZHJhd01hcChcbiAgICBzaXplOiBBcnJheTxudW1iZXI+LFxuICAgIG1hcENhbnZhczogSFRNTENvbGxlY3Rpb25PZjxIVE1MQ2FudmFzRWxlbWVudD5cbiAgKTogUHJvbWlzZTxIVE1MQ2FudmFzRWxlbWVudD4ge1xuICAgIGNvbnN0IG1hcFJlc3VsdENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIG1hcFJlc3VsdENhbnZhcy53aWR0aCA9IHNpemVbMF07XG4gICAgbWFwUmVzdWx0Q2FudmFzLmhlaWdodCA9IHNpemVbMV07XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbWFwQ2FudmFzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgY2FudmFzID0gbWFwQ2FudmFzW2luZGV4XTtcbiAgICAgIGlmIChjYW52YXMud2lkdGggPiAwKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlQ2FudmFzKGNhbnZhcywgbWFwUmVzdWx0Q2FudmFzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcFJlc3VsdENhbnZhcztcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2FudmFzKFxuICAgIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsXG4gICAgbWFwUmVzdWx0Q2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudFxuICApIHtcbiAgICBjb25zdCBtYXBDb250ZXh0UmVzdWx0ID0gbWFwUmVzdWx0Q2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgY29uc3Qgb3BhY2l0eSA9IGNhbnZhcy5wYXJlbnRFbGVtZW50LnN0eWxlLm9wYWNpdHkgfHwgY2FudmFzLnN0eWxlLm9wYWNpdHk7XG4gICAgbWFwQ29udGV4dFJlc3VsdC5nbG9iYWxBbHBoYSA9IG9wYWNpdHkgPT09ICcnID8gMSA6IE51bWJlcihvcGFjaXR5KTtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBjYW52YXMuc3R5bGUudHJhbnNmb3JtO1xuICAgIGxldCBtYXRyaXg6IG51bWJlcltdO1xuICAgIGlmICh0cmFuc2Zvcm0pIHtcbiAgICAgIC8vIEdldCB0aGUgdHJhbnNmb3JtIHBhcmFtZXRlcnMgZnJvbSB0aGUgc3R5bGUncyB0cmFuc2Zvcm0gbWF0cml4XG4gICAgICBtYXRyaXggPSB0cmFuc2Zvcm1cbiAgICAgICAgLm1hdGNoKC9ebWF0cml4XFwoKFteXFwoXSopXFwpJC8pWzFdXG4gICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgIC5tYXAoTnVtYmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWF0cml4ID0gW1xuICAgICAgICBwYXJzZUZsb2F0KGNhbnZhcy5zdHlsZS53aWR0aCkgLyBjYW52YXMud2lkdGgsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIHBhcnNlRmxvYXQoY2FudmFzLnN0eWxlLmhlaWdodCkgLyBjYW52YXMuaGVpZ2h0LFxuICAgICAgICAwLFxuICAgICAgICAwXG4gICAgICBdO1xuICAgIH1cbiAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQucHJvdG90eXBlLnNldFRyYW5zZm9ybS5hcHBseShcbiAgICAgIG1hcENvbnRleHRSZXN1bHQsXG4gICAgICBtYXRyaXhcbiAgICApO1xuICAgIGNvbnN0IGJhY2tncm91bmRDb2xvciA9IGNhbnZhcy5wYXJlbnRFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvcjtcbiAgICBpZiAoYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICBtYXBDb250ZXh0UmVzdWx0LmZpbGxTdHlsZSA9IGJhY2tncm91bmRDb2xvcjtcbiAgICAgIG1hcENvbnRleHRSZXN1bHQuZmlsbFJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcbiAgICB9XG4gICAgbWFwQ29udGV4dFJlc3VsdC5kcmF3SW1hZ2UoY2FudmFzLCAwLCAwKTtcbiAgICBtYXBDb250ZXh0UmVzdWx0Lmdsb2JhbEFscGhhID0gMTtcbiAgICAvLyByZXNldCBjYW52YXMgdHJhbnNmb3JtIHRvIGluaXRpYWxcbiAgICBtYXBDb250ZXh0UmVzdWx0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgfVxuXG4gIGFzeW5jIGRyYXdNYXBDb250cm9scyhcbiAgICBtYXA6IElnb01hcCxcbiAgICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LFxuICAgIHBvc2l0aW9uOiBQcmludExlZ2VuZFBvc2l0aW9uXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAvLyBHZXQgdGhlIHNjYWxlIGFuZCBhdHRyaWJ1dGlvblxuICAgIC8vIHdlIHVzZSBjbG9uZU5vZGUgdG8gbW9kaWZ5IHRoZSBub2RlcyB0byBwcmludCB3aXRob3V0IG1vZGlmeWluZyBpdCBvbiB0aGUgcGFnZSwgdXNpbmcgZGVlcDp0cnVlIHRvIGdldCBjaGlsZHJlblxuICAgIGNvbnN0IG1hcE92ZXJsYXlIVE1MID0gbWFwLm9sXG4gICAgICAuZ2V0T3ZlcmxheUNvbnRhaW5lclN0b3BFdmVudCgpXG4gICAgICAuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgLy8gc2V0ICdPdmVybGF5Q29udGFpbmVyJyBzaXplIHRvIHByaW50IHNpemVcbiAgICBtYXBPdmVybGF5SFRNTC5zdHlsZS53aWR0aCA9IGNhbnZhcy53aWR0aCArICdweCc7XG4gICAgbWFwT3ZlcmxheUhUTUwuc3R5bGUuaGVpZ2h0ID0gY2FudmFzLmhlaWdodCArICdweCc7XG4gICAgLy8gd2UgYWRkIHppbmRleCAtMSB0byBub3Qgc2hvdyBtb2RpZmljYXRpb24gdG8gdGhlIHVzZXJcbiAgICBtYXBPdmVybGF5SFRNTC5zdHlsZS56SW5kZXggPSAnLTEnO1xuICAgIC8vIGFuZCBtYWtlIHN1cmUgaHRtbDJjYW52YXMgdG8gcmVuZGVyIHRoZSBpbWFnZSBjb3JyZWN0bHlcbiAgICBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ29sLXZpZXdwb3J0JylbMF1cbiAgICAgIC5hcHBlbmRDaGlsZChtYXBPdmVybGF5SFRNTCk7XG4gICAgLy8gQ2hhbmdlIHRoZSBzdHlsZXMgb2YgaHlwZXJsaW5rIGluIHRoZSBwcmludGVkIHZlcnNpb25cbiAgICAvLyBUcmFuc2Zvcm0gdGhlIE92ZXJsYXkgaW50byBhIGNhbnZhc1xuICAgIC8vIHNjYWxlIGlzIG5lY2Vzc2FyeSB0byBtYWtlIGl0IGluIGdvb2dsZSBjaHJvbWVcbiAgICAvLyBiYWNrZ3JvdW5kIGFzIG51bGwgYmVjYXVzZSBvdGhlcndpc2UgaXQgaXMgd2hpdGUgYW5kIGNvdmVyIHRoZSBtYXBcbiAgICAvLyBhbGxvd3RhaW50IGlzIHRvIGFsbG93IHJlbmRlcmluZyBpbWFnZXMgaW4gdGhlIGF0dHJpYnV0aW9uc1xuICAgIC8vIHVzZUNPUlM6IHRydWUgcG91ciBwZXJtZXR0cmUgZGUgcmVuZGVyZXIgbGVzIGltYWdlcyAobmUgbWFyY2hlIHBhcyBlbiBsb2NhbClcbiAgICBjb25zdCBjYW52YXNPdmVybGF5SFRNTCA9IGF3YWl0IGh0bWwyY2FudmFzKG1hcE92ZXJsYXlIVE1MLCB7XG4gICAgICBzY2FsZTogMSxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogbnVsbCxcbiAgICAgIGFsbG93VGFpbnQ6IHRydWUsXG4gICAgICB1c2VDT1JTOiB0cnVlLFxuICAgICAgaWdub3JlRWxlbWVudHM6IChlbGVtZW50OiBFbGVtZW50KSA9PiB7XG4gICAgICAgIHJldHVybiBlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnRcbiAgICAgICAgICA/IGVsZW1lbnQuY2xhc3NOYW1lLmluY2x1ZGVzKCdvbC1hdHRyaWJ1dGlvbicpXG4gICAgICAgICAgOiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChjYW52YXNPdmVybGF5SFRNTC53aWR0aCAhPT0gMCAmJiBjYW52YXNPdmVybGF5SFRNTC5oZWlnaHQgIT09IDApIHtcbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGNhbnZhc092ZXJsYXlIVE1MLCAwLCAwKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgJ21hcE92ZXJsYXlIVE1MJyBhZnRlciBnZW5lcmF0aW5nIGNhbnZhc1xuICAgIG1hcE92ZXJsYXlIVE1MLnJlbW92ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGROb3J0aEFycm93SW5Eb2MoXG4gICAgZG9jOiBqc1BERiB8IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgICBhcnJhd0NhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsXG4gICAgYmFzZU1hcmdpbnM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIGxlZ2VuZFBvc2l0aW9uOiBQcmludExlZ2VuZFBvc2l0aW9uLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgeVBvc2l0aW9uOiBudW1iZXIgPSAwXG4gICkge1xuICAgIGxldCB4UG9zaXRpb246IG51bWJlciA9IDA7XG4gICAgbGV0IG5vcnRoQXJyb3dEaW1lbnNpb246IG51bWJlciA9IDA7XG4gICAgaWYgKGRvYyBpbnN0YW5jZW9mIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCkge1xuICAgICAgbm9ydGhBcnJvd0RpbWVuc2lvbiA9IDUwO1xuICAgICAgeFBvc2l0aW9uID1cbiAgICAgICAgbGVnZW5kUG9zaXRpb24gPT09ICd0b3ByaWdodCcgPyAwIDogd2lkdGggLSBub3J0aEFycm93RGltZW5zaW9uO1xuICAgICAgZG9jLmRyYXdJbWFnZShcbiAgICAgICAgYXJyYXdDYW52YXMsXG4gICAgICAgIHhQb3NpdGlvbixcbiAgICAgICAgeVBvc2l0aW9uLFxuICAgICAgICBub3J0aEFycm93RGltZW5zaW9uLFxuICAgICAgICBub3J0aEFycm93RGltZW5zaW9uXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBub3J0aEFycm93RGltZW5zaW9uID0gMTY7XG4gICAgICB4UG9zaXRpb24gPSBsZWdlbmRQb3NpdGlvbiA9PT0gJ3RvcHJpZ2h0JyA/IDEwIDogd2lkdGggLSBiYXNlTWFyZ2luc1sxXTtcbiAgICAgIHlQb3NpdGlvbiA9IGJhc2VNYXJnaW5zWzBdO1xuICAgICAgZG9jLmFkZEltYWdlKFxuICAgICAgICBhcnJhd0NhbnZhcy50b0RhdGFVUkwoKSxcbiAgICAgICAgeFBvc2l0aW9uLFxuICAgICAgICB5UG9zaXRpb24sXG4gICAgICAgIG5vcnRoQXJyb3dEaW1lbnNpb24sXG4gICAgICAgIG5vcnRoQXJyb3dEaW1lbnNpb25cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSByb3RhdGlvbiAtIG1hcCByb3RhdGlvbiAncmFkJyB1bml0XG4gICAqXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZU5vcnRoRGlyZWN0aW9uQXJyb3coXG4gICAgcm90YXRpb246IG51bWJlclxuICApOiBQcm9taXNlPEhUTUxDYW52YXNFbGVtZW50PiB7XG4gICAgY29uc3QgZGl2ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuc3R5bGUubWF4V2lkdGggPSAnNTBtbSc7XG4gICAgZGl2LnN0eWxlLm1heEhlaWdodCA9ICc1MG1tJztcbiAgICBkaXYuc3R5bGUudGV4dEFsaWduID0gJ2NlbnRlcic7XG5cbiAgICBjb25zdCBpbWcgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgIGltZy5zcmMgPSAnLi9hc3NldHMvaWdvMi9nZW8vaW1hZ2VzL25vcnRoLWRpcmVjdGlvbi5wbmcnO1xuICAgIGltZy5zdHlsZS5tYXhXaWR0aCA9ICc1MG1tJztcbiAgICBpbWcuc3R5bGUubWF4SGVpZ2h0ID0gJzUwbW0nO1xuICAgIGltZy5zdHlsZS50cmFuc2Zvcm0gPSAncm90YXRlKCcgKyByb3RhdGlvbiArICdyYWQpJztcbiAgICBpbWcuc3R5bGUucGFkZGluZyA9ICc1bW0nO1xuICAgIGRpdi5hcHBlbmRDaGlsZChpbWcpO1xuICAgIHRoaXMuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO1xuICAgIGNvbnN0IGNhbnZhcyA9IGF3YWl0IGh0bWwyY2FudmFzKGRpdiwgeyBiYWNrZ3JvdW5kQ29sb3I6IG51bGwgfSk7XG4gICAgdGhpcy5yZW1vdmVIdG1sRWxlbWVudChkaXYpO1xuICAgIGlmIChjYW52YXMpIHtcbiAgICAgIHJldHVybiBjYW52YXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkIGFuIGltYWdlIG9mIHRoZSBtYXAgd2l0aCBhZGRpdGlvbiBvZiBpbmZvcm1hdGlvbnNcbiAgICogQHBhcmFtICBtYXAgLSBNYXAgb2YgdGhlIGFwcFxuICAgKiBAcGFyYW0gIGZvcm1hdCAtIEltYWdlIGZvcm1hdC4gZGVmYXVsdCB2YWx1ZSB0byBcInBuZ1wiXG4gICAqIEBwYXJhbSAgcHJvamVjdGlvbiAtIEluZGljYXRlIGlmIHByb2plY3Rpb24gbmVlZCB0byBiZSBhZGQuIERlZmF1bHQgdG8gZmFsc2VcbiAgICogQHBhcmFtICBzY2FsZSAtIEluZGljYXRlIGlmIHNjYWxlIG5lZWQgdG8gYmUgYWRkLiBEZWZhdWx0IHRvIGZhbHNlXG4gICAqIEBwYXJhbSAgbGVnZW5kIC0gSW5kaWNhdGUgaWYgdGhlIGxlZ2VuZCBvZiBsYXllcnMgbmVlZCB0byBiZSBkb3dubG9hZC4gRGVmYXVsdCB0byBmYWxzZVxuICAgKiBAcGFyYW0gIHRpdGxlIC0gVGl0bGUgdG8gYWRkIGZvciB0aGUgbWFwIC0gRGVmYXVsdCB0byBibGFua1xuICAgKiBAcGFyYW0gIHN1YnRpdGxlIC0gU3VidGl0bGUgdG8gYWRkIGZvciB0aGUgbWFwIC0gRGVmYXVsdCB0byBibGFua1xuICAgKiBAcGFyYW0gIGNvbW1lbnQgLSBDb21tZW50IHRvIGFkZCBmb3IgdGhlIG1hcCAtIERlZmF1bHQgdG8gYmxhbmtcbiAgICogQHBhcmFtICBkb1ppcEZpbGUgLSBJbmRpY2F0ZSBpZiB3ZSBkbyBhIHppcCB3aXRoIHRoZSBmaWxlXG4gICAqIEByZXR1cm4gSW1hZ2UgZmlsZSBvZiB0aGUgbWFwIHdpdGggZXh0ZW5zaW9uIGZvcm1hdCBnaXZlbiBhcyBwYXJhbWV0ZXJcbiAgICovXG4gIGRvd25sb2FkTWFwSW1hZ2UoXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgcHJpbnRSZXNvbHV0aW9uOiBQcmludFJlc29sdXRpb24sXG4gICAgZm9ybWF0ID0gJ3BuZycsXG4gICAgcHJvamVjdGlvbiA9IGZhbHNlLFxuICAgIHNjYWxlID0gZmFsc2UsXG4gICAgdGl0bGUgPSAnJyxcbiAgICBzdWJ0aXRsZSA9ICcnLFxuICAgIGNvbW1lbnQgPSAnJyxcbiAgICBkb1ppcEZpbGUgPSB0cnVlLFxuICAgIGxlZ2VuZFBvc2l0aW9uOiBQcmludExlZ2VuZFBvc2l0aW9uLFxuICAgIHNob3dOb3J0aEFycm93OiBib29sZWFuXG4gICkge1xuICAgIGNvbnN0IHN0YXR1cyQgPSBuZXcgU3ViamVjdCgpO1xuICAgIHRoaXMuYWN0aXZpdHlJZCA9IHRoaXMuYWN0aXZpdHlTZXJ2aWNlLnJlZ2lzdGVyKCk7XG4gICAgY29uc3QgdHJhbnNsYXRlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlO1xuICAgIGZvcm1hdCA9IGZvcm1hdC50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHJlc29sdXRpb24gPSArcHJpbnRSZXNvbHV0aW9uO1xuICAgIGNvbnN0IGluaXRpYWxNYXBTaXplID0gbWFwLm9sLmdldFNpemUoKSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICAgIGNvbnN0IHZpZXdSZXNvbHV0aW9uID0gbWFwLm9sLmdldFZpZXcoKS5nZXRSZXNvbHV0aW9uKCk7XG5cbiAgICBtYXAub2wub25jZSgncmVuZGVyY29tcGxldGUnLCBhc3luYyAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgY29uc3Qgc2l6ZSA9IG1hcC5vbC5nZXRTaXplKCk7XG4gICAgICBjb25zdCBtYXBDYW52YXMgPSBldmVudC50YXJnZXRcbiAgICAgICAgLmdldFZpZXdwb3J0KClcbiAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdjYW52YXMnKSBhcyBIVE1MQ29sbGVjdGlvbk9mPEhUTUxDYW52YXNFbGVtZW50PjtcbiAgICAgIGNvbnN0IG1hcFJlc3VsdENhbnZhcyA9IGF3YWl0IHRoaXMuZHJhd01hcChzaXplLCBtYXBDYW52YXMpO1xuXG4gICAgICB0aGlzLnJlc2V0T3JpZ2luYWxNYXBTaXplKG1hcCwgaW5pdGlhbE1hcFNpemUsIHZpZXdSZXNvbHV0aW9uKTtcblxuICAgICAgYXdhaXQgdGhpcy5kcmF3TWFwQ29udHJvbHMobWFwLCBtYXBSZXN1bHRDYW52YXMsIGxlZ2VuZFBvc2l0aW9uKTtcblxuICAgICAgLy8gQ2hlY2sgdGhlIGxlZ2VuZFBvc2l0aW9uXG4gICAgICBpZiAobGVnZW5kUG9zaXRpb24gIT09ICdub25lJykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgWyd0b3BsZWZ0JywgJ3RvcHJpZ2h0JywgJ2JvdHRvbWxlZnQnLCAnYm90dG9tcmlnaHQnXS5pbmRleE9mKFxuICAgICAgICAgICAgbGVnZW5kUG9zaXRpb25cbiAgICAgICAgICApID4gLTFcbiAgICAgICAgKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGRMZWdlbmRUb0ltYWdlKFxuICAgICAgICAgICAgbWFwUmVzdWx0Q2FudmFzLFxuICAgICAgICAgICAgbWFwLFxuICAgICAgICAgICAgcmVzb2x1dGlvbixcbiAgICAgICAgICAgIGxlZ2VuZFBvc2l0aW9uLFxuICAgICAgICAgICAgZm9ybWF0XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gJ25ld3BhZ2UnKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRMYXllcnNMZWdlbmRJbWFnZShtYXAsIGZvcm1hdCwgZG9aaXBGaWxlLCByZXNvbHV0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gYWRkIG90aGVyIGluZm9ybWF0aW9uIHRvIGZpbmFsIGNhbnZhcyBiZWZvcmUgZXhwb3J0aW5nXG4gICAgICBjb25zdCBuZXdDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRleHQgPSBuZXdDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgIC8vIFBvc3Rpb24gaW4gaGVpZ2h0IHRvIHNldCB0aGUgY2FudmFzIGluIG5ldyBjYW52YXNcbiAgICAgIGxldCBwb3NpdGlvbkhDYW52YXMgPSAwO1xuICAgICAgLy8gR2V0IGhlaWdodC93aWR0aCBvZiBtYXAgY2FudmFzXG4gICAgICBjb25zdCB3aWR0aCA9IG1hcFJlc3VsdENhbnZhcy53aWR0aDtcbiAgICAgIGxldCBoZWlnaHQgPSBtYXBSZXN1bHRDYW52YXMuaGVpZ2h0O1xuICAgICAgLy8gU2V0IEZvbnQgdG8gY2FsY3VsYXRlIGNvbW1lbnQgd2lkdGhcbiAgICAgIG5ld0NvbnRleHQuZm9udCA9ICcyMHB4IENhbGlicmknO1xuICAgICAgY29uc3QgY29tbWVudFdpZHRoID0gbmV3Q29udGV4dC5tZWFzdXJlVGV4dChjb21tZW50KS53aWR0aDtcbiAgICAgIC8vIEFkZCBoZWlnaHQgZm9yIHRpdGxlIGlmIGRlZmluZWRcbiAgICAgIGhlaWdodCA9IHRpdGxlICE9PSAnJyA/IGhlaWdodCArIDMwIDogaGVpZ2h0O1xuICAgICAgLy8gQWRkIGhlaWdodCBmb3IgdGl0bGUgaWYgZGVmaW5lZFxuICAgICAgaGVpZ2h0ID0gc3VidGl0bGUgIT09ICcnID8gaGVpZ2h0ICsgMzAgOiBoZWlnaHQ7XG4gICAgICAvLyBBZGQgaGVpZ2h0IGZvciBwcm9qZWN0aW9uIG9yIHNjYWxlIChzYW1lIGxpbmUpIGlmIGRlZmluZWRcbiAgICAgIGhlaWdodCA9IHByb2plY3Rpb24gIT09IGZhbHNlIHx8IHNjYWxlICE9PSBmYWxzZSA/IGhlaWdodCArIDMwIDogaGVpZ2h0O1xuICAgICAgY29uc3QgcG9zaXRpb25IUHJvalNjYWxlID0gaGVpZ2h0IC0gMTA7XG4gICAgICAvLyBEZWZpbmUgbnVtYmVyIG9mIGxpbmUgZGVwZW5kaW5nIG9mIHRoZSBjb21tZW50IGxlbmd0aFxuICAgICAgY29uc3QgY29tbWVudE5iTGluZSA9IE1hdGguY2VpbChjb21tZW50V2lkdGggLyB3aWR0aCk7XG4gICAgICAvLyBBZGQgaGVpZ2h0IGZvciBtdWx0aWxpbmUgY29tbWVudCBpZiBkZWZpbmVkXG4gICAgICBoZWlnaHQgPSBjb21tZW50ICE9PSAnJyA/IGhlaWdodCArIGNvbW1lbnROYkxpbmUgKiAzMCA6IGhlaWdodDtcbiAgICAgIGxldCBwb3NpdGlvbkhDb21tZW50ID0gaGVpZ2h0IC0gY29tbWVudE5iTGluZSAqIDIwICsgNTtcbiAgICAgIC8vIFNldCB0aGUgbmV3IGNhbnZhcyB3aXRoIHRoZSBuZXcgY2FsY3VsYXRlZCBzaXplXG4gICAgICBuZXdDYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgIG5ld0NhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAgIGlmIChbJ2JtcCcsICdnaWYnLCAnanBlZycsICdwbmcnLCAndGlmZiddLmluZGV4T2YoZm9ybWF0KSA+IC0xKSB7XG4gICAgICAgIC8vIFBhdGNoIEpwZWcgZGVmYXVsdCBibGFjayBiYWNrZ3JvdW5kIHRvIHdoaXRlXG4gICAgICAgIGlmIChcbiAgICAgICAgICBmb3JtYXQgPT09ICdqcGVnJyB8fFxuICAgICAgICAgIHRpdGxlICE9PSAnJyB8fFxuICAgICAgICAgIHN1YnRpdGxlICE9PSAnJyB8fFxuICAgICAgICAgIGNvbW1lbnQgIT09ICcnIHx8XG4gICAgICAgICAgcHJvamVjdGlvbiAhPT0gZmFsc2UgfHxcbiAgICAgICAgICBzY2FsZSAhPT0gZmFsc2VcbiAgICAgICAgKSB7XG4gICAgICAgICAgbmV3Q29udGV4dC5maWxsU3R5bGUgPSAnI2ZmZmZmZic7XG4gICAgICAgICAgbmV3Q29udGV4dC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICBuZXdDb250ZXh0LmZpbGxTdHlsZSA9ICcjMDAwMDAwJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gSWYgYSB0aXRsZSBuZWVkIHRvIGJlIGFkZGVkIHRvIGNhbnZhc1xuICAgICAgaWYgKHRpdGxlICE9PSAnJykge1xuICAgICAgICAvLyBTZXQgZm9udCBmb3IgdGl0bGVcbiAgICAgICAgLy8gQWRqdXN0IGFjY29yZGluZyB0byB0aXRsZSBsZW5ndGhcbiAgICAgICAgbmV3Q29udGV4dC5mb250ID0gJzI2cHggQ2FsaWJyaSc7XG4gICAgICAgIHBvc2l0aW9uSENhbnZhcyA9IDMwO1xuICAgICAgICBuZXdDb250ZXh0LnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICBuZXdDb250ZXh0LmZpbGxUZXh0KHRpdGxlLCB3aWR0aCAvIDIsIDIwLCB3aWR0aCAqIDAuOSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdWJ0aXRsZSAhPT0gJycpIHtcbiAgICAgICAgLy8gU2V0IGZvbnQgZm9yIHN1YnRpdGxlXG4gICAgICAgIC8vIEFkanVzdCBhY2NvcmRpbmcgdG8gdGl0bGUgbGVuZ3RoXG4gICAgICAgIG5ld0NvbnRleHQuZm9udCA9ICcyNnB4IENhbGlicmknO1xuICAgICAgICBwb3NpdGlvbkhDYW52YXMgPSA2MDtcbiAgICAgICAgbmV3Q29udGV4dC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dChzdWJ0aXRsZSwgd2lkdGggLyAyLCA1MCwgd2lkdGggKiAwLjkpO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgZm9udCBmb3IgbmV4dCBzZWN0aW9uXG4gICAgICBuZXdDb250ZXh0LmZvbnQgPSAnMjBweCBDYWxpYnJpJztcbiAgICAgIC8vIElmIHByb2plY3Rpb24gb3IvZW5kIHNjYWxlIG5lZWQgdG8gYmUgYWRkZWQgdG8gY2FudmFzXG4gICAgICBpZiAocHJvamVjdGlvbiAhPT0gZmFsc2UgfHwgc2NhbGUgIT09IGZhbHNlKSB7XG4gICAgICAgIGxldCBwcm9qZWN0aW9uU2NhbGVUZXh0ID0gJyc7XG4gICAgICAgIGlmIChwcm9qZWN0aW9uICE9PSBmYWxzZSkge1xuICAgICAgICAgIGNvbnN0IHByb2pUZXh0ID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8ucHJpbnRGb3JtLnByb2plY3Rpb24nKTtcbiAgICAgICAgICBwcm9qZWN0aW9uU2NhbGVUZXh0ID0gcHJvalRleHQgKyAnOiAnICsgbWFwLnByb2plY3Rpb24gKyAnICAgICAgICAgJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzY2FsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBjb25zdCBzY2FsZVRleHQgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5wcmludEZvcm0uc2NhbGUnKTtcbiAgICAgICAgICBjb25zdCBtYXBTY2FsZSA9IG1hcC52aWV3Q29udHJvbGxlci5nZXRTY2FsZShyZXNvbHV0aW9uKTtcbiAgICAgICAgICBwcm9qZWN0aW9uU2NhbGVUZXh0ICs9IHNjYWxlVGV4dCArICc6IH4gMSAvICcgKyBmb3JtYXRTY2FsZShtYXBTY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3Q29udGV4dC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dChcbiAgICAgICAgICBwcm9qZWN0aW9uU2NhbGVUZXh0LFxuICAgICAgICAgIHdpZHRoIC8gMixcbiAgICAgICAgICBwb3NpdGlvbkhQcm9qU2NhbGUsXG4gICAgICAgICAgd2lkdGggKiAwLjlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgYSBjb21tZW50IG5lZWQgdG8gYmUgYWRkZWQgdG8gY2FudmFzXG4gICAgICBpZiAoY29tbWVudCAhPT0gJycpIHtcbiAgICAgICAgbmV3Q29udGV4dC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgLy8gSWYgb25seSBvbmUgbGluZSwgbm8gbmVlZCB0byBtdWx0aWxpbmUgdGhlIGNvbW1lbnRcbiAgICAgICAgaWYgKGNvbW1lbnROYkxpbmUgPT09IDEpIHtcbiAgICAgICAgICBuZXdDb250ZXh0LmZpbGxUZXh0KGNvbW1lbnQsIHdpZHRoIC8gMiwgcG9zaXRpb25IQ29tbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2VwYXJhdGUgdGhlIHNldGVuc2VzIHRvIGJlIGFwcHJveC4gdGhlIHNhbWUgbGVuZ3RoXG4gICAgICAgICAgY29uc3QgbmJDb21tZW50Q2hhciA9IGNvbW1lbnQubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IENvbW1lbnRMZW5ndGhUb0N1dCA9IE1hdGguZmxvb3IobmJDb21tZW50Q2hhciAvIGNvbW1lbnROYkxpbmUpO1xuICAgICAgICAgIGxldCBjb21tZW50Q3VycmVudExpbmUgPSAnJztcbiAgICAgICAgICBsZXQgcG9zaXRpb25GaXJzdEN1dENoYXIgPSAwO1xuICAgICAgICAgIGxldCBwb3NpdGlvbkxhc3RCbGFuaztcbiAgICAgICAgICAvLyBMb29wIGZvciB0aGUgbnVtYmVyIG9mIGxpbmUgY2FsY3VsYXRlZFxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWVudE5iTGluZTsgaSsrKSB7XG4gICAgICAgICAgICAvLyBGb3IgYWxsIGxpbmUgZXhjZXB0IGxhc3RcbiAgICAgICAgICAgIGlmIChjb21tZW50TmJMaW5lIC0gMSA+IGkpIHtcbiAgICAgICAgICAgICAgLy8gR2V0IGNvbW1lbnQgY3VycmVudCBsaW5lIHRvIGZpbmQgdGhlIHJpZ2h0IHBsYWNlIHR1IGN1dCBjb21tZW50XG4gICAgICAgICAgICAgIGNvbW1lbnRDdXJyZW50TGluZSA9IGNvbW1lbnQuc3Vic3RyKFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uRmlyc3RDdXRDaGFyLFxuICAgICAgICAgICAgICAgIENvbW1lbnRMZW5ndGhUb0N1dFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvLyBDdXQgdGhlIHNldGVuY2UgYXQgYmxhbmtcbiAgICAgICAgICAgICAgcG9zaXRpb25MYXN0QmxhbmsgPSBjb21tZW50Q3VycmVudExpbmUubGFzdEluZGV4T2YoJyAnKTtcbiAgICAgICAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dChcbiAgICAgICAgICAgICAgICBjb21tZW50Q3VycmVudExpbmUuc3Vic3RyKDAsIHBvc2l0aW9uTGFzdEJsYW5rKSxcbiAgICAgICAgICAgICAgICB3aWR0aCAvIDIsXG4gICAgICAgICAgICAgICAgcG9zaXRpb25IQ29tbWVudFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBwb3NpdGlvbkZpcnN0Q3V0Q2hhciArPSBwb3NpdGlvbkxhc3RCbGFuaztcbiAgICAgICAgICAgICAgLy8gR28gdG8gbmV4dCBsaW5lIGZvciBpbnNlcnRpb25cbiAgICAgICAgICAgICAgcG9zaXRpb25IQ29tbWVudCArPSAyMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIERvbid0IGN1dCBsYXN0IHBhcnRcbiAgICAgICAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dChcbiAgICAgICAgICAgICAgICBjb21tZW50LnN1YnN0cihwb3NpdGlvbkZpcnN0Q3V0Q2hhciksXG4gICAgICAgICAgICAgICAgd2lkdGggLyAyLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uSENvbW1lbnRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbmV3Q29udGV4dC5kcmF3SW1hZ2UobWFwUmVzdWx0Q2FudmFzLCAwLCBwb3NpdGlvbkhDYW52YXMpO1xuXG4gICAgICBpZiAoc2hvd05vcnRoQXJyb3cpIHtcbiAgICAgICAgY29uc3Qgbm9ydGhBcnJvd0NhbnZhcyA9IGF3YWl0IHRoaXMuY3JlYXRlTm9ydGhEaXJlY3Rpb25BcnJvdyhcbiAgICAgICAgICBtYXAudmlld0NvbnRyb2xsZXIuZ2V0Um90YXRpb24oKVxuICAgICAgICApO1xuICAgICAgICBhd2FpdCB0aGlzLmFkZE5vcnRoQXJyb3dJbkRvYyhcbiAgICAgICAgICBuZXdDb250ZXh0LFxuICAgICAgICAgIG5vcnRoQXJyb3dDYW52YXMsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBsZWdlbmRQb3NpdGlvbixcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBwb3NpdGlvbkhDYW52YXNcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRG9uZTtcbiAgICAgIGxldCBmaWxlTmFtZVdpdGhFeHQgPSAnbWFwLicgKyBmb3JtYXQ7XG4gICAgICBpZiAoZm9ybWF0LnRvTG93ZXJDYXNlKCkgPT09ICd0aWZmJykge1xuICAgICAgICBmaWxlTmFtZVdpdGhFeHQgPVxuICAgICAgICAgICdtYXAnICsgbWFwLnByb2plY3Rpb24ucmVwbGFjZSgnOicsICdfJykgKyAnLicgKyBmb3JtYXQ7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFNhdmUgdGhlIGNhbnZhcyBhcyBmaWxlXG4gICAgICAgIGlmICghZG9aaXBGaWxlKSB7XG4gICAgICAgICAgdGhpcy5zYXZlQ2FudmFzSW1hZ2VBc0ZpbGUobmV3Q2FudmFzLCBmaWxlTmFtZVdpdGhFeHQsIGZvcm1hdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0LnRvTG93ZXJDYXNlKCkgPT09ICd0aWZmJykge1xuICAgICAgICAgIC8vIEFkZCB0aGUgY2FudmFzIHRvIHppcFxuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVDYW52YUZpbGVUb1ppcChuZXdDYW52YXMsIGZpbGVOYW1lV2l0aEV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQWRkIHRoZSBjYW52YXMgdG8gemlwXG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbnZhRmlsZVRvWmlwKG5ld0NhbnZhcywgZmlsZU5hbWVXaXRoRXh0KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRXJyb3I7XG4gICAgICB9XG4gICAgICBzdGF0dXMkLm5leHQoc3RhdHVzKTtcblxuICAgICAgaWYgKGZvcm1hdC50b0xvd2VyQ2FzZSgpID09PSAndGlmZicpIHtcbiAgICAgICAgY29uc3QgdGZ3RmlsZU5hbWVXaXRoRXh0ID1cbiAgICAgICAgICBmaWxlTmFtZVdpdGhFeHQuc3Vic3RyaW5nKFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGZpbGVOYW1lV2l0aEV4dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJy50aWZmJylcbiAgICAgICAgICApICsgJy50ZncnO1xuICAgICAgICBjb25zdCB0aXdDb250ZW50ID0gdGhpcy5nZXRXb3JsZEZpbGVJbmZvcm1hdGlvbihtYXApO1xuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3Rpd0NvbnRlbnRdLCB7XG4gICAgICAgICAgdHlwZTogJ3RleHQvcGxhaW47Y2hhcnNldD11dGYtOCdcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZG9aaXBGaWxlKSB7XG4gICAgICAgICAgLy8gc2F2ZUFzIGF1dG9tYXRpY2x5IHJlcGxhY2UgJzonIGZvciAnXydcbiAgICAgICAgICBzYXZlQXMoYmxvYiwgdGZ3RmlsZU5hbWVXaXRoRXh0KTtcbiAgICAgICAgICB0aGlzLnNhdmVGaWxlUHJvY2Vzc2luZygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFkZCB0aGUgY2FudmFzIHRvIHppcFxuICAgICAgICAgIHRoaXMuYWRkRmlsZVRvWmlwKHRmd0ZpbGVOYW1lV2l0aEV4dCwgYmxvYik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuc2V0TWFwSW1hZ2VSZXNvbHV0aW9uKG1hcCwgaW5pdGlhbE1hcFNpemUsIHJlc29sdXRpb24sIHZpZXdSZXNvbHV0aW9uKTtcblxuICAgIHJldHVybiBzdGF0dXMkO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRNYXBJbWFnZVJlc29sdXRpb24oXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgaW5pdGlhbE1hcFNpemU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyLFxuICAgIHZpZXdSZXNvbHV0aW9uOiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgc2NhbGVGYWN0b3IgPSByZXNvbHV0aW9uIC8gOTY7XG4gICAgY29uc3QgbmV3TWFwU2l6ZSA9IFtcbiAgICAgIE1hdGgucm91bmQoaW5pdGlhbE1hcFNpemVbMF0gKiBzY2FsZUZhY3RvciksIC8vIHdpZHRoXG4gICAgICBNYXRoLnJvdW5kKGluaXRpYWxNYXBTaXplWzFdICogc2NhbGVGYWN0b3IpIC8vIGhlaWdodFxuICAgIF07XG4gICAgbWFwLm9sLnNldFNpemUobmV3TWFwU2l6ZSk7XG4gICAgY29uc3Qgc2NhbGluZyA9IE1hdGgubWluKFxuICAgICAgbmV3TWFwU2l6ZVswXSAvIGluaXRpYWxNYXBTaXplWzBdLFxuICAgICAgbmV3TWFwU2l6ZVsxXSAvIGluaXRpYWxNYXBTaXplWzFdXG4gICAgKTtcbiAgICBjb25zdCB2aWV3ID0gbWFwLm9sLmdldFZpZXcoKTtcbiAgICB2aWV3LnNldFJlc29sdXRpb24odmlld1Jlc29sdXRpb24gLyBzY2FsaW5nKTtcbiAgICBtYXAub2wucmVuZGVyU3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbmQgQWRkIExlZ2VuZCB0byB0aGUgbWFwIGNhbnZhc1xuICAgKiBAcGFyYW0gIGNhbnZhcyBDYW52YXMgb2YgdGhlIG1hcFxuICAgKiBAcGFyYW0gIG1hcCBNYXAgb2YgdGhlIGFwcFxuICAgKiBAcGFyYW0gIHJlc29sdXRpb24gUmVzb2x1dGlvbiBvZiBtYXBcbiAgICogQHBhcmFtICBsZWdlbmRQb3NpdGlvbiBMZWdlbmQgcG9zaXRpb25cbiAgICogQHBhcmFtICBmb3JtYXQgSW1hZ2UgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFkZExlZ2VuZFRvSW1hZ2UoXG4gICAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCxcbiAgICBtYXA6IElnb01hcCxcbiAgICByZXNvbHV0aW9uOiBudW1iZXIsXG4gICAgbGVnZW5kUG9zaXRpb246IHN0cmluZyxcbiAgICBmb3JtYXQ6IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCBmaWxlTmFtZVdpdGhFeHQgPSAnbWFwLicgKyBmb3JtYXQ7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgLy8gR2V0IGh0bWwgY29kZSBmb3IgdGhlIGxlZ2VuZFxuICAgIGNvbnN0IGh0bWwgPSBhd2FpdCB0aGlzLmdldExheWVyc0xlZ2VuZEh0bWwoXG4gICAgICBtYXAsXG4gICAgICBjYW52YXMud2lkdGgsXG4gICAgICByZXNvbHV0aW9uXG4gICAgKS50b1Byb21pc2UoKTtcbiAgICAvLyBJZiBubyBsZWdlbmQsIHNhdmUgdGhlIG1hcCBkaXJlY3RseVxuICAgIGlmIChodG1sID09PSAnJykge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlQ2FudmFzSW1hZ2VBc0ZpbGUoY2FudmFzLCBmaWxlTmFtZVdpdGhFeHQsIGZvcm1hdCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gQ3JlYXRlIGRpdiB0byBjb250YWluIGh0bWwgY29kZSBmb3IgbGVnZW5kXG4gICAgY29uc3QgZGl2ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgZGl2LnN0eWxlLnRvcCA9ICcwJztcbiAgICBkaXYuc3R5bGUuekluZGV4ID0gJy0xJztcbiAgICAvLyBBZGQgaHRtbCBjb2RlIHRvIGNvbnZlcnQgaW4gdGhlIG5ldyB3aW5kb3dcbiAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO1xuICAgIGRpdi5pbm5lckhUTUwgPSBodG1sO1xuICAgIGF3YWl0IHRoaXMudGltZW91dCgxKTtcbiAgICBjb25zdCBjYW52YXNMZWdlbmQgPSBhd2FpdCBodG1sMmNhbnZhcyhkaXYsIHsgdXNlQ09SUzogdHJ1ZSB9KS5jYXRjaChcbiAgICAgIChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBpZiAoY2FudmFzTGVnZW5kKSB7XG4gICAgICBjb25zdCBjYW52YXNIZWlnaHQgPSBjYW52YXMuaGVpZ2h0O1xuICAgICAgY29uc3QgY2FudmFzV2lkdGggPSBjYW52YXMud2lkdGg7XG4gICAgICBjb25zdCBsZWdlbmRIZWlnaHQgPSBjYW52YXNMZWdlbmQuaGVpZ2h0O1xuICAgICAgY29uc3QgbGVnZW5kV2lkdGggPSBjYW52YXNMZWdlbmQud2lkdGg7XG4gICAgICAvLyBNb3ZlIHRoZSBsZWdlbmQgdG8gdGhlIGNvcnJlY3QgcG9zaXRpb24gb24gdGhlIHBhZ2VcbiAgICAgIGNvbnN0IG9mZnNldCA9IGNhbnZhc0hlaWdodCAqIDAuMDE7XG4gICAgICBsZXQgbGVnZW5kWDogbnVtYmVyO1xuICAgICAgbGV0IGxlZ2VuZFk6IG51bWJlcjtcblxuICAgICAgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAnYm90dG9tcmlnaHQnKSB7XG4gICAgICAgIGxlZ2VuZFggPSBjYW52YXNXaWR0aCAtIGxlZ2VuZFdpZHRoIC0gb2Zmc2V0O1xuICAgICAgICBsZWdlbmRZID0gY2FudmFzSGVpZ2h0IC0gbGVnZW5kSGVpZ2h0IC0gb2Zmc2V0O1xuICAgICAgfSBlbHNlIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gJ3RvcHJpZ2h0Jykge1xuICAgICAgICBsZWdlbmRYID0gY2FudmFzV2lkdGggLSBsZWdlbmRXaWR0aCAtIG9mZnNldDtcbiAgICAgICAgbGVnZW5kWSA9IG9mZnNldDtcbiAgICAgIH0gZWxzZSBpZiAobGVnZW5kUG9zaXRpb24gPT09ICdib3R0b21sZWZ0Jykge1xuICAgICAgICBsZWdlbmRYID0gb2Zmc2V0O1xuICAgICAgICBsZWdlbmRZID0gY2FudmFzSGVpZ2h0IC0gbGVnZW5kSGVpZ2h0IC0gb2Zmc2V0IC0gMTU7XG4gICAgICB9IGVsc2UgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAndG9wbGVmdCcpIHtcbiAgICAgICAgbGVnZW5kWCA9IG9mZnNldDtcbiAgICAgICAgbGVnZW5kWSA9IG9mZnNldDtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5kcmF3SW1hZ2UoXG4gICAgICAgIGNhbnZhc0xlZ2VuZCxcbiAgICAgICAgbGVnZW5kWCxcbiAgICAgICAgbGVnZW5kWSxcbiAgICAgICAgbGVnZW5kV2lkdGgsXG4gICAgICAgIGxlZ2VuZEhlaWdodFxuICAgICAgKTtcbiAgICAgIGNvbnRleHQuc3Ryb2tlUmVjdChsZWdlbmRYLCBsZWdlbmRZLCBsZWdlbmRXaWR0aCwgbGVnZW5kSGVpZ2h0KTtcbiAgICAgIHRoaXMucmVtb3ZlSHRtbEVsZW1lbnQoZGl2KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyTWFwKG1hcCwgc2l6ZSwgZXh0ZW50KSB7XG4gICAgbWFwLm9sLnVwZGF0ZVNpemUoKTtcbiAgICBtYXAub2wucmVuZGVyU3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgZG9jdW1lbnRcbiAgICogQHBhcmFtICBkb2MgLSBEb2N1bWVudCB0byBzYXZlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZURvYyhkb2M6IGpzUERGKSB7XG4gICAgYXdhaXQgZG9jLnNhdmUoJ21hcF9nZW9yZWYucGRmJywgeyByZXR1cm5Qcm9taXNlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgYmVzdCBJbWFnZSBzaXplIHRvIGZpdCBpbiBwZGZcbiAgICogQHBhcmFtIGRvYyAtIFBkZiBEb2N1bWVudFxuICAgKiBAcGFyYW0gY2FudmFzIC0gQ2FudmFzIG9mIGltYWdlXG4gICAqIEBwYXJhbSBtYXJnaW5zIC0gUGFnZSBtYXJnaW5zXG4gICAqL1xuICBnZXRJbWFnZVNpemVUb0ZpdFBkZihkb2MsIGNhbnZhcywgbWFyZ2lucykge1xuICAgIC8vIERlZmluZSB2YXJpYWJsZSB0byBjYWxjdWxhdGUgYmVzdCBzaXplIHRvIGZpdCBpbiBvbmUgcGFnZVxuICAgIGNvbnN0IHBhZ2VIZWlnaHQgPVxuICAgICAgZG9jLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpIC0gKG1hcmdpbnNbMF0gKyBtYXJnaW5zWzJdKTtcbiAgICBjb25zdCBwYWdlV2lkdGggPVxuICAgICAgZG9jLmludGVybmFsLnBhZ2VTaXplLmdldFdpZHRoKCkgLSAobWFyZ2luc1sxXSArIG1hcmdpbnNbM10pO1xuICAgIGNvbnN0IGNhbkhlaWdodCA9IHRoaXMucGRmX3VuaXRzMnBvaW50cyhjYW52YXMuaGVpZ2h0LCAnbW0nKTtcbiAgICBjb25zdCBjYW5XaWR0aCA9IHRoaXMucGRmX3VuaXRzMnBvaW50cyhjYW52YXMud2lkdGgsICdtbScpO1xuXG4gICAgY29uc3QgaGVpZ2h0UmF0aW8gPSBjYW5IZWlnaHQgLyBwYWdlSGVpZ2h0O1xuICAgIGNvbnN0IHdpZHRoUmF0aW8gPSBjYW5XaWR0aCAvIHBhZ2VXaWR0aDtcbiAgICBjb25zdCBtYXhSYXRpbyA9IGhlaWdodFJhdGlvID4gd2lkdGhSYXRpbyA/IGhlaWdodFJhdGlvIDogd2lkdGhSYXRpbztcbiAgICBjb25zdCBpbWdIZWlnaCA9IG1heFJhdGlvID4gMSA/IGNhbkhlaWdodCAvIG1heFJhdGlvIDogY2FuSGVpZ2h0O1xuICAgIGNvbnN0IGltZ1dpZHRoID0gbWF4UmF0aW8gPiAxID8gY2FuV2lkdGggLyBtYXhSYXRpbyA6IGNhbldpZHRoO1xuICAgIHJldHVybiBbaW1nV2lkdGgsIGltZ0hlaWdoXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB3b3JsZCBmaWxlIGluZm9ybWF0aW9uIGZvciB0aWZmXG4gICAqIEBwYXJhbSAgbWFwIC0gTWFwIG9mIHRoZSBhcHBcbiAgICovXG4gIHByaXZhdGUgZ2V0V29ybGRGaWxlSW5mb3JtYXRpb24obWFwKSB7XG4gICAgY29uc3QgY3VycmVudFJlc29sdXRpb24gPSBtYXAudmlld0NvbnRyb2xsZXIuZ2V0UmVzb2x1dGlvbigpO1xuICAgIGNvbnN0IGN1cnJlbnRFeHRlbnQgPSBtYXAudmlld0NvbnRyb2xsZXIuZ2V0RXh0ZW50KCk7IC8vIFJldHVybiBbbWlueCwgbWlueSwgbWF4eCwgbWF4eV1cbiAgICByZXR1cm4gW1xuICAgICAgY3VycmVudFJlc29sdXRpb24sXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC1jdXJyZW50UmVzb2x1dGlvbixcbiAgICAgIGN1cnJlbnRFeHRlbnRbMF0gKyBjdXJyZW50UmVzb2x1dGlvbiAvIDAuNSxcbiAgICAgIGN1cnJlbnRFeHRlbnRbM10gLSBjdXJyZW50UmVzb2x1dGlvbiAvIDAuNVxuICAgIF0uam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBjYW52YXMgaW1hZ2UgYXMgZmlsZVxuICAgKiBAcGFyYW0gY2FudmFzIC0gQ2FudmFzIHRvIHNhdmVcbiAgICogQHBhcmFtIG5hbWUgLSBOYW1lIG9mIHRoZSBmaWxlXG4gICAqIEBwYXJhbSBmb3JtYXQgLSBmaWxlIGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSBzYXZlQ2FudmFzSW1hZ2VBc0ZpbGUoY2FudmFzLCBuYW1lV2l0aEV4dCwgZm9ybWF0KSB7XG4gICAgY29uc3QgYmxvYkZvcm1hdCA9ICdpbWFnZS8nICsgZm9ybWF0O1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNhbnZhcy50b0RhdGFVUkwoKTsgLy8gSnVzdCB0byBtYWtlIHRoZSBjYXRjaCB0cmlnZ2VyIHdpaHRvdXQgdG9CbG9iIEVycm9yIHRocm93IG5vdCBjYXRjaGVkXG4gICAgICBjYW52YXMudG9CbG9iKChibG9iKSA9PiB7XG4gICAgICAgIC8vIGRvd25sb2FkIGltYWdlXG4gICAgICAgIHNhdmVBcyhibG9iLCBuYW1lV2l0aEV4dCk7XG4gICAgICAgIHRoYXQuc2F2ZUZpbGVQcm9jZXNzaW5nKCk7XG4gICAgICB9LCBibG9iRm9ybWF0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoXG4gICAgICAgICdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlQm9keScsXG4gICAgICAgICdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlSGVhZGVyJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGZpbGUgdG8gYSB6aXBcbiAgICogQHBhcmFtIGNhbnZhcyAtIEZpbGUgdG8gYWRkIHRvIHRoZSB6aXBcbiAgICogQHBhcmFtICBuYW1lIC1OYW1lIG9mIHRoZSBmaWxlb3ZlcnZpZXdcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVDYW52YUZpbGVUb1ppcChjYW52YXMsIG5hbWUpIHtcbiAgICBjb25zdCBibG9iRm9ybWF0ID0gJ2ltYWdlLycgKyAnanBlZyc7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaGFzT3duUHJvcGVydHkoJ3ppcEZpbGUnKSB8fFxuICAgICAgdHlwZW9mIHRoaXMuemlwRmlsZSA9PT0gJ3VuZGVmaW5lZCdcbiAgICApIHtcbiAgICAgIHRoaXMuemlwRmlsZSA9IG5ldyBKU1ppcCgpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjYW52YXMudG9EYXRhVVJMKCk7IC8vIEp1c3QgdG8gbWFrZSB0aGUgY2F0Y2ggdHJpZ2dlciB3aWh0b3V0IHRvQmxvYiBFcnJvciB0aHJvdyBub3QgY2F0Y2hlZFxuICAgICAgaWYgKG5hdmlnYXRvci5tc1NhdmVCbG9iKSB7XG4gICAgICAgIHRoaXMuYWRkRmlsZVRvWmlwKG5hbWUsIGNhbnZhcy5tc1RvQmxvYigpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbnZhcy50b0Jsb2IoKGJsb2IpID0+IHtcbiAgICAgICAgICB0aGF0LmFkZEZpbGVUb1ppcChuYW1lLCBibG9iKTtcbiAgICAgICAgfSwgYmxvYkZvcm1hdCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmVycm9yKFxuICAgICAgICAnaWdvLmdlby5wcmludEZvcm0uY29yc0Vycm9yTWVzc2FnZUJvZHknLFxuICAgICAgICAnaWdvLmdlby5wcmludEZvcm0uY29yc0Vycm9yTWVzc2FnZUhlYWRlcidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBmaWxlIHRvIHppcCwgaWYgYWxsIGZpbGUgYXJlIHppcHBlZCwgZG93bmxvYWRcbiAgICogQHBhcmFtIG5hbWUgLSBOYW1lIG9mIHRoZSBmaWxlc1xuICAgKiBAcGFyYW0gYmxvYiAtIENvbnRhaW4gb2YgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhZGRGaWxlVG9aaXAobmFtZSwgYmxvYikge1xuICAgIC8vIGFkZCBmaWxlIHRvIHppcFxuICAgIHRoaXMuemlwRmlsZS5maWxlKG5hbWUsIGJsb2IpO1xuICAgIHRoaXMubmJGaWxlVG9Qcm9jZXNzLS07XG5cbiAgICAvLyBJZiBhbGwgZmlsZXMgYXJlIHByb2NjZXNzZWRcbiAgICBpZiAodGhpcy5uYkZpbGVUb1Byb2Nlc3MgPT09IDApIHtcbiAgICAgIC8vIERvd25sb2FkIHppcCBmaWxlXG4gICAgICB0aGlzLmdldFppcEZpbGUoKTtcbiAgICAgIC8vIFN0b3AgbG9hZGluZ1xuICAgICAgdGhpcy5hY3Rpdml0eVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLmFjdGl2aXR5SWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2F2ZUZpbGVQcm9jZXNzaW5nKCkge1xuICAgIHRoaXMubmJGaWxlVG9Qcm9jZXNzLS07XG5cbiAgICAvLyBJZiBhbGwgZmlsZXMgYXJlIHByb2NjZXNzZWRcbiAgICBpZiAodGhpcy5uYkZpbGVUb1Byb2Nlc3MgPT09IDApIHtcbiAgICAgIC8vIFN0b3AgbG9hZGluZ1xuICAgICAgdGhpcy5hY3Rpdml0eVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLmFjdGl2aXR5SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHppcHBlZCBmaWxlXG4gICAqIEByZXR1cm4gUmV0dW4gYSB6aXAgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRaaXBGaWxlKCkge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgIHRoaXMuemlwRmlsZS5nZW5lcmF0ZUFzeW5jKHsgdHlwZTogJ2Jsb2InIH0pLnRoZW4oKGJsb2IpID0+IHtcbiAgICAgIC8vIDEpIGdlbmVyYXRlIHRoZSB6aXAgZmlsZVxuICAgICAgc2F2ZUFzKGJsb2IsICdtYXAuemlwJyk7XG4gICAgICBkZWxldGUgdGhhdC56aXBGaWxlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBwZGZfdW5pdHMycG9pbnRzKG4sIHVuaXQpOiBudW1iZXIge1xuICAgIGxldCBrID0gMTtcblxuICAgIC8vIHRoaXMgY29kZSBpcyBib3Jyb3dlZCBmcm9tIGpzUERGXG4gICAgLy8gIGFzIGl0IGRvZXMgbm90IGV4cG9zZSBhIHB1YmxpYyBBUElcbiAgICAvLyAgZm9yIGNvbnZlcnRpbmcgdW5pdHMgdG8gcG9pbnRzLlxuICAgIHN3aXRjaCAodW5pdCkge1xuICAgICAgY2FzZSAncHQnOlxuICAgICAgICBrID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtbSc6XG4gICAgICAgIGsgPSA3MiAvIDI1LjQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY20nOlxuICAgICAgICBrID0gNzIgLyAyLjU0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2luJzpcbiAgICAgICAgayA9IDcyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3B4JzpcbiAgICAgICAgayA9IDk2IC8gNzI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncGMnOlxuICAgICAgICBrID0gMTI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZW0nOlxuICAgICAgICBrID0gMTI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXgnOlxuICAgICAgICBrID0gNjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdW5pdDogJyArIHVuaXQpO1xuICAgIH1cblxuICAgIHJldHVybiBuICogaztcbiAgfVxufVxuIl19
|