UNPKG

matrix-react-sdk

Version:
187 lines (183 loc) 29.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.AutocompleteInput = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _icons = require("@vector-im/compound-design-tokens/assets/web/icons"); var _Keyboard = require("../../Keyboard"); var _AccessibleButton = _interopRequireDefault(require("../../components/views/elements/AccessibleButton")); var _useFocus = _interopRequireDefault(require("../../hooks/useFocus")); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (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; } /* Copyright 2024 New Vector Ltd. Copyright 2022 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const AutocompleteInput = ({ provider, renderSuggestion, renderSelection, maxSuggestions = 5, placeholder, onSelectionChange, selection, additionalFilter }) => { const [query, setQuery] = (0, _react.useState)(""); const [suggestions, setSuggestions] = (0, _react.useState)([]); const [isFocused, onFocusChangeHandlerFunctions] = (0, _useFocus.default)(); const editorContainerRef = (0, _react.useRef)(null); const editorRef = (0, _react.useRef)(null); const focusEditor = () => { editorRef?.current?.focus(); }; const onQueryChange = async e => { const value = e.target.value.trim(); setQuery(value); let matches = await provider.getCompletions(query, { start: query.length, end: query.length }, true, maxSuggestions); if (additionalFilter) { matches = matches.filter(additionalFilter); } setSuggestions(matches); }; const onClickInputArea = () => { focusEditor(); }; const onKeyDown = e => { const hasModifiers = e.ctrlKey || e.shiftKey || e.metaKey; // when the field is empty and the user hits backspace remove the right-most target if (!query && selection.length > 0 && e.key === _Keyboard.Key.BACKSPACE && !hasModifiers) { removeSelection(selection[selection.length - 1]); } }; const toggleSelection = completion => { const newSelection = [...selection]; const index = selection.findIndex(selection => selection.completionId === completion.completionId); if (index >= 0) { newSelection.splice(index, 1); } else { newSelection.push(completion); } onSelectionChange(newSelection); focusEditor(); setQuery(""); setSuggestions([]); }; const removeSelection = completion => { const newSelection = [...selection]; const index = selection.findIndex(selection => selection.completionId === completion.completionId); if (index >= 0) { newSelection.splice(index, 1); onSelectionChange(newSelection); } }; const hasPlaceholder = () => selection.length === 0 && query.length === 0; return /*#__PURE__*/_react.default.createElement("div", { className: "mx_AutocompleteInput" }, /*#__PURE__*/_react.default.createElement("div", { ref: editorContainerRef, className: (0, _classnames.default)({ "mx_AutocompleteInput_editor": true, "mx_AutocompleteInput_editor--focused": isFocused, "mx_AutocompleteInput_editor--has-suggestions": suggestions.length > 0 }), onClick: onClickInputArea, "data-testid": "autocomplete-editor" }, /*#__PURE__*/_react.default.createElement(_icons.SearchIcon, { className: "mx_AutocompleteInput_search_icon", width: "18px", height: "18px" }), selection.map(item => /*#__PURE__*/_react.default.createElement(SelectionItem, { key: item.completionId, item: item, onClick: removeSelection, render: renderSelection })), /*#__PURE__*/_react.default.createElement("input", (0, _extends2.default)({ ref: editorRef, type: "text", onKeyDown: onKeyDown, onChange: onQueryChange, value: query, autoComplete: "off", placeholder: hasPlaceholder() ? placeholder : undefined, "data-testid": "autocomplete-input" }, onFocusChangeHandlerFunctions))), isFocused && suggestions.length ? /*#__PURE__*/_react.default.createElement("div", { className: "mx_AutocompleteInput_matches", style: { top: editorContainerRef.current?.clientHeight }, "data-testid": "autocomplete-matches" }, suggestions.map(item => /*#__PURE__*/_react.default.createElement(SuggestionItem, { key: item.completionId, item: item, selection: selection, onClick: toggleSelection, render: renderSuggestion }))) : null); }; exports.AutocompleteInput = AutocompleteInput; const SelectionItem = ({ item, onClick, render }) => { const withContainer = children => /*#__PURE__*/_react.default.createElement("span", { className: "mx_AutocompleteInput_editor_selection", "data-testid": `autocomplete-selection-item-${item.completionId}` }, /*#__PURE__*/_react.default.createElement("span", { className: "mx_AutocompleteInput_editor_selection_pill" }, children), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_AutocompleteInput_editor_selection_remove_button", onClick: () => onClick(item), "data-testid": `autocomplete-selection-remove-button-${item.completionId}` }, /*#__PURE__*/_react.default.createElement(_icons.CloseIcon, { width: "16px", height: "16px" }))); if (render) { return withContainer(render(item)); } return withContainer( /*#__PURE__*/_react.default.createElement("span", { className: "mx_AutocompleteInput_editor_selection_text" }, item.completion)); }; const SuggestionItem = ({ item, selection, onClick, render }) => { const isSelected = selection.some(selection => selection.completionId === item.completionId); const classes = (0, _classnames.default)({ "mx_AutocompleteInput_suggestion": true, "mx_AutocompleteInput_suggestion--selected": isSelected }); const withContainer = children => /*#__PURE__*/_react.default.createElement("div", { className: classes // `onClick` cannot be used here as it would lead to focus loss and closing the suggestion list. , onMouseDown: event => { event.preventDefault(); onClick(item); }, "data-testid": `autocomplete-suggestion-item-${item.completionId}` }, children); if (render) { return withContainer(render(item)); } return withContainer( /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("span", { className: "mx_AutocompleteInput_suggestion_title" }, item.completion), /*#__PURE__*/_react.default.createElement("span", { className: "mx_AutocompleteInput_suggestion_description" }, item.completionId))); }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfaWNvbnMiLCJfS2V5Ym9hcmQiLCJfQWNjZXNzaWJsZUJ1dHRvbiIsIl91c2VGb2N1cyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIkF1dG9jb21wbGV0ZUlucHV0IiwicHJvdmlkZXIiLCJyZW5kZXJTdWdnZXN0aW9uIiwicmVuZGVyU2VsZWN0aW9uIiwibWF4U3VnZ2VzdGlvbnMiLCJwbGFjZWhvbGRlciIsIm9uU2VsZWN0aW9uQ2hhbmdlIiwic2VsZWN0aW9uIiwiYWRkaXRpb25hbEZpbHRlciIsInF1ZXJ5Iiwic2V0UXVlcnkiLCJ1c2VTdGF0ZSIsInN1Z2dlc3Rpb25zIiwic2V0U3VnZ2VzdGlvbnMiLCJpc0ZvY3VzZWQiLCJvbkZvY3VzQ2hhbmdlSGFuZGxlckZ1bmN0aW9ucyIsInVzZUZvY3VzIiwiZWRpdG9yQ29udGFpbmVyUmVmIiwidXNlUmVmIiwiZWRpdG9yUmVmIiwiZm9jdXNFZGl0b3IiLCJjdXJyZW50IiwiZm9jdXMiLCJvblF1ZXJ5Q2hhbmdlIiwidmFsdWUiLCJ0YXJnZXQiLCJ0cmltIiwibWF0Y2hlcyIsImdldENvbXBsZXRpb25zIiwic3RhcnQiLCJsZW5ndGgiLCJlbmQiLCJmaWx0ZXIiLCJvbkNsaWNrSW5wdXRBcmVhIiwib25LZXlEb3duIiwiaGFzTW9kaWZpZXJzIiwiY3RybEtleSIsInNoaWZ0S2V5IiwibWV0YUtleSIsImtleSIsIktleSIsIkJBQ0tTUEFDRSIsInJlbW92ZVNlbGVjdGlvbiIsInRvZ2dsZVNlbGVjdGlvbiIsImNvbXBsZXRpb24iLCJuZXdTZWxlY3Rpb24iLCJpbmRleCIsImZpbmRJbmRleCIsImNvbXBsZXRpb25JZCIsInNwbGljZSIsInB1c2giLCJoYXNQbGFjZWhvbGRlciIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJyZWYiLCJjbGFzc05hbWVzIiwib25DbGljayIsIlNlYXJjaEljb24iLCJ3aWR0aCIsImhlaWdodCIsIm1hcCIsIml0ZW0iLCJTZWxlY3Rpb25JdGVtIiwicmVuZGVyIiwiX2V4dGVuZHMyIiwidHlwZSIsIm9uQ2hhbmdlIiwiYXV0b0NvbXBsZXRlIiwidW5kZWZpbmVkIiwic3R5bGUiLCJ0b3AiLCJjbGllbnRIZWlnaHQiLCJTdWdnZXN0aW9uSXRlbSIsImV4cG9ydHMiLCJ3aXRoQ29udGFpbmVyIiwiY2hpbGRyZW4iLCJDbG9zZUljb24iLCJpc1NlbGVjdGVkIiwic29tZSIsImNsYXNzZXMiLCJvbk1vdXNlRG93biIsImV2ZW50IiwicHJldmVudERlZmF1bHQiLCJGcmFnbWVudCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3N0cnVjdHVyZXMvQXV0b2NvbXBsZXRlSW5wdXQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIyIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSwgUmVhY3ROb2RlLCBDaGFuZ2VFdmVudCwgS2V5Ym9hcmRFdmVudCwgdXNlUmVmLCBSZWFjdEVsZW1lbnQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCI7XG5pbXBvcnQgeyBTZWFyY2hJY29uLCBDbG9zZUljb24gfSBmcm9tIFwiQHZlY3Rvci1pbS9jb21wb3VuZC1kZXNpZ24tdG9rZW5zL2Fzc2V0cy93ZWIvaWNvbnNcIjtcblxuaW1wb3J0IEF1dG9jb21wbGV0ZXIgZnJvbSBcIi4uLy4uL2F1dG9jb21wbGV0ZS9BdXRvY29tcGxldGVQcm92aWRlclwiO1xuaW1wb3J0IHsgS2V5IH0gZnJvbSBcIi4uLy4uL0tleWJvYXJkXCI7XG5pbXBvcnQgeyBJQ29tcGxldGlvbiB9IGZyb20gXCIuLi8uLi9hdXRvY29tcGxldGUvQXV0b2NvbXBsZXRlclwiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24gZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvdmlld3MvZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IHVzZUZvY3VzIGZyb20gXCIuLi8uLi9ob29rcy91c2VGb2N1c1wiO1xuXG5pbnRlcmZhY2UgQXV0b2NvbXBsZXRlSW5wdXRQcm9wcyB7XG4gICAgcHJvdmlkZXI6IEF1dG9jb21wbGV0ZXI7XG4gICAgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgICBzZWxlY3Rpb246IElDb21wbGV0aW9uW107XG4gICAgb25TZWxlY3Rpb25DaGFuZ2U6IChzZWxlY3Rpb246IElDb21wbGV0aW9uW10pID0+IHZvaWQ7XG4gICAgbWF4U3VnZ2VzdGlvbnM/OiBudW1iZXI7XG4gICAgcmVuZGVyU3VnZ2VzdGlvbj86IChzOiBJQ29tcGxldGlvbikgPT4gUmVhY3RFbGVtZW50O1xuICAgIHJlbmRlclNlbGVjdGlvbj86IChtOiBJQ29tcGxldGlvbikgPT4gUmVhY3RFbGVtZW50O1xuICAgIGFkZGl0aW9uYWxGaWx0ZXI/OiAoc3VnZ2VzdGlvbjogSUNvbXBsZXRpb24pID0+IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBBdXRvY29tcGxldGVJbnB1dDogUmVhY3QuRkM8QXV0b2NvbXBsZXRlSW5wdXRQcm9wcz4gPSAoe1xuICAgIHByb3ZpZGVyLFxuICAgIHJlbmRlclN1Z2dlc3Rpb24sXG4gICAgcmVuZGVyU2VsZWN0aW9uLFxuICAgIG1heFN1Z2dlc3Rpb25zID0gNSxcbiAgICBwbGFjZWhvbGRlcixcbiAgICBvblNlbGVjdGlvbkNoYW5nZSxcbiAgICBzZWxlY3Rpb24sXG4gICAgYWRkaXRpb25hbEZpbHRlcixcbn0pID0+IHtcbiAgICBjb25zdCBbcXVlcnksIHNldFF1ZXJ5XSA9IHVzZVN0YXRlPHN0cmluZz4oXCJcIik7XG4gICAgY29uc3QgW3N1Z2dlc3Rpb25zLCBzZXRTdWdnZXN0aW9uc10gPSB1c2VTdGF0ZTxJQ29tcGxldGlvbltdPihbXSk7XG4gICAgY29uc3QgW2lzRm9jdXNlZCwgb25Gb2N1c0NoYW5nZUhhbmRsZXJGdW5jdGlvbnNdID0gdXNlRm9jdXMoKTtcbiAgICBjb25zdCBlZGl0b3JDb250YWluZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICAgIGNvbnN0IGVkaXRvclJlZiA9IHVzZVJlZjxIVE1MSW5wdXRFbGVtZW50PihudWxsKTtcblxuICAgIGNvbnN0IGZvY3VzRWRpdG9yID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBlZGl0b3JSZWY/LmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uUXVlcnlDaGFuZ2UgPSBhc3luYyAoZTogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBlLnRhcmdldC52YWx1ZS50cmltKCk7XG4gICAgICAgIHNldFF1ZXJ5KHZhbHVlKTtcblxuICAgICAgICBsZXQgbWF0Y2hlcyA9IGF3YWl0IHByb3ZpZGVyLmdldENvbXBsZXRpb25zKFxuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICB7IHN0YXJ0OiBxdWVyeS5sZW5ndGgsIGVuZDogcXVlcnkubGVuZ3RoIH0sXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgbWF4U3VnZ2VzdGlvbnMsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGFkZGl0aW9uYWxGaWx0ZXIpIHtcbiAgICAgICAgICAgIG1hdGNoZXMgPSBtYXRjaGVzLmZpbHRlcihhZGRpdGlvbmFsRmlsdGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFN1Z2dlc3Rpb25zKG1hdGNoZXMpO1xuICAgIH07XG5cbiAgICBjb25zdCBvbkNsaWNrSW5wdXRBcmVhID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBmb2N1c0VkaXRvcigpO1xuICAgIH07XG5cbiAgICBjb25zdCBvbktleURvd24gPSAoZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBoYXNNb2RpZmllcnMgPSBlLmN0cmxLZXkgfHwgZS5zaGlmdEtleSB8fCBlLm1ldGFLZXk7XG5cbiAgICAgICAgLy8gd2hlbiB0aGUgZmllbGQgaXMgZW1wdHkgYW5kIHRoZSB1c2VyIGhpdHMgYmFja3NwYWNlIHJlbW92ZSB0aGUgcmlnaHQtbW9zdCB0YXJnZXRcbiAgICAgICAgaWYgKCFxdWVyeSAmJiBzZWxlY3Rpb24ubGVuZ3RoID4gMCAmJiBlLmtleSA9PT0gS2V5LkJBQ0tTUEFDRSAmJiAhaGFzTW9kaWZpZXJzKSB7XG4gICAgICAgICAgICByZW1vdmVTZWxlY3Rpb24oc2VsZWN0aW9uW3NlbGVjdGlvbi5sZW5ndGggLSAxXSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgdG9nZ2xlU2VsZWN0aW9uID0gKGNvbXBsZXRpb246IElDb21wbGV0aW9uKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IFsuLi5zZWxlY3Rpb25dO1xuICAgICAgICBjb25zdCBpbmRleCA9IHNlbGVjdGlvbi5maW5kSW5kZXgoKHNlbGVjdGlvbikgPT4gc2VsZWN0aW9uLmNvbXBsZXRpb25JZCA9PT0gY29tcGxldGlvbi5jb21wbGV0aW9uSWQpO1xuXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBuZXdTZWxlY3Rpb24uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld1NlbGVjdGlvbi5wdXNoKGNvbXBsZXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgb25TZWxlY3Rpb25DaGFuZ2UobmV3U2VsZWN0aW9uKTtcbiAgICAgICAgZm9jdXNFZGl0b3IoKTtcbiAgICAgICAgc2V0UXVlcnkoXCJcIik7XG4gICAgICAgIHNldFN1Z2dlc3Rpb25zKFtdKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVtb3ZlU2VsZWN0aW9uID0gKGNvbXBsZXRpb246IElDb21wbGV0aW9uKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IFsuLi5zZWxlY3Rpb25dO1xuICAgICAgICBjb25zdCBpbmRleCA9IHNlbGVjdGlvbi5maW5kSW5kZXgoKHNlbGVjdGlvbikgPT4gc2VsZWN0aW9uLmNvbXBsZXRpb25JZCA9PT0gY29tcGxldGlvbi5jb21wbGV0aW9uSWQpO1xuXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBuZXdTZWxlY3Rpb24uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlKG5ld1NlbGVjdGlvbik7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFzUGxhY2Vob2xkZXIgPSAoKTogYm9vbGVhbiA9PiBzZWxlY3Rpb24ubGVuZ3RoID09PSAwICYmIHF1ZXJ5Lmxlbmd0aCA9PT0gMDtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfQXV0b2NvbXBsZXRlSW5wdXRcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICByZWY9e2VkaXRvckNvbnRhaW5lclJlZn1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoe1xuICAgICAgICAgICAgICAgICAgICBcIm14X0F1dG9jb21wbGV0ZUlucHV0X2VkaXRvclwiOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBcIm14X0F1dG9jb21wbGV0ZUlucHV0X2VkaXRvci0tZm9jdXNlZFwiOiBpc0ZvY3VzZWQsXG4gICAgICAgICAgICAgICAgICAgIFwibXhfQXV0b2NvbXBsZXRlSW5wdXRfZWRpdG9yLS1oYXMtc3VnZ2VzdGlvbnNcIjogc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCxcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtvbkNsaWNrSW5wdXRBcmVhfVxuICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiYXV0b2NvbXBsZXRlLWVkaXRvclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPFNlYXJjaEljb24gY2xhc3NOYW1lPVwibXhfQXV0b2NvbXBsZXRlSW5wdXRfc2VhcmNoX2ljb25cIiB3aWR0aD1cIjE4cHhcIiBoZWlnaHQ9XCIxOHB4XCIgLz5cbiAgICAgICAgICAgICAgICB7c2VsZWN0aW9uLm1hcCgoaXRlbSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8U2VsZWN0aW9uSXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtpdGVtLmNvbXBsZXRpb25JZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW09e2l0ZW19XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtyZW1vdmVTZWxlY3Rpb259XG4gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXI9e3JlbmRlclNlbGVjdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgcmVmPXtlZGl0b3JSZWZ9XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgb25LZXlEb3duPXtvbktleURvd259XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtvblF1ZXJ5Q2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cXVlcnl9XG4gICAgICAgICAgICAgICAgICAgIGF1dG9Db21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtoYXNQbGFjZWhvbGRlcigpID8gcGxhY2Vob2xkZXIgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiYXV0b2NvbXBsZXRlLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgey4uLm9uRm9jdXNDaGFuZ2VIYW5kbGVyRnVuY3Rpb25zfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIHtpc0ZvY3VzZWQgJiYgc3VnZ2VzdGlvbnMubGVuZ3RoID8gKFxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfQXV0b2NvbXBsZXRlSW5wdXRfbWF0Y2hlc1wiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IHRvcDogZWRpdG9yQ29udGFpbmVyUmVmLmN1cnJlbnQ/LmNsaWVudEhlaWdodCB9fVxuICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImF1dG9jb21wbGV0ZS1tYXRjaGVzXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHtzdWdnZXN0aW9ucy5tYXAoKGl0ZW0pID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxTdWdnZXN0aW9uSXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17aXRlbS5jb21wbGV0aW9uSWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT17aXRlbX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb249e3NlbGVjdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0b2dnbGVTZWxlY3Rpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyPXtyZW5kZXJTdWdnZXN0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn07XG5cbnR5cGUgU2VsZWN0aW9uSXRlbVByb3BzID0ge1xuICAgIGl0ZW06IElDb21wbGV0aW9uO1xuICAgIG9uQ2xpY2s6IChjb21wbGV0aW9uOiBJQ29tcGxldGlvbikgPT4gdm9pZDtcbiAgICByZW5kZXI/OiAoY29tcGxldGlvbjogSUNvbXBsZXRpb24pID0+IFJlYWN0RWxlbWVudDtcbn07XG5cbmNvbnN0IFNlbGVjdGlvbkl0ZW06IFJlYWN0LkZDPFNlbGVjdGlvbkl0ZW1Qcm9wcz4gPSAoeyBpdGVtLCBvbkNsaWNrLCByZW5kZXIgfSkgPT4ge1xuICAgIGNvbnN0IHdpdGhDb250YWluZXIgPSAoY2hpbGRyZW46IFJlYWN0Tm9kZSk6IFJlYWN0RWxlbWVudCA9PiAoXG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJteF9BdXRvY29tcGxldGVJbnB1dF9lZGl0b3Jfc2VsZWN0aW9uXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPXtgYXV0b2NvbXBsZXRlLXNlbGVjdGlvbi1pdGVtLSR7aXRlbS5jb21wbGV0aW9uSWR9YH1cbiAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXhfQXV0b2NvbXBsZXRlSW5wdXRfZWRpdG9yX3NlbGVjdGlvbl9waWxsXCI+e2NoaWxkcmVufTwvc3Bhbj5cbiAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfQXV0b2NvbXBsZXRlSW5wdXRfZWRpdG9yX3NlbGVjdGlvbl9yZW1vdmVfYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvbkNsaWNrKGl0ZW0pfVxuICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPXtgYXV0b2NvbXBsZXRlLXNlbGVjdGlvbi1yZW1vdmUtYnV0dG9uLSR7aXRlbS5jb21wbGV0aW9uSWR9YH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Q2xvc2VJY29uIHdpZHRoPVwiMTZweFwiIGhlaWdodD1cIjE2cHhcIiAvPlxuICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuICAgICAgICA8L3NwYW4+XG4gICAgKTtcblxuICAgIGlmIChyZW5kZXIpIHtcbiAgICAgICAgcmV0dXJuIHdpdGhDb250YWluZXIocmVuZGVyKGl0ZW0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2l0aENvbnRhaW5lcig8c3BhbiBjbGFzc05hbWU9XCJteF9BdXRvY29tcGxldGVJbnB1dF9lZGl0b3Jfc2VsZWN0aW9uX3RleHRcIj57aXRlbS5jb21wbGV0aW9ufTwvc3Bhbj4pO1xufTtcblxudHlwZSBTdWdnZXN0aW9uSXRlbVByb3BzID0ge1xuICAgIGl0ZW06IElDb21wbGV0aW9uO1xuICAgIHNlbGVjdGlvbjogSUNvbXBsZXRpb25bXTtcbiAgICBvbkNsaWNrOiAoY29tcGxldGlvbjogSUNvbXBsZXRpb24pID0+IHZvaWQ7XG4gICAgcmVuZGVyPzogKGNvbXBsZXRpb246IElDb21wbGV0aW9uKSA9PiBSZWFjdEVsZW1lbnQ7XG59O1xuXG5jb25zdCBTdWdnZXN0aW9uSXRlbTogUmVhY3QuRkM8U3VnZ2VzdGlvbkl0ZW1Qcm9wcz4gPSAoeyBpdGVtLCBzZWxlY3Rpb24sIG9uQ2xpY2ssIHJlbmRlciB9KSA9PiB7XG4gICAgY29uc3QgaXNTZWxlY3RlZCA9IHNlbGVjdGlvbi5zb21lKChzZWxlY3Rpb24pID0+IHNlbGVjdGlvbi5jb21wbGV0aW9uSWQgPT09IGl0ZW0uY29tcGxldGlvbklkKTtcbiAgICBjb25zdCBjbGFzc2VzID0gY2xhc3NOYW1lcyh7XG4gICAgICAgIFwibXhfQXV0b2NvbXBsZXRlSW5wdXRfc3VnZ2VzdGlvblwiOiB0cnVlLFxuICAgICAgICBcIm14X0F1dG9jb21wbGV0ZUlucHV0X3N1Z2dlc3Rpb24tLXNlbGVjdGVkXCI6IGlzU2VsZWN0ZWQsXG4gICAgfSk7XG5cbiAgICBjb25zdCB3aXRoQ29udGFpbmVyID0gKGNoaWxkcmVuOiBSZWFjdE5vZGUpOiBSZWFjdEVsZW1lbnQgPT4gKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXN9XG4gICAgICAgICAgICAvLyBgb25DbGlja2AgY2Fubm90IGJlIHVzZWQgaGVyZSBhcyBpdCB3b3VsZCBsZWFkIHRvIGZvY3VzIGxvc3MgYW5kIGNsb3NpbmcgdGhlIHN1Z2dlc3Rpb24gbGlzdC5cbiAgICAgICAgICAgIG9uTW91c2VEb3duPXsoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIG9uQ2xpY2soaXRlbSk7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9e2BhdXRvY29tcGxldGUtc3VnZ2VzdGlvbi1pdGVtLSR7aXRlbS5jb21wbGV0aW9uSWR9YH1cbiAgICAgICAgPlxuICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L2Rpdj5cbiAgICApO1xuXG4gICAgaWYgKHJlbmRlcikge1xuICAgICAgICByZXR1cm4gd2l0aENvbnRhaW5lcihyZW5kZXIoaXRlbSkpO1xuICAgIH1cblxuICAgIHJldHVybiB3aXRoQ29udGFpbmVyKFxuICAgICAgICA8PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXhfQXV0b2NvbXBsZXRlSW5wdXRfc3VnZ2VzdGlvbl90aXRsZVwiPntpdGVtLmNvbXBsZXRpb259PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXhfQXV0b2NvbXBsZXRlSW5wdXRfc3VnZ2VzdGlvbl9kZXNjcmlwdGlvblwiPntpdGVtLmNvbXBsZXRpb25JZH08L3NwYW4+XG4gICAgICAgIDwvPixcbiAgICApO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFRQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxXQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxNQUFBLEdBQUFILE9BQUE7QUFHQSxJQUFBSSxTQUFBLEdBQUFKLE9BQUE7QUFFQSxJQUFBSyxpQkFBQSxHQUFBSCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU0sU0FBQSxHQUFBSixzQkFBQSxDQUFBRixPQUFBO0FBQTRDLFNBQUFPLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLENBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFULHdCQUFBUyxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsdUJBQUFBLENBQUEseUJBQUFBLENBQUEsV0FBQUssT0FBQSxFQUFBTCxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FBQSxDQUFBTixDQUFBLFVBQUFHLENBQUEsQ0FBQUksR0FBQSxDQUFBUCxDQUFBLE9BQUFRLENBQUEsS0FBQUMsU0FBQSxVQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsY0FBQSxJQUFBRCxNQUFBLENBQUFFLHdCQUFBLFdBQUFDLENBQUEsSUFBQWQsQ0FBQSxvQkFBQWMsQ0FBQSxPQUFBQyxjQUFBLENBQUFDLElBQUEsQ0FBQWhCLENBQUEsRUFBQWMsQ0FBQSxTQUFBRyxDQUFBLEdBQUFQ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QUFvRyxTQUFTO0lBQUNsQixLQUFLLEVBQUMsTUFBTTtJQUFDQyxNQUFNLEVBQUM7RUFBTSxDQUFFLENBQ3pCLENBQ2hCLENBQ1Q7RUFFRCxJQUFJSSxNQUFNLEVBQUU7SUFDUixPQUFPVyxhQUFhLENBQUNYLE1BQU0sQ0FBQ0YsSUFBSSxDQUFDLENBQUM7RUFDdEM7RUFFQSxPQUFPYSxhQUFhLGVBQUN2RyxNQUFBLENBQUFlLE9BQUEsQ0FBQWtFLGFBQUE7SUFBTUMsU0FBUyxFQUFDO0VBQTRDLEdBQUVRLElBQUksQ0FBQ2pCLFVBQWlCLENBQUMsQ0FBQztBQUMvRyxDQUFDO0FBU0QsTUFBTTRCLGNBQTZDLEdBQUdBLENBQUM7RUFBRVgsSUFBSTtFQUFFdEQsU0FBUztFQUFFaUQsT0FBTztFQUFFTztBQUFPLENBQUMsS0FBSztFQUM1RixNQUFNYyxVQUFVLEdBQUd0RSxTQUFTLENBQUN1RSxJQUFJLENBQUV2RSxTQUFTLElBQUtBLFNBQVMsQ0FBQ3lDLFlBQVksS0FBS2EsSUFBSSxDQUFDYixZQUFZLENBQUM7RUFDOUYsTUFBTStCLE9BQU8sR0FBRyxJQUFBeEIsbUJBQVUsRUFBQztJQUN2QixpQ0FBaUMsRUFBRSxJQUFJO0lBQ3ZDLDJDQUEyQyxFQUFFc0I7RUFDakQsQ0FBQyxDQUFDO0VBRUYsTUFBTUgsYUFBYSxHQUFJQyxRQUFtQixpQkFDdEN4RyxNQUFBLENBQUFlLE9BQUEsQ0FBQWtFLGFBQUE7SUFDSUMsU0FBUyxFQUFFMEI7SUFDWDtJQUFBO0lBQ0FDLFdBQVcsRUFBR0MsS0FBSyxJQUFLO01BQ3BCQSxLQUFLLENBQUNDLGNBQWMsQ0FBQyxDQUFDO01BQ3RCMUIsT0FBTyxDQUFDSyxJQUFJLENBQUM7SUFDakIsQ0FBRTtJQUNGLGVBQWEsZ0NBQWdDQSxJQUFJLENBQUNiLFlBQVk7RUFBRyxHQUVoRTJCLFFBQ0EsQ0FDUjtFQUVELElBQUlaLE1BQU0sRUFBRTtJQUNSLE9BQU9XLGFBQWEsQ0FBQ1gsTUFBTSxDQUFDRixJQUFJLENBQUMsQ0FBQztFQUN0QztFQUVBLE9BQU9hLGFBQWEsZUFDaEJ2RyxNQUFBLENBQUFlLE9BQUEsQ0FBQWtFLGFBQUEsQ0FBQWpGLE1BQUEsQ0FBQWUsT0FBQSxDQUFBaUcsUUFBQSxxQkFDSWhILE1BQUEsQ0FBQWUsT0FBQSxDQUFBa0UsYUFBQTtJQUFNQyxTQUFTLEVBQUM7RUFBdUMsR0FBRVEsSUFBSSxDQUFDakIsVUFBaUIsQ0FBQyxlQUNoRnpFLE1BQUEsQ0FBQWUsT0FBQSxDQUFBa0UsYUFBQTtJQUFNQyxTQUFTLEVBQUM7RUFBNkMsR0FBRVEsSUFBSSxDQUFDYixZQUFtQixDQUN6RixDQUNOLENBQUM7QUFDTCxDQUFDIiwiaWdub3JlTGlzdCI6W119