botframework-webchat-component
Version:
React component of botframework-webchat
153 lines (149 loc) • 33.6 kB
JavaScript
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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
;