UNPKG

botframework-webchat-component

Version:
153 lines (149 loc) 33.6 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _botframeworkWebchatApi = require("botframework-webchat-api"); var _propTypes = _interopRequireDefault(require("prop-types")); var _mathRandom = _interopRequireDefault(require("math-random")); var _react = _interopRequireWildcard(require("react")); var _scrollIntoViewWithBlockNearest = _interopRequireDefault(require("../../Utils/scrollIntoViewWithBlockNearest")); var _Context = _interopRequireDefault(require("./private/Context")); var _useActivityTreeWithRenderer = _interopRequireDefault(require("../ActivityTree/useActivityTreeWithRenderer")); var _usePrevious = _interopRequireDefault(require("../../hooks/internal/usePrevious")); var _useStateRef3 = _interopRequireDefault(require("../../hooks/internal/useStateRef")); var _useValueRef = _interopRequireDefault(require("../../hooks/internal/useValueRef")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } var useGetKeyByActivity = _botframeworkWebchatApi.hooks.useGetKeyByActivity; function last(array) { return array[array.length - 1]; } function uniqueId() { var count = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Infinity; return (0, _mathRandom.default)() // eslint-disable-next-line no-magic-numbers .toString(36) // eslint-disable-next-line no-magic-numbers .substring(2, 2 + count); } var TranscriptFocusComposer = function TranscriptFocusComposer(_ref) { var _containerRef$current; var children = _ref.children, containerRef = _ref.containerRef; var _useActivityTreeWithR = (0, _useActivityTreeWithRenderer.default)({ flat: true }), _useActivityTreeWithR2 = _slicedToArray(_useActivityTreeWithR, 1), flattenedActivityTree = _useActivityTreeWithR2[0]; var _useStateRef = (0, _useStateRef3.default)(), _useStateRef2 = _slicedToArray(_useStateRef, 3), _ = _useStateRef2[0], setRawFocusedActivityKey = _useStateRef2[1], rawFocusedActivityKeyRef = _useStateRef2[2]; var getKeyByActivity = useGetKeyByActivity(); // As we need to use IDREF for `aria-activedescendant`, // this prefix will differentiate multiple instances of transcript on the same page. // eslint-disable-next-line no-magic-numbers var prefix = (0, _react.useMemo)(function () { return uniqueId(3); }, []); var getDescendantIdByActivityKey = (0, _react.useCallback)(function (activityKey) { return activityKey && "webchat__transcript-focus-".concat(prefix, "__activity-").concat(activityKey); }, [prefix]); var renderingActivityKeys = (0, _react.useMemo)(function () { return Object.freeze(flattenedActivityTree.map(function (_ref2) { var activity = _ref2.activity; return getKeyByActivity(activity); })); }, [flattenedActivityTree, getKeyByActivity]); var renderingActivityKeysRef = (0, _useValueRef.default)(renderingActivityKeys); // While the transcript or any descendants are not focused, if the transcript is updated, reset the user-selected active descendant. // This will assume the last activity, if any, will be the active descendant. var prevRenderingActivityKeys = (0, _usePrevious.default)(renderingActivityKeys); if (renderingActivityKeys !== prevRenderingActivityKeys && !((_containerRef$current = containerRef.current) !== null && _containerRef$current !== void 0 && _containerRef$current.contains(document.activeElement))) { rawFocusedActivityKeyRef.current = undefined; } var rawFocusedActivityKey = rawFocusedActivityKeyRef.current; var focusedActivityKey = (0, _react.useMemo)(function () { return renderingActivityKeys.includes(rawFocusedActivityKey) ? rawFocusedActivityKey : last(renderingActivityKeys); }, [renderingActivityKeys, rawFocusedActivityKey]); var focusedActivityKeyRef = (0, _useValueRef.default)(focusedActivityKey); var activeDescendantId = (0, _react.useMemo)(function () { return getDescendantIdByActivityKey(focusedActivityKey); }, [getDescendantIdByActivityKey, focusedActivityKey]); var focusByActivityKey = (0, _react.useCallback)(function (activityKey) { var withFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; if (activityKey === false) { // `false` means set it to nothing. setRawFocusedActivityKey(undefined); } else if (activityKey === true) { // `true` means set to something if it is not set. setRawFocusedActivityKey(function (key) { return key || focusedActivityKeyRef.current; }); } else if (activityKey) { setRawFocusedActivityKey(activityKey); } if (withFocus) { var _containerRef$current2; (_containerRef$current2 = containerRef.current) === null || _containerRef$current2 === void 0 ? void 0 : _containerRef$current2.focus(); var _activeDescendantId = getDescendantIdByActivityKey(activityKey === false ? // If "activityKey" is false, it means "focus nothing and reset it to the last activity". last(renderingActivityKeysRef.current) : activityKey && activityKey !== true ? // If "activity" is not "undefined" and not "true", it means "focus on this activity". activityKey : // If "activityKey" is "undefined", it means "don't modify the focus". // If "activityKey" is "true", it means "try to focus on anything". rawFocusedActivityKeyRef.current); var activeDescendantElement = _activeDescendantId && document.getElementById(_activeDescendantId); // Don't scroll active descendant into view if the focus is already inside it. // Otherwise, given the focus is on the send box, clicking on any <input> inside the Adaptive Cards may cause the view to move. // This UX is not desirable because click should not cause scroll. if (activeDescendantElement && !activeDescendantElement.contains(document.activeElement)) { (0, _scrollIntoViewWithBlockNearest.default)(activeDescendantElement); } } }, [getDescendantIdByActivityKey, containerRef, focusedActivityKeyRef, renderingActivityKeysRef, rawFocusedActivityKeyRef, setRawFocusedActivityKey]); var focusRelativeActivity = (0, _react.useCallback)(function (delta) { var orderedActivityKeys = renderingActivityKeysRef.current; if (isNaN(delta) || !orderedActivityKeys.length) { return focusByActivityKey(false, true); } var focusedActivityKey = focusedActivityKeyRef.current; var index = orderedActivityKeys.indexOf(focusedActivityKey); var nextIndex = ~index ? Math.max(0, Math.min(orderedActivityKeys.length - 1, index + delta)) : orderedActivityKeys.length - 1; focusByActivityKey(orderedActivityKeys[+nextIndex], true); }, [focusedActivityKeyRef, renderingActivityKeysRef, focusByActivityKey]); var contextValue = (0, _react.useMemo)(function () { return { activeDescendantIdState: Object.freeze([activeDescendantId]), getDescendantIdByActivityKey: getDescendantIdByActivityKey, focusByActivityKey: focusByActivityKey, focusedActivityKeyState: Object.freeze([focusedActivityKey]), focusedExplicitlyState: Object.freeze([!!rawFocusedActivityKey]), focusRelativeActivity: focusRelativeActivity }; }, [activeDescendantId, getDescendantIdByActivityKey, focusByActivityKey, focusedActivityKey, focusRelativeActivity, rawFocusedActivityKey]); return /*#__PURE__*/_react.default.createElement(_Context.default.Provider, { value: contextValue }, children); }; TranscriptFocusComposer.propTypes = { // PropTypes is not fully compatible with TypeScript. // @ts-ignore containerRef: _propTypes.default.shape({ current: _propTypes.default.instanceOf(HTMLElement) }).isRequired }; var _default = TranscriptFocusComposer; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYm90ZnJhbWV3b3JrV2ViY2hhdEFwaSIsInJlcXVpcmUiLCJfcHJvcFR5cGVzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9tYXRoUmFuZG9tIiwiX3JlYWN0IiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfc2Nyb2xsSW50b1ZpZXdXaXRoQmxvY2tOZWFyZXN0IiwiX0NvbnRleHQiLCJfdXNlQWN0aXZpdHlUcmVlV2l0aFJlbmRlcmVyIiwiX3VzZVByZXZpb3VzIiwiX3VzZVN0YXRlUmVmMyIsIl91c2VWYWx1ZVJlZiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsIm5vZGVJbnRlcm9wIiwiV2Vha01hcCIsImNhY2hlQmFiZWxJbnRlcm9wIiwiY2FjaGVOb2RlSW50ZXJvcCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiZGVmYXVsdCIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0IiwiX3NsaWNlZFRvQXJyYXkiLCJhcnIiLCJpIiwiX2FycmF5V2l0aEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheUxpbWl0IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiX25vbkl0ZXJhYmxlUmVzdCIsIlR5cGVFcnJvciIsIm8iLCJtaW5MZW4iLCJfYXJyYXlMaWtlVG9BcnJheSIsIm4iLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiQXJyYXkiLCJmcm9tIiwidGVzdCIsImxlbiIsImxlbmd0aCIsImFycjIiLCJfaSIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiX2FyciIsIl9uIiwiX2QiLCJfcyIsIl9lIiwibmV4dCIsImRvbmUiLCJwdXNoIiwidmFsdWUiLCJlcnIiLCJpc0FycmF5IiwidXNlR2V0S2V5QnlBY3Rpdml0eSIsImhvb2tzIiwibGFzdCIsImFycmF5IiwidW5pcXVlSWQiLCJjb3VudCIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsIkluZmluaXR5IiwicmFuZG9tIiwic3Vic3RyaW5nIiwiVHJhbnNjcmlwdEZvY3VzQ29tcG9zZXIiLCJfcmVmIiwiX2NvbnRhaW5lclJlZiRjdXJyZW50IiwiY2hpbGRyZW4iLCJjb250YWluZXJSZWYiLCJfdXNlQWN0aXZpdHlUcmVlV2l0aFIiLCJ1c2VBY3Rpdml0eVRyZWVXaXRoUmVuZGVyZXIiLCJmbGF0IiwiX3VzZUFjdGl2aXR5VHJlZVdpdGhSMiIsImZsYXR0ZW5lZEFjdGl2aXR5VHJlZSIsIl91c2VTdGF0ZVJlZiIsInVzZVN0YXRlUmVmIiwiX3VzZVN0YXRlUmVmMiIsIl8iLCJzZXRSYXdGb2N1c2VkQWN0aXZpdHlLZXkiLCJyYXdGb2N1c2VkQWN0aXZpdHlLZXlSZWYiLCJnZXRLZXlCeUFjdGl2aXR5IiwicHJlZml4IiwidXNlTWVtbyIsImdldERlc2NlbmRhbnRJZEJ5QWN0aXZpdHlLZXkiLCJ1c2VDYWxsYmFjayIsImFjdGl2aXR5S2V5IiwiY29uY2F0IiwicmVuZGVyaW5nQWN0aXZpdHlLZXlzIiwiZnJlZXplIiwibWFwIiwiX3JlZjIiLCJhY3Rpdml0eSIsInJlbmRlcmluZ0FjdGl2aXR5S2V5c1JlZiIsInVzZVZhbHVlUmVmIiwicHJldlJlbmRlcmluZ0FjdGl2aXR5S2V5cyIsInVzZVByZXZpb3VzIiwiY3VycmVudCIsImNvbnRhaW5zIiwiZG9jdW1lbnQiLCJhY3RpdmVFbGVtZW50IiwicmF3Rm9jdXNlZEFjdGl2aXR5S2V5IiwiZm9jdXNlZEFjdGl2aXR5S2V5IiwiaW5jbHVkZXMiLCJmb2N1c2VkQWN0aXZpdHlLZXlSZWYiLCJhY3RpdmVEZXNjZW5kYW50SWQiLCJmb2N1c0J5QWN0aXZpdHlLZXkiLCJ3aXRoRm9jdXMiLCJfY29udGFpbmVyUmVmJGN1cnJlbnQyIiwiZm9jdXMiLCJhY3RpdmVEZXNjZW5kYW50RWxlbWVudCIsImdldEVsZW1lbnRCeUlkIiwic2Nyb2xsSW50b1ZpZXdXaXRoQmxvY2tOZWFyZXN0IiwiZm9jdXNSZWxhdGl2ZUFjdGl2aXR5IiwiZGVsdGEiLCJvcmRlcmVkQWN0aXZpdHlLZXlzIiwiaXNOYU4iLCJpbmRleCIsImluZGV4T2YiLCJuZXh0SW5kZXgiLCJNYXRoIiwibWF4IiwibWluIiwiY29udGV4dFZhbHVlIiwiYWN0aXZlRGVzY2VuZGFudElkU3RhdGUiLCJmb2N1c2VkQWN0aXZpdHlLZXlTdGF0ZSIsImZvY3VzZWRFeHBsaWNpdGx5U3RhdGUiLCJjcmVhdGVFbGVtZW50IiwiUHJvdmlkZXIiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJzaGFwZSIsImluc3RhbmNlT2YiLCJIVE1MRWxlbWVudCIsImlzUmVxdWlyZWQiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlUm9vdCI6ImNvbXBvbmVudDovLy8iLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcm92aWRlcnMvVHJhbnNjcmlwdEZvY3VzL1RyYW5zY3JpcHRGb2N1c0NvbXBvc2VyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBob29rcyB9IGZyb20gJ2JvdGZyYW1ld29yay13ZWJjaGF0LWFwaSc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHJhbmRvbSBmcm9tICdtYXRoLXJhbmRvbSc7XG5pbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCBzY3JvbGxJbnRvVmlld1dpdGhCbG9ja05lYXJlc3QgZnJvbSAnLi4vLi4vVXRpbHMvc2Nyb2xsSW50b1ZpZXdXaXRoQmxvY2tOZWFyZXN0JztcbmltcG9ydCBUcmFuc2NyaXB0Rm9jdXNDb250ZXh0IGZyb20gJy4vcHJpdmF0ZS9Db250ZXh0JztcbmltcG9ydCB1c2VBY3Rpdml0eVRyZWVXaXRoUmVuZGVyZXIgZnJvbSAnLi4vQWN0aXZpdHlUcmVlL3VzZUFjdGl2aXR5VHJlZVdpdGhSZW5kZXJlcic7XG5pbXBvcnQgdXNlUHJldmlvdXMgZnJvbSAnLi4vLi4vaG9va3MvaW50ZXJuYWwvdXNlUHJldmlvdXMnO1xuaW1wb3J0IHVzZVN0YXRlUmVmIGZyb20gJy4uLy4uL2hvb2tzL2ludGVybmFsL3VzZVN0YXRlUmVmJztcbmltcG9ydCB1c2VWYWx1ZVJlZiBmcm9tICcuLi8uLi9ob29rcy9pbnRlcm5hbC91c2VWYWx1ZVJlZic7XG5cbmltcG9ydCB0eXBlIHsgRkMsIE11dGFibGVSZWZPYmplY3QsIFByb3BzV2l0aENoaWxkcmVuIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBUcmFuc2NyaXB0Rm9jdXNDb250ZXh0VHlwZSB9IGZyb20gJy4vcHJpdmF0ZS9Db250ZXh0JztcblxuY29uc3QgeyB1c2VHZXRLZXlCeUFjdGl2aXR5IH0gPSBob29rcztcblxudHlwZSBUcmFuc2NyaXB0Rm9jdXNDb21wb3NlclByb3BzID0gUHJvcHNXaXRoQ2hpbGRyZW48e1xuICBjb250YWluZXJSZWY6IE11dGFibGVSZWZPYmplY3Q8SFRNTEVsZW1lbnQ+O1xufT47XG5cbmZ1bmN0aW9uIGxhc3Q8VD4oYXJyYXk6IEFycmF5TGlrZTxUPikge1xuICByZXR1cm4gYXJyYXlbYXJyYXkubGVuZ3RoIC0gMV07XG59XG5cbmZ1bmN0aW9uIHVuaXF1ZUlkKGNvdW50ID0gSW5maW5pdHkpIHtcbiAgcmV0dXJuIChcbiAgICByYW5kb20oKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnNcbiAgICAgIC50b1N0cmluZygzNilcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gICAgICAuc3Vic3RyaW5nKDIsIDIgKyBjb3VudClcbiAgKTtcbn1cblxuY29uc3QgVHJhbnNjcmlwdEZvY3VzQ29tcG9zZXI6IEZDPFRyYW5zY3JpcHRGb2N1c0NvbXBvc2VyUHJvcHM+ID0gKHsgY2hpbGRyZW4sIGNvbnRhaW5lclJlZiB9KSA9PiB7XG4gIGNvbnN0IFtmbGF0dGVuZWRBY3Rpdml0eVRyZWVdID0gdXNlQWN0aXZpdHlUcmVlV2l0aFJlbmRlcmVyKHsgZmxhdDogdHJ1ZSB9KTtcbiAgY29uc3QgW18sIHNldFJhd0ZvY3VzZWRBY3Rpdml0eUtleSwgcmF3Rm9jdXNlZEFjdGl2aXR5S2V5UmVmXSA9IHVzZVN0YXRlUmVmPHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgY29uc3QgZ2V0S2V5QnlBY3Rpdml0eSA9IHVzZUdldEtleUJ5QWN0aXZpdHkoKTtcblxuICAvLyBBcyB3ZSBuZWVkIHRvIHVzZSBJRFJFRiBmb3IgYGFyaWEtYWN0aXZlZGVzY2VuZGFudGAsXG4gIC8vIHRoaXMgcHJlZml4IHdpbGwgZGlmZmVyZW50aWF0ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdHJhbnNjcmlwdCBvbiB0aGUgc2FtZSBwYWdlLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuICBjb25zdCBwcmVmaXggPSB1c2VNZW1vPHN0cmluZz4oKCkgPT4gdW5pcXVlSWQoMyksIFtdKTtcblxuICBjb25zdCBnZXREZXNjZW5kYW50SWRCeUFjdGl2aXR5S2V5OiAoYWN0aXZpdHlLZXk/OiBzdHJpbmcpID0+IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVzZUNhbGxiYWNrKFxuICAgIChhY3Rpdml0eUtleT86IHN0cmluZykgPT4gYWN0aXZpdHlLZXkgJiYgYHdlYmNoYXRfX3RyYW5zY3JpcHQtZm9jdXMtJHtwcmVmaXh9X19hY3Rpdml0eS0ke2FjdGl2aXR5S2V5fWAsXG4gICAgW3ByZWZpeF1cbiAgKTtcblxuICBjb25zdCByZW5kZXJpbmdBY3Rpdml0eUtleXMgPSB1c2VNZW1vPHJlYWRvbmx5IHN0cmluZ1tdPihcbiAgICAoKSA9PiBPYmplY3QuZnJlZXplKGZsYXR0ZW5lZEFjdGl2aXR5VHJlZS5tYXAoKHsgYWN0aXZpdHkgfSkgPT4gZ2V0S2V5QnlBY3Rpdml0eShhY3Rpdml0eSkpKSxcbiAgICBbZmxhdHRlbmVkQWN0aXZpdHlUcmVlLCBnZXRLZXlCeUFjdGl2aXR5XVxuICApO1xuXG4gIGNvbnN0IHJlbmRlcmluZ0FjdGl2aXR5S2V5c1JlZiA9IHVzZVZhbHVlUmVmPHJlYWRvbmx5IHN0cmluZ1tdPihyZW5kZXJpbmdBY3Rpdml0eUtleXMpO1xuXG4gIC8vIFdoaWxlIHRoZSB0cmFuc2NyaXB0IG9yIGFueSBkZXNjZW5kYW50cyBhcmUgbm90IGZvY3VzZWQsIGlmIHRoZSB0cmFuc2NyaXB0IGlzIHVwZGF0ZWQsIHJlc2V0IHRoZSB1c2VyLXNlbGVjdGVkIGFjdGl2ZSBkZXNjZW5kYW50LlxuICAvLyBUaGlzIHdpbGwgYXNzdW1lIHRoZSBsYXN0IGFjdGl2aXR5LCBpZiBhbnksIHdpbGwgYmUgdGhlIGFjdGl2ZSBkZXNjZW5kYW50LlxuICBjb25zdCBwcmV2UmVuZGVyaW5nQWN0aXZpdHlLZXlzID0gdXNlUHJldmlvdXMocmVuZGVyaW5nQWN0aXZpdHlLZXlzKTtcblxuICBpZiAocmVuZGVyaW5nQWN0aXZpdHlLZXlzICE9PSBwcmV2UmVuZGVyaW5nQWN0aXZpdHlLZXlzICYmICFjb250YWluZXJSZWYuY3VycmVudD8uY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICByYXdGb2N1c2VkQWN0aXZpdHlLZXlSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHsgY3VycmVudDogcmF3Rm9jdXNlZEFjdGl2aXR5S2V5IH0gPSByYXdGb2N1c2VkQWN0aXZpdHlLZXlSZWY7XG5cbiAgY29uc3QgZm9jdXNlZEFjdGl2aXR5S2V5ID0gdXNlTWVtbzxzdHJpbmc+KFxuICAgICgpID0+IChyZW5kZXJpbmdBY3Rpdml0eUtleXMuaW5jbHVkZXMocmF3Rm9jdXNlZEFjdGl2aXR5S2V5KSA/IHJhd0ZvY3VzZWRBY3Rpdml0eUtleSA6IGxhc3QocmVuZGVyaW5nQWN0aXZpdHlLZXlzKSksXG4gICAgW3JlbmRlcmluZ0FjdGl2aXR5S2V5cywgcmF3Rm9jdXNlZEFjdGl2aXR5S2V5XVxuICApO1xuXG4gIGNvbnN0IGZvY3VzZWRBY3Rpdml0eUtleVJlZiA9IHVzZVZhbHVlUmVmKGZvY3VzZWRBY3Rpdml0eUtleSk7XG5cbiAgY29uc3QgYWN0aXZlRGVzY2VuZGFudElkID0gdXNlTWVtbzxzdHJpbmc+KFxuICAgICgpID0+IGdldERlc2NlbmRhbnRJZEJ5QWN0aXZpdHlLZXkoZm9jdXNlZEFjdGl2aXR5S2V5KSxcbiAgICBbZ2V0RGVzY2VuZGFudElkQnlBY3Rpdml0eUtleSwgZm9jdXNlZEFjdGl2aXR5S2V5XVxuICApO1xuXG4gIGNvbnN0IGZvY3VzQnlBY3Rpdml0eUtleSA9IHVzZUNhbGxiYWNrPFxuICAgIChhY3Rpdml0eUtleTogYm9vbGVhbiB8IHN0cmluZyB8IHVuZGVmaW5lZCwgd2l0aEZvY3VzOiBib29sZWFuIHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gID4oXG4gICAgKGFjdGl2aXR5S2V5OiBib29sZWFuIHwgc3RyaW5nIHwgdW5kZWZpbmVkLCB3aXRoRm9jdXM6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSB0cnVlKSA9PiB7XG4gICAgICBpZiAoYWN0aXZpdHlLZXkgPT09IGZhbHNlKSB7XG4gICAgICAgIC8vIGBmYWxzZWAgbWVhbnMgc2V0IGl0IHRvIG5vdGhpbmcuXG4gICAgICAgIHNldFJhd0ZvY3VzZWRBY3Rpdml0eUtleSh1bmRlZmluZWQpO1xuICAgICAgfSBlbHNlIGlmIChhY3Rpdml0eUtleSA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBgdHJ1ZWAgbWVhbnMgc2V0IHRvIHNvbWV0aGluZyBpZiBpdCBpcyBub3Qgc2V0LlxuICAgICAgICBzZXRSYXdGb2N1c2VkQWN0aXZpdHlLZXkoa2V5ID0+IGtleSB8fCBmb2N1c2VkQWN0aXZpdHlLZXlSZWYuY3VycmVudCk7XG4gICAgICB9IGVsc2UgaWYgKGFjdGl2aXR5S2V5KSB7XG4gICAgICAgIHNldFJhd0ZvY3VzZWRBY3Rpdml0eUtleShhY3Rpdml0eUtleSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh3aXRoRm9jdXMpIHtcbiAgICAgICAgY29udGFpbmVyUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG5cbiAgICAgICAgY29uc3QgYWN0aXZlRGVzY2VuZGFudElkID0gZ2V0RGVzY2VuZGFudElkQnlBY3Rpdml0eUtleShcbiAgICAgICAgICBhY3Rpdml0eUtleSA9PT0gZmFsc2VcbiAgICAgICAgICAgID8gLy8gSWYgXCJhY3Rpdml0eUtleVwiIGlzIGZhbHNlLCBpdCBtZWFucyBcImZvY3VzIG5vdGhpbmcgYW5kIHJlc2V0IGl0IHRvIHRoZSBsYXN0IGFjdGl2aXR5XCIuXG4gICAgICAgICAgICAgIGxhc3QocmVuZGVyaW5nQWN0aXZpdHlLZXlzUmVmLmN1cnJlbnQpXG4gICAgICAgICAgICA6IGFjdGl2aXR5S2V5ICYmIGFjdGl2aXR5S2V5ICE9PSB0cnVlXG4gICAgICAgICAgICAgID8gLy8gSWYgXCJhY3Rpdml0eVwiIGlzIG5vdCBcInVuZGVmaW5lZFwiIGFuZCBub3QgXCJ0cnVlXCIsIGl0IG1lYW5zIFwiZm9jdXMgb24gdGhpcyBhY3Rpdml0eVwiLlxuICAgICAgICAgICAgICAgIGFjdGl2aXR5S2V5XG4gICAgICAgICAgICAgIDogLy8gSWYgXCJhY3Rpdml0eUtleVwiIGlzIFwidW5kZWZpbmVkXCIsIGl0IG1lYW5zIFwiZG9uJ3QgbW9kaWZ5IHRoZSBmb2N1c1wiLlxuICAgICAgICAgICAgICAgIC8vIElmIFwiYWN0aXZpdHlLZXlcIiBpcyBcInRydWVcIiwgaXQgbWVhbnMgXCJ0cnkgdG8gZm9jdXMgb24gYW55dGhpbmdcIi5cbiAgICAgICAgICAgICAgICByYXdGb2N1c2VkQWN0aXZpdHlLZXlSZWYuY3VycmVudFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGFjdGl2ZURlc2NlbmRhbnRFbGVtZW50ID0gYWN0aXZlRGVzY2VuZGFudElkICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFjdGl2ZURlc2NlbmRhbnRJZCk7XG5cbiAgICAgICAgLy8gRG9uJ3Qgc2Nyb2xsIGFjdGl2ZSBkZXNjZW5kYW50IGludG8gdmlldyBpZiB0aGUgZm9jdXMgaXMgYWxyZWFkeSBpbnNpZGUgaXQuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgZ2l2ZW4gdGhlIGZvY3VzIGlzIG9uIHRoZSBzZW5kIGJveCwgY2xpY2tpbmcgb24gYW55IDxpbnB1dD4gaW5zaWRlIHRoZSBBZGFwdGl2ZSBDYXJkcyBtYXkgY2F1c2UgdGhlIHZpZXcgdG8gbW92ZS5cbiAgICAgICAgLy8gVGhpcyBVWCBpcyBub3QgZGVzaXJhYmxlIGJlY2F1c2UgY2xpY2sgc2hvdWxkIG5vdCBjYXVzZSBzY3JvbGwuXG4gICAgICAgIGlmIChhY3RpdmVEZXNjZW5kYW50RWxlbWVudCAmJiAhYWN0aXZlRGVzY2VuZGFudEVsZW1lbnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICBzY3JvbGxJbnRvVmlld1dpdGhCbG9ja05lYXJlc3QoYWN0aXZlRGVzY2VuZGFudEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBnZXREZXNjZW5kYW50SWRCeUFjdGl2aXR5S2V5LFxuICAgICAgY29udGFpbmVyUmVmLFxuICAgICAgZm9jdXNlZEFjdGl2aXR5S2V5UmVmLFxuICAgICAgcmVuZGVyaW5nQWN0aXZpdHlLZXlzUmVmLFxuICAgICAgcmF3Rm9jdXNlZEFjdGl2aXR5S2V5UmVmLFxuICAgICAgc2V0UmF3Rm9jdXNlZEFjdGl2aXR5S2V5XG4gICAgXVxuICApO1xuXG4gIGNvbnN0IGZvY3VzUmVsYXRpdmVBY3Rpdml0eSA9IHVzZUNhbGxiYWNrKFxuICAgIChkZWx0YTogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCB7IGN1cnJlbnQ6IG9yZGVyZWRBY3Rpdml0eUtleXMgfSA9IHJlbmRlcmluZ0FjdGl2aXR5S2V5c1JlZjtcblxuICAgICAgaWYgKGlzTmFOKGRlbHRhKSB8fCAhb3JkZXJlZEFjdGl2aXR5S2V5cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZvY3VzQnlBY3Rpdml0eUtleShmYWxzZSwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgY3VycmVudDogZm9jdXNlZEFjdGl2aXR5S2V5IH0gPSBmb2N1c2VkQWN0aXZpdHlLZXlSZWY7XG5cbiAgICAgIGNvbnN0IGluZGV4ID0gb3JkZXJlZEFjdGl2aXR5S2V5cy5pbmRleE9mKGZvY3VzZWRBY3Rpdml0eUtleSk7XG4gICAgICBjb25zdCBuZXh0SW5kZXggPSB+aW5kZXhcbiAgICAgICAgPyBNYXRoLm1heCgwLCBNYXRoLm1pbihvcmRlcmVkQWN0aXZpdHlLZXlzLmxlbmd0aCAtIDEsIGluZGV4ICsgZGVsdGEpKVxuICAgICAgICA6IG9yZGVyZWRBY3Rpdml0eUtleXMubGVuZ3RoIC0gMTtcblxuICAgICAgZm9jdXNCeUFjdGl2aXR5S2V5KG9yZGVyZWRBY3Rpdml0eUtleXNbK25leHRJbmRleF0sIHRydWUpO1xuICAgIH0sXG4gICAgW2ZvY3VzZWRBY3Rpdml0eUtleVJlZiwgcmVuZGVyaW5nQWN0aXZpdHlLZXlzUmVmLCBmb2N1c0J5QWN0aXZpdHlLZXldXG4gICk7XG5cbiAgY29uc3QgY29udGV4dFZhbHVlID0gdXNlTWVtbzxUcmFuc2NyaXB0Rm9jdXNDb250ZXh0VHlwZT4oXG4gICAgKCkgPT4gKHtcbiAgICAgIGFjdGl2ZURlc2NlbmRhbnRJZFN0YXRlOiBPYmplY3QuZnJlZXplKFthY3RpdmVEZXNjZW5kYW50SWRdKSBhcyByZWFkb25seSBbc3RyaW5nXSxcbiAgICAgIGdldERlc2NlbmRhbnRJZEJ5QWN0aXZpdHlLZXksXG4gICAgICBmb2N1c0J5QWN0aXZpdHlLZXksXG4gICAgICBmb2N1c2VkQWN0aXZpdHlLZXlTdGF0ZTogT2JqZWN0LmZyZWV6ZShbZm9jdXNlZEFjdGl2aXR5S2V5XSkgYXMgcmVhZG9ubHkgW3N0cmluZ10sXG4gICAgICBmb2N1c2VkRXhwbGljaXRseVN0YXRlOiBPYmplY3QuZnJlZXplKFshIXJhd0ZvY3VzZWRBY3Rpdml0eUtleV0pIGFzIHJlYWRvbmx5IFtib29sZWFuXSxcbiAgICAgIGZvY3VzUmVsYXRpdmVBY3Rpdml0eVxuICAgIH0pLFxuICAgIFtcbiAgICAgIGFjdGl2ZURlc2NlbmRhbnRJZCxcbiAgICAgIGdldERlc2NlbmRhbnRJZEJ5QWN0aXZpdHlLZXksXG4gICAgICBmb2N1c0J5QWN0aXZpdHlLZXksXG4gICAgICBmb2N1c2VkQWN0aXZpdHlLZXksXG4gICAgICBmb2N1c1JlbGF0aXZlQWN0aXZpdHksXG4gICAgICByYXdGb2N1c2VkQWN0aXZpdHlLZXlcbiAgICBdXG4gICk7XG5cbiAgcmV0dXJuIDxUcmFuc2NyaXB0Rm9jdXNDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtjb250ZXh0VmFsdWV9PntjaGlsZHJlbn08L1RyYW5zY3JpcHRGb2N1c0NvbnRleHQuUHJvdmlkZXI+O1xufTtcblxuVHJhbnNjcmlwdEZvY3VzQ29tcG9zZXIucHJvcFR5cGVzID0ge1xuICAvLyBQcm9wVHlwZXMgaXMgbm90IGZ1bGx5IGNvbXBhdGlibGUgd2l0aCBUeXBlU2NyaXB0LlxuICAvLyBAdHMtaWdub3JlXG4gIGNvbnRhaW5lclJlZjogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBjdXJyZW50OiBQcm9wVHlwZXMuaW5zdGFuY2VPZihIVE1MRWxlbWVudClcbiAgfSkuaXNSZXF1aXJlZFxufTtcblxuZXhwb3J0IGRlZmF1bHQgVHJhbnNjcmlwdEZvY3VzQ29tcG9zZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxJQUFBQSx1QkFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsV0FBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUksTUFBQSxHQUFBQyx1QkFBQSxDQUFBTCxPQUFBO0FBRUEsSUFBQU0sK0JBQUEsR0FBQUosc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFPLFFBQUEsR0FBQUwsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFRLDRCQUFBLEdBQUFO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