@igo2/geo 18.0.0-next.9 → 18.0.0
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/esm2022/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +4 -6
- package/esm2022/lib/catalog/catalog-browser/catalog-browser.component.mjs +13 -10
- package/esm2022/lib/datasource/shared/capabilities.service.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/datasource.mjs +2 -1
- package/esm2022/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/wms-datasource.interface.mjs +1 -1
- package/esm2022/lib/directions/directions-buttons/directions-buttons.component.mjs +151 -102
- package/esm2022/lib/directions/directions-inputs/directions-inputs.component.mjs +177 -83
- package/esm2022/lib/directions/directions-results/directions-results.component.mjs +93 -44
- package/esm2022/lib/directions/directions-sources/directions-source.mjs +1 -1
- package/esm2022/lib/directions/directions-sources/osrm-directions-source.mjs +1 -1
- package/esm2022/lib/directions/directions.component.mjs +55 -31
- package/esm2022/lib/directions/shared/directions.enum.mjs +51 -7
- package/esm2022/lib/directions/shared/directions.interface.mjs +1 -1
- package/esm2022/lib/directions/shared/directions.service.mjs +122 -96
- package/esm2022/lib/directions/shared/directions.utils.mjs +281 -318
- package/esm2022/lib/directions/shared/store.mjs +2 -2
- package/esm2022/lib/download/download-button/download-button.component.mjs +8 -20
- package/esm2022/lib/download/shared/download.service.mjs +1 -1
- package/esm2022/lib/draw/draw/draw-popup.component.mjs +1 -1
- package/esm2022/lib/draw/draw/draw.component.mjs +5 -12
- package/esm2022/lib/draw/shared/draw.utils.mjs +1 -1
- package/esm2022/lib/environment/environment.interface.mjs +1 -1
- package/esm2022/lib/feature/feature-details/feature-details.component.mjs +2 -2
- package/esm2022/lib/feature/shared/feature-store.utils.mjs +7 -6
- package/esm2022/lib/feature/shared/feature.interfaces.mjs +1 -1
- package/esm2022/lib/feature/shared/store.mjs +1 -1
- package/esm2022/lib/feature/shared/strategies/geo-properties.mjs +3 -3
- package/esm2022/lib/feature/shared/strategies/in-map-extent.mjs +7 -4
- package/esm2022/lib/feature/shared/strategies/selection.mjs +5 -4
- package/esm2022/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +3 -3
- package/esm2022/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +2 -2
- package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +5 -3
- package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +1 -1
- package/esm2022/lib/filter/shared/filterable-datasource.pipe.mjs +8 -1
- package/esm2022/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +1 -1
- package/esm2022/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +2 -8
- package/esm2022/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +2 -8
- package/esm2022/lib/filter/time-filter-button/time-filter-button.component.mjs +2 -2
- package/esm2022/lib/filter/time-filter-form/time-filter-form.component.mjs +13 -10
- package/esm2022/lib/filter/time-filter-item/time-filter-item.component.mjs +2 -2
- package/esm2022/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +4 -2
- package/esm2022/lib/filter/time-filter-list/time-filter-list.component.mjs +5 -16
- package/esm2022/lib/import-export/export-button/export-button.component.mjs +4 -17
- package/esm2022/lib/import-export/import-export/import-export.component.mjs +23 -12
- package/esm2022/lib/import-export/shared/export.service.mjs +7 -4
- package/esm2022/lib/import-export/shared/import.utils.mjs +3 -3
- package/esm2022/lib/layer/index.mjs +10 -5
- package/esm2022/lib/layer/layer-group/index.mjs +2 -0
- package/esm2022/lib/layer/layer-group/layer-group.component.mjs +103 -0
- package/esm2022/lib/layer/layer-item/layer-item.component.mjs +76 -161
- package/esm2022/lib/layer/layer-legend/layer-legend.component.mjs +5 -8
- package/esm2022/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +5 -6
- package/esm2022/lib/layer/layer-legend-list/layer-legend-list.component.mjs +14 -21
- package/esm2022/lib/layer/layer-list/index.mjs +1 -3
- package/esm2022/lib/layer/layer-list/layer-list.component.mjs +176 -785
- package/esm2022/lib/layer/layer-list-tool/index.mjs +1 -2
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.component.mjs +51 -84
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +7 -2
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.service.mjs +56 -16
- package/esm2022/lib/layer/layer-search/index.mjs +2 -0
- package/esm2022/lib/layer/layer-search/layer-search.component.mjs +65 -0
- package/esm2022/lib/layer/layer-unavailable/index.mjs +3 -0
- package/esm2022/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.mjs +25 -0
- package/esm2022/lib/layer/layer-unavailable/layer-unavailable.component.mjs +35 -0
- package/esm2022/lib/layer/layer-viewer/index.mjs +3 -0
- package/esm2022/lib/layer/layer-viewer/layer-viewer.component.mjs +226 -0
- package/esm2022/lib/layer/layer-viewer/layer-viewer.interface.mjs +2 -0
- package/esm2022/lib/layer/layer-viewer-bottom-actions/index.mjs +2 -0
- package/esm2022/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.mjs +207 -0
- package/esm2022/lib/layer/layer-visibility-button/index.mjs +2 -0
- package/esm2022/lib/layer/layer-visibility-button/layer-visibility-button.component.mjs +83 -0
- package/esm2022/lib/layer/layer.module.mjs +51 -33
- package/esm2022/lib/layer/shared/index.mjs +2 -1
- package/esm2022/lib/layer/shared/layer-controller.mjs +316 -0
- package/esm2022/lib/layer/shared/layer-selection.mjs +38 -0
- package/esm2022/lib/layer/shared/layer.service.mjs +31 -16
- package/esm2022/lib/layer/shared/layers/any-layer.interface.mjs +1 -1
- package/esm2022/lib/layer/shared/layers/any-layer.mjs +1 -1
- package/esm2022/lib/layer/shared/layers/image-layer.interface.mjs +1 -1
- package/esm2022/lib/layer/shared/layers/image-layer.mjs +8 -3
- package/esm2022/lib/layer/shared/layers/index.mjs +6 -1
- package/esm2022/lib/layer/shared/layers/layer-base.mjs +199 -0
- package/esm2022/lib/layer/shared/layers/layer-group.interface.mjs +2 -0
- package/esm2022/lib/layer/shared/layers/layer-group.mjs +120 -0
- package/esm2022/lib/layer/shared/layers/layer.interface.mjs +1 -11
- package/esm2022/lib/layer/shared/layers/layer.mjs +108 -117
- package/esm2022/lib/layer/shared/layers/linked/index.mjs +4 -0
- package/esm2022/lib/layer/shared/layers/linked/linked-layer.interface.mjs +12 -0
- package/esm2022/lib/layer/shared/layers/linked/linked-layer.mjs +242 -0
- package/esm2022/lib/layer/shared/layers/linked/linked-layer.utils.mjs +70 -0
- package/esm2022/lib/layer/shared/layers/tile-layer.mjs +8 -3
- package/esm2022/lib/layer/shared/layers/vector-layer.mjs +9 -3
- package/esm2022/lib/layer/shared/layers/vectortile-layer.mjs +8 -3
- package/esm2022/lib/layer/utils/layer.utils.mjs +47 -1
- package/esm2022/lib/layer/utils/outputLegend.mjs +5 -1
- package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +3 -3
- package/esm2022/lib/map/baselayers-switcher/mini-basemap.component.mjs +8 -6
- package/esm2022/lib/map/map-center/map-center.component.mjs +1 -2
- package/esm2022/lib/map/shared/controllers/geolocation.interface.mjs +1 -1
- package/esm2022/lib/map/shared/controllers/view.mjs +1 -1
- package/esm2022/lib/map/shared/hover-feature.directive.mjs +1 -9
- package/esm2022/lib/map/shared/linkedLayers.utils.mjs +113 -123
- package/esm2022/lib/map/shared/map.abstract.mjs +4 -3
- package/esm2022/lib/map/shared/map.mjs +7 -243
- package/esm2022/lib/map/shared/map.service.mjs +1 -1
- package/esm2022/lib/map/shared/map.utils.mjs +3 -3
- package/esm2022/lib/map/shared/mapOffline.directive.mjs +9 -5
- package/esm2022/lib/map/swipe-control/swipe-control.component.mjs +1 -3
- package/esm2022/lib/map/utils/index.mjs +2 -0
- package/esm2022/lib/map/utils/layer-watcher.mjs +45 -13
- package/esm2022/lib/measure/measurer/measurer.component.mjs +7 -25
- package/esm2022/lib/metadata/metadata-button/metadata-button.component.mjs +6 -18
- package/esm2022/lib/offline/offline.provider.mjs +10 -11
- package/esm2022/lib/print/shared/print.service.mjs +3 -3
- package/esm2022/lib/query/shared/query.directive.mjs +9 -5
- package/esm2022/lib/query/shared/query.service.mjs +7 -7
- package/esm2022/lib/query/shared/query.utils.mjs +5 -1
- package/esm2022/lib/search/search-results/search-results-add-button.component.mjs +15 -9
- package/esm2022/lib/search/shared/search-pointer-summary.directive.mjs +1 -10
- package/esm2022/lib/search/shared/sources/workspace.interfaces.mjs +1 -1
- package/esm2022/lib/search/shared/sources/workspace.mjs +1 -1
- package/esm2022/lib/workspace/shared/edition-workspace.mjs +6 -4
- package/esm2022/lib/workspace/shared/edition-workspace.service.mjs +19 -17
- package/esm2022/lib/workspace/shared/wfs-workspace.service.mjs +17 -2
- package/esm2022/lib/workspace/shared/wms-workspace.service.mjs +22 -4
- package/esm2022/lib/workspace/shared/workspace.utils.mjs +6 -3
- package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +2 -2
- package/esm2022/lib/workspace/workspace-selector/workspace-selector.directive.mjs +6 -2
- package/esm2022/lib/workspace/workspace-updator/workspace-updator.directive.mjs +4 -3
- package/fesm2022/igo2-geo.mjs +22952 -22018
- package/fesm2022/igo2-geo.mjs.map +1 -1
- package/lib/datasource/shared/capabilities.service.d.ts +7 -2
- package/lib/datasource/shared/datasources/wfs-datasource.interface.d.ts +2 -2
- package/lib/datasource/shared/datasources/wms-datasource.interface.d.ts +5 -5
- package/lib/directions/directions-buttons/directions-buttons.component.d.ts +57 -20
- package/lib/directions/directions-inputs/directions-inputs.component.d.ts +115 -13
- package/lib/directions/directions-results/directions-results.component.d.ts +50 -16
- package/lib/directions/directions-sources/directions-source.d.ts +2 -2
- package/lib/directions/directions-sources/osrm-directions-source.d.ts +2 -2
- package/lib/directions/directions.component.d.ts +5 -5
- package/lib/directions/shared/directions.enum.d.ts +42 -1
- package/lib/directions/shared/directions.interface.d.ts +50 -25
- package/lib/directions/shared/directions.service.d.ts +46 -8
- package/lib/directions/shared/directions.utils.d.ts +102 -23
- package/lib/directions/shared/store.d.ts +3 -3
- package/lib/download/download-button/download-button.component.d.ts +4 -8
- package/lib/download/shared/download.service.d.ts +1 -1
- package/lib/draw/draw/draw.component.d.ts +2 -2
- package/lib/draw/shared/draw.utils.d.ts +2 -1
- package/lib/environment/environment.interface.d.ts +2 -0
- package/lib/feature/shared/feature-store.utils.d.ts +1 -1
- package/lib/feature/shared/feature.interfaces.d.ts +1 -1
- package/lib/feature/shared/store.d.ts +1 -1
- package/lib/filter/ogc-filter-button/ogc-filter-button.component.d.ts +1 -1
- package/lib/filter/ogc-filterable-item/ogc-filterable-item.component.d.ts +1 -1
- package/lib/filter/ogc-filterable-list/ogc-filterable-list.component.d.ts +2 -2
- package/lib/filter/shared/filterable-datasource.pipe.d.ts +2 -2
- package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +3 -3
- package/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.d.ts +3 -5
- package/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.d.ts +3 -5
- package/lib/filter/time-filter-button/time-filter-button.component.d.ts +1 -1
- package/lib/filter/time-filter-form/time-filter-form.component.d.ts +5 -5
- package/lib/filter/time-filter-item/time-filter-item.component.d.ts +1 -1
- package/lib/filter/time-filter-list/time-filter-list.component.d.ts +2 -7
- package/lib/import-export/export-button/export-button.component.d.ts +3 -7
- package/lib/import-export/import-export/import-export.component.d.ts +1 -2
- package/lib/import-export/shared/export.service.d.ts +2 -2
- package/lib/layer/index.d.ts +9 -4
- package/lib/layer/layer-group/index.d.ts +1 -0
- package/lib/layer/layer-group/layer-group.component.d.ts +30 -0
- package/lib/layer/layer-item/layer-item.component.d.ts +19 -42
- package/lib/layer/layer-legend/layer-legend.component.d.ts +2 -5
- package/lib/layer/layer-legend-list/layer-legend-list.component.d.ts +6 -7
- package/lib/layer/layer-list/index.d.ts +0 -2
- package/lib/layer/layer-list/layer-list.component.d.ts +51 -128
- package/lib/layer/layer-list-tool/index.d.ts +0 -1
- package/lib/layer/layer-list-tool/layer-list-tool.component.d.ts +19 -26
- package/lib/layer/layer-list-tool/layer-list-tool.interface.d.ts +5 -1
- package/lib/layer/layer-list-tool/layer-list-tool.service.d.ts +9 -8
- package/lib/layer/layer-search/index.d.ts +1 -0
- package/lib/layer/layer-search/layer-search.component.d.ts +16 -0
- package/lib/layer/layer-unavailable/index.d.ts +2 -0
- package/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.d.ts +10 -0
- package/lib/layer/layer-unavailable/layer-unavailable.component.d.ts +11 -0
- package/lib/layer/layer-viewer/index.d.ts +2 -0
- package/lib/layer/layer-viewer/layer-viewer.component.d.ts +52 -0
- package/lib/layer/layer-viewer/layer-viewer.interface.d.ts +22 -0
- package/lib/layer/layer-viewer-bottom-actions/index.d.ts +1 -0
- package/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.d.ts +44 -0
- package/lib/layer/layer-visibility-button/index.d.ts +1 -0
- package/lib/layer/layer-visibility-button/layer-visibility-button.component.d.ts +22 -0
- package/lib/layer/layer.module.d.ts +18 -6
- package/lib/layer/shared/index.d.ts +1 -0
- package/lib/layer/shared/layer-controller.d.ts +81 -0
- package/lib/layer/shared/layer-selection.d.ts +14 -0
- package/lib/layer/shared/layer.service.d.ts +9 -5
- package/lib/layer/shared/layers/any-layer.d.ts +3 -6
- package/lib/layer/shared/layers/any-layer.interface.d.ts +8 -6
- package/lib/layer/shared/layers/image-layer.d.ts +5 -2
- package/lib/layer/shared/layers/image-layer.interface.d.ts +1 -4
- package/lib/layer/shared/layers/index.d.ts +5 -0
- package/lib/layer/shared/layers/layer-base.d.ts +75 -0
- package/lib/layer/shared/layers/layer-group.d.ts +32 -0
- package/lib/layer/shared/layers/layer-group.interface.d.ts +8 -0
- package/lib/layer/shared/layers/layer.d.ts +27 -45
- package/lib/layer/shared/layers/layer.interface.d.ts +23 -41
- package/lib/layer/shared/layers/linked/index.d.ts +3 -0
- package/lib/layer/shared/layers/linked/linked-layer.d.ts +35 -0
- package/lib/layer/shared/layers/linked/linked-layer.interface.d.ts +32 -0
- package/lib/layer/shared/layers/linked/linked-layer.utils.d.ts +9 -0
- package/lib/layer/shared/layers/tile-layer.d.ts +5 -2
- package/lib/layer/shared/layers/vector-layer.d.ts +7 -3
- package/lib/layer/shared/layers/vectortile-layer.d.ts +5 -2
- package/lib/layer/utils/layer.utils.d.ts +12 -2
- package/lib/layer/utils/outputLegend.d.ts +2 -2
- package/lib/map/shared/controllers/geolocation.interface.d.ts +2 -1
- package/lib/map/shared/hover-feature.directive.d.ts +0 -1
- package/lib/map/shared/linkedLayers.utils.d.ts +13 -17
- package/lib/map/shared/map.abstract.d.ts +12 -29
- package/lib/map/shared/map.d.ts +10 -85
- package/lib/map/shared/map.service.d.ts +1 -1
- package/lib/map/shared/map.utils.d.ts +5 -3
- package/lib/map/utils/index.d.ts +1 -0
- package/lib/map/utils/layer-watcher.d.ts +18 -8
- package/lib/measure/measurer/measurer.component.d.ts +0 -8
- package/lib/metadata/metadata-button/metadata-button.component.d.ts +3 -7
- package/lib/offline/offline.provider.d.ts +1 -1
- package/lib/query/shared/query.service.d.ts +1 -1
- package/lib/query/shared/query.utils.d.ts +2 -1
- package/lib/search/search-results/search-results-add-button.component.d.ts +1 -1
- package/lib/search/shared/search-pointer-summary.directive.d.ts +0 -1
- package/lib/search/shared/sources/workspace.interfaces.d.ts +1 -1
- package/lib/workspace/widgets/ogc-filter/ogc-filter.component.d.ts +1 -1
- package/locale/en.geo.json +104 -89
- package/locale/fr.geo.json +103 -89
- package/package.json +5 -5
- package/src/geo-theme.scss +1 -1
- package/src/lib/directions/directions-inputs/directions-inputs.theming.scss +21 -0
- package/src/lib/directions/directions.theming.scss +2 -0
- package/src/lib/layer/layer-group/layer-group.theme.scss +28 -0
- package/src/lib/layer/layer-item/layer-item.theme.scss +4 -9
- package/src/lib/layer/layer-legend/layer-legend.theme.scss +30 -0
- package/src/lib/layer/layer-list/layer-list.theme.scss +50 -0
- package/src/lib/layer/layer-unavailable/layer-unavailable.theme.scss +19 -0
- package/src/lib/layer/layer-viewer/_layer-viewer.theme.scss +16 -0
- package/src/lib/layer/layer-visibility-button/layer-visibility-button.theme.scss +27 -0
- package/src/lib/layer/layer.theming.scss +14 -3
- package/esm2022/lib/layer/layer-list/layer-list-binding.directive.mjs +0 -70
- package/esm2022/lib/layer/layer-list/layer-list.enum.mjs +0 -19
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.enum.mjs +0 -7
- package/lib/layer/layer-list/layer-list-binding.directive.d.ts +0 -19
- package/lib/layer/layer-list/layer-list.enum.d.ts +0 -15
- package/lib/layer/layer-list-tool/layer-list-tool.enum.d.ts +0 -5
- package/src/lib/layer/layer-legend/layer-legend.theming.scss +0 -10
|
@@ -11,12 +11,13 @@ import { tryAddLoadingStrategy } from '../../feature/shared/strategies.utils';
|
|
|
11
11
|
import { FeatureStoreLoadingStrategy } from '../../feature/shared/strategies/loading';
|
|
12
12
|
import { VectorLayer } from '../../layer/shared/layers/vector-layer';
|
|
13
13
|
import { createOverlayMarkerStyle } from '../../style/shared/overlay/overlay-marker-style.utils';
|
|
14
|
-
import { DirectionRelativePositionType,
|
|
14
|
+
import { DirectionRelativePositionType, DirectionsType, ManeuverModifier, ManeuverType } from './directions.enum';
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* @param
|
|
19
|
-
* @param
|
|
16
|
+
* Updates the sorting of the stops in the provided StopsStore based on the specified field and direction.
|
|
17
|
+
*
|
|
18
|
+
* @param {StopsStore} stopsStore - The StopsStore to update the sorting for.
|
|
19
|
+
* @param {'asc' | 'desc'} [direction='asc'] - The direction of sorting ('asc' for ascending, 'desc' for descending).
|
|
20
|
+
* @param {string} [field='position'] - The field to sort the stops by.
|
|
20
21
|
*/
|
|
21
22
|
export function updateStoreSorting(stopsStore, direction = 'asc', field = 'position') {
|
|
22
23
|
stopsStore.view.sort({
|
|
@@ -24,70 +25,73 @@ export function updateStoreSorting(stopsStore, direction = 'asc', field = 'posit
|
|
|
24
25
|
valueAccessor: (entity) => entity[field]
|
|
25
26
|
});
|
|
26
27
|
}
|
|
27
|
-
|
|
28
|
+
/**
|
|
29
|
+
* Computes the relative position of a stop in a list of stops.
|
|
30
|
+
*
|
|
31
|
+
* @param {number} stopIndex - The index of the stop.
|
|
32
|
+
* @param {number} stopListLength - The total number of stops.
|
|
33
|
+
* @return {DirectionRelativePositionType} The relative position of the stop.
|
|
34
|
+
*/
|
|
35
|
+
export function computeRelativePosition(stopIndex, stopListLength) {
|
|
28
36
|
let relativePosition = DirectionRelativePositionType.Intermediate;
|
|
29
|
-
if (
|
|
37
|
+
if (stopIndex === 0) {
|
|
30
38
|
relativePosition = DirectionRelativePositionType.Start;
|
|
31
39
|
}
|
|
32
|
-
else if (
|
|
40
|
+
else if (stopIndex === stopListLength) {
|
|
33
41
|
relativePosition = DirectionRelativePositionType.End;
|
|
34
42
|
}
|
|
35
43
|
return relativePosition;
|
|
36
44
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Computes the position and relative position of stops in the given stopsStore.
|
|
47
|
+
*
|
|
48
|
+
* @param {StopsStore} stopsStore - The store containing the stops.
|
|
49
|
+
*/
|
|
50
|
+
export function computeStopsPosition(deletedStopIndex, stopsStore) {
|
|
51
|
+
for (const stop of stopsStore.all()) {
|
|
52
|
+
stop.position =
|
|
53
|
+
stop.position > deletedStopIndex ? (stop.position -= 1) : stop.position;
|
|
54
|
+
stop.relativePosition = computeRelativePosition(stop.position, stopsStore.all().length - 1);
|
|
46
55
|
}
|
|
47
56
|
}
|
|
48
57
|
/**
|
|
49
|
-
*
|
|
50
|
-
*
|
|
58
|
+
* Adds a stop to the given stopsStore. The stop is always added as the last stop.
|
|
59
|
+
*
|
|
60
|
+
* @param {StopsStore} stopsStore - The store containing the stops.
|
|
61
|
+
* @return {Stop} The newly added stop.
|
|
51
62
|
*/
|
|
52
63
|
export function addStopToStore(stopsStore) {
|
|
53
64
|
const id = uuid();
|
|
54
65
|
const stops = stopsStore.all();
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
positions = stops.map((stop) => stop.position);
|
|
61
|
-
}
|
|
62
|
-
const maxPosition = Math.max(...positions);
|
|
63
|
-
const insertPosition = maxPosition;
|
|
64
|
-
const lastPosition = maxPosition + 1;
|
|
65
|
-
const stopToUpdate = stopsStore
|
|
66
|
-
.all()
|
|
67
|
-
.find((stop) => stop.position === maxPosition);
|
|
68
|
-
if (stopToUpdate) {
|
|
69
|
-
stopToUpdate.position = lastPosition;
|
|
70
|
-
stopToUpdate.relativePosition = computeRelativePosition(lastPosition, stopsStore.count + 1);
|
|
66
|
+
const insertIndex = stops.length;
|
|
67
|
+
for (const stop of stopsStore.all()) {
|
|
68
|
+
stop.relativePosition = computeRelativePosition(stop.position, stops.length);
|
|
71
69
|
}
|
|
72
70
|
stopsStore.insert({
|
|
73
71
|
id,
|
|
74
|
-
position:
|
|
75
|
-
relativePosition: computeRelativePosition(
|
|
72
|
+
position: insertIndex,
|
|
73
|
+
relativePosition: computeRelativePosition(insertIndex, stops.length)
|
|
76
74
|
});
|
|
77
75
|
updateStoreSorting(stopsStore);
|
|
78
76
|
return stopsStore.get(id);
|
|
79
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Removes a stop from the given stopsStore and updates the positions of the remaining stops.
|
|
80
|
+
*
|
|
81
|
+
* @param {StopsStore} stopsStore - The store containing the stops.
|
|
82
|
+
* @param {Stop} stop - The stop to be removed.
|
|
83
|
+
*/
|
|
80
84
|
export function removeStopFromStore(stopsStore, stop) {
|
|
81
85
|
stopsStore.delete(stop);
|
|
82
|
-
computeStopsPosition(stopsStore);
|
|
86
|
+
computeStopsPosition(stop.position, stopsStore);
|
|
83
87
|
}
|
|
84
88
|
/**
|
|
85
|
-
* Create a style for the directions stops and
|
|
89
|
+
* Create a style for the directions steps, stops and route
|
|
86
90
|
* @param feature OlFeature
|
|
87
91
|
* @returns OL style function
|
|
88
92
|
*/
|
|
89
93
|
export function directionsStyle(feature) {
|
|
90
|
-
const
|
|
94
|
+
const stepStyle = [
|
|
91
95
|
new olStyle.Style({
|
|
92
96
|
geometry: feature.getGeometry(),
|
|
93
97
|
image: new olStyle.Circle({
|
|
@@ -116,16 +120,22 @@ export function directionsStyle(feature) {
|
|
|
116
120
|
})
|
|
117
121
|
})
|
|
118
122
|
];
|
|
119
|
-
if (feature.get('type') ===
|
|
123
|
+
if (feature.get('type') === DirectionsType.Stop) {
|
|
120
124
|
return stopStyle;
|
|
121
125
|
}
|
|
122
|
-
if (feature.get('type') ===
|
|
123
|
-
return
|
|
126
|
+
if (feature.get('type') === DirectionsType.Vertex) {
|
|
127
|
+
return stepStyle;
|
|
124
128
|
}
|
|
125
|
-
if (feature.get('type') ===
|
|
129
|
+
if (feature.get('type') === DirectionsType.Route) {
|
|
126
130
|
return routeStyle;
|
|
127
131
|
}
|
|
128
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* Initializes the stops feature store with the provided language service.
|
|
135
|
+
*
|
|
136
|
+
* @param {StopsFeatureStore} stopsFeatureStore - The stops feature store to initialize.
|
|
137
|
+
* @param {LanguageService} languageService - The language service used for translations.
|
|
138
|
+
*/
|
|
129
139
|
export function initStopsFeatureStore(stopsFeatureStore, languageService) {
|
|
130
140
|
const loadingStrategy = new FeatureStoreLoadingStrategy({
|
|
131
141
|
motion: FeatureMotion.None
|
|
@@ -133,10 +143,11 @@ export function initStopsFeatureStore(stopsFeatureStore, languageService) {
|
|
|
133
143
|
const stopsLayer = new VectorLayer({
|
|
134
144
|
isIgoInternalLayer: true,
|
|
135
145
|
id: 'igo-direction-stops-layer',
|
|
136
|
-
title: languageService.translate.instant('igo.geo.
|
|
146
|
+
title: languageService.translate.instant('igo.geo.directions.layer.stops'),
|
|
137
147
|
zIndex: 911,
|
|
138
148
|
source: new FeatureDataSource(),
|
|
139
149
|
showInLayerList: true,
|
|
150
|
+
visible: true,
|
|
140
151
|
workspace: {
|
|
141
152
|
enabled: false
|
|
142
153
|
},
|
|
@@ -155,9 +166,14 @@ export function initStopsFeatureStore(stopsFeatureStore, languageService) {
|
|
|
155
166
|
style: directionsStyle
|
|
156
167
|
});
|
|
157
168
|
tryBindStoreLayer(stopsFeatureStore, stopsLayer);
|
|
158
|
-
stopsFeatureStore.layer.visible = true;
|
|
159
169
|
tryAddLoadingStrategy(stopsFeatureStore, loadingStrategy);
|
|
160
170
|
}
|
|
171
|
+
/**
|
|
172
|
+
* Initializes the routes feature store with the provided language service.
|
|
173
|
+
*
|
|
174
|
+
* @param {StopsFeatureStore} routesFeatureStore - The routes feature store to initialize.
|
|
175
|
+
* @param {LanguageService} languageService - The language service used for translations.
|
|
176
|
+
*/
|
|
161
177
|
export function initRoutesFeatureStore(routesFeatureStore, languageService) {
|
|
162
178
|
const loadingStrategy = new FeatureStoreLoadingStrategy({
|
|
163
179
|
motion: FeatureMotion.None
|
|
@@ -165,10 +181,11 @@ export function initRoutesFeatureStore(routesFeatureStore, languageService) {
|
|
|
165
181
|
const routeLayer = new VectorLayer({
|
|
166
182
|
isIgoInternalLayer: true,
|
|
167
183
|
id: 'igo-direction-route-layer',
|
|
168
|
-
title: languageService.translate.instant('igo.geo.
|
|
184
|
+
title: languageService.translate.instant('igo.geo.directions.layer.route'),
|
|
169
185
|
zIndex: 910,
|
|
170
186
|
source: new FeatureDataSource(),
|
|
171
187
|
showInLayerList: true,
|
|
188
|
+
visible: true,
|
|
172
189
|
workspace: {
|
|
173
190
|
enabled: false
|
|
174
191
|
},
|
|
@@ -180,10 +197,14 @@ export function initRoutesFeatureStore(routesFeatureStore, languageService) {
|
|
|
180
197
|
style: directionsStyle
|
|
181
198
|
});
|
|
182
199
|
tryBindStoreLayer(routesFeatureStore, routeLayer);
|
|
183
|
-
routesFeatureStore.layer.visible = true;
|
|
184
200
|
tryAddLoadingStrategy(routesFeatureStore, loadingStrategy);
|
|
185
201
|
}
|
|
186
|
-
|
|
202
|
+
/**
|
|
203
|
+
* Initializes the routes feature store.
|
|
204
|
+
*
|
|
205
|
+
* @param {StopsFeatureStore} stepsFeatureStore - The steps feature store to initialize.
|
|
206
|
+
*/
|
|
207
|
+
export function initStepsFeatureStore(stepsFeatureStore) {
|
|
187
208
|
const loadingStrategy = new FeatureStoreLoadingStrategy({
|
|
188
209
|
motion: FeatureMotion.None
|
|
189
210
|
});
|
|
@@ -194,6 +215,7 @@ export function initStepFeatureStore(stepFeatureStore) {
|
|
|
194
215
|
zIndex: 910,
|
|
195
216
|
source: new FeatureDataSource(),
|
|
196
217
|
showInLayerList: false,
|
|
218
|
+
visible: true,
|
|
197
219
|
workspace: {
|
|
198
220
|
enabled: false
|
|
199
221
|
},
|
|
@@ -204,44 +226,53 @@ export function initStepFeatureStore(stepFeatureStore) {
|
|
|
204
226
|
browsable: false,
|
|
205
227
|
style: directionsStyle
|
|
206
228
|
});
|
|
207
|
-
tryBindStoreLayer(
|
|
208
|
-
|
|
209
|
-
tryAddLoadingStrategy(stepFeatureStore, loadingStrategy);
|
|
229
|
+
tryBindStoreLayer(stepsFeatureStore, stepLayer);
|
|
230
|
+
tryAddLoadingStrategy(stepsFeatureStore, loadingStrategy);
|
|
210
231
|
}
|
|
211
|
-
|
|
232
|
+
/**
|
|
233
|
+
* Adds a stop to the stopsFeatureStore.
|
|
234
|
+
*
|
|
235
|
+
* @param {Stop} stop - The stop to be added.
|
|
236
|
+
* @param {StopsFeatureStore} stopsFeatureStore - The stopsFeatureStore to add the stop to.
|
|
237
|
+
* @param {string} projection - The projection of the stop coordinates.
|
|
238
|
+
* @param {LanguageService} languageService - The language service for translating stop text.
|
|
239
|
+
*/
|
|
240
|
+
export function addStopToStopsFeatureStore(stop, stopsFeatureStore, projection, languageService) {
|
|
212
241
|
let stopColor;
|
|
213
242
|
let stopText;
|
|
214
243
|
switch (stop.relativePosition) {
|
|
215
244
|
case DirectionRelativePositionType.Start:
|
|
216
245
|
stopColor = '#008000';
|
|
217
|
-
stopText = languageService.translate.instant('igo.geo.
|
|
246
|
+
stopText = languageService.translate.instant('igo.geo.directions.input.start');
|
|
218
247
|
break;
|
|
219
248
|
case DirectionRelativePositionType.End:
|
|
220
249
|
stopColor = '#f64139';
|
|
221
|
-
stopText = languageService.translate.instant('igo.geo.
|
|
250
|
+
stopText = languageService.translate.instant('igo.geo.directions.input.end');
|
|
222
251
|
break;
|
|
223
252
|
default:
|
|
224
253
|
stopColor = '#ffd700';
|
|
225
254
|
stopText =
|
|
226
|
-
languageService.translate.instant('igo.geo.
|
|
255
|
+
languageService.translate.instant('igo.geo.directions.input.intermediate') +
|
|
227
256
|
' #' +
|
|
228
257
|
stop.position;
|
|
229
258
|
break;
|
|
230
259
|
}
|
|
231
|
-
const
|
|
232
|
-
const geojsonGeom = new OlGeoJSON().writeGeometryObject(
|
|
233
|
-
featureProjection: stopsFeatureStore.map.
|
|
234
|
-
dataProjection: stopsFeatureStore.map.
|
|
260
|
+
const point = new olGeom.Point(olProj.transform(stop.coordinates, projection, stopsFeatureStore.map.projectionCode));
|
|
261
|
+
const geojsonGeom = new OlGeoJSON().writeGeometryObject(point, {
|
|
262
|
+
featureProjection: stopsFeatureStore.map.projectionCode,
|
|
263
|
+
dataProjection: stopsFeatureStore.map.projectionCode
|
|
235
264
|
});
|
|
236
265
|
const previousStop = stopsFeatureStore.get(stop.id);
|
|
237
|
-
const previousStopRevision = previousStop
|
|
266
|
+
const previousStopRevision = previousStop
|
|
267
|
+
? previousStop.meta.revision
|
|
268
|
+
: 0;
|
|
238
269
|
const stopFeatureStore = {
|
|
239
270
|
type: FEATURE,
|
|
240
271
|
geometry: geojsonGeom,
|
|
241
|
-
projection: stopsFeatureStore.map.
|
|
272
|
+
projection: stopsFeatureStore.map.projectionCode,
|
|
242
273
|
properties: {
|
|
243
274
|
id: stop.id,
|
|
244
|
-
type:
|
|
275
|
+
type: DirectionsType.Stop,
|
|
245
276
|
stopText,
|
|
246
277
|
stopColor,
|
|
247
278
|
stopOpacity: 1,
|
|
@@ -251,309 +282,241 @@ export function addStopToStopsFeatureStore(stop, stopsStore, stopsFeatureStore,
|
|
|
251
282
|
id: stop.id,
|
|
252
283
|
revision: previousStopRevision + 1
|
|
253
284
|
},
|
|
254
|
-
ol: new olFeature({
|
|
285
|
+
ol: new olFeature({ point })
|
|
255
286
|
};
|
|
256
287
|
stopsFeatureStore.update(stopFeatureStore);
|
|
257
288
|
}
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
289
|
+
/**
|
|
290
|
+
* Adds a route to the routes feature store.
|
|
291
|
+
*
|
|
292
|
+
* @param {RoutesFeatureStore} routesFeatureStore - The routes feature store to add the route to.
|
|
293
|
+
* @param {Directions} directions - The directions object containing the geometry and other information.
|
|
294
|
+
* @param {string} projection - The projection of the geometry coordinates.
|
|
295
|
+
* @param {boolean} [active=false] - Indicates whether the direction is active or not. Default is false.
|
|
296
|
+
*/
|
|
297
|
+
export function addRouteToRoutesFeatureStore(routesFeatureStore, directions, projection, active = false) {
|
|
298
|
+
const coordinate = directions.geometry.coordinates;
|
|
299
|
+
const linestring4326 = new olGeom.LineString(coordinate);
|
|
300
|
+
const linestringStore = linestring4326.transform(projection, routesFeatureStore.map.projectionCode);
|
|
301
|
+
const geojsonGeom = new OlGeoJSON().writeGeometryObject(linestringStore, {
|
|
302
|
+
featureProjection: routesFeatureStore.map.projectionCode,
|
|
303
|
+
dataProjection: routesFeatureStore.map.projectionCode
|
|
265
304
|
});
|
|
266
|
-
const previousRoute = routesFeatureStore.get(
|
|
267
|
-
const previousRouteRevision = previousRoute
|
|
305
|
+
const previousRoute = routesFeatureStore.get(directions.id);
|
|
306
|
+
const previousRouteRevision = previousRoute
|
|
307
|
+
? previousRoute.meta.revision
|
|
308
|
+
: 0;
|
|
268
309
|
const routeFeatureStore = {
|
|
269
310
|
type: FEATURE,
|
|
270
311
|
geometry: geojsonGeom,
|
|
271
|
-
projection: routesFeatureStore.map.
|
|
312
|
+
projection: routesFeatureStore.map.projectionCode,
|
|
272
313
|
properties: {
|
|
273
|
-
id:
|
|
274
|
-
type:
|
|
314
|
+
id: directions.id,
|
|
315
|
+
type: DirectionsType.Route,
|
|
275
316
|
active,
|
|
276
|
-
|
|
317
|
+
directions
|
|
277
318
|
},
|
|
278
319
|
meta: {
|
|
279
|
-
id:
|
|
320
|
+
id: directions.id,
|
|
280
321
|
revision: previousRouteRevision + 1
|
|
281
322
|
},
|
|
282
|
-
ol: new olFeature({
|
|
323
|
+
ol: new olFeature({ linestringStore })
|
|
283
324
|
};
|
|
284
325
|
routesFeatureStore.update(routeFeatureStore);
|
|
285
326
|
}
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
if (
|
|
294
|
-
return
|
|
327
|
+
/**
|
|
328
|
+
* Formats the given distance in meters to a human-readable string.
|
|
329
|
+
*
|
|
330
|
+
* @param {number} meters - The distance in meters to be formatted.
|
|
331
|
+
* @return {string | undefined} The formatted distance string.
|
|
332
|
+
*/
|
|
333
|
+
export function formatDistance(meters) {
|
|
334
|
+
if (meters === 0) {
|
|
335
|
+
return undefined;
|
|
295
336
|
}
|
|
296
|
-
if (
|
|
297
|
-
return
|
|
337
|
+
if (meters < 1000) {
|
|
338
|
+
return `${Math.round(meters)} m`;
|
|
298
339
|
}
|
|
299
|
-
|
|
340
|
+
const kilometers = meters / 1000;
|
|
341
|
+
const roundToDecimal = kilometers >= 10 ? 1 : 0;
|
|
342
|
+
return `${NumberUtils.roundToNDecimal(kilometers, roundToDecimal)} km`.replace('.', ',');
|
|
300
343
|
}
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
344
|
+
/**
|
|
345
|
+
* Formats the given duration in seconds to a human-readable string.
|
|
346
|
+
*
|
|
347
|
+
* @param {number} seconds - The duration in seconds to be formatted.
|
|
348
|
+
* @return {string} The formatted duration string.
|
|
349
|
+
*/
|
|
350
|
+
export function formatDuration(seconds) {
|
|
351
|
+
const hours = Math.floor(seconds / 3600);
|
|
352
|
+
const minutes = Math.floor((seconds % 3600) / 60);
|
|
353
|
+
if (hours) {
|
|
354
|
+
return `${hours} h ${minutes} min`;
|
|
309
355
|
}
|
|
310
|
-
if (
|
|
311
|
-
return
|
|
356
|
+
if (minutes) {
|
|
357
|
+
return `${minutes} min`;
|
|
312
358
|
}
|
|
313
|
-
return
|
|
359
|
+
return '< 1 min';
|
|
314
360
|
}
|
|
315
|
-
export function
|
|
361
|
+
export function formatStep(step, languageService, lastStep = false) {
|
|
362
|
+
const maneuverType = step.maneuver.type;
|
|
363
|
+
const maneuverModifier = step.maneuver.modifier;
|
|
364
|
+
const name = step.name;
|
|
365
|
+
const maneuverBearingAfter = step.maneuver.bearing_after;
|
|
316
366
|
const translate = languageService.translate;
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
let
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
aggregatedDirection = translatedModifier;
|
|
328
|
-
}
|
|
329
|
-
if (modifier === 'uturn') {
|
|
330
|
-
image = 'arrow_forward';
|
|
331
|
-
cssClass = 'rotate-90';
|
|
332
|
-
}
|
|
333
|
-
else if (modifier === 'sharp right') {
|
|
334
|
-
image = 'subdirectory_arrow_right';
|
|
335
|
-
cssClass = 'icon-flipped';
|
|
336
|
-
}
|
|
337
|
-
else if (modifier === 'right') {
|
|
338
|
-
image = 'subdirectory_arrow_right';
|
|
339
|
-
cssClass = 'icon-flipped';
|
|
340
|
-
}
|
|
341
|
-
else if (modifier === 'slight right') {
|
|
342
|
-
image = 'arrow_forward';
|
|
343
|
-
cssClass = 'rotate-290';
|
|
344
|
-
}
|
|
345
|
-
else if (modifier === 'straight') {
|
|
346
|
-
image = 'arrow_forward';
|
|
347
|
-
}
|
|
348
|
-
else if (modifier === 'slight left') {
|
|
349
|
-
image = 'arrow_forward';
|
|
350
|
-
cssClass = 'rotate-250';
|
|
351
|
-
}
|
|
352
|
-
else if (modifier === 'left') {
|
|
353
|
-
image = 'subdirectory_arrow_left';
|
|
354
|
-
cssClass = 'icon-flipped';
|
|
355
|
-
}
|
|
356
|
-
else if (modifier === 'sharp left') {
|
|
357
|
-
image = 'subdirectory_arrow_left';
|
|
358
|
-
cssClass = 'icon-flipped';
|
|
359
|
-
}
|
|
360
|
-
if (type === 'turn') {
|
|
361
|
-
if (modifier === 'straight') {
|
|
362
|
-
directive = translate.instant('igo.geo.directions.turn.straight', {
|
|
363
|
-
route
|
|
367
|
+
const translatedManeuverBearingAfter = translateManeuverBearing(maneuverBearingAfter, languageService);
|
|
368
|
+
const translatedManeuverModifier = translateManeuverModifier(maneuverModifier, languageService);
|
|
369
|
+
let iconName = 'straight'; // arrow point up by default
|
|
370
|
+
let instruction = '';
|
|
371
|
+
if (maneuverType === ManeuverType.Turn) {
|
|
372
|
+
if (maneuverModifier === ManeuverModifier.Uturn ||
|
|
373
|
+
maneuverModifier === ManeuverModifier.Straight) {
|
|
374
|
+
instruction = translate.instant(`igo.geo.directions.results.maneuverType.turn.${maneuverModifier}`, {
|
|
375
|
+
maneuverModifier: translatedManeuverModifier,
|
|
376
|
+
name
|
|
364
377
|
});
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
378
|
+
if (maneuverModifier === ManeuverModifier.Uturn) {
|
|
379
|
+
iconName = 'u_turn_left';
|
|
380
|
+
}
|
|
368
381
|
}
|
|
369
382
|
else {
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
translatedModifier
|
|
383
|
+
instruction = translate.instant('igo.geo.directions.results.maneuverType.turn.else', {
|
|
384
|
+
maneuverModifier: translatedManeuverModifier,
|
|
385
|
+
name
|
|
374
386
|
});
|
|
387
|
+
if (maneuverModifier === ManeuverModifier.SlightRight) {
|
|
388
|
+
iconName = 'turn_slight_right';
|
|
389
|
+
}
|
|
390
|
+
else if (maneuverModifier === ManeuverModifier.Right ||
|
|
391
|
+
maneuverModifier === ManeuverModifier.SharpRight) {
|
|
392
|
+
iconName = 'turn_right';
|
|
393
|
+
}
|
|
394
|
+
else if (maneuverModifier === ManeuverModifier.Left ||
|
|
395
|
+
maneuverModifier === ManeuverModifier.SharpLeft) {
|
|
396
|
+
iconName = 'turn_left';
|
|
397
|
+
}
|
|
398
|
+
else if (maneuverModifier === ManeuverModifier.SlightLeft) {
|
|
399
|
+
iconName = 'turn_slight_left';
|
|
400
|
+
}
|
|
375
401
|
}
|
|
376
402
|
}
|
|
377
|
-
else if (
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
403
|
+
else if (maneuverType === ManeuverType.NewName) {
|
|
404
|
+
instruction = translate.instant(`igo.geo.directions.results.maneuverType.new name`, {
|
|
405
|
+
name,
|
|
406
|
+
maneuverBearing: translatedManeuverBearingAfter
|
|
381
407
|
});
|
|
382
|
-
image = 'explore';
|
|
383
|
-
cssClass = '';
|
|
384
408
|
}
|
|
385
|
-
else if (
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
409
|
+
else if (maneuverType === ManeuverType.Depart) {
|
|
410
|
+
iconName = 'directions';
|
|
411
|
+
instruction = translate.instant(`igo.geo.directions.results.maneuverType.depart`, {
|
|
412
|
+
name,
|
|
413
|
+
maneuverBearing: translatedManeuverBearingAfter
|
|
389
414
|
});
|
|
390
|
-
image = 'explore';
|
|
391
|
-
cssClass = '';
|
|
392
415
|
}
|
|
393
|
-
else if (
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
coma,
|
|
399
|
-
aggregatedDirection
|
|
400
|
-
});
|
|
401
|
-
}
|
|
402
|
-
else {
|
|
403
|
-
directive = translate.instant('igo.geo.directions.arrive.intermediate', {
|
|
404
|
-
route
|
|
405
|
-
});
|
|
406
|
-
image = 'location_on';
|
|
407
|
-
cssClass = '';
|
|
408
|
-
}
|
|
416
|
+
else if (maneuverType === ManeuverType.Arrive) {
|
|
417
|
+
iconName = 'sports_score';
|
|
418
|
+
instruction = translate.instant(`igo.geo.directions.results.maneuverType.arrive.${lastStep ? 'lastStep' : 'intermediate'}`, {
|
|
419
|
+
name
|
|
420
|
+
});
|
|
409
421
|
}
|
|
410
|
-
else if (
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
422
|
+
else if (maneuverType === ManeuverType.Merge) {
|
|
423
|
+
instruction = translate.instant('igo.geo.directions.results.maneuverType.merge', {
|
|
424
|
+
name
|
|
425
|
+
});
|
|
426
|
+
iconName = 'merge';
|
|
414
427
|
}
|
|
415
|
-
else if (
|
|
416
|
-
|
|
417
|
-
|
|
428
|
+
else if (maneuverType === ManeuverType.OnRamp ||
|
|
429
|
+
maneuverType === ManeuverType.OffRamp) {
|
|
430
|
+
instruction = translate.instant(`igo.geo.directions.results.maneuverType.${maneuverType}`, {
|
|
431
|
+
maneuverModifier: translatedManeuverModifier
|
|
418
432
|
});
|
|
419
433
|
}
|
|
420
|
-
else if (
|
|
421
|
-
|
|
422
|
-
|
|
434
|
+
else if (maneuverType === ManeuverType.Fork) {
|
|
435
|
+
const directionKey = maneuverModifier.search('left') >= 0 ? 'left' : 'right';
|
|
436
|
+
iconName =
|
|
437
|
+
directionKey === 'left' ? 'turn_slight_left' : 'turn_slight_right';
|
|
438
|
+
instruction = translate.instant(`igo.geo.directions.results.maneuverType.fork.${directionKey}`, {
|
|
439
|
+
name
|
|
423
440
|
});
|
|
424
441
|
}
|
|
425
|
-
else if (
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
442
|
+
else if (maneuverType === ManeuverType.EndOfRoad ||
|
|
443
|
+
maneuverType === ManeuverType.UseLane ||
|
|
444
|
+
maneuverType === ManeuverType.Continue) {
|
|
445
|
+
if (maneuverType === ManeuverType.Continue) {
|
|
446
|
+
if (maneuverModifier === ManeuverModifier.Uturn) {
|
|
447
|
+
iconName = 'u_turn_left';
|
|
448
|
+
instruction = translate.instant(`igo.geo.directions.results.maneuverType.turn.${maneuverModifier}`, {
|
|
449
|
+
maneuverModifier: translatedManeuverModifier,
|
|
450
|
+
name
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
else {
|
|
454
|
+
instruction = translate.instant(`igo.geo.directions.results.maneuverType.${maneuverType}`, {
|
|
455
|
+
maneuverModifier: translatedManeuverModifier,
|
|
456
|
+
name
|
|
457
|
+
});
|
|
458
|
+
}
|
|
431
459
|
}
|
|
432
460
|
else {
|
|
433
|
-
|
|
461
|
+
if (maneuverModifier === ManeuverModifier.SharpRight ||
|
|
462
|
+
maneuverModifier === ManeuverModifier.Right) {
|
|
463
|
+
iconName = 'turn_right';
|
|
464
|
+
}
|
|
465
|
+
else if (maneuverModifier === ManeuverModifier.SharpLeft ||
|
|
466
|
+
maneuverModifier === ManeuverModifier.Left) {
|
|
467
|
+
iconName = 'turn_left';
|
|
468
|
+
}
|
|
469
|
+
else if (maneuverModifier === ManeuverModifier.SlightRight) {
|
|
470
|
+
iconName = 'turn_slight_right';
|
|
471
|
+
}
|
|
472
|
+
else if (maneuverModifier === ManeuverModifier.SlightLeft) {
|
|
473
|
+
iconName = 'turn_slight_left';
|
|
474
|
+
}
|
|
475
|
+
instruction = translate.instant(`igo.geo.directions.results.maneuverType.${maneuverType}`, {
|
|
476
|
+
maneuverModifier: translatedManeuverModifier,
|
|
477
|
+
name
|
|
478
|
+
});
|
|
434
479
|
}
|
|
435
480
|
}
|
|
436
|
-
else if (
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
directive = translate.instant('igo.geo.directions.use lane');
|
|
444
|
-
}
|
|
445
|
-
else if (type === 'continue' && modifier !== 'uturn') {
|
|
446
|
-
directive = translate.instant('igo.geo.directions.continue.notUturn', {
|
|
447
|
-
route
|
|
448
|
-
});
|
|
449
|
-
image = 'arrow_forward';
|
|
450
|
-
cssClass = 'rotate-270';
|
|
451
|
-
}
|
|
452
|
-
else if (type === 'roundabout') {
|
|
453
|
-
const cntSuffix = exit === 1
|
|
454
|
-
? translate.instant('igo.geo.directions.cntSuffix.first')
|
|
455
|
-
: translate.instant('igo.geo.directions.cntSuffix.secondAndMore');
|
|
456
|
-
directive = translate.instant('igo.geo.directions.roundabout', {
|
|
457
|
-
exit,
|
|
458
|
-
cntSuffix,
|
|
459
|
-
route
|
|
481
|
+
else if (maneuverType === ManeuverType.Roundabout ||
|
|
482
|
+
maneuverType === ManeuverType.Rotary ||
|
|
483
|
+
maneuverType === ManeuverType.RoundaboutTurn ||
|
|
484
|
+
maneuverType === ManeuverType.ExitRoundabout) {
|
|
485
|
+
const roundaboutKey = maneuverType.replace('roundabout ', '');
|
|
486
|
+
instruction = translate.instant(`igo.geo.directions.results.maneuverType.${roundaboutKey}`, {
|
|
487
|
+
name
|
|
460
488
|
});
|
|
461
|
-
|
|
462
|
-
cssClass = '';
|
|
489
|
+
iconName = 'donut_large';
|
|
463
490
|
}
|
|
464
|
-
else if (
|
|
465
|
-
|
|
466
|
-
image = 'donut_large';
|
|
467
|
-
cssClass = '';
|
|
491
|
+
else if (maneuverType === ManeuverType.Notification) {
|
|
492
|
+
instruction = translate.instant('igo.geo.directions.results.maneuverType.notification');
|
|
468
493
|
}
|
|
469
|
-
|
|
470
|
-
directive = translate.instant('igo.geo.directions.roundabout turn');
|
|
471
|
-
image = 'donut_large';
|
|
472
|
-
cssClass = '';
|
|
473
|
-
}
|
|
474
|
-
else if (type === 'exit roundabout') {
|
|
475
|
-
directive = translate.instant('igo.geo.directions.exit roundabout', {
|
|
476
|
-
route
|
|
477
|
-
});
|
|
478
|
-
image = 'arrow_forward';
|
|
479
|
-
cssClass = 'rotate-270';
|
|
480
|
-
}
|
|
481
|
-
else if (type === 'notification') {
|
|
482
|
-
directive = translate.instant('igo.geo.directions.notification');
|
|
483
|
-
}
|
|
484
|
-
else if (modifier === 'uturn') {
|
|
485
|
-
directive = translate.instant('igo.geo.directions.uturnText', {
|
|
486
|
-
translatedDirection,
|
|
487
|
-
route
|
|
488
|
-
});
|
|
489
|
-
}
|
|
490
|
-
else {
|
|
491
|
-
directive = translate.instant('igo.geo.directions.unknown');
|
|
492
|
-
}
|
|
493
|
-
image = lastStep ? 'flag' : image;
|
|
494
|
-
cssClass = lastStep ? '' : cssClass;
|
|
495
|
-
image = stepPosition === 0 ? 'explore' : image;
|
|
496
|
-
cssClass = stepPosition === 0 ? '' : cssClass;
|
|
497
|
-
return { instruction: directive, image, cssClass };
|
|
494
|
+
return { instruction, iconName };
|
|
498
495
|
}
|
|
499
|
-
|
|
496
|
+
/**
|
|
497
|
+
* Translates a maneuver modifier into a human-readable string using the provided language service.
|
|
498
|
+
*
|
|
499
|
+
* @param {ManeuverModifier} maneuverModifier - The maneuver modifier to be translated.
|
|
500
|
+
* @param {LanguageService} languageService - The language service used for translation.
|
|
501
|
+
* @return {string | undefined} The translated maneuver modifier string, or undefined if the modifier is falsy.
|
|
502
|
+
*/
|
|
503
|
+
export function translateManeuverModifier(maneuverModifier, languageService) {
|
|
500
504
|
const translate = languageService.translate;
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
else if (modifier === 'sharp right') {
|
|
505
|
-
return translate.instant('igo.geo.directions.sharp right');
|
|
506
|
-
}
|
|
507
|
-
else if (modifier === 'right') {
|
|
508
|
-
return translate.instant('igo.geo.directions.right');
|
|
509
|
-
}
|
|
510
|
-
else if (modifier === 'slight right') {
|
|
511
|
-
return translate.instant('igo.geo.directions.slight right');
|
|
512
|
-
}
|
|
513
|
-
else if (modifier === 'sharp left') {
|
|
514
|
-
return languageService.translate.instant('igo.geo.directions.sharp left');
|
|
515
|
-
}
|
|
516
|
-
else if (modifier === 'left') {
|
|
517
|
-
return languageService.translate.instant('igo.geo.directions.left');
|
|
518
|
-
}
|
|
519
|
-
else if (modifier === 'slight left') {
|
|
520
|
-
return languageService.translate.instant('igo.geo.directions.slight left');
|
|
521
|
-
}
|
|
522
|
-
else if (modifier === 'straight') {
|
|
523
|
-
return languageService.translate.instant('igo.geo.directions.straight');
|
|
524
|
-
}
|
|
525
|
-
else {
|
|
526
|
-
return modifier;
|
|
527
|
-
}
|
|
505
|
+
return maneuverModifier
|
|
506
|
+
? translate.instant(`igo.geo.directions.results.maneuverModifier.${maneuverModifier}`)
|
|
507
|
+
: undefined;
|
|
528
508
|
}
|
|
529
|
-
|
|
509
|
+
/**
|
|
510
|
+
* Translates the given bearing value into a human-readable direction using the provided language service.
|
|
511
|
+
*
|
|
512
|
+
* @param {number} bearing - The bearing value to be translated.
|
|
513
|
+
* @param {LanguageService} languageService - The language service used for translation.
|
|
514
|
+
* @return {string} The translated direction corresponding to the given bearing value.
|
|
515
|
+
*/
|
|
516
|
+
export function translateManeuverBearing(bearing, languageService) {
|
|
530
517
|
const translate = languageService.translate;
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
}
|
|
534
|
-
else if (bearing < 67) {
|
|
535
|
-
return translate.instant('igo.geo.cardinalPoints.ne');
|
|
536
|
-
}
|
|
537
|
-
else if (bearing < 113) {
|
|
538
|
-
return translate.instant('igo.geo.cardinalPoints.e');
|
|
539
|
-
}
|
|
540
|
-
else if (bearing < 157) {
|
|
541
|
-
return translate.instant('igo.geo.cardinalPoints.se');
|
|
542
|
-
}
|
|
543
|
-
else if (bearing < 203) {
|
|
544
|
-
return translate.instant('igo.geo.cardinalPoints.s');
|
|
545
|
-
}
|
|
546
|
-
else if (bearing < 247) {
|
|
547
|
-
return translate.instant('igo.geo.cardinalPoints.sw');
|
|
548
|
-
}
|
|
549
|
-
else if (bearing < 293) {
|
|
550
|
-
return translate.instant('igo.geo.cardinalPoints.w');
|
|
551
|
-
}
|
|
552
|
-
else if (bearing < 337) {
|
|
553
|
-
return translate.instant('igo.geo.cardinalPoints.nw');
|
|
554
|
-
}
|
|
555
|
-
else {
|
|
556
|
-
return;
|
|
557
|
-
}
|
|
518
|
+
const directions = ['n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'];
|
|
519
|
+
const directionIndex = Math.round(bearing / 45) % 8;
|
|
520
|
+
return translate.instant(`igo.geo.directions.results.direction.${directions[directionIndex]}`);
|
|
558
521
|
}
|
|
559
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9ucy51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2RpcmVjdGlvbnMvc2hhcmVkL2RpcmVjdGlvbnMudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFaEQsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sU0FBUyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0sU0FBUyxDQUFDO0FBRWxDLE9BQU8sS0FBSyxNQUFNLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDO0FBRXBDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFNUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDOUUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDdEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ2pHLE9BQU8sRUFDTCw2QkFBNkIsRUFDN0IsYUFBYSxFQUNkLE1BQU0sbUJBQW1CLENBQUM7QUFjM0I7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLFVBQXNCLEVBQ3RCLFlBQTRCLEtBQUssRUFDakMsS0FBSyxHQUFHLFVBQVU7SUFFbEIsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbkIs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Q0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExhbmd1YWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUvbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgTnVtYmVyVXRpbHMsIHV1aWQgfSBmcm9tICdAaWdvMi91dGlscyc7XG5cbmltcG9ydCBvbEZlYXR1cmUgZnJvbSAnb2wvRmVhdHVyZSc7XG5pbXBvcnQgT2xHZW9KU09OIGZyb20gJ29sL2Zvcm1hdC9HZW9KU09OJztcbmltcG9ydCAqIGFzIG9sR2VvbSBmcm9tICdvbC9nZW9tJztcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPbEdlb21ldHJ5IH0gZnJvbSAnb2wvZ2VvbS9HZW9tZXRyeSc7XG5pbXBvcnQgKiBhcyBvbFByb2ogZnJvbSAnb2wvcHJvaic7XG5pbXBvcnQgKiBhcyBvbFN0eWxlIGZyb20gJ29sL3N0eWxlJztcblxuaW1wb3J0IHsgRmVhdHVyZURhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9kYXRhc291cmNlL3NoYXJlZC9kYXRhc291cmNlcy9mZWF0dXJlLWRhdGFzb3VyY2UnO1xuaW1wb3J0IHsgdHJ5QmluZFN0b3JlTGF5ZXIgfSBmcm9tICcuLi8uLi9mZWF0dXJlL3NoYXJlZC9mZWF0dXJlLXN0b3JlLnV0aWxzJztcbmltcG9ydCB7IEZFQVRVUkUsIEZlYXR1cmVNb3Rpb24gfSBmcm9tICcuLi8uLi9mZWF0dXJlL3NoYXJlZC9mZWF0dXJlLmVudW1zJztcbmltcG9ydCB7IEZlYXR1cmVHZW9tZXRyeSB9IGZyb20gJy4uLy4uL2ZlYXR1cmUvc2hhcmVkL2ZlYXR1cmUuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB0cnlBZGRMb2FkaW5nU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9mZWF0dXJlL3NoYXJlZC9zdHJhdGVnaWVzLnV0aWxzJztcbmltcG9ydCB7IEZlYXR1cmVTdG9yZUxvYWRpbmdTdHJhdGVneSB9IGZyb20gJy4uLy4uL2ZlYXR1cmUvc2hhcmVkL3N0cmF0ZWdpZXMvbG9hZGluZyc7XG5pbXBvcnQgeyBWZWN0b3JMYXllciB9IGZyb20gJy4uLy4uL2xheWVyL3NoYXJlZC9sYXllcnMvdmVjdG9yLWxheWVyJztcbmltcG9ydCB7IGNyZWF0ZU92ZXJsYXlNYXJrZXJTdHlsZSB9IGZyb20gJy4uLy4uL3N0eWxlL3NoYXJlZC9vdmVybGF5L292ZXJsYXktbWFya2VyLXN0eWxlLnV0aWxzJztcbmltcG9ydCB7XG4gIERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlLFxuICBEaXJlY3Rpb25UeXBlXG59IGZyb20gJy4vZGlyZWN0aW9ucy5lbnVtJztcbmltcG9ydCB7XG4gIERpcmVjdGlvbixcbiAgRmVhdHVyZVdpdGhEaXJlY3Rpb24sXG4gIEZlYXR1cmVXaXRoU3RvcCxcbiAgU3RvcFxufSBmcm9tICcuL2RpcmVjdGlvbnMuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIFJvdXRlc0ZlYXR1cmVTdG9yZSxcbiAgU3RlcEZlYXR1cmVTdG9yZSxcbiAgU3RvcHNGZWF0dXJlU3RvcmUsXG4gIFN0b3BzU3RvcmVcbn0gZnJvbSAnLi9zdG9yZSc7XG5cbi8qKlxuICogRnVuY3Rpb24gdGhhdCB1cGRhdCB0aGUgc29ydCBvZiB0aGUgbGlzdCBiYXNlIG9uIHRoZSBwcm92aWRlZCBmaWVsZC5cbiAqIEBwYXJhbSBzb3VyY2Ugc3RvcCBzdG9yZVxuICogQHBhcmFtIGRpcmVjdGlvbiBhc2MgLyBkZXNjIHNvcnQgb3JkZXJcbiAqIEBwYXJhbSBmaWVsZCB0aGUgZmllbGQgdG8gdXNlIHRvIHNvcnQgdGhlIHZpZXdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0b3JlU29ydGluZyhcbiAgc3RvcHNTdG9yZTogU3RvcHNTdG9yZSxcbiAgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnLFxuICBmaWVsZCA9ICdwb3NpdGlvbidcbikge1xuICBzdG9wc1N0b3JlLnZpZXcuc29ydCh7XG4gICAgZGlyZWN0aW9uLFxuICAgIHZhbHVlQWNjZXNzb3I6IChlbnRpdHk6IFN0b3ApID0+IGVudGl0eVtmaWVsZF1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVsYXRpdmVQb3NpdGlvbihcbiAgaW5kZXg6IG51bWJlcixcbiAgdG90YWxMZW5ndGhcbik6IERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlIHtcbiAgbGV0IHJlbGF0aXZlUG9zaXRpb24gPSBEaXJlY3Rpb25SZWxhdGl2ZVBvc2l0aW9uVHlwZS5JbnRlcm1lZGlhdGU7XG4gIGlmIChpbmRleCA9PT0gMCkge1xuICAgIHJlbGF0aXZlUG9zaXRpb24gPSBEaXJlY3Rpb25SZWxhdGl2ZVBvc2l0aW9uVHlwZS5TdGFydDtcbiAgfSBlbHNlIGlmIChpbmRleCA9PT0gdG90YWxMZW5ndGggLSAxKSB7XG4gICAgcmVsYXRpdmVQb3NpdGlvbiA9IERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlLkVuZDtcbiAgfVxuICByZXR1cm4gcmVsYXRpdmVQb3NpdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTdG9wc1Bvc2l0aW9uKHN0b3BzU3RvcmU6IFN0b3BzU3RvcmUpIHtcbiAgY29uc3Qgc3RvcHNUb0NvbXB1dGVQb3NpdGlvbiA9IFsuLi5zdG9wc1N0b3JlLmFsbCgpXTtcbiAgc3RvcHNUb0NvbXB1dGVQb3NpdGlvbi5zb3J0KChhLCBiKSA9PiBhLnBvc2l0aW9uIC0gYi5wb3NpdGlvbik7XG4gIHN0b3BzVG9Db21wdXRlUG9zaXRpb24ubWFwKChzdG9wLCBpKSA9PiB7XG4gICAgc3RvcC5wb3NpdGlvbiA9IGk7XG4gICAgc3RvcC5yZWxhdGl2ZVBvc2l0aW9uID0gY29tcHV0ZVJlbGF0aXZlUG9zaXRpb24oXG4gICAgICBzdG9wLnBvc2l0aW9uLFxuICAgICAgc3RvcHNUb0NvbXB1dGVQb3NpdGlvbi5sZW5ndGhcbiAgICApO1xuICB9KTtcbiAgaWYgKHN0b3BzVG9Db21wdXRlUG9zaXRpb24pIHtcbiAgICBzdG9wc1N0b3JlLnVwZGF0ZU1hbnkoc3RvcHNUb0NvbXB1dGVQb3NpdGlvbik7XG4gIH1cbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0aGF0IGFkZCBhIHN0b3AgdG8gdGhlIHN0b3Agc3RvcmUuIFN0b3AgYXJlIGFsd2F5cyBhZGRlZCBiZWZvcmUgdGhlIGxhc3Qgc3RvcC5cbiAqIEBwYXJhbSBzdG9wc1N0b3JlIHN0b3Agc3RvcmUgYXMgYW4gRW50aXR5U3RvcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFN0b3BUb1N0b3JlKHN0b3BzU3RvcmU6IFN0b3BzU3RvcmUpOiBTdG9wIHtcbiAgY29uc3QgaWQgPSB1dWlkKCk7XG4gIGNvbnN0IHN0b3BzID0gc3RvcHNTdG9yZS5hbGwoKTtcbiAgbGV0IHBvc2l0aW9uczogbnVtYmVyW107XG4gIGlmIChzdG9wc1N0b3JlLmNvdW50ID09PSAwKSB7XG4gICAgcG9zaXRpb25zID0gWzBdO1xuICB9IGVsc2Uge1xuICAgIHBvc2l0aW9ucyA9IHN0b3BzLm1hcCgoc3RvcCkgPT4gc3RvcC5wb3NpdGlvbik7XG4gIH1cbiAgY29uc3QgbWF4UG9zaXRpb246IG51bWJlciA9IE1hdGgubWF4KC4uLnBvc2l0aW9ucyk7XG4gIGNvbnN0IGluc2VydFBvc2l0aW9uOiBudW1iZXIgPSBtYXhQb3NpdGlvbjtcbiAgY29uc3QgbGFzdFBvc2l0aW9uOiBudW1iZXIgPSBtYXhQb3NpdGlvbiArIDE7XG5cbiAgY29uc3Qgc3RvcFRvVXBkYXRlID0gc3RvcHNTdG9yZVxuICAgIC5hbGwoKVxuICAgIC5maW5kKChzdG9wKSA9PiBzdG9wLnBvc2l0aW9uID09PSBtYXhQb3NpdGlvbik7XG4gIGlmIChzdG9wVG9VcGRhdGUpIHtcbiAgICBzdG9wVG9VcGRhdGUucG9zaXRpb24gPSBsYXN0UG9zaXRpb247XG4gICAgc3RvcFRvVXBkYXRlLnJlbGF0aXZlUG9zaXRpb24gPSBjb21wdXRlUmVsYXRpdmVQb3NpdGlvbihcbiAgICAgIGxhc3RQb3NpdGlvbixcbiAgICAgIHN0b3BzU3RvcmUuY291bnQgKyAxXG4gICAgKTtcbiAgfVxuXG4gIHN0b3BzU3RvcmUuaW5zZXJ0KHtcbiAgICBpZCxcbiAgICBwb3NpdGlvbjogaW5zZXJ0UG9zaXRpb24sXG4gICAgcmVsYXRpdmVQb3NpdGlvbjogY29tcHV0ZVJlbGF0aXZlUG9zaXRpb24oXG4gICAgICBpbnNlcnRQb3NpdGlvbixcbiAgICAgIHN0b3BzU3RvcmUuY291bnQgKyAxXG4gICAgKVxuICB9KTtcblxuICB1cGRhdGVTdG9yZVNvcnRpbmcoc3RvcHNTdG9yZSk7XG4gIHJldHVybiBzdG9wc1N0b3JlLmdldChpZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVTdG9wRnJvbVN0b3JlKHN0b3BzU3RvcmU6IFN0b3BzU3RvcmUsIHN0b3A6IFN0b3ApIHtcbiAgc3RvcHNTdG9yZS5kZWxldGUoc3RvcCk7XG4gIGNvbXB1dGVTdG9wc1Bvc2l0aW9uKHN0b3BzU3RvcmUpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHN0eWxlIGZvciB0aGUgZGlyZWN0aW9ucyBzdG9wcyBhbmQgcm91dGVzXG4gKiBAcGFyYW0gZmVhdHVyZSBPbEZlYXR1cmVcbiAqIEByZXR1cm5zIE9MIHN0eWxlIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3Rpb25zU3R5bGUoXG4gIGZlYXR1cmU6IG9sRmVhdHVyZTxPbEdlb21ldHJ5PlxuKTogb2xTdHlsZS5TdHlsZSB8IG9sU3R5bGUuU3R5bGVbXSB7XG4gIGNvbnN0IHZlcnRleFN0eWxlID0gW1xuICAgIG5ldyBvbFN0eWxlLlN0eWxlKHtcbiAgICAgIGdlb21ldHJ5OiBmZWF0dXJlLmdldEdlb21ldHJ5KCksXG4gICAgICBpbWFnZTogbmV3IG9sU3R5bGUuQ2lyY2xlKHtcbiAgICAgICAgcmFkaXVzOiA3LFxuICAgICAgICBzdHJva2U6IG5ldyBvbFN0eWxlLlN0cm9rZSh7IGNvbG9yOiAnI0ZGMDAwMCcsIHdpZHRoOiAzIH0pXG4gICAgICB9KVxuICAgIH0pXG4gIF07XG5cbiAgY29uc3Qgc3RvcFN0eWxlID0gY3JlYXRlT3ZlcmxheU1hcmtlclN0eWxlKHtcbiAgICB0ZXh0OiBmZWF0dXJlLmdldCgnc3RvcFRleHQnKSxcbiAgICBvcGFjaXR5OiBmZWF0dXJlLmdldCgnc3RvcE9wYWNpdHknKSxcbiAgICBtYXJrZXJDb2xvcjogZmVhdHVyZS5nZXQoJ3N0b3BDb2xvcicpLFxuICAgIG1hcmtlck91dGxpbmVDb2xvcjogWzI1NSwgMjU1LCAyNTVdXG4gIH0pO1xuXG4gIGNvbnN0IHJvdXRlU3R5bGUgPSBbXG4gICAgbmV3IG9sU3R5bGUuU3R5bGUoe1xuICAgICAgc3Ryb2tlOiBuZXcgb2xTdHlsZS5TdHJva2Uoe1xuICAgICAgICBjb2xvcjogYHJnYmEoMTA2LCAxMjEsIDEzMCwgJHtmZWF0dXJlLmdldCgnYWN0aXZlJykgPyAwLjc1IDogMH0pYCxcbiAgICAgICAgd2lkdGg6IDEwXG4gICAgICB9KVxuICAgIH0pLFxuICAgIG5ldyBvbFN0eWxlLlN0eWxlKHtcbiAgICAgIHN0cm9rZTogbmV3IG9sU3R5bGUuU3Ryb2tlKHtcbiAgICAgICAgY29sb3I6IGByZ2JhKDc5LCAxNjksIDIyMSwgJHtmZWF0dXJlLmdldCgnYWN0aXZlJykgPyAwLjc1IDogMH0pYCxcbiAgICAgICAgd2lkdGg6IDZcbiAgICAgIH0pXG4gICAgfSlcbiAgXTtcblxuICBpZiAoZmVhdHVyZS5nZXQoJ3R5cGUnKSA9PT0gRGlyZWN0aW9uVHlwZS5TdG9wKSB7XG4gICAgcmV0dXJuIHN0b3BTdHlsZTtcbiAgfVxuICBpZiAoZmVhdHVyZS5nZXQoJ3R5cGUnKSA9PT0gJ3ZlcnRleCcpIHtcbiAgICByZXR1cm4gdmVydGV4U3R5bGU7XG4gIH1cbiAgaWYgKGZlYXR1cmUuZ2V0KCd0eXBlJykgPT09IERpcmVjdGlvblR5cGUuUm91dGUpIHtcbiAgICByZXR1cm4gcm91dGVTdHlsZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdFN0b3BzRmVhdHVyZVN0b3JlKFxuICBzdG9wc0ZlYXR1cmVTdG9yZTogU3RvcHNGZWF0dXJlU3RvcmUsXG4gIGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlXG4pIHtcbiAgY29uc3QgbG9hZGluZ1N0cmF0ZWd5ID0gbmV3IEZlYXR1cmVTdG9yZUxvYWRpbmdTdHJhdGVneSh7XG4gICAgbW90aW9uOiBGZWF0dXJlTW90aW9uLk5vbmVcbiAgfSk7XG5cbiAgY29uc3Qgc3RvcHNMYXllciA9IG5ldyBWZWN0b3JMYXllcih7XG4gICAgaXNJZ29JbnRlcm5hbExheWVyOiB0cnVlLFxuICAgIGlkOiAnaWdvLWRpcmVjdGlvbi1zdG9wcy1sYXllcicsXG4gICAgdGl0bGU6IGxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICdpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLnN0b3BMYXllcidcbiAgICApLFxuICAgIHpJbmRleDogOTExLFxuICAgIHNvdXJjZTogbmV3IEZlYXR1cmVEYXRhU291cmNlKCksXG4gICAgc2hvd0luTGF5ZXJMaXN0OiB0cnVlLFxuICAgIHdvcmtzcGFjZToge1xuICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICB9LFxuICAgIGxpbmtlZExheWVyczoge1xuICAgICAgbGlua0lkOiAnaWdvLWRpcmVjdGlvbi1zdG9wcy1sYXllcicsXG4gICAgICBsaW5rczogW1xuICAgICAgICB7XG4gICAgICAgICAgc3luY2VkRGVsZXRlOiB0cnVlLFxuICAgICAgICAgIGxpbmtlZElkczogWydpZ28tZGlyZWN0aW9uLXJvdXRlLWxheWVyJ10sXG4gICAgICAgICAgcHJvcGVydGllczogW11cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAgZXhwb3J0YWJsZTogdHJ1ZSxcbiAgICBicm93c2FibGU6IGZhbHNlLFxuICAgIHN0eWxlOiBkaXJlY3Rpb25zU3R5bGVcbiAgfSk7XG4gIHRyeUJpbmRTdG9yZUxheWVyKHN0b3BzRmVhdHVyZVN0b3JlLCBzdG9wc0xheWVyKTtcbiAgc3RvcHNGZWF0dXJlU3RvcmUubGF5ZXIudmlzaWJsZSA9IHRydWU7XG4gIHRyeUFkZExvYWRpbmdTdHJhdGVneShzdG9wc0ZlYXR1cmVTdG9yZSwgbG9hZGluZ1N0cmF0ZWd5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRSb3V0ZXNGZWF0dXJlU3RvcmUoXG4gIHJvdXRlc0ZlYXR1cmVTdG9yZTogUm91dGVzRmVhdHVyZVN0b3JlLFxuICBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZVxuKSB7XG4gIGNvbnN0IGxvYWRpbmdTdHJhdGVneSA9IG5ldyBGZWF0dXJlU3RvcmVMb2FkaW5nU3RyYXRlZ3koe1xuICAgIG1vdGlvbjogRmVhdHVyZU1vdGlvbi5Ob25lXG4gIH0pO1xuXG4gIGNvbnN0IHJvdXRlTGF5ZXIgPSBuZXcgVmVjdG9yTGF5ZXIoe1xuICAgIGlzSWdvSW50ZXJuYWxMYXllcjogdHJ1ZSxcbiAgICBpZDogJ2lnby1kaXJlY3Rpb24tcm91dGUtbGF5ZXInLFxuICAgIHRpdGxlOiBsYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAnaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5yb3V0ZUxheWVyJ1xuICAgICksXG4gICAgekluZGV4OiA5MTAsXG4gICAgc291cmNlOiBuZXcgRmVhdHVyZURhdGFTb3VyY2UoKSxcbiAgICBzaG93SW5MYXllckxpc3Q6IHRydWUsXG4gICAgd29ya3NwYWNlOiB7XG4gICAgICBlbmFibGVkOiBmYWxzZVxuICAgIH0sXG4gICAgbGlua2VkTGF5ZXJzOiB7XG4gICAgICBsaW5rSWQ6ICdpZ28tZGlyZWN0aW9uLXJvdXRlLWxheWVyJ1xuICAgIH0sXG4gICAgZXhwb3J0YWJsZTogdHJ1ZSxcbiAgICBicm93c2FibGU6IGZhbHNlLFxuICAgIHN0eWxlOiBkaXJlY3Rpb25zU3R5bGVcbiAgfSk7XG4gIHRyeUJpbmRTdG9yZUxheWVyKHJvdXRlc0ZlYXR1cmVTdG9yZSwgcm91dGVMYXllcik7XG4gIHJvdXRlc0ZlYXR1cmVTdG9yZS5sYXllci52aXNpYmxlID0gdHJ1ZTtcbiAgdHJ5QWRkTG9hZGluZ1N0cmF0ZWd5KHJvdXRlc0ZlYXR1cmVTdG9yZSwgbG9hZGluZ1N0cmF0ZWd5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRTdGVwRmVhdHVyZVN0b3JlKHN0ZXBGZWF0dXJlU3RvcmU6IFN0ZXBGZWF0dXJlU3RvcmUpIHtcbiAgY29uc3QgbG9hZGluZ1N0cmF0ZWd5ID0gbmV3IEZlYXR1cmVTdG9yZUxvYWRpbmdTdHJhdGVneSh7XG4gICAgbW90aW9uOiBGZWF0dXJlTW90aW9uLk5vbmVcbiAgfSk7XG5cbiAgY29uc3Qgc3RlcExheWVyID0gbmV3IFZlY3RvckxheWVyKHtcbiAgICBpc0lnb0ludGVybmFsTGF5ZXI6IHRydWUsXG4gICAgaWQ6ICdpZ28tZGlyZWN0aW9uLXN0ZXAtbGF5ZXInLFxuICAgIHRpdGxlOiAnJyxcbiAgICB6SW5kZXg6IDkxMCxcbiAgICBzb3VyY2U6IG5ldyBGZWF0dXJlRGF0YVNvdXJjZSgpLFxuICAgIHNob3dJbkxheWVyTGlzdDogZmFsc2UsXG4gICAgd29ya3NwYWNlOiB7XG4gICAgICBlbmFibGVkOiBmYWxzZVxuICAgIH0sXG4gICAgbGlua2VkTGF5ZXJzOiB7XG4gICAgICBsaW5rSWQ6ICdpZ28tZGlyZWN0aW9uLXJvdXRlLWxheWVyJ1xuICAgIH0sXG4gICAgZXhwb3J0YWJsZTogZmFsc2UsXG4gICAgYnJvd3NhYmxlOiBmYWxzZSxcbiAgICBzdHlsZTogZGlyZWN0aW9uc1N0eWxlXG4gIH0pO1xuICB0cnlCaW5kU3RvcmVMYXllcihzdGVwRmVhdHVyZVN0b3JlLCBzdGVwTGF5ZXIpO1xuICBzdGVwRmVhdHVyZVN0b3JlLmxheWVyLnZpc2libGUgPSB0cnVlO1xuICB0cnlBZGRMb2FkaW5nU3RyYXRlZ3koc3RlcEZlYXR1cmVTdG9yZSwgbG9hZGluZ1N0cmF0ZWd5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFN0b3BUb1N0b3BzRmVhdHVyZVN0b3JlKFxuICBzdG9wOiBTdG9wLFxuICBzdG9wc1N0b3JlOiBTdG9wc1N0b3JlLFxuICBzdG9wc0ZlYXR1cmVTdG9yZTogU3RvcHNGZWF0dXJlU3RvcmUsXG4gIHByb2plY3Rpb246IHN0cmluZyxcbiAgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2Vcbikge1xuICBsZXQgc3RvcENvbG9yO1xuICBsZXQgc3RvcFRleHQ7XG5cbiAgc3dpdGNoIChzdG9wLnJlbGF0aXZlUG9zaXRpb24pIHtcbiAgICBjYXNlIERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlLlN0YXJ0OlxuICAgICAgc3RvcENvbG9yID0gJyMwMDgwMDAnO1xuICAgICAgc3RvcFRleHQgPSBsYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLnN0YXJ0J1xuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRGlyZWN0aW9uUmVsYXRpdmVQb3NpdGlvblR5cGUuRW5kOlxuICAgICAgc3RvcENvbG9yID0gJyNmNjQxMzknO1xuICAgICAgc3RvcFRleHQgPSBsYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLmVuZCdcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgc3RvcENvbG9yID0gJyNmZmQ3MDAnO1xuICAgICAgc3RvcFRleHQgPVxuICAgICAgICBsYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0uaW50ZXJtZWRpYXRlJ1xuICAgICAgICApICtcbiAgICAgICAgJyAjJyArXG4gICAgICAgIHN0b3AucG9zaXRpb247XG4gICAgICBicmVhaztcbiAgfVxuXG4gIGNvbnN0IGdlb21ldHJ5ID0gbmV3IG9sR2VvbS5Qb2ludChcbiAgICBvbFByb2oudHJhbnNmb3JtKFxuICAgICAgc3RvcC5jb29yZGluYXRlcyxcbiAgICAgIHByb2plY3Rpb24sXG4gICAgICBzdG9wc0ZlYXR1cmVTdG9yZS5tYXAucHJvamVjdGlvblxuICAgIClcbiAgKTtcblxuICBjb25zdCBnZW9qc29uR2VvbSA9IG5ldyBPbEdlb0pTT04oKS53cml0ZUdlb21ldHJ5T2JqZWN0KGdlb21ldHJ5LCB7XG4gICAgZmVhdHVyZVByb2plY3Rpb246IHN0b3BzRmVhdHVyZVN0b3JlLm1hcC5wcm9qZWN0aW9uLFxuICAgIGRhdGFQcm9qZWN0aW9uOiBzdG9wc0ZlYXR1cmVTdG9yZS5tYXAucHJvamVjdGlvblxuICB9KSBhcyBGZWF0dXJlR2VvbWV0cnk7XG5cbiAgY29uc3QgcHJldmlvdXNTdG9wID0gc3RvcHNGZWF0dXJlU3RvcmUuZ2V0KHN0b3AuaWQpO1xuICBjb25zdCBwcmV2aW91c1N0b3BSZXZpc2lvbiA9IHByZXZpb3VzU3RvcCA/IHByZXZpb3VzU3RvcC5tZXRhLnJldmlzaW9uIDogMDtcblxuICBjb25zdCBzdG9wRmVhdHVyZVN0b3JlOiBGZWF0dXJlV2l0aFN0b3AgPSB7XG4gICAgdHlwZTogRkVBVFVSRSxcbiAgICBnZW9tZXRyeTogZ2VvanNvbkdlb20sXG4gICAgcHJvamVjdGlvbjogc3RvcHNGZWF0dXJlU3RvcmUubWFwLnByb2plY3Rpb24sXG4gICAgcHJvcGVydGllczoge1xuICAgICAgaWQ6IHN0b3AuaWQsXG4gICAgICB0eXBlOiBEaXJlY3Rpb25UeXBlLlN0b3AsXG4gICAgICBzdG9wVGV4dCxcbiAgICAgIHN0b3BDb2xvcixcbiAgICAgIHN0b3BPcGFjaXR5OiAxLFxuICAgICAgc3RvcFxuICAgIH0sXG4gICAgbWV0YToge1xuICAgICAgaWQ6IHN0b3AuaWQsXG4gICAgICByZXZpc2lvbjogcHJldmlvdXNTdG9wUmV2aXNpb24gKyAxXG4gICAgfSxcbiAgICBvbDogbmV3IG9sRmVhdHVyZSh7IGdlb21ldHJ5IH0pXG4gIH07XG4gIHN0b3BzRmVhdHVyZVN0b3JlLnVwZGF0ZShzdG9wRmVhdHVyZVN0b3JlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZERpcmVjdGlvblRvUm91dGVzRmVhdHVyZVN0b3JlKFxuICByb3V0ZXNGZWF0dXJlU3RvcmU6IFJvdXRlc0ZlYXR1cmVTdG9yZSxcbiAgZGlyZWN0aW9uOiBEaXJlY3Rpb24sXG4gIHByb2plY3Rpb246IHN0cmluZyxcbiAgYWN0aXZlID0gZmFsc2Vcbikge1xuICBjb25zdCBnZW9tID0gZGlyZWN0aW9uLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICBjb25zdCBnZW9tZXRyeTQzMjYgPSBuZXcgb2xHZW9tLkxpbmVTdHJpbmcoZ2VvbSk7XG4gIGNvbnN0IGdlb21ldHJ5ID0gZ2VvbWV0cnk0MzI2LnRyYW5zZm9ybShcbiAgICBwcm9qZWN0aW9uLFxuICAgIHJvdXRlc0ZlYXR1cmVTdG9yZS5tYXAucHJvamVjdGlvblxuICApO1xuXG4gIGNvbnN0IGdlb2pzb25HZW9tID0gbmV3IE9sR2VvSlNPTigpLndyaXRlR2VvbWV0cnlPYmplY3QoZ2VvbWV0cnksIHtcbiAgICBmZWF0dXJlUHJvamVjdGlvbjogcm91dGVzRmVhdHVyZVN0b3JlLm1hcC5wcm9qZWN0aW9uLFxuICAgIGRhdGFQcm9qZWN0aW9uOiByb3V0ZXNGZWF0dXJlU3RvcmUubWFwLnByb2plY3Rpb25cbiAgfSkgYXMgRmVhdHVyZUdlb21ldHJ5O1xuXG4gIGNvbnN0IHByZXZpb3VzUm91dGUgPSByb3V0ZXNGZWF0dXJlU3RvcmUuZ2V0KGRpcmVjdGlvbi5pZCk7XG4gIGNvbnN0IHByZXZpb3VzUm91dGVSZXZpc2lvbiA9IHByZXZpb3VzUm91dGUgPyBwcmV2aW91c1JvdXRlLm1ldGEucmV2aXNpb24gOiAwO1xuXG4gIGNvbnN0IHJvdXRlRmVhdHVyZVN0b3JlOiBGZWF0dXJlV2l0aERpcmVjdGlvbiA9IHtcbiAgICB0eXBlOiBGRUFUVVJFLFxuICAgIGdlb21ldHJ5OiBnZW9qc29uR2VvbSxcbiAgICBwcm9qZWN0aW9uOiByb3V0ZXNGZWF0dXJlU3RvcmUubWFwLnByb2plY3Rpb24sXG4gICAgcHJvcGVydGllczoge1xuICAgICAgaWQ6IGRpcmVjdGlvbi5pZCxcbiAgICAgIHR5cGU6IERpcmVjdGlvblR5cGUuUm91dGUsXG4gICAgICBhY3RpdmUsXG4gICAgICBkaXJlY3Rpb25cbiAgICB9LFxuICAgIG1ldGE6IHtcbiAgICAgIGlkOiBkaXJlY3Rpb24uaWQsXG4gICAgICByZXZpc2lvbjogcHJldmlvdXNSb3V0ZVJldmlzaW9uICsgMVxuICAgIH0sXG4gICAgb2w6IG5ldyBvbEZlYXR1cmUoeyBnZW9tZXRyeSB9KVxuICB9O1xuICByb3V0ZXNGZWF0dXJlU3RvcmUudXBkYXRlKHJvdXRlRmVhdHVyZVN0b3JlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERpc3RhbmNlKGRpc3RhbmNlOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoZGlzdGFuY2UgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGRpc3RhbmNlID49IDEwMDAwMCkge1xuICAgIHJldHVybiBOdW1iZXJVdGlscy5yb3VuZFRvTkRlY2ltYWwoTWF0aC5yb3VuZChkaXN0YW5jZSkgLyAxMDAwLCAxKSArICcga20nO1xuICB9XG4gIGlmIChkaXN0YW5jZSA+PSAxMDAwMCkge1xuICAgIHJldHVybiAoXG4gICAgICBOdW1iZXJVdGlscy5yb3VuZFRvTkRlY2ltYWwoTWF0aC5yb3VuZChkaXN0YW5jZSkgLyAxMDAgLyAxMCwgMSkgKyAnIGttJ1xuICAgICk7XG4gIH1cbiAgaWYgKGRpc3RhbmNlID49IDEwMDApIHtcbiAgICByZXR1cm4gKFxuICAgICAgTnVtYmVyVXRpbHMucm91bmRUb05EZWNpbWFsKE1hdGgucm91bmQoZGlzdGFuY2UpIC8gMTAwIC8gMTAsIDEpICsgJyBrbSdcbiAgICApO1xuICB9XG4gIHJldHVybiBOdW1iZXJVdGlscy5yb3VuZFRvTkRlY2ltYWwoZGlzdGFuY2UsIDApICsgJyBtJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKGR1cmF0aW9uOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoZHVyYXRpb24gPj0gMzYwMCkge1xuICAgIGNvbnN0IGhvdXIgPSBNYXRoLmZsb29yKGR1cmF0aW9uIC8gMzYwMCk7XG4gICAgY29uc3QgbWludXRlID0gTWF0aC5yb3VuZCgoZHVyYXRpb24gLyAzNjAwIC0gaG91cikgKiA2MCk7XG4gICAgaWYgKG1pbnV0ZSA9PT0gNjApIHtcbiAgICAgIHJldHVybiBob3VyICsgMSArICcgaCc7XG4gICAgfVxuICAgIHJldHVybiBob3VyICsgJyBoICcgKyBtaW51dGUgKyAnIG1pbic7XG4gIH1cblxuICBpZiAoZHVyYXRpb24gPj0gNjApIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChkdXJhdGlvbiAvIDYwKSArICcgbWluJztcbiAgfVxuICByZXR1cm4gZHVyYXRpb24gKyAnIHMnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0SW5zdHJ1Y3Rpb24oXG4gIHR5cGUsXG4gIG1vZGlmaWVyLFxuICByb3V0ZSA9ICdWb2llJyxcbiAgZGlyZWN0aW9uLFxuICBzdGVwUG9zaXRpb24sXG4gIGV4aXQsXG4gIGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlLFxuICBsYXN0U3RlcCA9IGZhbHNlXG4pIHtcbiAgY29uc3QgdHJhbnNsYXRlID0gbGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZTtcbiAgbGV0IGRpcmVjdGl2ZTtcbiAgbGV0IGltYWdlID0gJ2Fycm93X2ZvcndhcmQnO1xuICBsZXQgY3NzQ2xhc3MgPSAncm90YXRlLTI3MCc7XG4gIGNvbnN0IHRyYW5zbGF0ZWREaXJlY3Rpb24gPSB0cmFuc2xhdGVCZWFyaW5nKGRpcmVjdGlvbiwgbGFuZ3VhZ2VTZXJ2aWNlKTtcbiAgY29uc3QgdHJhbnNsYXRlZE1vZGlmaWVyID0gdHJhbnNsYXRlTW9kaWZpZXIobW9kaWZpZXIsIGxhbmd1YWdlU2VydmljZSk7XG4gIGNvbnN0IHByZWZpeCA9XG4gICAgbW9kaWZpZXIgPT09ICdzdHJhaWdodCdcbiAgICAgID8gJydcbiAgICAgIDogdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5tb2RpZmllci5wcmVmaXgnKTtcblxuICBsZXQgYWdncmVnYXRlZERpcmVjdGlvbiA9IHByZWZpeCArIHRyYW5zbGF0ZWRNb2RpZmllcjtcblxuICBpZiAobW9kaWZpZXI/LnNlYXJjaCgnc2xpZ2h0JykgPj0gMCkge1xuICAgIGFnZ3JlZ2F0ZWREaXJlY3Rpb24gPSB0cmFuc2xhdGVkTW9kaWZpZXI7XG4gIH1cblxuICBpZiAobW9kaWZpZXIgPT09ICd1dHVybicpIHtcbiAgICBpbWFnZSA9ICdhcnJvd19mb3J3YXJkJztcbiAgICBjc3NDbGFzcyA9ICdyb3RhdGUtOTAnO1xuICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2hhcnAgcmlnaHQnKSB7XG4gICAgaW1hZ2UgPSAnc3ViZGlyZWN0b3J5X2Fycm93X3JpZ2h0JztcbiAgICBjc3NDbGFzcyA9ICdpY29uLWZsaXBwZWQnO1xuICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAncmlnaHQnKSB7XG4gICAgaW1hZ2UgPSAnc3ViZGlyZWN0b3J5X2Fycm93X3JpZ2h0JztcbiAgICBjc3NDbGFzcyA9ICdpY29uLWZsaXBwZWQnO1xuICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2xpZ2h0IHJpZ2h0Jykge1xuICAgIGltYWdlID0gJ2Fycm93X2ZvcndhcmQnO1xuICAgIGNzc0NsYXNzID0gJ3JvdGF0ZS0yOTAnO1xuICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc3RyYWlnaHQnKSB7XG4gICAgaW1hZ2UgPSAnYXJyb3dfZm9yd2FyZCc7XG4gIH0gZWxzZSBpZiAobW9kaWZpZXIgPT09ICdzbGlnaHQgbGVmdCcpIHtcbiAgICBpbWFnZSA9ICdhcnJvd19mb3J3YXJkJztcbiAgICBjc3NDbGFzcyA9ICdyb3RhdGUtMjUwJztcbiAgfSBlbHNlIGlmIChtb2RpZmllciA9PT0gJ2xlZnQnKSB7XG4gICAgaW1hZ2UgPSAnc3ViZGlyZWN0b3J5X2Fycm93X2xlZnQnO1xuICAgIGNzc0NsYXNzID0gJ2ljb24tZmxpcHBlZCc7XG4gIH0gZWxzZSBpZiAobW9kaWZpZXIgPT09ICdzaGFycCBsZWZ0Jykge1xuICAgIGltYWdlID0gJ3N1YmRpcmVjdG9yeV9hcnJvd19sZWZ0JztcbiAgICBjc3NDbGFzcyA9ICdpY29uLWZsaXBwZWQnO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09ICd0dXJuJykge1xuICAgIGlmIChtb2RpZmllciA9PT0gJ3N0cmFpZ2h0Jykge1xuICAgICAgZGlyZWN0aXZlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy50dXJuLnN0cmFpZ2h0Jywge1xuICAgICAgICByb3V0ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChtb2RpZmllciA9PT0gJ3V0dXJuJykge1xuICAgICAgZGlyZWN0aXZlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy50dXJuLnV0dXJuJywgeyByb3V0ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlyZWN0aXZlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy50dXJuLmVsc2UnLCB7XG4gICAgICAgIHJvdXRlLFxuICAgICAgICBhZ2dyZWdhdGVkRGlyZWN0aW9uLFxuICAgICAgICB0cmFuc2xhdGVkTW9kaWZpZXJcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbmV3IG5hbWUnKSB7XG4gICAgZGlyZWN0aXZlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5uZXcgbmFtZScsIHtcbiAgICAgIHJvdXRlLFxuICAgICAgdHJhbnNsYXRlZERpcmVjdGlvblxuICAgIH0pO1xuICAgIGltYWdlID0gJ2V4cGxvcmUnO1xuICAgIGNzc0NsYXNzID0gJyc7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2RlcGFydCcpIHtcbiAgICBkaXJlY3RpdmUgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLmRlcGFydCcsIHtcbiAgICAgIHJvdXRlLFxuICAgICAgdHJhbnNsYXRlZERpcmVjdGlvblxuICAgIH0pO1xuICAgIGltYWdlID0gJ2V4cGxvcmUnO1xuICAgIGNzc0NsYXNzID0gJyc7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Fycml2ZScpIHtcbiAgICBpZiAobGFzdFN0ZXApIHtcbiAgICAgIGNvbnN0IGNvbWEgPSAhdHJhbnNsYXRlZE1vZGlmaWVyID8gJycgOiAnLCAnO1xuICAgICAgYWdncmVnYXRlZERpcmVjdGlvbiA9ICF0cmFuc2xhdGVkTW9kaWZpZXIgPyAnJyA6IGFnZ3JlZ2F0ZWREaXJlY3Rpb247XG4gICAgICBkaXJlY3RpdmUgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLmFycml2ZS5sYXN0U3RlcCcsIHtcbiAgICAgICAgY29tYSxcbiAgICAgICAgYWdncmVnYXRlZERpcmVjdGlvblxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpcmVjdGl2ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMuYXJyaXZlLmludGVybWVkaWF0ZScsIHtcbiAgICAgICAgcm91dGVcbiAgICAgIH0pO1xuICAgICAgaW1hZ2UgPSAnbG9jYXRpb25fb24nO1xuICAgICAgY3NzQ2xhc3MgPSAnJztcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ21lcmdlJykge1xuICAgIGRpcmVjdGl2ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMubWVyZ2UnLCB7IHJvdXRlIH0pO1xuICAgIGltYWdlID0gJ2Fycm93X2ZvcndhcmQnO1xuICAgIGNzc0NsYXNzID0gJ3JvdGF0ZS0yNzAnO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvbiByYW1wJykge1xuICAgIGRpcmVjdGl2ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMub24gcmFtcCcsIHtcbiAgICAgIGFnZ3JlZ2F0ZWREaXJlY3Rpb25cbiAgICB9KTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnb2ZmIHJhbXAnKSB7XG4gICAgZGlyZWN0aXZlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5vZmYgcmFtcCcsIHtcbiAgICAgIGFnZ3JlZ2F0ZWREaXJlY3Rpb25cbiAgICB9KTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnZm9yaycpIHtcbiAgICBpZiAobW9kaWZpZXIuc2VhcmNoKCdsZWZ0JykgPj0gMCkge1xuICAgICAgZGlyZWN0aXZlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5mb3JrLmxlZnQnLCB7IHJvdXRlIH0pO1xuICAgIH0gZWxzZSBpZiAobW9kaWZpZXIuc2VhcmNoKCdyaWdodCcpID49IDApIHtcbiAgICAgIGRpcmVjdGl2ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMuZm9yay5yaWdodCcsIHsgcm91dGUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpcmVjdGl2ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMuZm9yay5lbHNlJywgeyByb3V0ZSB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2VuZCBvZiByb2FkJykge1xuICAgIGRpcmVjdGl2ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMuZW5kIG9mIHJvYWQnLCB7XG4gICAgICB0cmFuc2xhdGVkTW9kaWZpZXIsXG4gICAgICByb3V0ZVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICd1c2UgbGFuZScpIHtcbiAgICBkaXJlY3RpdmUgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLnVzZSBsYW5lJyk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NvbnRpbnVlJyAmJiBtb2RpZmllciAhPT0gJ3V0dXJuJykge1xuICAgIGRpcmVjdGl2ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMuY29udGludWUubm90VXR1cm4nLCB7XG4gICAgICByb3V0ZVxuICAgIH0pO1xuICAgIGltYWdlID0gJ2Fycm93X2ZvcndhcmQnO1xuICAgIGNzc0NsYXNzID0gJ3JvdGF0ZS0yNzAnO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdyb3VuZGFib3V0Jykge1xuICAgIGNvbnN0IGNudFN1ZmZpeCA9XG4gICAgICBleGl0ID09PSAxXG4gICAgICAgID8gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5jbnRTdWZmaXguZmlyc3QnKVxuICAgICAgICA6IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMuY250U3VmZml4LnNlY29uZEFuZE1vcmUnKTtcbiAgICBkaXJlY3RpdmUgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLnJvdW5kYWJvdXQnLCB7XG4gICAgICBleGl0LFxuICAgICAgY250U3VmZml4LFxuICAgICAgcm91dGVcbiAgICB9KTtcbiAgICBpbWFnZSA9ICdkb251dF9sYXJnZSc7XG4gICAgY3NzQ2xhc3MgPSAnJztcbiAgfSBlbHNlIGlmICh0eXBlID09PSAncm90YXJ5Jykge1xuICAgIGRpcmVjdGl2ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMucm90YXJ5Jyk7XG4gICAgaW1hZ2UgPSAnZG9udXRfbGFyZ2UnO1xuICAgIGNzc0NsYXNzID0gJyc7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3JvdW5kYWJvdXQgdHVybicpIHtcbiAgICBkaXJlY3RpdmUgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLnJvdW5kYWJvdXQgdHVybicpO1xuICAgIGltYWdlID0gJ2RvbnV0X2xhcmdlJztcbiAgICBjc3NDbGFzcyA9ICcnO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdleGl0IHJvdW5kYWJvdXQnKSB7XG4gICAgZGlyZWN0aXZlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5leGl0IHJvdW5kYWJvdXQnLCB7XG4gICAgICByb3V0ZVxuICAgIH0pO1xuICAgIGltYWdlID0gJ2Fycm93X2ZvcndhcmQnO1xuICAgIGNzc0NsYXNzID0gJ3JvdGF0ZS0yNzAnO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdub3RpZmljYXRpb24nKSB7XG4gICAgZGlyZWN0aXZlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5ub3RpZmljYXRpb24nKTtcbiAgfSBlbHNlIGlmIChtb2RpZmllciA9PT0gJ3V0dXJuJykge1xuICAgIGRpcmVjdGl2ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMudXR1cm5UZXh0Jywge1xuICAgICAgdHJhbnNsYXRlZERpcmVjdGlvbixcbiAgICAgIHJvdXRlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgZGlyZWN0aXZlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy51bmtub3duJyk7XG4gIH1cblxuICBpbWFnZSA9IGxhc3RTdGVwID8gJ2ZsYWcnIDogaW1hZ2U7XG4gIGNzc0NsYXNzID0gbGFzdFN0ZXAgPyAnJyA6IGNzc0NsYXNzO1xuICBpbWFnZSA9IHN0ZXBQb3NpdGlvbiA9PT0gMCA/ICdleHBsb3JlJyA6IGltYWdlO1xuICBjc3NDbGFzcyA9IHN0ZXBQb3NpdGlvbiA9PT0gMCA/ICcnIDogY3NzQ2xhc3M7XG5cbiAgcmV0dXJuIHsgaW5zdHJ1Y3Rpb246IGRpcmVjdGl2ZSwgaW1hZ2UsIGNzc0NsYXNzIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVNb2RpZmllcihtb2RpZmllciwgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UpIHtcbiAgY29uc3QgdHJhbnNsYXRlID0gbGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZTtcbiAgaWYgKG1vZGlmaWVyID09PSAndXR1cm4nKSB7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMudXR1cm4nKTtcbiAgfSBlbHNlIGlmIChtb2RpZmllciA9PT0gJ3NoYXJwIHJpZ2h0Jykge1xuICAgIHJldHVybiB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLnNoYXJwIHJpZ2h0Jyk7XG4gIH0gZWxzZSBpZiAobW9kaWZpZXIgPT09ICdyaWdodCcpIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5yaWdodCcpO1xuICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2xpZ2h0IHJpZ2h0Jykge1xuICAgIHJldHVybiB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLnNsaWdodCByaWdodCcpO1xuICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2hhcnAgbGVmdCcpIHtcbiAgICByZXR1cm4gbGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMuc2hhcnAgbGVmdCcpO1xuICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnbGVmdCcpIHtcbiAgICByZXR1cm4gbGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMubGVmdCcpO1xuICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2xpZ2h0IGxlZnQnKSB7XG4gICAgcmV0dXJuIGxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLnNsaWdodCBsZWZ0Jyk7XG4gIH0gZWxzZSBpZiAobW9kaWZpZXIgPT09ICdzdHJhaWdodCcpIHtcbiAgICByZXR1cm4gbGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMuc3RyYWlnaHQnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbW9kaWZpZXI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZUJlYXJpbmcoXG4gIGJlYXJpbmc6IG51bWJlcixcbiAgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2Vcbikge1xuICBjb25zdCB0cmFuc2xhdGUgPSBsYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlO1xuICBpZiAoYmVhcmluZyA+PSAzMzcgfHwgYmVhcmluZyA8IDIzKSB7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmNhcmRpbmFsUG9pbnRzLm4nKTtcbiAgfSBlbHNlIGlmIChiZWFyaW5nIDwgNjcpIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uY2FyZGluYWxQb2ludHMubmUnKTtcbiAgfSBlbHNlIGlmIChiZWFyaW5nIDwgMTEzKSB7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmNhcmRpbmFsUG9pbnRzLmUnKTtcbiAgfSBlbHNlIGlmIChiZWFyaW5nIDwgMTU3KSB7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmNhcmRpbmFsUG9pbnRzLnNlJyk7XG4gIH0gZWxzZSBpZiAoYmVhcmluZyA8IDIwMykge1xuICAgIHJldHVybiB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5jYXJkaW5hbFBvaW50cy5zJyk7XG4gIH0gZWxzZSBpZiAoYmVhcmluZyA8IDI0Nykge1xuICAgIHJldHVybiB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5jYXJkaW5hbFBvaW50cy5zdycpO1xuICB9IGVsc2UgaWYgKGJlYXJpbmcgPCAyOTMpIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uY2FyZGluYWxQb2ludHMudycpO1xuICB9IGVsc2UgaWYgKGJlYXJpbmcgPCAzMzcpIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uY2FyZGluYWxQb2ludHMubncnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm47XG4gIH1cbn1cbiJdfQ==
|
|
522
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9ucy51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2RpcmVjdGlvbnMvc2hhcmVkL2RpcmVjdGlvbnMudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFaEQsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE9BQU8sU0FBUyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0sU0FBUyxDQUFDO0FBRWxDLE9BQU8sS0FBSyxNQUFNLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDO0FBSXBDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFNUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDOUUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDdEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ2pHLE9BQU8sRUFDTCw2QkFBNkIsRUFDN0IsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixZQUFZLEVBQ2IsTUFBTSxtQkFBbUIsQ0FBQztBQWUzQjs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLFVBQXNCLEVBQ3RCLFlBQTRCLEtBQUssRUFDakMsS0FBSyxHQUFHLFVBQVU7SUFFbEIsVUFBVSxDQUFDLElB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Q0FDdEMsT0FBZSxFQUNmLGVBQWdDO0lBRWhDLE1BQU0sU0FBUyxHQUFxQixlQUFlLENBQUMsU0FBUyxDQUFDO0lBQzlELE1BQU0sVUFBVSxHQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRTFFLE1BQU0sY0FBYyxHQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU1RCxPQUFPLFNBQVMsQ0FBQyxPQUFPLENBQ3RCLHdDQUF3QyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FDckUsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMYW5ndWFnZVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL2xhbmd1YWdlJztcbmltcG9ydCB7IE51bWJlclV0aWxzLCB1dWlkIH0gZnJvbSAnQGlnbzIvdXRpbHMnO1xuXG5pbXBvcnQgb2xGZWF0dXJlIGZyb20gJ29sL0ZlYXR1cmUnO1xuaW1wb3J0IHsgQ29vcmRpbmF0ZSB9IGZyb20gJ29sL2Nvb3JkaW5hdGUnO1xuaW1wb3J0IE9sR2VvSlNPTiBmcm9tICdvbC9mb3JtYXQvR2VvSlNPTic7XG5pbXBvcnQgKiBhcyBvbEdlb20gZnJvbSAnb2wvZ2VvbSc7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT2xHZW9tZXRyeSB9IGZyb20gJ29sL2dlb20vR2VvbWV0cnknO1xuaW1wb3J0ICogYXMgb2xQcm9qIGZyb20gJ29sL3Byb2onO1xuaW1wb3J0ICogYXMgb2xTdHlsZSBmcm9tICdvbC9zdHlsZSc7XG5cbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuaW1wb3J0IHsgRmVhdHVyZURhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9kYXRhc291cmNlL3NoYXJlZC9kYXRhc291cmNlcy9mZWF0dXJlLWRhdGFzb3VyY2UnO1xuaW1wb3J0IHsgdHJ5QmluZFN0b3JlTGF5ZXIgfSBmcm9tICcuLi8uLi9mZWF0dXJlL3NoYXJlZC9mZWF0dXJlLXN0b3JlLnV0aWxzJztcbmltcG9ydCB7IEZFQVRVUkUsIEZlYXR1cmVNb3Rpb24gfSBmcm9tICcuLi8uLi9mZWF0dXJlL3NoYXJlZC9mZWF0dXJlLmVudW1zJztcbmltcG9ydCB7IEZlYXR1cmVHZW9tZXRyeSB9IGZyb20gJy4uLy4uL2ZlYXR1cmUvc2hhcmVkL2ZlYXR1cmUuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB0cnlBZGRMb2FkaW5nU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9mZWF0dXJlL3NoYXJlZC9zdHJhdGVnaWVzLnV0aWxzJztcbmltcG9ydCB7IEZlYXR1cmVTdG9yZUxvYWRpbmdTdHJhdGVneSB9IGZyb20gJy4uLy4uL2ZlYXR1cmUvc2hhcmVkL3N0cmF0ZWdpZXMvbG9hZGluZyc7XG5pbXBvcnQgeyBWZWN0b3JMYXllciB9IGZyb20gJy4uLy4uL2xheWVyL3NoYXJlZC9sYXllcnMvdmVjdG9yLWxheWVyJztcbmltcG9ydCB7IGNyZWF0ZU92ZXJsYXlNYXJrZXJTdHlsZSB9IGZyb20gJy4uLy4uL3N0eWxlL3NoYXJlZC9vdmVybGF5L292ZXJsYXktbWFya2VyLXN0eWxlLnV0aWxzJztcbmltcG9ydCB7XG4gIERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlLFxuICBEaXJlY3Rpb25zVHlwZSxcbiAgTWFuZXV2ZXJNb2RpZmllcixcbiAgTWFuZXV2ZXJUeXBlXG59IGZyb20gJy4vZGlyZWN0aW9ucy5lbnVtJztcbmltcG9ydCB7XG4gIERpcmVjdGlvbnMsXG4gIEZlYXR1cmVXaXRoRGlyZWN0aW9ucyxcbiAgRmVhdHVyZVdpdGhTdG9wLFxuICBJZ29TdGVwLFxuICBTdG9wXG59IGZyb20gJy4vZGlyZWN0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgUm91dGVzRmVhdHVyZVN0b3JlLFxuICBTdGVwc0ZlYXR1cmVTdG9yZSxcbiAgU3RvcHNGZWF0dXJlU3RvcmUsXG4gIFN0b3BzU3RvcmVcbn0gZnJvbSAnLi9zdG9yZSc7XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgc29ydGluZyBvZiB0aGUgc3RvcHMgaW4gdGhlIHByb3ZpZGVkIFN0b3BzU3RvcmUgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBmaWVsZCBhbmQgZGlyZWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RvcHNTdG9yZX0gc3RvcHNTdG9yZSAtIFRoZSBTdG9wc1N0b3JlIHRvIHVwZGF0ZSB0aGUgc29ydGluZyBmb3IuXG4gKiBAcGFyYW0geydhc2MnIHwgJ2Rlc2MnfSBbZGlyZWN0aW9uPSdhc2MnXSAtIFRoZSBkaXJlY3Rpb24gb2Ygc29ydGluZyAoJ2FzYycgZm9yIGFzY2VuZGluZywgJ2Rlc2MnIGZvciBkZXNjZW5kaW5nKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmllbGQ9J3Bvc2l0aW9uJ10gLSBUaGUgZmllbGQgdG8gc29ydCB0aGUgc3RvcHMgYnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdG9yZVNvcnRpbmcoXG4gIHN0b3BzU3RvcmU6IFN0b3BzU3RvcmUsXG4gIGRpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgPSAnYXNjJyxcbiAgZmllbGQgPSAncG9zaXRpb24nXG4pOiB2b2lkIHtcbiAgc3RvcHNTdG9yZS52aWV3LnNvcnQoe1xuICAgIGRpcmVjdGlvbixcbiAgICB2YWx1ZUFjY2Vzc29yOiAoZW50aXR5OiBTdG9wKSA9PiBlbnRpdHlbZmllbGRdXG4gIH0pO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiBhIHN0b3AgaW4gYSBsaXN0IG9mIHN0b3BzLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdG9wSW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIHN0b3AuXG4gKiBAcGFyYW0ge251bWJlcn0gc3RvcExpc3RMZW5ndGggLSBUaGUgdG90YWwgbnVtYmVyIG9mIHN0b3BzLlxuICogQHJldHVybiB7RGlyZWN0aW9uUmVsYXRpdmVQb3NpdGlvblR5cGV9IFRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgc3RvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVSZWxhdGl2ZVBvc2l0aW9uKFxuICBzdG9wSW5kZXg6IG51bWJlcixcbiAgc3RvcExpc3RMZW5ndGg6IG51bWJlclxuKTogRGlyZWN0aW9uUmVsYXRpdmVQb3NpdGlvblR5cGUge1xuICBsZXQgcmVsYXRpdmVQb3NpdGlvbjogRGlyZWN0aW9uUmVsYXRpdmVQb3NpdGlvblR5cGUgPVxuICAgIERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlLkludGVybWVkaWF0ZTtcbiAgaWYgKHN0b3BJbmRleCA9PT0gMCkge1xuICAgIHJlbGF0aXZlUG9zaXRpb24gPSBEaXJlY3Rpb25SZWxhdGl2ZVBvc2l0aW9uVHlwZS5TdGFydDtcbiAgfSBlbHNlIGlmIChzdG9wSW5kZXggPT09IHN0b3BMaXN0TGVuZ3RoKSB7XG4gICAgcmVsYXRpdmVQb3NpdGlvbiA9IERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlLkVuZDtcbiAgfVxuICByZXR1cm4gcmVsYXRpdmVQb3NpdGlvbjtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgcG9zaXRpb24gYW5kIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHN0b3BzIGluIHRoZSBnaXZlbiBzdG9wc1N0b3JlLlxuICpcbiAqIEBwYXJhbSB7U3RvcHNTdG9yZX0gc3RvcHNTdG9yZSAtIFRoZSBzdG9yZSBjb250YWluaW5nIHRoZSBzdG9wcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTdG9wc1Bvc2l0aW9uKFxuICBkZWxldGVkU3RvcEluZGV4OiBudW1iZXIsXG4gIHN0b3BzU3RvcmU6IFN0b3BzU3RvcmVcbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IHN0b3Agb2Ygc3RvcHNTdG9yZS5hbGwoKSkge1xuICAgIHN0b3AucG9zaXRpb24gPVxuICAgICAgc3RvcC5wb3NpdGlvbiA+IGRlbGV0ZWRTdG9wSW5kZXggPyAoc3RvcC5wb3NpdGlvbiAtPSAxKSA6IHN0b3AucG9zaXRpb247XG4gICAgc3RvcC5yZWxhdGl2ZVBvc2l0aW9uID0gY29tcHV0ZVJlbGF0aXZlUG9zaXRpb24oXG4gICAgICBzdG9wLnBvc2l0aW9uLFxuICAgICAgc3RvcHNTdG9yZS5hbGwoKS5sZW5ndGggLSAxXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEFkZHMgYSBzdG9wIHRvIHRoZSBnaXZlbiBzdG9wc1N0b3JlLiBUaGUgc3RvcCBpcyBhbHdheXMgYWRkZWQgYXMgdGhlIGxhc3Qgc3RvcC5cbiAqXG4gKiBAcGFyYW0ge1N0b3BzU3RvcmV9IHN0b3BzU3RvcmUgLSBUaGUgc3RvcmUgY29udGFpbmluZyB0aGUgc3RvcHMuXG4gKiBAcmV0dXJuIHtTdG9wfSBUaGUgbmV3bHkgYWRkZWQgc3RvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFN0b3BUb1N0b3JlKHN0b3BzU3RvcmU6IFN0b3BzU3RvcmUpOiBTdG9wIHtcbiAgY29uc3QgaWQ6IHN0cmluZyA9IHV1aWQoKTtcbiAgY29uc3Qgc3RvcHM6IFN0b3BbXSA9IHN0b3BzU3RvcmUuYWxsKCk7XG4gIGNvbnN0IGluc2VydEluZGV4ID0gc3RvcHMubGVuZ3RoO1xuXG4gIGZvciAoY29uc3Qgc3RvcCBvZiBzdG9wc1N0b3JlLmFsbCgpKSB7XG4gICAgc3RvcC5yZWxhdGl2ZVBvc2l0aW9uID0gY29tcHV0ZVJlbGF0aXZlUG9zaXRpb24oXG4gICAgICBzdG9wLnBvc2l0aW9uLFxuICAgICAgc3RvcHMubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIHN0b3BzU3RvcmUuaW5zZXJ0KHtcbiAgICBpZCxcbiAgICBwb3NpdGlvbjogaW5zZXJ0SW5kZXgsXG4gICAgcmVsYXRpdmVQb3NpdGlvbjogY29tcHV0ZVJlbGF0aXZlUG9zaXRpb24oaW5zZXJ0SW5kZXgsIHN0b3BzLmxlbmd0aClcbiAgfSk7XG5cbiAgdXBkYXRlU3RvcmVTb3J0aW5nKHN0b3BzU3RvcmUpO1xuICByZXR1cm4gc3RvcHNTdG9yZS5nZXQoaWQpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYSBzdG9wIGZyb20gdGhlIGdpdmVuIHN0b3BzU3RvcmUgYW5kIHVwZGF0ZXMgdGhlIHBvc2l0aW9ucyBvZiB0aGUgcmVtYWluaW5nIHN0b3BzLlxuICpcbiAqIEBwYXJhbSB7U3RvcHNTdG9yZX0gc3RvcHNTdG9yZSAtIFRoZSBzdG9yZSBjb250YWluaW5nIHRoZSBzdG9wcy5cbiAqIEBwYXJhbSB7U3RvcH0gc3RvcCAtIFRoZSBzdG9wIHRvIGJlIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVTdG9wRnJvbVN0b3JlKHN0b3BzU3RvcmU6IFN0b3BzU3RvcmUsIHN0b3A6IFN0b3ApOiB2b2lkIHtcbiAgc3RvcHNTdG9yZS5kZWxldGUoc3RvcCk7XG4gIGNvbXB1dGVTdG9wc1Bvc2l0aW9uKHN0b3AucG9zaXRpb24sIHN0b3BzU3RvcmUpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHN0eWxlIGZvciB0aGUgZGlyZWN0aW9ucyBzdGVwcywgc3RvcHMgYW5kIHJvdXRlXG4gKiBAcGFyYW0gZmVhdHVyZSBPbEZlYXR1cmVcbiAqIEByZXR1cm5zIE9MIHN0eWxlIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3Rpb25zU3R5bGUoXG4gIGZlYXR1cmU6IG9sRmVhdHVyZTxPbEdlb21ldHJ5PlxuKTogb2xTdHlsZS5TdHlsZSB8IG9sU3R5bGUuU3R5bGVbXSB7XG4gIGNvbnN0IHN0ZXBTdHlsZSA9IFtcbiAgICBuZXcgb2xTdHlsZS5TdHlsZSh7XG4gICAgICBnZW9tZXRyeTogZmVhdHVyZS5nZXRHZW9tZXRyeSgpLFxuICAgICAgaW1hZ2U6IG5ldyBvbFN0eWxlLkNpcmNsZSh7XG4gICAgICAgIHJhZGl1czogNyxcbiAgICAgICAgc3Ryb2tlOiBuZXcgb2xTdHlsZS5TdHJva2UoeyBjb2xvcjogJyNGRjAwMDAnLCB3aWR0aDogMyB9KVxuICAgICAgfSlcbiAgICB9KVxuICBdO1xuXG4gIGNvbnN0IHN0b3BTdHlsZTogb2xTdHlsZS5TdHlsZSA9IGNyZWF0ZU92ZXJsYXlNYXJrZXJTdHlsZSh7XG4gICAgdGV4dDogZmVhdHVyZS5nZXQoJ3N0b3BUZXh0JyksXG4gICAgb3BhY2l0eTogZmVhdHVyZS5nZXQoJ3N0b3BPcGFjaXR5JyksXG4gICAgbWFya2VyQ29sb3I6IGZlYXR1cmUuZ2V0KCdzdG9wQ29sb3InKSxcbiAgICBtYXJrZXJPdXRsaW5lQ29sb3I6IFsyNTUsIDI1NSwgMjU1XVxuICB9KTtcblxuICBjb25zdCByb3V0ZVN0eWxlOiBvbFN0eWxlLlN0eWxlW10gPSBbXG4gICAgbmV3IG9sU3R5bGUuU3R5bGUoe1xuICAgICAgc3Ryb2tlOiBuZXcgb2xTdHlsZS5TdHJva2Uoe1xuICAgICAgICBjb2xvcjogYHJnYmEoMTA2LCAxMjEsIDEzMCwgJHtmZWF0dXJlLmdldCgnYWN0aXZlJykgPyAwLjc1IDogMH0pYCxcbiAgICAgICAgd2lkdGg6IDEwXG4gICAgICB9KVxuICAgIH0pLFxuICAgIG5ldyBvbFN0eWxlLlN0eWxlKHtcbiAgICAgIHN0cm9rZTogbmV3IG9sU3R5bGUuU3Ryb2tlKHtcbiAgICAgICAgY29sb3I6IGByZ2JhKDc5LCAxNjksIDIyMSwgJHtmZWF0dXJlLmdldCgnYWN0aXZlJykgPyAwLjc1IDogMH0pYCxcbiAgICAgICAgd2lkdGg6IDZcbiAgICAgIH0pXG4gICAgfSlcbiAgXTtcblxuICBpZiAoZmVhdHVyZS5nZXQoJ3R5cGUnKSA9PT0gRGlyZWN0aW9uc1R5cGUuU3RvcCkge1xuICAgIHJldHVybiBzdG9wU3R5bGU7XG4gIH1cbiAgaWYgKGZlYXR1cmUuZ2V0KCd0eXBlJykgPT09IERpcmVjdGlvbnNUeXBlLlZlcnRleCkge1xuICAgIHJldHVybiBzdGVwU3R5bGU7XG4gIH1cbiAgaWYgKGZlYXR1cmUuZ2V0KCd0eXBlJykgPT09IERpcmVjdGlvbnNUeXBlLlJvdXRlKSB7XG4gICAgcmV0dXJuIHJvdXRlU3R5bGU7XG4gIH1cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgc3RvcHMgZmVhdHVyZSBzdG9yZSB3aXRoIHRoZSBwcm92aWRlZCBsYW5ndWFnZSBzZXJ2aWNlLlxuICpcbiAqIEBwYXJhbSB7U3RvcHNGZWF0dXJlU3RvcmV9IHN0b3BzRmVhdHVyZVN0b3JlIC0gVGhlIHN0b3BzIGZlYXR1cmUgc3RvcmUgdG8gaW5pdGlhbGl6ZS5cbiAqIEBwYXJhbSB7TGFuZ3VhZ2VTZXJ2aWNlfSBsYW5ndWFnZVNlcnZpY2UgLSBUaGUgbGFuZ3VhZ2Ugc2VydmljZSB1c2VkIGZvciB0cmFuc2xhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0U3RvcHNGZWF0dXJlU3RvcmUoXG4gIHN0b3BzRmVhdHVyZVN0b3JlOiBTdG9wc0ZlYXR1cmVTdG9yZSxcbiAgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2Vcbik6IHZvaWQge1xuICBjb25zdCBsb2FkaW5nU3RyYXRlZ3k6IEZlYXR1cmVTdG9yZUxvYWRpbmdTdHJhdGVneSA9XG4gICAgbmV3IEZlYXR1cmVTdG9yZUxvYWRpbmdTdHJhdGVneSh7XG4gICAgICBtb3Rpb246IEZlYXR1cmVNb3Rpb24uTm9uZVxuICAgIH0pO1xuXG4gIGNvbnN0IHN0b3BzTGF5ZXI6IFZlY3RvckxheWVyID0gbmV3IFZlY3RvckxheWVyKHtcbiAgICBpc0lnb0ludGVybmFsTGF5ZXI6IHRydWUsXG4gICAgaWQ6ICdpZ28tZGlyZWN0aW9uLXN0b3BzLWxheWVyJyxcbiAgICB0aXRsZTogbGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMubGF5ZXIuc3RvcHMnKSxcbiAgICB6SW5kZXg6IDkxMSxcbiAgICBzb3VyY2U6IG5ldyBGZWF0dXJlRGF0YVNvdXJjZSgpLFxuICAgIHNob3dJbkxheWVyTGlzdDogdHJ1ZSxcbiAgICB2aXNpYmxlOiB0cnVlLFxuICAgIHdvcmtzcGFjZToge1xuICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICB9LFxuICAgIGxpbmtlZExheWVyczoge1xuICAgICAgbGlua0lkOiAnaWdvLWRpcmVjdGlvbi1zdG9wcy1sYXllcicsXG4gICAgICBsaW5rczogW1xuICAgICAgICB7XG4gICAgICAgICAgc3luY2VkRGVsZXRlOiB0cnVlLFxuICAgICAgICAgIGxpbmtlZElkczogWydpZ28tZGlyZWN0aW9uLXJvdXRlLWxheWVyJ10sXG4gICAgICAgICAgcHJvcGVydGllczogW11cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAgZXhwb3J0YWJsZTogdHJ1ZSxcbiAgICBicm93c2FibGU6IGZhbHNlLFxuICAgIHN0eWxlOiBkaXJlY3Rpb25zU3R5bGVcbiAgfSk7XG4gIHRyeUJpbmRTdG9yZUxheWVyKHN0b3BzRmVhdHVyZVN0b3JlLCBzdG9wc0xheWVyKTtcbiAgdHJ5QWRkTG9hZGluZ1N0cmF0ZWd5KHN0b3BzRmVhdHVyZVN0b3JlLCBsb2FkaW5nU3RyYXRlZ3kpO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIHRoZSByb3V0ZXMgZmVhdHVyZSBzdG9yZSB3aXRoIHRoZSBwcm92aWRlZCBsYW5ndWFnZSBzZXJ2aWNlLlxuICpcbiAqIEBwYXJhbSB7U3RvcHNGZWF0dXJlU3RvcmV9IHJvdXRlc0ZlYXR1cmVTdG9yZSAtIFRoZSByb3V0ZXMgZmVhdHVyZSBzdG9yZSB0byBpbml0aWFsaXplLlxuICogQHBhcmFtIHtMYW5ndWFnZVNlcnZpY2V9IGxhbmd1YWdlU2VydmljZSAtIFRoZSBsYW5ndWFnZSBzZXJ2aWNlIHVzZWQgZm9yIHRyYW5zbGF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRSb3V0ZXNGZWF0dXJlU3RvcmUoXG4gIHJvdXRlc0ZlYXR1cmVTdG9yZTogUm91dGVzRmVhdHVyZVN0b3JlLFxuICBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZVxuKTogdm9pZCB7XG4gIGNvbnN0IGxvYWRpbmdTdHJhdGVneTogRmVhdHVyZVN0b3JlTG9hZGluZ1N0cmF0ZWd5ID1cbiAgICBuZXcgRmVhdHVyZVN0b3JlTG9hZGluZ1N0cmF0ZWd5KHtcbiAgICAgIG1vdGlvbjogRmVhdHVyZU1vdGlvbi5Ob25lXG4gICAgfSk7XG5cbiAgY29uc3Qgcm91dGVMYXllcjogVmVjdG9yTGF5ZXIgPSBuZXcgVmVjdG9yTGF5ZXIoe1xuICAgIGlzSWdvSW50ZXJuYWxMYXllcjogdHJ1ZSxcbiAgICBpZDogJ2lnby1kaXJlY3Rpb24tcm91dGUtbGF5ZXInLFxuICAgIHRpdGxlOiBsYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5sYXllci5yb3V0ZScpLFxuICAgIHpJbmRleDogOTEwLFxuICAgIHNvdXJjZTogbmV3IEZlYXR1cmVEYXRhU291cmNlKCksXG4gICAgc2hvd0luTGF5ZXJMaXN0OiB0cnVlLFxuICAgIHZpc2libGU6IHRydWUsXG4gICAgd29ya3NwYWNlOiB7XG4gICAgICBlbmFibGVkOiBmYWxzZVxuICAgIH0sXG4gICAgbGlua2VkTGF5ZXJzOiB7XG4gICAgICBsaW5rSWQ6ICdpZ28tZGlyZWN0aW9uLXJvdXRlLWxheWVyJ1xuICAgIH0sXG4gICAgZXhwb3J0YWJsZTogdHJ1ZSxcbiAgICBicm93c2FibGU6IGZhbHNlLFxuICAgIHN0eWxlOiBkaXJlY3Rpb25zU3R5bGVcbiAgfSk7XG4gIHRyeUJpbmRTdG9yZUxheWVyKHJvdXRlc0ZlYXR1cmVTdG9yZSwgcm91dGVMYXllcik7XG4gIHRyeUFkZExvYWRpbmdTdHJhdGVneShyb3V0ZXNGZWF0dXJlU3RvcmUsIGxvYWRpbmdTdHJhdGVneSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgdGhlIHJvdXRlcyBmZWF0dXJlIHN0b3JlLlxuICpcbiAqIEBwYXJhbSB7U3RvcHNGZWF0dXJlU3RvcmV9IHN0ZXBzRmVhdHVyZVN0b3JlIC0gVGhlIHN0ZXBzIGZlYXR1cmUgc3RvcmUgdG8gaW5pdGlhbGl6ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRTdGVwc0ZlYXR1cmVTdG9yZShzdGVwc0ZlYXR1cmVTdG9yZTogU3RlcHNGZWF0dXJlU3RvcmUpIHtcbiAgY29uc3QgbG9hZGluZ1N0cmF0ZWd5OiBGZWF0dXJlU3RvcmVMb2FkaW5nU3RyYXRlZ3kgPVxuICAgIG5ldyBGZWF0dXJlU3RvcmVMb2FkaW5nU3RyYXRlZ3koe1xuICAgICAgbW90aW9uOiBGZWF0dXJlTW90aW9uLk5vbmVcbiAgICB9KTtcblxuICBjb25zdCBzdGVwTGF5ZXI6IFZlY3RvckxheWVyID0gbmV3IFZlY3RvckxheWVyKHtcbiAgICBpc0lnb0ludGVybmFsTGF5ZXI6IHRydWUsXG4gICAgaWQ6ICdpZ28tZGlyZWN0aW9uLXN0ZXAtbGF5ZXInLFxuICAgIHRpdGxlOiAnJyxcbiAgICB6SW5kZXg6IDkxMCxcbiAgICBzb3VyY2U6IG5ldyBGZWF0dXJlRGF0YVNvdXJjZSgpLFxuICAgIHNob3dJbkxheWVyTGlzdDogZmFsc2UsXG4gICAgdmlzaWJsZTogdHJ1ZSxcbiAgICB3b3Jrc3BhY2U6IHtcbiAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgfSxcbiAgICBsaW5rZWRMYXllcnM6IHtcbiAgICAgIGxpbmtJZDogJ2lnby1kaXJlY3Rpb24tcm91dGUtbGF5ZXInXG4gICAgfSxcbiAgICBleHBvcnRhYmxlOiBmYWxzZSxcbiAgICBicm93c2FibGU6IGZhbHNlLFxuICAgIHN0eWxlOiBkaXJlY3Rpb25zU3R5bGVcbiAgfSk7XG4gIHRyeUJpbmRTdG9yZUxheWVyKHN0ZXBzRmVhdHVyZVN0b3JlLCBzdGVwTGF5ZXIpO1xuICB0cnlBZGRMb2FkaW5nU3RyYXRlZ3koc3RlcHNGZWF0dXJlU3RvcmUsIGxvYWRpbmdTdHJhdGVneSk7XG59XG5cbi8qKlxuICogQWRkcyBhIHN0b3AgdG8gdGhlIHN0b3BzRmVhdHVyZVN0b3JlLlxuICpcbiAqIEBwYXJhbSB7U3RvcH0gc3RvcCAtIFRoZSBzdG9wIHRvIGJlIGFkZGVkLlxuICogQHBhcmFtIHtTdG9wc0ZlYXR1cmVTdG9yZX0gc3RvcHNGZWF0dXJlU3RvcmUgLSBUaGUgc3RvcHNGZWF0dXJlU3RvcmUgdG8gYWRkIHRoZSBzdG9wIHRvLlxuICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3Rpb24gLSBUaGUgcHJvamVjdGlvbiBvZiB0aGUgc3RvcCBjb29yZGluYXRlcy5cbiAqIEBwYXJhbSB7TGFuZ3VhZ2VTZXJ2aWNlfSBsYW5ndWFnZVNlcnZpY2UgLSBUaGUgbGFuZ3VhZ2Ugc2VydmljZSBmb3IgdHJhbnNsYXRpbmcgc3RvcCB0ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkU3RvcFRvU3RvcHNGZWF0dXJlU3RvcmUoXG4gIHN0b3A6IFN0b3AsXG4gIHN0b3BzRmVhdHVyZVN0b3JlOiBTdG9wc0ZlYXR1cmVTdG9yZSxcbiAgcHJvamVjdGlvbjogc3RyaW5nLFxuICBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZVxuKTogdm9pZCB7XG4gIGxldCBzdG9wQ29sb3I6IHN0cmluZztcbiAgbGV0IHN0b3BUZXh0OiBzdHJpbmc7XG5cbiAgc3dpdGNoIChzdG9wLnJlbGF0aXZlUG9zaXRpb24pIHtcbiAgICBjYXNlIERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlLlN0YXJ0OlxuICAgICAgc3RvcENvbG9yID0gJyMwMDgwMDAnO1xuICAgICAgc3RvcFRleHQgPSBsYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmRpcmVjdGlvbnMuaW5wdXQuc3RhcnQnXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBEaXJlY3Rpb25SZWxhdGl2ZVBvc2l0aW9uVHlwZS5FbmQ6XG4gICAgICBzdG9wQ29sb3IgPSAnI2Y2NDEzOSc7XG4gICAgICBzdG9wVGV4dCA9IGxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5nZW8uZGlyZWN0aW9ucy5pbnB1dC5lbmQnXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN0b3BDb2xvciA9ICcjZmZkNzAwJztcbiAgICAgIHN0b3BUZXh0ID1cbiAgICAgICAgbGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICdpZ28uZ2VvLmRpcmVjdGlvbnMuaW5wdXQuaW50ZXJtZWRpYXRlJ1xuICAgICAgICApICtcbiAgICAgICAgJyAjJyArXG4gICAgICAgIHN0b3AucG9zaXRpb247XG4gICAgICBicmVhaztcbiAgfVxuXG4gIGNvbnN0IHBvaW50OiBvbEdlb20uUG9pbnQgPSBuZXcgb2xHZW9tLlBvaW50KFxuICAgIG9sUHJvai50cmFuc2Zvcm0oXG4gICAgICBzdG9wLmNvb3JkaW5hdGVzLFxuICAgICAgcHJvamVjdGlvbixcbiAgICAgIHN0b3BzRmVhdHVyZVN0b3JlLm1hcC5wcm9qZWN0aW9uQ29kZVxuICAgIClcbiAgKTtcblxuICBjb25zdCBnZW9qc29uR2VvbTogRmVhdHVyZUdlb21ldHJ5ID0gbmV3IE9sR2VvSlNPTigpLndyaXRlR2VvbWV0cnlPYmplY3QoXG4gICAgcG9pbnQsXG4gICAge1xuICAgICAgZmVhdHVyZVByb2plY3Rpb246IHN0b3BzRmVhdHVyZVN0b3JlLm1hcC5wcm9qZWN0aW9uQ29kZSxcbiAgICAgIGRhdGFQcm9qZWN0aW9uOiBzdG9wc0ZlYXR1cmVTdG9yZS5tYXAucHJvamVjdGlvbkNvZGVcbiAgICB9XG4gICkgYXMgRmVhdHVyZUdlb21ldHJ5O1xuXG4gIGNvbnN0IHByZXZpb3VzU3RvcDogRmVhdHVyZVdpdGhTdG9wID0gc3RvcHNGZWF0dXJlU3RvcmUuZ2V0KHN0b3AuaWQpO1xuICBjb25zdCBwcmV2aW91c1N0b3BSZXZpc2lvbjogbnVtYmVyID0gcHJldmlvdXNTdG9wXG4gICAgPyBwcmV2aW91c1N0b3AubWV0YS5yZXZpc2lvblxuICAgIDogMDtcblxuICBjb25zdCBzdG9wRmVhdHVyZVN0b3JlOiBGZWF0dXJlV2l0aFN0b3AgPSB7XG4gICAgdHlwZTogRkVBVFVSRSxcbiAgICBnZW9tZXRyeTogZ2VvanNvbkdlb20sXG4gICAgcHJvamVjdGlvbjogc3RvcHNGZWF0dXJlU3RvcmUubWFwLnByb2plY3Rpb25Db2RlLFxuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIGlkOiBzdG9wLmlkLFxuICAgICAgdHlwZTogRGlyZWN0aW9uc1R5cGUuU3RvcCxcbiAgICAgIHN0b3BUZXh0LFxuICAgICAgc3RvcENvbG9yLFxuICAgICAgc3RvcE9wYWNpdHk6IDEsXG4gICAgICBzdG9wXG4gICAgfSxcbiAgICBtZXRhOiB7XG4gICAgICBpZDogc3RvcC5pZCxcbiAgICAgIHJldmlzaW9uOiBwcmV2aW91c1N0b3BSZXZpc2lvbiArIDFcbiAgICB9LFxuICAgIG9sOiBuZXcgb2xGZWF0dXJlKHsgcG9pbnQgfSlcbiAgfTtcbiAgc3RvcHNGZWF0dXJlU3RvcmUudXBkYXRlKHN0b3BGZWF0dXJlU3RvcmUpO1xufVxuXG4vKipcbiAqIEFkZHMgYSByb3V0ZSB0byB0aGUgcm91dGVzIGZlYXR1cmUgc3RvcmUuXG4gKlxuICogQHBhcmFtIHtSb3V0ZXNGZWF0dXJlU3RvcmV9IHJvdXRlc0ZlYXR1cmVTdG9yZSAtIFRoZSByb3V0ZXMgZmVhdHVyZSBzdG9yZSB0byBhZGQgdGhlIHJvdXRlIHRvLlxuICogQHBhcmFtIHtEaXJlY3Rpb25zfSBkaXJlY3Rpb25zIC0gVGhlIGRpcmVjdGlvbnMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGdlb21ldHJ5IGFuZCBvdGhlciBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9qZWN0aW9uIC0gVGhlIHByb2plY3Rpb24gb2YgdGhlIGdlb21ldHJ5IGNvb3JkaW5hdGVzLlxuICogQHBhcmFtIHtib29sZWFufSBbYWN0aXZlPWZhbHNlXSAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkaXJlY3Rpb24gaXMgYWN0aXZlIG9yIG5vdC4gRGVmYXVsdCBpcyBmYWxzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFJvdXRlVG9Sb3V0ZXNGZWF0dXJlU3RvcmUoXG4gIHJvdXRlc0ZlYXR1cmVTdG9yZTogUm91dGVzRmVhdHVyZVN0b3JlLFxuICBkaXJlY3Rpb25zOiBEaXJlY3Rpb25zLFxuICBwcm9qZWN0aW9uOiBzdHJpbmcsXG4gIGFjdGl2ZSA9IGZhbHNlXG4pOiB2b2lkIHtcbiAgY29uc3QgY29vcmRpbmF0ZTogQ29vcmRpbmF0ZSA9IGRpcmVjdGlvbnMuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gIGNvbnN0IGxpbmVzdHJpbmc0MzI2OiBvbEdlb20uTGluZVN0cmluZyA9IG5ldyBvbEdlb20uTGluZVN0cmluZyhjb29yZGluYXRlKTtcbiAgY29uc3QgbGluZXN0cmluZ1N0b3JlOiBvbEdlb20uTGluZVN0cmluZyA9IGxpbmVzdHJpbmc0MzI2LnRyYW5zZm9ybShcbiAgICBwcm9qZWN0aW9uLFxuICAgIHJvdXRlc0ZlYXR1cmVTdG9yZS5tYXAucHJvamVjdGlvbkNvZGVcbiAgKTtcblxuICBjb25zdCBnZW9qc29uR2VvbTogRmVhdHVyZUdlb21ldHJ5ID0gbmV3IE9sR2VvSlNPTigpLndyaXRlR2VvbWV0cnlPYmplY3QoXG4gICAgbGluZXN0cmluZ1N0b3JlLFxuICAgIHtcbiAgICAgIGZlYXR1cmVQcm9qZWN0aW9uOiByb3V0ZXNGZWF0dXJlU3RvcmUubWFwLnByb2plY3Rpb25Db2RlLFxuICAgICAgZGF0YVByb2plY3Rpb246IHJvdXRlc0ZlYXR1cmVTdG9yZS5tYXAucHJvamVjdGlvbkNvZGVcbiAgICB9XG4gICkgYXMgRmVhdHVyZUdlb21ldHJ5O1xuXG4gIGNvbnN0IHByZXZpb3VzUm91dGU6IEZlYXR1cmVXaXRoRGlyZWN0aW9ucyA9IHJvdXRlc0ZlYXR1cmVTdG9yZS5nZXQoXG4gICAgZGlyZWN0aW9ucy5pZFxuICApO1xuICBjb25zdCBwcmV2aW91c1JvdXRlUmV2aXNpb246IG51bWJlciA9IHByZXZpb3VzUm91dGVcbiAgICA/IHByZXZpb3VzUm91dGUubWV0YS5yZXZpc2lvblxuICAgIDogMDtcblxuICBjb25zdCByb3V0ZUZlYXR1cmVTdG9yZTogRmVhdHVyZVdpdGhEaXJlY3Rpb25zID0ge1xuICAgIHR5cGU6IEZFQVRVUkUsXG4gICAgZ2VvbWV0cnk6IGdlb2pzb25HZW9tLFxuICAgIHByb2plY3Rpb246IHJvdXRlc0ZlYXR1cmVTdG9yZS5tYXAucHJvamVjdGlvbkNvZGUsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgaWQ6IGRpcmVjdGlvbnMuaWQsXG4gICAgICB0eXBlOiBEaXJlY3Rpb25zVHlwZS5Sb3V0ZSxcbiAgICAgIGFjdGl2ZSxcbiAgICAgIGRpcmVjdGlvbnNcbiAgICB9LFxuICAgIG1ldGE6IHtcbiAgICAgIGlkOiBkaXJlY3Rpb25zLmlkLFxuICAgICAgcmV2aXNpb246IHByZXZpb3VzUm91dGVSZXZpc2lvbiArIDFcbiAgICB9LFxuICAgIG9sOiBuZXcgb2xGZWF0dXJlKHsgbGluZXN0cmluZ1N0b3JlIH0pXG4gIH07XG4gIHJvdXRlc0ZlYXR1cmVTdG9yZS51cGRhdGUocm91dGVGZWF0dXJlU3RvcmUpO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgdGhlIGdpdmVuIGRpc3RhbmNlIGluIG1ldGVycyB0byBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbWV0ZXJzIC0gVGhlIGRpc3RhbmNlIGluIG1ldGVycyB0byBiZSBmb3JtYXR0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IFRoZSBmb3JtYXR0ZWQgZGlzdGFuY2Ugc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGlzdGFuY2UobWV0ZXJzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobWV0ZXJzID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChtZXRlcnMgPCAxMDAwKSB7XG4gICAgcmV0dXJuIGAke01hdGgucm91bmQobWV0ZXJzKX0gbWA7XG4gIH1cblxuICBjb25zdCBraWxvbWV0ZXJzOiBudW1iZXIgPSBtZXRlcnMgLyAxMDAwO1xuICBjb25zdCByb3VuZFRvRGVjaW1hbDogMCB8IDEgPSBraWxvbWV0ZXJzID49IDEwID8gMSA6IDA7XG5cbiAgcmV0dXJuIGAke051bWJlclV0aWxzLnJvdW5kVG9ORGVjaW1hbChraWxvbWV0ZXJzLCByb3VuZFRvRGVjaW1hbCl9IGttYC5yZXBsYWNlKFxuICAgICcuJyxcbiAgICAnLCdcbiAgKTtcbn1cblxuLyoqXG4gKiBGb3JtYXRzIHRoZSBnaXZlbiBkdXJhdGlvbiBpbiBzZWNvbmRzIHRvIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZWNvbmRzIC0gVGhlIGR1cmF0aW9uIGluIHNlY29uZHMgdG8gYmUgZm9ybWF0dGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIGR1cmF0aW9uIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKHNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGhvdXJzOiBudW1iZXIgPSBNYXRoLmZsb29yKHNlY29uZHMgLyAzNjAwKTtcbiAgY29uc3QgbWludXRlczogbnVtYmVyID0gTWF0aC5mbG9vcigoc2Vjb25kcyAlIDM2MDApIC8gNjApO1xuXG4gIGlmIChob3Vycykge1xuICAgIHJldHVybiBgJHtob3Vyc30gaCAke21pbnV0ZXN9IG1pbmA7XG4gIH1cblxuICBpZiAobWludXRlcykge1xuICAgIHJldHVybiBgJHttaW51dGVzfSBtaW5gO1xuICB9XG5cbiAgcmV0dXJuICc8IDEgbWluJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFN0ZXAoXG4gIHN0ZXA6IElnb1N0ZXAsXG4gIGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlLFxuICBsYXN0U3RlcCA9IGZhbHNlXG4pIHtcbiAgY29uc3QgbWFuZXV2ZXJUeXBlOiBNYW5ldXZlclR5cGUgPSBzdGVwLm1hbmV1dmVyLnR5cGU7XG4gIGNvbnN0IG1hbmV1dmVyTW9kaWZpZXI6IE1hbmV1dmVyTW9kaWZpZXIgPSBzdGVwLm1hbmV1dmVyLm1vZGlmaWVyO1xuICBjb25zdCBuYW1lOiBzdHJpbmcgPSBzdGVwLm5hbWU7XG4gIGNvbnN0IG1hbmV1dmVyQmVhcmluZ0FmdGVyOiBudW1iZXIgPSBzdGVwLm1hbmV1dmVyLmJlYXJpbmdfYWZ0ZXI7XG5cbiAgY29uc3QgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlID0gbGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZTtcbiAgY29uc3QgdHJhbnNsYXRlZE1hbmV1dmVyQmVhcmluZ0FmdGVyOiBzdHJpbmcgPSB0cmFuc2xhdGVNYW5ldXZlckJlYXJpbmcoXG4gICAgbWFuZXV2ZXJCZWFyaW5nQWZ0ZXIsXG4gICAgbGFuZ3VhZ2VTZXJ2aWNlXG4gICk7XG4gIGNvbnN0IHRyYW5zbGF0ZWRNYW5ldXZlck1vZGlmaWVyOiBzdHJpbmcgPSB0cmFuc2xhdGVNYW5ldXZlck1vZGlmaWVyKFxuICAgIG1hbmV1dmVyTW9kaWZpZXIsXG4gICAgbGFuZ3VhZ2VTZXJ2aWNlXG4gICk7XG5cbiAgbGV0IGljb25OYW1lID0gJ3N0cmFpZ2h0JzsgLy8gYXJyb3cgcG9pbnQgdXAgYnkgZGVmYXVsdFxuICBsZXQgaW5zdHJ1Y3Rpb24gPSAnJztcblxuICBpZiAobWFuZXV2ZXJUeXBlID09PSBNYW5ldXZlclR5cGUuVHVybikge1xuICAgIGlmIChcbiAgICAgIG1hbmV1dmVyTW9kaWZpZXIgPT09IE1hbmV1dmVyTW9kaWZpZXIuVXR1cm4gfHxcbiAgICAgIG1hbmV1dmVyTW9kaWZpZXIgPT09IE1hbmV1dmVyTW9kaWZpZXIuU3RyYWlnaHRcbiAgICApIHtcbiAgICAgIGluc3RydWN0aW9uID0gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgIGBpZ28uZ2VvLmRpcmVjdGlvbnMucmVzdWx0cy5tYW5ldXZlclR5cGUudHVybi4ke21hbmV1dmVyTW9kaWZpZXJ9YCxcbiAgICAgICAge1xuICAgICAgICAgIG1hbmV1dmVyTW9kaWZpZXI6IHRyYW5zbGF0ZWRNYW5ldXZlck1vZGlmaWVyLFxuICAgICAgICAgIG5hbWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChtYW5ldXZlck1vZGlmaWVyID09PSBNYW5ldXZlck1vZGlmaWVyLlV0dXJuKSB7XG4gICAgICAgIGljb25OYW1lID0gJ3VfdHVybl9sZWZ0JztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdHJ1Y3Rpb24gPSB0cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5nZW8uZGlyZWN0aW9ucy5yZXN1bHRzLm1hbmV1dmVyVHlwZS50dXJuLmVsc2UnLFxuICAgICAgICB7XG4gICAgICAgICAgbWFuZXV2ZXJNb2RpZmllcjogdHJhbnNsYXRlZE1hbmV1dmVyTW9kaWZpZXIsXG4gICAgICAgICAgbmFtZVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBpZiAobWFuZXV2ZXJNb2RpZmllciA9PT0gTWFuZXV2ZXJNb2RpZmllci5TbGlnaHRSaWdodCkge1xuICAgICAgICBpY29uTmFtZSA9ICd0dXJuX3NsaWdodF9yaWdodCc7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBtYW5ldXZlck1vZGlmaWVyID09PSBNYW5ldXZlck1vZGlmaWVyLlJpZ2h0IHx8XG4gICAgICAgIG1hbmV1dmVyTW9kaWZpZXIgPT09IE1hbmV1dmVyTW9kaWZpZXIuU2hhcnBSaWdodFxuICAgICAgKSB7XG4gICAgICAgIGljb25OYW1lID0gJ3R1cm5fcmlnaHQnO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgbWFuZXV2ZXJNb2RpZmllciA9PT0gTWFuZXV2ZXJNb2RpZmllci5MZWZ0IHx8XG4gICAgICAgIG1hbmV1dmVyTW9kaWZpZXIgPT09IE1hbmV1dmVyTW9kaWZpZXIuU2hhcnBMZWZ0XG4gICAgICApIHtcbiAgICAgICAgaWNvbk5hbWUgPSAndHVybl9sZWZ0JztcbiAgICAgIH0gZWxzZSBpZiAobWFuZXV2ZXJNb2RpZmllciA9PT0gTWFuZXV2ZXJNb2RpZmllci5TbGlnaHRMZWZ0KSB7XG4gICAgICAgIGljb25OYW1lID0gJ3R1cm5fc2xpZ2h0X2xlZnQnO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChtYW5ldXZlclR5cGUgPT09IE1hbmV1dmVyVHlwZS5OZXdOYW1lKSB7XG4gICAgaW5zdHJ1Y3Rpb24gPSB0cmFuc2xhdGUuaW5zdGFudChcbiAgICAgIGBpZ28uZ2VvLmRpcmVjdGlvbnMucmVzdWx0cy5tYW5ldXZlclR5cGUubmV3IG5hbWVgLFxuICAgICAge1xuICAgICAgICBuYW1lLFxuICAgICAgICBtYW5ldXZlckJlYXJpbmc6IHRyYW5zbGF0ZWRNYW5ldXZlckJlYXJpbmdBZnRlclxuICAgICAgfVxuICAgICk7XG4gIH0gZWxzZSBpZiAobWFuZXV2ZXJUeXBlID09PSBNYW5ldXZlclR5cGUuRGVwYXJ0KSB7XG4gICAgaWNvbk5hbWUgPSAnZGlyZWN0aW9ucyc7XG4gICAgaW5zdHJ1Y3Rpb24gPSB0cmFuc2xhdGUuaW5zdGFudChcbiAgICAgIGBpZ28uZ2VvLmRpcmVjdGlvbnMucmVzdWx0cy5tYW5ldXZlclR5cGUuZGVwYXJ0YCxcbiAgICAgIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbWFuZXV2ZXJCZWFyaW5nOiB0cmFuc2xhdGVkTWFuZXV2ZXJCZWFyaW5nQWZ0ZXJcbiAgICAgIH1cbiAgICApO1xuICB9IGVsc2UgaWYgKG1hbmV1dmVyVHlwZSA9PT0gTWFuZXV2ZXJUeXBlLkFycml2ZSkge1xuICAgIGljb25OYW1lID0gJ3Nwb3J0c19zY29yZSc7XG4gICAgaW5zdHJ1Y3Rpb24gPSB0cmFuc2xhdGUuaW5zdGFudChcbiAgICAgIGBpZ28uZ2VvLmRpcmVjdGlvbnMucmVzdWx0cy5tYW5ldXZlclR5cGUuYXJyaXZlLiR7bGFzdFN0ZXAgPyAnbGFzdFN0ZXAnIDogJ2ludGVybWVkaWF0ZSd9YCxcbiAgICAgIHtcbiAgICAgICAgbmFtZVxuICAgICAgfVxuICAgICk7XG4gIH0gZWxzZSBpZiAobWFuZXV2ZXJUeXBlID09PSBNYW5ldXZlclR5cGUuTWVyZ2UpIHtcbiAgICBpbnN0cnVjdGlvbiA9IHRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgJ2lnby5nZW8uZGlyZWN0aW9ucy5yZXN1bHRzLm1hbmV1dmVyVHlwZS5tZXJnZScsXG4gICAgICB7XG4gICAgICAgIG5hbWVcbiAgICAgIH1cbiAgICApO1xuICAgIGljb25OYW1lID0gJ21lcmdlJztcbiAgfSBlbHNlIGlmIChcbiAgICBtYW5ldXZlclR5cGUgPT09IE1hbmV1dmVyVHlwZS5PblJhbXAgfHxcbiAgICBtYW5ldXZlclR5cGUgPT09IE1hbmV1dmVyVHlwZS5PZmZSYW1wXG4gICkge1xuICAgIGluc3RydWN0aW9uID0gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICBgaWdvLmdlby5kaXJlY3Rpb25zLnJlc3VsdHMubWFuZXV2ZXJUeXBlLiR7bWFuZXV2ZXJUeXBlfWAsXG4gICAgICB7XG4gICAgICAgIG1hbmV1dmVyTW9kaWZpZXI6IHRyYW5zbGF0ZWRNYW5ldXZlck1vZGlmaWVyXG4gICAgICB9XG4gICAgKTtcbiAgfSBlbHNlIGlmIChtYW5ldXZlclR5cGUgPT09IE1hbmV1dmVyVHlwZS5Gb3JrKSB7XG4gICAgY29uc3QgZGlyZWN0aW9uS2V5OiBzdHJpbmcgPVxuICAgICAgbWFuZXV2ZXJNb2RpZmllci5zZWFyY2goJ2xlZnQnKSA+PSAwID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICBpY29uTmFtZSA9XG4gICAgICBkaXJlY3Rpb25LZXkgPT09ICdsZWZ0JyA/ICd0dXJuX3NsaWdodF9sZWZ0JyA6ICd0dXJuX3NsaWdodF9yaWdodCc7XG4gICAgaW5zdHJ1Y3Rpb24gPSB0cmFuc2xhdGUuaW5zdGFudChcbiAgICAgIGBpZ28uZ2VvLmRpcmVjdGlvbnMucmVzdWx0cy5tYW5ldXZlclR5cGUuZm9yay4ke2RpcmVjdGlvbktleX1gLFxuICAgICAge1xuICAgICAgICBuYW1lXG4gICAgICB9XG4gICAgKTtcbiAgfSBlbHNlIGlmIChcbiAgICBtYW5ldXZlclR5cGUgPT09IE1hbmV1dmVyVHlwZS5FbmRPZlJvYWQgfHxcbiAgICBtYW5ldXZlclR5cGUgPT09IE1hbmV1dmVyVHlwZS5Vc2VMYW5lIHx8XG4gICAgbWFuZXV2ZXJUeXBlID09PSBNYW5ldXZlclR5cGUuQ29udGludWVcbiAgKSB7XG4gICAgaWYgKG1hbmV1dmVyVHlwZSA9PT0gTWFuZXV2ZXJUeXBlLkNvbnRpbnVlKSB7XG4gICAgICBpZiAobWFuZXV2ZXJNb2RpZmllciA9PT0gTWFuZXV2ZXJNb2RpZmllci5VdHVybikge1xuICAgICAgICBpY29uTmFtZSA9ICd1X3R1cm5fbGVmdCc7XG4gICAgICAgIGluc3RydWN0aW9uID0gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgYGlnby5nZW8uZGlyZWN0aW9ucy5yZXN1bHRzLm1hbmV1dmVyVHlwZS50dXJuLiR7bWFuZXV2ZXJNb2RpZmllcn1gLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hbmV1dmVyTW9kaWZpZXI6IHRyYW5zbGF0ZWRNYW5ldXZlck1vZGlmaWVyLFxuICAgICAgICAgICAgbmFtZVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3RydWN0aW9uID0gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgYGlnby5nZW8uZGlyZWN0aW9ucy5yZXN1bHRzLm1hbmV1dmVyVHlwZS4ke21hbmV1dmVyVHlwZX1gLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hbmV1dmVyTW9kaWZpZXI6IHRyYW5zbGF0ZWRNYW5ldXZlck1vZGlmaWVyLFxuICAgICAgICAgICAgbmFtZVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKFxuICAgICAgICBtYW5ldXZlck1vZGlmaWVyID09PSBNYW5ldXZlck1vZGlmaWVyLlNoYXJwUmlnaHQgfHxcbiAgICAgICAgbWFuZXV2ZXJNb2RpZmllciA9PT0gTWFuZXV2ZXJNb2RpZmllci5SaWdodFxuICAgICAgKSB7XG4gICAgICAgIGljb25OYW1lID0gJ3R1cm5fcmlnaHQnO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgbWFuZXV2ZXJNb2RpZmllciA9PT0gTWFuZXV2ZXJNb2RpZmllci5TaGFycExlZnQgfHxcbiAgICAgICAgbWFuZXV2ZXJNb2RpZmllciA9PT0gTWFuZXV2ZXJNb2RpZmllci5MZWZ0XG4gICAgICApIHtcbiAgICAgICAgaWNvbk5hbWUgPSAndHVybl9sZWZ0JztcbiAgICAgIH0gZWxzZSBpZiAobWFuZXV2ZXJNb2RpZmllciA9PT0gTWFuZXV2ZXJNb2RpZmllci5TbGlnaHRSaWdodCkge1xuICAgICAgICBpY29uTmFtZSA9ICd0dXJuX3NsaWdodF9yaWdodCc7XG4gICAgICB9IGVsc2UgaWYgKG1hbmV1dmVyTW9kaWZpZXIgPT09IE1hbmV1dmVyTW9kaWZpZXIuU2xpZ2h0TGVmdCkge1xuICAgICAgICBpY29uTmFtZSA9ICd0dXJuX3NsaWdodF9sZWZ0JztcbiAgICAgIH1cbiAgICAgIGluc3RydWN0aW9uID0gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgIGBpZ28uZ2VvLmRpcmVjdGlvbnMucmVzdWx0cy5tYW5ldXZlclR5cGUuJHttYW5ldXZlclR5cGV9YCxcbiAgICAgICAge1xuICAgICAgICAgIG1hbmV1dmVyTW9kaWZpZXI6IHRyYW5zbGF0ZWRNYW5ldXZlck1vZGlmaWVyLFxuICAgICAgICAgIG5hbWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoXG4gICAgbWFuZXV2ZXJUeXBlID09PSBNYW5ldXZlclR5cGUuUm91bmRhYm91dCB8fFxuICAgIG1hbmV1dmVyVHlwZSA9PT0gTWFuZXV2ZXJUeXBlLlJvdGFyeSB8fFxuICAgIG1hbmV1dmVyVHlwZSA9PT0gTWFuZXV2ZXJUeXBlLlJvdW5kYWJvdXRUdXJuIHx8XG4gICAgbWFuZXV2ZXJUeXBlID09PSBNYW5ldXZlclR5cGUuRXhpdFJvdW5kYWJvdXRcbiAgKSB7XG4gICAgY29uc3Qgcm91bmRhYm91dEtleSA9IG1hbmV1dmVyVHlwZS5yZXBsYWNlKCdyb3VuZGFib3V0ICcsICcnKTtcbiAgICBpbnN0cnVjdGlvbiA9IHRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgYGlnby5nZW8uZGlyZWN0aW9ucy5yZXN1bHRzLm1hbmV1dmVyVHlwZS4ke3JvdW5kYWJvdXRLZXl9YCxcbiAgICAgIHtcbiAgICAgICAgbmFtZVxuICAgICAgfVxuICAgICk7XG4gICAgaWNvbk5hbWUgPSAnZG9udXRfbGFyZ2UnO1xuICB9IGVsc2UgaWYgKG1hbmV1dmVyVHlwZSA9PT0gTWFuZXV2ZXJUeXBlLk5vdGlmaWNhdGlvbikge1xuICAgIGluc3RydWN0aW9uID0gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAnaWdvLmdlby5kaXJlY3Rpb25zLnJlc3VsdHMubWFuZXV2ZXJUeXBlLm5vdGlmaWNhdGlvbidcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHsgaW5zdHJ1Y3Rpb24sIGljb25OYW1lIH07XG59XG5cbi8qKlxuICogVHJhbnNsYXRlcyBhIG1hbmV1dmVyIG1vZGlmaWVyIGludG8gYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgdXNpbmcgdGhlIHByb3ZpZGVkIGxhbmd1YWdlIHNlcnZpY2UuXG4gKlxuICogQHBhcmFtIHtNYW5ldXZlck1vZGlmaWVyfSBtYW5ldXZlck1vZGlmaWVyIC0gVGhlIG1hbmV1dmVyIG1vZGlmaWVyIHRvIGJlIHRyYW5zbGF0ZWQuXG4gKiBAcGFyYW0ge0xhbmd1YWdlU2VydmljZX0gbGFuZ3VhZ2VTZXJ2aWNlIC0gVGhlIGxhbmd1YWdlIHNlcnZpY2UgdXNlZCBmb3IgdHJhbnNsYXRpb24uXG4gKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IFRoZSB0cmFuc2xhdGVkIG1hbmV1dmVyIG1vZGlmaWVyIHN0cmluZywgb3IgdW5kZWZpbmVkIGlmIHRoZSBtb2RpZmllciBpcyBmYWxzeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZU1hbmV1dmVyTW9kaWZpZXIoXG4gIG1hbmV1dmVyTW9kaWZpZXI6IE1hbmV1dmVyTW9kaWZpZXIsXG4gIGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlXG4pOiBzdHJpbmcge1xuICBjb25zdCB0cmFuc2xhdGUgPSBsYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlO1xuICByZXR1cm4gbWFuZXV2ZXJNb2RpZmllclxuICAgID8gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgIGBpZ28uZ2VvLmRpcmVjdGlvbnMucmVzdWx0cy5tYW5ldXZlck1vZGlmaWVyLiR7bWFuZXV2ZXJNb2RpZmllcn1gXG4gICAgICApXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJhbnNsYXRlcyB0aGUgZ2l2ZW4gYmVhcmluZyB2YWx1ZSBpbnRvIGEgaHVtYW4tcmVhZGFibGUgZGlyZWN0aW9uIHVzaW5nIHRoZSBwcm92aWRlZCBsYW5ndWFnZSBzZXJ2aWNlLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBiZWFyaW5nIC0gVGhlIGJlYXJpbmcgdmFsdWUgdG8gYmUgdHJhbnNsYXRlZC5cbiAqIEBwYXJhbSB7TGFuZ3VhZ2VTZXJ2aWNlfSBsYW5ndWFnZVNlcnZpY2UgLSBUaGUgbGFuZ3VhZ2Ugc2VydmljZSB1c2VkIGZvciB0cmFuc2xhdGlvbi5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHRyYW5zbGF0ZWQgZGlyZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGJlYXJpbmcgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVNYW5ldXZlckJlYXJpbmcoXG4gIGJlYXJpbmc6IG51bWJlcixcbiAgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2Vcbik6IHN0cmluZyB7XG4gIGNvbnN0IHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSA9IGxhbmd1YWdlU2VydmljZS50cmFuc2xhdGU7XG4gIGNvbnN0IGRpcmVjdGlvbnM6IHN0cmluZ1tdID0gWyduJywgJ25lJywgJ2UnLCAnc2UnLCAncycsICdzdycsICd3JywgJ253J107XG5cbiAgY29uc3QgZGlyZWN0aW9uSW5kZXg6IG51bWJlciA9IE1hdGgucm91bmQoYmVhcmluZyAvIDQ1KSAlIDg7XG5cbiAgcmV0dXJuIHRyYW5zbGF0ZS5pbnN0YW50KFxuICAgIGBpZ28uZ2VvLmRpcmVjdGlvbnMucmVzdWx0cy5kaXJlY3Rpb24uJHtkaXJlY3Rpb25zW2RpcmVjdGlvbkluZGV4XX1gXG4gICk7XG59XG4iXX0=
|