UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

153 lines (149 loc) 22.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getEditorLayer = getEditorLayer; var _editableLayers = require("@deck.gl-community/editable-layers"); var _extensions = require("@deck.gl/extensions"); var _constants = require("@kepler.gl/constants"); var _commonUtils = require("@kepler.gl/common-utils"); var _constants2 = require("./constants"); var _featureStyles = require("./feature-styles"); var _modifyModeExtended = require("./modify-mode-extended"); var _editorLayerUtils = require("./editor-layer-utils"); // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project var DEFAULT_COMPOSITE_MODE = new _editableLayers.CompositeMode([new _editableLayers.TranslateMode(), new _modifyModeExtended.ModifyModeExtended()]); /** * Returns editable layer to edit polygon filters. * @param params * @param params.editorMenuActive Indicates whether the editor side menu is active. * @param params.editor * @param params.onSetFeatures A callback to set features. * @param params.setSelectedFeature A callback to set selected feature and selection context. * @param params.viewport Current viewport. * @param params.featureCollection Feature collection with an array of features * @param params.selectedFeatureIndexes An array with index of currently selected feature. */ function getEditorLayer(_ref) { var editorMenuActive = _ref.editorMenuActive, editor = _ref.editor, onSetFeatures = _ref.onSetFeatures, setSelectedFeature = _ref.setSelectedFeature, featureCollection = _ref.featureCollection, selectedFeatureIndexes = _ref.selectedFeatureIndexes, viewport = _ref.viewport; var editorMode = editor.mode; var mode = DEFAULT_COMPOSITE_MODE; if (editorMenuActive) { // @ts-ignore if (editorMode === _constants.EDITOR_MODES.DRAW_POLYGON) mode = _editableLayers.DrawPolygonMode; // @ts-ignore else if (editorMode === _constants.EDITOR_MODES.DRAW_RECTANGLE) mode = _editableLayers.DrawRectangleMode; } // @ts-ignore return new _editableLayers.EditableGeoJsonLayer({ id: _constants.EDITOR_LAYER_ID, mode: mode, // @ts-ignore data: featureCollection, selectedFeatureIndexes: selectedFeatureIndexes, visible: editor.visible, pickable: true, pickingRadius: _constants.EDITOR_LAYER_PICKING_RADIUS, modeConfig: { viewport: viewport, screenSpace: true, lockRectangles: true }, pickingLineWidthExtraPixels: 5, // Only show fill when polygons are selected, // there is no way atm to enable fill for only one feature filled: selectedFeatureIndexes.length > 0, onEdit: function onEdit(_ref2) { var updatedData = _ref2.updatedData, editType = _ref2.editType; switch (editType) { case _constants2.EDIT_TYPES.ADD_FEATURE: { var _features = updatedData.features; if (_features.length) { var lastFeature = _features[_features.length - 1]; if (lastFeature.properties) lastFeature.properties.isClosed = true; lastFeature.id = (0, _commonUtils.generateHashId)(6); onSetFeatures(updatedData.features); setSelectedFeature(lastFeature); } break; } case _constants2.EDIT_TYPES.ADD_POSITION: case _constants2.EDIT_TYPES.MOVE_POSITION: case _constants2.EDIT_TYPES.TRANSLATING: onSetFeatures(updatedData.features); break; default: break; } }, // prevent self-highlights with tentative features autoHighlight: !(0, _editorLayerUtils.isDrawingActive)(editorMenuActive, editorMode), // @ts-ignore highlightColor: function highlightColor(info) { // Note: lines are reported as parent polygon var object = info.object; if (object) { var _editor$selectedFeatu; if (object.id === ((_editor$selectedFeatu = editor.selectedFeature) === null || _editor$selectedFeatu === void 0 ? void 0 : _editor$selectedFeatu.id)) { return _featureStyles.FEATURE_STYLE.highlightMultiplierNone; } var type = object.properties.editHandleType; if (type === 'intermediate') return _featureStyles.EDIT_HANDLE_STYLE.highlightMultiplierNone;else if (type === 'existing') return _featureStyles.EDIT_HANDLE_STYLE.highlightMultiplier; } // Note: highlight color affects even transparent filled polygons return selectedFeatureIndexes.length ? _featureStyles.FEATURE_STYLE.highlightMultiplier : _featureStyles.LINE_STYLE.highlightMultiplier; }, extensions: [new _extensions.PathStyleExtension({ dash: true })], dashGapPickable: true, getDashArray: function getDashArray(feature) { var _feature$properties, _editor$selectedFeatu2; if ((feature === null || feature === void 0 || (_feature$properties = feature.properties) === null || _feature$properties === void 0 ? void 0 : _feature$properties.guideType) === 'tentative') { return _featureStyles.LINE_STYLE.dashArray; } if ((feature === null || feature === void 0 ? void 0 : feature.id) === ((_editor$selectedFeatu2 = editor.selectedFeature) === null || _editor$selectedFeatu2 === void 0 ? void 0 : _editor$selectedFeatu2.id)) return _featureStyles.LINE_STYLE.solidArray; return _featureStyles.LINE_STYLE.dashArray; }, getLineColor: _featureStyles.LINE_STYLE.getColor, getFillColor: _featureStyles.FEATURE_STYLE.getColor, getRadius: _featureStyles.EDIT_HANDLE_STYLE.getRadius, // @ts-ignore getLineWidth: _featureStyles.LINE_STYLE.getWidth, getEditHandlePointRadius: _featureStyles.EDIT_HANDLE_STYLE.getRadius, getEditHandlePointColor: _featureStyles.EDIT_HANDLE_STYLE.getFillColor, getEditHandlePointOutlineColor: _featureStyles.EDIT_HANDLE_STYLE.getOutlineColor, getTentativeLineColor: _featureStyles.LINE_STYLE.getTentativeLineColor, // @ts-ignore getTentativeLineWidth: _featureStyles.LINE_STYLE.getTentativeLineWidth, getTentativeFillColor: _featureStyles.LINE_STYLE.getTentativeFillColor, parameters: {}, shadowEnabled: false, _subLayerProps: { geojson: { shadowEnabled: false }, guides: { shadowEnabled: false }, tooltips: { shadowEnabled: false, _subLayerProps: { characters: { shadowEnabled: false } } } } }); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZWRpdGFibGVMYXllcnMiLCJyZXF1aXJlIiwiX2V4dGVuc2lvbnMiLCJfY29uc3RhbnRzIiwiX2NvbW1vblV0aWxzIiwiX2NvbnN0YW50czIiLCJfZmVhdHVyZVN0eWxlcyIsIl9tb2RpZnlNb2RlRXh0ZW5kZWQiLCJfZWRpdG9yTGF5ZXJVdGlscyIsIkRFRkFVTFRfQ09NUE9TSVRFX01PREUiLCJDb21wb3NpdGVNb2RlIiwiVHJhbnNsYXRlTW9kZSIsIk1vZGlmeU1vZGVFeHRlbmRlZCIsImdldEVkaXRvckxheWVyIiwiX3JlZiIsImVkaXRvck1lbnVBY3RpdmUiLCJlZGl0b3IiLCJvblNldEZlYXR1cmVzIiwic2V0U2VsZWN0ZWRGZWF0dXJlIiwiZmVhdHVyZUNvbGxlY3Rpb24iLCJzZWxlY3RlZEZlYXR1cmVJbmRleGVzIiwidmlld3BvcnQiLCJlZGl0b3JNb2RlIiwibW9kZSIsIkVESVRPUl9NT0RFUyIsIkRSQVdfUE9MWUdPTiIsIkRyYXdQb2x5Z29uTW9kZSIsIkRSQVdfUkVDVEFOR0xFIiwiRHJhd1JlY3RhbmdsZU1vZGUiLCJFZGl0YWJsZUdlb0pzb25MYXllciIsImlkIiwiRURJVE9SX0xBWUVSX0lEIiwiZGF0YSIsInZpc2libGUiLCJwaWNrYWJsZSIsInBpY2tpbmdSYWRpdXMiLCJFRElUT1JfTEFZRVJfUElDS0lOR19SQURJVVMiLCJtb2RlQ29uZmlnIiwic2NyZWVuU3BhY2UiLCJsb2NrUmVjdGFuZ2xlcyIsInBpY2tpbmdMaW5lV2lkdGhFeHRyYVBpeGVscyIsImZpbGxlZCIsImxlbmd0aCIsIm9uRWRpdCIsIl9yZWYyIiwidXBkYXRlZERhdGEiLCJlZGl0VHlwZSIsIkVESVRfVFlQRVMiLCJBRERfRkVBVFVSRSIsIl9mZWF0dXJlcyIsImZlYXR1cmVzIiwibGFzdEZlYXR1cmUiLCJwcm9wZXJ0aWVzIiwiaXNDbG9zZWQiLCJnZW5lcmF0ZUhhc2hJZCIsIkFERF9QT1NJVElPTiIsIk1PVkVfUE9TSVRJT04iLCJUUkFOU0xBVElORyIsImF1dG9IaWdobGlnaHQiLCJpc0RyYXdpbmdBY3RpdmUiLCJoaWdobGlnaHRDb2xvciIsImluZm8iLCJvYmplY3QiLCJfZWRpdG9yJHNlbGVjdGVkRmVhdHUiLCJzZWxlY3RlZEZlYXR1cmUiLCJGRUFUVVJFX1NUWUxFIiwiaGlnaGxpZ2h0TXVsdGlwbGllck5vbmUiLCJ0eXBlIiwiZWRpdEhhbmRsZVR5cGUiLCJFRElUX0hBTkRMRV9TVFlMRSIsImhpZ2hsaWdodE11bHRpcGxpZXIiLCJMSU5FX1NUWUxFIiwiZXh0ZW5zaW9ucyIsIlBhdGhTdHlsZUV4dGVuc2lvbiIsImRhc2giLCJkYXNoR2FwUGlja2FibGUiLCJnZXREYXNoQXJyYXkiLCJmZWF0dXJlIiwiX2ZlYXR1cmUkcHJvcGVydGllcyIsIl9lZGl0b3Ikc2VsZWN0ZWRGZWF0dTIiLCJndWlkZVR5cGUiLCJkYXNoQXJyYXkiLCJzb2xpZEFycmF5IiwiZ2V0TGluZUNvbG9yIiwiZ2V0Q29sb3IiLCJnZXRGaWxsQ29sb3IiLCJnZXRSYWRpdXMiLCJnZXRMaW5lV2lkdGgiLCJnZXRXaWR0aCIsImdldEVkaXRIYW5kbGVQb2ludFJhZGl1cyIsImdldEVkaXRIYW5kbGVQb2ludENvbG9yIiwiZ2V0RWRpdEhhbmRsZVBvaW50T3V0bGluZUNvbG9yIiwiZ2V0T3V0bGluZUNvbG9yIiwiZ2V0VGVudGF0aXZlTGluZUNvbG9yIiwiZ2V0VGVudGF0aXZlTGluZVdpZHRoIiwiZ2V0VGVudGF0aXZlRmlsbENvbG9yIiwicGFyYW1ldGVycyIsInNoYWRvd0VuYWJsZWQiLCJfc3ViTGF5ZXJQcm9wcyIsImdlb2pzb24iLCJndWlkZXMiLCJ0b29sdGlwcyIsImNoYXJhY3RlcnMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZWRpdG9yLWxheWVyL2VkaXRvci1sYXllci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge0VkaXRhYmxlR2VvSnNvbkxheWVyfSBmcm9tICdAZGVjay5nbC1jb21tdW5pdHkvZWRpdGFibGUtbGF5ZXJzJztcbmltcG9ydCB7TGF5ZXIgYXMgRGVja0xheWVyLCBMYXllclByb3BzIGFzIERlY2tMYXllclByb3BzfSBmcm9tICdAZGVjay5nbC9jb3JlJztcbmltcG9ydCB7XG4gIERyYXdQb2x5Z29uTW9kZSxcbiAgVHJhbnNsYXRlTW9kZSxcbiAgQ29tcG9zaXRlTW9kZSxcbiAgRHJhd1JlY3RhbmdsZU1vZGUsXG4gIEdlb0pzb25FZGl0TW9kZVxufSBmcm9tICdAZGVjay5nbC1jb21tdW5pdHkvZWRpdGFibGUtbGF5ZXJzJztcbmltcG9ydCB7UGF0aFN0eWxlRXh0ZW5zaW9ufSBmcm9tICdAZGVjay5nbC9leHRlbnNpb25zJztcblxuaW1wb3J0IHtFRElUT1JfTEFZRVJfSUQsIEVESVRPUl9NT0RFUywgRURJVE9SX0xBWUVSX1BJQ0tJTkdfUkFESVVTfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge1ZpZXdwb3J0LCBFZGl0b3IsIEZlYXR1cmUsIEZlYXR1cmVTZWxlY3Rpb25Db250ZXh0fSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7Z2VuZXJhdGVIYXNoSWR9IGZyb20gJ0BrZXBsZXIuZ2wvY29tbW9uLXV0aWxzJztcblxuaW1wb3J0IHtFRElUX1RZUEVTfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge0xJTkVfU1RZTEUsIEZFQVRVUkVfU1RZTEUsIEVESVRfSEFORExFX1NUWUxFfSBmcm9tICcuL2ZlYXR1cmUtc3R5bGVzJztcbmltcG9ydCB7TW9kaWZ5TW9kZUV4dGVuZGVkfSBmcm9tICcuL21vZGlmeS1tb2RlLWV4dGVuZGVkJztcbmltcG9ydCB7aXNEcmF3aW5nQWN0aXZlfSBmcm9tICcuL2VkaXRvci1sYXllci11dGlscyc7XG5cbmNvbnN0IERFRkFVTFRfQ09NUE9TSVRFX01PREUgPSBuZXcgQ29tcG9zaXRlTW9kZShbXG4gIG5ldyBUcmFuc2xhdGVNb2RlKCkgYXMgdW5rbm93biBhcyBHZW9Kc29uRWRpdE1vZGUsXG4gIG5ldyBNb2RpZnlNb2RlRXh0ZW5kZWQoKSBhcyB1bmtub3duIGFzIEdlb0pzb25FZGl0TW9kZVxuXSk7XG5cbmV4cG9ydCB0eXBlIEdldEVkaXRvckxheWVyUHJvcHMgPSB7XG4gIGVkaXRvck1lbnVBY3RpdmU6IGJvb2xlYW47XG4gIGVkaXRvcjogRWRpdG9yO1xuICBvblNldEZlYXR1cmVzOiAoZmVhdHVyZXM6IEZlYXR1cmVbXSkgPT4gYW55O1xuICBzZXRTZWxlY3RlZEZlYXR1cmU6IChmZWF0dXJlOiBGZWF0dXJlIHwgbnVsbCwgc2VsZWN0aW9uQ29udGV4dD86IEZlYXR1cmVTZWxlY3Rpb25Db250ZXh0KSA9PiBhbnk7XG4gIHZpZXdwb3J0OiBWaWV3cG9ydDtcbiAgZmVhdHVyZUNvbGxlY3Rpb246IHtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgZmVhdHVyZXM6IEZlYXR1cmVbXTtcbiAgfTtcbiAgc2VsZWN0ZWRGZWF0dXJlSW5kZXhlczogbnVtYmVyW107XG59O1xuXG4vKipcbiAqIFJldHVybnMgZWRpdGFibGUgbGF5ZXIgdG8gZWRpdCBwb2x5Z29uIGZpbHRlcnMuXG4gKiBAcGFyYW0gcGFyYW1zXG4gKiBAcGFyYW0gcGFyYW1zLmVkaXRvck1lbnVBY3RpdmUgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVkaXRvciBzaWRlIG1lbnUgaXMgYWN0aXZlLlxuICogQHBhcmFtIHBhcmFtcy5lZGl0b3JcbiAqIEBwYXJhbSBwYXJhbXMub25TZXRGZWF0dXJlcyBBIGNhbGxiYWNrIHRvIHNldCBmZWF0dXJlcy5cbiAqIEBwYXJhbSBwYXJhbXMuc2V0U2VsZWN0ZWRGZWF0dXJlIEEgY2FsbGJhY2sgdG8gc2V0IHNlbGVjdGVkIGZlYXR1cmUgYW5kIHNlbGVjdGlvbiBjb250ZXh0LlxuICogQHBhcmFtIHBhcmFtcy52aWV3cG9ydCBDdXJyZW50IHZpZXdwb3J0LlxuICogQHBhcmFtIHBhcmFtcy5mZWF0dXJlQ29sbGVjdGlvbiBGZWF0dXJlIGNvbGxlY3Rpb24gd2l0aCBhbiBhcnJheSBvZiBmZWF0dXJlc1xuICogQHBhcmFtIHBhcmFtcy5zZWxlY3RlZEZlYXR1cmVJbmRleGVzIEFuIGFycmF5IHdpdGggaW5kZXggb2YgY3VycmVudGx5IHNlbGVjdGVkIGZlYXR1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZGl0b3JMYXllcih7XG4gIGVkaXRvck1lbnVBY3RpdmUsXG4gIGVkaXRvcixcbiAgb25TZXRGZWF0dXJlcyxcbiAgc2V0U2VsZWN0ZWRGZWF0dXJlLFxuICBmZWF0dXJlQ29sbGVjdGlvbixcbiAgc2VsZWN0ZWRGZWF0dXJlSW5kZXhlcyxcbiAgdmlld3BvcnRcbn06IEdldEVkaXRvckxheWVyUHJvcHMpOiBEZWNrTGF5ZXI8RGVja0xheWVyUHJvcHM+IHtcbiAgY29uc3Qge21vZGU6IGVkaXRvck1vZGV9ID0gZWRpdG9yO1xuXG4gIGxldCBtb2RlID0gREVGQVVMVF9DT01QT1NJVEVfTU9ERTtcbiAgaWYgKGVkaXRvck1lbnVBY3RpdmUpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKGVkaXRvck1vZGUgPT09IEVESVRPUl9NT0RFUy5EUkFXX1BPTFlHT04pIG1vZGUgPSBEcmF3UG9seWdvbk1vZGU7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGVsc2UgaWYgKGVkaXRvck1vZGUgPT09IEVESVRPUl9NT0RFUy5EUkFXX1JFQ1RBTkdMRSkgbW9kZSA9IERyYXdSZWN0YW5nbGVNb2RlO1xuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gbmV3IEVkaXRhYmxlR2VvSnNvbkxheWVyKHtcbiAgICBpZDogRURJVE9SX0xBWUVSX0lELFxuICAgIG1vZGUsXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGRhdGE6IGZlYXR1cmVDb2xsZWN0aW9uLFxuICAgIHNlbGVjdGVkRmVhdHVyZUluZGV4ZXMsXG4gICAgdmlzaWJsZTogZWRpdG9yLnZpc2libGUsXG4gICAgcGlja2FibGU6IHRydWUsXG4gICAgcGlja2luZ1JhZGl1czogRURJVE9SX0xBWUVSX1BJQ0tJTkdfUkFESVVTLFxuICAgIG1vZGVDb25maWc6IHtcbiAgICAgIHZpZXdwb3J0LFxuICAgICAgc2NyZWVuU3BhY2U6IHRydWUsXG4gICAgICBsb2NrUmVjdGFuZ2xlczogdHJ1ZVxuICAgIH0sXG5cbiAgICBwaWNraW5nTGluZVdpZHRoRXh0cmFQaXhlbHM6IDUsXG5cbiAgICAvLyBPbmx5IHNob3cgZmlsbCB3aGVuIHBvbHlnb25zIGFyZSBzZWxlY3RlZCxcbiAgICAvLyB0aGVyZSBpcyBubyB3YXkgYXRtIHRvIGVuYWJsZSBmaWxsIGZvciBvbmx5IG9uZSBmZWF0dXJlXG4gICAgZmlsbGVkOiBzZWxlY3RlZEZlYXR1cmVJbmRleGVzLmxlbmd0aCA+IDAsXG5cbiAgICBvbkVkaXQ6ICh7dXBkYXRlZERhdGEsIGVkaXRUeXBlfSkgPT4ge1xuICAgICAgc3dpdGNoIChlZGl0VHlwZSkge1xuICAgICAgICBjYXNlIEVESVRfVFlQRVMuQUREX0ZFQVRVUkU6IHtcbiAgICAgICAgICBjb25zdCB7ZmVhdHVyZXM6IF9mZWF0dXJlc30gPSB1cGRhdGVkRGF0YTtcbiAgICAgICAgICBpZiAoX2ZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbGFzdEZlYXR1cmUgPSBfZmVhdHVyZXNbX2ZlYXR1cmVzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgaWYgKGxhc3RGZWF0dXJlLnByb3BlcnRpZXMpIGxhc3RGZWF0dXJlLnByb3BlcnRpZXMuaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgbGFzdEZlYXR1cmUuaWQgPSBnZW5lcmF0ZUhhc2hJZCg2KTtcbiAgICAgICAgICAgIG9uU2V0RmVhdHVyZXModXBkYXRlZERhdGEuZmVhdHVyZXMgYXMgdW5rbm93biBhcyBGZWF0dXJlW10pO1xuICAgICAgICAgICAgc2V0U2VsZWN0ZWRGZWF0dXJlKGxhc3RGZWF0dXJlIGFzIHVua25vd24gYXMgRmVhdHVyZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgRURJVF9UWVBFUy5BRERfUE9TSVRJT046XG4gICAgICAgIGNhc2UgRURJVF9UWVBFUy5NT1ZFX1BPU0lUSU9OOlxuICAgICAgICBjYXNlIEVESVRfVFlQRVMuVFJBTlNMQVRJTkc6XG4gICAgICAgICAgb25TZXRGZWF0dXJlcyh1cGRhdGVkRGF0YS5mZWF0dXJlcyBhcyB1bmtub3duIGFzIEZlYXR1cmVbXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIHByZXZlbnQgc2VsZi1oaWdobGlnaHRzIHdpdGggdGVudGF0aXZlIGZlYXR1cmVzXG4gICAgYXV0b0hpZ2hsaWdodDogIWlzRHJhd2luZ0FjdGl2ZShlZGl0b3JNZW51QWN0aXZlLCBlZGl0b3JNb2RlKSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaGlnaGxpZ2h0Q29sb3I6IGluZm8gPT4ge1xuICAgICAgLy8gTm90ZTogbGluZXMgYXJlIHJlcG9ydGVkIGFzIHBhcmVudCBwb2x5Z29uXG4gICAgICBjb25zdCB7b2JqZWN0fSA9IGluZm87XG4gICAgICBpZiAob2JqZWN0KSB7XG4gICAgICAgIGlmIChvYmplY3QuaWQgPT09IGVkaXRvci5zZWxlY3RlZEZlYXR1cmU/LmlkKSB7XG4gICAgICAgICAgcmV0dXJuIEZFQVRVUkVfU1RZTEUuaGlnaGxpZ2h0TXVsdGlwbGllck5vbmU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0eXBlID0gb2JqZWN0LnByb3BlcnRpZXMuZWRpdEhhbmRsZVR5cGU7XG4gICAgICAgIGlmICh0eXBlID09PSAnaW50ZXJtZWRpYXRlJykgcmV0dXJuIEVESVRfSEFORExFX1NUWUxFLmhpZ2hsaWdodE11bHRpcGxpZXJOb25lO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnZXhpc3RpbmcnKSByZXR1cm4gRURJVF9IQU5ETEVfU1RZTEUuaGlnaGxpZ2h0TXVsdGlwbGllcjtcbiAgICAgIH1cblxuICAgICAgLy8gTm90ZTogaGlnaGxpZ2h0IGNvbG9yIGFmZmVjdHMgZXZlbiB0cmFuc3BhcmVudCBmaWxsZWQgcG9seWdvbnNcbiAgICAgIHJldHVybiBzZWxlY3RlZEZlYXR1cmVJbmRleGVzLmxlbmd0aFxuICAgICAgICA/IEZFQVRVUkVfU1RZTEUuaGlnaGxpZ2h0TXVsdGlwbGllclxuICAgICAgICA6IExJTkVfU1RZTEUuaGlnaGxpZ2h0TXVsdGlwbGllcjtcbiAgICB9LFxuXG4gICAgZXh0ZW5zaW9uczogW25ldyBQYXRoU3R5bGVFeHRlbnNpb24oe2Rhc2g6IHRydWV9KV0sXG4gICAgZGFzaEdhcFBpY2thYmxlOiB0cnVlLFxuICAgIGdldERhc2hBcnJheTogZmVhdHVyZSA9PiB7XG4gICAgICBpZiAoZmVhdHVyZT8ucHJvcGVydGllcz8uZ3VpZGVUeXBlID09PSAndGVudGF0aXZlJykge1xuICAgICAgICByZXR1cm4gTElORV9TVFlMRS5kYXNoQXJyYXk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmZWF0dXJlPy5pZCA9PT0gZWRpdG9yLnNlbGVjdGVkRmVhdHVyZT8uaWQpIHJldHVybiBMSU5FX1NUWUxFLnNvbGlkQXJyYXk7XG5cbiAgICAgIHJldHVybiBMSU5FX1NUWUxFLmRhc2hBcnJheTtcbiAgICB9LFxuXG4gICAgZ2V0TGluZUNvbG9yOiBMSU5FX1NUWUxFLmdldENvbG9yLFxuICAgIGdldEZpbGxDb2xvcjogRkVBVFVSRV9TVFlMRS5nZXRDb2xvcixcblxuICAgIGdldFJhZGl1czogRURJVF9IQU5ETEVfU1RZTEUuZ2V0UmFkaXVzLFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBnZXRMaW5lV2lkdGg6IExJTkVfU1RZTEUuZ2V0V2lkdGgsXG5cbiAgICBnZXRFZGl0SGFuZGxlUG9pbnRSYWRpdXM6IEVESVRfSEFORExFX1NUWUxFLmdldFJhZGl1cyxcbiAgICBnZXRFZGl0SGFuZGxlUG9pbnRDb2xvcjogRURJVF9IQU5ETEVfU1RZTEUuZ2V0RmlsbENvbG9yLFxuICAgIGdldEVkaXRIYW5kbGVQb2ludE91dGxpbmVDb2xvcjogRURJVF9IQU5ETEVfU1RZTEUuZ2V0T3V0bGluZUNvbG9yLFxuXG4gICAgZ2V0VGVudGF0aXZlTGluZUNvbG9yOiBMSU5FX1NUWUxFLmdldFRlbnRhdGl2ZUxpbmVDb2xvcixcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgZ2V0VGVudGF0aXZlTGluZVdpZHRoOiBMSU5FX1NUWUxFLmdldFRlbnRhdGl2ZUxpbmVXaWR0aCxcbiAgICBnZXRUZW50YXRpdmVGaWxsQ29sb3I6IExJTkVfU1RZTEUuZ2V0VGVudGF0aXZlRmlsbENvbG9yLFxuXG4gICAgcGFyYW1ldGVyczoge30sXG4gICAgc2hhZG93RW5hYmxlZDogZmFsc2UsXG4gICAgX3N1YkxheWVyUHJvcHM6IHtcbiAgICAgIGdlb2pzb246IHtzaGFkb3dFbmFibGVkOiBmYWxzZX0sXG4gICAgICBndWlkZXM6IHtzaGFkb3dFbmFibGVkOiBmYWxzZX0sXG4gICAgICB0b29sdGlwczoge1xuICAgICAgICBzaGFkb3dFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgX3N1YkxheWVyUHJvcHM6IHtcbiAgICAgICAgICBjaGFyYWN0ZXJzOiB7c2hhZG93RW5hYmxlZDogZmFsc2V9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxJQUFBQSxlQUFBLEdBQUFDLE9BQUE7QUFTQSxJQUFBQyxXQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxVQUFBLEdBQUFGLE9BQUE7QUFFQSxJQUFBRyxZQUFBLEdBQUFILE9BQUE7QUFFQSxJQUFBSSxXQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxjQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxtQkFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8saUJBQUEsR0FBQVAsT0FBQTtBQXJCQTtBQUNBOztBQXNCQSxJQUFNUSxzQkFBc0IsR0FB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W119