UNPKG

matrix-react-sdk

Version:
145 lines (125 loc) 18 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _replaceableComponent = require("../../../utils/replaceableComponent"); var _dec, _class; class ItemRange { constructor(topCount, renderCount, bottomCount) { this.topCount = topCount; this.renderCount = renderCount; this.bottomCount = bottomCount; } contains(range) { // don't contain empty ranges // as it will prevent clearing the list // once it is scrolled far enough out of view if (!range.renderCount && this.renderCount) { return false; } return range.topCount >= this.topCount && range.topCount + range.renderCount <= this.topCount + this.renderCount; } expand(amount) { // don't expand ranges that won't render anything if (this.renderCount === 0) { return this; } const topGrow = Math.min(amount, this.topCount); const bottomGrow = Math.min(amount, this.bottomCount); return new ItemRange(this.topCount - topGrow, this.renderCount + topGrow + bottomGrow, this.bottomCount - bottomGrow); } totalSize() { return this.topCount + this.renderCount + this.bottomCount; } } let LazyRenderList = (_dec = (0, _replaceableComponent.replaceableComponent)("views.elements.LazyRenderList"), _dec(_class = class LazyRenderList extends _react.default.Component { constructor(props) { super(props); this.state = {}; } static getDerivedStateFromProps(props, state) { const range = LazyRenderList.getVisibleRangeFromProps(props); const intersectRange = range.expand(props.overflowMargin); const renderRange = range.expand(props.overflowItems); const listHasChangedSize = !!state.renderRange && renderRange.totalSize() !== state.renderRange.totalSize(); // only update render Range if the list has shrunk/grown and we need to adjust padding OR // if the new range + overflowMargin isn't contained by the old anymore if (listHasChangedSize || !state.renderRange || !state.renderRange.contains(intersectRange)) { return { renderRange }; } return null; } static getVisibleRangeFromProps(props) { const { items, itemHeight, scrollTop, height } = props; const length = items ? items.length : 0; const topCount = Math.min(Math.max(0, Math.floor(scrollTop / itemHeight)), length); const itemsAfterTop = length - topCount; const visibleItems = height !== 0 ? Math.ceil(height / itemHeight) : 0; const renderCount = Math.min(visibleItems, itemsAfterTop); const bottomCount = itemsAfterTop - renderCount; return new ItemRange(topCount, renderCount, bottomCount); } render() { const { itemHeight, items, renderItem } = this.props; const { renderRange } = this.state; const { topCount, renderCount, bottomCount } = renderRange; const paddingTop = topCount * itemHeight; const paddingBottom = bottomCount * itemHeight; const renderedItems = (items || []).slice(topCount, topCount + renderCount); const element = this.props.element || "div"; const elementProps = { "style": { paddingTop: `${paddingTop}px`, paddingBottom: `${paddingBottom}px` }, "className": this.props.className }; return /*#__PURE__*/_react.default.createElement(element, elementProps, renderedItems.map(renderItem)); } }) || _class); exports.default = LazyRenderList; LazyRenderList.defaultProps = { overflowItems: 20, overflowMargin: 5 }; LazyRenderList.propTypes = { // height in pixels of the component returned by `renderItem` itemHeight: _propTypes.default.number.isRequired, // function to turn an element of `items` into a react component renderItem: _propTypes.default.func.isRequired, // scrollTop of the viewport (minus the height of any content above this list like other `LazyRenderList`s) scrollTop: _propTypes.default.number.isRequired, // the height of the viewport this content is scrolled in height: _propTypes.default.number.isRequired, // all items for the list. These should not be react components, see `renderItem`. items: _propTypes.default.array, // the amount of items to scroll before causing a rerender, // should typically be less than `overflowItems` unless applying // margins in the parent component when using multiple LazyRenderList in one viewport. // use 0 to only rerender when items will come into view. overflowMargin: _propTypes.default.number, // the amount of items to add at the top and bottom to render, // so not every scroll of causes a rerender. overflowItems: _propTypes.default.number }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2VsZW1lbnRzL0xhenlSZW5kZXJMaXN0LmpzIl0sIm5hbWVzIjpbIkl0ZW1SYW5nZSIsImNvbnN0cnVjdG9yIiwidG9wQ291bnQiLCJyZW5kZXJDb3VudCIsImJvdHRvbUNvdW50IiwiY29udGFpbnMiLCJyYW5nZSIsImV4cGFuZCIsImFtb3VudCIsInRvcEdyb3ciLCJNYXRoIiwibWluIiwiYm90dG9tR3JvdyIsInRvdGFsU2l6ZSIsIkxhenlSZW5kZXJMaXN0IiwiUmVhY3QiLCJDb21wb25lbnQiLCJwcm9wcyIsInN0YXRlIiwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzIiwiZ2V0VmlzaWJsZVJhbmdlRnJvbVByb3BzIiwiaW50ZXJzZWN0UmFuZ2UiLCJvdmVyZmxvd01hcmdpbiIsInJlbmRlclJhbmdlIiwib3ZlcmZsb3dJdGVtcyIsImxpc3RIYXNDaGFuZ2VkU2l6ZSIsIml0ZW1zIiwiaXRlbUhlaWdodCIsInNjcm9sbFRvcCIsImhlaWdodCIsImxlbmd0aCIsIm1heCIsImZsb29yIiwiaXRlbXNBZnRlclRvcCIsInZpc2libGVJdGVtcyIsImNlaWwiLCJyZW5kZXIiLCJyZW5kZXJJdGVtIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iLCJyZW5kZXJlZEl0ZW1zIiwic2xpY2UiLCJlbGVtZW50IiwiZWxlbWVudFByb3BzIiwiY2xhc3NOYW1lIiwiY3JlYXRlRWxlbWVudCIsIm1hcCIsImRlZmF1bHRQcm9wcyIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsIm51bWJlciIsImlzUmVxdWlyZWQiLCJmdW5jIiwiYXJyYXkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQWdCQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLFNBQU4sQ0FBZ0I7QUFDWkMsRUFBQUEsV0FBVyxDQUFDQyxRQUFELEVBQVdDLFdBQVgsRUFBd0JDLFdBQXhCLEVBQXFDO0FBQzVDLFNBQUtGLFFBQUwsR0FBZ0JBLFFB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QUFBZ0NDLFFBQUFBLGFBQWEsRUFBRyxHQUFFQSxhQUFjO0FBQWhFLE9BRFE7QUFFakIsbUJBQWEsS0FBS3RCLEtBQUwsQ0FBVzJCO0FBRlAsS0FBckI7QUFJQSx3QkFBTzdCLGVBQU04QixhQUFOLENBQW9CSCxPQUFwQixFQUE2QkMsWUFBN0IsRUFBMkNILGFBQWEsQ0FBQ00sR0FBZCxDQUFrQlQsVUFBbEIsQ0FBM0MsQ0FBUDtBQUNIOztBQWpEdUQsQzs7QUFvRDVEdkIsY0FBYyxDQUFDaUMsWUFBZixHQUE4QjtBQUMxQnZCLEVBQUFBLGFBQWEsRUFBRSxFQURXO0FBRTFCRixFQUFBQSxjQUFjLEVBQUU7QUFGVSxDQUE5QjtBQUtBUixjQUFjLENBQUNrQyxTQUFmLEdBQTJCO0FBQ3ZCO0FBQ0FyQixFQUFBQSxVQUFVLEVBQUVzQixtQkFBVUMsTUFBVixDQUFpQkMsVUFGTjtBQUd2QjtBQUNBZCxFQUFBQSxVQUFVLEVBQUVZLG1CQUFVRyxJQUFWLENBQWVELFVBSko7QUFLdkI7QUFDQXZCLEVBQUFBLFNBQVMsRUFBRXFCLG1CQUFVQyxNQUFWLENBQWlCQyxVQU5MO0FBT3ZCO0FBQ0F0QixFQUFBQSxNQUFNLEVBQUVvQixtQkFBVUMsTUFBVixDQUFpQkMsVUFSRjtBQVN2QjtBQUNBekIsRUFBQUEsS0FBSyxFQUFFdUIsbUJBQVVJLEtBVk07QUFXdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQS9CLEVBQUFBLGNBQWMsRUFBRTJCLG1CQUFVQyxNQWZIO0FBZ0J2QjtBQUNBO0FBQ0ExQixFQUFBQSxhQUFhLEVBQUV5QixtQkFBVUM7QUFsQkYsQ0FBM0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTkgTmV3IFZlY3RvciBMdGRcblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtyZXBsYWNlYWJsZUNvbXBvbmVudH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3JlcGxhY2VhYmxlQ29tcG9uZW50XCI7XG5cbmNsYXNzIEl0ZW1SYW5nZSB7XG4gICAgY29uc3RydWN0b3IodG9wQ291bnQsIHJlbmRlckNvdW50LCBib3R0b21Db3VudCkge1xuICAgICAgICB0aGlzLnRvcENvdW50ID0gdG9wQ291bnQ7XG4gICAgICAgIHRoaXMucmVuZGVyQ291bnQgPSByZW5kZXJDb3VudDtcbiAgICAgICAgdGhpcy5ib3R0b21Db3VudCA9IGJvdHRvbUNvdW50O1xuICAgIH1cblxuICAgIGNvbnRhaW5zKHJhbmdlKSB7XG4gICAgICAgIC8vIGRvbid0IGNvbnRhaW4gZW1wdHkgcmFuZ2VzXG4gICAgICAgIC8vIGFzIGl0IHdpbGwgcHJldmVudCBjbGVhcmluZyB0aGUgbGlzdFxuICAgICAgICAvLyBvbmNlIGl0IGlzIHNjcm9sbGVkIGZhciBlbm91Z2ggb3V0IG9mIHZpZXdcbiAgICAgICAgaWYgKCFyYW5nZS5yZW5kZXJDb3VudCAmJiB0aGlzLnJlbmRlckNvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJhbmdlLnRvcENvdW50ID49IHRoaXMudG9wQ291bnQgJiZcbiAgICAgICAgICAgIChyYW5nZS50b3BDb3VudCArIHJhbmdlLnJlbmRlckNvdW50KSA8PSAodGhpcy50b3BDb3VudCArIHRoaXMucmVuZGVyQ291bnQpO1xuICAgIH1cblxuICAgIGV4cGFuZChhbW91bnQpIHtcbiAgICAgICAgLy8gZG9uJ3QgZXhwYW5kIHJhbmdlcyB0aGF0IHdvbid0IHJlbmRlciBhbnl0aGluZ1xuICAgICAgICBpZiAodGhpcy5yZW5kZXJDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3BHcm93ID0gTWF0aC5taW4oYW1vdW50LCB0aGlzLnRvcENvdW50KTtcbiAgICAgICAgY29uc3QgYm90dG9tR3JvdyA9IE1hdGgubWluKGFtb3VudCwgdGhpcy5ib3R0b21Db3VudCk7XG4gICAgICAgIHJldHVybiBuZXcgSXRlbVJhbmdlKFxuICAgICAgICAgICAgdGhpcy50b3BDb3VudCAtIHRvcEdyb3csXG4gICAgICAgICAgICB0aGlzLnJlbmRlckNvdW50ICsgdG9wR3JvdyArIGJvdHRvbUdyb3csXG4gICAgICAgICAgICB0aGlzLmJvdHRvbUNvdW50IC0gYm90dG9tR3JvdyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB0b3RhbFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvcENvdW50ICsgdGhpcy5yZW5kZXJDb3VudCArIHRoaXMuYm90dG9tQ291bnQ7XG4gICAgfVxufVxuXG5AcmVwbGFjZWFibGVDb21wb25lbnQoXCJ2aWV3cy5lbGVtZW50cy5MYXp5UmVuZGVyTGlzdFwiKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGF6eVJlbmRlckxpc3QgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLnN0YXRlID0ge307XG4gICAgfVxuXG4gICAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgc3RhdGUpIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBMYXp5UmVuZGVyTGlzdC5nZXRWaXNpYmxlUmFuZ2VGcm9tUHJvcHMocHJvcHMpO1xuICAgICAgICBjb25zdCBpbnRlcnNlY3RSYW5nZSA9IHJhbmdlLmV4cGFuZChwcm9wcy5vdmVyZmxvd01hcmdpbik7XG4gICAgICAgIGNvbnN0IHJlbmRlclJhbmdlID0gcmFuZ2UuZXhwYW5kKHByb3BzLm92ZXJmbG93SXRlbXMpO1xuICAgICAgICBjb25zdCBsaXN0SGFzQ2hhbmdlZFNpemUgPSAhIXN0YXRlLnJlbmRlclJhbmdlICYmIHJlbmRlclJhbmdlLnRvdGFsU2l6ZSgpICE9PSBzdGF0ZS5yZW5kZXJSYW5nZS50b3RhbFNpemUoKTtcbiAgICAgICAgLy8gb25seSB1cGRhdGUgcmVuZGVyIFJhbmdlIGlmIHRoZSBsaXN0IGhhcyBzaHJ1bmsvZ3Jvd24gYW5kIHdlIG5lZWQgdG8gYWRqdXN0IHBhZGRpbmcgT1JcbiAgICAgICAgLy8gaWYgdGhlIG5ldyByYW5nZSArIG92ZXJmbG93TWFyZ2luIGlzbid0IGNvbnRhaW5lZCBieSB0aGUgb2xkIGFueW1vcmVcbiAgICAgICAgaWYgKGxpc3RIYXNDaGFuZ2VkU2l6ZSB8fCAhc3RhdGUucmVuZGVyUmFuZ2UgfHwgIXN0YXRlLnJlbmRlclJhbmdlLmNvbnRhaW5zKGludGVyc2VjdFJhbmdlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtyZW5kZXJSYW5nZX07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFZpc2libGVSYW5nZUZyb21Qcm9wcyhwcm9wcykge1xuICAgICAgICBjb25zdCB7aXRlbXMsIGl0ZW1IZWlnaHQsIHNjcm9sbFRvcCwgaGVpZ2h0fSA9IHByb3BzO1xuICAgICAgICBjb25zdCBsZW5ndGggPSBpdGVtcyA/IGl0ZW1zLmxlbmd0aCA6IDA7XG4gICAgICAgIGNvbnN0IHRvcENvdW50ID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihzY3JvbGxUb3AgLyBpdGVtSGVpZ2h0KSksIGxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGl0ZW1zQWZ0ZXJUb3AgPSBsZW5ndGggLSB0b3BDb3VudDtcbiAgICAgICAgY29uc3QgdmlzaWJsZUl0ZW1zID0gaGVpZ2h0ICE9PSAwID8gTWF0aC5jZWlsKGhlaWdodCAvIGl0ZW1IZWlnaHQpIDogMDtcbiAgICAgICAgY29uc3QgcmVuZGVyQ291bnQgPSBNYXRoLm1pbih2aXNpYmxlSXRlbXMsIGl0ZW1zQWZ0ZXJUb3ApO1xuICAgICAgICBjb25zdCBib3R0b21Db3VudCA9IGl0ZW1zQWZ0ZXJUb3AgLSByZW5kZXJDb3VudDtcbiAgICAgICAgcmV0dXJuIG5ldyBJdGVtUmFuZ2UodG9wQ291bnQsIHJlbmRlckNvdW50LCBib3R0b21Db3VudCk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB7aXRlbUhlaWdodCwgaXRlbXMsIHJlbmRlckl0ZW19ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3Qge3JlbmRlclJhbmdlfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGNvbnN0IHt0b3BDb3VudCwgcmVuZGVyQ291bnQsIGJvdHRvbUNvdW50fSA9IHJlbmRlclJhbmdlO1xuXG4gICAgICAgIGNvbnN0IHBhZGRpbmdUb3AgPSB0b3BDb3VudCAqIGl0ZW1IZWlnaHQ7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdCb3R0b20gPSBib3R0b21Db3VudCAqIGl0ZW1IZWlnaHQ7XG4gICAgICAgIGNvbnN0IHJlbmRlcmVkSXRlbXMgPSAoaXRlbXMgfHwgW10pLnNsaWNlKFxuICAgICAgICAgICAgdG9wQ291bnQsXG4gICAgICAgICAgICB0b3BDb3VudCArIHJlbmRlckNvdW50LFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnByb3BzLmVsZW1lbnQgfHwgXCJkaXZcIjtcbiAgICAgICAgY29uc3QgZWxlbWVudFByb3BzID0ge1xuICAgICAgICAgICAgXCJzdHlsZVwiOiB7cGFkZGluZ1RvcDogYCR7cGFkZGluZ1RvcH1weGAsIHBhZGRpbmdCb3R0b206IGAke3BhZGRpbmdCb3R0b219cHhgfSxcbiAgICAgICAgICAgIFwiY2xhc3NOYW1lXCI6IHRoaXMucHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChlbGVtZW50LCBlbGVtZW50UHJvcHMsIHJlbmRlcmVkSXRlbXMubWFwKHJlbmRlckl0ZW0pKTtcbiAgICB9XG59XG5cbkxhenlSZW5kZXJMaXN0LmRlZmF1bHRQcm9wcyA9IHtcbiAgICBvdmVyZmxvd0l0ZW1zOiAyMCxcbiAgICBvdmVyZmxvd01hcmdpbjogNSxcbn07XG5cbkxhenlSZW5kZXJMaXN0LnByb3BUeXBlcyA9IHtcbiAgICAvLyBoZWlnaHQgaW4gcGl4ZWxzIG9mIHRoZSBjb21wb25lbnQgcmV0dXJuZWQgYnkgYHJlbmRlckl0ZW1gXG4gICAgaXRlbUhlaWdodDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICAgIC8vIGZ1bmN0aW9uIHRvIHR1cm4gYW4gZWxlbWVudCBvZiBgaXRlbXNgIGludG8gYSByZWFjdCBjb21wb25lbnRcbiAgICByZW5kZXJJdGVtOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIC8vIHNjcm9sbFRvcCBvZiB0aGUgdmlld3BvcnQgKG1pbnVzIHRoZSBoZWlnaHQgb2YgYW55IGNvbnRlbnQgYWJvdmUgdGhpcyBsaXN0IGxpa2Ugb3RoZXIgYExhenlSZW5kZXJMaXN0YHMpXG4gICAgc2Nyb2xsVG9wOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gICAgLy8gdGhlIGhlaWdodCBvZiB0aGUgdmlld3BvcnQgdGhpcyBjb250ZW50IGlzIHNjcm9sbGVkIGluXG4gICAgaGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gICAgLy8gYWxsIGl0ZW1zIGZvciB0aGUgbGlzdC4gVGhlc2Ugc2hvdWxkIG5vdCBiZSByZWFjdCBjb21wb25lbnRzLCBzZWUgYHJlbmRlckl0ZW1gLlxuICAgIGl0ZW1zOiBQcm9wVHlwZXMuYXJyYXksXG4gICAgLy8gdGhlIGFtb3VudCBvZiBpdGVtcyB0byBzY3JvbGwgYmVmb3JlIGNhdXNpbmcgYSByZXJlbmRlcixcbiAgICAvLyBzaG91bGQgdHlwaWNhbGx5IGJlIGxlc3MgdGhhbiBgb3ZlcmZsb3dJdGVtc2AgdW5sZXNzIGFwcGx5aW5nXG4gICAgLy8gbWFyZ2lucyBpbiB0aGUgcGFyZW50IGNvbXBvbmVudCB3aGVuIHVzaW5nIG11bHRpcGxlIExhenlSZW5kZXJMaXN0IGluIG9uZSB2aWV3cG9ydC5cbiAgICAvLyB1c2UgMCB0byBvbmx5IHJlcmVuZGVyIHdoZW4gaXRlbXMgd2lsbCBjb21lIGludG8gdmlldy5cbiAgICBvdmVyZmxvd01hcmdpbjogUHJvcFR5cGVzLm51bWJlcixcbiAgICAvLyB0aGUgYW1vdW50IG9mIGl0ZW1zIHRvIGFkZCBhdCB0aGUgdG9wIGFuZCBib3R0b20gdG8gcmVuZGVyLFxuICAgIC8vIHNvIG5vdCBldmVyeSBzY3JvbGwgb2YgY2F1c2VzIGEgcmVyZW5kZXIuXG4gICAgb3ZlcmZsb3dJdGVtczogUHJvcFR5cGVzLm51bWJlcixcbn07XG4iXX0=