UNPKG

matrix-react-sdk

Version:
162 lines (145 loc) 18.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.ReleaseAnnouncementStore = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _matrix = require("matrix-js-sdk/src/matrix"); var _logger = require("matrix-js-sdk/src/logger"); var _lodash = require("lodash"); var _SettingsStore = _interopRequireDefault(require("../settings/SettingsStore")); var _SettingLevel = require("../settings/SettingLevel"); var _Settings = require("../settings/Settings"); /* * Copyright 2024 New Vector Ltd. * Copyright 2024 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. */ /** * The features are shown in the array order. */ const FEATURES = ["threadsActivityCentre", "pinningMessageList"]; /** * All the features that can be shown in the release announcements. */ /** * The stored settings for the release announcements. * The boolean is at true when the user has viewed the feature */ /** * The events emitted by the ReleaseAnnouncementStore. */ /** * The handlers for the ReleaseAnnouncementStore events. */ /** * The ReleaseAnnouncementStore is responsible for managing the release announcements. * It keeps track of the viewed release announcements and emits events when the release announcement changes. */ class ReleaseAnnouncementStore extends _matrix.TypedEventEmitter { /** * The singleton instance of the ReleaseAnnouncementStore. */ static get instance() { if (!ReleaseAnnouncementStore.internalInstance) { ReleaseAnnouncementStore.internalInstance = new ReleaseAnnouncementStore(); } return ReleaseAnnouncementStore.internalInstance; } /** * Should be used only for testing purposes. * @internal */ constructor() { super(); /** * The index of the feature to show. * @private */ (0, _defineProperty2.default)(this, "index", 0); _SettingsStore.default.watchSetting("releaseAnnouncementData", null, () => { this.emit("releaseAnnouncementChanged", this.getReleaseAnnouncement()); }); } /** * Get the viewed release announcements from the settings. * @private */ getViewedReleaseAnnouncements() { // Clone the settings to avoid to mutate the internal stored value in the SettingsStore return (0, _lodash.cloneDeep)(_SettingsStore.default.getValue("releaseAnnouncementData")); } /** * Check if the release announcement is enabled. * @private */ isReleaseAnnouncementEnabled() { return _SettingsStore.default.getValue(_Settings.Features.ReleaseAnnouncement); } /** * Get the release announcement that should be displayed * @returns The feature to announce or null if there is no feature to announce */ getReleaseAnnouncement() { // Do nothing if the release announcement is disabled const isReleaseAnnouncementEnabled = this.isReleaseAnnouncementEnabled(); if (!isReleaseAnnouncementEnabled) return null; const viewedReleaseAnnouncements = this.getViewedReleaseAnnouncements(); // Find the first feature that has not been viewed for (let i = this.index; i < FEATURES.length; i++) { if (!viewedReleaseAnnouncements[FEATURES[i]]) { this.index = i; return FEATURES[this.index]; } } // All features have been viewed return null; } /** * Mark the current release announcement as viewed. * This will update the account settings * @private */ async markReleaseAnnouncementAsViewed() { // Do nothing if the release announcement is disabled const isReleaseAnnouncementEnabled = this.isReleaseAnnouncementEnabled(); if (!isReleaseAnnouncementEnabled) return; const viewedReleaseAnnouncements = this.getViewedReleaseAnnouncements(); // If the index is out of bounds, do nothing // Normally it shouldn't happen, but it's better to be safe const feature = FEATURES[this.index]; if (!feature) return; // Mark the feature as viewed viewedReleaseAnnouncements[FEATURES[this.index]] = true; this.index++; // Do sanity check if we can store the new value in the settings const isSupported = _SettingsStore.default.isLevelSupported(_SettingLevel.SettingLevel.ACCOUNT); if (!isSupported) return; const canSetValue = _SettingsStore.default.canSetValue("releaseAnnouncementData", null, _SettingLevel.SettingLevel.ACCOUNT); if (canSetValue) { try { await _SettingsStore.default.setValue("releaseAnnouncementData", null, _SettingLevel.SettingLevel.ACCOUNT, viewedReleaseAnnouncements); } catch (e) { _logger.logger.log("Failed to set release announcement settings", e); } } } /** * Mark the current release announcement as viewed and move to the next release announcement. * This will update the account settings and emit the `releaseAnnouncementChanged` event */ async nextReleaseAnnouncement() { await this.markReleaseAnnouncementAsViewed(); this.emit("releaseAnnouncementChanged", this.getReleaseAnnouncement()); } } exports.ReleaseAnnouncementStore = ReleaseAnnouncementStore; /** * The singleton instance of the ReleaseAnnouncementStore. * @private */ (0, _defineProperty2.default)(ReleaseAnnouncementStore, "internalInstance", void 0); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl9sb2dnZXIiLCJfbG9kYXNoIiwiX1NldHRpbmdzU3RvcmUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX1NldHRpbmdMZXZlbCIsIl9TZXR0aW5ncyIsIkZFQVRVUkVTIiwiUmVsZWFzZUFubm91bmNlbWVudFN0b3JlIiwiVHlwZWRFdmVudEVtaXR0ZXIiLCJpbnN0YW5jZSIsImludGVybmFsSW5zdGFuY2UiLCJjb25zdHJ1Y3RvciIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiU2V0dGluZ3NTdG9yZSIsIndhdGNoU2V0dGluZyIsImVtaXQiLCJnZXRSZWxlYXNlQW5ub3VuY2VtZW50IiwiZ2V0Vmlld2VkUmVsZWFzZUFubm91bmNlbWVudHMiLCJjbG9uZURlZXAiLCJnZXRWYWx1ZSIsImlzUmVsZWFzZUFubm91bmNlbWVudEVuYWJsZWQiLCJGZWF0dXJlcyIsIlJlbGVhc2VBbm5vdW5jZW1lbnQiLCJ2aWV3ZWRSZWxlYXNlQW5ub3VuY2VtZW50cyIsImkiLCJpbmRleCIsImxlbmd0aCIsIm1hcmtSZWxlYXNlQW5ub3VuY2VtZW50QXNWaWV3ZWQiLCJmZWF0dXJlIiwiaXNTdXBwb3J0ZWQiLCJpc0xldmVsU3VwcG9ydGVkIiwiU2V0dGluZ0xldmVsIiwiQUNDT1VOVCIsImNhblNldFZhbHVlIiwic2V0VmFsdWUiLCJlIiwibG9nZ2VyIiwibG9nIiwibmV4dFJlbGVhc2VBbm5vdW5jZW1lbnQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0b3Jlcy9SZWxlYXNlQW5ub3VuY2VtZW50U3RvcmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuICogQ29weXJpZ2h0IDIwMjQgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcbiAqIFBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4gKi9cblxuaW1wb3J0IHsgVHlwZWRFdmVudEVtaXR0ZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tIFwibG9kYXNoXCI7XG5cbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGV2ZWwgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ0xldmVsXCI7XG5pbXBvcnQgeyBGZWF0dXJlcyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5nc1wiO1xuXG4vKipcbiAqIFRoZSBmZWF0dXJlcyBhcmUgc2hvd24gaW4gdGhlIGFycmF5IG9yZGVyLlxuICovXG5jb25zdCBGRUFUVVJFUyA9IFtcInRocmVhZHNBY3Rpdml0eUNlbnRyZVwiLCBcInBpbm5pbmdNZXNzYWdlTGlzdFwiXSBhcyBjb25zdDtcbi8qKlxuICogQWxsIHRoZSBmZWF0dXJlcyB0aGF0IGNhbiBiZSBzaG93biBpbiB0aGUgcmVsZWFzZSBhbm5vdW5jZW1lbnRzLlxuICovXG5leHBvcnQgdHlwZSBGZWF0dXJlID0gKHR5cGVvZiBGRUFUVVJFUylbbnVtYmVyXTtcbi8qKlxuICogVGhlIHN0b3JlZCBzZXR0aW5ncyBmb3IgdGhlIHJlbGVhc2UgYW5ub3VuY2VtZW50cy5cbiAqIFRoZSBib29sZWFuIGlzIGF0IHRydWUgd2hlbiB0aGUgdXNlciBoYXMgdmlld2VkIHRoZSBmZWF0dXJlXG4gKi9cbnR5cGUgU3RvcmVkU2V0dGluZ3MgPSBSZWNvcmQ8RmVhdHVyZSwgYm9vbGVhbj47XG5cbi8qKlxuICogVGhlIGV2ZW50cyBlbWl0dGVkIGJ5IHRoZSBSZWxlYXNlQW5ub3VuY2VtZW50U3RvcmUuXG4gKi9cbnR5cGUgUmVsZWFzZUFubm91bmNlbWVudFN0b3JlRXZlbnRzID0gXCJyZWxlYXNlQW5ub3VuY2VtZW50Q2hhbmdlZFwiO1xuLyoqXG4gKiBUaGUgaGFuZGxlcnMgZm9yIHRoZSBSZWxlYXNlQW5ub3VuY2VtZW50U3RvcmUgZXZlbnRzLlxuICovXG50eXBlIEhhbmRsZXJNYXAgPSB7XG4gICAgcmVsZWFzZUFubm91bmNlbWVudENoYW5nZWQ6IChuZXdGZWF0dXJlOiBGZWF0dXJlIHwgbnVsbCkgPT4gdm9pZDtcbn07XG5cbi8qKlxuICogVGhlIFJlbGVhc2VBbm5vdW5jZW1lbnRTdG9yZSBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIHJlbGVhc2UgYW5ub3VuY2VtZW50cy5cbiAqIEl0IGtlZXBzIHRyYWNrIG9mIHRoZSB2aWV3ZWQgcmVsZWFzZSBhbm5vdW5jZW1lbnRzIGFuZCBlbWl0cyBldmVudHMgd2hlbiB0aGUgcmVsZWFzZSBhbm5vdW5jZW1lbnQgY2hhbmdlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbGVhc2VBbm5vdW5jZW1lbnRTdG9yZSBleHRlbmRzIFR5cGVkRXZlbnRFbWl0dGVyPFJlbGVhc2VBbm5vdW5jZW1lbnRTdG9yZUV2ZW50cywgSGFuZGxlck1hcD4ge1xuICAgIC8qKlxuICAgICAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIFJlbGVhc2VBbm5vdW5jZW1lbnRTdG9yZS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGludGVybmFsSW5zdGFuY2U6IFJlbGVhc2VBbm5vdW5jZW1lbnRTdG9yZTtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGZlYXR1cmUgdG8gc2hvdy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgaW5kZXggPSAwO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgUmVsZWFzZUFubm91bmNlbWVudFN0b3JlLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGluc3RhbmNlKCk6IFJlbGVhc2VBbm5vdW5jZW1lbnRTdG9yZSB7XG4gICAgICAgIGlmICghUmVsZWFzZUFubm91bmNlbWVudFN0b3JlLmludGVybmFsSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIFJlbGVhc2VBbm5vdW5jZW1lbnRTdG9yZS5pbnRlcm5hbEluc3RhbmNlID0gbmV3IFJlbGVhc2VBbm5vdW5jZW1lbnRTdG9yZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWxlYXNlQW5ub3VuY2VtZW50U3RvcmUuaW50ZXJuYWxJbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG91bGQgYmUgdXNlZCBvbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgU2V0dGluZ3NTdG9yZS53YXRjaFNldHRpbmcoXCJyZWxlYXNlQW5ub3VuY2VtZW50RGF0YVwiLCBudWxsLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJyZWxlYXNlQW5ub3VuY2VtZW50Q2hhbmdlZFwiLCB0aGlzLmdldFJlbGVhc2VBbm5vdW5jZW1lbnQoKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmlld2VkIHJlbGVhc2UgYW5ub3VuY2VtZW50cyBmcm9tIHRoZSBzZXR0aW5ncy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0Vmlld2VkUmVsZWFzZUFubm91bmNlbWVudHMoKTogU3RvcmVkU2V0dGluZ3Mge1xuICAgICAgICAvLyBDbG9uZSB0aGUgc2V0dGluZ3MgdG8gYXZvaWQgdG8gbXV0YXRlIHRoZSBpbnRlcm5hbCBzdG9yZWQgdmFsdWUgaW4gdGhlIFNldHRpbmdzU3RvcmVcbiAgICAgICAgcmV0dXJuIGNsb25lRGVlcChTZXR0aW5nc1N0b3JlLmdldFZhbHVlPFN0b3JlZFNldHRpbmdzPihcInJlbGVhc2VBbm5vdW5jZW1lbnREYXRhXCIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgcmVsZWFzZSBhbm5vdW5jZW1lbnQgaXMgZW5hYmxlZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgaXNSZWxlYXNlQW5ub3VuY2VtZW50RW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFNldHRpbmdzU3RvcmUuZ2V0VmFsdWU8Ym9vbGVhbj4oRmVhdHVyZXMuUmVsZWFzZUFubm91bmNlbWVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByZWxlYXNlIGFubm91bmNlbWVudCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWRcbiAgICAgKiBAcmV0dXJucyBUaGUgZmVhdHVyZSB0byBhbm5vdW5jZSBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGZlYXR1cmUgdG8gYW5ub3VuY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UmVsZWFzZUFubm91bmNlbWVudCgpOiBGZWF0dXJlIHwgbnVsbCB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlIHJlbGVhc2UgYW5ub3VuY2VtZW50IGlzIGRpc2FibGVkXG4gICAgICAgIGNvbnN0IGlzUmVsZWFzZUFubm91bmNlbWVudEVuYWJsZWQgPSB0aGlzLmlzUmVsZWFzZUFubm91bmNlbWVudEVuYWJsZWQoKTtcbiAgICAgICAgaWYgKCFpc1JlbGVhc2VBbm5vdW5jZW1lbnRFbmFibGVkKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB2aWV3ZWRSZWxlYXNlQW5ub3VuY2VtZW50cyA9IHRoaXMuZ2V0Vmlld2VkUmVsZWFzZUFubm91bmNlbWVudHMoKTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBmZWF0dXJlIHRoYXQgaGFzIG5vdCBiZWVuIHZpZXdlZFxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5pbmRleDsgaSA8IEZFQVRVUkVTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXZpZXdlZFJlbGVhc2VBbm5vdW5jZW1lbnRzW0ZFQVRVUkVTW2ldXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIHJldHVybiBGRUFUVVJFU1t0aGlzLmluZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbCBmZWF0dXJlcyBoYXZlIGJlZW4gdmlld2VkXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hcmsgdGhlIGN1cnJlbnQgcmVsZWFzZSBhbm5vdW5jZW1lbnQgYXMgdmlld2VkLlxuICAgICAqIFRoaXMgd2lsbCB1cGRhdGUgdGhlIGFjY291bnQgc2V0dGluZ3NcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbWFya1JlbGVhc2VBbm5vdW5jZW1lbnRBc1ZpZXdlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gRG8gbm90aGluZyBpZiB0aGUgcmVsZWFzZSBhbm5vdW5jZW1lbnQgaXMgZGlzYWJsZWRcbiAgICAgICAgY29uc3QgaXNSZWxlYXNlQW5ub3VuY2VtZW50RW5hYmxlZCA9IHRoaXMuaXNSZWxlYXNlQW5ub3VuY2VtZW50RW5hYmxlZCgpO1xuICAgICAgICBpZiAoIWlzUmVsZWFzZUFubm91bmNlbWVudEVuYWJsZWQpIHJldHVybjtcblxuICAgICAgICBjb25zdCB2aWV3ZWRSZWxlYXNlQW5ub3VuY2VtZW50cyA9IHRoaXMuZ2V0Vmlld2VkUmVsZWFzZUFubm91bmNlbWVudHMoKTtcblxuICAgICAgICAvLyBJZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcywgZG8gbm90aGluZ1xuICAgICAgICAvLyBOb3JtYWxseSBpdCBzaG91bGRuJ3QgaGFwcGVuLCBidXQgaXQncyBiZXR0ZXIgdG8gYmUgc2FmZVxuICAgICAgICBjb25zdCBmZWF0dXJlID0gRkVBVFVSRVNbdGhpcy5pbmRleF07XG4gICAgICAgIGlmICghZmVhdHVyZSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIE1hcmsgdGhlIGZlYXR1cmUgYXMgdmlld2VkXG4gICAgICAgIHZpZXdlZFJlbGVhc2VBbm5vdW5jZW1lbnRzW0ZFQVRVUkVTW3RoaXMuaW5kZXhdXSA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5kZXgrKztcblxuICAgICAgICAvLyBEbyBzYW5pdHkgY2hlY2sgaWYgd2UgY2FuIHN0b3JlIHRoZSBuZXcgdmFsdWUgaW4gdGhlIHNldHRpbmdzXG4gICAgICAgIGNvbnN0IGlzU3VwcG9ydGVkID0gU2V0dGluZ3NTdG9yZS5pc0xldmVsU3VwcG9ydGVkKFNldHRpbmdMZXZlbC5BQ0NPVU5UKTtcbiAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGNhblNldFZhbHVlID0gU2V0dGluZ3NTdG9yZS5jYW5TZXRWYWx1ZShcInJlbGVhc2VBbm5vdW5jZW1lbnREYXRhXCIsIG51bGwsIFNldHRpbmdMZXZlbC5BQ0NPVU5UKTtcbiAgICAgICAgaWYgKGNhblNldFZhbHVlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFNldHRpbmdzU3RvcmUuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgIFwicmVsZWFzZUFubm91bmNlbWVudERhdGFcIixcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgU2V0dGluZ0xldmVsLkFDQ09VTlQsXG4gICAgICAgICAgICAgICAgICAgIHZpZXdlZFJlbGVhc2VBbm5vdW5jZW1lbnRzLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhcIkZhaWxlZCB0byBzZXQgcmVsZWFzZSBhbm5vdW5jZW1lbnQgc2V0dGluZ3NcIiwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXJrIHRoZSBjdXJyZW50IHJlbGVhc2UgYW5ub3VuY2VtZW50IGFzIHZpZXdlZCBhbmQgbW92ZSB0byB0aGUgbmV4dCByZWxlYXNlIGFubm91bmNlbWVudC5cbiAgICAgKiBUaGlzIHdpbGwgdXBkYXRlIHRoZSBhY2NvdW50IHNldHRpbmdzIGFuZCBlbWl0IHRoZSBgcmVsZWFzZUFubm91bmNlbWVudENoYW5nZWRgIGV2ZW50XG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIG5leHRSZWxlYXNlQW5ub3VuY2VtZW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLm1hcmtSZWxlYXNlQW5ub3VuY2VtZW50QXNWaWV3ZWQoKTtcblxuICAgICAgICB0aGlzLmVtaXQoXCJyZWxlYXNlQW5ub3VuY2VtZW50Q2hhbmdlZFwiLCB0aGlzLmdldFJlbGVhc2VBbm5vdW5jZW1lbnQoKSk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLGNBQUEsR0FBQUMsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFLLGFBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFNBQUEsR0FBQU4sT0FBQTtBQWRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQVVBO0FBQ0E7QUFDQTtBQUNBLE1BQU1PLFFBQVEsR0FBRyxDQUFDLHVCQUF1QixFQUFFLG9CQUFvQixDQUFVO0FBQ3pFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sTUFBTUMsd0JBQXdCLFNB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