kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
152 lines (150 loc) • 21.9 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.updateLayerColor = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _react = require("react");
var _utils = require("@openassistant/utils");
var _actions = require("@kepler.gl/actions");
var _zod = require("zod");
var _reactRedux = require("react-redux");
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
// This file is used to call the LAYER_VISUAL_CHANNEL_CHANGE to update the layer style
function UpdateLayerColorToolComponent(_ref) {
var layer = _ref.layer,
newConfig = _ref.newConfig,
channel = _ref.channel,
newVisConfig = _ref.newVisConfig;
var dispatch = (0, _reactRedux.useDispatch)();
(0, _react.useEffect)(function () {
dispatch((0, _actions.layerVisualChannelConfigChange)(layer, newConfig, channel, newVisConfig));
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return null;
}
/**
* Update the color of a layer
* NOTE: this tool should be updated to updateLayerStyle including color, size, opacity, etc.
*/
var updateLayerColor = exports.updateLayerColor = (0, _utils.tool)({
description: 'Update the color of a layer',
parameters: _zod.z.object({
layerId: _zod.z.string(),
numberOfColors: _zod.z.number(),
customColors: _zod.z.array(_zod.z.string()).describe('An array of hex color values. Please try to generate colors from user description like: van gogh starry night, water color etc.')
}),
execute: executeUpdateLayerColor,
context: {
getLayers: function getLayers() {
throw new Error('getLayers() not implemented.');
},
layerVisualChannelConfigChange: function layerVisualChannelConfigChange() {
throw new Error('layerVisualChannelConfigChange() not implemented.');
}
},
component: UpdateLayerColorToolComponent
});
function isUpdateLayerColorArgs(args) {
return (0, _typeof2["default"])(args) === 'object' && args !== null && typeof args.layerId === 'string' && typeof args.numberOfColors === 'number' && Array.isArray(args.customColors) && args.customColors.every(function (color) {
return typeof color === 'string';
});
}
function isUpdateLayerColorFunctionContext(context) {
return (0, _typeof2["default"])(context) === 'object' && context !== null && typeof context.getLayers === 'function';
}
function executeUpdateLayerColor(_x, _x2) {
return _executeUpdateLayerColor.apply(this, arguments);
}
function _executeUpdateLayerColor() {
_executeUpdateLayerColor = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(args, options) {
var layerId, numberOfColors, customColors, getLayers, layers, layer, channel, newConfig, oldColorRange, newColorRange, newVisConfig;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
_context.prev = 0;
if (isUpdateLayerColorArgs(args)) {
_context.next = 3;
break;
}
throw new Error('Invalid updateLayerColor arguments');
case 3:
if (isUpdateLayerColorFunctionContext(options.context)) {
_context.next = 5;
break;
}
throw new Error('Invalid updateLayerColor function context');
case 5:
layerId = args.layerId, numberOfColors = args.numberOfColors, customColors = args.customColors;
getLayers = options.context.getLayers; // get layer from visState by layerId
layers = getLayers();
layer = layers.find(function (l) {
return l.id === layerId;
});
if (layer) {
_context.next = 11;
break;
}
throw new Error("Layer with id ".concat(layerId, " not found"));
case 11:
if (!(numberOfColors !== customColors.length)) {
_context.next = 13;
break;
}
throw new Error("customColors array must contain exactly ".concat(numberOfColors, " colors"));
case 13:
channel = 'color';
newConfig = {
// colorScale: 'custom'
};
oldColorRange = layer.config.visConfig.colorRange;
newColorRange = _objectSpread(_objectSpread({}, oldColorRange), {}, {
colors: customColors
}, oldColorRange.colorMap ? {
colorMap: (0, _toConsumableArray2["default"])(oldColorRange.colorMap.map(function (c, i) {
return [c[0], customColors[i]];
}))
} : {});
newVisConfig = {
colorRange: newColorRange,
strokeColorRange: newColorRange
};
return _context.abrupt("return", {
llmResult: {
success: true,
details: "Color updated successfully to ".concat(customColors.join(', '), " for layer ").concat(layerId)
},
additionalData: {
layerId: layerId,
layer: layer,
newConfig: newConfig,
channel: channel,
newVisConfig: newVisConfig
}
});
case 21:
_context.prev = 21;
_context.t0 = _context["catch"](0);
return _context.abrupt("return", {
llmResult: {
success: false,
error: _context.t0 instanceof Error ? _context.t0.message : 'Unknown error',
instruction: "Try to fix the error. If the error persists, pause the execution and ask the user to try with different prompt and context."
}
});
case 24:
case "end":
return _context.stop();
}
}, _callee, null, [[0, 21]]);
}));
return _executeUpdateLayerColor.apply(this, arguments);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX3V0aWxzIiwiX2FjdGlvbnMiLCJfem9kIiwiX3JlYWN0UmVkdXgiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIlVwZGF0ZUxheWVyQ29sb3JUb29sQ29tcG9uZW50IiwiX3JlZiIsImxheWVyIiwibmV3Q29uZmlnIiwiY2hhbm5lbCIsIm5ld1Zpc0NvbmZpZyIsImRpc3BhdGNoIiwidXNlRGlzcGF0Y2giLCJ1c2VFZmZlY3QiLCJsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2UiLCJ1cGRhdGVMYXllckNvbG9yIiwiZXhwb3J0cyIsInRvb2wiLCJkZXNjcmlwdGlvbiIsInBhcmFtZXRlcnMiLCJ6Iiwib2JqZWN0IiwibGF5ZXJJZCIsInN0cmluZyIsIm51bWJlck9mQ29sb3JzIiwibnVtYmVyIiwiY3VzdG9tQ29sb3JzIiwiYXJyYXkiLCJkZXNjcmliZSIsImV4ZWN1dGUiLCJleGVjdXRlVXBkYXRlTGF5ZXJDb2xvciIsImNvbnRleHQiLCJnZXRMYXllcnMiLCJFcnJvciIsImNvbXBvbmVudCIsImlzVXBkYXRlTGF5ZXJDb2xvckFyZ3MiLCJhcmdzIiwiX3R5cGVvZjIiLCJBcnJheSIsImlzQXJyYXkiLCJldmVyeSIsImNvbG9yIiwiaXNVcGRhdGVMYXllckNvbG9yRnVuY3Rpb25Db250ZXh0IiwiX3giLCJfeDIiLCJfZXhlY3V0ZVVwZGF0ZUxheWVyQ29sb3IiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsIm9wdGlvbnMiLCJsYXllcnMiLCJvbGRDb2xvclJhbmdlIiwibmV3Q29sb3JSYW5nZSIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJmaW5kIiwibCIsImlkIiwiY29uY2F0IiwiY29uZmlnIiwidmlzQ29uZmlnIiwiY29sb3JSYW5nZSIsImNvbG9ycyIsImNvbG9yTWFwIiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsIm1hcCIsImMiLCJpIiwic3Ryb2tlQ29sb3JSYW5nZSIsImFicnVwdCIsImxsbVJlc3VsdCIsInN1Y2Nlc3MiLCJkZXRhaWxzIiwiam9pbiIsImFkZGl0aW9uYWxEYXRhIiwidDAiLCJlcnJvciIsIm1lc3NhZ2UiLCJpbnN0cnVjdGlvbiIsInN0b3AiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbHMva2VwbGVyLXRvb2xzL2xheWVyLXN0eWxlLXRvb2wudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbi8vIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGNhbGwgdGhlIExBWUVSX1ZJU1VBTF9DSEFOTkVMX0NIQU5HRSB0byB1cGRhdGUgdGhlIGxheWVyIHN0eWxlXG5cbmltcG9ydCB7dXNlRWZmZWN0fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge3Rvb2x9IGZyb20gJ0BvcGVuYXNzaXN0YW50L3V0aWxzJztcbmltcG9ydCB7bGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtMYXllciwgTGF5ZXJCYXNlQ29uZmlnfSBmcm9tICdAa2VwbGVyLmdsL2xheWVycyc7XG5pbXBvcnQge0xheWVyVmlzQ29uZmlnfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7en0gZnJvbSAnem9kJztcbmltcG9ydCB7dXNlRGlzcGF0Y2h9IGZyb20gJ3JlYWN0LXJlZHV4JztcblxuZnVuY3Rpb24gVXBkYXRlTGF5ZXJDb2xvclRvb2xDb21wb25lbnQoe2xheWVyLCBuZXdDb25maWcsIGNoYW5uZWwsIG5ld1Zpc0NvbmZpZ30pIHtcbiAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZGlzcGF0Y2gobGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlKGxheWVyLCBuZXdDb25maWcsIGNoYW5uZWwsIG5ld1Zpc0NvbmZpZykpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW10pO1xuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgY29sb3Igb2YgYSBsYXllclxuICogTk9URTogdGhpcyB0b29sIHNob3VsZCBiZSB1cGRhdGVkIHRvIHVwZGF0ZUxheWVyU3R5bGUgaW5jbHVkaW5nIGNvbG9yLCBzaXplLCBvcGFjaXR5LCBldGMuXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVMYXllckNvbG9yID0gdG9vbCh7XG4gIGRlc2NyaXB0aW9uOiAnVXBkYXRlIHRoZSBjb2xvciBvZiBhIGxheWVyJyxcbiAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuICAgIGxheWVySWQ6IHouc3RyaW5nKCksXG4gICAgbnVtYmVyT2ZDb2xvcnM6IHoubnVtYmVyKCksXG4gICAgY3VzdG9tQ29sb3JzOiB6XG4gICAgICAuYXJyYXkoei5zdHJpbmcoKSlcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgJ0FuIGFycmF5IG9mIGhleCBjb2xvciB2YWx1ZXMuIFBsZWFzZSB0cnkgdG8gZ2VuZXJhdGUgY29sb3JzIGZyb20gdXNlciBkZXNjcmlwdGlvbiBsaWtlOiB2YW4gZ29naCBzdGFycnkgbmlnaHQsIHdhdGVyIGNvbG9yIGV0Yy4nXG4gICAgICApXG4gIH0pLFxuICBleGVjdXRlOiBleGVjdXRlVXBkYXRlTGF5ZXJDb2xvcixcbiAgY29udGV4dDoge1xuICAgIGdldExheWVyczogKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdnZXRMYXllcnMoKSBub3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgfSxcbiAgICBsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2U6ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlKCkgbm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cbiAgfSxcbiAgY29tcG9uZW50OiBVcGRhdGVMYXllckNvbG9yVG9vbENvbXBvbmVudFxufSk7XG5cbnR5cGUgVXBkYXRlTGF5ZXJDb2xvckFyZ3MgPSB7XG4gIGxheWVySWQ6IHN0cmluZztcbiAgbnVtYmVyT2ZDb2xvcnM6IG51bWJlcjtcbiAgY3VzdG9tQ29sb3JzOiBzdHJpbmdbXTtcbn07XG5cbmZ1bmN0aW9uIGlzVXBkYXRlTGF5ZXJDb2xvckFyZ3MoYXJnczogYW55KTogYXJncyBpcyBVcGRhdGVMYXllckNvbG9yQXJncyB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIGFyZ3MgPT09ICdvYmplY3QnICYmXG4gICAgYXJncyAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiBhcmdzLmxheWVySWQgPT09ICdzdHJpbmcnICYmXG4gICAgdHlwZW9mIGFyZ3MubnVtYmVyT2ZDb2xvcnMgPT09ICdudW1iZXInICYmXG4gICAgQXJyYXkuaXNBcnJheShhcmdzLmN1c3RvbUNvbG9ycykgJiZcbiAgICBhcmdzLmN1c3RvbUNvbG9ycy5ldmVyeShjb2xvciA9PiB0eXBlb2YgY29sb3IgPT09ICdzdHJpbmcnKVxuICApO1xufVxuXG50eXBlIFVwZGF0ZUxheWVyQ29sb3JGdW5jdGlvbkNvbnRleHQgPSB7XG4gIGdldExheWVyczogKCkgPT4gTGF5ZXJbXTtcbn07XG5cbmZ1bmN0aW9uIGlzVXBkYXRlTGF5ZXJDb2xvckZ1bmN0aW9uQ29udGV4dChcbiAgY29udGV4dDogYW55XG4pOiBjb250ZXh0IGlzIFVwZGF0ZUxheWVyQ29sb3JGdW5jdGlvbkNvbnRleHQge1xuICByZXR1cm4gdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnICYmIGNvbnRleHQgIT09IG51bGwgJiYgdHlwZW9mIGNvbnRleHQuZ2V0TGF5ZXJzID09PSAnZnVuY3Rpb24nO1xufVxuXG50eXBlIEV4ZWN1dGVVcGRhdGVMYXllckNvbG9yUmVzdWx0ID0ge1xuICBsbG1SZXN1bHQ6IHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIGRldGFpbHM/OiBzdHJpbmc7XG4gICAgZXJyb3I/OiBzdHJpbmc7XG4gICAgaW5zdHJ1Y3Rpb24/OiBzdHJpbmc7XG4gIH07XG4gIGFkZGl0aW9uYWxEYXRhPzoge1xuICAgIGxheWVySWQ6IHN0cmluZztcbiAgICBsYXllcjogTGF5ZXI7XG4gICAgbmV3Q29uZmlnOiBQYXJ0aWFsPExheWVyQmFzZUNvbmZpZz47XG4gICAgY2hhbm5lbDogc3RyaW5nO1xuICAgIG5ld1Zpc0NvbmZpZzogUGFydGlhbDxMYXllclZpc0NvbmZpZz47XG4gIH07XG59O1xuXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlVXBkYXRlTGF5ZXJDb2xvcihhcmdzLCBvcHRpb25zKTogUHJvbWlzZTxFeGVjdXRlVXBkYXRlTGF5ZXJDb2xvclJlc3VsdD4ge1xuICB0cnkge1xuICAgIGlmICghaXNVcGRhdGVMYXllckNvbG9yQXJncyhhcmdzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVwZGF0ZUxheWVyQ29sb3IgYXJndW1lbnRzJyk7XG4gICAgfVxuICAgIGlmICghaXNVcGRhdGVMYXllckNvbG9yRnVuY3Rpb25Db250ZXh0KG9wdGlvbnMuY29udGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1cGRhdGVMYXllckNvbG9yIGZ1bmN0aW9uIGNvbnRleHQnKTtcbiAgICB9XG5cbiAgICBjb25zdCB7bGF5ZXJJZCwgbnVtYmVyT2ZDb2xvcnMsIGN1c3RvbUNvbG9yc30gPSBhcmdzO1xuICAgIGNvbnN0IHtnZXRMYXllcnN9ID0gb3B0aW9ucy5jb250ZXh0O1xuXG4gICAgLy8gZ2V0IGxheWVyIGZyb20gdmlzU3RhdGUgYnkgbGF5ZXJJZFxuICAgIGNvbnN0IGxheWVycyA9IGdldExheWVycygpO1xuICAgIGNvbnN0IGxheWVyID0gbGF5ZXJzLmZpbmQobCA9PiBsLmlkID09PSBsYXllcklkKTtcbiAgICBpZiAoIWxheWVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExheWVyIHdpdGggaWQgJHtsYXllcklkfSBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICAvLyB2ZXJpZnkgbnVtYmVyT2ZDb2xvcnMgaXMgZXF1YWwgdG8gY3VzdG9tQ29sb3JzLmxlbmd0aFxuICAgIGlmIChudW1iZXJPZkNvbG9ycyAhPT0gY3VzdG9tQ29sb3JzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjdXN0b21Db2xvcnMgYXJyYXkgbXVzdCBjb250YWluIGV4YWN0bHkgJHtudW1iZXJPZkNvbG9yc30gY29sb3JzYCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbCA9ICdjb2xvcic7XG5cbiAgICBjb25zdCBuZXdDb25maWcgPSB7XG4gICAgICAvLyBjb2xvclNjYWxlOiAnY3VzdG9tJ1xuICAgIH0gYXMgUGFydGlhbDxMYXllckJhc2VDb25maWc+O1xuXG4gICAgY29uc3Qgb2xkQ29sb3JSYW5nZSA9IGxheWVyLmNvbmZpZy52aXNDb25maWcuY29sb3JSYW5nZTtcbiAgICBjb25zdCBuZXdDb2xvclJhbmdlID0ge1xuICAgICAgLi4ub2xkQ29sb3JSYW5nZSxcbiAgICAgIGNvbG9yczogY3VzdG9tQ29sb3JzLFxuICAgICAgLi4uKG9sZENvbG9yUmFuZ2UuY29sb3JNYXBcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBjb2xvck1hcDogWy4uLm9sZENvbG9yUmFuZ2UuY29sb3JNYXAubWFwKChjLCBpKSA9PiBbY1swXSwgY3VzdG9tQ29sb3JzW2ldXSldXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KVxuICAgIH07XG5cbiAgICBjb25zdCBuZXdWaXNDb25maWcgPSB7XG4gICAgICBjb2xvclJhbmdlOiBuZXdDb2xvclJhbmdlLFxuICAgICAgc3Ryb2tlQ29sb3JSYW5nZTogbmV3Q29sb3JSYW5nZVxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGxtUmVzdWx0OiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIGRldGFpbHM6IGBDb2xvciB1cGRhdGVkIHN1Y2Nlc3NmdWxseSB0byAke2N1c3RvbUNvbG9ycy5qb2luKCcsICcpfSBmb3IgbGF5ZXIgJHtsYXllcklkfWBcbiAgICAgIH0sXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBsYXllcklkLFxuICAgICAgICBsYXllcixcbiAgICAgICAgbmV3Q29uZmlnLFxuICAgICAgICBjaGFubmVsLFxuICAgICAgICBuZXdWaXNDb25maWdcbiAgICAgIH1cbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBsbG1SZXN1bHQ6IHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyxcbiAgICAgICAgaW5zdHJ1Y3Rpb246IGBUcnkgdG8gZml4IHRoZSBlcnJvci4gSWYgdGhlIGVycm9yIHBlcnNpc3RzLCBwYXVzZSB0aGUgZXhlY3V0aW9uIGFuZCBhc2sgdGhlIHVzZXIgdG8gdHJ5IHdpdGggZGlmZmVyZW50IHByb21wdCBhbmQgY29udGV4dC5gXG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFLQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFELE9BQUE7QUFDQSxJ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
;