UNPKG

kepler.gl

Version:

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

167 lines (160 loc) 27.6 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.AiAssistantComponent = AiAssistantComponent; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react")); var _lib = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react-redux/lib"); var _styledComponents = _interopRequireDefault(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/styled-components")); var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/styles/src"); var _core = require("@openassistant/core"); var _ui = require("@openassistant/ui"); require("@openassistant/echarts/dist/index.css"); require("@openassistant/ui/dist/index.css"); var _actions = require("../actions"); var _constants = require("../constants"); var _utils = require("../tools/utils"); var _tools = require("../tools/tools"); var _templateObject; // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } 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; } var StyledAiAssistantComponent = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n height: 100%;\n padding-bottom: 4px;\n\n * {\n font-size: 11px;\n }\n"]))); function AiAssistantComponent() { var visState = (0, _lib.useSelector)(function (state) { return state.demo.keplerGl.map.visState; }); var aiAssistant = (0, _lib.useSelector)(function (state) { return state.demo.aiAssistant; }); var dispatch = (0, _lib.useDispatch)(); // define LLM functions var tools = (0, _tools.setupLLMTools)({ visState: visState, aiAssistant: aiAssistant, dispatch: dispatch }); // enable voice and screen capture var enableVoiceAndScreenCapture = (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.provider) === 'openai' || (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.provider) === 'google' || false; // define assistant props var assistantProps = { name: _constants.ASSISTANT_NAME, description: _constants.ASSISTANT_DESCRIPTION, version: _constants.ASSISTANT_VERSION, modelProvider: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.provider) || '', model: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.model) || '', apiKey: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.apiKey) || '', baseUrl: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.baseUrl) || '', tools: tools }; var _useState = (0, _react.useState)(''), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), datasetMetaData = _useState2[0], setDatasetMetaData = _useState2[1]; var _useState3 = (0, _react.useState)([]), _useState4 = (0, _slicedToArray2["default"])(_useState3, 2), ideas = _useState4[0], setIdeas = _useState4[1]; // get dataset meta data and re-initialize assistant when datasets or layers change (0, _react.useEffect)(function () { var metaData = (0, _utils.getDatasetContext)(visState === null || visState === void 0 ? void 0 : visState.datasets, (visState === null || visState === void 0 ? void 0 : visState.layers) || []); setDatasetMetaData(metaData); // eslint-disable-next-line react-hooks/exhaustive-deps }, [visState === null || visState === void 0 ? void 0 : visState.datasets, visState === null || visState === void 0 ? void 0 : visState.layers]); // use dataset meta data in LLM instructions var instructions = "".concat(_constants.INSTRUCTIONS, "\n\n").concat(datasetMetaData); // generate ideas from LLM var _useAssistant = (0, _core.useAssistant)(_objectSpread(_objectSpread({}, assistantProps), {}, { instructions: instructions })), temporaryPrompt = _useAssistant.temporaryPrompt; var generateIdeas = /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() { var response, match, json; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: _context.prev = 0; _context.next = 3; return temporaryPrompt({ prompt: _constants.PROMPT_IDEAS, temperature: 1.0 }); case 3: response = _context.sent; // find [{},{}...] in the text and parse it as json, handling whitespace match = response === null || response === void 0 ? void 0 : response.match(/\[\s*\{[\s\S]*\}\s*\]/); if (match) { json = JSON.parse(match[0]); setIdeas(json); } _context.next = 11; break; case 8: _context.prev = 8; _context.t0 = _context["catch"](0); console.error('Error generating ideas', _context.t0); case 11: case "end": return _context.stop(); } }, _callee, null, [[0, 8]]); })); return function generateIdeas() { return _ref.apply(this, arguments); }; }(); (0, _react.useEffect)(function () { // get ideas UI component if (ideas.length === 0 && datasetMetaData.length > 0) { generateIdeas(); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [datasetMetaData]); var onRestartAssistant = function onRestartAssistant() { // clean up aiAssistant state dispatch((0, _actions.updateAiAssistantMessages)([])); }; var onMessagesUpdated = function onMessagesUpdated(messages) { dispatch((0, _actions.updateAiAssistantMessages)(messages)); }; var onScreenshotClick = function onScreenshotClick() { dispatch((0, _actions.setStartScreenCapture)(true)); }; var onRemoveScreenshot = function onRemoveScreenshot() { dispatch((0, _actions.setScreenCaptured)('')); }; return /*#__PURE__*/_react["default"].createElement(StyledAiAssistantComponent, { className: "ai-assistant-component" }, /*#__PURE__*/_react["default"].createElement(_ui.AiAssistant, (0, _extends2["default"])({}, assistantProps, { instructions: instructions, theme: _src.theme.textColor === _src.textColorLT ? 'light' : 'dark', welcomeMessage: _constants.WELCOME_MESSAGE, temperature: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.temperature) || 0, topP: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.topP) || 0, initialMessages: aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.messages, onMessagesUpdated: onMessagesUpdated, enableVoice: enableVoiceAndScreenCapture, enableScreenCapture: enableVoiceAndScreenCapture, onScreenshotClick: onScreenshotClick, screenCapturedBase64: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.screenshotToAsk.screenCaptured) || '', onRemoveScreenshot: onRemoveScreenshot, onRestartChat: onRestartAssistant, fontSize: 'text-tiny', botMessageClassName: '', githubIssueLink: 'https://github.com/keplergl/kepler.gl/issues', ideas: ideas, onRefreshIdeas: generateIdeas }))); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbGliIiwiX3N0eWxlZENvbXBvbmVudHMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX3NyYyIsIl9jb3JlIiwiX3VpIiwiX2FjdGlvbnMiLCJfY29uc3RhbnRzIiwiX3V0aWxzIiwiX3Rvb2xzIiwiX3RlbXBsYXRlT2JqZWN0IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiU3R5bGVkQWlBc3Npc3RhbnRDb21wb25lbnQiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsIkFpQXNzaXN0YW50Q29tcG9uZW50IiwidmlzU3RhdGUiLCJ1c2VTZWxlY3RvciIsInN0YXRlIiwiZGVtbyIsImtlcGxlckdsIiwibWFwIiwiYWlBc3Npc3RhbnQiLCJkaXNwYXRjaCIsInVzZURpc3BhdGNoIiwidG9vbHMiLCJzZXR1cExMTVRvb2xzIiwiZW5hYmxlVm9pY2VBbmRTY3JlZW5DYXB0dXJlIiwiY29uZmlnIiwicHJvdmlkZXIiLCJhc3Npc3RhbnRQcm9wcyIsIm5hbWUiLCJBU1NJU1RBTlRfTkFNRSIsImRlc2NyaXB0aW9uIiwiQVNTSVNUQU5UX0RFU0NSSVBUSU9OIiwidmVyc2lvbiIsIkFTU0lTVEFOVF9WRVJTSU9OIiwibW9kZWxQcm92aWRlciIsIm1vZGVsIiwiYXBpS2V5IiwiYmFzZVVybCIsIl91c2VTdGF0ZSIsInVzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5MiIsImRhdGFzZXRNZXRhRGF0YSIsInNldERhdGFzZXRNZXRhRGF0YSIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwiaWRlYXMiLCJzZXRJZGVhcyIsInVzZUVmZmVjdCIsIm1ldGFEYXRhIiwiZ2V0RGF0YXNldENvbnRleHQiLCJkYXRhc2V0cyIsImxheWVycyIsImluc3RydWN0aW9ucyIsImNvbmNhdCIsIklOU1RSVUNUSU9OUyIsIl91c2VBc3Npc3RhbnQiLCJ1c2VBc3Npc3RhbnQiLCJ0ZW1wb3JhcnlQcm9tcHQiLCJnZW5lcmF0ZUlkZWFzIiwiX3JlZiIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwicmVzcG9uc2UiLCJtYXRjaCIsImpzb24iLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwicHJvbXB0IiwiUFJPTVBUX0lERUFTIiwidGVtcGVyYXR1cmUiLCJzZW50IiwiSlNPTiIsInBhcnNlIiwidDAiLCJjb25zb2xlIiwiZXJyb3IiLCJzdG9wIiwib25SZXN0YXJ0QXNzaXN0YW50IiwidXBkYXRlQWlBc3Npc3RhbnRNZXNzYWdlcyIsIm9uTWVzc2FnZXNVcGRhdGVkIiwibWVzc2FnZXMiLCJvblNjcmVlbnNob3RDbGljayIsInNldFN0YXJ0U2NyZWVuQ2FwdHVyZSIsIm9uUmVtb3ZlU2NyZWVuc2hvdCIsInNldFNjcmVlbkNhcHR1cmVkIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsIkFpQXNzaXN0YW50IiwiX2V4dGVuZHMyIiwidGhlbWUiLCJ0ZXh0Q29sb3IiLCJ0ZXh0Q29sb3JMVCIsIndlbGNvbWVNZXNzYWdlIiwiV0VMQ09NRV9NRVNTQUdFIiwidG9wUCIsImluaXRpYWxNZXNzYWdlcyIsImVuYWJsZVZvaWNlIiwiZW5hYmxlU2NyZWVuQ2FwdHVyZSIsInNjcmVlbkNhcHR1cmVkQmFzZTY0Iiwic2NyZWVuc2hvdFRvQXNrIiwic2NyZWVuQ2FwdHVyZWQiLCJvblJlc3RhcnRDaGF0IiwiZm9udFNpemUiLCJib3RNZXNzYWdlQ2xhc3NOYW1lIiwiZ2l0aHViSXNzdWVMaW5rIiwib25SZWZyZXNoSWRlYXMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWktYXNzaXN0YW50L3NyYy9jb21wb25lbnRzL2FpLWFzc2lzdGFudC1jb21wb25lbnQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUVmZmVjdCwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7dXNlRGlzcGF0Y2gsIHVzZVNlbGVjdG9yfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7dGV4dENvbG9yTFQsIHRoZW1lfSBmcm9tICdAa2VwbGVyLmdsL3N0eWxlcyc7XG5pbXBvcnQge01lc3NhZ2VNb2RlbCwgdXNlQXNzaXN0YW50fSBmcm9tICdAb3BlbmFzc2lzdGFudC9jb3JlJztcbmltcG9ydCB7QWlBc3Npc3RhbnR9IGZyb20gJ0BvcGVuYXNzaXN0YW50L3VpJztcbmltcG9ydCAnQG9wZW5hc3Npc3RhbnQvZWNoYXJ0cy9kaXN0L2luZGV4LmNzcyc7XG5pbXBvcnQgJ0BvcGVuYXNzaXN0YW50L3VpL2Rpc3QvaW5kZXguY3NzJztcbmltcG9ydCB7c2V0U2NyZWVuQ2FwdHVyZWQsIHNldFN0YXJ0U2NyZWVuQ2FwdHVyZSwgdXBkYXRlQWlBc3Npc3RhbnRNZXNzYWdlc30gZnJvbSAnLi4vYWN0aW9ucyc7XG5pbXBvcnQge1xuICBBU1NJU1RBTlRfREVTQ1JJUFRJT04sXG4gIEFTU0lTVEFOVF9OQU1FLFxuICBBU1NJU1RBTlRfVkVSU0lPTixcbiAgSU5TVFJVQ1RJT05TLFxuICBQUk9NUFRfSURFQVMsXG4gIFdFTENPTUVfTUVTU0FHRVxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHtnZXREYXRhc2V0Q29udGV4dH0gZnJvbSAnLi4vdG9vbHMvdXRpbHMnO1xuaW1wb3J0IHtzZXR1cExMTVRvb2xzfSBmcm9tICcuLi90b29scy90b29scyc7XG5pbXBvcnQge1N0YXRlfSBmcm9tICcuL2FpLWFzc2lzdGFudC1tYW5hZ2VyJztcblxuY29uc3QgU3R5bGVkQWlBc3Npc3RhbnRDb21wb25lbnQgPSBzdHlsZWQuZGl2YFxuICBoZWlnaHQ6IDEwMCU7XG4gIHBhZGRpbmctYm90dG9tOiA0cHg7XG5cbiAgKiB7XG4gICAgZm9udC1zaXplOiAxMXB4O1xuICB9XG5gO1xuXG5leHBvcnQgZnVuY3Rpb24gQWlBc3Npc3RhbnRDb21wb25lbnQoKSB7XG4gIGNvbnN0IHZpc1N0YXRlID0gdXNlU2VsZWN0b3IoKHN0YXRlOiBTdGF0ZSkgPT4gc3RhdGUuZGVtby5rZXBsZXJHbC5tYXAudmlzU3RhdGUpO1xuICBjb25zdCBhaUFzc2lzdGFudCA9IHVzZVNlbGVjdG9yKChzdGF0ZTogU3RhdGUpID0+IHN0YXRlLmRlbW8uYWlBc3Npc3RhbnQpO1xuICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XG5cbiAgLy8gZGVmaW5lIExMTSBmdW5jdGlvbnNcbiAgY29uc3QgdG9vbHMgPSBzZXR1cExMTVRvb2xzKHt2aXNTdGF0ZSwgYWlBc3Npc3RhbnQsIGRpc3BhdGNofSk7XG5cbiAgLy8gZW5hYmxlIHZvaWNlIGFuZCBzY3JlZW4gY2FwdHVyZVxuICBjb25zdCBlbmFibGVWb2ljZUFuZFNjcmVlbkNhcHR1cmUgPVxuICAgIGFpQXNzaXN0YW50Py5jb25maWcucHJvdmlkZXIgPT09ICdvcGVuYWknIHx8IGFpQXNzaXN0YW50Py5jb25maWcucHJvdmlkZXIgPT09ICdnb29nbGUnIHx8IGZhbHNlO1xuXG4gIC8vIGRlZmluZSBhc3Npc3RhbnQgcHJvcHNcbiAgY29uc3QgYXNzaXN0YW50UHJvcHMgPSB7XG4gICAgbmFtZTogQVNTSVNUQU5UX05BTUUsXG4gICAgZGVzY3JpcHRpb246IEFTU0lTVEFOVF9ERVNDUklQVElPTixcbiAgICB2ZXJzaW9uOiBBU1NJU1RBTlRfVkVSU0lPTixcbiAgICBtb2RlbFByb3ZpZGVyOiBhaUFzc2lzdGFudD8uY29uZmlnLnByb3ZpZGVyIHx8ICcnLFxuICAgIG1vZGVsOiBhaUFzc2lzdGFudD8uY29uZmlnLm1vZGVsIHx8ICcnLFxuICAgIGFwaUtleTogYWlBc3Npc3RhbnQ/LmNvbmZpZy5hcGlLZXkgfHwgJycsXG4gICAgYmFzZVVybDogYWlBc3Npc3RhbnQ/LmNvbmZpZy5iYXNlVXJsIHx8ICcnLFxuICAgIHRvb2xzXG4gIH07XG5cbiAgY29uc3QgW2RhdGFzZXRNZXRhRGF0YSwgc2V0RGF0YXNldE1ldGFEYXRhXSA9IHVzZVN0YXRlPHN0cmluZz4oJycpO1xuXG4gIGNvbnN0IFtpZGVhcywgc2V0SWRlYXNdID0gdXNlU3RhdGU8e3RpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmd9W10+KFtdKTtcblxuICAvLyBnZXQgZGF0YXNldCBtZXRhIGRhdGEgYW5kIHJlLWluaXRpYWxpemUgYXNzaXN0YW50IHdoZW4gZGF0YXNldHMgb3IgbGF5ZXJzIGNoYW5nZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG1ldGFEYXRhID0gZ2V0RGF0YXNldENvbnRleHQodmlzU3RhdGU/LmRhdGFzZXRzLCB2aXNTdGF0ZT8ubGF5ZXJzIHx8IFtdKTtcbiAgICBzZXREYXRhc2V0TWV0YURhdGEobWV0YURhdGEpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW3Zpc1N0YXRlPy5kYXRhc2V0cywgdmlzU3RhdGU/LmxheWVyc10pO1xuXG4gIC8vIHVzZSBkYXRhc2V0IG1ldGEgZGF0YSBpbiBMTE0gaW5zdHJ1Y3Rpb25zXG4gIGNvbnN0IGluc3RydWN0aW9ucyA9IGAke0lOU1RSVUNUSU9OU31cXG5cXG4ke2RhdGFzZXRNZXRhRGF0YX1gO1xuXG4gIC8vIGdlbmVyYXRlIGlkZWFzIGZyb20gTExNXG4gIGNvbnN0IHt0ZW1wb3JhcnlQcm9tcHR9ID0gdXNlQXNzaXN0YW50KHsuLi5hc3Npc3RhbnRQcm9wcywgaW5zdHJ1Y3Rpb25zfSk7XG5cbiAgY29uc3QgZ2VuZXJhdGVJZGVhcyA9IGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0ZW1wb3JhcnlQcm9tcHQoe1xuICAgICAgICBwcm9tcHQ6IFBST01QVF9JREVBUyxcbiAgICAgICAgdGVtcGVyYXR1cmU6IDEuMFxuICAgICAgfSk7XG4gICAgICAvLyBmaW5kIFt7fSx7fS4uLl0gaW4gdGhlIHRleHQgYW5kIHBhcnNlIGl0IGFzIGpzb24sIGhhbmRsaW5nIHdoaXRlc3BhY2VcbiAgICAgIGNvbnN0IG1hdGNoID0gcmVzcG9uc2U/Lm1hdGNoKC9cXFtcXHMqXFx7LipcXH1cXHMqXFxdL3MpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKG1hdGNoWzBdKTtcbiAgICAgICAgc2V0SWRlYXMoanNvbik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGdlbmVyYXRpbmcgaWRlYXMnLCBlcnJvcik7XG4gICAgfVxuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gZ2V0IGlkZWFzIFVJIGNvbXBvbmVudFxuICAgIGlmIChpZGVhcy5sZW5ndGggPT09IDAgJiYgZGF0YXNldE1ldGFEYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIGdlbmVyYXRlSWRlYXMoKTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbZGF0YXNldE1ldGFEYXRhXSk7XG5cbiAgY29uc3Qgb25SZXN0YXJ0QXNzaXN0YW50ID0gKCkgPT4ge1xuICAgIC8vIGNsZWFuIHVwIGFpQXNzaXN0YW50IHN0YXRlXG4gICAgZGlzcGF0Y2godXBkYXRlQWlBc3Npc3RhbnRNZXNzYWdlcyhbXSkpO1xuICB9O1xuXG4gIGNvbnN0IG9uTWVzc2FnZXNVcGRhdGVkID0gKG1lc3NhZ2VzOiBNZXNzYWdlTW9kZWxbXSkgPT4ge1xuICAgIGRpc3BhdGNoKHVwZGF0ZUFpQXNzaXN0YW50TWVzc2FnZXMobWVzc2FnZXMpKTtcbiAgfTtcblxuICBjb25zdCBvblNjcmVlbnNob3RDbGljayA9ICgpID0+IHtcbiAgICBkaXNwYXRjaChzZXRTdGFydFNjcmVlbkNhcHR1cmUodHJ1ZSkpO1xuICB9O1xuXG4gIGNvbnN0IG9uUmVtb3ZlU2NyZWVuc2hvdCA9ICgpID0+IHtcbiAgICBkaXNwYXRjaChzZXRTY3JlZW5DYXB0dXJlZCgnJykpO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPFN0eWxlZEFpQXNzaXN0YW50Q29tcG9uZW50IGNsYXNzTmFtZT1cImFpLWFzc2lzdGFudC1jb21wb25lbnRcIj5cbiAgICAgIDxBaUFzc2lzdGFudFxuICAgICAgICB7Li4uYXNzaXN0YW50UHJvcHN9XG4gICAgICAgIGluc3RydWN0aW9ucz17aW5zdHJ1Y3Rpb25zfVxuICAgICAgICB0aGVtZT17dGhlbWUudGV4dENvbG9yID09PSB0ZXh0Q29sb3JMVCA/ICdsaWdodCcgOiAnZGFyayd9XG4gICAgICAgIHdlbGNvbWVNZXNzYWdlPXtXRUxDT01FX01FU1NBR0V9XG4gICAgICAgIHRlbXBlcmF0dXJlPXthaUFzc2lzdGFudD8uY29uZmlnLnRlbXBlcmF0dXJlIHx8IDB9XG4gICAgICAgIHRvcFA9e2FpQXNzaXN0YW50Py5jb25maWcudG9wUCB8fCAwfVxuICAgICAgICBpbml0aWFsTWVzc2FnZXM9e2FpQXNzaXN0YW50Py5tZXNzYWdlc31cbiAgICAgICAgb25NZXNzYWdlc1VwZGF0ZWQ9e29uTWVzc2FnZXNVcGRhdGVkfVxuICAgICAgICBlbmFibGVWb2ljZT17ZW5hYmxlVm9pY2VBbmRTY3JlZW5DYXB0dXJlfVxuICAgICAgICBlbmFibGVTY3JlZW5DYXB0dXJlPXtlbmFibGVWb2ljZUFuZFNjcmVlbkNhcHR1cmV9XG4gICAgICAgIG9uU2NyZWVuc2hvdENsaWNrPXtvblNjcmVlbnNob3RDbGlja31cbiAgICAgICAgc2NyZWVuQ2FwdHVyZWRCYXNlNjQ9e2FpQXNzaXN0YW50Py5zY3JlZW5zaG90VG9Bc2suc2NyZWVuQ2FwdHVyZWQgfHwgJyd9XG4gICAgICAgIG9uUmVtb3ZlU2NyZWVuc2hvdD17b25SZW1vdmVTY3JlZW5zaG90fVxuICAgICAgICBvblJlc3RhcnRDaGF0PXtvblJlc3RhcnRBc3Npc3RhbnR9XG4gICAgICAgIGZvbnRTaXplPXsndGV4dC10aW55J31cbiAgICAgICAgYm90TWVzc2FnZUNsYXNzTmFtZT17Jyd9XG4gICAgICAgIGdpdGh1Yklzc3VlTGluaz17J2h0dHBzOi8vZ2l0aHViLmNvbS9rZXBsZXJnbC9rZXBsZXIuZ2wvaXNzdWVzJ31cbiAgICAgICAgaWRlYXM9e2lkZWFzfVxuICAgICAgICBvblJlZnJlc2hJZGVhcz17Z2VuZXJhdGVJZGVhc31cbiAgICAgIC8+XG4gICAgPC9TdHlsZWRBaUFzc2lzdGFudENvbXBvbmVudD5cbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxJQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxpQkFBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksSUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssS0FBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sR0FBQSxHQUFBTixP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