matrix-react-sdk
Version:
SDK for matrix.org using React
117 lines (109 loc) • 19.4 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _logger = require("matrix-js-sdk/src/logger");
var _InlineSpinner = _interopRequireDefault(require("../elements/InlineSpinner"));
var _languageHandler = require("../../../languageHandler");
var _AudioPlayer = _interopRequireDefault(require("../audio_messages/AudioPlayer"));
var _MFileBody = _interopRequireDefault(require("./MFileBody"));
var _PlaybackManager = require("../../../audio/PlaybackManager");
var _EventUtils = require("../../../utils/EventUtils");
var _PlaybackQueue = require("../../../audio/PlaybackQueue");
var _RoomContext = _interopRequireWildcard(require("../../../contexts/RoomContext"));
var _MediaProcessingError = _interopRequireDefault(require("./shared/MediaProcessingError"));
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 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.
*/
class MAudioBody extends _react.default.PureComponent {
constructor(...args) {
super(...args);
(0, _defineProperty2.default)(this, "state", {});
}
async componentDidMount() {
let buffer;
try {
try {
const blob = await this.props.mediaEventHelper.sourceBlob.value;
buffer = await blob.arrayBuffer();
} catch (e) {
this.setState({
error: true
});
_logger.logger.warn("Unable to decrypt audio message", e);
return; // stop processing the audio file
}
} catch (e) {
this.setState({
error: true
});
_logger.logger.warn("Unable to decrypt/download audio message", e);
return; // stop processing the audio file
}
// We should have a buffer to work with now: let's set it up
// Note: we don't actually need a waveform to render an audio event, but voice messages do.
const content = this.props.mxEvent.getContent();
const waveform = content?.["org.matrix.msc1767.audio"]?.waveform?.map(p => p / 1024);
// We should have a buffer to work with now: let's set it up
const playback = _PlaybackManager.PlaybackManager.instance.createPlaybackInstance(buffer, waveform);
playback.clockInfo.populatePlaceholdersFrom(this.props.mxEvent);
this.setState({
playback
});
if ((0, _EventUtils.isVoiceMessage)(this.props.mxEvent)) {
_PlaybackQueue.PlaybackQueue.forRoom(this.props.mxEvent.getRoomId()).unsortedEnqueue(this.props.mxEvent, playback);
}
// Note: the components later on will handle preparing the Playback class for us.
}
componentWillUnmount() {
this.state.playback?.destroy();
}
get showFileBody() {
return this.context.timelineRenderingType !== _RoomContext.TimelineRenderingType.Room && this.context.timelineRenderingType !== _RoomContext.TimelineRenderingType.Pinned && this.context.timelineRenderingType !== _RoomContext.TimelineRenderingType.Search;
}
render() {
if (this.state.error) {
return /*#__PURE__*/_react.default.createElement(_MediaProcessingError.default, {
className: "mx_MAudioBody"
}, (0, _languageHandler._t)("timeline|m.audio|error_processing_audio"));
}
if (this.props.forExport) {
const content = this.props.mxEvent.getContent();
// During export, the content url will point to the MSC, which will later point to a local url
const contentUrl = content.file?.url || content.url;
return /*#__PURE__*/_react.default.createElement("span", {
className: "mx_MAudioBody"
}, /*#__PURE__*/_react.default.createElement("audio", {
src: contentUrl,
controls: true
}));
}
if (!this.state.playback) {
return /*#__PURE__*/_react.default.createElement("span", {
className: "mx_MAudioBody"
}, /*#__PURE__*/_react.default.createElement(_InlineSpinner.default, null));
}
// At this point we should have a playable state
return /*#__PURE__*/_react.default.createElement("span", {
className: "mx_MAudioBody"
}, /*#__PURE__*/_react.default.createElement(_AudioPlayer.default, {
playback: this.state.playback,
mediaName: this.props.mxEvent.getContent().body
}), this.showFileBody && /*#__PURE__*/_react.default.createElement(_MFileBody.default, (0, _extends2.default)({}, this.props, {
showGenericPlaceholder: false
})));
}
}
exports.default = MAudioBody;
(0, _defineProperty2.default)(MAudioBody, "contextType", _RoomContext.default);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9sb2dnZXIiLCJfSW5saW5lU3Bpbm5lciIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfQXVkaW9QbGF5ZXIiLCJfTUZpbGVCb2R5IiwiX1BsYXliYWNrTWFuYWdlciIsIl9FdmVudFV0aWxzIiwiX1BsYXliYWNrUXVldWUiLCJfUm9vbUNvbnRleHQiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9NZWRpYVByb2Nlc3NpbmdFcnJvciIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIk1BdWRpb0JvZHkiLCJSZWFjdCIsIlB1cmVDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJfZGVmaW5lUHJvcGVydHkyIiwiY29tcG9uZW50RGlkTW91bnQiLCJidWZmZXIiLCJibG9iIiwicHJvcHMiLCJtZWRpYUV2ZW50SGVscGVyIiwic291cmNlQmxvYiIsInZhbHVlIiwiYXJyYXlCdWZmZXIiLCJzZXRTdGF0ZSIsImVycm9yIiwibG9nZ2VyIiwid2FybiIsImNvbnRlbnQiLCJteEV2ZW50IiwiZ2V0Q29udGVudCIsIndhdmVmb3JtIiwibWFwIiwicCIsInBsYXliYWNrIiwiUGxheWJhY2tNYW5hZ2VyIiwiaW5zdGFuY2UiLCJjcmVhdGVQbGF5YmFja0luc3RhbmNlIiwiY2xvY2tJbmZvIiwicG9wdWxhdGVQbGFjZWhvbGRlcnNGcm9tIiwiaXNWb2ljZU1lc3NhZ2UiLCJQbGF5YmFja1F1ZXVlIiwiZm9yUm9vbSIsImdldFJvb21JZCIsInVuc29ydGVkRW5xdWV1ZSIsImNvbXBvbmVudFdpbGxVbm1vdW50Iiwic3RhdGUiLCJkZXN0cm95Iiwic2hvd0ZpbGVCb2R5IiwiY29udGV4dCIsInRpbWVsaW5lUmVuZGVyaW5nVHlwZSIsIlRpbWVsaW5lUmVuZGVyaW5nVHlwZSIsIlJvb20iLCJQaW5uZWQiLCJTZWFyY2giLCJyZW5kZXIiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwiX3QiLCJmb3JFeHBvcnQiLCJjb250ZW50VXJsIiwiZmlsZSIsInVybCIsInNyYyIsImNvbnRyb2xzIiwibWVkaWFOYW1lIiwiYm9keSIsIl9leHRlbmRzMiIsInNob3dHZW5lcmljUGxhY2Vob2xkZXIiLCJleHBvcnRzIiwiUm9vbUNvbnRleHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy9tZXNzYWdlcy9NQXVkaW9Cb2R5LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBJQ29udGVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IE1lZGlhRXZlbnRDb250ZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL3R5cGVzXCI7XG5cbmltcG9ydCB7IFBsYXliYWNrIH0gZnJvbSBcIi4uLy4uLy4uL2F1ZGlvL1BsYXliYWNrXCI7XG5pbXBvcnQgSW5saW5lU3Bpbm5lciBmcm9tIFwiLi4vZWxlbWVudHMvSW5saW5lU3Bpbm5lclwiO1xuaW1wb3J0IHsgX3QgfSBmcm9tIFwiLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgQXVkaW9QbGF5ZXIgZnJvbSBcIi4uL2F1ZGlvX21lc3NhZ2VzL0F1ZGlvUGxheWVyXCI7XG5pbXBvcnQgTUZpbGVCb2R5IGZyb20gXCIuL01GaWxlQm9keVwiO1xuaW1wb3J0IHsgSUJvZHlQcm9wcyB9IGZyb20gXCIuL0lCb2R5UHJvcHNcIjtcbmltcG9ydCB7IFBsYXliYWNrTWFuYWdlciB9IGZyb20gXCIuLi8uLi8uLi9hdWRpby9QbGF5YmFja01hbmFnZXJcIjtcbmltcG9ydCB7IGlzVm9pY2VNZXNzYWdlIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL0V2ZW50VXRpbHNcIjtcbmltcG9ydCB7IFBsYXliYWNrUXVldWUgfSBmcm9tIFwiLi4vLi4vLi4vYXVkaW8vUGxheWJhY2tRdWV1ZVwiO1xuaW1wb3J0IFJvb21Db250ZXh0LCB7IFRpbWVsaW5lUmVuZGVyaW5nVHlwZSB9IGZyb20gXCIuLi8uLi8uLi9jb250ZXh0cy9Sb29tQ29udGV4dFwiO1xuaW1wb3J0IE1lZGlhUHJvY2Vzc2luZ0Vycm9yIGZyb20gXCIuL3NoYXJlZC9NZWRpYVByb2Nlc3NpbmdFcnJvclwiO1xuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBlcnJvcj86IGJvb2xlYW47XG4gICAgcGxheWJhY2s/OiBQbGF5YmFjaztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTUF1ZGlvQm9keSBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQ8SUJvZHlQcm9wcywgSVN0YXRlPiB7XG4gICAgcHVibGljIHN0YXRpYyBjb250ZXh0VHlwZSA9IFJvb21Db250ZXh0O1xuICAgIHB1YmxpYyBkZWNsYXJlIGNvbnRleHQ6IFJlYWN0LkNvbnRleHRUeXBlPHR5cGVvZiBSb29tQ29udGV4dD47XG5cbiAgICBwdWJsaWMgc3RhdGU6IElTdGF0ZSA9IHt9O1xuXG4gICAgcHVibGljIGFzeW5jIGNvbXBvbmVudERpZE1vdW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgYnVmZmVyOiBBcnJheUJ1ZmZlcjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBibG9iID0gYXdhaXQgdGhpcy5wcm9wcy5tZWRpYUV2ZW50SGVscGVyIS5zb3VyY2VCbG9iLnZhbHVlO1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGF3YWl0IGJsb2IuYXJyYXlCdWZmZXIoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgZXJyb3I6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJVbmFibGUgdG8gZGVjcnlwdCBhdWRpbyBtZXNzYWdlXCIsIGUpO1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gc3RvcCBwcm9jZXNzaW5nIHRoZSBhdWRpbyBmaWxlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBlcnJvcjogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiVW5hYmxlIHRvIGRlY3J5cHQvZG93bmxvYWQgYXVkaW8gbWVzc2FnZVwiLCBlKTtcbiAgICAgICAgICAgIHJldHVybjsgLy8gc3RvcCBwcm9jZXNzaW5nIHRoZSBhdWRpbyBmaWxlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBzaG91bGQgaGF2ZSBhIGJ1ZmZlciB0byB3b3JrIHdpdGggbm93OiBsZXQncyBzZXQgaXQgdXBcblxuICAgICAgICAvLyBOb3RlOiB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIGEgd2F2ZWZvcm0gdG8gcmVuZGVyIGFuIGF1ZGlvIGV2ZW50LCBidXQgdm9pY2UgbWVzc2FnZXMgZG8uXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLnByb3BzLm14RXZlbnQuZ2V0Q29udGVudDxNZWRpYUV2ZW50Q29udGVudCAmIElDb250ZW50PigpO1xuICAgICAgICBjb25zdCB3YXZlZm9ybSA9IGNvbnRlbnQ/LltcIm9yZy5tYXRyaXgubXNjMTc2Ny5hdWRpb1wiXT8ud2F2ZWZvcm0/Lm1hcCgocDogbnVtYmVyKSA9PiBwIC8gMTAyNCk7XG5cbiAgICAgICAgLy8gV2Ugc2hvdWxkIGhhdmUgYSBidWZmZXIgdG8gd29yayB3aXRoIG5vdzogbGV0J3Mgc2V0IGl0IHVwXG4gICAgICAgIGNvbnN0IHBsYXliYWNrID0gUGxheWJhY2tNYW5hZ2VyLmluc3RhbmNlLmNyZWF0ZVBsYXliYWNrSW5zdGFuY2UoYnVmZmVyLCB3YXZlZm9ybSk7XG4gICAgICAgIHBsYXliYWNrLmNsb2NrSW5mby5wb3B1bGF0ZVBsYWNlaG9sZGVyc0Zyb20odGhpcy5wcm9wcy5teEV2ZW50KTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHBsYXliYWNrIH0pO1xuXG4gICAgICAgIGlmIChpc1ZvaWNlTWVzc2FnZSh0aGlzLnByb3BzLm14RXZlbnQpKSB7XG4gICAgICAgICAgICBQbGF5YmFja1F1ZXVlLmZvclJvb20odGhpcy5wcm9wcy5teEV2ZW50LmdldFJvb21JZCgpISkudW5zb3J0ZWRFbnF1ZXVlKHRoaXMucHJvcHMubXhFdmVudCwgcGxheWJhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90ZTogdGhlIGNvbXBvbmVudHMgbGF0ZXIgb24gd2lsbCBoYW5kbGUgcHJlcGFyaW5nIHRoZSBQbGF5YmFjayBjbGFzcyBmb3IgdXMuXG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXRlLnBsYXliYWNrPy5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBzaG93RmlsZUJvZHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQudGltZWxpbmVSZW5kZXJpbmdUeXBlICE9PSBUaW1lbGluZVJlbmRlcmluZ1R5cGUuUm9vbSAmJlxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnRpbWVsaW5lUmVuZGVyaW5nVHlwZSAhPT0gVGltZWxpbmVSZW5kZXJpbmdUeXBlLlBpbm5lZCAmJlxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnRpbWVsaW5lUmVuZGVyaW5nVHlwZSAhPT0gVGltZWxpbmVSZW5kZXJpbmdUeXBlLlNlYXJjaFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPE1lZGlhUHJvY2Vzc2luZ0Vycm9yIGNsYXNzTmFtZT1cIm14X01BdWRpb0JvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAge190KFwidGltZWxpbmV8bS5hdWRpb3xlcnJvcl9wcm9jZXNzaW5nX2F1ZGlvXCIpfVxuICAgICAgICAgICAgICAgIDwvTWVkaWFQcm9jZXNzaW5nRXJyb3I+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucHJvcHMuZm9yRXhwb3J0KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5wcm9wcy5teEV2ZW50LmdldENvbnRlbnQoKTtcbiAgICAgICAgICAgIC8vIER1cmluZyBleHBvcnQsIHRoZSBjb250ZW50IHVybCB3aWxsIHBvaW50IHRvIHRoZSBNU0MsIHdoaWNoIHdpbGwgbGF0ZXIgcG9pbnQgdG8gYSBsb2NhbCB1cmxcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRVcmwgPSBjb250ZW50LmZpbGU/LnVybCB8fCBjb250ZW50LnVybDtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXhfTUF1ZGlvQm9keVwiPlxuICAgICAgICAgICAgICAgICAgICA8YXVkaW8gc3JjPXtjb250ZW50VXJsfSBjb250cm9scyAvPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc3RhdGUucGxheWJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXhfTUF1ZGlvQm9keVwiPlxuICAgICAgICAgICAgICAgICAgICA8SW5saW5lU3Bpbm5lciAvPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIHNob3VsZCBoYXZlIGEgcGxheWFibGUgc3RhdGVcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm14X01BdWRpb0JvZHlcIj5cbiAgICAgICAgICAgICAgICA8QXVkaW9QbGF5ZXIgcGxheWJhY2s9e3RoaXMuc3RhdGUucGxheWJhY2t9IG1lZGlhTmFtZT17dGhpcy5wcm9wcy5teEV2ZW50LmdldENvbnRlbnQoKS5ib2R5fSAvPlxuICAgICAgICAgICAgICAgIHt0aGlzLnNob3dGaWxlQm9keSAmJiA8TUZpbGVCb2R5IHsuLi50aGlzLnByb3BzfSBzaG93R2VuZXJpY1BsYWNlaG9sZGVyPXtmYWxzZX0gLz59XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFRQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFLQSxJQUFBRSxjQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksWUFBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssVUFBQSxHQUFBTixzQkFB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