matrix-react-sdk
Version:
SDK for matrix.org using React
206 lines (163 loc) • 22.1 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getPersistKey = exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _reactDom = _interopRequireDefault(require("react-dom"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _lodash = require("lodash");
var _resizeObserverPolyfill = _interopRequireDefault(require("resize-observer-polyfill"));
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext"));
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var _utils = require("matrix-js-sdk/src/utils");
var _replaceableComponent = require("../../../utils/replaceableComponent");
var _dec, _class, _class2, _temp;
// Shamelessly ripped off Modal.js. There's probably a better way
// of doing reusable widgets like dialog boxes & menus where we go and
// pass in a custom control as the actual body.
function getContainer(containerId) {
return document.getElementById(containerId);
}
function getOrCreateContainer(containerId) {
let container = getContainer(containerId);
if (!container) {
container = document.createElement("div");
container.id = containerId;
document.body.appendChild(container);
}
return container;
}
/*
* Class of component that renders its children in a separate ReactDOM virtual tree
* in a container element appended to document.body.
*
* This prevents the children from being unmounted when the parent of PersistedElement
* unmounts, allowing them to persist.
*
* When PE is unmounted, it hides the children using CSS. When mounted or updated, the
* children are made visible and are positioned into a div that is given the same
* bounding rect as the parent of PE.
*/
let PersistedElement = (_dec = (0, _replaceableComponent.replaceableComponent)("views.elements.PersistedElement"), _dec(_class = (_temp = _class2 = class PersistedElement extends _react.default.Component {
constructor() {
super();
(0, _defineProperty2.default)(this, "updateChildPosition", (0, _lodash.throttle)((child, parent) => {
if (!child || !parent) return;
const parentRect = parent.getBoundingClientRect();
Object.assign(child.style, {
zIndex: (0, _utils.isNullOrUndefined)(this.props.zIndex) ? 9 : this.props.zIndex,
position: 'absolute',
top: parentRect.top + 'px',
left: parentRect.left + 'px',
width: parentRect.width + 'px',
height: parentRect.height + 'px'
});
}, 100, {
trailing: true,
leading: true
}));
this.collectChildContainer = this.collectChildContainer.bind(this);
this.collectChild = this.collectChild.bind(this);
this._repositionChild = this._repositionChild.bind(this);
this._onAction = this._onAction.bind(this);
this.resizeObserver = new _resizeObserverPolyfill.default(this._repositionChild); // Annoyingly, a resize observer is insufficient, since we also care
// about when the element moves on the screen without changing its
// dimensions. Doesn't look like there's a ResizeObserver equivalent
// for this, so we bodge it by listening for document resize and
// the timeline_resize action.
window.addEventListener('resize', this._repositionChild);
this._dispatcherRef = _dispatcher.default.register(this._onAction);
}
/**
* Removes the DOM elements created when a PersistedElement with the given
* persistKey was mounted. The DOM elements will be re-added if another
* PeristedElement is mounted in the future.
*
* @param {string} persistKey Key used to uniquely identify this PersistedElement
*/
static destroyElement(persistKey) {
const container = getContainer('mx_persistedElement_' + persistKey);
if (container) {
container.remove();
}
}
static isMounted(persistKey) {
return Boolean(getContainer('mx_persistedElement_' + persistKey));
}
collectChildContainer(ref) {
if (this.childContainer) {
this.resizeObserver.unobserve(this.childContainer);
}
this.childContainer = ref;
if (ref) {
this.resizeObserver.observe(ref);
}
}
collectChild(ref) {
this.child = ref;
this.updateChild();
}
componentDidMount() {
this.updateChild();
this.renderApp();
}
componentDidUpdate() {
this.updateChild();
this.renderApp();
}
componentWillUnmount() {
this.updateChildVisibility(this.child, false);
this.resizeObserver.disconnect();
window.removeEventListener('resize', this._repositionChild);
_dispatcher.default.unregister(this._dispatcherRef);
}
_onAction(payload) {
if (payload.action === 'timeline_resize') {
this._repositionChild();
} else if (payload.action === 'logout') {
PersistedElement.destroyElement(this.props.persistKey);
}
}
_repositionChild() {
this.updateChildPosition(this.child, this.childContainer);
}
updateChild() {
this.updateChildPosition(this.child, this.childContainer);
this.updateChildVisibility(this.child, true);
}
renderApp() {
const content = /*#__PURE__*/_react.default.createElement(_MatrixClientContext.default.Provider, {
value: _MatrixClientPeg.MatrixClientPeg.get()
}, /*#__PURE__*/_react.default.createElement("div", {
ref: this.collectChild,
style: this.props.style
}, this.props.children));
_reactDom.default.render(content, getOrCreateContainer('mx_persistedElement_' + this.props.persistKey));
}
updateChildVisibility(child, visible) {
if (!child) return;
child.style.display = visible ? 'block' : 'none';
}
render() {
return /*#__PURE__*/_react.default.createElement("div", {
ref: this.collectChildContainer
});
}
}, (0, _defineProperty2.default)(_class2, "propTypes", {
// Unique identifier for this PersistedElement instance
// Any PersistedElements with the same persistKey will use
// the same DOM container.
persistKey: _propTypes.default.string.isRequired,
// z-index for the element. Defaults to 9.
zIndex: _propTypes.default.number
}), _temp)) || _class);
exports.default = PersistedElement;
const getPersistKey = (appId
/*: string*/
) => 'widget_' + appId;
exports.getPersistKey = getPersistKey;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2VsZW1lbnRzL1BlcnNpc3RlZEVsZW1lbnQuanMiXSwibmFtZXMiOlsiZ2V0Q29udGFpbmVyIiwiY29udGFpbmVySWQiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiZ2V0T3JDcmVhdGVDb250YWluZXIiLCJjb250YWluZXIiLCJjcmVhdGVFbGVtZW50IiwiaWQiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJQZXJzaXN0ZWRFbGVtZW50IiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsImNoaWxkIiwicGFyZW50IiwicGFyZW50UmVjdCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsIk9iamVjdCIsImFzc2lnbiIsInN0eWxlIiwiekluZGV4IiwicHJvcHMiLCJwb3NpdGlvbiIsInRvcCIsImxlZnQiLCJ3aWR0aCIsImhlaWdodCIsInRyYWlsaW5nIiwibGVhZGluZyIsImNvbGxlY3RDaGlsZENvbnRhaW5lciIsImJpbmQiLCJjb2xsZWN0Q2hpbGQiLCJfcmVwb3NpdGlvbkNoaWxkIiwiX29uQWN0aW9uIiwicmVzaXplT2JzZXJ2ZXIiLCJSZXNpemVPYnNlcnZlciIsIndpbmRvdyIsImFkZEV2ZW50TGlzdGVuZXIiLCJfZGlzcGF0Y2hlclJlZiIsImRpcyIsInJlZ2lzdGVyIiwiZGVzdHJveUVsZW1lbnQiLCJwZXJzaXN0S2V5IiwicmVtb3ZlIiwiaXNNb3VudGVkIiwiQm9vbGVhbiIsInJlZiIsImNoaWxkQ29udGFpbmVyIiwidW5vYnNlcnZlIiwib2JzZXJ2ZSIsInVwZGF0ZUNoaWxkIiwiY29tcG9uZW50RGlkTW91bnQiLCJyZW5kZXJBcHAiLCJjb21wb25lbnREaWRVcGRhdGUiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInVwZGF0ZUNoaWxkVmlzaWJpbGl0eSIsImRpc2Nvbm5lY3QiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwidW5yZWdpc3RlciIsInBheWxvYWQiLCJhY3Rpb24iLCJ1cGRhdGVDaGlsZFBvc2l0aW9uIiwiY29udGVudCIsIk1hdHJpeENsaWVudFBlZyIsImdldCIsImNoaWxkcmVuIiwiUmVhY3RET00iLCJyZW5kZXIiLCJ2aXNpYmxlIiwiZGlzcGxheSIsIlByb3BUeXBlcyIsInN0cmluZyIsImlzUmVxdWlyZWQiLCJudW1iZXIiLCJnZXRQZXJzaXN0S2V5IiwiYXBwSWQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBZ0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUE7QUFDQTtBQUNBO0FBRUEsU0FBU0EsWUFBVCxDQUFzQkMsV0FBdEIsRUFBbUM7QUFDL0IsU0FBT0MsUUFBUSxDQUFDQyxjQUFULENBQXdCRixXQUF4QixDQUFQO0FBQ0g7O0FBRUQsU0FBU0csb0JBQVQsQ0FBOEJILFdBQTlCLEVBQTJDO0FBQ3ZDLE1BQUlJLFNBQVMsR0FBR0wsWUFBWSxDQUFDQyxXQUFELENBQTVCOztBQUVBLE1BQUksQ0FBQ0ksU0FBTCxFQUFnQjtBQUNaQSxJQUFBQSxTQUFTLEdBQUdILFFBQVEsQ0FBQ0ksYUFBVCxDQUF1QixLQUF2QixDQUFaO0FBQ0FELElBQUFBLFNBQVMsQ0FBQ0UsRUFBVixHQUFlTixXQUFmO0FBQ0FDLElBQUFBLFFBQVEsQ0FBQ00sSUFBVCxDQUFjQyxXQUFkLENBQTBCSixTQUExQjtBQUNIOztBQUVELFNBQU9BLFNBQVA7QUFDSDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztJQUVxQkssZ0IsV0FEcEIsZ0RBQXFCLGlDQUFyQixDLG1DQUFELE1BQ3FCQSxnQkFEckIsU0FDOENDLGVBQU1DLFNBRHBELENBQzhEO0FBVzFEQyxFQUFBQSxXQUFXLEdBQUc7QUFDVjtBQURVLCtEQW1HUSxzQkFBUyxDQUFDQyxLQUFELEVBQVFDLE1BQVIsS0FBbUI7QUFDOUMsVUFBSSxDQUFDRCxLQUFELElBQVUsQ0FBQ0MsTUFBZixFQUF1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LENBQTdDO0FBQ0g7O0FBRURhLEVBQUFBLHFCQUFxQixDQUFDMUMsS0FBRCxFQUFRdUQsT0FBUixFQUFpQjtBQUNsQyxRQUFJLENBQUN2RCxLQUFMLEVBQVk7QUFDWkEsSUFBQUEsS0FBSyxDQUFDTSxLQUFOLENBQVlrRCxPQUFaLEdBQXNCRCxPQUFPLEdBQUcsT0FBSCxHQUFhLE1BQTFDO0FBQ0g7O0FBZ0JERCxFQUFBQSxNQUFNLEdBQUc7QUFDTCx3QkFBTztBQUFLLE1BQUEsR0FBRyxFQUFFLEtBQUt0QztBQUFmLE1BQVA7QUFDSDs7QUE5SHlELEMsc0RBQ3ZDO0FBQ2Y7QUFDQTtBQUNBO0FBQ0FhLEVBQUFBLFVBQVUsRUFBRTRCLG1CQUFVQyxNQUFWLENBQWlCQyxVQUpkO0FBTWY7QUFDQXBELEVBQUFBLE1BQU0sRUFBRWtELG1CQUFVRztBQVBILEM7OztBQWdJaEIsTUFBTUMsYUFBYSxHQUFHLENBQUNDO0FBQUQ7QUFBQSxLQUFtQixZQUFZQSxLQUFyRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAxOCBOZXcgVmVjdG9yIEx0ZC5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHt0aHJvdHRsZX0gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3Jlc2l6ZS1vYnNlcnZlci1wb2x5ZmlsbCc7XG5cbmltcG9ydCBkaXMgZnJvbSAnLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyJztcbmltcG9ydCBNYXRyaXhDbGllbnRDb250ZXh0IGZyb20gXCIuLi8uLi8uLi9jb250ZXh0cy9NYXRyaXhDbGllbnRDb250ZXh0XCI7XG5pbXBvcnQge01hdHJpeENsaWVudFBlZ30gZnJvbSBcIi4uLy4uLy4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IHtpc051bGxPclVuZGVmaW5lZH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL3V0aWxzXCI7XG5pbXBvcnQge3JlcGxhY2VhYmxlQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVwbGFjZWFibGVDb21wb25lbnRcIjtcblxuLy8gU2hhbWVsZXNzbHkgcmlwcGVkIG9mZiBNb2RhbC5qcy4gIFRoZXJlJ3MgcHJvYmFibHkgYSBiZXR0ZXIgd2F5XG4vLyBvZiBkb2luZyByZXVzYWJsZSB3aWRnZXRzIGxpa2UgZGlhbG9nIGJveGVzICYgbWVudXMgd2hlcmUgd2UgZ28gYW5kXG4vLyBwYXNzIGluIGEgY3VzdG9tIGNvbnRyb2wgYXMgdGhlIGFjdHVhbCBib2R5LlxuXG5mdW5jdGlvbiBnZXRDb250YWluZXIoY29udGFpbmVySWQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVySWQpO1xufVxuXG5mdW5jdGlvbiBnZXRPckNyZWF0ZUNvbnRhaW5lcihjb250YWluZXJJZCkge1xuICAgIGxldCBjb250YWluZXIgPSBnZXRDb250YWluZXIoY29udGFpbmVySWQpO1xuXG4gICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgY29udGFpbmVyLmlkID0gY29udGFpbmVySWQ7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xufVxuXG4vKlxuICogQ2xhc3Mgb2YgY29tcG9uZW50IHRoYXQgcmVuZGVycyBpdHMgY2hpbGRyZW4gaW4gYSBzZXBhcmF0ZSBSZWFjdERPTSB2aXJ0dWFsIHRyZWVcbiAqIGluIGEgY29udGFpbmVyIGVsZW1lbnQgYXBwZW5kZWQgdG8gZG9jdW1lbnQuYm9keS5cbiAqXG4gKiBUaGlzIHByZXZlbnRzIHRoZSBjaGlsZHJlbiBmcm9tIGJlaW5nIHVubW91bnRlZCB3aGVuIHRoZSBwYXJlbnQgb2YgUGVyc2lzdGVkRWxlbWVudFxuICogdW5tb3VudHMsIGFsbG93aW5nIHRoZW0gdG8gcGVyc2lzdC5cbiAqXG4gKiBXaGVuIFBFIGlzIHVubW91bnRlZCwgaXQgaGlkZXMgdGhlIGNoaWxkcmVuIHVzaW5nIENTUy4gV2hlbiBtb3VudGVkIG9yIHVwZGF0ZWQsIHRoZVxuICogY2hpbGRyZW4gYXJlIG1hZGUgdmlzaWJsZSBhbmQgYXJlIHBvc2l0aW9uZWQgaW50byBhIGRpdiB0aGF0IGlzIGdpdmVuIHRoZSBzYW1lXG4gKiBib3VuZGluZyByZWN0IGFzIHRoZSBwYXJlbnQgb2YgUEUuXG4gKi9cbkByZXBsYWNlYWJsZUNvbXBvbmVudChcInZpZXdzLmVsZW1lbnRzLlBlcnNpc3RlZEVsZW1lbnRcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBlcnNpc3RlZEVsZW1lbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICAgIC8vIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIFBlcnNpc3RlZEVsZW1lbnQgaW5zdGFuY2VcbiAgICAgICAgLy8gQW55IFBlcnNpc3RlZEVsZW1lbnRzIHdpdGggdGhlIHNhbWUgcGVyc2lzdEtleSB3aWxsIHVzZVxuICAgICAgICAvLyB0aGUgc2FtZSBET00gY29udGFpbmVyLlxuICAgICAgICBwZXJzaXN0S2V5OiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG5cbiAgICAgICAgLy8gei1pbmRleCBmb3IgdGhlIGVsZW1lbnQuIERlZmF1bHRzIHRvIDkuXG4gICAgICAgIHpJbmRleDogUHJvcFR5cGVzLm51bWJlcixcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY29sbGVjdENoaWxkQ29udGFpbmVyID0gdGhpcy5jb2xsZWN0Q2hpbGRDb250YWluZXIuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5jb2xsZWN0Q2hpbGQgPSB0aGlzLmNvbGxlY3RDaGlsZC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl9yZXBvc2l0aW9uQ2hpbGQgPSB0aGlzLl9yZXBvc2l0aW9uQ2hpbGQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fb25BY3Rpb24gPSB0aGlzLl9vbkFjdGlvbi5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIodGhpcy5fcmVwb3NpdGlvbkNoaWxkKTtcbiAgICAgICAgLy8gQW5ub3lpbmdseSwgYSByZXNpemUgb2JzZXJ2ZXIgaXMgaW5zdWZmaWNpZW50LCBzaW5jZSB3ZSBhbHNvIGNhcmVcbiAgICAgICAgLy8gYWJvdXQgd2hlbiB0aGUgZWxlbWVudCBtb3ZlcyBvbiB0aGUgc2NyZWVuIHdpdGhvdXQgY2hhbmdpbmcgaXRzXG4gICAgICAgIC8vIGRpbWVuc2lvbnMuIERvZXNuJ3QgbG9vayBsaWtlIHRoZXJlJ3MgYSBSZXNpemVPYnNlcnZlciBlcXVpdmFsZW50XG4gICAgICAgIC8vIGZvciB0aGlzLCBzbyB3ZSBib2RnZSBpdCBieSBsaXN0ZW5pbmcgZm9yIGRvY3VtZW50IHJlc2l6ZSBhbmRcbiAgICAgICAgLy8gdGhlIHRpbWVsaW5lX3Jlc2l6ZSBhY3Rpb24uXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9yZXBvc2l0aW9uQ2hpbGQpO1xuICAgICAgICB0aGlzLl9kaXNwYXRjaGVyUmVmID0gZGlzLnJlZ2lzdGVyKHRoaXMuX29uQWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBET00gZWxlbWVudHMgY3JlYXRlZCB3aGVuIGEgUGVyc2lzdGVkRWxlbWVudCB3aXRoIHRoZSBnaXZlblxuICAgICAqIHBlcnNpc3RLZXkgd2FzIG1vdW50ZWQuIFRoZSBET00gZWxlbWVudHMgd2lsbCBiZSByZS1hZGRlZCBpZiBhbm90aGVyXG4gICAgICogUGVyaXN0ZWRFbGVtZW50IGlzIG1vdW50ZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwZXJzaXN0S2V5IEtleSB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgUGVyc2lzdGVkRWxlbWVudFxuICAgICAqL1xuICAgIHN0YXRpYyBkZXN0cm95RWxlbWVudChwZXJzaXN0S2V5KSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lcignbXhfcGVyc2lzdGVkRWxlbWVudF8nICsgcGVyc2lzdEtleSk7XG4gICAgICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBpc01vdW50ZWQocGVyc2lzdEtleSkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRDb250YWluZXIoJ214X3BlcnNpc3RlZEVsZW1lbnRfJyArIHBlcnNpc3RLZXkpKTtcbiAgICB9XG5cbiAgICBjb2xsZWN0Q2hpbGRDb250YWluZXIocmVmKSB7XG4gICAgICAgIGlmICh0aGlzLmNoaWxkQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLnVub2JzZXJ2ZSh0aGlzLmNoaWxkQ29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoaWxkQ29udGFpbmVyID0gcmVmO1xuICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUocmVmKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbGxlY3RDaGlsZChyZWYpIHtcbiAgICAgICAgdGhpcy5jaGlsZCA9IHJlZjtcbiAgICAgICAgdGhpcy51cGRhdGVDaGlsZCgpO1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkKCk7XG4gICAgICAgIHRoaXMucmVuZGVyQXBwKCk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkKCk7XG4gICAgICAgIHRoaXMucmVuZGVyQXBwKCk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hpbGRWaXNpYmlsaXR5KHRoaXMuY2hpbGQsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9yZXBvc2l0aW9uQ2hpbGQpO1xuICAgICAgICBkaXMudW5yZWdpc3Rlcih0aGlzLl9kaXNwYXRjaGVyUmVmKTtcbiAgICB9XG5cbiAgICBfb25BY3Rpb24ocGF5bG9hZCkge1xuICAgICAgICBpZiAocGF5bG9hZC5hY3Rpb24gPT09ICd0aW1lbGluZV9yZXNpemUnKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXBvc2l0aW9uQ2hpbGQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXlsb2FkLmFjdGlvbiA9PT0gJ2xvZ291dCcpIHtcbiAgICAgICAgICAgIFBlcnNpc3RlZEVsZW1lbnQuZGVzdHJveUVsZW1lbnQodGhpcy5wcm9wcy5wZXJzaXN0S2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9yZXBvc2l0aW9uQ2hpbGQoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hpbGRQb3NpdGlvbih0aGlzLmNoaWxkLCB0aGlzLmNoaWxkQ29udGFpbmVyKTtcbiAgICB9XG5cbiAgICB1cGRhdGVDaGlsZCgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVDaGlsZFBvc2l0aW9uKHRoaXMuY2hpbGQsIHRoaXMuY2hpbGRDb250YWluZXIpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkVmlzaWJpbGl0eSh0aGlzLmNoaWxkLCB0cnVlKTtcbiAgICB9XG5cbiAgICByZW5kZXJBcHAoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSA8TWF0cml4Q2xpZW50Q29udGV4dC5Qcm92aWRlciB2YWx1ZT17TWF0cml4Q2xpZW50UGVnLmdldCgpfT5cbiAgICAgICAgICAgIDxkaXYgcmVmPXt0aGlzLmNvbGxlY3RDaGlsZH0gc3R5bGU9e3RoaXMucHJvcHMuc3R5bGV9PlxuICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvTWF0cml4Q2xpZW50Q29udGV4dC5Qcm92aWRlcj47XG5cbiAgICAgICAgUmVhY3RET00ucmVuZGVyKGNvbnRlbnQsIGdldE9yQ3JlYXRlQ29udGFpbmVyKCdteF9wZXJzaXN0ZWRFbGVtZW50XycrdGhpcy5wcm9wcy5wZXJzaXN0S2V5KSk7XG4gICAgfVxuXG4gICAgdXBkYXRlQ2hpbGRWaXNpYmlsaXR5KGNoaWxkLCB2aXNpYmxlKSB7XG4gICAgICAgIGlmICghY2hpbGQpIHJldHVybjtcbiAgICAgICAgY2hpbGQuc3R5bGUuZGlzcGxheSA9IHZpc2libGUgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgIH1cblxuICAgIHVwZGF0ZUNoaWxkUG9zaXRpb24gPSB0aHJvdHRsZSgoY2hpbGQsIHBhcmVudCkgPT4ge1xuICAgICAgICBpZiAoIWNoaWxkIHx8ICFwYXJlbnQpIHJldHVybjtcblxuICAgICAgICBjb25zdCBwYXJlbnRSZWN0ID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBPYmplY3QuYXNzaWduKGNoaWxkLnN0eWxlLCB7XG4gICAgICAgICAgICB6SW5kZXg6IGlzTnVsbE9yVW5kZWZpbmVkKHRoaXMucHJvcHMuekluZGV4KSA/IDkgOiB0aGlzLnByb3BzLnpJbmRleCxcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgdG9wOiBwYXJlbnRSZWN0LnRvcCArICdweCcsXG4gICAgICAgICAgICBsZWZ0OiBwYXJlbnRSZWN0LmxlZnQgKyAncHgnLFxuICAgICAgICAgICAgd2lkdGg6IHBhcmVudFJlY3Qud2lkdGggKyAncHgnLFxuICAgICAgICAgICAgaGVpZ2h0OiBwYXJlbnRSZWN0LmhlaWdodCArICdweCcsXG4gICAgICAgIH0pO1xuICAgIH0sIDEwMCwge3RyYWlsaW5nOiB0cnVlLCBsZWFkaW5nOiB0cnVlfSk7XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiA8ZGl2IHJlZj17dGhpcy5jb2xsZWN0Q2hpbGRDb250YWluZXJ9IC8+O1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldFBlcnNpc3RLZXkgPSAoYXBwSWQ6IHN0cmluZykgPT4gJ3dpZGdldF8nICsgYXBwSWQ7XG4iXX0=