UNPKG

matrix-react-sdk

Version:
205 lines (172 loc) 21.6 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var AvatarLogic = _interopRequireWildcard(require("../../../Avatar")); var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore")); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext")); var _useEventEmitter = require("../../../hooks/useEventEmitter"); var _units = require("../../../utils/units"); var _languageHandler = require("../../../languageHandler"); /* Copyright 2015, 2016 OpenMarket Ltd Copyright 2018 New Vector Ltd Copyright 2019 Michael Telatynski <7t3chguy@gmail.com> Copyright 2019, 2020 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ const calculateUrls = (url, urls) => { // work out the full set of urls to try to load. This is formed like so: // imageUrls: [ props.url, ...props.urls ] let _urls = []; if (!_SettingsStore.default.getValue("lowBandwidth")) { _urls = urls || []; if (url) { // copy urls and put url first _urls = [url, ..._urls]; } } // deduplicate URLs return Array.from(new Set(_urls)); }; const useImageUrl = ({ url, urls }) => /*: [string, () => void]*/ { const [imageUrls, setUrls] = (0, _react.useState)(calculateUrls(url, urls)); const [urlsIndex, setIndex] = (0, _react.useState)(0); const onError = (0, _react.useCallback)(() => { setIndex(i => i + 1); // try the next one }, []); (0, _react.useEffect)(() => { setUrls(calculateUrls(url, urls)); setIndex(0); }, [url, JSON.stringify(urls)]); // eslint-disable-line react-hooks/exhaustive-deps const cli = (0, _react.useContext)(_MatrixClientContext.default); const onClientSync = (0, _react.useCallback)((syncState, prevState) => { // Consider the client reconnected if there is no error with syncing. // This means the state could be RECONNECTING, SYNCING, PREPARED or CATCHUP. const reconnected = syncState !== "ERROR" && prevState !== syncState; if (reconnected) { setIndex(0); } }, []); (0, _useEventEmitter.useEventEmitter)(cli, "sync", onClientSync); const imageUrl = imageUrls[urlsIndex]; return [imageUrl, onError]; }; const BaseAvatar = (props /*: IProps*/ ) => { const { name, idName, title, url, urls, width = 40, height = 40, resizeMethod = "crop", // eslint-disable-line @typescript-eslint/no-unused-vars defaultToInitialLetter = true, onClick, inputRef, className } = props, otherProps = (0, _objectWithoutProperties2.default)(props, ["name", "idName", "title", "url", "urls", "width", "height", "resizeMethod", "defaultToInitialLetter", "onClick", "inputRef", "className"]); const [imageUrl, onError] = useImageUrl({ url, urls }); if (!imageUrl && defaultToInitialLetter) { const initialLetter = AvatarLogic.getInitialLetter(name); const textNode = /*#__PURE__*/_react.default.createElement("span", { className: "mx_BaseAvatar_initial", "aria-hidden": "true", style: { fontSize: (0, _units.toPx)(width * 0.65), width: (0, _units.toPx)(width), lineHeight: (0, _units.toPx)(height) } }, initialLetter); const imgNode = /*#__PURE__*/_react.default.createElement("img", { className: "mx_BaseAvatar_image", src: AvatarLogic.defaultAvatarUrlForString(idName || name), alt: "", title: title, onError: onError, style: { width: (0, _units.toPx)(width), height: (0, _units.toPx)(height) }, "aria-hidden": "true" }); if (onClick) { return /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, (0, _extends2.default)({ "aria-label": (0, _languageHandler._t)("Avatar") }, otherProps, { element: "span", className: (0, _classnames.default)("mx_BaseAvatar", className), onClick: onClick, inputRef: inputRef }), textNode, imgNode); } else { return /*#__PURE__*/_react.default.createElement("span", (0, _extends2.default)({ className: (0, _classnames.default)("mx_BaseAvatar", className), ref: inputRef }, otherProps, { role: "presentation" }), textNode, imgNode); } } if (onClick) { return /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, (0, _extends2.default)({ className: (0, _classnames.default)("mx_BaseAvatar mx_BaseAvatar_image", className), element: "img", src: imageUrl, onClick: onClick, onError: onError, style: { width: (0, _units.toPx)(width), height: (0, _units.toPx)(height) }, title: title, alt: (0, _languageHandler._t)("Avatar"), inputRef: inputRef }, otherProps)); } else { return /*#__PURE__*/_react.default.createElement("img", (0, _extends2.default)({ className: (0, _classnames.default)("mx_BaseAvatar mx_BaseAvatar_image", className), src: imageUrl, onError: onError, style: { width: (0, _units.toPx)(width), height: (0, _units.toPx)(height) }, title: title, alt: "", ref: inputRef }, otherProps)); } }; var _default = BaseAvatar; /*:: export type BaseAvatarType = React.FC<IProps>;*/ exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2F2YXRhcnMvQmFzZUF2YXRhci50c3giXSwibmFtZXMiOlsiY2FsY3VsYXRlVXJscyIsInVybCIsInVybHMiLCJfdXJscyIsIlNldHRpbmdzU3RvcmUiLCJnZXRWYWx1ZSIsIkFycmF5IiwiZnJvbSIsIlNldCIsInVzZUltYWdlVXJsIiwiaW1hZ2VVcmxzIiwic2V0VXJscyIsInVybHNJbmRleCIsInNldEluZGV4Iiwib25FcnJvciIsImkiLCJKU09OIiwic3RyaW5naWZ5IiwiY2xpIiwiTWF0cml4Q2xpZW50Q29udGV4dCIsIm9uQ2xpZW50U3luYyIsInN5bmNTdGF0ZSIsInByZXZTdGF0ZSIsInJlY29ubmVjdGVkIiwiaW1hZ2VVcmwiLCJCYXNlQXZhdGFyIiwicHJvcHMiLCJuYW1lIiwiaWROYW1lIiwidGl0bGUiLCJ3aWR0aCIsImhlaWdodCIsInJlc2l6ZU1ldGhvZCIsImRlZmF1bHRUb0luaXRpYWxMZXR0ZXIiLCJvbkNsaWNrIiwiaW5wdXRSZWYiLCJjbGFzc05hbWUiLCJvdGhlclByb3BzIiwiaW5pdGlhbExldHRlciIsIkF2YXRhckxvZ2ljIiwiZ2V0SW5pdGlhbExldHRlciIsInRleHROb2RlIiwiZm9udFNpemUiLCJsaW5lSGVpZ2h0IiwiaW1nTm9kZSIsImRlZmF1bHRBdmF0YXJVcmxGb3JTdHJpbmciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQW1CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUE1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBNkJBLE1BQU1BLGFBQWEsR0FBRyxDQUFDQyxHQUFELEVBQU1DLElBQU4sS0FBZTtBQUNqQztBQUNBO0FBRUEsTUFBSUMsS0FBSyxHQUFHLEVBQVo7O0FBQ0EsTUFBSSxDQUFDQyx1QkFBY0MsUUFBZCxDQUF1QixjQUF2QixDQUFMLEVBQTZDO0FBQ3pDRixJQUFBQSxLQUFLLEdBQUdELElBQUksSUFBSSxFQUFoQjs7QUFFQSxRQUFJRCxHQUFKLEVBQVM7QUFDTDtBQUNBRSxNQUFBQSxLQUFLLEdBQUcsQ0FBQ0YsR0FBRCxFQUFNLEdBQUdFLEtBQVQsQ0FBUjtBQUNIO0FBQ0osR0FaZ0MsQ0FjakM7OztBQUNBLFNBQU9HLEtBQUssQ0FBQ0MsSUFBTixDQUFXLElBQUlDLEdBQUosQ0FBUUwsS0FBUixDQUFYLENBQVA7QUFDSCxDQWhCRDs7QUFrQkEsTUFBTU0sV0FBVyxHQUFHLENBQUM7QUFBQ1IsRUFBQUEsR0FBRDtBQUFNQyxFQUFBQTtBQUFOLENBQUQ7QUFBQTtBQUF1QztBQUN2RCxRQUFNLENBQUNRLFNBQUQsRUFBWUMsT0FBWixJQUF1QixxQkFBbUJYLGFBQWEsQ0FBQ0MsR0FBRCxFQUFNQyxJQUFOLENBQWhDLENBQTdCO0FBQ0EsUUFBTSxDQUFDVSxTQUFELEVBQVlDLFFBQVosSUFBd0IscUJBQWlCLENBQWpCLENBQTlCO0FBRUEsUUFBTUMsT0FBTyxHQUFHLHdCQUFZLE1BQU07QUFDOUJELElBQUFBLFFBQVEsQ0FBQ0UsQ0FBQyxJQUFJQSxDQUFDLEdBQUcsQ0FBVixDQUFSLENBRDhCLENBQ1I7QUFDekIsR0FGZSxFQUViLEVBRmEsQ0FBaEI7QUFJQSx3QkFBVSxNQUFNO0FBQ1pKLElBQUFBLE9BQU8sQ0FBQ1gsYUFBYSxDQUFDQyxHQUFELEVBQU1DLElBQU4sQ0FBZCxDQUFQO0FBQ0FXLElBQUFBLFFBQVEsQ0FBQyxDQUFELENBQVI7QUFDSCxHQUhELEVBR0csQ0FBQ1osR0FBRCxFQUFNZSxJQUFJLENBQUNDLFNBQUwsQ0FBZWYsSUFBZixDQUFOLENBSEgsRUFSdUQsQ0FXdEI7O0FBRWpDLFFBQU1nQixHQUFHLEdBQUcsdUJBQVdDLDRCQUFYLENBQVo7QUFDQSxRQUFNQyxZQUFZLEdBQUcsd0JBQVksQ0FBQ0MsU0FBRCxFQUFZQyxTQUFaLEtBQTBCO0FBQ3ZEO0FBQ0E7QUFDQSxVQUFNQyxXQUFXLEdBQUdGLFNBQVMsS0FBSyxPQUFkLElBQXlCQyxTQUFTLEtBQUtELFNBQTNEOztBQUNBLFFBQUlFLFdBQUosRUFBaUI7QUFDYlYsTUFBQUEsUUFBUSxDQUFDLENBQUQsQ0FBUjtBQUNIO0FBQ0osR0FQb0IsRUFPbEIsRUFQa0IsQ0FBckI7QUFRQSx3Q0FBZ0JLLEdBQWhCLEVBQXFCLE1BQXJCLEVBQTZCRSxZQUE3QjtBQUVBLFFBQU1JLFFBQVEsR0FBR2QsU0FBUyxDQUFDRSxTQUFELENBQTFCO0FBQ0EsU0FBTyxDQUFDWSxRQUFELEVBQVdWLE9BQVgsQ0FBUDtBQUNILENBMUJEOztBQTRCQSxNQUFNVyxVQUFVLEdBQUcsQ0FBQ0M7QUFBRDtBQUFBLEtBQW1CO0FBQ2xDLFFBQU07QUFDRkMsSUFBQUEsSUFERTtBQUVGQyxJQUFBQSxNQUZFO0FBR0ZDLElBQUFBLEtBSEU7QUFJRjVCLElBQUFBLEdBSkU7QUFLRkMsSUFBQUEsSUFMRTtBQU1GNEIsSUFBQUEsS0FBSyxHQUFHLEVBTk47QUFPRkMsSUFBQUEsTUFBTSxHQUFHLEVBUFA7QUFRRkMsSUFBQUEsWUFBWSxHQUFHLE1BUmI7QUFRcUI7QUFDdkJDLElBQUFBLHNCQUFzQixHQUFHLElBVHZCO0FBVUZDLElBQUFBLE9BVkU7QUFXRkMsSUFBQUEsUUFYRTtBQVlGQyxJQUFBQTtBQVpFLE1BY0ZWLEtBZEo7QUFBQSxRQWFPVyxVQWJQLDBDQWNJWCxLQWRKO0FBZ0JBLFFBQU0sQ0FBQ0YsUUFBRCxFQUFXVixPQUFYLElBQXNCTCxXQUFXLENBQUM7QUFBQ1IsSUFBQUEsR0FBRDtBQUFNQyxJQUFBQTtBQUFOLEdBQUQsQ0FBdkM7O0FBRUEsTUFBSSxDQUFDc0IsUUFBRCxJQUFhUyxzQkFBakIsRUFBeUM7QUFDckMsVUFBTUssYUFBYSxHQUFHQyxXQUFXLENBQUNDLGdCQUFaLENBQTZCYixJQUE3QixDQUF0Qjs7QUFDQSxVQUFNYyxRQUFRLGdCQUNWO0FBQ0ksTUFBQSxTQUFTLEVBQUMsdUJBRGQ7QUFFSSxxQkFBWSxNQUZoQjtBQUdJLE1BQUEsS0FBSyxFQUFFO0FBQ0hDLFFBQUFBLFFBQVEsRUFBRSxpQkFBS1osS0FBSyxHQUFHLElBQWIsQ0FEUDtBQUVIQSxRQUFBQSxLQUFLLEVBQUUsaUJBQUtBLEtBQUwsQ0FGSjtBQUdIYSxRQUFBQSxVQUFVLEVBQUUsaUJBQUtaLE1BQUw7QUFIVDtBQUhYLE9BU01PLGFBVE4sQ0FESjs7QUFhQSxVQUFNTSxPQUFPLGdCQUNUO0FBQ0ksTUFBQSxTQUFTLEVBQUMscUJBRGQ7QUFFSSxNQUFBLEdBQUcsRUFBRUwsV0FBVyxDQUFDTSx5QkFBWixDQUFzQ2pCLE1BQU0sSUFBSUQsSUFBaEQsQ0FGVDtBQUdJLE1BQUEsR0FBRyxFQUFDLEVBSFI7QUFJSSxNQUFBLEtBQUssRUFBRUUsS0FKWDtBQUtJLE1BQUEsT0FBTyxFQUFFZixPQUxiO0FBTUksTUFBQSxLQUFLLEVBQUU7QUFDSGdCLFFBQUFBLEtBQUssRUFBRSxpQkFBS0EsS0FBTCxDQURKO0FBRUhDLFFBQUFBLE1BQU0sRUFBRSxpQkFBS0EsTUFBTDtBQUZMLE9BTlg7QUFVSSxxQkFBWTtBQVZoQixNQURKOztBQWNBLFFBQUlHLE9BQUosRUFBYTtBQUNULDBCQUNJLDZCQUFDLHlCQUFEO0FBQ0ksc0JBQVkseUJBQUcsUUFBSDtBQURoQixTQUVRRyxVQUZSO0FBR0ksUUFBQSxPQUFPLEVBQUMsTUFIWjtBQUlJLFFBQUEsU0FBUyxFQUFFLHlCQUFXLGVBQVgsRUFBNEJELFNBQTVCLENBSmY7QUFLSSxRQUFBLE9BQU8sRUFBRUYsT0FMYjtBQU1JLFFBQUEsUUFBUSxFQUFFQztBQU5kLFVBUU1NLFFBUk4sRUFTTUcsT0FUTixDQURKO0FBYUgsS0FkRCxNQWNPO0FBQ0gsMEJBQ0k7QUFDSSxRQUFBLFNBQVMsRUFBRSx5QkFBVyxlQUFYLEVBQTRCUixTQUE1QixDQURmO0FBRUksUUFBQSxHQUFHLEVBQUVEO0FBRlQsU0FHUUUsVUFIUjtBQUlJLFFBQUEsSUFBSSxFQUFDO0FBSlQsVUFNTUksUUFOTixFQU9NRyxPQVBOLENBREo7QUFXSDtBQUNKOztBQUVELE1BQUlWLE9BQUosRUFBYTtBQUNULHdCQUNJLDZCQUFDLHlCQUFEO0FBQ0ksTUFBQSxTQUFTLEVBQUUseUJBQVcsbUNBQVgsRUFBZ0RFLFNBQWhELENBRGY7QUFFSSxNQUFBLE9BQU8sRUFBQyxLQUZaO0FBR0ksTUFBQSxHQUFHLEVBQUVaLFFBSFQ7QUFJSSxNQUFBLE9BQU8sRUFBRVUsT0FKYjtBQUtJLE1BQUEsT0FBTyxFQUFFcEIsT0FMYjtBQU1JLE1BQUEsS0FBSyxFQUFFO0FBQ0hnQixRQUFBQSxLQUFLLEVBQUUsaUJBQUtBLEtBQUwsQ0FESjtBQUVIQyxRQUFBQSxNQUFNLEVBQUUsaUJBQUtBLE1BQUw7QUFGTCxPQU5YO0FBVUksTUFBQSxLQUFLLEVBQUVGLEtBVlg7QUFVa0IsTUFBQSxHQUFHLEVBQUUseUJBQUcsUUFBSCxDQVZ2QjtBQVdJLE1BQUEsUUFBUSxFQUFFTTtBQVhkLE9BWVFFLFVBWlIsRUFESjtBQWVILEdBaEJELE1BZ0JPO0FBQ0gsd0JBQ0k7QUFDSSxNQUFBLFNBQVMsRUFBRSx5QkFBVyxtQ0FBWCxFQUFnREQsU0FBaEQsQ0FEZjtBQUVJLE1BQUEsR0FBRyxFQUFFWixRQUZUO0FBR0ksTUFBQSxPQUFPLEVBQUVWLE9BSGI7QUFJSSxNQUFBLEtBQUssRUFBRTtBQUNIZ0IsUUFBQUEsS0FBSyxFQUFFLGlCQUFLQSxLQUFMLENBREo7QUFFSEMsUUFBQUEsTUFBTSxFQUFFLGlCQUFLQSxNQUFMO0FBRkwsT0FKWDtBQVFJLE1BQUEsS0FBSyxFQUFFRixLQVJYO0FBUWtCLE1BQUEsR0FBRyxFQUFDLEVBUnRCO0FBU0ksTUFBQSxHQUFHLEVBQUVNO0FBVFQsT0FVUUUsVUFWUixFQURKO0FBYUg7QUFDSixDQTVHRDs7ZUE4R2VaLFUiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTUsIDIwMTYgT3Blbk1hcmtldCBMdGRcbkNvcHlyaWdodCAyMDE4IE5ldyBWZWN0b3IgTHRkXG5Db3B5cmlnaHQgMjAxOSBNaWNoYWVsIFRlbGF0eW5za2kgPDd0M2NoZ3V5QGdtYWlsLmNvbT5cbkNvcHlyaWdodCAyMDE5LCAyMDIwIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7dXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgQXZhdGFyTG9naWMgZnJvbSAnLi4vLi4vLi4vQXZhdGFyJztcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5pbXBvcnQgQWNjZXNzaWJsZUJ1dHRvbiBmcm9tICcuLi9lbGVtZW50cy9BY2Nlc3NpYmxlQnV0dG9uJztcbmltcG9ydCBNYXRyaXhDbGllbnRDb250ZXh0IGZyb20gXCIuLi8uLi8uLi9jb250ZXh0cy9NYXRyaXhDbGllbnRDb250ZXh0XCI7XG5pbXBvcnQge3VzZUV2ZW50RW1pdHRlcn0gZnJvbSBcIi4uLy4uLy4uL2hvb2tzL3VzZUV2ZW50RW1pdHRlclwiO1xuaW1wb3J0IHt0b1B4fSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvdW5pdHNcIjtcbmltcG9ydCB7UmVzaXplTWV0aG9kfSBmcm9tIFwiLi4vLi4vLi4vQXZhdGFyXCI7XG5pbXBvcnQgeyBfdCB9IGZyb20gJy4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlcic7XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIG5hbWU6IHN0cmluZzsgLy8gVGhlIG5hbWUgKGZpcnN0IGluaXRpYWwgdXNlZCBhcyBkZWZhdWx0KVxuICAgIGlkTmFtZT86IHN0cmluZzsgLy8gSUQgZm9yIGdlbmVyYXRpbmcgaGFzaCBjb2xvdXJzXG4gICAgdGl0bGU/OiBzdHJpbmc7IC8vIG9uSG92ZXIgdGl0bGUgdGV4dFxuICAgIHVybD86IHN0cmluZzsgLy8gaGlnaGVzdCBwcmlvcml0eSBvZiB0aGVtIGFsbCwgc2hvcnRjdXQgdG8gc2V0IGluIHVybHNbMF1cbiAgICB1cmxzPzogc3RyaW5nW107IC8vIFtoaWdoZXN0X3ByaW9yaXR5LCAuLi4gLCBsb3dlc3RfcHJpb3JpdHldXG4gICAgd2lkdGg/OiBudW1iZXI7XG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIC8vIFhYWDogcmVzaXplTWV0aG9kIG5vdCBhY3R1YWxseSB1c2VkLlxuICAgIHJlc2l6ZU1ldGhvZD86IFJlc2l6ZU1ldGhvZDtcbiAgICBkZWZhdWx0VG9Jbml0aWFsTGV0dGVyPzogYm9vbGVhbjsgLy8gdHJ1ZSB0byBhZGQgZGVmYXVsdCB1cmxcbiAgICBvbkNsaWNrPzogUmVhY3QuTW91c2VFdmVudEhhbmRsZXI7XG4gICAgaW5wdXRSZWY/OiBSZWFjdC5SZWZPYmplY3Q8SFRNTEltYWdlRWxlbWVudCAmIEhUTUxTcGFuRWxlbWVudD47XG4gICAgY2xhc3NOYW1lPzogc3RyaW5nO1xufVxuXG5jb25zdCBjYWxjdWxhdGVVcmxzID0gKHVybCwgdXJscykgPT4ge1xuICAgIC8vIHdvcmsgb3V0IHRoZSBmdWxsIHNldCBvZiB1cmxzIHRvIHRyeSB0byBsb2FkLiBUaGlzIGlzIGZvcm1lZCBsaWtlIHNvOlxuICAgIC8vIGltYWdlVXJsczogWyBwcm9wcy51cmwsIC4uLnByb3BzLnVybHMgXVxuXG4gICAgbGV0IF91cmxzID0gW107XG4gICAgaWYgKCFTZXR0aW5nc1N0b3JlLmdldFZhbHVlKFwibG93QmFuZHdpZHRoXCIpKSB7XG4gICAgICAgIF91cmxzID0gdXJscyB8fCBbXTtcblxuICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICAvLyBjb3B5IHVybHMgYW5kIHB1dCB1cmwgZmlyc3RcbiAgICAgICAgICAgIF91cmxzID0gW3VybCwgLi4uX3VybHNdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGVkdXBsaWNhdGUgVVJMc1xuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoX3VybHMpKTtcbn07XG5cbmNvbnN0IHVzZUltYWdlVXJsID0gKHt1cmwsIHVybHN9KTogW3N0cmluZywgKCkgPT4gdm9pZF0gPT4ge1xuICAgIGNvbnN0IFtpbWFnZVVybHMsIHNldFVybHNdID0gdXNlU3RhdGU8c3RyaW5nW10+KGNhbGN1bGF0ZVVybHModXJsLCB1cmxzKSk7XG4gICAgY29uc3QgW3VybHNJbmRleCwgc2V0SW5kZXhdID0gdXNlU3RhdGU8bnVtYmVyPigwKTtcblxuICAgIGNvbnN0IG9uRXJyb3IgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIHNldEluZGV4KGkgPT4gaSArIDEpOyAvLyB0cnkgdGhlIG5leHQgb25lXG4gICAgfSwgW10pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgc2V0VXJscyhjYWxjdWxhdGVVcmxzKHVybCwgdXJscykpO1xuICAgICAgICBzZXRJbmRleCgwKTtcbiAgICB9LCBbdXJsLCBKU09OLnN0cmluZ2lmeSh1cmxzKV0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuXG4gICAgY29uc3QgY2xpID0gdXNlQ29udGV4dChNYXRyaXhDbGllbnRDb250ZXh0KTtcbiAgICBjb25zdCBvbkNsaWVudFN5bmMgPSB1c2VDYWxsYmFjaygoc3luY1N0YXRlLCBwcmV2U3RhdGUpID0+IHtcbiAgICAgICAgLy8gQ29uc2lkZXIgdGhlIGNsaWVudCByZWNvbm5lY3RlZCBpZiB0aGVyZSBpcyBubyBlcnJvciB3aXRoIHN5bmNpbmcuXG4gICAgICAgIC8vIFRoaXMgbWVhbnMgdGhlIHN0YXRlIGNvdWxkIGJlIFJFQ09OTkVDVElORywgU1lOQ0lORywgUFJFUEFSRUQgb3IgQ0FUQ0hVUC5cbiAgICAgICAgY29uc3QgcmVjb25uZWN0ZWQgPSBzeW5jU3RhdGUgIT09IFwiRVJST1JcIiAmJiBwcmV2U3RhdGUgIT09IHN5bmNTdGF0ZTtcbiAgICAgICAgaWYgKHJlY29ubmVjdGVkKSB7XG4gICAgICAgICAgICBzZXRJbmRleCgwKTtcbiAgICAgICAgfVxuICAgIH0sIFtdKTtcbiAgICB1c2VFdmVudEVtaXR0ZXIoY2xpLCBcInN5bmNcIiwgb25DbGllbnRTeW5jKTtcblxuICAgIGNvbnN0IGltYWdlVXJsID0gaW1hZ2VVcmxzW3VybHNJbmRleF07XG4gICAgcmV0dXJuIFtpbWFnZVVybCwgb25FcnJvcl07XG59O1xuXG5jb25zdCBCYXNlQXZhdGFyID0gKHByb3BzOiBJUHJvcHMpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGlkTmFtZSxcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIHVybCxcbiAgICAgICAgdXJscyxcbiAgICAgICAgd2lkdGggPSA0MCxcbiAgICAgICAgaGVpZ2h0ID0gNDAsXG4gICAgICAgIHJlc2l6ZU1ldGhvZCA9IFwiY3JvcFwiLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICBkZWZhdWx0VG9Jbml0aWFsTGV0dGVyID0gdHJ1ZSxcbiAgICAgICAgb25DbGljayxcbiAgICAgICAgaW5wdXRSZWYsXG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgLi4ub3RoZXJQcm9wc1xuICAgIH0gPSBwcm9wcztcblxuICAgIGNvbnN0IFtpbWFnZVVybCwgb25FcnJvcl0gPSB1c2VJbWFnZVVybCh7dXJsLCB1cmxzfSk7XG5cbiAgICBpZiAoIWltYWdlVXJsICYmIGRlZmF1bHRUb0luaXRpYWxMZXR0ZXIpIHtcbiAgICAgICAgY29uc3QgaW5pdGlhbExldHRlciA9IEF2YXRhckxvZ2ljLmdldEluaXRpYWxMZXR0ZXIobmFtZSk7XG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gKFxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9CYXNlQXZhdGFyX2luaXRpYWxcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IHRvUHgod2lkdGggKiAwLjY1KSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRvUHgod2lkdGgpLFxuICAgICAgICAgICAgICAgICAgICBsaW5lSGVpZ2h0OiB0b1B4KGhlaWdodCksXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7IGluaXRpYWxMZXR0ZXIgfVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpbWdOb2RlID0gKFxuICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0Jhc2VBdmF0YXJfaW1hZ2VcIlxuICAgICAgICAgICAgICAgIHNyYz17QXZhdGFyTG9naWMuZGVmYXVsdEF2YXRhclVybEZvclN0cmluZyhpZE5hbWUgfHwgbmFtZSl9XG4gICAgICAgICAgICAgICAgYWx0PVwiXCJcbiAgICAgICAgICAgICAgICB0aXRsZT17dGl0bGV9XG4gICAgICAgICAgICAgICAgb25FcnJvcj17b25FcnJvcn1cbiAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogdG9QeCh3aWR0aCksXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogdG9QeChoZWlnaHQpLFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgKTtcblxuICAgICAgICBpZiAob25DbGljaykge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtfdChcIkF2YXRhclwiKX1cbiAgICAgICAgICAgICAgICAgICAgey4uLm90aGVyUHJvcHN9XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ9XCJzcGFuXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFwibXhfQmFzZUF2YXRhclwiLCBjbGFzc05hbWUpfVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgICAgICAgICAgICAgICBpbnB1dFJlZj17aW5wdXRSZWZ9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7IHRleHROb2RlIH1cbiAgICAgICAgICAgICAgICAgICAgeyBpbWdOb2RlIH1cbiAgICAgICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXCJteF9CYXNlQXZhdGFyXCIsIGNsYXNzTmFtZSl9XG4gICAgICAgICAgICAgICAgICAgIHJlZj17aW5wdXRSZWZ9XG4gICAgICAgICAgICAgICAgICAgIHsuLi5vdGhlclByb3BzfVxuICAgICAgICAgICAgICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHsgdGV4dE5vZGUgfVxuICAgICAgICAgICAgICAgICAgICB7IGltZ05vZGUgfVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob25DbGljaykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b25cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXCJteF9CYXNlQXZhdGFyIG14X0Jhc2VBdmF0YXJfaW1hZ2VcIiwgY2xhc3NOYW1lKX1cbiAgICAgICAgICAgICAgICBlbGVtZW50PSdpbWcnXG4gICAgICAgICAgICAgICAgc3JjPXtpbWFnZVVybH1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgICAgICAgICAgIG9uRXJyb3I9e29uRXJyb3J9XG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRvUHgod2lkdGgpLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHRvUHgoaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIHRpdGxlPXt0aXRsZX0gYWx0PXtfdChcIkF2YXRhclwiKX1cbiAgICAgICAgICAgICAgICBpbnB1dFJlZj17aW5wdXRSZWZ9XG4gICAgICAgICAgICAgICAgey4uLm90aGVyUHJvcHN9IC8+XG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXCJteF9CYXNlQXZhdGFyIG14X0Jhc2VBdmF0YXJfaW1hZ2VcIiwgY2xhc3NOYW1lKX1cbiAgICAgICAgICAgICAgICBzcmM9e2ltYWdlVXJsfVxuICAgICAgICAgICAgICAgIG9uRXJyb3I9e29uRXJyb3J9XG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRvUHgod2lkdGgpLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHRvUHgoaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIHRpdGxlPXt0aXRsZX0gYWx0PVwiXCJcbiAgICAgICAgICAgICAgICByZWY9e2lucHV0UmVmfVxuICAgICAgICAgICAgICAgIHsuLi5vdGhlclByb3BzfSAvPlxuICAgICAgICApO1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2VBdmF0YXI7XG5leHBvcnQgdHlwZSBCYXNlQXZhdGFyVHlwZSA9IFJlYWN0LkZDPElQcm9wcz47XG4iXX0=