UNPKG

kepler.gl

Version:

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

294 lines (293 loc) 51 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireWildcard(require("styled-components")); var _reactIntl = require("react-intl"); var _components = require("@kepler.gl/components"); var _apiKey = _interopRequireDefault(require("../icons/api-key")); var _core = require("@openassistant/core"); var _models = _interopRequireDefault(require("../config/models.json")); var _usehooksTs = require("usehooks-ts"); var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7; // 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; } var SectionTitle = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n font-size: ", ";\n color: ", ";\n text-transform: capitalize;\n"])), function (props) { return props.theme.inputFontSize; }, function (props) { return props.theme.effectPanelTextSecondary1; }); var StyledAiAssistantConfig = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n padding: 12px;\n font-size: ", ";\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n height: 100%;\n\n .api-key-input {\n box-shadow: ", ";\n width: 100%;\n .api-key-input__icon {\n position: absolute;\n height: ", "px;\n width: 30px;\n padding-left: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: ", ";\n }\n\n input {\n padding: 4px 36px;\n height: ", "px;\n caret-color: unset;\n }\n }\n"])), function (props) { return props.theme.primaryBtnFontSizeDefault; }, function (props) { return props.theme.boxShadow; }, function (props) { return props.theme.geocoderInputHeight; }, function (props) { return props.theme.subtextColor; }, function (props) { return props.theme.geocoderInputHeight; }); var StyledWrapper = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: space-between;\n align-items: center;\n"]))); var StyledItemSelector = (0, _styledComponents["default"])(_components.ItemSelector)(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n .item-selector__dropdown {\n padding-left: 10px;\n border-radius: 4px;\n }\n .active {\n border-color: ", ";\n border-radius: 4px 4px 0px 0px !important;\n }\n width: 100%;\n"])), function (props) { return props.theme.activeColor; }); var StyleSliderWrapper = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n width: 100%;\n align-self: flex-start;\n height: 32px;\n display: flex;\n align-items: center;\n .kg-range-slider__input {\n height: 32px;\n text-align: center;\n padding: 3px 6px;\n }\n .kg-slider {\n padding-left: 6px;\n }\n .kg-range-slider {\n padding: 0px !important;\n }\n"]))); var StyledButton = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n width: 100%;\n align-self: flex-start;\n margin-top: 12px;\n\n button div {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-right: 4px;\n }\n"]))); var StyleErrorMessage = _styledComponents["default"].div(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n font-size: ", ";\n background-color: ", ";\n border-radius: 4px;\n padding: 4px 8px;\n color: ", ";\n"])), function (props) { return props.theme.primaryBtnFontSizeDefault; }, function (props) { return props.theme.errorColor; }, function (props) { return props.theme.errorTextColor; }); AiAssistantConfigFactory.deps = [_components.RangeSliderFactory]; function AiAssistantConfigFactory(RangeSlider) { var AiAssistantConfig = function AiAssistantConfig(_ref) { var intl = _ref.intl, aiAssistantConfig = _ref.aiAssistantConfig, updateAiAssistantConfig = _ref.updateAiAssistantConfig; var _useLocalStorage = (0, _usehooksTs.useLocalStorage)('ai-assistant-provider', aiAssistantConfig.provider || 'openai'), _useLocalStorage2 = (0, _slicedToArray2["default"])(_useLocalStorage, 2), provider = _useLocalStorage2[0], setProvider = _useLocalStorage2[1]; var _useLocalStorage3 = (0, _usehooksTs.useLocalStorage)('ai-assistant-model', aiAssistantConfig.model || _models["default"][provider][0]), _useLocalStorage4 = (0, _slicedToArray2["default"])(_useLocalStorage3, 2), model = _useLocalStorage4[0], setModel = _useLocalStorage4[1]; var _useLocalStorage5 = (0, _usehooksTs.useLocalStorage)('ai-assistant-api-key', aiAssistantConfig.apiKey || ''), _useLocalStorage6 = (0, _slicedToArray2["default"])(_useLocalStorage5, 2), apiKey = _useLocalStorage6[0], setApiKey = _useLocalStorage6[1]; var _useLocalStorage7 = (0, _usehooksTs.useLocalStorage)('ai-assistant-temperature', aiAssistantConfig.temperature || 0.8), _useLocalStorage8 = (0, _slicedToArray2["default"])(_useLocalStorage7, 2), temperature = _useLocalStorage8[0], setTemperature = _useLocalStorage8[1]; var _useLocalStorage9 = (0, _usehooksTs.useLocalStorage)('ai-assistant-top-p', aiAssistantConfig.topP || 0.8), _useLocalStorage10 = (0, _slicedToArray2["default"])(_useLocalStorage9, 2), topP = _useLocalStorage10[0], setTopP = _useLocalStorage10[1]; var _useLocalStorage11 = (0, _usehooksTs.useLocalStorage)('ai-assistant-base-url', aiAssistantConfig.baseUrl || 'http://localhost:11434'), _useLocalStorage12 = (0, _slicedToArray2["default"])(_useLocalStorage11, 2), baseUrl = _useLocalStorage12[0], setBaseUrl = _useLocalStorage12[1]; var _useState = (0, _react.useState)(false), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), connectionError = _useState2[0], setConnectionError = _useState2[1]; var _useState3 = (0, _react.useState)(''), _useState4 = (0, _slicedToArray2["default"])(_useState3, 2), errorMessage = _useState4[0], setErrorMessage = _useState4[1]; var _useState5 = (0, _react.useState)(false), _useState6 = (0, _slicedToArray2["default"])(_useState5, 2), isRunning = _useState6[0], setIsRunning = _useState6[1]; var onAiProviderSelect = function onAiProviderSelect(value) { if (typeof value === 'string') { setProvider(value); setModel(_models["default"][value][0]); setConnectionError(false); setErrorMessage(''); } }; var onLLMModelSelect = function onLLMModelSelect(value) { if (typeof value === 'string') { setModel(value); } }; var onApiKeyChange = function onApiKeyChange(e) { setApiKey(e.target.value); // reset previous key error if any setConnectionError(false); setErrorMessage(''); }; var onTemperatureChange = function onTemperatureChange(value) { setTemperature(value[1]); }; var onTopPChange = function onTopPChange(value) { setTopP(value[1]); }; var onBaseUrlChange = function onBaseUrlChange(e) { setBaseUrl(e.target.value); setConnectionError(false); setErrorMessage(''); }; var onStartChat = /*#__PURE__*/function () { var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() { var timeoutPromise, testPromise, result, success, service, _errorMessage; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: setIsRunning(true); _context.prev = 1; timeoutPromise = new Promise(function (_, reject) { setTimeout(function () { return reject(new Error('Connection timeout after 15 seconds')); }, 15000); }); testPromise = (0, _core.testApiKey)({ modelProvider: provider, modelName: model, apiKey: apiKey, baseUrl: baseUrl }); _context.next = 6; return Promise.race([testPromise, timeoutPromise]); case 6: result = _context.sent; success = result.success, service = result.service; _errorMessage = !success ? service === 'ollama' ? 'Connection failed: maybe invalid Ollama Base URL' : 'Connection failed: maybe invalid API Key' : ''; setConnectionError(!success); setErrorMessage(_errorMessage); updateAiAssistantConfig({ provider: provider, model: model, apiKey: apiKey, baseUrl: baseUrl, isReady: success, temperature: temperature, topP: topP }); _context.next = 18; break; case 14: _context.prev = 14; _context.t0 = _context["catch"](1); setConnectionError(true); setErrorMessage(_context.t0 instanceof Error ? _context.t0.message : 'Connection failed'); case 18: _context.prev = 18; setIsRunning(false); return _context.finish(18); case 21: case "end": return _context.stop(); } }, _callee, null, [[1, 14, 18, 21]]); })); return function onStartChat() { return _ref2.apply(this, arguments); }; }(); return /*#__PURE__*/_react["default"].createElement(StyledAiAssistantConfig, { className: "ai-assistant-config__type" }, /*#__PURE__*/_react["default"].createElement(_components.PanelLabelWrapper, null, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, intl.formatMessage({ id: 'aiAssistantManager.aiProvider.title', defaultMessage: 'Select AI Provider' }))), /*#__PURE__*/_react["default"].createElement(StyledWrapper, null, /*#__PURE__*/_react["default"].createElement(StyledItemSelector, { selectedItems: provider, options: Object.keys(_models["default"]), multiSelect: false, disabled: false, placeholder: "aiAssistantManager.aiProvider", onChange: onAiProviderSelect, filterOption: "name", getOptionValue: function getOptionValue(op) { return op; }, displayOption: function displayOption(op) { return op; }, searchable: false, showArrow: true })), /*#__PURE__*/_react["default"].createElement(_components.PanelLabelWrapper, null, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, intl.formatMessage({ id: 'aiAssistantManager.llmModel.title', defaultMessage: 'Select LLM Model' }))), /*#__PURE__*/_react["default"].createElement(StyledWrapper, null, /*#__PURE__*/_react["default"].createElement(StyledItemSelector, { selectedItems: model, options: _models["default"][provider], multiSelect: false, disabled: false, placeholder: "aiAssistantManager.llmModel.placeholder", onChange: onLLMModelSelect, filterOption: "name", getOptionValue: function getOptionValue(op) { return op; }, displayOption: function displayOption(op) { return op; }, searchable: false, showArrow: true })), provider !== 'ollama' ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_components.PanelLabelWrapper, null, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, intl.formatMessage({ id: 'aiAssistantManager.apiKey.title', defaultMessage: 'Enter API Key' }))), /*#__PURE__*/_react["default"].createElement("div", { className: "api-key-input" }, /*#__PURE__*/_react["default"].createElement("div", { className: "api-key-input__icon" }, /*#__PURE__*/_react["default"].createElement(_apiKey["default"], { height: "20px" })), /*#__PURE__*/_react["default"].createElement(_components.Input, { type: "text", onChange: onApiKeyChange, placeholder: intl.formatMessage({ id: 'aiAssistantManager.apiKey.placeholder', defaultMessage: 'Enter your API Key' }), value: apiKey }))) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_components.PanelLabelWrapper, null, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, intl.formatMessage({ id: 'aiAssistantManager.baseUrl.title', defaultMessage: 'Ollama Base URL' }))), /*#__PURE__*/_react["default"].createElement("div", { className: "api-key-input" }, /*#__PURE__*/_react["default"].createElement("div", { className: "api-key-input__icon" }, /*#__PURE__*/_react["default"].createElement(_apiKey["default"], { height: "20px" })), /*#__PURE__*/_react["default"].createElement(_components.Input, { type: "text", onChange: onBaseUrlChange, placeholder: intl.formatMessage({ id: 'aiAssistantManager.baseUrl.placeholder', defaultMessage: 'Enter Ollama Base URL' }), value: baseUrl }))), connectionError && /*#__PURE__*/_react["default"].createElement(StyleErrorMessage, { className: "error-message" }, errorMessage), /*#__PURE__*/_react["default"].createElement(_components.PanelLabelWrapper, null, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, intl.formatMessage({ id: 'aiAssistantManager.temperature.title', defaultMessage: 'Temperature' }))), /*#__PURE__*/_react["default"].createElement(StyleSliderWrapper, null, /*#__PURE__*/_react["default"].createElement(RangeSlider, { showInput: true, isRanged: false, value0: 0, value1: temperature, onChange: onTemperatureChange, range: [0, 2], step: 0.1 })), /*#__PURE__*/_react["default"].createElement(_components.PanelLabelWrapper, null, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, intl.formatMessage({ id: 'aiAssistantManager.topP.title', defaultMessage: 'Top P' }))), /*#__PURE__*/_react["default"].createElement(StyleSliderWrapper, null, /*#__PURE__*/_react["default"].createElement(RangeSlider, { showInput: true, isRanged: false, value0: 0, value1: topP, onChange: onTopPChange, range: [0, 1], step: 0.1 })), /*#__PURE__*/_react["default"].createElement(StyledButton, null, /*#__PURE__*/_react["default"].createElement(_components.Button, { onClick: onStartChat, width: '100%' }, isRunning && /*#__PURE__*/_react["default"].createElement(_components.LoadingSpinner, { size: 12 }), intl.formatMessage({ id: 'aiAssistantManager.startChat', defaultMessage: "Let's Chat" })))); }; return (0, _styledComponents.withTheme)((0, _reactIntl.injectIntl)(AiAssistantConfig)); } var _default = exports["default"] = AiAssistantConfigFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9yZWFjdEludGwiLCJfY29tcG9uZW50cyIsIl9hcGlLZXkiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2NvcmUiLCJfbW9kZWxzIiwiX3VzZWhvb2tzVHMiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl90ZW1wbGF0ZU9iamVjdDQiLCJfdGVtcGxhdGVPYmplY3Q1IiwiX3RlbXBsYXRlT2JqZWN0NiIsIl90ZW1wbGF0ZU9iamVjdDciLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJTZWN0aW9uVGl0bGUiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsInByb3BzIiwidGhlbWUiLCJpbnB1dEZvbnRTaXplIiwiZWZmZWN0UGFuZWxUZXh0U2Vjb25kYXJ5MSIsIlN0eWxlZEFpQXNzaXN0YW50Q29uZmlnIiwicHJpbWFyeUJ0bkZvbnRTaXplRGVmYXVsdCIsImJveFNoYWRvdyIsImdlb2NvZGVySW5wdXRIZWlnaHQiLCJzdWJ0ZXh0Q29sb3IiLCJTdHlsZWRXcmFwcGVyIiwiU3R5bGVkSXRlbVNlbGVjdG9yIiwiSXRlbVNlbGVjdG9yIiwiYWN0aXZlQ29sb3IiLCJTdHlsZVNsaWRlcldyYXBwZXIiLCJTdHlsZWRCdXR0b24iLCJTdHlsZUVycm9yTWVzc2FnZSIsImVycm9yQ29sb3IiLCJlcnJvclRleHRDb2xvciIsIkFpQXNzaXN0YW50Q29uZmlnRmFjdG9yeSIsImRlcHMiLCJSYW5nZVNsaWRlckZhY3RvcnkiLCJSYW5nZVNsaWRlciIsIkFpQXNzaXN0YW50Q29uZmlnIiwiX3JlZiIsImludGwiLCJhaUFzc2lzdGFudENvbmZpZyIsInVwZGF0ZUFpQXNzaXN0YW50Q29uZmlnIiwiX3VzZUxvY2FsU3RvcmFnZSIsInVzZUxvY2FsU3RvcmFnZSIsInByb3ZpZGVyIiwiX3VzZUxvY2FsU3RvcmFnZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJzZXRQcm92aWRlciIsIl91c2VMb2NhbFN0b3JhZ2UzIiwibW9kZWwiLCJQUk9WSURFUl9NT0RFTFMiLCJfdXNlTG9jYWxTdG9yYWdlNCIsInNldE1vZGVsIiwiX3VzZUxvY2FsU3RvcmFnZTUiLCJhcGlLZXkiLCJfdXNlTG9jYWxTdG9yYWdlNiIsInNldEFwaUtleSIsIl91c2VMb2NhbFN0b3JhZ2U3IiwidGVtcGVyYXR1cmUiLCJfdXNlTG9jYWxTdG9yYWdlOCIsInNldFRlbXBlcmF0dXJlIiwiX3VzZUxvY2FsU3RvcmFnZTkiLCJ0b3BQIiwiX3VzZUxvY2FsU3RvcmFnZTEwIiwic2V0VG9wUCIsIl91c2VMb2NhbFN0b3JhZ2UxMSIsImJhc2VVcmwiLCJfdXNlTG9jYWxTdG9yYWdlMTIiLCJzZXRCYXNlVXJsIiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiY29ubmVjdGlvbkVycm9yIiwic2V0Q29ubmVjdGlvbkVycm9yIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJlcnJvck1lc3NhZ2UiLCJzZXRFcnJvck1lc3NhZ2UiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImlzUnVubmluZyIsInNldElzUnVubmluZyIsIm9uQWlQcm92aWRlclNlbGVjdCIsInZhbHVlIiwib25MTE1Nb2RlbFNlbGVjdCIsIm9uQXBpS2V5Q2hhbmdlIiwidGFyZ2V0Iiwib25UZW1wZXJhdHVyZUNoYW5nZSIsIm9uVG9wUENoYW5nZSIsIm9uQmFzZVVybENoYW5nZSIsIm9uU3RhcnRDaGF0IiwiX3JlZjIiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsInRpbWVvdXRQcm9taXNlIiwidGVzdFByb21pc2UiLCJyZXN1bHQiLCJzdWNjZXNzIiwic2VydmljZSIsIl9lcnJvck1lc3NhZ2UiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiUHJvbWlzZSIsIl8iLCJyZWplY3QiLCJzZXRUaW1lb3V0IiwiRXJyb3IiLCJ0ZXN0QXBpS2V5IiwibW9kZWxQcm92aWRlciIsIm1vZGVsTmFtZSIsInJhY2UiLCJzZW50IiwiaXNSZWFkeSIsInQwIiwibWVzc2FnZSIsImZpbmlzaCIsInN0b3AiLCJhcHBseSIsImFyZ3VtZW50cyIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJQYW5lbExhYmVsV3JhcHBlciIsImZvcm1hdE1lc3NhZ2UiLCJpZCIsImRlZmF1bHRNZXNzYWdlIiwic2VsZWN0ZWRJdGVtcyIsIm9wdGlvbnMiLCJrZXlzIiwibXVsdGlTZWxlY3QiLCJkaXNhYmxlZCIsInBsYWNlaG9sZGVyIiwib25DaGFuZ2UiLCJmaWx0ZXJPcHRpb24iLCJnZXRPcHRpb25WYWx1ZSIsIm9wIiwiZGlzcGxheU9wdGlvbiIsInNlYXJjaGFibGUiLCJzaG93QXJyb3ciLCJGcmFnbWVudCIsImhlaWdodCIsIklucHV0IiwidHlwZSIsInNob3dJbnB1dCIsImlzUmFuZ2VkIiwidmFsdWUwIiwidmFsdWUxIiwicmFuZ2UiLCJzdGVwIiwiQnV0dG9uIiwib25DbGljayIsIndpZHRoIiwiTG9hZGluZ1NwaW5uZXIiLCJzaXplIiwid2l0aFRoZW1lIiwiaW5qZWN0SW50bCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL2FpLWFzc2lzdGFudC1jb25maWcudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkLCB7d2l0aFRoZW1lfSBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge2luamVjdEludGwsIFdyYXBwZWRDb21wb25lbnRQcm9wc30gZnJvbSAncmVhY3QtaW50bCc7XG5pbXBvcnQge1xuICBJbnB1dCxcbiAgUGFuZWxMYWJlbFdyYXBwZXIsXG4gIEl0ZW1TZWxlY3RvcixcbiAgUmFuZ2VTbGlkZXJGYWN0b3J5LFxuICBCdXR0b24sXG4gIExvYWRpbmdTcGlubmVyXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29tcG9uZW50cyc7XG5pbXBvcnQge0FpQXNzaXN0YW50Q29uZmlnfSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgQXBpS2V5IGZyb20gJy4uL2ljb25zL2FwaS1rZXknO1xuaW1wb3J0IHt0ZXN0QXBpS2V5fSBmcm9tICdAb3BlbmFzc2lzdGFudC9jb3JlJztcbmltcG9ydCBQUk9WSURFUl9NT0RFTFMgZnJvbSAnLi4vY29uZmlnL21vZGVscy5qc29uJztcbmltcG9ydCB7dXNlTG9jYWxTdG9yYWdlfSBmcm9tICd1c2Vob29rcy10cyc7XG5cbnR5cGUgVGhlbWVQcm9wcyA9IHt0aGVtZTogYW55fTtcblxuZXhwb3J0IHR5cGUgQWlBc3Npc3RhbnRDb25maWdQcm9wcyA9IHtcbiAgYWlBc3Npc3RhbnRDb25maWc6IEFpQXNzaXN0YW50Q29uZmlnO1xuICB1cGRhdGVBaUFzc2lzdGFudENvbmZpZzogKGFpQXNzaXN0YW50Q29uZmlnOiBBaUFzc2lzdGFudENvbmZpZykgPT4gdm9pZDtcbn07XG5cbmNvbnN0IFNlY3Rpb25UaXRsZSA9IHN0eWxlZC5kaXZgXG4gIGZvbnQtc2l6ZTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5pbnB1dEZvbnRTaXplfTtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZWZmZWN0UGFuZWxUZXh0U2Vjb25kYXJ5MX07XG4gIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xuYDtcblxuY29uc3QgU3R5bGVkQWlBc3Npc3RhbnRDb25maWcgPSBzdHlsZWQuZGl2YFxuICBwYWRkaW5nOiAxMnB4O1xuICBmb250LXNpemU6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucHJpbWFyeUJ0bkZvbnRTaXplRGVmYXVsdH07XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMTJweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcblxuICAuYXBpLWtleS1pbnB1dCB7XG4gICAgYm94LXNoYWRvdzogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5ib3hTaGFkb3d9O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIC5hcGkta2V5LWlucHV0X19pY29uIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGhlaWdodDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5nZW9jb2RlcklucHV0SGVpZ2h0fXB4O1xuICAgICAgd2lkdGg6IDMwcHg7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDZweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zdWJ0ZXh0Q29sb3J9O1xuICAgIH1cblxuICAgIGlucHV0IHtcbiAgICAgIHBhZGRpbmc6IDRweCAzNnB4O1xuICAgICAgaGVpZ2h0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmdlb2NvZGVySW5wdXRIZWlnaHR9cHg7XG4gICAgICBjYXJldC1jb2xvcjogdW5zZXQ7XG4gICAgfVxuICB9XG5gO1xuXG5jb25zdCBTdHlsZWRXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuYDtcblxuY29uc3QgU3R5bGVkSXRlbVNlbGVjdG9yID0gc3R5bGVkKEl0ZW1TZWxlY3RvcilgXG4gIC5pdGVtLXNlbGVjdG9yX19kcm9wZG93biB7XG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgfVxuICAuYWN0aXZlIHtcbiAgICBib3JkZXItY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuYWN0aXZlQ29sb3J9O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweCA0cHggMHB4IDBweCAhaW1wb3J0YW50O1xuICB9XG4gIHdpZHRoOiAxMDAlO1xuYDtcblxuY29uc3QgU3R5bGVTbGlkZXJXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgd2lkdGg6IDEwMCU7XG4gIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7XG4gIGhlaWdodDogMzJweDtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgLmtnLXJhbmdlLXNsaWRlcl9faW5wdXQge1xuICAgIGhlaWdodDogMzJweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgcGFkZGluZzogM3B4IDZweDtcbiAgfVxuICAua2ctc2xpZGVyIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDZweDtcbiAgfVxuICAua2ctcmFuZ2Utc2xpZGVyIHtcbiAgICBwYWRkaW5nOiAwcHggIWltcG9ydGFudDtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkQnV0dG9uID0gc3R5bGVkLmRpdmBcbiAgd2lkdGg6IDEwMCU7XG4gIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7XG4gIG1hcmdpbi10b3A6IDEycHg7XG5cbiAgYnV0dG9uIGRpdiB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGdhcDogNHB4O1xuICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICB9XG5gO1xuXG5jb25zdCBTdHlsZUVycm9yTWVzc2FnZSA9IHN0eWxlZC5kaXZgXG4gIGZvbnQtc2l6ZTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wcmltYXJ5QnRuRm9udFNpemVEZWZhdWx0fTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5lcnJvckNvbG9yfTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBwYWRkaW5nOiA0cHggOHB4O1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5lcnJvclRleHRDb2xvcn07XG5gO1xuXG5BaUFzc2lzdGFudENvbmZpZ0ZhY3RvcnkuZGVwcyA9IFtSYW5nZVNsaWRlckZhY3RvcnldO1xuXG5mdW5jdGlvbiBBaUFzc2lzdGFudENvbmZpZ0ZhY3RvcnkoUmFuZ2VTbGlkZXI6IFJldHVyblR5cGU8dHlwZW9mIFJhbmdlU2xpZGVyRmFjdG9yeT4pIHtcbiAgY29uc3QgQWlBc3Npc3RhbnRDb25maWc6IFJlYWN0LkZDPFxuICAgIEFpQXNzaXN0YW50Q29uZmlnUHJvcHMgJiBXcmFwcGVkQ29tcG9uZW50UHJvcHMgJiBUaGVtZVByb3BzXG4gID4gPSAoe2ludGwsIGFpQXNzaXN0YW50Q29uZmlnLCB1cGRhdGVBaUFzc2lzdGFudENvbmZpZ30pID0+IHtcbiAgICBjb25zdCBbcHJvdmlkZXIsIHNldFByb3ZpZGVyXSA9IHVzZUxvY2FsU3RvcmFnZShcbiAgICAgICdhaS1hc3Npc3RhbnQtcHJvdmlkZXInLFxuICAgICAgYWlBc3Npc3RhbnRDb25maWcucHJvdmlkZXIgfHwgJ29wZW5haSdcbiAgICApO1xuICAgIGNvbnN0IFttb2RlbCwgc2V0TW9kZWxdID0gdXNlTG9jYWxTdG9yYWdlKFxuICAgICAgJ2FpLWFzc2lzdGFudC1tb2RlbCcsXG4gICAgICBhaUFzc2lzdGFudENvbmZpZy5tb2RlbCB8fCBQUk9WSURFUl9NT0RFTFNbcHJvdmlkZXJdWzBdXG4gICAgKTtcbiAgICBjb25zdCBbYXBpS2V5LCBzZXRBcGlLZXldID0gdXNlTG9jYWxTdG9yYWdlKFxuICAgICAgJ2FpLWFzc2lzdGFudC1hcGkta2V5JyxcbiAgICAgIGFpQXNzaXN0YW50Q29uZmlnLmFwaUtleSB8fCAnJ1xuICAgICk7XG4gICAgY29uc3QgW3RlbXBlcmF0dXJlLCBzZXRUZW1wZXJhdHVyZV0gPSB1c2VMb2NhbFN0b3JhZ2UoXG4gICAgICAnYWktYXNzaXN0YW50LXRlbXBlcmF0dXJlJyxcbiAgICAgIGFpQXNzaXN0YW50Q29uZmlnLnRlbXBlcmF0dXJlIHx8IDAuOFxuICAgICk7XG4gICAgY29uc3QgW3RvcFAsIHNldFRvcFBdID0gdXNlTG9jYWxTdG9yYWdlKCdhaS1hc3Npc3RhbnQtdG9wLXAnLCBhaUFzc2lzdGFudENvbmZpZy50b3BQIHx8IDAuOCk7XG4gICAgY29uc3QgW2Jhc2VVcmwsIHNldEJhc2VVcmxdID0gdXNlTG9jYWxTdG9yYWdlKFxuICAgICAgJ2FpLWFzc2lzdGFudC1iYXNlLXVybCcsXG4gICAgICBhaUFzc2lzdGFudENvbmZpZy5iYXNlVXJsIHx8ICdodHRwOi8vbG9jYWxob3N0OjExNDM0J1xuICAgICk7XG4gICAgY29uc3QgW2Nvbm5lY3Rpb25FcnJvciwgc2V0Q29ubmVjdGlvbkVycm9yXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbZXJyb3JNZXNzYWdlLCBzZXRFcnJvck1lc3NhZ2VdID0gdXNlU3RhdGUoJycpO1xuICAgIGNvbnN0IFtpc1J1bm5pbmcsIHNldElzUnVubmluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgICBjb25zdCBvbkFpUHJvdmlkZXJTZWxlY3QgPSAodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBvYmplY3QgfCBudWxsKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBzZXRQcm92aWRlcih2YWx1ZSk7XG4gICAgICAgIHNldE1vZGVsKFBST1ZJREVSX01PREVMU1t2YWx1ZV1bMF0pO1xuICAgICAgICBzZXRDb25uZWN0aW9uRXJyb3IoZmFsc2UpO1xuICAgICAgICBzZXRFcnJvck1lc3NhZ2UoJycpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvbkxMTU1vZGVsU2VsZWN0ID0gKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgb2JqZWN0IHwgbnVsbCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc2V0TW9kZWwodmFsdWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvbkFwaUtleUNoYW5nZSA9IChlOiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgc2V0QXBpS2V5KGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgIC8vIHJlc2V0IHByZXZpb3VzIGtleSBlcnJvciBpZiBhbnlcbiAgICAgIHNldENvbm5lY3Rpb25FcnJvcihmYWxzZSk7XG4gICAgICBzZXRFcnJvck1lc3NhZ2UoJycpO1xuICAgIH07XG5cbiAgICBjb25zdCBvblRlbXBlcmF0dXJlQ2hhbmdlID0gKHZhbHVlOiBudW1iZXJbXSkgPT4ge1xuICAgICAgc2V0VGVtcGVyYXR1cmUodmFsdWVbMV0pO1xuICAgIH07XG5cbiAgICBjb25zdCBvblRvcFBDaGFuZ2UgPSAodmFsdWU6IG51bWJlcltdKSA9PiB7XG4gICAgICBzZXRUb3BQKHZhbHVlWzFdKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25CYXNlVXJsQ2hhbmdlID0gKGU6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBzZXRCYXNlVXJsKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgIHNldENvbm5lY3Rpb25FcnJvcihmYWxzZSk7XG4gICAgICBzZXRFcnJvck1lc3NhZ2UoJycpO1xuICAgIH07XG5cbiAgICBjb25zdCBvblN0YXJ0Q2hhdCA9IGFzeW5jICgpID0+IHtcbiAgICAgIHNldElzUnVubmluZyh0cnVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignQ29ubmVjdGlvbiB0aW1lb3V0IGFmdGVyIDE1IHNlY29uZHMnKSksIDE1MDAwKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdGVzdFByb21pc2UgPSB0ZXN0QXBpS2V5KHtcbiAgICAgICAgICBtb2RlbFByb3ZpZGVyOiBwcm92aWRlcixcbiAgICAgICAgICBtb2RlbE5hbWU6IG1vZGVsLFxuICAgICAgICAgIGFwaUtleTogYXBpS2V5LFxuICAgICAgICAgIGJhc2VVcmw6IGJhc2VVcmxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IFByb21pc2UucmFjZShbdGVzdFByb21pc2UsIHRpbWVvdXRQcm9taXNlXSkpIGFzIHtcbiAgICAgICAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgICAgICAgIHNlcnZpY2U6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qge3N1Y2Nlc3MsIHNlcnZpY2V9ID0gcmVzdWx0O1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAhc3VjY2Vzc1xuICAgICAgICAgID8gc2VydmljZSA9PT0gJ29sbGFtYSdcbiAgICAgICAgICAgID8gJ0Nvbm5lY3Rpb24gZmFpbGVkOiBtYXliZSBpbnZhbGlkIE9sbGFtYSBCYXNlIFVSTCdcbiAgICAgICAgICAgIDogJ0Nvbm5lY3Rpb24gZmFpbGVkOiBtYXliZSBpbnZhbGlkIEFQSSBLZXknXG4gICAgICAgICAgOiAnJztcbiAgICAgICAgc2V0Q29ubmVjdGlvbkVycm9yKCFzdWNjZXNzKTtcbiAgICAgICAgc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7XG4gICAgICAgIHVwZGF0ZUFpQXNzaXN0YW50Q29uZmlnKHtcbiAgICAgICAgICBwcm92aWRlcjogcHJvdmlkZXIsXG4gICAgICAgICAgbW9kZWw6IG1vZGVsLFxuICAgICAgICAgIGFwaUtleTogYXBpS2V5LFxuICAgICAgICAgIGJhc2VVcmw6IGJhc2VVcmwsXG4gICAgICAgICAgaXNSZWFkeTogc3VjY2VzcyxcbiAgICAgICAgICB0ZW1wZXJhdHVyZTogdGVtcGVyYXR1cmUsXG4gICAgICAgICAgdG9wUDogdG9wUFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNldENvbm5lY3Rpb25FcnJvcih0cnVlKTtcbiAgICAgICAgc2V0RXJyb3JNZXNzYWdlKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0Nvbm5lY3Rpb24gZmFpbGVkJyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1J1bm5pbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZEFpQXNzaXN0YW50Q29uZmlnIGNsYXNzTmFtZT1cImFpLWFzc2lzdGFudC1jb25maWdfX3R5cGVcIj5cbiAgICAgICAgPFBhbmVsTGFiZWxXcmFwcGVyPlxuICAgICAgICAgIDxTZWN0aW9uVGl0bGU+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKHtcbiAgICAgICAgICAgICAgaWQ6ICdhaUFzc2lzdGFudE1hbmFnZXIuYWlQcm92aWRlci50aXRsZScsXG4gICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnU2VsZWN0IEFJIFByb3ZpZGVyJ1xuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPC9TZWN0aW9uVGl0bGU+XG4gICAgICAgIDwvUGFuZWxMYWJlbFdyYXBwZXI+XG4gICAgICAgIDxTdHlsZWRXcmFwcGVyPlxuICAgICAgICAgIDxTdHlsZWRJdGVtU2VsZWN0b3JcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXM9e3Byb3ZpZGVyfVxuICAgICAgICAgICAgb3B0aW9ucz17T2JqZWN0LmtleXMoUFJPVklERVJfTU9ERUxTKX1cbiAgICAgICAgICAgIG11bHRpU2VsZWN0PXtmYWxzZX1cbiAgICAgICAgICAgIGRpc2FibGVkPXtmYWxzZX1cbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiYWlBc3Npc3RhbnRNYW5hZ2VyLmFpUHJvdmlkZXJcIlxuICAgICAgICAgICAgb25DaGFuZ2U9e29uQWlQcm92aWRlclNlbGVjdH1cbiAgICAgICAgICAgIGZpbHRlck9wdGlvbj1cIm5hbWVcIlxuICAgICAgICAgICAgZ2V0T3B0aW9uVmFsdWU9e29wID0+IG9wfVxuICAgICAgICAgICAgZGlzcGxheU9wdGlvbj17b3AgPT4gb3B9XG4gICAgICAgICAgICBzZWFyY2hhYmxlPXtmYWxzZX1cbiAgICAgICAgICAgIHNob3dBcnJvdz17dHJ1ZX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L1N0eWxlZFdyYXBwZXI+XG4gICAgICAgIDxQYW5lbExhYmVsV3JhcHBlcj5cbiAgICAgICAgICA8U2VjdGlvblRpdGxlPlxuICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIGlkOiAnYWlBc3Npc3RhbnRNYW5hZ2VyLmxsbU1vZGVsLnRpdGxlJyxcbiAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdTZWxlY3QgTExNIE1vZGVsJ1xuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPC9TZWN0aW9uVGl0bGU+XG4gICAgICAgIDwvUGFuZWxMYWJlbFdyYXBwZXI+XG4gICAgICAgIDxTdHlsZWRXcmFwcGVyPlxuICAgICAgICAgIDxTdHlsZWRJdGVtU2VsZWN0b3JcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXM9e21vZGVsfVxuICAgICAgICAgICAgb3B0aW9ucz17UFJPVklERVJfTU9ERUxTW3Byb3ZpZGVyXX1cbiAgICAgICAgICAgIG11bHRpU2VsZWN0PXtmYWxzZX1cbiAgICAgICAgICAgIGRpc2FibGVkPXtmYWxzZX1cbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiYWlBc3Npc3RhbnRNYW5hZ2VyLmxsbU1vZGVsLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgIG9uQ2hhbmdlPXtvbkxMTU1vZGVsU2VsZWN0fVxuICAgICAgICAgICAgZmlsdGVyT3B0aW9uPVwibmFtZVwiXG4gICAgICAgICAgICBnZXRPcHRpb25WYWx1ZT17b3AgPT4gb3B9XG4gICAgICAgICAgICBkaXNwbGF5T3B0aW9uPXtvcCA9PiBvcH1cbiAgICAgICAgICAgIHNlYXJjaGFibGU9e2ZhbHNlfVxuICAgICAgICAgICAgc2hvd0Fycm93PXt0cnVlfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvU3R5bGVkV3JhcHBlcj5cbiAgICAgICAge3Byb3ZpZGVyICE9PSAnb2xsYW1hJyA/IChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPFBhbmVsTGFiZWxXcmFwcGVyPlxuICAgICAgICAgICAgICA8U2VjdGlvblRpdGxlPlxuICAgICAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgaWQ6ICdhaUFzc2lzdGFudE1hbmFnZXIuYXBpS2V5LnRpdGxlJyxcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnRW50ZXIgQVBJIEtleSdcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9TZWN0aW9uVGl0bGU+XG4gICAgICAgICAgICA8L1BhbmVsTGFiZWxXcmFwcGVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhcGkta2V5LWlucHV0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYXBpLWtleS1pbnB1dF9faWNvblwiPlxuICAgICAgICAgICAgICAgIDxBcGlLZXkgaGVpZ2h0PVwiMjBweFwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e29uQXBpS2V5Q2hhbmdlfVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtpbnRsLmZvcm1hdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgaWQ6ICdhaUFzc2lzdGFudE1hbmFnZXIuYXBpS2V5LnBsYWNlaG9sZGVyJyxcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnRW50ZXIgeW91ciBBUEkgS2V5J1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgIHZhbHVlPXthcGlLZXl9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8Lz5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPFBhbmVsTGFiZWxXcmFwcGVyPlxuICAgICAgICAgICAgICA8U2VjdGlvblRpdGxlPlxuICAgICAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgaWQ6ICdhaUFzc2lzdGFudE1hbmFnZXIuYmFzZVVybC50aXRsZScsXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ09sbGFtYSBCYXNlIFVSTCdcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9TZWN0aW9uVGl0bGU+XG4gICAgICAgICAgICA8L1BhbmVsTGFiZWxXcmFwcGVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhcGkta2V5LWlucHV0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYXBpLWtleS1pbnB1dF9faWNvblwiPlxuICAgICAgICAgICAgICAgIDxBcGlLZXkgaGVpZ2h0PVwiMjBweFwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e29uQmFzZVVybENoYW5nZX1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17aW50bC5mb3JtYXRNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgIGlkOiAnYWlBc3Npc3RhbnRNYW5hZ2VyLmJhc2VVcmwucGxhY2Vob2xkZXInLFxuICAgICAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdFbnRlciBPbGxhbWEgQmFzZSBVUkwnXG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgdmFsdWU9e2Jhc2VVcmx9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8Lz5cbiAgICAgICAgKX1cbiAgICAgICAge2Nvbm5lY3Rpb25FcnJvciAmJiAoXG4gICAgICAgICAgPFN0eWxlRXJyb3JNZXNzYWdlIGNsYXNzTmFtZT1cImVycm9yLW1lc3NhZ2VcIj57ZXJyb3JNZXNzYWdlfTwvU3R5bGVFcnJvck1lc3NhZ2U+XG4gICAgICAgICl9XG4gICAgICAgIDxQYW5lbExhYmVsV3JhcHBlcj5cbiAgICAgICAgICA8U2VjdGlvblRpdGxlPlxuICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIGlkOiAnYWlBc3Npc3RhbnRNYW5hZ2VyLnRlbXBlcmF0dXJlLnRpdGxlJyxcbiAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdUZW1wZXJhdHVyZSdcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvU2VjdGlvblRpdGxlPlxuICAgICAgICA8L1BhbmVsTGFiZWxXcmFwcGVyPlxuICAgICAgICA8U3R5bGVTbGlkZXJXcmFwcGVyPlxuICAgICAgICAgIDxSYW5nZVNsaWRlclxuICAgICAgICAgICAgc2hvd0lucHV0PXt0cnVlfVxuICAgICAgICAgICAgaXNSYW5nZWQ9e2ZhbHNlfVxuICAgICAgICAgICAgdmFsdWUwPXswfVxuICAgICAgICAgICAgdmFsdWUxPXt0ZW1wZXJhdHVyZX1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtvblRlbXBlcmF0dXJlQ2hhbmdlfVxuICAgICAgICAgICAgcmFuZ2U9e1swLCAyXX1cbiAgICAgICAgICAgIHN0ZXA9ezAuMX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L1N0eWxlU2xpZGVyV3JhcHBlcj5cbiAgICAgICAgPFBhbmVsTGFiZWxXcmFwcGVyPlxuICAgICAgICAgIDxTZWN0aW9uVGl0bGU+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKHtcbiAgICAgICAgICAgICAgaWQ6ICdhaUFzc2lzdGFudE1hbmFnZXIudG9wUC50aXRsZScsXG4gICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnVG9wIFAnXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L1NlY3Rpb25UaXRsZT5cbiAgICAgICAgPC9QYW5lbExhYmVsV3JhcHBlcj5cbiAgICAgICAgPFN0eWxlU2xpZGVyV3JhcHBlcj5cbiAgICAgICAgICA8UmFuZ2VTbGlkZXJcbiAgICAgICAgICAgIHNob3dJbnB1dD17dHJ1ZX1cbiAgICAgICAgICAgIGlzUmFuZ2VkPXtmYWxzZX1cbiAgICAgICAgICAgIHZhbHVlMD17MH1cbiAgICAgICAgICAgIHZhbHVlMT17dG9wUH1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtvblRvcFBDaGFuZ2V9XG4gICAgICAgICAgICByYW5nZT17WzAsIDFdfVxuICAgICAgICAgICAgc3RlcD17MC4xfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvU3R5bGVTbGlkZXJXcmFwcGVyPlxuICAgICAgICA8U3R5bGVkQnV0dG9uPlxuICAgICAgICAgIDxCdXR0b24gb25DbGljaz17b25TdGFydENoYXR9IHdpZHRoPXsnMTAwJSd9PlxuICAgICAgICAgICAge2lzUnVubmluZyAmJiA8TG9hZGluZ1NwaW5uZXIgc2l6ZT17MTJ9IC8+fVxuICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIGlkOiAnYWlBc3Npc3RhbnRNYW5hZ2VyLnN0YXJ0Q2hhdCcsXG4gICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiBcIkxldCdzIENoYXRcIlxuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgIDwvU3R5bGVkQnV0dG9uPlxuICAgICAgPC9TdHlsZWRBaUFzc2lzdGFudENvbmZpZz5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiB3aXRoVGhlbWUoaW5qZWN0SW50bChBaUFzc2lzdGFudENvbmZpZykpIGFzIFJlYWN0LkZDPEFpQXNzaXN0YW50Q29uZmlnUHJvcHM+O1xufVxuXG5leHBvcnQgZGVmYXVsdCBBaUFzc2lzdGFudENvbmZpZ0ZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFGLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxVQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxXQUFBLEdBQUFILE9BQUE7QUFTQSxJQUFBSSxPQUFBLEdBQUFDLHNCQUFBLENBQUFMLE9BQUE7QUFDQSxJQUFBTSxLQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxPQUFBLEdBQUFGLHNCQUFBLENBQUFMLE9BQUE7QUFDQSxJQUFBUSxXQUFBLEdBQUFSLE9BQUE7QUFBNEMsSUFBQVMsZUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQWxCNUM7QUFDQTtBQUFBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBbEIsd0JBQUFrQixDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLE9BQUEsQ0FBQUwsQ0FBQSwwQkFBQUEs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