UNPKG

matrix-react-sdk

Version:
181 lines (170 loc) 20.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.EventIndexPeg = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _logger = require("matrix-js-sdk/src/logger"); var _PlatformPeg = _interopRequireDefault(require("../PlatformPeg")); var _EventIndex = _interopRequireDefault(require("../indexing/EventIndex")); var _MatrixClientPeg = require("../MatrixClientPeg"); var _SettingsStore = _interopRequireDefault(require("../settings/SettingsStore")); var _SettingLevel = require("../settings/SettingLevel"); /* Copyright 2024 New Vector Ltd. Copyright 2019-2021 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ /* * Object holding the global EventIndex object. Can only be initialized if the * platform supports event indexing. */ const INDEX_VERSION = 1; /** * Holds the current instance of the `EventIndex` to use across the codebase. * Looking for an `EventIndex`? Just look for the `EventIndexPeg` on the peg * board. "Peg" is the literal meaning of something you hang something on. So * you'll find a `EventIndex` hanging on the `EventIndexPeg`. */ class EventIndexPeg { constructor() { (0, _defineProperty2.default)(this, "index", null); (0, _defineProperty2.default)(this, "error", void 0); (0, _defineProperty2.default)(this, "_supportIsInstalled", false); } /** * Initialize the EventIndexPeg and if event indexing is enabled initialize * the event index. * * @return {Promise<boolean>} A promise that will resolve to true if an * EventIndex was successfully initialized, false otherwise. */ async init() { const indexManager = _PlatformPeg.default.get()?.getEventIndexingManager(); if (!indexManager) { _logger.logger.log("EventIndex: Platform doesn't support event indexing, not initializing."); return false; } this._supportIsInstalled = await indexManager.supportsEventIndexing(); if (!this.supportIsInstalled()) { _logger.logger.log("EventIndex: Event indexing isn't installed for the platform, not initializing."); return false; } if (!_SettingsStore.default.getValueAt(_SettingLevel.SettingLevel.DEVICE, "enableEventIndexing")) { _logger.logger.log("EventIndex: Event indexing is disabled, not initializing"); return false; } return this.initEventIndex(); } /** * Initialize the event index. * * @returns {boolean} True if the event index was successfully initialized, * false otherwise. */ async initEventIndex() { const index = new _EventIndex.default(); const indexManager = _PlatformPeg.default.get()?.getEventIndexingManager(); const client = _MatrixClientPeg.MatrixClientPeg.get(); if (!indexManager || !client) { throw new Error("Unable to init event index"); } const userId = client.getUserId(); const deviceId = client.getDeviceId(); try { await indexManager.initEventIndex(userId, deviceId); const userVersion = await indexManager.getUserVersion(); const eventIndexIsEmpty = await indexManager.isEventIndexEmpty(); if (eventIndexIsEmpty) { await indexManager.setUserVersion(INDEX_VERSION); } else if (userVersion === 0 && !eventIndexIsEmpty) { await indexManager.closeEventIndex(); await this.deleteEventIndex(); await indexManager.initEventIndex(userId, deviceId); await indexManager.setUserVersion(INDEX_VERSION); } _logger.logger.log("EventIndex: Successfully initialized the event index"); await index.init(); } catch (e) { _logger.logger.log("EventIndex: Error initializing the event index", e); this.error = e; return false; } this.index = index; return true; } /** * Check if the current platform has support for event indexing. * * @return {boolean} True if it has support, false otherwise. Note that this * does not mean that support is installed. */ platformHasSupport() { return _PlatformPeg.default.get()?.getEventIndexingManager() != null; } /** * Check if event indexing support is installed for the platform. * * Event indexing might require additional optional modules to be installed, * this tells us if those are installed. Note that this should only be * called after the init() method was called. * * @return {boolean} True if support is installed, false otherwise. */ supportIsInstalled() { return this._supportIsInstalled; } /** * Get the current event index. * * @return {EventIndex} The current event index. */ get() { return this.index; } start() { if (this.index === null) return; this.index.startCrawler(); } stop() { if (this.index === null) return; this.index.stopCrawler(); } /** * Unset our event store * * After a call to this the init() method will need to be called again. * * @return {Promise} A promise that will resolve once the event index is * closed. */ async unset() { if (this.index === null) return; await this.index.close(); this.index = null; } /** * Delete our event indexer. * * After a call to this the init() method will need to be called again. * * @return {Promise} A promise that will resolve once the event index is * deleted. */ async deleteEventIndex() { const indexManager = _PlatformPeg.default.get()?.getEventIndexingManager(); if (indexManager) { await this.unset(); _logger.logger.log("EventIndex: Deleting event index."); await indexManager.deleteEventIndex(); } } } exports.EventIndexPeg = EventIndexPeg; if (!window.mxEventIndexPeg) { window.mxEventIndexPeg = new EventIndexPeg(); } var _default = exports.default = window.mxEventIndexPeg; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwicmVxdWlyZSIsIl9QbGF0Zm9ybVBlZyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfRXZlbnRJbmRleCIsIl9NYXRyaXhDbGllbnRQZWciLCJfU2V0dGluZ3NTdG9yZSIsIl9TZXR0aW5nTGV2ZWwiLCJJTkRFWF9WRVJTSU9OIiwiRXZlbnRJbmRleFBlZyIsImNvbnN0cnVjdG9yIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJpbml0IiwiaW5kZXhNYW5hZ2VyIiwiUGxhdGZvcm1QZWciLCJnZXQiLCJnZXRFdmVudEluZGV4aW5nTWFuYWdlciIsImxvZ2dlciIsImxvZyIsIl9zdXBwb3J0SXNJbnN0YWxsZWQiLCJzdXBwb3J0c0V2ZW50SW5kZXhpbmciLCJzdXBwb3J0SXNJbnN0YWxsZWQiLCJTZXR0aW5nc1N0b3JlIiwiZ2V0VmFsdWVBdCIsIlNldHRpbmdMZXZlbCIsIkRFVklDRSIsImluaXRFdmVudEluZGV4IiwiaW5kZXgiLCJFdmVudEluZGV4IiwiY2xpZW50IiwiTWF0cml4Q2xpZW50UGVnIiwiRXJyb3IiLCJ1c2VySWQiLCJnZXRVc2VySWQiLCJkZXZpY2VJZCIsImdldERldmljZUlkIiwidXNlclZlcnNpb24iLCJnZXRVc2VyVmVyc2lvbiIsImV2ZW50SW5kZXhJc0VtcHR5IiwiaXNFdmVudEluZGV4RW1wdHkiLCJzZXRVc2VyVmVyc2lvbiIsImNsb3NlRXZlbnRJbmRleCIsImRlbGV0ZUV2ZW50SW5kZXgiLCJlIiwiZXJyb3IiLCJwbGF0Zm9ybUhhc1N1cHBvcnQiLCJzdGFydCIsInN0YXJ0Q3Jhd2xlciIsInN0b3AiLCJzdG9wQ3Jhd2xlciIsInVuc2V0IiwiY2xvc2UiLCJleHBvcnRzIiwid2luZG93IiwibXhFdmVudEluZGV4UGVnIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXhpbmcvRXZlbnRJbmRleFBlZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOS0yMDIxIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbi8qXG4gKiBPYmplY3QgaG9sZGluZyB0aGUgZ2xvYmFsIEV2ZW50SW5kZXggb2JqZWN0LiBDYW4gb25seSBiZSBpbml0aWFsaXplZCBpZiB0aGVcbiAqIHBsYXRmb3JtIHN1cHBvcnRzIGV2ZW50IGluZGV4aW5nLlxuICovXG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcblxuaW1wb3J0IFBsYXRmb3JtUGVnIGZyb20gXCIuLi9QbGF0Zm9ybVBlZ1wiO1xuaW1wb3J0IEV2ZW50SW5kZXggZnJvbSBcIi4uL2luZGV4aW5nL0V2ZW50SW5kZXhcIjtcbmltcG9ydCB7IE1hdHJpeENsaWVudFBlZyB9IGZyb20gXCIuLi9NYXRyaXhDbGllbnRQZWdcIjtcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGV2ZWwgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ0xldmVsXCI7XG5cbmNvbnN0IElOREVYX1ZFUlNJT04gPSAxO1xuXG4vKipcbiAqIEhvbGRzIHRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSBgRXZlbnRJbmRleGAgdG8gdXNlIGFjcm9zcyB0aGUgY29kZWJhc2UuXG4gKiBMb29raW5nIGZvciBhbiBgRXZlbnRJbmRleGA/IEp1c3QgbG9vayBmb3IgdGhlIGBFdmVudEluZGV4UGVnYCBvbiB0aGUgcGVnXG4gKiBib2FyZC4gXCJQZWdcIiBpcyB0aGUgbGl0ZXJhbCBtZWFuaW5nIG9mIHNvbWV0aGluZyB5b3UgaGFuZyBzb21ldGhpbmcgb24uIFNvXG4gKiB5b3UnbGwgZmluZCBhIGBFdmVudEluZGV4YCBoYW5naW5nIG9uIHRoZSBgRXZlbnRJbmRleFBlZ2AuXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudEluZGV4UGVnIHtcbiAgICBwdWJsaWMgaW5kZXg6IEV2ZW50SW5kZXggfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgZXJyb3I6IHVua25vd247XG5cbiAgICBwcml2YXRlIF9zdXBwb3J0SXNJbnN0YWxsZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIEV2ZW50SW5kZXhQZWcgYW5kIGlmIGV2ZW50IGluZGV4aW5nIGlzIGVuYWJsZWQgaW5pdGlhbGl6ZVxuICAgICAqIHRoZSBldmVudCBpbmRleC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IEEgcHJvbWlzZSB0aGF0IHdpbGwgcmVzb2x2ZSB0byB0cnVlIGlmIGFuXG4gICAgICogRXZlbnRJbmRleCB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGluaXQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGluZGV4TWFuYWdlciA9IFBsYXRmb3JtUGVnLmdldCgpPy5nZXRFdmVudEluZGV4aW5nTWFuYWdlcigpO1xuICAgICAgICBpZiAoIWluZGV4TWFuYWdlcikge1xuICAgICAgICAgICAgbG9nZ2VyLmxvZyhcIkV2ZW50SW5kZXg6IFBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydCBldmVudCBpbmRleGluZywgbm90IGluaXRpYWxpemluZy5cIik7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zdXBwb3J0SXNJbnN0YWxsZWQgPSBhd2FpdCBpbmRleE1hbmFnZXIuc3VwcG9ydHNFdmVudEluZGV4aW5nKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnN1cHBvcnRJc0luc3RhbGxlZCgpKSB7XG4gICAgICAgICAgICBsb2dnZXIubG9nKFwiRXZlbnRJbmRleDogRXZlbnQgaW5kZXhpbmcgaXNuJ3QgaW5zdGFsbGVkIGZvciB0aGUgcGxhdGZvcm0sIG5vdCBpbml0aWFsaXppbmcuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFTZXR0aW5nc1N0b3JlLmdldFZhbHVlQXQoU2V0dGluZ0xldmVsLkRFVklDRSwgXCJlbmFibGVFdmVudEluZGV4aW5nXCIpKSB7XG4gICAgICAgICAgICBsb2dnZXIubG9nKFwiRXZlbnRJbmRleDogRXZlbnQgaW5kZXhpbmcgaXMgZGlzYWJsZWQsIG5vdCBpbml0aWFsaXppbmdcIik7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbml0RXZlbnRJbmRleCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIGV2ZW50IGluZGV4LlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGV2ZW50IGluZGV4IHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQsXG4gICAgICogZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBpbml0RXZlbnRJbmRleCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBuZXcgRXZlbnRJbmRleCgpO1xuICAgICAgICBjb25zdCBpbmRleE1hbmFnZXIgPSBQbGF0Zm9ybVBlZy5nZXQoKT8uZ2V0RXZlbnRJbmRleGluZ01hbmFnZXIoKTtcbiAgICAgICAgY29uc3QgY2xpZW50ID0gTWF0cml4Q2xpZW50UGVnLmdldCgpO1xuICAgICAgICBpZiAoIWluZGV4TWFuYWdlciB8fCAhY2xpZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gaW5pdCBldmVudCBpbmRleFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGNsaWVudC5nZXRVc2VySWQoKSE7XG4gICAgICAgIGNvbnN0IGRldmljZUlkID0gY2xpZW50LmdldERldmljZUlkKCkhO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBpbmRleE1hbmFnZXIuaW5pdEV2ZW50SW5kZXgodXNlcklkLCBkZXZpY2VJZCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHVzZXJWZXJzaW9uID0gYXdhaXQgaW5kZXhNYW5hZ2VyLmdldFVzZXJWZXJzaW9uKCk7XG4gICAgICAgICAgICBjb25zdCBldmVudEluZGV4SXNFbXB0eSA9IGF3YWl0IGluZGV4TWFuYWdlci5pc0V2ZW50SW5kZXhFbXB0eSgpO1xuXG4gICAgICAgICAgICBpZiAoZXZlbnRJbmRleElzRW1wdHkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBpbmRleE1hbmFnZXIuc2V0VXNlclZlcnNpb24oSU5ERVhfVkVSU0lPTik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHVzZXJWZXJzaW9uID09PSAwICYmICFldmVudEluZGV4SXNFbXB0eSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGluZGV4TWFuYWdlci5jbG9zZUV2ZW50SW5kZXgoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUV2ZW50SW5kZXgoKTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IGluZGV4TWFuYWdlci5pbml0RXZlbnRJbmRleCh1c2VySWQsIGRldmljZUlkKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBpbmRleE1hbmFnZXIuc2V0VXNlclZlcnNpb24oSU5ERVhfVkVSU0lPTik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxvZ2dlci5sb2coXCJFdmVudEluZGV4OiBTdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgdGhlIGV2ZW50IGluZGV4XCIpO1xuICAgICAgICAgICAgYXdhaXQgaW5kZXguaW5pdCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dnZXIubG9nKFwiRXZlbnRJbmRleDogRXJyb3IgaW5pdGlhbGl6aW5nIHRoZSBldmVudCBpbmRleFwiLCBlKTtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBjdXJyZW50IHBsYXRmb3JtIGhhcyBzdXBwb3J0IGZvciBldmVudCBpbmRleGluZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgaXQgaGFzIHN1cHBvcnQsIGZhbHNlIG90aGVyd2lzZS4gTm90ZSB0aGF0IHRoaXNcbiAgICAgKiBkb2VzIG5vdCBtZWFuIHRoYXQgc3VwcG9ydCBpcyBpbnN0YWxsZWQuXG4gICAgICovXG4gICAgcHVibGljIHBsYXRmb3JtSGFzU3VwcG9ydCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFBsYXRmb3JtUGVnLmdldCgpPy5nZXRFdmVudEluZGV4aW5nTWFuYWdlcigpICE9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgZXZlbnQgaW5kZXhpbmcgc3VwcG9ydCBpcyBpbnN0YWxsZWQgZm9yIHRoZSBwbGF0Zm9ybS5cbiAgICAgKlxuICAgICAqIEV2ZW50IGluZGV4aW5nIG1pZ2h0IHJlcXVpcmUgYWRkaXRpb25hbCBvcHRpb25hbCBtb2R1bGVzIHRvIGJlIGluc3RhbGxlZCxcbiAgICAgKiB0aGlzIHRlbGxzIHVzIGlmIHRob3NlIGFyZSBpbnN0YWxsZWQuIE5vdGUgdGhhdCB0aGlzIHNob3VsZCBvbmx5IGJlXG4gICAgICogY2FsbGVkIGFmdGVyIHRoZSBpbml0KCkgbWV0aG9kIHdhcyBjYWxsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHN1cHBvcnQgaXMgaW5zdGFsbGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIHN1cHBvcnRJc0luc3RhbGxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1cHBvcnRJc0luc3RhbGxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZXZlbnQgaW5kZXguXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtFdmVudEluZGV4fSBUaGUgY3VycmVudCBldmVudCBpbmRleC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0KCk6IEV2ZW50SW5kZXggfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXg7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmluZGV4LnN0YXJ0Q3Jhd2xlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmluZGV4LnN0b3BDcmF3bGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5zZXQgb3VyIGV2ZW50IHN0b3JlXG4gICAgICpcbiAgICAgKiBBZnRlciBhIGNhbGwgdG8gdGhpcyB0aGUgaW5pdCgpIG1ldGhvZCB3aWxsIG5lZWQgdG8gYmUgY2FsbGVkIGFnYWluLlxuICAgICAqXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgd2lsbCByZXNvbHZlIG9uY2UgdGhlIGV2ZW50IGluZGV4IGlzXG4gICAgICogY2xvc2VkLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB1bnNldCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXggPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgYXdhaXQgdGhpcy5pbmRleC5jbG9zZSgpO1xuICAgICAgICB0aGlzLmluZGV4ID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgb3VyIGV2ZW50IGluZGV4ZXIuXG4gICAgICpcbiAgICAgKiBBZnRlciBhIGNhbGwgdG8gdGhpcyB0aGUgaW5pdCgpIG1ldGhvZCB3aWxsIG5lZWQgdG8gYmUgY2FsbGVkIGFnYWluLlxuICAgICAqXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgd2lsbCByZXNvbHZlIG9uY2UgdGhlIGV2ZW50IGluZGV4IGlzXG4gICAgICogZGVsZXRlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZGVsZXRlRXZlbnRJbmRleCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaW5kZXhNYW5hZ2VyID0gUGxhdGZvcm1QZWcuZ2V0KCk/LmdldEV2ZW50SW5kZXhpbmdNYW5hZ2VyKCk7XG5cbiAgICAgICAgaWYgKGluZGV4TWFuYWdlcikge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy51bnNldCgpO1xuICAgICAgICAgICAgbG9nZ2VyLmxvZyhcIkV2ZW50SW5kZXg6IERlbGV0aW5nIGV2ZW50IGluZGV4LlwiKTtcbiAgICAgICAgICAgIGF3YWl0IGluZGV4TWFuYWdlci5kZWxldGVFdmVudEluZGV4KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmlmICghd2luZG93Lm14RXZlbnRJbmRleFBlZykge1xuICAgIHdpbmRvdy5teEV2ZW50SW5kZXhQZWcgPSBuZXcgRXZlbnRJbmRleFBlZygpO1xufVxuZXhwb3J0IGRlZmF1bHQgd2luZG93Lm14RXZlbnRJbmRleFBlZztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFhQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFBQyxZQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7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