@provoly/dashboard 1.4.58 → 1.4.59
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/admin/components/admin-abac-rules/admin-abac-rules-form/admin-abac-rules-form.component.mjs +1 -1
- package/esm2022/admin/components/admin-abac-rules/components/attribute-condition/attribute-condition.component.mjs +1 -1
- package/esm2022/admin/components/admin-abac-rules/components/metadata-condition/metadata-condition.component.mjs +1 -1
- package/esm2022/admin/components/admin-classes/admin-classes-customize/symbol/admin-classes-customize-symbol.component.mjs +1 -1
- package/esm2022/admin/components/admin-classes/admin-classes-customize/tooltip/admin-classes-customize-tooltip.component.mjs +1 -1
- package/esm2022/admin/components/admin-classes/admin-classes-form/admin-classes-form.component.mjs +1 -1
- package/esm2022/admin/components/admin-classes/admin-classes-view/admin-attributes-form/admin-attributes-form.component.mjs +1 -1
- package/esm2022/admin/components/admin-dataset/admin-form-dataset/admin-form-dataset.component.mjs +1 -1
- package/esm2022/admin/components/admin-environment/admin-environment-form/admin-environment-form.component.mjs +1 -1
- package/esm2022/admin/components/admin-fields/admin-fields-form/admin-fields-form.component.mjs +1 -1
- package/esm2022/admin/components/admin-links/admin-links-new/admin-links-new.component.mjs +1 -1
- package/esm2022/admin/components/admin-metadata/shared/form-metadata/form-metadata.component.mjs +1 -1
- package/esm2022/admin/components/admin-metadata-rules/shared/admin-form-metadata-rules/admin-form-metadata-rules.component.mjs +1 -1
- package/esm2022/components/metadata-editor/metadata-editor.component.mjs +1 -1
- package/esm2022/components/scheme-picker/scheme-picker.component.mjs +1 -1
- package/esm2022/filters/autocomplete/autocomplete.component.mjs +1 -1
- package/esm2022/filters/list/list-filter.component.mjs +1 -1
- package/esm2022/import/components/form/import-form.component.mjs +1 -1
- package/esm2022/import/components/list/import-list.component.mjs +1 -1
- package/esm2022/lib/core/components/select/select.component.mjs +8 -4
- package/esm2022/lib/core/components/share/access-rights-share/access-rights-share.component.mjs +1 -1
- package/esm2022/lib/core/components/share/legacy-share/share.component.mjs +1 -1
- package/esm2022/lib/dashboard/components/context-menu/object-edition/object-edition.component.mjs +1 -1
- package/esm2022/lib/dashboard/components/dashboard.component.mjs +22 -12
- package/esm2022/lib/dashboard/components/widgets/datasource-selector/datasource-list/datasource-list.component.mjs +1 -1
- package/esm2022/lib/dashboard/components/widgets/header/widget-header.component.mjs +90 -19
- package/esm2022/lib/dashboard/store/dashboard.selectors.mjs +3 -2
- package/esm2022/lib/dashboard/store/manifest.service.mjs +5 -3
- package/esm2022/pipeline-components/filter/component/filter.component.mjs +1 -1
- package/esm2022/pipeline-components/input-datasource/component/input-datasource.component.mjs +1 -1
- package/esm2022/pipeline-components/output-dataset/component/output-dataset.component.mjs +1 -1
- package/esm2022/restitution/components/restitution/restitution.component.mjs +1 -1
- package/esm2022/search/search-mono-class/components/search-condition/search-condition.component.mjs +1 -1
- package/esm2022/search/search-mono-class/components/search-mono-class/search-mono-class.component.mjs +1 -1
- package/esm2022/search/search-mono-class/components/search-order/search-order.component.mjs +1 -1
- package/esm2022/search/search-multi-class/components/multi-class-condition/multi-class-condition.component.mjs +1 -1
- package/esm2022/toolbox/components/filter-settings/filter-settings.component.mjs +1 -1
- package/esm2022/toolbox/shared/presentation-form/presentation-form.component.mjs +1 -1
- package/esm2022/widgets/widget-aggregated-chart/component/widget-aggregated-chart.component.mjs +1 -1
- package/esm2022/widgets/widget-analytic/component/widget-analytic.component.mjs +1 -1
- package/esm2022/widgets/widget-chart/component/widget-chart.component.mjs +1 -1
- package/esm2022/widgets/widget-graph/component/widget-graph.component.mjs +1 -1
- package/esm2022/widgets/widget-map/component/widget-map.component.mjs +1 -1
- package/esm2022/widgets/widget-table/component/widget-table.component.mjs +1 -1
- package/esm2022/widgets/widget-tile/component/widget-tile.component.mjs +1 -1
- package/esm2022/widgets/widget-vega/component/widget-vega.component.mjs +5 -5
- package/fesm2022/provoly-dashboard-admin.mjs +13 -13
- package/fesm2022/provoly-dashboard-admin.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-components-metadata-editor.mjs +1 -1
- package/fesm2022/provoly-dashboard-components-metadata-editor.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-components-scheme-picker.mjs +1 -1
- package/fesm2022/provoly-dashboard-components-scheme-picker.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-filters-autocomplete.mjs +1 -1
- package/fesm2022/provoly-dashboard-filters-autocomplete.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-filters-list.mjs +1 -1
- package/fesm2022/provoly-dashboard-filters-list.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-import.mjs +2 -2
- package/fesm2022/provoly-dashboard-import.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-pipeline-components-filter.mjs +1 -1
- package/fesm2022/provoly-dashboard-pipeline-components-filter.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-pipeline-components-input-datasource.mjs +1 -1
- package/fesm2022/provoly-dashboard-pipeline-components-input-datasource.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-pipeline-components-output-dataset.mjs +1 -1
- package/fesm2022/provoly-dashboard-pipeline-components-output-dataset.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-restitution.mjs +1 -1
- package/fesm2022/provoly-dashboard-restitution.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-search.mjs +4 -4
- package/fesm2022/provoly-dashboard-search.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-toolbox.mjs +2 -2
- package/fesm2022/provoly-dashboard-toolbox.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-analytic.mjs +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-analytic.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-chart.mjs +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-chart.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-map.mjs +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-map.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-table.mjs +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-table.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs +4 -4
- package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs.map +1 -1
- package/fesm2022/provoly-dashboard.mjs +202 -116
- package/fesm2022/provoly-dashboard.mjs.map +1 -1
- package/lib/core/components/select/select.component.d.ts +3 -2
- package/lib/dashboard/components/dashboard.component.d.ts +8 -1
- package/lib/dashboard/components/widgets/header/widget-header.component.d.ts +18 -1
- package/lib/dashboard/store/dashboard.selectors.d.ts +17 -0
- package/lib/dashboard/store/manifest.service.d.ts +11 -2
- package/package.json +7 -7
- package/styles/components/_o-widget.scss +28 -0
|
@@ -1207,7 +1207,7 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
1207
1207
|
this.optionsCopy.layerGroups = this.optionsCopy.layerGroups.filter((group) => this.optionsCopy.layers?.some((layer) => layer.group === group.name) || group.name === DEFAULT_LAYER_GROUP);
|
|
1208
1208
|
}
|
|
1209
1209
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: WidgetMapComponent, deps: [{ token: i1.Store }, { token: i2.PryI18nService }, { token: i2.TooltipFactoryService }, { token: i2.SymbolService }, { token: i0.Injector }, { token: i3.WidgetMapLayerService }, { token: i2.PryAggregationService }, { token: i0.ElementRef }, { token: PRY_GEOAUTH_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1210
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: WidgetMapComponent, selector: "pry-widget-map", viewQueries: [{ propertyName: "mapRef", first: true, predicate: ["mapRef"], descendants: true }, { propertyName: "popup", first: true, predicate: ["popup"], descendants: true }, { propertyName: "popupContent", first: true, predicate: ["popupContent"], descendants: true, read: ViewContainerRef }, { propertyName: "exportTypeTemplate", first: true, predicate: ["exportTypeTemplate"], descendants: true, read: TemplateRef }, { propertyName: "sliderElement", first: true, predicate: ["sliderElement"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<pry-widget-map-css></pry-widget-map-css>\n<div class=\"o-widget o-widget--map\">\n @if (displayHeader$ | async) {\n <pry-widget-header\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n #header\n >\n <pry-settings\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [header]=\"header\"\n [open$]=\"open$\"\n class=\"o-settings\"\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_style\">{{ '@pry.widget.map.style' | i18n }} :</label>\n <pry-select\n (ngModelChange)=\"changeStyle($event)\"\n [items]=\"styles$ | async\"\n [ngModel]=\"optionsCopy.style\"\n bindLabel=\"label\"\n bindValue=\"identifier\"\n id=\"map_style\"\n ></pry-select>\n </div>\n @if (optionsCopy.style === STYLE_FROM_URL) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"style_URL\">{{ '@pry.widget.map.styleUrl' | i18n }}</label>\n <input\n id=\"style_URL\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeStyleURL($event)\"\n [value]=\"optionsCopy.styleURL ?? ''\"\n />\n </div>\n }\n <pry-checkbox (ngModelChange)=\"changeAutoLayer($event)\" [ngModel]=\"optionsCopy.automaticLayers ?? false\">\n {{ '@pry.widget.map.autoLayer' | i18n }}\n </pry-checkbox>\n <pry-checkbox (ngModelChange)=\"changeAttributions($event)\" [ngModel]=\"optionsCopy.attributions ?? false\">\n {{ '@pry.widget.map.attributions' | i18n }}\n </pry-checkbox>\n <pry-checkbox (ngModelChange)=\"changeSlideOption($event)\" [ngModel]=\"hasSlideLayer$ | async\">\n {{ '@pry.widget.map.slide.global' | i18n }}\n </pry-checkbox>\n <div class=\"o-layer-settings\" cdkDropListGroup cdkDragBoundary>\n <h4 class=\"a-label\">{{ '@pry.widget.map.layerSettings.title' | i18n }}</h4>\n <div class=\"u-display-flex -justify-center\">\n <button class=\"a-btn a-btn--primary\" (click)=\"addLayerGroup()\" type=\"button\">\n {{ '@pry.widget.map.layerSettings.addLayerGroup' | i18n }}\n </button>\n </div>\n @for (group of optionsCopy.layerGroups; track group; let groupIdx = $index) {\n @if (isGroupUsedByWidgetLayers(group)) {\n <div class=\"o-layer-settings__group\">\n <div class=\"m-form-label-field o-layer-settings__group-title\">\n <label class=\"a-label\" for=\"map_layerGroupTitle-{{ groupIdx }}\">\n {{ '@pry.widget.map.layerSettings.layerGroupName' | i18n }}<span class=\"-obligatory-red\">*</span\n >{{ '@pry.widget.map.layerSettings.optionalColon' | i18n }}\n </label>\n <div class=\"u-display-flex\">\n <div class=\"m-form-label-field u-display-flex -row -gap-10\">\n <input\n id=\"map_layerGroupTitle-{{ groupIdx }}\"\n class=\"a-form-field\"\n type=\"text\"\n (change)=\"updateLayerGroupName(group, $event)\"\n [value]=\"group.name === DEFAULT_LAYER_GROUP ? ('@pry.widget.map.noGroup' | i18n) : group.name\"\n />\n @if (group.name !== DEFAULT_LAYER_GROUP) {\n <button\n class=\"a-btn--icon-only a-tooltip o-layer-settings__delete-group\"\n [attr.data-tooltip]=\"'@pry.widget.map.layerSettings.deleteGroup' | i18n\"\n data-tooltip-position=\"left\"\n (click)=\"deleteLayerGroup(group.name)\"\n >\n <pry-icon [height]=\"16\" [width]=\"16\" iconSvg=\"bin_normal\"></pry-icon>\n </button>\n }\n </div>\n </div>\n </div>\n @if (group.name !== DEFAULT_LAYER_GROUP) {\n <div class=\"m-form-radio-group\">\n <div class=\"m-form-radio-group__item\">\n <input\n type=\"radio\"\n id=\"multiselection-{{ groupIdx }}\"\n [ngModel]=\"group.singleLayer\"\n (ngModelChange)=\"updateLayerGroupSingleLayer(group, $event)\"\n [value]=\"false\"\n [name]=\"group.name\"\n />\n <label class=\"a-label\" for=\"multiselection-{{ groupIdx }}\">{{\n '@pry.widget.map.layerSettings.multipleLayer' | i18n\n }}</label>\n </div>\n <div class=\"m-form-radio-group__item\">\n <input\n type=\"radio\"\n id=\"monoselection-{{ groupIdx }}\"\n [ngModel]=\"group.singleLayer\"\n (ngModelChange)=\"updateLayerGroupSingleLayer(group, $event)\"\n [value]=\"true\"\n [name]=\"group.name\"\n />\n <label class=\"a-label\" for=\"monoselection-{{ groupIdx }}\">{{\n '@pry.widget.map.layerSettings.singleLayer' | i18n\n }}</label>\n </div>\n </div>\n }\n <div class=\"m-btn-group\">\n <div class=\"u-display-flex -align-center\">\n <button (click)=\"addLayer(group)\" class=\"a-btn -link-like\" type=\"button\">\n + {{ '@pry.widget.map.addLayer' | i18n }}\n </button>\n </div>\n <button (click)=\"toggleExpandAll(group)\" class=\"a-btn -link-like\" type=\"button\">\n {{\n layerSettingsExpandedState[group.name]\n ? ('@pry.widget.map.layerSettings.foldAll' | i18n)\n : ('@pry.widget.map.layerSettings.unfoldAll' | i18n)\n }}\n </button>\n </div>\n <div\n cdkDropList\n class=\"o-layer-settings__layers\"\n (cdkDropListDropped)=\"drop($event, group)\"\n [attr.data-layer-group]=\"group.name\"\n >\n @for (layer of optionsCopy?.layers; track layer; let i = $index) {\n @if (layer.group === group.name) {\n <div\n class=\"o-layer-settings__layer-wrapper\"\n cdkDrag\n [cdkDragData]=\"layer\"\n [cdkDragDisabled]=\"layerSettingsExpandedState[layer.title!]\"\n >\n <div class=\"drag-placeholder\" *cdkDragPlaceholder></div>\n <div class=\"o-layer-settings__layer-header\">\n <div class=\"u-display-flex -align-center\">\n <pry-icon\n [class.-disabled]=\"layerSettingsExpandedState[layer.title!]\"\n class=\"drag-handle\"\n [height]=\"16\"\n [width]=\"16\"\n iconSvg=\"drag_indicator\"\n ></pry-icon>\n <button\n class=\"a-btn--icon-only unfold-layer\"\n (click)=\"toggleLayerExpand(layer, group)\"\n type=\"button\"\n >\n <pry-icon\n [height]=\"5\"\n [width]=\"9\"\n [iconSvg]=\"layerSettingsExpandedState[layer.title!] ? 'chevron_top' : 'chevron_bottom'\"\n ></pry-icon>\n </button>\n <h5 class=\"a-h5\">{{ layer.title ?? ('@pry.widget.map.layer' | i18n: { index: i + 1 }) }}</h5>\n </div>\n <button\n class=\"o-layer-settings__delete-layer a-btn--icon-only a-tooltip\"\n [attr.data-tooltip]=\"'@pry.widget.map.layerSettings.deleteLayer' | i18n\"\n data-tooltip-position=\"left\"\n (click)=\"deleteLayer(i, layer, group)\"\n >\n <pry-icon [height]=\"16\" [width]=\"16\" iconSvg=\"bin_normal\"></pry-icon>\n </button>\n </div>\n @if (layerSettingsExpandedState[layer.title!]) {\n <div class=\"o-layer-settings__layer-content\">\n <div class=\"o-settings__popup__content__fields__content\">\n <pry-range\n [ngModel]=\"(layer?.opacity ?? 100) + ''\"\n (ngModelChange)=\"changeOpacity(layer, $event)\"\n labelTranslate=\"@pry.widget.map.opacity\"\n min=\"0\"\n max=\"100\"\n ></pry-range>\n <fieldset>\n <legend class=\"u-visually-hidden\">\n {{ '@pry.widget.map.layerOptions' | i18n: { index: i + 1 } }}\n </legend>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"layer_{{ i + 1 }}_title\">{{\n '@pry.widget.map.layerTitle' | i18n\n }}</label>\n <input\n id=\"layer_{{ i + 1 }}_title\"\n class=\"a-form-field\"\n type=\"text\"\n (change)=\"changeTitle($event, layer, group)\"\n [value]=\"layer.title\"\n />\n </div>\n @if (!['geoserver', 'auto'].includes(layer.type)) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_layerType\">{{\n '@pry.widget.map.layerType.title' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLayerType($event, i)\"\n [items]=\"layerTypes\"\n [ngModel]=\"layer.type\"\n i18nPrefix=\"@pry.widget.map.layerType.\"\n id=\"map_layerType\"\n ></pry-select>\n </div>\n }\n @if (['geoserver', 'wms'].includes(layer.type)) {\n <div class=\"m-form-label-field\">\n @if (getAsWmsType(layer); as wmslayer) {\n <label class=\"a-label\" for=\"map_layerStyle\">{{\n '@pry.widget.map.layerStyle' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLayerStyle($event, layer)\"\n [items]=\"layerStyleOptions(layer)\"\n [ngModel]=\"getStyle(layer)\"\n bindLabel=\"label\"\n bindValue=\"id\"\n id=\"map_layerStyle\"\n ></pry-select>\n }\n </div>\n }\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"changeFit($event, layer)\" [ngModel]=\"layer.fit\">\n {{ '@pry.widget.map.fit' | i18n }}\n </pry-checkbox>\n </div>\n @if (\n layer.type !== 'relation' &&\n layer.type !== 'wms' &&\n layer.type !== 'wmts' &&\n layer.type !== 'geoserver' &&\n layer.type !== 'featurelayer' &&\n layer.type !== 'vectortile' &&\n layer.type !== 'rastertile' &&\n layer.type !== 'auto'\n ) {\n <div\n class=\"m-form-label-field\"\n >\n <label class=\"a-label\" for=\"map_classes\">{{ '@pry.widget.map.classes' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeClasses($event, layer)\"\n [items]=\"usedClasses$ | async\"\n [multiple]=\"true\"\n [ngModel]=\"layer.classes\"\n bindLabel=\"name\"\n bindValue=\"id\"\n id=\"map_classes\"\n ></pry-select>\n </div>\n }\n </fieldset>\n </div>\n @if (\n layer.type !== 'relation' &&\n layer.type !== 'wms' &&\n layer.type !== 'wmts' &&\n layer.type !== 'geoserver' &&\n layer.type !== 'featurelayer' &&\n layer.type !== 'vectortile' &&\n layer.type !== 'rastertile'\n ) {\n <fieldset\n >\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.locationAttr' | i18n }}</legend>\n @if (\n layer\n | geometryFieldsFor: { resultSet: resultSet$, classes: layer.classes, type: layer.type }\n | async; as fields\n ) {\n @if (\n [\n 'heatmap',\n 'bubble',\n 'marker',\n 'point',\n 'line',\n 'polygon',\n 'multi-line',\n 'multi-polygon'\n ].indexOf(layer.type) >= 0\n ) {\n <div\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_locationAttribute_both\">{{\n '@pry.widget.map.locationAttribute.both' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLocationAttributes($event, layer)\"\n [items]=\"fields\"\n [ngModel]=\"layer.attribute\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"map_locationAttribute_both\"\n ></pry-select>\n </div>\n </div>\n }\n @if (['heatmap', 'bubble'].indexOf(layer.type) >= 0) {\n <div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_intensityAttribute\">{{\n '@pry.widget.map.intensityAttribute' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeIntensityAttributes($event, layer)\"\n [items]=\"fields\"\n [ngModel]=\"layerHasIntensity(layer).intensityAttribute\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"map_intensityAttribute\"\n ></pry-select>\n </div>\n </div>\n }\n }\n </fieldset>\n }\n @if (\n layer.type === 'wms' ||\n layer.type === 'geoserver' ||\n layer.type === 'wmts' ||\n layer.type === 'featurelayer' ||\n layer.type === 'vectortile' ||\n layer.type === 'rastertile'\n ) {\n <fieldset\n >\n @if (layer.type !== 'geoserver') {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_wms_url\">{{ '@pry.widget.map.wms.url' | i18n }}</label>\n <input\n id=\"map_wms_url\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeUrl($event, layer)\"\n [value]=\"layer.url\"\n />\n </div>\n }\n @if (layer.type === 'wms' || layer.type === 'wmts') {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_wms_paramLayer\">{{\n '@pry.widget.map.wms.paramLayer' | i18n\n }}</label>\n <input\n id=\"map_wms_paramLayer\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeParamLayer($event, layer)\"\n [value]=\"layer.paramLayer\"\n />\n </div>\n }\n @if (layer.type === 'wmts') {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_wms_matrixSet\">{{\n '@pry.widget.map.wms.matrixSet' | i18n\n }}</label>\n <input\n id=\"map_wms_matrixSet\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeMatrixSet($event, layer)\"\n [value]=\"layer.matrixSet\"\n />\n </div>\n }\n @if (layer.type === 'wmts') {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_wms_style\">{{ '@pry.widget.map.wms.style' | i18n }}</label>\n <input\n id=\"map_wms_style\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeParamStyle($event, layer)\"\n [value]=\"layer.style\"\n />\n </div>\n }\n @if (layer.type === 'wms' || layer.type === 'geoserver') {\n <div class=\"m-form-label-field\">\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.tile' | i18n }}</legend>\n <pry-checkbox\n (ngModelChange)=\"changeParamTiled($event, layer)\"\n [ngModel]=\"layer?.paramTiled ?? false\"\n >\n {{ '@pry.widget.map.wms.paramTiled' | i18n }}\n </pry-checkbox>\n </div>\n }\n </fieldset>\n }\n @if (layer.type === 'marker') {\n <fieldset>\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.clustering' | i18n }}</legend>\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"changeClustered(layer, $event)\" [ngModel]=\"layer.clustered\">\n {{ '@pry.widget.map.clustered' | i18n }}\n </pry-checkbox>\n </div>\n @if (layer.clustered) {\n <div>\n <pry-range\n [ngModel]=\"layer.clustered\"\n (ngModelChange)=\"changeClusterDistance(layer, $event)\"\n labelTranslate=\"@pry.widget.map.clusterDistance\"\n min=\"1\"\n max=\"500\"\n ></pry-range>\n </div>\n }\n </fieldset>\n }\n @if (optionsCopy.slide ?? false) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"slide_select\">{{ '@pry.widget.map.slide.title' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeSlide($event, layer)\"\n [items]=\"slides\"\n [ngModel]=\"layer.slide ?? 'all'\"\n bindLabel=\"label\"\n bindValue=\"id\"\n id=\"slide_select\"\n ></pry-select>\n </div>\n }\n @if (optionsCopy.attributions) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"attribution\">{{ '@pry.widget.map.attribution' | i18n }}</label>\n <input\n id=\"attribution\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeAttribution($event, layer)\"\n [value]=\"layer.attribution ? layer.attribution : ''\"\n />\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n }\n }\n </div>\n </pry-settings>\n </pry-widget-header>\n }\n\n <div\n class=\"m-btn-group -map-selection-choice -vertical\"\n [class.-with-header]=\"displayHeader$ | async\"\n [class.-closed]=\"!(actionMenuOpen$ | async)\"\n >\n <div class=\"-vertical\">\n @for (action of basicActions$ | async; track action) {\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only a-tooltip a-tooltip--{{ action }}\"\n (click)=\"changeSelection(action)\"\n [attr.data-tooltip]=\"'@pry.widget.map.' + action | i18n\"\n data-tooltip-position=\"right\"\n >\n <pry-icon [iconSvg]=\"action\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.' + action | i18n }}</span>\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only a-tooltip -map-toggle\"\n id=\"open_menu\"\n [attr.aria-expanded]=\"actionMenuOpen$ | async\"\n aria-controls=\"export_type\"\n aria-haspopup=\"menu\"\n (click)=\"toggleMenu()\"\n >\n <pry-icon\n [iconSvg]=\"(actionMenuOpen$ | async) ? 'chevron_top' : 'chevron_bottom'\"\n [width]=\"12\"\n [height]=\"24\"\n ></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.open' | i18n }}</span>\n </button>\n </div>\n\n <div class=\"m-btn-group -map-selection-choice -map-export\" [class.-with-header]=\"displayHeader$ | async\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only a-tooltip\"\n id=\"export_card\"\n aria-expanded=\"false\"\n aria-controls=\"export_type\"\n aria-haspopup=\"menu\"\n [attr.data-tooltip]=\"'@pry.widget.map.export' | i18n\"\n data-tooltip-position=\"right\"\n (click)=\"export()\"\n >\n <pry-icon iconSvg=\"file_download\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.export' | i18n }}</span>\n </button>\n </div>\n\n @if ((layers$ | async)?.length) {\n <div class=\"ol-control m-map-action m-map-action--layers\" [style.top.px]=\"layersTop$ | async\">\n <button\n class=\"m-map-action__button\"\n [class.a-tooltip]=\"!this.layersTabOpen\"\n [class.-tooltip-no-wrap]=\"!this.layersTabOpen\"\n (click)=\"toggleLayersWindow()\"\n [attr.data-tooltip]=\"'@pry.widget.map.selectLayers' | i18n\"\n data-tooltip-position=\"left\"\n >\n <pry-icon iconSvg=\"layers\" [width]=\"18\" [height]=\"18\"></pry-icon>\n </button>\n </div>\n <div class=\"m-map-pop-in -max-width-220\" [class.-hidden]=\"!layersTabOpen\" [style.top.px]=\"layersTop$ | async\">\n <h4 class=\"a-h4\">{{ '@pry.widget.map.layerSettings.selectLayers' | i18n }}</h4>\n <div class=\"m-map-pop-in__content\" [style.max-height.px]=\"layersHeight$ | async\">\n @for (group of (options$ | async)?.layerGroups ?? []; track group; let groupIdx = $index) {\n @if (isGroupUsedByWidgetLayers(group)) {\n <div class=\"m-map-pop-in__title m-map-pop-in__group-title\">\n <h5 class=\"a-h5\">\n {{ group.name === DEFAULT_LAYER_GROUP ? ('@pry.widget.map.noGroup' | i18n) : group.name }}\n </h5>\n </div>\n @if (group.singleLayer) {\n <div class=\"m-map-pop-in__radios\">\n <div class=\"m-map-pop-in__title\" [class.-hidden]=\"!layersTabOpen\">\n <input\n type=\"radio\"\n [name]=\"id + '-' + group.name\"\n id=\"{{ id }}-radio-layer-group-{{ groupIdx }}\"\n [ngModel]=\"group.visibleLayers.length\"\n [value]=\"0\"\n (change)=\"changeVisibility(group)\"\n />\n <label class=\"a-label\" for=\"{{ id }}-radio-layer-group-{{ groupIdx }}\">{{\n '@pry.widget.map.layerSettings.noLayer' | i18n\n }}</label>\n </div>\n @for (layer of optionsCopy.layers; track layer; let index = $index) {\n @if (layer.group === group.name) {\n <div class=\"m-map-pop-in__title\" [class.-hidden]=\"!layersTabOpen\">\n <input\n type=\"radio\"\n [name]=\"id + '-' + group.name\"\n id=\"{{ id }}-radio-{{ group.name }}-layer-{{ index }}\"\n [ngModel]=\"group.visibleLayers[0]\"\n [value]=\"layer.title\"\n (change)=\"changeVisibility(group, layer)\"\n />\n <label class=\"a-label\" for=\"{{ id }}-radio-{{ group.name }}-layer-{{ index }}\">{{\n layer.title ?? ('@pry.widget.map.missingTitle' | i18n)\n }}</label>\n </div>\n }\n }\n </div>\n } @else {\n @for (layer of optionsCopy.layers; track layer; let index = $index) {\n @if (layer.group === group.name) {\n <div class=\"m-map-pop-in__title\" [class.-hidden]=\"!layersTabOpen\">\n <pry-checkbox\n [ngModel]=\"isLayerVisible(layer, group)\"\n (change)=\"changeVisibility(group, layer)\"\n id=\"checkbox-layer-{{ index }}\"\n ></pry-checkbox>\n <label class=\"a-label\" for=\"checkbox-layer-{{ index }}\">\n {{ layer.title ?? ('@pry.widget.map.missingTitle' | i18n) }}\n </label>\n </div>\n }\n }\n }\n }\n }\n </div>\n </div>\n }\n @if ((legendLayers$ | async)?.length) {\n <div class=\"ol-control m-map-action m-map-action--legend\" [style.top.px]=\"legendTop$ | async\">\n <button\n [class.a-tooltip]=\"!this.legendTabOpen\"\n [class.-tooltip-no-wrap]=\"!this.legendTabOpen\"\n class=\"m-map-action__button\"\n (click)=\"toggleLegendWindow()\"\n [attr.data-tooltip]=\"'@pry.widget.map.legends' | i18n\"\n data-tooltip-position=\"left\"\n >\n <pry-icon iconSvg=\"legend\" [width]=\"18\" [height]=\"15\"></pry-icon>\n </button>\n </div>\n <div class=\"m-map-pop-in\" [class.-hidden]=\"!legendTabOpen\" [style.top.px]=\"legendTop$ | async\">\n <h4 class=\"a-h4\">{{ '@pry.widget.map.legendsTitle' | i18n }}</h4>\n <div class=\"m-map-pop-in__content\" [style.max-height.px]=\"layersHeight$ | async\">\n @for (geoLayer of legendLayers$ | async; track geoLayer; let index = $index) {\n @if (isLayerVisible(geoLayer)) {\n <div class=\"m-map-pop-in__title\" (click)=\"toggleLegend(index)\">\n @if (isLayerRendered(geoLayer) && !!geoLayer.title) {\n <pry-icon\n class=\"m-map-pop-in__dropdown-icon\"\n [iconSvg]=\"legendTabClosed[index] ? 'chevron_bottom' : 'chevron_top'\"\n [width]=\"12\"\n [height]=\"12\"\n ></pry-icon>\n }\n <h5 class=\"a-h5\">{{ geoLayer.title }}</h5>\n @if (!isLayerRendered(geoLayer)) {\n <pry-icon\n class=\"a-tooltip\"\n [attr.data-tooltip]=\"'@pry.widget.map.layerLoadError' | i18n\"\n [iconSvg]=\"'close'\"\n [width]=\"22\"\n [height]=\"22\"\n ></pry-icon>\n }\n </div>\n }\n <div\n class=\"m-map-pop-in__image\"\n [class.-hidden]=\"!legendTabOpen || legendTabClosed[index] || !isLayerRendered(geoLayer)\"\n [style.max-height.px]=\"legendHeight$ | async\"\n >\n @if (geoLayer | legendUrl: { capabilities: (wmsCapabilities$ | async) }; as url) {\n <img\n [src]=\"url | getSecuredImage | async\"\n [alt]=\"'@pry.widget.map.legend' | i18n: { layer: geoLayer.title }\"\n (error)=\"imageNotProvided[index] = true\"\n />\n }\n @if (!(geoLayer | legendUrl: { capabilities: (wmsCapabilities$ | async) })) {\n <p class=\"m-map-pop-in__error\">{{ '@pry.widget.map.legendNotProvided' | i18n }}</p>\n }\n </div>\n }\n </div>\n </div>\n }\n\n @if (leftSlideLayers.length > 0) {\n <div class=\"m-map-slide-legend -left\" [style.top.px]=\"legendTop$ | async\">\n <span class=\"m-map-slide-legend__title\">{{ '@pry.widget.map.slideTitle' | i18n }}:</span>\n @for (layer of leftSlideLayers; track layer) {\n <div>{{ layer.get('title') }}</div>\n }\n </div>\n }\n\n @if (rightSlideLayers.length > 0) {\n <div class=\"m-map-slide-legend -right\" [style.top.px]=\"legendTop$ | async\">\n <span class=\"m-map-slide-legend__title\">{{ '@pry.widget.map.slideTitle' | i18n }}:</span>\n @for (layer of rightSlideLayers; track layer) {\n <div>{{ layer.get('title') }}</div>\n }\n </div>\n }\n\n <div [style.height.px]=\"height$ | async\" class=\"o-map-wrapper\">\n <div class=\"o-map\">\n <div #mapRef id=\"map\"></div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n step=\"0.01\"\n value=\"50\"\n #sliderElement\n class=\"o-map-slider\"\n [class.-hidden]=\"!(hasSlideLayer$ | async)\"\n (input)=\"triggerLayerRender()\"\n />\n </div>\n </div>\n\n <div #popup class=\"m-tooltip m-tooltip--popup\" [hidden]=\"true\" role=\"tooltip\">\n <div class=\"m-tooltip--popup__header\">\n <p>{{ ((tooltipManager.tooltipDisplayedIndex$ | async) ?? 0) + 1 }} / {{ tooltipManager.tooltipNumber }}</p>\n <button\n class=\"a-btn a-btn--primary a-btn--icon-only\"\n (click)=\"tooltipManager.tooltipMove(-1)\"\n [disabled]=\"!tooltipManager.tooltipCanMove(-1)\"\n >\n <pry-icon iconSvg=\"arrow_back\"></pry-icon>\n </button>\n <button\n class=\"a-btn a-btn--primary a-btn--icon-only\"\n (click)=\"tooltipManager.tooltipMove(1)\"\n [disabled]=\"!tooltipManager.tooltipCanMove(1)\"\n >\n <pry-icon iconSvg=\"arrow_right\"></pry-icon>\n </button>\n <button class=\"a-btn a-btn--primary a-btn--icon-only\" (click)=\"tooltipManager.clearTooltip(true)\">\n <pry-icon iconSvg=\"close\"></pry-icon>\n </button>\n </div>\n <div class=\"m-tooltip--popup__container\">\n <ng-container #popupContent></ng-container>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.SettingsComponent, selector: "pry-settings", inputs: ["widgetIndex", "isDisable", "headerPresent", "open$", "header"], outputs: ["triggerClick", "saveTriggered", "changeTitle"] }, { kind: "component", type: i2.PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: ["manifest", "openData$", "additionalOptions", "headerOptions", "displayCount", "datasourceIds", "widgetIndex"], outputs: ["manifestModified"] }, { kind: "component", type: i2.PrySelectComponent, selector: "pry-select", inputs: ["items", "clearable", "multiple", "closeOnSelect", "placeholder", "isForm", "required", "name", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked", "pressedEnter"] }, { kind: "component", type: i2.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i5.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle", "name", "inputId", "inhibit"] }, { kind: "component", type: i2.PryRangeComponent, selector: "pry-range", inputs: ["min", "max", "step", "disabled", "labelTranslate"] }, { kind: "directive", type: i6.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i6.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i6.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i6.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: i7.PryWidgetMapCssComponent, selector: "pry-widget-map-css" }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.GetSecuredImagePipe, name: "getSecuredImage" }, { kind: "pipe", type: i2.I18nPipe, name: "i18n" }, { kind: "pipe", type: i9.GeometryFieldsForPipe, name: "geometryFieldsFor" }, { kind: "pipe", type: i10.WidgetMapLegendUrlPipe, name: "legendUrl" }] }); }
|
|
1210
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: WidgetMapComponent, selector: "pry-widget-map", viewQueries: [{ propertyName: "mapRef", first: true, predicate: ["mapRef"], descendants: true }, { propertyName: "popup", first: true, predicate: ["popup"], descendants: true }, { propertyName: "popupContent", first: true, predicate: ["popupContent"], descendants: true, read: ViewContainerRef }, { propertyName: "exportTypeTemplate", first: true, predicate: ["exportTypeTemplate"], descendants: true, read: TemplateRef }, { propertyName: "sliderElement", first: true, predicate: ["sliderElement"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<pry-widget-map-css></pry-widget-map-css>\n<div class=\"o-widget o-widget--map\">\n @if (displayHeader$ | async) {\n <pry-widget-header\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n #header\n >\n <pry-settings\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [header]=\"header\"\n [open$]=\"open$\"\n class=\"o-settings\"\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_style\">{{ '@pry.widget.map.style' | i18n }} :</label>\n <pry-select\n (ngModelChange)=\"changeStyle($event)\"\n [items]=\"styles$ | async\"\n [ngModel]=\"optionsCopy.style\"\n bindLabel=\"label\"\n bindValue=\"identifier\"\n id=\"map_style\"\n ></pry-select>\n </div>\n @if (optionsCopy.style === STYLE_FROM_URL) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"style_URL\">{{ '@pry.widget.map.styleUrl' | i18n }}</label>\n <input\n id=\"style_URL\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeStyleURL($event)\"\n [value]=\"optionsCopy.styleURL ?? ''\"\n />\n </div>\n }\n <pry-checkbox (ngModelChange)=\"changeAutoLayer($event)\" [ngModel]=\"optionsCopy.automaticLayers ?? false\">\n {{ '@pry.widget.map.autoLayer' | i18n }}\n </pry-checkbox>\n <pry-checkbox (ngModelChange)=\"changeAttributions($event)\" [ngModel]=\"optionsCopy.attributions ?? false\">\n {{ '@pry.widget.map.attributions' | i18n }}\n </pry-checkbox>\n <pry-checkbox (ngModelChange)=\"changeSlideOption($event)\" [ngModel]=\"hasSlideLayer$ | async\">\n {{ '@pry.widget.map.slide.global' | i18n }}\n </pry-checkbox>\n <div class=\"o-layer-settings\" cdkDropListGroup cdkDragBoundary>\n <h4 class=\"a-label\">{{ '@pry.widget.map.layerSettings.title' | i18n }}</h4>\n <div class=\"u-display-flex -justify-center\">\n <button class=\"a-btn a-btn--primary\" (click)=\"addLayerGroup()\" type=\"button\">\n {{ '@pry.widget.map.layerSettings.addLayerGroup' | i18n }}\n </button>\n </div>\n @for (group of optionsCopy.layerGroups; track group; let groupIdx = $index) {\n @if (isGroupUsedByWidgetLayers(group)) {\n <div class=\"o-layer-settings__group\">\n <div class=\"m-form-label-field o-layer-settings__group-title\">\n <label class=\"a-label\" for=\"map_layerGroupTitle-{{ groupIdx }}\">\n {{ '@pry.widget.map.layerSettings.layerGroupName' | i18n }}<span class=\"-obligatory-red\">*</span\n >{{ '@pry.widget.map.layerSettings.optionalColon' | i18n }}\n </label>\n <div class=\"u-display-flex\">\n <div class=\"m-form-label-field u-display-flex -row -gap-10\">\n <input\n id=\"map_layerGroupTitle-{{ groupIdx }}\"\n class=\"a-form-field\"\n type=\"text\"\n (change)=\"updateLayerGroupName(group, $event)\"\n [value]=\"group.name === DEFAULT_LAYER_GROUP ? ('@pry.widget.map.noGroup' | i18n) : group.name\"\n />\n @if (group.name !== DEFAULT_LAYER_GROUP) {\n <button\n class=\"a-btn--icon-only a-tooltip o-layer-settings__delete-group\"\n [attr.data-tooltip]=\"'@pry.widget.map.layerSettings.deleteGroup' | i18n\"\n data-tooltip-position=\"left\"\n (click)=\"deleteLayerGroup(group.name)\"\n >\n <pry-icon [height]=\"16\" [width]=\"16\" iconSvg=\"bin_normal\"></pry-icon>\n </button>\n }\n </div>\n </div>\n </div>\n @if (group.name !== DEFAULT_LAYER_GROUP) {\n <div class=\"m-form-radio-group\">\n <div class=\"m-form-radio-group__item\">\n <input\n type=\"radio\"\n id=\"multiselection-{{ groupIdx }}\"\n [ngModel]=\"group.singleLayer\"\n (ngModelChange)=\"updateLayerGroupSingleLayer(group, $event)\"\n [value]=\"false\"\n [name]=\"group.name\"\n />\n <label class=\"a-label\" for=\"multiselection-{{ groupIdx }}\">{{\n '@pry.widget.map.layerSettings.multipleLayer' | i18n\n }}</label>\n </div>\n <div class=\"m-form-radio-group__item\">\n <input\n type=\"radio\"\n id=\"monoselection-{{ groupIdx }}\"\n [ngModel]=\"group.singleLayer\"\n (ngModelChange)=\"updateLayerGroupSingleLayer(group, $event)\"\n [value]=\"true\"\n [name]=\"group.name\"\n />\n <label class=\"a-label\" for=\"monoselection-{{ groupIdx }}\">{{\n '@pry.widget.map.layerSettings.singleLayer' | i18n\n }}</label>\n </div>\n </div>\n }\n <div class=\"m-btn-group\">\n <div class=\"u-display-flex -align-center\">\n <button (click)=\"addLayer(group)\" class=\"a-btn -link-like\" type=\"button\">\n + {{ '@pry.widget.map.addLayer' | i18n }}\n </button>\n </div>\n <button (click)=\"toggleExpandAll(group)\" class=\"a-btn -link-like\" type=\"button\">\n {{\n layerSettingsExpandedState[group.name]\n ? ('@pry.widget.map.layerSettings.foldAll' | i18n)\n : ('@pry.widget.map.layerSettings.unfoldAll' | i18n)\n }}\n </button>\n </div>\n <div\n cdkDropList\n class=\"o-layer-settings__layers\"\n (cdkDropListDropped)=\"drop($event, group)\"\n [attr.data-layer-group]=\"group.name\"\n >\n @for (layer of optionsCopy?.layers; track layer; let i = $index) {\n @if (layer.group === group.name) {\n <div\n class=\"o-layer-settings__layer-wrapper\"\n cdkDrag\n [cdkDragData]=\"layer\"\n [cdkDragDisabled]=\"layerSettingsExpandedState[layer.title!]\"\n >\n <div class=\"drag-placeholder\" *cdkDragPlaceholder></div>\n <div class=\"o-layer-settings__layer-header\">\n <div class=\"u-display-flex -align-center\">\n <pry-icon\n [class.-disabled]=\"layerSettingsExpandedState[layer.title!]\"\n class=\"drag-handle\"\n [height]=\"16\"\n [width]=\"16\"\n iconSvg=\"drag_indicator\"\n ></pry-icon>\n <button\n class=\"a-btn--icon-only unfold-layer\"\n (click)=\"toggleLayerExpand(layer, group)\"\n type=\"button\"\n >\n <pry-icon\n [height]=\"5\"\n [width]=\"9\"\n [iconSvg]=\"layerSettingsExpandedState[layer.title!] ? 'chevron_top' : 'chevron_bottom'\"\n ></pry-icon>\n </button>\n <h5 class=\"a-h5\">{{ layer.title ?? ('@pry.widget.map.layer' | i18n: { index: i + 1 }) }}</h5>\n </div>\n <button\n class=\"o-layer-settings__delete-layer a-btn--icon-only a-tooltip\"\n [attr.data-tooltip]=\"'@pry.widget.map.layerSettings.deleteLayer' | i18n\"\n data-tooltip-position=\"left\"\n (click)=\"deleteLayer(i, layer, group)\"\n >\n <pry-icon [height]=\"16\" [width]=\"16\" iconSvg=\"bin_normal\"></pry-icon>\n </button>\n </div>\n @if (layerSettingsExpandedState[layer.title!]) {\n <div class=\"o-layer-settings__layer-content\">\n <div class=\"o-settings__popup__content__fields__content\">\n <pry-range\n [ngModel]=\"(layer?.opacity ?? 100) + ''\"\n (ngModelChange)=\"changeOpacity(layer, $event)\"\n labelTranslate=\"@pry.widget.map.opacity\"\n min=\"0\"\n max=\"100\"\n ></pry-range>\n <fieldset>\n <legend class=\"u-visually-hidden\">\n {{ '@pry.widget.map.layerOptions' | i18n: { index: i + 1 } }}\n </legend>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"layer_{{ i + 1 }}_title\">{{\n '@pry.widget.map.layerTitle' | i18n\n }}</label>\n <input\n id=\"layer_{{ i + 1 }}_title\"\n class=\"a-form-field\"\n type=\"text\"\n (change)=\"changeTitle($event, layer, group)\"\n [value]=\"layer.title\"\n />\n </div>\n @if (!['geoserver', 'auto'].includes(layer.type)) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_layerType\">{{\n '@pry.widget.map.layerType.title' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLayerType($event, i)\"\n [items]=\"layerTypes\"\n [ngModel]=\"layer.type\"\n i18nPrefix=\"@pry.widget.map.layerType.\"\n id=\"map_layerType\"\n ></pry-select>\n </div>\n }\n @if (['geoserver', 'wms'].includes(layer.type)) {\n <div class=\"m-form-label-field\">\n @if (getAsWmsType(layer); as wmslayer) {\n <label class=\"a-label\" for=\"map_layerStyle\">{{\n '@pry.widget.map.layerStyle' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLayerStyle($event, layer)\"\n [items]=\"layerStyleOptions(layer)\"\n [ngModel]=\"getStyle(layer)\"\n bindLabel=\"label\"\n bindValue=\"id\"\n id=\"map_layerStyle\"\n ></pry-select>\n }\n </div>\n }\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"changeFit($event, layer)\" [ngModel]=\"layer.fit\">\n {{ '@pry.widget.map.fit' | i18n }}\n </pry-checkbox>\n </div>\n @if (\n layer.type !== 'relation' &&\n layer.type !== 'wms' &&\n layer.type !== 'wmts' &&\n layer.type !== 'geoserver' &&\n layer.type !== 'featurelayer' &&\n layer.type !== 'vectortile' &&\n layer.type !== 'rastertile' &&\n layer.type !== 'auto'\n ) {\n <div\n class=\"m-form-label-field\"\n >\n <label class=\"a-label\" for=\"map_classes\">{{ '@pry.widget.map.classes' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeClasses($event, layer)\"\n [items]=\"usedClasses$ | async\"\n [multiple]=\"true\"\n [ngModel]=\"layer.classes\"\n bindLabel=\"name\"\n bindValue=\"id\"\n id=\"map_classes\"\n ></pry-select>\n </div>\n }\n </fieldset>\n </div>\n @if (\n layer.type !== 'relation' &&\n layer.type !== 'wms' &&\n layer.type !== 'wmts' &&\n layer.type !== 'geoserver' &&\n layer.type !== 'featurelayer' &&\n layer.type !== 'vectortile' &&\n layer.type !== 'rastertile'\n ) {\n <fieldset\n >\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.locationAttr' | i18n }}</legend>\n @if (\n layer\n | geometryFieldsFor: { resultSet: resultSet$, classes: layer.classes, type: layer.type }\n | async; as fields\n ) {\n @if (\n [\n 'heatmap',\n 'bubble',\n 'marker',\n 'point',\n 'line',\n 'polygon',\n 'multi-line',\n 'multi-polygon'\n ].indexOf(layer.type) >= 0\n ) {\n <div\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_locationAttribute_both\">{{\n '@pry.widget.map.locationAttribute.both' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLocationAttributes($event, layer)\"\n [items]=\"fields\"\n [ngModel]=\"layer.attribute\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"map_locationAttribute_both\"\n ></pry-select>\n </div>\n </div>\n }\n @if (['heatmap', 'bubble'].indexOf(layer.type) >= 0) {\n <div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_intensityAttribute\">{{\n '@pry.widget.map.intensityAttribute' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeIntensityAttributes($event, layer)\"\n [items]=\"fields\"\n [ngModel]=\"layerHasIntensity(layer).intensityAttribute\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"map_intensityAttribute\"\n ></pry-select>\n </div>\n </div>\n }\n }\n </fieldset>\n }\n @if (\n layer.type === 'wms' ||\n layer.type === 'geoserver' ||\n layer.type === 'wmts' ||\n layer.type === 'featurelayer' ||\n layer.type === 'vectortile' ||\n layer.type === 'rastertile'\n ) {\n <fieldset\n >\n @if (layer.type !== 'geoserver') {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_wms_url\">{{ '@pry.widget.map.wms.url' | i18n }}</label>\n <input\n id=\"map_wms_url\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeUrl($event, layer)\"\n [value]=\"layer.url\"\n />\n </div>\n }\n @if (layer.type === 'wms' || layer.type === 'wmts') {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_wms_paramLayer\">{{\n '@pry.widget.map.wms.paramLayer' | i18n\n }}</label>\n <input\n id=\"map_wms_paramLayer\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeParamLayer($event, layer)\"\n [value]=\"layer.paramLayer\"\n />\n </div>\n }\n @if (layer.type === 'wmts') {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_wms_matrixSet\">{{\n '@pry.widget.map.wms.matrixSet' | i18n\n }}</label>\n <input\n id=\"map_wms_matrixSet\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeMatrixSet($event, layer)\"\n [value]=\"layer.matrixSet\"\n />\n </div>\n }\n @if (layer.type === 'wmts') {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_wms_style\">{{ '@pry.widget.map.wms.style' | i18n }}</label>\n <input\n id=\"map_wms_style\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeParamStyle($event, layer)\"\n [value]=\"layer.style\"\n />\n </div>\n }\n @if (layer.type === 'wms' || layer.type === 'geoserver') {\n <div class=\"m-form-label-field\">\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.tile' | i18n }}</legend>\n <pry-checkbox\n (ngModelChange)=\"changeParamTiled($event, layer)\"\n [ngModel]=\"layer?.paramTiled ?? false\"\n >\n {{ '@pry.widget.map.wms.paramTiled' | i18n }}\n </pry-checkbox>\n </div>\n }\n </fieldset>\n }\n @if (layer.type === 'marker') {\n <fieldset>\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.clustering' | i18n }}</legend>\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"changeClustered(layer, $event)\" [ngModel]=\"layer.clustered\">\n {{ '@pry.widget.map.clustered' | i18n }}\n </pry-checkbox>\n </div>\n @if (layer.clustered) {\n <div>\n <pry-range\n [ngModel]=\"layer.clustered\"\n (ngModelChange)=\"changeClusterDistance(layer, $event)\"\n labelTranslate=\"@pry.widget.map.clusterDistance\"\n min=\"1\"\n max=\"500\"\n ></pry-range>\n </div>\n }\n </fieldset>\n }\n @if (optionsCopy.slide ?? false) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"slide_select\">{{ '@pry.widget.map.slide.title' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeSlide($event, layer)\"\n [items]=\"slides\"\n [ngModel]=\"layer.slide ?? 'all'\"\n bindLabel=\"label\"\n bindValue=\"id\"\n id=\"slide_select\"\n ></pry-select>\n </div>\n }\n @if (optionsCopy.attributions) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"attribution\">{{ '@pry.widget.map.attribution' | i18n }}</label>\n <input\n id=\"attribution\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeAttribution($event, layer)\"\n [value]=\"layer.attribution ? layer.attribution : ''\"\n />\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n }\n }\n </div>\n </pry-settings>\n </pry-widget-header>\n }\n\n <div\n class=\"m-btn-group -map-selection-choice -vertical\"\n [class.-with-header]=\"displayHeader$ | async\"\n [class.-closed]=\"!(actionMenuOpen$ | async)\"\n >\n <div class=\"-vertical\">\n @for (action of basicActions$ | async; track action) {\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only a-tooltip a-tooltip--{{ action }}\"\n (click)=\"changeSelection(action)\"\n [attr.data-tooltip]=\"'@pry.widget.map.' + action | i18n\"\n data-tooltip-position=\"right\"\n >\n <pry-icon [iconSvg]=\"action\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.' + action | i18n }}</span>\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only a-tooltip -map-toggle\"\n id=\"open_menu\"\n [attr.aria-expanded]=\"actionMenuOpen$ | async\"\n aria-controls=\"export_type\"\n aria-haspopup=\"menu\"\n (click)=\"toggleMenu()\"\n >\n <pry-icon\n [iconSvg]=\"(actionMenuOpen$ | async) ? 'chevron_top' : 'chevron_bottom'\"\n [width]=\"12\"\n [height]=\"24\"\n ></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.open' | i18n }}</span>\n </button>\n </div>\n\n <div class=\"m-btn-group -map-selection-choice -map-export\" [class.-with-header]=\"displayHeader$ | async\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only a-tooltip\"\n id=\"export_card\"\n aria-expanded=\"false\"\n aria-controls=\"export_type\"\n aria-haspopup=\"menu\"\n [attr.data-tooltip]=\"'@pry.widget.map.export' | i18n\"\n data-tooltip-position=\"right\"\n (click)=\"export()\"\n >\n <pry-icon iconSvg=\"file_download\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.export' | i18n }}</span>\n </button>\n </div>\n\n @if ((layers$ | async)?.length) {\n <div class=\"ol-control m-map-action m-map-action--layers\" [style.top.px]=\"layersTop$ | async\">\n <button\n class=\"m-map-action__button\"\n [class.a-tooltip]=\"!this.layersTabOpen\"\n [class.-tooltip-no-wrap]=\"!this.layersTabOpen\"\n (click)=\"toggleLayersWindow()\"\n [attr.data-tooltip]=\"'@pry.widget.map.selectLayers' | i18n\"\n data-tooltip-position=\"left\"\n >\n <pry-icon iconSvg=\"layers\" [width]=\"18\" [height]=\"18\"></pry-icon>\n </button>\n </div>\n <div class=\"m-map-pop-in -max-width-220\" [class.-hidden]=\"!layersTabOpen\" [style.top.px]=\"layersTop$ | async\">\n <h4 class=\"a-h4\">{{ '@pry.widget.map.layerSettings.selectLayers' | i18n }}</h4>\n <div class=\"m-map-pop-in__content\" [style.max-height.px]=\"layersHeight$ | async\">\n @for (group of (options$ | async)?.layerGroups ?? []; track group; let groupIdx = $index) {\n @if (isGroupUsedByWidgetLayers(group)) {\n <div class=\"m-map-pop-in__title m-map-pop-in__group-title\">\n <h5 class=\"a-h5\">\n {{ group.name === DEFAULT_LAYER_GROUP ? ('@pry.widget.map.noGroup' | i18n) : group.name }}\n </h5>\n </div>\n @if (group.singleLayer) {\n <div class=\"m-map-pop-in__radios\">\n <div class=\"m-map-pop-in__title\" [class.-hidden]=\"!layersTabOpen\">\n <input\n type=\"radio\"\n [name]=\"id + '-' + group.name\"\n id=\"{{ id }}-radio-layer-group-{{ groupIdx }}\"\n [ngModel]=\"group.visibleLayers.length\"\n [value]=\"0\"\n (change)=\"changeVisibility(group)\"\n />\n <label class=\"a-label\" for=\"{{ id }}-radio-layer-group-{{ groupIdx }}\">{{\n '@pry.widget.map.layerSettings.noLayer' | i18n\n }}</label>\n </div>\n @for (layer of optionsCopy.layers; track layer; let index = $index) {\n @if (layer.group === group.name) {\n <div class=\"m-map-pop-in__title\" [class.-hidden]=\"!layersTabOpen\">\n <input\n type=\"radio\"\n [name]=\"id + '-' + group.name\"\n id=\"{{ id }}-radio-{{ group.name }}-layer-{{ index }}\"\n [ngModel]=\"group.visibleLayers[0]\"\n [value]=\"layer.title\"\n (change)=\"changeVisibility(group, layer)\"\n />\n <label class=\"a-label\" for=\"{{ id }}-radio-{{ group.name }}-layer-{{ index }}\">{{\n layer.title ?? ('@pry.widget.map.missingTitle' | i18n)\n }}</label>\n </div>\n }\n }\n </div>\n } @else {\n @for (layer of optionsCopy.layers; track layer; let index = $index) {\n @if (layer.group === group.name) {\n <div class=\"m-map-pop-in__title\" [class.-hidden]=\"!layersTabOpen\">\n <pry-checkbox\n [ngModel]=\"isLayerVisible(layer, group)\"\n (change)=\"changeVisibility(group, layer)\"\n id=\"checkbox-layer-{{ index }}\"\n ></pry-checkbox>\n <label class=\"a-label\" for=\"checkbox-layer-{{ index }}\">\n {{ layer.title ?? ('@pry.widget.map.missingTitle' | i18n) }}\n </label>\n </div>\n }\n }\n }\n }\n }\n </div>\n </div>\n }\n @if ((legendLayers$ | async)?.length) {\n <div class=\"ol-control m-map-action m-map-action--legend\" [style.top.px]=\"legendTop$ | async\">\n <button\n [class.a-tooltip]=\"!this.legendTabOpen\"\n [class.-tooltip-no-wrap]=\"!this.legendTabOpen\"\n class=\"m-map-action__button\"\n (click)=\"toggleLegendWindow()\"\n [attr.data-tooltip]=\"'@pry.widget.map.legends' | i18n\"\n data-tooltip-position=\"left\"\n >\n <pry-icon iconSvg=\"legend\" [width]=\"18\" [height]=\"15\"></pry-icon>\n </button>\n </div>\n <div class=\"m-map-pop-in\" [class.-hidden]=\"!legendTabOpen\" [style.top.px]=\"legendTop$ | async\">\n <h4 class=\"a-h4\">{{ '@pry.widget.map.legendsTitle' | i18n }}</h4>\n <div class=\"m-map-pop-in__content\" [style.max-height.px]=\"layersHeight$ | async\">\n @for (geoLayer of legendLayers$ | async; track geoLayer; let index = $index) {\n @if (isLayerVisible(geoLayer)) {\n <div class=\"m-map-pop-in__title\" (click)=\"toggleLegend(index)\">\n @if (isLayerRendered(geoLayer) && !!geoLayer.title) {\n <pry-icon\n class=\"m-map-pop-in__dropdown-icon\"\n [iconSvg]=\"legendTabClosed[index] ? 'chevron_bottom' : 'chevron_top'\"\n [width]=\"12\"\n [height]=\"12\"\n ></pry-icon>\n }\n <h5 class=\"a-h5\">{{ geoLayer.title }}</h5>\n @if (!isLayerRendered(geoLayer)) {\n <pry-icon\n class=\"a-tooltip\"\n [attr.data-tooltip]=\"'@pry.widget.map.layerLoadError' | i18n\"\n [iconSvg]=\"'close'\"\n [width]=\"22\"\n [height]=\"22\"\n ></pry-icon>\n }\n </div>\n }\n <div\n class=\"m-map-pop-in__image\"\n [class.-hidden]=\"!legendTabOpen || legendTabClosed[index] || !isLayerRendered(geoLayer)\"\n [style.max-height.px]=\"legendHeight$ | async\"\n >\n @if (geoLayer | legendUrl: { capabilities: (wmsCapabilities$ | async) }; as url) {\n <img\n [src]=\"url | getSecuredImage | async\"\n [alt]=\"'@pry.widget.map.legend' | i18n: { layer: geoLayer.title }\"\n (error)=\"imageNotProvided[index] = true\"\n />\n }\n @if (!(geoLayer | legendUrl: { capabilities: (wmsCapabilities$ | async) })) {\n <p class=\"m-map-pop-in__error\">{{ '@pry.widget.map.legendNotProvided' | i18n }}</p>\n }\n </div>\n }\n </div>\n </div>\n }\n\n @if (leftSlideLayers.length > 0) {\n <div class=\"m-map-slide-legend -left\" [style.top.px]=\"legendTop$ | async\">\n <span class=\"m-map-slide-legend__title\">{{ '@pry.widget.map.slideTitle' | i18n }}:</span>\n @for (layer of leftSlideLayers; track layer) {\n <div>{{ layer.get('title') }}</div>\n }\n </div>\n }\n\n @if (rightSlideLayers.length > 0) {\n <div class=\"m-map-slide-legend -right\" [style.top.px]=\"legendTop$ | async\">\n <span class=\"m-map-slide-legend__title\">{{ '@pry.widget.map.slideTitle' | i18n }}:</span>\n @for (layer of rightSlideLayers; track layer) {\n <div>{{ layer.get('title') }}</div>\n }\n </div>\n }\n\n <div [style.height.px]=\"height$ | async\" class=\"o-map-wrapper\">\n <div class=\"o-map\">\n <div #mapRef id=\"map\"></div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n step=\"0.01\"\n value=\"50\"\n #sliderElement\n class=\"o-map-slider\"\n [class.-hidden]=\"!(hasSlideLayer$ | async)\"\n (input)=\"triggerLayerRender()\"\n />\n </div>\n </div>\n\n <div #popup class=\"m-tooltip m-tooltip--popup\" [hidden]=\"true\" role=\"tooltip\">\n <div class=\"m-tooltip--popup__header\">\n <p>{{ ((tooltipManager.tooltipDisplayedIndex$ | async) ?? 0) + 1 }} / {{ tooltipManager.tooltipNumber }}</p>\n <button\n class=\"a-btn a-btn--primary a-btn--icon-only\"\n (click)=\"tooltipManager.tooltipMove(-1)\"\n [disabled]=\"!tooltipManager.tooltipCanMove(-1)\"\n >\n <pry-icon iconSvg=\"arrow_back\"></pry-icon>\n </button>\n <button\n class=\"a-btn a-btn--primary a-btn--icon-only\"\n (click)=\"tooltipManager.tooltipMove(1)\"\n [disabled]=\"!tooltipManager.tooltipCanMove(1)\"\n >\n <pry-icon iconSvg=\"arrow_right\"></pry-icon>\n </button>\n <button class=\"a-btn a-btn--primary a-btn--icon-only\" (click)=\"tooltipManager.clearTooltip(true)\">\n <pry-icon iconSvg=\"close\"></pry-icon>\n </button>\n </div>\n <div class=\"m-tooltip--popup__container\">\n <ng-container #popupContent></ng-container>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.SettingsComponent, selector: "pry-settings", inputs: ["widgetIndex", "isDisable", "headerPresent", "open$", "header"], outputs: ["triggerClick", "saveTriggered", "changeTitle"] }, { kind: "component", type: i2.PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: ["manifest", "openData$", "additionalOptions", "headerOptions", "displayCount", "datasourceIds", "widgetIndex"], outputs: ["manifestModified"] }, { kind: "component", type: i2.PrySelectComponent, selector: "pry-select", inputs: ["items", "clearable", "multiple", "closeOnSelect", "placeholder", "forcePlaceHolder", "isForm", "required", "name", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked", "pressedEnter"] }, { kind: "component", type: i2.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i5.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle", "name", "inputId", "inhibit"] }, { kind: "component", type: i2.PryRangeComponent, selector: "pry-range", inputs: ["min", "max", "step", "disabled", "labelTranslate"] }, { kind: "directive", type: i6.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i6.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i6.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i6.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: i7.PryWidgetMapCssComponent, selector: "pry-widget-map-css" }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.GetSecuredImagePipe, name: "getSecuredImage" }, { kind: "pipe", type: i2.I18nPipe, name: "i18n" }, { kind: "pipe", type: i9.GeometryFieldsForPipe, name: "geometryFieldsFor" }, { kind: "pipe", type: i10.WidgetMapLegendUrlPipe, name: "legendUrl" }] }); }
|
|
1211
1211
|
}
|
|
1212
1212
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: WidgetMapComponent, decorators: [{
|
|
1213
1213
|
type: Component,
|
|
@@ -250,7 +250,7 @@ export class WidgetTableComponent extends DataWidgetComponent {
|
|
|
250
250
|
this.actualPage$.next(number);
|
|
251
251
|
}
|
|
252
252
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: WidgetTableComponent, deps: [{ token: i1.Store }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
253
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: WidgetTableComponent, selector: "pry-widget-table", usesInheritance: true, ngImport: i0, template: "<pry-widget-table-css></pry-widget-table-css>\n<div class=\"o-widget o-widget--table\">\n @if (displayHeader$ | async) {\n <pry-widget-header\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n #header\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n (click)=\"refresh()\"\n >\n <pry-settings\n (click)=\"refresh()\"\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [header]=\"header\"\n [open$]=\"open$\"\n (triggerClick)=\"this.refresh()\"\n class=\"o-settings\"\n >\n @if (optionsCopy && optionsCopy.style) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"table_style_headerTextAlign\">{{\n '@pry.widget.table.headerTextAlign' | i18n\n }}</label>\n <pry-select\n [items]=\"ALIGNMENT_OPTIONS\"\n [ngModel]=\"optionsCopy.style.headerTextAlign\"\n (ngModelChange)=\"updateStyle($event, 'headerTextAlign')\"\n id=\"table_style_headerTextAlign\"\n i18nPrefix=\"@pry.widget.table.align.\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"table_style_cellTextAlign\">{{\n '@pry.widget.table.cellTextAlign' | i18n\n }}</label>\n <pry-select\n [items]=\"ALIGNMENT_OPTIONS\"\n [ngModel]=\"optionsCopy.style.cellTextAlign\"\n (ngModelChange)=\"updateStyle($event, 'cellTextAlign')\"\n id=\"table_style_cellTextAlign\"\n i18nPrefix=\"@pry.widget.table.align.\"\n ></pry-select>\n </div>\n <div\n class=\"m-form-label-field u-display-flex -row -justify-space-between o-widget--table__vertical-separator\"\n >\n <label class=\"a-label\" for=\"table_style_verticalSeparator\">{{\n '@pry.widget.table.verticalSeparator' | i18n\n }}</label>\n <pry-checkbox\n [ngModel]=\"optionsCopy.style.showVerticalSeparator\"\n (ngModelChange)=\"updateStyle($event, 'showVerticalSeparator')\"\n id=\"table_style_verticalSeparator\"\n ></pry-checkbox>\n </div>\n }\n\n <div class=\"o-settings__popup__content__actions\">\n <button type=\"button\" class=\"a-btn a-btn--icon-text -link-like\" (click)=\"addColumn()\">\n <pry-icon iconSvg=\"post_add\"></pry-icon>\n {{ '@pry.widget.table.addColumn' | i18n }}\n </button>\n </div>\n\n @for (columnDef of optionsCopy?.columns ?? []; track columnDef.attributeId; let i = $index) {\n <div class=\"o-settings__popup__content__fields\" (click)=\"refresh()\">\n <div class=\"o-settings__popup__content__fields__head\">\n <div class=\"m-btn-group\">\n @if (i > 0) {\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" (click)=\"invertLayers(i, i - 1)\">\n <pry-icon iconSvg=\"fleche_haut\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.moveUp' | i18n }}</span>\n </button>\n }\n @if (i < (optionsCopy?.columns?.length ?? 0) - 1) {\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" (click)=\"invertLayers(i, i + 1)\">\n <pry-icon iconSvg=\"fleche_bas\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.moveDown' | i18n }}</span>\n </button>\n }\n </div>\n </div>\n\n <div class=\"o-settings__popup__content__fields__content\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"table_property\">{{ '@pry.widget.table.property' | i18n }}</label>\n <pry-select\n (click)=\"refresh()\"\n (ngModelChange)=\"changePropertyName($event, columnDef)\"\n [items]=\"properties$ | async\"\n [ngModel]=\"columnDef.property\"\n bindLabel=\"label\"\n bindValue=\"property\"\n id=\"table_property\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"table_label\">{{ '@pry.widget.table.label' | i18n }}</label>\n <input\n id=\"table_label\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeLabel($event, columnDef)\"\n [value]=\"columnDef.label\"\n />\n </div>\n </div>\n <button\n (click)=\"deleteColumn(i)\"\n aria-label=\"delete\"\n type=\"button\"\n class=\"a-btn a-btn--icon-text -link-like\"\n data-func=\"delete\"\n >\n <pry-icon iconSvg=\"delete\" [width]=\"19\" [height]=\"19\"></pry-icon>\n <span>{{ '@pry.widget.table.deleteColumn' | i18n }}</span>\n </button>\n </div>\n }\n </pry-settings>\n </pry-widget-header>\n }\n\n <div class=\"a-table-wrapper\">\n @if (pagination$ | async; as pagination) {\n @if (pagination?.items ?? []; as allObjects) {\n @if (pagination.noFillersItems === 0) {\n <div class=\"no-result\" [style.height.%]=\"pagination.totalPages > 0 ? 80 : 100\">\n <img\n class=\"no-result__search\"\n src=\"../../../assets/svgs/pry_recherche_pas_de_resultat.svg\"\n alt=\"{{ '@pry.widget.table.empty' | i18n }}\"\n aria-hidden=\"true\"\n />\n <span class=\"no-result__text\">{{ '@pry.widget.table.empty' | i18n }}</span>\n </div>\n } @else if (pagination.noFillersItems > 0) {\n @if ((selectedIds$ | async) ?? []; as selectedIds) {\n @if ((columns$ | async) ?? []; as columns) {\n <table\n class=\"a-table\"\n [class.-show-vertical-separator]=\"optionsCopy?.style?.showVerticalSeparator\"\n [attr.aria-label]=\"'@pry.widget.table.description' | i18n\"\n >\n <thead>\n <tr>\n @if (allObjects?.length ?? 0 > 0) {\n <th>\n <pry-checkbox [ngModel]=\"areAllSelected\" (ngModelChange)=\"selectAll($event)\"></pry-checkbox>\n </th>\n }\n @for (column of columns; track column.attributeId; let i = $index) {\n <th\n resizable\n (click)=\"setOrder(column)\"\n [ngClass]=\"'u-txt-' + optionsCopy?.style?.headerTextAlign\"\n >\n <span>{{ column.label }}</span>\n @if (quickOrder$ | async; as quickOrder) {\n @if (quickOrder.attribute === column.attributeId) {\n <pry-icon\n [iconSvg]=\"quickOrder.asc ? 'chevron_top' : 'chevron_bottom'\"\n [height]=\"12\"\n [width]=\"12\"\n ></pry-icon>\n }\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (item of allObjects; track item.id) {\n <tr\n [class.is-selected]=\"selectedIds.includes(item.id)\"\n [class.context-menu-selected]=\"contextMenuClickedId === item.id && (isContextMenuOpened$ | async)\"\n (contextmenu)=\"contextMenu($event, item)\"\n detachRow\n (selectedValue)=\"selection($event, item)\"\n [class.filler]=\"item.metadata!['__widget-table-filler']\"\n >\n <td class=\"checkbox-wrapper\">\n <pry-checkbox [ngModel]=\"selectedIds.includes(item.id)\"></pry-checkbox>\n </td>\n @for (column of columns; track column.attributeId) {\n <td class=\"u-ellipsis\" [ngClass]=\"'u-txt-' + optionsCopy?.style?.cellTextAlign\">\n @if (column.property === 'metadata') {\n <pry-metadata [item]=\"item\"></pry-metadata>\n }\n @if (column.property === 'oClass') {\n <p class=\"content-img\">\n <img\n [height]=\"25\"\n [width]=\"25\"\n [src]=\"item | translateItemToSymbol | async\"\n [alt]=\"item.oClass | translateId: { type: 'class', output: 'name' } | async\"\n />\n </p>\n }\n @if (!['metadata', 'oClass'].includes(column.property)) {\n <pry-expand-value\n [value]=\"item | getValue: column.property | async\"\n [field]=\"column.field\"\n ></pry-expand-value>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n }\n }\n @if (pagination.totalPages > 0) {\n <div class=\"u-display-flex\">\n <pry-paginator\n [totalItemNb]=\"pagination.total\"\n (pageChange)=\"goToPage($event - 1)\"\n [nbPerPage]=\"pagination.rows\"\n [loaded]=\"pagination.loaded\"\n mode=\"short\"\n ></pry-paginator>\n @if (pagination.totalPages !== pagination.loadedPages) {\n <div class=\"a-table__pagination-label\">\n ({{\n '@pry.widget.table.remaining' | i18n: { remaining: pagination.totalPages - pagination.loadedPages }\n }})\n </div>\n }\n </div>\n }\n }\n }\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.SettingsComponent, selector: "pry-settings", inputs: ["widgetIndex", "isDisable", "headerPresent", "open$", "header"], outputs: ["triggerClick", "saveTriggered", "changeTitle"] }, { kind: "component", type: i4.MetadataComponent, selector: "pry-metadata", inputs: ["item"] }, { kind: "component", type: i4.PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: ["manifest", "openData$", "additionalOptions", "headerOptions", "displayCount", "datasourceIds", "widgetIndex"], outputs: ["manifestModified"] }, { kind: "component", type: i4.PrySelectComponent, selector: "pry-select", inputs: ["items", "clearable", "multiple", "closeOnSelect", "placeholder", "isForm", "required", "name", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked", "pressedEnter"] }, { kind: "component", type: i4.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i5.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle", "name", "inputId", "inhibit"] }, { kind: "component", type: i6.PryPaginatorComponent, selector: "pry-paginator", inputs: ["action", "nbPerPage", "totalItemNb", "mode", "goBackToFirstPage", "loaded"], outputs: ["pageChange"] }, { kind: "component", type: i7.ResizableComponent, selector: "th[resizable]" }, { kind: "directive", type: i8.ResizableDirective, selector: "[resizable]", outputs: ["resizable"] }, { kind: "component", type: i9.PryWidgetTableCssComponent, selector: "pry-widget-table-css" }, { kind: "component", type: i10.ExpandValueComponent, selector: "pry-expand-value", inputs: ["field", "value"] }, { kind: "directive", type: i11.DetachRowDirective, selector: "[detachRow]", outputs: ["selectedValue"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.TranslateIdPipe, name: "translateId" }, { kind: "pipe", type: i4.TranslateItemToSymbolPipe, name: "translateItemToSymbol" }, { kind: "pipe", type: i4.I18nPipe, name: "i18n" }, { kind: "pipe", type: i12.GetValuePipe, name: "getValue" }] }); }
|
|
253
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: WidgetTableComponent, selector: "pry-widget-table", usesInheritance: true, ngImport: i0, template: "<pry-widget-table-css></pry-widget-table-css>\n<div class=\"o-widget o-widget--table\">\n @if (displayHeader$ | async) {\n <pry-widget-header\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n #header\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n (click)=\"refresh()\"\n >\n <pry-settings\n (click)=\"refresh()\"\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [header]=\"header\"\n [open$]=\"open$\"\n (triggerClick)=\"this.refresh()\"\n class=\"o-settings\"\n >\n @if (optionsCopy && optionsCopy.style) {\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"table_style_headerTextAlign\">{{\n '@pry.widget.table.headerTextAlign' | i18n\n }}</label>\n <pry-select\n [items]=\"ALIGNMENT_OPTIONS\"\n [ngModel]=\"optionsCopy.style.headerTextAlign\"\n (ngModelChange)=\"updateStyle($event, 'headerTextAlign')\"\n id=\"table_style_headerTextAlign\"\n i18nPrefix=\"@pry.widget.table.align.\"\n ></pry-select>\n </div>\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"table_style_cellTextAlign\">{{\n '@pry.widget.table.cellTextAlign' | i18n\n }}</label>\n <pry-select\n [items]=\"ALIGNMENT_OPTIONS\"\n [ngModel]=\"optionsCopy.style.cellTextAlign\"\n (ngModelChange)=\"updateStyle($event, 'cellTextAlign')\"\n id=\"table_style_cellTextAlign\"\n i18nPrefix=\"@pry.widget.table.align.\"\n ></pry-select>\n </div>\n <div\n class=\"m-form-label-field u-display-flex -row -justify-space-between o-widget--table__vertical-separator\"\n >\n <label class=\"a-label\" for=\"table_style_verticalSeparator\">{{\n '@pry.widget.table.verticalSeparator' | i18n\n }}</label>\n <pry-checkbox\n [ngModel]=\"optionsCopy.style.showVerticalSeparator\"\n (ngModelChange)=\"updateStyle($event, 'showVerticalSeparator')\"\n id=\"table_style_verticalSeparator\"\n ></pry-checkbox>\n </div>\n }\n\n <div class=\"o-settings__popup__content__actions\">\n <button type=\"button\" class=\"a-btn a-btn--icon-text -link-like\" (click)=\"addColumn()\">\n <pry-icon iconSvg=\"post_add\"></pry-icon>\n {{ '@pry.widget.table.addColumn' | i18n }}\n </button>\n </div>\n\n @for (columnDef of optionsCopy?.columns ?? []; track columnDef.attributeId; let i = $index) {\n <div class=\"o-settings__popup__content__fields\" (click)=\"refresh()\">\n <div class=\"o-settings__popup__content__fields__head\">\n <div class=\"m-btn-group\">\n @if (i > 0) {\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" (click)=\"invertLayers(i, i - 1)\">\n <pry-icon iconSvg=\"fleche_haut\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.moveUp' | i18n }}</span>\n </button>\n }\n @if (i < (optionsCopy?.columns?.length ?? 0) - 1) {\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" (click)=\"invertLayers(i, i + 1)\">\n <pry-icon iconSvg=\"fleche_bas\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.action.moveDown' | i18n }}</span>\n </button>\n }\n </div>\n </div>\n\n <div class=\"o-settings__popup__content__fields__content\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"table_property\">{{ '@pry.widget.table.property' | i18n }}</label>\n <pry-select\n (click)=\"refresh()\"\n (ngModelChange)=\"changePropertyName($event, columnDef)\"\n [items]=\"properties$ | async\"\n [ngModel]=\"columnDef.property\"\n bindLabel=\"label\"\n bindValue=\"property\"\n id=\"table_property\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"table_label\">{{ '@pry.widget.table.label' | i18n }}</label>\n <input\n id=\"table_label\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeLabel($event, columnDef)\"\n [value]=\"columnDef.label\"\n />\n </div>\n </div>\n <button\n (click)=\"deleteColumn(i)\"\n aria-label=\"delete\"\n type=\"button\"\n class=\"a-btn a-btn--icon-text -link-like\"\n data-func=\"delete\"\n >\n <pry-icon iconSvg=\"delete\" [width]=\"19\" [height]=\"19\"></pry-icon>\n <span>{{ '@pry.widget.table.deleteColumn' | i18n }}</span>\n </button>\n </div>\n }\n </pry-settings>\n </pry-widget-header>\n }\n\n <div class=\"a-table-wrapper\">\n @if (pagination$ | async; as pagination) {\n @if (pagination?.items ?? []; as allObjects) {\n @if (pagination.noFillersItems === 0) {\n <div class=\"no-result\" [style.height.%]=\"pagination.totalPages > 0 ? 80 : 100\">\n <img\n class=\"no-result__search\"\n src=\"../../../assets/svgs/pry_recherche_pas_de_resultat.svg\"\n alt=\"{{ '@pry.widget.table.empty' | i18n }}\"\n aria-hidden=\"true\"\n />\n <span class=\"no-result__text\">{{ '@pry.widget.table.empty' | i18n }}</span>\n </div>\n } @else if (pagination.noFillersItems > 0) {\n @if ((selectedIds$ | async) ?? []; as selectedIds) {\n @if ((columns$ | async) ?? []; as columns) {\n <table\n class=\"a-table\"\n [class.-show-vertical-separator]=\"optionsCopy?.style?.showVerticalSeparator\"\n [attr.aria-label]=\"'@pry.widget.table.description' | i18n\"\n >\n <thead>\n <tr>\n @if (allObjects?.length ?? 0 > 0) {\n <th>\n <pry-checkbox [ngModel]=\"areAllSelected\" (ngModelChange)=\"selectAll($event)\"></pry-checkbox>\n </th>\n }\n @for (column of columns; track column.attributeId; let i = $index) {\n <th\n resizable\n (click)=\"setOrder(column)\"\n [ngClass]=\"'u-txt-' + optionsCopy?.style?.headerTextAlign\"\n >\n <span>{{ column.label }}</span>\n @if (quickOrder$ | async; as quickOrder) {\n @if (quickOrder.attribute === column.attributeId) {\n <pry-icon\n [iconSvg]=\"quickOrder.asc ? 'chevron_top' : 'chevron_bottom'\"\n [height]=\"12\"\n [width]=\"12\"\n ></pry-icon>\n }\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (item of allObjects; track item.id) {\n <tr\n [class.is-selected]=\"selectedIds.includes(item.id)\"\n [class.context-menu-selected]=\"contextMenuClickedId === item.id && (isContextMenuOpened$ | async)\"\n (contextmenu)=\"contextMenu($event, item)\"\n detachRow\n (selectedValue)=\"selection($event, item)\"\n [class.filler]=\"item.metadata!['__widget-table-filler']\"\n >\n <td class=\"checkbox-wrapper\">\n <pry-checkbox [ngModel]=\"selectedIds.includes(item.id)\"></pry-checkbox>\n </td>\n @for (column of columns; track column.attributeId) {\n <td class=\"u-ellipsis\" [ngClass]=\"'u-txt-' + optionsCopy?.style?.cellTextAlign\">\n @if (column.property === 'metadata') {\n <pry-metadata [item]=\"item\"></pry-metadata>\n }\n @if (column.property === 'oClass') {\n <p class=\"content-img\">\n <img\n [height]=\"25\"\n [width]=\"25\"\n [src]=\"item | translateItemToSymbol | async\"\n [alt]=\"item.oClass | translateId: { type: 'class', output: 'name' } | async\"\n />\n </p>\n }\n @if (!['metadata', 'oClass'].includes(column.property)) {\n <pry-expand-value\n [value]=\"item | getValue: column.property | async\"\n [field]=\"column.field\"\n ></pry-expand-value>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n }\n }\n @if (pagination.totalPages > 0) {\n <div class=\"u-display-flex\">\n <pry-paginator\n [totalItemNb]=\"pagination.total\"\n (pageChange)=\"goToPage($event - 1)\"\n [nbPerPage]=\"pagination.rows\"\n [loaded]=\"pagination.loaded\"\n mode=\"short\"\n ></pry-paginator>\n @if (pagination.totalPages !== pagination.loadedPages) {\n <div class=\"a-table__pagination-label\">\n ({{\n '@pry.widget.table.remaining' | i18n: { remaining: pagination.totalPages - pagination.loadedPages }\n }})\n </div>\n }\n </div>\n }\n }\n }\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.SettingsComponent, selector: "pry-settings", inputs: ["widgetIndex", "isDisable", "headerPresent", "open$", "header"], outputs: ["triggerClick", "saveTriggered", "changeTitle"] }, { kind: "component", type: i4.MetadataComponent, selector: "pry-metadata", inputs: ["item"] }, { kind: "component", type: i4.PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: ["manifest", "openData$", "additionalOptions", "headerOptions", "displayCount", "datasourceIds", "widgetIndex"], outputs: ["manifestModified"] }, { kind: "component", type: i4.PrySelectComponent, selector: "pry-select", inputs: ["items", "clearable", "multiple", "closeOnSelect", "placeholder", "forcePlaceHolder", "isForm", "required", "name", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked", "pressedEnter"] }, { kind: "component", type: i4.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i5.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle", "name", "inputId", "inhibit"] }, { kind: "component", type: i6.PryPaginatorComponent, selector: "pry-paginator", inputs: ["action", "nbPerPage", "totalItemNb", "mode", "goBackToFirstPage", "loaded"], outputs: ["pageChange"] }, { kind: "component", type: i7.ResizableComponent, selector: "th[resizable]" }, { kind: "directive", type: i8.ResizableDirective, selector: "[resizable]", outputs: ["resizable"] }, { kind: "component", type: i9.PryWidgetTableCssComponent, selector: "pry-widget-table-css" }, { kind: "component", type: i10.ExpandValueComponent, selector: "pry-expand-value", inputs: ["field", "value"] }, { kind: "directive", type: i11.DetachRowDirective, selector: "[detachRow]", outputs: ["selectedValue"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.TranslateIdPipe, name: "translateId" }, { kind: "pipe", type: i4.TranslateItemToSymbolPipe, name: "translateItemToSymbol" }, { kind: "pipe", type: i4.I18nPipe, name: "i18n" }, { kind: "pipe", type: i12.GetValuePipe, name: "getValue" }] }); }
|
|
254
254
|
}
|
|
255
255
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: WidgetTableComponent, decorators: [{
|
|
256
256
|
type: Component,
|
|
@@ -122,7 +122,7 @@ export class WidgetTileComponent extends DataWidgetComponent {
|
|
|
122
122
|
return Object.keys(value?.metadata ?? {}).length > 0;
|
|
123
123
|
}
|
|
124
124
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: WidgetTileComponent, deps: [{ token: i1.Store }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
125
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: WidgetTileComponent, selector: "pry-widget-tile", usesInheritance: true, ngImport: i0, template: "<pry-widget-tile-css></pry-widget-tile-css>\n<div class=\"o-widget o-widget--tile\">\n @if (displayHeader$ | async) {\n <pry-widget-header\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n #header\n >\n <pry-settings\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [header]=\"header\"\n [open$]=\"open$\"\n class=\"o-settings\"\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"tile_classes\">{{ '@pry.widget.tile.classes' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeClasses($event)\"\n [items]=\"classes$ | async\"\n [multiple]=\"true\"\n [closeOnSelect]=\"false\"\n [ngModel]=\"optionsCopy.classes\"\n bindLabel=\"name\"\n bindValue=\"id\"\n id=\"tile_classes\"\n ></pry-select>\n </div>\n </pry-settings>\n </pry-widget-header>\n }\n <div class=\"o-widget--tile-wrapper\" [style.top]=\"(displayHeader$ | async) ? WIDGET_HEADER_HEIGHT + 'px' : 0\">\n @if ((items$ | async)?.length === 0) {\n <div class=\"no-result\">\n <img\n class=\"no-result__search\"\n src=\"../../../assets/svgs/pry_recherche_pas_de_resultat.svg\"\n alt=\"{{ '@pry.widget.tile.empty' | i18n }}\"\n aria-hidden=\"true\"\n />\n <span class=\"no-result__text\">{{ '@pry.widget.tile.empty' | i18n }}</span>\n </div>\n }\n <ul class=\"o-widget--tile__list\">\n @for (item of items$ | async; track item.id; let index = $index) {\n <li class=\"o-widget--tile__list__item\" (contextmenu)=\"contextMenu($event, item)\">\n <div class=\"o-widget--tile__list__item__header\">\n <img\n [height]=\"25\"\n [width]=\"25\"\n [src]=\"item | translateItemToSymbol | async\"\n [alt]=\"item.oClass | translateId: { type: 'class', output: 'name' } | async\"\n />\n <h3 class=\"o-widget--tile__list__item__header__title\">\n {{\n item.oClass\n | translateId\n : {\n type: 'class',\n output: 'name'\n }\n | async\n }}\n </h3>\n <pry-checkbox\n [ngModel]=\"(selectedIds$ | async).includes(item.id)\"\n (click)=\"select($event, item)\"\n ></pry-checkbox>\n </div>\n <div class=\"o-properties\">\n <ul class=\"o-properties__list\">\n @for (property of (propertiesToDisplay$ | async)![item.oClass]; track property.prop) {\n @for (value of getValue(item, property.prop); track value; let i = $index; let c = $count) {\n <li\n class=\"o-properties__list__item\"\n >\n @if (i === 0) {\n <p class=\"o-properties__list__item__label\">{{ property.label }}:</p>\n }\n @if (!isRaw(property.label, item.oClass)) {\n <p class=\"o-properties__list__item__value\">\n {{ value?.value | dataFormat: property.field }}\n </p>\n } @else {\n <p class=\"o-properties__list__item__raw\">\n <pry-vizualize-raw [item]=\"item\" [propertyName]=\"property.label\"></pry-vizualize-raw>\n </p>\n }\n @if (hasMetadata(value)) {\n <pry-metadata [item]=\"value\"></pry-metadata>\n }\n </li>\n }\n }\n </ul>\n </div>\n <div (click)=\"toggleMap(index, item)\" class=\"o-widget--tile__list__item__footer\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text -link-like\"\n aria-controls=\"tile-map-xxx\"\n aria-expanded=\"false\"\n >\n {{ '@pry.widget.tile.map' | i18n }}\n </button>\n </div>\n @if (maps[index]) {\n <div class=\"o-widget--tile__list__item__map\" id=\"tile-map-xxx\">\n <pry-widget-map [staticManifest]=\"mapManifest\" [staticResultSet]=\"maps[index]!\"></pry-widget-map>\n </div>\n }\n </li>\n }\n </ul>\n</div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.SettingsComponent, selector: "pry-settings", inputs: ["widgetIndex", "isDisable", "headerPresent", "open$", "header"], outputs: ["triggerClick", "saveTriggered", "changeTitle"] }, { kind: "component", type: i3.MetadataComponent, selector: "pry-metadata", inputs: ["item"] }, { kind: "component", type: i3.PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: ["manifest", "openData$", "additionalOptions", "headerOptions", "displayCount", "datasourceIds", "widgetIndex"], outputs: ["manifestModified"] }, { kind: "component", type: i3.VizualizeRawComponent, selector: "pry-vizualize-raw", inputs: ["item", "propertyName", "alt"] }, { kind: "component", type: i3.PrySelectComponent, selector: "pry-select", inputs: ["items", "clearable", "multiple", "closeOnSelect", "placeholder", "isForm", "required", "name", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked", "pressedEnter"] }, { kind: "component", type: i4.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle", "name", "inputId", "inhibit"] }, { kind: "component", type: i5.WidgetMapComponent, selector: "pry-widget-map" }, { kind: "component", type: i6.PryWidgetTileCssComponent, selector: "pry-widget-tile-css" }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslateIdPipe, name: "translateId" }, { kind: "pipe", type: i3.TranslateItemToSymbolPipe, name: "translateItemToSymbol" }, { kind: "pipe", type: i3.I18nPipe, name: "i18n" }, { kind: "pipe", type: i8.DataFormatPipe, name: "dataFormat" }] }); }
|
|
125
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: WidgetTileComponent, selector: "pry-widget-tile", usesInheritance: true, ngImport: i0, template: "<pry-widget-tile-css></pry-widget-tile-css>\n<div class=\"o-widget o-widget--tile\">\n @if (displayHeader$ | async) {\n <pry-widget-header\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n #header\n >\n <pry-settings\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [header]=\"header\"\n [open$]=\"open$\"\n class=\"o-settings\"\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"tile_classes\">{{ '@pry.widget.tile.classes' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeClasses($event)\"\n [items]=\"classes$ | async\"\n [multiple]=\"true\"\n [closeOnSelect]=\"false\"\n [ngModel]=\"optionsCopy.classes\"\n bindLabel=\"name\"\n bindValue=\"id\"\n id=\"tile_classes\"\n ></pry-select>\n </div>\n </pry-settings>\n </pry-widget-header>\n }\n <div class=\"o-widget--tile-wrapper\" [style.top]=\"(displayHeader$ | async) ? WIDGET_HEADER_HEIGHT + 'px' : 0\">\n @if ((items$ | async)?.length === 0) {\n <div class=\"no-result\">\n <img\n class=\"no-result__search\"\n src=\"../../../assets/svgs/pry_recherche_pas_de_resultat.svg\"\n alt=\"{{ '@pry.widget.tile.empty' | i18n }}\"\n aria-hidden=\"true\"\n />\n <span class=\"no-result__text\">{{ '@pry.widget.tile.empty' | i18n }}</span>\n </div>\n }\n <ul class=\"o-widget--tile__list\">\n @for (item of items$ | async; track item.id; let index = $index) {\n <li class=\"o-widget--tile__list__item\" (contextmenu)=\"contextMenu($event, item)\">\n <div class=\"o-widget--tile__list__item__header\">\n <img\n [height]=\"25\"\n [width]=\"25\"\n [src]=\"item | translateItemToSymbol | async\"\n [alt]=\"item.oClass | translateId: { type: 'class', output: 'name' } | async\"\n />\n <h3 class=\"o-widget--tile__list__item__header__title\">\n {{\n item.oClass\n | translateId\n : {\n type: 'class',\n output: 'name'\n }\n | async\n }}\n </h3>\n <pry-checkbox\n [ngModel]=\"(selectedIds$ | async).includes(item.id)\"\n (click)=\"select($event, item)\"\n ></pry-checkbox>\n </div>\n <div class=\"o-properties\">\n <ul class=\"o-properties__list\">\n @for (property of (propertiesToDisplay$ | async)![item.oClass]; track property.prop) {\n @for (value of getValue(item, property.prop); track value; let i = $index; let c = $count) {\n <li\n class=\"o-properties__list__item\"\n >\n @if (i === 0) {\n <p class=\"o-properties__list__item__label\">{{ property.label }}:</p>\n }\n @if (!isRaw(property.label, item.oClass)) {\n <p class=\"o-properties__list__item__value\">\n {{ value?.value | dataFormat: property.field }}\n </p>\n } @else {\n <p class=\"o-properties__list__item__raw\">\n <pry-vizualize-raw [item]=\"item\" [propertyName]=\"property.label\"></pry-vizualize-raw>\n </p>\n }\n @if (hasMetadata(value)) {\n <pry-metadata [item]=\"value\"></pry-metadata>\n }\n </li>\n }\n }\n </ul>\n </div>\n <div (click)=\"toggleMap(index, item)\" class=\"o-widget--tile__list__item__footer\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-text -link-like\"\n aria-controls=\"tile-map-xxx\"\n aria-expanded=\"false\"\n >\n {{ '@pry.widget.tile.map' | i18n }}\n </button>\n </div>\n @if (maps[index]) {\n <div class=\"o-widget--tile__list__item__map\" id=\"tile-map-xxx\">\n <pry-widget-map [staticManifest]=\"mapManifest\" [staticResultSet]=\"maps[index]!\"></pry-widget-map>\n </div>\n }\n </li>\n }\n </ul>\n</div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.SettingsComponent, selector: "pry-settings", inputs: ["widgetIndex", "isDisable", "headerPresent", "open$", "header"], outputs: ["triggerClick", "saveTriggered", "changeTitle"] }, { kind: "component", type: i3.MetadataComponent, selector: "pry-metadata", inputs: ["item"] }, { kind: "component", type: i3.PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: ["manifest", "openData$", "additionalOptions", "headerOptions", "displayCount", "datasourceIds", "widgetIndex"], outputs: ["manifestModified"] }, { kind: "component", type: i3.VizualizeRawComponent, selector: "pry-vizualize-raw", inputs: ["item", "propertyName", "alt"] }, { kind: "component", type: i3.PrySelectComponent, selector: "pry-select", inputs: ["items", "clearable", "multiple", "closeOnSelect", "placeholder", "forcePlaceHolder", "isForm", "required", "name", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked", "pressedEnter"] }, { kind: "component", type: i4.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle", "name", "inputId", "inhibit"] }, { kind: "component", type: i5.WidgetMapComponent, selector: "pry-widget-map" }, { kind: "component", type: i6.PryWidgetTileCssComponent, selector: "pry-widget-tile-css" }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslateIdPipe, name: "translateId" }, { kind: "pipe", type: i3.TranslateItemToSymbolPipe, name: "translateItemToSymbol" }, { kind: "pipe", type: i3.I18nPipe, name: "i18n" }, { kind: "pipe", type: i8.DataFormatPipe, name: "dataFormat" }] }); }
|
|
126
126
|
}
|
|
127
127
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: WidgetTileComponent, decorators: [{
|
|
128
128
|
type: Component,
|
|
@@ -28,10 +28,10 @@ export class WidgetVegaComponent extends DataWidgetComponent {
|
|
|
28
28
|
this.vegaSpec$ = combineLatest([this.options$, this.resultSet$, this.widgetSize$, this.displayHeader$]).pipe(filter(([options, rs, size, header]) => !!rs), map(([options, rs, size, header]) => {
|
|
29
29
|
const data = WidgetVegaComponent.getValues(rs);
|
|
30
30
|
const vegaSpec = WidgetVegaComponent.placeData(options, structuredClone(options.baseSpec), data);
|
|
31
|
-
vegaSpec.width = vegaSpec
|
|
32
|
-
vegaSpec.height = vegaSpec
|
|
33
|
-
vegaSpec.autosize = vegaSpec
|
|
34
|
-
vegaSpec.padding = vegaSpec
|
|
31
|
+
vegaSpec.width = vegaSpec?.width ?? size.width - 5;
|
|
32
|
+
vegaSpec.height = vegaSpec?.height ?? size.height - 5 - (header ? WIDGET_HEADER_HEIGHT.value : 0);
|
|
33
|
+
vegaSpec.autosize = vegaSpec?.autosize ?? { type: 'fit', contains: 'padding' };
|
|
34
|
+
vegaSpec.padding = vegaSpec?.padding ?? 15;
|
|
35
35
|
// @ts-ignore
|
|
36
36
|
if (window.widgetVegaLogging === true) {
|
|
37
37
|
console.log(JSON.stringify(vegaSpec, undefined, 4));
|
|
@@ -134,4 +134,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
134
134
|
type: ViewChild,
|
|
135
135
|
args: ['vega']
|
|
136
136
|
}] } });
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LXZlZ2EuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvd2lkZ2V0cy93aWRnZXQtdmVnYS9jb21wb25lbnQvd2lkZ2V0LXZlZ2EuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvd2lkZ2V0cy93aWRnZXQtdmVnYS9jb21wb25lbnQvd2lkZ2V0LXZlZ2EuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBaUIsU0FBUyxFQUFjLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEYsT0FBTyxFQUVMLG1CQUFtQixFQU9uQixvQkFBb0IsRUFDckIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzQixPQUFPLEtBQTRCLE1BQU0sWUFBWSxDQUFDOzs7Ozs7QUFNdEQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLG1CQUFtQjtJQVUxRCxZQUNFLEtBQWlCLEVBQ1QsZ0JBQWdDLEVBQ3hDLEVBQWMsRUFDWSxRQUFrQixFQUNwQyxZQUFnQztRQUV4QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBTFQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFnQjtRQUVkLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDcEMsaUJBQVksR0FBWixZQUFZLENBQW9CO1FBWDFDLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRS9CLGdCQUFXLEdBQXNCLEVBQUUsUUFBUSxF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QUMsS0FBSyxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDO2dCQUNqRCxJQUFJLEVBQUUsT0FBTztnQkFDYixPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxtQ0FBbUMsQ0FBQztnQkFDM0UsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUM7YUFDckUsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztZQUM1RCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDOzhHQTVJVSxtQkFBbUIsK0ZBY3BCLFFBQVE7a0dBZFAsbUJBQW1CLDRLQ3ZCaEMsbXJEQThDQTs7MkZEdkJhLG1CQUFtQjtrQkFKL0IsU0FBUzsrQkFDRSxpQkFBaUI7OzBCQWlCeEIsTUFBTTsyQkFBQyxRQUFROzBFQWJDLElBQUk7c0JBQXRCLFNBQVM7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlU2ltcGxlVmFsdWUsXG4gIERhdGFXaWRnZXRDb21wb25lbnQsXG4gIEl0ZW0sXG4gIFByeUkxOG5TZXJ2aWNlLFxuICBQcnlTbmFja2JhclNlcnZpY2UsXG4gIFJlc3VsdFNldCxcbiAgVmFsdWVUeXBlLFxuICBWZWdhV2lkZ2V0T3B0aW9ucyxcbiAgV0lER0VUX0hFQURFUl9IRUlHSFRcbn0gZnJvbSAnQHByb3ZvbHkvZGFzaGJvYXJkJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIGZpbHRlciwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBWaWV3IH0gZnJvbSAndmVnYSc7XG5pbXBvcnQgZW1iZWQsIHsgVmlzdWFsaXphdGlvblNwZWMgfSBmcm9tICd2ZWdhLWVtYmVkJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncHJ5LXdpZGdldC12ZWdhJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpZGdldC12ZWdhLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBXaWRnZXRWZWdhQ29tcG9uZW50IGV4dGVuZHMgRGF0YVdpZGdldENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBAVmlld0NoaWxkKCd2ZWdhJykgdmVnYSE6IEVsZW1lbnRSZWY7XG4gIHZpZXc/OiBWaWV3O1xuICB2ZWdhU3BlYyQ6IE9ic2VydmFibGU8VmlzdWFsaXphdGlvblNwZWM+O1xuICB0cmlnZ2VyJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPGFueT47XG4gIG9wdGlvbnNDb3B5OiBWZWdhV2lkZ2V0T3B0aW9ucyA9IHsgYmFzZVNwZWM6IHt9LCBwbGFjZURhdGE6IFtdIH07XG4gIGZvcm1hdHRlZEJhc2VTcGVjOiBzdHJpbmcgPSAne30nO1xuICBpbml0aWFsRm9ybWF0dGVkQmFzZVNwZWM6IHN0cmluZyA9ICd7fSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc3RvcmU6IFN0b3JlPGFueT4sXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBQcnlJMThuU2VydmljZSxcbiAgICBlbDogRWxlbWVudFJlZixcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBwcml2YXRlIHNuYWNrU2VydmljZTogUHJ5U25hY2tiYXJTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKHN0b3JlLCBlbCk7XG5cbiAgICB0aGlzLm9wdGlvbnMkID0gdGhpcy5tYW5pZmVzdCQucGlwZShtYXAoKG1hbmlmZXN0KSA9PiAobWFuaWZlc3Qub3B0aW9ucyA/PyB7fSkgYXMgYW55KSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMub3B0aW9ucyQuc3Vic2NyaWJlKChvcHRpb25zKSA9PiB7XG4gICAgICAgIHRoaXMub3B0aW9uc0NvcHkgPSBzdHJ1Y3R1cmVkQ2xvbmUob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZm9ybWF0dGVkQmFzZVNwZWMgPSBKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnNDb3B5LmJhc2VTcGVjLCB1bmRlZmluZWQsIDQpO1xuICAgICAgICB0aGlzLmluaXRpYWxGb3JtYXR0ZWRCYXNlU3BlYyA9IEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9uc0NvcHkuYmFzZVNwZWMsIHVuZGVmaW5lZCwgNCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnZlZ2FTcGVjJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMub3B0aW9ucyQsIHRoaXMucmVzdWx0U2V0JCwgdGhpcy53aWRnZXRTaXplJCwgdGhpcy5kaXNwbGF5SGVhZGVyJF0pLnBpcGUoXG4gICAgICBmaWx0ZXIoKFtvcHRpb25zLCBycywgc2l6ZSwgaGVhZGVyXSkgPT4gISFycyksXG4gICAgICBtYXAoKFtvcHRpb25zLCBycywgc2l6ZSwgaGVhZGVyXSkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gV2lkZ2V0VmVnYUNvbXBvbmVudC5nZXRWYWx1ZXMocnMpO1xuXG4gICAgICAgIGNvbnN0IHZlZ2FTcGVjID0gV2lkZ2V0VmVnYUNvbXBvbmVudC5wbGFjZURhdGEob3B0aW9ucywgc3RydWN0dXJlZENsb25lKG9wdGlvbnMuYmFzZVNwZWMpLCBkYXRhKTtcblxuICAgICAgICB2ZWdhU3BlYy53aWR0aCA9IHZlZ2FTcGVjLndpZHRoID8/IHNpemUud2lkdGggLSA1O1xuICAgICAgICB2ZWdhU3BlYy5oZWlnaHQgPSB2ZWdhU3BlYy5oZWlnaHQgPz8gc2l6ZS5oZWlnaHQgLSA1IC0gKGhlYWRlciA/IFdJREdFVF9IRUFERVJfSEVJR0hULnZhbHVlIDogMCk7XG4gICAgICAgIHZlZ2FTcGVjLmF1dG9zaXplID0gdmVnYVNwZWMuYXV0b3NpemUgPz8geyB0eXBlOiAnZml0JywgY29udGFpbnM6ICdwYWRkaW5nJyB9O1xuICAgICAgICB2ZWdhU3BlYy5wYWRkaW5nID0gdmVnYVNwZWMucGFkZGluZyA/PyAxNTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICh3aW5kb3cud2lkZ2V0VmVnYUxvZ2dpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh2ZWdhU3BlYywgdW5kZWZpbmVkLCA0KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmVnYVNwZWM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZ2V0VmFsdWVzKGRhdGE6IFJlc3VsdFNldCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhkYXRhLml0ZW1zKVxuICAgICAgLm1hcCgoY2xhenopID0+IGRhdGEuaXRlbXNbY2xhenpdLm1hcCgoaXRlbSkgPT4gV2lkZ2V0VmVnYUNvbXBvbmVudC50cmFuc2Zvcm1Qcm92b2x5TW9kZWxUb0NsYXNzaWMoaXRlbSkpKVxuICAgICAgLmZsYXQoKTtcbiAgfVxuXG4gIHN0YXRpYyB0cmFuc2Zvcm1Qcm92b2x5TW9kZWxUb0NsYXNzaWModmFsdWVzOiBJdGVtKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge30gYXMgeyBba2V5OiBzdHJpbmddOiBWYWx1ZVR5cGUgfTtcbiAgICBPYmplY3Qua2V5cyh2YWx1ZXMuYXR0cmlidXRlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICByZXN1bHRba2V5XSA9ICh2YWx1ZXMuYXR0cmlidXRlc1trZXldIGFzIEF0dHJpYnV0ZVNpbXBsZVZhbHVlKS52YWx1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgcGxhY2VEYXRhKG9wdGlvbnM6IFZlZ2FXaWRnZXRPcHRpb25zLCBiYXNlU3BlYzogYW55LCBkYXRhOiB7IFtrZXk6IHN0cmluZ106IFZhbHVlVHlwZSB9W10pIHtcbiAgICBjb25zdCBjbG9uZSA9IHN0cnVjdHVyZWRDbG9uZShiYXNlU3BlYyk7XG4gICAgbGV0IHJlZiA9IGNsb25lO1xuICAgIChvcHRpb25zLnBsYWNlRGF0YSA/PyBbXSkuZm9yRWFjaCgocHJvcCwgaWR4LCBhcnIpID0+IHtcbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgaWYgKGlkeCA8IGFyci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgcmVmID0gcmVmW3Byb3BdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlZltwcm9wXSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMudmVnYVNwZWMkLCB0aGlzLnRyaWdnZXIkLCB0aGlzLndpZGdldFNpemUkXSkuc3Vic2NyaWJlKChbc3BlYywgXywgc2l6ZV0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMudmVnYSkge1xuICAgICAgICAgIHRoaXMudmlldz8uZmluYWxpemUoKTtcblxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBpZiAodGhpcy5kb2N1bWVudC5sb2dWZWdhU3BlYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShzcGVjLCB1bmRlZmluZWQsIDQpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlbWJlZCh0aGlzLnZlZ2EubmF0aXZlRWxlbWVudCwgc3RydWN0dXJlZENsb25lKHNwZWMpLCB7XG4gICAgICAgICAgICBhY3Rpb25zOiBmYWxzZSxcbiAgICAgICAgICAgIHJlbmRlcmVyOiAnY2FudmFzJyxcbiAgICAgICAgICAgIGZvcm1hdExvY2FsZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnRPYmplY3QoJ0Bwcnkud2lkZ2V0LmNoYXJ0Lm51bWJlckxvY2FsZScpLFxuICAgICAgICAgICAgdGltZUZvcm1hdExvY2FsZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnRPYmplY3QoJ0Bwcnkud2lkZ2V0LmNoYXJ0LnRpbWVGb3JtYXRMb2NhbGUnKVxuICAgICAgICAgIH0pLnRoZW4oKHJlc3VsdCkgPT4gKHRoaXMudmlldyA9IHJlc3VsdC52aWV3KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRyaWdnZXIkLm5leHQoKSwgMTAwKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMudHJpZ2dlciQubmV4dCgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdG9JbWFnZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZXNvbHZlKHRoaXMudmVnYS5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2NhbnZhcycpWzBdLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJykpO1xuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgZW1pdE1hbmlmZXN0KCkge1xuICAgIHRoaXMubWFuaWZlc3RNb2RpZmllZC5lbWl0KHtcbiAgICAgIHdpZGdldEluZGV4OiB0aGlzLndpZGdldEluZGV4LFxuICAgICAgbWFuaWZlc3Q6IHsgLi4udGhpcy5tYW5pZmVzdCwgb3B0aW9uczogdGhpcy5vcHRpb25zQ29weSB9XG4gICAgfSk7XG4gIH1cblxuICBjaGFuZ2VQbGFjZURhdGEoJGV2ZW50OiBFdmVudCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBleHByID0gJGV2ZW50LmN1cnJlbnRUYXJnZXQudmFsdWU7XG4gICAgdGhpcy5vcHRpb25zQ29weS5wbGFjZURhdGEgPSBleHByXG4gICAgICAuc3BsaXQoJy4nKVxuICAgICAgLm1hcCgodmFsOiBzdHJpbmcpID0+IChwYXJzZUludCh2YWwpICsgJycgPT09IGAke3ZhbH1gID8gcGFyc2VJbnQodmFsKSA6IHZhbCkpO1xuICB9XG5cbiAgY2hhbmdlU3BlYygkZXZlbnQ6IEV2ZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkuYmFzZVNwZWMgPSBKU09OLnBhcnNlKCRldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5zbmFja1NlcnZpY2Uubm90TWl0aWdhdGVkT3Blbih7XG4gICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgIG1lc3NhZ2U6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC52ZWdhLm5vdFBhcnNlYWJsZVNwZWMnKSxcbiAgICAgICAgYWN0aW9uOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQudmVnYS5zcGVjUmVpbml0JylcbiAgICAgIH0pO1xuICAgICAgbWVzc2FnZT8uc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5vcHRpb25zQ29weS5iYXNlU3BlYyA9IHRoaXMuaW5pdGlhbEZvcm1hdHRlZEJhc2VTcGVjO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8cHJ5LXdpZGdldC12ZWdhLWNzcz48L3ByeS13aWRnZXQtdmVnYS1jc3M+XG48ZGl2IGNsYXNzPVwiby13aWRnZXQgby13aWRnZXQtLWNoYXJ0XCI+XG4gIEBpZiAoZGlzcGxheUhlYWRlciQgfCBhc3luYykge1xuICAgIDxwcnktd2lkZ2V0LWhlYWRlclxuICAgICAgW3dpZGdldEluZGV4XT1cIndpZGdldEluZGV4XCJcbiAgICAgIFttYW5pZmVzdF09XCJtYW5pZmVzdFwiXG4gICAgICAobWFuaWZlc3RNb2RpZmllZCk9XCJtYW5pZmVzdE1vZGlmaWVkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAjaGVhZGVyXG4gICAgICBbaGVhZGVyT3B0aW9uc109XCIoZGlzcGxheUhlYWRlciQgfCBhc3luYykgPz8ge31cIlxuICAgICAgW2RhdGFzb3VyY2VJZHNdPVwiKGRhdGFzb3VyY2VJZHMkIHwgYXN5bmMpID8/IFtdXCJcbiAgICAgID5cbiAgICAgIDxwcnktc2V0dGluZ3NcbiAgICAgICAgKHNhdmVUcmlnZ2VyZWQpPVwiZW1pdE1hbmlmZXN0KClcIlxuICAgICAgICAoY2hhbmdlVGl0bGUpPVwiY2hhbmdlV2lkZ2V0VGl0bGUoJGV2ZW50KVwiXG4gICAgICAgIFtoZWFkZXJQcmVzZW50XT1cImRpc3BsYXlIZWFkZXIkIHwgYXN5bmNcIlxuICAgICAgICBbd2lkZ2V0SW5kZXhdPVwid2lkZ2V0SW5kZXhcIlxuICAgICAgICBbaGVhZGVyXT1cImhlYWRlclwiXG4gICAgICAgIFtvcGVuJF09XCJvcGVuJFwiXG4gICAgICAgIGNsYXNzPVwiby1zZXR0aW5nc1wiXG4gICAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm8tc2V0dGluZ3NfX2ZpZWxkc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJwbGFjZURhdGFfc3JjXCI+e3sgJ0Bwcnkud2lkZ2V0LnZlZ2EucGxhY2VEYXRhJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgaWQ9XCJwbGFjZURhdGFfc3JjXCJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiKG9wdGlvbnNDb3B5LnBsYWNlRGF0YSA/PyBbXSkuam9pbignLicpXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cImNoYW5nZVBsYWNlRGF0YSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwic3BlY19zcmNcIj57eyAnQHByeS53aWRnZXQudmVnYS5zcGVjJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkIGEtdGV4dC1hcmVhXCJcbiAgICAgICAgICAgICAgaWQ9XCJzcGVjX3NyY1wiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtYXR0ZWRCYXNlU3BlY1wiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJjaGFuZ2VTcGVjKCRldmVudClcIlxuICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9wcnktc2V0dGluZ3M+XG4gICAgPC9wcnktd2lkZ2V0LWhlYWRlcj5cbiAgfVxuICA8ZGl2IGNsYXNzPVwiby13aWRnZXQtLWNoYXJ0LS1jaGFydFwiICN2ZWdhPjwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LXZlZ2EuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvd2lkZ2V0cy93aWRnZXQtdmVnYS9jb21wb25lbnQvd2lkZ2V0LXZlZ2EuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvd2lkZ2V0cy93aWRnZXQtdmVnYS9jb21wb25lbnQvd2lkZ2V0LXZlZ2EuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBaUIsU0FBUyxFQUFjLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEYsT0FBTyxFQUVMLG1CQUFtQixFQU9uQixvQkFBb0IsRUFDckIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzQixPQUFPLEtBQTRCLE1BQU0sWUFBWSxDQUFDOzs7Ozs7QUFNdEQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLG1CQUFtQjtJQVUxRCxZQUNFLEtBQWlCLEVBQ1QsZ0JBQWdDLEVBQ3hDLEVBQWMsRUFDWSxRQUFrQixFQUNwQyxZQUFnQztRQUV4QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBTFQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFnQjtRQUVkLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDcEMsaUJBQVksR0FBWixZQUFZLENBQW9CO1FBWDFDLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRS9CLGdCQUFXLEdBQXNCLEVBQUUsUUFBUSxF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QUMsS0FBSyxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDO2dCQUNqRCxJQUFJLEVBQUUsT0FBTztnQkFDYixPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxtQ0FBbUMsQ0FBQztnQkFDM0UsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUM7YUFDckUsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztZQUM1RCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDOzhHQTVJVSxtQkFBbUIsK0ZBY3BCLFFBQVE7a0dBZFAsbUJBQW1CLDRLQ3ZCaEMsbXJEQThDQTs7MkZEdkJhLG1CQUFtQjtrQkFKL0IsU0FBUzsrQkFDRSxpQkFBaUI7OzBCQWlCeEIsTUFBTTsyQkFBQyxRQUFROzBFQWJDLElBQUk7c0JBQXRCLFNBQVM7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlU2ltcGxlVmFsdWUsXG4gIERhdGFXaWRnZXRDb21wb25lbnQsXG4gIEl0ZW0sXG4gIFByeUkxOG5TZXJ2aWNlLFxuICBQcnlTbmFja2JhclNlcnZpY2UsXG4gIFJlc3VsdFNldCxcbiAgVmFsdWVUeXBlLFxuICBWZWdhV2lkZ2V0T3B0aW9ucyxcbiAgV0lER0VUX0hFQURFUl9IRUlHSFRcbn0gZnJvbSAnQHByb3ZvbHkvZGFzaGJvYXJkJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIGZpbHRlciwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBWaWV3IH0gZnJvbSAndmVnYSc7XG5pbXBvcnQgZW1iZWQsIHsgVmlzdWFsaXphdGlvblNwZWMgfSBmcm9tICd2ZWdhLWVtYmVkJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncHJ5LXdpZGdldC12ZWdhJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpZGdldC12ZWdhLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBXaWRnZXRWZWdhQ29tcG9uZW50IGV4dGVuZHMgRGF0YVdpZGdldENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBAVmlld0NoaWxkKCd2ZWdhJykgdmVnYSE6IEVsZW1lbnRSZWY7XG4gIHZpZXc/OiBWaWV3O1xuICB2ZWdhU3BlYyQ6IE9ic2VydmFibGU8VmlzdWFsaXphdGlvblNwZWM+O1xuICB0cmlnZ2VyJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPGFueT47XG4gIG9wdGlvbnNDb3B5OiBWZWdhV2lkZ2V0T3B0aW9ucyA9IHsgYmFzZVNwZWM6IHt9LCBwbGFjZURhdGE6IFtdIH07XG4gIGZvcm1hdHRlZEJhc2VTcGVjOiBzdHJpbmcgPSAne30nO1xuICBpbml0aWFsRm9ybWF0dGVkQmFzZVNwZWM6IHN0cmluZyA9ICd7fSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc3RvcmU6IFN0b3JlPGFueT4sXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBQcnlJMThuU2VydmljZSxcbiAgICBlbDogRWxlbWVudFJlZixcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBwcml2YXRlIHNuYWNrU2VydmljZTogUHJ5U25hY2tiYXJTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKHN0b3JlLCBlbCk7XG5cbiAgICB0aGlzLm9wdGlvbnMkID0gdGhpcy5tYW5pZmVzdCQucGlwZShtYXAoKG1hbmlmZXN0KSA9PiAobWFuaWZlc3Qub3B0aW9ucyA/PyB7fSkgYXMgYW55KSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMub3B0aW9ucyQuc3Vic2NyaWJlKChvcHRpb25zKSA9PiB7XG4gICAgICAgIHRoaXMub3B0aW9uc0NvcHkgPSBzdHJ1Y3R1cmVkQ2xvbmUob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZm9ybWF0dGVkQmFzZVNwZWMgPSBKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnNDb3B5LmJhc2VTcGVjLCB1bmRlZmluZWQsIDQpO1xuICAgICAgICB0aGlzLmluaXRpYWxGb3JtYXR0ZWRCYXNlU3BlYyA9IEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9uc0NvcHkuYmFzZVNwZWMsIHVuZGVmaW5lZCwgNCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnZlZ2FTcGVjJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMub3B0aW9ucyQsIHRoaXMucmVzdWx0U2V0JCwgdGhpcy53aWRnZXRTaXplJCwgdGhpcy5kaXNwbGF5SGVhZGVyJF0pLnBpcGUoXG4gICAgICBmaWx0ZXIoKFtvcHRpb25zLCBycywgc2l6ZSwgaGVhZGVyXSkgPT4gISFycyksXG4gICAgICBtYXAoKFtvcHRpb25zLCBycywgc2l6ZSwgaGVhZGVyXSkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gV2lkZ2V0VmVnYUNvbXBvbmVudC5nZXRWYWx1ZXMocnMpO1xuXG4gICAgICAgIGNvbnN0IHZlZ2FTcGVjID0gV2lkZ2V0VmVnYUNvbXBvbmVudC5wbGFjZURhdGEob3B0aW9ucywgc3RydWN0dXJlZENsb25lKG9wdGlvbnMuYmFzZVNwZWMpLCBkYXRhKTtcblxuICAgICAgICB2ZWdhU3BlYy53aWR0aCA9IHZlZ2FTcGVjPy53aWR0aCA/PyBzaXplLndpZHRoIC0gNTtcbiAgICAgICAgdmVnYVNwZWMuaGVpZ2h0ID0gdmVnYVNwZWM/LmhlaWdodCA/PyBzaXplLmhlaWdodCAtIDUgLSAoaGVhZGVyID8gV0lER0VUX0hFQURFUl9IRUlHSFQudmFsdWUgOiAwKTtcbiAgICAgICAgdmVnYVNwZWMuYXV0b3NpemUgPSB2ZWdhU3BlYz8uYXV0b3NpemUgPz8geyB0eXBlOiAnZml0JywgY29udGFpbnM6ICdwYWRkaW5nJyB9O1xuICAgICAgICB2ZWdhU3BlYy5wYWRkaW5nID0gdmVnYVNwZWM/LnBhZGRpbmcgPz8gMTU7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAod2luZG93LndpZGdldFZlZ2FMb2dnaW5nID09PSB0cnVlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkodmVnYVNwZWMsIHVuZGVmaW5lZCwgNCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZlZ2FTcGVjO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGdldFZhbHVlcyhkYXRhOiBSZXN1bHRTZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZGF0YS5pdGVtcylcbiAgICAgIC5tYXAoKGNsYXp6KSA9PiBkYXRhLml0ZW1zW2NsYXp6XS5tYXAoKGl0ZW0pID0+IFdpZGdldFZlZ2FDb21wb25lbnQudHJhbnNmb3JtUHJvdm9seU1vZGVsVG9DbGFzc2ljKGl0ZW0pKSlcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICBzdGF0aWMgdHJhbnNmb3JtUHJvdm9seU1vZGVsVG9DbGFzc2ljKHZhbHVlczogSXRlbSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIHsgW2tleTogc3RyaW5nXTogVmFsdWVUeXBlIH07XG4gICAgT2JqZWN0LmtleXModmFsdWVzLmF0dHJpYnV0ZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgcmVzdWx0W2tleV0gPSAodmFsdWVzLmF0dHJpYnV0ZXNba2V5XSBhcyBBdHRyaWJ1dGVTaW1wbGVWYWx1ZSkudmFsdWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIHBsYWNlRGF0YShvcHRpb25zOiBWZWdhV2lkZ2V0T3B0aW9ucywgYmFzZVNwZWM6IGFueSwgZGF0YTogeyBba2V5OiBzdHJpbmddOiBWYWx1ZVR5cGUgfVtdKSB7XG4gICAgY29uc3QgY2xvbmUgPSBzdHJ1Y3R1cmVkQ2xvbmUoYmFzZVNwZWMpO1xuICAgIGxldCByZWYgPSBjbG9uZTtcbiAgICAob3B0aW9ucy5wbGFjZURhdGEgPz8gW10pLmZvckVhY2goKHByb3AsIGlkeCwgYXJyKSA9PiB7XG4gICAgICBpZiAocmVmKSB7XG4gICAgICAgIGlmIChpZHggPCBhcnIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHJlZiA9IHJlZltwcm9wXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWZbcHJvcF0gPSBkYXRhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnZlZ2FTcGVjJCwgdGhpcy50cmlnZ2VyJCwgdGhpcy53aWRnZXRTaXplJF0pLnN1YnNjcmliZSgoW3NwZWMsIF8sIHNpemVdKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnZlZ2EpIHtcbiAgICAgICAgICB0aGlzLnZpZXc/LmZpbmFsaXplKCk7XG5cbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgaWYgKHRoaXMuZG9jdW1lbnQubG9nVmVnYVNwZWMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoc3BlYywgdW5kZWZpbmVkLCA0KSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZW1iZWQodGhpcy52ZWdhLm5hdGl2ZUVsZW1lbnQsIHN0cnVjdHVyZWRDbG9uZShzcGVjKSwge1xuICAgICAgICAgICAgYWN0aW9uczogZmFsc2UsXG4gICAgICAgICAgICByZW5kZXJlcjogJ2NhbnZhcycsXG4gICAgICAgICAgICBmb3JtYXRMb2NhbGU6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50T2JqZWN0KCdAcHJ5LndpZGdldC5jaGFydC5udW1iZXJMb2NhbGUnKSxcbiAgICAgICAgICAgIHRpbWVGb3JtYXRMb2NhbGU6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50T2JqZWN0KCdAcHJ5LndpZGdldC5jaGFydC50aW1lRm9ybWF0TG9jYWxlJylcbiAgICAgICAgICB9KS50aGVuKChyZXN1bHQpID0+ICh0aGlzLnZpZXcgPSByZXN1bHQudmlldykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50cmlnZ2VyJC5uZXh0KCksIDEwMCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnRyaWdnZXIkLm5leHQoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRvSW1hZ2UoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVzb2x2ZSh0aGlzLnZlZ2EubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdjYW52YXMnKVswXS50b0RhdGFVUkwoJ2ltYWdlL3BuZycpKTtcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGVtaXRNYW5pZmVzdCgpIHtcbiAgICB0aGlzLm1hbmlmZXN0TW9kaWZpZWQuZW1pdCh7XG4gICAgICB3aWRnZXRJbmRleDogdGhpcy53aWRnZXRJbmRleCxcbiAgICAgIG1hbmlmZXN0OiB7IC4uLnRoaXMubWFuaWZlc3QsIG9wdGlvbnM6IHRoaXMub3B0aW9uc0NvcHkgfVxuICAgIH0pO1xuICB9XG5cbiAgY2hhbmdlUGxhY2VEYXRhKCRldmVudDogRXZlbnQpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgZXhwciA9ICRldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMub3B0aW9uc0NvcHkucGxhY2VEYXRhID0gZXhwclxuICAgICAgLnNwbGl0KCcuJylcbiAgICAgIC5tYXAoKHZhbDogc3RyaW5nKSA9PiAocGFyc2VJbnQodmFsKSArICcnID09PSBgJHt2YWx9YCA/IHBhcnNlSW50KHZhbCkgOiB2YWwpKTtcbiAgfVxuXG4gIGNoYW5nZVNwZWMoJGV2ZW50OiBFdmVudCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmJhc2VTcGVjID0gSlNPTi5wYXJzZSgkZXZlbnQuY3VycmVudFRhcmdldC52YWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuc25hY2tTZXJ2aWNlLm5vdE1pdGlnYXRlZE9wZW4oe1xuICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICBtZXNzYWdlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQudmVnYS5ub3RQYXJzZWFibGVTcGVjJyksXG4gICAgICAgIGFjdGlvbjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0LnZlZ2Euc3BlY1JlaW5pdCcpXG4gICAgICB9KTtcbiAgICAgIG1lc3NhZ2U/LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMub3B0aW9uc0NvcHkuYmFzZVNwZWMgPSB0aGlzLmluaXRpYWxGb3JtYXR0ZWRCYXNlU3BlYztcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiPHByeS13aWRnZXQtdmVnYS1jc3M+PC9wcnktd2lkZ2V0LXZlZ2EtY3NzPlxuPGRpdiBjbGFzcz1cIm8td2lkZ2V0IG8td2lkZ2V0LS1jaGFydFwiPlxuICBAaWYgKGRpc3BsYXlIZWFkZXIkIHwgYXN5bmMpIHtcbiAgICA8cHJ5LXdpZGdldC1oZWFkZXJcbiAgICAgIFt3aWRnZXRJbmRleF09XCJ3aWRnZXRJbmRleFwiXG4gICAgICBbbWFuaWZlc3RdPVwibWFuaWZlc3RcIlxuICAgICAgKG1hbmlmZXN0TW9kaWZpZWQpPVwibWFuaWZlc3RNb2RpZmllZC5lbWl0KCRldmVudClcIlxuICAgICAgI2hlYWRlclxuICAgICAgW2hlYWRlck9wdGlvbnNdPVwiKGRpc3BsYXlIZWFkZXIkIHwgYXN5bmMpID8/IHt9XCJcbiAgICAgIFtkYXRhc291cmNlSWRzXT1cIihkYXRhc291cmNlSWRzJCB8IGFzeW5jKSA/PyBbXVwiXG4gICAgICA+XG4gICAgICA8cHJ5LXNldHRpbmdzXG4gICAgICAgIChzYXZlVHJpZ2dlcmVkKT1cImVtaXRNYW5pZmVzdCgpXCJcbiAgICAgICAgKGNoYW5nZVRpdGxlKT1cImNoYW5nZVdpZGdldFRpdGxlKCRldmVudClcIlxuICAgICAgICBbaGVhZGVyUHJlc2VudF09XCJkaXNwbGF5SGVhZGVyJCB8IGFzeW5jXCJcbiAgICAgICAgW3dpZGdldEluZGV4XT1cIndpZGdldEluZGV4XCJcbiAgICAgICAgW2hlYWRlcl09XCJoZWFkZXJcIlxuICAgICAgICBbb3BlbiRdPVwib3BlbiRcIlxuICAgICAgICBjbGFzcz1cIm8tc2V0dGluZ3NcIlxuICAgICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvLXNldHRpbmdzX19maWVsZHNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwicGxhY2VEYXRhX3NyY1wiPnt7ICdAcHJ5LndpZGdldC52ZWdhLnBsYWNlRGF0YScgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgIGlkPVwicGxhY2VEYXRhX3NyY1wiXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIihvcHRpb25zQ29weS5wbGFjZURhdGEgPz8gW10pLmpvaW4oJy4nKVwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJjaGFuZ2VQbGFjZURhdGEoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cInNwZWNfc3JjXCI+e3sgJ0Bwcnkud2lkZ2V0LnZlZ2Euc3BlYycgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZCBhLXRleHQtYXJlYVwiXG4gICAgICAgICAgICAgIGlkPVwic3BlY19zcmNcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiZm9ybWF0dGVkQmFzZVNwZWNcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlU3BlYygkZXZlbnQpXCJcbiAgICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvcHJ5LXNldHRpbmdzPlxuICAgIDwvcHJ5LXdpZGdldC1oZWFkZXI+XG4gIH1cbiAgPGRpdiBjbGFzcz1cIm8td2lkZ2V0LS1jaGFydC0tY2hhcnRcIiAjdmVnYT48L2Rpdj5cbjwvZGl2PlxuIl19
|