botframework-webchat-component
Version:
React component of botframework-webchat
145 lines (141 loc) • 29.3 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 _react = _interopRequireWildcard(require("react"));
var _LiveRegionTwinContainer = _interopRequireDefault(require("./private/LiveRegionTwinContainer"));
var _Context = _interopRequireDefault(require("./private/Context"));
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 _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
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 usePonyfill = _botframeworkWebchatApi.hooks.usePonyfill;
var DEFAULT_ARIA_LIVE = 'polite';
var DEFAULT_FADE_AFTER = 1000;
/**
* Live region twin is an UI component for queueing texts or elements to the screen reader using
* a container element with `aria-live` attribute set.
*
* After the text is rendered and queued, it will be removed to reduce burden on the DOM tree.
* Currently, we assume the assistive technologies should pick up the text within 1 second of rendering.
* This value is configurable.
*
* By default, the live region is visible. If is is not desirable, the caller can use `className` prop to
* hide its visuals.
*/
var LiveRegionTwinComposer = function LiveRegionTwinComposer(_ref) {
var ariaLabel = _ref['aria-label'],
_ref$ariaLive = _ref['aria-live'],
ariaLive = _ref$ariaLive === void 0 ? DEFAULT_ARIA_LIVE : _ref$ariaLive,
ariaRoleDescription = _ref['aria-roledescription'],
children = _ref.children,
className = _ref.className,
_ref$fadeAfter = _ref.fadeAfter,
fadeAfter = _ref$fadeAfter === void 0 ? DEFAULT_FADE_AFTER : _ref$fadeAfter,
role = _ref.role,
textElementClassName = _ref.textElementClassName;
var _usePonyfill = usePonyfill(),
_usePonyfill2 = _slicedToArray(_usePonyfill, 1),
_usePonyfill2$ = _usePonyfill2[0],
clearTimeout = _usePonyfill2$.clearTimeout,
setTimeout = _usePonyfill2$.setTimeout;
var _useState = (0, _react.useState)([]),
_useState2 = _slicedToArray(_useState, 2),
staticElementEntries = _useState2[0],
setStaticElementEntries = _useState2[1];
var fadeAfterRef = (0, _useValueRef.default)(fadeAfter);
var markAllAsRenderedTimeoutIdRef = (0, _react.useRef)();
var nextKeyRef = (0, _react.useRef)(1);
var staticElementEntriesRef = (0, _useValueRef.default)(staticElementEntries);
// This function is called by an effect hook `useMarkAllAsRenderedEffect`, it must be designed with converging in mind.
// To prevent infinite render loop, after multiple calls to this function, it should eventually no-op.
var markAllAsRendered = (0, _react.useCallback)(function () {
if (!staticElementEntriesRef.current.length) {
// Nothing to remove.
return;
}
// When removing each element one-by-one based on an individual timeout, Narrator would narrate them twice occasionally.
// Possibly it think some elements that is not removed during the current cycle, are new elements and queued them twice.
// Thus, we are removing all at once to prevent bugs in Narrator.
markAllAsRenderedTimeoutIdRef.current && clearTimeout(markAllAsRenderedTimeoutIdRef.current);
markAllAsRenderedTimeoutIdRef.current = setTimeout(function () {
// We are playing safe by using value ref to check its length here.
// If we are certain that `setStaticElements(emptyArray => emptyArray)` is a no-op,
// we could replace it with just the setter function.
staticElementEntriesRef.current.length && setStaticElementEntries([]);
}, fadeAfterRef.current);
}, [clearTimeout, fadeAfterRef, markAllAsRenderedTimeoutIdRef, setStaticElementEntries, setTimeout, staticElementEntriesRef]);
// When this component is unmounting, make sure all future `setTimeout` are cleared and should not be fired.
(0, _react.useEffect)(function () {
return function () {
return markAllAsRenderedTimeoutIdRef.current && clearTimeout(markAllAsRenderedTimeoutIdRef.current);
};
}, [clearTimeout, markAllAsRenderedTimeoutIdRef]);
var queueStaticElement = (0, _react.useCallback)(function (element) {
var key = nextKeyRef.current;
nextKeyRef.current = nextKeyRef.current + 1;
setStaticElementEntries(function (entries) {
return [].concat(_toConsumableArray(entries), [{
element: element,
key: key
}]);
});
}, [nextKeyRef, setStaticElementEntries]);
var staticElementEntriesState = (0, _react.useMemo)(function () {
return Object.freeze([Object.freeze(staticElementEntries)]);
}, [staticElementEntries]);
var context = (0, _react.useMemo)(function () {
return {
markAllAsRendered: markAllAsRendered,
queueStaticElement: queueStaticElement,
staticElementEntriesState: staticElementEntriesState
};
}, [markAllAsRendered, queueStaticElement, staticElementEntriesState]);
return /*#__PURE__*/_react.default.createElement(_Context.default.Provider, {
value: context
}, /*#__PURE__*/_react.default.createElement(_LiveRegionTwinContainer.default, {
"aria-label": ariaLabel,
"aria-live": ariaLive,
"aria-roledescription": ariaRoleDescription,
className: className,
role: role,
textElementClassName: textElementClassName
}), children);
};
LiveRegionTwinComposer.defaultProps = {
'aria-label': undefined,
'aria-live': DEFAULT_ARIA_LIVE,
'aria-roledescription': undefined,
children: undefined,
className: undefined,
fadeAfter: DEFAULT_FADE_AFTER,
role: undefined,
textElementClassName: undefined
};
LiveRegionTwinComposer.propTypes = {
'aria-label': _propTypes.default.string,
'aria-live': _propTypes.default.oneOf(['assertive', 'polite']),
'aria-roledescription': _propTypes.default.string,
children: _propTypes.default.any,
className: _propTypes.default.string,
fadeAfter: _propTypes.default.number,
role: _propTypes.default.string,
textElementClassName: _propTypes.default.string
};
var _default = LiveRegionTwinComposer;
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYm90ZnJhbWV3b3JrV2ViY2hhdEFwaSIsInJlcXVpcmUiLCJfcHJvcFR5cGVzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX0xpdmVSZWdpb25Ud2luQ29udGFpbmVyIiwiX0NvbnRleHQiLCJfdXNlVmFsdWVSZWYiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsIl90b0NvbnN1bWFibGVBcnJheSIsImFyciIsIl9hcnJheVdpdGhvdXRIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVTcHJlYWQiLCJUeXBlRXJyb3IiLCJpdGVyIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImZyb20iLCJpc0FycmF5IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJfc2xpY2VkVG9BcnJheSIsImkiLCJfYXJyYXlXaXRoSG9sZXMiLCJfaXRlcmFibGVUb0FycmF5TGltaXQiLCJfbm9uSXRlcmFibGVSZXN0IiwibyIsIm1pbkxlbiIsIm4iLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwidGVzdCIsImxlbiIsImxlbmd0aCIsImFycjIiLCJfaSIsIl9hcnIiLCJfbiIsIl9kIiwiX3MiLCJfZSIsIm5leHQiLCJkb25lIiwicHVzaCIsInZhbHVlIiwiZXJyIiwidXNlUG9ueWZpbGwiLCJob29rcyIsIkRFRkFVTFRfQVJJQV9MSVZFIiwiREVGQVVMVF9GQURFX0FGVEVSIiwiTGl2ZVJlZ2lvblR3aW5Db21wb3NlciIsIl9yZWYiLCJhcmlhTGFiZWwiLCJfcmVmJGFyaWFMaXZlIiwiYXJpYUxpdmUiLCJhcmlhUm9sZURlc2NyaXB0aW9uIiwiY2hpbGRyZW4iLCJjbGFzc05hbWUiLCJfcmVmJGZhZGVBZnRlciIsImZhZGVBZnRlciIsInJvbGUiLCJ0ZXh0RWxlbWVudENsYXNzTmFtZSIsIl91c2VQb255ZmlsbCIsIl91c2VQb255ZmlsbDIiLCJfdXNlUG9ueWZpbGwyJCIsImNsZWFyVGltZW91dCIsInNldFRpbWVvdXQiLCJfdXNlU3RhdGUiLCJ1c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJzdGF0aWNFbGVtZW50RW50cmllcyIsInNldFN0YXRpY0VsZW1lbnRFbnRyaWVzIiwiZmFkZUFmdGVyUmVmIiwidXNlVmFsdWVSZWYiLCJtYXJrQWxsQXNSZW5kZXJlZFRpbWVvdXRJZFJlZiIsInVzZVJlZiIsIm5leHRLZXlSZWYiLCJzdGF0aWNFbGVtZW50RW50cmllc1JlZiIsIm1hcmtBbGxBc1JlbmRlcmVkIiwidXNlQ2FsbGJhY2siLCJjdXJyZW50IiwidXNlRWZmZWN0IiwicXVldWVTdGF0aWNFbGVtZW50IiwiZWxlbWVudCIsImVudHJpZXMiLCJjb25jYXQiLCJzdGF0aWNFbGVtZW50RW50cmllc1N0YXRlIiwidXNlTWVtbyIsImZyZWV6ZSIsImNvbnRleHQiLCJjcmVhdGVFbGVtZW50IiwiUHJvdmlkZXIiLCJkZWZhdWx0UHJvcHMiLCJ1bmRlZmluZWQiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJzdHJpbmciLCJvbmVPZiIsImFueSIsIm51bWJlciIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VSb290IjoiY29tcG9uZW50Oi8vLyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9MaXZlUmVnaW9uVHdpbi9MaXZlUmVnaW9uVHdpbkNvbXBvc2VyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBob29rcyB9IGZyb20gJ2JvdGZyYW1ld29yay13ZWJjaGF0LWFwaSc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB0eXBlIHsgRkMsIFByb3BzV2l0aENoaWxkcmVuIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgTGl2ZVJlZ2lvblR3aW5Db250YWluZXIgZnJvbSAnLi9wcml2YXRlL0xpdmVSZWdpb25Ud2luQ29udGFpbmVyJztcbmltcG9ydCBMaXZlUmVnaW9uVHdpbkNvbnRleHQgZnJvbSAnLi9wcml2YXRlL0NvbnRleHQnO1xuaW1wb3J0IHVzZVZhbHVlUmVmIGZyb20gJy4uLy4uL2hvb2tzL2ludGVybmFsL3VzZVZhbHVlUmVmJztcblxuaW1wb3J0IHR5cGUgeyBTdGF0aWNFbGVtZW50LCBTdGF0aWNFbGVtZW50RW50cnkgfSBmcm9tICcuL3ByaXZhdGUvdHlwZXMnO1xuXG5jb25zdCB7IHVzZVBvbnlmaWxsIH0gPSBob29rcztcblxuY29uc3QgREVGQVVMVF9BUklBX0xJVkUgPSAncG9saXRlJztcbmNvbnN0IERFRkFVTFRfRkFERV9BRlRFUiA9IDEwMDA7XG5cbnR5cGUgTGl2ZVJlZ2lvblR3aW5Db21wb3NlclByb3BzID0gUHJvcHNXaXRoQ2hpbGRyZW48e1xuICAvKiogT3B0aW9uYWwgXCJhcmlhLWxhYmVsXCIgYXR0cmlidXRlIGZvciB0aGUgbGl2ZSByZWdpb24gdHdpbiBjb250YWluZXIuICovXG4gICdhcmlhLWxhYmVsJz86IHN0cmluZztcblxuICAvKiogXCJhcmlhLWxpdmVcIiBhdHRyaWJ1dGUgZm9yIHRoZSBsaXZlIHJlZ2lvbiB0d2luIGNvbnRhaW5lciwgZGVmYXVsdHMgdG8gYCdwb2xpdGUnYC4gKi9cbiAgJ2FyaWEtbGl2ZSc/OiAnYXNzZXJ0aXZlJyB8ICdwb2xpdGUnO1xuXG4gIC8qKiBPcHRpb25hbCBcImFyaWEtcm9sZWRlc2NyaXB0aW9uXCIgYXR0cmlidXRlIGZvciB0aGUgbGl2ZSByZWdpb24gdHdpbiBjb250YWluZXIuICovXG4gICdhcmlhLXJvbGVkZXNjcmlwdGlvbic/OiBzdHJpbmc7XG5cbiAgLyoqIE9wdGlvbmFsIFwiY2xhc3NOYW1lXCIgYXR0cmlidXRlIGZvciB0aGUgbGl2ZSByZWdpb24gdHdpbiBjb250YWluZXIuICovXG4gIGNsYXNzTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3RhdGljIGVsZW1lbnRzIHdpbGwgZmFkZSBvdXQgYWZ0ZXIgdGhpcyB0aW1lb3V0IHZhbHVlIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMsIGRlZmF1bHRzIHRvIGAxMDAwYC5cbiAgICpcbiAgICogV2hlbiBsb3dlcmluZyB0aGlzIHZhbHVlLCBtYWtlIHN1cmUgc2NyZWVuIHJlYWRlciBjYW4gY29udGludWUgdG8gcGljayB1cCBuZXcgc3RhdGljIGVsZW1lbnRzIGJlZm9yZSBmYWRpbmcgb3V0LlxuICAgKlxuICAgKiBJZiB0aGlzIHByb3AgaXMgdXBkYXRlZCwgaXQgd2lsbCBiZSByZWZsZWN0ZWQgaW4gbmV4dCBxdWV1ZWluZyBlbGVtZW50cy5cbiAgICovXG4gIGZhZGVBZnRlcj86IG51bWJlcjtcblxuICAvKiogT3B0aW9uYWwgXCJyb2xlXCIgYXR0cmlidXRlIGZvciB0aGUgbGl2ZSByZWdpb24gdHdpbiBjb250YWluZXIuICovXG4gIHJvbGU/OiBzdHJpbmc7XG5cbiAgLyoqIE9wdGlvbmFsIFwiY2xhc3NOYW1lXCIgYXR0cmlidXRlIGZvciBzdGF0aWMgdGV4dCBlbGVtZW50LiAqL1xuICB0ZXh0RWxlbWVudENsYXNzTmFtZT86IHN0cmluZztcbn0+O1xuXG4vKipcbiAqIExpdmUgcmVnaW9uIHR3aW4gaXMgYW4gVUkgY29tcG9uZW50IGZvciBxdWV1ZWluZyB0ZXh0cyBvciBlbGVtZW50cyB0byB0aGUgc2NyZWVuIHJlYWRlciB1c2luZ1xuICogYSBjb250YWluZXIgZWxlbWVudCB3aXRoIGBhcmlhLWxpdmVgIGF0dHJpYnV0ZSBzZXQuXG4gKlxuICogQWZ0ZXIgdGhlIHRleHQgaXMgcmVuZGVyZWQgYW5kIHF1ZXVlZCwgaXQgd2lsbCBiZSByZW1vdmVkIHRvIHJlZHVjZSBidXJkZW4gb24gdGhlIERPTSB0cmVlLlxuICogQ3VycmVudGx5LCB3ZSBhc3N1bWUgdGhlIGFzc2lzdGl2ZSB0ZWNobm9sb2dpZXMgc2hvdWxkIHBpY2sgdXAgdGhlIHRleHQgd2l0aGluIDEgc2Vjb25kIG9mIHJlbmRlcmluZy5cbiAqIFRoaXMgdmFsdWUgaXMgY29uZmlndXJhYmxlLlxuICpcbiAqIEJ5IGRlZmF1bHQsIHRoZSBsaXZlIHJlZ2lvbiBpcyB2aXNpYmxlLiBJZiBpcyBpcyBub3QgZGVzaXJhYmxlLCB0aGUgY2FsbGVyIGNhbiB1c2UgYGNsYXNzTmFtZWAgcHJvcCB0b1xuICogaGlkZSBpdHMgdmlzdWFscy5cbiAqL1xuY29uc3QgTGl2ZVJlZ2lvblR3aW5Db21wb3NlcjogRkM8TGl2ZVJlZ2lvblR3aW5Db21wb3NlclByb3BzPiA9ICh7XG4gICdhcmlhLWxhYmVsJzogYXJpYUxhYmVsLFxuICAnYXJpYS1saXZlJzogYXJpYUxpdmUgPSBERUZBVUxUX0FSSUFfTElWRSxcbiAgJ2FyaWEtcm9sZWRlc2NyaXB0aW9uJzogYXJpYVJvbGVEZXNjcmlwdGlvbixcbiAgY2hpbGRyZW4sXG4gIGNsYXNzTmFtZSxcbiAgZmFkZUFmdGVyID0gREVGQVVMVF9GQURFX0FGVEVSLFxuICByb2xlLFxuICB0ZXh0RWxlbWVudENsYXNzTmFtZVxufSkgPT4ge1xuICBjb25zdCBbeyBjbGVhclRpbWVvdXQsIHNldFRpbWVvdXQgfV0gPSB1c2VQb255ZmlsbCgpO1xuICBjb25zdCBbc3RhdGljRWxlbWVudEVudHJpZXMsIHNldFN0YXRpY0VsZW1lbnRFbnRyaWVzXSA9IHVzZVN0YXRlPFN0YXRpY0VsZW1lbnRFbnRyeVtdPihbXSk7XG4gIGNvbnN0IGZhZGVBZnRlclJlZiA9IHVzZVZhbHVlUmVmKGZhZGVBZnRlcik7XG4gIGNvbnN0IG1hcmtBbGxBc1JlbmRlcmVkVGltZW91dElkUmVmID0gdXNlUmVmPGFueT4oKTtcbiAgY29uc3QgbmV4dEtleVJlZiA9IHVzZVJlZjxudW1iZXI+KDEpO1xuXG4gIGNvbnN0IHN0YXRpY0VsZW1lbnRFbnRyaWVzUmVmID0gdXNlVmFsdWVSZWYoc3RhdGljRWxlbWVudEVudHJpZXMpO1xuXG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGFuIGVmZmVjdCBob29rIGB1c2VNYXJrQWxsQXNSZW5kZXJlZEVmZmVjdGAsIGl0IG11c3QgYmUgZGVzaWduZWQgd2l0aCBjb252ZXJnaW5nIGluIG1pbmQuXG4gIC8vIFRvIHByZXZlbnQgaW5maW5pdGUgcmVuZGVyIGxvb3AsIGFmdGVyIG11bHRpcGxlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24sIGl0IHNob3VsZCBldmVudHVhbGx5IG5vLW9wLlxuICBjb25zdCBtYXJrQWxsQXNSZW5kZXJlZCA9IHVzZUNhbGxiYWNrPCgpID0+IHZvaWQ+KCgpID0+IHtcbiAgICBpZiAoIXN0YXRpY0VsZW1lbnRFbnRyaWVzUmVmLmN1cnJlbnQubGVuZ3RoKSB7XG4gICAgICAvLyBOb3RoaW5nIHRvIHJlbW92ZS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXaGVuIHJlbW92aW5nIGVhY2ggZWxlbWVudCBvbmUtYnktb25lIGJhc2VkIG9uIGFuIGluZGl2aWR1YWwgdGltZW91dCwgTmFycmF0b3Igd291bGQgbmFycmF0ZSB0aGVtIHR3aWNlIG9jY2FzaW9uYWxseS5cbiAgICAvLyBQb3NzaWJseSBpdCB0aGluayBzb21lIGVsZW1lbnRzIHRoYXQgaXMgbm90IHJlbW92ZWQgZHVyaW5nIHRoZSBjdXJyZW50IGN5Y2xlLCBhcmUgbmV3IGVsZW1lbnRzIGFuZCBxdWV1ZWQgdGhlbSB0d2ljZS5cbiAgICAvLyBUaHVzLCB3ZSBhcmUgcmVtb3ZpbmcgYWxsIGF0IG9uY2UgdG8gcHJldmVudCBidWdzIGluIE5hcnJhdG9yLlxuICAgIG1hcmtBbGxBc1JlbmRlcmVkVGltZW91dElkUmVmLmN1cnJlbnQgJiYgY2xlYXJUaW1lb3V0KG1hcmtBbGxBc1JlbmRlcmVkVGltZW91dElkUmVmLmN1cnJlbnQpO1xuXG4gICAgbWFya0FsbEFzUmVuZGVyZWRUaW1lb3V0SWRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gV2UgYXJlIHBsYXlpbmcgc2FmZSBieSB1c2luZyB2YWx1ZSByZWYgdG8gY2hlY2sgaXRzIGxlbmd0aCBoZXJlLlxuICAgICAgLy8gSWYgd2UgYXJlIGNlcnRhaW4gdGhhdCBgc2V0U3RhdGljRWxlbWVudHMoZW1wdHlBcnJheSA9PiBlbXB0eUFycmF5KWAgaXMgYSBuby1vcCxcbiAgICAgIC8vIHdlIGNvdWxkIHJlcGxhY2UgaXQgd2l0aCBqdXN0IHRoZSBzZXR0ZXIgZnVuY3Rpb24uXG4gICAgICBzdGF0aWNFbGVtZW50RW50cmllc1JlZi5jdXJyZW50Lmxlbmd0aCAmJiBzZXRTdGF0aWNFbGVtZW50RW50cmllcyhbXSk7XG4gICAgfSwgZmFkZUFmdGVyUmVmLmN1cnJlbnQpO1xuICB9LCBbXG4gICAgY2xlYXJUaW1lb3V0LFxuICAgIGZhZGVBZnRlclJlZixcbiAgICBtYXJrQWxsQXNSZW5kZXJlZFRpbWVvdXRJZFJlZixcbiAgICBzZXRTdGF0aWNFbGVtZW50RW50cmllcyxcbiAgICBzZXRUaW1lb3V0LFxuICAgIHN0YXRpY0VsZW1lbnRFbnRyaWVzUmVmXG4gIF0pO1xuXG4gIC8vIFdoZW4gdGhpcyBjb21wb25lbnQgaXMgdW5tb3VudGluZywgbWFrZSBzdXJlIGFsbCBmdXR1cmUgYHNldFRpbWVvdXRgIGFyZSBjbGVhcmVkIGFuZCBzaG91bGQgbm90IGJlIGZpcmVkLlxuICB1c2VFZmZlY3QoXG4gICAgKCkgPT4gKCkgPT4gbWFya0FsbEFzUmVuZGVyZWRUaW1lb3V0SWRSZWYuY3VycmVudCAmJiBjbGVhclRpbWVvdXQobWFya0FsbEFzUmVuZGVyZWRUaW1lb3V0SWRSZWYuY3VycmVudCksXG4gICAgW2NsZWFyVGltZW91dCwgbWFya0FsbEFzUmVuZGVyZWRUaW1lb3V0SWRSZWZdXG4gICk7XG5cbiAgY29uc3QgcXVldWVTdGF0aWNFbGVtZW50ID0gdXNlQ2FsbGJhY2s8KHN0YXRpY0VsZW1lbnQ6IFN0YXRpY0VsZW1lbnQpID0+IHZvaWQ+KFxuICAgIChlbGVtZW50OiBTdGF0aWNFbGVtZW50KTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBuZXh0S2V5UmVmLmN1cnJlbnQ7XG5cbiAgICAgIG5leHRLZXlSZWYuY3VycmVudCA9IG5leHRLZXlSZWYuY3VycmVudCArIDE7XG5cbiAgICAgIHNldFN0YXRpY0VsZW1lbnRFbnRyaWVzKGVudHJpZXMgPT4gWy4uLmVudHJpZXMsIHsgZWxlbWVudCwga2V5IH1dKTtcbiAgICB9LFxuICAgIFtuZXh0S2V5UmVmLCBzZXRTdGF0aWNFbGVtZW50RW50cmllc11cbiAgKTtcblxuICBjb25zdCBzdGF0aWNFbGVtZW50RW50cmllc1N0YXRlID0gdXNlTWVtbzxyZWFkb25seSBbcmVhZG9ubHkgU3RhdGljRWxlbWVudEVudHJ5W11dPihcbiAgICAoKSA9PiBPYmplY3QuZnJlZXplKFtPYmplY3QuZnJlZXplKHN0YXRpY0VsZW1lbnRFbnRyaWVzKV0pIGFzIHJlYWRvbmx5IFtyZWFkb25seSBTdGF0aWNFbGVtZW50RW50cnlbXV0sXG4gICAgW3N0YXRpY0VsZW1lbnRFbnRyaWVzXVxuICApO1xuXG4gIGNvbnN0IGNvbnRleHQgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBtYXJrQWxsQXNSZW5kZXJlZCxcbiAgICAgIHF1ZXVlU3RhdGljRWxlbWVudCxcbiAgICAgIHN0YXRpY0VsZW1lbnRFbnRyaWVzU3RhdGVcbiAgICB9KSxcbiAgICBbbWFya0FsbEFzUmVuZGVyZWQsIHF1ZXVlU3RhdGljRWxlbWVudCwgc3RhdGljRWxlbWVudEVudHJpZXNTdGF0ZV1cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxMaXZlUmVnaW9uVHdpbkNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NvbnRleHR9PlxuICAgICAgPExpdmVSZWdpb25Ud2luQ29udGFpbmVyXG4gICAgICAgIGFyaWEtbGFiZWw9e2FyaWFMYWJlbH1cbiAgICAgICAgYXJpYS1saXZlPXthcmlhTGl2ZX1cbiAgICAgICAgYXJpYS1yb2xlZGVzY3JpcHRpb249e2FyaWFSb2xlRGVzY3JpcHRpb259XG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgICAgICByb2xlPXtyb2xlfVxuICAgICAgICB0ZXh0RWxlbWVudENsYXNzTmFtZT17dGV4dEVsZW1lbnRDbGFzc05hbWV9XG4gICAgICAvPlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvTGl2ZVJlZ2lvblR3aW5Db250ZXh0LlByb3ZpZGVyPlxuICApO1xufTtcblxuTGl2ZVJlZ2lvblR3aW5Db21wb3Nlci5kZWZhdWx0UHJvcHMgPSB7XG4gICdhcmlhLWxhYmVsJzogdW5kZWZpbmVkLFxuICAnYXJpYS1saXZlJzogREVGQVVMVF9BUklBX0xJVkUsXG4gICdhcmlhLXJvbGVkZXNjcmlwdGlvbic6IHVuZGVmaW5lZCxcbiAgY2hpbGRyZW46IHVuZGVmaW5lZCxcbiAgY2xhc3NOYW1lOiB1bmRlZmluZWQsXG4gIGZhZGVBZnRlcjogREVGQVVMVF9GQURFX0FGVEVSLFxuICByb2xlOiB1bmRlZmluZWQsXG4gIHRleHRFbGVtZW50Q2xhc3NOYW1lOiB1bmRlZmluZWRcbn07XG5cbkxpdmVSZWdpb25Ud2luQ29tcG9zZXIucHJvcFR5cGVzID0ge1xuICAnYXJpYS1sYWJlbCc6IFByb3BUeXBlcy5zdHJpbmcsXG4gICdhcmlhLWxpdmUnOiBQcm9wVHlwZXMub25lT2YoWydhc3NlcnRpdmUnLCAncG9saXRlJ10pLFxuICAnYXJpYS1yb2xlZGVzY3JpcHRpb24nOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLmFueSxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBmYWRlQWZ0ZXI6IFByb3BUeXBlcy5udW1iZXIsXG4gIHJvbGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHRleHRFbGVtZW50Q2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuXG5leHBvcnQgZGVmYXVsdCBMaXZlUmVnaW9uVHdpbkNvbXBvc2VyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsSUFBQUEsdUJBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLFVBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUosT0FBQTtBQUlBLElBQUFLLHdCQUFBLEdBQUFILHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTSxRQUFBLEdBQUFKLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTyxZQUFBLEdBQUFMLHNCQUFBLENBQUFGLE9BQUE7QUFBMkQsU0FBQVEseUJBQUFDLFdBQUEsZUFBQUMsT0FBQSxrQ0FBQUMsaUJBQUEsT0FBQUQsT0FBQSxRQUFBRSxnQkFBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxXQUFBLFdBQUFBLFdBQUEsR0FBQUcsZ0JBQUEsR0FBQUQsaUJBQUEsS0FBQUYsV0FBQTtBQUFBLFNBQUFMLHdCQUFBUyxHQUFBLEVBQUFKLFdBQUEsU0FBQUEsV0FBQSxJQUFBSSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxXQUFBRCxHQUFBLFFBQUFBLEdBQUEsYUFBQUUsT0FBQSxDQUFBRixHQUFBLHlCQUFBQSxHQUFBLDRCQUFBRyxPQUFBLEVBQUFILEdBQUEsVUFBQUksS0FBQSxHQUFBVCx3QkFBQSxDQUFBQyxXQUFBLE9BQUFRLEtBQUEsSUFBQUEsS0FBQSxDQUFBQyxHQUFBLENBQUFMLEdBQUEsWUFBQUksS0FBQSxDQUFBRSxHQUFBLENBQUFOLEdBQUEsU0FBQU8sTUFBQSxXQUFBQyxxQkFBQSxHQUFBQyxNQUFBLENBQUFD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
;