@igo2/context
Version:
223 lines • 36.3 kB
JavaScript
import { Injectable, Optional } from '@angular/core';
import { RouteService } from '@igo2/core/route';
import { isLayerItem } from '@igo2/geo';
import { ContextService } from '../../context-manager/shared/context.service';
import * as i0 from "@angular/core";
import * as i1 from "../../context-manager/shared/context.service";
import * as i2 from "@igo2/core/route";
export class ShareMapService {
contextService;
route;
language = '';
constructor(contextService, route) {
this.contextService = contextService;
this.route = route;
this.route.queryParams.subscribe((params) => {
if (params['lang']) {
this.language = params['lang'];
}
});
}
getUrlWithApi(formValues) {
return this.language
? `${location.origin + location.pathname}?context=${formValues.uri}&lang=${this.language}`
: `${location.origin + location.pathname}?context=${formValues.uri}`;
}
createContextShared(map, formValues) {
const context = this.contextService.getContextFromMap(map);
context.scope = 'public';
context.title = formValues.title;
context.uri = formValues.uri;
return this.contextService.create(context);
}
updateContextShared(map, formValues, id) {
const context = this.contextService.getContextFromMap(map);
return this.contextService.update(id, {
title: formValues.title,
map: context.map
});
}
getUrlWithoutApi(map, publicShareOption) {
if (!this.route ||
!this.route.options.visibleOnLayersKey ||
!this.route.options.visibleOffLayersKey ||
!map.viewController.getZoom()) {
return;
}
const llc = publicShareOption.layerlistControls.querystring;
let visibleKey = this.route.options.visibleOnLayersKey;
let invisibleKey = this.route.options.visibleOffLayersKey;
const layers = map.layerController.all.filter((layer) => isLayerItem(layer));
const visibleLayers = layers.filter((lay) => lay.visible && !lay.isIgoInternalLayer);
const invisibleLayers = layers.filter((lay) => !lay.visible && !lay.isIgoInternalLayer);
if (visibleLayers.length === 0) {
visibleKey = '';
}
if (invisibleLayers.length === 0) {
invisibleKey = '';
}
let layersUrl = '';
let layersToLoop = [];
if (visibleLayers.length > invisibleLayers.length) {
layersUrl = `${visibleKey}=*&${invisibleKey}=`;
layersToLoop = invisibleLayers;
}
else {
layersUrl = `${invisibleKey}=*&${visibleKey}=`;
layersToLoop = visibleLayers;
}
for (const layer of layersToLoop) {
if (layer.id) {
layersUrl += layer.id + ',';
}
}
const contextLayersID = [];
const contextLayers = this.contextService.context$.value.layers;
for (const contextLayer of contextLayers) {
if (typeof contextLayer.id !== 'undefined' ||
typeof contextLayer.source !== 'undefined') {
contextLayersID.push(contextLayer.id || contextLayer.source.id);
}
}
const addedLayersQueryParamsWms = this.makeLayersByService(layers, contextLayersID, 'wms');
const addedLayersQueryParamsWmts = this.makeLayersByService(layers, contextLayersID, 'wmts');
const addedLayersQueryParamsArcgisRest = this.makeLayersByService(layers, contextLayersID, 'arcgisrest');
const addedLayersQueryParamsImageArcgisRest = this.makeLayersByService(layers, contextLayersID, 'imagearcgisrest');
const addedLayersQueryParamsTileArcgisRest = this.makeLayersByService(layers, contextLayersID, 'tilearcgisrest');
layersUrl = layersUrl.substr(0, layersUrl.length - 1);
const zoomKey = this.route.options.zoomKey;
const centerKey = this.route.options.centerKey;
const contextKey = this.route.options.contextKey;
const zoom = `${zoomKey}=${map.viewController.getZoom()}`;
const arrayCenter = map.viewController.getCenter('EPSG:4326') || [];
const long = arrayCenter[0].toFixed(5).replace(/\.([^0]+)0+$/, '.$1');
const lat = arrayCenter[1].toFixed(5).replace(/\.([^0]+)0+$/, '.$1');
const center = `${centerKey}=${long},${lat}`.replace(/.00000/g, '');
let context = '';
if (this.contextService.context$.value) {
context = `${contextKey}=${this.contextService.context$.value.uri}`;
}
let url = this.language
? `${location.origin}${location.pathname}?${context}&${zoom}&${center}&${layersUrl}&${llc}&${addedLayersQueryParamsWms}&${llc}&${addedLayersQueryParamsWmts}&${addedLayersQueryParamsArcgisRest}&${addedLayersQueryParamsImageArcgisRest}&${addedLayersQueryParamsTileArcgisRest}&lang=${this.language}`
: `${location.origin}${location.pathname}?${context}&${zoom}&${center}&${layersUrl}&${llc}&${addedLayersQueryParamsWms}&${llc}&${addedLayersQueryParamsWmts}&${addedLayersQueryParamsArcgisRest}&${addedLayersQueryParamsImageArcgisRest}&${addedLayersQueryParamsTileArcgisRest}`;
for (let i = 0; i < 5; i++) {
url = url.replace(/&&/g, '&');
url = url.endsWith('&') ? url.slice(0, -1) : url;
}
url = url.endsWith('&') ? url.slice(0, -1) : url;
url = url.replace('?&wm', '&wm');
url = url.replace('?&', '?');
return url;
}
makeLayersByService(layers, contextLayersID, typeService) {
const addedLayersByService = [];
for (const layer of layers.filter((l) => l.dataSource.options?.type === typeService)) {
if (contextLayersID.indexOf(layer.id) === -1) {
let linkUrl = encodeURIComponent(layer.dataSource.options.url);
let addedLayer = '';
let layerVersion;
switch (layer.dataSource.options.type.toLowerCase()) {
case 'wms': {
const datasourceOptions = layer.dataSource
.options;
addedLayer = encodeURIComponent(datasourceOptions.params.LAYERS);
layerVersion =
datasourceOptions.params.VERSION === '1.3.0'
? layerVersion
: datasourceOptions.params.VERSION;
break;
}
case 'wmts':
case 'arcgisrest':
case 'imagearcgisrest':
case 'tilearcgisrest':
addedLayer = encodeURIComponent(layer.dataSource.options.layer);
break;
}
const addedLayerPosition = `${addedLayer}:igoz${layer.zIndex}`;
let version = '';
if (layerVersion) {
const operator = layer.dataSource.options.url.indexOf('?') === -1
? '?'
: '&';
version = encodeURIComponent(`${operator}VERSION=${layerVersion}`);
}
linkUrl = `${linkUrl}${version}`;
if (!addedLayersByService.find((definedUrl) => definedUrl.url === linkUrl)) {
addedLayersByService.push({
url: linkUrl,
layers: [addedLayerPosition]
});
}
else {
addedLayersByService.forEach((service) => {
if (service.url === linkUrl) {
service.layers.push(addedLayerPosition);
}
});
}
}
}
let addedLayersQueryParams = '';
if (addedLayersByService.length >= 1) {
let linkUrlKey;
let layersKey;
/*
const linkUrlKey = (typeService === 'wms') ? this.route.options.wmsUrlKey :
(typeService === 'wmts') ? this.route.options.wmtsUrlKey : '' ;
const layersKey = (typeService === 'wms') ? this.route.options.wmsLayersKey :
(typeService === 'wmts') ? this.route.options.wmtsLayersKey : '' ;
*/
switch (typeService.toLowerCase()) {
case 'wms':
linkUrlKey = this.route.options.wmsUrlKey;
layersKey = this.route.options.wmsLayersKey;
break;
case 'wmts':
linkUrlKey = this.route.options.wmtsUrlKey;
layersKey = this.route.options.wmtsLayersKey;
break;
case 'arcgisrest':
linkUrlKey = this.route.options.arcgisUrlKey;
layersKey = this.route.options.arcgisLayersKey;
break;
case 'imagearcgisrest':
linkUrlKey = this.route.options.iarcgisUrlKey;
layersKey = this.route.options.iarcgisLayersKey;
break;
case 'tilearcgisrest':
linkUrlKey = this.route.options.tarcgisUrlKey;
layersKey = this.route.options.tarcgisLayersKey;
break;
default:
linkUrlKey = '';
layersKey = '';
}
let linkUrlQueryParams = '';
let layersQueryParams = '';
addedLayersByService.forEach((service) => {
linkUrlQueryParams += `${service.url},`;
layersQueryParams += `(${service.layers.join(',')}),`;
});
linkUrlQueryParams = linkUrlQueryParams.endsWith(',')
? linkUrlQueryParams.slice(0, -1)
: linkUrlQueryParams;
layersQueryParams = layersQueryParams.endsWith(',')
? layersQueryParams.slice(0, -1)
: layersQueryParams;
addedLayersQueryParams = `${linkUrlKey}=${linkUrlQueryParams}&${layersKey}=${layersQueryParams}`;
}
return addedLayersQueryParams;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ShareMapService, deps: [{ token: i1.ContextService }, { token: i2.RouteService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ShareMapService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ShareMapService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.ContextService }, { type: i2.RouteService, decorators: [{
type: Optional
}] }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmUtbWFwLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb250ZXh0L3NyYy9saWIvc2hhcmUtbWFwL3NoYXJlZC9zaGFyZS1tYXAuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUF3QixXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFJOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7O0FBSzlFLE1BQU0sT0FBTyxlQUFlO0lBSWhCO0lBQ1k7SUFKZCxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBRXRCLFlBQ1UsY0FBOEIsRUFDbEIsS0FBbUI7UUFEL0IsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQ2xCLFVBQUssR0FBTCxLQUFLLENBQWM7UUFFdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDMUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWEsQ0FBQyxVQUFVO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFFBQVE7WUFDbEIsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsUUFBUSxZQUNwQyxVQUFVLENBQUMsR0FDYixTQUFTLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDMUIsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsUUFB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aUJBQ25COzswQkFNSSxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUm91dGVTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9yb3V0ZSc7XG5pbXBvcnQgeyBXTVNEYXRhU291cmNlT3B0aW9ucywgaXNMYXllckl0ZW0gfSBmcm9tICdAaWdvMi9nZW8nO1xuaW1wb3J0IHR5cGUgeyBJZ29NYXAsIExheWVyIH0gZnJvbSAnQGlnbzIvZ2VvJztcblxuaW1wb3J0IHsgRGV0YWlsZWRDb250ZXh0IH0gZnJvbSAnLi4vLi4vY29udGV4dC1tYW5hZ2VyL3NoYXJlZC9jb250ZXh0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uL2NvbnRleHQtbWFuYWdlci9zaGFyZWQvY29udGV4dC5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU2hhcmVNYXBTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBsYW5ndWFnZSA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29udGV4dFNlcnZpY2U6IENvbnRleHRTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcm91dGU6IFJvdXRlU2VydmljZVxuICApIHtcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XG4gICAgICBpZiAocGFyYW1zWydsYW5nJ10pIHtcbiAgICAgICAgdGhpcy5sYW5ndWFnZSA9IHBhcmFtc1snbGFuZyddO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0VXJsV2l0aEFwaShmb3JtVmFsdWVzKSB7XG4gICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VcbiAgICAgID8gYCR7bG9jYXRpb24ub3JpZ2luICsgbG9jYXRpb24ucGF0aG5hbWV9P2NvbnRleHQ9JHtcbiAgICAgICAgICBmb3JtVmFsdWVzLnVyaVxuICAgICAgICB9Jmxhbmc9JHt0aGlzLmxhbmd1YWdlfWBcbiAgICAgIDogYCR7bG9jYXRpb24ub3JpZ2luICsgbG9jYXRpb24ucGF0aG5hbWV9P2NvbnRleHQ9JHtmb3JtVmFsdWVzLnVyaX1gO1xuICB9XG5cbiAgY3JlYXRlQ29udGV4dFNoYXJlZChtYXA6IElnb01hcCwgZm9ybVZhbHVlcykge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHRTZXJ2aWNlLmdldENvbnRleHRGcm9tTWFwKG1hcCk7XG4gICAgY29udGV4dC5zY29wZSA9ICdwdWJsaWMnO1xuICAgIGNvbnRleHQudGl0bGUgPSBmb3JtVmFsdWVzLnRpdGxlO1xuICAgIGNvbnRleHQudXJpID0gZm9ybVZhbHVlcy51cmk7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dFNlcnZpY2UuY3JlYXRlKGNvbnRleHQpO1xuICB9XG5cbiAgdXBkYXRlQ29udGV4dFNoYXJlZChtYXA6IElnb01hcCwgZm9ybVZhbHVlcywgaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHRTZXJ2aWNlLmdldENvbnRleHRGcm9tTWFwKG1hcCk7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dFNlcnZpY2UudXBkYXRlKGlkLCB7XG4gICAgICB0aXRsZTogZm9ybVZhbHVlcy50aXRsZSxcbiAgICAgIG1hcDogY29udGV4dC5tYXBcbiAgICB9IGFzIERldGFpbGVkQ29udGV4dCk7XG4gIH1cblxuICBnZXRVcmxXaXRob3V0QXBpKG1hcDogSWdvTWFwLCBwdWJsaWNTaGFyZU9wdGlvbikge1xuICAgIGlmIChcbiAgICAgICF0aGlzLnJvdXRlIHx8XG4gICAgICAhdGhpcy5yb3V0ZS5vcHRpb25zLnZpc2libGVPbkxheWVyc0tleSB8fFxuICAgICAgIXRoaXMucm91dGUub3B0aW9ucy52aXNpYmxlT2ZmTGF5ZXJzS2V5IHx8XG4gICAgICAhbWFwLnZpZXdDb250cm9sbGVyLmdldFpvb20oKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsbGMgPSBwdWJsaWNTaGFyZU9wdGlvbi5sYXllcmxpc3RDb250cm9scy5xdWVyeXN0cmluZztcblxuICAgIGxldCB2aXNpYmxlS2V5ID0gdGhpcy5yb3V0ZS5vcHRpb25zLnZpc2libGVPbkxheWVyc0tleTtcbiAgICBsZXQgaW52aXNpYmxlS2V5ID0gdGhpcy5yb3V0ZS5vcHRpb25zLnZpc2libGVPZmZMYXllcnNLZXk7XG4gICAgY29uc3QgbGF5ZXJzID0gbWFwLmxheWVyQ29udHJvbGxlci5hbGwuZmlsdGVyKChsYXllcikgPT5cbiAgICAgIGlzTGF5ZXJJdGVtKGxheWVyKVxuICAgICkgYXMgTGF5ZXJbXTtcblxuICAgIGNvbnN0IHZpc2libGVMYXllcnMgPSBsYXllcnMuZmlsdGVyKFxuICAgICAgKGxheSkgPT4gbGF5LnZpc2libGUgJiYgIWxheS5pc0lnb0ludGVybmFsTGF5ZXJcbiAgICApO1xuICAgIGNvbnN0IGludmlzaWJsZUxheWVycyA9IGxheWVycy5maWx0ZXIoXG4gICAgICAobGF5KSA9PiAhbGF5LnZpc2libGUgJiYgIWxheS5pc0lnb0ludGVybmFsTGF5ZXJcbiAgICApO1xuXG4gICAgaWYgKHZpc2libGVMYXllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB2aXNpYmxlS2V5ID0gJyc7XG4gICAgfVxuICAgIGlmIChpbnZpc2libGVMYXllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpbnZpc2libGVLZXkgPSAnJztcbiAgICB9XG5cbiAgICBsZXQgbGF5ZXJzVXJsID0gJyc7XG4gICAgbGV0IGxheWVyc1RvTG9vcCA9IFtdO1xuICAgIGlmICh2aXNpYmxlTGF5ZXJzLmxlbmd0aCA+IGludmlzaWJsZUxheWVycy5sZW5ndGgpIHtcbiAgICAgIGxheWVyc1VybCA9IGAke3Zpc2libGVLZXl9PSomJHtpbnZpc2libGVLZXl9PWA7XG4gICAgICBsYXllcnNUb0xvb3AgPSBpbnZpc2libGVMYXllcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheWVyc1VybCA9IGAke2ludmlzaWJsZUtleX09KiYke3Zpc2libGVLZXl9PWA7XG4gICAgICBsYXllcnNUb0xvb3AgPSB2aXNpYmxlTGF5ZXJzO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzVG9Mb29wKSB7XG4gICAgICBpZiAobGF5ZXIuaWQpIHtcbiAgICAgICAgbGF5ZXJzVXJsICs9IGxheWVyLmlkICsgJywnO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb250ZXh0TGF5ZXJzSUQgPSBbXTtcbiAgICBjb25zdCBjb250ZXh0TGF5ZXJzID0gdGhpcy5jb250ZXh0U2VydmljZS5jb250ZXh0JC52YWx1ZS5sYXllcnM7XG4gICAgZm9yIChjb25zdCBjb250ZXh0TGF5ZXIgb2YgY29udGV4dExheWVycykge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgY29udGV4dExheWVyLmlkICE9PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICB0eXBlb2YgKGNvbnRleHRMYXllciBhcyBhbnkpLnNvdXJjZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICkge1xuICAgICAgICBjb250ZXh0TGF5ZXJzSUQucHVzaChcbiAgICAgICAgICBjb250ZXh0TGF5ZXIuaWQgfHwgKGNvbnRleHRMYXllciBhcyBhbnkpLnNvdXJjZS5pZFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFkZGVkTGF5ZXJzUXVlcnlQYXJhbXNXbXMgPSB0aGlzLm1ha2VMYXllcnNCeVNlcnZpY2UoXG4gICAgICBsYXllcnMsXG4gICAgICBjb250ZXh0TGF5ZXJzSUQsXG4gICAgICAnd21zJ1xuICAgICk7XG4gICAgY29uc3QgYWRkZWRMYXllcnNRdWVyeVBhcmFtc1dtdHMgPSB0aGlzLm1ha2VMYXllcnNCeVNlcnZpY2UoXG4gICAgICBsYXllcnMsXG4gICAgICBjb250ZXh0TGF5ZXJzSUQsXG4gICAgICAnd210cydcbiAgICApO1xuICAgIGNvbnN0IGFkZGVkTGF5ZXJzUXVlcnlQYXJhbXNBcmNnaXNSZXN0ID0gdGhpcy5tYWtlTGF5ZXJzQnlTZXJ2aWNlKFxuICAgICAgbGF5ZXJzLFxuICAgICAgY29udGV4dExheWVyc0lELFxuICAgICAgJ2FyY2dpc3Jlc3QnXG4gICAgKTtcbiAgICBjb25zdCBhZGRlZExheWVyc1F1ZXJ5UGFyYW1zSW1hZ2VBcmNnaXNSZXN0ID0gdGhpcy5tYWtlTGF5ZXJzQnlTZXJ2aWNlKFxuICAgICAgbGF5ZXJzLFxuICAgICAgY29udGV4dExheWVyc0lELFxuICAgICAgJ2ltYWdlYXJjZ2lzcmVzdCdcbiAgICApO1xuICAgIGNvbnN0IGFkZGVkTGF5ZXJzUXVlcnlQYXJhbXNUaWxlQXJjZ2lzUmVzdCA9IHRoaXMubWFrZUxheWVyc0J5U2VydmljZShcbiAgICAgIGxheWVycyxcbiAgICAgIGNvbnRleHRMYXllcnNJRCxcbiAgICAgICd0aWxlYXJjZ2lzcmVzdCdcbiAgICApO1xuXG4gICAgbGF5ZXJzVXJsID0gbGF5ZXJzVXJsLnN1YnN0cigwLCBsYXllcnNVcmwubGVuZ3RoIC0gMSk7XG5cbiAgICBjb25zdCB6b29tS2V5ID0gdGhpcy5yb3V0ZS5vcHRpb25zLnpvb21LZXk7XG4gICAgY29uc3QgY2VudGVyS2V5ID0gdGhpcy5yb3V0ZS5vcHRpb25zLmNlbnRlcktleTtcbiAgICBjb25zdCBjb250ZXh0S2V5ID0gdGhpcy5yb3V0ZS5vcHRpb25zLmNvbnRleHRLZXk7XG5cbiAgICBjb25zdCB6b29tID0gYCR7em9vbUtleX09JHttYXAudmlld0NvbnRyb2xsZXIuZ2V0Wm9vbSgpfWA7XG4gICAgY29uc3QgYXJyYXlDZW50ZXIgPSBtYXAudmlld0NvbnRyb2xsZXIuZ2V0Q2VudGVyKCdFUFNHOjQzMjYnKSB8fCBbXTtcbiAgICBjb25zdCBsb25nID0gYXJyYXlDZW50ZXJbMF0udG9GaXhlZCg1KS5yZXBsYWNlKC9cXC4oW14wXSspMCskLywgJy4kMScpO1xuICAgIGNvbnN0IGxhdCA9IGFycmF5Q2VudGVyWzFdLnRvRml4ZWQoNSkucmVwbGFjZSgvXFwuKFteMF0rKTArJC8sICcuJDEnKTtcbiAgICBjb25zdCBjZW50ZXIgPSBgJHtjZW50ZXJLZXl9PSR7bG9uZ30sJHtsYXR9YC5yZXBsYWNlKC8uMDAwMDAvZywgJycpO1xuICAgIGxldCBjb250ZXh0ID0gJyc7XG4gICAgaWYgKHRoaXMuY29udGV4dFNlcnZpY2UuY29udGV4dCQudmFsdWUpIHtcbiAgICAgIGNvbnRleHQgPSBgJHtjb250ZXh0S2V5fT0ke3RoaXMuY29udGV4dFNlcnZpY2UuY29udGV4dCQudmFsdWUudXJpfWA7XG4gICAgfVxuXG4gICAgbGV0IHVybCA9IHRoaXMubGFuZ3VhZ2VcbiAgICAgID8gYCR7bG9jYXRpb24ub3JpZ2lufSR7bG9jYXRpb24ucGF0aG5hbWV9PyR7Y29udGV4dH0mJHt6b29tfSYke2NlbnRlcn0mJHtsYXllcnNVcmx9JiR7bGxjfSYke2FkZGVkTGF5ZXJzUXVlcnlQYXJhbXNXbXN9JiR7bGxjfSYke2FkZGVkTGF5ZXJzUXVlcnlQYXJhbXNXbXRzfSYke2FkZGVkTGF5ZXJzUXVlcnlQYXJhbXNBcmNnaXNSZXN0fSYke2FkZGVkTGF5ZXJzUXVlcnlQYXJhbXNJbWFnZUFyY2dpc1Jlc3R9JiR7YWRkZWRMYXllcnNRdWVyeVBhcmFtc1RpbGVBcmNnaXNSZXN0fSZsYW5nPSR7dGhpcy5sYW5ndWFnZX1gXG4gICAgICA6IGAke2xvY2F0aW9uLm9yaWdpbn0ke2xvY2F0aW9uLnBhdGhuYW1lfT8ke2NvbnRleHR9JiR7em9vbX0mJHtjZW50ZXJ9JiR7bGF5ZXJzVXJsfSYke2xsY30mJHthZGRlZExheWVyc1F1ZXJ5UGFyYW1zV21zfSYke2xsY30mJHthZGRlZExheWVyc1F1ZXJ5UGFyYW1zV210c30mJHthZGRlZExheWVyc1F1ZXJ5UGFyYW1zQXJjZ2lzUmVzdH0mJHthZGRlZExheWVyc1F1ZXJ5UGFyYW1zSW1hZ2VBcmNnaXNSZXN0fSYke2FkZGVkTGF5ZXJzUXVlcnlQYXJhbXNUaWxlQXJjZ2lzUmVzdH1gO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gICAgICB1cmwgPSB1cmwucmVwbGFjZSgvJiYvZywgJyYnKTtcbiAgICAgIHVybCA9IHVybC5lbmRzV2l0aCgnJicpID8gdXJsLnNsaWNlKDAsIC0xKSA6IHVybDtcbiAgICB9XG4gICAgdXJsID0gdXJsLmVuZHNXaXRoKCcmJykgPyB1cmwuc2xpY2UoMCwgLTEpIDogdXJsO1xuICAgIHVybCA9IHVybC5yZXBsYWNlKCc/JndtJywgJyZ3bScpO1xuICAgIHVybCA9IHVybC5yZXBsYWNlKCc/JicsICc/Jyk7XG5cbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgcHJpdmF0ZSBtYWtlTGF5ZXJzQnlTZXJ2aWNlKFxuICAgIGxheWVyczogTGF5ZXJbXSxcbiAgICBjb250ZXh0TGF5ZXJzSUQ6IGFueVtdLFxuICAgIHR5cGVTZXJ2aWNlOiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBhZGRlZExheWVyc0J5U2VydmljZSA9IFtdO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzLmZpbHRlcihcbiAgICAgIChsKSA9PiBsLmRhdGFTb3VyY2Uub3B0aW9ucz8udHlwZSA9PT0gdHlwZVNlcnZpY2VcbiAgICApKSB7XG4gICAgICBpZiAoY29udGV4dExheWVyc0lELmluZGV4T2YobGF5ZXIuaWQpID09PSAtMSkge1xuICAgICAgICBsZXQgbGlua1VybCA9IGVuY29kZVVSSUNvbXBvbmVudCgobGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zIGFzIGFueSkudXJsKTtcbiAgICAgICAgbGV0IGFkZGVkTGF5ZXIgPSAnJztcbiAgICAgICAgbGV0IGxheWVyVmVyc2lvbjogc3RyaW5nO1xuICAgICAgICBzd2l0Y2ggKGxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucy50eXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjYXNlICd3bXMnOiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhc291cmNlT3B0aW9ucyA9IGxheWVyLmRhdGFTb3VyY2VcbiAgICAgICAgICAgICAgLm9wdGlvbnMgYXMgV01TRGF0YVNvdXJjZU9wdGlvbnM7XG4gICAgICAgICAgICBhZGRlZExheWVyID0gZW5jb2RlVVJJQ29tcG9uZW50KGRhdGFzb3VyY2VPcHRpb25zLnBhcmFtcy5MQVlFUlMpO1xuICAgICAgICAgICAgbGF5ZXJWZXJzaW9uID1cbiAgICAgICAgICAgICAgZGF0YXNvdXJjZU9wdGlvbnMucGFyYW1zLlZFUlNJT04gPT09ICcxLjMuMCdcbiAgICAgICAgICAgICAgICA/IGxheWVyVmVyc2lvblxuICAgICAgICAgICAgICAgIDogZGF0YXNvdXJjZU9wdGlvbnMucGFyYW1zLlZFUlNJT047XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnd210cyc6XG4gICAgICAgICAgY2FzZSAnYXJjZ2lzcmVzdCc6XG4gICAgICAgICAgY2FzZSAnaW1hZ2VhcmNnaXNyZXN0JzpcbiAgICAgICAgICBjYXNlICd0aWxlYXJjZ2lzcmVzdCc6XG4gICAgICAgICAgICBhZGRlZExheWVyID0gZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgICAgICAgICAobGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zIGFzIGFueSkubGF5ZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhZGRlZExheWVyUG9zaXRpb24gPSBgJHthZGRlZExheWVyfTppZ296JHtsYXllci56SW5kZXh9YDtcblxuICAgICAgICBsZXQgdmVyc2lvbiA9ICcnO1xuICAgICAgICBpZiAobGF5ZXJWZXJzaW9uKSB7XG4gICAgICAgICAgY29uc3Qgb3BlcmF0b3IgPVxuICAgICAgICAgICAgKGxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucyBhcyBhbnkpLnVybC5pbmRleE9mKCc/JykgPT09IC0xXG4gICAgICAgICAgICAgID8gJz8nXG4gICAgICAgICAgICAgIDogJyYnO1xuICAgICAgICAgIHZlcnNpb24gPSBlbmNvZGVVUklDb21wb25lbnQoYCR7b3BlcmF0b3J9VkVSU0lPTj0ke2xheWVyVmVyc2lvbn1gKTtcbiAgICAgICAgfVxuICAgICAgICBsaW5rVXJsID0gYCR7bGlua1VybH0ke3ZlcnNpb259YDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgIWFkZGVkTGF5ZXJzQnlTZXJ2aWNlLmZpbmQoKGRlZmluZWRVcmwpID0+IGRlZmluZWRVcmwudXJsID09PSBsaW5rVXJsKVxuICAgICAgICApIHtcbiAgICAgICAgICBhZGRlZExheWVyc0J5U2VydmljZS5wdXNoKHtcbiAgICAgICAgICAgIHVybDogbGlua1VybCxcbiAgICAgICAgICAgIGxheWVyczogW2FkZGVkTGF5ZXJQb3NpdGlvbl1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRlZExheWVyc0J5U2VydmljZS5mb3JFYWNoKChzZXJ2aWNlKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2VydmljZS51cmwgPT09IGxpbmtVcmwpIHtcbiAgICAgICAgICAgICAgc2VydmljZS5sYXllcnMucHVzaChhZGRlZExheWVyUG9zaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGFkZGVkTGF5ZXJzUXVlcnlQYXJhbXMgPSAnJztcbiAgICBpZiAoYWRkZWRMYXllcnNCeVNlcnZpY2UubGVuZ3RoID49IDEpIHtcbiAgICAgIGxldCBsaW5rVXJsS2V5O1xuICAgICAgbGV0IGxheWVyc0tleTtcbiAgICAgIC8qXG4gICAgICBjb25zdCBsaW5rVXJsS2V5ID0gKHR5cGVTZXJ2aWNlID09PSAnd21zJykgPyB0aGlzLnJvdXRlLm9wdGlvbnMud21zVXJsS2V5IDpcbiAgICAgICAgKHR5cGVTZXJ2aWNlID09PSAnd210cycpID8gdGhpcy5yb3V0ZS5vcHRpb25zLndtdHNVcmxLZXkgOiAnJyA7XG4gICAgICBjb25zdCBsYXllcnNLZXkgPSAodHlwZVNlcnZpY2UgPT09ICd3bXMnKSA/IHRoaXMucm91dGUub3B0aW9ucy53bXNMYXllcnNLZXkgOlxuICAgICAgICAodHlwZVNlcnZpY2UgPT09ICd3bXRzJykgPyB0aGlzLnJvdXRlLm9wdGlvbnMud210c0xheWVyc0tleSA6ICcnIDtcbiovXG4gICAgICBzd2l0Y2ggKHR5cGVTZXJ2aWNlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgY2FzZSAnd21zJzpcbiAgICAgICAgICBsaW5rVXJsS2V5ID0gdGhpcy5yb3V0ZS5vcHRpb25zLndtc1VybEtleTtcbiAgICAgICAgICBsYXllcnNLZXkgPSB0aGlzLnJvdXRlLm9wdGlvbnMud21zTGF5ZXJzS2V5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd3bXRzJzpcbiAgICAgICAgICBsaW5rVXJsS2V5ID0gdGhpcy5yb3V0ZS5vcHRpb25zLndtdHNVcmxLZXk7XG4gICAgICAgICAgbGF5ZXJzS2V5ID0gdGhpcy5yb3V0ZS5vcHRpb25zLndtdHNMYXllcnNLZXk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2FyY2dpc3Jlc3QnOlxuICAgICAgICAgIGxpbmtVcmxLZXkgPSB0aGlzLnJvdXRlLm9wdGlvbnMuYXJjZ2lzVXJsS2V5O1xuICAgICAgICAgIGxheWVyc0tleSA9IHRoaXMucm91dGUub3B0aW9ucy5hcmNnaXNMYXllcnNLZXk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2ltYWdlYXJjZ2lzcmVzdCc6XG4gICAgICAgICAgbGlua1VybEtleSA9IHRoaXMucm91dGUub3B0aW9ucy5pYXJjZ2lzVXJsS2V5O1xuICAgICAgICAgIGxheWVyc0tleSA9IHRoaXMucm91dGUub3B0aW9ucy5pYXJjZ2lzTGF5ZXJzS2V5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0aWxlYXJjZ2lzcmVzdCc6XG4gICAgICAgICAgbGlua1VybEtleSA9IHRoaXMucm91dGUub3B0aW9ucy50YXJjZ2lzVXJsS2V5O1xuICAgICAgICAgIGxheWVyc0tleSA9IHRoaXMucm91dGUub3B0aW9ucy50YXJjZ2lzTGF5ZXJzS2V5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGxpbmtVcmxLZXkgPSAnJztcbiAgICAgICAgICBsYXllcnNLZXkgPSAnJztcbiAgICAgIH1cblxuICAgICAgbGV0IGxpbmtVcmxRdWVyeVBhcmFtcyA9ICcnO1xuICAgICAgbGV0IGxheWVyc1F1ZXJ5UGFyYW1zID0gJyc7XG4gICAgICBhZGRlZExheWVyc0J5U2VydmljZS5mb3JFYWNoKChzZXJ2aWNlKSA9PiB7XG4gICAgICAgIGxpbmtVcmxRdWVyeVBhcmFtcyArPSBgJHtzZXJ2aWNlLnVybH0sYDtcbiAgICAgICAgbGF5ZXJzUXVlcnlQYXJhbXMgKz0gYCgke3NlcnZpY2UubGF5ZXJzLmpvaW4oJywnKX0pLGA7XG4gICAgICB9KTtcbiAgICAgIGxpbmtVcmxRdWVyeVBhcmFtcyA9IGxpbmtVcmxRdWVyeVBhcmFtcy5lbmRzV2l0aCgnLCcpXG4gICAgICAgID8gbGlua1VybFF1ZXJ5UGFyYW1zLnNsaWNlKDAsIC0xKVxuICAgICAgICA6IGxpbmtVcmxRdWVyeVBhcmFtcztcbiAgICAgIGxheWVyc1F1ZXJ5UGFyYW1zID0gbGF5ZXJzUXVlcnlQYXJhbXMuZW5kc1dpdGgoJywnKVxuICAgICAgICA/IGxheWVyc1F1ZXJ5UGFyYW1zLnNsaWNlKDAsIC0xKVxuICAgICAgICA6IGxheWVyc1F1ZXJ5UGFyYW1zO1xuICAgICAgYWRkZWRMYXllcnNRdWVyeVBhcmFtcyA9IGAke2xpbmtVcmxLZXl9PSR7bGlua1VybFF1ZXJ5UGFyYW1zfSYke2xheWVyc0tleX09JHtsYXllcnNRdWVyeVBhcmFtc31gO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRlZExheWVyc1F1ZXJ5UGFyYW1zO1xuICB9XG59XG4iXX0=