matrix-react-sdk
Version:
SDK for matrix.org using React
220 lines (174 loc) • 24.1 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.BreadcrumbsStore = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _SettingsStore = _interopRequireDefault(require("../settings/SettingsStore"));
var _AsyncStoreWithClient = require("./AsyncStoreWithClient");
var _dispatcher = _interopRequireDefault(require("../dispatcher/dispatcher"));
var _arrays = require("../utils/arrays");
var _utils = require("matrix-js-sdk/src/utils");
var _SettingLevel = require("../settings/SettingLevel");
/*
Copyright 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 MAX_ROOMS = 20; // arbitrary
const AUTOJOIN_WAIT_THRESHOLD_MS = 90000; // 90s, the time we wait for an autojoined room to show up
class BreadcrumbsStore extends _AsyncStoreWithClient.AsyncStoreWithClient
/*:: <IState>*/
{
constructor() {
super(_dispatcher.default);
(0, _defineProperty2.default)(this, "waitingRooms", []);
(0, _defineProperty2.default)(this, "onMyMembership", async (room
/*: Room*/
) => {
// Only turn on breadcrumbs is the user hasn't explicitly turned it off again.
const settingValueRaw = _SettingsStore.default.getValue("breadcrumbs", null,
/*excludeDefault=*/
true);
if (this.meetsRoomRequirement && (0, _utils.isNullOrUndefined)(settingValueRaw)) {
await _SettingsStore.default.setValue("breadcrumbs", null, _SettingLevel.SettingLevel.ACCOUNT, true);
}
});
(0, _defineProperty2.default)(this, "onRoom", async (room
/*: Room*/
) => {
const waitingRoom = this.waitingRooms.find(r => r.roomId === room.roomId);
if (!waitingRoom) return;
this.waitingRooms.splice(this.waitingRooms.indexOf(waitingRoom), 1);
if (Date.now() - waitingRoom.addedTs > AUTOJOIN_WAIT_THRESHOLD_MS) return; // Too long ago.
await this.appendRoom(room);
});
_SettingsStore.default.monitorSetting("breadcrumb_rooms", null);
_SettingsStore.default.monitorSetting("breadcrumbs", null);
}
static get instance()
/*: BreadcrumbsStore*/
{
return BreadcrumbsStore.internalInstance;
}
get rooms()
/*: Room[]*/
{
return this.state.rooms || [];
}
get visible()
/*: boolean*/
{
return this.state.enabled && this.meetsRoomRequirement;
}
get meetsRoomRequirement()
/*: boolean*/
{
return this.matrixClient && this.matrixClient.getVisibleRooms().length >= 20;
}
async onAction(payload
/*: ActionPayload*/
) {
if (!this.matrixClient) return;
if (payload.action === 'setting_updated') {
if (payload.settingName === 'breadcrumb_rooms') {
await this.updateRooms();
} else if (payload.settingName === 'breadcrumbs') {
await this.updateState({
enabled: _SettingsStore.default.getValue("breadcrumbs", null)
});
}
} else if (payload.action === 'view_room') {
if (payload.auto_join && !this.matrixClient.getRoom(payload.room_id)) {
// Queue the room instead of pushing it immediately. We're probably just
// waiting for a room join to complete.
this.waitingRooms.push({
roomId: payload.room_id,
addedTs: Date.now()
});
} else {
// The tests might not result in a valid room object.
const room = this.matrixClient.getRoom(payload.room_id);
if (room) await this.appendRoom(room);
}
}
}
async onReady() {
await this.updateRooms();
await this.updateState({
enabled: _SettingsStore.default.getValue("breadcrumbs", null)
});
this.matrixClient.on("Room.myMembership", this.onMyMembership);
this.matrixClient.on("Room", this.onRoom);
}
async onNotReady() {
this.matrixClient.removeListener("Room.myMembership", this.onMyMembership);
this.matrixClient.removeListener("Room", this.onRoom);
}
async updateRooms() {
let roomIds = _SettingsStore.default.getValue("breadcrumb_rooms");
if (!roomIds || roomIds.length === 0) roomIds = [];
const rooms = roomIds.map(r => this.matrixClient.getRoom(r)).filter(r => !!r);
const currentRooms = this.state.rooms || [];
if (!(0, _arrays.arrayHasDiff)(rooms, currentRooms)) return; // no change (probably echo)
await this.updateState({
rooms
});
}
async appendRoom(room
/*: Room*/
) {
if (_SettingsStore.default.getValue("feature_spaces") && room.isSpaceRoom()) return; // hide space rooms
let updated = false;
const rooms = (this.state.rooms || []).slice(); // cheap clone
// If the room is upgraded, use that room instead. We'll also splice out
// any children of the room.
const history = this.matrixClient.getRoomUpgradeHistory(room.roomId);
if (history.length > 1) {
room = history[history.length - 1]; // Last room is most recent in history
// Take out any room that isn't the most recent room
for (let i = 0; i < history.length - 1; i++) {
const idx = rooms.findIndex(r => r.roomId === history[i].roomId);
if (idx !== -1) {
rooms.splice(idx, 1);
updated = true;
}
}
} // Remove the existing room, if it is present
const existingIdx = rooms.findIndex(r => r.roomId === room.roomId); // If we're focusing on the first room no-op
if (existingIdx !== 0) {
if (existingIdx !== -1) {
rooms.splice(existingIdx, 1);
} // Splice the room to the start of the list
rooms.splice(0, 0, room);
updated = true;
}
if (rooms.length > MAX_ROOMS) {
// This looks weird, but it's saying to start at the MAX_ROOMS point in the
// list and delete everything after it.
rooms.splice(MAX_ROOMS, rooms.length - MAX_ROOMS);
updated = true;
}
if (updated) {
// Update the breadcrumbs
await this.updateState({
rooms
});
const roomIds = rooms.map(r => r.roomId);
if (roomIds.length > 0) {
await _SettingsStore.default.setValue("breadcrumb_rooms", null, _SettingLevel.SettingLevel.ACCOUNT, roomIds);
}
}
}
}
exports.BreadcrumbsStore = BreadcrumbsStore;
(0, _defineProperty2.default)(BreadcrumbsStore, "internalInstance", new BreadcrumbsStore());
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yZXMvQnJlYWRjcnVtYnNTdG9yZS50cyJdLCJuYW1lcyI6WyJNQVhfUk9PTVMiLCJBVVRPSk9JTl9XQUlUX1RIUkVTSE9MRF9NUyIsIkJyZWFkY3J1bWJzU3RvcmUiLCJBc3luY1N0b3JlV2l0aENsaWVudCIsImNvbnN0cnVjdG9yIiwiZGVmYXVsdERpc3BhdGNoZXIiLCJyb29tIiwic2V0dGluZ1ZhbHVlUmF3IiwiU2V0dGluZ3NTdG9yZSIsImdldFZhbHVlIiwibWVldHNSb29tUmVxdWlyZW1lbnQiLCJzZXRWYWx1ZSIsIlNldHRpbmdMZXZlbCIsIkFDQ09VTlQiLCJ3YWl0aW5nUm9vbSIsIndhaXRpbmdSb29tcyIsImZpbmQiLCJyIiwicm9vbUlkIiwic3BsaWNlIiwiaW5kZXhPZiIsIkRhdGUiLCJub3ciLCJhZGRlZFRzIiwiYXBwZW5kUm9vbSIsIm1vbml0b3JTZXR0aW5nIiwiaW5zdGFuY2UiLCJpbnRlcm5hbEluc3RhbmNlIiwicm9vbXMiLCJzdGF0ZSIsInZpc2libGUiLCJlbmFibGVkIiwibWF0cml4Q2xpZW50IiwiZ2V0VmlzaWJsZVJvb21zIiwibGVuZ3RoIiwib25BY3Rpb24iLCJwYXlsb2FkIiwiYWN0aW9uIiwic2V0dGluZ05hbWUiLCJ1cGRhdGVSb29tcyIsInVwZGF0ZVN0YXRlIiwiYXV0b19qb2luIiwiZ2V0Um9vbSIsInJvb21faWQiLCJwdXNoIiwib25SZWFkeSIsIm9uIiwib25NeU1lbWJlcnNoaXAiLCJvblJvb20iLCJvbk5vdFJlYWR5IiwicmVtb3ZlTGlzdGVuZXIiLCJyb29tSWRzIiwibWFwIiwiZmlsdGVyIiwiY3VycmVudFJvb21zIiwiaXNTcGFjZVJvb20iLCJ1cGRhdGVkIiwic2xpY2UiLCJoaXN0b3J5IiwiZ2V0Um9vbVVwZ3JhZGVIaXN0b3J5IiwiaSIsImlkeCIsImZpbmRJbmRleCIsImV4aXN0aW5nSWR4Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQWdCQTs7QUFHQTs7QUFDQTs7QUFD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LE1BQUFBLE9BQU8sR0FBRyxJQUFWO0FBQ0g7O0FBR0QsUUFBSUEsT0FBSixFQUFhO0FBQ1Q7QUFDQSxZQUFNLEtBQUtoQixXQUFMLENBQWlCO0FBQUNaLFFBQUFBO0FBQUQsT0FBakIsQ0FBTjtBQUNBLFlBQU11QixPQUFPLEdBQUd2QixLQUFLLENBQUN3QixHQUFOLENBQVVuQyxDQUFDLElBQUlBLENBQUMsQ0FBQ0MsTUFBakIsQ0FBaEI7O0FBQ0EsVUFBSWlDLE9BQU8sQ0FBQ2pCLE1BQVIsR0FBaUIsQ0FBckIsRUFBd0I7QUFDcEIsY0FBTTFCLHVCQUFjRyxRQUFkLENBQXVCLGtCQUF2QixFQUEyQyxJQUEzQyxFQUFpREMsMkJBQWFDLE9BQTlELEVBQXVFc0MsT0FBdkUsQ0FBTjtBQUNIO0FBQ0o7QUFDSjs7QUE3SThEOzs7OEJBQXREakQsZ0Isc0JBQ3lCLElBQUlBLGdCQUFKLEUiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjAgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgU2V0dGluZ3NTdG9yZSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ3NTdG9yZVwiO1xuaW1wb3J0IHsgUm9vbSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tb2RlbHMvcm9vbVwiO1xuaW1wb3J0IHsgQWN0aW9uUGF5bG9hZCB9IGZyb20gXCIuLi9kaXNwYXRjaGVyL3BheWxvYWRzXCI7XG5pbXBvcnQgeyBBc3luY1N0b3JlV2l0aENsaWVudCB9IGZyb20gXCIuL0FzeW5jU3RvcmVXaXRoQ2xpZW50XCI7XG5pbXBvcnQgZGVmYXVsdERpc3BhdGNoZXIgZnJvbSBcIi4uL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgYXJyYXlIYXNEaWZmIH0gZnJvbSBcIi4uL3V0aWxzL2FycmF5c1wiO1xuaW1wb3J0IHsgaXNOdWxsT3JVbmRlZmluZWQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvdXRpbHNcIjtcbmltcG9ydCB7IFNldHRpbmdMZXZlbCB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5nTGV2ZWxcIjtcblxuY29uc3QgTUFYX1JPT01TID0gMjA7IC8vIGFyYml0cmFyeVxuY29uc3QgQVVUT0pPSU5fV0FJVF9USFJFU0hPTERfTVMgPSA5MDAwMDsgLy8gOTBzLCB0aGUgdGltZSB3ZSB3YWl0IGZvciBhbiBhdXRvam9pbmVkIHJvb20gdG8gc2hvdyB1cFxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBlbmFibGVkPzogYm9vbGVhbjtcbiAgICByb29tcz86IFJvb21bXTtcbn1cblxuZXhwb3J0IGNsYXNzIEJyZWFkY3J1bWJzU3RvcmUgZXh0ZW5kcyBBc3luY1N0b3JlV2l0aENsaWVudDxJU3RhdGU+IHtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnRlcm5hbEluc3RhbmNlID0gbmV3IEJyZWFkY3J1bWJzU3RvcmUoKTtcblxuICAgIHByaXZhdGUgd2FpdGluZ1Jvb21zOiB7IHJvb21JZDogc3RyaW5nLCBhZGRlZFRzOiBudW1iZXIgfVtdID0gW107XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihkZWZhdWx0RGlzcGF0Y2hlcik7XG5cbiAgICAgICAgU2V0dGluZ3NTdG9yZS5tb25pdG9yU2V0dGluZyhcImJyZWFkY3J1bWJfcm9vbXNcIiwgbnVsbCk7XG4gICAgICAgIFNldHRpbmdzU3RvcmUubW9uaXRvclNldHRpbmcoXCJicmVhZGNydW1ic1wiLCBudWxsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBpbnN0YW5jZSgpOiBCcmVhZGNydW1ic1N0b3JlIHtcbiAgICAgICAgcmV0dXJuIEJyZWFkY3J1bWJzU3RvcmUuaW50ZXJuYWxJbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvb21zKCk6IFJvb21bXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnJvb21zIHx8IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuZW5hYmxlZCAmJiB0aGlzLm1lZXRzUm9vbVJlcXVpcmVtZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IG1lZXRzUm9vbVJlcXVpcmVtZW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXRyaXhDbGllbnQgJiYgdGhpcy5tYXRyaXhDbGllbnQuZ2V0VmlzaWJsZVJvb21zKCkubGVuZ3RoID49IDIwO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBvbkFjdGlvbihwYXlsb2FkOiBBY3Rpb25QYXlsb2FkKSB7XG4gICAgICAgIGlmICghdGhpcy5tYXRyaXhDbGllbnQpIHJldHVybjtcblxuICAgICAgICBpZiAocGF5bG9hZC5hY3Rpb24gPT09ICdzZXR0aW5nX3VwZGF0ZWQnKSB7XG4gICAgICAgICAgICBpZiAocGF5bG9hZC5zZXR0aW5nTmFtZSA9PT0gJ2JyZWFkY3J1bWJfcm9vbXMnKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVSb29tcygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXlsb2FkLnNldHRpbmdOYW1lID09PSAnYnJlYWRjcnVtYnMnKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdGF0ZSh7ZW5hYmxlZDogU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShcImJyZWFkY3J1bWJzXCIsIG51bGwpfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZC5hY3Rpb24gPT09ICd2aWV3X3Jvb20nKSB7XG4gICAgICAgICAgICBpZiAocGF5bG9hZC5hdXRvX2pvaW4gJiYgIXRoaXMubWF0cml4Q2xpZW50LmdldFJvb20ocGF5bG9hZC5yb29tX2lkKSkge1xuICAgICAgICAgICAgICAgIC8vIFF1ZXVlIHRoZSByb29tIGluc3RlYWQgb2YgcHVzaGluZyBpdCBpbW1lZGlhdGVseS4gV2UncmUgcHJvYmFibHkganVzdFxuICAgICAgICAgICAgICAgIC8vIHdhaXRpbmcgZm9yIGEgcm9vbSBqb2luIHRvIGNvbXBsZXRlLlxuICAgICAgICAgICAgICAgIHRoaXMud2FpdGluZ1Jvb21zLnB1c2goe3Jvb21JZDogcGF5bG9hZC5yb29tX2lkLCBhZGRlZFRzOiBEYXRlLm5vdygpfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRoZSB0ZXN0cyBtaWdodCBub3QgcmVzdWx0IGluIGEgdmFsaWQgcm9vbSBvYmplY3QuXG4gICAgICAgICAgICAgICAgY29uc3Qgcm9vbSA9IHRoaXMubWF0cml4Q2xpZW50LmdldFJvb20ocGF5bG9hZC5yb29tX2lkKTtcbiAgICAgICAgICAgICAgICBpZiAocm9vbSkgYXdhaXQgdGhpcy5hcHBlbmRSb29tKHJvb20pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIG9uUmVhZHkoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlUm9vbXMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdGF0ZSh7ZW5hYmxlZDogU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShcImJyZWFkY3J1bWJzXCIsIG51bGwpfSk7XG5cbiAgICAgICAgdGhpcy5tYXRyaXhDbGllbnQub24oXCJSb29tLm15TWVtYmVyc2hpcFwiLCB0aGlzLm9uTXlNZW1iZXJzaGlwKTtcbiAgICAgICAgdGhpcy5tYXRyaXhDbGllbnQub24oXCJSb29tXCIsIHRoaXMub25Sb29tKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgb25Ob3RSZWFkeSgpIHtcbiAgICAgICAgdGhpcy5tYXRyaXhDbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJSb29tLm15TWVtYmVyc2hpcFwiLCB0aGlzLm9uTXlNZW1iZXJzaGlwKTtcbiAgICAgICAgdGhpcy5tYXRyaXhDbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJSb29tXCIsIHRoaXMub25Sb29tKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uTXlNZW1iZXJzaGlwID0gYXN5bmMgKHJvb206IFJvb20pID0+IHtcbiAgICAgICAgLy8gT25seSB0dXJuIG9uIGJyZWFkY3J1bWJzIGlzIHRoZSB1c2VyIGhhc24ndCBleHBsaWNpdGx5IHR1cm5lZCBpdCBvZmYgYWdhaW4uXG4gICAgICAgIGNvbnN0IHNldHRpbmdWYWx1ZVJhdyA9IFNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoXCJicmVhZGNydW1ic1wiLCBudWxsLCAvKmV4Y2x1ZGVEZWZhdWx0PSovdHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLm1lZXRzUm9vbVJlcXVpcmVtZW50ICYmIGlzTnVsbE9yVW5kZWZpbmVkKHNldHRpbmdWYWx1ZVJhdykpIHtcbiAgICAgICAgICAgIGF3YWl0IFNldHRpbmdzU3RvcmUuc2V0VmFsdWUoXCJicmVhZGNydW1ic1wiLCBudWxsLCBTZXR0aW5nTGV2ZWwuQUNDT1VOVCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblJvb20gPSBhc3luYyAocm9vbTogUm9vbSkgPT4ge1xuICAgICAgICBjb25zdCB3YWl0aW5nUm9vbSA9IHRoaXMud2FpdGluZ1Jvb21zLmZpbmQociA9PiByLnJvb21JZCA9PT0gcm9vbS5yb29tSWQpO1xuICAgICAgICBpZiAoIXdhaXRpbmdSb29tKSByZXR1cm47XG4gICAgICAgIHRoaXMud2FpdGluZ1Jvb21zLnNwbGljZSh0aGlzLndhaXRpbmdSb29tcy5pbmRleE9mKHdhaXRpbmdSb29tKSwgMSk7XG5cbiAgICAgICAgaWYgKChEYXRlLm5vdygpIC0gd2FpdGluZ1Jvb20uYWRkZWRUcykgPiBBVVRPSk9JTl9XQUlUX1RIUkVTSE9MRF9NUykgcmV0dXJuOyAvLyBUb28gbG9uZyBhZ28uXG4gICAgICAgIGF3YWl0IHRoaXMuYXBwZW5kUm9vbShyb29tKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBhc3luYyB1cGRhdGVSb29tcygpIHtcbiAgICAgICAgbGV0IHJvb21JZHMgPSBTZXR0aW5nc1N0b3JlLmdldFZhbHVlKFwiYnJlYWRjcnVtYl9yb29tc1wiKTtcbiAgICAgICAgaWYgKCFyb29tSWRzIHx8IHJvb21JZHMubGVuZ3RoID09PSAwKSByb29tSWRzID0gW107XG5cbiAgICAgICAgY29uc3Qgcm9vbXMgPSByb29tSWRzLm1hcChyID0+IHRoaXMubWF0cml4Q2xpZW50LmdldFJvb20ocikpLmZpbHRlcihyID0+ICEhcik7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRSb29tcyA9IHRoaXMuc3RhdGUucm9vbXMgfHwgW107XG4gICAgICAgIGlmICghYXJyYXlIYXNEaWZmKHJvb21zLCBjdXJyZW50Um9vbXMpKSByZXR1cm47IC8vIG5vIGNoYW5nZSAocHJvYmFibHkgZWNobylcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdGF0ZSh7cm9vbXN9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGFwcGVuZFJvb20ocm9vbTogUm9vbSkge1xuICAgICAgICBpZiAoU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShcImZlYXR1cmVfc3BhY2VzXCIpICYmIHJvb20uaXNTcGFjZVJvb20oKSkgcmV0dXJuOyAvLyBoaWRlIHNwYWNlIHJvb21zXG4gICAgICAgIGxldCB1cGRhdGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJvb21zID0gKHRoaXMuc3RhdGUucm9vbXMgfHwgW10pLnNsaWNlKCk7IC8vIGNoZWFwIGNsb25lXG5cbiAgICAgICAgLy8gSWYgdGhlIHJvb20gaXMgdXBncmFkZWQsIHVzZSB0aGF0IHJvb20gaW5zdGVhZC4gV2UnbGwgYWxzbyBzcGxpY2Ugb3V0XG4gICAgICAgIC8vIGFueSBjaGlsZHJlbiBvZiB0aGUgcm9vbS5cbiAgICAgICAgY29uc3QgaGlzdG9yeSA9IHRoaXMubWF0cml4Q2xpZW50LmdldFJvb21VcGdyYWRlSGlzdG9yeShyb29tLnJvb21JZCk7XG4gICAgICAgIGlmIChoaXN0b3J5Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHJvb20gPSBoaXN0b3J5W2hpc3RvcnkubGVuZ3RoIC0gMV07IC8vIExhc3Qgcm9vbSBpcyBtb3N0IHJlY2VudCBpbiBoaXN0b3J5XG5cbiAgICAgICAgICAgIC8vIFRha2Ugb3V0IGFueSByb29tIHRoYXQgaXNuJ3QgdGhlIG1vc3QgcmVjZW50IHJvb21cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZHggPSByb29tcy5maW5kSW5kZXgociA9PiByLnJvb21JZCA9PT0gaGlzdG9yeVtpXS5yb29tSWQpO1xuICAgICAgICAgICAgICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvb21zLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgdGhlIGV4aXN0aW5nIHJvb20sIGlmIGl0IGlzIHByZXNlbnRcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJZHggPSByb29tcy5maW5kSW5kZXgociA9PiByLnJvb21JZCA9PT0gcm9vbS5yb29tSWQpO1xuXG4gICAgICAgIC8vIElmIHdlJ3JlIGZvY3VzaW5nIG9uIHRoZSBmaXJzdCByb29tIG5vLW9wXG4gICAgICAgIGlmIChleGlzdGluZ0lkeCAhPT0gMCkge1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nSWR4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJvb21zLnNwbGljZShleGlzdGluZ0lkeCwgMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNwbGljZSB0aGUgcm9vbSB0byB0aGUgc3RhcnQgb2YgdGhlIGxpc3RcbiAgICAgICAgICAgIHJvb21zLnNwbGljZSgwLCAwLCByb29tKTtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvb21zLmxlbmd0aCA+IE1BWF9ST09NUykge1xuICAgICAgICAgICAgLy8gVGhpcyBsb29rcyB3ZWlyZCwgYnV0IGl0J3Mgc2F5aW5nIHRvIHN0YXJ0IGF0IHRoZSBNQVhfUk9PTVMgcG9pbnQgaW4gdGhlXG4gICAgICAgICAgICAvLyBsaXN0IGFuZCBkZWxldGUgZXZlcnl0aGluZyBhZnRlciBpdC5cbiAgICAgICAgICAgIHJvb21zLnNwbGljZShNQVhfUk9PTVMsIHJvb21zLmxlbmd0aCAtIE1BWF9ST09NUyk7XG4gICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgYnJlYWRjcnVtYnNcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlU3RhdGUoe3Jvb21zfSk7XG4gICAgICAgICAgICBjb25zdCByb29tSWRzID0gcm9vbXMubWFwKHIgPT4gci5yb29tSWQpO1xuICAgICAgICAgICAgaWYgKHJvb21JZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFNldHRpbmdzU3RvcmUuc2V0VmFsdWUoXCJicmVhZGNydW1iX3Jvb21zXCIsIG51bGwsIFNldHRpbmdMZXZlbC5BQ0NPVU5ULCByb29tSWRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==