matrix-react-sdk
Version:
SDK for matrix.org using React
172 lines (166 loc) • 29.7 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = _interopRequireWildcard(require("react"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _randomstring = require("matrix-js-sdk/src/randomstring");
var _classnames = _interopRequireDefault(require("classnames"));
var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext"));
var _useEventEmitter = require("../../../hooks/useEventEmitter");
var _languageHandler = require("../../../languageHandler");
var _Modal = _interopRequireDefault(require("../../../Modal"));
var _beacon = require("../../../utils/beacon");
var _location = require("../../../utils/location");
var _displayStatus = require("../beacon/displayStatus");
var _BeaconStatus = _interopRequireDefault(require("../beacon/BeaconStatus"));
var _OwnBeaconStatus = _interopRequireDefault(require("../beacon/OwnBeaconStatus"));
var _location2 = require("../location");
var _MapError = require("../location/MapError");
var _MapFallback = _interopRequireDefault(require("../location/MapFallback"));
var _beacon2 = require("../beacon");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
/*
Copyright 2024 New Vector Ltd.
Copyright 2022 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.
*/
const useBeaconState = beaconInfoEvent => {
const beacon = (0, _beacon.useBeacon)(beaconInfoEvent);
const isLive = (0, _useEventEmitter.useEventEmitterState)(beacon, _matrix.BeaconEvent.LivenessChange, () => beacon?.isLive);
const latestLocationState = (0, _useEventEmitter.useEventEmitterState)(beacon, _matrix.BeaconEvent.LocationUpdate, () => beacon?.latestLocationState);
if (!beacon) {
return {};
}
// a beacon's starting timestamp can be in the future
// (either from small deviations in system clock times, or on purpose from another client)
// a beacon is only live between its start timestamp and expiry
// detect when a beacon is waiting to become live
// and display a loading state
const waitingToStart = !!beacon && (0, _beacon.isBeaconWaitingToStart)(beacon);
const {
description
} = beacon.beaconInfo;
return {
beacon,
description,
isLive,
waitingToStart,
latestLocationState
};
};
// multiple instances of same map might be in document
// eg thread and main timeline, reply
// maplibregl needs a unique id to attach the map instance to
const useUniqueId = eventId => {
const [id, setId] = (0, _react.useState)(`${eventId}_${(0, _randomstring.randomString)(8)}`);
(0, _react.useEffect)(() => {
setId(`${eventId}_${(0, _randomstring.randomString)(8)}`);
}, [eventId]);
return id;
};
// remove related beacon locations on beacon redaction
const useHandleBeaconRedaction = (event, matrixClient, getRelationsForEvent) => {
const onBeforeBeaconInfoRedaction = (0, _react.useCallback)((_event, redactionEvent) => {
const relations = getRelationsForEvent ? getRelationsForEvent(event.getId(), _matrix.RelationType.Reference, _matrix.M_BEACON.name) : undefined;
relations?.getRelations()?.forEach(locationEvent => {
matrixClient.redactEvent(locationEvent.getRoomId(), locationEvent.getId(), undefined, redactionEvent.getContent());
});
}, [event, matrixClient, getRelationsForEvent]);
(0, _react.useEffect)(() => {
event.addListener(_matrix.MatrixEventEvent.BeforeRedaction, onBeforeBeaconInfoRedaction);
return () => {
event.removeListener(_matrix.MatrixEventEvent.BeforeRedaction, onBeforeBeaconInfoRedaction);
};
}, [event, onBeforeBeaconInfoRedaction]);
};
const MBeaconBody = /*#__PURE__*/_react.default.forwardRef(({
mxEvent,
getRelationsForEvent
}, ref) => {
const {
beacon,
isLive,
latestLocationState,
waitingToStart
} = useBeaconState(mxEvent);
const mapId = useUniqueId(mxEvent.getId());
const matrixClient = (0, _react.useContext)(_MatrixClientContext.default);
const [error, setError] = (0, _react.useState)();
const isMapDisplayError = error?.message === _location.LocationShareError.MapStyleUrlNotConfigured || error?.message === _location.LocationShareError.MapStyleUrlNotReachable;
const displayStatus = (0, _displayStatus.getBeaconDisplayStatus)(!!isLive, latestLocationState,
// if we are unable to display maps because it is not configured for the server
// don't display an error
isMapDisplayError ? undefined : error, waitingToStart);
const markerRoomMember = (0, _location.isSelfLocation)(mxEvent.getContent()) ? mxEvent.sender : undefined;
const isOwnBeacon = beacon?.beaconInfoOwner === matrixClient.getUserId();
useHandleBeaconRedaction(mxEvent, matrixClient, getRelationsForEvent);
const onClick = () => {
if (displayStatus !== _displayStatus.BeaconDisplayStatus.Active) {
return;
}
_Modal.default.createDialog(_beacon2.BeaconViewDialog, {
roomId: mxEvent.getRoomId(),
matrixClient,
initialFocusedBeacon: beacon
}, "mx_BeaconViewDialog_wrapper", false,
// isPriority
true // isStatic
);
};
let map;
if (displayStatus === _displayStatus.BeaconDisplayStatus.Active && !isMapDisplayError && latestLocationState?.uri) {
map = /*#__PURE__*/_react.default.createElement(_location2.Map, {
id: mapId,
centerGeoUri: latestLocationState.uri,
onError: setError,
onClick: onClick,
className: "mx_MBeaconBody_map"
}, ({
map
}) => /*#__PURE__*/_react.default.createElement(_location2.SmartMarker, {
map: map,
id: `${mapId}-marker`,
geoUri: latestLocationState.uri,
roomMember: markerRoomMember ?? undefined,
useMemberColor: true
}));
} else if (isMapDisplayError) {
map = /*#__PURE__*/_react.default.createElement(_MapError.MapError, {
error: error.message,
onClick: onClick,
className: (0, _classnames.default)("mx_MBeaconBody_mapError",
// set interactive class when maximised map can be opened
{
mx_MBeaconBody_mapErrorInteractive: displayStatus === _displayStatus.BeaconDisplayStatus.Active
}),
isMinimised: true
});
} else {
map = /*#__PURE__*/_react.default.createElement(_MapFallback.default, {
isLoading: displayStatus === _displayStatus.BeaconDisplayStatus.Loading,
className: "mx_MBeaconBody_map mx_MBeaconBody_mapFallback"
});
}
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_MBeaconBody",
ref: ref
}, map, isOwnBeacon ? /*#__PURE__*/_react.default.createElement(_OwnBeaconStatus.default, {
className: "mx_MBeaconBody_chin",
beacon: beacon,
displayStatus: displayStatus,
withIcon: true
}) : /*#__PURE__*/_react.default.createElement(_BeaconStatus.default, {
className: "mx_MBeaconBody_chin",
beacon: beacon,
displayStatus: displayStatus,
label: (0, _languageHandler._t)("timeline|m.beacon_info|view_live_location"),
withIcon: true
}));
});
var _default = exports.default = MBeaconBody;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbWF0cml4IiwiX3JhbmRvbXN0cmluZyIsIl9jbGFzc25hbWVzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9NYXRyaXhDbGllbnRDb250ZXh0IiwiX3VzZUV2ZW50RW1pdHRlciIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfTW9kYWwiLCJfYmVhY29uIiwiX2xvY2F0aW9uIiwiX2Rpc3BsYXlTdGF0dXMiLCJfQmVhY29uU3RhdHVzIiwiX093bkJlYWNvblN0YXR1cyIsIl9sb2NhdGlvbjIiLCJfTWFwRXJyb3IiLCJfTWFwRmFsbGJhY2siLCJfYmVhY29uMiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsInVzZUJlYWNvblN0YXRlIiwiYmVhY29uSW5mb0V2ZW50IiwiYmVhY29uIiwidXNlQmVhY29uIiwiaXNMaXZlIiwidXNlRXZlbnRFbWl0dGVyU3RhdGUiLCJCZWFjb25FdmVudCIsIkxpdmVuZXNzQ2hhbmdlIiwibGF0ZXN0TG9jYXRpb25TdGF0ZSIsIkxvY2F0aW9uVXBkYXRlIiwid2FpdGluZ1RvU3RhcnQiLCJpc0JlYWNvbldhaXRpbmdUb1N0YXJ0IiwiZGVzY3JpcHRpb24iLCJiZWFjb25JbmZvIiwidXNlVW5pcXVlSWQiLCJldmVudElkIiwiaWQiLCJzZXRJZCIsInVzZVN0YXRlIiwicmFuZG9tU3RyaW5nIiwidXNlRWZmZWN0IiwidXNlSGFuZGxlQmVhY29uUmVkYWN0aW9uIiwiZXZlbnQiLCJtYXRyaXhDbGllbnQiLCJnZXRSZWxhdGlvbnNGb3JFdmVudCIsIm9uQmVmb3JlQmVhY29uSW5mb1JlZGFjdGlvbiIsInVzZUNhbGxiYWNrIiwiX2V2ZW50IiwicmVkYWN0aW9uRXZlbnQiLCJyZWxhdGlvbnMiLCJnZXRJZCIsIlJlbGF0aW9uVHlwZSIsIlJlZmVyZW5jZSIsIk1fQkVBQ09OIiwibmFtZSIsInVuZGVmaW5lZCIsImdldFJlbGF0aW9ucyIsImZvckVhY2giLCJsb2NhdGlvbkV2ZW50IiwicmVkYWN0RXZlbnQiLCJnZXRSb29tSWQiLCJnZXRDb250ZW50IiwiYWRkTGlzdGVuZXIiLCJNYXRyaXhFdmVudEV2ZW50IiwiQmVmb3JlUmVkYWN0aW9uIiwicmVtb3ZlTGlzdGVuZXIiLCJNQmVhY29uQm9keSIsIlJlYWN0IiwiZm9yd2FyZFJlZiIsIm14RXZlbnQiLCJyZWYiLCJtYXBJZCIsInVzZUNvbnRleHQiLCJNYXRyaXhDbGllbnRDb250ZXh0IiwiZXJyb3IiLCJzZXRFcnJvciIsImlzTWFwRGlzcGxheUVycm9yIiwibWVzc2FnZSIsIkxvY2F0aW9uU2hhcmVFcnJvciIsIk1hcFN0eWxlVXJsTm90Q29uZmlndXJlZCIsIk1hcFN0eWxlVXJsTm90UmVhY2hhYmxlIiwiZGlzcGxheVN0YXR1cyIsImdldEJlYWNvbkRpc3BsYXlTdGF0dXMiLCJtYXJrZXJSb29tTWVtYmVyIiwiaXNTZWxmTG9jYXRpb24iLCJzZW5kZXIiLCJpc093bkJlYWNvbiIsImJlYWNvbkluZm9Pd25lciIsImdldFVzZXJJZCIsIm9uQ2xpY2siLCJCZWFjb25EaXNwbGF5U3RhdHVzIiwiQWN0aXZlIiwiTW9kYWwiLCJjcmVhdGVEaWFsb2ciLCJCZWFjb25WaWV3RGlhbG9nIiwicm9vbUlkIiwiaW5pdGlhbEZvY3VzZWRCZWFjb24iLCJtYXAiLCJ1cmkiLCJjcmVhdGVFbGVtZW50IiwiTWFwIiwiY2VudGVyR2VvVXJpIiwib25FcnJvciIsImNsYXNzTmFtZSIsIlNtYXJ0TWFya2VyIiwiZ2VvVXJpIiwicm9vbU1lbWJlciIsInVzZU1lbWJlckNvbG9yIiwiTWFwRXJyb3IiLCJjbGFzc05hbWVzIiwibXhfTUJlYWNvbkJvZHlfbWFwRXJyb3JJbnRlcmFjdGl2ZSIsImlzTWluaW1pc2VkIiwiaXNMb2FkaW5nIiwiTG9hZGluZyIsIndpdGhJY29uIiwibGFiZWwiLCJfdCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL21lc3NhZ2VzL01CZWFjb25Cb2R5LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMiBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHsgRm9yd2FyZFJlZkV4b3RpY0NvbXBvbmVudCwgdXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7XG4gICAgQmVhY29uLFxuICAgIEJlYWNvbkV2ZW50LFxuICAgIE1hdHJpeEV2ZW50LFxuICAgIE1hdHJpeEV2ZW50RXZlbnQsXG4gICAgTWF0cml4Q2xpZW50LFxuICAgIFJlbGF0aW9uVHlwZSxcbiAgICBJUmVkYWN0T3B0cyxcbiAgICBDb250ZW50SGVscGVycyxcbiAgICBNX0JFQUNPTixcbn0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgcmFuZG9tU3RyaW5nIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL3JhbmRvbXN0cmluZ1wiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIjtcblxuaW1wb3J0IE1hdHJpeENsaWVudENvbnRleHQgZnJvbSBcIi4uLy4uLy4uL2NvbnRleHRzL01hdHJpeENsaWVudENvbnRleHRcIjtcbmltcG9ydCB7IHVzZUV2ZW50RW1pdHRlclN0YXRlIH0gZnJvbSBcIi4uLy4uLy4uL2hvb2tzL3VzZUV2ZW50RW1pdHRlclwiO1xuaW1wb3J0IHsgX3QgfSBmcm9tIFwiLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgTW9kYWwgZnJvbSBcIi4uLy4uLy4uL01vZGFsXCI7XG5pbXBvcnQgeyBpc0JlYWNvbldhaXRpbmdUb1N0YXJ0LCB1c2VCZWFjb24gfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvYmVhY29uXCI7XG5pbXBvcnQgeyBpc1NlbGZMb2NhdGlvbiwgTG9jYXRpb25TaGFyZUVycm9yIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2xvY2F0aW9uXCI7XG5pbXBvcnQgeyBCZWFjb25EaXNwbGF5U3RhdHVzLCBnZXRCZWFjb25EaXNwbGF5U3RhdHVzIH0gZnJvbSBcIi4uL2JlYWNvbi9kaXNwbGF5U3RhdHVzXCI7XG5pbXBvcnQgQmVhY29uU3RhdHVzIGZyb20gXCIuLi9iZWFjb24vQmVhY29uU3RhdHVzXCI7XG5pbXBvcnQgT3duQmVhY29uU3RhdHVzIGZyb20gXCIuLi9iZWFjb24vT3duQmVhY29uU3RhdHVzXCI7XG5pbXBvcnQgeyBNYXAsIFNtYXJ0TWFya2VyIH0gZnJvbSBcIi4uL2xvY2F0aW9uXCI7XG5pbXBvcnQgeyBNYXBFcnJvciB9IGZyb20gXCIuLi9sb2NhdGlvbi9NYXBFcnJvclwiO1xuaW1wb3J0IE1hcEZhbGxiYWNrIGZyb20gXCIuLi9sb2NhdGlvbi9NYXBGYWxsYmFja1wiO1xuaW1wb3J0IHsgR2V0UmVsYXRpb25zRm9yRXZlbnQgfSBmcm9tIFwiLi4vcm9vbXMvRXZlbnRUaWxlXCI7XG5pbXBvcnQgeyBCZWFjb25WaWV3RGlhbG9nIH0gZnJvbSBcIi4uL2JlYWNvblwiO1xuaW1wb3J0IHsgSUJvZHlQcm9wcyB9IGZyb20gXCIuL0lCb2R5UHJvcHNcIjtcblxuY29uc3QgdXNlQmVhY29uU3RhdGUgPSAoXG4gICAgYmVhY29uSW5mb0V2ZW50OiBNYXRyaXhFdmVudCxcbik6IHtcbiAgICBiZWFjb24/OiBCZWFjb247XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgbGF0ZXN0TG9jYXRpb25TdGF0ZT86IENvbnRlbnRIZWxwZXJzLkJlYWNvbkxvY2F0aW9uU3RhdGU7XG4gICAgaXNMaXZlPzogYm9vbGVhbjtcbiAgICB3YWl0aW5nVG9TdGFydD86IGJvb2xlYW47XG59ID0+IHtcbiAgICBjb25zdCBiZWFjb24gPSB1c2VCZWFjb24oYmVhY29uSW5mb0V2ZW50KTtcblxuICAgIGNvbnN0IGlzTGl2ZSA9IHVzZUV2ZW50RW1pdHRlclN0YXRlKGJlYWNvbiwgQmVhY29uRXZlbnQuTGl2ZW5lc3NDaGFuZ2UsICgpID0+IGJlYWNvbj8uaXNMaXZlKTtcblxuICAgIGNvbnN0IGxhdGVzdExvY2F0aW9uU3RhdGUgPSB1c2VFdmVudEVtaXR0ZXJTdGF0ZShcbiAgICAgICAgYmVhY29uLFxuICAgICAgICBCZWFjb25FdmVudC5Mb2NhdGlvblVwZGF0ZSxcbiAgICAgICAgKCkgPT4gYmVhY29uPy5sYXRlc3RMb2NhdGlvblN0YXRlLFxuICAgICk7XG5cbiAgICBpZiAoIWJlYWNvbikge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLy8gYSBiZWFjb24ncyBzdGFydGluZyB0aW1lc3RhbXAgY2FuIGJlIGluIHRoZSBmdXR1cmVcbiAgICAvLyAoZWl0aGVyIGZyb20gc21hbGwgZGV2aWF0aW9ucyBpbiBzeXN0ZW0gY2xvY2sgdGltZXMsIG9yIG9uIHB1cnBvc2UgZnJvbSBhbm90aGVyIGNsaWVudClcbiAgICAvLyBhIGJlYWNvbiBpcyBvbmx5IGxpdmUgYmV0d2VlbiBpdHMgc3RhcnQgdGltZXN0YW1wIGFuZCBleHBpcnlcbiAgICAvLyBkZXRlY3Qgd2hlbiBhIGJlYWNvbiBpcyB3YWl0aW5nIHRvIGJlY29tZSBsaXZlXG4gICAgLy8gYW5kIGRpc3BsYXkgYSBsb2FkaW5nIHN0YXRlXG4gICAgY29uc3Qgd2FpdGluZ1RvU3RhcnQgPSAhIWJlYWNvbiAmJiBpc0JlYWNvbldhaXRpbmdUb1N0YXJ0KGJlYWNvbik7XG4gICAgY29uc3QgeyBkZXNjcmlwdGlvbiB9ID0gYmVhY29uLmJlYWNvbkluZm87XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBiZWFjb24sXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBpc0xpdmUsXG4gICAgICAgIHdhaXRpbmdUb1N0YXJ0LFxuICAgICAgICBsYXRlc3RMb2NhdGlvblN0YXRlLFxuICAgIH07XG59O1xuXG4vLyBtdWx0aXBsZSBpbnN0YW5jZXMgb2Ygc2FtZSBtYXAgbWlnaHQgYmUgaW4gZG9jdW1lbnRcbi8vIGVnIHRocmVhZCBhbmQgbWFpbiB0aW1lbGluZSwgcmVwbHlcbi8vIG1hcGxpYnJlZ2wgbmVlZHMgYSB1bmlxdWUgaWQgdG8gYXR0YWNoIHRoZSBtYXAgaW5zdGFuY2UgdG9cbmNvbnN0IHVzZVVuaXF1ZUlkID0gKGV2ZW50SWQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgW2lkLCBzZXRJZF0gPSB1c2VTdGF0ZShgJHtldmVudElkfV8ke3JhbmRvbVN0cmluZyg4KX1gKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHNldElkKGAke2V2ZW50SWR9XyR7cmFuZG9tU3RyaW5nKDgpfWApO1xuICAgIH0sIFtldmVudElkXSk7XG5cbiAgICByZXR1cm4gaWQ7XG59O1xuXG4vLyByZW1vdmUgcmVsYXRlZCBiZWFjb24gbG9jYXRpb25zIG9uIGJlYWNvbiByZWRhY3Rpb25cbmNvbnN0IHVzZUhhbmRsZUJlYWNvblJlZGFjdGlvbiA9IChcbiAgICBldmVudDogTWF0cml4RXZlbnQsXG4gICAgbWF0cml4Q2xpZW50OiBNYXRyaXhDbGllbnQsXG4gICAgZ2V0UmVsYXRpb25zRm9yRXZlbnQ/OiBHZXRSZWxhdGlvbnNGb3JFdmVudCxcbik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IG9uQmVmb3JlQmVhY29uSW5mb1JlZGFjdGlvbiA9IHVzZUNhbGxiYWNrKFxuICAgICAgICAoX2V2ZW50OiBNYXRyaXhFdmVudCwgcmVkYWN0aW9uRXZlbnQ6IE1hdHJpeEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGlvbnMgPSBnZXRSZWxhdGlvbnNGb3JFdmVudFxuICAgICAgICAgICAgICAgID8gZ2V0UmVsYXRpb25zRm9yRXZlbnQoZXZlbnQuZ2V0SWQoKSEsIFJlbGF0aW9uVHlwZS5SZWZlcmVuY2UsIE1fQkVBQ09OLm5hbWUpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIHJlbGF0aW9ucz8uZ2V0UmVsYXRpb25zKCk/LmZvckVhY2goKGxvY2F0aW9uRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBtYXRyaXhDbGllbnQucmVkYWN0RXZlbnQoXG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uRXZlbnQuZ2V0Um9vbUlkKCkhLFxuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbkV2ZW50LmdldElkKCkhLFxuICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIHJlZGFjdGlvbkV2ZW50LmdldENvbnRlbnQ8SVJlZGFjdE9wdHM+KCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBbZXZlbnQsIG1hdHJpeENsaWVudCwgZ2V0UmVsYXRpb25zRm9yRXZlbnRdLFxuICAgICk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBldmVudC5hZGRMaXN0ZW5lcihNYXRyaXhFdmVudEV2ZW50LkJlZm9yZVJlZGFjdGlvbiwgb25CZWZvcmVCZWFjb25JbmZvUmVkYWN0aW9uKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGV2ZW50LnJlbW92ZUxpc3RlbmVyKE1hdHJpeEV2ZW50RXZlbnQuQmVmb3JlUmVkYWN0aW9uLCBvbkJlZm9yZUJlYWNvbkluZm9SZWRhY3Rpb24pO1xuICAgICAgICB9O1xuICAgIH0sIFtldmVudCwgb25CZWZvcmVCZWFjb25JbmZvUmVkYWN0aW9uXSk7XG59O1xuXG5jb25zdCBNQmVhY29uQm9keSA9IFJlYWN0LmZvcndhcmRSZWY8SFRNTERpdkVsZW1lbnQsIElCb2R5UHJvcHM+KCh7IG14RXZlbnQsIGdldFJlbGF0aW9uc0ZvckV2ZW50IH0sIHJlZikgPT4ge1xuICAgIGNvbnN0IHsgYmVhY29uLCBpc0xpdmUsIGxhdGVzdExvY2F0aW9uU3RhdGUsIHdhaXRpbmdUb1N0YXJ0IH0gPSB1c2VCZWFjb25TdGF0ZShteEV2ZW50KTtcbiAgICBjb25zdCBtYXBJZCA9IHVzZVVuaXF1ZUlkKG14RXZlbnQuZ2V0SWQoKSEpO1xuXG4gICAgY29uc3QgbWF0cml4Q2xpZW50ID0gdXNlQ29udGV4dChNYXRyaXhDbGllbnRDb250ZXh0KTtcbiAgICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPEVycm9yPigpO1xuICAgIGNvbnN0IGlzTWFwRGlzcGxheUVycm9yID1cbiAgICAgICAgZXJyb3I/Lm1lc3NhZ2UgPT09IExvY2F0aW9uU2hhcmVFcnJvci5NYXBTdHlsZVVybE5vdENvbmZpZ3VyZWQgfHxcbiAgICAgICAgZXJyb3I/Lm1lc3NhZ2UgPT09IExvY2F0aW9uU2hhcmVFcnJvci5NYXBTdHlsZVVybE5vdFJlYWNoYWJsZTtcbiAgICBjb25zdCBkaXNwbGF5U3RhdHVzID0gZ2V0QmVhY29uRGlzcGxheVN0YXR1cyhcbiAgICAgICAgISFpc0xpdmUsXG4gICAgICAgIGxhdGVzdExvY2F0aW9uU3RhdGUsXG4gICAgICAgIC8vIGlmIHdlIGFyZSB1bmFibGUgdG8gZGlzcGxheSBtYXBzIGJlY2F1c2UgaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIHRoZSBzZXJ2ZXJcbiAgICAgICAgLy8gZG9uJ3QgZGlzcGxheSBhbiBlcnJvclxuICAgICAgICBpc01hcERpc3BsYXlFcnJvciA/IHVuZGVmaW5lZCA6IGVycm9yLFxuICAgICAgICB3YWl0aW5nVG9TdGFydCxcbiAgICApO1xuICAgIGNvbnN0IG1hcmtlclJvb21NZW1iZXIgPSBpc1NlbGZMb2NhdGlvbihteEV2ZW50LmdldENvbnRlbnQoKSkgPyBteEV2ZW50LnNlbmRlciA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpc093bkJlYWNvbiA9IGJlYWNvbj8uYmVhY29uSW5mb093bmVyID09PSBtYXRyaXhDbGllbnQuZ2V0VXNlcklkKCk7XG5cbiAgICB1c2VIYW5kbGVCZWFjb25SZWRhY3Rpb24obXhFdmVudCwgbWF0cml4Q2xpZW50LCBnZXRSZWxhdGlvbnNGb3JFdmVudCk7XG5cbiAgICBjb25zdCBvbkNsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoZGlzcGxheVN0YXR1cyAhPT0gQmVhY29uRGlzcGxheVN0YXR1cy5BY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2coXG4gICAgICAgICAgICBCZWFjb25WaWV3RGlhbG9nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJvb21JZDogbXhFdmVudC5nZXRSb29tSWQoKSEsXG4gICAgICAgICAgICAgICAgbWF0cml4Q2xpZW50LFxuICAgICAgICAgICAgICAgIGluaXRpYWxGb2N1c2VkQmVhY29uOiBiZWFjb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJteF9CZWFjb25WaWV3RGlhbG9nX3dyYXBwZXJcIixcbiAgICAgICAgICAgIGZhbHNlLCAvLyBpc1ByaW9yaXR5XG4gICAgICAgICAgICB0cnVlLCAvLyBpc1N0YXRpY1xuICAgICAgICApO1xuICAgIH07XG5cbiAgICBsZXQgbWFwOiBKU1guRWxlbWVudDtcbiAgICBpZiAoZGlzcGxheVN0YXR1cyA9PT0gQmVhY29uRGlzcGxheVN0YXR1cy5BY3RpdmUgJiYgIWlzTWFwRGlzcGxheUVycm9yICYmIGxhdGVzdExvY2F0aW9uU3RhdGU/LnVyaSkge1xuICAgICAgICBtYXAgPSAoXG4gICAgICAgICAgICA8TWFwXG4gICAgICAgICAgICAgICAgaWQ9e21hcElkfVxuICAgICAgICAgICAgICAgIGNlbnRlckdlb1VyaT17bGF0ZXN0TG9jYXRpb25TdGF0ZS51cml9XG4gICAgICAgICAgICAgICAgb25FcnJvcj17c2V0RXJyb3J9XG4gICAgICAgICAgICAgICAgb25DbGljaz17b25DbGlja31cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9NQmVhY29uQm9keV9tYXBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHsoeyBtYXAgfSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8U21hcnRNYXJrZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcD17bWFwfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9e2Ake21hcElkfS1tYXJrZXJgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvVXJpPXtsYXRlc3RMb2NhdGlvblN0YXRlLnVyaSF9XG4gICAgICAgICAgICAgICAgICAgICAgICByb29tTWVtYmVyPXttYXJrZXJSb29tTWVtYmVyID8/IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZU1lbWJlckNvbG9yXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvTWFwPlxuICAgICAgICApO1xuICAgIH0gZWxzZSBpZiAoaXNNYXBEaXNwbGF5RXJyb3IpIHtcbiAgICAgICAgbWFwID0gKFxuICAgICAgICAgICAgPE1hcEVycm9yXG4gICAgICAgICAgICAgICAgZXJyb3I9e2Vycm9yLm1lc3NhZ2UgYXMgTG9jYXRpb25TaGFyZUVycm9yfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFxuICAgICAgICAgICAgICAgICAgICBcIm14X01CZWFjb25Cb2R5X21hcEVycm9yXCIsXG4gICAgICAgICAgICAgICAgICAgIC8vIHNldCBpbnRlcmFjdGl2ZSBjbGFzcyB3aGVuIG1heGltaXNlZCBtYXAgY2FuIGJlIG9wZW5lZFxuICAgICAgICAgICAgICAgICAgICB7IG14X01CZWFjb25Cb2R5X21hcEVycm9ySW50ZXJhY3RpdmU6IGRpc3BsYXlTdGF0dXMgPT09IEJlYWNvbkRpc3BsYXlTdGF0dXMuQWN0aXZlIH0sXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICBpc01pbmltaXNlZFxuICAgICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBtYXAgPSAoXG4gICAgICAgICAgICA8TWFwRmFsbGJhY2tcbiAgICAgICAgICAgICAgICBpc0xvYWRpbmc9e2Rpc3BsYXlTdGF0dXMgPT09IEJlYWNvbkRpc3BsYXlTdGF0dXMuTG9hZGluZ31cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9NQmVhY29uQm9keV9tYXAgbXhfTUJlYWNvbkJvZHlfbWFwRmFsbGJhY2tcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X01CZWFjb25Cb2R5XCIgcmVmPXtyZWZ9PlxuICAgICAgICAgICAge21hcH1cbiAgICAgICAgICAgIHtpc093bkJlYWNvbiA/IChcbiAgICAgICAgICAgICAgICA8T3duQmVhY29uU3RhdHVzXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X01CZWFjb25Cb2R5X2NoaW5cIlxuICAgICAgICAgICAgICAgICAgICBiZWFjb249e2JlYWNvbn1cbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVN0YXR1cz17ZGlzcGxheVN0YXR1c31cbiAgICAgICAgICAgICAgICAgICAgd2l0aEljb25cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8QmVhY29uU3RhdHVzXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X01CZWFjb25Cb2R5X2NoaW5cIlxuICAgICAgICAgICAgICAgICAgICBiZWFjb249e2JlYWNvbn1cbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVN0YXR1cz17ZGlzcGxheVN0YXR1c31cbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwidGltZWxpbmV8bS5iZWFjb25faW5mb3x2aWV3X2xpdmVfbG9jYXRpb25cIil9XG4gICAgICAgICAgICAgICAgICAgIHdpdGhJY29uXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59KSBhcyBGb3J3YXJkUmVmRXhvdGljQ29tcG9uZW50PElCb2R5UHJvcHM+O1xuXG5leHBvcnQgZGVmYXVsdCBNQmVhY29uQm9keTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQVFBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQVdBLElBQUFFLGFBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUosT0FBQTtBQUVBLElBQUFLLG9CQUFBLEdBQUFELHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBTSxnQkFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sZ0JBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLE1BQUEsR0FBQUosc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFTLE9BQUEsR0FBQVQsT0FBQTtBQUNBLElBQUFVLFNBQUEsR0FBQVYsT0FBQTtBQUNBLElBQUFXLGNBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLGFBQUEsR0FBQVIsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFhLGdCQUFBLEdBQUFULHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBYyxVQUFBLEdBQUFkLE9BQUE7QUFDQSxJQUFBZSxTQUFBLEdBQUFmLE9BQUE7QUFDQSxJQUFBZ0IsWUFBQSxHQUFBWixzQkFBQSxDQUFBSixPQUFBO0FBRUEsSUFBQWlCLFFBQUEsR0FBQWpCLE9BQUE7QUFBNkMsU0FBQWtCLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLENBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFwQix3QkFBQW9CLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxXQUFBSyxPQUFBLEVBQUFMLENBQUEsUUFBQUcsQ0FBQSxHQUFBSix3QkFBQSxDQUFBRyxDQUFBLE9BQUFDLENBQUEsSUFBQUEsQ0FBQSxDQUFBRyxHQUFBLENBQUFOLENBQUEsVUFBQUcsQ0FBQSxDQUFBSSxHQUFBLENBQUFQLENBQUEsT0FBQVEsQ0FBQSxLQUFBQyxTQUFBLFVBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxjQUFBLElBQUFELE1BQUEsQ0FBQUUsd0JBQUEsV0FBQUMsQ0FBQSxJQUFBZCxDQUFBLG9CQUFBYyxDQUFBLE9BQUFDLGNBQUEsQ0FBQUMsSUFBQSxDQUFBaEIsQ0FBQSxFQUFBYyxDQUFBLFNBQUFHLENBQUEsR0FBQVAsQ0FBQSxHQUFBQyxNQUFBLENBQUFFLHdCQUFBLENBQUFiLENBQUEsRUFBQWMsQ0FBQSxVQUFBRyxDQUFBLEtBQUFBLENBQUEsQ0FBQVYsR0FBQSxJQUFBVSxDQUFBLENBQUFDLEdBQUEsSUFBQVAsTUFBQSxDQUFBQyxjQUFBLENBQUFKLENBQUEsRUFBQU0sQ0FBQSxFQUFBRyxDQUFBLElBQUFULENBQUEsQ0FBQU0sQ0FBQSxJQUFBZCxDQUFBLENBQUFjLENBQUEsWUFBQU4sQ0FBQSxDQUFBSCxPQUFBLEdBQUFMLENBQUEsRUFBQUcsQ0FBQSxJQUFBQSxDQUFBLENBQUFlLEdBQUEsQ0FBQWxCLENBQUEsRUFBQVEsQ0FBQSxHQUFBQSxDQUFBO0FBcEM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFpQ0EsTUFBTVcsY0FBYyxHQUNoQkMsZUFBNEIsSUFPM0I7RUFDRCxNQUFNQyxNQUFNLEdBQUcsSUFBQUMsaUJBQVMsRUFBQ0YsZUFBZSxDQUFDO0VBRXpDLE1BQU1HLE1BQU0sR0FBRyxJQUFBQyxxQ0FBb0IsRUFBQ0gsTUFBTSxFQUFFSSxtQkFBVyxDQUFDQyxjQUFjLEVBQUUsTUFBTUwsTUFBTSxFQUFFRSxNQUFNLENBQUM7RUFFN0YsTUFBTUksbUJBQW1CLEdBQUcsSUFBQUgscUNBQW9CLEVBQzVDSCxNQUFNLEVBQ05JLG1CQUFXLENBQUNHLGNBQWMsRUFDMUIsTUFBTVAsTUFBTSxFQUFFTSxtQkFDbEIsQ0FBQztFQUVELElBQUksQ0FBQ04sTUFBTSxFQUFFO0lBQ1QsT0FBTyxDQUFDLENBQUM7RUFDYjs7RUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsTUFBTVEsY0FBYyxHQUFHLENBQUMsQ0FBQ1IsTUFBTSxJQUFJLElBQUFTLDhCQUFzQixFQUFDVCxNQUFNLENBQUM7RUFDakUsTUFBTTtJQUFFVTtFQUFZLENBQUMsR0FBR1YsTUFBTSxDQUFDVyxVQUFVO0VBRXpDLE9BQU87SUFDSFgsTUFBTTtJQUNOVSxXQUFXO0lBQ1hSLE1BQU07SUFDTk0sY0FBYztJQUNkRjtFQUNKLENBQUM7QUFDTCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLE1BQU1NLFdBQVcsR0FBSUMsT0FBZSxJQUFhO0VBQzdDLE1BQU0sQ0FBQ0MsRUFBRSxFQUFFQyxLQUFLLENBQUMsR0FBRyxJQUFBQyxlQUFRLEVBQUMsR0FBR0gsT0FBTyxJQUFJLElBQUFJLDBCQUFZLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUU3RCxJQUFBQyxnQkFBUyxFQUFDLE1BQU07SUFDWkgsS0FBSyxDQUFDLEdBQUdGLE9BQU8sSUFBSSxJQUFBSSwwQkFBWSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDMUMsQ0FBQyxFQUFFLENBQUNKLE9BQU8sQ0FBQyxDQUFDO0VBRWIsT0FBT0MsRUFBRTtBQUNiLENBQUM7O0FBRUQ7QUFDQSxNQUFNSyx3QkFBd0IsR0FBR0EsQ0FDN0JDLEtBQWtCLEVBQ2xCQyxZQUEwQixFQUMxQkMsb0JBQTJDLEtBQ3BDO0VBQ1AsTUFBTUMsMkJBQTJCLEdBQUcsSUFBQUMsa0JBQVcsRUFDM0MsQ0FBQ0MsTUFBbUIsRUFBRUMsY0FBMkIsS0FBSztJQUNsRCxNQUFNQyxTQUFTLEdBQUdMLG9CQUFvQixHQUNoQ0Esb0JBQW9CLENBQUNGLEtBQUssQ0FBQ1EsS0FBSyxDQUFDLENBQUMsRUFBR0Msb0JBQVksQ0FBQ0MsU0FBUyxFQUFFQyxnQkFBUSxDQUFDQyxJQUFJLENBQUMsR0FDM0VDLFNBQVM7SUFFZk4sU0FBUyxFQUFFTyxZQUFZLENBQUMsQ0FBQyxFQUFFQyxPQUFPLENBQUVDLGFBQWEsSUFBSztNQUNsRGYsWUFBWSxDQUFDZ0IsV0FBVyxDQUNwQkQsYUFBYSxDQUFDRSxTQUFTLENBQUMsQ0FBQyxFQUN6QkYsYUFBYSxDQUFDUixLQUFLLENBQUMsQ0FBQyxFQUNyQkssU0FBUyxFQUNUUCxjQUFjLENBQUNhLFVBQVUsQ0FBYyxDQUMzQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0VBQ04sQ0FBQyxFQUNELENBQUNuQixLQUFLLEVBQUVDLFlBQVksRUFBRUMsb0JBQW9CLENBQzlDLENBQUM7RUFFRCxJQUFBSixnQkFBUyxFQUFDLE1BQU07SUFDWkUsS0FBSyxDQUFDb0IsV0FBVyxDQUFDQyx3QkFBZ0IsQ0FBQ0MsZUFBZSxFQUFFbkIsMkJBQTJCLENBQUM7SUFDaEYsT0FBTyxNQUFNO01BQ1RILEtBQUssQ0FBQ3VCLGNBQWMsQ0FBQ0Ysd0JBQWdCLENBQUNDLGVBQWUsRUFBRW5CLDJCQUEyQixDQUFDO0lBQ3ZGLENBQUM7RUFDTCxDQUFDLEVBQUUsQ0FBQ0gsS0FBSyxFQUFFRywyQkFBMkIsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxNQUFNcUIsV0FBVyxnQkFBR0MsY0FBSyxDQUFDQyxVQUFVLENBQTZCLENBQUM7RUFBRUMsT0FBTztFQUFFekI7QUFBcUIsQ0FBQyxFQUFFMEIsR0FBRyxLQUFLO0VBQ3pHLE1BQU07SUFBRWhELE1BQU07SUFBRUUsTUFBTTtJQUFFSSxtQkFBbUI7SUFBRUU7RUFBZSxDQUFDLEdBQUdWLGNBQWMsQ0FBQ2lELE9BQU8sQ0FBQztFQUN2RixNQUFNRSxLQUFLLEdBQUdyQyxXQUFXLENBQUNtQyxPQUFPLENBQUNuQixLQUFLLENBQUMsQ0FBRSxDQUFDO0VBRTNDLE1BQU1QLFlBQVksR0FBRyxJQUFBNkIsaUJBQVUsRUFBQ0MsNEJBQW1CLENBQUM7RUFDcEQsTUFBTSxDQUFDQyxLQUFLLEVBQUVDLFFBQVEsQ0FBQyxHQUFHLElBQUFyQyxlQUFRLEVBQVEsQ0FBQztFQUMzQyxNQUFNc0MsaUJBQWlCLEdBQ25CRixLQUFLLEVBQUVHLE9BQU8sS0FBS0MsNEJBQWtCLENBQUNDLHdCQUF3QixJQUM5REwsS0FBSyxFQUFFRyxPQUFPLEtBQUtDLDRCQUFrQixDQUFDRSx1QkFBdUI7RUFDakUsTUFBTUMsYUFBYSxHQUFHLElBQUFDLHFDQUFzQixFQUN4QyxDQUFDLENBQUMxRCxNQUFNLEVBQ1JJLG1CQUFtQjtFQUNuQjtFQUNBO0VBQ0FnRCxpQkFBaUIsR0FBR3JCLFNBQVMsR0FBR21CLEtBQUssRUFDckM1QyxjQUNKLENBQUM7RUFDRCxNQUFNcUQsZ0JBQWdCLEdBQUcsSUFBQUMsd0JBQWMsRUFBQ2YsT0FBTyxDQUFDUixVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUdRLE9BQU8sQ0FBQ2dCLE1BQU0sR0FBRzlCLFNBQVM7RUFDMUYsTUFBTStCLFdBQVcsR0FBR2hFLE1BQU0sRUFBRWlFLGVBQWUsS0FBSzVDLFlBQVksQ0FBQzZDLFNBQVMsQ0FBQyxDQUFDO0VBRXhFL0Msd0JBQXdCLENBQUM0QixPQUFPLEVBQUUxQixZQUFZLEVBQUVDLG9CQUFvQixDQUFDO0VBRXJFLE1BQU02QyxPQUFPLEdBQUdBLENBQUEsS0FBWTtJQUN4QixJQUFJUixhQUFhLEtBQUtTLGtDQUFtQixDQUFDQyxNQUFNLEVBQUU7TUFDOUM7SUFDSjtJQUNBQyxjQUFLLENBQUNDLFlBQVksQ0FDZEMseUJBQWdCLEVBQ2hCO01BQ0lDLE1BQU0sRUFBRTFCLE9BQU8sQ0FBQ1QsU0FBUyxDQUFDLENBQUU7TUFDNUJqQixZQUFZO01BQ1pxRCxvQkFBb0IsRUFBRTFFO0lBQzFCLENBQUMsRUFDRCw2QkFBNkIsRUFDN0IsS0FBSztJQUFFO0lBQ1AsSUFBSSxDQUFFO0lBQ1YsQ0FBQztFQUNMLENBQUM7RUFFRCxJQUFJMkUsR0FBZ0I7RUFDcEIsSUFBSWhCLGFBQWEsS0FBS1Msa0NBQW1CLENBQUNDLE1BQU0sSUFBSSxDQUFDZixpQkFBaUIsSUFBSWhELG1CQUFtQixFQUFFc0UsR0FBRyxFQUFFO0lBQ2hHRCxHQUFHLGdCQUNDckgsTUFBQSxDQUFBMEIsT0FBQSxDQUFBNkYsYUFBQSxDQUFDdkcsVUFBQSxDQUFBd0csR0FBRztNQUNBaEUsRUFBRSxFQUFFbUMsS0FBTTtNQUNWOEIsWUFBWSxFQUFFekUsbUJBQW1CLENBQUNzRSxHQUFJO01BQ3RDSSxPQUFPLEVBQUUzQixRQUFTO01BQ2xCYyxPQUFPLEVBQUVBLE9BQVE7TUFDakJjLFNBQVMsRUFBQztJQUFvQixHQUU3QixDQUFDO01BQUVOO0lBQUksQ0FBQyxrQkFDTHJILE1BQUEsQ0FBQTBCLE9BQUEsQ0FBQTZGLGFBQUEsQ0FBQ3ZHLFVBQUEsQ0FBQTRHLFdBQVc7TUFDUlAsR0FBRyxFQUFFQSxHQUFJO01BQ1Q3RCxFQUFFLEVBQUUsR0FBR21DLEtBQUssU0FBVTtNQUN0QmtDLE1BQU0sRUFBRTdFLG1CQUFtQixDQUFDc0UsR0FBSztNQUNqQ1EsVUFBVSxFQUFFdkIsZ0JBQWdCLElBQUk1QixTQUFVO01BQzFDb0QsY0FBYztJQUFBLENBQ2pCLENBRUosQ0FDUjtFQUNMLENBQUMsTUFBTSxJQUFJL0IsaUJBQWlCLEVBQUU7SUFDMUJxQixHQUFHLGdCQUNDckgsTUFBQSxDQUFBMEIsT0FBQSxDQUFBNkYsYUFBQSxDQUFDdEcsU0FBQSxDQUFBK0csUUFBUTtNQUNMbEMsS0FBSyxFQUFFQSxLQUFLLENBQUNHLE9BQThCO01BQzNDWSxPQUFPLEVBQUVBLE9BQVE7TUFDakJjLFNBQVMsRUFBRSxJQUFBTSxtQkFBVSxFQUNqQix5QkFBeUI7TUFDekI7TUFDQTtRQUFFQyxrQ0FBa0MsRUFBRTdCLGFBQWEsS0FBS1Msa0NBQW1CLENBQUNDO01BQU8sQ0FDdkYsQ0FBRTtNQUNGb0IsV0FBVztJQUFBLENBQ2QsQ0FDSjtFQUNMLENBQUMsTUFBTTtJQUNIZCxHQUFHLGdCQUNDckgsTUFBQSxDQUFBMEIsT0FBQSxDQUFBNkYsYUFBQSxDQUFDckcsWUFBQSxDQUFBUSxPQUFXO01BQ1IwRyxTQUFTLEVBQUUvQixhQUFhLEtBQUtTLGtDQUFtQixDQUFDdUIsT0FBUTtNQUN6RFYsU0FBUyxFQUFDO0lBQStDLENBQzVELENBQ0o7RUFDTDtFQUVBLG9CQUNJM0gsTUFBQSxDQUFBMEIsT0FBQSxDQUFBNkYsYUFBQTtJQUFLSSxTQUFTLEVBQUMsZ0JBQWdCO0lBQUNqQyxHQUFHLEVBQUVBO0VBQUksR0FDcEMyQixHQUFHLEVBQ0hYLFdBQVcsZ0JBQ1IxRyxNQUFBLENBQUEwQixPQUFBLENBQUE2RixhQUFBLENBQUN4RyxnQkFBQSxDQUFBVyxPQUFlO0lBQ1ppRyxTQUFTLEVBQUMscUJBQXFCO0lBQy9CakYsTUFBTSxFQUFFQSxNQUFPO0lBQ2YyRCxhQUFhLEVBQUVBLGFBQWM7SUFDN0JpQyxRQUFRO0VBQUEsQ0FDWCxDQUFDLGdCQUVGdEksTUFBQSxDQUFBMEIsT0FBQSxDQUFBNkYsYUFBQSxDQUFDekcsYUFBQSxDQUFBWSxPQUFZO0lBQ1RpRyxTQUFTLEVBQUMscUJBQXFCO0lBQy9CakYsTUFBTSxFQUFFQSxNQUFPO0lBQ2YyRCxhQUFhLEVBQUVBLGFBQWM7SUFDN0JrQyxLQUFLLEVBQUUsSUFBQUMsbUJBQUUsRUFBQywyQ0FBMkMsQ0FBRTtJQUN2REYsUUFBUTtFQUFBLENBQ1gsQ0FFSixDQUFDO0FBRWQsQ0FBQyxDQUEwQztBQUFDLElBQUFHLFFBQUEsR0FBQUMsT0FBQSxDQUFBaEgsT0FBQSxHQUU3QjRELFdBQVciLCJpZ25vcmVMaXN0IjpbXX0=