UNPKG

botframework-webchat-component

Version:
260 lines (202 loc) 28.7 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.useMicrophoneButtonDisabled = useMicrophoneButtonDisabled; exports.useMicrophoneButtonClick = exports.connectMicrophoneButton = exports.default = void 0; var _botframeworkWebchatCore = require("botframework-webchat-core"); var _botframeworkWebchatApi = require("botframework-webchat-api"); var _classnames = _interopRequireDefault(require("classnames")); var _memoizeOne = _interopRequireDefault(require("memoize-one")); var _propTypes = _interopRequireDefault(require("prop-types")); var _react = _interopRequireWildcard(require("react")); var _connectToWebChat = _interopRequireDefault(require("../connectToWebChat")); var _IconButton = _interopRequireDefault(require("./IconButton")); var _MicrophoneIcon = _interopRequireDefault(require("./Assets/MicrophoneIcon")); var _useDictateAbortable3 = _interopRequireDefault(require("../hooks/useDictateAbortable")); var _useStyleSet3 = _interopRequireDefault(require("../hooks/useStyleSet")); var _useStyleToEmotionObject = _interopRequireDefault(require("../hooks/internal/useStyleToEmotionObject")); var _useWebSpeechPonyfill4 = _interopRequireDefault(require("../hooks/useWebSpeechPonyfill")); function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (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) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_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 DictateState = _botframeworkWebchatCore.Constants.DictateState; var useDictateInterims = _botframeworkWebchatApi.hooks.useDictateInterims, useDictateState = _botframeworkWebchatApi.hooks.useDictateState, useDisabled = _botframeworkWebchatApi.hooks.useDisabled, useLocalizer = _botframeworkWebchatApi.hooks.useLocalizer, useSendBoxValue = _botframeworkWebchatApi.hooks.useSendBoxValue, useShouldSpeakIncomingActivity = _botframeworkWebchatApi.hooks.useShouldSpeakIncomingActivity, useStartDictate = _botframeworkWebchatApi.hooks.useStartDictate, useStopDictate = _botframeworkWebchatApi.hooks.useStopDictate; var ROOT_STYLE = { display: 'flex', // .sr-only - This component is intended to be invisible to the visual Web Chat user, but read by the AT when using a screen reader '& > .sr-only': { color: 'transparent', height: 1, left: -10000, overflow: 'hidden', position: 'absolute', top: 0, whiteSpace: 'nowrap', width: 1 } }; var connectMicrophoneButton = function connectMicrophoneButton() { var primeSpeechSynthesis = (0, _memoizeOne.default)(function (speechSynthesis, SpeechSynthesisUtterance) { if (speechSynthesis && SpeechSynthesisUtterance) { var utterance = new SpeechSynthesisUtterance(''); var _speechSynthesis$getV = speechSynthesis.getVoices(); var _speechSynthesis$getV2 = _slicedToArray(_speechSynthesis$getV, 1); utterance.voice = _speechSynthesis$getV2[0]; speechSynthesis.speak(utterance); } }); for (var _len = arguments.length, selectors = new Array(_len), _key = 0; _key < _len; _key++) { selectors[_key] = arguments[_key]; } return _connectToWebChat.default.apply(void 0, [function (_ref) { var disabled = _ref.disabled, dictateInterims = _ref.dictateInterims, dictateState = _ref.dictateState, language = _ref.language, setSendBox = _ref.setSendBox, startDictate = _ref.startDictate, stopDictate = _ref.stopDictate, stopSpeakingActivity = _ref.stopSpeakingActivity, _ref$webSpeechPonyfil = _ref.webSpeechPonyfill; _ref$webSpeechPonyfil = _ref$webSpeechPonyfil === void 0 ? {} : _ref$webSpeechPonyfil; var speechSynthesis = _ref$webSpeechPonyfil.speechSynthesis, SpeechSynthesisUtterance = _ref$webSpeechPonyfil.SpeechSynthesisUtterance; return { click: function click() { if (dictateState === DictateState.WILL_START) { stopSpeakingActivity(); } else if (dictateState === DictateState.DICTATING) { stopDictate(); setSendBox(dictateInterims.join(' ')); } else { stopSpeakingActivity(); startDictate(); } primeSpeechSynthesis(speechSynthesis, SpeechSynthesisUtterance); }, dictating: dictateState === DictateState.DICTATING, disabled: disabled || dictateState === DictateState.STARTING && dictateState === DictateState.STOPPING, language: language }; }].concat(selectors)); }; exports.connectMicrophoneButton = connectMicrophoneButton; var useMicrophoneButtonClick = function useMicrophoneButtonClick() { var _useSendBoxValue = useSendBoxValue(), _useSendBoxValue2 = _slicedToArray(_useSendBoxValue, 2), setSendBox = _useSendBoxValue2[1]; var _useShouldSpeakIncomi = useShouldSpeakIncomingActivity(), _useShouldSpeakIncomi2 = _slicedToArray(_useShouldSpeakIncomi, 2), setShouldSpeakIncomingActivity = _useShouldSpeakIncomi2[1]; var _useWebSpeechPonyfill = (0, _useWebSpeechPonyfill4.default)(), _useWebSpeechPonyfill2 = _slicedToArray(_useWebSpeechPonyfill, 1), _useWebSpeechPonyfill3 = _useWebSpeechPonyfill2[0]; _useWebSpeechPonyfill3 = _useWebSpeechPonyfill3 === void 0 ? {} : _useWebSpeechPonyfill3; var speechSynthesis = _useWebSpeechPonyfill3.speechSynthesis, SpeechSynthesisUtterance = _useWebSpeechPonyfill3.SpeechSynthesisUtterance; var _useDictateInterims = useDictateInterims(), _useDictateInterims2 = _slicedToArray(_useDictateInterims, 1), dictateInterims = _useDictateInterims2[0]; var _useDictateState = useDictateState(), _useDictateState2 = _slicedToArray(_useDictateState, 1), dictateState = _useDictateState2[0]; var startDictate = useStartDictate(); var stopDictate = useStopDictate(); var _useState = (0, _react.useState)(function () { return (0, _memoizeOne.default)(function (speechSynthesis, SpeechSynthesisUtterance) { if (speechSynthesis && SpeechSynthesisUtterance) { var utterance = new SpeechSynthesisUtterance(''); var _speechSynthesis$getV3 = speechSynthesis.getVoices(); var _speechSynthesis$getV4 = _slicedToArray(_speechSynthesis$getV3, 1); utterance.voice = _speechSynthesis$getV4[0]; speechSynthesis.speak(utterance); } }); }), _useState2 = _slicedToArray(_useState, 1), primeSpeechSynthesis = _useState2[0]; // TODO: [P2] We should revisit this function later // The click() logic seems local to the component, but may not be generalized across all implementations. return (0, _react.useCallback)(function () { if (dictateState === DictateState.WILL_START) { setShouldSpeakIncomingActivity(false); } else if (dictateState === DictateState.DICTATING) { stopDictate(); setSendBox(dictateInterims.join(' ')); } else { setShouldSpeakIncomingActivity(false); startDictate(); } primeSpeechSynthesis(speechSynthesis, SpeechSynthesisUtterance); }, [dictateInterims, dictateState, primeSpeechSynthesis, setSendBox, setShouldSpeakIncomingActivity, speechSynthesis, SpeechSynthesisUtterance, startDictate, stopDictate]); }; exports.useMicrophoneButtonClick = useMicrophoneButtonClick; function useMicrophoneButtonDisabled() { var _useDictateAbortable = (0, _useDictateAbortable3.default)(), _useDictateAbortable2 = _slicedToArray(_useDictateAbortable, 1), abortable = _useDictateAbortable2[0]; var _useDictateState3 = useDictateState(), _useDictateState4 = _slicedToArray(_useDictateState3, 1), dictateState = _useDictateState4[0]; var _useDisabled = useDisabled(), _useDisabled2 = _slicedToArray(_useDisabled, 1), disabled = _useDisabled2[0]; return [disabled || dictateState === DictateState.STARTING || dictateState === DictateState.STOPPING || dictateState === DictateState.DICTATING && !abortable]; } var MicrophoneButton = function MicrophoneButton(_ref2) { var className = _ref2.className; var _useStyleSet = (0, _useStyleSet3.default)(), _useStyleSet2 = _slicedToArray(_useStyleSet, 1), microphoneButtonStyleSet = _useStyleSet2[0].microphoneButton; var _useDictateState5 = useDictateState(), _useDictateState6 = _slicedToArray(_useDictateState5, 1), dictateState = _useDictateState6[0]; var _useMicrophoneButtonD = useMicrophoneButtonDisabled(), _useMicrophoneButtonD2 = _slicedToArray(_useMicrophoneButtonD, 1), disabled = _useMicrophoneButtonD2[0]; var click = useMicrophoneButtonClick(); var localize = useLocalizer(); var rootClassName = (0, _useStyleToEmotionObject.default)()(ROOT_STYLE) + ''; var dictating = dictateState === DictateState.DICTATING; return /*#__PURE__*/_react.default.createElement("div", { "aria-controls": "webchatSendBoxMicrophoneButton", className: (0, _classnames.default)('webchat__microphone-button', { 'webchat__microphone-button--dictating': dictating }, microphoneButtonStyleSet + '', rootClassName, (className || '') + '') }, /*#__PURE__*/_react.default.createElement(_IconButton.default, { alt: localize('TEXT_INPUT_SPEAK_BUTTON_ALT'), className: "webchat__microphone-button__button", disabled: disabled, onClick: click }, /*#__PURE__*/_react.default.createElement(_MicrophoneIcon.default, { className: "webchat__microphone-button__icon" })), /*#__PURE__*/_react.default.createElement("div", { "aria-live": "polite", className: "sr-only", id: "webchatSendBoxMicrophoneButton", role: "status" }, localize(dictating ? 'SPEECH_INPUT_MICROPHONE_BUTTON_OPEN_ALT' : 'SPEECH_INPUT_MICROPHONE_BUTTON_CLOSE_ALT'))); }; MicrophoneButton.defaultProps = { className: '' }; MicrophoneButton.propTypes = { className: _propTypes.default.string }; var _default = MicrophoneButton; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TZW5kQm94L01pY3JvcGhvbmVCdXR0b24uanMiXSwibmFtZXMiOlsiRGljdGF0ZVN0YXRlIiwiQ29uc3RhbnRzIiwidXNlRGljdGF0ZUludGVyaW1zIiwiaG9va3MiLCJ1c2VEaWN0YXRlU3RhdGUiLCJ1c2VEaXNhYmxlZCIsInVzZUxvY2FsaXplciIsInVzZVNlbmRCb3hWYWx1ZSIsInVzZVNob3VsZFNwZWFrSW5jb21pbmdBY3Rpdml0eSIsInVzZVN0YXJ0RGljdGF0ZSIsInVzZVN0b3BEaWN0YXRlIiwiUk9PVF9TVFlMRSIsImRpc3BsYXkiLCJjb2xvciIsImhlaWdodCIsImxlZnQiLCJvdmVyZmxvdyIsInBvc2l0aW9uIiwidG9wIiwid2hpdGVTcGFjZSIsIndpZHRoIiwiY29ubmVjdE1pY3JvcGhvbmVCdXR0b24iLCJwcmltZVNwZWVjaFN5bnRoZXNpcyIsInNwZWVjaFN5bnRoZXNpcyIsIlNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZSIsInV0dGVyYW5jZSIsImdldFZvaWNlcyIsInZvaWNlIiwic3BlYWsiLCJzZWxlY3RvcnMiLCJjb25uZWN0VG9XZWJDaGF0IiwiZGlzYWJsZWQiLCJkaWN0YXRlSW50ZXJpbXMiLCJkaWN0YXRlU3RhdGUiLCJsYW5ndWFnZSIsInNldFNlbmRCb3giLCJzdGFydERpY3RhdGUiLCJzdG9wRGljdGF0ZSIsInN0b3BTcGVha2luZ0FjdGl2aXR5Iiwid2ViU3BlZWNoUG9ueWZpbGwiLCJjbGljayIsIldJTExfU1RBUlQiLCJESUNUQVRJTkciLCJqb2luIiwiZGljdGF0aW5nIiwiU1RBUlRJTkciLCJTVE9QUElORyIsInVzZU1pY3JvcGhvbmVCdXR0b25DbGljayIsInNldFNob3VsZFNwZWFrSW5jb21pbmdBY3Rpdml0eSIsInVzZU1pY3JvcGhvbmVCdXR0b25EaXNhYmxlZCIsImFib3J0YWJsZSIsIk1pY3JvcGhvbmVCdXR0b24iLCJjbGFzc05hbWUiLCJtaWNyb3Bob25lQnV0dG9uU3R5bGVTZXQiLCJtaWNyb3Bob25lQnV0dG9uIiwibG9jYWxpemUiLCJyb290Q2xhc3NOYW1lIiwiZGVmYXVsdFByb3BzIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwic3RyaW5nIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBRVFBLFksR0FBaUJDLGtDLENBQWpCRCxZO0lBR05FLGtCLEdBUUVDLDZCLENBUkZELGtCO0lBQ0FFLGUsR0FPRUQsNkIsQ0FQRkMsZTtJQUNBQyxXLEdBTUVGLDZCLENBTkZFLFc7SUFDQUMsWSxHQUtFSCw2QixDQUxGRyxZO0lBQ0FDLGUsR0FJRUosNkIsQ0FKRkksZTtJQUNBQyw4QixHQUdFTCw2QixDQUhGSyw4QjtJQUNBQyxlLEdBRUVOLDZCLENBRkZNLGU7SUFDQUMsYyxHQUNFUCw2QixDQURGTyxjO0FBR0YsSUFBTUMsVUFBVSxHQUFHO0FBQ2pCQyxFQUFBQSxPQUFPLEVBQUUsTUFEUTtBQUdqQjtBQUVBLGtCQUFnQjtBQUNkQyxJQUFBQSxLQUFLLEVBQUUsYUFETztBQUVkQyxJQUFBQSxNQUFNLEVBQUUsQ0FGTTtBQUdkQyxJQUFBQSxJQUFJLEVBQUUsQ0FBQyxLQUhPO0FBSWRDLElBQUFBLFFBQVEsRUFBRSxRQUpJO0FBS2RDLElBQUFBLFFBQVEsRUFBRSxVQUxJO0FBTWRDLElBQUFBLEdBQUcsRUFBRSxDQU5TO0FBT2RDLElBQUFBLFVBQVUsRUFBRSxRQVBFO0FBUWRDLElBQUFBLEtBQUssRUFBRTtBQVJPO0FBTEMsQ0FBbkI7O0FBaUJBLElBQU1DLHVCQUF1QixHQUFHLFNBQTFCQSx1QkFBMEIsR0FBa0I7QUFDaEQsTUFBTUMsb0JBQW9CLEdBQUcseUJBQVEsVUFBQ0MsZUFBRCxFQUFrQkMsd0JBQWxCLEVBQStDO0FBQ2xGLFFBQUlELGVBQWUsSUFBSUMsd0JBQXZCLEVBQWlEO0FBQy9DLFVBQU1DLFNBQVMs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SUFBQSxJQUFJLEVBQUM7QUFBckYsS0FDR2UsUUFBUSxDQUFDWCxTQUFTLEdBQUcseUNBQUgsR0FBK0MsMENBQXpELENBRFgsQ0FsQkYsQ0FERjtBQXdCRCxDQWxDRDs7QUFvQ0FPLGdCQUFnQixDQUFDTSxZQUFqQixHQUFnQztBQUM5QkwsRUFBQUEsU0FBUyxFQUFFO0FBRG1CLENBQWhDO0FBSUFELGdCQUFnQixDQUFDTyxTQUFqQixHQUE2QjtBQUMzQk4sRUFBQUEsU0FBUyxFQUFFTyxtQkFBVUM7QUFETSxDQUE3QjtlQUllVCxnQiIsInNvdXJjZVJvb3QiOiJjb21wb25lbnQ6Ly8vIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBpcyByZXF1aXJlZCBmb3IgYXJpYS1jb250cm9scy5cbi8qIGVzbGludCByZWFjdC9mb3JiaWQtZG9tLXByb3BzOiBcIm9mZlwiICovXG5cbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJ2JvdGZyYW1ld29yay13ZWJjaGF0LWNvcmUnO1xuaW1wb3J0IHsgaG9va3MgfSBmcm9tICdib3RmcmFtZXdvcmstd2ViY2hhdC1hcGknO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgbWVtb2l6ZSBmcm9tICdtZW1vaXplLW9uZSc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IGNvbm5lY3RUb1dlYkNoYXQgZnJvbSAnLi4vY29ubmVjdFRvV2ViQ2hhdCc7XG5pbXBvcnQgSWNvbkJ1dHRvbiBmcm9tICcuL0ljb25CdXR0b24nO1xuaW1wb3J0IE1pY3JvcGhvbmVJY29uIGZyb20gJy4vQXNzZXRzL01pY3JvcGhvbmVJY29uJztcbmltcG9ydCB1c2VEaWN0YXRlQWJvcnRhYmxlIGZyb20gJy4uL2hvb2tzL3VzZURpY3RhdGVBYm9ydGFibGUnO1xuaW1wb3J0IHVzZVN0eWxlU2V0IGZyb20gJy4uL2hvb2tzL3VzZVN0eWxlU2V0JztcbmltcG9ydCB1c2VTdHlsZVRvRW1vdGlvbk9iamVjdCBmcm9tICcuLi9ob29rcy9pbnRlcm5hbC91c2VTdHlsZVRvRW1vdGlvbk9iamVjdCc7XG5pbXBvcnQgdXNlV2ViU3BlZWNoUG9ueWZpbGwgZnJvbSAnLi4vaG9va3MvdXNlV2ViU3BlZWNoUG9ueWZpbGwnO1xuXG5jb25zdCB7IERpY3RhdGVTdGF0ZSB9ID0gQ29uc3RhbnRzO1xuXG5jb25zdCB7XG4gIHVzZURpY3RhdGVJbnRlcmltcyxcbiAgdXNlRGljdGF0ZVN0YXRlLFxuICB1c2VEaXNhYmxlZCxcbiAgdXNlTG9jYWxpemVyLFxuICB1c2VTZW5kQm94VmFsdWUsXG4gIHVzZVNob3VsZFNwZWFrSW5jb21pbmdBY3Rpdml0eSxcbiAgdXNlU3RhcnREaWN0YXRlLFxuICB1c2VTdG9wRGljdGF0ZVxufSA9IGhvb2tzO1xuXG5jb25zdCBST09UX1NUWUxFID0ge1xuICBkaXNwbGF5OiAnZmxleCcsXG5cbiAgLy8gLnNyLW9ubHkgLSBUaGlzIGNvbXBvbmVudCBpcyBpbnRlbmRlZCB0byBiZSBpbnZpc2libGUgdG8gdGhlIHZpc3VhbCBXZWIgQ2hhdCB1c2VyLCBidXQgcmVhZCBieSB0aGUgQVQgd2hlbiB1c2luZyBhIHNjcmVlbiByZWFkZXJcblxuICAnJiA+IC5zci1vbmx5Jzoge1xuICAgIGNvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgIGhlaWdodDogMSxcbiAgICBsZWZ0OiAtMTAwMDAsXG4gICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHRvcDogMCxcbiAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcbiAgICB3aWR0aDogMVxuICB9XG59O1xuXG5jb25zdCBjb25uZWN0TWljcm9waG9uZUJ1dHRvbiA9ICguLi5zZWxlY3RvcnMpID0+IHtcbiAgY29uc3QgcHJpbWVTcGVlY2hTeW50aGVzaXMgPSBtZW1vaXplKChzcGVlY2hTeW50aGVzaXMsIFNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZSkgPT4ge1xuICAgIGlmIChzcGVlY2hTeW50aGVzaXMgJiYgU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlKSB7XG4gICAgICBjb25zdCB1dHRlcmFuY2UgPSBuZXcgU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlKCcnKTtcblxuICAgICAgW3V0dGVyYW5jZS52b2ljZV0gPSBzcGVlY2hTeW50aGVzaXMuZ2V0Vm9pY2VzKCk7XG4gICAgICBzcGVlY2hTeW50aGVzaXMuc3BlYWsodXR0ZXJhbmNlKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBjb25uZWN0VG9XZWJDaGF0KFxuICAgICh7XG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGRpY3RhdGVJbnRlcmltcyxcbiAgICAgIGRpY3RhdGVTdGF0ZSxcbiAgICAgIGxhbmd1YWdlLFxuICAgICAgc2V0U2VuZEJveCxcbiAgICAgIHN0YXJ0RGljdGF0ZSxcbiAgICAgIHN0b3BEaWN0YXRlLFxuICAgICAgc3RvcFNwZWFraW5nQWN0aXZpdHksXG4gICAgICB3ZWJTcGVlY2hQb255ZmlsbDogeyBzcGVlY2hTeW50aGVzaXMsIFNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZSB9ID0ge31cbiAgICB9KSA9PiAoe1xuICAgICAgY2xpY2s6ICgpID0+IHtcbiAgICAgICAgaWYgKGRpY3RhdGVTdGF0ZSA9PT0gRGljdGF0ZVN0YXRlLldJTExfU1RBUlQpIHtcbiAgICAgICAgICBzdG9wU3BlYWtpbmdBY3Rpdml0eSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGRpY3RhdGVTdGF0ZSA9PT0gRGljdGF0ZVN0YXRlLkRJQ1RBVElORykge1xuICAgICAgICAgIHN0b3BEaWN0YXRlKCk7XG4gICAgICAgICAgc2V0U2VuZEJveChkaWN0YXRlSW50ZXJpbXMuam9pbignICcpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdG9wU3BlYWtpbmdBY3Rpdml0eSgpO1xuICAgICAgICAgIHN0YXJ0RGljdGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpbWVTcGVlY2hTeW50aGVzaXMoc3BlZWNoU3ludGhlc2lzLCBTcGVlY2hTeW50aGVzaXNVdHRlcmFuY2UpO1xuICAgICAgfSxcbiAgICAgIGRpY3RhdGluZzogZGljdGF0ZVN0YXRlID09PSBEaWN0YXRlU3RhdGUuRElDVEFUSU5HLFxuICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkIHx8IChkaWN0YXRlU3RhdGUgPT09IERpY3RhdGVTdGF0ZS5TVEFSVElORyAmJiBkaWN0YXRlU3RhdGUgPT09IERpY3RhdGVTdGF0ZS5TVE9QUElORyksXG4gICAgICBsYW5ndWFnZVxuICAgIH0pLFxuICAgIC4uLnNlbGVjdG9yc1xuICApO1xufTtcblxuY29uc3QgdXNlTWljcm9waG9uZUJ1dHRvbkNsaWNrID0gKCkgPT4ge1xuICBjb25zdCBbLCBzZXRTZW5kQm94XSA9IHVzZVNlbmRCb3hWYWx1ZSgpO1xuICBjb25zdCBbLCBzZXRTaG91bGRTcGVha0luY29taW5nQWN0aXZpdHldID0gdXNlU2hvdWxkU3BlYWtJbmNvbWluZ0FjdGl2aXR5KCk7XG4gIGNvbnN0IFt7IHNwZWVjaFN5bnRoZXNpcywgU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlIH0gPSB7fV0gPSB1c2VXZWJTcGVlY2hQb255ZmlsbCgpO1xuICBjb25zdCBbZGljdGF0ZUludGVyaW1zXSA9IHVzZURpY3RhdGVJbnRlcmltcygpO1xuICBjb25zdCBbZGljdGF0ZVN0YXRlXSA9IHVzZURpY3RhdGVTdGF0ZSgpO1xuICBjb25zdCBzdGFydERpY3RhdGUgPSB1c2VTdGFydERpY3RhdGUoKTtcbiAgY29uc3Qgc3RvcERpY3RhdGUgPSB1c2VTdG9wRGljdGF0ZSgpO1xuXG4gIGNvbnN0IFtwcmltZVNwZWVjaFN5bnRoZXNpc10gPSB1c2VTdGF0ZSgoKSA9PlxuICAgIG1lbW9pemUoKHNwZWVjaFN5bnRoZXNpcywgU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlKSA9PiB7XG4gICAgICBpZiAoc3BlZWNoU3ludGhlc2lzICYmIFNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZSkge1xuICAgICAgICBjb25zdCB1dHRlcmFuY2UgPSBuZXcgU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlKCcnKTtcblxuICAgICAgICBbdXR0ZXJhbmNlLnZvaWNlXSA9IHNwZWVjaFN5bnRoZXNpcy5nZXRWb2ljZXMoKTtcbiAgICAgICAgc3BlZWNoU3ludGhlc2lzLnNwZWFrKHV0dGVyYW5jZSk7XG4gICAgICB9XG4gICAgfSlcbiAgKTtcblxuICAvLyBUT0RPOiBbUDJdIFdlIHNob3VsZCByZXZpc2l0IHRoaXMgZnVuY3Rpb24gbGF0ZXJcbiAgLy8gICAgICAgVGhlIGNsaWNrKCkgbG9naWMgc2VlbXMgbG9jYWwgdG8gdGhlIGNvbXBvbmVudCwgYnV0IG1heSBub3QgYmUgZ2VuZXJhbGl6ZWQgYWNyb3NzIGFsbCBpbXBsZW1lbnRhdGlvbnMuXG4gIHJldHVybiB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKGRpY3RhdGVTdGF0ZSA9PT0gRGljdGF0ZVN0YXRlLldJTExfU1RBUlQpIHtcbiAgICAgIHNldFNob3VsZFNwZWFrSW5jb21pbmdBY3Rpdml0eShmYWxzZSk7XG4gICAgfSBlbHNlIGlmIChkaWN0YXRlU3RhdGUgPT09IERpY3RhdGVTdGF0ZS5ESUNUQVRJTkcpIHtcbiAgICAgIHN0b3BEaWN0YXRlKCk7XG4gICAgICBzZXRTZW5kQm94KGRpY3RhdGVJbnRlcmltcy5qb2luKCcgJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTaG91bGRTcGVha0luY29taW5nQWN0aXZpdHkoZmFsc2UpO1xuICAgICAgc3RhcnREaWN0YXRlKCk7XG4gICAgfVxuXG4gICAgcHJpbWVTcGVlY2hTeW50aGVzaXMoc3BlZWNoU3ludGhlc2lzLCBTcGVlY2hTeW50aGVzaXNVdHRlcmFuY2UpO1xuICB9LCBbXG4gICAgZGljdGF0ZUludGVyaW1zLFxuICAgIGRpY3RhdGVTdGF0ZSxcbiAgICBwcmltZVNwZWVjaFN5bnRoZXNpcyxcbiAgICBzZXRTZW5kQm94LFxuICAgIHNldFNob3VsZFNwZWFrSW5jb21pbmdBY3Rpdml0eSxcbiAgICBzcGVlY2hTeW50aGVzaXMsXG4gICAgU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlLFxuICAgIHN0YXJ0RGljdGF0ZSxcbiAgICBzdG9wRGljdGF0ZVxuICBdKTtcbn07XG5cbmZ1bmN0aW9uIHVzZU1pY3JvcGhvbmVCdXR0b25EaXNhYmxlZCgpIHtcbiAgY29uc3QgW2Fib3J0YWJsZV0gPSB1c2VEaWN0YXRlQWJvcnRhYmxlKCk7XG4gIGNvbnN0IFtkaWN0YXRlU3RhdGVdID0gdXNlRGljdGF0ZVN0YXRlKCk7XG4gIGNvbnN0IFtkaXNhYmxlZF0gPSB1c2VEaXNhYmxlZCgpO1xuXG4gIHJldHVybiBbXG4gICAgZGlzYWJsZWQgfHxcbiAgICAgIGRpY3RhdGVTdGF0ZSA9PT0gRGljdGF0ZVN0YXRlLlNUQVJUSU5HIHx8XG4gICAgICBkaWN0YXRlU3RhdGUgPT09IERpY3RhdGVTdGF0ZS5TVE9QUElORyB8fFxuICAgICAgKGRpY3RhdGVTdGF0ZSA9PT0gRGljdGF0ZVN0YXRlLkRJQ1RBVElORyAmJiAhYWJvcnRhYmxlKVxuICBdO1xufVxuXG5jb25zdCBNaWNyb3Bob25lQnV0dG9uID0gKHsgY2xhc3NOYW1lIH0pID0+IHtcbiAgY29uc3QgW3sgbWljcm9waG9uZUJ1dHRvbjogbWljcm9waG9uZUJ1dHRvblN0eWxlU2V0IH1dID0gdXNlU3R5bGVTZXQoKTtcbiAgY29uc3QgW2RpY3RhdGVTdGF0ZV0gPSB1c2VEaWN0YXRlU3RhdGUoKTtcbiAgY29uc3QgW2Rpc2FibGVkXSA9IHVzZU1pY3JvcGhvbmVCdXR0b25EaXNhYmxlZCgpO1xuICBjb25zdCBjbGljayA9IHVzZU1pY3JvcGhvbmVCdXR0b25DbGljaygpO1xuICBjb25zdCBsb2NhbGl6ZSA9IHVzZUxvY2FsaXplcigpO1xuICBjb25zdCByb290Q2xhc3NOYW1lID0gdXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QoKShST09UX1NUWUxFKSArICcnO1xuXG4gIGNvbnN0IGRpY3RhdGluZyA9IGRpY3RhdGVTdGF0ZSA9PT0gRGljdGF0ZVN0YXRlLkRJQ1RBVElORztcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGFyaWEtY29udHJvbHM9XCJ3ZWJjaGF0U2VuZEJveE1pY3JvcGhvbmVCdXR0b25cIlxuICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFxuICAgICAgICAnd2ViY2hhdF9fbWljcm9waG9uZS1idXR0b24nLFxuICAgICAgICB7ICd3ZWJjaGF0X19taWNyb3Bob25lLWJ1dHRvbi0tZGljdGF0aW5nJzogZGljdGF0aW5nIH0sXG4gICAgICAgIG1pY3JvcGhvbmVCdXR0b25TdHlsZVNldCArICcnLFxuICAgICAgICByb290Q2xhc3NOYW1lLFxuICAgICAgICAoY2xhc3NOYW1lIHx8ICcnKSArICcnXG4gICAgICApfVxuICAgID5cbiAgICAgIDxJY29uQnV0dG9uXG4gICAgICAgIGFsdD17bG9jYWxpemUoJ1RFWFRfSU5QVVRfU1BFQUtfQlVUVE9OX0FMVCcpfVxuICAgICAgICBjbGFzc05hbWU9XCJ3ZWJjaGF0X19taWNyb3Bob25lLWJ1dHRvbl9fYnV0dG9uXCJcbiAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICBvbkNsaWNrPXtjbGlja31cbiAgICAgID5cbiAgICAgICAgPE1pY3JvcGhvbmVJY29uIGNsYXNzTmFtZT1cIndlYmNoYXRfX21pY3JvcGhvbmUtYnV0dG9uX19pY29uXCIgLz5cbiAgICAgIDwvSWNvbkJ1dHRvbj5cbiAgICAgIDxkaXYgYXJpYS1saXZlPVwicG9saXRlXCIgY2xhc3NOYW1lPVwic3Itb25seVwiIGlkPVwid2ViY2hhdFNlbmRCb3hNaWNyb3Bob25lQnV0dG9uXCIgcm9sZT1cInN0YXR1c1wiPlxuICAgICAgICB7bG9jYWxpemUoZGljdGF0aW5nID8gJ1NQRUVDSF9JTlBVVF9NSUNST1BIT05FX0JVVFRPTl9PUEVOX0FMVCcgOiAnU1BFRUNIX0lOUFVUX01JQ1JPUEhPTkVfQlVUVE9OX0NMT1NFX0FMVCcpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5NaWNyb3Bob25lQnV0dG9uLmRlZmF1bHRQcm9wcyA9IHtcbiAgY2xhc3NOYW1lOiAnJ1xufTtcblxuTWljcm9waG9uZUJ1dHRvbi5wcm9wVHlwZXMgPSB7XG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZ1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTWljcm9waG9uZUJ1dHRvbjtcblxuZXhwb3J0IHsgY29ubmVjdE1pY3JvcGhvbmVCdXR0b24sIHVzZU1pY3JvcGhvbmVCdXR0b25DbGljaywgdXNlTWljcm9waG9uZUJ1dHRvbkRpc2FibGVkIH07XG4iXX0=